From a43fa0584627956ee007eaba0f8c81e9ee5fc2e7 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 26 Oct 2026 13:33:14 +0000 Subject: [PATCH] docs: the queue classifier has ten causes, three of which add a runner The README said eight causes and that exactly one offers to add a runner. lib/queue-cause.js defines ten (CAUSES), and three return actionEligible = true: unserved, role-unserved and repo-capacity. That matches docs/concepts.md and the queue-causes figure, which already say ten and three. Two comments in queue-cause.js carried older counts too: "two of seven causes" and "the six causes marked false" (seven are marked false), and the unserved branch called itself the only action-eligible non-capacity cause, which role-unserved no longer leaves true. Comments only; no behaviour change. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_019W86FcknjPBqAPtVcnH8Ja --- README.md | 7 ++++--- dashboard/lib/queue-cause.js | 8 ++++---- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index f1f4220..e02ab60 100644 --- a/README.md +++ b/README.md @@ -186,9 +186,10 @@ The other question the fleet has to answer is why a job is sitting in a queue. That used to be one check — *is a runner idle* — which separated the wrong pair, because "every runner is busy" and "the host is saturated" both look like *no runner is idle*, and only the first is fixed by adding a runner. It is now -[eight classified causes](https://addisdev.github.io/actions-runners/concepts/#why-a-job-is-queued), -each carrying the evidence it used, and exactly one of them offers to add a -runner. +[ten classified causes](https://addisdev.github.io/actions-runners/concepts/#why-a-job-is-queued), +each carrying the evidence it used, and only three of them — no runner for the +repo, none for the job's role, or every runner busy with headroom to spare — are +fixed by adding one. ## The numbers exclude what would make them wrong diff --git a/dashboard/lib/queue-cause.js b/dashboard/lib/queue-cause.js index d9f909b..ba30404 100644 --- a/dashboard/lib/queue-cause.js +++ b/dashboard/lib/queue-cause.js @@ -7,7 +7,7 @@ // WHY A CLASSIFIER OVER A BOOLEAN FLAG // // The existing `stuck-queue` drift rule forks on a single question: is there an -// idle runner or not? That answers two of seven causes. The others are invisible +// idle runner or not? That answers two of ten causes. The others are invisible // — a label mismatch looks like a capacity problem when you can see only that // "all runners are busy", and host saturation looks like a capacity problem when // the headroom gate is refusing additions. Misreading the cause leads to the @@ -125,9 +125,9 @@ export function classifyQueueCause({ run, runners, capacity, api = {}, collector // ---- no runners at all ------------------------------------------------- if (repoRunners.length === 0) { evidence.push('No runner is registered for this repo'); - // Action-eligible, unlike every other non-capacity cause here. The field - // means "adding a runner would help", and for the six causes marked false it - // genuinely would not — a second runner shares a label mismatch, and another + // Action-eligible, like role-unserved and repo-capacity and unlike the + // rest. The field means "adding a runner would help", and for the seven + // causes marked false it genuinely would not — a second runner shares a label mismatch, and another // runner on a saturated host makes the saturation worse. A repo with no // runner is the opposite case: one runner is the entire remedy, and // RECOMMENDED has said so all along.