Where tonight sits
Eight sessions have gone after other people's numbers: the split, the shortcut, the seeds, the stress test, the selection, the test-set size, the benchmark, the leak. Tonight the target is your own. The bench in session 3 nearly shipped a finding that was not there, it was caught by an extra run rather than by any review step, and the whole episode is the shortest available demonstration of what the earlier sessions have been arguing.
★ What you walk out with tonight. The five-draw table of the underspecification bench and the ability to say exactly which row of it is a finding and which is a coincidence. A procedure for testing your own claim before anybody else sees it: re-run across draws, report the range instead of the point, and put the draw count next to the number. And a way to write up a result whose headline has died without pretending it never existed.
LiveWhat actually happened4 min▶
The bench trains twenty models on one data draw. The only difference between them is the random seed, which sets the initial weights and the order examples arrive in. Each model is scored twice: on 2,000 held-out patients from the collection year, and on 2,000 patients from the deployment year after the wards were reorganised. Twenty pairs of numbers, one correlation.
On the first draw that correlation was -0.89. Read plainly, it says the models that look best where you measured are the models that do worst where you did not, which would make held-out ranking actively misleading and would be the single most useful thing the bench could produce. The number was real, the code was right, and the finding was wrong.
Draw 2 came back at +0.03 and could have been read as noise around a mostly negative effect. Draw 3 came back at -0.87, which looked like confirmation. Draw 4 came back at +0.09. Four draws in, the sign had crossed zero twice and the claim had no support left. The cost of finding that out was three extra runs of a bench that takes minutes.
Self-studyDraw, seed, split: what varies and what does not3 min▶
- A seed. Initial weights and example order. Twenty seeds inside one draw give twenty models on identical data.
- A data draw. A fresh sample of the Thornbury world: 4,000 training patients, 2,000 held out, 2,000 shifted. The relationships in the generator do not change, only the sample does.
- What the correlation is computed over. The twenty models inside one draw. It is a statistic of twenty points, and it is reported as though it were a property of the pipeline.
- What stayed fixed across all five draws. The architecture of 3 inputs, 12 tanh hidden units and 1 logit, the training schedule, and the generator itself.
- The thing that was never varied in the first run. The data draw. The finding was a statement about the pipeline, computed on one sample, and nobody noticed the gap until a second sample existed.
Five draws, side by side
12 min livePut the draws in one table and the two kinds of result separate themselves immediately. One column never changes its story. One column cannot keep its sign. Neither is visible from a single run, which is the only view most findings ever get.
LiveWhy the sign moves4 min▶
The correlation is computed over twenty points, and the spread it is computed across is tiny: on draw 4 the twenty models sit inside a held-out spread of 0.003. Correlating a set of near-identical numbers against anything is a fragile operation, because the ordering of those numbers is close to arbitrary. The bench is not measuring a relationship between two quantities so much as reporting how twenty almost-tied models happened to line up in one sample.
That is why the ratio behaves differently. The ratio compares two spreads, which are aggregate quantities, and it is asking a question with a large effect behind it: models that agree to within thousandths where they were measured disagree by hundredths where they were not. Large effects on aggregate quantities survive resampling. Orderings among near-ties do not.
Self-studyTwo readings of an unstable sign4 min▶
Reading one: there is nothing there. Held-out accuracy carries essentially no information about shifted accuracy, in either direction. The five values are scatter around no relationship, and the two strongly negative draws are what scatter looks like when you only run it twice.
Reading two: the estimate is underpowered. Twenty models per draw is a small sample for a correlation, so a weak true relationship could be present and invisible at this size. On this reading the bench has not shown there is nothing there; it has shown it cannot see.
The bench as it stands cannot separate these, and pretending otherwise would be the same error at a different level. What matters is that both readings forbid the original claim: neither one licenses "the best model on held-out data is the worst under shift". The way to separate them is more models per draw and more draws, which is a decision about what the answer is worth rather than a technical difficulty.
A single-draw finding is a hypothesis
8 min liveThe run that produced -0.89 was not sloppy. It was a correctly computed statistic on correctly generated data, and everything about it looked like a result. The only thing missing was a second sample, and a second sample is the cheapest object in the entire pipeline.
LiveWhat to do when the headline dies4 min▶
The instinct is to delete the dead claim and publish the survivor as though it had always been the point. That loses the most transferable thing in the episode. The write-up that helps a reader is the one that keeps the robust claim and reports the dead one next to it: here is what held in five draws out of five, here is what looked stronger on one draw and did not survive, and here is the number that killed it.
Reporting the death costs one sentence and buys two things. A reader who half-remembers the dramatic version from somewhere else is told directly that it did not replicate, and the next person to run this bench and see -0.89 on their first draw knows what they are looking at. Both of those are worth more than the appearance of having been right the first time.
The surviving claim: across five data draws, the shifted spread was wider than the held-out spread every time, by 2.7 to 11.3 times, with mean held-out accuracy 0.949 and mean shifted accuracy 0.765. The reported death: the correlation between held-out and shifted accuracy ran from -0.89 to +0.09 across the same five draws, so the stronger claim that held-out ranking inverts under shift is not supported.
Self-studyThe near-miss was caught by luck, not by process3 min▶
Nothing in a normal review would have found this. The code was correct, the statistic was the right one, the data generator was documented, and a reader checking the arithmetic would have confirmed -0.89. Code review, a second pair of eyes and a reproducibility check all pass on a result computed from a single sample, because all three verify that the number is what the run produced.
The only thing that catches it is resampling, and resampling has to be a standing habit rather than a response to suspicion, because suspicion attaches to results that look wrong. This one looked right.
A dramatic result deserves more draws than a boring one
6 min liveEffort spent on replication is usually distributed by how suspicious a result looks. It should be distributed by how much the result would change what somebody does, which is close to the opposite rule in practice.
LiveFive draws is a floor, not a ritual3 min▶
Five is enough to see a sign change and not enough to estimate anything precisely. It earns its place as a floor because it is cheap for a bench that runs in minutes, and because a claim that cannot survive five samples of its own data was never going to survive somebody else's. For a finding that would change a deployment decision, five is the point at which you start looking for a way to break it, not the point at which you stop.
The number also has to be reported. A range from five draws and the same range from fifty mean different things, and a reader cannot tell them apart unless the count is written next to the finding.
Try to kill your own claim
16 min build-alongBring a finding your team produced in the last quarter: a lift, a comparison, an ablation, a correlation, anything somebody quoted. The exercise is to work out what you held fixed by accident, and what the claim would look like written honestly if you had varied it.
Write the claim as one sentence with a number in it. If it takes three sentences, there is more than one claim and they will need to be killed separately. Underline the number that would have to move for the sentence to be wrong.
List everything that was fixed when that number was produced. The data sample, the seed, the split, the date window, the cohort filter, the library version, the machine. Most of these were never chosen; they were whatever was there.
Circle the one you have no reason to trust. Usually the sample or the window. That is the thing to vary, and the question to ask is not whether it matters but how much the answer moves when it changes.
Re-run five times, varying only that. Keep every run, including the ones that agree. If five is genuinely unaffordable, run two, and write down that you ran two rather than reporting the first as though it were the finding.
Check the sign before the size. A claim whose direction flips across runs is finished and no amount of averaging rescues it. A claim whose direction holds while its size moves is alive and needs a range.
Rewrite the sentence as a range with its draw count. "Between X and Y across five runs" is publishable. "X" is a number somebody got once, and a reader cannot tell which one they are being handed.
If the headline died, write both. Keep the claim that survived, report the one that did not and the run that ended it. The reader who most needs that sentence is the one about to reproduce your first run.
The cheapest version, for a pipeline that takes hours instead of minutes. Two extra runs on two different date windows will catch a sign flip, which is the failure that matters most and the one that survives review most easily. Do it before the finding reaches a slide, because a claim is much harder to withdraw after somebody has repeated it to their own stakeholders.
Three questions
Your first run of the bench returns a correlation of -0.89 between held-out and shifted accuracy. What do you have?
The number was correct and the code was right. What was missing was a second sample: the statistic describes how twenty near-tied models happened to line up in one draw, and draws 2 and 4 both came back positive. Strength is not stability, and only resampling can tell the two apart.
Across the five draws, which result can be written down as a finding?
The ratio holds in every draw and compares two aggregate quantities, so it survives resampling. Averaging the five correlations hides that their sign moves, and a relationship between spread and ratio built from one extreme draw is the same single-draw mistake in a new place.
A dramatic result and a boring result both come out of the same afternoon's work. How should replication effort be split?
The cost of being wrong scales with how much the finding would change behaviour, and the dramatic result is the one that travels before anybody checks it. Equal effort sounds even-handed and spends the same budget on a claim nobody will act on as on one that reverses the advice.
Before session 10
40 minTake the most quoted number your team produced this quarter and re-run whatever produced it on a different sample: another date window, another cohort, another random split. One extra run is enough to learn something. Write the result as a range with the run count next to it, and if the direction moved, write the sentence that says so. Bring both versions of the sentence to session 10, where the falsifier gets written before the bench runs rather than after.