jonnifyagile agents
jonnify / Agile Agent Workflow / A3 · Roadmap / A3 · The roadmap layer

A3 · orientation dive 2

The roadmap layer

Why delivery deserves its own layer — and what a roadmap.md is: an ordered set of thin-but-robust increments that points at the specs and defines none of them.

Delivery and definition change on different cadences. The order moves constantly as the loop learns; the definition of a rung moves only when feedback edits it. Separate the two and the plan stays cheap to re-order while the spec stays the single source of truth. Select a line on the right to take one roadmap.md rung apart — an id, a milestone, the spec it points at, and the behaviour it defines: none.

Anatomy of one roadmap line · pick a rung

one line of phoenix.roadmap.md · what it is, and what it is not RUNG f6.1 the engine served as a web app MILESTONE 1 · Ship the catalog POINTS AT → f6.1.md BEHAVIOUR DEFINED HERE none — the contract lives in the spec the line points at definition of done (the demo the line names): GET / renders a page over the facade a line names a rung, a milestone, and a spec · it defines no behaviour
f6.1 — “the engine served as a web app” · milestone 1 · Ship the catalog → points at f6.1.md (done: GET / renders a page over the facade). Behaviour defined in this line: none — the contract lives in the spec it points at.

Why a delivery layer

A1.04 drew the line between two layers: the roadmap is how we deliver, the spec is what we build and prove. This dive gives that line its motive. The two layers exist apart because they answer different questions and change on different cadences. Definition answers “what is this rung, and how do we know it is right” — it is the single source of truth, and only feedback edits it. Delivery answers “in what order, at what size, to what milestone do the rungs ship” — and that order moves constantly as the loop learns.

Put both in one artifact and every re-order risks editing a definition. Promote a rung, and a careless edit rewrites what “done” meant; the spec stops being trustworthy. Keep them in separate layers and the order can change under feedback without ever touching the definition of a rung. That is the whole reason for a delivery layer: the spec stays the single source of truth while the plan above it stays cheap to re-order. The roadmap points at the specs; it never holds them.

the delivery layer
The roadmap: how we deliver — order, size, milestones. Re-ordered by feedback between rungs; defines no behaviour.
the definition layer
The spec: what we build and prove. The single source of truth, edited only by feedback. The roadmap line points at it.
why apart
They change on different cadences. Sharing one artifact lets a re-order edit a definition — so the spec stops being trustworthy.
the payoff
Order changes freely, definitions hold. The plan stays cheap to re-order; the spec stays authoritative.

This expands A1.04 (two layers): there the separation was named; here it earns its reason. The roadmap is the layer that lets delivery adapt without disturbing what any rung means.

What a roadmap.md is

A roadmap.md is an ordered set of thin-but-robust increments — rungs — grouped into milestones. Each rung is one line: an intent, a demo, and a definition of done, with the contract living one layer down in the spec the line points at. A milestone is a group of rungs that together ship something a real role can use end to end. Over the whole file sits a single master invariant — the architectural rule every rung must hold — and a delivery arc that names the order.

The defining property is what a line is not. A roadmap line names a rung, a milestone, and a spec; it defines no behaviour of its own. Cram the full contract into the line and the slot stops being a plan you re-order and becomes a definition you would have to re-negotiate to move. So re-ordering is decoupled from redefining: the order can change while not one spec the lines point at changes with it. Switch the ordering below to watch the delivery order move while the spec-edit count stays pinned at zero.

Re-order without redefining · pick an ordering

the delivery plan · ordered rungs, each a line that points at a spec f6.1 endpoint → f6.1.md no behaviour f6.3 Postgres → f6.3.md no behaviour f6.5 catalog view → f6.5.md no behaviour f6.6 interact- ivity → f6.6.md no behaviour f6.7 PubSub → f6.7.md no behaviour specs edited by this re-order: 0 the order moved; not one spec did
Re-ordered by value — the delivery order changed; spec edits = 0. A roadmap line points at a spec; re-ordering the plan never edits one.

A roadmap.md is a map of order, not of meaning: it points at the specs, defines none, and re-orders freely.

The roadmap.md on the Portal

The Portal's web chapter — the companion course's F6 — ships from a real phoenix.roadmap.md. It carries nine rungs, f6.1 through f6.9, grouped into three milestones: ship the catalog (f6.1–f6.5), make it live (f6.6–f6.7), and ship to users (f6.8–f6.9). Each line names a rung, its demo, and the spec triad it points at — and defines no behaviour of its own.

Over all nine sits one master invariant: the web layer calls only the Portal facade. That single rule is what makes the ladder cheap — every rung adds web surface without reaching below the facade, so the engine under all nine rungs never changes. The Operator re-orders the rungs as feedback arrives; the Author builds each against the spec its line points at. Re-order the plan, and not one f6.N.md spec moves with it.

# F6 · phoenix.roadmap.md — the Portal on the web. Order only; each rung points at its spec.
#
# master invariant: the web layer calls only the Portal facade and renders only %Portal.Error{}.

## Milestone 1 · Ship the catalog
  f6.1  endpoint      → f6.1.md     # done: GET / renders a page over the facade
  f6.2  routing       → f6.2.md     # done: read/write/live routes + pipelines
  f6.3  Postgres      → f6.3.md     # done: catalog survives a restart
  f6.4  contexts      → f6.4.md     # done: the web reads and writes real domain
  f6.5  catalog view  → f6.5.md     # done: browse and create with inline errors

## Milestone 2 · Make it live
  f6.6  interactivity → f6.6.md     # done: search and create without a reload
  f6.7  PubSub        → f6.7.md     # done: two clients update live; a viewer count

## Milestone 3 · Ship to users
  f6.8  auth & deploy → f6.8.md     # done: sign in; a deployed clustered release
  f6.9  dashboard     → f6.9.md     # done: an operations dashboard, live, under auth
#
# Re-order within the master invariant; not one f6.N.md spec changes when the order does.

The principle

Plan how you deliver, separately from what you build. Delivery order changes constantly under feedback; the definition of a rung changes only when feedback edits it — so keep them in separate layers.

On the Portal

phoenix.roadmap.md orders nine rungs (f6.1…f6.9) into three milestones over an unchanged engine — each line points at its spec triad and defines no behaviour, so the order re-plans without touching one spec.

A roadmap.md points at the specs, defines none, and re-orders freely — that separation is the whole reason the delivery layer is kept apart.

Recap — a map of order, not of meaning

Delivery deserves its own layer because delivery and definition change on different cadences: the order moves with every loop, the definition only with feedback. A roadmap.md holds the delivery side — an ordered set of thin-but-robust increments grouped into milestones, each a line that points at a spec and defines no behaviour, all under one master invariant. Because the lines point at the specs rather than holding them, re-ordering the plan never edits a spec. The Portal's phoenix.roadmap.md proves it: nine rungs, three milestones, an unchanged engine. The next dive walks the road ahead — the eight A3 modules that turn this artifact into a practised discipline.

Next in A3: The road ahead — a deep overview of the eight A3 modules, from Agile and XP through the roadmap.md, robustness, and tracer bullets.

References

Primary sources for delivery as its own discipline, small re-orderable batches, and keeping the plan independent of the definition — and where the layers this dive sits between are defined in the course.

Sources

Related in this course