← Ground Truth report library

The AI Said It Followed the Spec — The Spec Disagreed

Episode F02 · report format v2 · lab run 2020-07-01 → 2026-06-22, incident 2026-07-02, reconstruction 2026-08-15, pre-registration locked 2026-07-02 12:26:24 -0700 before the run
VERDICT — A NUMBER WRITTEN DOWN BEFORE THE CODE EXISTED REJECTED A BACKTEST THAT WAS WRONG IN THE FLATTERING DIRECTION

On 2026-07-02 an AI agent pre-registered this study and committed the pre-registration — 1 file, 83 insertions, and nothing else — 7 min 04 s before the commit that carried the engine. One of the bars it wrote down was about the instrument rather than the answer: realized beta should land inside [1.1, 1.5] for a 1.33× target, and outside that, halt. The same agent then wrote the engine and ran it. The run printed a flattering verdict — “LEAPS viable substitute” — and printed, in the same statement, the realized beta that disqualified it. One line was sizing the position in unit counts instead of dollars. It was fixed, the study was re-run, and the verdict inverted: the option arm ended up behind the margin arm by about 1.37 and 1.43 points a year. The buggy run was never committed, so on 2026-08-15 it was re-derived — one line restored on a generated copy of the committed engine, replayed against the same cached archive. Every figure below from that run is labelled re-derived 2026-08-15, not the original console output.

What we granted, and what we actually tested

Granted, not measured: that the AI in this story wrote the pre-registration, wrote the bar, wrote the bug, found the bug, fixed the bug and published the correction. We wrote the bug. There is no clever reviewer in this report and there must not appear to be one. The protagonist is a four-line paragraph in a markdown file.

Tested: whether a plausibility band written before the code existed caught a specific instrument defect on one study. It did: the band was breached by 2.4983 and 1.9342 in realized beta, and the pre-registration named the diagnosis in advance — sizing bug — which is the diagnosis that turned out to be true.

What this report does NOT claim, pre-committed before the data: Three things this report does not claim. (1) That such bars catch defects generally, at what rate, or on anyone else's code — we ran no survey of bars, no false-negative rate, no comparison against projects without one. A single caught bug is an existence proof of the method, not a measurement of it. (2) That this bar would catch a smaller version of the same defect: it catches sizing errors large enough to push realized beta outside [1.1, 1.5], and a mis-sizing that lands at 1.45 clears it in silence. (3) That anything in the program halted the run. Nothing did. The runner and the engine, 70 and 160 committed lines, contain 0 assert statements and one raise about a missing contract. A person read a printed number and stopped the run.

§1 · The locked pre-registration

Committed 6beaa55 on 2026-07-02 12:26:24 -0700, before the probe was run — the wager you cannot move after seeing the cards.

The falsifiable question

Did a plausibility bar, written down and locked before the code existed, actually reject a result that a reader would otherwise have believed?

Our stated prior: the option arm should cost MORE, not less

The locked pre-registration states it in its own words: “LEAPS leverage costs MORE than margin at 1.33×”, with an expected drag of 1–4% a year. The first run said the opposite by 9.85 and 14.51 points a year, and the prior is not what caught it. A violated prior only says surprising; the reader still has to decide whether to believe the surprise. The band said sizing bug, which is a different kind of sentence — it named the defect and the action in advance, so there was nothing left to argue about. The corrected drag — 1.37 and 1.43 points a year against the option arm — does land inside the prior's 1–4% range, at its low edge.

The primary configuration (locked)

