1.6 KiB
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.