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

Ralph Loop 2026-03-16: Candidate Review Blocker Split

Change

Added explicit local-vs-global blocker attribution to the PRD 003 candidate-review packet.

Files: - research/candidate_review.py - research/continuous_loop.py - research/status.py - research/discord_status.py - research/README.md - tests/test_candidate_review.py - tests/test_continuous_loop.py - tests/test_research_status.py

Why

The packet already exposed top_invalidation_reasons, but that list can mix:

  1. row-level sleeve or market blockers such as live_edge_bps<100.0
  2. loop-level deployment blockers such as global:score<5.0

When the loop is globally blocked, Ralph needs to know whether candidate quality is still improving underneath that gate. A single mixed blocker list makes that hard to see.

Result

Candidate review now carries:

  1. top_invalidation_reasons
  2. top_local_invalidation_reasons
  3. top_global_invalidation_reasons

The continuous-loop event payload now also emits the top local/global blocker, and the human + Discord status summaries print those splits directly.

Validation

Outcome

This is a bounded PRD 003/operator-quality improvement. It does not create trades or loosen the deployment gate; it makes candidate-review quality legible when the loop remains globally blocked.