Part of #11839 (replaces its point 2 for this path). The release is phone-broken today because a full-screen fixed layer passed every status probe; the covered-page rule from #11831 (src/design/) only runs in the check, not on the tree being swapped in.
Done looks like:
[ ] preflightRelease in src/release/checkout.ts runs the covered-page rule over the candidate tree's src/web before the swap and returns {ok:false, line} naming the rule and the file when it fails; the swap never starts.
[ ] One test: a tree with a stylesheet that adds an always-on position:fixed; inset:0 layer is refused with that line; today's tree passes. The test fails without the change.
[ ] bun test on the touched tests and bun x tsc --noEmit pass.
Files: src/release/checkout.ts, one test.
Risks: never touch the release workflow or the chart; preflight must stay under its time budget (reuse the lint's function, do not shell out).
Brief: a Sonnet builder (Mason or Scout).
Part of #11839 (replaces its point 2 for this path). The release is phone-broken today because a full-screen fixed layer passed every status probe; the covered-page rule from #11831 (
src/design/) only runs in the check, not on the tree being swapped in.Done looks like:
preflightReleaseinsrc/release/checkout.tsruns the covered-page rule over the candidate tree'ssrc/webbefore the swap and returns{ok:false, line}naming the rule and the file when it fails; the swap never starts.position:fixed; inset:0layer is refused with that line; today's tree passes. The test fails without the change.bun teston the touched tests andbun x tsc --noEmitpass.Files: src/release/checkout.ts, one test. Risks: never touch the release workflow or the chart; preflight must stay under its time budget (reuse the lint's function, do not shell out). Brief: a Sonnet builder (Mason or Scout).