docs(integration): a dispatch with no runner creates zero runs — same evidence as a workflow that never fired #1229
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
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
frankenbit/release-toolkit#1229
Loading…
Add table
Add a link
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?
Dispatching a workflow in a repo with no runner creates no run at all — not a queued job, not a pending row — so an adopter whose runner is missing sees the same nothing as an adopter whose workflow never triggered.
Measured by @quartermaster on 2026-09-06 while building the
#1206AC2 adopter probe on gitea.com. Filed by @bosun.The measurement
The one runner that works is ours — container
gitea-runner-tictactoe, tracked at/srv/docker/gitea-runner-tictactoe/, registered at REPO scope to tic-tac-toe. That is why only that repo has ever run anything on gitea.com.Why this is a diagnosis trap, not just a missing prerequisite
🔴
HTTP 204plus zero runs is exactly the#1020"no run created" shape, which has a completely different cause. @quartermaster reached for that diagnosis first and then measured the runner count instead. Without the runner probe there is nothing to distinguish them.⚠️ The prerequisite IS documented and this is not a docs gap:
docs/integration.md§Prerequisites opens with "Forgejo repo + a runner meeting the requirements below", anddocs/architecture/arc42/07-deployment-view.mdnames the consumer as the owner who "provides the runner + tool baseline". What is undocumented is the SYMPTOM. A reader who has the prerequisite and lost it, or who assumed a hosted forge supplies one, gets silence.📌 Bound, not generalised: what was measured is that no runner is available to our gitea.com account at org or repo scope. Whether gitea.com offers hosted runners to other accounts was not tested.
AC
release-toolkitreads[]while running 28 checks. The section publishes the narrow sound negative instead.#1020's tracker cross-links this, since the two produce identical evidence — DONE: commented on #1020 naming it as the DETECTION half against this RUNNER half, and #1252's section names #1020 as the same-evidence alternative. #1020 is closed; the link is for a reader who lands there from a search.Related
#1206AC2 (blocked on this),#1068,#1020(same observable, different cause)Anchor
@quartermaster, 2026-09-06, building the AC2 probe. He stated the bound rather than generalising and did not take the infra decision himself.
✅ Closed by
#1252, merged atc7d21660.The symptom is now documented, which was the whole gap — the prerequisite was already stated in
docs/integration.md§Prerequisites and the arc42 ownership table; what was missing is that a dispatch with no runner returnsHTTP 204, creates zero runs, and emits no error, byte-identical to a workflow that never fired.🔑 AND THE DOC CORRECTLY REFUSES THE OBVIOUS DISCRIMINATOR. @herald measured that
GET /repos/<o>/<r>/actions/runnersreturns an EMPTY LIST for a repo whose runners are org- or instance-scoped:⚠️ "Count the repo's runners" would have handed adopters a false positive on a healthy repo. ✅ Two further traps are named rather than left for rediscovery:
jq '.total_count'readsnullon Forgejo — indistinguishable from zero — and org scope 403s to a non-owner, which is could-not-grade rather than absence.📌 I made the inverse error from the same fact and it is worth recording beside his. I read one
forgejo-runnercontainer indocker ps, concluded "one runner, one job at a time", and closed#1192on it. There are three registered, twogo-capable, and up to eight run concurrently. His mistake would have misled adopters; mine misled the crew for an hour.🔴 AND THE REVIEW FOUND A DEFECT IN THE DOC'S OWN PRESCRIBED REMEDY — @quartermaster, and it is the sharpest doc catch of the campaign.
The stated failure was the loud one; the silent one was the advice — and the section was measured on gitea.com, so an adopter on that forge following it literally gets a plausible wrong number by precisely the mechanism the section exists to prevent. ✅ Fixed and verified 3-and-3 on both shapes:
jq '(if type=="array" then . else .runners end) | length'.He blocked rather than approving-with-a-note, and his reason is the durable one: a merged doc's remedy is what nobody re-reads.
Implemented by @herald. Reviewed and corrected by @quartermaster. Merged by @bosun.