No verdicts. This report records infrastructure that makes future verdicts honest. Sleeve stays frozen (Gemma-only v1, paper).
What shipped
validation/forward_lab_store.py: immutable all-101 prediction rows (refuse-overwrite), input hashes, separate outcome files, daily validity receipts (any invariant violation fails the date), global trial counter (data/research_trials.jsonl, seeded at K=63 historical edge-hunt reports + build row).validation/forward_lab_stats.py: date-block bootstrap CI (primary inference unit = trading day), paired D_t readout (mean/median/hit rate/rel-DD/turnover-cost diff), beat-randomized-null probability, per-date Spearman IC, power-analysis day calculator.validation/forward_lab_design.py: sealed challengers C0–C5 (pure builders, unwired) + pre-outcome fresh-info tagger (no analyst feed exists —eventfolded intocatalystupfront, documented).production/llm_research.py:LLM_FULL_COVERAGE=0(default OFF — zero behavior/series change),PROMPT_VERSION, validatorcoveragepassthrough,maybe_write_coveragehook (flag-gated, fail-open).- 8 tests green (
tests/test_forward_lab.py).
Deliberate deviations from the commissioning spec
- Challenger runs NOT wired (builders + spec only). Each challenger × daily API calls; execution is a voted phase with identical timestamps/outcomes.
- Prompt coverage block ships flag-OFF. Enabling it starts a new shadow series (model+prompt versioned); propose as a vote, not a default.
- Power thresholds (10/30/60/100/200d) kept as checkpoints, not magic —
required_days()runs once forward vol is observed.
Clocks now running
- Gemma shadow series (judge votes).
- Coverage series (starts when
LLM_FULL_COVERAGE=1is voted). - Forward harness (
edge_hunt33_gemma_forward.py) executes at N>=30 rows. - Trial counter K=63 and counting — every future study's DSR uses it.