step 1 of 7 · dispatch
You report a bug in one sentence.
Dispatch doesn't route it to a patch queue — out-of-order delivery smells like a design problem, so it files an intent where the root cause can be asked about.
actor: dispatch · your cost: one sentence
step 2 of 7 · the intent expands
The bug expands into questions, not a hotfix.
The intent loop frames what nobody has asked: is ordering even guaranteed anywhere today? The frontier fills with the questions a hotfix would have skipped.
actor: intent loop · your cost: nothing yet
onboarding-email-order/ ├── intent.md ├── questions │ ├── #298 where is order lost — scheduler or sender? │ └── #299 is 'in order' a promise we ever made? └── sessions/
step 3 of 7 · a session works the round
A session finds the root cause.
Reading the jobs code, it finds five independently-scheduled sends racing each other. The bug is architectural: there is no sequence anywhere — just five alarms set close together.
actor: design session · your cost: nothing yet
where-order-dies/ ├── findings.md 5 sends, 5 schedules, 0 sequences — │ order was never enforced, only likely └── options.md per-user queue vs delays vs idempotent copy
step 4 of 7 · the plan
The round closes into one screen.
Everything the session settled — and everything it proposes next — lands as one plan: answers seeded, a decision drafted, a unit of construction proposed, sometimes the next round. Nothing on this screen exists on GitHub yet.
actor: the session, assembling · your cost: still nothing
step 5 of 7 · your word
One word contracts the round — and can expand the next.
You correct what's wrong — a route, a type, an answer typed into a row — and approve once. The root-cause ruling becomes a record, the queue rework drops into construction — and the audit of every other multi-step send opens only because you said grow.
actor: you, on the rim · your cost: one word
# Decision — order is a sequence, not a schedule Onboarding becomes a per-user queue: each send unlocks the next. Padding the delays is out — it shrinks the race without closing it. Closed by the operator, 2026-08-12.
step 6 of 7 · build — the bolt runs
The bolt rebuilds it against the book.
Spec agents cite the design book; the build replaces five schedules with one sequence. A reviewer who wasn't in any conversation can still check the code against the book.
actors: construction sessions · your cost: none
@@ enqueue on signup @@- for (const step of STEPS) schedule(step, user, step.delay);+ // decisions/sequence-not-schedule.md — order is a sequence + sequences.start("onboarding", user, STEPS);
step 7 of 7 · merged
The bug closes with its why on file.
Acceptance passes and the work merges to main; the intent's task is checked. Six months from now, the book still says why the delays weren't just padded. And the audit round you opened with the same word is already turning — that is the flywheel in motion.
actor: bolt loop · your cost: none
4b8e77a fix(onboarding): per-user send sequence replaces raced schedules
Seven steps, one spec trail
A bug whose fix was a design decision, not a patch: the race was closed, not shrunk, and the reasoning is on file where the next reader can find it. Your cost, totalled: one sentence, a few minutes, one word.
back to the walk ↩ · same journey, other ideas: export backoff → · dashboard dark theme →