feat(replay): R1 replay core — clock injection + replay of archived cycles #16

Merged
chemavx merged 1 commits from feat/replay-r1-core into main 2026-07-02 19:57:42 +00:00
Owner

R1 — motor de replay sobre el archivo R0

Re-ejecuta BayesianStrategy.evaluate() sobre el archivo R0 (signals + ext_snapshots + markets) y guarda el resultado en replay_runs/replay_decisions, etiquetado con git sha + hash de las constantes de estrategia (mismo hash vs archivo = test de determinismo; hash distinto = run contrafactual).

Cambios

  • bayesian.py — parámetro opcional as_of en evaluate()/_days_to_resolution() (inyección de reloj). Default None = reloj de pared → producción sin cambios. Único toque al código congelado, puramente aditivo.
  • bot/replay.py — motor + CLI (python -m bot.replay --from … --to …). ReplayNews devuelve el news_sentiment archivado (GNews nunca se llama; el budget por ciclo se bypasea porque el sentiment archivado ya lo codifica). Manifold/db no cableados (señal observacional en prod). Comparación grabado-vs-replayado a tolerancia 1e-9; reentry_guard = no-comparable (matched NULL) pero se re-evalúa para calibración.
  • schema.sqlreplay_runs + replay_decisions (+ índices), idempotente; dry-run BEGIN/ROLLBACK limpio contra prod.
  • db.py — 6 métodos de lectura/escritura para replay.
  • tests — 19 tests nuevos de fidelidad round-trip (todos los caminos de salida + trade path + contrafactual); 104/104 en verde.

Validación con datos reales de prod

Ciclo archivado 2026-07-02T14:03:15Z (46 mercados; prior_extreme ×26, edge_net ×18, confidence ×1, unsupported ×1) exportado de prod y pasado por replay_cycle() en local:

  • 46/46 matched, 0 mismatches, delta máximo de floats = 0.0 exacto (bit a bit)
  • Georgia (629338) reproduce su firma completa: prior 0.465, est 0.5962, edge_net 0.0912, conf 0.50, skip_reason='confidence', BUY_YES, guardrail no aplicado.

Sin cambios de comportamiento en prod: el bot no importa bot.replay y as_of por defecto es None.

🤖 Generated with Claude Code

## R1 — motor de replay sobre el archivo R0 Re-ejecuta `BayesianStrategy.evaluate()` sobre el archivo R0 (`signals` + `ext_snapshots` + `markets`) y guarda el resultado en `replay_runs`/`replay_decisions`, etiquetado con git sha + hash de las constantes de estrategia (mismo hash vs archivo = test de determinismo; hash distinto = run contrafactual). ### Cambios - **`bayesian.py`** — parámetro opcional `as_of` en `evaluate()`/`_days_to_resolution()` (inyección de reloj). Default `None` = reloj de pared → **producción sin cambios**. Único toque al código congelado, puramente aditivo. - **`bot/replay.py`** — motor + CLI (`python -m bot.replay --from … --to …`). `ReplayNews` devuelve el `news_sentiment` archivado (GNews nunca se llama; el budget por ciclo se bypasea porque el sentiment archivado ya lo codifica). Manifold/db no cableados (señal observacional en prod). Comparación grabado-vs-replayado a tolerancia 1e-9; `reentry_guard` = no-comparable (matched NULL) pero se re-evalúa para calibración. - **`schema.sql`** — `replay_runs` + `replay_decisions` (+ índices), idempotente; dry-run BEGIN/ROLLBACK limpio contra prod. - **`db.py`** — 6 métodos de lectura/escritura para replay. - **tests** — 19 tests nuevos de fidelidad round-trip (todos los caminos de salida + trade path + contrafactual); **104/104 en verde**. ### Validación con datos reales de prod Ciclo archivado `2026-07-02T14:03:15Z` (46 mercados; prior_extreme ×26, edge_net ×18, confidence ×1, unsupported ×1) exportado de prod y pasado por `replay_cycle()` en local: - **46/46 matched, 0 mismatches, delta máximo de floats = 0.0 exacto** (bit a bit) - Georgia (629338) reproduce su firma completa: prior 0.465, est 0.5962, edge_net 0.0912, conf 0.50, `skip_reason='confidence'`, BUY_YES, guardrail no aplicado. Sin cambios de comportamiento en prod: el bot no importa `bot.replay` y `as_of` por defecto es `None`. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
chemavx added 1 commit 2026-07-02 14:06:01 +00:00
Re-executes BayesianStrategy.evaluate() over the R0 archive and stores
results in replay_runs/replay_decisions, tagged with git sha + a hash of
the strategy constants (same hash vs archive = determinism check,
different hash = counterfactual run).

- bayesian.py: optional as_of param on evaluate()/_days_to_resolution()
  (clock injection; default None = wall clock, prod behavior unchanged —
  the only touch to frozen code, purely additive)
- bot/replay.py: replay engine + CLI (python -m bot.replay --from --to);
  ReplayNews feeds archived sentiment back (GNews never called, per-cycle
  budget bypassed — archived sentiment already encodes it); manifold/db
  not wired (observational-only in prod); recorded-vs-replayed compare
  at 1e-9 tolerance
- schema.sql: replay_runs + replay_decisions (+ indexes), idempotent
- db.py: 6 replay accessors/writers
- tests: 19 new round-trip fidelity tests (104 total green)

Validated against a real prod cycle (2026-07-02T14:03:15Z, 46 markets,
4 skip paths incl. the Georgia confidence record): 46/46 matched,
max float delta 0.0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
chemavx merged commit 6c544e46e2 into main 2026-07-02 19:57:42 +00:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chemavx/polymarket-bot#16