Public: anyone can read this; the crew can change it.
A release whose tree covers the page is refused before the swap, and the tick names the rule #11921
Check · Review · Land · Live — Its check is running.
Before a release is swapped in, `preflightRelease` (in `src/release/checkout.ts`) now runs the covered-page rule from #11831 over the new tree's `src/web`. If the rule fails, preflight returns `{ok:false}` with one line naming the rule, the file and the selector, for example `preflight refused: covered-page rule (#11831): src/web/style/layer.ts:2 .sheet { display: block }`. The swap never starts,…
4 files · +167 −82
working checking now deploy 983ae0e
Check running · 11 min · 3549 passed, 0 failedCheck of 983ae0echecked against main at 9c9f483fast tier: running · full gate runs on land
Website spec: 23 findings (report only)
- / <a href="/admin-ada0/admin/app/production/open"> has no accessible name — names
- / <a href="/bad-name-12dd/bad-name/app/production/open"> has no accessible name — names
- /front <a href="/admin-ada0/admin/app/production/open"> has no accessible name — names
- /front <a href="/bad-name-12dd/bad-name/app/production/open"> has no accessible name — names
- /board http://127.0.0.1:46663/board answered 303 — https://specification.website/
- /notes http://127.0.0.1:46663/notes answered 303 — https://specification.website/
- /feed http://127.0.0.1:46663/feed answered 303 — https://specification.website/
- /review http://127.0.0.1:46663/review answered 303 — https://specification.website/
- /releases http://127.0.0.1:46663/releases answered 303 — https://specification.website/
- /repos http://127.0.0.1:46663/repos answered 303 — https://specification.website/
- /map http://127.0.0.1:46663/map answered 303 — https://specification.website/
- /system http://127.0.0.1:46663/system answered 303 — https://specification.website/
- /talk http://127.0.0.1:46663/talk answered 303 — https://specification.website/
- /flow http://127.0.0.1:46663/flow answered 303 — https://specification.website/
- /resilience http://127.0.0.1:46663/resilience answered 303 — https://specification.website/
- /boards?help http://127.0.0.1:46663/boards?help answered 303 — https://specification.website/
- /settings/crew http://127.0.0.1:46663/settings/crew answered 303 — https://specification.website/
- /settings/crew?help http://127.0.0.1:46663/settings/crew?help answered 303 — https://specification.website/
- /preview-admin/sample expected exactly one <h1>, found 2 — headings
- /preview-admin/sample/next expected exactly one <h1>, found 2 — headings
- /preview-admin/sample/bets expected exactly one <h1>, found 2 — headings
- /preview-admin/sample/waves expected exactly one <h1>, found 2 — headings
- /preview-admin/sample/milestones expected exactly one <h1>, found 2 — headings
Before a release is swapped in, preflightRelease (in src/release/checkout.ts) now runs the covered-page rule from #11831 over the new tree's src/web. If the rule fails, preflight returns {ok:false} with one line naming the rule, the file and the selector, for example preflight refused: covered-page rule (#11831): src/web/style/layer.ts:2 .sheet { display: block }. The swap never starts, and neither does the tree's own --preflight.
- Rule moved: the overlay rule and its two helpers,
sourceFilesandcssBlocksAt, now live insrc/design/overlay.tsinstead ofscripts/design-lint.ts. That way the running forge calls the same function in its own process, with no shelling out and no import fromscripts/. The lint imports and re-exports them, so the lint and its tests behave as before. - New function:
coveredPage(dir)is the check on its own. If the tree has nosrc/webit passes, so a tree without a web folder is not refused. - Test:
test/release-preflight-covered.test.tscovers three cases:
- A stand-in tree whose stylesheet adds an always-on .sheet { display: block; position: fixed; inset: 0 } inside a phone media query is refused with the rule and the file, and the tree's own preflight never runs.
- The same layer written as .sheet[open] passes, and the tree's own preflight does run.
- Today's tree passes.
Without the change the test fails, because coveredPage doesn't exist.
Look at: the rule only flags selectors that can match a closed dialog, popover or [hidden] element. A plain fixed full-screen class is allowed, as it already is in the lint; today's .space { position: fixed; inset: 0 } in src/web/space_client.ts is one. I did not widen the rule. The release workflow and the chart are untouched.
Checks run: bun x tsc --noEmit, bun scripts/gate.ts and bun scripts/design-lint.ts pass. scripts/fast.ts said the diff was too broad to pick tests because it touches scripts/design-lint.ts. So I ran the 17 test files that import the lint, src/release/checkout.ts or the scan map: 171 pass, 0 fail.
🤖 Generated with Claude Code
Before a release is swapped in,
preflightRelease(insrc/release/checkout.ts) now runs the covered-page rule from #11831 over the new tree'ssrc/web. If the rule fails, preflight returns{ok:false}with one line naming the rule, the file and the selector, for examplepreflight refused: covered-page rule (#11831): src/web/style/layer.ts:2 .sheet { display: block }. The swap never starts, and neither does the tree's own--preflight.sourceFilesandcssBlocksAt, now live insrc/design/overlay.tsinstead ofscripts/design-lint.ts. That way the running forge calls the same function in its own process, with no shelling out and no import fromscripts/. The lint imports and re-exports them, so the lint and its tests behave as before.coveredPage(dir)is the check on its own. If the tree has nosrc/webit passes, so a tree without a web folder is not refused.test/release-preflight-covered.test.tscovers three cases:- A stand-in tree whose stylesheet adds an always-on
.sheet { display: block; position: fixed; inset: 0 }inside a phone media query is refused with the rule and the file, and the tree's own preflight never runs. - The same layer written as.sheet[open]passes, and the tree's own preflight does run. - Today's tree passes.Without the change the test fails, because
coveredPagedoesn't exist.Look at: the rule only flags selectors that can match a closed dialog, popover or
[hidden]element. A plain fixed full-screen class is allowed, as it already is in the lint; today's.space { position: fixed; inset: 0 }insrc/web/space_client.tsis one. I did not widen the rule. The release workflow and the chart are untouched.Checks run:
bun x tsc --noEmit,bun scripts/gate.tsandbun scripts/design-lint.tspass.scripts/fast.tssaid the diff was too broad to pick tests because it touchesscripts/design-lint.ts. So I ran the 17 test files that import the lint,src/release/checkout.tsor the scan map: 171 pass, 0 fail.🤖 Generated with Claude Code
Closes #11916