tidaldb/.sdlc/features/m9-community-profile-sync/tasks.md

94 lines
2.5 KiB
Markdown

# Tasks: Community Profile Sync
## T1 — Add `Tag::CommunityMembership = 0x0E` to storage key encoding
**File:** `tidal/src/storage/keys.rs`
- Add `CommunityMembership = 0x0E` variant to `Tag` enum.
- Add `0x0E => Some(Self::CommunityMembership)` arm to `from_byte`.
- Update all tag-listing tests.
**Status: COMPLETE**
---
## T2 — Implement `CommunityMembershipIndex`
**File:** `tidal/src/entities/community.rs` (new)
- `add(user_id, name)` — inserts into sorted Vec, deduplicates.
- `get(user_id) -> Vec<String>` — cloned snapshot.
- `contains(user_id, name) -> bool`.
- `entry_count() -> usize`.
- Unit tests covering all methods.
**Status: COMPLETE**
---
## T3 — Add `community_membership` field to `TidalDb`
**File:** `tidal/src/db/mod.rs`
- Add field: `community_membership: Arc<CommunityMembershipIndex>`.
- Wire into both constructors.
**Status: COMPLETE**
---
## T4 — Implement `db/community.rs`
**File:** `tidal/src/db/community.rs` (new)
- `join_community(user_id, community_name) -> Result<()>` — validate, persist, update index.
- `get_community_memberships(user_id) -> Result<Vec<String>>` — read from index.
- `is_community_member(user_id, community_name) -> Result<bool>` — read from index.
**Status: COMPLETE**
---
## T5 — Startup rebuild of community membership index
**File:** `tidal/src/db/state_rebuild.rs`
- `rebuild_community_memberships(users_engine, index)` — scans `Tag::CommunityMembership` keys.
- Called from open path.
**Status: COMPLETE**
---
## T6 — Signal forwarding: `try_community_forwarding`
**File:** `tidal/src/db/signals.rs`
- `try_community_forwarding(&self, signal_type, entity_id, weight, timestamp, user_id)`.
- Called from `signal_with_context` after `try_cohort_attribution`.
**Status: COMPLETE**
---
## T7 — Integration tests
**File:** `tidal/tests/m9_community_sync.rs`
10 integration tests: join_and_query_membership, signal_routes_to_community_aggregate, nonmember_signal_not_forwarded, multiple_communities_independent, membership_persists_across_restart, join_idempotent, invalid_community_name_empty, invalid_community_name_too_long, forwarding_does_not_block_primary_write, community_aggregate_windowed_count.
**Status: COMPLETE — all 10 pass**
---
## T8 — Verify
```
cargo test --manifest-path tidal/Cargo.toml --lib → 1299 passed
cargo test --manifest-path tidal/Cargo.toml --test m9_community_sync → 10 passed
cargo clippy --lib -- -D warnings → clean
cargo fmt --check → clean
```
**Status: COMPLETE**