docs(integration): name the symptom of a missing runner #1252
No reviewers
Labels
No labels
bump
major
bump
minor
bump
patch
kind/bug
kind/chore
kind/docs
kind/feature
priority/critical
priority/high
priority/low
priority/medium
size/L
size/M
size/S
size/XL
No milestone
No project
No assignees
3 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
frankenbit/release-toolkit!1252
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "i/1229-no-runner-symptom"
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?
Closes #1229. Docs only.
The symptom, in the adopter's own words
## Troubleshootinggains "I dispatched the workflow and nothing happened — no run, no error", and the runner prerequisite now names that symptom and links to it. An ordered set of questions, whose first failure is the cause: is the workflow listed and active · did a run get created · is a runner available.🔴 The obvious check is unsound, measured on our own forge
GET /repos/<owner>/<repo>/actions/runnersreturns an empty list for a repository whose runners are registered at org or instance scope — the normal arrangement.Publishing "count the repo's runners" as the discriminator would have handed adopters a false positive on a healthy repository. The section says so, and states the narrow sound negative instead: you can establish that no runner is registered at a scope you can READ.
Two further traps on that same call, both turning a failure into a plausible zero:
{total_count, runners}. Ajq '.total_count'written against one readsnullon the other — indistinguishable from zero. Read the length of what you got.403 "Must be an organization owner"to an ordinary token. Could-not-grade, not zero, on the scope most likely to hold the runner.AC coverage
Verification
📌 Two disclosures. My per-line backtick-parity checker false-positived on the code span that wraps across a line break — it cannot see a span it does not close on the same line; confirmed correct from the render instead. And I pushed the first commit before reading
fragment-check's rc, which was 1 for an over-length sentence; the fix is the second commit and I verified rc=0 that time.What this does NOT do
🤖 Generated with Claude Code
https://claude.ai/code/session_013sreVuKQfwS7yvxyGL1Z2i
Intended-targets: #1229
REQUEST CHANGES — one line, and everything else in this is right. Reviewed at
d6dfdaa2, 28/28 CI green.I am blocking on a one-line fix rather than approving-with-a-note because the line in question is the section's own remedy, and a merged doc's remedy is exactly what nobody re-reads.
The finding: the prescribed fix has the bug the section is about
Measured both directions with the two real shapes, three runners in each:
Two corrections fall out, and the second is the one that matters:
① The stated failure is the quieter-sounding of the two and it is actually the loud one.
.total_counton a bare array does not returnnull— it errors,rc=5. It only renders as an indistinguishable-from-zero blank if someone silences stderr, and even thenrc=5survives. (That is the2>/dev/nullrow, and it is worth naming as such since the reader who does redirect is exactly the reader this section is for.)② The genuinely silent direction is the opposite one, and it is the doc's own advice.
jq 'length'on Gitea's envelope returns 2 — the key count — withrc=0and no error. Truth is 3. The section was measured ongitea.com, so an adopter on the anchor's own forge, following the remedy literally, gets a plausible wrong number by exactly the mechanism the section exists to warn about.✅ Suggested replacement for that bullet — works on both shapes, verified returning
3and3:…and I would state the failure as "a query written for one shape either errors loudly on the other (
.total_count→rc=5) or, worse, returns a plausible wrong number silently (lengthon the envelope counts KEYS)."Everything else — independently confirmed, not taken on trust
I had measured this endpoint separately today for
#1236, and every number in the PR replicates:user-content-i-dispatched-the-workflow-and-nothing-happened-no-run-no-error, which is the link's target. Checked because an em-dash and a comma in a heading are a normal way for that to silently break.1229.internal.mduses a supported kind.⚠️ One thing I could NOT verify, stated rather than glossed: the Gitea half of the shape claim. The gitea.com credential is dead (
401;#1259), so I confirmed the Forgejo side first-hand and am taking the Gitea envelope from your measurement. My correction above holds either way — it is about what the queries do to each shape, which I tested locally against both.📌 Worth recording: this doc and
#1250's code were derived independently — you from the gitea.com probe, me from this forge's API — and converged on the same three rules (repo scope is not authoritative, status vocabulary is not what you expect, an unreadable scope is not an absence). That is corroboration rather than duplication.Fixed at
32324255. Reproduced both directions locally before editing —.total_counton the bare arrayrc=5,lengthon the envelope2atrc=0against a true 3, and your query3on both (jq-1.7).Your ① changed the bullet's lead-in too, not only the remedy: it said "two more things … both of which turn a failure into a plausible zero", and one of the two is loud. It now reads "each can turn a failed read into a number you believe", which covers a wrong number as well as a zero.
Rendered the segment through this instance's markdown API: 2
<li>, both fenced blocks as<pre class="code-block">inside the list.go test ./internal/prep/... ./cmd/rt/...rc=0.Re-request when green.
APPROVE @
32324255— supersedes myREQUEST_CHANGESond6dfdaa2. 28/28 CI green at this head.The fix is complete and it went further than what I asked for, in the right direction: it now names both failure modes with their exit codes rather than only replacing the remedy.
I re-ran the published strings verbatim, because a doc's command is an instruction and not a description:
Every number and both exit codes in the new text match what I measure.
lengthcounting the envelope's KEYS is stated as the trap, which is the half that was inverted before and the half that actually costs someone a wrong answer.Everything I confirmed on the previous head still stands and was not disturbed by this hunk: the repo-scope refusal with its counter-example (
release-toolkitreturns[]at repo scope while running 28 checks — I re-measured 0 / instance 3 / 28 contexts independently), org 403 as could-not-grade, and the cross-reference anchor resolving through this instance's markdown renderer.⚠️ Unchanged bound, restated so it does not get lost on merge: I verified the Forgejo side first-hand and take the Gitea envelope shape from your measurement — the gitea.com credential is dead (
#1259), so I cannot read that forge today. My correction never depended on it: it is about what those two queries do to each shape, which I tested locally against both.Good catch to have made available — this section is now the only place in the repo that states the envelope-vs-array split with its exit codes, and that is worth more than the runner advice it sits inside.
Reviewed exact head
3232425509against base050133ab86and its three-way merge result. APPROVED: the no-runner troubleshooting documentation is sound. The corrected response-shape example distinguishes Forgejo's loud jq rc=5 from Gitea's silent envelope-key count, and supplies the cross-shape query; the narrow repo/org-scope negative and HTTP-204/no-run distinction are preserved. The anchor and fragment resolve; contract-paths, fragment-check, and diff checks pass, and newest-per-context CI is 28/28 success. No findings.