jonnifyagile agents
jonnify / Agile Agent Workflow / A4 · The spec layer / A4.4 / A4.4.1 · Deliverable to story

A4.4 · From stories to a .stories.md · dive 1

Deliverable to story

A spec lists the artifacts a rung produces; the stories file realizes each one with at least one story. A deliverable with no story is a gap.

The mapping is many-to-many: a story can implement several deliverables, and a deliverable can be realized by several stories. Each F6.1 story records the deliverables it implements verbatim. Pick a story on the right to read what it realizes; the content figure builds the map the other way and shows a gap when a story is removed.

A story implements deliverables · pick a story

F6.1 stories · each implements one or more deliverables US1 · operator D1, D2, D6 US2 · visitor D3, D4, D5 US3 · developer D2, D4 US4 · operator D2, D7 US5 · visitor D4, D7
US1 (operator) implements D1, D2, D6. Testable: yes — by a boot check and a health request.

The rule: every deliverable, at least one story

A spec's Deliverables section is a list of the concrete artifacts a rung produces — the endpoint, the router, the controller, the view, the liveness route, the verification. The .stories.md realizes each one with at least one user story: as a… I want… so that…, with Given/When/Then acceptance. The rule is one-directional and total: for every deliverable there is a story that realizes it.

A deliverable with no story is something the rung produces that no one asked for and that nothing accepts. It is built without a reason and shipped without a check — the kind of thing that drifts into a codebase and is never verified. Writing the stories so that each deliverable is realized is what keeps the rung honest: the Coverage line at the end of the file is the audit that proves no deliverable was left behind.

deliverable
A concrete artifact the rung produces, listed in the spec (F6.1 has seven: D1…D7).
realizes
A story realizes a deliverable when the deliverable appears on the story's "Implements deliverables" line.
many-to-many
A story can implement several deliverables, and a deliverable can be realized by several stories.
gap
A deliverable that no story realizes — visible in the Coverage line by its absence.

The mapping runs both ways: from a story, read the deliverables it implements; from a deliverable, read the stories that realize it. The two views are the same map, read from each end.

Covering every deliverable — and reading the gap

The hero figure read the map from the story side. The figure below reads it from the deliverable side: pick a deliverable and see the stories that realize it. F6.1's seven deliverables are all covered, so the map is closed. To see what a gap looks like, drop a story: removing US2 leaves D3 and D5 — realized only by US2 — with no covering story, and the covered count falls from seven to five.

That fall is the whole point. The map is not a decoration; it is a check. A deliverable that drops out of coverage is a deliverable the rung cannot accept as done, because nothing exercises it. The two figures teach different moves: the hero reads one story's reach, this one proves that every deliverable is reached — and shows the gap when one is not.

Each deliverable to its stories · pick one, then try dropping US2

F6.1 deliverables · realized by the stories on the right D1 the endpoint & its plug stack D2 the supervision-tree split D3 the router & browser pipeline D4 the controller over the facade D5 the HEEx view from assigns D6 the liveness route D7 verification: boot, render, restart all seven covered · the map is closed
D1 is realized by US1. Covered: 7 of 7 deliverables map to a story — the map is closed.

A closed map covers every deliverable; drop a story and the deliverables it alone realized fall out — the gap is read straight from the count.

On the Portal — the F6.1 stories file

On the Portal — the learning platform this course builds — the real stories file belongs to , the rung “bootstrap the Phoenix Portal”. Its spec lists seven deliverables; the stories file realizes them with five stories. Each story states the deliverables it implements on its own line, so the map can be read from either end. The markdown below carries one story's framing — the “Implements deliverables” line is the realization, read verbatim.

One caution on that fragment: it is the F6.1 draft wording. US2 was first drafted as “see a user's courses” at a /courses/:user_id page. The reframing happened at , which renamed the surface to the protected /my/courses — a learner's own enrollments, read from the authenticated session, never another learner's. The deliverable→story map is unchanged by the rename.

# f6.1 stories — one story realizes one or more deliverables (markdown, not code; F6.1 draft).
## F6.1-US2 — See my courses
#  As a signed-in learner, I want to open my own courses page,
#  so that I can see the courses I am enrolled in.

# Acceptance: Given a signed-in learner with enrollments, when GET /my/courses (protected),
#             then the page renders their own courses. (and the empty + not-signed-in cases)
# Note: the F6.1 draft named /courses/:user_id; F6.5 reconciled it to the protected /my/courses.

# The realization line — what this story covers:
Implements deliverables: F6.1-D3, F6.1-D4, F6.1-D5

# Read across all five stories, every deliverable D1…D7 is realized by at least one.
the principle

Every deliverable is realized by at least one story; a deliverable with no story is a gap — built without a reason and accepted by nothing.

on the Portal

F6.1's D1…D7 each map to a story; remove US2 and D3 and D5 fall out of coverage — the gap is read straight from the map.

The stories file realizes each deliverable; reading the map from either end is how the rung proves nothing was left without a story.

Recap — the map, both ways

A spec lists deliverables; the stories file realizes each one with at least one story, and the mapping is many-to-many. From a story, read the deliverables it implements; from a deliverable, read the stories that realize it — the same map, read from each end. A deliverable with no story is a gap, visible the moment a covering story is removed. The next dive reads the single line that records this map for the whole rung.

Next in A4.4: A4.4.2 · The Coverage line — the one line at the end of the stories file that records the deliverable→story map, and how a missing deliverable surfaces.

References

Sources for stories as the derived, covering face of a requirement, and where this connects in the course.

Sources

Related in this course