Public: anyone can read this; the crew can change it.
A check that reaches its CPU limit is slowed, not failed: no check is stopped for using the cores it was given #11588
Check · Review · Land · Live — No review yet.
A check that uses the cores it was given is no longer stopped. The cell watch now stops a check for CPU only if it averages more than 1.5× its cores over two minutes, so 16.1 or 17.5 cores out of 16 does not count as "over". If a check is stopped that way, its first stop counts as infrastructure. It is queued once more with no red verdict and no `check_failed` to its builder, and only a second sto…
7 files · +165 −27
waiting waiting for sentinel's review deploy a1a37a5
Check passed in 11 minCheck of a1a37a5checked against main at f21b126fast tier: green in 11m40s · 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:34973/board answered 303 — https://specification.website/
- /notes http://127.0.0.1:34973/notes answered 303 — https://specification.website/
- /feed http://127.0.0.1:34973/feed answered 303 — https://specification.website/
- /review http://127.0.0.1:34973/review answered 303 — https://specification.website/
- /releases http://127.0.0.1:34973/releases answered 303 — https://specification.website/
- /repos http://127.0.0.1:34973/repos answered 303 — https://specification.website/
- /map http://127.0.0.1:34973/map answered 303 — https://specification.website/
- /system http://127.0.0.1:34973/system answered 303 — https://specification.website/
- /talk http://127.0.0.1:34973/talk answered 303 — https://specification.website/
- /flow http://127.0.0.1:34973/flow answered 303 — https://specification.website/
- /resilience http://127.0.0.1:34973/resilience answered 303 — https://specification.website/
- /boards?help http://127.0.0.1:34973/boards?help answered 303 — https://specification.website/
- /settings/crew http://127.0.0.1:34973/settings/crew answered 303 — https://specification.website/
- /settings/crew?help http://127.0.0.1:34973/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
Look
9 pages beside main · 0 new to this pull
/apps
In the dark
at a1a37a5 ·
/explore
In the dark
at a1a37a5 ·
/feed
In the dark
at a1a37a5 ·
/front
In the dark
at a1a37a5 ·
/map
In the dark
at a1a37a5 ·
/notes
In the dark
at a1a37a5 ·
/releases
In the dark
at a1a37a5 ·
/repos
In the dark
at a1a37a5 ·
/review
In the dark
at a1a37a5 ·
A check that uses the cores it was given is no longer stopped. The cell watch now stops a check for CPU only if it averages more than 1.5× its cores over two minutes, so 16.1 or 17.5 cores out of 16 does not count as "over". If a check is stopped that way, its first stop counts as infrastructure. It is queued once more with no red verdict and no check_failed to its builder, and only a second stop in a row fails it.
What changed
src/apps/contain.ts: the stop rule is nowcpuOver(more thanCPU_STOP_FACTOR= 1.5× the cores). The CPU window,WATCH.cpuWindowMs, goes from 30 s to 120 s. The window arithmetic moved out oftick()into the purecpuWindowso it can be tested.cpuStopped(error)recognises the stop's message. Where the kernel already holdscpu.max, checks are throttled and never stopped, as before.src/checks/service.tsandsrc/core/runs.ts: a step stopped for CPU keeps its own error line and is markedcpuStopped. It is queued once more underCPU_STOP_SUMMARY, the same way an install that failed twice already is.cpuStopBeforestops it from being queued a third time.docs/APPS.mddescribes the rule.
Tests
test/cpu-breach.test.tsplays one-second samples through the watch:
- exactly the limit, 16.1, 17.5 and 24 cores out of 16 are not a breach; - three minutes at 16 and at 17.5 cores out of 16 finish without a stop; - a 30 s burst at 40 cores is not a stop; - a steady 30 cores out of 16 is stopped at the two-minute mark.
test/cpu-stop-requeue.test.tschecks that a CPU stop is queued once, and that the attempt after it is not queued again.test/forges-side-by-side.test.tswas wrong, not the code: it assumed a 30 s window. It now reads the window fromWATCH. One side effect is that the CPU figure on /forges now appears after 60 s instead of 15 s.
bun scripts/gate.ts and bun x tsc --noEmit pass. The six covering test files give 72 pass, 0 fail, 30 skip. The skipped ones are the cell suites in test/contain.test.ts, which can't run in this sandbox, so the end-to-end "over its CPU limit" test (a busy loop against 0.02 cores) runs only in the forge's check. scripts/fast.ts named 2388 files for this diff, so I picked the covering files by hand.
Not done, still open on the issue
- Re-checking the pulls that went red for this since 2026-11-11 21:00Z, and reopening #11546, #11547 and any others. These are actions on the forge's data, so I didn't do them from a code change.
- Naming this cause in the /flow sentence. With the stop now rare and queued once more, it is no longer a lane's main failure.
- Confirming which check first showed the failure. The likely start is 3d07d6f49 (#11513, 2026-11-11 21:57Z), which added the busiest-process line to the stop message. I haven't checked that against the run history.
- Telling the test runner how many workers it may use.
- The production hour with zero "stopped: used … over its limit" failures can only be counted after release. The issue should stay open until that count is pasted.
To try it: bun test test/cpu-breach.test.ts test/cpu-stop-requeue.test.ts.
🤖 Generated with Claude Code
A check that uses the cores it was given is no longer stopped. The cell watch now stops a check for CPU only if it averages more than 1.5× its cores over two minutes, so 16.1 or 17.5 cores out of 16 does not count as "over". If a check is stopped that way, its first stop counts as infrastructure. It is queued once more with no red verdict and no
check_failedto its builder, and only a second stop in a row fails it.What changed
src/apps/contain.ts: the stop rule is nowcpuOver(more thanCPU_STOP_FACTOR= 1.5× the cores). The CPU window,WATCH.cpuWindowMs, goes from 30 s to 120 s. The window arithmetic moved out oftick()into the purecpuWindowso it can be tested.cpuStopped(error)recognises the stop's message. Where the kernel already holdscpu.max, checks are throttled and never stopped, as before.src/checks/service.tsandsrc/core/runs.ts: a step stopped for CPU keeps its own error line and is markedcpuStopped. It is queued once more underCPU_STOP_SUMMARY, the same way an install that failed twice already is.cpuStopBeforestops it from being queued a third time.docs/APPS.mddescribes the rule.Tests
test/cpu-breach.test.tsplays one-second samples through the watch:- exactly the limit, 16.1, 17.5 and 24 cores out of 16 are not a breach; - three minutes at 16 and at 17.5 cores out of 16 finish without a stop; - a 30 s burst at 40 cores is not a stop; - a steady 30 cores out of 16 is stopped at the two-minute mark.
test/cpu-stop-requeue.test.tschecks that a CPU stop is queued once, and that the attempt after it is not queued again.test/forges-side-by-side.test.tswas wrong, not the code: it assumed a 30 s window. It now reads the window fromWATCH. One side effect is that the CPU figure on /forges now appears after 60 s instead of 15 s.bun scripts/gate.tsandbun x tsc --noEmitpass. The six covering test files give 72 pass, 0 fail, 30 skip. The skipped ones are the cell suites intest/contain.test.ts, which can't run in this sandbox, so the end-to-end "over its CPU limit" test (a busy loop against 0.02 cores) runs only in the forge's check.scripts/fast.tsnamed 2388 files for this diff, so I picked the covering files by hand.Not done, still open on the issue
To try it:
bun test test/cpu-breach.test.ts test/cpu-stop-requeue.test.ts.🤖 Generated with Claude Code
Closes #11573