ParameterLocked value
Pre-registration6beaa55a0f0c, 2026-07-02 12:26:24 -0700 — 1 file, 83 insertions
Engine + runner + resulta47a9529fef6, 2026-07-02 12:33:28 -0700 — 4 files, 333 insertions
Window between them7 min 04 s, read from git, not from a session transcript
The barRealized-beta diagnostic should land in [1.1, 1.5] for a 1.33× target; outside → sizing bug, halt.
Engine, as committedsrc/leaps_backtest.py, 160 lines, sha256 701bed65f6699cc9…; 1 commit in its entire history
Runner, as committedrun_study2.py, 70 lines; 1 commit in its entire history
The line as it standsunits = LEVER * equity / s_t # share-equivalents (dollars / spot)
The line as restored for the reconstructionunits = LEVER * equity / 1.0 # share-equivalents per prereg sizing — re-derived 2026-08-15, not the original console output
Behavioural deltaone statement; 17 changed lines total in a machine-produced diff, the rest a docstring and one import; copy sha256 0d3e4e87a7749cfe…
Target exposure1.33× — the study's target, and it appears here for no other purpose
Commission$0.66 per contract, both sides
Starting equity$1.00 on every arm
Window2020-07-01 → 2026-06-22 (5.97 years)
UnderlyingsQQQ and MU — the study's two underlyings and nothing else
Data for the reconstructionthe on-disk cache the original run wrote, replayed read-only and offline (128 hits, 0 misses); the network was never opened

Deliberately NOT tested — named in advance

  1. Whether bars like this one work in general. No survey, no false-negative rate, no comparison against projects without one. One caught bug is an existence proof, not a rate.
  2. A mis-sizing small enough to land inside the band. Not constructed, not tested. It is the obvious way to weaken this report and it is listed below as a standing invitation.
  3. The original console output. This is a fresh run that agrees with the committed account of the incident, not a copy of what was on screen that night.
  4. The wall-clock timing of the original session. Not recoverable from any committed artifact. The only timing figure here is the git window between two commits, which anyone can check.
  5. A second defect the same session. It exists, it was found by ordinary debugging, and no gate caught it. No line of it survives in any committed artifact, so it is described here and carries no number, no timestamp and no chart.
  6. Re-opening the live options API. The terminal was offline; the cached archive was replayed instead, which is why the control run below exists.
A reconstruction that failed to reproduce the rejected readout would have said the committed account of this incident was wrong, and this report would not exist; one that reproduced it says the bar's verdict was the right one. Both endings were disarmed on paper before the run.

The goalposts — all required to proceed

#Pre-registered goalpostMeasuredPass
1Pre-registered goalpost — realized beta inside [1.1, 1.5]. Verbatim from the locked prereg: “Realized-beta diagnostic should land in [1.1, 1.5] for a 1.33× target; outside → sizing bug, halt.”first run: 2.4983 (QQQ) / 1.9342 (MU) realized betaFAILED — the catch
2Pre-registered goalpost — the same band, re-checked after the one-line fix1.1811 / 1.0996 (LEAPS arm), 1.2132 / 1.1488 (margin arm); 4 of 4 inside at displayed precision, 3 of 4 at fullPASS at displayed precision
3Pre-registered goalpost — the study's OTHER plausibility bar, so the list is not cherry-picked: “implied financing rate extracted from entry LEAPS pricing should land in [FFR, FFR + 4%]; outside → halt and inspect (data defect, not a result).”median implied financing 6.33% (QQQ) / 10.16% (MU); MU exceeds the band, halt-and-inspect fired and cleared it as no data defectFIRED, inspected
4Pre-registered goalpost — the kill this reconstruction was run to face: if the re-derived drag had NOT landed in the prereg's own “Drag ≤ 1%/yr (CAGR gap, LEAPS − margin): LEAPS = viable substitute” band, the committed account of the incident would be wrong and this report would not exist−9.85% / −14.51%, and the engine's own band function returns “LEAPS viable substitute” for both — against a corrected +1.37% / +1.43% once the line was fixedit did not fire
5Precondition declared before the counterfactual was trusted — the fixed engine, through the same offline harness, must reproduce the committed results file first107 of 107 cells, 128 cache hits and 0 misses, network never openedPASS

3 of 5 — but the tally is the least interesting line in the table, because the row that FAILED is the finding. Row 1 is the catch: the run was rejected by a bar written before the engine existed. Row 3 is the honest company it keeps — the pre-registration listed two plausibility bars, not one, and the other also fired, on the corrected run, and was inspected and cleared. Row 4 is the kill this reconstruction was run to face, and it did not fire.

