A4.6 · Traceability · dive 3
A broken link
A closure is only as strong as its weakest link. Remove one and the completion rule reports not done — and, more usefully, names the gap.
An uncovered deliverable, an unreachable invariant, a requirement that traces to nothing — each is a hole the rule finds from the text, before a line of behaviour is trusted. Break a link on the right over F6.1 and read the gap. Completion is verified, never asserted — the inverse of A1.05.
Break a link · read the gap on F6.1
Two ways a link breaks
Two closures make the chain checkable from the text alone. The stories file ends with a Coverage
line (D#→US# · …) mapping every deliverable to the
stories that realize it, and each story's INVEST line ends with encodes FN.M-INV#,
naming the invariants it exercises — so every invariant is reachable from a story. Break either and the
chain has a hole.
An uncovered deliverable is a D# absent from the Coverage line:
clause (a) of the completion rule fails. An unreachable invariant is an
INV# no story encodes: clause (d) has no path from a story to it. In both cases the
rule does not say “looks fine” — it names the missing link, before any behaviour is
trusted.
# F6.1's intact Coverage line — every D# present. Coverage: D1→US1 · D2→US1,US3,US4 · D3→US2 · D4→US2,US3,US5 · D5→US2 · D6→US1 · D7→US4,US5 # Break (1): uncover D7 — drop the stories that realize it. Coverage: … · D6→US1 · D7→ # D7 maps to no story → clause (a) fails → not done # Break (2): drop US2's encodes — the master invariant loses its path. F6.1-US2 … encodes (none) # INV1 reachable from no story → clause (d) open → not done
- uncovered
- A deliverable
D#absent from the Coverage line — it maps to no story, so clause (a) fails. - unreachable
- An invariant
INV#no storyencodes— there is no path from a story, so clause (d) is open. - named, not guessed
- The rule reports the exact id of the hole — the gap is read from the text, never inferred or assumed.
Does the rule pass or fail?
The completion rule is mechanical: read the Coverage line and the encodes links, and the verdict follows. Below are three candidate rung states. The first is fully covered; the second drops a deliverable from the Coverage line; the third leaves an invariant with no encodes. Select a case and the readout reports done or not done and names the reason — one broken link is enough to open the closure.
Three rung states · pass or fail
# Three candidate Coverage + encodes states — the rule reads each verdict. # case 1 Coverage: D1→US1 · … · D6→US1 · D7→US4,US5 encodes: INV1…INV5 all named # case 2 Coverage: D1→US1 · … · D6→ · D7→US4,US5 # D6 absent # case 3 Coverage: D1→US1 · … · D7→US4,US5 encodes: INV3 named by no story
The verdict is read, not judged: a missing D# or an unencoded
INV# opens the closure, and the rule names which.
A broken link on the Portal
On the Portal, F6.1's intact Coverage line is
D1→US1 · D2→US1,US3,US4 · … · D7→US4,US5.
Drop US4 and US5 — the stories that realize D7 — and D7→ is empty:
D7 (verification) maps to no user story, so clause (a) fails and the rung is not done. The gap is named:
“D7 maps to no story.” Drop US2's encodes F6.1-INV1 and the master
invariant is reachable from no story, so clause (d) is open: the gap is named “INV1 reachable from no
story.”
In both cases the rule runs in reverse: instead of confirming the closure, it points at the exact hole. That is why completion is verified, not asserted — the same check A1.05 calls correct by definition. The framework that runs these checks is in F6 — the Portal on the web; here the concern is the closure and its gaps, not the code.
# Break F6.1 two ways — the rule reports not done and names the gap. Coverage: … · D6→US1 · D7→ # uncovered: D7 maps to no story → clause (a) fails F6.1-US2 … encodes (none) # unreachable: INV1 from no story → clause (d) open → "not done" # the gap is named, not guessed
A broken link opens the closure: an uncovered deliverable or an unreachable invariant makes the rung not done, and the gap is named from the text — not a judgement call.
Drop D7's stories or US2's encodes F6.1-INV1 and the rule reports F6.1 not done
and points at the exact hole — correct by definition, run in reverse.
A closure is only as strong as its links: remove one and the rule reports not done and names the gap — which is why completion is verified, not asserted, and ties straight back to A1.05.
Recap — the gap the rule names
Break one link and the completion rule reports not done. An uncovered deliverable fails clause (a); an unreachable invariant opens clause (d); either is named from the text, not guessed. This closes A4.6: the chain links every id, the completion rule closes it, and a broken link opens it again and points at the hole. Return to the module hub to step the chain once more, or carry the closure into the chapter's last module.
Back to A4.6 · Traceability to revisit the chain and the closure, then on through the rest of A4 — the spec layer, correct by definition.
References
The sources behind the broken-link check and verified completion, and where it connects in the course.
Sources
- Adzic, G. — Specification by Example — living documentation that catches the gap between spec and system.
- Cohn, M. — User Stories Applied — the deliverable-to-story coverage a broken link exposes.
- Humble & Farley — Continuous Delivery — done is verified by the checks, so an unrun gate fails it.
Related in this course
- A4.6 · Traceability — the module hub.
- A4.6.2 · The closure — the previous dive.
- A1.05 · Correct by definition — the idea verified in reverse here.
- A2.04 · Acceptance criteria — the checks the chain ends in.
- F6 · The Portal on the web (Phoenix) — the real chapter F6.1's ids come from.