CI health and refusal baseline
CI health and refusal baseline
Section titled “CI health and refusal baseline”
node ~/.claude/scripts/fleet/ci-health.js reportturns “BoB halts” into two numbers: how CI runs end and how long they wait, and how often this machine refuses its own deploy because a Claude Code session is live. It is report-only: it changes nothing. The baselines below are what later work in #2744 is judged against. (Back to reference index.)
Command
Section titled “Command”node ~/.claude/scripts/fleet/ci-health.js report [--repo owner/name] [--days 7] [--branch master] [--now ISO] [--json]| Flag | Default | Meaning |
|---|---|---|
--repo |
this checkout’s origin |
The GitHub repo to read. |
--days |
7 |
Window length, ending at --now. |
--branch |
all branches | Only runs on this branch. |
--now |
the clock | End of the window (for reproducing a past report). |
--json |
off | The bob-ci-health/1 document. |
Exit codes: 0 report produced · 2 usage error or no repo · 3 gh unreachable (the
document carries error: {code, message, hint} and no workflows, never an empty week).
It makes one gh run list call and one jobs read per completed run in the window,
through runJobs() in scripts/fleet/ci-locus.js.
What each figure means
Section titled “What each figure means”| Field | Definition |
|---|---|
success / failure / cancelled |
Completed runs by conclusion. in_progress runs are counted apart. |
cancelled_superseded |
A cancelled run that a newer run of the same workflow on the same branch started before it finished: the cancel-in-progress concurrency groups (ci.yml, docs-deploy.yml) collapsing a burst, as designed. |
cancelled_other |
Any other cancellation (manual, timeout). |
failure_rate |
failure / (success + failure). Cancellations are never failures or waste. |
queue_s |
Per job: started_at − created_at, median and p95 (nearest-rank). A run’s wall clock hides queue time. |
wall_s |
Per run: createdAt → updatedAt, median and p95. |
refusals |
Lines in $BOB_HOME/.live-session-refusals.jsonl inside the window: count, per_day, by_caller. measured: false and count: null when the log does not exist yet. See Refusal log. |
Baselines
Section titled “Baselines”| When | Source | CI | Docs | Notes |
|---|---|---|---|---|
| Scoping of #2743 | observed by hand | 60 failures / 105 runs (57%) | 44 / 94 (47%) | Cancellations ~20%; median wall 11–12 min. Docs run 35472953062: 15m53s wall, 12m39s of it queue. |
| 2026-09-20 → 2026-09-27, master | observed by hand | 5 success / 31 failure / 20 cancelled of 56 | 20 / 9 / 15 of 44 | check-and-test took 917 s in run 36104262256. |
| 7 days to 2026-09-29, all branches | ci-health.js report |
3 success / 41 failure / 22 cancelled of 66 (93% of finished fail); queue p95 9m39s; wall median 14m44s | 20 / 13 / 16 of 49 (39%); queue p95 15m19s; wall median 17m35s | Every cancellation was superseded (burst collapse). Refusals not measured: no log before #2745 was deployed. |
| 7 days to 2026-10-09, all branches (farm-01) | ci-health.js report |
2 success / 91 failure / 66 cancelled of 159 (98% of finished fail); queue p95 2m34s; wall median 2m38s | 61 / 15 / 45 of 121 (20%); queue p95 2m42s; wall median 4m17s | 65 of 66 CI cancellations superseded. Master CI red at check-and-test (#4115). Refusals: 1 in 7 days = 0.14/day (deploy.sh), the first measured rate. |
The first two rows are hand counts made while scoping, so they are not exactly the report’s definitions: the scoping rates counted cancellations in the denominator.
Refusal collection
Section titled “Refusal collection”The refusal rate needs seven days of the log. Collection starts on a machine when it deploys the #2745 recorder; the refusals/day figure and the CI report are then posted on #2743 (AC-04 of #2745).
The first seven-day window on farm-01 closed on 2026-10-09: one refusal, 0.14/day, posted on #2743 with the CI report. Each laptop keeps its own log and is counted only on that machine.