Ralph Loop 2026-03-16: Candidate Review Packet
Change
Added a bounded live candidate-review packet for PRD 003 so the loop now explains current near-miss and deployable rows instead of only reporting aggregate replay/search scores.
Files:
- research/candidate_review.py
- research/continuous_loop.py
- research/status.py
- research/discord_status.py
- research/README.md
Why
research/latest_state.json and the status commands were still weak at answering:
- Which current rows are closest to a trade?
- Which sleeve would own them?
- Why are near misses blocked?
That made “no trade” opaque even when the current scan already contained sleeve-qualified rows.
Result
The new packet:
- loads the latest scan rows from the last 6 runs
- classifies each row as
research_candidate,review_candidate, ordeployable_trade - records the closest sleeve family plus explicit invalidation reasons
- exposes top blockers and top candidates in status output
Focused smoke output on current data:
deployable_trade=3review_candidate=6research_candidate=27- top deployable:
KXTAIWANLVL4-26JUL01viapolitics_midprice_reversal - top review blocker:
live_price>0.01 - dominant blocker mix:
heuristic_direction=neutral,live_price<0.7,category!=Economics
Validation
Commands run:
python3 -m py_compile research/candidate_review.py research/continuous_loop.py research/status.py research/discord_status.py research/strategy.py research/search.py
python3 research/candidate_review.py --db data/unicorn.db --recent-runs 6 --max-per-state 3
python3 research/status.py
python3 research/discord_status.py
Observed behavior:
- All updated modules compiled.
- The candidate-review helper produced structured
deployable,review, andresearchpackets. - Human and Discord summaries now surface the candidate-review counts and top invalidation reasons.
Next bottleneck
The packet showed that the current live scan has deployable politics-midprice rows while the stored loop snapshot still reports zero actions. The next bounded change should tighten freshness/handoff semantics so latest_state.json cannot mask currently deployable rows behind stale replay state.