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.
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.
## 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)
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
R1 — motor de replay sobre el archivo R0
Re-ejecuta
BayesianStrategy.evaluate()sobre el archivo R0 (signals+ext_snapshots+markets) y guarda el resultado enreplay_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 opcionalas_ofenevaluate()/_days_to_resolution()(inyección de reloj). DefaultNone= 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 …).ReplayNewsdevuelve elnews_sentimentarchivado (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.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 porreplay_cycle()en local:skip_reason='confidence', BUY_YES, guardrail no aplicado.Sin cambios de comportamiento en prod: el bot no importa
bot.replayyas_ofpor defecto esNone.🤖 Generated with Claude Code