Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
4f7a791
feat: add durable community deletion worker
Jul 31, 2026
08981b5
wip: checkpoint deletion remediation lanes
Jul 31, 2026
4dff6d9
test: cover deletion lifecycle safety boundaries
Jul 31, 2026
af4c4a6
fix: harden deletion executor lease handling
Jul 31, 2026
dc6e098
fix(relay): restore community write fence on persistent ingest
kalvinnchau Aug 1, 2026
d918d47
fix: close community deletion serving-write races
Aug 1, 2026
7fa4b75
fix(e2e): make live relay checks topology-correct
Aug 1, 2026
b69bd76
fix(deletion): make community erasure resumable
Aug 2, 2026
3e5e424
fix(deletion): resume an uncheckpointed first object
Aug 2, 2026
f4734cc
test(deletion): exercise crash resume through drained stage
Aug 2, 2026
b338860
fix: preserve admitted git writes through quiescing
Aug 2, 2026
7392b3c
fix: bind deletion approval to frozen inventory digest
Aug 2, 2026
ebcc9a5
fix: bind community deletion execution to approval
Aug 2, 2026
cc43b7b
test: derive owner-limit fixtures from production cap
Aug 2, 2026
f762fa2
chore: keep deletion regressions out of github actions
Aug 3, 2026
4b58b02
fix: freeze destructive deletion evidence
Aug 3, 2026
3094b79
refactor: remove unused deletion retention scaffolding
Aug 3, 2026
9415fd8
refactor: defer deletion worker helm packaging
Aug 3, 2026
d2376be
fix(deletion): support desired-state schema deployments
Aug 3, 2026
6faede2
fix: authorize nip-rs rows during community purge
Aug 3, 2026
bc3b373
refactor: narrow community deletion to operator execution
Aug 3, 2026
76224c5
feat: scale community deletion to large tenant buckets
kalvinnchau Aug 3, 2026
a83c51c
fix: close community deletion safety races
Aug 3, 2026
ace0f22
fix: scope community deletion storage inventory
Aug 3, 2026
86b71fc
fix: decouple deletion operator commands
Aug 4, 2026
1c31127
test: restore topology-safe live relay fixtures
Aug 4, 2026
ed5a597
fix: advance community deletion migration to 0028
Aug 4, 2026
8d51c84
refactor: decouple deletion safety from migration revisions
Aug 5, 2026
7c6db47
fix: preserve admitted leases through quiescing
Aug 5, 2026
cc96b08
fix: return typed invite fence errors
Aug 5, 2026
d922b42
test: isolate quiesced invite migration database
Aug 5, 2026
77fcb86
fix: isolate community deletion fences
Aug 6, 2026
692fb59
test: harden community writer inventory
Aug 6, 2026
035daa3
fix: compose writer connection guards
Aug 6, 2026
bb2cab4
test: close writer scanner escapes
Aug 6, 2026
f6cd32a
test: inventory sql execution APIs
Aug 6, 2026
5a07400
test: classify query builder writes
Aug 6, 2026
ff4ce73
test: calibrate writer pool hooks
Aug 6, 2026
cb6ea7f
test: bind dynamic sql fingerprints
Aug 6, 2026
64be86a
test: exercise unsafe hook defaults
Aug 6, 2026
513cf74
test: bind scanner to execution state
Aug 6, 2026
9592750
test: reject conditional mutating builders
Aug 6, 2026
a7caa1a
test: reconstruct builder sql exactly
Aug 6, 2026
32c373e
test: classify builder mutations by sql ast
Aug 6, 2026
6407af1
test: recurse through builder mutation ast
Aug 6, 2026
32b61c7
fix: restore bounded deletion retries
Aug 6, 2026
1cd15de
fix: migrate bounded retry state additively
Aug 6, 2026
9a9db55
fix: ignore observational row drift before fencing
Aug 6, 2026
26a4082
chore: reconcile deletion migration numbering
Aug 6, 2026
27aa689
chore: narrow community deletion scope
Aug 6, 2026
f559e69
fix: send policy close on community deletion
Aug 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
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