Skip to content

CI health and refusal baseline

node ~/.claude/scripts/fleet/ci-health.js report turns “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.)

Terminal window
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.

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.
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.

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.