Forge Island · Velocity review · 20 September 2026

We did not regress a million miles

A measured comparison of how fast work actually finished on Kubo and on Forge Island — and why the dashboard said the team was dead for twenty-one hours while eighty-six per cent of the day’s work was landing.

79%of Kubo’s best rate
Identicalspeed while actually moving
4.3×longer for one card to finish
86%of work done in “stalled” hours

Forge Island finishes cards at 79% of Kubo’s best sustained rate. While it is actually moving it finishes them at exactly the same speed — 6.09 an hour against 6.03. The work is not harder to write: a typical change is 94 lines against Kubo’s 116. What genuinely got worse is how long one card takes to be believed, and what got much worse is the dashboard reporting it.

Three things are true

Costs the most

Finished work eats the crew

Nobody may mark a card finished until a lead has looked at a picture from the game. Fair enough — seven of thirty-seven cards a worker called “done” had never been built into the game at all.

But a finished card waiting on that look stays parked in the “being worked on” column, and the team counts that column to decide whether anyone is free. The limit is eight. Nine finished cards sat there at once, so the team had nobody free and stopped dead.

Caused this question

The dashboard is lying

The board reported twenty-one of twenty-four hours as stalled. In twelve of those hours the team landed 254 pieces of work — 86% of the entire day.

Nothing was stalled. The board only counts the instant a person flips a card, and the person flipped forty-seven of them in one batch at 8pm. The instrument caused the alarm.

Real, but not today’s limit

One graphics card

Only one person can compile or run the game at a time. Over the only window we have a log for, that queue ran 60% busy and each card needed about thirteen minutes of it.

That caps the whole project near 4.8 cards an hour, permanently. Kubo reached 4.15 with no such cap. So the ceiling is close — but it is not what stopped us.

The numbers

Kubo’s window is its own best run: the 46 hours across 18–19 September that produced its retrospective. Forge Island’s is 20 September, its only comparable full day.

Finishing work
MeasureKubo · 46 hoursForge Island · 20.4 hoursRead
Cards finished19167—
Cards per hour, clock time4.153.28Forge Island 21% lower
Cards per hour, while actually moving6.036.09Identical
Hours with at least one card finished33 of 7211 of 24Same share of the clock
Best single day13667Half
Typical card, opened to finished58 min252 min4.3× worse
Slower quarter of cards, opened to finished124 min363 min2.9× worse
Effort going in
MeasureKubo · 46 hoursForge Island · 20.4 hoursRead
Pieces of work landed240294—
Per hour5.214.4Forge Island 2.8× more
Typical size, lines added11694Same size — not heavier
Share of files touched that are the game73%52%Less of it is the game
Share that is our own scaffolding6%31%5× more
Work about the machine, not the game17%25%Higher
Work parked because it could not be checked0.4%14%35× more
The stall that was not a stall — 20 September
HourCards marked finishedWork landedWhat the board said
10am–7pm0219STALLED, every single hour
8pm474fine
9–10pm236fine
11pm–midnight035STALLED

Forge Island writes nearly three times as much code per hour as Kubo did, in changes of the same size, and finishes fewer cards with it. Nearly a third of what it touches is its own scaffolding rather than the game.

The two ways of working, side by side

 KuboForge Island
Who says a card is finishedThe worker, about its own workA lead, after looking at a picture from the game
Does finishing free somebody upYes, straight awayNo — not until a person looks
People working at once12, and up to 30 in practice8
Shared thing only one can useNone at allThe graphics card and the game engine
How you wait your turn for itNot applicableAsk once, get refused, go do something else
How work reaches the main copyWorker raises its own request and approves itWorker pushes straight in
Waiting for permission to run a commandUp to 4 hours, then gives up silentlyA bot answers within 5 seconds
Keeping work apartOne card, one folder, one threadThe same

These are the same system. Forge Island’s dispatcher says so in its own opening comment: the design was copied from Kubo’s. They differ on two points only, and both come from the game engine.

