Research record

Fourteen Copies of One Definition

Ongoing research. This is an experimental result from active work, not a settled conclusion. The numbers are what we measured and the method is described so you can judge it, but the programme is still running and later experiments may revise what it means. More about this programme.

Part of a bigger question: How do we know our own results are real? – Repeatedly, the control rather than the measurement decided the result -- and several striking findings dissolved when the right comparison was finally run.

In plain English

What we asked. The models we study improve suddenly rather than gradually, and a great deal of this project depends on pinning down exactly when that happens. Three of our results were damaged in a single day by the way we measure it: the usual method compares a run against its own best and worst scores, so the answer can shift as the run continues. That raised an obvious question nobody had asked - how many of our ninety published results rest on a measurement like that?

What we found. Looking for it turned up something we did not expect. Our code contains fourteen separate implementations of the same measurement, copied across forty-one experiments, differing in small ways that nobody ever decided on. So we ran all fourteen against each other on 1,091 saved training runs, then ran them again with the last fifth of each run thrown away. If a measurement really describes a moment, it should not care what happened afterwards.

Why it matters. The good news is that they hold up. None of the fourteen shifted by more than a single measurement interval, and on runs that had finished improving they barely shifted at all. The shifting is real, small, and happens only on runs still getting better when we stopped looking - which is exactly the situation the three damaged results were measured in. One definition never shifts at all, on any run: the one that compares against a standard fixed by the task in advance rather than against the run itself. That is the version worth copying. There is a second finding hiding underneath: where the fourteen place the moment barely differs, but which runs they are willing to measure at all differs a lot - some accept runs the others refuse. Disagreeing about what counts turned out to be a bigger effect than disagreeing about when. And the fourteen copies are themselves the real defect: two experiments making the same claim did not necessarily use the same measurement. The audit now refuses to run if a fifteenth copy appears.

The rest of this page is the technical record: the design, every number, and the limits. It is written for a reviewer, and you do not need it to have understood the result above.

New here? How to read a research record
  • Start at the verdict. Every record states, before the experiment was run, what result would have made us abandon the idea. That is the "kill test". Then it says whether the test fired. Nothing gets reinterpreted after the fact.
  • Numbers in square brackets are uncertainty. 23.4 [18.1, 28.7] means our best estimate is 23.4 and the true value is probably somewhere in that range. If a range includes zero, we cannot claim an effect.
  • Negative results are kept. Roughly half of what is published here says an idea did not work, including several of our own. Those pages are not failures, they are the output. Work that only publishes what worked is not measuring anything.
  • Read the Limits section. Every record ends with what it does not show. It is the most honest part of any experiment and usually the shortest.
  • Pro tip: the figures near the top are designed to carry the result on their own. If you read nothing else, read the caption under each one, which says what it shows and what to take from it.
EXPLORATORY. Not a preregistered study. No training at all. It reads committed pilot output and committed pilot source. Runs in seconds on a laptop CPU, no GPU, no cost.

Program v2 Bucket Q, item Q2. Decisive computation: analysis/endpoint_audit.py. Output: analysis/endpoint_audit.json. Reproduce with python analysis/endpoint_audit.py.

The question

Three published results were damaged in a single day by an endpoint defined relative to its own run. O7's trend gate moved from 1.49 to 0.71 on identical runs of different lengths. L7's floor-to-ceiling midpoint chased a still-climbing ceiling and returned an interval too wide to tell "absent" from "present". N15 found N6's exponents inflated by their threshold.

A moving finish line only moves while the model is still improving
A moving finish line only moves while the model is still improving. Models here improve suddenly, and much of this project depends on pinning down when. The usual way to do that compares a run against its own best and worst scores, which means the answer can change as the run continues. Grey and orange show that method; blue shows the alternative, which compares against a standard fixed by the task in advance. Each bar is how much the answer moved when we threw away the last fifth of the same runs. The drift is real but small, and it happens only on runs that had not finished improving. On runs that had settled, the answer barely moves at all. On runs still improving, it moves by one measurement interval, which is the least we can detect. The method that compares against a fixed standard does not move at all, on any run. The practical rule: check whether the run had settled before trusting a timing measured against the run itself, or use a fixed standard and skip the question.

