29 lines
1.6 KiB
Markdown
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. |