Auto-labeler re-adds bug label to closed fixed issues, defeating reconciliation #407

Closed
opened 2026-09-20 06:26:09 +01:00 by conductor · 3 comments
Owner

In plain English:

Plain summary — what is wrong

When we take the bug sticker off a finished, fixed issue, the label robot puts it straight back on. The board-checker then reports a live defect on an issue that is actually fixed, so the checking tool can never go green for that issue.

Why it happens (root cause, from .gitea/workflows/auto-label.yml line 96)

The keyword rule 'if the text contains bug/fix/broken, add the bug label' runs on EVERY issue event, including comments on CLOSED issues. Worse: the priority-gate robot's own comment contains the literal word 'bug' (it lists the allowed priority labels), so the robot re-feeds itself.

The fix (shape)

  1. Keyword type-labels are FALLBACK for new filings only — apply on issue opened events when no declared kind: spine exists, never on comment events, never on closed issues.
  2. The declared kind: spine stays authoritative (already the documented rule).

Reproduced

2026-09-20 ~05:30 UTC on #324: PUT labels (200, bug removed) → within seconds bug re-added by gitea-actions. scripts/gitea_reconciliation_check.py reports: '#324: live defect but tracker state is closed' — unrecoverable while the workflow re-adds.

Per the issue-organisation standard this is live/dependency-tracked work, hence standalone.

What is this about:

Why do we need it: <the itch — what happens today that shouldn't, or what becomes possible>

Why is it still open: <"not started yet" | "part done, X remains" | "deliberately parked as a future idea">

Example

What would let us close this

  • <condition 1 — observable>
  • <condition 2>

Version impact (declared at submission — verified at merge)

  • major — breaking: changes a contract, schema, or interface others depend on
  • minor — new capability: something becomes possible that wasn't
  • patch — repair: same behaviour, done correctly
  • none — touches no released artifact (docs, memory, process notes)

Technical details

WHAT:
WHY:
FILES:
ACCEPTANCE:
DEPENDENCIES:

Pipeline requirements

  • TDD: frozen tests written first, red → green (N passed)
  • ruff check and ruff format --check clean
  • Spec-compliance review gate: PASS
  • Code-quality review gate: Approved
  • Full orchestration suite regression green (suite total)
  • Canary passes (name)
  • Closed with a properly formatted closing comment + commit/PR references

Cognitive invariants (memory/cognition issues — both handoffs)

  • Owner — which existing subsystem owns this (audit before creating modules)
  • Trigger — what event activates it
  • Read/write authority — which canonical state it reads/changes
  • Provenance — derived state traceable to evidence
  • Verification — how we know the change helped
  • Failure visibility — how failure surfaces
  • Reversibility — bad learned state can be superseded/replayed/rolled back
  • Dormant cost — what it costs when irrelevant
  • Benchmark + ablation — what measurable behaviour improves; what happens when disabled
  • No duplicate authority — why extend vs create

Hard invariants: derived cognition preserves evidentiary ancestry · epistemic confidence ≠ attentional utility ≠ current applicability · retrieval never increases utility · self-model-induced behaviour is not independent evidence · historical truth survives present-state change · raw evidence is never destroyed by promotion.

