@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
@@ -1,22 +1,22 @@
1
1
  ---
2
2
  name: wr-itil:capture-story
3
- description: Lightweight story-capture skill for aside-invocation during foreground work — mandatory leading problem-trace AND JTBD-trace per ADR-060 I6 + I9 invariants, mandatory `--story-map` trace (I8 enforced AT CAPTURE per ADR-095, refuse-and-route if absent) + optional `--rfc` (I7 at accepted) + real user-value + >=1 acceptance criterion at capture (I10 content subset / ADR-095), skeleton story file at `docs/stories/draft/STORY-NNN-<slug>.md`, single commit per capture, no inline README refresh. Defers full INVEST shape + acceptance transition to /wr-itil:manage-story. Use when the user (or agent) wants to capture a story quickly with clear problem + JTBD anchoring. For full lifecycle management, use /wr-itil:manage-story.
3
+ description: Lightweight story-capture skill for aside-invocation during foreground work — mandatory leading problem-trace AND JTBD-trace per the "Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology" architecture rule I6 + I9 invariants, mandatory `--story-map` trace (I8 enforced AT CAPTURE per the "Story-map membership and story-content completeness are enforced at capture" architecture rule, refuse-and-route if absent) + optional `--rfc` (I7 at accepted) + real user-value + >=1 acceptance criterion at capture (I10 content subset / the "Story-map membership and story-content completeness are enforced at capture" architecture rule), skeleton story file at `docs/stories/draft/STORY-NNN-<slug>.md`, single commit per capture, no inline README refresh. Defers full INVEST shape + acceptance transition to /wr-itil:manage-story. Use when the user (or agent) wants to capture a story quickly with clear problem + JTBD anchoring. For full lifecycle management, use /wr-itil:manage-story.
4
4
  allowed-tools: Read, Write, Edit, Bash, Grep, Glob
5
5
  ---
6
6
 
7
7
  # Capture Story Skill
8
8
 
9
- Capture an INVEST-shaped story ticket quickly during foreground work. Lightweight aside-invocation surface that complements the heavyweight `/wr-itil:manage-story` flow. Mirrors `/wr-itil:capture-rfc` shape per ADR-032 lightweight + heavyweight skill split, extended for the story tier's stricter trace-mandate (problem, JTBD, AND story-map at capture — I8 enforced at capture per ADR-095; RFC deferred to accepted).
9
+ Capture an INVEST-shaped story ticket quickly during foreground work. Lightweight aside-invocation surface that complements the heavyweight `/wr-itil:manage-story` flow. Mirrors `/wr-itil:capture-rfc` shape per the "Governance skill invocation patterns — foreground + background with deferred-question resumption" architecture rule lightweight + heavyweight skill split, extended for the story tier's stricter trace-mandate (problem, JTBD, AND story-map at capture — I8 enforced at capture per the "Story-map membership and story-content completeness are enforced at capture" architecture rule; RFC deferred to accepted).
10
10
 
11
- This skill is one half of the capture-then-manage story framework introduced by ADR-060 (Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology, accepted 2026-05-05; Phase 2 amendment 2026-05-12 introducing the story tier). The other half is `/wr-itil:manage-story` (heavyweight intake + INVEST-gated lifecycle management).
11
+ This skill is one half of the capture-then-manage story framework introduced by the "Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology" architecture rule (Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology, accepted 2026-05-05; Phase 2 amendment 2026-05-12 introducing the story tier). The other half is `/wr-itil:manage-story` (heavyweight intake + INVEST-gated lifecycle management).
12
12
 
13
- **Related JTBDs**: JTBD-008 (primary — Decompose a Fix Into Coordinated Changes; story is the INVEST-shaped sub-workstream entity JTBD-008 line 20 names), JTBD-001 (extended scope — story-level governance via INVEST gates at acceptance + auto-transition on RFC-closes + acceptance-criteria all-ticked), JTBD-101 (atomic-fix-adopter friction guard — capture-story remains opt-in; atomic-RFC fallback per ADR-060 line 262 means atomic adopters never invoke capture-story).
13
+ **Related JTBDs**: the ": Decompose a Fix Into Coordinated Changes" user outcome (primary — Decompose a Fix Into Coordinated Changes; story is the INVEST-shaped sub-workstream entity the ": Decompose a Fix Into Coordinated Changes" user outcome line 20 names), the ": Enforce Governance Without Slowing Down" user outcome (extended scope — story-level governance via INVEST gates at acceptance + auto-transition on RFC-closes + acceptance-criteria all-ticked), the "Extend the Suite with New Plugins" user outcome (atomic-fix-adopter friction guard — capture-story remains opt-in; atomic-RFC fallback per the "Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology" architecture rule line 262 means atomic adopters never invoke capture-story).
14
14
 
15
15
  ## When to invoke
16
16
 
