@windyroad/itil 2.1.2 → 2.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -497,5 +497,5 @@
497
497
  }
498
498
  },
499
499
  "name": "wr-itil",
500
- "version": "2.1.2"
500
+ "version": "2.1.3"
501
501
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wr-itil",
3
- "version": "2.1.2",
3
+ "version": "2.1.3",
4
4
  "description": "ITIL problem-management workflows for AI coding agents",
5
5
  "author": {
6
6
  "name": "Windy Road Technology",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@windyroad/itil",
3
- "version": "2.1.2",
3
+ "version": "2.1.3",
4
4
  "description": "ITIL-aligned IT service management for Claude Code and Codex",
5
5
  "bin": {
6
6
  "windyroad-itil": "./bin/install.mjs"
@@ -6,7 +6,9 @@
6
6
  # evidence shapes per evidence-based-relevance-close-pass-for-the-problem-backlog-phase-1-file-no-longer-exists-phase-2-adr-shipped-confirmed-named-skill-exists-self-marker-in-body-driver-child-closed-phase-1-false-positive-fixes-architecture-rule (Phase 1 + Phase 2):
7
7
  #
8
8
  # Shape 1 — file-no-longer-exists (Phase 1, original)
9
+ # Elided prose references (`.../`) are not paths.
9
10
  # Shape 2 — ADR-shipped with `human-oversight: confirmed` (Phase 2)
11
+ # CORROBORATING-ONLY — never a clean CLOSE on its own.
10
12
  # Shape 3 — named-skill-or-feature-exists (Phase 2)
11
13
  # Shape 4 — self-marker-in-body (line-anchored) (Phase 2)
12
14
  # Shape 5 — driver-child-ticket-closed (Phase 2)
@@ -244,9 +246,19 @@ record_shape() {
244
246
  # candidate. Detects state-suffix / sibling-file / rename to avoid Phase 1
245
247
  # false-positives (agent-defers-mitigation-selection-to-user-during-active-incident-surfaces-mitigation-choice-as-user-authority-when-skill-contract-empowers-agent-driven-reversible-mitigations-problem/phase-3-f9-wr-itil-plugin-maturity-list-in-suite-display-shim-reads-installed-plugins-plugin-json-maturity-field-emits-ndjson-per-surface-rollup-per-plugin-problem/rfc-first-trace-invariant-not-enforced-fixes-start-without-rfc-story-map-or-jtbd-trace-problem); on detection routes to KEEP-WITH-NOTE.
246
248
 
249
+ # The character class admits `.` and `/`, so an ELIDED reference in prose
250
+ # (`packages/itil/hooks/lib/.../detectors.sh`, `docs/decisions/044-....md`)
251
+ # extracts as a path, is found absent, and is counted as evidence the file
252
+ # was deleted — concluding a ticket was fixed because its prose was
253
+ # abbreviated. An abbreviation was never a path assertion, so drop any
254
+ # candidate carrying an ASCII ellipsis. The Unicode `…` form needs no
255
+ # filter — it is outside the character class above, so it never extracts
256
+ # as a path in the first place (pinned by a bats case regardless). Fourth
257
+ # member of the Phase 1 false-positive class alongside agent-defers-mitigation-selection-to-user-during-active-incident-surfaces-mitigation-choice-as-user-authority-when-skill-contract-empowers-agent-driven-reversible-mitigations-problem/phase-3-f9-wr-itil-plugin-maturity-list-in-suite-display-shim-reads-installed-plugins-plugin-json-maturity-field-emits-ndjson-per-surface-rollup-per-plugin-problem/rfc-first-trace-invariant-not-enforced-fixes-start-without-rfc-story-map-or-jtbd-trace-problem.
247
258
  candidates=$(grep -oE '(packages|docs|\.changeset|src|test|scripts)/[A-Za-z0-9._/-]+\.(md|sh|ts|tsx|js|jsx|json|yml|yaml|bats|py|txt|html)' "$ticket_file" 2>/dev/null \
248
259
  | sort -u \
249
260
  | grep -v '^docs/problems/' \
261
+ | grep -v '\.\.\.' \
250
262
  || true)
251
263
 
252
264
  shape1_missing=0
@@ -318,6 +330,12 @@ if [ -n "$adr_refs" ]; then
318
330
  done <<< "$adr_refs"
319
331
  fi
320
332
  if [ -n "$shape2_confirmed" ]; then
333
+ # Corroborating-only. `human-oversight: confirmed` attests that a human
334
+ # ratified a DECISION (human-oversight-marker-wr-architect-review-decisions-drain-for-recorded-decisions-architecture-rule), not that anything was built or released
335
+ # — treating it as delivery evidence is the marker-is-not-an-
336
+ # implementation-licence conflation human-oversight-marker-wr-architect-review-decisions-drain-for-recorded-decisions-architecture-rule's 2026-05-27 amendment names.
337
+ # It is recorded so the cite survives (agent-output-grounding-no-fabricated-quantitative-estimates-cite-persist-uncertainty-architecture-rule cumulative evidence), but
338
+ # the demotion below stops it closing a ticket by itself.
321
339
  record_shape "ADR-shipped-confirmed" "ADRs human-oversight-confirmed: ${shape2_confirmed}"
322
340
  fi
323
341
 
@@ -483,7 +501,27 @@ fi
483
501
  # caveat short-tag + one-line prose so the SKILL Step 4.6b template can
484
502
  # splice the **Caveat** field directly.
485
503
 
486
- if [ -n "$shapes" ]; then
504
+ # Shape 2 demotion (relevance-close-evaluator-over-fires-a-bare-adr-skill-citation-is-read-as-fix-shipped-so-live-tickets-return-close-candidate-problem Option C, shape 2) — ratification is not
505
+ # delivery. When shape 2 is the ONLY shape that fired, the verdict is
506
+ # demoted from a clean CLOSE-CANDIDATE to CLOSE-CANDIDATE-WITH-CAVEAT so
507
+ # the review-problems Step 4.6 AFK path queues it for the maintainer
508
+ # instead of closing it silently. Measured against origin/main
509
+ # 2026-08-30: 107/120 decision records carried the marker and 91/118
510
+ # open/known-error tickets cited at least one, so the shape fired on ~77%
511
+ # of the live backlog and discriminated almost nothing. relevance-close-evaluator-over-fires-a-bare-adr-skill-citation-is-read-as-fix-shipped-so-live-tickets-return-close-candidate-problem holds the
512
+ # wider shape-2/shape-3 tightening pending a superseding decision; this
513
+ # changes the verdict lane only, not the recorded mechanical check.
514
+ #
515
+ # Evaluated BEFORE the multi-phase block so this tag wins when both would
516
+ # fire — the caveat field is a single structured tag per architect
517
+ # condition C2, and "the evidence is the wrong kind" is the more
518
+ # fundamental reason the verdict cannot be clean.
519
+ if [ "$shapes" = "ADR-shipped-confirmed" ]; then
520
+ caveat_tag="ratification-is-not-delivery"
521
+ caveat_msg="only evidence is ADR ratification, which records a human approving a decision — not that a fix shipped; confirm the work actually landed before closing"
522
+ fi
523
+
524
+ if [ -n "$shapes" ] && [ -z "$caveat_tag" ]; then
487
525
  # Multi-phase umbrella detection: unticked checkboxes in the ticket
488
526
  # body + at least one shipped-evidence shape match. The shape match
489
527
  # itself is the "progress made" signal — unticked tasks indicate
@@ -521,7 +559,7 @@ fi
521
559
  # No shape fired — fall back to the legacy KEEP / SKIP routing.
522
560
 
523
561
  if [ -z "$candidates" ]; then
524
- echo "SKIP $basename — no extractable file paths (after self-reference exclusion)"
562
+ echo "SKIP $basename — no extractable file paths (after self-reference and elided-reference exclusion)"
525
563
  exit 2
526
564
  fi
527
565
 
@@ -295,7 +295,7 @@ For each `.open.md` / `.known-error.md` ticket aged ≥ 7 days, evaluate whether
295
295
  | Shape | Phase | Mechanical check | Empirical closes (2026-05-31) |
296
296
  |---|---|---|---|
297
297
  | 1. `file-no-longer-exists` | Phase 1 | grep ticket body for `(packages\|docs\|...)/...\.(md\|sh\|...)`; verify each via `git ls-files --error-unmatch` | 0 of 14 |
298
- | 2. `ADR-shipped-confirmed` | Phase 2 | grep ticket body for `ADR-NNN`; for each, verify `docs/decisions/<NNN>-*.md` exists AND frontmatter has `human-oversight: confirmed` | 8 of 14 — the "Problem 012: Skill Testing Harness Scope Undefined" problem/the "Problem 015: TDD enforcement does not flag vague Gherkin outcome steps" problem/the "Problem 018: TDD plugin should enforce BDD + Example Mapping principles, with examples traceable to Jobs-To-Be-Done" problem/the "Problem 022: Agents must not fabricate time estimates without grounded data" problem/the "Problem 033: No persistent risk register for ISO 31000 / ISO 27001 compliance" problem/the "Problem 039: Autonomous loops conflate diagnose with implement" problem/the "ADRs accumulate forward-chronology evidence inline (Phase 2 dogfood evidence, amendment history, cross-iter cross-references) — `decisions` bucket dominates context at 41% / 1.3 MiB" problem/the "Reconcile release-cadence text with (lean / release-sooner; appetite is a ceiling, not a trigger) + add the dogfood-location-before-public clause" problem |
298
+ | 2. `ADR-shipped-confirmed` **(corroborating-only)** | Phase 2 | grep ticket body for `ADR-NNN`; for each, verify `docs/decisions/<NNN>-*.md` exists AND frontmatter has `human-oversight: confirmed`. **Never a clean close on its own** — the marker records that a human ratified a DECISION (the ": Human-oversight marker + `/wr-architect:review-decisions` drain for recorded decisions" architecture rule), not that a fix shipped. Shape 2 alone demotes to `CLOSE-CANDIDATE-WITH-CAVEAT` with tag `ratification-is-not-delivery` (the "Evidence-based relevance-close pass for the problem backlog (Phase 1: file-no-longer-exists; Phase 2: ADR-shipped-confirmed + named-skill-exists + self-marker-in-body + driver-child-closed + Phase 1 false-positive fixes)" architecture rule reassessment 2026-08-30) | 8 of 14 — the "Problem 012: Skill Testing Harness Scope Undefined" problem/the "Problem 015: TDD enforcement does not flag vague Gherkin outcome steps" problem/the "Problem 018: TDD plugin should enforce BDD + Example Mapping principles, with examples traceable to Jobs-To-Be-Done" problem/the "Problem 022: Agents must not fabricate time estimates without grounded data" problem/the "Problem 033: No persistent risk register for ISO 31000 / ISO 27001 compliance" problem/the "Problem 039: Autonomous loops conflate diagnose with implement" problem/the "ADRs accumulate forward-chronology evidence inline (Phase 2 dogfood evidence, amendment history, cross-iter cross-references) — `decisions` bucket dominates context at 41% / 1.3 MiB" problem/the "Reconcile release-cadence text with (lean / release-sooner; appetite is a ceiling, not a trigger) + add the dogfood-location-before-public clause" problem |
299
299
  | 3. `named-skill-or-feature-exists` | Phase 2 | grep for SKILL.md / hook / agent paths + `/wr-<plugin>:<skill>` slash-command refs; verify each via `git ls-files` | 6 of 14 — the "Problem 014: No lightweight aside invocation for governance skills (problems, retros, ADRs)" problem/the "Problem 034: Centralise risk reports for cross-project skill improvement" problem/the "Problem 045: Auto plugin install on user's machine after governance release" problem/the "Problem 079: No inbound sync of upstream-reported problems — reports filed via the intake templates never surface in the local backlog" problem/the "Agent designs schemas with user-asked classification fields when the framework should derive silently OR eliminate the classification entirely — deeper generalisation of derive-first-don't-ask" problem/the "Broaden + rename the `solo-developer` persona → `developer`" problem |
300
300
  | 4. `self-marker-in-body` | Phase 2 | line-anchored grep for `Close to (Verifying\|Closed)`, `DONE 2026-`, `## Fix Released` heading, `fix shipped session`, `awaiting K→V`. Pattern MUST anchor to line-start to avoid mid-prose false-positives (architect advisory A2) | explicit in the "Broaden + rename the `solo-developer` persona → `developer`" problem; contributory in the "Problem 033: No persistent risk register for ISO 31000 / ISO 27001 compliance" problem |
301
301
  | 5. `driver-child-ticket-closed` | Phase 2 | parse `## Related` for `P<NNN>` refs; check if any are in `docs/problems/closed/`. Suppressed when child names an unbuilt SKILL/agent path (future work, not stale; architect advisory A1) | contributory in several closes |
@@ -325,13 +325,13 @@ Exit-code routing (one verdict line per ticket on stdout):
325
325
  | Exit | Stdout prefix | Action |
326
326
  |------|--------------|--------|
327
327
  | 0 | `CLOSE-CANDIDATE <basename> — shapes: <comma-list> — <per-shape cite>; ...` | Auto-close branch (4.6b). |
328
- | 0 | `CLOSE-CANDIDATE-WITH-CAVEAT <basename> — shapes: <comma-list> — caveat: <short-tag>: <one-line> — cites: ...` | Surface-batch-confirm branch (4.6b-with-caveat); the caveat short-tag + one-line splices verbatim into the audit section's **Caveat** field per architect condition C2. |
328
+ | 0 | `CLOSE-CANDIDATE-WITH-CAVEAT <basename> — shapes: <comma-list> — caveat: <short-tag>: <one-line> — cites: ...` | Surface-batch-confirm branch — **never the auto-close branch**. Under AFK, defer per 4.6a step 3: surface it, do not `git mv` it. The audit-section shape in 4.6b applies only once a maintainer has confirmed the close, and the caveat short-tag + one-line then splices verbatim into that section's **Caveat** field per architect condition C2. |
329
329
  | 1 | `KEEP <basename> — <M>/<N> paths still present` | No action; log only. |
330
330
  | 1 | `KEEP-WITH-NOTE <basename> — <note>: <evidence>` | Phase 1 false-positive class (state-suffix / sibling-file / rename) OR architect-A1 future-work disambiguation. No action; log only. |
331
331
  | 2 | `SKIP <basename> — <reason>` | No action (age gate, no Reported date, no extractable evidence). |
332
332
  | 3 | error | Log advisory; do not abort the pass — relevance-close is non-blocking per the Step 4.5 fail-soft precedent. |
333
333
 
334
- **Algorithm (canonical body)**: runs each of the five shape detectors over the ticket body. Multi-shape matches emit cumulatively (corroborating evidence is stronger than first-match-wins per the "Agent output grounding — no fabricated quantitative estimates, cite + persist + uncertainty" architecture rule): the `shapes:` field carries a comma-joined list, the trailing fragment carries per-shape cites semicolon-separated. The caveat fires when at least one shape matches AND the body has any unticked checkboxes (multi-phase mixed-progress umbrella class). The verdict is intentionally conservative — tickets with no shape match AND no extractable evidence route to `SKIP`, not auto-close.
334
+ **Algorithm (canonical body)**: runs each of the five shape detectors over the ticket body. Multi-shape matches emit cumulatively (corroborating evidence is stronger than first-match-wins per the "Agent output grounding — no fabricated quantitative estimates, cite + persist + uncertainty" architecture rule): the `shapes:` field carries a comma-joined list, the trailing fragment carries per-shape cites semicolon-separated. Two independent triggers raise the caveat, checked in this order: (1) shape 2 is the ONLY shape that matched — tag `ratification-is-not-delivery`, because ADR ratification is not delivery evidence; (2) at least one shape matches AND the body has any unticked checkboxes — tag `multi-phase-mixed-progress`. The caveat field carries a single structured tag (architect condition C2), so trigger (1) wins when both would fire: "the evidence is the wrong kind" is the more fundamental reason the verdict cannot be clean. The verdict is intentionally conservative — tickets with no shape match AND no extractable evidence route to `SKIP`, not auto-close.
335
335
 
336
336
  **Surface-batch-confirm flow** (the methodology that produced today's 14 closes — codified for repeatable use):
337
337
 
@@ -344,7 +344,15 @@ Real-backlog smoke test 2026-05-31 against today's labeled fixtures: the "Proble
344
344
 
345
345
  #### 4.6b. Auto-close action per CLOSE-CANDIDATE
346
346
 
347
- For each `CLOSE-CANDIDATE` or `CLOSE-CANDIDATE-WITH-CAVEAT` ticket, perform the following BEFORE the `git mv`:
347
+ **Applies to clean `CLOSE-CANDIDATE` verdicts.** A `CLOSE-CANDIDATE-WITH-CAVEAT`
348
+ verdict does NOT enter this branch on its own: under AFK it is surfaced and left
349
+ open per 4.6a step 3, and it reaches the steps below only after a maintainer has
350
+ confirmed the close at the next interactive review — at which point it carries
351
+ the extra **Caveat** field noted in step 1. Closing a caveat verdict
352
+ unattended defeats the demotion that produced it (the "Evidence-based relevance-close pass for the problem backlog (Phase 1: file-no-longer-exists; Phase 2: ADR-shipped-confirmed + named-skill-exists + self-marker-in-body + driver-child-closed + Phase 1 false-positive fixes)" architecture rule reassessment
353
+ 2026-08-30, shape 2 corroborating-only).
354
+
355
+ For each such ticket, perform the following BEFORE the `git mv`:
348
356
 
349
357
  1. Use the `Edit` tool to append a `## Closed as no longer relevant` section to the ticket body (cite + persist + uncertainty per the "Agent output grounding — no fabricated quantitative estimates, cite + persist + uncertainty" architecture rule):
350
358
 
@@ -400,7 +408,7 @@ The relevance-close pass runs **unconditionally** during AFK orchestration: when
400
408
 
401
409
  **Worked example (Phase 2 surface-batch-confirm, 2026-05-31)**: 14 closes across 5 batches using shapes 2-5. Each batch surfaced via `AskUserQuestion` (≤ 5 candidates per batch); maintainer confirmed clean closes and routed caveat candidates with explicit caveat acknowledgement (e.g. the "Problem 039: Autonomous loops conflate diagnose with implement" problem `shared-template-not-built`; the "ADRs accumulate forward-chronology evidence inline (Phase 2 dogfood evidence, amendment history, cross-iter cross-references) — `decisions` bucket dominates context at 41% / 1.3 MiB" problem `deep-dive-bloat-remains`). All closures batched into per-batch commits per the "Governance Skills Commit Their Own Completed Work" architecture rule. The 14-fixture labeled set is the regression suite (`packages/itil/scripts/test/evaluate-relevance.bats` covers each shape positive + the architect A1/A2 advisory negatives).
402
410
 
403
- **Cross-references**: the "Evidence-based relevance-close pass for the problem backlog (Phase 1: file-no-longer-exists; Phase 2: ADR-shipped-confirmed + named-skill-exists + self-marker-in-body + driver-child-closed + Phase 1 false-positive fixes)" architecture rule (this pass's design ADR, Phase 1 + Phase 2), the "Agent output grounding — no fabricated quantitative estimates, cite + persist + uncertainty" architecture rule (grounding, cumulative shape cite + structured caveat field), the "Problem lifecycle — add a Verification Pending status between Known Error and Closed" architecture rule + the "Evidence-based relevance-close pass for the problem backlog (Phase 1: file-no-longer-exists; Phase 2: ADR-shipped-confirmed + named-skill-exists + self-marker-in-body + driver-child-closed + Phase 1 false-positive fixes)" architecture rule lifecycle extension (Open|Known Error → Closed bypassing Verifying for no-fix-needed conclusions; the Closed-row entry at `/wr-itil:manage-problem` SKILL.md line 59 names Phase 1 + Phase 2 shapes), the "Plugin-bundled scripts invoked from SKILL.md resolve via `bin/` on `$PATH`" architecture rule (PATH shim), the "Behavioural-tests-default for skill testing" architecture rule (behavioural bats at `packages/itil/scripts/test/evaluate-relevance.bats` — 33/33 GREEN), the "Governance Skills Commit Their Own Completed Work" architecture rule (batched closure commit grain per pass), the "— Decision-Delegation Contract: when agents act on the framework vs ask the user" architecture rule cat 4 + the "Agents over-ask in interactive sessions — conflating mechanical-stages with user-interactive-stages of multi-stage skill contracts (inverse-)" problem (mechanical-stage carve-out: ask per-batch, not per-ticket), the "Problem 057: `git mv` + Edit + `git add` staging-ordering trap drops content edits from the commit" problem (staging trap), the "`/wr-itil:review-problems` has no path to close tickets that are no longer relevant (evidence-based, NOT age-based) — structural outflow gap drives monotonic backlog growth" problem (Phase 1 driver), the "Phase 2 — extend `evaluate-relevance.sh` with 4 more evidence shapes + fix Phase 1 file-no-longer-exists false-positive class" problem (Phase 2 driver).
411
+ **Cross-references**: the "Evidence-based relevance-close pass for the problem backlog (Phase 1: file-no-longer-exists; Phase 2: ADR-shipped-confirmed + named-skill-exists + self-marker-in-body + driver-child-closed + Phase 1 false-positive fixes)" architecture rule (this pass's design ADR, Phase 1 + Phase 2), the "Agent output grounding — no fabricated quantitative estimates, cite + persist + uncertainty" architecture rule (grounding, cumulative shape cite + structured caveat field), the "Problem lifecycle — add a Verification Pending status between Known Error and Closed" architecture rule + the "Evidence-based relevance-close pass for the problem backlog (Phase 1: file-no-longer-exists; Phase 2: ADR-shipped-confirmed + named-skill-exists + self-marker-in-body + driver-child-closed + Phase 1 false-positive fixes)" architecture rule lifecycle extension (Open|Known Error → Closed bypassing Verifying for no-fix-needed conclusions; the Closed-row entry at `/wr-itil:manage-problem` SKILL.md line 59 names Phase 1 + Phase 2 shapes), the "Plugin-bundled scripts invoked from SKILL.md resolve via `bin/` on `$PATH`" architecture rule (PATH shim), the "Behavioural-tests-default for skill testing" architecture rule (behavioural bats at `packages/itil/scripts/test/evaluate-relevance.bats` — 35/35 GREEN), the "Governance Skills Commit Their Own Completed Work" architecture rule (batched closure commit grain per pass), the "— Decision-Delegation Contract: when agents act on the framework vs ask the user" architecture rule cat 4 + the "Agents over-ask in interactive sessions — conflating mechanical-stages with user-interactive-stages of multi-stage skill contracts (inverse-)" problem (mechanical-stage carve-out: ask per-batch, not per-ticket), the "Problem 057: `git mv` + Edit + `git add` staging-ordering trap drops content edits from the commit" problem (staging trap), the "`/wr-itil:review-problems` has no path to close tickets that are no longer relevant (evidence-based, NOT age-based) — structural outflow gap drives monotonic backlog growth" problem (Phase 1 driver), the "Phase 2 — extend `evaluate-relevance.sh` with 4 more evidence shapes + fix Phase 1 file-no-longer-exists false-positive class" problem (Phase 2 driver).
404
412
 
405
413
  ### 5. Rewrite `docs/problems/README.md`
406
414
 
@@ -306,7 +306,7 @@ For each `.open.md` / `.known-error.md` ticket aged ≥ 7 days, evaluate whether
306
306
  | Shape | Phase | Mechanical check | Empirical closes (2026-05-31) |
307
307
  |---|---|---|---|
308
308
  | 1. `file-no-longer-exists` | Phase 1 | grep ticket body for `(packages\|docs\|...)/...\.(md\|sh\|...)`; verify each via `git ls-files --error-unmatch` | 0 of 14 |
309
- | 2. `ADR-shipped-confirmed` | Phase 2 | grep ticket body for `ADR-NNN`; for each, verify `docs/decisions/<NNN>-*.md` exists AND frontmatter has `human-oversight: confirmed` | 8 of 14 — the "Problem 012: Skill Testing Harness Scope Undefined" problem/the "Problem 015: TDD enforcement does not flag vague Gherkin outcome steps" problem/the "Problem 018: TDD plugin should enforce BDD + Example Mapping principles, with examples traceable to Jobs-To-Be-Done" problem/the "Problem 022: Agents must not fabricate time estimates without grounded data" problem/the "Problem 033: No persistent risk register for ISO 31000 / ISO 27001 compliance" problem/the "Problem 039: Autonomous loops conflate diagnose with implement" problem/the "ADRs accumulate forward-chronology evidence inline (Phase 2 dogfood evidence, amendment history, cross-iter cross-references) — `decisions` bucket dominates context at 41% / 1.3 MiB" problem/the "Reconcile release-cadence text with (lean / release-sooner; appetite is a ceiling, not a trigger) + add the dogfood-location-before-public clause" problem |
309
+ | 2. `ADR-shipped-confirmed` **(corroborating-only)** | Phase 2 | grep ticket body for `ADR-NNN`; for each, verify `docs/decisions/<NNN>-*.md` exists AND frontmatter has `human-oversight: confirmed`. **Never a clean close on its own** — the marker records that a human ratified a DECISION (the ": Human-oversight marker + `/wr-architect:review-decisions` drain for recorded decisions" architecture rule), not that a fix shipped. Shape 2 alone demotes to `CLOSE-CANDIDATE-WITH-CAVEAT` with tag `ratification-is-not-delivery` (the "Evidence-based relevance-close pass for the problem backlog (Phase 1: file-no-longer-exists; Phase 2: ADR-shipped-confirmed + named-skill-exists + self-marker-in-body + driver-child-closed + Phase 1 false-positive fixes)" architecture rule reassessment 2026-08-30) | 8 of 14 — the "Problem 012: Skill Testing Harness Scope Undefined" problem/the "Problem 015: TDD enforcement does not flag vague Gherkin outcome steps" problem/the "Problem 018: TDD plugin should enforce BDD + Example Mapping principles, with examples traceable to Jobs-To-Be-Done" problem/the "Problem 022: Agents must not fabricate time estimates without grounded data" problem/the "Problem 033: No persistent risk register for ISO 31000 / ISO 27001 compliance" problem/the "Problem 039: Autonomous loops conflate diagnose with implement" problem/the "ADRs accumulate forward-chronology evidence inline (Phase 2 dogfood evidence, amendment history, cross-iter cross-references) — `decisions` bucket dominates context at 41% / 1.3 MiB" problem/the "Reconcile release-cadence text with (lean / release-sooner; appetite is a ceiling, not a trigger) + add the dogfood-location-before-public clause" problem |
310
310
  | 3. `named-skill-or-feature-exists` | Phase 2 | grep for SKILL.md / hook / agent paths + `/wr-<plugin>:<skill>` slash-command refs; verify each via `git ls-files` | 6 of 14 — the "Problem 014: No lightweight aside invocation for governance skills (problems, retros, ADRs)" problem/the "Problem 034: Centralise risk reports for cross-project skill improvement" problem/the "Problem 045: Auto plugin install on user's machine after governance release" problem/the "Problem 079: No inbound sync of upstream-reported problems — reports filed via the intake templates never surface in the local backlog" problem/the "Agent designs schemas with user-asked classification fields when the framework should derive silently OR eliminate the classification entirely — deeper generalisation of derive-first-don't-ask" problem/the "Broaden + rename the `solo-developer` persona → `developer`" problem |
311
311
  | 4. `self-marker-in-body` | Phase 2 | line-anchored grep for `Close to (Verifying\|Closed)`, `DONE 2026-`, `## Fix Released` heading, `fix shipped session`, `awaiting K→V`. Pattern MUST anchor to line-start to avoid mid-prose false-positives (architect advisory A2) | explicit in the "Broaden + rename the `solo-developer` persona → `developer`" problem; contributory in the "Problem 033: No persistent risk register for ISO 31000 / ISO 27001 compliance" problem |
312
312
  | 5. `driver-child-ticket-closed` | Phase 2 | parse `## Related` for `P<NNN>` refs; check if any are in `docs/problems/closed/`. Suppressed when child names an unbuilt SKILL/agent path (future work, not stale; architect advisory A1) | contributory in several closes |
@@ -336,13 +336,13 @@ Exit-code routing (one verdict line per ticket on stdout):
336
336
  | Exit | Stdout prefix | Action |
337
337
  |------|--------------|--------|
338
338
  | 0 | `CLOSE-CANDIDATE <basename> — shapes: <comma-list> — <per-shape cite>; ...` | Auto-close branch (4.6b). |
339
- | 0 | `CLOSE-CANDIDATE-WITH-CAVEAT <basename> — shapes: <comma-list> — caveat: <short-tag>: <one-line> — cites: ...` | Surface-batch-confirm branch (4.6b-with-caveat); the caveat short-tag + one-line splices verbatim into the audit section's **Caveat** field per architect condition C2. |
339
+ | 0 | `CLOSE-CANDIDATE-WITH-CAVEAT <basename> — shapes: <comma-list> — caveat: <short-tag>: <one-line> — cites: ...` | Surface-batch-confirm branch — **never the auto-close branch**. Under AFK, defer per 4.6a step 3: surface it, do not `git mv` it. The audit-section shape in 4.6b applies only once a maintainer has confirmed the close, and the caveat short-tag + one-line then splices verbatim into that section's **Caveat** field per architect condition C2. |
340
340
  | 1 | `KEEP <basename> — <M>/<N> paths still present` | No action; log only. |
341
341
  | 1 | `KEEP-WITH-NOTE <basename> — <note>: <evidence>` | Phase 1 false-positive class (state-suffix / sibling-file / rename) OR architect-A1 future-work disambiguation. No action; log only. |
342
342
  | 2 | `SKIP <basename> — <reason>` | No action (age gate, no Reported date, no extractable evidence). |
343
343
  | 3 | error | Log advisory; do not abort the pass — relevance-close is non-blocking per the Step 4.5 fail-soft precedent. |
344
344
 
345
- **Algorithm (canonical body)**: runs each of the five shape detectors over the ticket body. Multi-shape matches emit cumulatively (corroborating evidence is stronger than first-match-wins per the "Agent output grounding — no fabricated quantitative estimates, cite + persist + uncertainty" architecture rule): the `shapes:` field carries a comma-joined list, the trailing fragment carries per-shape cites semicolon-separated. The caveat fires when at least one shape matches AND the body has any unticked checkboxes (multi-phase mixed-progress umbrella class). The verdict is intentionally conservative — tickets with no shape match AND no extractable evidence route to `SKIP`, not auto-close.
345
+ **Algorithm (canonical body)**: runs each of the five shape detectors over the ticket body. Multi-shape matches emit cumulatively (corroborating evidence is stronger than first-match-wins per the "Agent output grounding — no fabricated quantitative estimates, cite + persist + uncertainty" architecture rule): the `shapes:` field carries a comma-joined list, the trailing fragment carries per-shape cites semicolon-separated. Two independent triggers raise the caveat, checked in this order: (1) shape 2 is the ONLY shape that matched — tag `ratification-is-not-delivery`, because ADR ratification is not delivery evidence; (2) at least one shape matches AND the body has any unticked checkboxes — tag `multi-phase-mixed-progress`. The caveat field carries a single structured tag (architect condition C2), so trigger (1) wins when both would fire: "the evidence is the wrong kind" is the more fundamental reason the verdict cannot be clean. The verdict is intentionally conservative — tickets with no shape match AND no extractable evidence route to `SKIP`, not auto-close.
346
346
 
347
347
  **Surface-batch-confirm flow** (the methodology that produced today's 14 closes — codified for repeatable use):
348
348
 
@@ -355,7 +355,15 @@ Real-backlog smoke test 2026-05-31 against today's labeled fixtures: the "Proble
355
355
 
356
356
  #### 4.6b. Auto-close action per CLOSE-CANDIDATE
357
357
 
358
- For each `CLOSE-CANDIDATE` or `CLOSE-CANDIDATE-WITH-CAVEAT` ticket, perform the following BEFORE the `git mv`:
358
+ **Applies to clean `CLOSE-CANDIDATE` verdicts.** A `CLOSE-CANDIDATE-WITH-CAVEAT`
359
+ verdict does NOT enter this branch on its own: under AFK it is surfaced and left
360
+ open per 4.6a step 3, and it reaches the steps below only after a maintainer has
361
+ confirmed the close at the next interactive review — at which point it carries
362
+ the extra **Caveat** field noted in step 1. Closing a caveat verdict
363
+ unattended defeats the demotion that produced it (the "Evidence-based relevance-close pass for the problem backlog (Phase 1: file-no-longer-exists; Phase 2: ADR-shipped-confirmed + named-skill-exists + self-marker-in-body + driver-child-closed + Phase 1 false-positive fixes)" architecture rule reassessment
364
+ 2026-08-30, shape 2 corroborating-only).
365
+
366
+ For each such ticket, perform the following BEFORE the `git mv`:
359
367
 
360
368
  1. Use the `Edit` tool to append a `## Closed as no longer relevant` section to the ticket body (cite + persist + uncertainty per the "Agent output grounding — no fabricated quantitative estimates, cite + persist + uncertainty" architecture rule):
361
369
 
@@ -411,7 +419,7 @@ The relevance-close pass runs **unconditionally** during AFK orchestration: when
411
419
 
412
420
  **Worked example (Phase 2 surface-batch-confirm, 2026-05-31)**: 14 closes across 5 batches using shapes 2-5. Each batch surfaced via `request_user_input` (≤ 5 candidates per batch); maintainer confirmed clean closes and routed caveat candidates with explicit caveat acknowledgement (e.g. the "Problem 039: Autonomous loops conflate diagnose with implement" problem `shared-template-not-built`; the "ADRs accumulate forward-chronology evidence inline (Phase 2 dogfood evidence, amendment history, cross-iter cross-references) — `decisions` bucket dominates context at 41% / 1.3 MiB" problem `deep-dive-bloat-remains`). All closures batched into per-batch commits per the "Governance Skills Commit Their Own Completed Work" architecture rule. The 14-fixture labeled set is the regression suite (`<itil-plugin-root>/scripts/test/evaluate-relevance.bats` covers each shape positive + the architect A1/A2 advisory negatives).
413
421
 
414
- **Cross-references**: the "Evidence-based relevance-close pass for the problem backlog (Phase 1: file-no-longer-exists; Phase 2: ADR-shipped-confirmed + named-skill-exists + self-marker-in-body + driver-child-closed + Phase 1 false-positive fixes)" architecture rule (this pass's design ADR, Phase 1 + Phase 2), the "Agent output grounding — no fabricated quantitative estimates, cite + persist + uncertainty" architecture rule (grounding, cumulative shape cite + structured caveat field), the "Problem lifecycle — add a Verification Pending status between Known Error and Closed" architecture rule + the "Evidence-based relevance-close pass for the problem backlog (Phase 1: file-no-longer-exists; Phase 2: ADR-shipped-confirmed + named-skill-exists + self-marker-in-body + driver-child-closed + Phase 1 false-positive fixes)" architecture rule lifecycle extension (Open|Known Error → Closed bypassing Verifying for no-fix-needed conclusions; the Closed-row entry at `/wr-itil:manage-problem` SKILL.md line 59 names Phase 1 + Phase 2 shapes), the "Plugin-bundled scripts invoked from SKILL.md resolve via `bin/` on `$PATH`" architecture rule (PATH shim), the "Behavioural-tests-default for skill testing" architecture rule (behavioural bats at `<itil-plugin-root>/scripts/test/evaluate-relevance.bats` — 33/33 GREEN), the "Governance Skills Commit Their Own Completed Work" architecture rule (batched closure commit grain per pass), the "— Decision-Delegation Contract: when agents act on the framework vs ask the user" architecture rule cat 4 + the "Agents over-ask in interactive sessions — conflating mechanical-stages with user-interactive-stages of multi-stage skill contracts (inverse-)" problem (mechanical-stage carve-out: ask per-batch, not per-ticket), the "Problem 057: `git mv` + Edit + `git add` staging-ordering trap drops content edits from the commit" problem (staging trap), the "`/wr-itil:review-problems` has no path to close tickets that are no longer relevant (evidence-based, NOT age-based) — structural outflow gap drives monotonic backlog growth" problem (Phase 1 driver), the "Phase 2 — extend `evaluate-relevance.sh` with 4 more evidence shapes + fix Phase 1 file-no-longer-exists false-positive class" problem (Phase 2 driver).
422
+ **Cross-references**: the "Evidence-based relevance-close pass for the problem backlog (Phase 1: file-no-longer-exists; Phase 2: ADR-shipped-confirmed + named-skill-exists + self-marker-in-body + driver-child-closed + Phase 1 false-positive fixes)" architecture rule (this pass's design ADR, Phase 1 + Phase 2), the "Agent output grounding — no fabricated quantitative estimates, cite + persist + uncertainty" architecture rule (grounding, cumulative shape cite + structured caveat field), the "Problem lifecycle — add a Verification Pending status between Known Error and Closed" architecture rule + the "Evidence-based relevance-close pass for the problem backlog (Phase 1: file-no-longer-exists; Phase 2: ADR-shipped-confirmed + named-skill-exists + self-marker-in-body + driver-child-closed + Phase 1 false-positive fixes)" architecture rule lifecycle extension (Open|Known Error → Closed bypassing Verifying for no-fix-needed conclusions; the Closed-row entry at `/wr-itil:manage-problem` SKILL.md line 59 names Phase 1 + Phase 2 shapes), the "Plugin-bundled scripts invoked from SKILL.md resolve via `bin/` on `$PATH`" architecture rule (PATH shim), the "Behavioural-tests-default for skill testing" architecture rule (behavioural bats at `<itil-plugin-root>/scripts/test/evaluate-relevance.bats` — 35/35 GREEN), the "Governance Skills Commit Their Own Completed Work" architecture rule (batched closure commit grain per pass), the "— Decision-Delegation Contract: when agents act on the framework vs ask the user" architecture rule cat 4 + the "Agents over-ask in interactive sessions — conflating mechanical-stages with user-interactive-stages of multi-stage skill contracts (inverse-)" problem (mechanical-stage carve-out: ask per-batch, not per-ticket), the "Problem 057: `git mv` + Edit + `git add` staging-ordering trap drops content edits from the commit" problem (staging trap), the "`/wr-itil:review-problems` has no path to close tickets that are no longer relevant (evidence-based, NOT age-based) — structural outflow gap drives monotonic backlog growth" problem (Phase 1 driver), the "Phase 2 — extend `evaluate-relevance.sh` with 4 more evidence shapes + fix Phase 1 file-no-longer-exists false-positive class" problem (Phase 2 driver).
415
423
 
416
424
  ### 5. Rewrite `docs/problems/README.md`
417
425