Related umbrella

  • Memory
  • Governance
  • Identity
  • Growth
  • Perception
  • Infrastructure
  • Life (Nick's)
  • Custodian
  • Orchestration

Priority (REQUIRED — the priority gate)

  • P0 — critical — breaks the spine / core correctness, or blocks other work
  • P1 — high — material user value or a real defect (money, correctness bugs, next-stage dependency)
  • P2 — medium — quality/consolidation improvement (check the fold-into mapping first)
  • P3 — low — measurement / benchmark / deferred policy
## In plain English: <restate the issue title here in everyday words> <!-- The heading ITSELF must carry the summary — a scan of issue headings alone should tell the whole story of the board. TOP PRIORITY: if a technical detail below contradicts this section, the issue is buggy — fix the issue. A non-technical reader must be able to retell this section. 3-6 sentences, no jargon. --> ## Plain summary — what is wrong When we take the bug sticker off a finished, fixed issue, the label robot puts it straight back on. The board-checker then reports a live defect on an issue that is actually fixed, so the checking tool can never go green for that issue. ## Why it happens (root cause, from .gitea/workflows/auto-label.yml line 96) The keyword rule 'if the text contains bug/fix/broken, add the bug label' runs on EVERY issue event, including comments on CLOSED issues. Worse: the priority-gate robot's own comment contains the literal word 'bug' (it lists the allowed priority labels), so the robot re-feeds itself. ## The fix (shape) 1. Keyword type-labels are FALLBACK for new filings only — apply on issue opened events when no declared kind: spine exists, never on comment events, never on closed issues. 2. The declared kind: spine stays authoritative (already the documented rule). ## Reproduced 2026-09-20 ~05:30 UTC on #324: PUT labels (200, bug removed) → within seconds bug re-added by gitea-actions. scripts/gitea_reconciliation_check.py reports: '#324: live defect but tracker state is closed' — unrecoverable while the workflow re-adds. Per the issue-organisation standard this is live/dependency-tracked work, hence standalone. What is this about: <what> Why do we need it: <the itch — what happens today that shouldn't, or what becomes possible> Why is it still open: <"not started yet" | "part done, X remains" | "deliberately parked as a future idea"> ## Example <!-- A concrete before/after in plain terms: "If X happens, the system will Y instead of Z." --> ## What would let us close this <!-- Checkable statements, verifiable by looking at something that EXISTS — a file, a log line, a passing test. Not "when appropriate". --> - [ ] <condition 1 — observable> - [ ] <condition 2> ## Version impact (declared at submission — verified at merge) <!-- The pipeline derives the real bump from merged conventional commits and compares against this declaration. A mismatch is flagged, not fatal: either the declaration was wrong or the work grew. Both facts matter. --> - [ ] major — breaking: changes a contract, schema, or interface others depend on - [ ] minor — new capability: something becomes possible that wasn't - [ ] patch — repair: same behaviour, done correctly - [ ] none — touches no released artifact (docs, memory, process notes) ## Technical details <!-- WHAT — one-line objective. WHY — design-spec reference (S#) or reason. FILES — affected components. ACCEPTANCE — frozen-test file + test count + canary name. DEPENDENCIES — parent epic + preceding stage/plan refs. --> **WHAT:** **WHY:** **FILES:** **ACCEPTANCE:** **DEPENDENCIES:** ## Pipeline requirements <!-- Every stage must clear these before the issue closes. --> - [ ] TDD: frozen tests written first, red → green (N passed) - [ ] `ruff check` and `ruff format --check` clean - [ ] Spec-compliance review gate: PASS - [ ] Code-quality review gate: Approved - [ ] Full orchestration suite regression green (suite total) - [ ] Canary passes (name) - [ ] Closed with a properly formatted closing comment + commit/PR references ## Cognitive invariants (memory/cognition issues — both handoffs) <!-- Complete ONLY if this issue touches memory, learning, or self-model state. --> - [ ] **Owner** — which existing subsystem owns this (audit before creating modules) - [ ] **Trigger** — what event activates it - [ ] **Read/write authority** — which canonical state it reads/changes - [ ] **Provenance** — derived state traceable to evidence - [ ] **Verification** — how we know the change helped - [ ] **Failure visibility** — how failure surfaces - [ ] **Reversibility** — bad learned state can be superseded/replayed/rolled back - [ ] **Dormant cost** — what it costs when irrelevant - [ ] **Benchmark + ablation** — what measurable behaviour improves; what happens when disabled - [ ] **No duplicate authority** — why extend vs create Hard invariants: derived cognition preserves evidentiary ancestry · epistemic confidence ≠ attentional utility ≠ current applicability · retrieval never increases utility · self-model-induced behaviour is not independent evidence · historical truth survives present-state change · raw evidence is never destroyed by promotion. ## Related umbrella - [ ] Memory - [ ] Governance - [ ] Identity - [ ] Growth - [ ] Perception - [ ] Infrastructure - [ ] Life (Nick's) - [ ] Custodian - [ ] Orchestration ## Priority (REQUIRED — the priority gate) <!-- Pick exactly one. An issue without a priority is not filed. --> - [ ] **P0 — critical** — breaks the spine / core correctness, or blocks other work - [ ] **P1 — high** — material user value or a real defect (money, correctness bugs, next-stage dependency) - [ ] **P2 — medium** — quality/consolidation improvement (check the fold-into mapping first) - [ ] **P3 — low** — measurement / benchmark / deferred policy
conductor added the infrastructurefeature labels 2026-09-20 06:26:09 +01:00

⚠️ Priority gate: this issue has no priority. Assign exactly one of P0 — critical (spine/correctness/blocks), P1 — high (material value or real defect), P2 — medium (quality/consolidation), P3 — low (measurement/deferred). An issue without a priority is not filed.

⚠️ **Priority gate:** this issue has no priority. Assign exactly one of **P0 — critical** (spine/correctness/blocks), **P1 — high** (material value or real defect), **P2 — medium** (quality/consolidation), **P3 — low** (measurement/deferred). An issue without a priority is not filed.
gitea-actions Bot added the bugcustodiangovernancegrowthidentitylifememoryperception labels 2026-09-20 06:26:16 +01:00

⚠️ Priority gate: this issue has no priority. Assign exactly one of P0 — critical (spine/correctness/blocks), P1 — high (material value or real defect), P2 — medium (quality/consolidation), P3 — low (measurement/deferred). An issue without a priority is not filed.

⚠️ **Priority gate:** this issue has no priority. Assign exactly one of **P0 — critical** (spine/correctness/blocks), **P1 — high** (material value or real defect), **P2 — medium** (quality/consolidation), **P3 — low** (measurement/deferred). An issue without a priority is not filed.
Author
Owner

Root-cause correction (errata to the body above): the priority-gate self-feed claim was wrong — gate comments are issue comments, which are not in the workflow text. The actual loop is simpler: the job triggers on labeled events, so any label mutation re-runs full inference; #324 declares kind: bug in its spine (correctly — it was a bug), so every trigger re-adds bug to the closed issue. The bug label on a closed FIXED_VERIFIED issue is semantically stale (bug = currently incorrect behavior). Fix: closed-issue guard + keyword fallback scoped to filing time. Fix branch fix-407-autolabel (c08b211), pull request open to master.

**Root-cause correction (errata to the body above):** the priority-gate self-feed claim was wrong — gate comments are issue *comments*, which are not in the workflow `text`. The actual loop is simpler: the job triggers on `labeled` events, so **any** label mutation re-runs full inference; #324 declares `kind: bug` in its spine (correctly — it was a bug), so every trigger re-adds `bug` to the closed issue. The bug label on a closed FIXED_VERIFIED issue is semantically stale (bug = currently incorrect behavior). Fix: closed-issue guard + keyword fallback scoped to filing time. Fix branch `fix-407-autolabel` (c08b211), pull request open to master.
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: conductor/rune#407