Skip to content
● END OF DAY
SPXcurrent: every source’s date
SPX2026-10-280 sessions
VIX2026-10-280 sessions
LABELS2026-10-280 sessions
FIT2026-10-280 sessions
GREEKS2026-10-280 sessions
SURFACE2026-10-280 sessions
BACKTEST≤2025-03-24
MODELv2
BUILD088fc8d
VIEWas of 2026-10-28
SPX2026-10-28VIX2026-10-28LABELS2026-10-28FIT2026-10-28GREEKS2026-10-28SURFACE2026-10-28BACKTEST≤2025-03-24MODELv2BUILD088fc8dVIEWas of 2026-10-28
SPX7,743.98▲ +0.28%VIX16.91▼ −0.61VVIX96.61▼ −2.849D→6M+5.64contangoVIX/VIX3M0.880RV219.69VIX−RV21+7.22VIX 1Y PCTL46th (percentile among the 252 sessions before 2026-10-28)RULER1short gamma2026-10-281M ATMF13.40%RR25−4.312026-10-28
Each round as a blameless postmortem: what was wrong, why, how it was found, the fix, the tests that now pin it and what it did to the published result. Most corrections lowered the published result (from −9.1% after C17 to −22.2% after C23); C22 raised it from −26.1% to −21.6%; no round restored a positive return.
64 regression tests cited·27 commits linked·C22 evidence from c22_bridge.csv·C23 from c23_bridge.csv
C22 waterfall · portfolio P&L, one correction at a time
$000s
From −$261K (C21 as published) to −$222K (canonical today, on the C23 record) in 15 cumulative steps; each bar is one correction's effect on portfolio P&L.
Each bar is one correction's effect on portfolio P&L in the order the bridge applies them (each row is cumulative), replayed on the C23-restated VIX record, so the last bar is today’s canonical run; the published C22 run ended at −$216,092 and the C23 table below accounts for the difference. The β step moves it by +$108K (S1C −$414K → −$116K, S1 +$576K → −$508K); the single R2 gate by −$139K.
Published result after each round
C17 to C22 as published at the time; C23 from the stored canonical run.
Published cumulative return by round (%)
Round
Cumulative return
C17
−9.1%
C18
−19.0%
C19
−19.0%
C20
−19.0%
C21
−26.1%
C22
−21.6%
C23
−22.2%
C16 published no portfolio figure; C19 and C20 left it unchanged; C23 is the stored canonical run, with its intervals and nulls in the inference on Research.
Findings register · every finding, C16–C23
33 findings
Every finding: status, portfolio P&L where a bridge CSV measures it, the tests that pin it
Portfolio P&L is the sum of the finding's rows in c22_bridge.csv or c23_bridge.csv (mark-to-model; hover for the rows); — where no bridge measures it. A gap is a finding no regression test pins. 30 fixed, 3 quantified (measured and published rather than removed); 1 without a dedicated regression test. The postmortems below keep each finding's root cause, fix, evidence and tests (open a finding, or follow its entry link); the newest round is open.
S1C's direction was chosen after watching S1 fail on 2018–2025; that cannot be undone in code.
Fix
Tested on 2013–2017, a window not used to design it (C17 re-ran it under corrected labels): S1C −$333K; the apparent edge was an artifact.
Evidence
Pseudo-out-of-sample under C17: S1C −$333K — the apparent edge was an artifact
Pinned by
no dedicated regression test (a gap)
Finding 5 · quantifiedS3 arbitrary P&L scale
Root cause
S3's P&L was an assumed 2% per z-unit (no single-stock options data).
Fix
Sensitivity run at 0.5% / 1% / 2% / 4% per z-unit; C22 replaced the proxy with the index leg (a short SPX straddle).
Evidence
C16 sensitivity run: P&L +$5K…+$52K, win 15–17 of 17 at every scale (before C18, C21 and C22 re-priced every trade and C22 replaced the proxy with the index leg)
Finding 1 · fixedSame-day re-entry kept one straddle alive
Root cause
The state machine re-entered on the day it exited, so the strike was fixed at first entry and the tenor decayed to its 1-day floor: a directional |S - K| bet, not a vol trade. Every P&L figure from C10 to C17 was contaminated.
Fix
A forced flat day so positions roll into fresh 30-day ATM straddles.
The published 'best calibration' had been the day the VIX feed failed; fits are now gated on at least 3 VIX tenors with provenance recorded.
Finding 1 · fixedArchived fits ranked by SPX RMSE with no data-sufficiency check
Root cause
With one VIX tenor the VIX leg is one point Heston matches exactly, so under-identified joint fits scored best and headlined the site.
Fix
Gate on >= 3 VIX tenors; Feller reported as PASS / BINDING / VIOLATED. C22 went further: the headline is the newest gate-passing fit, never the lowest RMSE.
Evidence
The published “best calibration” had been the day the VIX feed failed
Portfolio P&L −$261,206 (C21 as published) → −$216,092 (NAV $783,908), Sharpe −1.80 → −0.88, max drawdown −31.5% → −21.6%, as published in C22; S1 +$693,938 → −$287,644. Its 15-step waterfall is replayed today on the C23-restated VIX record, so it ends at the C23 canonical run.
Finding 1 · fixedATM straddles priced at the VIX
Root cause
The VIX is a 30-day variance-swap rate that contains the skew premium; straddles were priced and marked at it.
Fix
ATM vol = β × VIX, with β estimated from stored SPX chains.
Evidence
β = 0.82 = mean of 4 DB chains and 1 live capture (0.80–0.84); the first later chain, 2026-10-16, gives 0.70 — the mean over all 9 chains, 0.79, is not in the β grid. C22 bridge row 11: S1 +$576K → −$508K from β alone, before the later C22 steps; at β = 1 under the full C22 configuration (β grid), S1 shows +$2.5M
Finding 2 · fixedTwo R2 gates and a hard-coded VVIX override
Root cause
Published labels used the adaptive gate while the backtest traded a fixed 100-point VVIX gate, and the signal engine OR-ed a VVIX > 100 override onto any labels.
Fix
One adaptive gate (rolling 252-day 80th percentile of VVIX) everywhere; no override.
Evidence
The backtest traded the fixed gate while the labels used the adaptive one (48% vs 23% of the backtest sessions in R2). C22 bridge row 13: portfolio −$139K
Finding 3 · fixedFree hedging, no carry, sizing off $1M, no-op netting
Root cause
The opening hedge and unwind were free, the book earned no carry, size used $1M instead of the sleeve's NAV, and the netting factor was clipped into a no-op.
Fix
Costs charged once each, premium and hedge financed, size off the running sleeve NAV, real netting.
Finding 4 · fixedS3 P&L was a z-score times an assumed 2%
Root cause
The 'survivor' was positive on 99.5% of random-walk null paths: it measured mean reversion of a ratio, not option P&L.
Fix
S3 is the index leg of the dispersion trade (a short SPX straddle) on the same engine, with a timing null test.
Evidence
S3 +$23K (z-units, as published in C21) → +$61K (index leg); timing null test on S3 at base (pass-1) size, before the sizing overlay: p = 0.065 (the C22 200-path null; C23 replaced it with exposure-matched nulls, Finding 4 of C23); positive for β ≥ 0.80 in the sensitivity grid, negative at 0.78
Finding 5 · fixedPDV spread compared the 30-day VIX with a 1-day forecast
Root cause
The pre-C22 forecast was next-day E|r|, so 'VIX > forecast + 2 vol pts' held on almost every session.
Fix
The spread uses a 21-day RMS-vol forecast refitted daily on labels fully observed at the forecast origin.
Evidence
the pre-C22 σ̂ (a 1-day E|r| forecast) averaged 0.71× the realised RMS vol of the next 21 sessions in the backtest window, so “VIX > σ̂ + 2 vol pts” held on 95% of its 1,816 sessions. C22 bridge row 14: portfolio +$38K
Finding 7 · fixedVIX indices fitted as futures; ATM-call anchors; one-expiry live fits
Root cause
The calibrator fitted spot VIX indices with the futures formula, anchored on adjacent ATM calls only, and the daily bot accepted fits from one SPX expiry (9 options) for a month.
Fix
Spot-index VIX leg, forward-moneyness z-grid anchors with put-wing quotes, and a gate on expiries, options and the put wing.
Evidence
Headline Heston fit replaced; one-expiry fits are rejected by the gate
Vendor data, the calibration's identification, spread-unit evidence and statistical inference
high severity11 findings2026-10-20 → 2026-10-21
Detection
A reviewer-standard pass over every subsystem in six parallel chains (surface, calibration, statistics, data, UI, engineering), each result measured on the five committed model_version 2 sessions and merged only with the full suite green. An independent adversarial review of the merged branch then confirmed 62 findings; the ones that corrected a published claim are finding 11.
Portfolio P&L −$216,092 → −$222,177, Sharpe −0.88 → −0.99 (C23 waterfall, data_store/backtest/c23_bridge.csv: 8 VVIX sessions from Cboe −$6,502; 136 Cboe values +$417); 6 of 4,162 rule labels move; the portfolio Sharpe's 95% bootstrap interval is −1.81 to −0.30. The headline Heston fit is unchanged, now reported with its σ profile and rough Heston beside it. The review round (finding 11) corrected published claims without moving a headline number.
C23 waterfall · the C22 run restated on the Cboe record (c23_bridge.csv)
Row
Step (cumulative)
Portfolio P&L
Δ P&L
Sharpe
0
C22 canonical as published (pre-C23 record)
−$216,092
−0.879
1
same 2-decimal prints restated as Cboe's (|change| <= 0.005)
−$216,092
$0
−0.879
2
term-structure rows on NYSE holidays removed
−$216,092
$0
−0.879
3
VVIX sessions missing from Yahoo added from Cboe
−$222,594
−$6,502
−0.991
4
term-structure values replaced by Cboe's (|change| > 0.005)
−$222,177
+$417
−0.987
Finding 1 (C23-D1) · fixedThe labels, backtest and calibrator read Yahoo's copies of the VIX index family
Root cause
Production overlaid Cboe's official closes on vix_daily only; every consumer read vix_term_structure, Yahoo's float32 copies with NULL provenance, NYSE-holiday rows and 8 VVIX sessions missing (forward-filled).
Fix
Cboe's index files are the record (Yahoo only as a provisional same-evening row, replaced when Cboe posts); the database cache re-synced from it; the daily job writes Cboe first and reports cross-source differences above 0.25 index pts.
Evidence
136 term-structure rows replaced (38 by more than 0.25 index pts, 33 of them in the backtest window), 8 VVIX sessions added, 31 holiday rows removed; portfolio −$216,092 → −$222,177 (c23_bridge.csv); labels 2019-08-09, 2020-02-20, 2020-06-11, 2021-05-11 R1 → R2 and 2021-06-09, 2021-07-08 R2 → R1
Finding 2 (C23-M1) · quantifiedThe σ ≤ 2 box, not the market, sets the headline fit
Root cause
σ sits on its 2.0 ceiling in 2 of the 5 model_version 2 fits (2026-03-24, 2026-10-16); the page said 4 of 5 parameters are set by the market without saying what the box costs.
Fix
A σ profile (the joint loss refitted under caps 1 to 10, κ ≤ 60) and Gauss–Newton identifiability are stored per session and shown; the production box is kept (the NN domain, the vomma shock sizing and the gate depend on it) and its cost is published. The review round (C23f) removed the count the σ profile contradicts: κ is interior but moves with the σ cap along a κ–σ ridge (κ 1.2 at σ ≤ 1, 5.0 at the cap, 27.4 freed) and its curvature SE is 19%, so the pages say σ is on its bound and κ is set by the box, not that 4 of 5 parameters are set by the data.
Evidence
2026-10-16: freeing σ gives σ 6.90, κ 27.4, loss −27.7%, out-of-sample RMSE 2.96 → 1.19 vol pts and model VVIX 205 → 113 against the market's 110; on 2026-03-24 the box costs 2.1% of the loss (data_store/calibrations/diagnostics/)
Finding 3 (C23-M2) · fixedModel error was never measured against the bid–ask, and quotes were not screened for static arbitrage
Root cause
No per-quote residuals were stored, the calibration chart drew the model only, and nothing screened the stored quotes for static arbitrage.
Fix
A surface package: Cohen–Reisinger–Wang screen and l1 repair on HiGHS, an executable-arbitrage certificate, eSSVI and calendar-ordered SVI surfaces, and one scorecard that scores every model on the calibrator's out-of-sample quotes in half-spreads.
Evidence
Out-of-sample median |model − mid| over the 5 sessions: Heston 4.4–15.6 half-spreads (3.0–12.3% inside the bid–ask); the arbitrage-free SVI surface 0.45–1.98 (32–80% inside); executable static arbitrage on all 5 sessions, 160–629 quotes per session in an executable row (data_store/surface/)
Finding 4 (C23-S1) · fixedThe backtest had no statistical inference
Root cause
Sharpe ratios and a 200-path S3 null were published without intervals, deflation for the configurations tried since C10, or exposure-matched nulls for every sleeve.
Fix
Stationary-bootstrap intervals, PSR/DSR against a committed trials ledger, Hansen SPA and StepM, CSCVPBO, exposure-matched circular-shift and trade-shuffle nulls for every sleeve, and forecast comparisons (QLIKE, Diebold–Mariano, MCS).
Evidence
Portfolio Sharpe −0.99, 95% CI −1.81 to −0.30; S3 timing p 0.078 against 3,550 circular shifts (Holm over 6 sleeves 0.47); Hansen SPA p 0.65 for the published series against cash; S3's deflated Sharpe ratio is 0.000–0.019 at the ledger's trial counts (N 147–210) and reaches 0.27 only at N 4.6, the eigenvalue participation ratio of the 83 re-run trial series (not a trial count), with the skill-less trial variance; CSCV PBO 0.34 for the 16 configurations of the published portfolio (data_store/backtest/inference/summary.json)
Finding 5 (C23-R1) · fixedFlat rates in the hedger and the Greeks surface
Root cause
The C7 hedger hard-coded R = 1.5% ('2020 US Treasury'), and the Greeks surface used one median r and q for every maturity, so its 1-year forward was 0.50% below that expiry's parity forward.
Fix
A daily Treasury zero curve (bills and par yields, look-ahead gated, refused when more than 7 days old) feeds the calibrator's reference, the chain cleaner, the C7 study and per-maturity Greeks carry.
Evidence
C7 cumulative P&L 167.95 → 168.34 index points; Greeks surface 1-year forward 7,931.8 → 7,971.7 (the parity forward); the committed fits recorded ^IRX and are unchanged
Finding 6 (C23-O1) · fixedA presentation test could lose a captured session
Root cause
The daily job committed the chain and the fit only if the dashboard tests passed; a test that pinned a value of the committed data failed on the first new fit, and the 2026-10-19 overnight book (accepted three times) was lost.
Fix
Separate gates: data tests gate the capture commit, artifact tests the derived artifacts, presentation tests only the deploy; CI simulates the bot's next session before merge.
Evidence
No published number moved; the simulated next session (scripts/ci/simulate_next_session.py) found 5 more tests that would have blocked the deploy on the first accepted fit
Finding 7 (C23-O2) · fixed`make reproduce` refitted the calibrations from a deleted scratch pickle and with the wrong optimiser
Root cause
The refit step read each fit's recorded inputs from the scratch copy's pickle, which run_step deletes first, so all five calibration steps failed; with the path right, the default TRF refit would still have missed the committed DE fits by up to 2e-3 relative.
Fix
Each refit reads its inputs from the committed pickle in the checkout and runs the optimiser that made it (DE for every fit committed before C23).
Evidence
make reproduce plus the three --full steps: 14 of 14 artifacts bit for bit (docs/reproduce.md)
Finding 8 (C23-U1) · fixedThe accessibility gate audited retired pages; the Risk page printed 'r = —%'; the ML classifier sat on the Overview
Root cause
The CI accessibility gate listed two pages that had become redirects and could not inject axe under the pages' CSP; every page scrolled horizontally at 320 px when the view was a session behind; the Risk banner read one flat carry the per-maturity Greeks no longer had; a demoted research model was on the first screen.
Fix
The gate audits the seven pages and the 404 (the redirects are not pages), with CSP bypassed for the audit context only; status items wrap below 480 px; the Risk page states its r(T), q(T) ranges and the curve; the classifier moved to the Research page.
Evidence
axe-core 4.13.0: 0 violations on the 7 pages and the 404 at 1440 and 390 px in both colour schemes; no horizontal scroll from 320 to 1920 px (docs/engineering.md)
Finding 9 (C23-E1) · fixed`option_chain.year_fraction` raised on an origin with no time in it
Root cause
A missing quote_time cell reads as an empty string or a missing value, which the time parser did not accept; making the module pass mypy's strict flags found it.
Fix
An origin with no time counts as the session close.
Evidence
the path raised; it never returned a wrong T
Pinned by
test_properties_iv.py::test_year_fraction_clock
Finding 10 (C23-E2) · fixedKnown advisories in three locked packages on the download and preview paths
Root cause
pip-audit 2.10.1 on the lock (2026-10-20): idna 3.11 (CVE-2026-45409), urllib3 2.6.3 (five CVEs), werkzeug 3.1.8 (CVE-2026-102598); none in the numerical stack.
Fix
Floors idna ≥ 3.15, urllib3 ≥ 2.8.0 and werkzeug ≥ 3.1.9 in requirements.txt and a recompiled lock that keeps every numerical pin.
Evidence
requirements-lock.txt pins idna 3.20, urllib3 2.8.0, werkzeug 3.1.9; the committed pickles and bit-exact artifacts are unaffected
Finding 11 (C23-V1) · fixedPublished claims that the branch's own artifacts contradicted (independent review of C23)
Root cause
Claims were checked on the grids that produced them: the 'arbitrage-free' SVI surface was constrained at 241 nodes, the forward ledger was tested on synthetic books that always held the position's expiry, the Risk page's delta grid was labelled from the column name, and the S3 deflated Sharpe ratio was quoted at its most lenient trial count.
Fix
SVI slices are accepted only with refined-grid butterfly and calendar certificates (Durrleman g ≥ 0 and calendar order on a 1e-4 grid over k in [−3, 2], a 1/k grid to |k| = 2,000–3,000 and the |k| → ∞ limits), which also gate the label; the ledger trades and marks on the session's full Cboe book whatever the fit does; the Risk grid shows the OTM option's forward delta; every DSR and PBO is reported with its basis; page copy states only what the data supports.
Evidence
Before: 21 SVI-cal slices with g < 0 between grid nodes (worst −2.58e-5 at k = 0.19 on 2026-10-16) and 35 crossing calendar pairs; after: 0 and 0 in all five sessions, every session's objective equal or lower, the published 0.45–1.98 half-spread range unchanged. The ledger's position expiry was in its book on 3 of 19 sessions; now the full Cboe book (55 expiries). The Risk grid showed +0.99 for a 30%-OTM put; now −0.01. S3's DSR: 0.000–0.019 at the ledger's counts, 0.27 only at N 4.6. 'Every fix made the backtest worse': C22 raised it from −26.1% to −21.6%