Taking the bug sticker off a finished issue did not stick — the label robot put it straight back on, so the board checker could never go green for that issue (#324).
What changed
The label robot now skips closed issues entirely. Once an issue is closed, its stickers are history — humans and the conductor curate them.
The old keyword guessing (used only for very old issues without the kind spine) now runs once, at filing time, instead of on every edit.
## Plain summary — what this fixes
Taking the bug sticker off a finished issue did not stick — the label robot put it straight back on, so the board checker could never go green for that issue (#324).
## What changed
- The label robot now skips closed issues entirely. Once an issue is closed, its stickers are history — humans and the conductor curate them.
- The old keyword guessing (used only for very old issues without the kind spine) now runs once, at filing time, instead of on every edit.
- The priority gate also ignores closed issues.
## Verification plan (after merge)
1. Remove `bug` from closed #324 via PUT labels.
2. Wait >60s and across any label event; confirm no re-add.
3. `scripts/gitea_reconciliation_check.py` green for #324.
Fixes #407. Version intent: patch.
Root cause of #407: the labels job re-ran its full inference on every
issues event, including 'labeled' events on closed issues. Any label
mutation (human cleanup, bot churn) re-triggered inference, and the
spine-authoritative mapping re-added the type label to the closed issue
(#324: kind bug, closed FIXED_VERIFIED, bug label re-added within
seconds of every removal — making the reconciliation checker
permanently red for that issue).
Fix:
- Closed issues are skipped entirely; post-close label curation
belongs to humans and the conductor. Labels are filing-time
metadata.
- The pre-template keyword fallback now runs only on the 'opened'
action, per its documented scope; edits and label events on
spine-less issues no longer override human curation.
- Priority gate also skips closed issues (hygiene, same class).
Version intent: patch (workflow behavior fix, no API change).
Verification after merge: remove 'bug' from closed#324, wait >60s
across any label event, confirm no re-add; reconciliation checker
green for #324.
🤖Headless spec gate (non-blocking, #204 first slice)
Spec-gate agent produced no text output — check runner logs.
Deterministic floors still govern the merge
This comment is advisory. Required checks (lint, tests, canaries, type-check, coverage, dependency lock, impact gate) remain the merge authority per docs/adversarial-review.md proportionality.
🤖 **Headless spec gate (non-blocking, #204 first slice)**
Spec-gate agent produced no text output — check runner logs.
<details><summary>Deterministic floors still govern the merge</summary>
This comment is advisory. Required checks (lint, tests, canaries, type-check, coverage, dependency lock, impact gate) remain the merge authority per docs/adversarial-review.md proportionality.</details>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Plain summary — what this fixes
Taking the bug sticker off a finished issue did not stick — the label robot put it straight back on, so the board checker could never go green for that issue (#324).
What changed
Verification plan (after merge)
bugfrom closed #324 via PUT labels.scripts/gitea_reconciliation_check.pygreen for #324.Fixes #407. Version intent: patch.
🤖 Headless spec gate (non-blocking, #204 first slice)
Spec-gate agent produced no text output — check runner logs.
Deterministic floors still govern the merge
This comment is advisory. Required checks (lint, tests, canaries, type-check, coverage, dependency lock, impact gate) remain the merge authority per docs/adversarial-review.md proportionality.