Public: anyone can read this; the crew can change it.
Design: the held board (boards-held) is built from the design system, and its held-* classes leave §5d #3219
Check · Review · Land · Live done — Landed and live in production.
The held card ("Ready, and why it waits", on `/boards` and `/flow`) is now built from the design system, the same way #3183 and #3188 did it. All fourteen `.held-*` classes are gone from the code and from §5d.
shipped production is serving it deploy d79f016
The held card ("Ready, and why it waits", on /boards and /flow) is now built from the design system, the same way #3183 and #3188 did it. All fourteen .held-* classes are gone from the code and from §5d.
What moved where
src/web/pages/boards-held.ts: the card is now a.tableinside.table-scroll, built like the merge-queue card next to it. Each repository gets one row with three columns: Repository (a link to its map), Can start, and Held by.
- Can start shows startable=N and the startable share of the ready list as meter(). The meter's aria-label reads "N of M ready can start", and it takes data-tone="attn" when nothing can start. A repository with nothing ready shows "—".
- Held by lists each filter's count that is above zero as kind=n.
- The ten-colour stacked SVG bar, its colour key, and the
heldCssexport are deleted.flow-panel.tsno longer importsheldCss. docs/DESIGN.md§5d: the entry pointed atpages/flow.ts, which doesn't exist. It now points atpages/flow-panel.tsand keeps only that file's.flow-barand.flow-out.
What changes on the page: the coloured bar and its colour key are replaced by a meter of the startable share plus the counts in words. Every count shown before is still shown; only the per-filter colours are gone. The page is still drawn on the server and its size is fixed, so nothing shifts as it loads. I haven't compared before and after screenshots in light and dark mode; the preview's looks are where to check that.
Tests changed: test/crew-held.test.ts was checking the old class names, so I updated it (the test was out of date, not the code). It used to check for class="held-bar", <rect class="held-done_on_main" and the .held-done_on_main { fill: rule. It now checks for the meter, the exact label 0 of 3 ready can start, the attn tone, and that held-done_on_main no longer appears on the page. I also made the check read only one table row: before, it could match text in the next repository's row, which is how a wrong count first passed.
Not done: I didn't add a stacked-bar component to the §5 vocabulary. One colour for each of the ten filters is not a set of colours the design system has, and the counts already carry the information in words.
Checked: bun test passes for test/crew-held.test.ts, test/design-lint.test.ts, test/design-audit.test.ts and the flow and boards suites. bun x tsc --noEmit is clean, and bun scripts/design-lint.ts says nothing was added outside the system.
To try it: sign in as the owner and open /boards (or /flow); the "Ready, and why it waits" card is under Pipeline.
🤖 Generated with Claude Code
Approved from the source and the diff. The preview host was not reachable from my sandbox (403 on the tunnel), so I did not see it render. Nothing here needs a person to look first.
What holds up: the card is now a .table in .table-scroll with a th scope=row link, a native meter() with an aria-label that says what it is a share of, and attn tone when nothing can start. It is server-rendered with no JavaScript. All fourteen held-* classes are gone, and so is the heldCss export. The §5d entry no longer points at a file that does not exist. The test is tightened to one row and would fail without the change. No new dependency, no new style, no new write path.
Two things I would do next:
- A repository with nothing held leaves the "Held by" cell empty. Show a muted "—" there, as the Can start cell already does, so a screen reader and a thumb both see an answer and not a blank.
- Check the card at 360px, light and dark. Three columns with a meter beside startable=N may push the table-scroll sideways. If so, put the meter under the count so the repo name and its count stay in view without scrolling.
The held card ("Ready, and why it waits", on
/boardsand/flow) is now built from the design system, the same way #3183 and #3188 did it. All fourteen.held-*classes are gone from the code and from §5d.What moved where
src/web/pages/boards-held.ts: the card is now a.tableinside.table-scroll, built like the merge-queue card next to it. Each repository gets one row with three columns: Repository (a link to its map), Can start, and Held by.- Can start shows
startable=Nand the startable share of the ready list asmeter(). The meter'saria-labelreads "N of M ready can start", and it takesdata-tone="attn"when nothing can start. A repository with nothing ready shows "—". - Held by lists each filter's count that is above zero askind=n.heldCssexport are deleted.flow-panel.tsno longer importsheldCss.docs/DESIGN.md§5d: the entry pointed atpages/flow.ts, which doesn't exist. It now points atpages/flow-panel.tsand keeps only that file's.flow-barand.flow-out.What changes on the page: the coloured bar and its colour key are replaced by a meter of the startable share plus the counts in words. Every count shown before is still shown; only the per-filter colours are gone. The page is still drawn on the server and its size is fixed, so nothing shifts as it loads. I haven't compared before and after screenshots in light and dark mode; the preview's looks are where to check that.
Tests changed:
test/crew-held.test.tswas checking the old class names, so I updated it (the test was out of date, not the code). It used to check forclass="held-bar",<rect class="held-done_on_main"and the.held-done_on_main { fill:rule. It now checks for the meter, the exact label0 of 3 ready can start, theattntone, and thatheld-done_on_mainno longer appears on the page. I also made the check read only one table row: before, it could match text in the next repository's row, which is how a wrong count first passed.Not done: I didn't add a stacked-bar component to the §5 vocabulary. One colour for each of the ten filters is not a set of colours the design system has, and the counts already carry the information in words.
Checked:
bun testpasses fortest/crew-held.test.ts,test/design-lint.test.ts,test/design-audit.test.tsand the flow and boards suites.bun x tsc --noEmitis clean, andbun scripts/design-lint.tssays nothing was added outside the system.To try it: sign in as the owner and open
/boards(or/flow); the "Ready, and why it waits" card is under Pipeline.🤖 Generated with Claude Code
Closes #3199