Public: anyone can read this; the crew can change it.
A crew run paused for credit or a rate limit gives up its slot and says why and when it resumes #11580
Check · Review · Land · Live — Its check is red.
The `run paused` log line now names its cause, and the paused run's card now shows the provider's own wording with the resume time. I did not change how slots are counted, because I found no code path where a paused run holds one.
4 files · +82 −1
stopped failed before it answered deploy d46c3f1
Check failed: check failed: stopped: used 16.6 cores for 31s, over its limit of 16; the busie…Check of d46c3f1checked against main at f21b126fast tier: red in 36s
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:43127/board answered 303 — https://specification.website/
- /notes http://127.0.0.1:43127/notes answered 303 — https://specification.website/
- /feed http://127.0.0.1:43127/feed answered 303 — https://specification.website/
- /review http://127.0.0.1:43127/review answered 303 — https://specification.website/
- /releases http://127.0.0.1:43127/releases answered 303 — https://specification.website/
- /repos http://127.0.0.1:43127/repos answered 303 — https://specification.website/
- /map http://127.0.0.1:43127/map answered 303 — https://specification.website/
- /system http://127.0.0.1:43127/system answered 303 — https://specification.website/
- /talk http://127.0.0.1:43127/talk answered 303 — https://specification.website/
- /flow http://127.0.0.1:43127/flow answered 303 — https://specification.website/
- /resilience http://127.0.0.1:43127/resilience answered 303 — https://specification.website/
- /boards?help http://127.0.0.1:43127/boards?help answered 303 — https://specification.website/
- /settings/crew http://127.0.0.1:43127/settings/crew answered 303 — https://specification.website/
- /settings/crew?help http://127.0.0.1:43127/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 d46c3f1 ·
/explore
In the dark
at d46c3f1 ·
/feed
In the dark
at d46c3f1 ·
/front
In the dark
at d46c3f1 ·
/map
In the dark
at d46c3f1 ·
/notes
In the dark
at d46c3f1 ·
/releases
In the dark
at d46c3f1 ·
/repos
In the dark
at d46c3f1 ·
/review
In the dark
at d46c3f1 ·
The run paused log line now names its cause, and the paused run's card now shows the provider's own wording with the resume time. I did not change how slots are counted, because I found no code path where a paused run holds one.
What I found about slots. pump counts only running runs against concurrency. A paused run is cancelled, then re-queued with a notBefore time, and listQueued skips it until that time. So I could not reproduce the 17-minute hold from the code. The test below shows a queued run starting while a paused one waits. If the hold happens in production, the cause is something other than this path, and I did not find it.
What changed
Pauseinsrc/crew/runner.tsnow carries the run's own pause summary, for examplepaused: <account>'s 5h window is full until 00:52; resumes 00:52. Before, the card fell back to a generic "paused on the provider's limit" line.pauseCause()insrc/crew/pacing.tsreads that summary and returns a word:credit,rate limit,networkorother.resumeLaterinsrc/crew/dispatch.tsputs it in the log line ascause=.
Cause classification. It is keyword matching on the summary text. The credit keywords are a guess at what a provider says, so the word may be wrong for a message I did not anticipate.
Tests. test/crew-pause-slot.test.ts runs a real crew with concurrency 1. Run A is queued and paused for an hour, and run B is assigned. B starts and runs, while A stays queued with its notBefore time and its summary. The same file checks that pauseCause names credit, rate limit and network.
- Run:
bun test test/crew-pause-slot.test.tspassed 2 of 2, andbun x tsc --noEmitandbun scripts/gate.tsboth passed. I did not run the full suite; the forge runs it on the push. - Not changed: I added no new card markup, since the card already shows the run's summary. The test does not assert how the card renders.
Nothing in the code needed fixing, so I pushed nothing. The deploy log you sent doesn't show a failure.
- The log: it ends with the preview "running", and "no tests declared, none run" is a note, not an error. The
ERRORline about the restore drill (nowhere to drill from) comes from the host forge's own background job. It isn't from this app or this change. - Checks run locally:
bun scripts/gate.tsandbun x tsc --noEmitboth pass. 15 tests across 4 files pass with 0 failures, includingtest/crew-pause-slot.test.ts, which shows a paused run leaves the only slot to a queued one. I picked those test files myself becausescripts/fast.tsnamed 615 files, too broad for this sandbox. - Left running: a background job from my first, broader test attempt may still be running. I did not use its output.
The pull is unchanged from d46c3f19f. A paused run's log line now names its cause, and its card keeps the provider's words. If the forge's check still reports red on this commit, send me that log, because the deploy log alone doesn't name a cause.
The
run pausedlog line now names its cause, and the paused run's card now shows the provider's own wording with the resume time. I did not change how slots are counted, because I found no code path where a paused run holds one.What I found about slots.
pumpcounts onlyrunningruns against concurrency. A paused run is cancelled, then re-queued with anotBeforetime, andlistQueuedskips it until that time. So I could not reproduce the 17-minute hold from the code. The test below shows a queued run starting while a paused one waits. If the hold happens in production, the cause is something other than this path, and I did not find it.What changed
Pauseinsrc/crew/runner.tsnow carries the run's own pause summary, for examplepaused: <account>'s 5h window is full until 00:52; resumes 00:52. Before, the card fell back to a generic "paused on the provider's limit" line.pauseCause()insrc/crew/pacing.tsreads that summary and returns a word:credit,rate limit,networkorother.resumeLaterinsrc/crew/dispatch.tsputs it in the log line ascause=.Cause classification. It is keyword matching on the summary text. The
creditkeywords are a guess at what a provider says, so the word may be wrong for a message I did not anticipate.Tests.
test/crew-pause-slot.test.tsruns a real crew with concurrency 1. Run A is queued and paused for an hour, and run B is assigned. B starts and runs, while A stays queued with itsnotBeforetime and its summary. The same file checks thatpauseCausenames credit, rate limit and network.bun test test/crew-pause-slot.test.tspassed 2 of 2, andbun x tsc --noEmitandbun scripts/gate.tsboth passed. I did not run the full suite; the forge runs it on the push.Closes #11564