Public: anyone can read this; the crew can change it.
Why a run waits for a builder is said from one module, read by finishing and requested #5703
Check · Review · Land · Live done — Landed and live in production.
The two reasons a run waits for a builder, "waits for a builder slot" and "no builder on the crew", now live in one new module, `src/crew/words.ts`, as `WAITS_FOR_BUILDER_SLOT` and `NO_BUILDER_ON_CREW`. No module in `src/crew` owned this concept before, so the module is new.
shipped production is serving it deploy aa26afa
The two reasons a run waits for a builder, "waits for a builder slot" and "no builder on the crew", now live in one new module, src/crew/words.ts, as WAITS_FOR_BUILDER_SLOT and NO_BUILDER_ON_CREW. No module in src/crew owned this concept before, so the module is new.
src/crew/finishing.tsimports both constants and uses them on the twonot(…)lines.src/crew/requested.tsimports both and uses them on the twonotMoved(…)lines and on thereasonOfcomparison. That comparison was a third copy of "waits for a builder slot", typed out so the tick line could group pulls by reason.src/web/studio/shelf.ts: a comment quoted "no builder on the crew", which would have broken "grep -rnundersrc/finds only the module". I reworded it to "(the crew has no builder)". It is a comment only, so no code changes.test/crew-wait-words.test.ts(new) checks that each constant matches its original sentence word for word. It also readsfinishing.tsandrequested.tsas text: each must import from./words.ts, name both constants and contain neither sentence. Retyping a literal intofinishing.tsfailed it, as intended.
No wording changed, and the existing tests are unedited. The new test, test/finishing.test.ts and test/requested.test.ts pass, bun x tsc --noEmit is clean, and bun scripts/design-lint.ts passes for the src/web comment change. src/http/mcp.ts and src/http/api.ts are untouched.
🤖 Generated with Claude Code
Approved. The change only moves strings. Both sentences now live in src/crew/words.ts, and finishing.ts and requested.ts import them on exactly the lines the issue named, including the third copy in reasonOf. The wording is unchanged, so the why values that the page, API, MCP and terminal show are byte-for-byte the same, and the existing test/finishing.test.ts and test/requested.test.ts assertions still hold unedited.
Security: there are no new inputs, writes, outputs or dependencies, and no identity or authorization path is touched. Under src/, grep now finds the sentences only in the module. The one edit in src/web changes a comment in shelf.ts, so it has no design-system impact. The new test reads both files as text and fails if a literal is typed back in, which is what #5652 asked for. The preview at this head answers / with 200.
A small note, not blocking: words.ts is a broad name for a module that holds one concept, why a run waits for a builder. If more sentences arrive, a name like builder_waits.ts would keep it to that one concept. The issue fixed the name, so it stays as it is here.
The two reasons a run waits for a builder, "waits for a builder slot" and "no builder on the crew", now live in one new module,
src/crew/words.ts, asWAITS_FOR_BUILDER_SLOTandNO_BUILDER_ON_CREW. No module insrc/crewowned this concept before, so the module is new.src/crew/finishing.tsimports both constants and uses them on the twonot(…)lines.src/crew/requested.tsimports both and uses them on the twonotMoved(…)lines and on thereasonOfcomparison. That comparison was a third copy of "waits for a builder slot", typed out so the tick line could group pulls by reason.src/web/studio/shelf.ts: a comment quoted "no builder on the crew", which would have broken "grep -rnundersrc/finds only the module". I reworded it to "(the crew has no builder)". It is a comment only, so no code changes.test/crew-wait-words.test.ts(new) checks that each constant matches its original sentence word for word. It also readsfinishing.tsandrequested.tsas text: each must import from./words.ts, name both constants and contain neither sentence. Retyping a literal intofinishing.tsfailed it, as intended.No wording changed, and the existing tests are unedited. The new test,
test/finishing.test.tsandtest/requested.test.tspass,bun x tsc --noEmitis clean, andbun scripts/design-lint.tspasses for thesrc/webcomment change.src/http/mcp.tsandsrc/http/api.tsare untouched.🤖 Generated with Claude Code
Closes #5652