Skip to content

Build master @ bc50cd5bunreleased — 31 commits past v1.282.0Last reviewed Last changed Grade fresh (aging >90d, stale >180d)Source / History

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

Command ​

bash
node ~/.claude/scripts/fleet/ci-health.js report [--repo owner/name] [--days 7] [--branch master] [--now ISO] [--json]
FlagDefaultMeaning
--repothis checkout's originThe GitHub repo to read.
--days7Window length, ending at --now.
--branchall branchesOnly runs on this branch.
--nowthe clockEnd of the window (for reproducing a past report).
--jsonoffThe 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 ​

FieldDefinition
success / failure / cancelledCompleted runs by conclusion. in_progress runs are counted apart.
cancelled_supersededA 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_otherAny other cancellation (manual, timeout).
failure_ratefailure / (success + failure). Cancellations are never failures or waste.
queue_sPer job: started_at − created_at, median and p95 (nearest-rank). A run's wall clock hides queue time.
wall_sPer run: createdAt → updatedAt, median and p95.
refusalsLines 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 ​

WhenSourceCIDocsNotes
Scoping of #2743observed by hand60 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, masterobserved by hand5 success / 31 failure / 20 cancelled of 5620 / 9 / 15 of 44check-and-test took 917 s in run 36104262256.
7 days to 2026-09-29, all branchesci-health.js report3 success / 41 failure / 22 cancelled of 66 (93% of finished fail); queue p95 9m39s; wall median 14m44s20 / 13 / 16 of 49 (39%); queue p95 15m19s; wall median 17m35sEvery 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 report2 success / 91 failure / 66 cancelled of 159 (98% of finished fail); queue p95 2m34s; wall median 2m38s61 / 15 / 45 of 121 (20%); queue p95 2m42s; wall median 4m17s65 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 ​

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.