@windyroad/itil 1.2.0 → 2.0.0-preview.1111
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/plugins/marketplace.json +12 -0
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +42 -0
- package/README.md +34 -25
- package/agents/hang-off-check.md +34 -34
- package/bin/install.mjs +71 -5
- package/bin/wr-itil-catchup-scan +4 -4
- package/bin/wr-itil-check-deferred-placeholder-staleness +4 -4
- package/bin/wr-itil-check-fail-soft-skip-discipline +4 -4
- package/bin/wr-itil-check-fix-rfc-trace +4 -4
- package/bin/wr-itil-check-locale-discipline +4 -4
- package/bin/wr-itil-check-outbound-responses-staleness +4 -4
- package/bin/wr-itil-check-problems-readme-budget +4 -4
- package/bin/wr-itil-check-rfc-has-stories +4 -4
- package/bin/wr-itil-check-rfc-stories-ratified +4 -4
- package/bin/wr-itil-check-ticket-jtbd-ratification +4 -4
- package/bin/wr-itil-check-upstream-cache-staleness +4 -4
- package/bin/wr-itil-check-upstream-responses +4 -4
- package/bin/wr-itil-classify-readme-drift +4 -4
- package/bin/wr-itil-derive-release-vehicle +4 -4
- package/bin/wr-itil-detect-unratified-stories-maps +4 -4
- package/bin/wr-itil-effort-tally +4 -4
- package/bin/wr-itil-enumerate-postrelease-kv-candidates +4 -4
- package/bin/wr-itil-evaluate-relevance +4 -4
- package/bin/wr-itil-mark-create-gate +4 -4
- package/bin/wr-itil-mark-story-oversight-confirmed +4 -4
- package/bin/wr-itil-migrate-problems-layout +4 -4
- package/bin/wr-itil-migrate-story-status-mirror +4 -4
- package/bin/wr-itil-next-rfc-id +4 -4
- package/bin/wr-itil-plugin-exercise-index +4 -4
- package/bin/wr-itil-plugin-maturity-populate +4 -4
- package/bin/wr-itil-plugin-maturity-render +4 -4
- package/bin/wr-itil-plugin-validate-ci-gate +4 -4
- package/bin/wr-itil-reconcile-readme +4 -4
- package/bin/wr-itil-reconcile-rfcs +4 -4
- package/bin/wr-itil-reconcile-stories +4 -4
- package/bin/wr-itil-reconcile-story-maps +4 -4
- package/bin/wr-itil-render-story-map +4 -4
- package/bin/wr-itil-resolve-governance-plugin-dirs +4 -4
- package/bin/wr-itil-skill-invocations +4 -4
- package/bin/wr-itil-story-map-edit +4 -4
- package/bin/wr-itil-story-map-query +4 -4
- package/bin/wr-itil-update-jtbd-references-section +4 -4
- package/bin/wr-itil-update-problem-references-section +4 -4
- package/bin/wr-itil-update-problem-rfcs-section +4 -4
- package/bin/wr-itil-update-rfc-commits-section +4 -4
- package/bin/wr-itil-update-rfc-references-section +4 -4
- package/bin/wr-itil-verify-iter-summary +4 -4
- package/hooks/itil-assistant-output-gate.sh +3 -3
- package/hooks/itil-assistant-output-review.sh +5 -5
- package/hooks/itil-bash-polling-antipattern-detect.sh +11 -11
- package/hooks/itil-changeset-discipline.sh +24 -24
- package/hooks/itil-claude-space-protection.sh +21 -14
- package/hooks/itil-codex-dispatch.sh +164 -0
- package/hooks/itil-commit-trailer-transition-advisory.sh +11 -11
- package/hooks/itil-correction-detect.sh +8 -8
- package/hooks/itil-deferral-cadence-gate.sh +23 -23
- package/hooks/itil-fictional-defer-detect.sh +16 -16
- package/hooks/itil-fix-title-lifecycle-advisory.sh +11 -11
- package/hooks/itil-mid-loop-ask-detect.sh +14 -14
- package/hooks/itil-no-implement-draft-gate.sh +18 -18
- package/hooks/itil-pending-questions-surface.sh +11 -11
- package/hooks/itil-readme-refresh-discipline.sh +27 -27
- package/hooks/itil-rfc-oversight-nudge.sh +7 -7
- package/hooks/itil-rfc-trailer-advisory.sh +28 -28
- package/hooks/itil-runtime-sid-marker.sh +11 -11
- package/hooks/itil-story-mirror-migration-nudge.sh +7 -7
- package/hooks/lib/block-list.sh +17 -17
- package/hooks/lib/changeset-detect.sh +27 -27
- package/hooks/lib/claude-space-gate.sh +23 -15
- package/hooks/lib/command-detect.sh +12 -12
- package/hooks/lib/create-gate.sh +9 -39
- package/hooks/lib/detectors.sh +12 -12
- package/hooks/lib/readme-refresh-detect.sh +51 -51
- package/hooks/lib/runtime-sid.sh +12 -12
- package/hooks/lib/session-id.sh +28 -28
- package/hooks/lib/session-marker.sh +1 -1
- package/hooks/lib/staging-detect.sh +13 -13
- package/hooks/manage-problem-enforce-create.sh +16 -27
- package/hooks/p057-staging-trap-detect.sh +18 -18
- package/hooks/pre-publish-intake-gate.sh +5 -5
- package/hooks/staleness-check.sh +6 -6
- package/hooks-codex/hooks.json +57 -0
- package/lib/check-deferred-placeholder-staleness.sh +10 -10
- package/lib/check-outbound-responses-staleness.sh +2 -2
- package/lib/check-upstream-cache-staleness.sh +2 -2
- package/lib/derive-first-dispatch.sh +19 -19
- package/lib/enumerate-postrelease-kv-candidates.sh +18 -18
- package/lib/migrate-problems-layout.sh +12 -12
- package/lib/story-oversight.sh +27 -27
- package/package.json +16 -3
- package/scripts/catchup-scan.sh +25 -25
- package/scripts/check-fail-soft-skip-discipline.sh +10 -10
- package/scripts/check-fix-rfc-trace.sh +8 -8
- package/scripts/check-locale-discipline.sh +13 -13
- package/scripts/check-problems-readme-budget.sh +12 -12
- package/scripts/check-rfc-has-stories.sh +7 -7
- package/scripts/check-rfc-rejected-alternatives.sh +11 -11
- package/scripts/check-rfc-stories-ratified.sh +9 -9
- package/scripts/check-ticket-jtbd-ratification.sh +10 -10
- package/scripts/check-upstream-responses.sh +22 -22
- package/scripts/classify-readme-drift.sh +13 -13
- package/scripts/codex-agent.mjs +104 -0
- package/scripts/derive-release-vehicle.sh +23 -23
- package/scripts/detect-unoversighted-rfcs.sh +3 -3
- package/scripts/detect-unratified-stories-maps.sh +5 -5
- package/scripts/effort-tally.sh +10 -10
- package/scripts/evaluate-relevance.sh +16 -16
- package/scripts/mark-create-gate.sh +4 -4
- package/scripts/mark-story-oversight-confirmed.sh +14 -14
- package/scripts/migrate-story-status-mirror.sh +6 -6
- package/scripts/next-rfc-id.sh +5 -5
- package/scripts/plugin-exercise-index.sh +26 -26
- package/scripts/plugin-maturity-populate.sh +38 -38
- package/scripts/plugin-maturity-render.sh +26 -26
- package/scripts/plugin-validate-ci-gate.sh +14 -14
- package/scripts/reconcile-readme.sh +23 -23
- package/scripts/reconcile-rfcs.sh +13 -13
- package/scripts/reconcile-stories.sh +12 -12
- package/scripts/reconcile-story-maps.sh +6 -6
- package/scripts/render-story-map.mjs +24 -24
- package/scripts/render-story-map.sh +3 -3
- package/scripts/resolve-governance-plugin-dirs.sh +10 -10
- package/scripts/run-check-deferred-placeholder-staleness.sh +3 -3
- package/scripts/run-check-outbound-responses-staleness.sh +3 -3
- package/scripts/run-check-upstream-cache-staleness.sh +3 -3
- package/scripts/run-enumerate-postrelease-kv-candidates.sh +3 -3
- package/scripts/run-migrate-problems-layout.sh +3 -3
- package/scripts/skill-invocations.sh +29 -29
- package/scripts/story-map-edit.mjs +6 -6
- package/scripts/story-map-edit.sh +3 -3
- package/scripts/story-map-query.mjs +8 -8
- package/scripts/story-map-query.sh +3 -3
- package/scripts/update-jtbd-references-section.sh +8 -8
- package/scripts/update-problem-references-section.sh +12 -12
- package/scripts/update-problem-rfcs-section.sh +9 -9
- package/scripts/update-rfc-commits-section.sh +7 -7
- package/scripts/update-rfc-references-section.sh +3 -3
- package/scripts/update-story-references-section.sh +5 -5
- package/scripts/verify-iter-summary.sh +3 -3
- package/skills/capture-problem/REFERENCE.md +33 -33
- package/skills/capture-problem/SKILL.md +108 -108
- package/skills/capture-problem/agents/openai.yaml +3 -0
- package/skills/capture-rfc/SKILL.md +21 -323
- package/skills/capture-rfc/agents/openai.yaml +3 -0
- package/skills/capture-story/SKILL.md +65 -65
- package/skills/capture-story/agents/openai.yaml +3 -0
- package/skills/capture-story-map/SKILL.md +31 -31
- package/skills/capture-story-map/agents/openai.yaml +3 -0
- package/skills/check-upstream-responses/SKILL.md +38 -38
- package/skills/check-upstream-responses/agents/openai.yaml +3 -0
- package/skills/close-incident/SKILL.md +25 -25
- package/skills/close-incident/agents/openai.yaml +3 -0
- package/skills/link-incident/SKILL.md +22 -22
- package/skills/link-incident/agents/openai.yaml +3 -0
- package/skills/list-incidents/SKILL.md +9 -9
- package/skills/list-incidents/agents/openai.yaml +3 -0
- package/skills/list-problems/SKILL.md +17 -17
- package/skills/list-problems/agents/openai.yaml +3 -0
- package/skills/list-stories/SKILL.md +23 -23
- package/skills/list-stories/agents/openai.yaml +3 -0
- package/skills/list-story-maps/SKILL.md +9 -9
- package/skills/list-story-maps/agents/openai.yaml +3 -0
- package/skills/manage-incident/SKILL.md +59 -59
- package/skills/manage-incident/agents/openai.yaml +3 -0
- package/skills/manage-problem/SKILL.md +222 -222
- package/skills/manage-problem/agents/openai.yaml +3 -0
- package/skills/manage-rfc/SKILL.md +62 -62
- package/skills/manage-rfc/agents/openai.yaml +3 -0
- package/skills/manage-story/SKILL.md +49 -49
- package/skills/manage-story/agents/openai.yaml +3 -0
- package/skills/manage-story-map/SKILL.md +30 -30
- package/skills/manage-story-map/agents/openai.yaml +3 -0
- package/skills/mitigate-incident/SKILL.md +40 -40
- package/skills/mitigate-incident/agents/openai.yaml +3 -0
- package/skills/reconcile-readme/SKILL.md +28 -28
- package/skills/reconcile-readme/agents/openai.yaml +3 -0
- package/skills/reconcile-stories/SKILL.md +17 -17
- package/skills/reconcile-stories/agents/openai.yaml +3 -0
- package/skills/reconcile-story-maps/SKILL.md +11 -11
- package/skills/reconcile-story-maps/agents/openai.yaml +3 -0
- package/skills/report-upstream/SKILL.md +73 -73
- package/skills/report-upstream/agents/openai.yaml +3 -0
- package/skills/restore-incident/SKILL.md +28 -28
- package/skills/restore-incident/agents/openai.yaml +3 -0
- package/skills/review-problems/SKILL.md +129 -129
- package/skills/review-problems/agents/openai.yaml +3 -0
- package/skills/scaffold-intake/SKILL.md +26 -26
- package/skills/scaffold-intake/agents/openai.yaml +3 -0
- package/skills/transition-problem/SKILL.md +85 -85
- package/skills/transition-problem/agents/openai.yaml +3 -0
- package/skills/transition-problems/SKILL.md +69 -69
- package/skills/transition-problems/agents/openai.yaml +3 -0
- package/skills/update-upstream/SKILL.md +97 -97
- package/skills/update-upstream/agents/openai.yaml +3 -0
- package/skills/work-problem/SKILL.md +42 -42
- package/skills/work-problem/agents/openai.yaml +3 -0
- package/skills/work-problems/SKILL.md +327 -327
- package/skills/work-problems/agents/openai.yaml +3 -0
- package/skills-codex/capture-problem/REFERENCE.md +139 -0
- package/skills-codex/capture-problem/SKILL.md +438 -0
- package/skills-codex/capture-problem/agents/openai.yaml +3 -0
- package/skills-codex/capture-rfc/SKILL.md +45 -0
- package/skills-codex/capture-rfc/agents/openai.yaml +3 -0
- package/skills-codex/capture-story/SKILL.md +407 -0
- package/skills-codex/capture-story/agents/openai.yaml +3 -0
- package/skills-codex/capture-story-map/SKILL.md +286 -0
- package/skills-codex/capture-story-map/agents/openai.yaml +3 -0
- package/skills-codex/check-upstream-responses/SKILL.md +160 -0
- package/skills-codex/check-upstream-responses/agents/openai.yaml +3 -0
- package/skills-codex/close-incident/SKILL.md +192 -0
- package/skills-codex/close-incident/agents/openai.yaml +3 -0
- package/skills-codex/link-incident/SKILL.md +173 -0
- package/skills-codex/link-incident/agents/openai.yaml +3 -0
- package/skills-codex/list-incidents/SKILL.md +92 -0
- package/skills-codex/list-incidents/agents/openai.yaml +3 -0
- package/skills-codex/list-problems/SKILL.md +126 -0
- package/skills-codex/list-problems/agents/openai.yaml +3 -0
- package/skills-codex/list-stories/SKILL.md +170 -0
- package/skills-codex/list-stories/agents/openai.yaml +3 -0
- package/skills-codex/list-story-maps/SKILL.md +104 -0
- package/skills-codex/list-story-maps/agents/openai.yaml +3 -0
- package/skills-codex/manage-incident/SKILL.md +378 -0
- package/skills-codex/manage-incident/agents/openai.yaml +3 -0
- package/skills-codex/manage-problem/SKILL.md +1180 -0
- package/skills-codex/manage-problem/agents/openai.yaml +3 -0
- package/skills-codex/manage-rfc/SKILL.md +314 -0
- package/skills-codex/manage-rfc/agents/openai.yaml +3 -0
- package/skills-codex/manage-story/SKILL.md +284 -0
- package/skills-codex/manage-story/agents/openai.yaml +3 -0
- package/skills-codex/manage-story-map/SKILL.md +198 -0
- package/skills-codex/manage-story-map/agents/openai.yaml +3 -0
- package/skills-codex/mitigate-incident/SKILL.md +239 -0
- package/skills-codex/mitigate-incident/agents/openai.yaml +3 -0
- package/skills-codex/reconcile-readme/SKILL.md +175 -0
- package/skills-codex/reconcile-readme/agents/openai.yaml +3 -0
- package/skills-codex/reconcile-stories/SKILL.md +124 -0
- package/skills-codex/reconcile-stories/agents/openai.yaml +3 -0
- package/skills-codex/reconcile-story-maps/SKILL.md +81 -0
- package/skills-codex/reconcile-story-maps/agents/openai.yaml +3 -0
- package/skills-codex/report-upstream/SKILL.md +716 -0
- package/skills-codex/report-upstream/agents/openai.yaml +3 -0
- package/skills-codex/restore-incident/SKILL.md +216 -0
- package/skills-codex/restore-incident/agents/openai.yaml +3 -0
- package/skills-codex/review-problems/SKILL.md +524 -0
- package/skills-codex/review-problems/agents/openai.yaml +3 -0
- package/skills-codex/scaffold-intake/SKILL.md +209 -0
- package/skills-codex/scaffold-intake/agents/openai.yaml +3 -0
- package/skills-codex/scaffold-intake/templates/CONTRIBUTING.md.tmpl +31 -0
- package/skills-codex/scaffold-intake/templates/SECURITY.md.tmpl +39 -0
- package/skills-codex/scaffold-intake/templates/SUPPORT.md.tmpl +32 -0
- package/skills-codex/scaffold-intake/templates/config.yml.tmpl +8 -0
- package/skills-codex/scaffold-intake/templates/problem-report.yml.tmpl +114 -0
- package/skills-codex/transition-problem/SKILL.md +371 -0
- package/skills-codex/transition-problem/agents/openai.yaml +3 -0
- package/skills-codex/transition-problems/SKILL.md +310 -0
- package/skills-codex/transition-problems/agents/openai.yaml +3 -0
- package/skills-codex/update-upstream/SKILL.md +583 -0
- package/skills-codex/update-upstream/agents/openai.yaml +3 -0
- package/skills-codex/work-problem/SKILL.md +160 -0
- package/skills-codex/work-problem/agents/openai.yaml +3 -0
- package/skills-codex/work-problems/SKILL.md +58 -0
- package/skills-codex/work-problems/agents/openai.yaml +3 -0
- package/templates/story-map.css +1 -1
- package/bin/wr-itil-mark-rfc-capture-gate +0 -51
- package/scripts/mark-rfc-capture-gate.sh +0 -32
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "windyroad-itil-local",
|
|
3
|
+
"interface": { "displayName": "Windy Road ITIL" },
|
|
4
|
+
"plugins": [
|
|
5
|
+
{
|
|
6
|
+
"name": "wr-itil",
|
|
7
|
+
"source": { "source": "local", "path": "." },
|
|
8
|
+
"policy": { "installation": "AVAILABLE", "authentication": "ON_INSTALL" },
|
|
9
|
+
"category": "Developer Tools"
|
|
10
|
+
}
|
|
11
|
+
]
|
|
12
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "wr-itil",
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"description": "ITIL problem-management workflows for AI coding agents",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "Windy Road Technology",
|
|
7
|
+
"url": "https://windyroad.com.au"
|
|
8
|
+
},
|
|
9
|
+
"homepage": "https://github.com/windyroad/agent-plugins/tree/main/packages/itil",
|
|
10
|
+
"repository": "https://github.com/windyroad/agent-plugins",
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"keywords": [
|
|
13
|
+
"itil",
|
|
14
|
+
"problem-management",
|
|
15
|
+
"governance",
|
|
16
|
+
"codex",
|
|
17
|
+
"claude-code"
|
|
18
|
+
],
|
|
19
|
+
"skills": "./skills-codex/",
|
|
20
|
+
"interface": {
|
|
21
|
+
"displayName": "Windy Road ITIL",
|
|
22
|
+
"shortDescription": "Manage ITIL problems, incidents, RFCs, stories, and maps",
|
|
23
|
+
"longDescription": "Complete ITIL workflow support for Codex: capture, prioritise, investigate, transition, review, reconcile, and report service-management records.",
|
|
24
|
+
"developerName": "Windy Road Technology",
|
|
25
|
+
"category": "Developer Tools",
|
|
26
|
+
"capabilities": [
|
|
27
|
+
"Interactive",
|
|
28
|
+
"Read",
|
|
29
|
+
"Write"
|
|
30
|
+
],
|
|
31
|
+
"websiteURL": "https://windyroad.com.au",
|
|
32
|
+
"privacyPolicyURL": "https://windyroad.com.au/privacy",
|
|
33
|
+
"termsOfServiceURL": "https://windyroad.com.au/terms",
|
|
34
|
+
"defaultPrompt": [
|
|
35
|
+
"Work the highest-priority problem",
|
|
36
|
+
"Manage this incident",
|
|
37
|
+
"Review and reconcile the ITIL backlog"
|
|
38
|
+
],
|
|
39
|
+
"brandColor": "#0F766E",
|
|
40
|
+
"screenshots": []
|
|
41
|
+
}
|
|
42
|
+
}
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @windyroad/itil
|
|
2
2
|
|
|
3
|
-
**ITIL-aligned IT service management for Claude Code.** Track recurring incidents, perform root cause analysis, and prioritise fixes using WSJF -- all inside your coding sessions. *Maturity: Experimental
|
|
3
|
+
**ITIL-aligned IT service management for Claude Code and Codex.** Track recurring incidents, perform root cause analysis, and prioritise fixes using WSJF -- all inside your coding sessions. *Maturity: Experimental.*
|
|
4
4
|
|
|
5
5
|
Part of [Windy Road Agent Plugins](../../README.md).
|
|
6
6
|
|
|
@@ -34,9 +34,18 @@ npx @windyroad/itil
|
|
|
34
34
|
|
|
35
35
|
Restart Claude Code after installing.
|
|
36
36
|
|
|
37
|
+
For Codex:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
npx @windyroad/itil --runtime codex --scope user
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Restart Codex after installing. Codex exposes the complete ITIL skill set, the
|
|
44
|
+
exact `wr-itil:hang-off-check` agent, and five consolidated lifecycle hooks.
|
|
45
|
+
|
|
37
46
|
> **Requires:** [`@windyroad/risk-scorer`](../risk-scorer/). The installer warns if it's missing.
|
|
38
47
|
>
|
|
39
|
-
> **Renamed from `@windyroad/problem`** — see [
|
|
48
|
+
> **Renamed from `@windyroad/problem`** — see [the "Rename `wr-problem` Plugin to `wr-itil`" architecture rule](../../docs/decisions/010-rename-wr-problem-to-wr-itil.proposed.md). If you had the old package installed, uninstall it (`npx @windyroad/problem --uninstall`) before installing `@windyroad/itil`.
|
|
40
49
|
|
|
41
50
|
## Usage
|
|
42
51
|
|
|
@@ -56,7 +65,7 @@ Supports creating new problems, updating root cause analysis, transitioning stat
|
|
|
56
65
|
|
|
57
66
|
Supports declaring new incidents, recording evidence-first observations and hypotheses, logging mitigation attempts, transitioning lifecycle (Investigating → Mitigating → Restored → Closed), and automatically handing off to `manage-problem` when service is restored.
|
|
58
67
|
|
|
59
|
-
See [
|
|
68
|
+
See [the "Add `manage-incident` Skill to `wr-itil` Plugin" architecture rule](../../docs/decisions/011-manage-incident-skill.proposed.md) for the incident-vs-problem split.
|
|
60
69
|
|
|
61
70
|
## How It Works
|
|
62
71
|
|
|
@@ -64,13 +73,13 @@ See [ADR-011](../../docs/decisions/011-manage-incident-skill.proposed.md) for th
|
|
|
64
73
|
|------|---------|-------------|
|
|
65
74
|
| `bin/check-deps.sh` | Session start | Verifies that `wr-risk-scorer` is installed |
|
|
66
75
|
| `itil-assistant-output-gate.sh` | Every prompt | Detects classes of assistant output (e.g. prose-asks vs `AskUserQuestion`) that indicate ITIL-discipline regressions |
|
|
67
|
-
| `itil-correction-detect.sh` | Every prompt | Surfaces strong-signal user corrections (FFS / DO NOT / contradictions) and offers a problem ticket capture per
|
|
68
|
-
| `itil-runtime-sid-marker.sh` | Bash, Edit, Write, Read | Records per-session ID for runtime instrumentation (
|
|
76
|
+
| `itil-correction-detect.sh` | Every prompt | Surfaces strong-signal user corrections (FFS / DO NOT / contradictions) and offers a problem ticket capture per the "Problem 078: Assistant does not offer to capture a problem ticket when the user delivers strong-signal correction" problem |
|
|
77
|
+
| `itil-runtime-sid-marker.sh` | Bash, Edit, Write, Read | Records per-session ID for runtime instrumentation (the "Capture the runtime stdin session_id via a PreToolUse hook so the create-gate marker binds to the same SID the runtime hook will see" architecture rule) |
|
|
69
78
|
| `manage-problem-enforce-create.sh` | Write | Blocks creation of `docs/problems/*.md` outside the `/wr-itil:manage-problem` workflow |
|
|
70
|
-
| `itil-claude-space-protection.sh` | Write, Edit | Prevents project-generated artefacts from being written under `.claude/` (
|
|
71
|
-
| `p057-staging-trap-detect.sh` | Bash | Detects the
|
|
72
|
-
| `pre-publish-intake-gate.sh` | Bash | Blocks `npm publish` when downstream OSS intake scaffolding is missing (
|
|
73
|
-
| `itil-changeset-discipline.sh` | Bash | Gates `git commit` on changeset coverage for source-package changes (
|
|
79
|
+
| `itil-claude-space-protection.sh` | Write, Edit | Prevents project-generated artefacts from being written under `.claude/` (the "Agents write project-generated artefacts under `.claude/` (user-controlled config space) — gate exclusions are read tolerance, not write permission" problem) |
|
|
80
|
+
| `p057-staging-trap-detect.sh` | Bash | Detects the "Problem 057: `git mv` + Edit + `git add` staging-ordering trap drops content edits from the commit" problem staging trap during ticket transitions |
|
|
81
|
+
| `pre-publish-intake-gate.sh` | Bash | Blocks `npm publish` when downstream OSS intake scaffolding is missing (the "Scaffold downstream OSS intake — skill + layered triggers" architecture rule) |
|
|
82
|
+
| `itil-changeset-discipline.sh` | Bash | Gates `git commit` on changeset coverage for source-package changes (the "AFK iter `packages/<plugin>/` commits without changesets — orchestrator-main-turn back-fill is fragile recovery, hook-level enforcement preferable" problem) |
|
|
74
83
|
| `itil-assistant-output-review.sh` | Stop | Reviews assistant output at session end for ITIL-discipline patterns |
|
|
75
84
|
|
|
76
85
|
## Skills
|
|
@@ -78,30 +87,30 @@ See [ADR-011](../../docs/decisions/011-manage-incident-skill.proposed.md) for th
|
|
|
78
87
|
| Skill | Purpose | Maturity |
|
|
79
88
|
| ------- | --------- | --- |
|
|
80
89
|
| `/wr-itil:manage-problem` | Create, update, and close problem tickets through the Open → Known Error → Verifying → Closed lifecycle | Alpha |
|
|
81
|
-
| `/wr-itil:capture-problem` | Foreground-lightweight aside-invocation variant of `manage-problem` (per
|
|
90
|
+
| `/wr-itil:capture-problem` | Foreground-lightweight aside-invocation variant of `manage-problem` (per the "Governance skill invocation patterns — foreground + background with deferred-question resumption" architecture rule background-capture pattern + the "Problem 078: Assistant does not offer to capture a problem ticket when the user delivers strong-signal correction" problem capture-on-correction) — drafts a ticket scaffold without losing the operational thread when a problem signal surfaces mid-conversation | Experimental |
|
|
82
91
|
| `/wr-itil:work-problem` | Pick the highest-WSJF actionable ticket and work it to completion | Experimental |
|
|
83
92
|
| `/wr-itil:work-problems` | AFK orchestrator — batch-work the problem backlog by WSJF priority while the user is away | Experimental |
|
|
84
93
|
| `/wr-itil:list-problems` | Read-only display of the open and known-error backlog sorted by WSJF | Experimental |
|
|
85
94
|
| `/wr-itil:transition-problem` / `/wr-itil:transition-problems` | Advance one or many tickets through the lifecycle | Experimental |
|
|
86
95
|
| `/wr-itil:review-problems` | Re-rate every open and known-error ticket and refresh the WSJF ranking | Experimental |
|
|
87
96
|
| `/wr-itil:reconcile-readme` | Detect and correct drift between `docs/problems/README.md` and on-disk ticket inventory | Experimental |
|
|
88
|
-
| `/wr-itil:report-upstream` | Report a local problem as a structured issue against an upstream repository (
|
|
89
|
-
| `/wr-itil:check-upstream-responses` | Poll upstream issues we filed via `/wr-itil:report-upstream` and surface new comments / state changes / label changes since last check (
|
|
90
|
-
| `/wr-itil:update-upstream` | Post a lifecycle-update comment to an upstream issue when a local problem ticket transitions — root-cause confirmed / fix released / closed; reciprocal sibling to `/wr-itil:report-upstream` (
|
|
91
|
-
| `/wr-itil:capture-rfc` | Lightweight RFC-capture skill — mandatory problem-trace per
|
|
92
|
-
| `/wr-itil:manage-rfc` | Heavyweight RFC intake + lifecycle management — proposed → accepted → in-progress → verifying → closed; sibling to `manage-problem` at the RFC tier (
|
|
93
|
-
| `/wr-itil:capture-story` | Lightweight story-capture skill — mandatory problem-trace AND JTBD-trace per
|
|
94
|
-
| `/wr-itil:list-stories` | Read-only display of stories grouped by lifecycle state, with optional `--rfc RFC-<NNN>` filter rendering the RFC's ordered story list per
|
|
95
|
-
| `/wr-itil:reconcile-stories` | Detect and correct drift between `docs/stories/README.md` and on-disk story inventory + reverse-trace `## Stories` sections on driving problems / RFCs / JTBDs (Phase 2 /
|
|
96
|
-
| `/wr-itil:manage-story` | Heavyweight story lifecycle management — draft → accepted → in-progress → done → archived; I7+I8+I10+I12 hard-block at accepted transition; INVEST 4-axis check; auto-transitions on `Refs: STORY-NNN` commit trailer + linked RFC closure (Phase 2 /
|
|
97
|
-
| `/wr-itil:capture-story-map` | Lightweight story-map-capture skill — mandatory problem-trace AND JTBD-trace per
|
|
98
|
-
| `/wr-itil:manage-story-map` | Heavyweight story-map lifecycle management — draft → accepted → in-progress → completed → archived; backbone/ribs/slices authoring guidance; reverse-trace `## Story Maps` refresh on driving problems + JTBDs (Phase 2 /
|
|
99
|
-
| `/wr-itil:reconcile-story-maps` | Detect and correct drift between `docs/story-maps/README.md` and on-disk story-map HTML inventory (Phase 2 /
|
|
100
|
-
| `/wr-itil:list-story-maps` | Read-only display of story-maps grouped by lifecycle state; no WSJF (I5 invariant — maps are planning artefacts, not work items) (Phase 2 /
|
|
97
|
+
| `/wr-itil:report-upstream` | Report a local problem as a structured issue against an upstream repository (the "Cross-project problem-reporting contract — `report-upstream` skill in `@windyroad/itil`" architecture rule) | Experimental |
|
|
98
|
+
| `/wr-itil:check-upstream-responses` | Poll upstream issues we filed via `/wr-itil:report-upstream` and surface new comments / state changes / label changes since last check (the "No process for issue reporters to check for responses — symmetric gap to inbound discovery" problem Phase 1; outbound symmetric counterpart to the "Inbound upstream-report discovery + assessment pipeline (peer of )" architecture rule inbound discovery) | Experimental |
|
|
99
|
+
| `/wr-itil:update-upstream` | Post a lifecycle-update comment to an upstream issue when a local problem ticket transitions — root-cause confirmed / fix released / closed; reciprocal sibling to `/wr-itil:report-upstream` (the "Cross-project problem-reporting contract — `report-upstream` skill in `@windyroad/itil`" architecture rule amendment 2026-06-09, the "Problem 080: No bidirectional update of upstream-reported problems — local lifecycle transitions never propagate back to the reporter" problem Phase 1) | Experimental |
|
|
100
|
+
| `/wr-itil:capture-rfc` | Lightweight RFC-capture skill — mandatory problem-trace per the "Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology" architecture rule I1 invariant; opens a coordinated multi-commit change traceable to ≥ 1 driving problem (Phase 1 of the Problem-RFC-Story framework, 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 "Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology" architecture rule) | Experimental |
|
|
101
|
+
| `/wr-itil:manage-rfc` | Heavyweight RFC intake + lifecycle management — proposed → accepted → in-progress → verifying → closed; sibling to `manage-problem` at the RFC tier (the "Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology" architecture rule) | Experimental |
|
|
102
|
+
| `/wr-itil:capture-story` | Lightweight story-capture skill — mandatory problem-trace AND JTBD-trace per the "Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology" architecture rule I6 + I9 invariants; optional `--rfc` / `--story-map` flags (I7 + I8 enforce at `accepted` transition); drafts an INVEST-shaped sub-workstream entity under a parent RFC (Phase 2 of the Problem-RFC-Story framework, 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 "Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology" architecture rule) | Experimental |
|
|
103
|
+
| `/wr-itil:list-stories` | Read-only display of stories grouped by lifecycle state, with optional `--rfc RFC-<NNN>` filter rendering the RFC's ordered story list per the "Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology" architecture rule line 259 (Phase 2 / 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) | Experimental |
|
|
104
|
+
| `/wr-itil:reconcile-stories` | Detect and correct drift between `docs/stories/README.md` and on-disk story inventory + reverse-trace `## Stories` sections on driving problems / RFCs / JTBDs (Phase 2 / 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) | Experimental |
|
|
105
|
+
| `/wr-itil:manage-story` | Heavyweight story lifecycle management — draft → accepted → in-progress → done → archived; I7+I8+I10+I12 hard-block at accepted transition; INVEST 4-axis check; auto-transitions on `Refs: STORY-NNN` commit trailer + linked RFC closure (Phase 2 / 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). **I12 (the "A release row is the RFC, and the map is the approval surface" architecture rule)**: `accepted` requires the story to be approved, and an implementing commit against an unapproved story is blocked. Approval is the story map's — ratify the map and every story on it is approved with it | Experimental |
|
|
106
|
+
| `/wr-itil:capture-story-map` | Lightweight story-map-capture skill — mandatory problem-trace AND JTBD-trace per the "Problem-RFC-Story framework with mandatory problem-trace and unified problem ontology" architecture rule I3 + I4 invariants; HTML skeleton 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 (Phase 2 / 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) | Experimental |
|
|
107
|
+
| `/wr-itil:manage-story-map` | Heavyweight story-map lifecycle management — draft → accepted → in-progress → completed → archived; backbone/ribs/slices authoring guidance; reverse-trace `## Story Maps` refresh on driving problems + JTBDs (Phase 2 / 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) | Experimental |
|
|
108
|
+
| `/wr-itil:reconcile-story-maps` | Detect and correct drift between `docs/story-maps/README.md` and on-disk story-map HTML inventory (Phase 2 / 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) | Experimental |
|
|
109
|
+
| `/wr-itil:list-story-maps` | Read-only display of story-maps grouped by lifecycle state; no WSJF (I5 invariant — maps are planning artefacts, not work items) (Phase 2 / 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) | Experimental |
|
|
101
110
|
| `/wr-itil:manage-incident` | Declare, triage, mitigate, and close an incident with evidence-first discipline | Experimental |
|
|
102
111
|
| `/wr-itil:list-incidents` | Read-only display of active incidents by severity | Experimental |
|
|
103
|
-
| `/wr-itil:mitigate-incident` / `/wr-itil:restore-incident` / `/wr-itil:close-incident` / `/wr-itil:link-incident` | Incident lifecycle transitions (
|
|
104
|
-
| `/wr-itil:scaffold-intake` | Scaffold OSS intake surfaces (`.github/ISSUE_TEMPLATE/`, `SECURITY.md`, `SUPPORT.md`, `CONTRIBUTING.md`) for downstream adopters (
|
|
112
|
+
| `/wr-itil:mitigate-incident` / `/wr-itil:restore-incident` / `/wr-itil:close-incident` / `/wr-itil:link-incident` | Incident lifecycle transitions (the "Add `manage-incident` Skill to `wr-itil` Plugin" architecture rule) | Experimental |
|
|
113
|
+
| `/wr-itil:scaffold-intake` | Scaffold OSS intake surfaces (`.github/ISSUE_TEMPLATE/`, `SECURITY.md`, `SUPPORT.md`, `CONTRIBUTING.md`) for downstream adopters (the "Scaffold downstream OSS intake — skill + layered triggers" architecture rule) | Experimental |
|
|
105
114
|
|
|
106
115
|
## Configuration
|
|
107
116
|
|
package/agents/hang-off-check.md
CHANGED
|
@@ -6,8 +6,8 @@ description: Capture-time inflow-discipline arbiter for problem tickets. Given a
|
|
|
6
6
|
Investigation Tasks expansion / Phase N section on an existing parent ticket,
|
|
7
7
|
or PROCEED_NEW when no candidate absorbs the new scope. Spawned fresh from
|
|
8
8
|
inside /wr-itil:capture-problem and /wr-itil:manage-problem Step 2 to avoid
|
|
9
|
-
the calling agent's session-context bias. Read-only. Codified as
|
|
10
|
-
5th invocation pattern under the
|
|
9
|
+
the calling agent's session-context bias. Read-only. Codified as the "Governance skill invocation patterns — foreground + background with deferred-question resumption" architecture rule's
|
|
10
|
+
5th invocation pattern under the "`/wr-itil:review-problems` has no path to close tickets that are no longer relevant (evidence-based, NOT age-based) — structural outflow gap drives monotonic backlog growth" problem amendment.
|
|
11
11
|
tools:
|
|
12
12
|
- Read
|
|
13
13
|
- Glob
|
|
@@ -15,7 +15,7 @@ tools:
|
|
|
15
15
|
model: inherit
|
|
16
16
|
---
|
|
17
17
|
|
|
18
|
-
# @jtbd
|
|
18
|
+
# @jtbd the ": Enforce Governance Without Slowing Down" user outcome, the ": Progress the Backlog While I'm Away" user outcome, the "Extend the Suite with New Plugins" user outcome, the "Restore Service Fast with an Audit Trail" user outcome
|
|
19
19
|
|
|
20
20
|
You are the Hang-Off Check arbiter. You decide — for a new problem-ticket capture, given a mechanically pre-filtered set of candidate parent tickets — whether the new scope belongs absorbed into an existing parent (`HANG_OFF: P<NNN>`) or genuinely deserves its own new ticket (`PROCEED_NEW`).
|
|
21
21
|
|
|
@@ -23,16 +23,16 @@ You are a reviewer, not an editor. You read inputs and emit a structured verdict
|
|
|
23
23
|
|
|
24
24
|
## Driver
|
|
25
25
|
|
|
26
|
-
You exist because session-context bias on the calling main agent is structurally guaranteed: the main agent mid-iter has just been working on related artefacts and pattern-matches existing capture flows, missing hang-off opportunities (the wrongly-captured
|
|
26
|
+
You exist because session-context bias on the calling main agent is structurally guaranteed: the main agent mid-iter has just been working on related artefacts and pattern-matches existing capture flows, missing hang-off opportunities (the wrongly-captured the "Phase 2 — extend `evaluate-relevance.sh` with 4 more evidence shapes + fix Phase 1 file-no-longer-exists false-positive class" problem sibling of the "`/wr-itil:review-problems` has no path to close tickets that are no longer relevant (evidence-based, NOT age-based) — structural outflow gap drives monotonic backlog growth" problem on 2026-05-31 is the canonical regression). Your fresh context is the fix — you read only the structured inputs and reason about candidate absorption without the bias.
|
|
27
27
|
|
|
28
|
-
Same architectural pattern as `wr-architect:agent` / `wr-jtbd:agent` / `tdd:review-test` / `wr-risk-scorer:pipeline` — codified in
|
|
28
|
+
Same architectural pattern as `wr-architect:agent` / `wr-jtbd:agent` / `tdd:review-test` / `wr-risk-scorer:pipeline` — codified in the "Governance skill invocation patterns — foreground + background with deferred-question resumption" architecture rule as the 5th invocation pattern (the "`/wr-itil:review-problems` has no path to close tickets that are no longer relevant (evidence-based, NOT age-based) — structural outflow gap drives monotonic backlog growth" problem amendment, 2026-05-31).
|
|
29
29
|
|
|
30
30
|
## Your Inputs
|
|
31
31
|
|
|
32
32
|
The calling skill passes you a structured prompt containing two payloads:
|
|
33
33
|
|
|
34
34
|
1. **New capture description** — the free-text observation the user / agent wants to capture as a new problem ticket (the leading flags stripped, kebab-title slug derivable but not yet committed).
|
|
35
|
-
2. **Filtered candidate ticket list** — the result of the calling skill's mechanical pre-filter: candidates from `docs/problems/open/` + `docs/problems/verifying/` that share ≥1 signal with the description (ADR-NNN ref, SKILL path, file path, or named feature). The list is capped at 5 candidates per
|
|
35
|
+
2. **Filtered candidate ticket list** — the result of the calling skill's mechanical pre-filter: candidates from `docs/problems/open/` + `docs/problems/verifying/` that share ≥1 signal with the description (ADR-NNN ref, SKILL path, file path, or named feature). The list is capped at 5 candidates per the "Governance skill invocation patterns — foreground + background with deferred-question resumption" architecture rule's latency-bound contract; wider filtered sets short-circuit to PROCEED_NEW without invoking you.
|
|
36
36
|
|
|
37
37
|
For each candidate the calling skill passes:
|
|
38
38
|
- Ticket ID (`P<NNN>`)
|
|
@@ -48,7 +48,7 @@ For each candidate, ask: **does the new capture belong inside this candidate as
|
|
|
48
48
|
|
|
49
49
|
A new capture HANGS OFF a candidate when:
|
|
50
50
|
|
|
51
|
-
- The candidate is a **master ticket** for a multi-phase fix and the new capture is one phase / one sub-class of that work (
|
|
51
|
+
- The candidate is a **master ticket** for a multi-phase fix and the new capture is one phase / one sub-class of that work (the "`/wr-itil:review-problems` has no path to close tickets that are no longer relevant (evidence-based, NOT age-based) — structural outflow gap drives monotonic backlog growth" problem's three-phase scope is the canonical example — Phase 3 work belongs inside the "`/wr-itil:review-problems` has no path to close tickets that are no longer relevant (evidence-based, NOT age-based) — structural outflow gap drives monotonic backlog growth" problem as Phase 3, not as a sibling the "Phase 2 — extend `evaluate-relevance.sh` with 4 more evidence shapes + fix Phase 1 file-no-longer-exists false-positive class" problem).
|
|
52
52
|
- The candidate's `## Multi-phase scope` / `## Investigation Tasks` / `## Root Cause Analysis` section explicitly names work the new capture is doing (or is a natural extension of work the candidate names as in-scope).
|
|
53
53
|
- The candidate's root cause + the new capture's root cause are the same observable phenomenon, just surfaced at different times or by different signals.
|
|
54
54
|
- The new capture's description IS the candidate's deferred follow-up (the candidate's `## Fix Strategy` or `## Investigation Tasks` flags the work as "deferred to sibling ticket" but the sibling is actually scope expansion on this very ticket).
|
|
@@ -63,7 +63,7 @@ A new capture PROCEEDS as new when:
|
|
|
63
63
|
|
|
64
64
|
When in doubt, prefer **PROCEED_NEW** — false-negative on hang-off is cheaper than false-positive (false-positive silently swallows distinct work into the wrong parent; false-negative just defers consolidation to the next `/wr-itil:review-problems` cluster pass). This mirrors `/wr-itil:capture-problem` Step 2's existing "false-positives are cheaper than false-negatives" framing.
|
|
65
65
|
|
|
66
|
-
Under `--no-prompt` / AFK propagation, ambiguous-multi-parent cases also collapse to **PROCEED_NEW** (safe-default, no `AskUserQuestion` fallback —
|
|
66
|
+
Under `--no-prompt` / AFK propagation, ambiguous-multi-parent cases also collapse to **PROCEED_NEW** (safe-default, no `AskUserQuestion` fallback — the "Structured User Interaction for Governance-Skill Decisions" architecture rule Rule 6 fail-safe per the "Governance skill invocation patterns — foreground + background with deferred-question resumption" architecture rule amendment).
|
|
67
67
|
|
|
68
68
|
## How to Report
|
|
69
69
|
|
|
@@ -76,7 +76,7 @@ HANG_OFF: P<NNN>
|
|
|
76
76
|
|
|
77
77
|
**Rationale**: <one or two sentences naming the candidate's master-ticket / multi-phase / scope-expansion shape and why this new capture belongs inside it>.
|
|
78
78
|
|
|
79
|
-
**Signals matched**: <comma-separated list of the specific signals — e.g. "shared ADR-
|
|
79
|
+
**Signals matched**: <comma-separated list of the specific signals — e.g. "shared the "Evidence-based relevance-close pass for the problem backlog (Phase 1: file-no-longer-exists; Phase 2: ADR-shipped-confirmed + named-skill-exists + self-marker-in-body + driver-child-closed + Phase 1 false-positive fixes)" architecture rule reference", "candidate's Investigation Tasks Phase 3 section names this work", "shared `packages/itil/agents/hang-off-check.md` file path", "candidate's Fix Strategy deferred this exact scope">.
|
|
80
80
|
|
|
81
81
|
**Where to absorb**: <one sentence naming where on the candidate ticket the new scope lands — e.g. "amend candidate's Investigation Tasks checklist with [the deliverable]", "expand candidate's `### Phase N — <name>` section with [the new substance]", "append to candidate's Symptoms / Workaround section">.
|
|
82
82
|
```
|
|
@@ -93,15 +93,15 @@ PROCEED_NEW
|
|
|
93
93
|
|
|
94
94
|
## Output Formatting
|
|
95
95
|
|
|
96
|
-
When referencing decision IDs (ADR-<NNN>), problem IDs (P<NNN>), RFC IDs (RFC-<NNN>), or JTBD IDs in prose, always include a human-readable hint on first mention. Use `
|
|
96
|
+
When referencing decision IDs (ADR-<NNN>), problem IDs (P<NNN>), RFC IDs (RFC-<NNN>), or JTBD IDs in prose, always include a human-readable hint on first mention. Use `the "`/wr-itil:review-problems` has no path to close tickets that are no longer relevant (evidence-based, NOT age-based) — structural outflow gap drives monotonic backlog growth" problem (review-problems backlog-flow-control master ticket)`, not bare `the "`/wr-itil:review-problems` has no path to close tickets that are no longer relevant (evidence-based, NOT age-based) — structural outflow gap drives monotonic backlog growth" problem`. This matches `wr-architect:agent` / `wr-jtbd:agent` output formatting conventions per their the "Problem 032: Agent output references opaque problem/ADR IDs without human-readable titles" problem contracts.
|
|
97
97
|
|
|
98
98
|
## Scope and Firewalls
|
|
99
99
|
|
|
100
|
-
### Maintainer-side only (
|
|
100
|
+
### Maintainer-side only (the "Report a Problem Without Pre-Classifying It" user outcome firewall)
|
|
101
101
|
|
|
102
102
|
You fire on maintainer-side `/wr-itil:capture-problem` and maintainer-internal `/wr-itil:manage-problem` invocations only. You DO NOT fire on:
|
|
103
103
|
|
|
104
|
-
- Plugin-user-side intake via `.github/ISSUE_TEMPLATE/problem-report.yml` (plugin-user descriptions do not carry the same authorial intent as maintainer-internal captures — a plugin-user describing their friction in maintainer vocabulary could plausibly trigger a wrong-parent HANG_OFF). Triage during `/wr-itil:manage-problem` ingestion stays user-judgement per
|
|
104
|
+
- Plugin-user-side intake via `.github/ISSUE_TEMPLATE/problem-report.yml` (plugin-user descriptions do not carry the same authorial intent as maintainer-internal captures — a plugin-user describing their friction in maintainer vocabulary could plausibly trigger a wrong-parent HANG_OFF). Triage during `/wr-itil:manage-problem` ingestion stays user-judgement per the "Report a Problem Without Pre-Classifying It" user outcome.
|
|
105
105
|
- `/wr-itil:manage-problem`'s ingestion-of-plugin-user-reports path (mirrors the lexical-classifier firewall at `packages/itil/skills/capture-problem/SKILL.md` line 116).
|
|
106
106
|
|
|
107
107
|
### Cardinality
|
|
@@ -116,31 +116,31 @@ One verdict per invocation. The calling skill captures one ticket per invocation
|
|
|
116
116
|
|
|
117
117
|
## Behavioural verification
|
|
118
118
|
|
|
119
|
-
The canonical behavioural fixture is the
|
|
120
|
-
- New capture description:
|
|
121
|
-
- Candidate set: contains
|
|
122
|
-
- Expected verdict: `HANG_OFF:
|
|
119
|
+
The canonical behavioural fixture is the "Phase 2 — extend `evaluate-relevance.sh` with 4 more evidence shapes + fix Phase 1 file-no-longer-exists false-positive class" problem-vs-the "`/wr-itil:review-problems` has no path to close tickets that are no longer relevant (evidence-based, NOT age-based) — structural outflow gap drives monotonic backlog growth" problem regression — `packages/itil/agents/test/fixtures/regression-p347-vs-p346.md` captures the input shape:
|
|
120
|
+
- New capture description: the "Phase 2 — extend `evaluate-relevance.sh` with 4 more evidence shapes + fix Phase 1 file-no-longer-exists false-positive class" problem's original description (about "Phase 2 evidence shape expansion" work).
|
|
121
|
+
- Candidate set: contains the "`/wr-itil:review-problems` has no path to close tickets that are no longer relevant (evidence-based, NOT age-based) — structural outflow gap drives monotonic backlog growth" problem (the master backlog-flow-control ticket with its Multi-phase scope section explicitly naming Phase 2 as in-scope).
|
|
122
|
+
- Expected verdict: `HANG_OFF: the "`/wr-itil:review-problems` has no path to close tickets that are no longer relevant (evidence-based, NOT age-based) — structural outflow gap drives monotonic backlog growth" problem` with rationale citing the shared the "Evidence-based relevance-close pass for the problem backlog (Phase 1: file-no-longer-exists; Phase 2: ADR-shipped-confirmed + named-skill-exists + self-marker-in-body + driver-child-closed + Phase 1 false-positive fixes)" architecture rule reference + the candidate's Multi-phase scope section explicitly naming Phase 2.
|
|
123
123
|
|
|
124
|
-
Two further canonical fixtures live under the same path: `fixtures/proceed-new-genuinely-new.md` (no real candidates → PROCEED_NEW) and `fixtures/proceed-new-subtle-sibling.md` (
|
|
124
|
+
Two further canonical fixtures live under the same path: `fixtures/proceed-new-genuinely-new.md` (no real candidates → PROCEED_NEW) and `fixtures/proceed-new-subtle-sibling.md` (the "Problem 070: /wr-itil:report-upstream does not check for existing upstream issues before filing" problem vs a new report-upstream surface ticket on a different SKILL → PROCEED_NEW with reasoned per-candidate rationale).
|
|
125
125
|
|
|
126
|
-
Behavioural execution of these fixtures lands under
|
|
126
|
+
Behavioural execution of these fixtures lands under the ": Build the promptfoo agent-prose AND SKILL-prose verdict eval harness" release design (promptfoo eval harness — proposed). Until the ": Build the promptfoo agent-prose AND SKILL-prose verdict eval harness" release design ships, the bats fixtures at `packages/itil/agents/test/hang-off-check.bats` are structural assertions on this agent's prose contract per the "Behavioural-tests-default for skill testing" architecture rule Surface 2 (with the "Agent-side I2 (no type-branching) coverage gap — SKILL.md type-branching invariant not behaviourally testable until skill-invocation harness lands" problem harness-gap carve-out the architect and JTBD reviewer agents document); they verify the verdict format is documented, the firewall is named, the safe-default behaviour is specified, and the fixture files exist with the expected input shape.
|
|
127
127
|
|
|
128
128
|
## Related
|
|
129
129
|
|
|
130
|
-
- **
|
|
131
|
-
- **
|
|
132
|
-
- **
|
|
133
|
-
- **
|
|
134
|
-
- **
|
|
135
|
-
- **
|
|
136
|
-
- **
|
|
137
|
-
- **
|
|
138
|
-
- **
|
|
139
|
-
- **
|
|
140
|
-
- **
|
|
141
|
-
- **
|
|
142
|
-
- **
|
|
143
|
-
- **
|
|
144
|
-
- **
|
|
130
|
+
- **the "Governance skill invocation patterns — foreground + background with deferred-question resumption" architecture rule** (Governance-skill invocation patterns) — the 5th invocation pattern (Foreground fresh-context-subagent-as-decision-arbiter) under the "`/wr-itil:review-problems` has no path to close tickets that are no longer relevant (evidence-based, NOT age-based) — structural outflow gap drives monotonic backlog growth" problem amendment 2026-05-31. This agent IS the worked example.
|
|
131
|
+
- **the "Structured User Interaction for Governance-Skill Decisions" architecture rule** (Structured user interaction for governance decisions) — Rule 6 fail-safe; you never invoke `AskUserQuestion`; ambiguous-multi-parent collapses to PROCEED_NEW under AFK propagation.
|
|
132
|
+
- **the "Agent output grounding — no fabricated quantitative estimates, cite + persist + uncertainty" architecture rule** (Agent output grounding) — your rationale MUST cite observable signals (specific ADR refs, specific file paths, specific candidate ticket section names); no qualitative claims.
|
|
133
|
+
- **the "Plugin-bundled scripts invoked from SKILL.md resolve via `bin/` on `$PATH`" architecture rule** (Plugin scripts via `bin/` on PATH) — not directly relevant; this agent is loaded via Agent tool, not PATH.
|
|
134
|
+
- **the "Behavioural-tests-default for skill testing" architecture rule** (Behavioural-tests default) — bats fixtures for this agent are structural per Surface 2 carve-out + the "Agent-side I2 (no type-branching) coverage gap — SKILL.md type-branching invariant not behaviourally testable until skill-invocation harness lands" problem harness gap; behavioural eval lands under the ": Build the promptfoo agent-prose AND SKILL-prose verdict eval harness" release design.
|
|
135
|
+
- **the ": promptfoo as the behavioural test harness for agent-prose verdicts" architecture rule** (promptfoo as agent-prose verdict harness) — future home of the behavioural fixtures.
|
|
136
|
+
- **the ": Build the promptfoo agent-prose AND SKILL-prose verdict eval harness" release design** (promptfoo retrofit, proposed) — will run the canonical behavioural fixtures.
|
|
137
|
+
- **the ": backlog flow control multi-phase" release design** (the "`/wr-itil:review-problems` has no path to close tickets that are no longer relevant (evidence-based, NOT age-based) — structural outflow gap drives monotonic backlog growth" problem backlog flow control multi-phase, proposed) — traces the "`/wr-itil:review-problems` has no path to close tickets that are no longer relevant (evidence-based, NOT age-based) — structural outflow gap drives monotonic backlog growth" problem Phases 1+2+3; this agent is part of Phase 3's deliverable.
|
|
138
|
+
- **the "`/wr-itil:review-problems` has no path to close tickets that are no longer relevant (evidence-based, NOT age-based) — structural outflow gap drives monotonic backlog growth" problem** (review-problems backlog-flow-control master ticket — `docs/problems/open/346-...md`) — driver ticket. Phase 3 spec authored in the "`/wr-itil:review-problems` has no path to close tickets that are no longer relevant (evidence-based, NOT age-based) — structural outflow gap drives monotonic backlog growth" problem's body; codified as the "Governance skill invocation patterns — foreground + background with deferred-question resumption" architecture rule's 5th pattern.
|
|
139
|
+
- **the "Phase 2 — extend `evaluate-relevance.sh` with 4 more evidence shapes + fix Phase 1 file-no-longer-exists false-positive class" problem** (closed as duplicate-of-the "`/wr-itil:review-problems` has no path to close tickets that are no longer relevant (evidence-based, NOT age-based) — structural outflow gap drives monotonic backlog growth" problem) — the wrongly-captured sibling that motivated this agent's existence; the canonical regression fixture.
|
|
140
|
+
- **the "Agent-side I2 (no type-branching) coverage gap — SKILL.md type-branching invariant not behaviourally testable until skill-invocation harness lands" problem** (agent-side I2 / harness gap) — the structural-bats Surface 2 carve-out precedent.
|
|
141
|
+
- **the ": Enforce Governance Without Slowing Down" user outcome** (Enforce Governance Without Slowing Down) — the pre-filter latency cap + verdict-acts contract keeps capture under the 60s flow budget.
|
|
142
|
+
- **the ": Progress the Backlog While I'm Away" user outcome** (Progress the Backlog While I'm Away) — verdict is deterministic, never blocks on AskUserQuestion; AFK-safe.
|
|
143
|
+
- **the "Extend the Suite with New Plugins" user outcome** (Extend the Suite with New Plugins) — the fresh-context-subagent-as-decision-arbiter pattern is reusable for future capture-time discipline needs.
|
|
144
|
+
- **the "Restore Service Fast with an Audit Trail" user outcome** (Restore Service Fast with an Audit Trail) — HANG_OFF rationale is recorded on the absorbing ticket's Investigation Tasks bullet; PROCEED_NEW rationale lands on the captured ticket's `## Related` section so the next reviewer sees what was considered.
|
|
145
145
|
- **`/wr-itil:capture-problem`** (`packages/itil/skills/capture-problem/SKILL.md` Step 2) — primary dispatch site.
|
|
146
|
-
- **`/wr-itil:manage-problem`** (`packages/itil/skills/manage-problem/SKILL.md` Step 2) — secondary dispatch site (maintainer-internal new-problem path only; plugin-user-report ingestion path skips per
|
|
146
|
+
- **`/wr-itil:manage-problem`** (`packages/itil/skills/manage-problem/SKILL.md` Step 2) — secondary dispatch site (maintainer-internal new-problem path only; plugin-user-report ingestion path skips per the "Report a Problem Without Pre-Classifying It" user outcome firewall).
|
package/bin/install.mjs
CHANGED
|
@@ -1,16 +1,34 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { execSync } from "node:child_process";
|
|
4
|
+
import { cpSync, existsSync, mkdirSync, readFileSync, rmSync } from "node:fs";
|
|
5
|
+
import { homedir } from "node:os";
|
|
6
|
+
import { resolve, dirname, join } from "node:path";
|
|
4
7
|
import { fileURLToPath } from "node:url";
|
|
5
8
|
|
|
6
9
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
7
10
|
const utils = await import(resolve(__dirname, "../lib/install-utils.mjs"));
|
|
11
|
+
const agents = await import(resolve(__dirname, "../scripts/codex-agent.mjs"));
|
|
8
12
|
|
|
9
13
|
const PLUGIN = "wr-itil";
|
|
14
|
+
const CODEX_MARKETPLACE = "windyroad-itil-local";
|
|
10
15
|
const DEPS = ["wr-risk-scorer"];
|
|
16
|
+
const PACKAGE_ROOT = resolve(__dirname, "..");
|
|
17
|
+
const PACKAGE_VERSION = JSON.parse(readFileSync(join(PACKAGE_ROOT, "package.json"), "utf8")).version;
|
|
18
|
+
|
|
19
|
+
function codexMarketplaceRoot() {
|
|
20
|
+
const home = process.env.CODEX_HOME || join(homedir(), ".codex");
|
|
21
|
+
return join(home, ".tmp", "marketplaces", `wr-itil-${PACKAGE_VERSION}`);
|
|
22
|
+
}
|
|
11
23
|
|
|
12
24
|
const flags = utils.parseStandardArgs(process.argv);
|
|
13
25
|
|
|
26
|
+
if (flags.runtime === "codex" || flags.runtime === "both") {
|
|
27
|
+
const bundled = "/Applications/ChatGPT.app/Contents/Resources/codex";
|
|
28
|
+
const binary = process.env.CODEX_BINARY || (existsSync(bundled) ? bundled : null);
|
|
29
|
+
if (binary?.includes("/")) process.env.PATH = `${dirname(binary)}:${process.env.PATH || ""}`;
|
|
30
|
+
}
|
|
31
|
+
|
|
14
32
|
if (flags.help) {
|
|
15
33
|
console.log(`
|
|
16
34
|
Usage: npx @windyroad/itil [options]
|
|
@@ -21,6 +39,7 @@ Options:
|
|
|
21
39
|
--update Update this plugin and its skills
|
|
22
40
|
--uninstall Remove this plugin
|
|
23
41
|
--scope Installation scope: project (default) or user
|
|
42
|
+
--runtime Runtime to install for: claude (default), codex, or both
|
|
24
43
|
--dry-run Show what would be done without executing
|
|
25
44
|
--help, -h Show this help
|
|
26
45
|
`);
|
|
@@ -32,12 +51,59 @@ if (flags.dryRun) {
|
|
|
32
51
|
console.log("[dry-run mode — no commands will be executed]\n");
|
|
33
52
|
}
|
|
34
53
|
|
|
35
|
-
utils.checkPrerequisites();
|
|
54
|
+
utils.checkPrerequisites({ runtime: flags.runtime });
|
|
55
|
+
|
|
56
|
+
function warnMissingCodexDependency() {
|
|
57
|
+
if (flags.dryRun) return;
|
|
58
|
+
try {
|
|
59
|
+
const installed = execSync("codex plugin list", { encoding: "utf8" });
|
|
60
|
+
if (!installed.includes("wr-risk-scorer@")) {
|
|
61
|
+
console.warn("Warning: wr-itil requires wr-risk-scorer; install @windyroad/risk-scorer for Codex.");
|
|
62
|
+
}
|
|
63
|
+
} catch {
|
|
64
|
+
console.warn("Warning: could not verify the wr-risk-scorer Codex dependency.");
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function codexInstall() {
|
|
69
|
+
const root = codexMarketplaceRoot();
|
|
70
|
+
if (!flags.dryRun) {
|
|
71
|
+
rmSync(root, { recursive: true, force: true });
|
|
72
|
+
mkdirSync(dirname(root), { recursive: true });
|
|
73
|
+
cpSync(PACKAGE_ROOT, root, { recursive: true });
|
|
74
|
+
cpSync(join(root, "hooks-codex", "hooks.json"), join(root, "hooks", "hooks.json"));
|
|
75
|
+
}
|
|
76
|
+
if (!utils.run(`codex plugin marketplace add ${JSON.stringify(root)}`, `Codex marketplace: ${CODEX_MARKETPLACE}`)) return false;
|
|
77
|
+
if (!utils.run(`codex plugin add ${PLUGIN}@${CODEX_MARKETPLACE}`, PLUGIN)) return false;
|
|
78
|
+
if (!flags.dryRun) agents.installAgent(agents.agentDir(flags.scope));
|
|
79
|
+
warnMissingCodexDependency();
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function codexUninstall() {
|
|
84
|
+
const removed = utils.run(`codex plugin remove ${PLUGIN}@${CODEX_MARKETPLACE}`, `Removing ${PLUGIN}`);
|
|
85
|
+
utils.run(`codex plugin marketplace remove ${CODEX_MARKETPLACE}`, `Removing ${CODEX_MARKETPLACE}`);
|
|
86
|
+
if (!flags.dryRun) {
|
|
87
|
+
for (const target of new Set([agents.agentDir(flags.scope), agents.agentDir("user")])) agents.uninstallAgent(target);
|
|
88
|
+
rmSync(codexMarketplaceRoot(), { recursive: true, force: true });
|
|
89
|
+
}
|
|
90
|
+
return removed;
|
|
91
|
+
}
|
|
36
92
|
|
|
37
93
|
if (flags.uninstall) {
|
|
38
|
-
utils.uninstallPackage(PLUGIN);
|
|
94
|
+
if (flags.runtime === "claude" || flags.runtime === "both") utils.uninstallPackage(PLUGIN, { runtime: "claude" });
|
|
95
|
+
if ((flags.runtime === "codex" || flags.runtime === "both") && !codexUninstall()) process.exit(1);
|
|
39
96
|
} else if (flags.update) {
|
|
40
|
-
utils.updatePackage(PLUGIN, { scope: flags.scope });
|
|
97
|
+
if (flags.runtime === "claude" || flags.runtime === "both") utils.updatePackage(PLUGIN, { scope: flags.scope, runtime: "claude" });
|
|
98
|
+
if ((flags.runtime === "codex" || flags.runtime === "both") && !codexInstall()) process.exit(1);
|
|
99
|
+
} else if (flags.runtime === "codex") {
|
|
100
|
+
console.log(`\nInstalling @windyroad/itil (${flags.scope} scope)...\n`);
|
|
101
|
+
if (!codexInstall()) process.exit(1);
|
|
102
|
+
console.log("\nDone! Restart Codex to activate.\n");
|
|
103
|
+
} else if (flags.runtime === "both") {
|
|
104
|
+
utils.installPackage(PLUGIN, { deps: DEPS, scope: flags.scope, runtime: "claude" });
|
|
105
|
+
if (!codexInstall()) process.exit(1);
|
|
106
|
+
console.log("\nDone! Restart Claude Code and Codex to activate.\n");
|
|
41
107
|
} else {
|
|
42
|
-
utils.installPackage(PLUGIN, { deps: DEPS, scope: flags.scope });
|
|
108
|
+
utils.installPackage(PLUGIN, { deps: DEPS, scope: flags.scope, runtime: "claude" });
|
|
43
109
|
}
|
package/bin/wr-itil-catchup-scan
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
# shim files in packages/*/bin/wr-* directly; edit the template + run
|
|
5
5
|
# `npm run sync:shim-wrappers` to regenerate.
|
|
6
6
|
#
|
|
7
|
-
# Resolution (
|
|
7
|
+
# Resolution (highest-version-wins-shim-wrapper-for-plugin-scaffold-template-shims-architecture-rule):
|
|
8
8
|
# 1. If the wrapper's parent dir is semver-shaped, treat as installed-
|
|
9
9
|
# cache execution and resolve to the highest-version sibling's
|
|
10
10
|
# scripts/ entry below.
|
|
@@ -15,9 +15,9 @@
|
|
|
15
15
|
# 3. If the cache parent contains zero semver-shaped siblings, exit
|
|
16
16
|
# 127 with a stderr message naming the cache parent (per SQ-080-2).
|
|
17
17
|
#
|
|
18
|
-
# @adr
|
|
19
|
-
# @adr
|
|
20
|
-
# @problem
|
|
18
|
+
# @adr highest-version-wins-shim-wrapper-for-plugin-scaffold-template-shims-architecture-rule (highest-version-wins shim wrapper plugin scaffold)
|
|
19
|
+
# @adr plugin-bundled-scripts-invoked-from-skill-md-resolve-via-bin-on-path-architecture-rule (plugin-bundled scripts resolve via bin/ on $PATH — amended)
|
|
20
|
+
# @problem 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 (mid-session staleness window)
|
|
21
21
|
|
|
22
22
|
set -euo pipefail
|
|
23
23
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
# shim files in packages/*/bin/wr-* directly; edit the template + run
|
|
5
5
|
# `npm run sync:shim-wrappers` to regenerate.
|
|
6
6
|
#
|
|
7
|
-
# Resolution (
|
|
7
|
+
# Resolution (highest-version-wins-shim-wrapper-for-plugin-scaffold-template-shims-architecture-rule):
|
|
8
8
|
# 1. If the wrapper's parent dir is semver-shaped, treat as installed-
|
|
9
9
|
# cache execution and resolve to the highest-version sibling's
|
|
10
10
|
# scripts/ entry below.
|
|
@@ -15,9 +15,9 @@
|
|
|
15
15
|
# 3. If the cache parent contains zero semver-shaped siblings, exit
|
|
16
16
|
# 127 with a stderr message naming the cache parent (per SQ-080-2).
|
|
17
17
|
#
|
|
18
|
-
# @adr
|
|
19
|
-
# @adr
|
|
20
|
-
# @problem
|
|
18
|
+
# @adr highest-version-wins-shim-wrapper-for-plugin-scaffold-template-shims-architecture-rule (highest-version-wins shim wrapper plugin scaffold)
|
|
19
|
+
# @adr plugin-bundled-scripts-invoked-from-skill-md-resolve-via-bin-on-path-architecture-rule (plugin-bundled scripts resolve via bin/ on $PATH — amended)
|
|
20
|
+
# @problem 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 (mid-session staleness window)
|
|
21
21
|
|
|
22
22
|
set -euo pipefail
|
|
23
23
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
# shim files in packages/*/bin/wr-* directly; edit the template + run
|
|
5
5
|
# `npm run sync:shim-wrappers` to regenerate.
|
|
6
6
|
#
|
|
7
|
-
# Resolution (
|
|
7
|
+
# Resolution (highest-version-wins-shim-wrapper-for-plugin-scaffold-template-shims-architecture-rule):
|
|
8
8
|
# 1. If the wrapper's parent dir is semver-shaped, treat as installed-
|
|
9
9
|
# cache execution and resolve to the highest-version sibling's
|
|
10
10
|
# scripts/ entry below.
|
|
@@ -15,9 +15,9 @@
|
|
|
15
15
|
# 3. If the cache parent contains zero semver-shaped siblings, exit
|
|
16
16
|
# 127 with a stderr message naming the cache parent (per SQ-080-2).
|
|
17
17
|
#
|
|
18
|
-
# @adr
|
|
19
|
-
# @adr
|
|
20
|
-
# @problem
|
|
18
|
+
# @adr highest-version-wins-shim-wrapper-for-plugin-scaffold-template-shims-architecture-rule (highest-version-wins shim wrapper plugin scaffold)
|
|
19
|
+
# @adr plugin-bundled-scripts-invoked-from-skill-md-resolve-via-bin-on-path-architecture-rule (plugin-bundled scripts resolve via bin/ on $PATH — amended)
|
|
20
|
+
# @problem 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 (mid-session staleness window)
|
|
21
21
|
|
|
22
22
|
set -euo pipefail
|
|
23
23
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
# shim files in packages/*/bin/wr-* directly; edit the template + run
|
|
5
5
|
# `npm run sync:shim-wrappers` to regenerate.
|
|
6
6
|
#
|
|
7
|
-
# Resolution (
|
|
7
|
+
# Resolution (highest-version-wins-shim-wrapper-for-plugin-scaffold-template-shims-architecture-rule):
|
|
8
8
|
# 1. If the wrapper's parent dir is semver-shaped, treat as installed-
|
|
9
9
|
# cache execution and resolve to the highest-version sibling's
|
|
10
10
|
# scripts/ entry below.
|
|
@@ -15,9 +15,9 @@
|
|
|
15
15
|
# 3. If the cache parent contains zero semver-shaped siblings, exit
|
|
16
16
|
# 127 with a stderr message naming the cache parent (per SQ-080-2).
|
|
17
17
|
#
|
|
18
|
-
# @adr
|
|
19
|
-
# @adr
|
|
20
|
-
# @problem
|
|
18
|
+
# @adr highest-version-wins-shim-wrapper-for-plugin-scaffold-template-shims-architecture-rule (highest-version-wins shim wrapper plugin scaffold)
|
|
19
|
+
# @adr plugin-bundled-scripts-invoked-from-skill-md-resolve-via-bin-on-path-architecture-rule (plugin-bundled scripts resolve via bin/ on $PATH — amended)
|
|
20
|
+
# @problem 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 (mid-session staleness window)
|
|
21
21
|
|
|
22
22
|
set -euo pipefail
|
|
23
23
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
# shim files in packages/*/bin/wr-* directly; edit the template + run
|
|
5
5
|
# `npm run sync:shim-wrappers` to regenerate.
|
|
6
6
|
#
|
|
7
|
-
# Resolution (
|
|
7
|
+
# Resolution (highest-version-wins-shim-wrapper-for-plugin-scaffold-template-shims-architecture-rule):
|
|
8
8
|
# 1. If the wrapper's parent dir is semver-shaped, treat as installed-
|
|
9
9
|
# cache execution and resolve to the highest-version sibling's
|
|
10
10
|
# scripts/ entry below.
|
|
@@ -15,9 +15,9 @@
|
|
|
15
15
|
# 3. If the cache parent contains zero semver-shaped siblings, exit
|
|
16
16
|
# 127 with a stderr message naming the cache parent (per SQ-080-2).
|
|
17
17
|
#
|
|
18
|
-
# @adr
|
|
19
|
-
# @adr
|
|
20
|
-
# @problem
|
|
18
|
+
# @adr highest-version-wins-shim-wrapper-for-plugin-scaffold-template-shims-architecture-rule (highest-version-wins shim wrapper plugin scaffold)
|
|
19
|
+
# @adr plugin-bundled-scripts-invoked-from-skill-md-resolve-via-bin-on-path-architecture-rule (plugin-bundled scripts resolve via bin/ on $PATH — amended)
|
|
20
|
+
# @problem 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 (mid-session staleness window)
|
|
21
21
|
|
|
22
22
|
set -euo pipefail
|
|
23
23
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
# shim files in packages/*/bin/wr-* directly; edit the template + run
|
|
5
5
|
# `npm run sync:shim-wrappers` to regenerate.
|
|
6
6
|
#
|
|
7
|
-
# Resolution (
|
|
7
|
+
# Resolution (highest-version-wins-shim-wrapper-for-plugin-scaffold-template-shims-architecture-rule):
|
|
8
8
|
# 1. If the wrapper's parent dir is semver-shaped, treat as installed-
|
|
9
9
|
# cache execution and resolve to the highest-version sibling's
|
|
10
10
|
# scripts/ entry below.
|
|
@@ -15,9 +15,9 @@
|
|
|
15
15
|
# 3. If the cache parent contains zero semver-shaped siblings, exit
|
|
16
16
|
# 127 with a stderr message naming the cache parent (per SQ-080-2).
|
|
17
17
|
#
|
|
18
|
-
# @adr
|
|
19
|
-
# @adr
|
|
20
|
-
# @problem
|
|
18
|
+
# @adr highest-version-wins-shim-wrapper-for-plugin-scaffold-template-shims-architecture-rule (highest-version-wins shim wrapper plugin scaffold)
|
|
19
|
+
# @adr plugin-bundled-scripts-invoked-from-skill-md-resolve-via-bin-on-path-architecture-rule (plugin-bundled scripts resolve via bin/ on $PATH — amended)
|
|
20
|
+
# @problem 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 (mid-session staleness window)
|
|
21
21
|
|
|
22
22
|
set -euo pipefail
|
|
23
23
|
|