@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,125 +0,0 @@
1
- #!/usr/bin/env bats
2
- # Contract assertions for /wr-itil:link-incident (P071 split slice 6d).
3
- #
4
- # This skill hosts the "link an incident to a problem" user intent
5
- # previously hidden behind /wr-itil:manage-incident <I> link P<M>. It
6
- # verifies the target problem file exists, then writes (or updates) the
7
- # ## Linked Problem section of the incident file with the problem ID,
8
- # title, and current status.
9
- #
10
- # Structural assertion — Permitted Exception to the source-grep ban
11
- # (ADR-005 / P011 / ADR-037 contract-assertion pattern).
12
- #
13
- # @problem P071
14
- # @jtbd JTBD-001 (enforce governance without slowing down — discoverable surface)
15
- # @jtbd JTBD-101 (extend the suite with clear patterns — one skill per distinct user intent)
16
- # @jtbd JTBD-201 (restore service fast with an audit trail — Linked Problem traceability)
17
- #
18
- # Cross-reference:
19
- # P071: docs/problems/071-argument-based-skill-subcommands-are-not-discoverable.open.md
20
- # ADR-010 amended (Skill Granularity section) — split naming + forwarder contract
21
- # ADR-011 — manage-incident skill-wrapping precedent (Linked Problem section)
22
- # ADR-037 — contract-assertion bats pattern
23
-
24
- setup() {
25
- SKILL_DIR="$(cd "$(dirname "$BATS_TEST_FILENAME")/.." && pwd)"
26
- SKILL_FILE="${SKILL_DIR}/SKILL.md"
27
- }
28
-
29
- @test "SKILL.md exists and has frontmatter" {
30
- [ -f "$SKILL_FILE" ]
31
- run head -1 "$SKILL_FILE"
32
- [ "$status" -eq 0 ]
33
- [ "$output" = "---" ]
34
- }
35
-
36
- @test "SKILL.md frontmatter name is wr-itil:link-incident (P071 + ADR-010 amended)" {
37
- # Split naming convention per ADR-010 amendment: <verb>-<object> pair.
38
- # The new skill's name must match the phased-landing plan pinned in P071.
39
- run grep -n "^name: wr-itil:link-incident$" "$SKILL_FILE"
40
- [ "$status" -eq 0 ]
41
- }
42
-
43
- @test "SKILL.md frontmatter description names the link intent (P071)" {
44
- # Description must name "link" and "incident" / "problem" so Claude Code
45
- # autocomplete surfaces the user intent rather than a generic name.
46
- run grep -inE "^description:.*link.*(incident|problem)|^description:.*(incident|problem).*link" "$SKILL_FILE"
47
- [ "$status" -eq 0 ]
48
- }
49
-
50
- @test "SKILL.md frontmatter allowed-tools grants file-mutation surface (P071 — link requires read + edit)" {
51
- # link-incident verifies the problem file exists (Read + Glob/Bash),
52
- # reads the incident file (Read), and writes the Linked Problem
53
- # section (Edit / Write). No Skill tool (no cross-skill invocation),
54
- # no AskUserQuestion (both args are data parameters).
55
- run grep -nE "^allowed-tools:" "$SKILL_FILE"
56
- [ "$status" -eq 0 ]
57
- run grep -nE "^allowed-tools:.*Write" "$SKILL_FILE"
58
- [ "$status" -eq 0 ]
59
- run grep -nE "^allowed-tools:.*Edit" "$SKILL_FILE"
60
- [ "$status" -eq 0 ]
61
- run grep -nE "^allowed-tools:.*Bash" "$SKILL_FILE"
62
- [ "$status" -eq 0 ]
63
- }
64
-
65
- @test "SKILL.md documents the P<MMM> problem-file lookup (P071 + ADR-011)" {
66
- # The link operation verifies docs/problems/P<MMM>-*.md exists before
67
- # writing the Linked Problem section. The SKILL.md must name the
68
- # problem-file lookup explicitly so the cross-directory dependency is
69
- # legible.
70
- run grep -inE "docs/problems|P<MMM>|P<NNN>|problem file" "$SKILL_FILE"
71
- [ "$status" -eq 0 ]
72
- }
73
-
74
- @test "SKILL.md documents the ## Linked Problem section write (P071 + ADR-011)" {
75
- # The link operation writes (or updates) the ## Linked Problem section
76
- # with `P<MMM> (<title>) — <status>`. The SKILL.md must name the
77
- # section explicitly so the audit-trail invariant (JTBD-201) is
78
- # preserved post-split.
79
- run grep -inE "Linked Problem" "$SKILL_FILE"
80
- [ "$status" -eq 0 ]
81
- }
82
-
83
- @test "SKILL.md documents both data-parameter arguments (P071 — incident ID + problem ID)" {
84
- # link-incident takes two positional data parameters: the incident ID
85
- # (I###) and the problem ID (P###). The SKILL.md must document both
86
- # so the argument shape is legible.
87
- run grep -inE "I<NNN>|I<###>|incident ID|I007|<I###>" "$SKILL_FILE"
88
- [ "$status" -eq 0 ]
89
- run grep -inE "P<MMM>|P<###>|P<NNN>|problem ID" "$SKILL_FILE"
90
- [ "$status" -eq 0 ]
91
- }
92
-
93
- @test "SKILL.md cites P071 and ADR-010 amended (P071 + ADR-025)" {
94
- # ADR-025 inheritance per ADR-037: contract-assertion bats should reflect
95
- # traceability cites on the skill spec document.
96
- run grep -inE "P071|ADR-010" "$SKILL_FILE"
97
- [ "$status" -eq 0 ]
98
- }
99
-
100
- @test "SKILL.md cites ADR-011 for the Linked Problem section convention (P071 + ADR-011)" {
101
- # link-incident inherits the Linked Problem section convention from
102
- # ADR-011. The SKILL.md must cite ADR-011 so the precedent chain is
103
- # legible.
104
- run grep -inE "ADR-011" "$SKILL_FILE"
105
- [ "$status" -eq 0 ]
106
- }
107
-
108
- @test "SKILL.md does not carry a deprecated-arguments frontmatter flag (clean-split skill)" {
109
- # link-incident is a clean-split skill with no argument-subcommands
110
- # itself (its arguments are data parameters — incident ID + problem ID).
111
- # ADR-010 amendment's `deprecated-arguments: true` flag is only valid
112
- # on host skills with forwarder routes. link-incident is a forwarder
113
- # TARGET, not a host. It must NOT carry the flag.
114
- run grep -E "^deprecated-arguments:" "$SKILL_FILE"
115
- [ "$status" -ne 0 ]
116
- }
117
-
118
- @test "SKILL.md does not use word-argument subcommand branching (P071 regression guard)" {
119
- # The whole point of P071: Claude Code autocomplete does not surface
120
- # word-argument subcommands. A clean-split skill must not reintroduce
121
- # word-arg subcommand routing. The data parameters <I> and <P> are
122
- # strings, not verb keywords.
123
- run grep -inE "If arguments start with \"(list|mitigate|restore|close|link)\"|If arguments contain \"(list|mitigate|restore|close|link)\"" "$SKILL_FILE"
124
- [ "$status" -ne 0 ]
125
- }
@@ -1,115 +0,0 @@
1
- #!/usr/bin/env bats
2
- # Contract assertions for /wr-itil:list-incidents (P071 split slice 5).
3
- #
4
- # This skill hosts the "list active incidents" user intent previously
5
- # hidden behind /wr-itil:manage-incident list. It is a pure read-only
6
- # display skill — no branching, no interaction, no file edits.
7
- #
8
- # Structural assertion — Permitted Exception to the source-grep ban
9
- # (ADR-005 / P011 / ADR-037 contract-assertion pattern).
10
- #
11
- # @problem P071
12
- # @jtbd JTBD-001 (enforce governance without slowing down — discoverable surface)
13
- # @jtbd JTBD-101 (extend the suite with clear patterns — one skill per distinct user intent)
14
- # @jtbd JTBD-201 (restore service fast with an audit trail — incident status visibility)
15
- #
16
- # Cross-reference:
17
- # P071: docs/problems/071-argument-based-skill-subcommands-are-not-discoverable.open.md
18
- # ADR-010 amended (Skill Granularity section) — split naming + forwarder contract
19
- # ADR-011 — manage-incident skill-wrapping precedent (list-incidents mirrors its file conventions)
20
- # ADR-037 — contract-assertion bats pattern
21
-
22
- setup() {
23
- SKILL_DIR="$(cd "$(dirname "$BATS_TEST_FILENAME")/.." && pwd)"
24
- SKILL_FILE="${SKILL_DIR}/SKILL.md"
25
- }
26
-
27
- @test "SKILL.md exists and has frontmatter" {
28
- [ -f "$SKILL_FILE" ]
29
- run head -1 "$SKILL_FILE"
30
- [ "$status" -eq 0 ]
31
- [ "$output" = "---" ]
32
- }
33
-
34
- @test "SKILL.md frontmatter name is wr-itil:list-incidents (P071 + ADR-010 amended)" {
35
- # Split naming convention per ADR-010 amendment: <verb>-<object> pair.
36
- # The new skill's name must match the phased-landing plan pinned in P071.
37
- run grep -n "^name: wr-itil:list-incidents$" "$SKILL_FILE"
38
- [ "$status" -eq 0 ]
39
- }
40
-
41
- @test "SKILL.md frontmatter description names the list intent (P071)" {
42
- # Description must name "list" and "incident" so Claude Code autocomplete
43
- # surfaces the user intent rather than a generic name.
44
- run grep -inE "^description:.*list.*incident|^description:.*incident.*list" "$SKILL_FILE"
45
- [ "$status" -eq 0 ]
46
- }
47
-
48
- @test "SKILL.md frontmatter allowed-tools is read-only (P071 — read-only list display)" {
49
- # Pure read-only list display (mirrors list-problems slice 1). No Write,
50
- # no Edit, no AskUserQuestion. This assertion is the enforceable contract —
51
- # future maintainers cannot accidentally grow the tool surface past the
52
- # intent.
53
- run grep -nE "^allowed-tools:" "$SKILL_FILE"
54
- [ "$status" -eq 0 ]
55
- run grep -E "^allowed-tools:.*(Write|Edit|AskUserQuestion)" "$SKILL_FILE"
56
- [ "$status" -ne 0 ]
57
- }
58
-
59
- @test "SKILL.md documents the read-only scan scope (P071 + ADR-011)" {
60
- # The skill reads the three active incident statuses per ADR-011:
61
- # .investigating.md, .mitigating.md, and .restored.md. Closed incidents
62
- # are omitted (the view is active backlog, not archive). The SKILL.md
63
- # must name all three glob patterns explicitly so the contract is
64
- # legible.
65
- run grep -inE "\.investigating\.md" "$SKILL_FILE"
66
- [ "$status" -eq 0 ]
67
- run grep -inE "\.mitigating\.md" "$SKILL_FILE"
68
- [ "$status" -eq 0 ]
69
- run grep -inE "\.restored\.md" "$SKILL_FILE"
70
- [ "$status" -eq 0 ]
71
- }
72
-
73
- @test "SKILL.md documents severity-sorted output (P071 + ADR-011)" {
74
- # Unlike list-problems (WSJF-sorted), list-incidents is severity-sorted
75
- # per ADR-011 "Severity, not WSJF" — incidents are time-bound events
76
- # where effort divisor is meaningless. The SKILL.md must name severity
77
- # as the sort key.
78
- run grep -inE "severity" "$SKILL_FILE"
79
- [ "$status" -eq 0 ]
80
- }
81
-
82
- @test "SKILL.md cites P071 and ADR-010 amended (P071 + ADR-025)" {
83
- # ADR-025 inheritance per ADR-037: contract-assertion bats should reflect
84
- # traceability cites on the skill spec document.
85
- run grep -inE "P071|ADR-010" "$SKILL_FILE"
86
- [ "$status" -eq 0 ]
87
- }
88
-
89
- @test "SKILL.md does not carry a deprecated-arguments frontmatter flag (clean-split skill)" {
90
- # list-incidents is a clean-split skill with no argument-subcommands
91
- # itself. ADR-010 amendment's `deprecated-arguments: true` flag is only
92
- # valid on host skills with forwarder routes — list-incidents is the
93
- # forwarder TARGET, not the host. It must NOT carry the flag.
94
- run grep -E "^deprecated-arguments:" "$SKILL_FILE"
95
- [ "$status" -ne 0 ]
96
- }
97
-
98
- @test "SKILL.md does not use word-argument subcommand branching (P071 regression guard)" {
99
- # The whole point of P071: Claude Code autocomplete does not surface
100
- # arguments. A clean-split skill must not reintroduce word-arg subcommand
101
- # routing. The SKILL.md must not contain `If arguments start with "list"`
102
- # / `If arguments contain "mitigate"` / etc. patterns.
103
- run grep -inE "If arguments start with|If arguments contain" "$SKILL_FILE"
104
- [ "$status" -ne 0 ]
105
- }
106
-
107
- @test "SKILL.md documents the ownership boundary — no README rewrite (P071)" {
108
- # list-incidents displays active incidents but does NOT maintain a README
109
- # cache (unlike list-problems which reads a README written by review-problems).
110
- # For incidents, there is no README cache — the skill always runs a live
111
- # scan. The SKILL.md must explicitly name the "read-only / no-edit" stance
112
- # so the ownership boundary is legible to future maintainers.
113
- run grep -inE "read-only|does not (edit|modify|rewrite|commit)" "$SKILL_FILE"
114
- [ "$status" -eq 0 ]
115
- }
@@ -1,100 +0,0 @@
1
- #!/usr/bin/env bats
2
- # Contract assertions for /wr-itil:list-problems (P071 split slice 1).
3
- #
4
- # This skill hosts the "list open and known-error problems" user intent
5
- # previously hidden behind /wr-itil:manage-problem list. It is a pure
6
- # read-only display skill — no branching, no interaction, no file edits.
7
- #
8
- # Structural assertion — Permitted Exception to the source-grep ban
9
- # (ADR-005 / P011 / ADR-037 contract-assertion pattern).
10
- #
11
- # @problem P071
12
- # @jtbd JTBD-001 (enforce governance without slowing down — discoverable surface)
13
- # @jtbd JTBD-101 (extend the suite with clear patterns — one skill per distinct user intent)
14
- #
15
- # Cross-reference:
16
- # P071: docs/problems/071-argument-based-skill-subcommands-are-not-discoverable.open.md
17
- # ADR-010 amended (Skill Granularity section) — split naming + forwarder contract
18
- # ADR-022 — Verification Pending status conventions (list-problems respects `.verifying.md` exclusion)
19
- # ADR-037 — contract-assertion bats pattern
20
-
21
- setup() {
22
- SKILL_DIR="$(cd "$(dirname "$BATS_TEST_FILENAME")/.." && pwd)"
23
- SKILL_FILE="${SKILL_DIR}/SKILL.md"
24
- }
25
-
26
- @test "SKILL.md exists and has frontmatter" {
27
- [ -f "$SKILL_FILE" ]
28
- run head -1 "$SKILL_FILE"
29
- [ "$status" -eq 0 ]
30
- [ "$output" = "---" ]
31
- }
32
-
33
- @test "SKILL.md frontmatter name is wr-itil:list-problems (P071 + ADR-010 amended)" {
34
- # Split naming convention per ADR-010 amendment: <verb>-<object> pair.
35
- # The new skill's name must match the phased-landing plan pinned in P071.
36
- run grep -n "^name: wr-itil:list-problems$" "$SKILL_FILE"
37
- [ "$status" -eq 0 ]
38
- }
39
-
40
- @test "SKILL.md frontmatter description names the list intent (P071)" {
41
- # Description must name "list" and "problem" so Claude Code autocomplete
42
- # surfaces the user intent rather than a generic name.
43
- run grep -inE "^description:.*list.*problem|^description:.*problem.*list" "$SKILL_FILE"
44
- [ "$status" -eq 0 ]
45
- }
46
-
47
- @test "SKILL.md frontmatter allowed-tools is read-only (P071 + architect Q3)" {
48
- # Architect Q3: pure read-only list display. No Write, no Edit, no
49
- # AskUserQuestion. This assertion is the enforceable contract — future
50
- # maintainers cannot accidentally grow the tool surface past the intent.
51
- run grep -nE "^allowed-tools:" "$SKILL_FILE"
52
- [ "$status" -eq 0 ]
53
- run grep -E "^allowed-tools:.*(Write|Edit|AskUserQuestion)" "$SKILL_FILE"
54
- [ "$status" -ne 0 ]
55
- }
56
-
57
- @test "SKILL.md documents the read-only scan scope (P071)" {
58
- # The skill reads .open.md and .known-error.md files from docs/problems/.
59
- # .verifying.md and .parked.md are excluded from the dev-work ranking per
60
- # ADR-022 (Verification Pending) and the Parked-policy; but they MAY be
61
- # shown in dedicated sections. The SKILL.md must name both `.open.md` and
62
- # `.known-error.md` glob patterns explicitly so the contract is legible.
63
- run grep -inE "\.open\.md" "$SKILL_FILE"
64
- [ "$status" -eq 0 ]
65
- run grep -inE "\.known-error\.md" "$SKILL_FILE"
66
- [ "$status" -eq 0 ]
67
- }
68
-
69
- @test "SKILL.md reuses the git-log freshness check from manage-problem review (P071 + architect Q4)" {
70
- # Architect Q4: reuse the git-log freshness check from manage-problem
71
- # review (same skill suite, same cache semantics per P031).
72
- run grep -inE "git log.*README\.md|readme_commit|git log -1 --format=%H" "$SKILL_FILE"
73
- [ "$status" -eq 0 ]
74
- }
75
-
76
- @test "SKILL.md cites P071 and ADR-010 amended (P071 + ADR-025)" {
77
- # ADR-025 inheritance per ADR-037: contract-assertion bats should reflect
78
- # traceability cites on the skill spec document.
79
- run grep -inE "P071|ADR-010" "$SKILL_FILE"
80
- [ "$status" -eq 0 ]
81
- }
82
-
83
- @test "SKILL.md does not carry a deprecated-arguments frontmatter flag (clean-split skill)" {
84
- # Architect advisory: list-problems is a clean-split skill with no
85
- # argument-subcommands itself. ADR-010 amendment's
86
- # `deprecated-arguments: true` flag is only valid on host skills with
87
- # forwarder routes — list-problems is the forwarder TARGET, not the
88
- # host. It must NOT carry the flag.
89
- run grep -E "^deprecated-arguments:" "$SKILL_FILE"
90
- [ "$status" -ne 0 ]
91
- }
92
-
93
- @test "SKILL.md does not use word-argument subcommand branching (P071 regression guard)" {
94
- # The whole point of P071: Claude Code autocomplete does not surface
95
- # arguments. A clean-split skill must not reintroduce word-arg subcommand
96
- # routing. The SKILL.md must not contain `If arguments start with "list"`
97
- # / `If arguments contain "work"` / etc. patterns.
98
- run grep -inE "If arguments start with|If arguments contain" "$SKILL_FILE"
99
- [ "$status" -ne 0 ]
100
- }
@@ -1,127 +0,0 @@
1
- #!/usr/bin/env bats
2
- # Behavioural contract fixtures for /wr-itil:list-stories (P170 Phase 2 Slice 10).
3
- #
4
- # Per ADR-037 + ADR-052: behavioural tests over structural prose-grep.
5
- # These tests exercise the read-only display surface contract — read
6
- # story files, render markdown tables, no edits.
7
- #
8
- # Behavioural surfaces under test:
9
- # 1. SKILL.md presence + canonical name (minimum discoverability).
10
- # 2. Read-only contract — no Write/Edit tools in frontmatter.
11
- # 3. Lifecycle enumeration — list-stories enumerates all five state
12
- # subdirectories (draft / accepted / in-progress / done / archived).
13
- # 4. RFC-filter ordering — when --rfc filter is provided, ordering
14
- # follows the RFC frontmatter `stories:` array, not lexical /
15
- # filesystem order.
16
- #
17
- # @problem P170
18
- # @jtbd JTBD-008 (Decompose a Fix Into Coordinated Changes — list view
19
- # supports the working-the-problem flow's per-RFC iter
20
- # dispatch in Slice 13)
21
- # @jtbd JTBD-006 (Progress the Backlog While I'm Away — filtered mode
22
- # feeds the AFK orchestrator)
23
- # @adr ADR-060 (Problem-RFC-Story framework — story tier line 294
24
- # list-stories description)
25
- # @adr ADR-037 (Skill testing strategy — contract bats)
26
- # @adr ADR-052 (Behavioural-tests-default)
27
- # @adr ADR-010 (Amended skill granularity — phased-landing split
28
- # precedent from list-problems / P071)
29
-
30
- setup() {
31
- REPO_ROOT="$(cd "$(dirname "$BATS_TEST_FILENAME")/../../../../.." && pwd)"
32
- SKILL_FILE="${REPO_ROOT}/packages/itil/skills/list-stories/SKILL.md"
33
-
34
- TMPROOT=$(mktemp -d)
35
- ORIG_DIR="$PWD"
36
- cd "$TMPROOT"
37
- # Set up minimal story corpus fixture
38
- mkdir -p docs/stories/draft docs/stories/accepted docs/stories/in-progress docs/stories/done docs/stories/archived
39
- mkdir -p docs/rfcs
40
- }
41
-
42
- teardown() {
43
- cd "$ORIG_DIR"
44
- rm -rf "$TMPROOT"
45
- }
46
-
47
- # ---------------------------------------------------------------------------
48
- # Surface 0: SKILL.md exists with correct name (minimum discoverability)
49
- # ---------------------------------------------------------------------------
50
-
51
- @test "list-stories: SKILL.md exists" {
52
- [ -f "$SKILL_FILE" ]
53
- }
54
-
55
- @test "list-stories: SKILL.md frontmatter declares wr-itil:list-stories name" {
56
- run grep -E '^name: wr-itil:list-stories$' "$SKILL_FILE"
57
- [ "$status" -eq 0 ]
58
- }
59
-
60
- # ---------------------------------------------------------------------------
61
- # Surface 1: Read-only contract — no Write/Edit in allowed-tools
62
- # (ADR-010 phased-landing split rule: list-* skills are pure read views)
63
- # ---------------------------------------------------------------------------
64
-
65
- @test "list-stories: SKILL.md allowed-tools does NOT include Write or Edit" {
66
- # Behavioural: extract the allowed-tools line and check it omits the
67
- # write tools. The list-* family is read-only by contract per ADR-010.
68
- run grep '^allowed-tools:' "$SKILL_FILE"
69
- [ "$status" -eq 0 ]
70
- [[ "$output" != *"Write"* ]]
71
- [[ "$output" != *"Edit"* ]]
72
- }
73
-
74
- # ---------------------------------------------------------------------------
75
- # Surface 2: Lifecycle enumeration — all 5 state subdirectories
76
- # (story lifecycle per ADR-060 mirrors problem lifecycle ADR-022)
77
- # ---------------------------------------------------------------------------
78
-
79
- @test "list-stories: SKILL.md names all 5 lifecycle state subdirectories" {
80
- # The Scope section enumerates the lifecycle states. Without all five,
81
- # the list view would miss stories in some lifecycle state silently —
82
- # a behavioural defect not a prose preference.
83
- for state in draft accepted in-progress done archived; do
84
- run grep -E "docs/stories/${state}" "$SKILL_FILE"
85
- [ "$status" -eq 0 ]
86
- done
87
- }
88
-
89
- # ---------------------------------------------------------------------------
90
- # Surface 3: --rfc filter ordering follows RFC frontmatter `stories:` array
91
- # (load-bearing for the working-the-problem flow per ADR-060 line 314)
92
- # ---------------------------------------------------------------------------
93
-
94
- @test "list-stories: --rfc filter mode enumerates stories via RFC frontmatter stories array" {
95
- # The SKILL.md filter-mode pseudocode reads the RFC's frontmatter and
96
- # extracts STORY-NNN tokens in order. This is the load-bearing
97
- # behaviour for Slice 13's working-the-problem traversal — verify
98
- # the SKILL prescribes RFC-frontmatter-driven order, not filesystem
99
- # / lexical order.
100
- run grep -E 'stories_list.*RFC|stories: array|RFC frontmatter' "$SKILL_FILE"
101
- [ "$status" -eq 0 ]
102
- }
103
-
104
- # ---------------------------------------------------------------------------
105
- # Surface 4: Cache-freshness check pattern — same git log shape as list-problems
106
- # (P031: filesystem mtime unreliable in worktrees; git history is authoritative)
107
- # ---------------------------------------------------------------------------
108
-
109
- @test "list-stories: SKILL.md uses git log cache-freshness pattern per P031" {
110
- run grep -E 'git log -1 --format=%H -- docs/stories/README\.md' "$SKILL_FILE"
111
- [ "$status" -eq 0 ]
112
- }
113
-
114
- # ---------------------------------------------------------------------------
115
- # Surface 5: No-WSJF-leak — I11 invariant
116
- # (ADR-060 line 253: stories MUST NOT carry a WSJF field in Phase 2)
117
- # ---------------------------------------------------------------------------
118
-
119
- @test "list-stories: SKILL.md does NOT render a WSJF column (I11 invariant)" {
120
- # Phase 2 invariant: no story-level WSJF. The display tables must
121
- # not include a WSJF column header. This is a behavioural contract
122
- # at the SKILL output surface, not a prose-grep.
123
- # The output tables specified in SKILL.md should have NO 'WSJF' header.
124
- # Find any markdown table header line and verify none include WSJF.
125
- run grep -E '^\| WSJF\b|\| WSJF \|' "$SKILL_FILE"
126
- [ "$status" -ne 0 ]
127
- }
@@ -1,46 +0,0 @@
1
- #!/usr/bin/env bats
2
- # Behavioural contract fixtures for /wr-itil:list-story-maps (P170 Phase 2 Slice 6).
3
-
4
- setup() {
5
- REPO_ROOT="$(cd "$(dirname "$BATS_TEST_FILENAME")/../../../../.." && pwd)"
6
- SKILL_FILE="${REPO_ROOT}/packages/itil/skills/list-story-maps/SKILL.md"
7
- }
8
-
9
- @test "list-story-maps: SKILL.md exists" {
10
- [ -f "$SKILL_FILE" ]
11
- }
12
-
13
- @test "list-story-maps: SKILL.md frontmatter declares wr-itil:list-story-maps name" {
14
- run grep -E '^name: wr-itil:list-story-maps$' "$SKILL_FILE"
15
- [ "$status" -eq 0 ]
16
- }
17
-
18
- @test "list-story-maps: SKILL.md allowed-tools does NOT include Write or Edit (read-only contract)" {
19
- run grep '^allowed-tools:' "$SKILL_FILE"
20
- [ "$status" -eq 0 ]
21
- [[ "$output" != *"Write"* ]]
22
- [[ "$output" != *"Edit"* ]]
23
- }
24
-
25
- @test "list-story-maps: SKILL.md names all 5 lifecycle state subdirectories" {
26
- for state in draft accepted in-progress completed archived; do
27
- run grep -E "docs/story-maps/${state}|${state}/" "$SKILL_FILE"
28
- [ "$status" -eq 0 ]
29
- done
30
- }
31
-
32
- @test "list-story-maps: SKILL.md does NOT render a WSJF column (I5 invariant)" {
33
- # Story-maps are planning artefacts, not work items — no WSJF per ADR-060 line 145.
34
- run grep -E '^\| WSJF\b|\| WSJF \|' "$SKILL_FILE"
35
- [ "$status" -ne 0 ]
36
- }
37
-
38
- @test "list-story-maps: SKILL.md names <meta> block parse target per ADR-060 lines 381-435" {
39
- run grep -E '<meta name=|xmllint.*meta' "$SKILL_FILE"
40
- [ "$status" -eq 0 ]
41
- }
42
-
43
- @test "list-story-maps: SKILL.md uses git log cache-freshness pattern per P031" {
44
- run grep -E 'git log -1 --format=%H -- docs/story-maps/README\.md' "$SKILL_FILE"
45
- [ "$status" -eq 0 ]
46
- }