jonnifyagile agents
jonnify / Agile Agent Workflow / A4 · Spec / A4.6 / A4.6.3 · A broken link

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

Coverage: D1→US1 · D2→US1,US3,US4 · D3→US2 · D4→US2,US3,US5 D5→US2 · D6→US1 · D7→US4,US5 F6.1-US2 encodes F6.1-INV1 · the master invariant reachable from a story CLOSED · done every deliverable maps to a story · every invariant is reachable
Intact · every deliverable D1–D7 maps to a story and every invariant is reachable from a story's encodes. The chain closes — correct by definition.

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 story encodes — 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
Case 1 · D1–D7 all covered and every invariant reachable, so the rule closes — done. The chain has no hole.

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
the principle

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.

on the Portal

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

Related in this course