A2.06 · The value ladder · dive 3
Always runnable
A ladder is composed of capabilities, in dependency order. This is what the order buys: every rung leaves the system runnable and demoable.
Build the first rung and it runs; build the first two and they run. Every prefix of the ladder is a working, demonstrable system. It follows directly from dependency order — for any prefix, every dependency of every included rung is also included. This is the structure the roadmap layer later plans delivery over. Step the slider on the right to build the prefix rung by rung.
Build the prefix · every prefix runs
Every prefix is a working system
A ladder is always runnable when, for every k, the prefix r₁ … rₖ is a runnable, demoable system. This is not an extra property to arrange — it falls out of dependency order. If every rung depends only on rungs below it, then for any prefix, every dependency of every included rung is also included; nothing points outside the prefix. Build the bottom rungs and the result runs.
“Runnable” here is the demoability the A2.01 vertical slice gave each rung, extended to the whole prefix: after rung k there is something a role can exercise end to end. That is the payoff of building bottom-up — the loop has a working system to demo and accept after every single rung, never a half-built one that only runs once the last piece lands.
- always runnable
- For every k, the prefix r₁ … rₖ is a runnable, demoable system.
- prefix
- The first k rungs of the ladder, bottom-up — a partial but complete-in-itself build.
- follows from order
- Dependency order guarantees it: for any prefix, every dependency of an included rung is also included.
- orphan
- A built rung whose dependency is not built. It points at something missing, so the build cannot run through it.
This is the property the chapter set out to build — capabilities (dive 1), in dependency order (dive 2), runnable at every rung. The roadmap layer (A3) plans delivery over exactly this ladder.
Skip a rung and a rung is orphaned
The contrapositive is the failure. If a rung is built but a rung it depends on is not, that rung is orphaned — it points at something not built, so the build cannot run through it. Remove or skip a rung and every rung above it that depended on it is orphaned at once. Runnability is not the order of the rungs in a list; it is whether the set you have built is closed under dependency.
Toggle each rung built or skipped below. The checker reports whether the built set runs, and on a skip it names the first orphaned rung — a built rung whose dependency is missing — and paints it burgundy. The hero confirmed a clean prefix runs; this checker shows what breaks runnability when a rung is dropped out of order. Reading a clean prefix and finding the orphan in a broken set are two different moves.
Toggle each rung · find the orphan
Runnability is whether the built set is closed under dependency: skip a rung and the rungs above it are orphaned, and the build cannot run through them.
The Portal ladder runs at every prefix
On the Portal — the learning platform this course builds — the ladder runs at every prefix. After browse, a learner can browse the catalogue. After browse and enrol, browse then enrol. After browse, enrol, and open a lesson, enrol and open a lesson. The full four track progress over opened lessons. Each prefix is a working system the loop can demo and accept.
Skip enrol but keep open a lesson, and open a lesson is orphaned: it depends on enrolment that was never built, so that set cannot run. Runnability is a predicate over the built set — every built rung's dependency must also be built.
# The Portal dependency graph — the chain from dive 2. deps = %{browse: [], enrol: [:browse], open: [:enrol], track: [:open]} runnable? = fn built -> Enum.all?(built, fn rung -> Enum.all?(deps[rung], &(&1 in built)) # every dependency is also built end) end runnable?.(MapSet.new([:browse, :enrol])) # => true — a clean prefix runnable?.(MapSet.new([:browse, :open])) # => false — open is orphaned (enrol missing)
A clean prefix always passes; a built set that skips a rung leaves an orphan and fails. That is why the ladder is built bottom-up — the order guarantees the prefix.
The principle
Every prefix of a dependency-ordered ladder is a runnable, demoable system; skip a rung and the rungs above it are orphaned.
On the Portal
browse, then enrol, then open a lesson, then track progress — demoable after each; skip enrol and “open a lesson” is orphaned and the prefix cannot run.
Every rung leaves the system runnable and demoable — the ladder built bottom-up is a working system at every prefix, and that is the structure delivery is planned over.
Recap — the structure the rest plans over
A value ladder is the structure this chapter set out to build: capabilities, in dependency order, runnable at every rung. Every prefix is a working, demonstrable system, because dependency order keeps each prefix closed under dependency — and skipping a rung out of order orphans the rungs above it. The roadmap layer plans delivery over exactly this ladder — which rung ships in which iteration — and the spec layer defines each rung before the Author builds it. Those layers are named here, taught later.
A2.06 composes the ladder. The chapter's remaining modules write each rung's acceptance criteria and split a rung that is too big, and the closing workshop (A2.07) composes the whole Portal ladder. Return to the A2.06 module hub to continue.
References
Primary sources for keeping a system releasable at every increment, and where this connects in the course.
Sources
- Humble & Farley — Continuous Delivery — keeping the system in a releasable, demoable state after every increment.
- Hunt & Thomas — The Pragmatic Programmer — building in small steps that each leave a working whole.
- Cohn, M. — User Stories Applied — thin vertical slices that each deliver demonstrable value.
Related in this course
- A2.06 · The value ladder — the module hub.
- A2.06.2 · Dependency order — the previous dive.
- A2.06.1 · Compose the ladder — the first dive.
- A2.01 · Value, not tasks — the vertical slice each rung demos.
- A1.04 · Two layers — the roadmap layer that plans delivery over the ladder.
- Companion · Functional Programming in Elixir — the Portal's internals.