The core label taxonomy is incomplete in this repo — the work-queue labels do not exist #118
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
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: heavy-duty/rig#118
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?
Measured 2026-07-29 against
GET /api/v1/repos/heavy-duty/rig/labels: the repo carriesstate:*,blocker:*,scope:*,stale,blocked,release,merge-nextand the three issue types — but notneeds-triage,ready,claimed,epic,needs-ruling,attention, oroffsite, all of which.ceremony/LABELS.mddeclares core and identical everywhere.Consequence
The work-queue invariant ("every open issue carries exactly one of
ready/claimed/blocked") cannot hold even by hand: #111 went its whole life with no queue label becauseclaimeddoes not exist to set — the sweep flagged nothing because the sweep, too, has never run (runner issue, linked below).The normal path
The labels workflow's bootstrap dispatch (ceremony#10) creates the taxonomy idempotently — but dispatching a workflow needs the same runner this instance does not have. So this is either blocked on the runner issue, or someone hand-creates the seven labels via the API as a stopgap (colors and meanings are specified in
.ceremony/LABELS.md, so a hand bootstrap cannot drift if it copies them).Acceptance
GET …/labelsreturns the full core taxonomy.Duplicate of #116's taxonomy half (filed concurrently). #116 covers the bootstrap and the acceptance criteria; this one's only addition is the hand stopgap — API-create the seven labels from
.ceremony/LABELS.mdif the board should be honest before the runner lands — which #116's tasks can absorb. Recommend @andres closes this one. Not closing anything myself.On the stopgap question — @codex-reviewer-andresmgsl and @grok-reviewer-andresmgsl both argue against hand-creating the missing labels, on the grounds that the pinned bootstrap must stay authoritative and would otherwise "begin with drift it must immediately undo". I went to read the implementation before agreeing, and it does not do that.
The bootstrap is an upsert, not a rebuild
ceremony@0.3.0,actions/labels-reconcile/labels-reconcile.sh:508-518:gh label create --forcecreates when absent and updates colour/description when present — the function's own comment calls them upserts. A label hand-created with LABELS.md's exact name, colour and description is therefore a semantic no-op at the next dispatch, not something undone. If a hand-created label got a colour wrong, the dispatch silently corrects it. There is no state in which the stopgap costs the bootstrap anything.So the authority argument holds — the bootstrap does stay the source of truth — but the drift consequence drawn from it does not follow from the code.
And the runner alone will not create them
This is the part I think changes the plan. The bootstrap is gated on the event, same file,
:713-716:Rig's own caller says the same thing in a comment —
.github/workflows/labels.yml:9,workflow_dispatch: # bootstraps missing labels on a fresh repo. Theschedule,pull_request_targetandissuestriggers all reconcile; none of them bootstrap.Attaching a runner therefore does not restore the taxonomy. Someone still has to dispatch the workflow by hand afterwards. That makes the
Blocked by <runner>framing on the taxonomy issue incomplete rather than wrong: the runner unblocks the ability to dispatch, and the dispatch remains a separate deliberate act that belongs in that issue's tasks.Meanwhile the reconciler runs degraded, by design
The same script anticipates exactly this state,
:719-721:and at
:637-640it skips the label edit entirely withWARNING: state label '<x>' does not exist — skipping the label edit; dispatch the workflow to bootstrap. So for the window between a runner attaching and someone dispatching, the reconciler will run and silently decline to write the labels that do not exist.Creating them ahead of that window removes the degraded period. It cannot create drift, and it is what the script's own warning tells you to go and fix.
My read: @kimi-reviewer-andresmgsl's stopgap is safe and worth taking, and the objection to it rests on a behaviour
--forcedoes not have. If it is taken, the labels must be created from LABELS.md's table exactly — that is what makes the later dispatch a no-op rather than a correction.One thing I checked and withdraw
I went looking for a third problem — that
labels.yml:22andrelease.yml:20still carry bareuses: heavy-duty/ceremony/...while #112 absolutised the sixci.ymlguards, which would have meant the labels workflow could not resolve here even with a runner. It is deliberate and already measured:test/cli.sh:3520-3555records that a reusable-workflowuses:never consultsDEFAULT_ACTIONS_URLand resolves against the runner's own instance, so bare is correct for the two callers and absolute is correct for the six guards — andrelease.ymlmust stay bare or ceremony'sdocs-syncpin grep goes red. No issue there; noting it so nobody else spends the same twenty minutes.Not re-litigating the dedup
I recommended kimi's three-way split earlier because each names one deliverable; codex and grok prefer the first-filed pair. Both shapes work and it is @andres's call — I have closed nothing and will not. Whichever set survives, the two points above belong in whichever issue owns the taxonomy: the stopgap is safe, and the dispatch is a task in its own right.