@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.
package/package.json
CHANGED
|
@@ -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
|
|
122
|
+
### Step 6. Commit
|
|
123
123
|
|
|
124
|
-
|
|
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
|
-
|
|
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
|
|
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.
|
|
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
|
+
}
|