# 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` 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.