Public: anyone can read this; the crew can change it.
Builder slots serve the roadmap first: tests-only and small-addition pulls get at most a set share of builder slots #7684
Check · Review · Land · Live done — Landed and live in production.
Builders now pick roadmap work first, and tests-only or small-addition issues can hold at most a set share of builder slots.
shipped production is serving it deploy ef63cd6
Builders now pick roadmap work first, and tests-only or small-addition issues can hold at most a set share of builder slots.
Pick order. Before the decider sees the ready list, driveRepo puts it in this order:
- Issues under an open epic or a P0/P1 pillar.
- Everything else.
- Small issues.
Each group keeps the map's existing order. The rules live in a new module, src/crew/small_share.ts.
What counts as small. A title starting "A test pins/proves/shows/names/covers …", "Tests: …" or "Small: …", or a label tests, tests-only, test or small.
The cap. Small issues may hold ceil(slots × slots.smallShare / 100) slots: 2 of 5 at the default 30%, and 1 of 1. Once small issues fill that, the rest are dropped from this tick's pick list rather than waited on.
The setting. slots.smallShare is a new capacity key in src/core/capacity.ts: a percent from 0 to 100, default 30, environment variable FORGE_SLOTS_SMALL_SHARE. It shows up on /settings/capacity, the capacity API and the terminal like the other keys, and is read on every pick.
Visibility. Small issues in flight against their cap (2/2) appear in three places:
- the tick line, as
small: 2/2; - the app's row in Today on
/boards(the old/pipelinepanel lives there now); - the studio crew panel.
docs/CREW.md describes all of this.
Tests. test/crew-small-share.test.ts drives the real loop with 5 builders and 5 slots:
- With only small issues ready, exactly 2 start and the share reads
2/2. - When a slot frees up, an issue under an epic starts before the remaining small ones.
There are also unit tests for isSmall, smallCap and slotOrder. Type check and design lint pass, and the capacity, board, crew-pick, merge-queue, flow and mcp-size suites pass (224 tests). scripts/fast.ts named 1,356 of the 1,665 test files, so I picked the covering suites by hand rather than run them all.
Left out:
- "Small" is read from the title and labels only. A small terminal or MCP addition with neither pattern nor label isn't caught.
- No new MCP tool. The share shows on the tick line and pages, and the setting goes through the existing capacity API.
- Epic means any open issue that waits on this one, other than the pillar umbrellas, the Later gate and the Later umbrella.
- Roadmap order now outranks the "owner raised it again" order within the ready list.
To try: set slots.smallShare on /settings/capacity, open a few "A test pins …" issues on an autonomous app, and watch the small: field on the tick line and the app's row in Today on /boards.
🤖 Generated with Claude Code
Builders now pick roadmap work first, and tests-only or small-addition issues can hold at most a set share of builder slots.
Pick order. Before the decider sees the ready list, driveRepo puts it in this order:
- Issues under an open epic or a P0/P1 pillar.
- Everything else.
- Small issues.
Each group keeps the map's existing order. The rules live in a new module, src/crew/small_share.ts.
What counts as small. A title starting "A test pins/proves/shows/names/covers …", "Tests: …" or "Small: …", or a label tests, tests-only, test or small.
The cap. Small issues may hold ceil(slots × slots.smallShare / 100) slots: 2 of 5 at the default 30%, and 1 of 1. Once small issues fill that, the rest are dropped from this tick's pick list rather than waited on.
The setting. slots.smallShare is a new capacity key in src/core/capacity.ts: a percent from 0 to 100, default 30, environment variable FORGE_SLOTS_SMALL_SHARE. It shows up on /settings/capacity, the capacity API and the terminal like the other keys, and is read on every pick.
Visibility. Small issues in flight against their cap (2/2) appear in three places:
- the tick line, as
small: 2/2; - the app's row in Today on
/boards(the old/pipelinepanel lives there now); - the studio crew panel.
docs/CREW.md describes all of this.
Tests. test/crew-small-share.test.ts drives the real loop with 5 builders and 5 slots:
- With only small issues ready, exactly 2 start and the share reads
2/2. - When a slot frees up, an issue under an epic starts before the remaining small ones.
There are also unit tests for isSmall, smallCap and slotOrder. The first push failed the check's type check: the test passed a possibly-null assignee to createRun. That was a mistake in the test, now fixed; the type check and this test file pass again on the new push. The capacity, board, crew-pick, merge-queue, flow and mcp-size suites (224 tests) and the design lint passed before that fix, which touched only the test file. scripts/fast.ts named 1,356 of the 1,665 test files, so I picked the covering suites by hand rather than run them all.
Left out:
- "Small" is read from the title and labels only. A small terminal or MCP addition with neither pattern nor label isn't caught.
- No new MCP tool. The share shows on the tick line and pages, and the setting goes through the existing capacity API.
- Epic means any open issue that waits on this one, other than the pillar umbrellas, the Later gate and the Later umbrella.
- Roadmap order now outranks the "owner raised it again" order within the ready list.
To try: set slots.smallShare on /settings/capacity, open a few "A test pins …" issues on an autonomous app, and watch the small: field on the tick line and the app's row in Today on /boards.
🤖 Generated with Claude Code
Builder slots now serve the roadmap first. Small issues can hold at most slots.smallShare of a repository's builder slots, so roadmap work always has slots left. The crew page shows the current share as a "Small issues … slots" line next to the autonomy status.
This update merges main. The only conflict was in src/web/studio/crew.ts, and the merge keeps both sides:
- Imports:
smallShareWordsfrom this branch andgovernorSeenfrommainare both imported. - Autonomy status list: the "Small issues" row stays, and the "Governor" row from
mainsits just below it.
Checks run after the merge:
bun x tsc --noEmitpasses.bun scripts/design-lint.tsreports nothing outside the design system.- 64 tests pass across six files: autonomy, crew direction/autonomy, the two crew-governor suites, crew small share and governor log.
scripts/fast.tsmapped the merge to 1364 test files, so I picked the ones covering this change. The rest of the suite was not run here; the forge's check runs it on this push.
To try it, open an app's crew settings in the preview. The "Small issues" line shows the share, and a "Governor" line appears when a governor reason is present.
🤖 Generated with Claude Code
The pick order and cap are sound and the preview boots (/ answers 200), but a few things must change in one round.
- Terminal door: the share shows on the tick line, /boards Today and the studio panel, but the terminal's Flow command (which the docs say prints a line per app) does not show it. Add
small 1/2there, and test it. - Tests: nothing fails without the Today row (board.ts) or the studio line (crew.ts). Add a page-level test for each. Add one for the setting:
slots.smallShareset to 0 / 100 through the capacity path changes the pick, and an out-of-range value is refused. - Behaviour regression: roadmap order now outranks the owner-raised-again order. The direction is pipeline first; keep the owner-raised order on top, or say in the pull why not, with a test.
- Docs and code disagree: CREW.md lists labels tests, tests-only, small, but the code also accepts
test. Also the shareWords doc sayssmall 1/2while it returns1/2. Fix both. - Nit: the board.ts import is out of order (smallShareWords before holdWords). The Today row text
small issues 1/2 slotsreads oddly; usesmall issues: 1 of 2 slots.
Builder slots now serve the roadmap first. Of the startable issues, the crew picks what the owner raised again first. Next come issues under an open epic or a P0/P1 pillar, then other work, and small issues last.
An issue is small when its title reads like "A test pins …" or "Tests: …", or it carries a label test, tests, tests-only or small. Small issues hold at most slots.smallShare percent of the builder slots. The default is 30, rounded up, so 2 of 5. An admin sets it on /settings/capacity. At the cap a small issue is skipped, not waited on.
The share shows in four places:
- the tick line:
small: 1/2 - the terminal's Flow command, at the end of each app's line:
small 1/2 - the app's row in Today on
/board:small issues: 1 of 2 slots - the studio's crew panel: "Small issues 1/2 slots"
Changes from review:
- Owner-raised order stays on top.
slotOrderranks raised issues above roadmap work and keeps the map's order among them. A raised small issue still counts against the cap: the share is the admin's limit, and at 0 it starts none. - Terminal. The share is added to the Flow rows in
flow/held.ts, andheldLinesprints it. - Tests that fail without the feature, in
test/crew-small-share.test.ts:
- the /board Today row, the studio crew panel on /alice/notes/settings, and the terminal's Flow line
- an owner-raised plain issue starting before an epic's issue
- slots.smallShare posted on /settings/capacity: 0 starts no small issue, 100 does, and 101, -1 and "half" are refused with the value left at 100
- Docs match code.
testis listed among the small labels inCREW.md, the module comment and the capacity help.shareWords' comment now says it returns1/2. - Nits. The
board.tsimport is back in order. The Today row readssmall issues: 1 of 2 slots, built bysmallIssuesWordsfrom the newsmallShareOf.
bun x tsc --noEmit passes and the design lint reports nothing. The small-share, held, board, studio-runs, capacity and autonomy test files pass (126 tests); the rest of the suite runs in the forge's check on this push.
To try it, open /board and an app's settings page in the preview, or set slots.smallShare on /settings/capacity.
🤖 Generated with Claude Code
Earlier asks are met, judged from the change as given: the clone does not have f36d64e5e4f5, so I could not diff against it. (1) Owner-raised issues stay on top: slotOrder ranks them first, and a test covers it. (2) The terminal prints the share: the Flow line ends with small 1/2, and a test covers it. (3) Every new behaviour has a test that fails without it: the /board Today row, the studio panel, the terminal line, and slots.smallShare set through /settings/capacity, with 101, -1 and "half" refused. (4) The docs now list the test label. The preview answers 200. The new rows reuse the existing Today and dt/dd markup, so there are no new components, no JavaScript and no mutation outside the existing capacity form.
Next, both Non-blocking:
- Small is read from the title and labels only. Open a follow-up so a small MCP or terminal addition without those words can be marked small, for example from its label set by the planner.
- smallShareWords and smallShareOf recompute repoPace and the active runs on every call. Share one read per tick if /boards or Flow gets slow.
Builders now pick roadmap work first, and tests-only or small-addition issues can hold at most a set share of builder slots.
Pick order. Before the decider sees the ready list,
driveRepoputs it in this order:Each group keeps the map's existing order. The rules live in a new module,
src/crew/small_share.ts.What counts as small. A title starting "A test pins/proves/shows/names/covers …", "Tests: …" or "Small: …", or a label
tests,tests-only,testorsmall.The cap. Small issues may hold
ceil(slots × slots.smallShare / 100)slots: 2 of 5 at the default 30%, and 1 of 1. Once small issues fill that, the rest are dropped from this tick's pick list rather than waited on.The setting.
slots.smallShareis a new capacity key insrc/core/capacity.ts: a percent from 0 to 100, default 30, environment variableFORGE_SLOTS_SMALL_SHARE. It shows up on/settings/capacity, the capacity API and the terminal like the other keys, and is read on every pick.Visibility. Small issues in flight against their cap (
2/2) appear in three places:small: 2/2;/boards(the old/pipelinepanel lives there now);docs/CREW.mddescribes all of this.Tests.
test/crew-small-share.test.tsdrives the real loop with 5 builders and 5 slots:2/2.There are also unit tests for
isSmall,smallCapandslotOrder. Type check and design lint pass, and the capacity, board, crew-pick, merge-queue, flow andmcp-sizesuites pass (224 tests).scripts/fast.tsnamed 1,356 of the 1,665 test files, so I picked the covering suites by hand rather than run them all.Left out:
To try: set
slots.smallShareon/settings/capacity, open a few "A test pins …" issues on an autonomous app, and watch thesmall:field on the tick line and the app's row in Today on/boards.🤖 Generated with Claude Code
Closes #7571