@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.
Files changed (266) hide show
  1. package/.agents/plugins/marketplace.json +12 -0
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.codex-plugin/plugin.json +42 -0
  4. package/README.md +34 -25
  5. package/agents/hang-off-check.md +34 -34
  6. package/bin/install.mjs +71 -5
  7. package/bin/wr-itil-catchup-scan +4 -4
  8. package/bin/wr-itil-check-deferred-placeholder-staleness +4 -4
  9. package/bin/wr-itil-check-fail-soft-skip-discipline +4 -4
  10. package/bin/wr-itil-check-fix-rfc-trace +4 -4
  11. package/bin/wr-itil-check-locale-discipline +4 -4
  12. package/bin/wr-itil-check-outbound-responses-staleness +4 -4
  13. package/bin/wr-itil-check-problems-readme-budget +4 -4
  14. package/bin/wr-itil-check-rfc-has-stories +4 -4
  15. package/bin/wr-itil-check-rfc-stories-ratified +4 -4
  16. package/bin/wr-itil-check-ticket-jtbd-ratification +4 -4
  17. package/bin/wr-itil-check-upstream-cache-staleness +4 -4
  18. package/bin/wr-itil-check-upstream-responses +4 -4
  19. package/bin/wr-itil-classify-readme-drift +4 -4
  20. package/bin/wr-itil-derive-release-vehicle +4 -4
  21. package/bin/wr-itil-detect-unratified-stories-maps +4 -4
  22. package/bin/wr-itil-effort-tally +4 -4
  23. package/bin/wr-itil-enumerate-postrelease-kv-candidates +4 -4
  24. package/bin/wr-itil-evaluate-relevance +4 -4
  25. package/bin/wr-itil-mark-create-gate +4 -4
  26. package/bin/wr-itil-mark-story-oversight-confirmed +4 -4
  27. package/bin/wr-itil-migrate-problems-layout +4 -4
  28. package/bin/wr-itil-migrate-story-status-mirror +4 -4
  29. package/bin/wr-itil-next-rfc-id +4 -4
  30. package/bin/wr-itil-plugin-exercise-index +4 -4
  31. package/bin/wr-itil-plugin-maturity-populate +4 -4
  32. package/bin/wr-itil-plugin-maturity-render +4 -4
  33. package/bin/wr-itil-plugin-validate-ci-gate +4 -4
  34. package/bin/wr-itil-reconcile-readme +4 -4
  35. package/bin/wr-itil-reconcile-rfcs +4 -4
  36. package/bin/wr-itil-reconcile-stories +4 -4
  37. package/bin/wr-itil-reconcile-story-maps +4 -4
  38. package/bin/wr-itil-render-story-map +4 -4
  39. package/bin/wr-itil-resolve-governance-plugin-dirs +4 -4
  40. package/bin/wr-itil-skill-invocations +4 -4
  41. package/bin/wr-itil-story-map-edit +4 -4
  42. package/bin/wr-itil-story-map-query +4 -4
  43. package/bin/wr-itil-update-jtbd-references-section +4 -4
  44. package/bin/wr-itil-update-problem-references-section +4 -4
  45. package/bin/wr-itil-update-problem-rfcs-section +4 -4
  46. package/bin/wr-itil-update-rfc-commits-section +4 -4
  47. package/bin/wr-itil-update-rfc-references-section +4 -4
  48. package/bin/wr-itil-verify-iter-summary +4 -4
  49. package/hooks/itil-assistant-output-gate.sh +3 -3
  50. package/hooks/itil-assistant-output-review.sh +5 -5
  51. package/hooks/itil-bash-polling-antipattern-detect.sh +11 -11
  52. package/hooks/itil-changeset-discipline.sh +24 -24
  53. package/hooks/itil-claude-space-protection.sh +21 -14
  54. package/hooks/itil-codex-dispatch.sh +164 -0
  55. package/hooks/itil-commit-trailer-transition-advisory.sh +11 -11
  56. package/hooks/itil-correction-detect.sh +8 -8
  57. package/hooks/itil-deferral-cadence-gate.sh +23 -23
  58. package/hooks/itil-fictional-defer-detect.sh +16 -16
  59. package/hooks/itil-fix-title-lifecycle-advisory.sh +11 -11
  60. package/hooks/itil-mid-loop-ask-detect.sh +14 -14
  61. package/hooks/itil-no-implement-draft-gate.sh +18 -18
  62. package/hooks/itil-pending-questions-surface.sh +11 -11
  63. package/hooks/itil-readme-refresh-discipline.sh +27 -27
  64. package/hooks/itil-rfc-oversight-nudge.sh +7 -7
  65. package/hooks/itil-rfc-trailer-advisory.sh +28 -28
  66. package/hooks/itil-runtime-sid-marker.sh +11 -11
  67. package/hooks/itil-story-mirror-migration-nudge.sh +7 -7
  68. package/hooks/lib/block-list.sh +17 -17
  69. package/hooks/lib/changeset-detect.sh +27 -27
  70. package/hooks/lib/claude-space-gate.sh +23 -15
  71. package/hooks/lib/command-detect.sh +12 -12
  72. package/hooks/lib/create-gate.sh +9 -39
  73. package/hooks/lib/detectors.sh +12 -12
  74. package/hooks/lib/readme-refresh-detect.sh +51 -51
  75. package/hooks/lib/runtime-sid.sh +12 -12
  76. package/hooks/lib/session-id.sh +28 -28
  77. package/hooks/lib/session-marker.sh +1 -1
  78. package/hooks/lib/staging-detect.sh +13 -13
  79. package/hooks/manage-problem-enforce-create.sh +16 -27
  80. package/hooks/p057-staging-trap-detect.sh +18 -18
  81. package/hooks/pre-publish-intake-gate.sh +5 -5
  82. package/hooks/staleness-check.sh +6 -6
  83. package/hooks-codex/hooks.json +57 -0
  84. package/lib/check-deferred-placeholder-staleness.sh +10 -10
  85. package/lib/check-outbound-responses-staleness.sh +2 -2
  86. package/lib/check-upstream-cache-staleness.sh +2 -2
  87. package/lib/derive-first-dispatch.sh +19 -19
  88. package/lib/enumerate-postrelease-kv-candidates.sh +18 -18
  89. package/lib/migrate-problems-layout.sh +12 -12
  90. package/lib/story-oversight.sh +27 -27
  91. package/package.json +16 -3
  92. package/scripts/catchup-scan.sh +25 -25
  93. package/scripts/check-fail-soft-skip-discipline.sh +10 -10
  94. package/scripts/check-fix-rfc-trace.sh +8 -8
  95. package/scripts/check-locale-discipline.sh +13 -13
  96. package/scripts/check-problems-readme-budget.sh +12 -12
  97. package/scripts/check-rfc-has-stories.sh +7 -7
  98. package/scripts/check-rfc-rejected-alternatives.sh +11 -11
  99. package/scripts/check-rfc-stories-ratified.sh +9 -9
  100. package/scripts/check-ticket-jtbd-ratification.sh +10 -10
  101. package/scripts/check-upstream-responses.sh +22 -22
  102. package/scripts/classify-readme-drift.sh +13 -13
  103. package/scripts/codex-agent.mjs +104 -0
  104. package/scripts/derive-release-vehicle.sh +23 -23
  105. package/scripts/detect-unoversighted-rfcs.sh +3 -3
  106. package/scripts/detect-unratified-stories-maps.sh +5 -5
  107. package/scripts/effort-tally.sh +10 -10
  108. package/scripts/evaluate-relevance.sh +16 -16
  109. package/scripts/mark-create-gate.sh +4 -4
  110. package/scripts/mark-story-oversight-confirmed.sh +14 -14
  111. package/scripts/migrate-story-status-mirror.sh +6 -6
  112. package/scripts/next-rfc-id.sh +5 -5
  113. package/scripts/plugin-exercise-index.sh +26 -26
  114. package/scripts/plugin-maturity-populate.sh +38 -38
  115. package/scripts/plugin-maturity-render.sh +26 -26
  116. package/scripts/plugin-validate-ci-gate.sh +14 -14
  117. package/scripts/reconcile-readme.sh +23 -23
  118. package/scripts/reconcile-rfcs.sh +13 -13
  119. package/scripts/reconcile-stories.sh +12 -12
  120. package/scripts/reconcile-story-maps.sh +6 -6
  121. package/scripts/render-story-map.mjs +24 -24
  122. package/scripts/render-story-map.sh +3 -3
  123. package/scripts/resolve-governance-plugin-dirs.sh +10 -10
  124. package/scripts/run-check-deferred-placeholder-staleness.sh +3 -3
  125. package/scripts/run-check-outbound-responses-staleness.sh +3 -3
  126. package/scripts/run-check-upstream-cache-staleness.sh +3 -3
  127. package/scripts/run-enumerate-postrelease-kv-candidates.sh +3 -3
  128. package/scripts/run-migrate-problems-layout.sh +3 -3
  129. package/scripts/skill-invocations.sh +29 -29
  130. package/scripts/story-map-edit.mjs +6 -6
  131. package/scripts/story-map-edit.sh +3 -3
  132. package/scripts/story-map-query.mjs +8 -8
  133. package/scripts/story-map-query.sh +3 -3
  134. package/scripts/update-jtbd-references-section.sh +8 -8
  135. package/scripts/update-problem-references-section.sh +12 -12
  136. package/scripts/update-problem-rfcs-section.sh +9 -9
  137. package/scripts/update-rfc-commits-section.sh +7 -7
  138. package/scripts/update-rfc-references-section.sh +3 -3
  139. package/scripts/update-story-references-section.sh +5 -5
  140. package/scripts/verify-iter-summary.sh +3 -3
  141. package/skills/capture-problem/REFERENCE.md +33 -33
  142. package/skills/capture-problem/SKILL.md +108 -108
  143. package/skills/capture-problem/agents/openai.yaml +3 -0
  144. package/skills/capture-rfc/SKILL.md +21 -323
  145. package/skills/capture-rfc/agents/openai.yaml +3 -0
  146. package/skills/capture-story/SKILL.md +65 -65
  147. package/skills/capture-story/agents/openai.yaml +3 -0
  148. package/skills/capture-story-map/SKILL.md +31 -31
  149. package/skills/capture-story-map/agents/openai.yaml +3 -0
  150. package/skills/check-upstream-responses/SKILL.md +38 -38
  151. package/skills/check-upstream-responses/agents/openai.yaml +3 -0
  152. package/skills/close-incident/SKILL.md +25 -25
  153. package/skills/close-incident/agents/openai.yaml +3 -0
  154. package/skills/link-incident/SKILL.md +22 -22
  155. package/skills/link-incident/agents/openai.yaml +3 -0
  156. package/skills/list-incidents/SKILL.md +9 -9
  157. package/skills/list-incidents/agents/openai.yaml +3 -0
  158. package/skills/list-problems/SKILL.md +17 -17
  159. package/skills/list-problems/agents/openai.yaml +3 -0
  160. package/skills/list-stories/SKILL.md +23 -23
  161. package/skills/list-stories/agents/openai.yaml +3 -0
  162. package/skills/list-story-maps/SKILL.md +9 -9
  163. package/skills/list-story-maps/agents/openai.yaml +3 -0
  164. package/skills/manage-incident/SKILL.md +59 -59
  165. package/skills/manage-incident/agents/openai.yaml +3 -0
  166. package/skills/manage-problem/SKILL.md +222 -222
  167. package/skills/manage-problem/agents/openai.yaml +3 -0
  168. package/skills/manage-rfc/SKILL.md +62 -62
  169. package/skills/manage-rfc/agents/openai.yaml +3 -0
  170. package/skills/manage-story/SKILL.md +49 -49
  171. package/skills/manage-story/agents/openai.yaml +3 -0
  172. package/skills/manage-story-map/SKILL.md +30 -30
  173. package/skills/manage-story-map/agents/openai.yaml +3 -0
  174. package/skills/mitigate-incident/SKILL.md +40 -40
  175. package/skills/mitigate-incident/agents/openai.yaml +3 -0
  176. package/skills/reconcile-readme/SKILL.md +28 -28
  177. package/skills/reconcile-readme/agents/openai.yaml +3 -0
  178. package/skills/reconcile-stories/SKILL.md +17 -17
  179. package/skills/reconcile-stories/agents/openai.yaml +3 -0
  180. package/skills/reconcile-story-maps/SKILL.md +11 -11
  181. package/skills/reconcile-story-maps/agents/openai.yaml +3 -0
  182. package/skills/report-upstream/SKILL.md +73 -73
  183. package/skills/report-upstream/agents/openai.yaml +3 -0
  184. package/skills/restore-incident/SKILL.md +28 -28
  185. package/skills/restore-incident/agents/openai.yaml +3 -0
  186. package/skills/review-problems/SKILL.md +129 -129
  187. package/skills/review-problems/agents/openai.yaml +3 -0
  188. package/skills/scaffold-intake/SKILL.md +26 -26
  189. package/skills/scaffold-intake/agents/openai.yaml +3 -0
  190. package/skills/transition-problem/SKILL.md +85 -85
  191. package/skills/transition-problem/agents/openai.yaml +3 -0
  192. package/skills/transition-problems/SKILL.md +69 -69
  193. package/skills/transition-problems/agents/openai.yaml +3 -0
  194. package/skills/update-upstream/SKILL.md +97 -97
  195. package/skills/update-upstream/agents/openai.yaml +3 -0
  196. package/skills/work-problem/SKILL.md +42 -42
  197. package/skills/work-problem/agents/openai.yaml +3 -0
  198. package/skills/work-problems/SKILL.md +327 -327
  199. package/skills/work-problems/agents/openai.yaml +3 -0
  200. package/skills-codex/capture-problem/REFERENCE.md +139 -0
  201. package/skills-codex/capture-problem/SKILL.md +438 -0
  202. package/skills-codex/capture-problem/agents/openai.yaml +3 -0
  203. package/skills-codex/capture-rfc/SKILL.md +45 -0
  204. package/skills-codex/capture-rfc/agents/openai.yaml +3 -0
  205. package/skills-codex/capture-story/SKILL.md +407 -0
  206. package/skills-codex/capture-story/agents/openai.yaml +3 -0
  207. package/skills-codex/capture-story-map/SKILL.md +286 -0
  208. package/skills-codex/capture-story-map/agents/openai.yaml +3 -0
  209. package/skills-codex/check-upstream-responses/SKILL.md +160 -0
  210. package/skills-codex/check-upstream-responses/agents/openai.yaml +3 -0
  211. package/skills-codex/close-incident/SKILL.md +192 -0
  212. package/skills-codex/close-incident/agents/openai.yaml +3 -0
  213. package/skills-codex/link-incident/SKILL.md +173 -0
  214. package/skills-codex/link-incident/agents/openai.yaml +3 -0
  215. package/skills-codex/list-incidents/SKILL.md +92 -0
  216. package/skills-codex/list-incidents/agents/openai.yaml +3 -0
  217. package/skills-codex/list-problems/SKILL.md +126 -0
  218. package/skills-codex/list-problems/agents/openai.yaml +3 -0
  219. package/skills-codex/list-stories/SKILL.md +170 -0
  220. package/skills-codex/list-stories/agents/openai.yaml +3 -0
  221. package/skills-codex/list-story-maps/SKILL.md +104 -0
  222. package/skills-codex/list-story-maps/agents/openai.yaml +3 -0
  223. package/skills-codex/manage-incident/SKILL.md +378 -0
  224. package/skills-codex/manage-incident/agents/openai.yaml +3 -0
  225. package/skills-codex/manage-problem/SKILL.md +1180 -0
  226. package/skills-codex/manage-problem/agents/openai.yaml +3 -0
  227. package/skills-codex/manage-rfc/SKILL.md +314 -0
  228. package/skills-codex/manage-rfc/agents/openai.yaml +3 -0
  229. package/skills-codex/manage-story/SKILL.md +284 -0
  230. package/skills-codex/manage-story/agents/openai.yaml +3 -0
  231. package/skills-codex/manage-story-map/SKILL.md +198 -0
  232. package/skills-codex/manage-story-map/agents/openai.yaml +3 -0
  233. package/skills-codex/mitigate-incident/SKILL.md +239 -0
  234. package/skills-codex/mitigate-incident/agents/openai.yaml +3 -0
  235. package/skills-codex/reconcile-readme/SKILL.md +175 -0
  236. package/skills-codex/reconcile-readme/agents/openai.yaml +3 -0
  237. package/skills-codex/reconcile-stories/SKILL.md +124 -0
  238. package/skills-codex/reconcile-stories/agents/openai.yaml +3 -0
  239. package/skills-codex/reconcile-story-maps/SKILL.md +81 -0
  240. package/skills-codex/reconcile-story-maps/agents/openai.yaml +3 -0
  241. package/skills-codex/report-upstream/SKILL.md +716 -0
  242. package/skills-codex/report-upstream/agents/openai.yaml +3 -0
  243. package/skills-codex/restore-incident/SKILL.md +216 -0
  244. package/skills-codex/restore-incident/agents/openai.yaml +3 -0
  245. package/skills-codex/review-problems/SKILL.md +524 -0
  246. package/skills-codex/review-problems/agents/openai.yaml +3 -0
  247. package/skills-codex/scaffold-intake/SKILL.md +209 -0
  248. package/skills-codex/scaffold-intake/agents/openai.yaml +3 -0
  249. package/skills-codex/scaffold-intake/templates/CONTRIBUTING.md.tmpl +31 -0
  250. package/skills-codex/scaffold-intake/templates/SECURITY.md.tmpl +39 -0
  251. package/skills-codex/scaffold-intake/templates/SUPPORT.md.tmpl +32 -0
  252. package/skills-codex/scaffold-intake/templates/config.yml.tmpl +8 -0
  253. package/skills-codex/scaffold-intake/templates/problem-report.yml.tmpl +114 -0
  254. package/skills-codex/transition-problem/SKILL.md +371 -0
  255. package/skills-codex/transition-problem/agents/openai.yaml +3 -0
  256. package/skills-codex/transition-problems/SKILL.md +310 -0
  257. package/skills-codex/transition-problems/agents/openai.yaml +3 -0
  258. package/skills-codex/update-upstream/SKILL.md +583 -0
  259. package/skills-codex/update-upstream/agents/openai.yaml +3 -0
  260. package/skills-codex/work-problem/SKILL.md +160 -0
  261. package/skills-codex/work-problem/agents/openai.yaml +3 -0
  262. package/skills-codex/work-problems/SKILL.md +58 -0
  263. package/skills-codex/work-problems/agents/openai.yaml +3 -0
  264. package/templates/story-map.css +1 -1
  265. package/bin/wr-itil-mark-rfc-capture-gate +0 -51
  266. 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