§2 · The headline arithmetic

FigureValueClassWhat it means
Pre-registered plausibility band on realized beta[1.1, 1.5]measured (locked artifact)Written for a 1.33× target and committed in 6beaa55, alone, 7 min 04 s before any of this study's code entered git.
Realized beta, first run — QQQ2.4983measured (reconstruction)Realized beta — how hard the position actually swung against the underlying over the whole hold. Outside the band, so the run was rejected.
Realized beta, first run — MU1.9342measured (reconstruction)Same measurement, the volatile name. Also outside the band; also rejected.
Entry exposure, first run — QQQ2.9125× equitymeasured (reconstruction)Entry exposure — a different question and a different number: how much the arm actually bought on day one. 0.011627015 share-equivalents × $250.49 spot. The order was 1.33×.
Entry exposure, first run — MU2.1650× equitymeasured (reconstruction)0.043560458 × $49.70. Beta and exposure are not the same measurement and neither one is the other's error.
The readout the first run printed“LEAPS viable substitute”measured (reconstruction)Printed by the same statement, on the same line, as the beta that disqualified it. That co-location is the whole episode.
Sign convention, stated once because the sources disagree on itdrag = margin CAGR − LEAPS CAGRmeasured (source convention)Read from run_study2.py L39, which is the convention the readout used on the night in question. A negative drag means the option arm came out ahead; a positive drag means it came out behind. The committed result table heads the same column the other way round and prints the opposite sign for the same fact. Both are honest; mixing them inside one sentence is not, which is why this row exists.
Drag on that run — QQQ / MU−9.85% / −14.51% per yearmeasured (reconstruction)The rejected answer, and it is only ever that. Negative, so on the convention above the option arm came out ahead by roughly ten and fourteen points a year. It did not; the engine was carrying roughly twice the ordered exposure. The corrected run turns it into +1.37% / +1.43% per year, which is the answer that stands.
Drag after the one-line fix — QQQ / MU+1.37% / +1.43% per yearmeasuredThe corrected verdict, and the sign flipped: “situational (>1.33x ambitions only)”. It carries its own caveats — two tickers, a bull-dominated window, taxes excluded, and an interest-rate path written by hand rather than pulled from a vendor, which §10 states.
Realized beta after the fix — LEAPS arm1.1811 / 1.0996measuredBack inside the band. 4 of 4 reported betas print inside it at the 2-decimal precision the tool displayed; 3 of 4 are inside at full precision — MU's LEAPS beta sits 0.00036 below the floor. A boundary, not an error, recorded so it cannot later look concealed.
Control parity before the reconstruction was trusted107 of 107 cellsmeasuredThe fixed engine, run through the same offline harness, reproduces the committed results file cell for cell. A harness that could not reproduce the number we already have has not earned the right to produce one we do not.
Assertions in the committed code keyed to the band0 in 230 committed linesmeasuredThere are 0 assert statements in the engine and the runner combined, and exactly 1 raise, which is about a missing contract. The band was enforced because a person read a printed number and stopped. Nothing in the program did that.

§3 · Was it the instrument? The stress tests

What else was on the same screen. The rejected run's option arm also re-derives a worst peak-to-trough fall of 78.70% on the index fund and 89.42% on the volatile name, against the margin arm's 41.84% and 63.37%. Those are a second implausibility and they are not a second check. The pre-registration lists exactly two plausibility bars — realized beta, and implied financing — and the drawdowns are not one of them. Nothing becomes a bar retroactively, least of all on a page whose subject is a bar that was written first.

