@windyroad/itil 0.49.0 → 0.49.1

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": "0.49.0"
500
+ "version": "0.49.1"
501
501
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@windyroad/itil",
3
- "version": "0.49.0",
3
+ "version": "0.49.1",
4
4
  "description": "ITIL-aligned IT service management for Claude Code (problem, and future incident/change skills)",
5
5
  "bin": {
6
6
  "windyroad-itil": "./bin/install.mjs"
@@ -119,16 +119,18 @@ Keep the new fragment ≤ 1024 bytes (soft cap) and certainly ≤ 5120 bytes (ha
119
119
 
120
120
  **Rationale (P134)**: this skill previously documented the line as "an ever-growing prose paragraph". That convention is what produced the 76-KB line-3 that broke the Read tool entirely. The reconcile path was a load-bearing site of the bloat — every reconcile that happened under the old convention re-wrote line 3 unbounded. The new discipline closes the surface for reconcile parity with `manage-problem` Step 5 P094, Step 6 P094, Step 7 P062, and the sibling `transition-problem`, `transition-problems`, `review-problems` skills.
121
121
 
122
- ### Step 6. Commit (when invoked from an AFK orchestrator subprocess)
122
+ ### Step 6. Commit
123
123
 
124
- In AFK mode (per ADR-013 Rule 6), commit the reconciled README in a dedicated single-purpose commit:
124
+ Commit the reconciled README in a dedicated single-purpose commit — unconditionally, regardless of interactive vs AFK invocation mode, per ADR-014 ("governance skills commit their own work"):
125
125
 
126
126
  ```bash
127
127
  git add docs/problems/README.md
128
128
  git commit -m "chore(problems): reconcile README against filesystem (P118)"
129
129
  ```
130
130
 
131
- When invoked interactively, do NOT auto-commit — present a diff summary to the user and let them stage + commit. The reconciled state should always be staged together (no partial reconciliation) — when the agent has applied N edits in Step 4, all N belong in the same commit.
131
+ The reconciled state should always be staged together (no partial reconciliation) — when the agent has applied N edits in Step 4, all N belong in the same commit. Interactive and AFK invocations behave identically: the commit decision is **framework-mediated** per ADR-014 (the policy already decided governance skills commit their own work), NOT user direction-setting per ADR-044's authority taxonomy. A per-invocation consent surface here would re-ask a decision the framework has already resolved (P172 + lazy-AskUserQuestion under ADR-044).
132
+
133
+ The ADR-013 Rule 6 fail-safe is **risk-gated** (above-appetite + `AskUserQuestion` unavailable → skip commit), not **mode-gated** (interactive vs AFK). Reconciliation is pure mechanical README refresh with no risk-above-appetite branch, so Rule 6 simply does not fire here.
132
134
 
133
135
  ## ADR alignment
134
136
 
@@ -136,7 +138,7 @@ When invoked interactively, do NOT auto-commit — present a diff summary to the
136
138
  - **ADR-022** (Verification Pending lifecycle status conventions) — Confirmation criterion 3 extended to "and matches the Verification Queue table in `README.md` modulo narrative content".
137
139
  - **ADR-038** (Progressive disclosure for governance tooling context) — script output is per-row terse (≤150 bytes per drift entry); the agent expands narrative-aware edits on demand.
138
140
  - **ADR-005** (Plugin testing strategy) — script-level bats lives at `packages/itil/scripts/test/reconcile-readme.bats`; ADR-037 (skill testing) governs this skill's own contract bats.
139
- - **ADR-013** (Structured interaction) — Rule 6 (non-interactive fail-safe) governs the AFK auto-apply branch.
141
+ - **ADR-013** (Structured interaction) — Rule 6 (non-interactive fail-safe) governs the parse-error halt in Step 1 (exit code 2). Rule 6 is risk-gated, not mode-gated; reconciliation's Step 6 commit fires unconditionally per ADR-014 (P172). Rule 6 does NOT carve out the Step 6 commit on mode grounds.
140
142
 
141
143
  ## Confirmation
142
144
 
@@ -144,7 +146,7 @@ This skill's contract holds when:
144
146
  1. The script `packages/itil/scripts/reconcile-readme.sh` is read-only — no live README mutation in the script layer (mutation only in this skill's Step 4, via the Edit tool).
145
147
  2. Each agent-applied edit preserves the README's narrative content (prose paragraph at top, Closed section free text).
146
148
  3. After Step 4 + Step 5, a re-run of the script reports exit 0 (clean).
147
- 4. In AFK mode, the reconciled README rides a single commit (Step 6 single-purpose commit).
149
+ 4. The reconciled README rides a single commit (Step 6 single-purpose commit) regardless of invocation mode — interactive and AFK behave identically per ADR-014 governance-skill commit contract (P172).
148
150
  5. The skill is invoked from `/wr-itil:manage-problem` Step 0, `/wr-itil:work-problems` Step 0, AND direct user invocation — no other invocation surface (e.g., `/wr-itil:transition-problem` does NOT call this skill; per architect verdict P062 already covers transition-time refresh inside the same commit, redundant preflight here would pay the cost on every transition).
149
151
 
150
152
  ## Related
@@ -158,3 +160,5 @@ This skill's contract holds when:
158
160
  - `docs/decisions/022-problem-lifecycle-verification-pending-status.proposed.md` — Confirmation criterion 3 extension.
159
161
  - **P094** (`docs/problems/094-...closed.md`) — refresh-on-create. Composes; this skill is robustness on top, not supersession.
160
162
  - **P062** (`docs/problems/062-...closed.md`) — refresh-on-transition. Composes; same.
163
+ - **P172** (`docs/problems/open/172-skill-contract-interactive-vs-afk-commit-gating-anti-pattern-contradicts-adr-014.md`) — removed the Step 6 interactive-vs-AFK commit-gating carve-out 2026-06-09. The carve-out contradicted ADR-014 and produced uncommitted reconciliations across months of AFK-equivalent sessions before the FFS-grade correction surfaced it.
164
+ - `docs/decisions/044-decision-delegation-contract.proposed.md` — framework-resolution boundary; the commit decision is framework-mediated (ADR-014), not user direction-setting.
@@ -149,3 +149,53 @@ setup() {
149
149
  run grep -iE "re-run.*script|re.run.*reconcile-readme|re-run.*reconcile" "$SKILL_FILE"
150
150
  [ "$status" -eq 0 ]
151
151
  }
152
+
153
+ # ── Step 6 unconditional-commit contract (P172) ─────────────────────────────
154
+
155
+ @test "reconcile-readme: Step 6 does NOT carry an interactive-vs-AFK commit-gating carve-out (P172)" {
156
+ # P172: prior Step 6 prose carved out "When invoked interactively, do
157
+ # NOT auto-commit — present a diff summary to the user and let them
158
+ # stage + commit". This contradicts ADR-014 ("governance skills commit
159
+ # their own work") which is framework-mediated, not user direction-
160
+ # setting. User pinned FFS-grade: "I haven't committed anything for
161
+ # months. You do all the commits". The contract holds when the prose
162
+ # does NOT re-introduce the mode-gated suppression on the Step 6 commit.
163
+ #
164
+ # Negative assertion: no "do NOT auto-commit", "do not auto-commit",
165
+ # or "let.*user.*stage" phrasings that would re-introduce the carve-out.
166
+ # Risk-gated phrasing (above appetite, AskUserQuestion unavailable) is
167
+ # policy-correct (ADR-013 Rule 6) and excluded — but reconcile-readme
168
+ # has no risk-above-appetite branch (pure mechanical README refresh).
169
+ run grep -iE "do NOT auto-commit|do not auto-commit|let (the|them|user).{0,20}stage.*commit|when invoked interactively.{0,30}(commit|stage)" "$SKILL_FILE"
170
+ [ "$status" -ne 0 ]
171
+ }
172
+
173
+ @test "reconcile-readme: Step 6 names ADR-014 as the unconditional-commit authority (P172)" {
174
+ # Positive assertion: Step 6 must cite ADR-014 ("governance skills
175
+ # commit their own work") as the authority for the unconditional
176
+ # commit. The prose must also explicitly state the commit fires
177
+ # regardless of invocation mode so the contract is discoverable.
178
+ #
179
+ # Extract Step 6 region: from the line AFTER "### Step 6." through to
180
+ # the next H2/H3 heading. Awk range patterns where start and end can
181
+ # match the same line collapse to one line, so we advance start past
182
+ # the heading line via a flag.
183
+ STEP6="$(awk '
184
+ /^### Step 6\./ { in_step=1; next }
185
+ in_step && /^(### |## )/ { in_step=0 }
186
+ in_step { print }
187
+ ' "$SKILL_FILE")"
188
+ [ -n "$STEP6" ]
189
+ # ADR-014 cited inside Step 6.
190
+ echo "$STEP6" | grep -F "ADR-014"
191
+ # Unconditional / regardless-of-mode phrasing inside Step 6.
192
+ echo "$STEP6" | grep -iE "unconditional|regardless of (invocation )?mode|framework-mediated"
193
+ }
194
+
195
+ @test "reconcile-readme: Step 6 names interactive and AFK commit behaviour as identical (P172)" {
196
+ # The Confirmation criterion 4 (or Step 6 prose) must explicitly assert
197
+ # interactive and AFK commit behaviour are identical. This is the
198
+ # behavioural contract that the unified commit shape obeys.
199
+ run grep -iE "interactive and AFK behave identically|regardless of invocation mode|interactive.*AFK.*identical|identical.*interactive.*AFK" "$SKILL_FILE"
200
+ [ "$status" -eq 0 ]
201
+ }