Build1 publisher3 min readPublished
Writing the task text before the research encodes a guess
Anton Brilliantov spent eight parts specifying agent handoffs down to a single acceptance command. His ninth names the task shapes where those facts are still unknown, and the reading that has to happen first.
The Engineer · Build desk

What happened
- Anton Brilliantov, a backend engineer splitting a live PHP monolith into Go services, followed eight parts on handing work to agents with the places he stopped using his own method.
- The method rests on one assumption: paths, full type signatures, names of primitives to reuse, values and one acceptance command that needs no substitution are all known before the task text is written.
- The second is the codebase nobody on the team has read, where the lead has to do the reconnaissance because iterations are barred from searching the tree.
- In one early set, before the closed file list and the facts section existed, iterations burned roughly 350,000 tokens each while the executor assembled its own context.
Compiled by The EngineerSomething wrong?How this is made
Why it matters
- constraint Extra executors cannot shorten a serial prefix. On an unfamiliar tree the schedule is set by how fast one person reads.
- cost The context-assembly bill is charged per iteration and again on every executor. The saving from writing the facts section grows with the size of the set, and it lands with whoever pays for the tokens.
- decision Work has to be classified before anything is written, because an activity whose output is a decision cannot be handed out as a task whose output is a diff.
- exposure A task built on a wrong premise passes every gate the method has. The discard arrives a day after the green tests, and it falls on the person who wrote the guess.
The closed file list is where the assumption shows. An executor may read at most three named files and may not search the tree, and Brilliantov's justification is that it has nothing to look for: everything the iteration needs is already in the task text [5]. Take the facts out and the permission model inverts. The executor has to go find things, which he describes as "the single most expensive thing it can do", and that cost is paid again on every executor, every time [6].
A task with gaps has a fix, which is to go and get the facts [8]. The first failing shape is the one where the deliverable itself is unknown: which of three designs survives contact with the data, or whether the thing is possible on this schema at all [8]. "A specification is a description of a decision, and the decision hasn't been made," he wrote [9].
Write the text anyway and there are two outcomes, and he has had both. Vague enough to be writable, as in "handle the edge cases appropriately", is a hole the executor falls into. Precise enough to be executable encodes a guess, and when the guess is wrong he does not edit the task, he throws it away and writes it again from scratch [10][11]. That second outcome is worse because it looks like progress: code comes back, tests are green, and the whole thing is discarded a day later because the premise was wrong [12].
His ordering rule is firm. Research first, then the task text, because research is a different activity and its output is a decision, while a task's output is a diff; once the decision exists the facts exist and the method applies normally [13].
The second shape puts the expensive work on the one resource that cannot be duplicated. The facts-of-the-set section is exact package paths, full signatures of every type the iteration plugs into, names of the existing generics that must be reused, and values spelled out as values [15]. On a codebase he knows, writing it is transcription [16]. On one he does not know, reading is its only source, and the lead does the reading: reconnaissance across the tree is allowed there and nowhere else, least of all inside an iteration [17].
"I can run two executors on the main work and one on fixes. I cannot run two of me," he wrote [18]. On an unfamiliar tree, that reading is most of the elapsed time and the code that follows is the short part [19].
Five iterations at roughly 350,000 tokens each is about 1.75 million [24], and he says the number recurs per iteration [21]. For it to transfer to another repo you would need a similar amount of local convention the executor has to infer, and the same freedom to walk neighbouring packages looking for it. It is one engineer's measurement on one PHP monolith being carved into Go services [1].
The piece is summarised as "Three kinds of tasks the method does not cover, and the price of splitting" [22]. Two are set out in the text: the unknown deliverable and the unread tree [25]. The third is not, and neither is the price of splitting. On the line itself he is direct: "Maybe you draw the line somewhere else. That's the more interesting conversation, so I'd rather publish my line than pretend there isn't one," he wrote [23].
What to watch
- The next instalment, which would name the third task type and the price of splitting that the summary line promises.
- An after number to sit beside the 350,000 tokens per iteration: the piece gives the cost before the closed file list and facts section existed, and no measurement after.
- Readers taking up the invitation and publishing a different line, including cases where a fully specified handoff did survive exploratory work.