@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
package/scripts/effort-tally.sh
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
# wr-itil — per-ticket effort tally from AFK iteration cost metadata (
|
|
2
|
+
# wr-itil — per-ticket effort tally from AFK iteration cost metadata (cost-based-wsjf-effort-capture-time-cost-actuals-tally-per-ticket-retro-driven-rms-calibration-tally-first-architecture-rule, use-time-and-token-cost-not-t-shirt-sizing-for-wsjf-effort-with-retro-driven-estimation-refinement-problem)
|
|
3
3
|
#
|
|
4
|
-
# @jtbd
|
|
5
|
-
# @jtbd
|
|
4
|
+
# @jtbd progress-the-backlog-while-i-m-away-user-outcome (Progress the Backlog While I'm Away — AFK actuals feed WSJF calibration + audit trail)
|
|
5
|
+
# @jtbd run-pre-flight-governance-checks-before-release-or-handover-user-outcome (Run Pre-Flight Governance Checks — structured, auditable effort tally)
|
|
6
6
|
#
|
|
7
7
|
# Attributes `.afk-run-state/iter*.json` actuals back to their source ticket
|
|
8
8
|
# (the `pNNN` token in the filename) and emits the `## Effort Tally` schema. The
|
|
9
9
|
# reusable core shared by:
|
|
10
|
-
# - the backfill (seed historical tickets —
|
|
11
|
-
# - go-forward per-iter append (work-problems —
|
|
10
|
+
# - the backfill (seed historical tickets — cost-based-wsjf-effort-capture-time-cost-actuals-tally-per-ticket-retro-driven-rms-calibration-tally-first-architecture-rule Decision Outcome item 4)
|
|
11
|
+
# - go-forward per-iter append (work-problems — cost-based-wsjf-effort-capture-time-cost-actuals-tally-per-ticket-retro-driven-rms-calibration-tally-first-architecture-rule item 2)
|
|
12
12
|
#
|
|
13
|
-
# Authority hierarchy (
|
|
13
|
+
# Authority hierarchy (problem-089-work-problems-step-5-dispatch-has-two-robustness-gaps-stdin-warning-pollutes-json-output-and-cost-metadata-undercounts-when-subprocess-exits-via-background-task-notification-ack-problem Gap 2 — load-bearing): `total_cost_usd` is the
|
|
14
14
|
# AUTHORITATIVE actual (session-cumulative by CLI contract; reliable token-spend
|
|
15
15
|
# proxy). `duration_ms` is reliable wall-clock. Raw `usage.*` token counts are
|
|
16
16
|
# BEST-EFFORT (undercount when a subprocess exits on a background-ack turn) and
|
|
@@ -26,15 +26,15 @@
|
|
|
26
26
|
# Idempotently inject/replace that section in the ticket file (lazy-empty:
|
|
27
27
|
# zero iters → section removed). Mirrors update-problem-references-section.sh.
|
|
28
28
|
#
|
|
29
|
-
# --source defaults to afk-backfill (
|
|
29
|
+
# --source defaults to afk-backfill (cost-based-wsjf-effort-capture-time-cost-actuals-tally-per-ticket-retro-driven-rms-calibration-tally-first-architecture-rule item 2a — every row generated from
|
|
30
30
|
# pre-existing .afk-run-state data is a historical backfill until a go-forward
|
|
31
31
|
# per-iter append wires `--source live-iter`).
|
|
32
32
|
#
|
|
33
|
-
# Phase bucketing (
|
|
33
|
+
# Phase bucketing (cost-based-wsjf-effort-capture-time-cost-actuals-tally-per-ticket-retro-driven-rms-calibration-tally-first-architecture-rule item 2 — RCA vs RFC): derived from the ticket's
|
|
34
34
|
# **Status** body line — `Open` → RCA, anything else → RFC.
|
|
35
35
|
# ponytail: single-phase attribution; a ticket that accrued iters while Open
|
|
36
36
|
# then more while Known Error buckets ALL iters to its current phase. Named
|
|
37
|
-
# upgrade path = per-iter git-log status discrimination (
|
|
37
|
+
# upgrade path = per-iter git-log status discrimination (cost-based-wsjf-effort-capture-time-cost-actuals-tally-per-ticket-retro-driven-rms-calibration-tally-first-architecture-rule item 2 Phase
|
|
38
38
|
# 2 design). Correct for the common single-phase case; the ceiling travels in
|
|
39
39
|
# the AUTO-GENERATED marker below.
|
|
40
40
|
#
|
|
@@ -157,7 +157,7 @@ if [ -n "$line" ]; then
|
|
|
157
157
|
tokens="$(echo "$line" | sed -E 's/.*tokens=~([0-9.]+M).*/\1/')"
|
|
158
158
|
new_section="## Effort Tally"$'\n\n'
|
|
159
159
|
new_section+="<!-- AUTO-GENERATED by wr-itil-effort-tally; do not hand-edit. source: ${SOURCE}."$'\n'
|
|
160
|
-
new_section+=" Phase bucketed from current **Status** (single-phase ceiling —
|
|
160
|
+
new_section+=" Phase bucketed from current **Status** (single-phase ceiling — cost-based-wsjf-effort-capture-time-cost-actuals-tally-per-ticket-retro-driven-rms-calibration-tally-first-architecture-rule item 2). -->"$'\n\n'
|
|
161
161
|
new_section+="| Phase | Iters | Cost (USD, authoritative) | Time (min) | Tokens (best-effort) |"$'\n'
|
|
162
162
|
new_section+="|---|---|---|---|---|"$'\n'
|
|
163
163
|
new_section+="| ${PHASE} | ${iters} | \$${cost} | ${minutes} | ~${tokens} |"$'\n'
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
# packages/itil/scripts/evaluate-relevance.sh
|
|
3
3
|
#
|
|
4
4
|
# Evaluate whether a problem ticket has become "no longer relevant" by
|
|
5
|
-
# checking observable evidence per
|
|
6
|
-
# evidence shapes per
|
|
5
|
+
# checking observable evidence per agent-output-grounding-no-fabricated-quantitative-estimates-cite-persist-uncertainty-architecture-rule grounding. Implements 5
|
|
6
|
+
# evidence shapes per 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 (Phase 1 + Phase 2):
|
|
7
7
|
#
|
|
8
8
|
# Shape 1 — file-no-longer-exists (Phase 1, original)
|
|
9
9
|
# Shape 2 — ADR-shipped with `human-oversight: confirmed` (Phase 2)
|
|
@@ -12,9 +12,9 @@
|
|
|
12
12
|
# Shape 5 — driver-child-ticket-closed (Phase 2)
|
|
13
13
|
#
|
|
14
14
|
# Phase 1 false-positive fixes (Phase 2):
|
|
15
|
-
# - state-suffix detection (
|
|
16
|
-
# - sibling-file detection (
|
|
17
|
-
# - rename detection (
|
|
15
|
+
# - state-suffix detection (agent-defers-mitigation-selection-to-user-during-active-incident-surfaces-mitigation-choice-as-user-authority-when-skill-contract-empowers-agent-driven-reversible-mitigations-problem): per-state subdirs + .<state>.md
|
|
16
|
+
# - sibling-file detection (phase-3-f9-wr-itil-plugin-maturity-list-in-suite-display-shim-reads-installed-plugins-plugin-json-maturity-field-emits-ndjson-per-surface-rollup-per-plugin-problem): dir-glob slug-prefix
|
|
17
|
+
# - rename detection (rfc-first-trace-invariant-not-enforced-fixes-start-without-rfc-story-map-or-jtbd-trace-problem): git log --follow --diff-filter=AD
|
|
18
18
|
#
|
|
19
19
|
# Usage:
|
|
20
20
|
# evaluate-relevance.sh <ticket-file> [<min-age-days>]
|
|
@@ -35,13 +35,13 @@
|
|
|
35
35
|
# 2 = SKIP
|
|
36
36
|
# 3 = error
|
|
37
37
|
#
|
|
38
|
-
# Set LC_ALL=C for portable byte-grep per
|
|
38
|
+
# Set LC_ALL=C for portable byte-grep per bsd-grep-sed-awk-on-macos-silently-fail-or-error-on-utf-8-without-lc-all-en-us-utf-8-problem (BSD grep on macOS
|
|
39
39
|
# silently misbehaves on UTF-8 without an explicit locale).
|
|
40
40
|
#
|
|
41
|
-
#
|
|
42
|
-
#
|
|
43
|
-
#
|
|
44
|
-
#
|
|
41
|
+
# plugin-bundled-scripts-invoked-from-skill-md-resolve-via-bin-on-path-architecture-rule: invoked via the `wr-itil-evaluate-relevance` PATH shim.
|
|
42
|
+
# agent-output-grounding-no-fabricated-quantitative-estimates-cite-persist-uncertainty-architecture-rule: every CLOSE-CANDIDATE verdict cites the evidence per shape.
|
|
43
|
+
# behavioural-tests-default-for-skill-testing-architecture-rule: behavioural bats at scripts/test/evaluate-relevance.bats.
|
|
44
|
+
# 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: design (Phase 1 + Phase 2).
|
|
45
45
|
|
|
46
46
|
set -euo pipefail
|
|
47
47
|
export LC_ALL=C
|
|
@@ -96,7 +96,7 @@ path_exists() {
|
|
|
96
96
|
return 1
|
|
97
97
|
}
|
|
98
98
|
|
|
99
|
-
# Detect state-suffix variants of an incident/problem/RFC path (
|
|
99
|
+
# Detect state-suffix variants of an incident/problem/RFC path (agent-defers-mitigation-selection-to-user-during-active-incident-surfaces-mitigation-choice-as-user-authority-when-skill-contract-empowers-agent-driven-reversible-mitigations-problem fix).
|
|
100
100
|
# Given a path like `docs/incidents/I002-foo.investigating.md`, also checks
|
|
101
101
|
# `docs/incidents/I002-foo.{restored,mitigating,closed}.md`. Returns 0 if
|
|
102
102
|
# any sibling state-suffix variant exists.
|
|
@@ -108,7 +108,7 @@ state_suffix_variant_exists() {
|
|
|
108
108
|
# Strip trailing .<state>.md to a slug-prefix and recombine with each
|
|
109
109
|
# state. Conservative — only fires for paths in docs/incidents/,
|
|
110
110
|
# docs/problems/, docs/rfcs/, docs/stories/, docs/story-maps/ where the
|
|
111
|
-
# state-suffix convention applies (
|
|
111
|
+
# state-suffix convention applies (problem-ticket-directory-layout-per-state-subdirectories-under-docs-problems-architecture-rule / problem-rfc-story-framework-with-mandatory-problem-trace-and-unified-problem-ontology-architecture-rule).
|
|
112
112
|
case "$dir" in
|
|
113
113
|
docs/incidents|docs/problems|docs/problems/*|docs/rfcs|docs/rfcs/*|docs/stories|docs/stories/*|docs/story-maps|docs/story-maps/*)
|
|
114
114
|
;;
|
|
@@ -122,7 +122,7 @@ state_suffix_variant_exists() {
|
|
|
122
122
|
if [ "$slug" = "$base" ]; then
|
|
123
123
|
return 1
|
|
124
124
|
fi
|
|
125
|
-
# Also try the per-state subdir layout (
|
|
125
|
+
# Also try the per-state subdir layout (docs-problems-flat-layout-migration-per-state-subdirs-adopter-auto-migration-release-design migration window).
|
|
126
126
|
local parent
|
|
127
127
|
parent=$(dirname "$dir")
|
|
128
128
|
local entity
|
|
@@ -152,7 +152,7 @@ state_suffix_variant_exists() {
|
|
|
152
152
|
}
|
|
153
153
|
|
|
154
154
|
# Detect sibling files with similar slug-prefix in the same parent dir
|
|
155
|
-
# (
|
|
155
|
+
# (phase-3-f9-wr-itil-plugin-maturity-list-in-suite-display-shim-reads-installed-plugins-plugin-json-maturity-field-emits-ndjson-per-surface-rollup-per-plugin-problem fix). Given `packages/foo/scripts/bar-list.sh`, finds
|
|
156
156
|
# `packages/foo/scripts/bar-render.sh` / `bar-populate.sh` etc.
|
|
157
157
|
# Returns 0 (and echoes the matched sibling) if a sibling exists.
|
|
158
158
|
sibling_file_exists() {
|
|
@@ -195,7 +195,7 @@ sibling_file_exists() {
|
|
|
195
195
|
return 1
|
|
196
196
|
}
|
|
197
197
|
|
|
198
|
-
# Detect rename via git log --follow (
|
|
198
|
+
# Detect rename via git log --follow (rfc-first-trace-invariant-not-enforced-fixes-start-without-rfc-story-map-or-jtbd-trace-problem fix). Returns 0 (and echoes the
|
|
199
199
|
# detected new name) if the file was renamed away from <path>.
|
|
200
200
|
rename_detected() {
|
|
201
201
|
local p="$1"
|
|
@@ -242,7 +242,7 @@ record_shape() {
|
|
|
242
242
|
# Shape 1 — file-no-longer-exists (Phase 1 original).
|
|
243
243
|
# Extracts candidate paths, drops self-refs, runs path_exists per
|
|
244
244
|
# candidate. Detects state-suffix / sibling-file / rename to avoid Phase 1
|
|
245
|
-
# false-positives (
|
|
245
|
+
# false-positives (agent-defers-mitigation-selection-to-user-during-active-incident-surfaces-mitigation-choice-as-user-authority-when-skill-contract-empowers-agent-driven-reversible-mitigations-problem/phase-3-f9-wr-itil-plugin-maturity-list-in-suite-display-shim-reads-installed-plugins-plugin-json-maturity-field-emits-ndjson-per-surface-rollup-per-plugin-problem/rfc-first-trace-invariant-not-enforced-fixes-start-without-rfc-story-map-or-jtbd-trace-problem); on detection routes to KEEP-WITH-NOTE.
|
|
246
246
|
|
|
247
247
|
candidates=$(grep -oE '(packages|docs|\.changeset|src|test|scripts)/[A-Za-z0-9._/-]+\.(md|sh|ts|tsx|js|jsx|json|yml|yaml|bats|py|txt|html)' "$ticket_file" 2>/dev/null \
|
|
248
248
|
| sort -u \
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
# wr-itil — write the problem-tier create-gate marker (
|
|
3
|
-
# candidate session SID (
|
|
2
|
+
# wr-itil — write the problem-tier create-gate marker (agent-bypasses-wr-itil-manage-problem-step-2-duplicate-check-by-writing-tickets-directly-to-docs-problems-problem) under every
|
|
3
|
+
# candidate session SID (create-gate-marker-race-between-concurrent-claude-sessions-via-shared-runtime-sid-file-problem / 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 Option C).
|
|
4
4
|
#
|
|
5
5
|
# Internalises the source+pipe that capture-problem / manage-problem Step 2
|
|
6
6
|
# previously ran INLINE with repo-relative `source packages/itil/hooks/lib/*.sh`
|
|
7
7
|
# — which only resolved in the source monorepo and broke in adopter installs
|
|
8
|
-
# (
|
|
8
|
+
# (capture-problem-capture-rfc-manage-problem-step-2-create-gate-marker-step-sources-repo-relative-packages-itil-hooks-lib-sh-fails-in-adopter-installs-recurring-published-path-class-problem / adopter-safe-path-resolution-in-shipped-skills-24-repo-relative-references-release-design). This script resolves its sibling libs RELATIVE TO ITS OWN
|
|
9
9
|
# LOCATION (`$(dirname)/../hooks/lib`), so it works wherever the plugin is
|
|
10
10
|
# installed. SKILLs invoke it by name via the `wr-itil-mark-create-gate` PATH
|
|
11
|
-
# shim (
|
|
11
|
+
# shim (plugin-bundled-scripts-invoked-from-skill-md-resolve-via-bin-on-path-architecture-rule) instead of sourcing repo-relative lib files.
|
|
12
12
|
set -uo pipefail
|
|
13
13
|
|
|
14
14
|
LIB="$(cd "$(dirname "${BASH_SOURCE[0]}")/../hooks/lib" 2>/dev/null && pwd)" || {
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
# mark-story-oversight-confirmed.sh —
|
|
2
|
+
# mark-story-oversight-confirmed.sh — story-maps-and-stories-carry-a-drift-invalidated-human-oversight-marker-architecture-rule ratify write-path.
|
|
3
3
|
#
|
|
4
4
|
# Writes `human-oversight: confirmed` + an `oversight-hash` fingerprint of the
|
|
5
5
|
# current content into a story (markdown frontmatter) or story-map (HTML meta).
|
|
6
6
|
# Idempotent: re-running recomputes the hash and replaces any existing marker
|
|
7
7
|
# (never duplicates). A later content edit changes the content hash, so the
|
|
8
8
|
# stored fingerprint no longer matches → the artefact reads as drifted /
|
|
9
|
-
# unratified until re-ratified (
|
|
9
|
+
# unratified until re-ratified (story-maps-and-stories-carry-a-drift-invalidated-human-oversight-marker-architecture-rule drift-invalidation).
|
|
10
10
|
#
|
|
11
|
-
#
|
|
11
|
+
# a-release-row-is-the-rfc-and-the-map-is-the-approval-surface-architecture-rule retired the an-afk-loop-may-accept-and-implement-a-story-that-only-decomposes-already-ratified-substance-architecture-rule `--pure-decomposition` flag and its
|
|
12
12
|
# `oversight-basis:` record. Nothing here strips a stale one: the only writer
|
|
13
13
|
# that did was the markdown leg, and markdown is a story, which is now refused
|
|
14
14
|
# outright. No artefact in the corpus carries the field.
|
|
@@ -16,10 +16,10 @@
|
|
|
16
16
|
# Usage: mark-story-oversight-confirmed.sh <story-or-map-file>
|
|
17
17
|
# Exit: 0 = ratified; 2 = usage / file error.
|
|
18
18
|
#
|
|
19
|
-
# Authority:
|
|
19
|
+
# Authority: story-maps-and-stories-carry-a-drift-invalidated-human-oversight-marker-architecture-rule, a-release-row-is-the-rfc-and-the-map-is-the-approval-surface-architecture-rule. Driver: implement-in-the-skills-and-tests-1-story-per-rfc-story-map-story-ratification-problem Phase 2, afk-iter-cannot-progress-a-ratified-known-error-when-the-fix-vehicle-rfc-has-empty-stories-problem. Test: mark-story-oversight-confirmed.bats.
|
|
20
20
|
set -euo pipefail
|
|
21
21
|
|
|
22
|
-
# Adopter-safe: source the shared hash lib RELATIVE TO THIS SCRIPT (
|
|
22
|
+
# Adopter-safe: source the shared hash lib RELATIVE TO THIS SCRIPT (capture-problem-capture-rfc-manage-problem-step-2-create-gate-marker-step-sources-repo-relative-packages-itil-hooks-lib-sh-fails-in-adopter-installs-recurring-published-path-class-problem), never
|
|
23
23
|
# repo-relative.
|
|
24
24
|
LIB="$(cd "$(dirname "${BASH_SOURCE[0]}")/../lib" 2>/dev/null && pwd)" || {
|
|
25
25
|
echo "mark-story-oversight-confirmed: cannot locate lib dir" >&2; exit 2; }
|
|
@@ -33,21 +33,21 @@ if [ -z "$f" ]; then
|
|
|
33
33
|
fi
|
|
34
34
|
[ -f "$f" ] || { echo "mark-story-oversight-confirmed: file not found: $f" >&2; exit 2; }
|
|
35
35
|
|
|
36
|
-
#
|
|
36
|
+
# a-release-row-is-the-rfc-and-the-map-is-the-approval-surface-architecture-rule: only a story MAP is ratified. A story carries no oversight marker at
|
|
37
37
|
# all — its approval is its map's. Marking a story would re-create the second
|
|
38
|
-
# approval surface
|
|
39
|
-
# What
|
|
38
|
+
# approval surface a-release-row-is-the-rfc-and-the-map-is-the-approval-surface-architecture-rule removed, so refuse rather than silently write one.
|
|
39
|
+
# What a-release-row-is-the-rfc-and-the-map-is-the-approval-surface-architecture-rule removes is the STORY-tier marker, and a story is markdown. So the
|
|
40
40
|
# refusal is keyed on the encoding, not on a `docs/stories/` path substring: a
|
|
41
41
|
# caller working outside that tree — a test fixture, an adopter with a different
|
|
42
42
|
# layout — must get the same answer.
|
|
43
43
|
#
|
|
44
|
-
# Deliberately NOT keyed on the
|
|
45
|
-
# predating
|
|
44
|
+
# Deliberately NOT keyed on the story-maps-render-from-json-through-a-canonical-template-architecture-rule data island, tempting as that is. A map
|
|
45
|
+
# predating story-maps-render-from-json-through-a-canonical-template-architecture-rule has no island, and an island test would lock those out of
|
|
46
46
|
# ratification entirely. Marking some unrelated .html file is a user error; a
|
|
47
47
|
# story marker is a governance hole, and only the second one is worth refusing.
|
|
48
48
|
case "$f" in
|
|
49
49
|
*.md|*.markdown)
|
|
50
|
-
echo "mark-story-oversight-confirmed: refusing to mark $f (
|
|
50
|
+
echo "mark-story-oversight-confirmed: refusing to mark $f (a-release-row-is-the-rfc-and-the-map-is-the-approval-surface-architecture-rule). Only a story MAP is ratified. A story carries no oversight marker; its approval is derived from the maps named in its \`story-maps:\` field, so ratify the map instead." >&2
|
|
51
51
|
exit 2 ;;
|
|
52
52
|
esac
|
|
53
53
|
|
|
@@ -57,7 +57,7 @@ tmp="$(mktemp)"
|
|
|
57
57
|
case "$f" in
|
|
58
58
|
*.html)
|
|
59
59
|
if grep -qF '<script id="story-map-data"' "$f"; then
|
|
60
|
-
#
|
|
60
|
+
# story-maps-render-from-json-through-a-canonical-template-architecture-rule map: the data island is the source of truth and every <meta> is
|
|
61
61
|
# GENERATED from it. Writing the marker to <meta> alone would be undone by
|
|
62
62
|
# the next render, silently destroying a human ratification — so the
|
|
63
63
|
# marker goes into the island and the <meta> follows on render.
|
|
@@ -124,10 +124,10 @@ PYMARK
|
|
|
124
124
|
;;
|
|
125
125
|
*)
|
|
126
126
|
# The markdown-frontmatter writer that used to live here was a working
|
|
127
|
-
# writer for the story-level marker
|
|
127
|
+
# writer for the story-level marker a-release-row-is-the-rfc-and-the-map-is-the-approval-surface-architecture-rule removed. It is deleted rather
|
|
128
128
|
# than left unreachable behind the guard above, so that a later relaxation
|
|
129
129
|
# of that guard fails loudly instead of silently restoring story markers.
|
|
130
|
-
echo "mark-story-oversight-confirmed: refusing to mark $f (
|
|
130
|
+
echo "mark-story-oversight-confirmed: refusing to mark $f (a-release-row-is-the-rfc-and-the-map-is-the-approval-surface-architecture-rule) — no recognised story-map encoding (expected a <script id=\"story-map-data\"> island, or a legacy HTML map)." >&2
|
|
131
131
|
rm -f "$tmp"; exit 2
|
|
132
132
|
;;
|
|
133
133
|
esac
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
# migrate-story-status-mirror.sh —
|
|
2
|
+
# migrate-story-status-mirror.sh — oversight-hash-treats-the-status-body-mirror-as-substance-so-an-accept-transition-self-invalidates-its-own-ratification-problem one-time migration.
|
|
3
3
|
#
|
|
4
4
|
# Removes the redundant `**Status**:` body line from story artefacts and carries
|
|
5
5
|
# each artefact's existing ratification forward.
|
|
@@ -20,13 +20,13 @@
|
|
|
20
20
|
# identifies WHICH content the confirmation covered. Recomputing that pointer,
|
|
21
21
|
# over content whose sole delta is a mechanical mirror of an already-excluded
|
|
22
22
|
# field, removes zero ratified substance from coverage. That argument is what
|
|
23
|
-
# distinguishes this from the
|
|
23
|
+
# distinguishes this from the iter-subprocesses-set-human-oversight-confirmed-marker-on-adrs-personas-jtbds-without-an-actual-user-confirmation-event-problem hollow-marker class, and it holds ONLY
|
|
24
24
|
# because of two guards:
|
|
25
25
|
#
|
|
26
26
|
# 1. Per-artefact validity gate — re-fingerprint only when the stored hash
|
|
27
27
|
# still matches the content as it stands. An artefact that had already
|
|
28
28
|
# drifted stays drifted; nothing is silently revived. Without this the
|
|
29
|
-
# migration is a blanket re-bless, which IS
|
|
29
|
+
# migration is a blanket re-bless, which IS iter-subprocesses-set-human-oversight-confirmed-marker-on-adrs-personas-jtbds-without-an-actual-user-confirmation-event-problem.
|
|
30
30
|
# 2. Mirror-agreement precondition — if the body line disagrees with the
|
|
31
31
|
# frontmatter, it is carrying independent information (the real corpus had
|
|
32
32
|
# `superseded (was: draft)` and `in-progress (2026-07-23)`), so deleting it
|
|
@@ -40,8 +40,8 @@
|
|
|
40
40
|
# Usage: migrate-story-status-mirror.sh [<stories-dir>...] (default: docs/stories)
|
|
41
41
|
# Exit: 0 = completed (including "nothing to do"); 2 = usage / missing lib.
|
|
42
42
|
#
|
|
43
|
-
# Authority:
|
|
44
|
-
# Driver:
|
|
43
|
+
# Authority: story-maps-and-stories-carry-a-drift-invalidated-human-oversight-marker-architecture-rule (oversight fingerprint), a-release-row-is-the-rfc-and-the-map-is-the-approval-surface-architecture-rule (stories carry no marker).
|
|
44
|
+
# Driver: oversight-hash-treats-the-status-body-mirror-as-substance-so-an-accept-transition-self-invalidates-its-own-ratification-problem. Test: migrate-story-status-mirror.bats.
|
|
45
45
|
|
|
46
46
|
set -euo pipefail
|
|
47
47
|
|
|
@@ -106,7 +106,7 @@ for d in "${dirs[@]}"; do
|
|
|
106
106
|
# Was this artefact ratified-and-valid BEFORE we touch it? Decide now: once
|
|
107
107
|
# the line is gone the pre-migration hash is unreproducible.
|
|
108
108
|
#
|
|
109
|
-
#
|
|
109
|
+
# a-release-row-is-the-rfc-and-the-map-is-the-approval-surface-architecture-rule: a story carries no fingerprint of its own, so this is always 0 on
|
|
110
110
|
# the story tier and the re-point branch below never runs there. The branch
|
|
111
111
|
# is retained for any artefact that does carry one.
|
|
112
112
|
was_valid=0
|
package/scripts/next-rfc-id.sh
CHANGED
|
@@ -36,12 +36,12 @@
|
|
|
36
36
|
# working tree, for hermetic tests; outside a git repository the history half
|
|
37
37
|
# is skipped automatically.
|
|
38
38
|
#
|
|
39
|
-
# @adr
|
|
39
|
+
# @adr a-fix-proposal-draws-a-release-row-never-a-document-architecture-rule (a fix proposal draws a release row, never a document; the
|
|
40
40
|
# identity is allocated by scanning row identities including git history)
|
|
41
|
-
# @adr
|
|
42
|
-
# @adr
|
|
43
|
-
# @adr
|
|
44
|
-
# @problem
|
|
41
|
+
# @adr story-map-ids-are-never-reused-architecture-rule (identities are never reused — hence highest+1, not lowest gap)
|
|
42
|
+
# @adr plugin-bundled-scripts-invoked-from-skill-md-resolve-via-bin-on-path-architecture-rule (invoked via the wr-itil-next-rfc-id bin shim on $PATH)
|
|
43
|
+
# @adr behavioural-tests-default-for-skill-testing-architecture-rule (behavioural bats in packages/itil/scripts/test/next-rfc-id.bats)
|
|
44
|
+
# @problem the-fix-proposal-still-instantiates-a-standalone-rfc-document-after-made-it-a-release-row-problem
|
|
45
45
|
|
|
46
46
|
set -uo pipefail
|
|
47
47
|
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
# packages/itil/scripts/plugin-exercise-index.sh
|
|
3
3
|
#
|
|
4
|
-
# Phase 2b (
|
|
4
|
+
# Phase 2b (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) git-axis maturity-measurement script.
|
|
5
5
|
#
|
|
6
6
|
# Runs `git log --since=<window>d --name-only --pretty=format:%H|%aI|%s`
|
|
7
7
|
# once at the project root, auto-discovers plugins by listing `packages/*/`,
|
|
8
8
|
# and emits one NDJSON record per plugin with the v1.0 schema fields per
|
|
9
|
-
#
|
|
9
|
+
# windyroad-plugin-maturity-measurement-mechanism-session-transcript-invocation-counts-plus-commit-history-composite-read-only-ndjson-architecture-rule §Script contracts (line 87-113).
|
|
10
10
|
#
|
|
11
|
-
# Schema (per
|
|
11
|
+
# Schema (per windyroad-plugin-maturity-measurement-mechanism-session-transcript-invocation-counts-plus-commit-history-composite-read-only-ndjson-architecture-rule line 95-110):
|
|
12
12
|
# {"schema_version":"1.0","axis":"plugin-exercise-index","plugin":"<name>",
|
|
13
13
|
# "commits_window":<N>,"window_days":<N>,"days_shipped":<N>,
|
|
14
14
|
# "closed_tickets_window":<N>,"tickets_window_days":<N>,
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
# composite_index = log10(commits_window+1)
|
|
18
18
|
# + log10(closed_tickets_window+1)
|
|
19
19
|
# + (days_shipped >= 60 ? 1.0 : 0.0)
|
|
20
|
-
# (
|
|
20
|
+
# (windyroad-plugin-maturity-measurement-mechanism-session-transcript-invocation-counts-plus-commit-history-composite-read-only-ndjson-architecture-rule line 112, Option E6 "MAY emit alongside band" carve-out.)
|
|
21
21
|
#
|
|
22
22
|
# Usage:
|
|
23
23
|
# wr-itil-plugin-exercise-index [--window-days=N] [--tickets-window-days=N]
|
|
@@ -25,19 +25,19 @@
|
|
|
25
25
|
# [--category-overrides=FILE]
|
|
26
26
|
#
|
|
27
27
|
# Defaults:
|
|
28
|
-
# --window-days 60 (
|
|
29
|
-
# --tickets-window-days 90 (
|
|
28
|
+
# --window-days 60 (windyroad-plugin-maturity-measurement-mechanism-session-transcript-invocation-counts-plus-commit-history-composite-read-only-ndjson-architecture-rule line 89)
|
|
29
|
+
# --tickets-window-days 90 (windyroad-plugin-maturity-measurement-mechanism-session-transcript-invocation-counts-plus-commit-history-composite-read-only-ndjson-architecture-rule line 93)
|
|
30
30
|
# --project-root $PWD
|
|
31
31
|
#
|
|
32
32
|
# Exit codes:
|
|
33
|
-
# 0 = always —
|
|
33
|
+
# 0 = always — structured-user-interaction-for-governance-skill-decisions-architecture-rule Rule 6 fail-safe. Outside-git-repo, missing
|
|
34
34
|
# `packages/`, opt-out marker all hit the zero-records path
|
|
35
35
|
# with stderr-comment.
|
|
36
36
|
#
|
|
37
|
-
# Privacy (
|
|
37
|
+
# Privacy (centralised-review-reports-for-cross-project-skill-improvement-jsonl-at-claude-review-reports-architecture-rule clauses adopted verbatim, adapted for the git axis):
|
|
38
38
|
# - Opt-out marker `.claude/.skill-metrics-opt-out` disables reads.
|
|
39
39
|
# - No network egress — the script body invokes no exfiltration
|
|
40
|
-
# primitives.
|
|
40
|
+
# primitives. windyroad-plugin-maturity-measurement-mechanism-session-transcript-invocation-counts-plus-commit-history-composite-read-only-ndjson-architecture-rule §Confirmation 3 enforces via negative-grep on
|
|
41
41
|
# this file (banned-token list lives in the bats fixture, not here,
|
|
42
42
|
# to avoid self-matching).
|
|
43
43
|
# - Content sanitisation — commit subjects are parsed ONLY for
|
|
@@ -46,16 +46,16 @@
|
|
|
46
46
|
# only plugin-attribution surface is the `packages/<plugin>/` path
|
|
47
47
|
# prefix extracted from `--name-only` output.
|
|
48
48
|
#
|
|
49
|
-
# @problem
|
|
50
|
-
# @adr
|
|
51
|
-
# @adr
|
|
52
|
-
# @adr
|
|
53
|
-
# @adr
|
|
54
|
-
# @adr
|
|
55
|
-
# @adr
|
|
56
|
-
# @jtbd
|
|
49
|
+
# @problem problem-087-no-maturity-battle-hardening-signal-on-plugins-skills-agents-or-hooks-readmes-don-t-tell-users-which-features-are-stable-vs-experimental-problem (Phase 2b — git axis)
|
|
50
|
+
# @adr windyroad-plugin-maturity-measurement-mechanism-session-transcript-invocation-counts-plus-commit-history-composite-read-only-ndjson-architecture-rule (Plugin maturity measurement mechanism)
|
|
51
|
+
# @adr plugin-bundled-scripts-invoked-from-skill-md-resolve-via-bin-on-path-architecture-rule (Shim grammar — bin/wr-itil-plugin-exercise-index on $PATH)
|
|
52
|
+
# @adr centralised-review-reports-for-cross-project-skill-improvement-jsonl-at-claude-review-reports-architecture-rule (Privacy posture adopted verbatim)
|
|
53
|
+
# @adr behavioural-tests-default-for-skill-testing-architecture-rule (Behavioural tests default; windyroad-plugin-maturity-measurement-mechanism-session-transcript-invocation-counts-plus-commit-history-composite-read-only-ndjson-architecture-rule §Confirmation 6-8)
|
|
54
|
+
# @adr structured-user-interaction-for-governance-skill-decisions-architecture-rule Rule 6 (non-interactive fail-safe — exit 0 always)
|
|
55
|
+
# @adr wr-architect-agent-performance-review-scope-prompt-amendment-performance-budget-adr-template-architecture-rule (Performance — ≤1.0s warm-cache; 60-day window default)
|
|
56
|
+
# @jtbd extend-the-suite-with-new-plugins-user-outcome (Extend the Suite — hardening-prioritisation outcome,
|
|
57
57
|
# 2026-05-04 amendment serves Phase 2 NDJSON as data source)
|
|
58
|
-
# @jtbd
|
|
58
|
+
# @jtbd restore-service-fast-with-an-audit-trail-user-outcome (Restore Service Fast — audit-trail composition)
|
|
59
59
|
|
|
60
60
|
set -uo pipefail
|
|
61
61
|
|
|
@@ -82,7 +82,7 @@ for arg in "$@"; do
|
|
|
82
82
|
esac
|
|
83
83
|
done
|
|
84
84
|
|
|
85
|
-
# ── Opt-out marker check (
|
|
85
|
+
# ── 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) ───────────────
|
|
86
86
|
|
|
87
87
|
OPT_OUT_MARKER="${PROJECT_ROOT}/.claude/.skill-metrics-opt-out"
|
|
88
88
|
if [ -e "$OPT_OUT_MARKER" ]; then
|
|
@@ -90,14 +90,14 @@ if [ -e "$OPT_OUT_MARKER" ]; then
|
|
|
90
90
|
exit 0
|
|
91
91
|
fi
|
|
92
92
|
|
|
93
|
-
# ── Git-repo check (
|
|
93
|
+
# ── Git-repo check (structured-user-interaction-for-governance-skill-decisions-architecture-rule Rule 6 fail-safe) ───────────────────────────────
|
|
94
94
|
|
|
95
95
|
if [ ! -d "${PROJECT_ROOT}/.git" ] && ! git -C "$PROJECT_ROOT" rev-parse --git-dir >/dev/null 2>&1; then
|
|
96
96
|
echo "# wr-itil-plugin-exercise-index: not a git repository at ${PROJECT_ROOT}" >&2
|
|
97
97
|
exit 0
|
|
98
98
|
fi
|
|
99
99
|
|
|
100
|
-
# ── packages/ discovery check (
|
|
100
|
+
# ── packages/ discovery check (structured-user-interaction-for-governance-skill-decisions-architecture-rule Rule 6 fail-safe) ────────────────────
|
|
101
101
|
|
|
102
102
|
if [ ! -d "${PROJECT_ROOT}/packages" ]; then
|
|
103
103
|
echo "# wr-itil-plugin-exercise-index: no packages/ directory at ${PROJECT_ROOT}" >&2
|
|
@@ -115,7 +115,7 @@ if [ "$PLUGIN_COUNT" -eq 0 ]; then
|
|
|
115
115
|
exit 0
|
|
116
116
|
fi
|
|
117
117
|
|
|
118
|
-
# ── --category-overrides validation (
|
|
118
|
+
# ── --category-overrides validation (windyroad-plugin-maturity-measurement-mechanism-session-transcript-invocation-counts-plus-commit-history-composite-read-only-ndjson-architecture-rule §Per-category override hook) ───
|
|
119
119
|
# Forward-extension flag; ships unused in Phase 2.
|
|
120
120
|
|
|
121
121
|
if [ -n "$CATEGORY_OVERRIDES" ] && [ ! -f "$CATEGORY_OVERRIDES" ]; then
|
|
@@ -160,13 +160,13 @@ closed_tickets_window = defaultdict(int)
|
|
|
160
160
|
BREAKING_RE = re.compile(r"\b(BREAKING)\b|(?:^|\s)(feat!|fix!|chore!|refactor!)")
|
|
161
161
|
|
|
162
162
|
# ── Single git log pass with in-Python window filter ────────────────────────
|
|
163
|
-
#
|
|
163
|
+
# windyroad-plugin-maturity-measurement-mechanism-session-transcript-invocation-counts-plus-commit-history-composite-read-only-ndjson-architecture-rule line 89 pins `git log --since=<window>d --name-only
|
|
164
164
|
# --pretty=format:%H|%aI|%s`. Git's `--since=Nd` was observed unreliable on
|
|
165
165
|
# 2026-05-16 against the test fixture (returned empty even for commits well
|
|
166
166
|
# within the window — likely a date-parser quirk with future-year commit
|
|
167
167
|
# dates), so the window filter is applied in-Python against the `%aI`
|
|
168
168
|
# author-date field that is already extracted for `breaking_change_age_days`
|
|
169
|
-
# and `days_shipped`. The `git log` invocation otherwise matches the
|
|
169
|
+
# and `days_shipped`. The `git log` invocation otherwise matches the windyroad-plugin-maturity-measurement-mechanism-session-transcript-invocation-counts-plus-commit-history-composite-read-only-ndjson-architecture-rule
|
|
170
170
|
# contract verbatim (--name-only, the literal `|` separator). Single pass
|
|
171
171
|
# instead of two — pass-2 (oldest-commit) and pass-1 (in-window) collapse
|
|
172
172
|
# into one walk because we already iterate every commit's date.
|
|
@@ -245,7 +245,7 @@ for sha, iso_ts, subject, paths in parse_log_all():
|
|
|
245
245
|
del subject
|
|
246
246
|
continue
|
|
247
247
|
|
|
248
|
-
# days_shipped: track min(author_date) per plugin.
|
|
248
|
+
# days_shipped: track min(author_date) per plugin. windyroad-plugin-maturity-measurement-mechanism-session-transcript-invocation-counts-plus-commit-history-composite-read-only-ndjson-architecture-rule line 91 says
|
|
249
249
|
# "days since the OLDEST git commit"; oldest is interpreted as min by
|
|
250
250
|
# author-date rather than min by commit-topology so the value is stable
|
|
251
251
|
# against commit-reordering and rebase. (Topological --reverse can
|
|
@@ -257,7 +257,7 @@ for sha, iso_ts, subject, paths in parse_log_all():
|
|
|
257
257
|
if cur is None or ts < cur:
|
|
258
258
|
oldest_commit_ts[plug] = ts
|
|
259
259
|
|
|
260
|
-
# In-window filter — applied in Python (
|
|
260
|
+
# In-window filter — applied in Python (windyroad-plugin-maturity-measurement-mechanism-session-transcript-invocation-counts-plus-commit-history-composite-read-only-ndjson-architecture-rule line 89 contract for the
|
|
261
261
|
# git invocation; window cutoff in-process for portability).
|
|
262
262
|
if ts < cutoff:
|
|
263
263
|
del subject
|