Build1 publisher3 min readPublished Updated
A 12-task suite leaves each holdout task worth 20 points of pass rate
Coding-agent pass rates get re-quoted after every prompt edit. A dev.to protocol freezes a seeded holdout split before any tuning, and at its minimum size the published number gets too coarse to show a 13-point gain.
The Engineer · Build desk
What happened
- A dev.to post opens on a Friday review where an agent's 71 percent follows three prompt edits made after the last failure dump, and calls the number fitted rather than measured.
- Its protocol freezes four objects once: the holdout task identifiers, the hidden tests and oracle patch for each, the metric formulas, and the agent command line that will be quoted.
- Task authoring rules require that the unfixed repo fail the hidden tests, that the oracle patch pass those same tests, and that the tests stay out of the prompt and the visible repo.
- The split script shuffles task ids with a seeded generator, commits a manifest recording the seed and both lists, and exits with "split leaked" if tune and holdout overlap.
- The tune folder stays open to prompt edits, tool swaps and added retries, but its scores may not be published and no holdout task may be added after it has been seen to fail.
Compiled by The EngineerSomething wrong?How this is made
Why it matters
- cost The bill for this discipline is the week of tuning whose scores nobody outside the team is allowed to see. The spare server only reruns the frozen pass at the end.
- exposure A five-task holdout puts the published percentage at the mercy of infrastructure: two excluded tasks and every surviving one swings the rate by 33 points.
- decision Because the quoted command line is frozen with the tasks, a team that changes retries or stop conditions has to rerun the holdout before it can change the slide.
- constraint Every holdout failure a team reads is a task it can no longer tune against, so the suite can only grow with work nobody has scored yet.
The split script in the dev.to post refuses to run on fewer than twelve task directories, exiting with "Need at least 12 tasks before a holdout is meaningful." [15]. The default holdout fraction is 0.4, and the holdout size is computed as max(5, round(len(tasks) * frac)) [16]. At the twelve-task floor that gives five holdout tasks and seven tune tasks [1]. One holdout task is then 20 percentage points of whatever rate you publish [2].
The max(5, ...) guard never fires at the default fraction, since any suite that clears the twelve-task gate already rounds to five or more [6]. It matters when someone lowers the fraction: twenty tasks at --holdout-frac 0.2 rounds to four, and the floor lifts that to five [4].
Five tasks can only produce pass rates that are multiples of 20 [7]. The scenario the post opens with is a 13-point move, 58 to 71, after three prompt edits against the same tasks [1][2][5]. A five-task holdout cannot report that move at all; the smallest change it can express is 20 points [7]. So a team that cares about single-digit deltas needs a suite well past the floor, and the post's rules make growth one-directional: you can add tasks later, but you may not add holdout tasks after you have watched them fail [8][18].
Exclusions are where the denominator moves. Timeouts, checkout errors and missing interpreters are not fails, and the post's fourth authoring rule says they leave the denominator [14]. The example meta.json sets timeout_sec to 120 [10]. An agent that runs past that budget on a holdout task therefore does not lose a point, it removes the task from the sample. Two exclusions out of five leaves three scored tasks, and each one is worth 33.3 points [3]. The same protocol demands a frozen denominator as one of its three prerequisites for calling a percentage a measurement [5]. In my view the exclusion count has to be printed beside the rate, or two numbers computed over different denominators get compared as if they were one measurement.
The fourth frozen object is the agent command line you will actually quote [6]. I would expect teams to skip that part, because it puts retries and stop conditions inside the number: prompts, tools, retries and stop conditions are all knobs on one policy, and turning them against the same tasks is ordinary overfitting [4]. Change the retry count and you have a second number on the same frozen tasks. The post's description of the alternative is one line: "The worksheet became the exam." [3]
Nothing in the protocol establishes that the holdout looks like the work your agent actually lands. It grades tasks in isolation, each one a directory with a prompt, a repo, hidden tests and an oracle patch [9], and the post argues for twenty well-formed tasks over two hundred demos [18]. For a holdout rate to transfer, those twenty would have to match the languages, repo shapes and time budgets of your production changes. Cheap inference and a spare server enter only at the end, as somewhere to rerun the frozen pass [19]. The split tool itself is presented as a proposed local script, run once with the manifest committed [20].
What to watch
- Whether any team quoting a coding-agent pass rate also publishes the seed and the committed manifest that produced its split.
- Whether agent vendors start attaching the exact command line, retries included, to the percentage on the slide.
- Whether anyone extends the task format to work that exceeds the 120-second timeout in the example meta.json.