Flywheel

Concept tour · from idea to merged

Onboarding emails arrive out of order.

One raw sentence — the kind that arrives in a chat window on a Tuesday — followed through all seven steps of the flywheel, with the artifact each step leaves behind. The steps never change; that constancy is the lesson. Only the idea does.

the same journey, other ideas: exports fail when the API rate-limits us · give the dashboard a dark theme

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

the artifact it leaves
◎ tracker item
Onboarding emails arrive out of order
milestone · intent/onboarding-email-order type:question state:queued

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

the artifact it leaves
▤ openspec/changes/onboarding-email-order/
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

the artifact it leaves
▤ sessions/2026-08-12-where-order-dies/
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

the artifact it leaves
the plan · caps the round
where order is lost — the scheduler; never enforced, only likelyclosed
sequence, not schedule — drafted as a recordclosed
unit · onboarding-email-order · 4 changes · bolt-default→ construction
next round · audit the other multi-step sendsexpands
Approveone word · nothing existed on GitHub before it

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

what that word left behind
✎ decisions/sequence-not-schedule.md
# 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.
⚙ unit · onboarding-email-order → construction, covered by this word ⊕ elaboration · audit the other multi-step sends — the next round, open

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

the artifact it leaves
± jobs/onboarding.ts
@@ 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

the artifact it leaves
⇂ merged to main
4b8e77a  fix(onboarding): per-user send sequence replaces raced schedules
☑ intent/onboarding-email-order · handoff landed
☑ #299 is 'in order' a promise? — closed: it is now

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 →