What
fleet-status.yml's starvation step lists runs with status=queued and alarms when the run's created_at is 30+ minutes old. A matrix run keeps run-level status queued while any leg waits for a runner, even while its other jobs are starting and finishing normally. So a large matrix on a busy fleet reads as starved when it isn't.
Evidence: #447, the check's first real alarm
The check could only start measuring after #437 installed gh on the light runners (#436). Its first alarm was #447, "Kani on main — queued 32 min", and it was a false positive:
|
time (2026-09-17) |
Kani run 35211315805 created (push to main, 7ea22ac) |
10:35:51 |
| first job started |
10:35:54 (3 s later) |
monitor ran (schedule, run 35214076493) and alarmed |
11:07:59 |
| last of 47 jobs started |
11:22:28 |
| run completed |
11:22:37 — success |
Jobs were being picked up continuously. The fleet was busy, not starving.
Why it matters
Starvation is supposed to mean nothing is picking work up. An alarm that fires on every large Kani matrix during a busy hour trains people to ignore it, which is the failure mode the monitor was built to end (#436, #429).
Fix direction
Measure jobs, not runs, the same lesson scripts/ci-wedge-watch.rs already encodes ("run status is not job status"). A run is starving only if it has queued jobs and no job in it has started for 30+ minutes, or equivalently, if its oldest queued job has waited 30+ minutes with nothing started since. The detector's Rust tool, which already enumerates jobs, is the natural place for it.
Also: the alarm step tries --label ci, and this repo has no ci label. The fallback without a label worked (#447 has none), so either create the label or drop the flag.
Planned under SWREQ-RELAY-CIFLOW-P01 (v1.142), which covers "required gates / monitors not decided by runner luck". Refs #436, #447.
🤖 Generated with Claude Code
What
fleet-status.yml's starvation step lists runs withstatus=queuedand alarms when the run'screated_atis 30+ minutes old. A matrix run keeps run-level statusqueuedwhile any leg waits for a runner, even while its other jobs are starting and finishing normally. So a large matrix on a busy fleet reads as starved when it isn't.Evidence: #447, the check's first real alarm
The check could only start measuring after #437 installed
ghon thelightrunners (#436). Its first alarm was #447, "Kanionmain— queued 32 min", and it was a false positive:35211315805created (push to main,7ea22ac)35214076493) and alarmedJobs were being picked up continuously. The fleet was busy, not starving.
Why it matters
Starvation is supposed to mean nothing is picking work up. An alarm that fires on every large Kani matrix during a busy hour trains people to ignore it, which is the failure mode the monitor was built to end (#436, #429).
Fix direction
Measure jobs, not runs, the same lesson
scripts/ci-wedge-watch.rsalready encodes ("run status is not job status"). A run is starving only if it has queued jobs and no job in it has started for 30+ minutes, or equivalently, if its oldest queued job has waited 30+ minutes with nothing started since. The detector's Rust tool, which already enumerates jobs, is the natural place for it.Also: the alarm step tries
--label ci, and this repo has nocilabel. The fallback without a label worked (#447 has none), so either create the label or drop the flag.Planned under SWREQ-RELAY-CIFLOW-P01 (v1.142), which covers "required gates / monitors not decided by runner luck". Refs #436, #447.
🤖 Generated with Claude Code