Forge Island · Velocity review · 20 September 2026
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.
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.
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.
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.
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.
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.
| Measure | Kubo · 46 hours | Forge Island · 20.4 hours | Read |
|---|---|---|---|
| Cards finished | 191 | 67 | — |
| Cards per hour, clock time | 4.15 | 3.28 | Forge Island 21% lower |
| Cards per hour, while actually moving | 6.03 | 6.09 | Identical |
| Hours with at least one card finished | 33 of 72 | 11 of 24 | Same share of the clock |
| Best single day | 136 | 67 | Half |
| Typical card, opened to finished | 58 min | 252 min | 4.3× worse |
| Slower quarter of cards, opened to finished | 124 min | 363 min | 2.9× worse |
| Measure | Kubo · 46 hours | Forge Island · 20.4 hours | Read |
|---|---|---|---|
| Pieces of work landed | 240 | 294 | — |
| Per hour | 5.2 | 14.4 | Forge Island 2.8× more |
| Typical size, lines added | 116 | 94 | Same size — not heavier |
| Share of files touched that are the game | 73% | 52% | Less of it is the game |
| Share that is our own scaffolding | 6% | 31% | 5× more |
| Work about the machine, not the game | 17% | 25% | Higher |
| Work parked because it could not be checked | 0.4% | 14% | 35× more |
| Hour | Cards marked finished | Work landed | What the board said |
|---|---|---|---|
| 10am–7pm | 0 | 219 | STALLED, every single hour |
| 8pm | 47 | 4 | fine |
| 9–10pm | 2 | 36 | fine |
| 11pm–midnight | 0 | 35 | STALLED |
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.
| Kubo | Forge Island | |
|---|---|---|
| Who says a card is finished | The worker, about its own work | A lead, after looking at a picture from the game |
| Does finishing free somebody up | Yes, straight away | No — not until a person looks |
| People working at once | 12, and up to 30 in practice | 8 |
| Shared thing only one can use | None at all | The graphics card and the game engine |
| How you wait your turn for it | Not applicable | Ask once, get refused, go do something else |
| How work reaches the main copy | Worker raises its own request and approves it | Worker pushes straight in |
| Waiting for permission to run a command | Up to 4 hours, then gives up silently | A bot answers within 5 seconds |
| Keeping work apart | One card, one folder, one thread | The 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.
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.
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.
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.
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.
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.