rig forgejo-runner status says nothing about 'activating' — the one systemd state that always means a crash loop #143
Labels
No labels
attention
blocked
blocker:ci-red
blocker:conflict
blocker:drill-pending
blocker:unrequested
bug
claimed
documentation
enhancement
epic
merge-next
needs-ruling
needs-triage
offsite
post-merge
ready
release
scope:bootstrap
scope:coolify
scope:db
scope:docs
scope:drill
scope:installer
scope:labels
scope:platform
scope:runner
scope:users
stale
state:addressing
state:bots-reviewing
state:building
state:needs-human
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: heavy-duty/rig#143
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Context
rig forgejo-runner statusprints the systemd state and comments on exactly one value. From @andres's ci-box while the runner was crash-looping, 2026-08-01:That was the whole output on the subject. No note, no hint, nothing — while the unit had restarted 76 times and the runner had been Offline since install.
The gap
#133 added a liveness note, and it is gated on
active(commands/forgejo-runner-status.sh:33):That gate is correct for what it was written for — an idle-but-healthy runner is indistinguishable from a stalled one, so the note says what
activedoes not prove. But it means the one state that is never ambiguous gets no comment at all.On this unit,
activatingcan only mean a crash loop.Type=simplemarks a unit active the instant it forks, so it can only sit inactivatingasauto-restart— the daemon exited non-zero and systemd is counting downRestartSec. There is no benign reading.So the states are covered exactly backwards:
active, which is genuinely ambiguous, carries three lines of guidance;activating, which is unambiguously broken, carries none.Spec
Say the unambiguous thing where it is unambiguous.
activating, emit a note — and unlike theactiveone, this is a detected condition, so it is awarn, not alog.warnin this file means drift actually measured, which this is.journalctl -u forgejo-runner, plus the restart counter).failed, the same reasoning applies — cover it in the same pass.activenote exactly as it is: its reasoning is unchanged and its tests pin the boundary.Tasks
activatingandfailed, aswarnactivepath and itslog/no-warning semantics untouchedtest/cli.sh: drive the function onactivating,failed,active,inactive, unset — the existing extracted-function idiom already added for #133changelog.d/<n>.mdAcceptance criteria
activatingproduces a warning naming the crash loop and the journalfailedlikewiseactiveoutput is byte-unchanged, stilllog, still noWARNING:inactiveand unset still produce nothingbash test/cli.shpasses; CI'sshellcheck -xstep is cleanTest plan
Drive the extracted function across all five states. The existing #133 tests already pin
active/inactive/ unset, so this extends a harness rather than inventing one.activatingarm and its check goes red.activenote must not become awarn— that check exists and must keep passing.Dependencies
Follow-up to #133 / !134. Independent of #141 and #142, though the same ci-box incident surfaced all three: #142 is why the daemon died, #141 is why install called it a success, and this is why
statusafterwards did not say so either.@andres — filed, not fixed, per your instruction. This one is mine twice over: I wrote the note that stops short of this state.