pam ▸ docs/generated/ralph_loop_2026-03-16_unmatched_candidate_sleeves.md
updated 2026-03-28

Ralph Loop 2026-03-16: Unmatched Candidate Sleeves

Why

research/latest_state.json showed top_research_candidate_sleeves=economics_band_follow=16, but the top research rows were mostly Elections, World, and Companies markets with no semantically valid sleeve match. Candidate review was forcing those rows into the nearest low-blocker sleeve, which made the concentration diagnostic misleading.

Change

  1. Updated research/candidate_review.py to label rows as no_semantic_sleeve_match when every sleeve check fails on semantic blockers (category, market_family, model_source, signal_action, heuristic_direction, or missing live price).
  2. Kept the existing blocker list and ranking logic intact so this is a diagnostics-quality change, not a strategy-threshold change.
  3. Added a regression test in tests/test_candidate_review.py for an unmatched Elections row.
  4. Documented the new attribution behavior in research/README.md.

Validation

  1. pytest -q tests/test_candidate_review.py - 7 passed in 0.03s
  2. python3 research/candidate_review.py --db data/unicorn.db --recent-runs 6 --max-per-state 5 - top_research_candidate_sleeves changed from economics_band_follow=16 to no_semantic_sleeve_match=16 - top_review_candidate_sleeves now shows politics_midprice_reversal=1, no_semantic_sleeve_match=1

Outcome

Ralph now sees that the live packet is bottlenecked by unmatched rows rather than a falsely dominant sleeve family. That points the next bounded iteration toward adding a real sleeve for those rows or improving row filtering, instead of tuning the economics band sleeve for the wrong problem.