- # ADR-038 progressive-disclosure budget):
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 (P170 Phase 2 Slice 9 — closes ADR-060 line 270):
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
- # (P170 Phase 2 Slice 8) applies edits with narrative-aware preservation;
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 (ADR-060 Phase 1
52
- # item 5) and reconcile-readme.sh (P118 / ADR-014): same parse + diff
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-RFC-002, native-subdir)
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 ADR-060 line 253)
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 ADR-060)
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 P170
67
- # @adr ADR-060 (Problem-RFC-Story framework — Phase 2 amendment 2026-05-10
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 ADR-049 (Plugin script resolution via bin/ on PATH — paired bin shim
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
- # ADR-103: a release row may be the RFC, so no markdown parent exists.
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 (P170 Phase 2 Slice 9) and
10
- # reconcile-rfcs.sh (ADR-060 Phase 1 item 5). Differences:
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 ADR-060 line 145)
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 P170
30
- # @adr ADR-060 (Problem-RFC-Story framework — Phase 2 amendment 2026-05-10
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 ADR-049 (Plugin-bundled scripts via bin/ on PATH — paired bin shim
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 ADR-102 (story maps render from JSON through a canonical template)
31
- // @adr ADR-060 (Problem-RFC-Story framework — Phase 2 encoding, amended)
32
- // @adr ADR-103 (story cards single-line — a readability convention now, not a
33
- // correctness constraint: ADR-101's whole-line filter that made it
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
- * STORY-MAP-002 had drifted into a "Value: ..." paraphrase while the stories
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 STORY-052's card ran to 169 words, most of it the evidence prose the
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 STORY-060 its three lines with nothing reporting why. Widening
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 ADR-104 forbids.
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 ",RFC-005,…" or ",,", and `content=",,"` satisfies the
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. ADR-103 made the release row the RFC, so the
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 (ADR-103).
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 (ADR-102) — so generated markup in the file cannot drift a
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 (ADR-103), so where a problem has
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 (ADR-103), so its id is the label.
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 P160, P443" — the label and the trace contradicting each other.
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 STORY-MAP-002), and any observation about the shape
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 ADR-104 rule applied to writing.
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 ADR-104 rule applied to presentation rather than to data: do not
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
- * ADR-104 rule again: show what is authored once, derive the rest, write
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` (ADR-106 — a map carries no
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 ADR-060 I6 hard-blocks a story that traces no problem,
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 (ADR-104's degrade-gracefully
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
- * STORY-060 walked into it. Loosening cannot close it. Refusing can: the
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 — ADR-060 I6), or');
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 ADR-049/ADR-080
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 ADR-102 (story maps render from JSON through a canonical template)
12
- # @adr ADR-049 (plugin scripts resolve via bin/ on $PATH)
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
- # P382: headless `claude -p` loads only USER-scoped enabledPlugins, NOT
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
- # (ADR-049 bin-on-PATH precedent — present in adopter marketplace-cache trees
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 (ADR-080 highest-version-wins). $PATH order is frozen at session
19
- # init and goes stale mid-session (P343 / ADR-080 / ADR-081), so it MUST NOT be
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 ADR-032 (governance skill invocation — Step 5 dispatch contract, P382 amendment)
32
- # @adr ADR-049 (plugin-bundled scripts resolve via bin/ on $PATH)
33
- # @adr ADR-080 (highest-version-wins resolution — $PATH order is not authoritative)
34
- # @adr ADR-052 (behavioural test — resolve-governance-plugin-dirs.bats)
35
- # @problem P382
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> (ADR-080). PATH order
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 (P271 / P317 RFC-009 adopter-safe).
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 (ADR-049 +
14
- # ADR-080). Operates on the directory given as $1 (defaults to $PWD).
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 (P220 + P317/RFC-009).
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 (P317). SKILLs invoke this by name
11
- # via the `wr-itil-check-outbound-responses-staleness` PATH shim (ADR-049).
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 (P317/RFC-009).
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 (P317). SKILLs invoke this by name
11
- # via the `wr-itil-check-upstream-cache-staleness` PATH shim (ADR-049).
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 (P228 / P317 RFC-009 adopter-safe).
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 (ADR-049 +
15
- # ADR-080).
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 (P317/RFC-009).
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 (P317). SKILLs invoke this by name
8
- # via the `wr-itil-migrate-problems-layout` PATH shim (ADR-049). The migration
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 (P087) transcript-axis maturity-measurement script.
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
- # ADR-058 §Script contracts, and emits one NDJSON record per surface to
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 ADR-058 line 70-82):
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 (ADR-058 line 67)
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 — ADR-013 Rule 6 fail-safe. Opt-out marker / inaccessible
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 (ADR-035 clauses adopted verbatim):
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. ADR-058 §Confirmation 3 enforces via negative-grep
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 P087 (Phase 2a — transcript axis)
48
- # @adr ADR-058 (Plugin maturity measurement mechanism)
49
- # @adr ADR-049 (Shim grammar — bin/wr-itil-skill-invocations on $PATH)
50
- # @adr ADR-035 (Privacy posture adopted verbatim)
51
- # @adr ADR-052 (Behavioural tests default; ADR-058 §Confirmation 1-5)
52
- # @adr ADR-013 Rule 6 (non-interactive fail-safe — exit 0 always)
53
- # @adr ADR-023 (Performance — < 1.5s warm-cache; 30-day window default)
54
- # @jtbd JTBD-101 (Extend the Suite — hardening-prioritisation outcome,
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 JTBD-201 (Restore Service Fast — audit-trail composition)
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 (ADR-035 / ADR-058 §Privacy posture) ───────────────
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 (ADR-013 Rule 6 fail-safe) ────────────────
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 (ADR-058 §Per-category override hook) ───
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 — ADR-058 line 127) ──────────
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 ADR-049: wr-<plugin>-<kebab-script-name>.
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 (P087) byte-seek bisect — find the earliest byte offset whose
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
- # ADR-058 §Performance contract Phase 2e amendment. Non-monotonic input
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 ADR-058 line 64)."""
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 ADR-035 path-hashing convention. Reserved
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 (P087) byte-seek bisect — for files at or above the
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 ADR-058
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 (P087) substring pre-filter — skip json.loads() on
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 ADR-035.
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)