Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
fd6437e
feat: add durable community deletion worker
Jul 31, 2026
7239517
wip: checkpoint deletion remediation lanes
Jul 31, 2026
fb2c881
test: cover deletion lifecycle safety boundaries
Jul 31, 2026
460f8f5
fix: harden deletion executor lease handling
Jul 31, 2026
bf3c302
fix(relay): restore community write fence on persistent ingest
kalvinnchau Aug 1, 2026
ea2a253
fix: close community deletion serving-write races
Aug 1, 2026
d6e7e23
fix(e2e): make live relay checks topology-correct
Aug 1, 2026
072ad22
fix(deletion): make community erasure resumable
Aug 2, 2026
5d96da2
fix(deletion): resume an uncheckpointed first object
Aug 2, 2026
3b6d718
test(deletion): exercise crash resume through drained stage
Aug 2, 2026
5c7ecb7
fix: preserve admitted git writes through quiescing
Aug 2, 2026
230634a
fix: bind deletion approval to frozen inventory digest
Aug 2, 2026
7fbb841
fix: bind community deletion execution to approval
Aug 2, 2026
26548f3
test: derive owner-limit fixtures from production cap
Aug 2, 2026
8b4ed65
chore: keep deletion regressions out of github actions
Aug 3, 2026
541ea2e
fix: freeze destructive deletion evidence
Aug 3, 2026
f9484b6
refactor: remove unused deletion retention scaffolding
Aug 3, 2026
b6f4aa5
refactor: defer deletion worker helm packaging
Aug 3, 2026
225860e
fix(deletion): support desired-state schema deployments
Aug 3, 2026
56a4443
fix: authorize nip-rs rows during community purge
Aug 3, 2026
4e78f12
refactor: narrow community deletion to operator execution
Aug 3, 2026
dc18d7c
feat: scale community deletion to large tenant buckets
kalvinnchau Aug 3, 2026
7fa2087
fix: close community deletion safety races
Aug 3, 2026
7e49183
fix: scope community deletion storage inventory
Aug 3, 2026
0830c75
fix: decouple deletion operator commands
Aug 4, 2026
3174b82
test: restore topology-safe live relay fixtures
Aug 4, 2026
ca8b5c4
fix: advance community deletion migration to 0028
Aug 4, 2026
1e3b629
refactor: decouple deletion safety from migration revisions
Aug 5, 2026
45e1df8
fix: preserve admitted leases through quiescing
Aug 5, 2026
9ef2454
fix: return typed invite fence errors
Aug 5, 2026
dbee894
test: isolate quiesced invite migration database
Aug 5, 2026
d4acfd4
fix: isolate community deletion fences
Aug 6, 2026
f7110fe
test: harden community writer inventory
Aug 6, 2026
0f0023b
fix: compose writer connection guards
Aug 6, 2026
1d46d0f
test: close writer scanner escapes
Aug 6, 2026
3e08cf7
test: inventory sql execution APIs
Aug 6, 2026
986ca27
test: classify query builder writes
Aug 6, 2026
251f02b
test: calibrate writer pool hooks
Aug 6, 2026
2108c97
test: bind dynamic sql fingerprints
Aug 6, 2026
fbc17e3
test: exercise unsafe hook defaults
Aug 6, 2026
22aa23f
test: bind scanner to execution state
Aug 6, 2026
21ae0b0
test: reject conditional mutating builders
Aug 6, 2026
326c400
test: reconstruct builder sql exactly
Aug 6, 2026
9204c8c
test: classify builder mutations by sql ast
Aug 6, 2026
3f45b51
test: recurse through builder mutation ast
Aug 6, 2026
c71a69a
fix: restore bounded deletion retries
Aug 6, 2026
3a2979a
fix: migrate bounded retry state additively
Aug 6, 2026
38316df
fix: ignore observational row drift before fencing
Aug 6, 2026
eef2ff7
chore: reconcile deletion migration numbering
Aug 6, 2026
2c10597
chore: narrow community deletion scope
Aug 6, 2026
9d0c58c
fix: send policy close on community deletion
Aug 6, 2026
8b0f0bf
fix: close community deletion release gates
Aug 7, 2026
8a4bf86
chore: remove deletion scanner tooling
Aug 7, 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
25 changes: 25 additions & 0 deletions Cargo.lock

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

2 changes: 2 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ members = [
"crates/buzz-test-client",
"crates/buzz-ws-client",
"crates/buzz-admin",
"crates/buzz-deletion",
"crates/buzz-workflow",
"crates/buzz-media",
"crates/buzz-cli",
Expand Down Expand Up @@ -134,6 +135,7 @@ schemars = { version = "1", default-features = false }
buzz-core = { path = "crates/buzz-core" }
buzz-conformance = { path = "crates/buzz-conformance" }
buzz-db = { path = "crates/buzz-db" }
buzz-deletion = { path = "crates/buzz-deletion" }
buzz-auth = { path = "crates/buzz-auth" }
buzz-pubsub = { path = "crates/buzz-pubsub" }
buzz-search = { path = "crates/buzz-search" }
Expand Down
1 change: 1 addition & 0 deletions crates/buzz-admin/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ path = "src/main.rs"

[dependencies]
buzz-db = { workspace = true }
buzz-deletion = { workspace = true }
buzz-core = { workspace = true }
buzz-auth = { workspace = true }
buzz-pubsub = { workspace = true }
Expand Down
19 changes: 19 additions & 0 deletions crates/buzz-admin/src/deletions.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
//! Thin `buzz-admin deletions` adapter.

pub use buzz_deletion::Command as DeletionsCommand;

/// Delegate to the shared durable deletion engine.
pub async fn run(command: DeletionsCommand) -> anyhow::Result<i32> {
buzz_deletion::run(command).await
}

#[cfg(test)]
mod tests {
use clap::Parser;

#[test]
fn continuous_worker_command_is_not_exposed() {
let command = crate::Cli::try_parse_from(["buzz-admin", "deletions", "worker"]);
assert!(command.is_err());
}
}
8 changes: 8 additions & 0 deletions crates/buzz-admin/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
//! newest timestamp and collide on the bumped second. run.sh serialization is
//! the guard against parallel adds (e.g. `xargs -P`).

mod deletions;

use std::sync::Arc;

use anyhow::Result;
Expand Down Expand Up @@ -81,6 +83,11 @@ enum Command {
#[command(subcommand)]
command: ProductFeedbackCommand,
},
/// Durable CLI-only whole-community deletion control plane.
Deletions {
#[command(subcommand)]
command: deletions::DeletionsCommand,
},
/// Emit kind:39000/39002 events for channels missing them.
///
/// Channels created via direct SQL (seed scripts, pre-migration data) won't
Expand Down Expand Up @@ -148,6 +155,7 @@ async fn run(cli: Cli) -> Result<i32> {
Command::ProductFeedback {
command: ProductFeedbackCommand::List { limit },
} => cmd_list_product_feedback(limit).await,
Command::Deletions { command } => deletions::run(command).await,
Command::ReconcileChannels { relay_key } => {
reconcile_channels(relay_key).await?;
Ok(0)
Expand Down
1 change: 1 addition & 0 deletions crates/buzz-db/src/channel.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1508,6 +1508,7 @@ pub async fn reap_expired_ephemeral_channels(pool: &PgPool) -> Result<Vec<Reaped
AND ch.archived_at IS NULL \
AND ch.deleted_at IS NULL \
AND c.archived_at IS NULL \
AND community_write_allowed(ch.community_id) \
RETURNING ch.community_id, c.host, ch.id",
)
.fetch_all(pool)
Expand Down
Loading
Loading