@windyroad/itil 0.61.1 → 0.61.2

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.
Files changed (171) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/package.json +7 -2
  3. package/agents/test/fixtures/proceed-new-genuinely-new.md +0 -43
  4. package/agents/test/fixtures/proceed-new-subtle-sibling.md +0 -47
  5. package/agents/test/fixtures/regression-p347-vs-p346.md +0 -54
  6. package/agents/test/hang-off-check.bats +0 -225
  7. package/hooks/test/block-list.bats +0 -153
  8. package/hooks/test/command-detect.bats +0 -181
  9. package/hooks/test/itil-assistant-output-gate.bats +0 -114
  10. package/hooks/test/itil-assistant-output-review.bats +0 -224
  11. package/hooks/test/itil-bash-polling-antipattern-detect.bats +0 -154
  12. package/hooks/test/itil-changeset-discipline.bats +0 -603
  13. package/hooks/test/itil-claude-space-protection.bats +0 -294
  14. package/hooks/test/itil-commit-trailer-transition-advisory.bats +0 -80
  15. package/hooks/test/itil-correction-detect.bats +0 -189
  16. package/hooks/test/itil-deferral-cadence-gate.bats +0 -187
  17. package/hooks/test/itil-fictional-defer-detect.bats +0 -292
  18. package/hooks/test/itil-fix-title-lifecycle-advisory.bats +0 -129
  19. package/hooks/test/itil-mid-loop-ask-detect.bats +0 -220
  20. package/hooks/test/itil-no-implement-draft-gate.bats +0 -210
  21. package/hooks/test/itil-pending-questions-surface.bats +0 -307
  22. package/hooks/test/itil-readme-refresh-discipline.bats +0 -642
  23. package/hooks/test/itil-rfc-oversight-nudge.bats +0 -83
  24. package/hooks/test/itil-rfc-trailer-advisory.bats +0 -375
  25. package/hooks/test/itil-story-mirror-migration-nudge.bats +0 -122
  26. package/hooks/test/manage-problem-enforce-create.bats +0 -424
  27. package/hooks/test/p057-staging-trap-detect.bats +0 -231
  28. package/hooks/test/pre-publish-intake-gate.bats +0 -144
  29. package/hooks/test/runtime-sid-marker.bats +0 -90
  30. package/hooks/test/session-id.bats +0 -370
  31. package/scripts/migrate-problems-add-type.sh +0 -116
  32. package/scripts/test/catchup-scan.bats +0 -274
  33. package/scripts/test/check-afk-accept-eligible.bats +0 -310
  34. package/scripts/test/check-fail-soft-skip-discipline.bats +0 -172
  35. package/scripts/test/check-fix-rfc-trace.bats +0 -164
  36. package/scripts/test/check-locale-discipline.bats +0 -291
  37. package/scripts/test/check-problems-readme-budget.bats +0 -192
  38. package/scripts/test/check-rfc-has-stories.bats +0 -69
  39. package/scripts/test/check-rfc-rejected-alternatives.bats +0 -108
  40. package/scripts/test/check-rfc-stories-ratified.bats +0 -82
  41. package/scripts/test/check-upstream-responses.bats +0 -503
  42. package/scripts/test/classify-readme-drift.bats +0 -392
  43. package/scripts/test/derive-first-dispatch.bats +0 -274
  44. package/scripts/test/derive-release-vehicle.bats +0 -454
  45. package/scripts/test/detect-unratified-stories-maps.bats +0 -60
  46. package/scripts/test/dual-tolerant-glob-rfc-002-t2.bats +0 -309
  47. package/scripts/test/effort-tally.bats +0 -170
  48. package/scripts/test/evaluate-relevance.bats +0 -773
  49. package/scripts/test/kind-a-commands.bats +0 -46
  50. package/scripts/test/mark-create-gate.bats +0 -59
  51. package/scripts/test/mark-story-oversight-confirmed.bats +0 -53
  52. package/scripts/test/migrate-problems-add-type.bats +0 -280
  53. package/scripts/test/migrate-story-status-mirror.bats +0 -167
  54. package/scripts/test/no-type-regression-guard.bats +0 -74
  55. package/scripts/test/oversight-mirror-corpus-lint.bats +0 -150
  56. package/scripts/test/plugin-exercise-index.bats +0 -386
  57. package/scripts/test/plugin-maturity-doc-lint.bats +0 -470
  58. package/scripts/test/plugin-maturity-populate.bats +0 -631
  59. package/scripts/test/plugin-maturity-render.bats +0 -469
  60. package/scripts/test/plugin-validate-ci-gate.bats +0 -208
  61. package/scripts/test/reconcile-readme.bats +0 -1007
  62. package/scripts/test/reconcile-rfcs.bats +0 -496
  63. package/scripts/test/reconcile-stories.bats +0 -173
  64. package/scripts/test/reconcile-story-maps.bats +0 -74
  65. package/scripts/test/release-watch-poll-loop.bats +0 -180
  66. package/scripts/test/resolve-governance-plugin-dirs.bats +0 -78
  67. package/scripts/test/rfc-stories-extension.bats +0 -175
  68. package/scripts/test/skill-invocations.bats +0 -535
  69. package/scripts/test/skill-md-dual-tolerant-coverage-rfc-002-t3.bats +0 -374
  70. package/scripts/test/story-oversight-lib.bats +0 -190
  71. package/scripts/test/update-jtbd-references-related-problems.bats +0 -178
  72. package/scripts/test/update-problem-references-section.bats +0 -242
  73. package/scripts/test/update-problem-rfcs-section.bats +0 -242
  74. package/scripts/test/update-references-section-sibling-helpers.bats +0 -80
  75. package/scripts/test/update-rfc-commits-section.bats +0 -77
  76. package/scripts/test/verify-iter-summary.bats +0 -196
  77. package/scripts/test/working-the-problem-traversal.bats +0 -116
  78. package/skills/capture-problem/test/capture-problem-step-1-5b-jtbd-trace.bats +0 -398
  79. package/skills/capture-problem/test/capture-problem.bats +0 -389
  80. package/skills/capture-story/test/capture-story-behavioural.bats +0 -317
  81. package/skills/capture-story-map/test/capture-story-map-behavioural.bats +0 -98
  82. package/skills/close-incident/test/close-incident-contract.bats +0 -146
  83. package/skills/link-incident/test/link-incident-contract.bats +0 -125
  84. package/skills/list-incidents/test/list-incidents-contract.bats +0 -115
  85. package/skills/list-problems/test/list-problems-contract.bats +0 -100
  86. package/skills/list-stories/test/list-stories-contract.bats +0 -127
  87. package/skills/list-story-maps/test/list-story-maps-contract.bats +0 -46
  88. package/skills/manage-incident/test/manage-incident-adr-044-contract.bats +0 -206
  89. package/skills/manage-incident/test/manage-incident-close-forwarder.bats +0 -67
  90. package/skills/manage-incident/test/manage-incident-link-forwarder.bats +0 -67
  91. package/skills/manage-incident/test/manage-incident-list-forwarder.bats +0 -68
  92. package/skills/manage-incident/test/manage-incident-mitigate-forwarder.bats +0 -66
  93. package/skills/manage-incident/test/manage-incident-restore-forwarder.bats +0 -66
  94. package/skills/manage-incident/test/manage-incident.bats +0 -171
  95. package/skills/manage-problem/test/manage-problem-adr-044-step4-derive-first.bats +0 -151
  96. package/skills/manage-problem/test/manage-problem-auto-migrate-step.bats +0 -53
  97. package/skills/manage-problem/test/manage-problem-concern-boundary.bats +0 -64
  98. package/skills/manage-problem/test/manage-problem-effort-buckets.bats +0 -56
  99. package/skills/manage-problem/test/manage-problem-external-root-cause-detection.bats +0 -119
  100. package/skills/manage-problem/test/manage-problem-first-run-intake-prompt.bats +0 -43
  101. package/skills/manage-problem/test/manage-problem-git-mv-restage-reminder.bats +0 -48
  102. package/skills/manage-problem/test/manage-problem-id-collision-guard.bats +0 -39
  103. package/skills/manage-problem/test/manage-problem-list-forwarder.bats +0 -66
  104. package/skills/manage-problem/test/manage-problem-next-id-origin-lookup.bats +0 -50
  105. package/skills/manage-problem/test/manage-problem-no-prose-options.bats +0 -74
  106. package/skills/manage-problem/test/manage-problem-output-formatting.bats +0 -30
  107. package/skills/manage-problem/test/manage-problem-parked-and-cache.bats +0 -73
  108. package/skills/manage-problem/test/manage-problem-readme-refresh-on-transition.bats +0 -62
  109. package/skills/manage-problem/test/manage-problem-readme-tie-break-order.bats +0 -318
  110. package/skills/manage-problem/test/manage-problem-readme-vq-sort-order.bats +0 -206
  111. package/skills/manage-problem/test/manage-problem-release-vehicle-seed.bats +0 -83
  112. package/skills/manage-problem/test/manage-problem-review-forwarder.bats +0 -71
  113. package/skills/manage-problem/test/manage-problem-step-9d-recovery-path.bats +0 -97
  114. package/skills/manage-problem/test/manage-problem-transition-forwarder.bats +0 -96
  115. package/skills/manage-problem/test/manage-problem-transitive-dependencies.bats +0 -365
  116. package/skills/manage-problem/test/manage-problem-verification-detection.bats +0 -64
  117. package/skills/manage-problem/test/manage-problem-verification-pending.bats +0 -114
  118. package/skills/manage-problem/test/manage-problem-work-forwarder.bats +0 -88
  119. package/skills/manage-story/test/manage-story-contract.bats +0 -174
  120. package/skills/manage-story-map/test/manage-story-map-contract.bats +0 -63
  121. package/skills/mitigate-incident/test/mitigate-incident-contract.bats +0 -258
  122. package/skills/reconcile-readme/test/reconcile-readme-contract.bats +0 -201
  123. package/skills/report-upstream/test/report-upstream-contract.bats +0 -394
  124. package/skills/restore-incident/test/restore-incident-contract.bats +0 -170
  125. package/skills/review-problems/test/inbound-channels-cache-shape.bats +0 -127
  126. package/skills/review-problems/test/inbound-discovery-contract.bats +0 -383
  127. package/skills/review-problems/test/jtbd-301-verdict-shape-contract.bats +0 -225
  128. package/skills/review-problems/test/review-problems-contract.bats +0 -235
  129. package/skills/review-problems/test/review-problems-likely-verified-cell-shape.bats +0 -229
  130. package/skills/scaffold-intake/test/scaffold-intake-contract.bats +0 -126
  131. package/skills/scaffold-intake/test/scaffold-intake-fixture.bats +0 -164
  132. package/skills/scaffold-intake/test/scaffold-intake-secrets-absent.bats +0 -87
  133. package/skills/transition-problem/test/transition-problem-contract.bats +0 -285
  134. package/skills/transition-problems/test/transition-problems-contract.bats +0 -331
  135. package/skills/update-upstream/test/update-upstream-contract.bats +0 -375
  136. package/skills/work-problem/test/work-problem-contract.bats +0 -294
  137. package/skills/work-problems/test/work-problems-above-appetite-remediation.bats +0 -139
  138. package/skills/work-problems/test/work-problems-adr-013-rule-6-p352-amendment.bats +0 -166
  139. package/skills/work-problems/test/work-problems-auto-migrate-step.bats +0 -57
  140. package/skills/work-problems/test/work-problems-cost-logging.bats +0 -109
  141. package/skills/work-problems/test/work-problems-deviation-candidate-shape.bats +0 -121
  142. package/skills/work-problems/test/work-problems-first-run-intake-prompt.bats +0 -36
  143. package/skills/work-problems/test/work-problems-inter-iteration-verify.bats +0 -59
  144. package/skills/work-problems/test/work-problems-mid-loop-userpromptsubmit-handler.bats +0 -69
  145. package/skills/work-problems/test/work-problems-no-mid-loop-asking.bats +0 -192
  146. package/skills/work-problems/test/work-problems-p341-pre-all-done-gate.bats +0 -122
  147. package/skills/work-problems/test/work-problems-p342-r007-derive-then-pass-flags.bats +0 -170
  148. package/skills/work-problems/test/work-problems-p342-retro-auto-ticket-carveout.bats +0 -120
  149. package/skills/work-problems/test/work-problems-preflight-failure-handling.bats +0 -248
  150. package/skills/work-problems/test/work-problems-preflight-session-continuity.bats +0 -139
  151. package/skills/work-problems/test/work-problems-preflight.bats +0 -69
  152. package/skills/work-problems/test/work-problems-release-cadence.bats +0 -63
  153. package/skills/work-problems/test/work-problems-step-0-iter-error-staleness.bats +0 -93
  154. package/skills/work-problems/test/work-problems-step-0b-cache-staleness-behavioural.bats +0 -138
  155. package/skills/work-problems/test/work-problems-step-0c-deferred-placeholder-staleness-behavioural.bats +0 -238
  156. package/skills/work-problems/test/work-problems-step-0d-outbound-responses-staleness-behavioural.bats +0 -174
  157. package/skills/work-problems/test/work-problems-step-2-5-routing.bats +0 -80
  158. package/skills/work-problems/test/work-problems-step-2-5b-cross-halt-routing.bats +0 -149
  159. package/skills/work-problems/test/work-problems-step-3-5-jtbd-ratification-predicate.bats +0 -191
  160. package/skills/work-problems/test/work-problems-step-5-bats-polling-discipline.bats +0 -91
  161. package/skills/work-problems/test/work-problems-step-5-delegation.bats +0 -333
  162. package/skills/work-problems/test/work-problems-step-5-idle-timeout-sigterm.bats +0 -421
  163. package/skills/work-problems/test/work-problems-step-5-is-error-transient-halt.bats +0 -278
  164. package/skills/work-problems/test/work-problems-step-5-iter-changeset-required.bats +0 -95
  165. package/skills/work-problems/test/work-problems-step-5-prompt-body-re-grounding.bats +0 -128
  166. package/skills/work-problems/test/work-problems-step-5-stream-timeout-salvage.bats +0 -251
  167. package/skills/work-problems/test/work-problems-step-6-5-always-drain.bats +0 -203
  168. package/skills/work-problems/test/work-problems-step-6-5-cache-refresh-chain.bats +0 -174
  169. package/skills/work-problems/test/work-problems-step-6-5-fix-and-continue.bats +0 -254
  170. package/skills/work-problems/test/work-problems-step-6-5-postrelease-kv-callback.bats +0 -209
  171. package/skills/work-problems/test/work-problems-stop-condition-questions.bats +0 -85