Nobody had asked how many of the ninety published records use such an endpoint.

The answer turned out to be a different and worse-shaped question than the one asked. Searching analysis/ for the functions that decide when the transition happened finds fourteen distinct implementations of the same idea, copied across forty-one pilots, differing along four axes that nobody ever chose:

AxisVariants in the archive
floorthe run's min, or the mean of its first three readings
ceilingthe run's max, or the mean of its last three readings
eligibility gatenone, 0.15, or 0.30
resolutionfirst reading at or above the level, or linear interpolation between readings

Plus one outlier: L7's transition_at_criterion, the only one whose level is a property of the task rather than of the run, built on E1's published plateau and chance floor.

Kill test, fixed before execution: at most one of the fourteen shows a median absolute shift larger than one evaluation interval under a 20% truncation. Then the three known cases were unlucky rather than symptomatic.

Design

Every definition is called: the committed original, imported and executed, not a reimplementation, on the same corpus: 1,091 committed per-step held-out accuracy series drawn from 29 pilot outputs. Then each is called again on the same series truncated, keeping only runs whose full-length answer sits in the retained window's first 60%. A definition that describes an event should not care that the run continued afterwards.

A precondition enforced in code, not in prose. The census hashes each function's AST body, docstrings excluded, and compares it against a registered table of fourteen. A fifteenth definition, or an edit to one of the fourteen, fails the audit with exit 2 rather than being silently averaged in. Rewording a docstring does not fail it; changing an arithmetic step does.

Settledness is judged on the truncated window, using N6's own gate, the mean of the last three readings against the mean three readings 16% of the run earlier, unsettled above N6's CLIMB_TOLERANCE, which is imported rather than retyped. The truncated window is what an experimenter can actually inspect at the moment they stop a run.

What we found: the kill test fires

Zero of the fourteen move by more than one evaluation interval at the median when a fifth of the tail is removed.

DefinitionAdmitsMedian answerSettled runsStill-climbing runs
built_in_algorithm and five others (step to the level)1,012105.00.05.0
direction_anatomy and three others (interpolate)1,012101.10.22.5
algorithm_agreement (no eligibility gate)1,091105.00.05.0
corruption_dose (gate 0.15, interpolates)1,052101.30.22.5
critical_period_task (task criterion)1,011105.00.00.0

Median absolute shift in steps under a 20% truncation. 5.0 is exactly one evaluation interval, the smallest shift this corpus can resolve.

The sensitivity is real, small, and entirely confined to unsettled runs. On the 671 runs that had settled, the worst definition moves 0.2 steps. On the 420 still climbing, the stepping definitions move one evaluation interval and the interpolating ones half of it, with a p90 near 16 steps and a maximum of 40. That is the mechanism the three damaged records met, sized: it is not large, and it is not zero, and it only exists where the ceiling is still moving.

One definition is exactly insensitive. L7's transition_at_criterion shifts 0.0 on every run in the corpus, settled or not, at both truncations. It is the only one whose level does not depend on the run, which is precisely why L7 introduced it, and this is the first measurement of how much that buys.

The finding that was not in the plan: the gates disagree more than the timings

On the same series the fourteen definitions disagree by a median of 4.0 steps, 0.5% of the run. That is reassuring and it is not the whole story:

  • the mean disagreement is 28 steps, the p90 is 19, and the maximum is 1,248;
  • 65 of 1,091 runs have the fourteen disagreeing by more than a tenth of the run;
  • all fourteen admit 999 of 1,091 runs, so 92 runs get a transition from some definitions and are refused by others.

