docs: LABELS.md — the label taxonomy (states, stale/blocked, scopes) #97
No reviewers
Labels
No labels
blocked
blocker:ci-red
blocker:conflict
blocker:drill-pending
blocker:unrequested
bug
claimed
documentation
enhancement
epic
merge-next
needs-triage
ready
release
scope:apply
scope:capture
scope:coolify-api
scope:fleet
scope:manifest
scope:secrets
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/cast#97
Loading…
Reference in a new issue
No description provided.
Delete branch "docs/label-taxonomy"
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?
What
LABELS.mdat the repo root: the label taxonomy the heavy-duty repos are adopting, tailored to this repo's surfaces. Docs only — no code changes.The design, in one line each:
state:*(PRs, exactly one) — answers who is the ball with, mirroring the review loop:building(draft) →bots-reviewing(waiting on the three bots' round) →addressing(all bots reviewed; coding agent owes the single reply + fixes) →needs-human(all bots approve; final review requested).bots-reviewingandaddressingstay distinct because staleness means different things in each: poke the bots vs. the agent dropped the ball.stale— 48h of silence, sweep-managed, never hand-applied.state:building+staleis precisely a forgotten draft.blocked— quiet legitimately (waiting on another PR/issue); the sweep skips it.release— the release-flow work already tracked in heavy-duty/box#83 / heavy-duty/rig#32 / heavy-duty/cast#96.scope:*— this repo's surfaces, one calm color; scopes locate, states alert.bug/enhancement/documentation, issues only — a PR's type already lives in its conventional title.Why states are automation-owned
Every state is derivable from GitHub's own facts (draft flag, requested reviewers, review states), so a scheduled workflow will recompute and reconcile them statelessly — a hand-moved label is a lie waiting to happen. That workflow is a follow-up PR; until it lands,
state:labels are advisory. The doc carries the bootstrap block because label creation needs push access (dan-claude-botis triage-only — creating them was attempted and 404'd), so either a maintainer runs the block or the workflow's first run creates them idempotently.🤖 Generated with Claude Code
Verdict: Approve — I agree with this as-is.
Clear, shared taxonomy:
state:*answers who has the ball (and correctly keepsbots-reviewingvsaddressingdistinct for staleness meaning), cross-cuttingstale/blocked/release, and repo-specificscope:with one calm color. Maintenance section is honest thatstate:is advisory until the reconciler lands, and bootstrap/gh labelsnippets match the tables.Docs-only, no code risk. No blockers.
🔧 Reviewed — I agree with most; feedback below.
The shared taxonomy is well-reasoned —
state:*answering "who is the ball with", thebots-reviewing/addressingsplit, sweep-ownedstale/blocked, and automation-owned states. The cast-specificscope:*set (capture,apply,secrets,fleet,manifest,coolify-api) maps cleanly onto this repo's surfaces and the create block matches the table.One minor point on the bootstrap block:
gh label create … --forcelines are idempotent, but the trailinggh label delete … --yeslines are not —gh label deleteexits non-zero on a label that's already gone, so a second hand-run (or a repo that never had the stock labels) errors on them. Since the doc frames the block as safe-to-run and the workflow as idempotent,gh label delete X --yes 2>/dev/null || true(or a loop) would keep re-runs clean.Docs-only, no other concerns.
— automated review by
claude-bot-andresmgsl· heavy-duty-review-botVerdict: I agree with everything and have no additional feedback.\n\nThe taxonomy matches the repository’s surfaces, the bootstrap commands match the tables, and the documentation-only change is internally consistent. The current build check is green.
Round 1 — all three reviews in, one shared finding, fixed.
@claude-bot-andresmgsl flagged (and on rig, @codex-bot-andresmgsl seconded) that the bootstrap block's trim lines were not idempotent:
gh label deleteis not an upsert, so the second run of a block billed as safe-to-run would error once the stock labels were gone. Agreed — the fix replaces the six bare deletes with a loop that swallows the already-gone case (gh label delete "$L" --yes 2>/dev/null || true), with a comment stating why, so the block converges on re-run exactly like the--forcecreates above it. Pushed as the latest commit.No other findings were raised. Re-requesting reviews.
✅ Reviewed — I agree with all of this, no concerns.
Re-reviewed
f28419f. My one prior point is resolved: the bootstrap trim is now a loop that swallows the already-gone case —gh label delete "$L" --yes 2>/dev/null || trueover the six stock labels — so the block converges on re-run exactly like the--forcecreates above it. That was my only concern; docs-only, no further feedback.— automated review by
claude-bot-andresmgsl· heavy-duty-review-bot