Files
signal-platform/reports
dennisthiessenandClaude Opus 5 3143477a62 feat(regime): cut the risk monitor to v4 — desaturate VIX and the trend break
Two sensors saturated in exactly the range where resolution matters, and the top
State band had no headroom. Calibrated with scripts/run_regime_monitor_calibration.py
over the 408 sessions ending 2026-07-24; the shipped code reproduces that run's
band shares exactly (78.9 / 13.0 / 4.7 / 3.4).

V1 read VIX 30, 50 and 82 as an identical 100 — the same defect v3 had just
removed from P3, left in place one sensor over. In the window it flattened five
distinct April-2025 prints (52.33, 46.98, 45.31, 40.72, 38.57) into one value.
Now an anchor table reaching full scale at 55, not at 2020's ~82: anchoring the
top at a once-in-a-generation print would make VIX 50 read only ~70. Pegged on
14 of 408 sessions before; none now.

_under_200 returned a bare 0/100, so P1 printed 100 the moment SMH and QQQ were
both under their average — and since the price pillar takes max(P1, P2, P3),
that pinned the pillar and stopped P3's ladder resolving for the whole of a
selloff. Now graded by depth below the 200-DMA, with a deliberate floor of 20 at
the crossing: the break is a genuine binary event, only its depth is graded.
Pegged on 46 of 408 sessions before; none now. A 2% break reads ~30, not 100.

max() was KEPT — the defect was the step function feeding it, not the vote, and
v3's "one capped vote for correlated reads" rationale still holds. P1 is the sole
price argmax on 17 of 408 sessions (4.2%), so the P1_SCORE_CAP fallback drafted
during design was measured as unnecessary and not shipped.

STATE_BANDS breaking 80 -> 65, and only that threshold. Credit returns 0.0 (not
None) when calm, so it holds its 20 points pinned at zero and price + breadth +
volatility at literal maximum summed to exactly 80.0 — v3's threshold to the
decimal, with nothing above it. The sensor is deliberately unchanged: a
calm-credit selloff genuinely is less stressed. What was stale is the band, fit
on v2 while credit's since-removed percentile leg still contributed. A
2022-style AI/tech drawdown with calm credit computes to 70.3 (no death cross) or
74.0 (with one); 70 would have left 0.33 points of headroom, reproducing the
defect. Chosen by scenario arithmetic, and the realized breaking share then lands
on 3.4% — the same as v3's, arrived at independently.

"v4" added to CATEGORICAL_FUNDAMENTAL_METHODOLOGIES in this same commit, which is
load-bearing: that set is checked against the STORED blob, so bumping without it
discards the collected observation on first write, leaving fetched_at null and
locked false — and update_regime_monitor then fires a paid LLM refresh on every
run, forever. Now guarded by a test parametrised over v2 and v3 stored blobs.

SENSOR_REVISION deliberately stays 2: a METHODOLOGY change already forces a full
reseed via _parse_snapshot, and bumping both would imply the reseed was
revision-driven.

QUADRANT_STATE_DIVIDER stays 50 because only breaking moved, so alert_service,
RegimeChart and the quadrant tests need no change. A new test enforces
divider == band boundary on both axes, which nothing did before.

Doc renamed to regime-monitor-v4.md with a tombstone at the old path (commit
messages cite it), the three open questions converted to resolved with the
reasoning that closed them, and indexed in docs/research/README.md for the first
time. The P2 limit is stated honestly: _death_cross pegs at a -5% MA gap, so a
deep selloff still reaches 100 via P2 — v4 repairs the shallow-to-moderate break,
not "the price pillar no longer pegs".

DEPLOY: the first run reseeds ~464 sessions. Expect one phantom quadrant alert
(the dedup key carries basket_hash, not methodology) and re-run the Event Study
manually — its cached report self-invalidates but does not self-regenerate.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-08 20:34:25 +02:00
..
2026-07-18 15:29:10 +02:00
2026-07-13 14:07:42 +02:00
2026-07-13 14:07:42 +02:00
2026-07-17 15:22:58 +02:00
2026-07-17 17:42:13 +02:00
2026-07-18 16:57:19 +02:00
2026-07-18 16:57:19 +02:00
2026-07-19 10:40:19 +02:00
2026-07-18 15:29:10 +02:00
2026-07-18 15:29:10 +02:00
2026-07-13 10:58:40 +02:00
2026-07-13 10:58:40 +02:00
2026-07-13 08:18:40 +02:00
2026-07-13 08:18:40 +02:00

Backtest report index

Reports dated 2026-07-11 or earlier are the historical production research record and remain untouched.

The completed 2026-07-12/13 S/R and Gate Target Ladder research is preserved as compact decision evidence instead of full per-arm replay output:

  • sr-v2-validation-comparison.json and sr-v2-validation-cohorts.csv record the held-out detector comparison.
  • sr-full-production-vs-candidate-comparison.json and its cohort CSV record the full-period clean-structure replacement decision.
  • sr-explicit-target-ladder-comparison.json and its cohort CSV record exact GTL parity: 202,765 candidates, 1,086 qualified setups, 321 book trades, Sharpe 2.03, CAGR 50.0%, and max drawdown 21.4% in both arms.
  • The three backtest-20260713-gtl-*.json/.md pairs record the tuning, confirmation, and strength-sensitivity decisions. No stable improvement was found, so the production GTL stayed frozen.

The large backtest-sr-*.json replay files were removed after consolidation. They duplicated hundreds of thousands of candidate rows while adding no decision information beyond the compact comparisons and the narrative in docs/research/sr-levels-and-exits.md. The original raw files remain available in Git history if a forensic reconstruction is ever necessary.

The initial untracked backtest-20260712-sr-detector-rewrite.json is local-only and is intentionally not part of the repository.

The 2026-07-17 post-stop re-entry decision is preserved in daily_reentry_matrix.json. It is the canonical source for the nine-policy daily replay, production-like full-universe ranking, the disjoint 2025+ book, and the cost/capacity sensitivity matrix. The interpretation and production decision live in docs/research/post-stop-reentry.md.

The earlier post-stop-reentry-20260717.json, post-stop-cooldown-sweep-20260717.json, and gate-protected-stop-20260717.json reports were removed as superseded intermediate experiments. They used weekly/hybrid entry cadence or tested the rejected stop-adjustment path, and add no decision evidence beyond the final daily matrix and narrative. Their matching one-off runners were removed too. All remain recoverable from Git history. Rebuildable candidate pickle caches are intentionally ignored and must not be committed.

Phase B fip breadth IC (2026-07-18/19) — compact evidence

Canonical artifacts:

  • fip-reconcile-20260719-000520.json — single-sourced authoritative ICs (unconditional liquid fip, tiers, prod-subset, mom-conditional, context signals). Membership symbol dumps stripped after the decision; narrative in docs/research/fip-breadth-ic.md.
  • fip-breadth-20260718-211440-fingerprint.json — prod-snapshot fingerprint pass (fip IC 0.045 / t 2.91).

Removed as superseded / dangerous intermediate noise (recoverable from Git):

  • fip-breadth-20260718-211440-breadth.json (+ wrapper) — orphaned +0.0575 / t +5.12 from racing a partial research.sqlite. Kept out of the tree so it cannot be re-mythologized.
  • fip-breadth-20260718-194828*.json — fingerprint-only partial run.
  • fip-breadth-diagnostics-20260718-213705.json and …-213908.json — dual-path diagnostics superseded by the single-sourced reconcile.