@windyroad/itil 1.2.0 → 2.0.0-preview.1111
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/.agents/plugins/marketplace.json +12 -0
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +42 -0
- package/README.md +34 -25
- package/agents/hang-off-check.md +34 -34
- package/bin/install.mjs +71 -5
- package/bin/wr-itil-catchup-scan +4 -4
- package/bin/wr-itil-check-deferred-placeholder-staleness +4 -4
- package/bin/wr-itil-check-fail-soft-skip-discipline +4 -4
- package/bin/wr-itil-check-fix-rfc-trace +4 -4
- package/bin/wr-itil-check-locale-discipline +4 -4
- package/bin/wr-itil-check-outbound-responses-staleness +4 -4
- package/bin/wr-itil-check-problems-readme-budget +4 -4
- package/bin/wr-itil-check-rfc-has-stories +4 -4
- package/bin/wr-itil-check-rfc-stories-ratified +4 -4
- package/bin/wr-itil-check-ticket-jtbd-ratification +4 -4
- package/bin/wr-itil-check-upstream-cache-staleness +4 -4
- package/bin/wr-itil-check-upstream-responses +4 -4
- package/bin/wr-itil-classify-readme-drift +4 -4
- package/bin/wr-itil-derive-release-vehicle +4 -4
- package/bin/wr-itil-detect-unratified-stories-maps +4 -4
- package/bin/wr-itil-effort-tally +4 -4
- package/bin/wr-itil-enumerate-postrelease-kv-candidates +4 -4
- package/bin/wr-itil-evaluate-relevance +4 -4
- package/bin/wr-itil-mark-create-gate +4 -4
- package/bin/wr-itil-mark-story-oversight-confirmed +4 -4
- package/bin/wr-itil-migrate-problems-layout +4 -4
- package/bin/wr-itil-migrate-story-status-mirror +4 -4
- package/bin/wr-itil-next-rfc-id +4 -4
- package/bin/wr-itil-plugin-exercise-index +4 -4
- package/bin/wr-itil-plugin-maturity-populate +4 -4
- package/bin/wr-itil-plugin-maturity-render +4 -4
- package/bin/wr-itil-plugin-validate-ci-gate +4 -4
- package/bin/wr-itil-reconcile-readme +4 -4
- package/bin/wr-itil-reconcile-rfcs +4 -4
- package/bin/wr-itil-reconcile-stories +4 -4
- package/bin/wr-itil-reconcile-story-maps +4 -4
- package/bin/wr-itil-render-story-map +4 -4
- package/bin/wr-itil-resolve-governance-plugin-dirs +4 -4
- package/bin/wr-itil-skill-invocations +4 -4
- package/bin/wr-itil-story-map-edit +4 -4
- package/bin/wr-itil-story-map-query +4 -4
- package/bin/wr-itil-update-jtbd-references-section +4 -4
- package/bin/wr-itil-update-problem-references-section +4 -4
- package/bin/wr-itil-update-problem-rfcs-section +4 -4
- package/bin/wr-itil-update-rfc-commits-section +4 -4
- package/bin/wr-itil-update-rfc-references-section +4 -4
- package/bin/wr-itil-verify-iter-summary +4 -4
- package/hooks/itil-assistant-output-gate.sh +3 -3
- package/hooks/itil-assistant-output-review.sh +5 -5
- package/hooks/itil-bash-polling-antipattern-detect.sh +11 -11
- package/hooks/itil-changeset-discipline.sh +24 -24
- package/hooks/itil-claude-space-protection.sh +21 -14
- package/hooks/itil-codex-dispatch.sh +164 -0
- package/hooks/itil-commit-trailer-transition-advisory.sh +11 -11
- package/hooks/itil-correction-detect.sh +8 -8
- package/hooks/itil-deferral-cadence-gate.sh +23 -23
- package/hooks/itil-fictional-defer-detect.sh +16 -16
- package/hooks/itil-fix-title-lifecycle-advisory.sh +11 -11
- package/hooks/itil-mid-loop-ask-detect.sh +14 -14
- package/hooks/itil-no-implement-draft-gate.sh +18 -18
- package/hooks/itil-pending-questions-surface.sh +11 -11
- package/hooks/itil-readme-refresh-discipline.sh +27 -27
- package/hooks/itil-rfc-oversight-nudge.sh +7 -7
- package/hooks/itil-rfc-trailer-advisory.sh +28 -28
- package/hooks/itil-runtime-sid-marker.sh +11 -11
- package/hooks/itil-story-mirror-migration-nudge.sh +7 -7
- package/hooks/lib/block-list.sh +17 -17
- package/hooks/lib/changeset-detect.sh +27 -27
- package/hooks/lib/claude-space-gate.sh +23 -15
- package/hooks/lib/command-detect.sh +12 -12
- package/hooks/lib/create-gate.sh +9 -39
- package/hooks/lib/detectors.sh +12 -12
- package/hooks/lib/readme-refresh-detect.sh +51 -51
- package/hooks/lib/runtime-sid.sh +12 -12
- package/hooks/lib/session-id.sh +28 -28
- package/hooks/lib/session-marker.sh +1 -1
- package/hooks/lib/staging-detect.sh +13 -13
- package/hooks/manage-problem-enforce-create.sh +16 -27
- package/hooks/p057-staging-trap-detect.sh +18 -18
- package/hooks/pre-publish-intake-gate.sh +5 -5
- package/hooks/staleness-check.sh +6 -6
- package/hooks-codex/hooks.json +57 -0
- package/lib/check-deferred-placeholder-staleness.sh +10 -10
- package/lib/check-outbound-responses-staleness.sh +2 -2
- package/lib/check-upstream-cache-staleness.sh +2 -2
- package/lib/derive-first-dispatch.sh +19 -19
- package/lib/enumerate-postrelease-kv-candidates.sh +18 -18
- package/lib/migrate-problems-layout.sh +12 -12
- package/lib/story-oversight.sh +27 -27
- package/package.json +16 -3
- package/scripts/catchup-scan.sh +25 -25
- package/scripts/check-fail-soft-skip-discipline.sh +10 -10
- package/scripts/check-fix-rfc-trace.sh +8 -8
- package/scripts/check-locale-discipline.sh +13 -13
- package/scripts/check-problems-readme-budget.sh +12 -12
- package/scripts/check-rfc-has-stories.sh +7 -7
- package/scripts/check-rfc-rejected-alternatives.sh +11 -11
- package/scripts/check-rfc-stories-ratified.sh +9 -9
- package/scripts/check-ticket-jtbd-ratification.sh +10 -10
- package/scripts/check-upstream-responses.sh +22 -22
- package/scripts/classify-readme-drift.sh +13 -13
- package/scripts/codex-agent.mjs +104 -0
- package/scripts/derive-release-vehicle.sh +23 -23
- package/scripts/detect-unoversighted-rfcs.sh +3 -3
- package/scripts/detect-unratified-stories-maps.sh +5 -5
- package/scripts/effort-tally.sh +10 -10
- package/scripts/evaluate-relevance.sh +16 -16
- package/scripts/mark-create-gate.sh +4 -4
- package/scripts/mark-story-oversight-confirmed.sh +14 -14
- package/scripts/migrate-story-status-mirror.sh +6 -6
- package/scripts/next-rfc-id.sh +5 -5
- package/scripts/plugin-exercise-index.sh +26 -26
- package/scripts/plugin-maturity-populate.sh +38 -38
- package/scripts/plugin-maturity-render.sh +26 -26
- package/scripts/plugin-validate-ci-gate.sh +14 -14
- package/scripts/reconcile-readme.sh +23 -23
- package/scripts/reconcile-rfcs.sh +13 -13
- package/scripts/reconcile-stories.sh +12 -12
- package/scripts/reconcile-story-maps.sh +6 -6
- package/scripts/render-story-map.mjs +24 -24
- package/scripts/render-story-map.sh +3 -3
- package/scripts/resolve-governance-plugin-dirs.sh +10 -10
- package/scripts/run-check-deferred-placeholder-staleness.sh +3 -3
- package/scripts/run-check-outbound-responses-staleness.sh +3 -3
- package/scripts/run-check-upstream-cache-staleness.sh +3 -3
- package/scripts/run-enumerate-postrelease-kv-candidates.sh +3 -3
- package/scripts/run-migrate-problems-layout.sh +3 -3
- package/scripts/skill-invocations.sh +29 -29
- package/scripts/story-map-edit.mjs +6 -6
- package/scripts/story-map-edit.sh +3 -3
- package/scripts/story-map-query.mjs +8 -8
- package/scripts/story-map-query.sh +3 -3
- package/scripts/update-jtbd-references-section.sh +8 -8
- package/scripts/update-problem-references-section.sh +12 -12
- package/scripts/update-problem-rfcs-section.sh +9 -9
- package/scripts/update-rfc-commits-section.sh +7 -7
- package/scripts/update-rfc-references-section.sh +3 -3
- package/scripts/update-story-references-section.sh +5 -5
- package/scripts/verify-iter-summary.sh +3 -3
- package/skills/capture-problem/REFERENCE.md +33 -33
- package/skills/capture-problem/SKILL.md +108 -108
- package/skills/capture-problem/agents/openai.yaml +3 -0
- package/skills/capture-rfc/SKILL.md +21 -323
- package/skills/capture-rfc/agents/openai.yaml +3 -0
- package/skills/capture-story/SKILL.md +65 -65
- package/skills/capture-story/agents/openai.yaml +3 -0
- package/skills/capture-story-map/SKILL.md +31 -31
- package/skills/capture-story-map/agents/openai.yaml +3 -0
- package/skills/check-upstream-responses/SKILL.md +38 -38
- package/skills/check-upstream-responses/agents/openai.yaml +3 -0
- package/skills/close-incident/SKILL.md +25 -25
- package/skills/close-incident/agents/openai.yaml +3 -0
- package/skills/link-incident/SKILL.md +22 -22
- package/skills/link-incident/agents/openai.yaml +3 -0
- package/skills/list-incidents/SKILL.md +9 -9
- package/skills/list-incidents/agents/openai.yaml +3 -0
- package/skills/list-problems/SKILL.md +17 -17
- package/skills/list-problems/agents/openai.yaml +3 -0
- package/skills/list-stories/SKILL.md +23 -23
- package/skills/list-stories/agents/openai.yaml +3 -0
- package/skills/list-story-maps/SKILL.md +9 -9
- package/skills/list-story-maps/agents/openai.yaml +3 -0
- package/skills/manage-incident/SKILL.md +59 -59
- package/skills/manage-incident/agents/openai.yaml +3 -0
- package/skills/manage-problem/SKILL.md +222 -222
- package/skills/manage-problem/agents/openai.yaml +3 -0
- package/skills/manage-rfc/SKILL.md +62 -62
- package/skills/manage-rfc/agents/openai.yaml +3 -0
- package/skills/manage-story/SKILL.md +49 -49
- package/skills/manage-story/agents/openai.yaml +3 -0
- package/skills/manage-story-map/SKILL.md +30 -30
- package/skills/manage-story-map/agents/openai.yaml +3 -0
- package/skills/mitigate-incident/SKILL.md +40 -40
- package/skills/mitigate-incident/agents/openai.yaml +3 -0
- package/skills/reconcile-readme/SKILL.md +28 -28
- package/skills/reconcile-readme/agents/openai.yaml +3 -0
- package/skills/reconcile-stories/SKILL.md +17 -17
- package/skills/reconcile-stories/agents/openai.yaml +3 -0
- package/skills/reconcile-story-maps/SKILL.md +11 -11
- package/skills/reconcile-story-maps/agents/openai.yaml +3 -0
- package/skills/report-upstream/SKILL.md +73 -73
- package/skills/report-upstream/agents/openai.yaml +3 -0
- package/skills/restore-incident/SKILL.md +28 -28
- package/skills/restore-incident/agents/openai.yaml +3 -0
- package/skills/review-problems/SKILL.md +129 -129
- package/skills/review-problems/agents/openai.yaml +3 -0
- package/skills/scaffold-intake/SKILL.md +26 -26
- package/skills/scaffold-intake/agents/openai.yaml +3 -0
- package/skills/transition-problem/SKILL.md +85 -85
- package/skills/transition-problem/agents/openai.yaml +3 -0
- package/skills/transition-problems/SKILL.md +69 -69
- package/skills/transition-problems/agents/openai.yaml +3 -0
- package/skills/update-upstream/SKILL.md +97 -97
- package/skills/update-upstream/agents/openai.yaml +3 -0
- package/skills/work-problem/SKILL.md +42 -42
- package/skills/work-problem/agents/openai.yaml +3 -0
- package/skills/work-problems/SKILL.md +327 -327
- package/skills/work-problems/agents/openai.yaml +3 -0
- package/skills-codex/capture-problem/REFERENCE.md +139 -0
- package/skills-codex/capture-problem/SKILL.md +438 -0
- package/skills-codex/capture-problem/agents/openai.yaml +3 -0
- package/skills-codex/capture-rfc/SKILL.md +45 -0
- package/skills-codex/capture-rfc/agents/openai.yaml +3 -0
- package/skills-codex/capture-story/SKILL.md +407 -0
- package/skills-codex/capture-story/agents/openai.yaml +3 -0
- package/skills-codex/capture-story-map/SKILL.md +286 -0
- package/skills-codex/capture-story-map/agents/openai.yaml +3 -0
- package/skills-codex/check-upstream-responses/SKILL.md +160 -0
- package/skills-codex/check-upstream-responses/agents/openai.yaml +3 -0
- package/skills-codex/close-incident/SKILL.md +192 -0
- package/skills-codex/close-incident/agents/openai.yaml +3 -0
- package/skills-codex/link-incident/SKILL.md +173 -0
- package/skills-codex/link-incident/agents/openai.yaml +3 -0
- package/skills-codex/list-incidents/SKILL.md +92 -0
- package/skills-codex/list-incidents/agents/openai.yaml +3 -0
- package/skills-codex/list-problems/SKILL.md +126 -0
- package/skills-codex/list-problems/agents/openai.yaml +3 -0
- package/skills-codex/list-stories/SKILL.md +170 -0
- package/skills-codex/list-stories/agents/openai.yaml +3 -0
- package/skills-codex/list-story-maps/SKILL.md +104 -0
- package/skills-codex/list-story-maps/agents/openai.yaml +3 -0
- package/skills-codex/manage-incident/SKILL.md +378 -0
- package/skills-codex/manage-incident/agents/openai.yaml +3 -0
- package/skills-codex/manage-problem/SKILL.md +1180 -0
- package/skills-codex/manage-problem/agents/openai.yaml +3 -0
- package/skills-codex/manage-rfc/SKILL.md +314 -0
- package/skills-codex/manage-rfc/agents/openai.yaml +3 -0
- package/skills-codex/manage-story/SKILL.md +284 -0
- package/skills-codex/manage-story/agents/openai.yaml +3 -0
- package/skills-codex/manage-story-map/SKILL.md +198 -0
- package/skills-codex/manage-story-map/agents/openai.yaml +3 -0
- package/skills-codex/mitigate-incident/SKILL.md +239 -0
- package/skills-codex/mitigate-incident/agents/openai.yaml +3 -0
- package/skills-codex/reconcile-readme/SKILL.md +175 -0
- package/skills-codex/reconcile-readme/agents/openai.yaml +3 -0
- package/skills-codex/reconcile-stories/SKILL.md +124 -0
- package/skills-codex/reconcile-stories/agents/openai.yaml +3 -0
- package/skills-codex/reconcile-story-maps/SKILL.md +81 -0
- package/skills-codex/reconcile-story-maps/agents/openai.yaml +3 -0
- package/skills-codex/report-upstream/SKILL.md +716 -0
- package/skills-codex/report-upstream/agents/openai.yaml +3 -0
- package/skills-codex/restore-incident/SKILL.md +216 -0
- package/skills-codex/restore-incident/agents/openai.yaml +3 -0
- package/skills-codex/review-problems/SKILL.md +524 -0
- package/skills-codex/review-problems/agents/openai.yaml +3 -0
- package/skills-codex/scaffold-intake/SKILL.md +209 -0
- package/skills-codex/scaffold-intake/agents/openai.yaml +3 -0
- package/skills-codex/scaffold-intake/templates/CONTRIBUTING.md.tmpl +31 -0
- package/skills-codex/scaffold-intake/templates/SECURITY.md.tmpl +39 -0
- package/skills-codex/scaffold-intake/templates/SUPPORT.md.tmpl +32 -0
- package/skills-codex/scaffold-intake/templates/config.yml.tmpl +8 -0
- package/skills-codex/scaffold-intake/templates/problem-report.yml.tmpl +114 -0
- package/skills-codex/transition-problem/SKILL.md +371 -0
- package/skills-codex/transition-problem/agents/openai.yaml +3 -0
- package/skills-codex/transition-problems/SKILL.md +310 -0
- package/skills-codex/transition-problems/agents/openai.yaml +3 -0
- package/skills-codex/update-upstream/SKILL.md +583 -0
- package/skills-codex/update-upstream/agents/openai.yaml +3 -0
- package/skills-codex/work-problem/SKILL.md +160 -0
- package/skills-codex/work-problem/agents/openai.yaml +3 -0
- package/skills-codex/work-problems/SKILL.md +58 -0
- package/skills-codex/work-problems/agents/openai.yaml +3 -0
- package/templates/story-map.css +1 -1
- package/bin/wr-itil-mark-rfc-capture-gate +0 -51
- package/scripts/mark-rfc-capture-gate.sh +0 -32
|
@@ -22,12 +22,12 @@
|
|
|
22
22
|
# 2 = parse error (README missing or malformed)
|
|
23
23
|
#
|
|
24
24
|
# Output format on drift (one line per drift entry, ≤ 150 bytes per
|
|
25
|
-
#
|
|
25
|
+
# progressive-disclosure-once-per-session-budget-for-userpromptsubmit-governance-prose-architecture-rule progressive-disclosure budget):
|
|
26
26
|
# DRIFT STORY-<NNN> rankings: claims=<status> actual=<status>
|
|
27
27
|
# STALE STORY-<NNN> rankings: actual=<status>
|
|
28
28
|
# MISMATCH STORY-<NNN> done: actual=<status>
|
|
29
29
|
#
|
|
30
|
-
# Reverse-trace pass (
|
|
30
|
+
# Reverse-trace pass (problem-tickets-strain-as-fixes-decompose-into-multiple-coordinated-changes-need-an-rfc-framework-that-ties-all-changes-back-to-problems-and-unifies-technical-with-user-business-problems-problem Phase 2 Slice 9 — closes problem-rfc-story-framework-with-mandatory-problem-trace-and-unified-problem-ontology-architecture-rule line 270):
|
|
31
31
|
# When <problems-dir> / <rfcs-dir> / <jtbd-dir> are provided AND on
|
|
32
32
|
# disk, the reconciler also checks the auto-maintained `## Stories`
|
|
33
33
|
# section on each parent artefact against the story frontmatter's
|
|
@@ -45,29 +45,29 @@
|
|
|
45
45
|
# filesystem subdir is <Y>. Status-column refresh contract was missed.
|
|
46
46
|
#
|
|
47
47
|
# Read-only — does NOT mutate the README. The /wr-itil:manage-story skill
|
|
48
|
-
# (
|
|
48
|
+
# (problem-tickets-strain-as-fixes-decompose-into-multiple-coordinated-changes-need-an-rfc-framework-that-ties-all-changes-back-to-problems-and-unifies-technical-with-user-business-problems-problem Phase 2 Slice 8) applies edits with narrative-aware preservation;
|
|
49
49
|
# this script's only job is to report ground truth.
|
|
50
50
|
#
|
|
51
|
-
# Sibling to packages/itil/scripts/reconcile-rfcs.sh (
|
|
52
|
-
# item 5) and reconcile-readme.sh (
|
|
51
|
+
# Sibling to packages/itil/scripts/reconcile-rfcs.sh (problem-rfc-story-framework-with-mandatory-problem-trace-and-unified-problem-ontology-architecture-rule Phase 1
|
|
52
|
+
# item 5) and reconcile-readme.sh (docs-problems-readme-md-drifts-from-filesystem-truth-across-sessions-despite-refresh-on-create-and-refresh-on-transition-both-closed-problem / governance-skills-commit-their-own-completed-work-architecture-rule): same parse + diff
|
|
53
53
|
# structure, applied at the story tier instead of the RFC / problem
|
|
54
54
|
# tier. Differences from reconcile-rfcs:
|
|
55
55
|
# - Filename pattern: <state>/STORY-NNN-*.md (5 states: draft, accepted,
|
|
56
56
|
# in-progress, done, archived) — per-state subdir layout (NOT
|
|
57
|
-
# dual-tolerant flat — story tier is post-
|
|
57
|
+
# dual-tolerant flat — story tier is post-docs-problems-flat-layout-migration-per-state-subdirs-adopter-auto-migration-release-design, native-subdir)
|
|
58
58
|
# - ID format: STORY-<NNN>
|
|
59
|
-
# - No WSJF column (I11 invariant per
|
|
59
|
+
# - No WSJF column (I11 invariant per problem-rfc-story-framework-with-mandatory-problem-trace-and-unified-problem-ontology-architecture-rule line 253)
|
|
60
60
|
# - Story Rankings covers draft/accepted/in-progress (story dev queue)
|
|
61
61
|
# - Done covers done (matches RFC closed semantics)
|
|
62
62
|
# - No Verification Queue (stories don't have a verifying status —
|
|
63
|
-
# done is end-of-lifecycle for stories per
|
|
63
|
+
# done is end-of-lifecycle for stories per problem-rfc-story-framework-with-mandatory-problem-trace-and-unified-problem-ontology-architecture-rule)
|
|
64
64
|
# - No Parked tier (stories don't have a Parked status; only Problems do)
|
|
65
65
|
#
|
|
66
|
-
# @problem
|
|
67
|
-
# @adr
|
|
66
|
+
# @problem problem-tickets-strain-as-fixes-decompose-into-multiple-coordinated-changes-need-an-rfc-framework-that-ties-all-changes-back-to-problems-and-unifies-technical-with-user-business-problems-problem
|
|
67
|
+
# @adr problem-rfc-story-framework-with-mandatory-problem-trace-and-unified-problem-ontology-architecture-rule (Problem-RFC-Story framework — Phase 2 amendment 2026-05-10
|
|
68
68
|
# story tier; reconcile-stories is the story-tier sibling
|
|
69
69
|
# of reconcile-rfcs)
|
|
70
|
-
# @adr
|
|
70
|
+
# @adr plugin-bundled-scripts-invoked-from-skill-md-resolve-via-bin-on-path-architecture-rule (Plugin script resolution via bin/ on PATH — paired bin shim
|
|
71
71
|
# at packages/itil/bin/wr-itil-reconcile-stories)
|
|
72
72
|
|
|
73
73
|
set -uo pipefail
|
|
@@ -219,7 +219,7 @@ reverse_trace_pass() {
|
|
|
219
219
|
esac
|
|
220
220
|
pfile="${matches[0]:-}"
|
|
221
221
|
|
|
222
|
-
#
|
|
222
|
+
# a-release-row-is-the-rfc-and-the-map-is-the-approval-surface-architecture-rule: a release row may be the RFC, so no markdown parent exists.
|
|
223
223
|
# In that case the map row itself is the reverse trace and must contain
|
|
224
224
|
# this story. Query the canonical map island rather than scraping HTML.
|
|
225
225
|
if [ "$parent_kind" = rfcs ] && [ -z "$pfile" ]; then
|
|
@@ -6,11 +6,11 @@
|
|
|
6
6
|
# files across 5 lifecycle subdirs (draft, accepted, in-progress,
|
|
7
7
|
# completed, archived) and reports each disagreement against the README.
|
|
8
8
|
#
|
|
9
|
-
# Sibling to reconcile-stories.sh (
|
|
10
|
-
# reconcile-rfcs.sh (
|
|
9
|
+
# Sibling to reconcile-stories.sh (problem-tickets-strain-as-fixes-decompose-into-multiple-coordinated-changes-need-an-rfc-framework-that-ties-all-changes-back-to-problems-and-unifies-technical-with-user-business-problems-problem Phase 2 Slice 9) and
|
|
10
|
+
# reconcile-rfcs.sh (problem-rfc-story-framework-with-mandatory-problem-trace-and-unified-problem-ontology-architecture-rule Phase 1 item 5). Differences:
|
|
11
11
|
# - File extension: .html (not .md)
|
|
12
12
|
# - ID format: STORY-MAP-<NNN>
|
|
13
|
-
# - No WSJF (I5 invariant per
|
|
13
|
+
# - No WSJF (I5 invariant per problem-rfc-story-framework-with-mandatory-problem-trace-and-unified-problem-ontology-architecture-rule line 145)
|
|
14
14
|
# - No Rankings table — story-maps are planning artefacts, not work items;
|
|
15
15
|
# README has only a single lifecycle-grouped table
|
|
16
16
|
# - 5 lifecycle subdirs (vs story tier's 5 + RFC tier's 5)
|
|
@@ -26,11 +26,11 @@
|
|
|
26
26
|
# 1 = drift detected (structured stdout)
|
|
27
27
|
# 2 = parse error (README missing or malformed)
|
|
28
28
|
#
|
|
29
|
-
# @problem
|
|
30
|
-
# @adr
|
|
29
|
+
# @problem problem-tickets-strain-as-fixes-decompose-into-multiple-coordinated-changes-need-an-rfc-framework-that-ties-all-changes-back-to-problems-and-unifies-technical-with-user-business-problems-problem
|
|
30
|
+
# @adr problem-rfc-story-framework-with-mandatory-problem-trace-and-unified-problem-ontology-architecture-rule (Problem-RFC-Story framework — Phase 2 amendment 2026-05-10
|
|
31
31
|
# story-map tier; reconcile-story-maps is the story-map-tier
|
|
32
32
|
# sibling of reconcile-stories + reconcile-rfcs)
|
|
33
|
-
# @adr
|
|
33
|
+
# @adr plugin-bundled-scripts-invoked-from-skill-md-resolve-via-bin-on-path-architecture-rule (Plugin-bundled scripts via bin/ on PATH — paired bin shim
|
|
34
34
|
# at packages/itil/bin/wr-itil-reconcile-story-maps)
|
|
35
35
|
|
|
36
36
|
set -uo pipefail
|
|
@@ -27,10 +27,10 @@
|
|
|
27
27
|
// there is no seed file, no bootstrap flag, and no second code path to keep
|
|
28
28
|
// in step with the first.
|
|
29
29
|
//
|
|
30
|
-
// @adr
|
|
31
|
-
// @adr
|
|
32
|
-
// @adr
|
|
33
|
-
// correctness constraint:
|
|
30
|
+
// @adr story-maps-render-from-json-through-a-canonical-template-architecture-rule (story maps render from JSON through a canonical template)
|
|
31
|
+
// @adr problem-rfc-story-framework-with-mandatory-problem-trace-and-unified-problem-ontology-architecture-rule (Problem-RFC-Story framework — Phase 2 encoding, amended)
|
|
32
|
+
// @adr a-release-row-is-the-rfc-and-the-map-is-the-approval-surface-architecture-rule (story cards single-line — a readability convention now, not a
|
|
33
|
+
// correctness constraint: an-afk-loop-may-accept-and-implement-a-story-that-only-decomposes-already-ratified-substance-architecture-rule's whole-line filter that made it
|
|
34
34
|
// load-bearing is retired, and cards sit outside the fingerprint basis)
|
|
35
35
|
|
|
36
36
|
import { readFileSync, writeFileSync, existsSync, readdirSync, statSync } from 'node:fs';
|
|
@@ -134,7 +134,7 @@ function resolveStoryProblems(storiesDir, storyId) {
|
|
|
134
134
|
* Derived, never stored on the card — the fifth application of the same rule
|
|
135
135
|
* that removed storyStatus, card titles, the RFC story list and row status. A
|
|
136
136
|
* hand-written card value duplicates the story and degrades it: every one on
|
|
137
|
-
*
|
|
137
|
+
* take-a-problem-from-noticed-to-resolved-journey-map-journey-map had drifted into a "Value: ..." paraphrase while the stories
|
|
138
138
|
* themselves carried proper value-first statements. Deriving keeps the map
|
|
139
139
|
* showing what the story actually says.
|
|
140
140
|
*
|
|
@@ -154,7 +154,7 @@ function resolveStoryValue(storiesDir, storyId) {
|
|
|
154
154
|
if (end === -1) end = lines.length;
|
|
155
155
|
// The value statement is the FIRST paragraph. Filtering blanks out of the
|
|
156
156
|
// whole section glued a following paragraph onto the "I want" clause: on a
|
|
157
|
-
// phone
|
|
157
|
+
// phone surface-still-outstanding-family-members-before-a-close-delivery-story's card ran to 169 words, most of it the evidence prose the
|
|
158
158
|
// author had deliberately put below the statement. A story is free to
|
|
159
159
|
// explain itself under its value; the card carries the statement.
|
|
160
160
|
const para = [];
|
|
@@ -197,7 +197,7 @@ function splitValue(text) {
|
|
|
197
197
|
//
|
|
198
198
|
// The article is NOT required. "as whoever picks the ticket up" is the shape
|
|
199
199
|
// written correctly; demanding a/an/the was a guess about wording, and the
|
|
200
|
-
// guess cost
|
|
200
|
+
// guess cost pick-up-a-captured-ticket-and-know-what-was-observed-delivery-story its three lines with nothing reporting why. Widening
|
|
201
201
|
// does not close that class on its own — see assertValueStatementsSplit,
|
|
202
202
|
// which is what makes the next unanticipated phrasing loud instead of silent.
|
|
203
203
|
// The connectives are CAPTURED, not re-emitted from memory. A story written
|
|
@@ -297,11 +297,11 @@ function renderMeta(map, derived) {
|
|
|
297
297
|
const t = map.traces ?? {};
|
|
298
298
|
// `problems` and `rfcs` are DERIVED, and the read is unconditional — no
|
|
299
299
|
// `?? t.problems` alternation, which would let a pre-migration island outvote
|
|
300
|
-
// the corpus and re-open the override
|
|
300
|
+
// the corpus and re-open the override a-story-map-card-stores-no-value-a-story-file-already-carries-architecture-rule forbids.
|
|
301
301
|
//
|
|
302
302
|
// The rfcs filter is load-bearing, not defensive: a row legitimately carries no
|
|
303
303
|
// RFC, in two spellings — `"rfc": null` on a pre-RFC row, and no `rfc` key at
|
|
304
|
-
// all. A raw join yields ",
|
|
304
|
+
// all. A raw join yields ",rfc-first-trace-invariant-not-enforced-at-fix-time-release-design,…" or ",,", and `content=",,"` satisfies the
|
|
305
305
|
// reverse-tracers' `content="[^"]+"` guard, so a map with no RFCs would stop
|
|
306
306
|
// looking like one.
|
|
307
307
|
const rfcs = [...new Set((map.releases ?? []).map((r) => r.rfc).filter(Boolean))];
|
|
@@ -335,7 +335,7 @@ function renderMeta(map, derived) {
|
|
|
335
335
|
*/
|
|
336
336
|
function resolveHref(mapPath, id) {
|
|
337
337
|
const docs = join(dirname(dirname(mapPath)), '..');
|
|
338
|
-
// No RFC entry, deliberately.
|
|
338
|
+
// No RFC entry, deliberately. a-release-row-is-the-rfc-and-the-map-is-the-approval-surface-architecture-rule made the release row the RFC, so the
|
|
339
339
|
// 59 files under docs/rfcs/ are legacy records of delivered work. Linking one
|
|
340
340
|
// sends a reader to a superseded artefact and re-teaches the two-tier model
|
|
341
341
|
// this decision removed.
|
|
@@ -385,7 +385,7 @@ function resolveHref(mapPath, id) {
|
|
|
385
385
|
* resolves, which is the published-package case: a map opened outside a
|
|
386
386
|
* repository shows no status, no values and plain text instead of links.
|
|
387
387
|
*/
|
|
388
|
-
/** A row's status, derived — never authored (
|
|
388
|
+
/** A row's status, derived — never authored (a-release-row-is-the-rfc-and-the-map-is-the-approval-surface-architecture-rule).
|
|
389
389
|
*
|
|
390
390
|
* delivered — every story in the row is done or archived
|
|
391
391
|
* proposed — a problem or an RFC names the row, and it is not delivered
|
|
@@ -500,7 +500,7 @@ function renderStatus(map, storiesDir, mapPath) {
|
|
|
500
500
|
* Rendering here costs nothing that mattered. The renderer already runs on every
|
|
501
501
|
* edit (story-map-edit re-renders after each operation), it already reads the
|
|
502
502
|
* story corpus for status, values and problems, and the fingerprint is scoped to
|
|
503
|
-
* the data island (
|
|
503
|
+
* the data island (story-maps-render-from-json-through-a-canonical-template-architecture-rule) — so generated markup in the file cannot drift a
|
|
504
504
|
* ratification. Presentation stays de-duplicated in the shared stylesheet, which
|
|
505
505
|
* is where the duplication actually was.
|
|
506
506
|
*
|
|
@@ -523,10 +523,10 @@ function badgeClass(rel) {
|
|
|
523
523
|
}
|
|
524
524
|
}
|
|
525
525
|
|
|
526
|
-
/** What a row is CALLED. A row IS an RFC (
|
|
526
|
+
/** What a row is CALLED. A row IS an RFC (a-release-row-is-the-rfc-and-the-map-is-the-approval-surface-architecture-rule), so where a problem has
|
|
527
527
|
* proposed it, its id is the label. There is deliberately no "not yet
|
|
528
528
|
* allocated" state: drawing the row is what allocates the identity. */
|
|
529
|
-
/** What a row is CALLED. A row IS an RFC (
|
|
529
|
+
/** What a row is CALLED. A row IS an RFC (a-release-row-is-the-rfc-and-the-map-is-the-approval-surface-architecture-rule), so its id is the label.
|
|
530
530
|
*
|
|
531
531
|
* Without one, the label says what is MISSING rather than inventing a status.
|
|
532
532
|
* Two distinct gaps, and they need different work:
|
|
@@ -539,7 +539,7 @@ function badgeClass(rel) {
|
|
|
539
539
|
*
|
|
540
540
|
* Neither is a resting state, so neither gets a comfortable name. "Speculative"
|
|
541
541
|
* was the comfortable name, and it rendered on a row whose own header read
|
|
542
|
-
* "closes
|
|
542
|
+
* "closes ship-quota-pacing-surface-to-prevent-weekly-quota-exhaustion-advisory-or-blocking-nudge-when-burn-rate-exceeds-sustainable-pace-so-users-retain-claude-tokens-for-non-claude-code-surfaces-chat-cowork-for-the-full-week-problem, quota-pacing-shipped-without-a-grounded-jtbd-persona-usm-rfc-story-lineage-governance-artefacts-are-wrong-orphaned-or-missing-problem" — the label and the trace contradicting each other.
|
|
543
543
|
*/
|
|
544
544
|
function rowLabel(rel) {
|
|
545
545
|
if (rel.rfc) return rel.rfc;
|
|
@@ -657,13 +657,13 @@ function parseDerived(statusBlock) {
|
|
|
657
657
|
|
|
658
658
|
/* There is no lead paragraph. It was persona plus an observation, and both were
|
|
659
659
|
* already on the page: the persona appears in every card's value statement ("as
|
|
660
|
-
* a developer", 24 times on
|
|
660
|
+
* a developer", 24 times on take-a-problem-from-noticed-to-resolved-journey-map-journey-map), and any observation about the shape
|
|
661
661
|
* of the work — how many columns, how much is live, which cells are empty — is
|
|
662
662
|
* countable from the grid the reader is looking at.
|
|
663
663
|
*
|
|
664
664
|
* A map shows the work. Where a specific column or row needs a note, both carry
|
|
665
665
|
* a `note` field for exactly that, next to the thing it is about. Prose at the
|
|
666
|
-
* top that restates the picture below it is the
|
|
666
|
+
* top that restates the picture below it is the a-story-map-card-stores-no-value-a-story-file-already-carries-architecture-rule rule applied to writing.
|
|
667
667
|
*/
|
|
668
668
|
|
|
669
669
|
function renderGrid(map, derived) {
|
|
@@ -757,7 +757,7 @@ function renderGrid(map, derived) {
|
|
|
757
757
|
* its own header. It was added when problems became derived, and it duplicated
|
|
758
758
|
* the thing it was derived into.
|
|
759
759
|
*
|
|
760
|
-
* Both are the
|
|
760
|
+
* Both are the a-story-map-card-stores-no-value-a-story-file-already-carries-architecture-rule rule applied to presentation rather than to data: do not
|
|
761
761
|
* show in two places what one place already says. The maintainer caught this as
|
|
762
762
|
* the seventh instance, introduced while fixing the sixth.
|
|
763
763
|
*/
|
|
@@ -773,13 +773,13 @@ function renderGrid(map, derived) {
|
|
|
773
773
|
* `traces.adrs`; and "open questions" was a changelog entry, not a trace.
|
|
774
774
|
*
|
|
775
775
|
* Rendering the ids directly means there is no prose to keep in step. It is the
|
|
776
|
-
*
|
|
776
|
+
* a-story-map-card-stores-no-value-a-story-file-already-carries-architecture-rule rule again: show what is authored once, derive the rest, write
|
|
777
777
|
* nothing twice.
|
|
778
778
|
*/
|
|
779
779
|
function renderTrace(map, derived) {
|
|
780
780
|
const hrefs = derived.hrefs ?? {};
|
|
781
781
|
const tr = map.traces ?? {};
|
|
782
|
-
// Jobs only. `Decisions` went with `traces.adrs` (
|
|
782
|
+
// Jobs only. `Decisions` went with `traces.adrs` (a-story-map-carries-no-decision-trace-architecture-rule — a map carries no
|
|
783
783
|
// decision trace). `RFCs` went too rather than being derived: it would have
|
|
784
784
|
// restated the row badges immediately beside it, which is the duplication
|
|
785
785
|
// deleted from the map-level problems line for the same reason.
|
|
@@ -802,12 +802,12 @@ function renderTrace(map, derived) {
|
|
|
802
802
|
* exist, then it shouldn't even be in the map."
|
|
803
803
|
*
|
|
804
804
|
* This is also what makes an untraced row unreachable on a valid map: every
|
|
805
|
-
* card has a story, and
|
|
805
|
+
* card has a story, and problem-rfc-story-framework-with-mandatory-problem-trace-and-unified-problem-ontology-architecture-rule I6 hard-blocks a story that traces no problem,
|
|
806
806
|
* so every row traces something.
|
|
807
807
|
*
|
|
808
808
|
* Only fires when a story corpus is present. Rendering from the published
|
|
809
809
|
* package resolves nothing at all, and refusing there would reject every valid
|
|
810
|
-
* map for lacking a tree that was never there (
|
|
810
|
+
* map for lacking a tree that was never there (a-story-map-card-stores-no-value-a-story-file-already-carries-architecture-rule's degrade-gracefully
|
|
811
811
|
* consequence).
|
|
812
812
|
*/
|
|
813
813
|
/** Archived work is separated from live work.
|
|
@@ -842,7 +842,7 @@ function renderTrace(map, derived) {
|
|
|
842
842
|
* This is the second time the class has fired. The first cost 15 stories
|
|
843
843
|
* their three lines; the fix was to loosen the pattern, and the pattern will
|
|
844
844
|
* always be narrower than the ways people write, so the class stayed open and
|
|
845
|
-
*
|
|
845
|
+
* pick-up-a-captured-ticket-and-know-what-was-observed-delivery-story walked into it. Loosening cannot close it. Refusing can: the
|
|
846
846
|
* renderer is the last point where anyone still knows a split was attempted.
|
|
847
847
|
*
|
|
848
848
|
* Silent only when there is genuinely nothing to check — no stories tree, or
|
|
@@ -947,7 +947,7 @@ function assertEveryCardHasAStory(map, storiesDir) {
|
|
|
947
947
|
}
|
|
948
948
|
lines.push('');
|
|
949
949
|
lines.push(' Fix each one: capture the story (/wr-itil:capture-story, which');
|
|
950
|
-
lines.push(' hard-blocks a story that traces no problem —
|
|
950
|
+
lines.push(' hard-blocks a story that traces no problem — problem-rfc-story-framework-with-mandatory-problem-trace-and-unified-problem-ontology-architecture-rule I6), or');
|
|
951
951
|
lines.push(' remove the card. A card is a story\'s position in a journey; a');
|
|
952
952
|
lines.push(' card without one is a sketch, and the map should not carry it.');
|
|
953
953
|
throw new Error(lines.join('\n'));
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
# Thin bash entry point for the story-map renderer, so the
|
|
2
|
+
# Thin bash entry point for the story-map renderer, so the plugin-bundled-scripts-invoked-from-skill-md-resolve-via-bin-on-path-architecture-rule/highest-version-wins-shim-wrapper-for-plugin-scaffold-template-shims-architecture-rule
|
|
3
3
|
# shim machinery (which resolves `scripts/<NAME>.sh`) reaches the Node
|
|
4
4
|
# implementation without the generator needing to learn about .mjs.
|
|
5
5
|
#
|
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
# One mode: renders a map in place from its own data island. To create a map,
|
|
9
9
|
# write a file containing just the island and render it.
|
|
10
10
|
#
|
|
11
|
-
# @adr
|
|
12
|
-
# @adr
|
|
11
|
+
# @adr story-maps-render-from-json-through-a-canonical-template-architecture-rule (story maps render from JSON through a canonical template)
|
|
12
|
+
# @adr plugin-bundled-scripts-invoked-from-skill-md-resolve-via-bin-on-path-architecture-rule (plugin scripts resolve via bin/ on $PATH)
|
|
13
13
|
|
|
14
14
|
set -euo pipefail
|
|
15
15
|
exec node "$(cd "$(dirname "$0")" && pwd)/render-story-map.mjs" "$@"
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
# Resolve --plugin-dir arguments for the governance plugins an AFK iter
|
|
3
3
|
# subprocess needs.
|
|
4
4
|
#
|
|
5
|
-
#
|
|
5
|
+
# work-problems-claude-p-iter-subprocesses-miss-project-scoped-governance-plugins-need-plugin-dir-in-dispatch-problem: headless `claude -p` loads only USER-scoped enabledPlugins, NOT
|
|
6
6
|
# project-scoped ones. When the windyroad plugins are enabled at project scope
|
|
7
7
|
# (the common adopter setup), an iter subprocess dispatched by work-problems
|
|
8
8
|
# Step 5 receives no windyroad agents/hooks — it commits ungated and cannot run
|
|
@@ -13,10 +13,10 @@
|
|
|
13
13
|
# into its `claude -p` invocation.
|
|
14
14
|
#
|
|
15
15
|
# Resolution: each plugin's cache parent is located from its bin dir on $PATH
|
|
16
|
-
# (
|
|
16
|
+
# (plugin-bundled-scripts-invoked-from-skill-md-resolve-via-bin-on-path-architecture-rule bin-on-PATH precedent — present in adopter marketplace-cache trees
|
|
17
17
|
# and source-dev alike), then the HIGHEST-SEMVER sibling under that cache parent
|
|
18
|
-
# is selected (
|
|
19
|
-
# init and goes stale mid-session (
|
|
18
|
+
# is selected (highest-version-wins-shim-wrapper-for-plugin-scaffold-template-shims-architecture-rule highest-version-wins). $PATH order is frozen at session
|
|
19
|
+
# init and goes stale mid-session (install-updates-refreshes-the-global-plugin-cache-but-does-not-fix-path-ordering-stale-plugin-version-shims-stay-first-on-path-so-subsequent-shim-invocations-run-old-code-problem / highest-version-wins-shim-wrapper-for-plugin-scaffold-template-shims-architecture-rule / sessionstart-path-refresh-hook-for-plugin-cache-architecture-rule), so it MUST NOT be
|
|
20
20
|
# trusted for version selection — only to discover the cache parent.
|
|
21
21
|
#
|
|
22
22
|
# Output: two lines per resolvable plugin — `--plugin-dir` then the plugin root
|
|
@@ -28,11 +28,11 @@
|
|
|
28
28
|
#
|
|
29
29
|
# Override the plugin set via WR_GOVERNANCE_PLUGINS (space-separated).
|
|
30
30
|
#
|
|
31
|
-
# @adr
|
|
32
|
-
# @adr
|
|
33
|
-
# @adr
|
|
34
|
-
# @adr
|
|
35
|
-
# @problem
|
|
31
|
+
# @adr governance-skill-invocation-patterns-foreground-background-with-deferred-question-resumption-architecture-rule (governance skill invocation — Step 5 dispatch contract, work-problems-claude-p-iter-subprocesses-miss-project-scoped-governance-plugins-need-plugin-dir-in-dispatch-problem amendment)
|
|
32
|
+
# @adr plugin-bundled-scripts-invoked-from-skill-md-resolve-via-bin-on-path-architecture-rule (plugin-bundled scripts resolve via bin/ on $PATH)
|
|
33
|
+
# @adr highest-version-wins-shim-wrapper-for-plugin-scaffold-template-shims-architecture-rule (highest-version-wins resolution — $PATH order is not authoritative)
|
|
34
|
+
# @adr behavioural-tests-default-for-skill-testing-architecture-rule (behavioural test — resolve-governance-plugin-dirs.bats)
|
|
35
|
+
# @problem work-problems-claude-p-iter-subprocesses-miss-project-scoped-governance-plugins-need-plugin-dir-in-dispatch-problem
|
|
36
36
|
set -euo pipefail
|
|
37
37
|
|
|
38
38
|
PLUGINS="${WR_GOVERNANCE_PLUGINS:-wr-architect wr-jtbd wr-risk-scorer wr-voice-tone wr-itil wr-retrospective wr-style-guide}"
|
|
@@ -54,7 +54,7 @@ for plugin in $PLUGINS; do
|
|
|
54
54
|
done
|
|
55
55
|
[ -n "$cache_parent" ] || continue
|
|
56
56
|
|
|
57
|
-
# Select the highest-semver sibling under <cache_parent> (
|
|
57
|
+
# Select the highest-semver sibling under <cache_parent> (highest-version-wins-shim-wrapper-for-plugin-scaffold-template-shims-architecture-rule). PATH order
|
|
58
58
|
# may name a stale version after a mid-session /install-updates, so re-resolve
|
|
59
59
|
# the version here rather than reading it from the PATH entry.
|
|
60
60
|
highest=""
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
# wr-itil — echo the deferred-placeholder + README-cadence promotion reason,
|
|
3
|
-
# or empty if promotion is not warranted (
|
|
3
|
+
# or empty if promotion is not warranted (wr-itil-review-problems-not-auto-fired-when-needed-user-has-to-remember-to-run-it-problem / capture-problem-capture-rfc-manage-problem-step-2-create-gate-marker-step-sources-repo-relative-packages-itil-hooks-lib-sh-fails-in-adopter-installs-recurring-published-path-class-problem adopter-safe-path-resolution-in-shipped-skills-24-repo-relative-references-release-design adopter-safe).
|
|
4
4
|
#
|
|
5
5
|
# Adopter-safe wrapper: sources the canonical lib RELATIVE TO THIS SCRIPT
|
|
6
6
|
# (`$(dirname)/../lib`), then echoes the function's result on stdout (the SKILL
|
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
# source monorepo, not adopter installs.
|
|
11
11
|
#
|
|
12
12
|
# SKILLs invoke this by name via the
|
|
13
|
-
# `wr-itil-check-deferred-placeholder-staleness` PATH shim (
|
|
14
|
-
#
|
|
13
|
+
# `wr-itil-check-deferred-placeholder-staleness` PATH shim (plugin-bundled-scripts-invoked-from-skill-md-resolve-via-bin-on-path-architecture-rule +
|
|
14
|
+
# highest-version-wins-shim-wrapper-for-plugin-scaffold-template-shims-architecture-rule). Operates on the directory given as $1 (defaults to $PWD).
|
|
15
15
|
set -uo pipefail
|
|
16
16
|
|
|
17
17
|
LIB="$(cd "$(dirname "${BASH_SOURCE[0]}")/../lib" 2>/dev/null && pwd)" || {
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
# wr-itil — echo the outbound-responses-preflight promotion reason, or empty
|
|
3
|
-
# if promotion is not warranted (
|
|
3
|
+
# if promotion is not warranted (manage-problem-has-no-cadence-for-checking-upstream-bound-tickets-problem + capture-problem-capture-rfc-manage-problem-step-2-create-gate-marker-step-sources-repo-relative-packages-itil-hooks-lib-sh-fails-in-adopter-installs-recurring-published-path-class-problem/adopter-safe-path-resolution-in-shipped-skills-24-repo-relative-references-release-design).
|
|
4
4
|
#
|
|
5
5
|
# Adopter-safe wrapper: sources the canonical lib RELATIVE TO THIS SCRIPT
|
|
6
6
|
# (`$(dirname)/../lib`), then echoes the function's result on stdout (the SKILL
|
|
7
7
|
# captures it via `$(...)`). Replaces any SKILL-inline
|
|
8
8
|
# `source packages/itil/lib/check-outbound-responses-staleness.sh;
|
|
9
9
|
# preflight_reason="$(should_promote_outbound_responses_preflight "$PWD")"`,
|
|
10
|
-
# which only resolves in the source monorepo (
|
|
11
|
-
# via the `wr-itil-check-outbound-responses-staleness` PATH shim (
|
|
10
|
+
# which only resolves in the source monorepo (capture-problem-capture-rfc-manage-problem-step-2-create-gate-marker-step-sources-repo-relative-packages-itil-hooks-lib-sh-fails-in-adopter-installs-recurring-published-path-class-problem). SKILLs invoke this by name
|
|
11
|
+
# via the `wr-itil-check-outbound-responses-staleness` PATH shim (plugin-bundled-scripts-invoked-from-skill-md-resolve-via-bin-on-path-architecture-rule).
|
|
12
12
|
# Operates on the directory given as $1 (defaults to $PWD).
|
|
13
13
|
set -uo pipefail
|
|
14
14
|
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
# wr-itil — echo the inbound-discovery-preflight promotion reason, or empty if
|
|
3
|
-
# promotion is not warranted (
|
|
3
|
+
# promotion is not warranted (capture-problem-capture-rfc-manage-problem-step-2-create-gate-marker-step-sources-repo-relative-packages-itil-hooks-lib-sh-fails-in-adopter-installs-recurring-published-path-class-problem/adopter-safe-path-resolution-in-shipped-skills-24-repo-relative-references-release-design).
|
|
4
4
|
#
|
|
5
5
|
# Adopter-safe wrapper: sources the canonical lib RELATIVE TO THIS SCRIPT
|
|
6
6
|
# (`$(dirname)/../lib`), then echoes the function's result on stdout (the SKILL
|
|
7
7
|
# captures it via `$(...)`). Replaces the SKILL-inline
|
|
8
8
|
# `source packages/itil/lib/check-upstream-cache-staleness.sh;
|
|
9
9
|
# preflight_reason="$(should_promote_inbound_discovery_preflight "$PWD")"`,
|
|
10
|
-
# which only resolved in the source monorepo (
|
|
11
|
-
# via the `wr-itil-check-upstream-cache-staleness` PATH shim (
|
|
10
|
+
# which only resolved in the source monorepo (capture-problem-capture-rfc-manage-problem-step-2-create-gate-marker-step-sources-repo-relative-packages-itil-hooks-lib-sh-fails-in-adopter-installs-recurring-published-path-class-problem). SKILLs invoke this by name
|
|
11
|
+
# via the `wr-itil-check-upstream-cache-staleness` PATH shim (plugin-bundled-scripts-invoked-from-skill-md-resolve-via-bin-on-path-architecture-rule).
|
|
12
12
|
# Operates on the directory given as $1 (defaults to $PWD).
|
|
13
13
|
set -uo pipefail
|
|
14
14
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
# wr-itil — emit `KV_CANDIDATE` lines for Known Error tickets whose
|
|
3
3
|
# Release-vehicle citation matches a just-shipped (deleted-from-tree)
|
|
4
|
-
# changeset (
|
|
4
|
+
# changeset (known-error-md-verifying-md-transition-not-happening-consistently-at-release-time-problem / capture-problem-capture-rfc-manage-problem-step-2-create-gate-marker-step-sources-repo-relative-packages-itil-hooks-lib-sh-fails-in-adopter-installs-recurring-published-path-class-problem adopter-safe-path-resolution-in-shipped-skills-24-repo-relative-references-release-design adopter-safe).
|
|
5
5
|
#
|
|
6
6
|
# Adopter-safe wrapper: sources the canonical lib RELATIVE TO THIS SCRIPT
|
|
7
7
|
# (`$(dirname)/../lib`), then invokes the function. The SKILL parses the
|
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
# the source monorepo, not adopter installs.
|
|
12
12
|
#
|
|
13
13
|
# SKILLs invoke this by name via the
|
|
14
|
-
# `wr-itil-enumerate-postrelease-kv-candidates` PATH shim (
|
|
15
|
-
#
|
|
14
|
+
# `wr-itil-enumerate-postrelease-kv-candidates` PATH shim (plugin-bundled-scripts-invoked-from-skill-md-resolve-via-bin-on-path-architecture-rule +
|
|
15
|
+
# highest-version-wins-shim-wrapper-for-plugin-scaffold-template-shims-architecture-rule).
|
|
16
16
|
#
|
|
17
17
|
# Arguments (positional, all optional):
|
|
18
18
|
# $1 — problems-dir (defaults to ./docs/problems)
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
# wr-itil — run the problems-layout flat→per-state migration (
|
|
2
|
+
# wr-itil — run the problems-layout flat→per-state migration (capture-problem-capture-rfc-manage-problem-step-2-create-gate-marker-step-sources-repo-relative-packages-itil-hooks-lib-sh-fails-in-adopter-installs-recurring-published-path-class-problem/adopter-safe-path-resolution-in-shipped-skills-24-repo-relative-references-release-design).
|
|
3
3
|
#
|
|
4
4
|
# Adopter-safe wrapper: sources the canonical lib RELATIVE TO THIS SCRIPT
|
|
5
5
|
# (`$(dirname)/../lib`), then invokes the function. Replaces the SKILL-inline
|
|
6
6
|
# `source packages/itil/lib/migrate-problems-layout.sh; migrate_... "$PWD"`,
|
|
7
|
-
# which only resolved in the source monorepo (
|
|
8
|
-
# via the `wr-itil-migrate-problems-layout` PATH shim (
|
|
7
|
+
# which only resolved in the source monorepo (capture-problem-capture-rfc-manage-problem-step-2-create-gate-marker-step-sources-repo-relative-packages-itil-hooks-lib-sh-fails-in-adopter-installs-recurring-published-path-class-problem). SKILLs invoke this by name
|
|
8
|
+
# via the `wr-itil-migrate-problems-layout` PATH shim (plugin-bundled-scripts-invoked-from-skill-md-resolve-via-bin-on-path-architecture-rule). The migration
|
|
9
9
|
# routine is idempotent + partial-migration-safe (no-op when no flat-layout
|
|
10
10
|
# files exist). Operates on the directory given as $1 (defaults to $PWD).
|
|
11
11
|
set -uo pipefail
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
# packages/itil/scripts/skill-invocations.sh
|
|
3
3
|
#
|
|
4
|
-
# Phase 2a (
|
|
4
|
+
# Phase 2a (problem-087-no-maturity-battle-hardening-signal-on-plugins-skills-agents-or-hooks-readmes-don-t-tell-users-which-features-are-stable-vs-experimental-problem) transcript-axis maturity-measurement script.
|
|
5
5
|
#
|
|
6
6
|
# Reads `~/.claude/projects/**/*.jsonl` (recursive), filters to
|
|
7
7
|
# `type=assistant` messages whose `message.content` array carries a
|
|
8
8
|
# `tool_use` entry, tallies invocations by `Skill` / `Agent` / `Bash` per
|
|
9
|
-
#
|
|
9
|
+
# windyroad-plugin-maturity-measurement-mechanism-session-transcript-invocation-counts-plus-commit-history-composite-read-only-ndjson-architecture-rule §Script contracts, and emits one NDJSON record per surface to
|
|
10
10
|
# stdout.
|
|
11
11
|
#
|
|
12
|
-
# Schema (per
|
|
12
|
+
# Schema (per windyroad-plugin-maturity-measurement-mechanism-session-transcript-invocation-counts-plus-commit-history-composite-read-only-ndjson-architecture-rule line 70-82):
|
|
13
13
|
# {"schema_version":"1.0","axis":"skill-invocations","surface":"<name>",
|
|
14
14
|
# "kind":"skill|agent|bash-attributed","plugin":"<name>",
|
|
15
15
|
# "window_days":<N>,"invocations":<N>,
|
|
@@ -21,19 +21,19 @@
|
|
|
21
21
|
# [--category-overrides=FILE]
|
|
22
22
|
#
|
|
23
23
|
# Defaults:
|
|
24
|
-
# --window-days 30 (
|
|
24
|
+
# --window-days 30 (windyroad-plugin-maturity-measurement-mechanism-session-transcript-invocation-counts-plus-commit-history-composite-read-only-ndjson-architecture-rule line 67)
|
|
25
25
|
# --root ~/.claude/projects
|
|
26
26
|
# --project-root $PWD (opt-out marker location: <project-root>/.claude/.skill-metrics-opt-out)
|
|
27
27
|
#
|
|
28
28
|
# Exit codes:
|
|
29
|
-
# 0 = always —
|
|
29
|
+
# 0 = always — structured-user-interaction-for-governance-skill-decisions-architecture-rule Rule 6 fail-safe. Opt-out marker / inaccessible
|
|
30
30
|
# root / missing data all hit the zero-records path with
|
|
31
31
|
# stderr-comment.
|
|
32
32
|
#
|
|
33
|
-
# Privacy (
|
|
33
|
+
# Privacy (centralised-review-reports-for-cross-project-skill-improvement-jsonl-at-claude-review-reports-architecture-rule clauses adopted verbatim):
|
|
34
34
|
# - Opt-out marker `.claude/.skill-metrics-opt-out` disables reads.
|
|
35
35
|
# - No network egress — the script body invokes no exfiltration
|
|
36
|
-
# primitives.
|
|
36
|
+
# primitives. windyroad-plugin-maturity-measurement-mechanism-session-transcript-invocation-counts-plus-commit-history-composite-read-only-ndjson-architecture-rule §Confirmation 3 enforces via negative-grep
|
|
37
37
|
# on this file (banned-token list lives in the bats fixture, not
|
|
38
38
|
# here, to avoid self-matching).
|
|
39
39
|
# - Content sanitisation — only fixed-pattern surface names extracted
|
|
@@ -44,16 +44,16 @@
|
|
|
44
44
|
# The v1.0 schema has no path-bearing field; the hashing function is
|
|
45
45
|
# internal defence-in-depth, exercised structurally by Confirmation #4.
|
|
46
46
|
#
|
|
47
|
-
# @problem
|
|
48
|
-
# @adr
|
|
49
|
-
# @adr
|
|
50
|
-
# @adr
|
|
51
|
-
# @adr
|
|
52
|
-
# @adr
|
|
53
|
-
# @adr
|
|
54
|
-
# @jtbd
|
|
47
|
+
# @problem problem-087-no-maturity-battle-hardening-signal-on-plugins-skills-agents-or-hooks-readmes-don-t-tell-users-which-features-are-stable-vs-experimental-problem (Phase 2a — transcript axis)
|
|
48
|
+
# @adr windyroad-plugin-maturity-measurement-mechanism-session-transcript-invocation-counts-plus-commit-history-composite-read-only-ndjson-architecture-rule (Plugin maturity measurement mechanism)
|
|
49
|
+
# @adr plugin-bundled-scripts-invoked-from-skill-md-resolve-via-bin-on-path-architecture-rule (Shim grammar — bin/wr-itil-skill-invocations on $PATH)
|
|
50
|
+
# @adr centralised-review-reports-for-cross-project-skill-improvement-jsonl-at-claude-review-reports-architecture-rule (Privacy posture adopted verbatim)
|
|
51
|
+
# @adr behavioural-tests-default-for-skill-testing-architecture-rule (Behavioural tests default; windyroad-plugin-maturity-measurement-mechanism-session-transcript-invocation-counts-plus-commit-history-composite-read-only-ndjson-architecture-rule §Confirmation 1-5)
|
|
52
|
+
# @adr structured-user-interaction-for-governance-skill-decisions-architecture-rule Rule 6 (non-interactive fail-safe — exit 0 always)
|
|
53
|
+
# @adr wr-architect-agent-performance-review-scope-prompt-amendment-performance-budget-adr-template-architecture-rule (Performance — < 1.5s warm-cache; 30-day window default)
|
|
54
|
+
# @jtbd extend-the-suite-with-new-plugins-user-outcome (Extend the Suite — hardening-prioritisation outcome,
|
|
55
55
|
# 2026-05-04 amendment serves Phase 2 NDJSON as data source)
|
|
56
|
-
# @jtbd
|
|
56
|
+
# @jtbd restore-service-fast-with-an-audit-trail-user-outcome (Restore Service Fast — audit-trail composition)
|
|
57
57
|
|
|
58
58
|
set -uo pipefail
|
|
59
59
|
|
|
@@ -80,7 +80,7 @@ for arg in "$@"; do
|
|
|
80
80
|
esac
|
|
81
81
|
done
|
|
82
82
|
|
|
83
|
-
# ── Opt-out marker check (
|
|
83
|
+
# ── Opt-out marker check (centralised-review-reports-for-cross-project-skill-improvement-jsonl-at-claude-review-reports-architecture-rule / windyroad-plugin-maturity-measurement-mechanism-session-transcript-invocation-counts-plus-commit-history-composite-read-only-ndjson-architecture-rule §Privacy posture) ───────────────
|
|
84
84
|
|
|
85
85
|
OPT_OUT_MARKER="${PROJECT_ROOT}/.claude/.skill-metrics-opt-out"
|
|
86
86
|
if [ -e "$OPT_OUT_MARKER" ]; then
|
|
@@ -88,14 +88,14 @@ if [ -e "$OPT_OUT_MARKER" ]; then
|
|
|
88
88
|
exit 0
|
|
89
89
|
fi
|
|
90
90
|
|
|
91
|
-
# ── Transcript root accessibility (
|
|
91
|
+
# ── Transcript root accessibility (structured-user-interaction-for-governance-skill-decisions-architecture-rule Rule 6 fail-safe) ────────────────
|
|
92
92
|
|
|
93
93
|
if [ ! -d "$TRANSCRIPT_ROOT" ]; then
|
|
94
94
|
echo "# wr-itil-skill-invocations: transcript root inaccessible at ${TRANSCRIPT_ROOT}" >&2
|
|
95
95
|
exit 0
|
|
96
96
|
fi
|
|
97
97
|
|
|
98
|
-
# ── --category-overrides validation (
|
|
98
|
+
# ── --category-overrides validation (windyroad-plugin-maturity-measurement-mechanism-session-transcript-invocation-counts-plus-commit-history-composite-read-only-ndjson-architecture-rule §Per-category override hook) ───
|
|
99
99
|
# Forward-extension flag; ships unused in Phase 2. Validated for path
|
|
100
100
|
# existence; not yet consumed by the body.
|
|
101
101
|
|
|
@@ -104,7 +104,7 @@ if [ -n "$CATEGORY_OVERRIDES" ] && [ ! -f "$CATEGORY_OVERRIDES" ]; then
|
|
|
104
104
|
exit 0
|
|
105
105
|
fi
|
|
106
106
|
|
|
107
|
-
# ── JSONL parse + NDJSON emit (Python 3 stdlib —
|
|
107
|
+
# ── JSONL parse + NDJSON emit (Python 3 stdlib — windyroad-plugin-maturity-measurement-mechanism-session-transcript-invocation-counts-plus-commit-history-composite-read-only-ndjson-architecture-rule line 127) ──────────
|
|
108
108
|
# Inputs pinned via environment to avoid argv leakage of secrets.
|
|
109
109
|
|
|
110
110
|
export SI_TRANSCRIPT_ROOT="$TRANSCRIPT_ROOT"
|
|
@@ -121,19 +121,19 @@ window_days = int(os.environ["SI_WINDOW_DAYS"])
|
|
|
121
121
|
now = time.time()
|
|
122
122
|
cutoff = now - window_days * 86400
|
|
123
123
|
|
|
124
|
-
# Bin shim grammar from
|
|
124
|
+
# Bin shim grammar from plugin-bundled-scripts-invoked-from-skill-md-resolve-via-bin-on-path-architecture-rule: wr-<plugin>-<kebab-script-name>.
|
|
125
125
|
# Anchor on word boundary; allow alnum + hyphens; non-greedy plugin token
|
|
126
126
|
# stops at the first hyphen so `wr-itil-reconcile-readme` attributes to
|
|
127
127
|
# `itil`, not `itil-reconcile`.
|
|
128
128
|
BIN_RE = re.compile(r"\bwr-([a-z0-9]+)-[a-z0-9-]+")
|
|
129
129
|
|
|
130
|
-
# Phase 2e (
|
|
130
|
+
# Phase 2e (problem-087-no-maturity-battle-hardening-signal-on-plugins-skills-agents-or-hooks-readmes-don-t-tell-users-which-features-are-stable-vs-experimental-problem) byte-seek bisect — find the earliest byte offset whose
|
|
131
131
|
# line carries a timestamp >= cutoff, then linear-scan from there. Files
|
|
132
132
|
# below the threshold linear-scan from byte 0 (bisect overhead is not
|
|
133
133
|
# worth it; the ratio of bisect-seeks to in-window lines flips around
|
|
134
134
|
# this size on warm-cache developer laptops per Phase 2c profile data).
|
|
135
135
|
# JSONL append-only monotonicity is the input invariant — pinned in
|
|
136
|
-
#
|
|
136
|
+
# windyroad-plugin-maturity-measurement-mechanism-session-transcript-invocation-counts-plus-commit-history-composite-read-only-ndjson-architecture-rule §Performance contract Phase 2e amendment. Non-monotonic input
|
|
137
137
|
# under-counts gracefully (bisect locates by byte position, not by
|
|
138
138
|
# content scan) without crashing or emitting malformed NDJSON; pinned
|
|
139
139
|
# by the "non-monotonic timestamps — graceful degradation" bats fixture.
|
|
@@ -206,7 +206,7 @@ def find_first_in_window_offset(fh, file_size, cutoff_epoch):
|
|
|
206
206
|
def plugin_from_skill(name):
|
|
207
207
|
"""`wr-itil:manage-problem` -> `itil`. Non-wr-prefixed or short-form
|
|
208
208
|
names like `commit`, `loop` return None (excluded from per-plugin
|
|
209
|
-
attribution per
|
|
209
|
+
attribution per windyroad-plugin-maturity-measurement-mechanism-session-transcript-invocation-counts-plus-commit-history-composite-read-only-ndjson-architecture-rule line 64)."""
|
|
210
210
|
if not name or ":" not in name:
|
|
211
211
|
return None
|
|
212
212
|
prefix = name.split(":", 1)[0]
|
|
@@ -218,7 +218,7 @@ def plugin_from_agent(name):
|
|
|
218
218
|
return plugin_from_skill(name)
|
|
219
219
|
|
|
220
220
|
def hash_path(p):
|
|
221
|
-
"""sha256-prefix-12hex per
|
|
221
|
+
"""sha256-prefix-12hex per centralised-review-reports-for-cross-project-skill-improvement-jsonl-at-claude-review-reports-architecture-rule path-hashing convention. Reserved
|
|
222
222
|
for future schema bumps that emit path-bearing fields; not consumed
|
|
223
223
|
by the v1.0 schema."""
|
|
224
224
|
return hashlib.sha256(str(p).encode("utf-8")).hexdigest()[:12]
|
|
@@ -244,13 +244,13 @@ for jsonl in jsonl_iter:
|
|
|
244
244
|
except OSError:
|
|
245
245
|
continue
|
|
246
246
|
with fh:
|
|
247
|
-
# Phase 2e (
|
|
247
|
+
# Phase 2e (problem-087-no-maturity-battle-hardening-signal-on-plugins-skills-agents-or-hooks-readmes-don-t-tell-users-which-features-are-stable-vs-experimental-problem) byte-seek bisect — for files at or above the
|
|
248
248
|
# threshold, locate the first line whose timestamp falls within
|
|
249
249
|
# the cutoff window and start the linear scan from there. Files
|
|
250
250
|
# below the threshold scan linearly from byte 0 (the bisect
|
|
251
251
|
# overhead exceeds the savings on small files). The bisect
|
|
252
252
|
# presumes JSONL append-only monotonic timestamps within a single
|
|
253
|
-
# session file — pinned as an input invariant in
|
|
253
|
+
# session file — pinned as an input invariant in windyroad-plugin-maturity-measurement-mechanism-session-transcript-invocation-counts-plus-commit-history-composite-read-only-ndjson-architecture-rule
|
|
254
254
|
# §Performance Phase 2e amendment; non-monotonic input degrades
|
|
255
255
|
# gracefully via under-count, pinned by the bats "non-monotonic"
|
|
256
256
|
# fixture.
|
|
@@ -261,7 +261,7 @@ for jsonl in jsonl_iter:
|
|
|
261
261
|
continue
|
|
262
262
|
fh.seek(start_offset)
|
|
263
263
|
for raw_line in fh:
|
|
264
|
-
# Phase 2d (
|
|
264
|
+
# Phase 2d (problem-087-no-maturity-battle-hardening-signal-on-plugins-skills-agents-or-hooks-readmes-don-t-tell-users-which-features-are-stable-vs-experimental-problem) substring pre-filter — skip json.loads() on
|
|
265
265
|
# lines that cannot possibly contribute a count. The literal
|
|
266
266
|
# substring `"tool_use"` is the discriminating token: every
|
|
267
267
|
# content block we count carries `"type":"tool_use"`, while
|
|
@@ -329,7 +329,7 @@ for jsonl in jsonl_iter:
|
|
|
329
329
|
if m:
|
|
330
330
|
# Surface is the matched bin shim token only. The
|
|
331
331
|
# surrounding command (paths, secrets, args) is
|
|
332
|
-
# discarded — content-sanitisation per
|
|
332
|
+
# discarded — content-sanitisation per centralised-review-reports-for-cross-project-skill-improvement-jsonl-at-claude-review-reports-architecture-rule.
|
|
333
333
|
surface = m.group(0)
|
|
334
334
|
kind = "bash-attributed"
|
|
335
335
|
plugin = m.group(1)
|