Which runs enter the average is a larger effect than where the transition is placed. The ungated algorithm_agreement variant admits every run in the corpus; the 0.30-gated variants admit 1,012; L7's criterion admits 1,011. On a flat or barely-moving curve an ungated floor-to-ceiling midpoint returns a confident number, the trap N8 documented, and half these definitions return it while the other half return None.

What to take from this

  • The transition-timing family is sound. The three corrections were three unlucky records, not the visible part of a systemic flaw, and this is the first evidence for that either way.
  • The rule is conditional, and the condition is checkable. A run-relative midpoint is safe on a settled run and drifts by up to 40 steps on one that is still climbing. Report settledness beside any timing endpoint, using N6's gate, which costs nothing.
  • A task-anchored criterion costs nothing and is exactly stable. L7 built it to escape one specific problem; it is the better default for everything.
  • Fourteen copies is the actual defect. No two pilots that share a claim necessarily share a definition, and the differences were never decided: they accumulated. The registry in this audit now fails if a fifteenth appears, which is the cheapest available fix short of consolidating them.

Limits

  • This audits one endpoint family, the timing of the transition. Sharpness, lead, and the fraction-of-run endpoints are separate and three distinct sharpness bodies exist unaudited.
  • Truncation is not the only way a run can be too short. It removes the tail from a completed run; it does not reproduce a run that was configured shorter and therefore trained under a different schedule. N5's failure was the second kind.
  • The corpus is what pilots happened to save. 1,091 series is large but it over-weights the pilots that saved per-step arrays, which are the more recent ones.
  • The 0.0 for the task criterion is partly structural: an absolute level cannot move when the tail is cut, so the measurement confirms an argument rather than discovering a fact. What it adds is the size of the alternative, the other thirteen were not obviously going to come in at one evaluation interval rather than at forty.
  • Every number here is a median over the corpus. A single record's endpoint can sit in the tail; 65 runs do.

Terms on this page

Every piece of vocabulary this record uses, in plain language. Generated from the text above, so it cannot drift out of step with it.

accuracy
The fraction of answers a model gets right on questions it was not trained on.
eligibility gate
A rule that excludes a run from a measurement, usually because it did not improve enough for the measurement to mean anything. It is a decision about which runs are in your average, not just a safety check.
evaluation interval
The gap between successive checks of a model during training. It is the smallest difference in timing a measurement can resolve, so two results closer together than one interval cannot be told apart.
exponent
The number in a power law that says how strongly one quantity responds to another. A bigger exponent means a steeper response to the same doubling.
gated
A design where the model has explicit internal switches deciding what to remember and what to discard at each step. GRUs and LSTMs are gated; plain recurrent networks are not.
held-out
Data the model was never trained on, kept back specifically to test it. Scoring a model on data it has already seen measures memorisation, not learning.
interpolation
Estimating a value between two measured points by drawing a straight line between them. It gives a finer answer than the measurements themselves, at the cost of assuming what happened in between.
kill test
A condition written down before running the experiment that says what result would make us abandon the idea. Fixing it in advance is what stops a disappointing result being reinterpreted as an encouraging one.
plateau
A stretch of training where the model is not visibly improving. Often, though not always, followed by a sudden jump.
settled
A run has settled when it has stopped improving. Measurements anchored to a run's own best score are unreliable until it has, because that best score is still moving.
sharpness
How abrupt a model's improvement is. We measure the biggest change over any short stretch of training as a share of the run's total change, scaled so that a model improving at a perfectly steady rate would score 1. A score of 20 means the fastest stretch was twenty times steeper than a straight line.
truncation
Cutting a record short. Here it means discarding the last part of a finished training run and recomputing a measurement as if the run had stopped earlier, to see whether the answer depends on how long the run went on.

Want this measured on your data?

We build private models our clients own and run on their own infrastructure, and every engagement proves measured lift on the client's own tasks before we call it done. Start free with a readiness scorecard that tells you whether your data can support it, or book a short call.