What it saves

A drifting agent is not idle. It is working — competently, expensively — on something you did not ask for, and you are paying for every token of it.

Three levels of evidence follow, weakest to strongest. Each one says what it does not establish, because a number without its limits is the one a buyer takes apart first.

1 · run it yourself

The same agent, the same task, twice. Once unobserved; once checked. The agent loops between two readings of its job — reading the spec, writing from the spec — and never settles.

unobservedcheckedsteps246tokens57,60014,400
75% of the tokens, not spent. Named oscillating at step 6.
node scripts/demo-oscillating.mjs

It runs in a second and uses the shipped cycle detector, not a copy of it. Every step in that trace is a plausible next action at a normal distance from the goal — nothing is wrong with any single step. The sequence is wrong, which is why a step-level threshold sees nothing and laserbrain names it.

What it does not establish: that your agents loop this often. It shows the mechanism and the arithmetic, on a case constructed to contain one.

2 · your own wasted tokens

Every reading records what the step cost. For each run we find the first drifting verdict and total everything spent at or after it — tokens actually spent, on runs actually off-goal, in your own data. Not a rate, not an estimate, not a model of what your agent would otherwise have done.

Runs with no token counts are excluded rather than counted as zero, and the figure says how many runs it covers. A number that only ever errs downward looks conservative and is simply wrong.

What it does not establish: how much of that you would have wasted anyway. It measures the waste; it does not prove we prevent it.

3 · the controlled comparison

The only form of evidence that answers the previous caveat. We ran one, it is over, and it produced nothing usable. This level of the ladder is empty, and saying so is better than leaving the shape of an argument where the argument is not.

The design was sound: half of units receive a verdict, half have it withheld, assignment random, the stopping rule registered before the first unit. Three things went wrong with the run. It was pre-registered at twenty units per arm and stopped at ten blind against twenty-five sighted, so the arms are neither balanced nor the size that was declared. The units were segments of one long session rather than independent sessions — 32 of 35 assignments carry the same session id — which makes it n=1 in the dimension that mattered. And the outcome measure could not be joined back to the runs it was meant to score, so a clean split would not have produced a number either.

Status: closed, no result. Nothing above this line rests on it — levels 1 and 2 are measurements, not inferences from this arm. A replacement needs units that are whole sessions from more than one operator, and an outcome recorded at assignment time rather than reconstructed afterwards.

the number we do not lead with

Readings within a minute of you last speaking are goal-drift 0.0% of the time in our corpus; past thirty minutes, 67.9%. It is a real measurement and it is the weakest thing on this page, because the causal direction is assumed — teams that check often may simply be running better-specified tasks, and these are laserbrain’s own flags counted against its own check timing.

It is here because leaving it out would be worse. It is not the headline because it would not survive the first serious question, and a claim that collapses under questioning takes the defensible ones down with it.

Want this run against your own agents? Send us a log of the failure that annoyed you most, and we will show you where it went off-goal and what it cost after that.