• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

Freegle / Iznik / 22239
71%

Build:
DEFAULT BRANCH: master
Ran 18 Jun 2026 09:09PM UTC
Jobs 4
Files 1289
Run time 2min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

18 Jun 2026 08:43PM UTC coverage: 70.831% (+0.004%) from 70.827%
22239

push

circleci

web-flow
fix(ci): reap zombie-pinned runner VMs (stuck-'running' workflow fallback) (#807)

A stuck/orphaned CircleCI workflow stays in 'running' state indefinitely
(observed 18h+ on PR #789: pipeline 7925's build-test-katapult never
reported a terminal status). The reaper checked pipeline_is_running()
FIRST and bailed (`continue`), so the VM named after that pipeline was
pinned — and billed on an expensive ROCK-48 package — forever.

Add a zombie fallback that runs before the age/pipeline checks and keys on
the runner's connection, which is the ground truth: a runner executing a
task (or idle in the pool) heartbeats continuously, so a last_connected
older than ZOMBIE_RUNNER_IDLE_SECONDS (1h) means the runner process is dead
and nothing is running — regardless of what the workflow status claims.
Such a VM is reaped even if its pipeline is wedged in 'running', and even
below MIN_AGE (the stale-heartbeat requirement makes that safe).

Safety:
- runner_is_zombie_idle() fires only on POSITIVE evidence (a real but stale
  last_connected); a booting/not-yet-dispatched runner (no entry) or a
  missing inventory both return false, so a VM waiting to start its job is
  never reaped.
- 1h threshold is 3x the busiest idle heartbeat gap observed on live healthy
  VMs (0-21min), so a quiet test phase or CPU-starvation blip can't trip it.
- Runner inventory now keeps the FRESHEST last_connected per name: a single
  live registration protects a VM even if CircleCI briefly lists a stale
  duplicate alongside it (this path no longer has pipeline_is_running as a
  backstop, so the de-dupe matters).

Validated by repeated --dry-run against live Katapult+CircleCI: zero healthy
VMs flagged at 3600s; the zombie branch fires and logs correctly when the
threshold is lowered.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>

11012 of 14630 branches covered (75.27%)

Branch coverage included in aggregate %.

119016 of 168945 relevant lines covered (70.45%)

36.26 hits per line

Coverage Regressions

Lines Coverage ∆ File
95
86.54
0.05% iznik-server-go/message/message.go
14
92.24
0.05% iznik-nuxt3/modtools/components/ModLog.vue
1
95.9
0.04% iznik-nuxt3/modtools/components/ModSettingsModConfig.vue
Jobs
ID Job ID Ran Files Coverage
22239 go - 22239 18 Jun 2026 09:09PM UTC 136
83.01
CircleCI Job 22239
22239 laravel - 22239 18 Jun 2026 09:09PM UTC 447
67.44
CircleCI Job 22239
22239 playwright - 22239 18 Jun 2026 09:09PM UTC 71
22.82
CircleCI Job 22239
22239 vitest - 22239 18 Jun 2026 09:09PM UTC 705
68.71
CircleCI Job 22239
Source Files on build 22239
  • Tree
  • List 1289
  • Changed 7
  • Source Changed 0
  • Coverage Changed 7
Coverage ∆ File Lines Relevant Covered Missed Hits/Line Branch Hits Branch Misses
  • Back to Repo
  • CircleCI Build #22239
  • b19806f2 on github
  • Prev Build on master (#22151)
  • Next Build on master (#22301)
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc