@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
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
# packages/itil/scripts/plugin-maturity-populate.sh
|
|
3
3
|
#
|
|
4
|
-
# Phase 3a (
|
|
4
|
+
# Phase 3a (problem-087-no-maturity-battle-hardening-signal-on-plugins-skills-agents-or-hooks-readmes-don-t-tell-users-which-features-are-stable-vs-experimental-problem) plugin-maturity population script.
|
|
5
5
|
#
|
|
6
6
|
# Reads two Phase 2 NDJSON streams — `wr-itil-skill-invocations` output
|
|
7
7
|
# (transcript-axis) + `wr-itil-plugin-exercise-index` output (git-axis) —
|
|
8
|
-
# applies
|
|
8
|
+
# applies windyroad-plugin-skill-agent-hook-maturity-taxonomy-architecture-rule §promotion criteria + §Bootstrapping clause, and writes
|
|
9
9
|
# the `maturity:` field per surface and per plugin root into each
|
|
10
10
|
# `packages/<plugin>/.claude-plugin/plugin.json`. Idempotent: re-running
|
|
11
11
|
# with unchanged inputs and a pinned `--now=` produces byte-identical
|
|
12
12
|
# plugin.json output.
|
|
13
13
|
#
|
|
14
|
-
# Plugin.json schema extension (
|
|
14
|
+
# Plugin.json schema extension (windyroad-plugin-maturity-presentation-layer-plugin-json-schema-prose-woven-readme-badge-in-suite-wr-itil-plugin-maturity-list-display-shim-architecture-rule §plugin.json field schema):
|
|
15
15
|
# {
|
|
16
16
|
# "name": "wr-<plugin>",
|
|
17
17
|
# "version": "...",
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
# (`packages/<bare-name>/`) and accepts bare-form NDJSON input — no
|
|
57
57
|
# plugin.json `name`-matching required.
|
|
58
58
|
#
|
|
59
|
-
# Bootstrapping clause (
|
|
59
|
+
# Bootstrapping clause (windyroad-plugin-skill-agent-hook-maturity-taxonomy-architecture-rule §Bootstrapping clause):
|
|
60
60
|
# Active iff `max(days_shipped across plugins) < 60`. Sunset auto-
|
|
61
61
|
# derives from the data (architect §D — no hard-coded calendar date).
|
|
62
62
|
# Under bootstrapping: default = Experimental; provisional Alpha iff
|
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
# stay Experimental during bootstrapping — provisional-Alpha rule
|
|
65
65
|
# requires a numeric invocation count.
|
|
66
66
|
#
|
|
67
|
-
# Steady-state thresholds (
|
|
67
|
+
# Steady-state thresholds (windyroad-plugin-skill-agent-hook-maturity-taxonomy-architecture-rule §promotion criteria, post-sunset):
|
|
68
68
|
# Experimental: days <14 OR invocations <10 OR tickets <3
|
|
69
69
|
# Alpha: days 14–60 AND inv 10–100 AND tickets 3–10
|
|
70
70
|
# Beta: days ≥60 AND inv ≥100 AND tickets ≥10 AND breaking ≥30
|
|
@@ -72,11 +72,11 @@
|
|
|
72
72
|
# Stable: days ≥180 AND inv ≥1000 AND breaking ≥90 (or null)
|
|
73
73
|
# Deprecated: author-declared; preserved across re-runs.
|
|
74
74
|
#
|
|
75
|
-
#
|
|
75
|
+
# decision-delegation-contract-when-agents-act-on-the-framework-vs-ask-the-user-architecture-rule silent-framework carve-out (scope-limited per windyroad-plugin-maturity-presentation-layer-plugin-json-schema-prose-woven-readme-badge-in-suite-wr-itil-plugin-maturity-list-display-shim-architecture-rule §scope):
|
|
76
76
|
# Band recomputation is mechanical, policy-resolved. No `AskUserQuestion`
|
|
77
77
|
# per band recompute. The carve-out does NOT cover author-declared
|
|
78
78
|
# Deprecated assignment, `supersededBy:` authoring, or Phase 4+ gate
|
|
79
|
-
# threshold tuning — those remain AskUserQuestion-eligible per
|
|
79
|
+
# threshold tuning — those remain AskUserQuestion-eligible per structured-user-interaction-for-governance-skill-decisions-architecture-rule
|
|
80
80
|
# Rule 1.
|
|
81
81
|
#
|
|
82
82
|
# Usage:
|
|
@@ -88,29 +88,29 @@
|
|
|
88
88
|
# [--dry-run] # print diff to stdout, do not write
|
|
89
89
|
#
|
|
90
90
|
# Exit codes:
|
|
91
|
-
# 0 = always —
|
|
91
|
+
# 0 = always — structured-user-interaction-for-governance-skill-decisions-architecture-rule Rule 6 fail-safe. Missing NDJSON inputs / no
|
|
92
92
|
# packages/ / opt-out marker all hit the no-write stderr-
|
|
93
93
|
# comment path.
|
|
94
94
|
#
|
|
95
|
-
# Privacy (
|
|
95
|
+
# Privacy (centralised-review-reports-for-cross-project-skill-improvement-jsonl-at-claude-review-reports-architecture-rule clauses adopted verbatim):
|
|
96
96
|
# - Opt-out marker `.claude/.skill-metrics-opt-out` disables writes.
|
|
97
97
|
# - No network egress — the script body invokes no exfiltration
|
|
98
98
|
# primitives. Negative-grep enforcement lives in the bats fixture.
|
|
99
99
|
#
|
|
100
|
-
# @problem
|
|
101
|
-
# @problem
|
|
102
|
-
# @adr
|
|
103
|
-
# @adr
|
|
100
|
+
# @problem phase-3a-wr-itil-plugin-maturity-populate-writes-plugin-json-maturity-field-from-phase-2-ndjson-problem (Phase 3a — population script)
|
|
101
|
+
# @problem problem-087-no-maturity-battle-hardening-signal-on-plugins-skills-agents-or-hooks-readmes-don-t-tell-users-which-features-are-stable-vs-experimental-problem (parent — no maturity signal on plugin features)
|
|
102
|
+
# @adr windyroad-plugin-maturity-presentation-layer-plugin-json-schema-prose-woven-readme-badge-in-suite-wr-itil-plugin-maturity-list-display-shim-architecture-rule (Plugin maturity presentation layer — Phase 3a contract)
|
|
103
|
+
# @adr windyroad-plugin-skill-agent-hook-maturity-taxonomy-architecture-rule (Plugin maturity taxonomy — promotion criteria +
|
|
104
104
|
# Bootstrapping clause)
|
|
105
|
-
# @adr
|
|
106
|
-
# @adr
|
|
107
|
-
# @adr
|
|
108
|
-
# @adr
|
|
109
|
-
# @adr
|
|
110
|
-
# @adr
|
|
111
|
-
# @jtbd
|
|
105
|
+
# @adr windyroad-plugin-maturity-measurement-mechanism-session-transcript-invocation-counts-plus-commit-history-composite-read-only-ndjson-architecture-rule (Phase 2 NDJSON measurement — input shape)
|
|
106
|
+
# @adr plugin-bundled-scripts-invoked-from-skill-md-resolve-via-bin-on-path-architecture-rule (Shim grammar — `wr-itil-plugin-maturity-populate` on $PATH)
|
|
107
|
+
# @adr centralised-review-reports-for-cross-project-skill-improvement-jsonl-at-claude-review-reports-architecture-rule (Privacy posture — opt-out marker, no network primitive)
|
|
108
|
+
# @adr decision-delegation-contract-when-agents-act-on-the-framework-vs-ask-the-user-architecture-rule (Decision delegation — silent-framework carve-out)
|
|
109
|
+
# @adr behavioural-tests-default-for-skill-testing-architecture-rule (Behavioural tests default)
|
|
110
|
+
# @adr structured-user-interaction-for-governance-skill-decisions-architecture-rule Rule 6 (non-interactive fail-safe — exit 0 always)
|
|
111
|
+
# @jtbd restore-service-fast-with-an-audit-trail-user-outcome (Restore Service Fast — rich-record evidence block IS the
|
|
112
112
|
# durable audit-trail surface at the canonical record)
|
|
113
|
-
# @jtbd
|
|
113
|
+
# @jtbd extend-the-suite-with-new-plugins-user-outcome (Extend the Suite — band-derivation persists Phase 2
|
|
114
114
|
# transient NDJSON signal as durable plugin.json field)
|
|
115
115
|
|
|
116
116
|
set -uo pipefail
|
|
@@ -140,7 +140,7 @@ for arg in "$@"; do
|
|
|
140
140
|
esac
|
|
141
141
|
done
|
|
142
142
|
|
|
143
|
-
# ── Opt-out marker check (
|
|
143
|
+
# ── Opt-out marker check (centralised-review-reports-for-cross-project-skill-improvement-jsonl-at-claude-review-reports-architecture-rule / windyroad-plugin-maturity-measurement-mechanism-session-transcript-invocation-counts-plus-commit-history-composite-read-only-ndjson-architecture-rule §Privacy posture) ───────────────
|
|
144
144
|
|
|
145
145
|
OPT_OUT_MARKER="${PROJECT_ROOT}/.claude/.skill-metrics-opt-out"
|
|
146
146
|
if [ -e "$OPT_OUT_MARKER" ]; then
|
|
@@ -148,7 +148,7 @@ if [ -e "$OPT_OUT_MARKER" ]; then
|
|
|
148
148
|
exit 0
|
|
149
149
|
fi
|
|
150
150
|
|
|
151
|
-
# ── packages/ discovery check (
|
|
151
|
+
# ── packages/ discovery check (structured-user-interaction-for-governance-skill-decisions-architecture-rule Rule 6 fail-safe) ────────────────────
|
|
152
152
|
|
|
153
153
|
if [ ! -d "${PROJECT_ROOT}/packages" ]; then
|
|
154
154
|
echo "# wr-itil-plugin-maturity-populate: no packages/ directory at ${PROJECT_ROOT}" >&2
|
|
@@ -287,16 +287,16 @@ def discover_surfaces(pkg_dir):
|
|
|
287
287
|
out["command"] = sorted(f.stem for f in commands_dir.glob("*.md") if f.is_file())
|
|
288
288
|
return out
|
|
289
289
|
|
|
290
|
-
# ── Band-mapping (
|
|
290
|
+
# ── Band-mapping (windyroad-plugin-skill-agent-hook-maturity-taxonomy-architecture-rule §promotion criteria + §Bootstrapping clause) ─────
|
|
291
291
|
|
|
292
|
-
# Band ordering, worst-first. "Deprecated" is an overlay axis (
|
|
292
|
+
# Band ordering, worst-first. "Deprecated" is an overlay axis (windyroad-plugin-skill-agent-hook-maturity-taxonomy-architecture-rule
|
|
293
293
|
# §granularity contract line 109) — elided from the rollup computation but
|
|
294
294
|
# retained on individual surface entries. Worst-case rollup compares only
|
|
295
295
|
# {Experimental, Alpha, Beta, Stable}.
|
|
296
296
|
BAND_ORDER = ["Experimental", "Alpha", "Beta", "Stable"]
|
|
297
297
|
|
|
298
298
|
def compute_band(evidence):
|
|
299
|
-
"""Map a per-surface evidence record -> band per
|
|
299
|
+
"""Map a per-surface evidence record -> band per windyroad-plugin-skill-agent-hook-maturity-taxonomy-architecture-rule.
|
|
300
300
|
|
|
301
301
|
- During bootstrapping (suite-oldest < 60d): default Experimental;
|
|
302
302
|
provisional Alpha iff invocations_30d >= 100 AND days_shipped >= 14.
|
|
@@ -310,7 +310,7 @@ def compute_band(evidence):
|
|
|
310
310
|
breaking = evidence.get("breaking_change_age_days") # None or int
|
|
311
311
|
|
|
312
312
|
if bootstrapping_active:
|
|
313
|
-
# Provisional Alpha rule (
|
|
313
|
+
# Provisional Alpha rule (windyroad-plugin-skill-agent-hook-maturity-taxonomy-architecture-rule §Bootstrapping clause line 86).
|
|
314
314
|
if isinstance(inv, int) and inv >= 100 and days >= 14:
|
|
315
315
|
return "Alpha"
|
|
316
316
|
return "Experimental"
|
|
@@ -359,12 +359,12 @@ def lookup_invocations(plugin_bare, kind, name):
|
|
|
359
359
|
|
|
360
360
|
def build_surface_record(existing, kind, plugin_bare, name, evidence):
|
|
361
361
|
"""Construct the new maturity record for a surface, respecting the
|
|
362
|
-
Deprecated-overlay invariant (architect §I +
|
|
362
|
+
Deprecated-overlay invariant (architect §I + windyroad-plugin-skill-agent-hook-maturity-taxonomy-architecture-rule #6 / #102):
|
|
363
363
|
if existing band is Deprecated, return existing record VERBATIM —
|
|
364
364
|
do NOT recompute, do NOT update computed_at, do NOT overwrite
|
|
365
365
|
supersededBy. All other records get a fresh recompute.
|
|
366
366
|
|
|
367
|
-
Under
|
|
367
|
+
Under windyroad-plugin-maturity-presentation-layer-plugin-json-schema-prose-woven-readme-badge-in-suite-wr-itil-plugin-maturity-list-display-shim-architecture-rule Amendment 2026-05-18 (P0 hotfix), `existing` IS the
|
|
368
368
|
maturity record directly (no inner `.maturity` envelope) when read
|
|
369
369
|
from the new nested location `plugin_doc["maturity"][<kind>][<name>]`.
|
|
370
370
|
"""
|
|
@@ -413,12 +413,12 @@ for pkg_dir in plugin_dirs:
|
|
|
413
413
|
# (NOT top-level — Claude Code's plugin manifest validator rejects
|
|
414
414
|
# top-level `hooks:` / `skills:` / `agents:` / `commands:` keys with
|
|
415
415
|
# `Validation errors: hooks: Invalid input, skills: Invalid input` when
|
|
416
|
-
# they carry maturity-only records). Per
|
|
416
|
+
# they carry maturity-only records). Per windyroad-plugin-maturity-presentation-layer-plugin-json-schema-prose-woven-readme-badge-in-suite-wr-itil-plugin-maturity-list-display-shim-architecture-rule Amendment 2026-05-18
|
|
417
417
|
# (P0 hotfix). Schema version bumps to "2.0" because the path move is
|
|
418
|
-
# NOT additive per
|
|
418
|
+
# NOT additive per windyroad-plugin-maturity-measurement-mechanism-session-transcript-invocation-counts-plus-commit-history-composite-read-only-ndjson-architecture-rule §Confirmation #8.
|
|
419
419
|
kind_to_key = {"skill": "skills", "agent": "agents", "hook": "hooks", "command": "commands"}
|
|
420
420
|
surface_bands_for_rollup = []
|
|
421
|
-
#
|
|
421
|
+
# amend-plugin-maturity-populate-sh-to-write-rollup-invocations-30d-on-plugin-root-rollup-for-compound-rendering-problem: collect per-surface invocations_30d across the populate pass so
|
|
422
422
|
# the rollup can carry the sum. Non-null integers participate in the sum;
|
|
423
423
|
# nulls (hook sentinel — architect §C) are excluded. All-null surface
|
|
424
424
|
# set yields a null rollup_invocations_30d to preserve the "not
|
|
@@ -461,21 +461,21 @@ for pkg_dir in plugin_dirs:
|
|
|
461
461
|
new_maturity_kinds[key] = new_map
|
|
462
462
|
wrote_records += len(new_map)
|
|
463
463
|
|
|
464
|
-
# Plugin root rollup.
|
|
464
|
+
# Plugin root rollup. windyroad-plugin-maturity-presentation-layer-plugin-json-schema-prose-woven-readme-badge-in-suite-wr-itil-plugin-maturity-list-display-shim-architecture-rule Amendment 2026-05-18: per-kind surface
|
|
465
465
|
# maps nest UNDER `maturity:` alongside `schema_version` + `band`, not
|
|
466
466
|
# at top level. Write-ordering fix (architect issue 2 line 441): build
|
|
467
467
|
# the entire `maturity:` dict in a single assignment so the rollup
|
|
468
468
|
# write does not clobber the per-kind nested maps.
|
|
469
469
|
#
|
|
470
|
-
#
|
|
470
|
+
# windyroad-plugin-maturity-presentation-layer-plugin-json-schema-prose-woven-readme-badge-in-suite-wr-itil-plugin-maturity-list-display-shim-architecture-rule Amendment 2026-05-18 (amend-plugin-maturity-populate-sh-to-write-rollup-invocations-30d-on-plugin-root-rollup-for-compound-rendering-problem — rollup compound-evidence write):
|
|
471
471
|
# rollup additionally carries `rollup_invocations_30d` + `bootstrapping`
|
|
472
472
|
# so the Phase 3b renderer's AND-gated compound predicate
|
|
473
473
|
# (plugin-maturity-render.sh:146) can fire the
|
|
474
474
|
# `*Maturity: <Band> (suite-bootstrap window; <N> invocations / 30d).*`
|
|
475
475
|
# form during the bootstrapping window. Without these two fields the
|
|
476
|
-
# renderer falls through to bare-band, violating
|
|
476
|
+
# renderer falls through to bare-band, violating windyroad-plugin-skill-agent-hook-maturity-taxonomy-architecture-rule §Bootstrapping
|
|
477
477
|
# clause Phase 3 rendering requirement (line 88). Additive-within-2.0
|
|
478
|
-
# per
|
|
478
|
+
# per windyroad-plugin-maturity-measurement-mechanism-session-transcript-invocation-counts-plus-commit-history-composite-read-only-ndjson-architecture-rule §Confirmation #8 — old consumers reading
|
|
479
479
|
# `{schema_version, band}` continue to work; new consumers get the
|
|
480
480
|
# additional fields where present.
|
|
481
481
|
rollup = rollup_band(surface_bands_for_rollup)
|
|
@@ -495,7 +495,7 @@ for pkg_dir in plugin_dirs:
|
|
|
495
495
|
plugin_doc["maturity"] = maturity_doc
|
|
496
496
|
else:
|
|
497
497
|
# Plugin with no shipped surfaces -> no plugin-level maturity field
|
|
498
|
-
# (
|
|
498
|
+
# (windyroad-plugin-skill-agent-hook-maturity-taxonomy-architecture-rule §granularity contract line 110).
|
|
499
499
|
plugin_doc.pop("maturity", None)
|
|
500
500
|
|
|
501
501
|
# Defensive cleanup: strip any legacy top-level keys left over from the
|
|
@@ -527,7 +527,7 @@ for pkg_dir in plugin_dirs:
|
|
|
527
527
|
else:
|
|
528
528
|
plugin_json_path.write_text(new_text, encoding="utf-8")
|
|
529
529
|
|
|
530
|
-
# ── Operator-facing freshness summary on stderr (
|
|
530
|
+
# ── Operator-facing freshness summary on stderr (keep-plugins-current-across-projects-user-outcome currency aid) ────
|
|
531
531
|
# Non-load-bearing; cheap operator-comfort signal per JTBD review §4.
|
|
532
532
|
|
|
533
533
|
print(
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
# packages/itil/scripts/plugin-maturity-render.sh
|
|
3
3
|
#
|
|
4
|
-
# Phase 3b (
|
|
4
|
+
# Phase 3b (problem-087-no-maturity-battle-hardening-signal-on-plugins-skills-agents-or-hooks-readmes-don-t-tell-users-which-features-are-stable-vs-experimental-problem / phase-3b-readme-badge-renderer-wr-itil-plugin-maturity-render-advisory-drift-detector-check-plugin-maturity-drift-sh-problem) plugin-maturity README renderer.
|
|
5
5
|
#
|
|
6
6
|
# Reads each `packages/<plugin>/.claude-plugin/plugin.json` `maturity:`
|
|
7
7
|
# field (populated by Phase 3a `wr-itil-plugin-maturity-populate`) and
|
|
@@ -12,19 +12,19 @@
|
|
|
12
12
|
# Post-bootstrap: `*Maturity: <Band>.*`
|
|
13
13
|
# Bootstrapping window: `*Maturity: <Band> (suite-bootstrap window;
|
|
14
14
|
# <N> invocations / 30d).*`
|
|
15
|
-
# Markdown text only — no shields.io URL, no inline SVG (
|
|
15
|
+
# Markdown text only — no shields.io URL, no inline SVG (windyroad-plugin-maturity-presentation-layer-plugin-json-schema-prose-woven-readme-badge-in-suite-wr-itil-plugin-maturity-list-display-shim-architecture-rule
|
|
16
16
|
# §README badge rendering format).
|
|
17
17
|
#
|
|
18
18
|
# 2. Per-skill `Maturity` column populated in the existing `## Skills`
|
|
19
19
|
# table. Cell value is band name only (no compound — compound stays
|
|
20
|
-
# at the rollup per
|
|
20
|
+
# at the rollup per windyroad-plugin-maturity-presentation-layer-plugin-json-schema-prose-woven-readme-badge-in-suite-wr-itil-plugin-maturity-list-display-shim-architecture-rule). Adds the column header on first run;
|
|
21
21
|
# replaces cell values on subsequent runs.
|
|
22
22
|
#
|
|
23
23
|
# Idempotent: re-running with unchanged plugin.json + README produces
|
|
24
24
|
# byte-identical README output. Replaces existing `*Maturity: ...*` span
|
|
25
25
|
# rather than appending.
|
|
26
26
|
#
|
|
27
|
-
# Anti-patterns enforced (
|
|
27
|
+
# Anti-patterns enforced (windyroad-plugin-maturity-presentation-layer-plugin-json-schema-prose-woven-readme-badge-in-suite-wr-itil-plugin-maturity-list-display-shim-architecture-rule §Decision Outcome §"README badge
|
|
28
28
|
# rendering format" + §"Bootstrapping clause rendering"):
|
|
29
29
|
# - NEVER emit a standalone `## Maturity` section
|
|
30
30
|
# - NEVER emit a header block immediately after H1 before any prose
|
|
@@ -32,8 +32,8 @@
|
|
|
32
32
|
# - Compound rendering stays at rollup only — per-skill cell carries
|
|
33
33
|
# band name only
|
|
34
34
|
#
|
|
35
|
-
#
|
|
36
|
-
# Phase 3a per
|
|
35
|
+
# decision-delegation-contract-when-agents-act-on-the-framework-vs-ask-the-user-architecture-rule silent-framework carve-out: band has already been computed by
|
|
36
|
+
# Phase 3a per windyroad-plugin-skill-agent-hook-maturity-taxonomy-architecture-rule §promotion criteria; the renderer is mechanical
|
|
37
37
|
# and never invokes AskUserQuestion.
|
|
38
38
|
#
|
|
39
39
|
# Usage:
|
|
@@ -42,28 +42,28 @@
|
|
|
42
42
|
# [--dry-run] # print diff to stdout, do not write
|
|
43
43
|
#
|
|
44
44
|
# Exit codes:
|
|
45
|
-
# 0 = always —
|
|
45
|
+
# 0 = always — structured-user-interaction-for-governance-skill-decisions-architecture-rule Rule 6 fail-safe. Missing packages/ / opt-out
|
|
46
46
|
# marker / missing plugin.json / missing README / missing
|
|
47
47
|
# maturity field all hit no-write stderr-comment paths.
|
|
48
48
|
#
|
|
49
|
-
# Privacy (
|
|
49
|
+
# Privacy (centralised-review-reports-for-cross-project-skill-improvement-jsonl-at-claude-review-reports-architecture-rule clauses adopted verbatim):
|
|
50
50
|
# - Opt-out marker `.claude/.skill-metrics-opt-out` disables writes.
|
|
51
51
|
# - No network egress — script body invokes no exfiltration primitive.
|
|
52
52
|
#
|
|
53
|
-
# @problem
|
|
54
|
-
# @problem
|
|
55
|
-
# @adr
|
|
56
|
-
# @adr
|
|
57
|
-
# @adr
|
|
58
|
-
# @adr
|
|
59
|
-
# @adr
|
|
60
|
-
# @adr
|
|
61
|
-
# @adr
|
|
62
|
-
# @adr
|
|
63
|
-
# @jtbd
|
|
53
|
+
# @problem phase-3b-readme-badge-renderer-wr-itil-plugin-maturity-render-advisory-drift-detector-check-plugin-maturity-drift-sh-problem (Phase 3b — README badge renderer + advisory drift detector)
|
|
54
|
+
# @problem problem-087-no-maturity-battle-hardening-signal-on-plugins-skills-agents-or-hooks-readmes-don-t-tell-users-which-features-are-stable-vs-experimental-problem (parent — no maturity signal on plugin features)
|
|
55
|
+
# @adr windyroad-plugin-maturity-presentation-layer-plugin-json-schema-prose-woven-readme-badge-in-suite-wr-itil-plugin-maturity-list-display-shim-architecture-rule (Plugin maturity presentation layer — Phase 3b contract)
|
|
56
|
+
# @adr windyroad-plugin-skill-agent-hook-maturity-taxonomy-architecture-rule (Plugin maturity taxonomy — Bootstrapping clause rendering)
|
|
57
|
+
# @adr windyroad-plugin-readmes-anchor-on-jtbd-job-ids-with-load-bearing-commit-hook-prose-woven-framing-architecture-rule (JTBD-anchored README — prose-weaving precedent)
|
|
58
|
+
# @adr plugin-bundled-scripts-invoked-from-skill-md-resolve-via-bin-on-path-architecture-rule (Shim grammar — `wr-itil-plugin-maturity-render` on $PATH)
|
|
59
|
+
# @adr decision-delegation-contract-when-agents-act-on-the-framework-vs-ask-the-user-architecture-rule (Decision delegation — silent-framework carve-out)
|
|
60
|
+
# @adr centralised-review-reports-for-cross-project-skill-improvement-jsonl-at-claude-review-reports-architecture-rule (Privacy posture — opt-out marker, no network primitive)
|
|
61
|
+
# @adr behavioural-tests-default-for-skill-testing-architecture-rule (Behavioural tests default)
|
|
62
|
+
# @adr structured-user-interaction-for-governance-skill-decisions-architecture-rule Rule 6 (non-interactive fail-safe — exit 0 always)
|
|
63
|
+
# @jtbd trust-that-the-readme-describes-the-plugin-i-just-installed-user-outcome (Trust That the README Describes the Plugin I Just
|
|
64
64
|
# Installed — README is the contract surface)
|
|
65
|
-
# @jtbd
|
|
66
|
-
# @jtbd
|
|
65
|
+
# @jtbd extend-the-suite-with-new-plugins-user-outcome (Extend the Suite — clear patterns include stability)
|
|
66
|
+
# @jtbd compose-only-the-guardrails-i-need-user-outcome (Compose Only the Guardrails I Need — at-a-glance
|
|
67
67
|
# stability for composition decisions)
|
|
68
68
|
|
|
69
69
|
set -uo pipefail
|
|
@@ -87,7 +87,7 @@ for arg in "$@"; do
|
|
|
87
87
|
esac
|
|
88
88
|
done
|
|
89
89
|
|
|
90
|
-
# ── Opt-out marker check (
|
|
90
|
+
# ── Opt-out marker check (centralised-review-reports-for-cross-project-skill-improvement-jsonl-at-claude-review-reports-architecture-rule) ──────────────────────────────────────────
|
|
91
91
|
|
|
92
92
|
OPT_OUT_MARKER="${PROJECT_ROOT}/.claude/.skill-metrics-opt-out"
|
|
93
93
|
if [ -e "$OPT_OUT_MARKER" ]; then
|
|
@@ -95,7 +95,7 @@ if [ -e "$OPT_OUT_MARKER" ]; then
|
|
|
95
95
|
exit 0
|
|
96
96
|
fi
|
|
97
97
|
|
|
98
|
-
# ── packages/ discovery check (
|
|
98
|
+
# ── packages/ discovery check (structured-user-interaction-for-governance-skill-decisions-architecture-rule Rule 6 fail-safe) ────────────────────
|
|
99
99
|
|
|
100
100
|
if [ ! -d "${PROJECT_ROOT}/packages" ]; then
|
|
101
101
|
echo "# wr-itil-plugin-maturity-render: no packages/ directory at ${PROJECT_ROOT}" >&2
|
|
@@ -134,10 +134,10 @@ ANTI_SECTION_RE = re.compile(r"(?m)^##\s+Maturity\s*$")
|
|
|
134
134
|
|
|
135
135
|
|
|
136
136
|
def format_rollup_badge(maturity_record):
|
|
137
|
-
"""Render the prose-woven rollup badge per
|
|
137
|
+
"""Render the prose-woven rollup badge per windyroad-plugin-maturity-presentation-layer-plugin-json-schema-prose-woven-readme-badge-in-suite-wr-itil-plugin-maturity-list-display-shim-architecture-rule.
|
|
138
138
|
|
|
139
139
|
During the suite-bootstrap window the rollup carries the compound
|
|
140
|
-
form per
|
|
140
|
+
form per windyroad-plugin-skill-agent-hook-maturity-taxonomy-architecture-rule §Bootstrapping clause rendering; post-sunset it
|
|
141
141
|
renders the band name only.
|
|
142
142
|
"""
|
|
143
143
|
band = maturity_record.get("band", "Experimental")
|
|
@@ -345,7 +345,7 @@ def render_plugin(pkg_dir):
|
|
|
345
345
|
new_text = weave_rollup_into_lead_prose(readme_text, badge)
|
|
346
346
|
|
|
347
347
|
# Build per-skill band map from the plugin.json `maturity.skills.<name>`
|
|
348
|
-
# nested location. Per
|
|
348
|
+
# nested location. Per windyroad-plugin-maturity-presentation-layer-plugin-json-schema-prose-woven-readme-badge-in-suite-wr-itil-plugin-maturity-list-display-shim-architecture-rule Amendment 2026-05-18 (P0 hotfix), per-skill
|
|
349
349
|
# maturity records nest UNDER the top-level `maturity:` key as `band` /
|
|
350
350
|
# `schema_version` / `computed_at` / `evidence` (no outer `.maturity`
|
|
351
351
|
# envelope — the nested record IS the maturity record).
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
# packages/itil/scripts/plugin-validate-ci-gate.sh
|
|
3
3
|
#
|
|
4
|
-
#
|
|
4
|
+
# ci-gate-claude-plugin-install-dry-run-per-plugin-pre-publish-confirmation-11-implementation-problem / windyroad-plugin-maturity-presentation-layer-plugin-json-schema-prose-woven-readme-badge-in-suite-wr-itil-plugin-maturity-list-display-shim-architecture-rule §Confirmation #11 — CI pre-publish manifest-validity
|
|
5
5
|
# gate. Loops every `packages/*/.claude-plugin/plugin.json` in CWD,
|
|
6
6
|
# runs `claude plugin validate <plugin_dir>` (NON-strict — see RCA
|
|
7
7
|
# note below), accumulates failures, and exits non-zero if ANY plugin
|
|
8
8
|
# manifest fails validation.
|
|
9
9
|
#
|
|
10
|
-
# WHY NON-STRICT (
|
|
11
|
-
# - The historical
|
|
10
|
+
# WHY NON-STRICT (ci-gate-claude-plugin-install-dry-run-per-plugin-pre-publish-confirmation-11-implementation-problem / plugin-json-top-level-hooks-skills-agents-keys-are-reserved-by-claude-code-s-manifest-validator-adding-arbitrary-content-breaks-claude-plugin-install-problem refined RCA, 2026-05-30):
|
|
11
|
+
# - The historical plugin-json-top-level-hooks-skills-agents-keys-are-reserved-by-claude-code-s-manifest-validator-adding-arbitrary-content-breaks-claude-plugin-install-problem incident's failure class was a RECOGNISED
|
|
12
12
|
# top-level key (`hooks` / `skills` / `agents` / `commands`)
|
|
13
13
|
# carrying wrong-typed content — caught by `claude plugin validate`
|
|
14
14
|
# non-strict as a hard ERROR (`Validation errors: hooks: Invalid
|
|
15
15
|
# input`).
|
|
16
|
-
# -
|
|
16
|
+
# - windyroad-plugin-maturity-presentation-layer-plugin-json-schema-prose-woven-readme-badge-in-suite-wr-itil-plugin-maturity-list-display-shim-architecture-rule Amendment 2026-05-18's chosen safe-extension pattern
|
|
17
17
|
# places maturity records at top-level `maturity:` — an
|
|
18
18
|
# UNRECOGNISED top-level key — because unrecognised keys are
|
|
19
19
|
# warning-only and the plugin still loads. This is the durable
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
# - Non-strict therefore catches the historical incident's
|
|
23
23
|
# mechanism without rejecting the safe-extension pattern. The
|
|
24
24
|
# prose Confirmation #11 originally named `claude plugin install
|
|
25
|
-
# --dry-run`;
|
|
25
|
+
# --dry-run`; plugin-json-top-level-hooks-skills-agents-keys-are-reserved-by-claude-code-s-manifest-validator-adding-arbitrary-content-breaks-claude-plugin-install-problem investigation refined to `claude plugin
|
|
26
26
|
# validate --strict`; this script's RCA refined further to
|
|
27
27
|
# non-strict.
|
|
28
28
|
#
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
# CI installs `@anthropic-ai/claude-code@2.1.150` before invoking
|
|
31
31
|
# this script. The exact pin protects against Anthropic-side CLI
|
|
32
32
|
# behaviour change silently breaking the gate. 2.1.150 is the
|
|
33
|
-
# version
|
|
33
|
+
# version ci-gate-claude-plugin-install-dry-run-per-plugin-pre-publish-confirmation-11-implementation-problem iter 6 empirically tested against. Bump the pin
|
|
34
34
|
# only after re-running the iter-6 probe against the new version.
|
|
35
35
|
#
|
|
36
36
|
# LOOP CONTRACT:
|
|
@@ -38,19 +38,19 @@
|
|
|
38
38
|
# - Does NOT short-circuit on first failure — every plugin is
|
|
39
39
|
# exercised so CI surfaces every defect at once.
|
|
40
40
|
# - `nullglob` makes a zero-plugin tree a no-op exit 0 (adopter-
|
|
41
|
-
# tree portability per
|
|
41
|
+
# tree portability per plugin-bundled-scripts-invoked-from-skill-md-resolve-via-bin-on-path-architecture-rule).
|
|
42
42
|
#
|
|
43
43
|
# References:
|
|
44
|
-
#
|
|
45
|
-
#
|
|
46
|
-
#
|
|
44
|
+
# windyroad-plugin-maturity-presentation-layer-plugin-json-schema-prose-woven-readme-badge-in-suite-wr-itil-plugin-maturity-list-display-shim-architecture-rule — Amendment 2026-05-18 + §Confirmation #11
|
|
45
|
+
# plugin-bundled-scripts-invoked-from-skill-md-resolve-via-bin-on-path-architecture-rule — PATH-on-shim grammar (`wr-itil-plugin-validate-ci-gate`)
|
|
46
|
+
# behavioural-tests-default-for-skill-testing-architecture-rule — behavioural tests default (bats at
|
|
47
47
|
# `scripts/test/plugin-validate-ci-gate.bats`)
|
|
48
|
-
#
|
|
48
|
+
# governance-skills-commit-their-own-completed-work-architecture-rule — single-commit grain (script + shim + bats + CI + ADR
|
|
49
49
|
# amendment + changeset land together)
|
|
50
|
-
#
|
|
50
|
+
# plugin-json-top-level-hooks-skills-agents-keys-are-reserved-by-claude-code-s-manifest-validator-adding-arbitrary-content-breaks-claude-plugin-install-problem — root-cause driver (recognised vs unrecognised key
|
|
51
51
|
# distinction)
|
|
52
|
-
#
|
|
53
|
-
#
|
|
52
|
+
# agent-waits-on-calendar-trigger-for-held-cohort-graduation-violates-symmetric-balance-principle-problem — sibling-class "gate-the-actual-load-bearing-surface"
|
|
53
|
+
# ci-gate-claude-plugin-install-dry-run-per-plugin-pre-publish-confirmation-11-implementation-problem — this implementation's ticket
|
|
54
54
|
|
|
55
55
|
set -e
|
|
56
56
|
shopt -s nullglob
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
# Diagnose-only drift detector for docs/problems/README.md vs filesystem
|
|
5
5
|
# truth. Reads ticket files from BOTH the flat layout
|
|
6
6
|
# `<problems-dir>/<NNN>-*.<status>.md` AND the per-state subdir layout
|
|
7
|
-
# `<problems-dir>/<status>/<NNN>-*.md` (
|
|
7
|
+
# `<problems-dir>/<status>/<NNN>-*.md` (docs-problems-flat-layout-migration-per-state-subdirs-adopter-auto-migration-release-design dual-tolerant migration
|
|
8
8
|
# window), parses the README's WSJF Rankings + Verification Queue +
|
|
9
9
|
# Closed tables, and reports each disagreement.
|
|
10
10
|
#
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
#
|
|
16
16
|
# Dual-layout precedence: when the same ID appears in both layout-halves
|
|
17
17
|
# (transient mid-migration race between `git mv` and README refresh),
|
|
18
|
-
# the per-state subdir wins —
|
|
18
|
+
# the per-state subdir wins — problem-ticket-directory-layout-per-state-subdirectories-under-docs-problems-architecture-rule §"Authoritative state signal"
|
|
19
19
|
# treats subdirectory as the post-migration ground truth.
|
|
20
20
|
#
|
|
21
21
|
# Exit codes:
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
# 2 = parse error (README missing or malformed)
|
|
25
25
|
#
|
|
26
26
|
# Output format on drift (one line per drift entry, ≤ 150 bytes per
|
|
27
|
-
#
|
|
27
|
+
# progressive-disclosure-once-per-session-budget-for-userpromptsubmit-governance-prose-architecture-rule progressive-disclosure budget):
|
|
28
28
|
# DRIFT <ID> wsjf-rankings: claims=<status> actual=<status>
|
|
29
29
|
# MISSING <ID> wsjf-rankings: actual=<status> file=<basename>
|
|
30
30
|
# STALE <ID> verification-queue: actual=<status>
|
|
@@ -34,18 +34,18 @@
|
|
|
34
34
|
# skill applies edits with narrative-aware preservation; this script's
|
|
35
35
|
# only job is to report ground truth.
|
|
36
36
|
#
|
|
37
|
-
# @problem
|
|
38
|
-
# @problem
|
|
39
|
-
# @problem
|
|
40
|
-
# @adr
|
|
41
|
-
# @adr
|
|
42
|
-
# @adr
|
|
43
|
-
# @adr
|
|
44
|
-
# @adr
|
|
45
|
-
# @rfc
|
|
46
|
-
# @jtbd
|
|
47
|
-
# @jtbd
|
|
48
|
-
# @jtbd
|
|
37
|
+
# @problem docs-problems-readme-md-drifts-from-filesystem-truth-across-sessions-despite-refresh-on-create-and-refresh-on-transition-both-closed-problem
|
|
38
|
+
# @problem problem-tickets-strain-as-fixes-decompose-into-multiple-coordinated-changes-need-an-rfc-framework-that-ties-all-changes-back-to-problems-and-unifies-technical-with-user-business-problems-problem (docs-problems-flat-layout-migration-per-state-subdirs-adopter-auto-migration-release-design — dual-tolerant migration window)
|
|
39
|
+
# @problem reconcile-readme-false-positive-parses-inbound-upstream-reports-matched-local-ticket-column-as-verification-queue-problem (Inbound Upstream Reports rows mis-attributed to VQ)
|
|
40
|
+
# @adr governance-skills-commit-their-own-completed-work-architecture-rule (Reconciliation as preflight robustness layer)
|
|
41
|
+
# @adr problem-lifecycle-add-a-verification-pending-status-between-known-error-and-closed-architecture-rule (Verification Pending lifecycle excludes from WSJF Rankings)
|
|
42
|
+
# @adr problem-ticket-directory-layout-per-state-subdirectories-under-docs-problems-architecture-rule (Per-state subdir is post-migration authoritative state signal)
|
|
43
|
+
# @adr progressive-disclosure-once-per-session-budget-for-userpromptsubmit-governance-prose-architecture-rule (Progressive disclosure — per-row byte budget)
|
|
44
|
+
# @adr inbound-upstream-report-discovery-assessment-pipeline-peer-of-architecture-rule (Inbound upstream-report discovery + assessment pipeline)
|
|
45
|
+
# @rfc inbound-upstream-report-discovery-assessment-pipeline-implementation-rollout-release-design (problem-079-no-inbound-sync-of-upstream-reported-problems-reports-filed-via-the-intake-templates-never-surface-in-the-local-backlog-problem inbound-upstream-report discovery)
|
|
46
|
+
# @jtbd progress-the-backlog-while-i-m-away-user-outcome (Progress the Backlog While I'm Away)
|
|
47
|
+
# @jtbd enforce-governance-without-slowing-down-user-outcome (Enforce Governance Without Slowing Down)
|
|
48
|
+
# @jtbd trust-that-the-readme-describes-the-plugin-i-just-installed-user-outcome (Trust That the README Describes the Plugin I Just Installed)
|
|
49
49
|
|
|
50
50
|
set -uo pipefail
|
|
51
51
|
|
|
@@ -66,9 +66,9 @@ fi
|
|
|
66
66
|
|
|
67
67
|
# ── Build filesystem truth: ID → status ─────────────────────────────────────
|
|
68
68
|
#
|
|
69
|
-
#
|
|
69
|
+
# docs-problems-flat-layout-migration-per-state-subdirs-adopter-auto-migration-release-design dual-tolerant enumeration: walk BOTH the flat layout and the
|
|
70
70
|
# per-state subdir layout. Per-state subdir wins on collision (mid-
|
|
71
|
-
# migration race; per-state is the migration target per
|
|
71
|
+
# migration race; per-state is the migration target per problem-ticket-directory-layout-per-state-subdirectories-under-docs-problems-architecture-rule).
|
|
72
72
|
|
|
73
73
|
declare -A FS_STATUS
|
|
74
74
|
shopt -s nullglob
|
|
@@ -83,7 +83,7 @@ for f in "$PROBLEMS_DIR"/[0-9][0-9][0-9]-*.open.md \
|
|
|
83
83
|
num="${base%%-*}"
|
|
84
84
|
id="P${num}"
|
|
85
85
|
# `ticket_status` (not bash `status`) — zsh has `$status` as a read-only
|
|
86
|
-
# built-in mapping to `$?`. Defensive rename per
|
|
86
|
+
# built-in mapping to `$?`. Defensive rename per zsh-portability-gap-in-shell-snippet-examples-across-skill-md-files-bash-style-word-splitting-bash-builtin-variable-names-fail-silently-or-noisily-on-zsh-problem even though this
|
|
87
87
|
# script's `#!/usr/bin/env bash` shebang means it never runs under zsh.
|
|
88
88
|
case "$base" in
|
|
89
89
|
*.open.md) ticket_status="open" ;;
|
|
@@ -98,7 +98,7 @@ done
|
|
|
98
98
|
# Per-state subdir layout: docs/problems/<state>/<NNN>-<title>.md
|
|
99
99
|
# Status derived from parent directory name (the subdirectory IS the
|
|
100
100
|
# state signal post-migration). Writes after the flat loop so per-state
|
|
101
|
-
# wins on cross-layout ID collision (
|
|
101
|
+
# wins on cross-layout ID collision (problem-ticket-directory-layout-per-state-subdirectories-under-docs-problems-architecture-rule authoritative state).
|
|
102
102
|
for ticket_status in open known-error verifying closed parked; do
|
|
103
103
|
for f in "$PROBLEMS_DIR"/"$ticket_status"/[0-9][0-9][0-9]-*.md; do
|
|
104
104
|
base="$(basename "$f")"
|
|
@@ -114,11 +114,11 @@ shopt -u nullglob
|
|
|
114
114
|
|
|
115
115
|
WSJF_START=$(grep -n '^## WSJF Rankings' "$README" | head -1 | cut -d: -f1)
|
|
116
116
|
VQ_START=$(grep -n '^## Verification Queue' "$README" | head -1 | cut -d: -f1)
|
|
117
|
-
# Inbound Upstream Reports (
|
|
117
|
+
# Inbound Upstream Reports (inbound-upstream-report-discovery-assessment-pipeline-peer-of-architecture-rule / inbound-upstream-report-discovery-assessment-pipeline-implementation-rollout-release-design) sits between Verification
|
|
118
118
|
# Queue and Closed when populated. Its `Matched local ticket` column
|
|
119
119
|
# carries `| P<NNN> |` cross-refs that look like VQ rows but live in a
|
|
120
120
|
# distinct section. The VQ slice MUST terminate at this header when
|
|
121
|
-
# present, otherwise its rows get miscounted as VQ entries (
|
|
121
|
+
# present, otherwise its rows get miscounted as VQ entries (reconcile-readme-false-positive-parses-inbound-upstream-reports-matched-local-ticket-column-as-verification-queue-problem).
|
|
122
122
|
INBOUND_START=$(grep -n '^## Inbound Upstream Reports' "$README" | head -1 | cut -d: -f1)
|
|
123
123
|
CLOSED_START=$(grep -n '^## Closed' "$README" | head -1 | cut -d: -f1)
|
|
124
124
|
PARKED_START=$(grep -n '^## Parked' "$README" | head -1 | cut -d: -f1)
|
|
@@ -126,7 +126,7 @@ END_LINE=$(wc -l < "$README")
|
|
|
126
126
|
|
|
127
127
|
# Sentinel each end with the next section start (or EOF). The VQ_END
|
|
128
128
|
# cascade prefers INBOUND_START when present so Inbound rows are
|
|
129
|
-
# excluded from VQ extraction (
|
|
129
|
+
# excluded from VQ extraction (reconcile-readme-false-positive-parses-inbound-upstream-reports-matched-local-ticket-column-as-verification-queue-problem).
|
|
130
130
|
WSJF_END=${VQ_START:-${INBOUND_START:-${CLOSED_START:-${PARKED_START:-$END_LINE}}}}
|
|
131
131
|
VQ_END=${INBOUND_START:-${CLOSED_START:-${PARKED_START:-$END_LINE}}}
|
|
132
132
|
CLOSED_END=${PARKED_START:-$END_LINE}
|
|
@@ -172,7 +172,7 @@ while read -r id; do
|
|
|
172
172
|
done <<< "$README_WSJF_IDS"
|
|
173
173
|
|
|
174
174
|
# (2) Each ID listed in Verification Queue must be .verifying.md on disk.
|
|
175
|
-
# .closed.md → STALE (drift class
|
|
175
|
+
# .closed.md → STALE (drift class problem-062-manage-problem-does-not-refresh-docs-problems-readme-md-on-single-ticket-transitions-fast-path-cache-goes-stale-silently-problem closure didn't refresh);
|
|
176
176
|
# .open.md / .known-error.md → STALE; missing → STALE.
|
|
177
177
|
while read -r id; do
|
|
178
178
|
[ -z "$id" ] && continue
|
|
@@ -19,13 +19,13 @@
|
|
|
19
19
|
# 2 = parse error (README missing or malformed)
|
|
20
20
|
#
|
|
21
21
|
# Output format on drift (one line per drift entry, ≤ 150 bytes per
|
|
22
|
-
#
|
|
22
|
+
# progressive-disclosure-once-per-session-budget-for-userpromptsubmit-governance-prose-architecture-rule progressive-disclosure budget):
|
|
23
23
|
# DRIFT RFC-<NNN> wsjf-rankings: claims=<status> actual=<status>
|
|
24
24
|
# MISSING RFC-<NNN> wsjf-rankings: actual=<status>
|
|
25
25
|
# STALE RFC-<NNN> verification-queue: actual=<status>
|
|
26
26
|
# MISMATCH RFC-<NNN> closed: actual=<status>
|
|
27
27
|
#
|
|
28
|
-
# Reverse-trace pass (B5.T8 — closes
|
|
28
|
+
# Reverse-trace pass (B5.T8 — closes problem-rfc-story-framework-with-mandatory-problem-trace-and-unified-problem-ontology-architecture-rule Confirmation criterion 3):
|
|
29
29
|
# When <problems-dir> is provided AND on disk, the reconciler also
|
|
30
30
|
# checks the auto-maintained `## RFCs` section on each problem ticket
|
|
31
31
|
# against the RFC frontmatter `problems:` claims. Three drift kinds:
|
|
@@ -43,22 +43,22 @@
|
|
|
43
43
|
# applies edits with narrative-aware preservation; this script's only
|
|
44
44
|
# job is to report ground truth.
|
|
45
45
|
#
|
|
46
|
-
# Sibling to packages/itil/scripts/reconcile-readme.sh (
|
|
46
|
+
# Sibling to packages/itil/scripts/reconcile-readme.sh (docs-problems-readme-md-drifts-from-filesystem-truth-across-sessions-despite-refresh-on-create-and-refresh-on-transition-both-closed-problem / governance-skills-commit-their-own-completed-work-architecture-rule):
|
|
47
47
|
# same parse + diff structure, applied at the RFC tier instead of the
|
|
48
48
|
# problems tier. Differences:
|
|
49
49
|
# - Filename pattern: RFC-NNN-*.<status>.md (5 statuses: proposed,
|
|
50
50
|
# accepted, in-progress, verifying, closed)
|
|
51
51
|
# - ID format: RFC-<NNN> (vs P<NNN>)
|
|
52
52
|
# - WSJF Rankings covers proposed/accepted/in-progress (RFC dev-work
|
|
53
|
-
# queue per
|
|
53
|
+
# queue per problem-rfc-story-framework-with-mandatory-problem-trace-and-unified-problem-ontology-architecture-rule § Decisions Resolved — RFC-level WSJF, Phase 1)
|
|
54
54
|
# - Verification Queue covers verifying (matches problem tier)
|
|
55
55
|
# - Closed covers closed
|
|
56
|
-
# - No Parked tier (RFCs don't have a Parked status per
|
|
56
|
+
# - No Parked tier (RFCs don't have a Parked status per problem-rfc-story-framework-with-mandatory-problem-trace-and-unified-problem-ontology-architecture-rule;
|
|
57
57
|
# only Problems do)
|
|
58
58
|
#
|
|
59
|
-
# @problem
|
|
60
|
-
# @adr
|
|
61
|
-
# @adr
|
|
59
|
+
# @problem problem-tickets-strain-as-fixes-decompose-into-multiple-coordinated-changes-need-an-rfc-framework-that-ties-all-changes-back-to-problems-and-unifies-technical-with-user-business-problems-problem
|
|
60
|
+
# @adr problem-rfc-story-framework-with-mandatory-problem-trace-and-unified-problem-ontology-architecture-rule (Problem-RFC-Story framework — Phase 1 item 5)
|
|
61
|
+
# @adr plugin-bundled-scripts-invoked-from-skill-md-resolve-via-bin-on-path-architecture-rule (Plugin script resolution via bin/ on PATH — paired bin shim)
|
|
62
62
|
|
|
63
63
|
set -uo pipefail
|
|
64
64
|
|
|
@@ -221,7 +221,7 @@ done
|
|
|
221
221
|
# frontmatter `problems:` claims (and vice-versa).
|
|
222
222
|
|
|
223
223
|
if [ -d "$PROBLEMS_DIR" ]; then
|
|
224
|
-
# rfc_problems_claim["RFC-NNN"] = "
|
|
224
|
+
# rfc_problems_claim["RFC-NNN"] = "risk-scorer-doesn-t-consume-docs-risks-catalog-or-bootstrap-from-risk-reports-problem build-recogniser-shape-catalogue-into-windyroad-risk-scorer-plugin-automatic-bootstrap-ongoing-maintenance-problem ..."
|
|
225
225
|
declare -A rfc_problems_claim
|
|
226
226
|
shopt -s nullglob
|
|
227
227
|
for f in "$RFCS_DIR"/RFC-[0-9][0-9][0-9]-*.md; do
|
|
@@ -229,7 +229,7 @@ if [ -d "$PROBLEMS_DIR" ]; then
|
|
|
229
229
|
num="${base#RFC-}"
|
|
230
230
|
num="${num%%-*}"
|
|
231
231
|
rfc_id="RFC-${num}"
|
|
232
|
-
# Parse YAML frontmatter `problems: [
|
|
232
|
+
# Parse YAML frontmatter `problems: [risk-scorer-doesn-t-consume-docs-risks-catalog-or-bootstrap-from-risk-reports-problem, build-recogniser-shape-catalogue-into-windyroad-risk-scorer-plugin-automatic-bootstrap-ongoing-maintenance-problem]` (single line).
|
|
233
233
|
raw=$(awk '/^problems:/ { print; exit }' "$f")
|
|
234
234
|
# Strip everything except inside-brackets bare comma-separated content.
|
|
235
235
|
inner=$(echo "$raw" | sed -E 's/^[[:space:]]*problems:[[:space:]]*\[//; s/\][[:space:]]*$//')
|
|
@@ -247,11 +247,11 @@ if [ -d "$PROBLEMS_DIR" ]; then
|
|
|
247
247
|
done
|
|
248
248
|
shopt -u nullglob
|
|
249
249
|
|
|
250
|
-
# problem_rfc_rows["
|
|
251
|
-
# problem_rfc_ids["
|
|
250
|
+
# problem_rfc_rows["risk-scorer-doesn-t-consume-docs-risks-catalog-or-bootstrap-from-risk-reports-problem pipeline-consume-catalog-and-bootstrap-from-reports-multi-commit-retrofit-release-design"] = "<claimed-status>"
|
|
251
|
+
# problem_rfc_ids["risk-scorer-doesn-t-consume-docs-risks-catalog-or-bootstrap-from-risk-reports-problem"] = "pipeline-consume-catalog-and-bootstrap-from-reports-multi-commit-retrofit-release-design docs-problems-flat-layout-migration-per-state-subdirs-adopter-auto-migration-release-design ..."
|
|
252
252
|
declare -A problem_rfc_rows
|
|
253
253
|
declare -A problem_rfc_ids
|
|
254
|
-
#
|
|
254
|
+
# reconcile-rfcs-reports-spurious-missing-reverse-trace-doesn-t-traverse-docs-problems-per-state-subdirs-class-glob-gap-problem / problem-ticket-directory-layout-per-state-subdirectories-under-docs-problems-architecture-rule: scan both flat docs/problems/<NNN>-*.md AND per-state
|
|
255
255
|
# subdir docs/problems/<state>/<NNN>-*.md layouts so the reverse-trace
|
|
256
256
|
# remains valid post-migration. Mirrors reconcile-readme.sh lines 74-110.
|
|
257
257
|
shopt -s nullglob
|