Next Steps
Module 04 · Specification and Design /Lesson 4.1 /6 min

The specification is the product

Once generation is cheap, the scarce artefact is a precise statement of what to generate. That is now most of the job.

There is an uncomfortable implication in everything this course has covered. If an agent can implement a well-specified change faster than you can type it, then the thing you are actually producing is the specification. The code is downstream.

Most engineers have never had to write one precisely, because they were the implementer and the ambiguity got resolved silently, in their head, at the keyboard. Delegating removes that step. Every ambiguity you leave is now resolved by something that will pick a reasonable reading and never mention it.

What a specification actually is

Not a document template. Four things, and a spec is complete when all four are answerable:

  1. What changes for the user or the caller. Observable behaviour, not implementation.
  2. What must stay true. Invariants, compatibility, performance, anything with consumers.
  3. What is out of scope. Named, specifically, including the adjacent things that look broken.
  4. How you will know it worked. Checkable statements, ideally commands.

Notice that three of the four are constraints. A specification is mostly a description of the space the solution must stay inside, not a description of the solution.

The economics changed

BeforeNow
Cost of implementingDaysMinutes to hours
Cost of implementing the wrong thingDays, felt immediatelyMinutes — so it happens more, and is noticed later
Cost of a precise specHours, often skippedHours, and now the bottleneck
Who resolves ambiguityThe implementer, consciouslyThe agent, silently

The last row is the whole change. An engineer who hits an ambiguity stops and asks, or at least remembers they guessed. An agent picks a reading, commits to it, and writes code that looks like it was always the plan.

The test for a finished spec

Hand it to a fresh agent and ask, before any implementation:

prompt
Read this spec. Do not implement anything.

List every decision you would have to make that the spec does not settle.
For each, give the reading you would take by default and one other
defensible reading. Do not be charitable - if a sentence admits two
readings, say so.

Every item it returns is a hole. The first time you run this on a spec you were happy with, you will typically get six to ten, and two of them will be load-bearing.

How precise is precise enough

Not infinitely. Over-specification is its own failure: a spec that dictates implementation fights reality by the third session and removes the agent's ability to solve the problem in a way you had not thought of.

The line is: specify the boundaries, not the interior. Interfaces, invariants, what to reuse, what not to touch, how it will be verified. Leave the inside alone. If you find yourself writing "use a hash map here", you have crossed it.

The failure this prevents

Every unattended run that comes back wrong traces, almost without exception, to a sentence you did not write. Not a model failure, not a capability gap — a missing line. That is a frustrating diagnosis the first time and a useful one afterwards, because a missing line is fixable and a model limitation is not.

Module 09 quantifies this: in the teams that track it, the great majority of failed autonomous runs are specification defects. The rest of this module is about writing the missing lines before the run rather than after.

Exercise

Take a ticket you would happily hand to a colleague today. Run the ambiguity probe on it in a fresh session, without defending it.

Count the holes. Then answer each one in the spec, re-run the probe, and count again. Repeat until the probe returns nothing load-bearing. Note how many rounds it took.

Worked solution

The ticket, which looked complete: "Add CSV export to the orders page. Admins only. Should include the same columns the table shows."

round 1 - the probe found 9
1. Exports the current filtered view, or all orders? Default: filtered.
2. All pages, or the current page? Default: all pages of the filter.
3. Any row limit? Default: none, which will time out somewhere.
4. Synchronous download, or generated and emailed? Default: synchronous.
5. "Same columns as the table" - the rendered values or the raw ones?
   Default: rendered, so 'EUR 1.234,56' not 1234.56.
6. Which date format, and which timezone? Default: the account's.
7. Is 'admin' the role flag or the permission? We have both. Default: role.
8. Does exporting get audit-logged? Default: no.
9. Delimiter and encoding? Default: comma, UTF-8 without BOM - which
   Excel will render wrongly for this customer base.

Four of those were load-bearing. Number 3 would have shipped something that fell over on the largest account. Number 5 would have produced a file nobody could sum in a spreadsheet. Number 8 mattered because exports of customer data are in scope for our audit log and nobody thought to say so. Number 9 would have generated a support ticket within a day.

round 2 - after answering, the probe found 3
1. If the filter matches more than the limit, error or truncate?
2. Is the audit log entry written before or after the export succeeds?
3. Does the admin see their own deleted-account orders in the export?

All three real, none load-bearing — but the first changed the spec again. After round 3 the probe returned only stylistic questions, and the spec had gone from three sentences to about twenty-five lines.

Total time: 25 minutes, across three rounds. The implementation session that followed took six turns and needed no corrections. The honest comparison is not "25 minutes of spec versus zero" — it is 25 minutes against the afternoon that number 3 and number 5 would have cost after they shipped.

Takeaways

  • A specification is mostly constraints: what must stay true, what is out of scope, how it is verified.
  • Agents resolve ambiguity silently and confidently; engineers at least remember they guessed.
  • Probe a spec with a fresh agent before implementing — expect six to ten holes the first time.
  • Specify the boundaries, not the interior. "Use a hash map here" is over-specification.

Check yourself

Why does cheap implementation make specification harder rather than less important?

A course by