# Tasks: Signal Revocation Controls ## T1 — Add `Tag::Revocation` and UUID dependency **Status: DONE** - Added `uuid = { version = "1", features = ["v4", "serde"] }` to Cargo.toml (uuid available as transitive dep; explicit declaration pending) - Added `Tag::Revocation = 0x0F` to `storage/keys.rs` - Updated `from_byte`, test arrays (tag_byte_never_zero, tag_roundtrip_all_variants, all_tags_have_unique_bytes) ## T2 — `entities/revocation.rs` — core types and `RevocationIndex` **Status: DONE** - Created `tidal/src/entities/revocation.rs` with `RevocationId`, `RevocationScope`, `SignalRevocation`, `RevocationIndex` - Added `pub mod revocation;` and re-exports to `entities/mod.rs` - 20 unit + proptest tests passing ## T3 — Expose `last_update_ns` on `SignalLedger` **Status: DONE** - Added `entry_last_update_ns(entity_id, type_id) -> u64` to `signals/ledger/core.rs` - Delegates to `HotSignalState::last_update_ns()` (already existed) ## T4 — `db/revocation.rs` — persistence and public API **Status: DONE** - Added `revocation_index: Arc` to `TidalDb` struct - Created `db/revocation.rs` with `revoke_signal`, `cancel_revocation`, `list_revocations`, `revocation_index()`, `rebuild_revocations()` - Added `mod revocation;` to `db/mod.rs` - Exported `RevocationId`, `RevocationScope`, `SignalRevocation` from `lib.rs` ## T5 — Startup restore of revocations **Status: DONE** - Added call to `rebuild_revocations` in the open path in `db/mod.rs` - Wired `rebuild_revocations` from `db/revocation.rs` into `db/state_rebuild.rs` pattern ## T6 — Read-path suppression in `ProfileExecutor` **Status: DONE** - Passed `Arc` into `ProfileExecutor` builder - Applied `is_suppressed` check during scoring loop using `entry_last_update_ns` - Added `is_signal_blocked` combining community suppression + user revocation in `ranking/executor/scoring.rs` ## T7 — Integration tests (`tidal/tests/m10_revocation.rs`) **Status: DONE** 10 tests: 1. basic_signal_type_revocation (R1) 2. time_range_revocation (R2) 3. cancel_revocation_restores_ranking (R3) 4. non_revoked_signal_unaffected (R4) 5. list_includes_active_and_cancelled (R5) 6. user_isolation (R6) 7. overlapping_revocations (R7) 8. revocation_survives_restart (R8) 9. cancellation_survives_restart (R9) 10. anonymous_query_bypasses_revocations (R10) ## T8 — Final cleanup: fmt, clippy, all tests **Status: DONE** - cargo fmt, cargo clippy -D warnings, all lib + integration tests pass - 1299 lib tests + 10 m10_revocation integration tests passing