2>

stderr

let stderr = Hylomorphism(my_ideas, vbb, blog)

Meta
Orión
Orión
author

Ten lanes: what actually happened

Esta entrada solo está disponible en inglés.

Three days ago I published Ten lanes, a pre-mortem for Muxón’s first sprint. The bet was that seams done well were worth ten lanes of parallel work, and the hour spent on each seam in Sprint 0 would pay itself back in Sprint 1. Best case, four to five days. With the usual bugs, seven to ten.

The actual number was one day.

What the numbers did

Phase 0 — the MVP, eighteen PRs, sixty tests — shipped between 05:25 and 08:42. Three hours and seventeen minutes wall-clock. Ten agent worktrees, one orchestrator, a reviewer-per-PR with fresh context. v0.1.0 tagged before breakfast was over.

Then I did not stop. Phases 1 through 5 — shell, Claude, Codex, editors, Zellij plugin, timetravel, search, replay, bundles, headless, federation, SSH — shipped the same afternoon. Over two dozen more PRs. v0.6.0 tagged at 16:55. A hundred and seventy-eight tests green.

Six weeks of plan in one day of wall-clock. Roughly 30× the serial profile, 7× the pre-mortem’s best case. Not a maybe.

The failures I expected, that did not happen

The three I listed going in:

  • A seam I thought was locked turns out not to be. Zero seam amendments across ten Sprint 1 lanes. Zero across the Phase 2–5 lanes that followed. Every lane ran as a pure function from spec to crate.
  • The reviewer agent approves something CI was too weak to catch. Did not happen at ship-blocker scale. Some style nits slipped. No behavioural regressions merged.
  • Zellij’s CLI output format drifts underneath Lane D. Did not drift. The Mux trait was tight enough that the second backend would be work, not rework.

The thing I was most uncertain about going in is the thing that went quietly right. Seams done well are worth more than I claimed.

The failure I did not expect

“The interesting ones are the ones I do not see.” This one.

The seams specified values: types, ULIDs, proto envelopes, the event taxonomy as a list of struct types. The seams did not specify composition: which handler emits which event, which subscriber consumes it, what the full graph of event flow actually looked like.

Taxonomy locked. Topology ad-hoc.

Every handler wired itself into rt-events by type, on its own. It compiled. It worked. But if you asked “what happens when a workspace is opened?”, the answer lived in six files and nobody had written it down. Removing an event type broke things at runtime, not at compile time. The event graph was invisible.

After v0.6.0 I had to build rt-events-dag — a pure graph-theory crate where each edge is an event type, with compile-time wiring, cycle detection, and a completeness check the daemon runs at startup. It cost a weekend. It is a published crate now, which is a nice side-effect. It should have been Sprint 0 work.

Seams come in two kinds

The lesson I did not have language for when I wrote the pre-mortem.

A seam that constrains a value — a type signature, a schema, an envelope — is what everyone means by “interface”. Those I nailed. A seam that constrains a composition — the shape of the graph the values flow through — is a different thing, and it is the one I missed. A locked taxonomy with an unlocked topology is a seam that is only half a seam.

The fix is structural. For each event, decide the full set of its subscribers and write that set down as part of Sprint 0. For each capability the system promises — time-travel, federation, replay — trace the edges that implement it and lock the graph, not just the node types. Do this before any handler exists.

Emergent behaviour is the point of building the system this way. Emergent behaviour is also where unspecified composition hides. The two are the same surface.

What I update

The parallel agentic profile is real and it is not a one-off. The multiplier is roughly 30× observed-velocity on a project where the seams hold, and the seams hold when someone spends a day locking them. One afternoon of Sprint 0 produced forty-plus lanes of clean downstream work across two releases.

The thing to do next time is to lock topology as well as taxonomy. If that had been in Sprint 0, the weekend I spent on rt-events-dag would have been the last hour of Sprint 0 instead.

That is the whole update. Seams still win. Seams are bigger than I thought.

What I update

1
Seams done well are worth more than you think. Six weeks of plan ran in one day of wall-clock.
2
A locked taxonomy with an unlocked topology is only half a seam.
3
Emergent behavior and unspecified composition are the same surface. You cannot have one without the other.

Reacciones

Discusión

Notas públicas de lectores con sesión iniciada.

Cargando comentarios…

stderr