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

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.