A5.7.3 · dive 3/3
The failure mode
The two earlier dives showed the thesis where it pays off. This dive shows where it fails: an under-specified slice, run fast, becomes a large step in the wrong direction.
An under-specified slice hands the agent nothing to implement, so it improvises — and because the agent is fast, its speed multiplies whichever direction the gap sets. A small slip, run fast, is a large step away from done. The remedy is never to slow the agent down; it is upstream, in the spec. Toggle the figure on the right to count what an under-specified brief leaves the agent to invent.
What an under-specified brief leaves the agent to invent · toggle the brief
The precise claim
The outcome of a slice is speed × direction. The agent supplies the speed; the spec sets the direction. On a well-specified slice direction = +1, and high speed is a large step toward done. On an under-specified slice the agent invents the missing decisions, and any one wrong invention sets direction = −1 — so the same high speed is a large step away from done.
Read that carefully: speed is not the hazard, an unset direction is. A slower agent on an under-specified slice still walks the wrong way, only slower; it does not walk toward done. The remedy is to specify the slice, not to restrain the implementer. The fix lives upstream, in the brief — the same place the two earlier dives located the value.
The agent
Supplies speed — fast, tireless implementation of whatever the brief specifies. Speed has no sign of its own; it magnifies the direction it is given.
The spec
Sets direction — +1 when the slice is well-specified, −1 when an invented decision points the work the wrong way. Direction is the Operator's to fix.
This is the same lesson A1.05 drew as “correct by definition” from the other side: when the definition is incomplete, the agent completes it — and a fast completion of the wrong definition is the failure mode.
Speed multiplies direction
Hold the direction at −1 — the under-specified slice — and vary the one thing the agent controls: its speed. The outcome is speed × −1, a signed magnitude. The faster the agent, the larger the step; the sign never changes. This is why slowing the agent down does not fix the failure mode: it shrinks the magnitude of a step that still points the wrong way. Only changing the sign — by specifying the slice — turns the speed back into progress.
Drag the speed below, from low to high, over the under-specified slice. The magnitude of the wrong step grows with the agent's speed; the direction stays negative until the spec changes it.
Outcome = speed × direction, with direction = −1 · drag the agent's speed
Slowing the agent shrinks a wrong step; specifying the slice is the only move that changes its sign.
On the Portal — the f6.1.llms.md risk register
The Portal's web-bootstrap brief, f6.1.llms.md, is a slice specified down to
F6.1-R1–R8, the T1–T7
task DAG, and per-story Acceptance gates. Its risk register names exactly the two hazards an under-specified
or unverified slice produces — and closes each one upstream, in the brief and in the review, never by
slowing the build.
RK-1 — the opened-gap. Leave the supervision tree's child list open and an agent
assembling a “three-child” tree can omit the one child every render depends on. The register
states it plainly: the tree omits Portal.Store — dropping the Store
courses_of/1 reads, every course render is a dead-process crash, not a 404. The
brief closes it by pinning the tree: Portal.Application keeps exactly
[Portal.Store, Portal.EventStore.adapter(), {Portal.Engine, []}], and the Apollo
gate makes a real Portal.courses_of/1 render, not merely a boot. The boundary RK-1
protects is the one the companion course draws at the facade
boundary — the web touches only the Portal facade, so the Store must be
present for the facade to read.
RK-3 — loss of independent verification. The register calls it the solo-topology hazard: the same context that builds also judges. When the context that builds the slice is the same one that reviews it, a fast build is graded by the same fast assumptions that produced it. The brief closes it by restoring an independent evaluator — a different context than the builder adversarially verifies and mutation-probes the work.
# f6.1.llms.md — the risk register: what an under-specified or unverified slice produces # # RK-1 The opened-gap: the tree omits Portal.Store. # Dropping the Store courses_of/1 reads → every course render is a dead-process crash, not a 404. fix: Portal.Application keeps exactly [Portal.Store, Portal.EventStore.adapter(), {Portal.Engine, []}] # pin the tree gate: a real Portal.courses_of/1 render, not merely a boot # # RK-3 Loss of independent verification (the same context that builds also judges). fix: an independent evaluator — a different context than the builder verifies and mutation-probes
The principle
The failure mode is an under-specified slice: the agent improvises, and its speed multiplies the wrong direction. The fix is upstream, in the spec and the review — not in the agent.
On the Portal
f6.1.llms.md's RK-1 (omit Portal.Store and every render
crashes) and RK-3 (the builder also judges) are the under-specified and unverified hazards the brief
closes — by pinning the tree and restoring a separate evaluator.
When an agent goes wrong fast, the cause is almost always a slice that was not specified — fix the brief, not the agent.
Recap — fix the brief, not the agent
The thesis fails on an under-specified slice. The agent has nothing to implement, so it invents the missing
decisions; because it is fast, its speed multiplies whichever direction those inventions set, and a small
slip becomes a large step away from done. Neither f6.1.llms.md's RK-1 nor RK-3 is
fixed by a slower agent — both are fixed upstream, by pinning the slice in the brief and by restoring
an independent review. This closes A5.7: the value is real on a well-specified, gated slice, and the failure
mode is the absence of that specification.
Back to the hub: A5.7 · Pragmatic Programming with Claude Agents — the thesis, with the pairing, the value, and the failure mode in one place.
References
Primary sources for design by contract, for why an open-ended goal is where an agent improvises, and for small specified steps as the guard against fast error — with the hub, the prior dive, and the companion chapter whose risk register this grounds on.
Sources
- Hunt, A. & Thomas, D. — The Pragmatic Programmer — design by contract: every decision the builder must not be left to invent.
- Anthropic — Building effective agents — why an open-ended goal, not an explicit task, is where an agent improvises.
- Beck, K. — Extreme Programming Explained — fast feedback and small, specified steps as the guard against fast error.
Related in this course
- A5.7 · Pragmatic Programming with Claude Agents — the module hub.
- A5.7.2 · Where the value is real — the prior dive, the value side.
- A5 · Why a brief layer — the four how-to-build decisions a brief fixes.
- Companion · The facade boundary — the boundary RK-1 protects.
- Companion · Phoenix (F6) — the chapter whose
f6.1.llms.mdthis grounds on.