A4.7 · Workshop · dive 3
The closed spec
A spec is acceptable not when its author declares it done, but when it closes: every deliverable maps to a story, and the chain holds over the text.
The workshop's last move checks that closure on the produced Coverage line for F5.1 — Portal's engine-facade rung (the engine chapter's first rung, the seed of the F6 master invariant) against the real one. Match and complete, the spec is acceptable — the engine rung is ready for an Author. A missing story, and the readout names the gap. This is correct by definition, made operational on a real rung. Check the coverage on the right.
Check the coverage · drop a story to break it
f5.1.stories.md. The engine rung is ready for an Author.Closure is a rule, not a claim
The real f5.1.stories.md ends with one line, verbatim:
Coverage: D1→US1 · D2→US2 · D3→US1 · D4→US1,US3
· D5→US1,US4 · D6→US3,US5 · D7→US4. Every deliverable D1 through
D7 appears on the left of an arrow, so every deliverable is realized by at least one story. That is the
closure condition: a spec is acceptable only when no deliverable is left without a covering story.
The hero figure runs that check. With all seven covered, the spec is closed. Drop one deliverable's story
— simulate an incomplete .stories.md — and the readout names the
uncovered deliverable: the spec is not closed, and the rung is not done. Completion is decided by the rule
over the text, not by a claim that the work is finished.
This is the closure A1.05 named, made operational. “Done” is not an opinion — it is a property of the text: every deliverable mapped, every story accepted, no gate merely asserted.
Matching ground truth
Completeness is one half of closure; fidelity is the other. The workshop's output is
acceptable only when it reproduces the real f5.1.stories.md — not merely a
plausible-looking Coverage line. The second figure checks that. Switch between a faithful reproduction and a
drifted one, where a single arrow is altered (D6 mapped to US3 only, dropping US5). The readout reports a
match against ground truth, or names the divergence.
The two figures teach different moves. The hero tests whether every deliverable is covered — completeness. This one tests whether the produced line is the real line — fidelity. A spec passes only on both: covered everywhere, and true to the artifact it reproduces.
Produced vs real · switch the view
f5.1.stories.md line for line. Every arrow agrees; the produced spec is acceptable.
Coverage is complete and true to ground truth.A produced spec is acceptable on both counts: every deliverable covered, and the Coverage line
true to the real f5.1.stories.md.
The closed spec on the Portal
On the Portal — the learning platform this course builds — the workshop's output is the real
f5.1.md and f5.1.stories.md, and its Coverage line closes:
every deliverable D1 through D7 maps to at least one story. So the engine chapter's first rung is acceptable
as written — the contract an Author builds against in Part V, and an Operator accepts by proof.
The completion rule is the same one specs.approach.md states for every rung: done
only when every deliverable maps to a story, every story's acceptance passes, every requirement is satisfied,
and every invariant holds under test. “Correct by definition” is exactly this closure —
there is no behaviour in the increment that is not pinned by a check or an invariant.
# f5.1.stories.md — the Coverage line, verbatim — every deliverable mapped: Coverage: D1→US1 · D2→US2 · D3→US1 · D4→US1,US3 · D5→US1,US4 · D6→US3,US5 · D7→US4. # The completion rule (from specs.approach.md), verbatim: # A rung is done only when every deliverable maps to a user story, every # story's acceptance passes, every requirement is satisfied, and every # invariant holds under test. "Correct by definition" means exactly this closure.
A spec closes by a rule over its text: every deliverable maps to a story, the chain holds, no gate is merely asserted. Completion is a closure, not a claim.
The produced Coverage line reproduces the real f5.1.stories.md
(D1→US1 · D2→US2 · …); all seven deliverables are
covered, so F5.1 is acceptable as written.
The workshop ends when the chain closes and matches ground truth — the engine chapter's first rung, correct by definition.
Recap — the workshop closes
A spec is acceptable when it closes on two counts: every deliverable maps to a covering story
(completeness), and the produced Coverage line reproduces the real f5.1.stories.md
(fidelity). The workshop's last move checks both on the F5.1 rung — and both hold, so the engine
chapter's first spec is closed and acceptable, the contract Part V hands an Author. That closes A4: from
examples-as-specification to a worked, closed spec of the Portal's engine, each technique landed on a real
rung triad.
A4.7.3 closes the workshop and the chapter. Return to the A4.7 module hub to revisit the sequence, or to A4 · The spec layer for the chapter navigation. Part V then briefs an Author and builds the rung this spec defines.
References
Primary sources for completion as a closure over the text, and where this dive connects in the course.
Sources
- Adzic, G. — Specification by Example — a living specification whose coverage is checked, not asserted.
- Humble & Farley — Continuous Delivery — done means proven by a check that runs, not a claim that the work is finished.
- Cohn, M. — User Stories Applied — the acceptance that closes a story, deliverable by deliverable.
Related in this course
- A4.7 · Workshop: specifying Portal's engine — the module hub.
- A4 · The spec layer — the chapter this workshop closes.
- A1.05 · Correct by definition — the closure this dive makes operational.
- F6 · The Portal on the web (Phoenix) — the chapter whose master invariant F5.1-INV1 seeds.
- Companion · Functional Programming in Elixir — where the engine this spec defines is implemented.