17
- - **Slicing an RFC into INVEST-shaped sub-workstreams**: agent / user has captured an RFC and is now decomposing its scope into the ordered `stories:` array per ADR-060's working-the-problem flow (line 300-320). Each slice on a story-map's backbone → ribs → slices grid becomes one story.
18
- - **Placing a story on its map at capture**: per ADR-095 a story is born on a story map — `--story-map` is MANDATORY at capture (I8 refuse-and-route if absent). `--rfc` stays optional (I7 enforces at the `draft → accepted` transition); a draft story may exist with NO `rfcs:` until the design firms up, but NEVER with an empty `story-maps:`.
19
- - **Retrospective bootstrap migration** (Slice 15 of P170 Phase 2): extracting existing slices from `docs/plans/170-rfc-framework-story-map.md` into individual story files. The bootstrap-exempt marker (ADR-060 A4 / ADR-053) permits the retrospective sequence to bypass the capture-time I8 hard-block for migration stories ONLY; `rfcs:` still fills in before the manage-story <NNN> accepted gate (I7).
17
+ - **Slicing an RFC into INVEST-shaped sub-workstreams**: agent / user has captured an RFC and is now decomposing its scope into the ordered `stories:` array per the "Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology" architecture rule's working-the-problem flow (line 300-320). Each slice on a story-map's backbone → ribs → slices grid becomes one story.
18
+ - **Placing a story on its map at capture**: per the "Story-map membership and story-content completeness are enforced at capture" architecture rule a story is born on a story map — `--story-map` is MANDATORY at capture (I8 refuse-and-route if absent). `--rfc` stays optional (I7 enforces at the `draft → accepted` transition); a draft story may exist with NO `rfcs:` until the design firms up, but NEVER with an empty `story-maps:`.
19
+ - **Retrospective bootstrap migration** (Slice 15 of the "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): extracting existing slices from `docs/plans/170-rfc-framework-story-map.md` into individual story files. The bootstrap-exempt marker (the "Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology" architecture rule A4 / the "`@windyroad/*` plugin / skill / agent / hook maturity taxonomy" architecture rule) permits the retrospective sequence to bypass the capture-time I8 hard-block for migration stories ONLY; `rfcs:` still fills in before the manage-story <NNN> accepted gate (I7).
20
20
  - **Forward dogfood capture**: a new story for in-flight work, captured at the start of implementation, runs to `done` via `Refs: STORY-NNN` trailer detection + acceptance-criteria all-ticked.
21
21
 
22
22
  **Use `/wr-itil:manage-story` instead** when:
@@ -35,16 +35,16 @@ This skill is one half of the capture-then-manage story framework introduced by
35
35
  - `--story-map STORY-MAP-<NNN>[,STORY-MAP-<NNN>,...]` — story-map(s) this story will be placed on once design firms up.
36
36
 
37
37
  ```
38
- /wr-itil:capture-story P170 JTBD-008 Build /wr-itil:capture-story-map skill scaffold
39
- /wr-itil:capture-story P170 JTBD-008,JTBD-001 --rfc RFC-002 Ship hook exemption globs across 4 enforce-edit hooks
40
- /wr-itil:capture-story P170 JTBD-008 --story-map STORY-MAP-001 --rfc RFC-002 Extract Slice 5 T7 shared-migration-routine into STORY-NNN
38
+ /wr-itil:capture-story the "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 the ": Decompose a Fix Into Coordinated Changes" user outcome Build /wr-itil:capture-story-map skill scaffold
39
+ /wr-itil:capture-story the "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 the ": Decompose a Fix Into Coordinated Changes" user outcome,the ": Enforce Governance Without Slowing Down" user outcome --rfc the ": docs/problems/ flat layout migration — per-state subdirs + adopter auto-migration" release design Ship hook exemption globs across 4 enforce-edit hooks
40
+ /wr-itil:capture-story the "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 the ": Decompose a Fix Into Coordinated Changes" user outcome --story-map the "RFC framework bootstrap journey map" journey map --rfc the ": docs/problems/ flat layout migration — per-state subdirs + adopter auto-migration" release design Extract Slice 5 T7 shared-migration-routine into STORY-NNN
41
41
  ```
42
42
 
43
- **ADR-060 § Skills line 291 phrasing footnote**: ADR-060 names "Mandatory: ≥1 problem trace, ≥1 JTBD trace" verbatim. This skill uses the **positional** form (no `--problem` / `--jtbd` prefix on the mandatory pair) to match the lightweight aside-invocation grammar of `capture-rfc` (per ADR-032) and because Claude Code skill arguments don't carry a proper CLI flag parser. The optional `--rfc` / `--story-map` flags exist BECAUSE they are optional — fully positional would require sentinel values for absent traces. The hard-block intent (ADR-060 § Confirmation criterion implied by I6 + I9 — capture fails without both mandatory traces) is preserved verbatim — only the surface syntax differs.
43
+ **the "Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology" architecture rule § Skills line 291 phrasing footnote**: the "Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology" architecture rule names "Mandatory: ≥1 problem trace, ≥1 JTBD trace" verbatim. This skill uses the **positional** form (no `--problem` / `--jtbd` prefix on the mandatory pair) to match the lightweight aside-invocation grammar of `capture-rfc` (per the "Governance skill invocation patterns — foreground + background with deferred-question resumption" architecture rule) and because Claude Code skill arguments don't carry a proper CLI flag parser. The optional `--rfc` / `--story-map` flags exist BECAUSE they are optional — fully positional would require sentinel values for absent traces. The hard-block intent (the "Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology" architecture rule § Confirmation criterion implied by I6 + I9 — capture fails without both mandatory traces) is preserved verbatim — only the surface syntax differs.
44
44
 
45
- ## Rule 6 audit (per ADR-032 + ADR-013 + ADR-060)
45
+ ## Rule 6 audit (per the "Governance skill invocation patterns — foreground + background with deferred-question resumption" architecture rule + the "Structured User Interaction for Governance-Skill Decisions" architecture rule + the "Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology" architecture rule)
46
46
 
47
- This skill has **two direction-setting AskUserQuestion fires** (problem-trace AND JTBD-trace, when arguments are non-empty but malformed) and **one optional taste AskUserQuestion** (title/scope summary, silent-default if unavailable). Every other potentially-interactive decision is framework-mediated per ADR-044:
47
+ This skill has **two direction-setting AskUserQuestion fires** (problem-trace AND JTBD-trace, when arguments are non-empty but malformed) and **one optional taste AskUserQuestion** (title/scope summary, silent-default if unavailable). Every other potentially-interactive decision is framework-mediated per the "— Decision-Delegation Contract: when agents act on the framework vs ask the user" architecture rule:
48
48
 
49
49
  | Decision | Resolution | Authority class |
50
50
  |----------|-----------|-----------------|
@@ -54,20 +54,20 @@ This skill has **two direction-setting AskUserQuestion fires** (problem-trace AN
54
54
  | JTBD trace validation | Mechanical: each `JTBD-<NNN>` must resolve to a file under `docs/jtbd/<persona>/JTBD-<NNN>-*.md` (any lifecycle status) | silent-mechanical |
55
55
  | Optional `--rfc` trace validation | Mechanical: each provided `RFC-<NNN>` must resolve either to a legacy file under `docs/rfcs/` or to a release row returned by `wr-itil-story-map-query find-rfc`; advisory-warn on `proposed` / `verifying` legacy files; missing from both surfaces = hard-block on the provided arg | silent-mechanical |
56
56
  | Optional `--story-map` trace validation | Same mechanical pattern against `docs/story-maps/*/STORY-MAP-*.html` (HTML data-attribute existence check); advisory-warn on `draft` / `in-progress` story-maps | silent-mechanical |
57
- | STORY ID allocation | Mechanical: `max(local, origin) + 1`, three-digit padded; enumerates `docs/stories/*/STORY-*.md` + `git ls-tree origin/main docs/stories/`. ADR-019 collision-guard inline per Slice 3 design review architect approval (finding 3 option a — inline-only path) | silent-mechanical |
57
+ | STORY ID allocation | Mechanical: `max(local, origin) + 1`, three-digit padded; enumerates `docs/stories/*/STORY-*.md` + `git ls-tree origin/main docs/stories/`. the "AFK orchestrator preflight: get the repo into a clean state before starting" architecture rule collision-guard inline per Slice 3 design review architect approval (finding 3 option a — inline-only path) | silent-mechanical |
58
58
  | Title kebab-slug | Mechanical: first 8-10 non-stopword tokens of description | silent-mechanical |
59
59
  | Title prose / scope summary refinement | Optional `AskUserQuestion`; silent-default to derived form when unavailable | taste |
60
- | File write / frontmatter | Mechanical: shape per `docs/stories/README.md` § Frontmatter shape + ADR-060 lines 220-228 | silent-mechanical |
60
+ | File write / frontmatter | Mechanical: shape per `docs/stories/README.md` § Frontmatter shape + the "Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology" architecture rule lines 220-228 | silent-mechanical |
61
61
  | Single commit | Mechanical: `feat(itil): capture STORY-<NNN> <title>` + `Refs: STORY-<NNN>` trailer | silent-mechanical |
62
62
  | Empty arguments | Halt-with-stderr-directive: print "capture-story requires `<problem-trace> <jtbd-trace> <description>` — invoke /wr-itil:manage-story instead for the full intake flow" and exit. AFK orchestrators MUST NOT invoke capture-story with empty arguments. | n/a |
63
63
 
64
- Per ADR-013 Rule 6 fail-safe + ADR-044 + P132 + inverse-P078: every silent-mechanical branch above resolves without user input, so AFK and interactive contexts behave identically modulo the optional taste prompt.
64
+ Per the "Structured User Interaction for Governance-Skill Decisions" architecture rule Rule 6 fail-safe + the "— Decision-Delegation Contract: when agents act on the framework vs ask the user" architecture rule + the "Agents over-ask in interactive sessions — conflating mechanical-stages with user-interactive-stages of multi-stage skill contracts (inverse-)" problem + inverse-the "Problem 078: Assistant does not offer to capture a problem ticket when the user delivers strong-signal correction" problem: every silent-mechanical branch above resolves without user input, so AFK and interactive contexts behave identically modulo the optional taste prompt.
65
65
 
66
66
  ## Steps
67
67
 
68
68
  ### 0. Preflight (Phase 2 cross-directory)
69
69
 
70
- This skill's preflight uses `wr-itil-reconcile-readme docs/problems` (the existing problems-README reconciliation contract per P118). Sibling reconcile-stories + reconcile-story-maps scripts land in Slice 5 + Slice 9 of P170 Phase 2 — once those ship, swap this preflight to call all three reconciliations (cross-tier integrity holds at all three surfaces).
70
+ This skill's preflight uses `wr-itil-reconcile-readme docs/problems` (the existing problems-README reconciliation contract per the "`docs/problems/README.md` drifts from filesystem truth across sessions despite (refresh-on-create) and (refresh-on-transition) both Closed" problem). Sibling reconcile-stories + reconcile-story-maps scripts land in Slice 5 + Slice 9 of the "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 — once those ship, swap this preflight to call all three reconciliations (cross-tier integrity holds at all three surfaces).
71
71
 
72
72
  ```bash
73
73
  wr-itil-reconcile-readme docs/problems > /tmp/wr-itil-drift-$$.txt
@@ -112,13 +112,13 @@ Derive a kebab-case title slug from the first 8-10 non-stopword tokens of `$desc
112
112
  For each `P<NNN>` in the trace list:
113
113
 
114
114
  ```bash
115
- # Dual-tolerant ticket discovery (RFC-002 migration window):
115
+ # Dual-tolerant ticket discovery (the ": docs/problems/ flat layout migration — per-state subdirs + adopter auto-migration" release design migration window):
116
116
  # BOTH flat `docs/problems/<NNN>-<title>.<state>.md` AND per-state
117
117
  # subdir `docs/problems/<state>/<NNN>-<title>.md` layouts.
118
118
  trace_files=$(ls docs/problems/<NNN>-*.md docs/problems/*/<NNN>-*.md 2>/dev/null)
119
119
  ```
120
120
 
121
- **I6 hard-block (per ADR-060 line 248)**:
121
+ **I6 hard-block (per the "Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology" architecture rule line 248)**:
122
122
 
123
123
  - **Trace token absent OR malformed**: emit deny log entry + halt with stderr directive:
124
124
  ```bash
@@ -146,23 +146,23 @@ jtbd_file=$(ls docs/jtbd/*/JTBD-<NNN>-*.md 2>/dev/null | head -1)
146
146
  [ -z "$jtbd_file" ] && unresolved_jtbds+=("JTBD-<NNN>")
147
147
  ```
148
148
 
149
- **I9 hard-block (per ADR-060 line 251)**:
149
+ **I9 hard-block (per the "Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology" architecture rule line 251)**:
150
150
 
151
151
  - **JTBD trace token absent OR malformed**: emit deny log entry + halt with directive: `/wr-itil:capture-story requires a JTBD trace argument (JTBD-<NNN> or JTBD-<NNN>,JTBD-<NNN>...). Author the driving JTBD via /wr-jtbd:update-guide first, then re-invoke capture-story.`
152
152
  - **Each `JTBD-<NNN>` must resolve to a file in `docs/jtbd/`**. If any does not, emit deny log with `reason: unresolved-jtbd-trace`, halt, exit 1.
153
153
 
154
154
  JTBD lifecycle states (`.proposed.md` / `.accepted.md` / `.archived.md`) all pass silently — a story may anchor on a proposed JTBD per the dogfood pattern (Phase 2 itself is being captured against proposed JTBDs).
155
155
 
156
- ### 2.6. Validate story-map trace (I8 hard-block AT CAPTURE per ADR-095) + optional `--rfc`
156
+ ### 2.6. Validate story-map trace (I8 hard-block AT CAPTURE per the "Story-map membership and story-content completeness are enforced at capture" architecture rule) + optional `--rfc`
157
157
 
158
- **I8 story-map membership is enforced at CAPTURE (ADR-095) — a story is born on a map.** `--story-map` is MANDATORY:
158
+ **I8 story-map membership is enforced at CAPTURE (the "Story-map membership and story-content completeness are enforced at capture" architecture rule) — a story is born on a map.** `--story-map` is MANDATORY:
159
159
 
160
160
  - **`--story-map` absent**: hard-block with **refuse-and-route** (parity with the I6/I9 mandatory-trace gates). Do NOT scaffold `story-maps: []`. Emit the deny log (`reason: missing-story-map-trace`) and halt with:
161
- > `/wr-itil:capture-story` requires a story-map trace (ADR-095 / I8): every story is born on a story map. Create a map first via `/wr-itil:capture-story-map` (or extend one via `/wr-itil:manage-story-map`), then re-invoke capture-story with `--story-map STORY-MAP-<NNN>`.
161
+ > `/wr-itil:capture-story` requires a story-map trace (the "Story-map membership and story-content completeness are enforced at capture" architecture rule / I8): every story is born on a story map. Create a map first via `/wr-itil:capture-story-map` (or extend one via `/wr-itil:manage-story-map`), then re-invoke capture-story with `--story-map STORY-MAP-<NNN>`.
162
162
 
163
- AFK orchestrators author the map first (born `"humanOversight": "unconfirmed"` in its data island per ADR-102, drained later), then capture the story onto it — nothing halts silently; the map is a prerequisite step.
163
+ AFK orchestrators author the map first (born `"humanOversight": "unconfirmed"` in its data island per the "Story maps render from JSON through a canonical template" architecture rule, drained later), then capture the story onto it — nothing halts silently; the map is a prerequisite step.
164
164
  - **`--story-map` present**: for each `STORY-MAP-<NNN>`, existence check `ls docs/story-maps/*/STORY-MAP-<NNN>-*.html 2>/dev/null`. Malformed or unresolved → hard-block (`reason: unresolved-story-map-trace`). Lifecycle advisory-warn on `draft` / `in-progress` maps; pass silently on `accepted` / `completed`.
165
- - **Bootstrap exemption (ADR-060 A4 / ADR-053)**: a capture carrying the inline `<!-- bootstrap-exempt: ... -->` marker bypasses the I8 hard-block for migration stories ONLY. A **non-bootstrap** capture carrying the marker is rejected (the marker is not a general capture-time escape hatch — behavioural test asserts).
165
+ - **Bootstrap exemption (the "Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology" architecture rule A4 / the "`@windyroad/*` plugin / skill / agent / hook maturity taxonomy" architecture rule)**: a capture carrying the inline `<!-- bootstrap-exempt: ... -->` marker bypasses the I8 hard-block for migration stories ONLY. A **non-bootstrap** capture carrying the marker is rejected (the marker is not a general capture-time escape hatch — behavioural test asserts).
166
166
 
167
167
  `--rfc` stays **OPTIONAL** at capture (I7 enforces at the `accepted` transition — a story can legitimately precede its RFC firming up):
168
168
 
@@ -174,7 +174,7 @@ rfc_rows=$(wr-itil-story-map-query find-rfc RFC-<NNN>)
174
174
  shopt -u nullglob
175
175
  ```
176
176
 
177
- - `--rfc` token absent: skip (the optional path). Present-but-malformed OR resolves to neither a legacy RFC file nor a release row: hard-block (`reason: unresolved-rfc-trace`). ADR-103 makes the row the normal RFC surface; a standalone file is retained only for existing RFCs.
177
+ - `--rfc` token absent: skip (the optional path). Present-but-malformed OR resolves to neither a legacy RFC file nor a release row: hard-block (`reason: unresolved-rfc-trace`). the "A release row is the RFC, and the map is the approval surface" architecture rule makes the row the normal RFC surface; a standalone file is retained only for existing RFCs.
178
178
 
179
179
  ### 3. Compute next STORY ID
180
180
 
@@ -190,7 +190,7 @@ Log the renumber decision in the operation report if origin and local diverged.
190
190
 
191
191
  ### 4. Optional taste prompt for title / scope summary
192
192
 
193
- If interactive (AskUserQuestion available) AND the description is short enough that the derived title slug may not capture intent, fire one `AskUserQuestion` with `header: "Story title"` offering: (a) the derived kebab-slug as default, (b) "edit". This is **taste** authority per ADR-044 — silent-default to (a) when AskUserQuestion is unavailable.
193
+ If interactive (AskUserQuestion available) AND the description is short enough that the derived title slug may not capture intent, fire one `AskUserQuestion` with `header: "Story title"` offering: (a) the derived kebab-slug as default, (b) "edit". This is **taste** authority per the "— Decision-Delegation Contract: when agents act on the framework vs ask the user" architecture rule — silent-default to (a) when AskUserQuestion is unavailable.
194
194
 
195
195
  ### 5. Write the story file
196
196
 
@@ -207,11 +207,11 @@ decision-makers: [<git config user.name>]
207
207
  problems: [P<NNN>, P<NNN>, ...]
208
208
  jtbd: [JTBD-<NNN>, JTBD-<NNN>, ...]
209
209
  rfcs: [<RFC-<NNN>, ...> or empty]
210
- story-maps: [<STORY-MAP-<NNN>, ...>] # >=1 REQUIRED at capture (I8 / ADR-095)
211
- estimated-effort: <S|M|L|XL — derived at capture per ADR-067 (real best-effort value, no deferral marker)>
210
+ story-maps: [<STORY-MAP-<NNN>, ...>] # >=1 REQUIRED at capture (I8 / the "Story-map membership and story-content completeness are enforced at capture" architecture rule)
211
+ estimated-effort: <S|M|L|XL — derived at capture per the ": Cost-based WSJF effort — capture time + cost actuals, tally per ticket, retro-driven RMS calibration (tally-first)" architecture rule (real best-effort value, no deferral marker)>
212
212
  ---
213
213
 
214
- <!-- NO `human-oversight:` field, and none of its siblings (ADR-103). A story
214
+ <!-- NO `human-oversight:` field, and none of its siblings (the "A release row is the RFC, and the map is the approval surface" architecture rule). A story
215
215
  carries no oversight marker: approval is its story map's, derived from the
216
216
  `story-maps:` field above. Writing one here creates a second approval
217
217
  surface that `story_is_approved` deliberately ignores, so it would be
@@ -224,7 +224,7 @@ estimated-effort: <S|M|L|XL — derived at capture per ADR-067 (real best-effort
224
224
  own hash — so a story the maintainer had just ratified read as unratified
225
225
  and the no-implement gate denied its own implementing commit. Maintainer
226
226
  direction 2026-07-29 removed the mirror rather than adding a fourth
227
- normaliser rule for it (P474 / ADR-090 amendment). -->
227
+ normaliser rule for it (the "Oversight hash treats the `**Status**:` body mirror as substance, so an accept transition self-invalidates its own ratification" problem / the "Story maps and stories carry a drift-invalidated human-oversight marker" architecture rule amendment). -->
228
228
 
229
229
  # STORY-<NNN>: <Title>
230
230
 
@@ -232,16 +232,16 @@ estimated-effort: <S|M|L|XL — derived at capture per ADR-067 (real best-effort
232
232
  **Problems**: <P<NNN> [, P<NNN>, ...]>
233
233
  **JTBD**: <JTBD-<NNN> [, ...]>
234
234
  **RFCs**: <RFC-<NNN> [, ...]> or (none — populate at accepted transition per I7)
235
- **Story Maps**: <STORY-MAP-<NNN> [, ...]> (>=1 required at capture — I8 / ADR-095)
236
- **Estimated effort**: <S|M|L|XL> — derived at capture as a real best-effort value (P375 / ADR-032 amendment 2026-06-24; ADR-067 silent-derivation). NO `deferred` default and no "not estimated" marker — those are deferrals (user correction 2026-06-24). Confirmed/refined at the accepted transition per I10 INVEST Estimable.
235
+ **Story Maps**: <STORY-MAP-<NNN> [, ...]> (>=1 required at capture — I8 / the "Story-map membership and story-content completeness are enforced at capture" architecture rule)
236
+ **Estimated effort**: <S|M|L|XL> — derived at capture as a real best-effort value (the "Repo conflates a "named re-entry point" with a self-firing cadence — deferrals not transitively reachable from an automatic trigger rot" problem / the "Governance skill invocation patterns — foreground + background with deferred-question resumption" architecture rule amendment 2026-06-24; the ": Cost-based WSJF effort — capture time + cost actuals, tally per ticket, retro-driven RMS calibration (tally-first)" architecture rule silent-derivation). NO `deferred` default and no "not estimated" marker — those are deferrals (user correction 2026-06-24). Confirmed/refined at the accepted transition per I10 INVEST Estimable.
237
237
 
238
238
  ## User value (required, INVEST Valuable)
239
239
 
240
- <REQUIRED at capture (I10 Valuable subset / ADR-095): a real one-paragraph value-first user-facing statement — NOT a placeholder. "In order to <value>, as a <persona>, I want <capability>.">
240
+ <REQUIRED at capture (I10 Valuable subset / the "Story-map membership and story-content completeness are enforced at capture" architecture rule): a real one-paragraph value-first user-facing statement — NOT a placeholder. "In order to <value>, as a <persona>, I want <capability>.">
241
241
 
242
242
  ## Acceptance criteria (accepted-gate, INVEST Testable)
243
243
 
244
- - [ ] <REQUIRED at capture (I10 Testable subset / ADR-095): >=1 real observable behavioural acceptance criterion — NOT a placeholder>
244
+ - [ ] <REQUIRED at capture (I10 Testable subset / the "Story-map membership and story-content completeness are enforced at capture" architecture rule): >=1 real observable behavioural acceptance criterion — NOT a placeholder>
245
245
 
246
246
  ## Driving problem trace (required — I6 invariant)
247
247
 
@@ -265,7 +265,7 @@ estimated-effort: <S|M|L|XL — derived at capture per ADR-067 (real best-effort
265
265
  (captured via /wr-itil:capture-story; expand at next /wr-itil:manage-story invocation)
266
266
  ```
267
267
 
268
- **Born with no oversight field (ADR-103).** A new story carries no `human-oversight:` and no `oversight-hash:`. Its approval is derived from the maps in its `story-maps:` field: approved when every one of them is ratified, never approved when it names none. Until then `wr-itil-detect-unratified-stories-maps` surfaces it and an RFC may not reference it (`wr-itil-check-rfc-stories-ratified`). Do NOT write an oversight field onto a story — `wr-itil-mark-story-oversight-confirmed` refuses a story path, and `story_is_approved` ignores any field left behind, so a hand-written one would be wrong AND inert. **Adding a story to its map does NOT re-open the map's ratification** — rows and cards sit outside the fingerprint basis, which is what removed the deadlock ADR-101 existed to work around.
268
+ **Born with no oversight field (the "A release row is the RFC, and the map is the approval surface" architecture rule).** A new story carries no `human-oversight:` and no `oversight-hash:`. Its approval is derived from the maps in its `story-maps:` field: approved when every one of them is ratified, never approved when it names none. Until then `wr-itil-detect-unratified-stories-maps` surfaces it and an RFC may not reference it (`wr-itil-check-rfc-stories-ratified`). Do NOT write an oversight field onto a story — `wr-itil-mark-story-oversight-confirmed` refuses a story path, and `story_is_approved` ignores any field left behind, so a hand-written one would be wrong AND inert. **Adding a story to its map does NOT re-open the map's ratification** — rows and cards sit outside the fingerprint basis, which is what removed the deadlock the "An AFK loop may accept and implement a story that only decomposes already-ratified substance" architecture rule existed to work around.
269
269
 
270
270
  The deferred-section pattern matches `capture-rfc`'s placeholder approach — the captured story is intentionally minimal; full INVEST shape lands at the manage-story accepted-transition step.
271
271
 
@@ -273,14 +273,14 @@ The deferred-section pattern matches `capture-rfc`'s placeholder approach — th
273
273
 
274
274
  **Stage list**: the new story file PLUS each driving problem ticket file (refresh `## Stories` reverse-trace section) PLUS each driving JTBD file (refresh `## Stories` reverse-trace section) PLUS each legacy driving RFC file IF `--rfc` resolved to one. A row-backed RFC has no separate reverse-trace document; its card on the story map is the reverse trace. **Do NOT** stage `docs/stories/README.md` (deferred). **Do NOT** stage any story-map HTML files — story-maps are spatially-authored HTML; new stories must be placed on the relevant map manually via `/wr-itil:manage-story-map`. Capture-story emits an advisory stderr line naming the unplaced-on-map state.
275
275
 
276
- The reverse-trace refresh on driving artefacts IS in-commit per ADR-014 single-commit grain — the cross-tier `## Stories` table on a problem / JTBD / RFC must stay current the moment a new story traces it. The same justification as capture-rfc's inline `## RFCs` refresh applies.
276
+ The reverse-trace refresh on driving artefacts IS in-commit per the "Governance Skills Commit Their Own Completed Work" architecture rule single-commit grain — the cross-tier `## Stories` table on a problem / JTBD / RFC must stay current the moment a new story traces it. The same justification as capture-rfc's inline `## RFCs` refresh applies.
277
277
 
278
278
  For each problem ID in `$problem_trace`:
279
279
 
280
280
  ```bash
281
281
  for pid_token in $(echo "$problem_trace" | tr ',' ' '); do
282
282
  pid_num="${pid_token#P}"
283
- # Dual-tolerant ticket discovery (RFC-002 migration window).
283
+ # Dual-tolerant ticket discovery (the ": docs/problems/ flat layout migration — per-state subdirs + adopter auto-migration" release design migration window).
284
284
  problem_file=$(ls docs/problems/${pid_num}-*.md docs/problems/*/${pid_num}-*.md 2>/dev/null | head -1)
285
285
  [ -z "$problem_file" ] && continue
286
286
  wr-itil-update-problem-references-section "$problem_file" "Stories"
@@ -320,7 +320,7 @@ Stage the new story file:
320
320
  git add docs/stories/draft/STORY-<NNN>-<slug>.md
321
321
  ```
322
322
 
323
- Satisfy the commit gate per ADR-014:
323
+ Satisfy the commit gate per the "Governance Skills Commit Their Own Completed Work" architecture rule:
324
324
 
325
325
  - **Primary**: delegate to subagent type `wr-risk-scorer:pipeline` via the Agent tool.
326
326
  - **Fallback**: invoke `/wr-risk-scorer:assess-release` via the Skill tool when the subagent type is unavailable.
@@ -333,7 +333,7 @@ feat(itil): capture STORY-<NNN> <title>
333
333
  Refs: STORY-<NNN>
334
334
  ```
335
335
 
336
- The `capture` verb mirrors `capture-rfc`'s audit signal (lightweight aside path vs. heavyweight `manage-story` intake). The single `Refs: STORY-<NNN>` trailer is the universal story-trailer vocabulary per ADR-060 line 307 + amendment 2026-05-10 nitpick N2 — capture commits and implementation commits both use `Refs:`; the manage-story skill's `draft → in-progress` auto-transition trigger discriminates by "is this the capture commit (subject starts with `capture`) or a subsequent commit" rather than by trailer verb.
336
+ The `capture` verb mirrors `capture-rfc`'s audit signal (lightweight aside path vs. heavyweight `manage-story` intake). The single `Refs: STORY-<NNN>` trailer is the universal story-trailer vocabulary per the "Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology" architecture rule line 307 + amendment 2026-05-10 nitpick N2 — capture commits and implementation commits both use `Refs:`; the manage-story skill's `draft → in-progress` auto-transition trigger discriminates by "is this the capture commit (subject starts with `capture`) or a subsequent commit" rather than by trailer verb.
337
337
 
338
338
  ### 7. Report
339
339
 
@@ -355,11 +355,11 @@ The trailing pointer is **not optional** — it is the user-visible signal that
355
355
  | Problem-trace I6 enforcement | Re-validated at every lifecycle transition | Hard-block at capture-time; deny logged to `logs/story-capture-denials.jsonl` |
356
356
  | JTBD-trace I9 enforcement | Re-validated at every lifecycle transition | Hard-block at capture-time |
357
357
  | RFC-trace I7 enforcement | Hard-block at `accepted` transition (allows draft stories to exist before RFC reference firms up) | Advisory-warn at capture-time if `--rfc` provided and resolves to draft/proposed lifecycle |
358
- | Story-map-trace I8 enforcement | Hard-block AT CAPTURE — refuse-and-route to `/wr-itil:capture-story-map` if absent (ADR-095) | direction-setting (caller must supply or author a map first) |
358
+ | Story-map-trace I8 enforcement | Hard-block AT CAPTURE — refuse-and-route to `/wr-itil:capture-story-map` if absent (the "Story-map membership and story-content completeness are enforced at capture" architecture rule) | direction-setting (caller must supply or author a map first) |
359
359
  | INVEST shape (I10) | Behavioural checks at `accepted` transition | Out of scope: capture produces a skeleton with deferred-placeholder sections |
360
360
  | Skeleton-fill | Full-intake; AskUserQuestion for User value + Acceptance criteria + Estimated effort | Deferred-placeholder pattern; one optional taste prompt only |
361
361
  | Status transitions | Step 7 owns draft → accepted → in-progress → done | Out of scope (creation only) |
362
- | `## Stories` README refresh | P094 / P062 inline (regenerate + stage in same commit) | Deferred to `/wr-itil:manage-story review` or `wr-itil-reconcile-stories` (Slice 9) |
362
+ | `## Stories` README refresh | the "Problem 094: `/wr-itil:manage-problem` does not refresh `docs/problems/README.md` on ticket creation" problem / the "Problem 062: `manage-problem` does not refresh `docs/problems/README.md` on single-ticket transitions; fast-path cache goes stale silently" problem inline (regenerate + stage in same commit) | Deferred to `/wr-itil:manage-story review` or `wr-itil-reconcile-stories` (Slice 9) |
363
363
  | Commit grain | One commit per intake / per transition | One commit per capture |
364
364
  | Use case | Full lifecycle management | Aside-invocation; capture-and-continue |
365
365
 
@@ -367,30 +367,30 @@ The two skills share the `/tmp/wr-itil-story-capture-grep-${SESSION_ID}` create-
367
367
 
368
368
  ## Related
369
369
 
370
- - **ADR-060** — Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology + Phase 2 amendment 2026-05-12 (story tier).
371
- - **ADR-060 lines 220-228** — Story frontmatter shape spec.
372
- - **ADR-060 lines 248-253** — I6-I11 story-tier invariants.
373
- - **ADR-060 line 291** — capture-story description (this skill's source-of-truth contract).
374
- - **ADR-060 line 307 + amendment 2026-05-10 nitpick N2** — single-trailer vocabulary (`Refs: STORY-<NNN>`).
375
- - **P170** — driver problem ticket.
376
- - **JTBD-008** — Decompose a Fix Into Coordinated Changes. Primary persona-anchor.
377
- - **JTBD-001** (extended scope) — change-set-level governance composition.
378
- - **JTBD-101** (atomic-fix-adopter friction guard) — capture-story remains opt-in aside-invocation; atomic-RFC fallback per ADR-060 line 262.
379
- - **`docs/stories/README.md`** — story tier lifecycle index + frontmatter/body shape spec (P170 Phase 2 Slice 1 — committed `8562bbc`).
380
- - **ADR-010** — amended skill-granularity: capture-story + manage-story are two skills, not one.
381
- - **ADR-014** — single-commit grain per capture. Commit-message convention.
382
- - **ADR-022** — problem lifecycle conventions; story lifecycle mirrors (draft / accepted / in-progress / done / archived).
383
- - **ADR-032** — governance-skill aside-invocation pattern. Lightweight + heavyweight split.
384
- - **ADR-038** — progressive disclosure. SKILL.md (this file) + future REFERENCE.md split deferred per ADR-054.
385
- - **ADR-044** — decision delegation contract. Authority classes named in the Rule 6 audit table.
386
- - **ADR-049** — plugin-bundled scripts via `bin/` on `$PATH`. `wr-itil-reconcile-stories` shim follows this grammar (Slice 9).
387
- - **ADR-051** — load-bearing-from-the-start. I6 + I9 hard-block ship behaviourally on day one.
388
- - **ADR-052** — behavioural-tests default. Bats coverage at `packages/itil/skills/capture-story/test/capture-story-behavioural.bats` (this slice).
389
- - **ADR-060 Phase 2 Slice 2a/2b reverse-trace helpers** — `update-problem-references-section.sh`, `update-jtbd-references-section.sh`, `update-rfc-references-section.sh` all support `"Stories"` section-name token (verified lookup-table entries).
370
+ - **the "Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology" architecture rule** — Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology + Phase 2 amendment 2026-05-12 (story tier).
371
+ - **the "Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology" architecture rule lines 220-228** — Story frontmatter shape spec.
372
+ - **the "Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology" architecture rule lines 248-253** — I6-I11 story-tier invariants.
373
+ - **the "Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology" architecture rule line 291** — capture-story description (this skill's source-of-truth contract).
374
+ - **the "Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology" architecture rule line 307 + amendment 2026-05-10 nitpick N2** — single-trailer vocabulary (`Refs: STORY-<NNN>`).
375
+ - **the "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** — driver problem ticket.
376
+ - **the ": Decompose a Fix Into Coordinated Changes" user outcome** — Decompose a Fix Into Coordinated Changes. Primary persona-anchor.
377
+ - **the ": Enforce Governance Without Slowing Down" user outcome** (extended scope) — change-set-level governance composition.
378
+ - **the "Extend the Suite with New Plugins" user outcome** (atomic-fix-adopter friction guard) — capture-story remains opt-in aside-invocation; atomic-RFC fallback per the "Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology" architecture rule line 262.
379
+ - **`docs/stories/README.md`** — story tier lifecycle index + frontmatter/body shape spec (the "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 1 — committed `8562bbc`).
380
+ - **the "Rename `wr-problem` Plugin to `wr-itil`" architecture rule** — amended skill-granularity: capture-story + manage-story are two skills, not one.
381
+ - **the "Governance Skills Commit Their Own Completed Work" architecture rule** — single-commit grain per capture. Commit-message convention.
382
+ - **the "Problem lifecycle — add a Verification Pending status between Known Error and Closed" architecture rule** — problem lifecycle conventions; story lifecycle mirrors (draft / accepted / in-progress / done / archived).
383
+ - **the "Governance skill invocation patterns — foreground + background with deferred-question resumption" architecture rule** — governance-skill aside-invocation pattern. Lightweight + heavyweight split.
384
+ - **the "Progressive disclosure + once-per-session budget for UserPromptSubmit governance prose" architecture rule** — progressive disclosure. SKILL.md (this file) + future REFERENCE.md split deferred per the "SKILL.md runtime budget policy" architecture rule.
385
+ - **the "— Decision-Delegation Contract: when agents act on the framework vs ask the user" architecture rule** — decision delegation contract. Authority classes named in the Rule 6 audit table.
386
+ - **the "Plugin-bundled scripts invoked from SKILL.md resolve via `bin/` on `$PATH`" architecture rule** — plugin-bundled scripts via `bin/` on `$PATH`. `wr-itil-reconcile-stories` shim follows this grammar (Slice 9).
387
+ - **the "`@windyroad/*` plugin READMEs anchor on JTBD job IDs with load-bearing commit-hook + prose-woven framing" architecture rule** — load-bearing-from-the-start. I6 + I9 hard-block ship behaviourally on day one.
388
+ - **the "Behavioural-tests-default for skill testing" architecture rule** — behavioural-tests default. Bats coverage at `packages/itil/skills/capture-story/test/capture-story-behavioural.bats` (this slice).
389
+ - **the "Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology" architecture rule Phase 2 Slice 2a/2b reverse-trace helpers** — `update-problem-references-section.sh`, `update-jtbd-references-section.sh`, `update-rfc-references-section.sh` all support `"Stories"` section-name token (verified lookup-table entries).
390
390
  - **Capture-rfc precedent** — `packages/itil/skills/capture-rfc/SKILL.md` — sibling skill at the RFC tier; structurally near-identical surface.
391
- - **P078** capture-on-correction — capture-story may be the correct response to a strong-signal user correction that names a single INVEST-shaped sub-workstream within an existing RFC.
392
- - **P132 + inverse-P078** — mechanical-stage carve-outs prevent over-asking; named in the Rule 6 audit table.
391
+ - **the "Problem 078: Assistant does not offer to capture a problem ticket when the user delivers strong-signal correction" problem** capture-on-correction — capture-story may be the correct response to a strong-signal user correction that names a single INVEST-shaped sub-workstream within an existing RFC.
392
+ - **the "Agents over-ask in interactive sessions — conflating mechanical-stages with user-interactive-stages of multi-stage skill contracts (inverse-)" problem + inverse-the "Problem 078: Assistant does not offer to capture a problem ticket when the user delivers strong-signal correction" problem** — mechanical-stage carve-outs prevent over-asking; named in the Rule 6 audit table.
393
393
 
394
394
  ## Phase-out-of-order note
395
395
 
396
- This skill ships BEFORE `/wr-itil:capture-story-map` (Slice 3 of P170 Phase 2) due to the voice-tone-hook-on-HTML blocker documented at P170 line 297. Building capture-story first was structurally permitted at the time (story-map traces were then optional at capture). **Superseded by ADR-095** — I8 now hard-blocks at capture, and `/wr-itil:capture-story-map` has since shipped, so a map must exist before a story is captured. When Slices 3-6 eventually ship the story-map skills, `manage-story <NNN> accepted` will validate the I8 invariant against the then-existing story-map corpus. The deviation from ADR-060's recommended commit-grain order (line 449-454 — sub-slice 3 story-map skills then sub-slice 4 story skills) is auditable here and in this commit's Slice 7 commit message.
396
+ This skill ships BEFORE `/wr-itil:capture-story-map` (Slice 3 of the "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) due to the voice-tone-hook-on-HTML blocker documented at the "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 line 297. Building capture-story first was structurally permitted at the time (story-map traces were then optional at capture). **Superseded by the "Story-map membership and story-content completeness are enforced at capture" architecture rule** — I8 now hard-blocks at capture, and `/wr-itil:capture-story-map` has since shipped, so a map must exist before a story is captured. When Slices 3-6 eventually ship the story-map skills, `manage-story <NNN> accepted` will validate the I8 invariant against the then-existing story-map corpus. The deviation from the "Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology" architecture rule's recommended commit-grain order (line 449-454 — sub-slice 3 story-map skills then sub-slice 4 story skills) is auditable here and in this commit's Slice 7 commit message.
@@ -0,0 +1,3 @@
1
+ interface:
2
+ display_name: "WR ITIL: Capture Story"
3
+ short_description: "Capture a traced delivery story on an existing map."
@@ -1,20 +1,20 @@
1
1
  ---
2
2
  name: wr-itil:capture-story-map
3
- description: Lightweight story-map-capture skill for aside-invocation during foreground work — mandatory leading problem-trace AND JTBD-trace per ADR-060 I3 + I4 invariants, skeleton HTML file at `docs/story-maps/draft/STORY-MAP-NNN-<slug>.html` per ADR-060 § Phase 2 encoding amendment 2026-05-12, single commit per capture, no inline README refresh. Defers full backbone/ribs/slices authoring + lifecycle transitions to /wr-itil:manage-story-map. Use when the user (or agent) wants to capture a new story-map quickly with clear problem + JTBD anchoring.
3
+ description: Lightweight story-map-capture skill for aside-invocation during foreground work — mandatory leading problem-trace AND JTBD-trace per the "Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology" architecture rule I3 + I4 invariants, skeleton HTML file at `docs/story-maps/draft/STORY-MAP-NNN-<slug>.html` per the "Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology" architecture rule § Phase 2 encoding amendment 2026-05-12, single commit per capture, no inline README refresh. Defers full backbone/ribs/slices authoring + lifecycle transitions to /wr-itil:manage-story-map. Use when the user (or agent) wants to capture a new story-map quickly with clear problem + JTBD anchoring.
4
4
  allowed-tools: Read, Write, Edit, Bash, Grep, Glob
5
5
  ---
6
6
 
7
7
  # Capture Story Map Skill
8
8
 
9
- Capture a story-map (HTML artefact representing Patton's backbone × ribs × slices layout) quickly during foreground work. Lightweight aside-invocation surface that complements the heavyweight `/wr-itil:manage-story-map` flow. Mirrors `/wr-itil:capture-story` shape per ADR-032 lightweight + heavyweight skill split, applied at the story-map tier with HTML encoding.
9
+ Capture a story-map (HTML artefact representing Patton's backbone × ribs × slices layout) quickly during foreground work. Lightweight aside-invocation surface that complements the heavyweight `/wr-itil:manage-story-map` flow. Mirrors `/wr-itil:capture-story` shape per the "Governance skill invocation patterns — foreground + background with deferred-question resumption" architecture rule lightweight + heavyweight skill split, applied at the story-map tier with HTML encoding.
10
10
 
11
- **Related JTBDs**: JTBD-008 (primary — Decompose a Fix Into Coordinated Changes; story-maps represent the journey-context decomposition), JTBD-001 (extended scope), JTBD-302 (README-currency rule for `docs/story-maps/README.md`).
11
+ **Related JTBDs**: the ": Decompose a Fix Into Coordinated Changes" user outcome (primary — Decompose a Fix Into Coordinated Changes; story-maps represent the journey-context decomposition), the ": Enforce Governance Without Slowing Down" user outcome (extended scope), the "Trust That the README Describes the Plugin I Just Installed" user outcome (README-currency rule for `docs/story-maps/README.md`).
12
12
 
13
13
  ## When to invoke
14
14
 
15
15
  - **Decomposing a problem or RFC into a journey-shaped layout** — agent / user observes that the fix decomposes into multiple coordinated changes that map onto a user-journey backbone × ribs × slices spatial layout (per Patton's User Story Mapping). Capture the story-map BEFORE individual stories so the spatial-placement context informs story decomposition.
16
- - **Retrospective story-map for shipped work** — lifting an existing multi-commit decomposition into a story-map artefact (e.g. STORY-MAP-001 retro on P170 Phase 1 + Phase 2 framework code — Slice 14 of P170 Phase 2).
17
- - **Cross-RFC journey lens** — a single story-map can reference stories from multiple RFCs (the map is a journey-context lens on the story corpus per ADR-060 line 317).
16
+ - **Retrospective story-map for shipped work** — lifting an existing multi-commit decomposition into a story-map artefact (e.g. the "RFC framework bootstrap journey map" journey map retro on the "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 1 + Phase 2 framework code — Slice 14 of the "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).
17
+ - **Cross-RFC journey lens** — a single story-map can reference stories from multiple RFCs (the map is a journey-context lens on the story corpus per the "Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology" architecture rule line 317).
18
18
 
19
19
  **Use `/wr-itil:manage-story-map` instead** when:
20
20
  - The work is moving an existing story-map through its lifecycle (draft → accepted → in-progress → completed → archived).
@@ -28,13 +28,13 @@ Capture a story-map (HTML artefact representing Patton's backbone × ribs × sli
28
28
  - `<jtbd-trace>` is `JTBD-<NNN>` or `JTBD-<NNN>,JTBD-<NNN>,...`
29
29
 
30
30
  ```
31
- /wr-itil:capture-story-map P170 JTBD-008 RFC framework Phase 1 + Phase 2 bootstrap
32
- /wr-itil:capture-story-map P170 JTBD-008,JTBD-001 Story map for the P170 RFC framework work
31
+ /wr-itil:capture-story-map the "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 the ": Decompose a Fix Into Coordinated Changes" user outcome RFC framework Phase 1 + Phase 2 bootstrap
32
+ /wr-itil:capture-story-map the "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 the ": Decompose a Fix Into Coordinated Changes" user outcome,the ": Enforce Governance Without Slowing Down" user outcome Story map for the "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 RFC framework work
33
33
  ```
34
34
 
35
- Positional grammar mirrors `/wr-itil:capture-story` shape (footnote per ADR-060 line 285 phrasing — `--problem` / `--jtbd` flag-form was the ADR-exemplar but positional is the lightweight-aside grammar that Claude Code skills support natively).
35
+ Positional grammar mirrors `/wr-itil:capture-story` shape (footnote per the "Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology" architecture rule line 285 phrasing — `--problem` / `--jtbd` flag-form was the ADR-exemplar but positional is the lightweight-aside grammar that Claude Code skills support natively).
36
36
 
37
- ## Rule 6 audit (per ADR-032 + ADR-013 + ADR-060)
37
+ ## Rule 6 audit (per the "Governance skill invocation patterns — foreground + background with deferred-question resumption" architecture rule + the "Structured User Interaction for Governance-Skill Decisions" architecture rule + the "Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology" architecture rule)
38
38
 
39
39
  | Decision | Resolution | Authority class |
40
40
  |----------|-----------|-----------------|
@@ -42,10 +42,10 @@ Positional grammar mirrors `/wr-itil:capture-story` shape (footnote per ADR-060
42
42
  | Problem-trace validation | Mechanical: each `P<NNN>` exists in `docs/problems/`; dual-tolerant lookup | silent-mechanical |
43
43
  | JTBD-trace presence | I4 hard-block — refuse on missing trace; emit deny log + halt | direction-setting |
44
44
  | JTBD-trace validation | Mechanical: each `JTBD-<NNN>` resolves to a file in `docs/jtbd/` | silent-mechanical |
45
- | STORY-MAP ID allocation | Mechanical: `max(local, origin, history) + 1` enumerating `docs/story-maps/*/STORY-MAP-*.html` (ADR-019 inline collision-guard) | silent-mechanical |
45
+ | STORY-MAP ID allocation | Mechanical: `max(local, origin, history) + 1` enumerating `docs/story-maps/*/STORY-MAP-*.html` (the "AFK orchestrator preflight: get the repo into a clean state before starting" architecture rule inline collision-guard) | silent-mechanical |
46
46
  | Title kebab-slug | Mechanical: first 8-10 non-stopword tokens of description | silent-mechanical |
47
47
  | Title prose refinement | Optional taste AskUserQuestion; silent-default to derived form | taste |
48
- | HTML file write | Mechanical: schema per ADR-060 § Phase 2 encoding amendment 2026-05-12 lines 381-435 | silent-mechanical |
48
+ | HTML file write | Mechanical: schema per the "Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology" architecture rule § Phase 2 encoding amendment 2026-05-12 lines 381-435 | silent-mechanical |
49
49
  | Reverse-trace `## Story Maps` refresh | Mechanical: inline on driving problem + JTBD files via Slice 2a/2b helpers | silent-mechanical |
50
50
  | README refresh | Mechanical: deferred to `/wr-itil:manage-story-map review` or `wr-itil-reconcile-story-maps` | silent-mechanical |
51
51
  | Empty arguments | Halt-with-stderr-directive | n/a |
@@ -77,11 +77,11 @@ Derive kebab-case title slug from first 8-10 non-stopword tokens of `$descriptio
77
77
  For each `P<NNN>`:
78
78
 
79
79
  ```bash
80
- # Dual-tolerant ticket discovery (RFC-002 migration window).
80
+ # Dual-tolerant ticket discovery (the ": docs/problems/ flat layout migration — per-state subdirs + adopter auto-migration" release design migration window).
81
81
  trace_files=$(ls docs/problems/<NNN>-*.md docs/problems/*/<NNN>-*.md 2>/dev/null)
82
82
  ```
83
83
 
84
- **I3 hard-block** (ADR-060, the story-map schema's `problems:` field): trace absent / malformed / unresolved → emit deny log entry to `logs/story-map-capture-denials.jsonl`, halt with stderr directive naming `/wr-itil:capture-problem` as the open-the-driving-problem-first surface.
84
+ **I3 hard-block** (the "Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology" architecture rule, the story-map schema's `problems:` field): trace absent / malformed / unresolved → emit deny log entry to `logs/story-map-capture-denials.jsonl`, halt with stderr directive naming `/wr-itil:capture-problem` as the open-the-driving-problem-first surface.
85
85
 
86
86
  ### 2.5. Validate JTBD trace + I4 hard-block
87
87
 
@@ -91,11 +91,11 @@ For each `JTBD-<NNN>`:
91
91
  jtbd_file=$(ls docs/jtbd/*/JTBD-<NNN>-*.md 2>/dev/null | head -1)
92
92
  ```
93
93
 
94
- **I4 hard-block** (ADR-060, the story-map schema's `jtbd:` field): trace absent / malformed / unresolved → emit deny log + halt. Story-maps without JTBD trace are structurally meaningless per ADR-060 ("a map with no JTBD trace is structurally meaningless"; Patton's central thesis is journey-around-user-value).
94
+ **I4 hard-block** (the "Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology" architecture rule, the story-map schema's `jtbd:` field): trace absent / malformed / unresolved → emit deny log + halt. Story-maps without JTBD trace are structurally meaningless per the "Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology" architecture rule ("a map with no JTBD trace is structurally meaningless"; Patton's central thesis is journey-around-user-value).
95
95
 
96
96
  ### 3. Compute next STORY-MAP ID
97
97
 
98
- Inline `max(local, origin, history) + 1` per ADR-019 collision-guard (architect Slice 3 design review option a — inline-only path, mirrors capture-rfc + capture-story precedent). Git history keeps deleted IDs retired without adding tombstone files:
98
+ Inline `max(local, origin, history) + 1` per the "AFK orchestrator preflight: get the repo into a clean state before starting" architecture rule collision-guard (architect Slice 3 design review option a — inline-only path, mirrors capture-rfc + capture-story precedent). Git history keeps deleted IDs retired without adding tombstone files:
99
99
 
100
100
  ```bash
101
101
  local_max=$(ls docs/story-maps/*/STORY-MAP-*.html 2>/dev/null | sed 's|.*/STORY-MAP-||;s|-.*||' | grep -oE '^[0-9]+' | sort -n | tail -1)
@@ -179,14 +179,14 @@ appear here changes what that test asserts, and that binding is deliberate.
179
179
 
180
180
  The default is one story per row. Two stories share a row when the answer to question 1 is yes, or when question 2 shows a transaction cost high enough to pay for the delay. Neither is assumed.
181
181
 
182
- - **A row IS an RFC (ADR-103).** A row a problem has proposed carries its `rfc`; drawing the row is what allocates the identity. There is no separate "not yet allocated" state and no `badge` field — a row's status is derived from its stories, and its label is its RFC id.
183
- - **Every row carries an identity, and finishing one earns no exemption (ADR-107).** A row with no `rfc` renders as a defect — a red "Untraced" badge — whether or not its stories are done. Delivery cannot excuse a missing identity, because every row is delivered eventually; that reading would let work nobody proposed become legitimate by being finished.
182
+ - **A row IS an RFC (the "A release row is the RFC, and the map is the approval surface" architecture rule).** A row a problem has proposed carries its `rfc`; drawing the row is what allocates the identity. There is no separate "not yet allocated" state and no `badge` field — a row's status is derived from its stories, and its label is its RFC id.
183
+ - **Every row carries an identity, and finishing one earns no exemption (the "A story map's RFC list is derived from its release rows" architecture rule).** A row with no `rfc` renders as a defect — a red "Untraced" badge — whether or not its stories are done. Delivery cannot excuse a missing identity, because every row is delivered eventually; that reading would let work nobody proposed become legitimate by being finished.
184
184
 
185
185
  The only exception is a row holding work that shipped **before rows carried identities**, and such a row says so explicitly with `"preRfc": true`. That set is closed. Do not add the marker to a new row: it is a statement about history, not a way to skip allocating an RFC. It appears in no example above because a row that has an `rfc` does not need it, and the example shows the normal case.
186
- - **A map carries no `traces.rfcs` (ADR-107).** The map's RFC list is the union of its row identities, so authoring it restates the rows and drifts from them the moment one changes.
186
+ - **A map carries no `traces.rfcs` (the "A story map's RFC list is derived from its release rows" architecture rule).** The map's RFC list is the union of its row identities, so authoring it restates the rows and drifts from them the moment one changes.
187
187
  - `storyId` / `rfc` / `jtbd` are optional per task and emit the `data-*` reference layer that reverse-trace and the story-map queries consume. Omit them until stories exist; add them as stories are captured onto the map.
188
- - **Author nothing a story file already says (ADR-104).** A story's lifecycle state, its value statement, and the problems it closes are all read from the story when the map renders — so a transition needs no map edit and does not re-open the map's ratification. There are no `storyStatus`, `value` or row-level `problems` fields, and no `--status` or `--value` flags. A row's problems are the union of its stories'; a map's are the union of its rows'.
189
- - **A map carries no decision trace (ADR-106).** There is no `traces.adrs`. A decision constrains how something is built, and the thing built is the story — so a decision reference belongs on the story (`adrs:` in its frontmatter), not on the lens drawn over it.
188
+ - **Author nothing a story file already says (the "A story map card stores no value a story file already carries" architecture rule).** A story's lifecycle state, its value statement, and the problems it closes are all read from the story when the map renders — so a transition needs no map edit and does not re-open the map's ratification. There are no `storyStatus`, `value` or row-level `problems` fields, and no `--status` or `--value` flags. A row's problems are the union of its stories'; a map's are the union of its rows'.
189
+ - **A map carries no decision trace (the "A story map carries no decision trace" architecture rule).** There is no `traces.adrs`. A decision constrains how something is built, and the thing built is the story — so a decision reference belongs on the story (`adrs:` in its frontmatter), not on the lens drawn over it.
190
190
  - **Write no prose the grid already carries.** There is no `lead` and no `traceProse`. A map is a title, a grid, and the jobs it is drawn for. Where a column or a row needs a note, both carry a `note` field — put it next to the thing it describes, not in a paragraph at the top restating the picture below it. Six kinds of duplication were removed from this format for exactly this reason; the seventh will be whatever gets added back.
191
191
  - **Prefer the edit command over hand-editing the island** for structural changes — it validates against the map's own backbone and bands, names what is available when you get an id wrong, and leaves the file untouched on failure:
192
192
 
@@ -203,9 +203,9 @@ Hand-editing the island still works — the renderer reads whatever is there —
203
203
  - Presentation is not yours to set. There is no CSS in the JSON and no inline `style` anywhere; the template is the only styling source.
204
204
  - Escape a literal `<` in any string as `\\u003c`. A raw `</script>` inside the island terminates the block early — in the renderer and in a browser — and the renderer will refuse the file rather than emit a truncated map.
205
205
 
206
- **Born unconfirmed (ADR-090).** Do NOT author `humanOversight` at all: the renderer treats an absent field as `unconfirmed`, so writing it is writing the default, and the field exists so that `wr-itil-mark-story-oversight-confirmed` can set `confirmed` — which an agent must never hand-write (P348). The `<meta name="human-oversight">` tag is a projection the renderer regenerates from the island; never author it directly (ADR-102). The map is NOT ratified until a human confirms it via `/wr-itil:manage-story-map <NNN> ratify`, which writes `confirmed` + an `oversight-hash` fingerprint through `wr-itil-mark-story-oversight-confirmed`. Until then `wr-itil-detect-unratified-stories-maps` surfaces it and an RFC may not reference its stories (`wr-itil-check-rfc-stories-ratified`).
206
+ **Born unconfirmed (the "Story maps and stories carry a drift-invalidated human-oversight marker" architecture rule).** Do NOT author `humanOversight` at all: the renderer treats an absent field as `unconfirmed`, so writing it is writing the default, and the field exists so that `wr-itil-mark-story-oversight-confirmed` can set `confirmed` — which an agent must never hand-write (the "iter subprocesses set `human-oversight: confirmed` marker on ADRs / personas / JTBDs without an actual user-confirmation event" problem). The `<meta name="human-oversight">` tag is a projection the renderer regenerates from the island; never author it directly (the "Story maps render from JSON through a canonical template" architecture rule). The map is NOT ratified until a human confirms it via `/wr-itil:manage-story-map <NNN> ratify`, which writes `confirmed` + an `oversight-hash` fingerprint through `wr-itil-mark-story-oversight-confirmed`. Until then `wr-itil-detect-unratified-stories-maps` surfaces it and an RFC may not reference its stories (`wr-itil-check-rfc-stories-ratified`).
207
207
 
208
- **What re-opens ratification, and what does not (ADR-103).** A later edit to the map's SUBSTANCE — the map's own substance as ADR-090 defines it — its journey, its identity, and what it traces to; `oversight_map_substance_keys()` is the field list — drifts the fingerprint and silently re-opens ratification. Release rows and the cards in them sit OUTSIDE the basis, so drawing a row or adding a story to one changes nothing. Presentation is outside it too: restyling the shared template cannot revoke an approval. Do NOT hand-write `confirmed` — born-unconfirmed is the load-bearing default.
208
+ **What re-opens ratification, and what does not (the "A release row is the RFC, and the map is the approval surface" architecture rule).** A later edit to the map's SUBSTANCE — the map's own substance as the "Story maps and stories carry a drift-invalidated human-oversight marker" architecture rule defines it — its journey, its identity, and what it traces to; `oversight_map_substance_keys()` is the field list — drifts the fingerprint and silently re-opens ratification. Release rows and the cards in them sit OUTSIDE the basis, so drawing a row or adding a story to one changes nothing. Presentation is outside it too: restyling the shared template cannot revoke an approval. Do NOT hand-write `confirmed` — born-unconfirmed is the load-bearing default.
209
209
 
210
210
  ### 6. Single commit — `## Story Maps` reverse-trace refresh
211
211
 
@@ -258,18 +258,18 @@ After commit, report:
258
258
 
259
259
  ## Related
260
260
 
261
- - **ADR-060** — Problem-RFC-Story framework + Phase 2 amendment 2026-05-10 + encoding amendment 2026-05-12.
262
- - **ADR-060 lines 145-189** — story-map tier spec + I3-I5 invariants.
263
- - **ADR-060 lines 381-435** — HTML encoding schema (the source-of-truth for the file template).
261
+ - **the "Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology" architecture rule** — Problem-RFC-Story framework + Phase 2 amendment 2026-05-10 + encoding amendment 2026-05-12.
262
+ - **the "Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology" architecture rule lines 145-189** — story-map tier spec + I3-I5 invariants.
263
+ - **the "Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology" architecture rule lines 381-435** — HTML encoding schema (the source-of-truth for the file template).
264
264
  - **`docs/STYLE-GUIDE.md`** — story-map HTML style rules (prohibited inline `style=""` on data-bearing elements).
265
265
  - **`docs/VOICE-AND-TONE.md`** — story-map prose guidance (HTML content section).
266
266
  - **`docs/story-maps/README.md`** — story-map tier lifecycle index + schema spec.
267
- - **P170** — driver problem ticket.
268
- - **JTBD-008** — Decompose a Fix Into Coordinated Changes. Primary persona-anchor.
269
- - **JTBD-302** — Trust That the README Describes the Plugin I Just Installed (README-currency rule for `docs/story-maps/README.md`).
270
- - **ADR-032** — governance-skill aside-invocation pattern.
271
- - **ADR-049** — bin/ on PATH; `wr-itil-reconcile-story-maps` shim ships in Slice 5.
272
- - **ADR-052** — behavioural-tests default. Bats at `packages/itil/skills/capture-story-map/test/capture-story-map-behavioural.bats`.
267
+ - **the "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** — driver problem ticket.
268
+ - **the ": Decompose a Fix Into Coordinated Changes" user outcome** — Decompose a Fix Into Coordinated Changes. Primary persona-anchor.
269
+ - **the "Trust That the README Describes the Plugin I Just Installed" user outcome** — Trust That the README Describes the Plugin I Just Installed (README-currency rule for `docs/story-maps/README.md`).
270
+ - **the "Governance skill invocation patterns — foreground + background with deferred-question resumption" architecture rule** — governance-skill aside-invocation pattern.
271
+ - **the "Plugin-bundled scripts invoked from SKILL.md resolve via `bin/` on `$PATH`" architecture rule** — bin/ on PATH; `wr-itil-reconcile-story-maps` shim ships in Slice 5.
272
+ - **the "Behavioural-tests-default for skill testing" architecture rule** — behavioural-tests default. Bats at `packages/itil/skills/capture-story-map/test/capture-story-map-behavioural.bats`.
273
273
  - **Capture-story precedent** — `packages/itil/skills/capture-story/SKILL.md` — sibling skill at the story tier; capture-story-map mirrors with story-map-tier extensions (HTML encoding, no optional --rfc / --story-map flags).
274
274
 
275
275
  $ARGUMENTS
@@ -0,0 +1,3 @@
1
+ interface:
2
+ display_name: "WR ITIL: Capture Story Map"
3
+ short_description: "Capture an approved journey map for delivery planning."