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
2b0055b
feat: add durable community deletion worker
Jul 31, 2026
d47e4cc
wip: checkpoint deletion remediation lanes
Jul 31, 2026
7791382
test: cover deletion lifecycle safety boundaries
Jul 31, 2026
6c71a3b
fix: harden deletion executor lease handling
Jul 31, 2026
4e8d883
fix(relay): restore community write fence on persistent ingest
kalvinnchau Aug 1, 2026
7cd7a71
fix: close community deletion serving-write races
Aug 1, 2026
8b17619
fix(e2e): make live relay checks topology-correct
Aug 1, 2026
bc1547b
fix(deletion): make community erasure resumable
Aug 2, 2026
9a9ea72
fix(deletion): resume an uncheckpointed first object
Aug 2, 2026
70df23b
test(deletion): exercise crash resume through drained stage
Aug 2, 2026
86a164a
fix: preserve admitted git writes through quiescing
Aug 2, 2026
64ddf8b
fix: bind deletion approval to frozen inventory digest
Aug 2, 2026
e5cf349
fix: bind community deletion execution to approval
Aug 2, 2026
79fadb9
test: derive owner-limit fixtures from production cap
Aug 2, 2026
256d80e
chore: keep deletion regressions out of github actions
Aug 3, 2026
c606669
fix: freeze destructive deletion evidence
Aug 3, 2026
9de48b1
refactor: remove unused deletion retention scaffolding
Aug 3, 2026
c08678e
refactor: defer deletion worker helm packaging
Aug 3, 2026
11bedf9
fix(deletion): support desired-state schema deployments
Aug 3, 2026
c8d17f4
fix: authorize nip-rs rows during community purge
Aug 3, 2026
9a0e3d9
refactor: narrow community deletion to operator execution
Aug 3, 2026
d51c7d2
feat: scale community deletion to large tenant buckets
kalvinnchau Aug 3, 2026
f4384f9
fix: close community deletion safety races
Aug 3, 2026
36dabb4
fix: scope community deletion storage inventory
Aug 3, 2026
3cbba4b
fix: decouple deletion operator commands
Aug 4, 2026
1a2c2e4
test: restore topology-safe live relay fixtures
Aug 4, 2026
bfb90c0
fix: advance community deletion migration to 0028
Aug 4, 2026
7aced35
refactor: decouple deletion safety from migration revisions
Aug 5, 2026
1fa514b
fix: preserve admitted leases through quiescing
Aug 5, 2026
f4ab399
fix: return typed invite fence errors
Aug 5, 2026
8b2b912
test: isolate quiesced invite migration database
Aug 5, 2026
ccff069
fix: isolate community deletion fences
Aug 6, 2026
7f45361
test: harden community writer inventory
Aug 6, 2026
8c38495
fix: compose writer connection guards
Aug 6, 2026
1e92d50
test: close writer scanner escapes
Aug 6, 2026
39a65ea
test: inventory sql execution APIs
Aug 6, 2026
d2d175b
test: classify query builder writes
Aug 6, 2026
9cae585
test: calibrate writer pool hooks
Aug 6, 2026
98e9028
test: bind dynamic sql fingerprints
Aug 6, 2026
5d4dc84
test: exercise unsafe hook defaults
Aug 6, 2026
c82ae3e
test: bind scanner to execution state
Aug 6, 2026
f4d7cce
test: reject conditional mutating builders
Aug 6, 2026
c7529a9
test: reconstruct builder sql exactly
Aug 6, 2026
4605e92
test: classify builder mutations by sql ast
Aug 6, 2026
497b9f4
test: recurse through builder mutation ast
Aug 6, 2026
01da678
fix: restore bounded deletion retries
Aug 6, 2026
8ec0933
fix: migrate bounded retry state additively
Aug 6, 2026
e933239
fix: ignore observational row drift before fencing
Aug 6, 2026
a62e9ae
chore: reconcile deletion migration numbering
Aug 6, 2026
8938d58
chore: narrow community deletion scope
Aug 6, 2026
d894f6d
fix: send policy close on community deletion
Aug 6, 2026
4da21a3
fix: close community deletion release gates
Aug 7, 2026
359d840
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