Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
9c962c3
feat(admin): invoke community FI upgrades
bradseiler Nov 6, 2026
c97912c
Merge remote-tracking branch 'origin/main' into honor/nip-fi-upgrade-pod
bradseiler Nov 6, 2026
019ec55
Manage community NIP-FI policy with fenced enable and disable
bradseiler Nov 6, 2026
87c9491
Reuse the configured NIP-FI mode label in policy status
bradseiler Nov 6, 2026
829c899
Cover required-state barriers and effective disable behavior
bradseiler Nov 6, 2026
3c586a3
Allow later migrations in listed-name upgrade tests
bradseiler Nov 6, 2026
7e734ca
Keep policy outcomes compact and satisfy workspace Clippy
bradseiler Nov 6, 2026
9b072f5
Use a borrowed operator slice in the policy HTTP fixture
bradseiler Nov 6, 2026
d3bf876
Clarify community FI policy operator safeguards
bradseiler Nov 6, 2026
a024ea8
Describe the legacy FI endpoint command accurately
bradseiler Nov 6, 2026
1e930a3
Rename NIP-FI policy mutation gate
bradseiler Nov 6, 2026
636986f
Remove the legacy FI operator command
bradseiler Nov 6, 2026
7b495d1
Remove unfenced FI policy writers and routes
bradseiler Nov 6, 2026
b0d0066
Expose one set of current policy preconditions
bradseiler Nov 6, 2026
698132b
Use a named policy command test handler
bradseiler Nov 6, 2026
5b2eb6f
Merge remote-tracking branch 'origin/main' into honor/nip-fi-upgrade-pod
bradseiler Nov 6, 2026
cf2c9ba
Merge remote-tracking branch 'origin/main' into honor/nip-fi-upgrade-pod
bradseiler Nov 6, 2026
c0329d3
Merge remote-tracking branch 'origin/main' into honor/nip-fi-upgrade-pod
bradseiler Nov 6, 2026
d31793c
Fix initial-policy test and docs after gate rename
bradseiler Nov 6, 2026
8eaa261
fix(relay): scope git policy guards to their route
bradseiler Nov 6, 2026
33a1c0b
Merge main and assign policy migration version 85
bradseiler Nov 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -470,9 +470,9 @@ RUST_LOG=buzz_relay=debug,buzz_datastore=info,buzz_db=debug,buzz_auth=debug,buzz
# key and NIP-FI enforcement. Profiles are historical records and are never
# retracted.

# New irreversible community FI acceptances stay disabled until the fleet's
# enforcement and activation baseline is verified. Disabling preserves receipts.
BUZZ_NIP_FI_UPGRADES_ENABLED=false
# Permit community FI policy enables and disables only after the whole fleet
# supports policy management. A closed gate preserves receipt recovery/status.
BUZZ_NIP_FI_CHANGES=false

# NIP-CL compact membership discovery. Deploy fleet-wide dark before enabling.
BUZZ_MEMBERSHIP_SNAPSHOT_ENABLED=false
Expand Down
5 changes: 5 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Justfile
Original file line number Diff line number Diff line change
Expand Up @@ -468,7 +468,7 @@ test-unit:
# parser, validation, and propagation-evidence tests, and the partition
# audit outcome contract, NIP-FI policy/backfill, and user-deletion intake.
cargo nextest run -p buzz-admin \
-E 'test(storage_snapshot) + test(/^communities::tests::/) + test(/^tests::communities_/) + test(=tests::partition_audit_outcomes_keep_their_json_names_and_exit_codes) + test(/^nip_fi::tests::/) + test(/^user_deletions::tests::/)'
-E 'test(storage_snapshot) + test(/^communities::tests::/) + test(/^tests::communities_/) + test(=tests::partition_audit_outcomes_keep_their_json_names_and_exit_codes) + test(/^nip_fi::tests::/) + test(/^nip_fi_policy::tests::/) + test(/^user_deletions::tests::/)'
# Multi-tenant conformance gate (buzz-conformance): the independent
# replay checker + golden fixtures. No infra — pure in-process trace
# replay — so it belongs in the unit job. Run all targets (lib + the
Expand Down
5 changes: 5 additions & 0 deletions crates/buzz-admin/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@ serde_json = { workspace = true }
serde = { workspace = true }
anyhow = { workspace = true }
hex = { workspace = true }
base64 = { workspace = true }
reqwest = { workspace = true }
sha2 = { workspace = true }
# Redis TLS (rediss://, e.g. ElastiCache) uses rustls, which needs a process
# CryptoProvider installed at startup. The workspace redis TLS feature compiles
# both aws-lc-rs and ring in transitively, so rustls can't auto-select one — we
Expand All @@ -39,4 +42,6 @@ uuid = { workspace = true }
clap = { version = "4", features = ["derive"] }

[dev-dependencies]
axum = { workspace = true }
tempfile = "3"
tokio = { workspace = true, features = ["test-util"] }
8 changes: 8 additions & 0 deletions crates/buzz-admin/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
mod communities;
mod deletions;
mod nip_fi;
mod nip_fi_policy;
mod user_deletions;

use std::future::Future;
Expand Down Expand Up @@ -124,6 +125,8 @@ enum Command {
#[command(subcommand)]
command: nip_fi::NipFiCommand,
},
/// Change or inspect a community stored NIP-FI requirement.
NipFiPolicy(nip_fi_policy::Args),
/// Durable CLI-only whole-community deletion control plane.
Deletions {
#[command(subcommand)]
Expand Down Expand Up @@ -213,6 +216,11 @@ async fn run(cli: Cli) -> Result<i32> {
Command::Deletions { command } => deletions::run(command).await,
Command::UserDeletions { command } => user_deletions::run(command).await,
Command::NipFi { command } => nip_fi::run(command).await,
// Retain transport/file causes for this operator command without changing
// the diagnostics of other admin commands. Key parse errors are redacted.
Command::NipFiPolicy(args) => nip_fi_policy::run(args)
.await
.map_err(|e| anyhow::anyhow!("{e:#}")),
Command::ReconcileChannels { channel, relay_key } => {
reconcile_channels(channel, relay_key).await?;
Ok(0)
Expand Down
Loading
Loading