Ralph Loop 2026-03-16: Pair-Level Eventful Replay Metadata
Change
Improved replay evaluation quality in research/prepare_replay.py by carrying eventful metadata from both observations in each replay pair instead of only the entry-side snapshot.
New replay fields:
_next_eventful_snapshot_next_eventful_score_pair_eventful_pair_eventful_score
Replay summaries now report:
eventful_rowsas pair-level eventful coverageentry_eventful_rowsnext_eventful_rows
This fixes undercounting when an eventful observation appears as the later side of a replay pair.
Why This Was The Smallest Useful Change
Current loop state showed replay prep producing many rows but almost no eventful coverage:
- raw journal rows:
1742 - replay rows:
1280 - raw eventful observations:
60 - replay eventful rows before fix:
1
The journal already contained eventful observations, but replay metadata only preserved eventfulness from the current row in each pair. That made replay input quality look weaker than it really was.
Validation
Focused test:
PYTHONPATH=. pytest -q tests/test_prepare_replay.py
Result:
3 passed in 0.02s
Smoke command:
python3 research/prepare_replay.py --db data/unicorn.db --out /tmp/replay_rows_check.jsonl
Observed profile after fix:
total_rows=1280eventful_rows=2entry_eventful_rows=1next_eventful_rows=1actionable_signal_rows=0review_signal_rows=0
Remaining Bottleneck
This fix improves replay metadata honesty, but the larger issue remains upstream:
- all
1742current journal rows are stillsignal_action=watch - all current replay rows are still
model_source=heuristic
So the next useful change is likely in observation or sleeve generation, not replay pairing.