@@ -1,139 +0,0 @@
1
- #!/usr/bin/env bats
2
- # Doc-lint guard: work-problems SKILL.md must include the above-appetite
3
- # auto-apply + halt-on-exhaustion branch per ADR-042.
4
- #
5
- # Structural assertion — Permitted Exception to the source-grep ban (ADR-005 / P011).
6
- # These assertions are load-bearing-string checks on the skill specification
7
- # document. Per P081, structural tests are placeholders for behavioural tests
8
- # against P012's skill-testing harness; until that harness lands, these
9
- # assertions are the confirmation mechanism called out in ADR-042 Confirmation
10
- # criterion 2.
11
- #
12
- # Cross-reference:
13
- # P103 (work-problems escalates resolved release decisions — defeats AFK)
14
- # P104 (partial-progress paints release queue into corner)
15
- # P108 (scorer remediation action-class vocabulary — deferred work)
16
- # ADR-042 (auto-apply scorer remediations — open vocabulary — never release above appetite)
17
- # ADR-037 (skill testing strategy — contract-assertion pattern)
18
- # @jtbd JTBD-006 (Progress the Backlog While I'm Away)
19
-
20
- setup() {
21
- SKILL_DIR="$(cd "$(dirname "$BATS_TEST_FILENAME")/.." && pwd)"
22
- SKILL_FILE="${SKILL_DIR}/SKILL.md"
23
- }
24
-
25
- @test "SKILL.md exists" {
26
- [ -f "$SKILL_FILE" ]
27
- }
28
-
29
- @test "SKILL.md cites ADR-042 (above-appetite auto-apply)" {
30
- # ADR-042 Confirmation criterion 1: source review names the ADR.
31
- run grep -n "ADR-042" "$SKILL_FILE"
32
- [ "$status" -eq 0 ]
33
- }
34
-
35
- @test "SKILL.md contains the never-release-above-appetite invariant (Rule 1)" {
36
- # The load-bearing invariant from Rule 1. "MUST NOT release above appetite"
37
- # is the phrase that anchors the policy.
38
- run grep -nE "MUST NOT release above appetite" "$SKILL_FILE"
39
- [ "$status" -eq 0 ]
40
- }
41
-
42
- @test "SKILL.md references RISK_REMEDIATIONS parsing contract (Rule 2)" {
43
- # Rule 2 parses RISK_REMEDIATIONS from the scorer. If the string is absent,
44
- # the skill does not implement the parse step.
45
- run grep -n "RISK_REMEDIATIONS" "$SKILL_FILE"
46
- [ "$status" -eq 0 ]
47
- }
48
-
49
- @test "SKILL.md does not use a held-changeset directory as remediation" {
50
- run grep -n "docs/changesets-holding/" "$SKILL_FILE"
51
- [ "$status" -ne 0 ]
52
- }
53
-
54
- @test "SKILL.md does not offer move-to-holding as a remediation" {
55
- run grep -n "move-to-holding" "$SKILL_FILE"
56
- [ "$status" -ne 0 ]
57
- }
58
-
59
- @test "SKILL.md offers shipment-affecting remediation classes" {
60
- run grep -nE "split-change|disable-or-revert|revert-commit" "$SKILL_FILE"
61
- [ "$status" -eq 0 ]
62
- }
63
-
64
- @test "SKILL.md names P108 (deferred action-class vocabulary)" {
65
- # Rule 2a defers revert-commit, amend-commit, feature-flag, rollback-to-tag
66
- # to P108. Keeping the reference greppable makes the deferral auditable.
67
- run grep -n "P108" "$SKILL_FILE"
68
- [ "$status" -eq 0 ]
69
- }
70
-
71
- @test "SKILL.md includes the Verification Pending carve-out (Rule 2b)" {
72
- # Rule 2b prevents auto-revert of commits attached to .verifying.md tickets.
73
- run grep -niE "Verification Pending.*carve.out|Rule 2b|\.verifying\.md.*(skip|exclude|carve)" "$SKILL_FILE"
74
- [ "$status" -eq 0 ]
75
- }
76
-
77
- @test "SKILL.md references the halt-on-exhaustion outcome (Rule 5)" {
78
- # Rule 5 emits outcome: halted-above-appetite when the auto-apply loop
79
- # exhausts without convergence.
80
- run grep -n "halted-above-appetite" "$SKILL_FILE"
81
- [ "$status" -eq 0 ]
82
- }
83
-
84
- @test "SKILL.md cites ADR-013 Rule 5 (policy-authorised silent proceed)" {
85
- # Rule 1 is authorised by ADR-013 Rule 5. The citation should be explicit.
86
- run grep -nE "ADR-013 Rule 5" "$SKILL_FILE"
87
- [ "$status" -eq 0 ]
88
- }
89
-
90
- @test "SKILL.md references the scorer-gap halt signal" {
91
- # Rule 5 treats exhaustion as a scorer-gap bug signal, not routine behaviour.
92
- run grep -niE "scorer.gap|scorer vocabulary|bug signal" "$SKILL_FILE"
93
- [ "$status" -eq 0 ]
94
- }
95
-
96
- @test "SKILL.md Non-Interactive Decision Making table covers above-appetite auto-apply" {
97
- # The non-interactive defaults table row makes the behaviour discoverable to
98
- # an AFK reader without forcing a full prose read.
99
- run grep -niE "above appetite.*>= 5/25|pipeline risk above appetite|auto-apply scorer remediations" "$SKILL_FILE"
100
- [ "$status" -eq 0 ]
101
- }
102
-
103
- @test "SKILL.md forbids AskUserQuestion shortcut for above-appetite" {
104
- # The anti-shortcut stance is load-bearing for P103. Absent this, the skill
105
- # reverts to the P103 bug. Allow optional "call "/"invoke " verb and optional
106
- # backtick around the tool name (since the SKILL.md phrasing treats it as code).
107
- run grep -niE "MUST NOT (call |invoke )?[\`]?AskUserQuestion" "$SKILL_FILE"
108
- [ "$status" -eq 0 ]
109
- }
110
-
111
- @test "SKILL.md references the amend-based folding rule for ADR-032 compatibility (Rule 3)" {
112
- # Auto-apply commits fold into the iteration's main commit via amend so
113
- # ADR-032's one-commit-per-iteration invariant holds.
114
- run grep -niE "amend|git commit --amend" "$SKILL_FILE"
115
- [ "$status" -eq 0 ]
116
- }
117
-
118
- @test "SKILL.md references the audit-trail subsection (Rule 6)" {
119
- # Rule 6 emits an Auto-apply trail subsection in the iteration summary. If
120
- # the phrase is missing, audit trail is not wired through.
121
- run grep -niE "Auto-apply trail|audit trail" "$SKILL_FILE"
122
- [ "$status" -eq 0 ]
123
- }
124
-
125
- # ──────────────────────────────────────────────────────────────────────────────
126
- # P108: agent reads prose descriptions; no action_class column
127
- # ──────────────────────────────────────────────────────────────────────────────
128
-
129
- @test "SKILL.md has no action_class column reference (P108 — agent decides from prose)" {
130
- # ADR-042 Rule 2a: no structured action_class column.
131
- run grep -n "action_class" "$SKILL_FILE"
132
- [ "$status" -ne 0 ]
133
- }
134
-
135
- @test "SKILL.md includes revert-commit example (P108)" {
136
- # The orchestrator may choose to revert a commit based on scorer prose.
137
- run grep -n "git revert" "$SKILL_FILE"
138
- [ "$status" -eq 0 ]
139
- }
@@ -1,166 +0,0 @@
1
- #!/usr/bin/env bats
2
- # ADR-013 Rule 6 P352 amendment (2026-06-06): queue-and-continue is the
3
- # universal AFK default when a skill needs user input but AskUserQuestion is
4
- # unavailable. HALT/SKIP/AUTO-DEFAULT are deviations requiring inline-cited
5
- # carve-out justification.
6
- #
7
- # Structural assertion — Permitted Exception to the source-grep ban (ADR-005 /
8
- # P011). These assertions are load-bearing-string checks on the ADR + SKILL
9
- # specification prose. Per P081, structural tests are placeholders for
10
- # behavioural tests against P012's skill-testing harness; until the harness
11
- # can exercise AFK fallback shapes, prose assertions on the carve-out audit
12
- # are the confirmation mechanism named in the amended Rule 6 Confirmation
13
- # section.
14
- #
15
- # tdd-review: structural-permitted (justification: ADR Rule 6 + SKILL.md prose
16
- # contract assertions for an interaction-pattern contract that has no
17
- # behavioural skill-runtime harness yet — P012 + P081 Phase 2 bridge window.
18
- # Isomorphic precedent in this repo: work-problems-above-appetite-remediation.bats,
19
- # create-adr-substance-confirm-pattern.bats, create-adr-adr-044-contract.bats.)
20
- #
21
- # @problem P352 (AFK queue-and-continue is the universal default)
22
- # @adr ADR-013 (structured user interaction; Rule 6 amended 2026-06-06)
23
- # @adr ADR-044 (decision-delegation contract; AUTO-DEFAULT lives inside framework-resolution)
24
- # @adr ADR-052 (behavioural-by-default with structural bridge window)
25
- # @adr ADR-074 (confirm decision substance before building; authorises HALT carve-outs)
26
- # @jtbd JTBD-006 (Progress the Backlog While I'm Away — primary persona)
27
- # @jtbd JTBD-001 (Enforce Governance Without Slowing Down — queue keeps governance on during AFK)
28
-
29
- setup() {
30
- REPO_ROOT="$(cd "$(dirname "$BATS_TEST_FILENAME")/../../../../.." && pwd)"
31
- ADR_013="${REPO_ROOT}/docs/decisions/013-structured-user-interaction-for-governance-decisions.proposed.md"
32
- }
33
-
34
- # ----------------------------------------------------------------------
35
- # ADR-013 Rule 6 amendment prose
36
- # ----------------------------------------------------------------------
37
-
38
- @test "ADR-013 file exists" {
39
- [ -f "$ADR_013" ]
40
- }
41
-
42
- @test "ADR-013 Rule 6 names queue-and-continue as the universal default (P352 amendment)" {
43
- # The load-bearing prose: queue-and-continue is THE universal default.
44
- run grep -nE "queue-and-continue is the universal default" "$ADR_013"
45
- [ "$status" -eq 0 ]
46
- }
47
-
48
- @test "ADR-013 Rule 6 dates the amendment (2026-06-06)" {
49
- # Date-anchoring lets future readers correlate the prose with P352 timeline.
50
- run grep -nE "2026-06-06 amendment" "$ADR_013"
51
- [ "$status" -eq 0 ]
52
- }
53
-
54
- @test "ADR-013 Rule 6 names halt-with-directive AND silent-skip as deviations" {
55
- # The amendment's contract: HALT and SKIP are DEVIATIONS requiring carve-out
56
- # justification — they are not the default.
57
- run grep -nE "DEVIATIONS that require an explicit" "$ADR_013"
58
- [ "$status" -eq 0 ]
59
- }
60
-
61
- @test "ADR-013 Rule 6 documents the capture-problem HALT carve-out (ADR-074 authority)" {
62
- # The amendment must explicitly name the documented HALT carve-outs so
63
- # readers know the SKILL surfaces that LEGITIMATELY halt and why.
64
- run grep -nE "capture-problem.*derive-then-ratify HALT" "$ADR_013"
65
- [ "$status" -eq 0 ]
66
- }
67
-
68
- @test "ADR-013 Rule 6 documents the create-adr Step 5 HALT carve-out" {
69
- run grep -nE "create-adr.*Step 5 substance-confirm HALT" "$ADR_013"
70
- [ "$status" -eq 0 ]
71
- }
72
-
73
- @test "ADR-013 Rule 6 documents the manage-problem create-gate HALT carve-out" {
74
- run grep -nE "manage-problem.*create-gate HALT" "$ADR_013"
75
- [ "$status" -eq 0 ]
76
- }
77
-
78
- @test "ADR-013 Rule 6 names AUTO-DEFAULT as framework-resolved-only (ADR-044 boundary)" {
79
- # AUTO-DEFAULT is permitted ONLY when the decision is framework-resolved.
80
- # Outside the framework-resolution boundary, AUTO-DEFAULT is a defect.
81
- run grep -nE "AUTO-DEFAULT.*permitted ONLY when the decision is framework-resolved" "$ADR_013"
82
- [ "$status" -eq 0 ]
83
- }
84
-
85
- @test "ADR-013 Rule 6 cites ADR-044 (decision-delegation framework-resolution boundary)" {
86
- run grep -nE "ADR-044" "$ADR_013"
87
- [ "$status" -eq 0 ]
88
- }
89
-
90
- @test "ADR-013 Rule 6 cites ADR-074 (substance-confirm authority for HALT carve-outs)" {
91
- run grep -nE "ADR-074" "$ADR_013"
92
- [ "$status" -eq 0 ]
93
- }
94
-
95
- @test "ADR-013 Rule 6 cites JTBD-006 (Progress the Backlog While I'm Away)" {
96
- run grep -nE "JTBD-006" "$ADR_013"
97
- [ "$status" -eq 0 ]
98
- }
99
-
100
- @test "ADR-013 Rule 6 cites P352 as the originating ticket" {
101
- run grep -nE "\bP352\b" "$ADR_013"
102
- [ "$status" -eq 0 ]
103
- }
104
-
105
- @test "ADR-013 Rule 6 records the shared-helper extraction as a follow-on (deferred)" {
106
- # The ratified design explicitly deferred the shared-helper extraction to
107
- # follow-on. The prose must record the deferral so future readers (and
108
- # future iter agents) know the interim contract.
109
- run grep -nE "Shared-helper extraction deferred" "$ADR_013"
110
- [ "$status" -eq 0 ]
111
- }
112
-
113
- # ----------------------------------------------------------------------
114
- # Per-SKILL carve-out audit annotations
115
- # ----------------------------------------------------------------------
116
-
117
- @test "capture-problem SKILL.md carries the P352 carve-out audit (P401-corrected: conforms to queue-and-continue; ADR-074 preserved via downstream gating)" {
118
- SKILL="${REPO_ROOT}/packages/itil/skills/capture-problem/SKILL.md"
119
- [ -f "$SKILL" ]
120
- run grep -nE "ADR-013 Rule 6 carve-out audit \(P352" "$SKILL"
121
- [ "$status" -eq 0 ]
122
- # Post-P401 (2026-06-29/2026-07-02) the AFK low-confidence path no longer
123
- # HALTs — it CONFORMS to the queue-and-continue default: capture the
124
- # ticket with the unconfirmed-anchoring sentinel + queue the elicitation.
125
- run grep -niE "conform.*queue-and-continue|unconfirmed — elicitation queued" "$SKILL"
126
- [ "$status" -eq 0 ]
127
- # ADR-074 is still named as the honoured constraint (preserved by
128
- # downstream oversight gating, not by a no-ticket halt).
129
- run grep -nE "ADR-074" "$SKILL"
130
- [ "$status" -eq 0 ]
131
- }
132
-
133
- @test "create-adr SKILL.md carries the P352 carve-out audit (Step 1 AUTO-DEFAULT + Step 5 HALT)" {
134
- SKILL="${REPO_ROOT}/packages/architect/skills/create-adr/SKILL.md"
135
- [ -f "$SKILL" ]
136
- run grep -nE "ADR-013 Rule 6 carve-out audit \(P352" "$SKILL"
137
- [ "$status" -eq 0 ]
138
- }
139
-
140
- @test "manage-problem SKILL.md carries the P352 carve-out audit (Step 4b AUTO-DEFAULT)" {
141
- SKILL="${REPO_ROOT}/packages/itil/skills/manage-problem/SKILL.md"
142
- [ -f "$SKILL" ]
143
- run grep -nE "ADR-013 Rule 6 carve-out audit \(P352" "$SKILL"
144
- [ "$status" -eq 0 ]
145
- }
146
-
147
- @test "review-problems SKILL.md cites the P352 amendment at the Step 4.5 AFK branch" {
148
- SKILL="${REPO_ROOT}/packages/itil/skills/review-problems/SKILL.md"
149
- [ -f "$SKILL" ]
150
- run grep -nE "ADR-013 Rule 6 universal default \(P352" "$SKILL"
151
- [ "$status" -eq 0 ]
152
- }
153
-
154
- @test "scaffold-intake SKILL.md cites the P352 amendment as canonical queue-and-continue" {
155
- SKILL="${REPO_ROOT}/packages/itil/skills/scaffold-intake/SKILL.md"
156
- [ -f "$SKILL" ]
157
- run grep -nE "ADR-013 Rule 6 universal default \(P352" "$SKILL"
158
- [ "$status" -eq 0 ]
159
- }
160
-
161
- @test "run-retro SKILL.md cites the P352 amendment at the Step 1.5 AFK branch" {
162
- SKILL="${REPO_ROOT}/packages/retrospective/skills/run-retro/SKILL.md"
163
- [ -f "$SKILL" ]
164
- run grep -nE "ADR-013 Rule 6 universal default \(P352" "$SKILL"
165
- [ "$status" -eq 0 ]
166
- }
@@ -1,57 +0,0 @@
1
- #!/usr/bin/env bats
2
-
3
- # P170 / RFC-002 / ADR-031 Open-Execution Q1 resolution: work-problems
4
- # SKILL.md wires the shared migration routine at Step 0a (after Step 0
5
- # fetch/divergence preflight, before Step 1 backlog scan). Closes the
6
- # Step 1 false-zero defect — flat-layout adopters without auto-migrate
7
- # at Step 0a would enumerate zero matches at Step 1 and stop-condition
8
- # would fire incorrectly. Doc-lint structural test — behavioural
9
- # assertions live at packages/shared/test/sync-migrate-problems-layout.bats
10
- # (T7) and the end-to-end behavioural fixture
11
- # packages/itil/skills/work-problems/test/work-problems-auto-migrate.bats (T10).
12
-
13
- setup() {
14
- REPO_ROOT="$(cd "$(dirname "$BATS_TEST_FILENAME")/../../../../.." && pwd)"
15
- SKILL_MD="$REPO_ROOT/packages/itil/skills/work-problems/SKILL.md"
16
- }
17
-
18
- @test "work-problems: SKILL.md declares Step 0a auto-migrate (T9 wiring point)" {
19
- run grep -E '^### Step 0a:|^### 0a\.|Step 0a:' "$SKILL_MD"
20
- [ "$status" -eq 0 ]
21
- }
22
-
23
- @test "work-problems: SKILL.md Step 0a cites P170 / RFC-002 / ADR-031" {
24
- run grep -F 'P170' "$SKILL_MD"
25
- [ "$status" -eq 0 ]
26
- run grep -F 'ADR-031' "$SKILL_MD"
27
- [ "$status" -eq 0 ]
28
- }
29
-
30
- @test "work-problems: SKILL.md Step 0a sources packages/itil/lib/migrate-problems-layout.sh" {
31
- run grep -F 'packages/itil/lib/migrate-problems-layout.sh' "$SKILL_MD"
32
- [ "$status" -eq 0 ]
33
- }
34
-
35
- @test "work-problems: SKILL.md Step 0a calls migrate_problems_to_per_state_layout entrypoint" {
36
- run grep -F 'migrate_problems_to_per_state_layout' "$SKILL_MD"
37
- [ "$status" -eq 0 ]
38
- }
39
-
40
- @test "work-problems: SKILL.md Step 0a fires AFTER Step 0 fetch/divergence and BEFORE Step 1 backlog scan" {
41
- local step_0_line step_0a_line step_1_line
42
- step_0_line=$(grep -nE '^### Step 0:' "$SKILL_MD" | head -1 | cut -d: -f1)
43
- step_0a_line=$(grep -nE '^### Step 0a:' "$SKILL_MD" | head -1 | cut -d: -f1)
44
- step_1_line=$(grep -nE '^### Step 1:' "$SKILL_MD" | head -1 | cut -d: -f1)
45
- [ -n "$step_0_line" ]
46
- [ -n "$step_0a_line" ]
47
- [ -n "$step_1_line" ]
48
- [ "$step_0_line" -lt "$step_0a_line" ]
49
- [ "$step_0a_line" -lt "$step_1_line" ]
50
- }
51
-
52
- @test "work-problems: SKILL.md Step 0a addresses the Step 1 false-zero defect (ADR-031 Backward Compatibility)" {
53
- # Architect explicitly noted Step 1 enumeration would mis-report
54
- # "nothing to do" on flat-layout adopters without Step 0a wiring.
55
- run grep -E 'false.zero|Step 1 enumerat|flat-layout adopter' "$SKILL_MD"
56
- [ "$status" -eq 0 ]
57
- }
@@ -1,109 +0,0 @@
1
- #!/usr/bin/env bats
2
- # Doc-lint guard: work-problems SKILL.md must extract cost + usage metadata
3
- # from each iteration's `claude -p --output-format json` response, surface it
4
- # in the per-iteration Step 6 progress line, and aggregate it in the ALL_DONE
5
- # Output Format as a dedicated "Session Cost" section.
6
- #
7
- # Rationale: the subprocess-boundary dispatch lands per-iteration cost in the
8
- # JSON response alongside `.result`. Without an explicit extraction contract,
9
- # that data is invisible to the user even though it's already emitted. Cost
10
- # logging lets the user calibrate AFK loop sizing on return (e.g. "max out
11
- # the token usage" direction 2026-04-21 needs a feedback loop).
12
- #
13
- # Structural assertion — Permitted Exception under ADR-005 + ADR-037 (SKILL.md
14
- # is the contract document). A behavioural harness that exercises the `jq`
15
- # extraction against a fixture JSON is a potential follow-up; out of scope
16
- # for this doc-lint pass.
17
- #
18
- # @problem P084
19
- # @jtbd JTBD-006
20
- #
21
- # Cross-reference:
22
- # P084 (iteration worker has no Agent tool) — parent ticket; cost logging
23
- # is an additive observability overlay on P084's shipped subprocess
24
- # dispatch.
25
- # ADR-032 (governance skill invocation patterns) — subprocess-boundary
26
- # sub-pattern; `--output-format json` parse shape is already pinned.
27
- # ADR-026 (agent output grounding) — Session Cost section cites its source
28
- # so downstream audits can distinguish measured-actual from estimated.
29
- # ADR-037 (skill testing strategy) — contract-assertion pattern.
30
- # JTBD-006 (Progress the Backlog While I'm Away) — "clear summary when I
31
- # return" documented outcome includes cost/token traceability.
32
-
33
- setup() {
34
- SKILL_DIR="$(cd "$(dirname "$BATS_TEST_FILENAME")/.." && pwd)"
35
- SKILL_FILE="${SKILL_DIR}/SKILL.md"
36
- }
37
-
38
- @test "SKILL.md Step 5 extracts .total_cost_usd from iteration JSON response" {
39
- # Cost per iteration lives in the same JSON blob as .result; parsing it
40
- # costs nothing more than a jq call the orchestrator already needs for
41
- # ITERATION_SUMMARY.
42
- run grep -nE 'total_cost_usd' "$SKILL_FILE"
43
- [ "$status" -eq 0 ]
44
- }
45
-
46
- @test "SKILL.md Step 5 extracts usage token fields from iteration JSON response" {
47
- # input_tokens / output_tokens / cache_creation_input_tokens /
48
- # cache_read_input_tokens are the four usage fields that give a full
49
- # accounting. Cache-read is the key signal for reuse across subprocess
50
- # invocations in the same Bash session.
51
- run grep -nE 'input_tokens|output_tokens|cache_creation_input_tokens|cache_read_input_tokens' "$SKILL_FILE"
52
- [ "$status" -eq 0 ]
53
- }
54
-
55
- @test "SKILL.md Step 5 names jq (or equivalent) as the extraction mechanism" {
56
- # jq is already implicit in `--output-format json` consumption; naming it
57
- # in the SKILL.md prevents bespoke sed/awk reimplementations.
58
- run grep -nE '\\bjq\\b|JSON parser|JSON extraction' "$SKILL_FILE"
59
- [ "$status" -eq 0 ]
60
- }
61
-
62
- @test "SKILL.md Step 5 scopes the extraction to named fields only (PII guard)" {
63
- # Architect advisory 2026-04-21: the JSON response also carries session_id,
64
- # model, stop_reason, etc. that should NOT be surfaced in user-visible
65
- # output. The extraction list must be explicit so future contributors
66
- # don't unconsciously broaden it.
67
- run grep -niE 'extract only|only the fields|do not (surface|log|emit)|scoped to (the )?named fields|explicit field list' "$SKILL_FILE"
68
- [ "$status" -eq 0 ]
69
- }
70
-
71
- @test "SKILL.md Step 6 per-iteration progress line includes cost marker" {
72
- # Example progress line in Step 6 should show the (cost, duration, tokens)
73
- # suffix so contributors see the target format.
74
- run grep -nE '\$[0-9]+\.[0-9]+.{0,40}(tokens|iteration|s,)' "$SKILL_FILE"
75
- [ "$status" -eq 0 ]
76
- }
77
-
78
- @test "SKILL.md Output Format includes a Session Cost section" {
79
- # ALL_DONE summary aggregates per-iteration cost across the run. The
80
- # section renders in every ALL_DONE — interactive OR AFK — because it's
81
- # output-side, not a decision branch.
82
- run grep -nE '^### Session Cost|## Session Cost|Session Cost.{0,40}Total' "$SKILL_FILE"
83
- [ "$status" -eq 0 ]
84
- }
85
-
86
- @test "SKILL.md Output Format Session Cost table includes cache-read reuse signal" {
87
- # Cache-read is the signal for "warm-cache savings across subprocess
88
- # invocations in the same Bash session" — empirically observed 65-147K
89
- # cache-read tokens on probes 2-4 during the P084 probe sequence. Making
90
- # this visible to the user helps them reason about AFK loop cost dynamics.
91
- run grep -niE 'cache.?read|cache reuse|reuse signal|cache hit' "$SKILL_FILE"
92
- [ "$status" -eq 0 ]
93
- }
94
-
95
- @test "SKILL.md Output Format Session Cost section cites its data source (ADR-026)" {
96
- # Architect advisory: the Session Cost numbers are measured-actual (from
97
- # each iteration's claude -p JSON output), not estimates. Name the source
98
- # so audit / downstream-tooling can trust the numbers.
99
- run grep -niE 'extracted from.{0,80}(claude -p|--output-format json|iteration)|source:.{0,80}claude -p|measured.{0,40}(iteration|subprocess)' "$SKILL_FILE"
100
- [ "$status" -eq 0 ]
101
- }
102
-
103
- @test "SKILL.md Session Cost section renders in both interactive and AFK modes" {
104
- # JTBD-006 Rule 6 check: Session Cost is pure output, no AskUserQuestion,
105
- # no policy-authorised action. Must render identically in both modes so
106
- # AFK users see the same summary on return.
107
- run grep -niE 'Session Cost.{0,160}(regardless|both|interactive.{0,40}AFK|AFK.{0,40}interactive)|output-side|no decision branch' "$SKILL_FILE"
108
- [ "$status" -eq 0 ]
109
- }
@@ -1,121 +0,0 @@
1
- #!/usr/bin/env bats
2
- #
3
- # packages/itil/skills/work-problems/test/work-problems-deviation-candidate-shape.bats
4
- #
5
- # Behavioural tests for the deviation-candidate sub-pattern in
6
- # ITERATION_SUMMARY.outstanding_questions (P135 Phase 3 / R7 / ADR-044).
7
- #
8
- # Per ADR-044's anti-BUFD-for-framework-evolution clause: existing
9
- # decisions are point-in-time; as reality changes, existing decisions
10
- # may become wrong. The agent MUST surface deviation candidates with
11
- # evidence (existing-decision citation + contradicting-evidence
12
- # citation per ADR-026 + proposed shape) and queue them for user
13
- # approval. Never auto-deviate; never blindly follow against evidence.
14
- #
15
- # This bats fixture covers the deviation-candidate schema surface in
16
- # the ITERATION_SUMMARY contract + Step 2.5 5-option AskUserQuestion
17
- # loop-end emit + jsonl persistence shape across iter subprocess
18
- # boundary + the positive regression assertion (not-queueing-when-
19
- # evidence-present is a regression).
20
- #
21
- # tdd-review: structural-permitted (justification: skill behavioural
22
- # harness pending P012 + P081 Phase 2; SKILL.md contract assertions
23
- # bridge until then; expected to migrate to behavioural form once the
24
- # harness exists)
25
- #
26
- # @problem P135 Phase 3 R7
27
- # @adr ADR-044 (Decision-Delegation Contract — deviation-approval surface)
28
- # @adr ADR-026 (cost-source grounding for evidence citations)
29
- # @adr ADR-032 (pending-questions artefact precedent for jsonl)
30
- # @adr ADR-005 / ADR-037 (testing strategy — bridge during harness build)
31
- # @jtbd JTBD-006 (AFK loop empirical-discovery surface)
32
-
33
- SKILL_FILE="${BATS_TEST_DIRNAME}/../SKILL.md"
34
-
35
- setup() {
36
- [ -f "$SKILL_FILE" ]
37
- }
38
-
39
- # ── Deviation-candidate schema documented in ITERATION_SUMMARY contract ─────
40
-
41
- @test "SKILL.md ITERATION_SUMMARY.outstanding_questions schema documents deviation-candidate entry shape" {
42
- run grep -F "deviation-approval" "$SKILL_FILE"
43
- [ "$status" -eq 0 ]
44
- run grep -F "Deviation-candidate entry" "$SKILL_FILE"
45
- [ "$status" -eq 0 ]
46
- }
47
-
48
- @test "deviation-candidate schema requires existing_decision citation field" {
49
- run grep -F "existing_decision:" "$SKILL_FILE"
50
- [ "$status" -eq 0 ]
51
- }
52
-
53
- @test "deviation-candidate schema requires contradicting_evidence citation per ADR-026 grounding" {
54
- run grep -F "contradicting_evidence:" "$SKILL_FILE"
55
- [ "$status" -eq 0 ]
56
- run grep -F "ADR-026" "$SKILL_FILE"
57
- [ "$status" -eq 0 ]
58
- }
59
-
60
- @test "deviation-candidate schema requires proposed_shape ∈ {amend, supersede, one-time}" {
61
- run grep -F "proposed_shape:" "$SKILL_FILE"
62
- [ "$status" -eq 0 ]
63
- run grep -F '"amend" | "supersede" | "one-time"' "$SKILL_FILE"
64
- [ "$status" -eq 0 ]
65
- }
66
-
67
- # ── No-auto-deviate contract ────────────────────────────────────────────────
68
-
69
- @test "SKILL.md asserts agent does NOT auto-deviate when existing decision appears no-longer-right" {
70
- run grep -F "does **NOT auto-deviate**" "$SKILL_FILE"
71
- [ "$status" -eq 0 ]
72
- }
73
-
74
- @test "SKILL.md asserts agent never blindly follows against evidence" {
75
- run grep -F "never blindly follows against evidence" "$SKILL_FILE"
76
- [ "$status" -eq 0 ]
77
- }
78
-
79
- @test "Phase 3 contract: not-queueing-when-strong-contradicting-evidence-exists is a regression" {
80
- run grep -F "Not-queueing-when-strong-contradicting-evidence-exists is a regression" "$SKILL_FILE"
81
- [ "$status" -eq 0 ]
82
- }
83
-
84
- # ── Loop-end 5-option AskUserQuestion emit ─────────────────────────────────
85
-
86
- @test "Step 2.5 deviation-candidate loop-end emit presents the 5-option AskUserQuestion" {
87
- run grep -F "Approve + amend ADR" "$SKILL_FILE"
88
- [ "$status" -eq 0 ]
89
- run grep -F "Approve + supersede ADR" "$SKILL_FILE"
90
- [ "$status" -eq 0 ]
91
- run grep -F "Approve + one-time exception" "$SKILL_FILE"
92
- [ "$status" -eq 0 ]
93
- run grep -F "Reject (existing decision stands)" "$SKILL_FILE"
94
- [ "$status" -eq 0 ]
95
- run grep -F "Defer (need more evidence)" "$SKILL_FILE"
96
- [ "$status" -eq 0 ]
97
- }
98
-
99
- @test "Step 2.5 ranking puts deviation-approval at highest precedence" {
100
- run grep -F "deviation-approval (highest)" "$SKILL_FILE"
101
- [ "$status" -eq 0 ]
102
- }
103
-
104
- # ── Jsonl persistence across iter subprocess boundary ───────────────────────
105
-
106
- @test "SKILL.md persists outstanding_questions to .afk-run-state/outstanding-questions.jsonl" {
107
- run grep -F ".afk-run-state/outstanding-questions.jsonl" "$SKILL_FILE"
108
- [ "$status" -eq 0 ]
109
- }
110
-
111
- @test "SKILL.md cites ADR-032 pending-questions artefact precedent for the jsonl shape" {
112
- run grep -F "ADR-032 pending-questions artefact precedent" "$SKILL_FILE"
113
- [ "$status" -eq 0 ]
114
- }
115
-
116
- # ── Anti-BUFD-for-framework-evolution clause cross-reference ────────────────
117
-
118
- @test "SKILL.md cites ADR-044's anti-BUFD-for-framework-evolution as the rationale" {
119
- run grep -F "anti-BUFD-for-framework-evolution" "$SKILL_FILE"
120
- [ "$status" -eq 0 ]
121
- }
@@ -1,36 +0,0 @@
1
- #!/usr/bin/env bats
2
-
3
- # P065 / ADR-036 Confirmation line 199: work-problems SKILL.md must wire
4
- # the first-run intake-scaffold pointer + AFK fail-safe + marker contract.
5
- #
6
- # Doc-lint structural test (Permitted Exception per ADR-005). Sister bats
7
- # to manage-problem-first-run-intake-prompt.bats.
8
-
9
- setup() {
10
- REPO_ROOT="$(cd "$(dirname "$BATS_TEST_FILENAME")/../../../../.." && pwd)"
11
- SKILL_MD="$REPO_ROOT/packages/itil/skills/work-problems/SKILL.md"
12
- }
13
-
14
- @test "work-problems: SKILL.md cites ADR-036 (first-run-prompt contract)" {
15
- run grep -F 'ADR-036' "$SKILL_MD"
16
- [ "$status" -eq 0 ]
17
- }
18
-
19
- @test "work-problems: SKILL.md cross-references the scaffold-intake skill" {
20
- run grep -F 'wr-itil:scaffold-intake' "$SKILL_MD"
21
- [ "$status" -eq 0 ]
22
- }
23
-
24
- @test "work-problems: SKILL.md documents the AFK fail-safe (no auto-scaffold; iteration-report pending-note)" {
25
- # AFK orchestrator branch must NOT auto-scaffold; instead the iteration
26
- # appends a one-line "pending intake scaffold" note to its summary.
27
- # The SKILL.md preamble pointer documents this so AFK consumers see
28
- # the divergence at glance.
29
- run grep -iE 'pending.intake.scaffold|pending intake scaffold|silent note' "$SKILL_MD"
30
- [ "$status" -eq 0 ]
31
- }
32
-
33
- @test "work-problems: SKILL.md cites the decline marker path (ADR-009 + ADR-036)" {
34
- run grep -F '.claude/.intake-scaffold-declined' "$SKILL_MD"
35
- [ "$status" -eq 0 ]
36
- }