@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.
- package/.claude-plugin/plugin.json +1 -1
- package/package.json +7 -2
- package/agents/test/fixtures/proceed-new-genuinely-new.md +0 -43
- package/agents/test/fixtures/proceed-new-subtle-sibling.md +0 -47
- package/agents/test/fixtures/regression-p347-vs-p346.md +0 -54
- package/agents/test/hang-off-check.bats +0 -225
- package/hooks/test/block-list.bats +0 -153
- package/hooks/test/command-detect.bats +0 -181
- package/hooks/test/itil-assistant-output-gate.bats +0 -114
- package/hooks/test/itil-assistant-output-review.bats +0 -224
- package/hooks/test/itil-bash-polling-antipattern-detect.bats +0 -154
- package/hooks/test/itil-changeset-discipline.bats +0 -603
- package/hooks/test/itil-claude-space-protection.bats +0 -294
- package/hooks/test/itil-commit-trailer-transition-advisory.bats +0 -80
- package/hooks/test/itil-correction-detect.bats +0 -189
- package/hooks/test/itil-deferral-cadence-gate.bats +0 -187
- package/hooks/test/itil-fictional-defer-detect.bats +0 -292
- package/hooks/test/itil-fix-title-lifecycle-advisory.bats +0 -129
- package/hooks/test/itil-mid-loop-ask-detect.bats +0 -220
- package/hooks/test/itil-no-implement-draft-gate.bats +0 -210
- package/hooks/test/itil-pending-questions-surface.bats +0 -307
- package/hooks/test/itil-readme-refresh-discipline.bats +0 -642
- package/hooks/test/itil-rfc-oversight-nudge.bats +0 -83
- package/hooks/test/itil-rfc-trailer-advisory.bats +0 -375
- package/hooks/test/itil-story-mirror-migration-nudge.bats +0 -122
- package/hooks/test/manage-problem-enforce-create.bats +0 -424
- package/hooks/test/p057-staging-trap-detect.bats +0 -231
- package/hooks/test/pre-publish-intake-gate.bats +0 -144
- package/hooks/test/runtime-sid-marker.bats +0 -90
- package/hooks/test/session-id.bats +0 -370
- package/scripts/migrate-problems-add-type.sh +0 -116
- package/scripts/test/catchup-scan.bats +0 -274
- package/scripts/test/check-afk-accept-eligible.bats +0 -310
- package/scripts/test/check-fail-soft-skip-discipline.bats +0 -172
- package/scripts/test/check-fix-rfc-trace.bats +0 -164
- package/scripts/test/check-locale-discipline.bats +0 -291
- package/scripts/test/check-problems-readme-budget.bats +0 -192
- package/scripts/test/check-rfc-has-stories.bats +0 -69
- package/scripts/test/check-rfc-rejected-alternatives.bats +0 -108
- package/scripts/test/check-rfc-stories-ratified.bats +0 -82
- package/scripts/test/check-upstream-responses.bats +0 -503
- package/scripts/test/classify-readme-drift.bats +0 -392
- package/scripts/test/derive-first-dispatch.bats +0 -274
- package/scripts/test/derive-release-vehicle.bats +0 -454
- package/scripts/test/detect-unratified-stories-maps.bats +0 -60
- package/scripts/test/dual-tolerant-glob-rfc-002-t2.bats +0 -309
- package/scripts/test/effort-tally.bats +0 -170
- package/scripts/test/evaluate-relevance.bats +0 -773
- package/scripts/test/kind-a-commands.bats +0 -46
- package/scripts/test/mark-create-gate.bats +0 -59
- package/scripts/test/mark-story-oversight-confirmed.bats +0 -53
- package/scripts/test/migrate-problems-add-type.bats +0 -280
- package/scripts/test/migrate-story-status-mirror.bats +0 -167
- package/scripts/test/no-type-regression-guard.bats +0 -74
- package/scripts/test/oversight-mirror-corpus-lint.bats +0 -150
- package/scripts/test/plugin-exercise-index.bats +0 -386
- package/scripts/test/plugin-maturity-doc-lint.bats +0 -470
- package/scripts/test/plugin-maturity-populate.bats +0 -631
- package/scripts/test/plugin-maturity-render.bats +0 -469
- package/scripts/test/plugin-validate-ci-gate.bats +0 -208
- package/scripts/test/reconcile-readme.bats +0 -1007
- package/scripts/test/reconcile-rfcs.bats +0 -496
- package/scripts/test/reconcile-stories.bats +0 -173
- package/scripts/test/reconcile-story-maps.bats +0 -74
- package/scripts/test/release-watch-poll-loop.bats +0 -180
- package/scripts/test/resolve-governance-plugin-dirs.bats +0 -78
- package/scripts/test/rfc-stories-extension.bats +0 -175
- package/scripts/test/skill-invocations.bats +0 -535
- package/scripts/test/skill-md-dual-tolerant-coverage-rfc-002-t3.bats +0 -374
- package/scripts/test/story-oversight-lib.bats +0 -190
- package/scripts/test/update-jtbd-references-related-problems.bats +0 -178
- package/scripts/test/update-problem-references-section.bats +0 -242
- package/scripts/test/update-problem-rfcs-section.bats +0 -242
- package/scripts/test/update-references-section-sibling-helpers.bats +0 -80
- package/scripts/test/update-rfc-commits-section.bats +0 -77
- package/scripts/test/verify-iter-summary.bats +0 -196
- package/scripts/test/working-the-problem-traversal.bats +0 -116
- package/skills/capture-problem/test/capture-problem-step-1-5b-jtbd-trace.bats +0 -398
- package/skills/capture-problem/test/capture-problem.bats +0 -389
- package/skills/capture-story/test/capture-story-behavioural.bats +0 -317
- package/skills/capture-story-map/test/capture-story-map-behavioural.bats +0 -98
- package/skills/close-incident/test/close-incident-contract.bats +0 -146
- package/skills/link-incident/test/link-incident-contract.bats +0 -125
- package/skills/list-incidents/test/list-incidents-contract.bats +0 -115
- package/skills/list-problems/test/list-problems-contract.bats +0 -100
- package/skills/list-stories/test/list-stories-contract.bats +0 -127
- package/skills/list-story-maps/test/list-story-maps-contract.bats +0 -46
- package/skills/manage-incident/test/manage-incident-adr-044-contract.bats +0 -206
- package/skills/manage-incident/test/manage-incident-close-forwarder.bats +0 -67
- package/skills/manage-incident/test/manage-incident-link-forwarder.bats +0 -67
- package/skills/manage-incident/test/manage-incident-list-forwarder.bats +0 -68
- package/skills/manage-incident/test/manage-incident-mitigate-forwarder.bats +0 -66
- package/skills/manage-incident/test/manage-incident-restore-forwarder.bats +0 -66
- package/skills/manage-incident/test/manage-incident.bats +0 -171
- package/skills/manage-problem/test/manage-problem-adr-044-step4-derive-first.bats +0 -151
- package/skills/manage-problem/test/manage-problem-auto-migrate-step.bats +0 -53
- package/skills/manage-problem/test/manage-problem-concern-boundary.bats +0 -64
- package/skills/manage-problem/test/manage-problem-effort-buckets.bats +0 -56
- package/skills/manage-problem/test/manage-problem-external-root-cause-detection.bats +0 -119
- package/skills/manage-problem/test/manage-problem-first-run-intake-prompt.bats +0 -43
- package/skills/manage-problem/test/manage-problem-git-mv-restage-reminder.bats +0 -48
- package/skills/manage-problem/test/manage-problem-id-collision-guard.bats +0 -39
- package/skills/manage-problem/test/manage-problem-list-forwarder.bats +0 -66
- package/skills/manage-problem/test/manage-problem-next-id-origin-lookup.bats +0 -50
- package/skills/manage-problem/test/manage-problem-no-prose-options.bats +0 -74
- package/skills/manage-problem/test/manage-problem-output-formatting.bats +0 -30
- package/skills/manage-problem/test/manage-problem-parked-and-cache.bats +0 -73
- package/skills/manage-problem/test/manage-problem-readme-refresh-on-transition.bats +0 -62
- package/skills/manage-problem/test/manage-problem-readme-tie-break-order.bats +0 -318
- package/skills/manage-problem/test/manage-problem-readme-vq-sort-order.bats +0 -206
- package/skills/manage-problem/test/manage-problem-release-vehicle-seed.bats +0 -83
- package/skills/manage-problem/test/manage-problem-review-forwarder.bats +0 -71
- package/skills/manage-problem/test/manage-problem-step-9d-recovery-path.bats +0 -97
- package/skills/manage-problem/test/manage-problem-transition-forwarder.bats +0 -96
- package/skills/manage-problem/test/manage-problem-transitive-dependencies.bats +0 -365
- package/skills/manage-problem/test/manage-problem-verification-detection.bats +0 -64
- package/skills/manage-problem/test/manage-problem-verification-pending.bats +0 -114
- package/skills/manage-problem/test/manage-problem-work-forwarder.bats +0 -88
- package/skills/manage-story/test/manage-story-contract.bats +0 -174
- package/skills/manage-story-map/test/manage-story-map-contract.bats +0 -63
- package/skills/mitigate-incident/test/mitigate-incident-contract.bats +0 -258
- package/skills/reconcile-readme/test/reconcile-readme-contract.bats +0 -201
- package/skills/report-upstream/test/report-upstream-contract.bats +0 -394
- package/skills/restore-incident/test/restore-incident-contract.bats +0 -170
- package/skills/review-problems/test/inbound-channels-cache-shape.bats +0 -127
- package/skills/review-problems/test/inbound-discovery-contract.bats +0 -383
- package/skills/review-problems/test/jtbd-301-verdict-shape-contract.bats +0 -225
- package/skills/review-problems/test/review-problems-contract.bats +0 -235
- package/skills/review-problems/test/review-problems-likely-verified-cell-shape.bats +0 -229
- package/skills/scaffold-intake/test/scaffold-intake-contract.bats +0 -126
- package/skills/scaffold-intake/test/scaffold-intake-fixture.bats +0 -164
- package/skills/scaffold-intake/test/scaffold-intake-secrets-absent.bats +0 -87
- package/skills/transition-problem/test/transition-problem-contract.bats +0 -285
- package/skills/transition-problems/test/transition-problems-contract.bats +0 -331
- package/skills/update-upstream/test/update-upstream-contract.bats +0 -375
- package/skills/work-problem/test/work-problem-contract.bats +0 -294
- package/skills/work-problems/test/work-problems-above-appetite-remediation.bats +0 -139
- package/skills/work-problems/test/work-problems-adr-013-rule-6-p352-amendment.bats +0 -166
- package/skills/work-problems/test/work-problems-auto-migrate-step.bats +0 -57
- package/skills/work-problems/test/work-problems-cost-logging.bats +0 -109
- package/skills/work-problems/test/work-problems-deviation-candidate-shape.bats +0 -121
- package/skills/work-problems/test/work-problems-first-run-intake-prompt.bats +0 -36
- package/skills/work-problems/test/work-problems-inter-iteration-verify.bats +0 -59
- package/skills/work-problems/test/work-problems-mid-loop-userpromptsubmit-handler.bats +0 -69
- package/skills/work-problems/test/work-problems-no-mid-loop-asking.bats +0 -192
- package/skills/work-problems/test/work-problems-p341-pre-all-done-gate.bats +0 -122
- package/skills/work-problems/test/work-problems-p342-r007-derive-then-pass-flags.bats +0 -170
- package/skills/work-problems/test/work-problems-p342-retro-auto-ticket-carveout.bats +0 -120
- package/skills/work-problems/test/work-problems-preflight-failure-handling.bats +0 -248
- package/skills/work-problems/test/work-problems-preflight-session-continuity.bats +0 -139
- package/skills/work-problems/test/work-problems-preflight.bats +0 -69
- package/skills/work-problems/test/work-problems-release-cadence.bats +0 -63
- package/skills/work-problems/test/work-problems-step-0-iter-error-staleness.bats +0 -93
- package/skills/work-problems/test/work-problems-step-0b-cache-staleness-behavioural.bats +0 -138
- package/skills/work-problems/test/work-problems-step-0c-deferred-placeholder-staleness-behavioural.bats +0 -238
- package/skills/work-problems/test/work-problems-step-0d-outbound-responses-staleness-behavioural.bats +0 -174
- package/skills/work-problems/test/work-problems-step-2-5-routing.bats +0 -80
- package/skills/work-problems/test/work-problems-step-2-5b-cross-halt-routing.bats +0 -149
- package/skills/work-problems/test/work-problems-step-3-5-jtbd-ratification-predicate.bats +0 -191
- package/skills/work-problems/test/work-problems-step-5-bats-polling-discipline.bats +0 -91
- package/skills/work-problems/test/work-problems-step-5-delegation.bats +0 -333
- package/skills/work-problems/test/work-problems-step-5-idle-timeout-sigterm.bats +0 -421
- package/skills/work-problems/test/work-problems-step-5-is-error-transient-halt.bats +0 -278
- package/skills/work-problems/test/work-problems-step-5-iter-changeset-required.bats +0 -95
- package/skills/work-problems/test/work-problems-step-5-prompt-body-re-grounding.bats +0 -128
- package/skills/work-problems/test/work-problems-step-5-stream-timeout-salvage.bats +0 -251
- package/skills/work-problems/test/work-problems-step-6-5-always-drain.bats +0 -203
- package/skills/work-problems/test/work-problems-step-6-5-cache-refresh-chain.bats +0 -174
- package/skills/work-problems/test/work-problems-step-6-5-fix-and-continue.bats +0 -254
- package/skills/work-problems/test/work-problems-step-6-5-postrelease-kv-callback.bats +0 -209
- 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
|
-
}
|