How big the error actually was, and why it did not crash. Dividing by 1.0 instead of by spot asks for 1.33 share-equivalents per dollar of equity rather than 1.33 dollars of exposure per dollar of equity. At a $250.49 spot that is an over-order of about 250×. It did not produce a 250× position, because the engine's own affordability check caught the infeasible order and capped it at all-in. So the arm quietly became spend one hundred percent of equity on deep-in-the-money calls — delivered entry exposure between 2.16× and 3.03× across the 13 entries, against a standing order of 1.33×. The check that capped the position is what made the bug survivable enough to produce a plausible-looking answer. A bug that crashes is not the dangerous kind.

Where this bar is blind. It answers one question — is realized beta inside [1.1, 1.5] — and nothing else. It catches sizing errors large enough to push realized beta outside that band. It cannot see a defect that leaves beta inside it, and it did not see the other defect in that same session, which was found by ordinary debugging.

§4 · The controls

The control that earns the reconstruction. Before the re-derived run was trusted for anything, the fixed engine was put through the identical offline harness and compared cell for cell against the committed results file: 107 of 107 cells match, 0 failed, at 1e-9 relative tolerance. The scope of those 107: six metrics on each of three arms for each of two underlyings, plus the drag, the minimum equity ratio, the entry count, and the date, expiry, strike, spot and ask of every one of the 13 entries.

The control that shows only one arm moved. The margin arm and the buy-and-hold arm are bit-identical between the two runs — every metric, both underlyings. The defect lived entirely in one of the two things being compared, which is itself the reason the output looked like a finding rather than a fault.

The control that makes an offline replay legitimate. Contract selection reads only the symbol, the expiration list, the date and the spot — it never sees position size. So both runs issue the same data requests, and they did: 13 of 13 entries are identical across the two runs on date, expiry, strike, spot and ask, with 128 cache hits and 0 misses and the network never opened.

The control on our own claim about the instrument. We say the bar was enforced by a human, not by the program. That is measured, not asserted: the committed engine and runner (160 + 70 lines) contain 0 assert statements between them and exactly 1 raise, at line 98, about a missing contract. Nothing keyed to the band. A person read a printed number and stopped.

§5 · The best objection, pre-registered and answered

“The damning numbers are a reconstruction. You are grading your own homework, twice.” It is the right objection, and it is why the reconstruction was built the way it was rather than typed from memory.

  1. The engine copy is generated, not hand-edited. A script reads the committed source, asserts its two anchor strings appear exactly once, writes the copy and emits a machine-produced unified diff carrying the sha256 of both files. The whole behavioural delta is one statement; the rest of the 17 changed lines are a docstring and one import that routes reads to an offline cache.
  2. The control ran first. 107 of 107 cells, against a file committed six weeks earlier.
  3. The reconstruction could have killed this report and we ran it anyway. If the re-derived drag had missed the pre-registered “Drag ≤ 1%/yr (CAGR gap, LEAPS − margin): LEAPS = viable substitute” band, the committed account of the incident would have been wrong. It did not miss it: −9.85% and −14.51%, both inside, both returning the same rejected readout — against a corrected +1.37% / +1.43% once the one line was fixed.
  4. What it does not recover is stated rather than glossed. Not the original console output. Not the wall-clock timing of that session. Not the second defect, which has no surviving line to restore. This run agrees with the original; it is not a copy of it, and every figure from it is labelled re-derived 2026-08-15, not the original console output.

§6 · On our own terms

Three things run against this report, and they are the reason it exists rather than a footnote to it. An episode about our own rigor is structurally an advertisement for our own rigor, and the failure mode is that you leave impressed instead of equipped.

The bar answers exactly one question. Is realized beta inside [1.1, 1.5]. That is all it asks and all it can see. A mis-sizing that lands the position at 1.45 clears it without a sound, and there was a second defect in that same session that no gate caught — found by ordinary debugging, and it carries no number here because no committed artifact records one.

The bar was not clever. It was early. Its entire power is that it was committed alone, before the engine existed, in a commit containing 1 file and 83 lines. Nothing about writing it required skill you do not have. If you cannot, from this page, write the same kind of bar for your own next backtest, the page has failed regardless of what it says about humility.

We wrote the bug. The same agent wrote the pre-registration, the bar, the defect, the fix and the correction. There is no outside reviewer in this story.