The three questions

  1. Is it actually worse, or is the work simply heavier?

    Both — but not where you would guess. Per hour of real movement the two are identical, 6.09 against 6.03, and the changes are the same size. So the work is not heavier to write. It is heavier to prove: every card that changes something you can see needs the one graphics card, and then needs a person to look at the result.

    Clock-time output is 79% of Kubo’s. A card’s life is 4.3 times longer. The feeling of “a million miles” comes entirely from a dashboard reporting twenty-one dead hours during which 86% of the work happened.

  2. The single biggest thing to change

    Give finished-but-unchecked cards a column of their own that does not count against the crew limit. Right now the eight places are shared between “somebody is working on this” and “this is done and waiting for a person to look”, so a batch of finished work starves the team to zero.

    Kubo’s own written rule already prescribes exactly this, and Forge Island took only half of it:

    A dispatcher may move a card to In Progress and to Review; never to Done.

    Forge Island took the “never to Done” and left the Review column behind. Nothing else on this page would buy as much.

  3. What we dropped, and what we added that is not paying

    Dropped: Kubo’s self-closing loop, where a worker marked its own card finished. That went for a good reason — seven of thirty-seven cards a worker called finished had never been built into the game. The mistake was not adding the Review column at the same time, so the whole cost of the new honesty landed on the crew limit. Also dropped: Kubo’s second way of claiming a card, by putting a name on it. Forge Island claims only by moving the card, which is why it now needs a reaper, a settling delay and a jam-breaker to patch the gaps that leaves.

    Added, and not paying for itself: the self-measurement stack — the velocity tool, the jam panel, the wallboard, the board scripts. Scaffolding is 31% of what Forge Island touches against Kubo’s 6%, and a quarter of the day’s work is about the machine rather than the game. The one number it exists to produce is wrong by roughly a factor of ten, in the direction of panic.

    Added, and worth keeping: the approval bot. Kubo’s workers could sit four hours waiting for permission to run a single command and then die quietly. Forge Island’s get an answer in five seconds. That is a real, permanent win and it should go back into Kubo.

Technical details

Where every number came from

Windows. Kubo: main, 2026-09-18T00:00Z to 2026-09-20T00:00Z, matching its own retrospective at kubo/docs/podcast/2026-09-19-48-hours-of-commits.md. Forge Island: dev, path-filtered to apps/forgeisland, from 2026-09-20T00:00Z (20.4 elapsed hours to the last commit).

Card data. gh issue list --state closed on both repositories — 199 Kubo issues, 148 forgeapps. Forge Island’s 47 board-16 cards were matched against the card numbers in the velocity tool’s own plans/velocity/latest.json. Per-hour Done counts are that file’s hours[] array, derived from the ProjectV2 Status field’s updatedAt. No gh project item-list was run.

Commit data. git log --no-merges --numstat. Path buckets: product = src|unreal|api|public|assistant|distribution|brand|design|supabase|promo; tooling = scripts|tools|workflows|crons|bridge; docs = plans|docs|handoffs|qa plus any .md.

Build lock. apps/forgeisland/unreal/ForgeIsland/Saved/build-lock.log, 92 lines, 2026-09-20T20:20Z to 2026-09-21T00:13Z (3.89 h) — the only logged window, because this file-based lock replaced a mkdir lock that logged nothing (forgeapps#323). 46 claims across 11 distinct cards; 139 minutes held = 59.6% busy; median hold 2 min, longest 11. 12.6 lock-minutes per card gives the 4.8 cards/hour ceiling.

Slot starvation. scripts/forgeisland-dispatcher.ts: DEFAULT_MAX_WORKERS = 8 (line 84); freeSlots counts IN_PROGRESS_STATUS (line 377); WRITABLE_OPTION_IDS excludes Done and setStatus throws on it (lines 1187–1193). The nine-card incident is in the comment at lines 388–392 and again at 2107–2109: “those dead cards held every worker slot and the board did nothing for hours until a person noticed.” Board 16 has four columns only — Todo, In Progress, Blocked, Done. There is no Review column.

Kubo’s side. tools/kubo-project-worker.ts: DEFAULT_MAX_WORKERS = 12 (line 541); the worker moves its own card via editProjectStatus(job.itemId, status, status.doneOptionId) (line 1413); assignee claim at line 1578. No build lock, deploy lock or any single-holder resource exists in the repository — searched by filename and by content. Its dev server is per-worktree (kubo/tools/ultra-compare.md:20), which is why it never needed one.

The Review rule. kubo/.claude/skills/t3/SKILL.md:98-100. That file’s last commit is 2026-09-20 — it is the Forge Island lesson written back into Kubo’s skill docs, and Kubo’s own code was never changed to match it either.

What could not be measured

Build lock contention before 2026-09-20T20:20Z: the previous lock kept no log, so earlier queueing cannot be quantified at all.

Kubo card data before 2026-09-18: all 199 of its closed issues closed inside a three-day window, so earlier Kubo work was not tracked as cards and no throughput number exists for it. The “clockwork” period Adam remembers is the window measured here.

Time Forge Island workers spent waiting for the graphics card: a refused claim is not written to the log, so the wait is invisible. Only successful holds are recorded.