tidaldb/.sdlc/features/p1-briefing-ux-reason-labels/tasks.md

29 lines
1.6 KiB
Markdown

# Tasks: Briefing UX & Reason Labels
## T1: Core types and module scaffold [DONE]
Created `tidal/src/ranking/reason.rs` with `ReasonCode` enum (19 variants), `ReasonLabel` struct, `DOMINANCE_THRESHOLD` (0.10), `MAX_REASONS_PER_RESULT` (3), and `select_top_reasons()`. Added `reasons: Vec<ReasonLabel>` to `ScoredCandidate`, `RetrieveResult`, and `SearchResultItem`. Updated all construction sites. Re-exported from `lib.rs`.
## T2: Populate signal_snapshot during scoring
Fix the existing empty `signal_snapshot` on `ScoredCandidate`. In `ProfileExecutor::score()`, after computing the raw score, read the decay scores for the profile's boost signals and populate `signal_snapshot`.
## T3: Tag candidate-generation reasons in RETRIEVE pipeline
Tag candidates with source strategy reasons after Stage 1: `Relationship` -> `FollowedCreator`, `SignalRanked` trending -> `TrendingGlobal`, exploration -> `ExplorationBudget`, `EmbeddingSimilarity` -> `PreferenceMatch`.
## T4: Tag scoring-stage reasons
In `ProfileExecutor::score()`, determine dominant reason from score composition: sort-mode mapping, social proof detection, session boost, quality gates.
## T5: Tag search-method reasons in SEARCH pipeline
Tag search results with retrieval method: BM25 -> `TextRelevance`, ANN -> `SemanticMatch`, scope reasons.
## T6: Final API surface polish and result assembly
Ensure `select_top_reasons()` is called in both pipelines. Verify wire format serialization.
## T7: Integration tests
Create `tidal/tests/p1_reason_labels.rs` with tests for each profile type verifying correct reason labels.