And one boundary, recorded so it cannot later look concealed. On the corrected run MU's LEAPS beta is 1.0996 — 0.00036 below the band floor. The tool printed beta to two decimals, so 1.10 is genuinely what was on screen and genuinely inside the band. The honest form: 4 of 4 reported betas print inside the band at the precision the tool displayed, and 3 of 4 are inside at full precision.

§7 · The complete ledger — all 13 rows

All 13 entries the study opened, 7 on the index fund and 6 on the volatile name, with both runs side by side. The right-hand columns are re-derived 2026-08-15, not the original console output. Units ordered is what the specification asked for: 1.33 dollars of exposure per dollar of equity. Units as run is what the engine actually bought once its affordability check capped the impossible order at all-in. Entry exposure is that entry's share-equivalents times the spot price, divided by the equity the arm held going into that entry — and that divisor is not a column here: it moves from roll to roll, and it is a different number in the two runs. So the form to check against this ledger is the one the affordability cap collapses it to, spot divided by (ask + commission), which reproduces the right-hand column on 13 of 13 rows. The CSV carries the measurement twice, once for the order and once for the run, on those two different equity paths. It is a different measurement from realized beta, which is on the whole hold rather than on day one. Over-order factor asked for is the spot price, because dividing by 1.0 instead of by spot asks for exactly that many times too much. The contract columns are identical in both runs, which is the evidence that selection never saw the sizing. The CSV carries 13 columns under these exact names: symbol, entry_date, expiry, strike, spot, ask, units_ordered, units_run_reconstructed, entry_exposure_ordered_x, entry_exposure_run_reconstructed_x, over_order_factor_asked_for, implied_financing, premium_over_intrinsic. The last two are the study's own per-entry figures rather than anything this page derived: implied_financing is the annualised financing rate the entry price implies — the input to the second pre-registered bar in the goalposts table — and premium_over_intrinsic is what the contract cost above its intrinsic value at entry. Both are identical in the two runs, because both are properties of the contract and not of the position size. Check our arithmetic: the CSV below is the same file the figures above are computed from.
Download the full 13-row ledger (CSV)
#SymEntryExpiryStrikeSpotAskUnits orderedUnits as run (re-derived)Entry exposure orderedEntry exposure as run (re-derived)Over-order factor asked for
1QQQ2020-07-012021-12-17175.00250.4986.000.005309590.011627011.3300×2.9125×250.49×
2QQQ2021-06-212022-12-16240.00344.36113.490.005531430.017149431.3300×3.0341×344.36×
3QQQ2022-06-212023-12-15195.00281.08104.460.005034890.007694821.3300×2.6906×281.08×
4QQQ2023-06-202024-12-20255.00366.90135.060.005258300.010122731.3300×2.7164×366.90×
5QQQ2024-06-242025-12-19329.78473.96173.870.005603980.013498011.3300×2.7258×473.96×
6QQQ2025-06-232026-12-18370.00531.65192.850.005525060.014260681.3300×2.7567×531.65×
7QQQ2026-06-222027-12-17515.00735.73275.940.005902990.019483211.3300×2.6662×735.73×
8MU2020-07-012022-01-2132.5049.7022.950.026760560.043560461.3300×2.1650×49.70×
9MU2021-07-262023-01-2052.5076.3028.200.026591140.065778511.3300×2.7050×76.30×
10MU2022-07-252024-01-1940.0060.1525.700.024872030.033503621.3300×2.3399×60.15×
11MU2023-07-242025-01-1745.0065.4826.500.023784430.033929331.3300×2.4703×65.48×
12MU2024-07-222026-01-1680.00115.2847.550.025439440.049116431.3300×2.4241×115.28×
13MU2025-07-212027-01-1575.00113.2348.850.023626690.038497051.3300×2.3176×113.23×

§8 · What would change our mind

  1. A plausible mis-sizing that lands inside the band. The band is [1.1, 1.5] against a 1.33× target. Construct a units error that puts realized beta near 1.45 and the claim weakens from a bar like this catches the defect to a bar like this catches the defect at this magnitude. That is already all this page claims, but it would change which sentence carries it. This is the live one and it is cheap to attempt.
  2. Evidence the bar was not load-bearing — that the beta would have been inspected anyway without a pre-registered band. As stated it is unfalsifiable, and its concrete form is already conceded above: the other defect that session, which nothing caught.
  3. A defect in the reconstruction itself. The offline replay is legitimate only because contract selection is independent of position size; the control tests that empirically at entry level, 13 of 13. Show us a path that couples contract selection to position size and the re-derived rows fall — not the committed floor, which stands on git alone.
  4. The pre-registered kill, still standing. Bounty one was that the re-derived drag might miss the prereg's viable band, which would make the committed account of the incident wrong. It was run and it did not fire. It stays on the books because the reconstruction is two commands and anyone may re-run it.

§9 · What survives

The transferable part of this is not that we are careful. It is that the disqualifying diagnostic was printed next to the flattering headline, by a bar written before the code, and that anyone holding any machine's backtest can demand exactly that of whoever built it.

So the question worth carrying is the one the bar is an answer to: what number would have to be true for this result to be impossible — and did you write it down before you ran? A prior only tells you a result is surprising, and you can talk yourself out of surprised. A bar with a named diagnosis attached — outside this range means a sizing bug, halt — leaves nothing to argue about, and it costs 83 lines and one commit, before you know which way the answer will go.

And the caveat that travels with it: a bar is only as wide as the question it asks. This one caught the defect it was shaped for and was blind to another the same night. A person read a printed number and stopped the run — which is a weaker-sounding claim than an automated halt, and the only one the record supports.

§10 · Want to run a test like this yourself?

Everything we make is free — the reports, the ledgers, all of it. The only thing that costs us real money is the market data.

Where the numbers on this page came from. The option chains are from ThetaData, read through the client committed in the same commit as the engine, and the underlying equity history and dividends are a one-shot pull from Massive.com (formerly Polygon.io) taken 2026-06-22 — which is why the window above ends 2026-06-22 and not later. The 2026-08-15 reconstruction opened neither: it replayed the on-disk cache the original run had already written (128 hits, 0 misses, the network never opened), which is the only reason a run from July can be re-derived at all. The commit hashes, timestamps, line counts and both code lines come from the lab's own git history and a machine-produced diff, not from a vendor. And one input here is not a vendor feed at all, which this paragraph would otherwise hide: the interest rates are hand-written. The engine carries its own Fed funds (FFR) table inside it, 18 typed steps — the locked pre-registration calls it a “monthly Fed-funds-midpoint table hardcoded from public record” and flags its last stretch in the engine's own words, “Fed-funds midpoint step table (prereg-locked approximation; 2026-H1 assumed flat)” — with the margin loan charged FFR + 1.5% and idle cash earning FFR − 0.5%, floored at zero. That table is the FFR in the “[FFR, FFR + 4%]” band quoted in the goalposts above, and the corrected drag depends on it. So the pre-registration required the bound as well as the disclosure, and it was run: the borrowing spread would have to reach 9.02% on the index fund and 26.67% on the volatile name — against the 1.5% actually charged — before the option arm stops costing more, and moving the spread a full point either way leaves the drag between 1.23% and 1.51% on the index fund and 1.41% and 1.46% on the volatile name. The rate path is disclosed here because it is hand-made, not because the verdict turns out to rest on it. Neither vendor pays us, neither has any say in a verdict, and neither is the link below.
Buying market data? Going through here supports Ground Truth (affiliate)
The firewall: going through that link pays us a small commission at no extra cost to you. It is a way to support the channel, not a description of our pipeline — the vendors that produced our numbers are named directly above, and we would rather say so plainly than let a commission blur the two. That is the only money this channel takes. Never from anyone whose claims we test — and never for anything inside a category we review.

Get every report + the 7 Questions one-pager (free)