@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,15 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
# Canonical shared migration routine — adopter `docs/problems/` flat → per-state subdir.
|
|
3
|
-
#
|
|
3
|
+
# 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 / problem-ticket-directory-layout-per-state-subdirectories-under-docs-problems-architecture-rule (accepted 2026-05-12).
|
|
4
4
|
#
|
|
5
|
-
# Adopter repos that installed `@windyroad/itil` before
|
|
5
|
+
# Adopter repos that installed `@windyroad/itil` before problem-ticket-directory-layout-per-state-subdirectories-under-docs-problems-architecture-rule acceptance
|
|
6
6
|
# carry the flat-layout `docs/problems/<NNN>-<slug>.<state>.md` shape. The
|
|
7
7
|
# `manage-problem` and `work-problems` skills source this file at Step 1
|
|
8
|
-
# (
|
|
8
|
+
# (governance-skill-invocation-patterns-foreground-background-with-deferred-question-resumption-architecture-rule foreground-synchronous) and call `migrate_problems_to_per_state_layout`
|
|
9
9
|
# before any layout-dependent logic, so adopter trees auto-migrate on first
|
|
10
10
|
# invocation post-update.
|
|
11
11
|
#
|
|
12
|
-
# Distribution:
|
|
12
|
+
# Distribution: shared-code-duplicated-into-per-package-lib-kept-in-sync-by-script-ci-drift-check-architecture-rule sync pattern. Canonical lives at
|
|
13
13
|
# packages/shared/lib/migrate-problems-layout.sh
|
|
14
14
|
# Synced into each consumer's lib/ (currently only `packages/itil/lib/`)
|
|
15
15
|
# by `scripts/sync-migrate-problems-layout.sh`. Drift is asserted by
|
|
@@ -51,9 +51,9 @@ detect_flat_layout() {
|
|
|
51
51
|
# Idempotent + partial-migration-safe entrypoint.
|
|
52
52
|
# Returns 0 when already-migrated (no-op) OR migration completed cleanly.
|
|
53
53
|
# Returns non-zero on git failure. Writes a standalone commit with
|
|
54
|
-
# subject `docs(problems): auto-migrate to per-state subdirectory layout (
|
|
54
|
+
# subject `docs(problems): auto-migrate to per-state subdirectory layout (problem-ticket-directory-layout-per-state-subdirectories-under-docs-problems-architecture-rule)`
|
|
55
55
|
# and a footer `RISK_BYPASS: adr-031-migration` trailer recognised by the
|
|
56
|
-
# commit-gate hook (T11). Standalone-commit grain per
|
|
56
|
+
# commit-gate hook (T11). Standalone-commit grain per problem-ticket-directory-layout-per-state-subdirectories-under-docs-problems-architecture-rule §
|
|
57
57
|
# Backward Compatibility (line 124).
|
|
58
58
|
migrate_problems_to_per_state_layout() {
|
|
59
59
|
local repo_root="${1:-$PWD}"
|
|
@@ -103,12 +103,12 @@ migrate_problems_to_per_state_layout() {
|
|
|
103
103
|
return 0
|
|
104
104
|
fi
|
|
105
105
|
|
|
106
|
-
#
|
|
106
|
+
# progress-the-backlog-while-i-m-away-user-outcome AFK transparency (T8 jtbd-review nitpick c): single stderr
|
|
107
107
|
# line on first-fire so AFK orchestrator output records the action.
|
|
108
|
-
echo "migrate-problems-layout: relocated $moved_count tickets to per-state subdirs (
|
|
108
|
+
echo "migrate-problems-layout: relocated $moved_count tickets to per-state subdirs (problem-ticket-directory-layout-per-state-subdirectories-under-docs-problems-architecture-rule)" >&2
|
|
109
109
|
|
|
110
|
-
#
|
|
111
|
-
# commit body cites
|
|
110
|
+
# restore-service-fast-with-an-audit-trail-user-outcome audit-trail forward-pointer (T8 jtbd-review nitpick b):
|
|
111
|
+
# commit body cites problem-ticket-directory-layout-per-state-subdirectories-under-docs-problems-architecture-rule so future `git log` readers have the
|
|
112
112
|
# semantic context without needing to grep the trailer.
|
|
113
113
|
# T10 fix: use sequential `-m` paragraphs instead of `--trailer`; the
|
|
114
114
|
# `--trailer` mechanism in git 2.47.x appended a spurious trailing
|
|
@@ -116,9 +116,9 @@ migrate_problems_to_per_state_layout() {
|
|
|
116
116
|
# parsers downstream. Sequential `-m` paragraphs write a clean
|
|
117
117
|
# `RISK_BYPASS: adr-031-migration` line in the body.
|
|
118
118
|
(cd "$repo_root" && git commit \
|
|
119
|
-
-m "docs(problems): auto-migrate to per-state subdirectory layout (
|
|
119
|
+
-m "docs(problems): auto-migrate to per-state subdirectory layout (problem-ticket-directory-layout-per-state-subdirectories-under-docs-problems-architecture-rule)" \
|
|
120
120
|
-m "See: docs/decisions/031-problem-ticket-directory-layout.accepted.md" \
|
|
121
|
-
-m "Policy-authorised under
|
|
121
|
+
-m "Policy-authorised under structured-user-interaction-for-governance-skill-decisions-architecture-rule Rule 6 + afk-orchestrator-preflight-get-the-repo-into-a-clean-state-before-starting-architecture-rule precedent (pure-rename + pure-mkdir; fully reversible via git revert)." \
|
|
122
122
|
-m "RISK_BYPASS: adr-031-migration") || {
|
|
123
123
|
echo "ERROR: migration commit failed" >&2
|
|
124
124
|
return 1
|
package/lib/story-oversight.sh
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
# story-oversight.sh —
|
|
2
|
+
# story-oversight.sh — story-maps-and-stories-carry-a-drift-invalidated-human-oversight-marker-architecture-rule lazy-fingerprint ratification helpers.
|
|
3
3
|
#
|
|
4
4
|
# Shared by detect-unratified-stories-maps.sh, check-rfc-stories-ratified.sh, and
|
|
5
5
|
# mark-story-oversight-confirmed.sh so all three agree on ONE hash definition
|
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
# A story MAP is RATIFIED when it carries a `confirmed` human-oversight marker
|
|
9
9
|
# AND a stored oversight-hash that matches a fresh hash of its content-minus-
|
|
10
10
|
# marker. Any content edit changes the hash → the artefact reads as drifted /
|
|
11
|
-
# unratified until re-ratified. This is
|
|
12
|
-
# drift lineage, NOT
|
|
11
|
+
# unratified until re-ratified. This is story-maps-and-stories-carry-a-drift-invalidated-human-oversight-marker-architecture-rule's drift-invalidation (gate-marker-lifecycle-ttl-drift-not-stop-hook-reset-architecture-rule
|
|
12
|
+
# drift lineage, NOT human-oversight-marker-wr-architect-review-decisions-drain-for-recorded-decisions-architecture-rule write-once) — the same hash-the-artefact pattern
|
|
13
13
|
# the external-comms gate uses.
|
|
14
14
|
#
|
|
15
15
|
# Sourced, not executed. Requires `shasum` (BSD + coreutils both ship it).
|
|
@@ -19,17 +19,17 @@
|
|
|
19
19
|
# encodings in one filter:
|
|
20
20
|
# - markdown: `human-oversight:` / `oversight-hash:` frontmatter lines
|
|
21
21
|
# - HTML: <meta name="human-oversight" ...> / <meta name="oversight-hash" ...>
|
|
22
|
-
# -
|
|
23
|
-
# `"oversightHash":` / `"oversightDate":` / `"oversightNote":`. Since
|
|
22
|
+
# - story-maps-render-from-json-through-a-canonical-template-architecture-rule data island: the same fields as JSON keys, `"humanOversight":` /
|
|
23
|
+
# `"oversightHash":` / `"oversightDate":` / `"oversightNote":`. Since story-maps-render-from-json-through-a-canonical-template-architecture-rule
|
|
24
24
|
# scopes a map's hash to the island, the marker now lives INSIDE the hashed
|
|
25
25
|
# region — so without this third spelling, ratifying a map mutated the very
|
|
26
26
|
# bytes it was fingerprinting and the stored hash could never match. Every
|
|
27
27
|
# map would have read as drifted the instant it was ratified.
|
|
28
28
|
# THE single definition of what the fingerprint ignores. Reads stdin, writes the
|
|
29
29
|
# normalised stream. Both hash functions route through this and neither carries
|
|
30
|
-
# its own copy — that duplication is why the
|
|
30
|
+
# its own copy — that duplication is why the oversight-hash-treats-the-status-body-mirror-as-substance-so-an-accept-transition-self-invalidates-its-own-ratification-problem `**Status**:` mirror had to be
|
|
31
31
|
# removed from two places and why a third copy could have been missed entirely
|
|
32
|
-
# (
|
|
32
|
+
# (lifecycle-state-is-not-duplicated-inside-hashed-story-content-release-design / one-definition-of-what-the-oversight-fingerprint-ignores-delivery-story).
|
|
33
33
|
#
|
|
34
34
|
# Excludes the marker lines plus the lifecycle `status` key in both encodings, and
|
|
35
35
|
# normalises lifecycle PROGRESS — acceptance-criterion ticks and slice
|
|
@@ -37,9 +37,9 @@
|
|
|
37
37
|
# criterion or advancing status is progress, not a revision of what the human
|
|
38
38
|
# ratified; the value statement, criterion TEXT and structure all still drift.
|
|
39
39
|
#
|
|
40
|
-
# Editing this filter changes
|
|
40
|
+
# Editing this filter changes story-maps-and-stories-carry-a-drift-invalidated-human-oversight-marker-architecture-rule's Decision Outcome, not merely a mechanism.
|
|
41
41
|
# It is the surface the 2026-07-03 narrowing changed while going unrecorded for
|
|
42
|
-
# three weeks; a change here needs an
|
|
42
|
+
# three weeks; a change here needs an story-maps-and-stories-carry-a-drift-invalidated-human-oversight-marker-architecture-rule amendment. The pattern is a
|
|
43
43
|
# LITERAL on purpose: built from a variable, an expansion that ever yielded empty
|
|
44
44
|
# would make `grep -vE ''` suppress every line and hash the empty stream to a
|
|
45
45
|
# constant, after which one artefact's stored hash would validate against ANY
|
|
@@ -59,20 +59,20 @@ oversight_excluded_keys() {
|
|
|
59
59
|
|
|
60
60
|
# The MAP-SUBSTANCE key set: the island keys a story map's ratification hangs on.
|
|
61
61
|
#
|
|
62
|
-
# Editing this set — here or in the SUBSTANCE tuple below — changes
|
|
63
|
-
# Decision Outcome as amended by
|
|
64
|
-
# trigger. A change here needs an
|
|
62
|
+
# Editing this set — here or in the SUBSTANCE tuple below — changes story-maps-and-stories-carry-a-drift-invalidated-human-oversight-marker-architecture-rule's
|
|
63
|
+
# Decision Outcome as amended by a-release-row-is-the-rfc-and-the-map-is-the-approval-surface-architecture-rule, not merely a mechanism. It IS the drift
|
|
64
|
+
# trigger. A change here needs an story-maps-and-stories-carry-a-drift-invalidated-human-oversight-marker-architecture-rule amendment, and the bidirectional test
|
|
65
65
|
# will NOT catch that: it asserts the accessor and the tuple agree, so it passes
|
|
66
66
|
# whenever both move together, which is the shape of exactly that edit. The
|
|
67
67
|
# sibling notice on _oversight_filter says the same thing for the same reason.
|
|
68
68
|
#
|
|
69
69
|
# SCOPE: island keys only. Unlike oversight_excluded_keys, which strips keys from
|
|
70
70
|
# every artefact in three encodings, this set is meaningless for anything with no
|
|
71
|
-
# island — stories and pre-
|
|
71
|
+
# island — stories and pre-story-maps-render-from-json-through-a-canonical-template-architecture-rule maps fall through to whole-file bytes. The two
|
|
72
72
|
# are not complements; `excluded ∪ substance` is not the key space.
|
|
73
73
|
#
|
|
74
|
-
# THIS IS THE ONLY ENUMERATION. Six documents used to restate it (
|
|
75
|
-
#
|
|
74
|
+
# THIS IS THE ONLY ENUMERATION. Six documents used to restate it (story-maps-and-stories-carry-a-drift-invalidated-human-oversight-marker-architecture-rule,
|
|
75
|
+
# a-release-row-is-the-rfc-and-the-map-is-the-approval-surface-architecture-rule, the-grid-ships-in-the-file-a-map-is-readable-with-no-script-engine-architecture-rule, capture-story-map, and manage-story-map twice) and by
|
|
76
76
|
# 2026-08-08 it had drifted in both directions at once: the ADRs still named
|
|
77
77
|
# `lead` and `traceProse`, dead the day before, while manage-story-map had lost
|
|
78
78
|
# `storyMapId` and `secondaryPersona`, both live. The prose now states the rule
|
|
@@ -88,25 +88,25 @@ oversight_map_substance_keys() {
|
|
|
88
88
|
|
|
89
89
|
# Emit the bytes a fingerprint should cover.
|
|
90
90
|
#
|
|
91
|
-
# For a story map under
|
|
91
|
+
# For a story map under story-maps-render-from-json-through-a-canonical-template-architecture-rule that is the DATA ISLAND alone, not the whole
|
|
92
92
|
# file: the grid, the <style> block and the <meta> block are all generated from
|
|
93
93
|
# the island, so hashing the whole file would let a template change regenerate
|
|
94
94
|
# every map, drift every stored fingerprint, and silently revoke ratification
|
|
95
|
-
# across the corpus (
|
|
95
|
+
# across the corpus (story-maps-and-stories-carry-a-drift-invalidated-human-oversight-marker-architecture-rule's marker is drift-invalidated). A presentation
|
|
96
96
|
# change must never revoke a substance approval.
|
|
97
97
|
#
|
|
98
|
-
# Anything with no island — stories (.md), and maps predating
|
|
98
|
+
# Anything with no island — stories (.md), and maps predating story-maps-render-from-json-through-a-canonical-template-architecture-rule — falls
|
|
99
99
|
# through to whole-file bytes, so the story leg and the legacy corpus are
|
|
100
100
|
# untouched.
|
|
101
101
|
_oversight_hashable() {
|
|
102
102
|
local f="$1"
|
|
103
103
|
if grep -qF '<script id="story-map-data"' "$f" 2>/dev/null; then
|
|
104
|
-
#
|
|
104
|
+
# a-release-row-is-the-rfc-and-the-map-is-the-approval-surface-architecture-rule: the fingerprint covers SUBSTANCE only — the map's identity and
|
|
105
105
|
# prose, its traces, and its backbone (the activity columns). Releases and
|
|
106
106
|
# the cards in them are SCHEDULING: drawing a row, or putting a story in
|
|
107
107
|
# one, is not a revision of what a human approved.
|
|
108
108
|
#
|
|
109
|
-
# This is what retires the
|
|
109
|
+
# This is what retires the an-afk-loop-may-accept-and-implement-a-story-that-only-decomposes-already-ratified-substance-architecture-rule carve-out. That existed because
|
|
110
110
|
# capturing a story onto its map drifted the map's hash, which broke the
|
|
111
111
|
# very condition the story had to satisfy. With cards outside the basis,
|
|
112
112
|
# the drift never happens and the carve-out has nothing to carve.
|
|
@@ -144,17 +144,17 @@ oversight_content_hash() {
|
|
|
144
144
|
_oversight_hashable "$1" | _oversight_filter | shasum -a 256 | awk '{print $1}'
|
|
145
145
|
}
|
|
146
146
|
|
|
147
|
-
#
|
|
148
|
-
# The carve-out existed because
|
|
149
|
-
# which under
|
|
147
|
+
# 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 AFK pure-decomposition carve-out and its map leg.
|
|
148
|
+
# The carve-out existed because story-map-membership-and-story-content-completeness-are-enforced-at-capture-architecture-rule compels a card onto the map at capture,
|
|
149
|
+
# which under story-maps-and-stories-carry-a-drift-invalidated-human-oversight-marker-architecture-rule drift-invalidation re-opened the map's ratification by
|
|
150
150
|
# construction — the condition a story had to satisfy was broken by authoring the
|
|
151
|
-
# story.
|
|
151
|
+
# story. a-release-row-is-the-rfc-and-the-map-is-the-approval-surface-architecture-rule took cards out of the fingerprint basis entirely, so that no
|
|
152
152
|
# longer happens and there is nothing left to exclude. Removed with it:
|
|
153
153
|
# oversight_content_hash_excluding_stories, oversight_map_leg_ok,
|
|
154
154
|
# oversight_is_pure_decomposition, oversight_declares_pure_decomposition.
|
|
155
155
|
|
|
156
156
|
# Echo the stored oversight-hash, empty if none. Three spellings carry the same
|
|
157
|
-
# fact: md frontmatter, an HTML <meta>, and — for an
|
|
157
|
+
# fact: md frontmatter, an HTML <meta>, and — for an story-maps-render-from-json-through-a-canonical-template-architecture-rule map — the data
|
|
158
158
|
# island, which is where mark-story-oversight-confirmed actually writes. The
|
|
159
159
|
# island MUST be read here: the <meta> is a projection the renderer regenerates
|
|
160
160
|
# from it, so a map marked but not yet re-rendered would otherwise read as
|
|
@@ -171,7 +171,7 @@ oversight_stored_hash() {
|
|
|
171
171
|
oversight_is_confirmed() {
|
|
172
172
|
grep -qiE '^human-oversight:[[:space:]]*confirmed([[:space:]]|$)' "$1" && return 0
|
|
173
173
|
grep -qiE '<meta[^>]*name="human-oversight"[^>]*content="confirmed"' "$1" && return 0
|
|
174
|
-
#
|
|
174
|
+
# story-maps-render-from-json-through-a-canonical-template-architecture-rule island spelling — see oversight_stored_hash for why this is load-bearing.
|
|
175
175
|
grep -qiE '"humanOversight"[[:space:]]*:[[:space:]]*"confirmed"' "$1" && return 0
|
|
176
176
|
return 1
|
|
177
177
|
}
|
|
@@ -187,7 +187,7 @@ is_story_map_ratified() {
|
|
|
187
187
|
[ "$stored" = "$(oversight_content_hash "$f")" ]
|
|
188
188
|
}
|
|
189
189
|
|
|
190
|
-
# Is this STORY approved?
|
|
190
|
+
# Is this STORY approved? a-release-row-is-the-rfc-and-the-map-is-the-approval-surface-architecture-rule made the story map the approval surface, and a
|
|
191
191
|
# story carries no oversight marker of its own — not even one saying it inherits.
|
|
192
192
|
# A story is approved exactly when every map it names is ratified.
|
|
193
193
|
#
|
package/package.json
CHANGED
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@windyroad/itil",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "ITIL-aligned IT service management for Claude Code
|
|
3
|
+
"version": "2.0.0-preview.1111",
|
|
4
|
+
"description": "ITIL-aligned IT service management for Claude Code and Codex",
|
|
5
5
|
"bin": {
|
|
6
6
|
"windyroad-itil": "./bin/install.mjs"
|
|
7
7
|
},
|
|
8
8
|
"type": "module",
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build:codex": "node scripts/sync-codex-skills.mjs --build",
|
|
11
|
+
"prepack": "node scripts/sync-codex-skills.mjs --pack",
|
|
12
|
+
"postpack": "node scripts/sync-codex-skills.mjs --restore-pack"
|
|
13
|
+
},
|
|
9
14
|
"license": "MIT",
|
|
10
15
|
"repository": {
|
|
11
16
|
"type": "git",
|
|
@@ -17,22 +22,30 @@
|
|
|
17
22
|
"claude-code-plugin",
|
|
18
23
|
"ai-agent",
|
|
19
24
|
"ai-coding",
|
|
20
|
-
"itil"
|
|
25
|
+
"itil",
|
|
26
|
+
"codex"
|
|
21
27
|
],
|
|
22
28
|
"files": [
|
|
23
29
|
"bin/",
|
|
24
30
|
"agents/",
|
|
25
31
|
"hooks/",
|
|
26
32
|
"skills/",
|
|
33
|
+
"skills-codex/",
|
|
27
34
|
"scripts/",
|
|
28
35
|
"templates/",
|
|
36
|
+
".agents/",
|
|
29
37
|
".claude-plugin/",
|
|
38
|
+
".codex-plugin/",
|
|
39
|
+
"hooks-codex/",
|
|
30
40
|
"lib/",
|
|
31
41
|
"!skills/*/eval/",
|
|
32
42
|
"!agents/test/",
|
|
33
43
|
"!hooks/test/",
|
|
34
44
|
"!lib/test/",
|
|
35
45
|
"!scripts/test/",
|
|
46
|
+
"!scripts/check-published-internal-ids.sh",
|
|
47
|
+
"!scripts/codex-work-problems.md",
|
|
48
|
+
"!scripts/sync-codex-skills.mjs",
|
|
36
49
|
"!skills/*/test/"
|
|
37
50
|
]
|
|
38
51
|
}
|
package/scripts/catchup-scan.sh
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
# packages/itil/scripts/catchup-scan.sh
|
|
3
3
|
#
|
|
4
|
-
# Phase 2 of
|
|
4
|
+
# Phase 2 of problem-080-no-bidirectional-update-of-upstream-reported-problems-local-lifecycle-transitions-never-propagate-back-to-the-reporter-problem — `--catchup` migration-mode worklist scanner for
|
|
5
5
|
# `/wr-itil:update-upstream`. Walks the EXISTING `.verifying.md` +
|
|
6
6
|
# `.closed.md` ticket corpus, filters to tickets carrying a `## Reported
|
|
7
7
|
# Upstream` back-link section (written by `/wr-itil:report-upstream`
|
|
@@ -10,16 +10,16 @@
|
|
|
10
10
|
#
|
|
11
11
|
# Read-only / local-only: this script makes NO `gh` calls and NO writes.
|
|
12
12
|
# It only reads local ticket files and prints a worklist to stdout. The
|
|
13
|
-
# actual `gh issue comment` / `gh issue close` posts — and the
|
|
13
|
+
# actual `gh issue comment` / `gh issue close` posts — and the external-comms-gate-voice-tone-risk-leak-evaluators-on-shared-pretooluse-surface-architecture-rule
|
|
14
14
|
# external-comms + voice-tone gate composition that guards them — stay in
|
|
15
15
|
# the `/wr-itil:update-upstream` SKILL's per-ticket Step 4-6 loop, which
|
|
16
16
|
# consumes this worklist. Keeping the writes out of the scanner keeps it
|
|
17
17
|
# AFK-safe and behaviourally testable without a live upstream.
|
|
18
18
|
#
|
|
19
|
-
# Idempotency (
|
|
19
|
+
# Idempotency (problem-080-no-bidirectional-update-of-upstream-reported-problems-local-lifecycle-transitions-never-propagate-back-to-the-reporter-problem Phase 2 acceptance criterion 3): a ticket whose
|
|
20
20
|
# `## Upstream Lifecycle Updates` log already records an entry for the
|
|
21
21
|
# current target-state transition is reported as SKIP/already-logged, NOT
|
|
22
|
-
# re-posted. The marker-on-body log (append-only per the
|
|
22
|
+
# re-posted. The marker-on-body log (append-only per the cross-project-problem-reporting-contract-report-upstream-skill-in-windyroad-itil-architecture-rule problem-080-no-bidirectional-update-of-upstream-reported-problems-local-lifecycle-transitions-never-propagate-back-to-the-reporter-problem
|
|
23
23
|
# amendment) is the source of truth — re-running catchup is safe.
|
|
24
24
|
#
|
|
25
25
|
# Usage:
|
|
@@ -31,19 +31,19 @@
|
|
|
31
31
|
# 0 = success (zero or more worklist lines on stdout)
|
|
32
32
|
# 1 = error (problems-dir missing, malformed CLI args)
|
|
33
33
|
#
|
|
34
|
-
# Two surfaces are walked (
|
|
34
|
+
# Two surfaces are walked (catchup-scanner-misses-the-inbound-direction-outbound-templates-carry-the-same-structural-defect-the-rework-fixed-on-the-inbound-side-cross-direction-parity-gap-problem — cross-direction parity):
|
|
35
35
|
# OUTBOUND — tickets with a `## Reported Upstream` section (issues WE filed
|
|
36
36
|
# against an upstream we depend on).
|
|
37
37
|
# INBOUND — tickets with an `**Origin**: inbound-reported (#NN)` field
|
|
38
|
-
# (
|
|
39
|
-
# the
|
|
38
|
+
# (inbound-reported-problems-rank-ahead-of-internally-discovered-problems-via-a-sort-tier-architecture-rule — issues someone else filed *against us* on our own repo, which
|
|
39
|
+
# the inbound-reported-tickets-never-receive-fix-released-verdict-on-originating-issue-problem rework made dispatchable). Without this leg the inbound catchup
|
|
40
40
|
# candidates were a manual `grep -lE '^\*\*Origin\*\*:\s*inbound-reported'`
|
|
41
41
|
# surface the maintainer had to remember after every `--catchup` run.
|
|
42
42
|
# A ticket carrying BOTH surfaces emits BOTH an outbound and an inbound line
|
|
43
43
|
# (the two legs are independent, mirroring the update-upstream SKILL).
|
|
44
44
|
#
|
|
45
45
|
# Structured stdout (one per actionable upstream entry; <= 150 bytes per
|
|
46
|
-
# line per
|
|
46
|
+
# line per progressive-disclosure-once-per-session-budget-for-userpromptsubmit-governance-prose-architecture-rule). ASCII `->` for the transition arrow per the generate-decisions-compendium-sh-uses-awk-substr-with-unicode-ellipsis-not-portable-between-macos-bsd-awk-and-linux-gnu-awk-ci-drift-gate-fires-on-cross-platform-regenerations-problem
|
|
47
47
|
# awk/script portability lesson (no Unicode in machine-read output):
|
|
48
48
|
# CATCHUP P<NNN> <url> state=<state> transition=<KE->Verifying|Verifying->Closed> disclosure=<issue|pull-request>
|
|
49
49
|
# CATCHUP P<NNN> inbound-<ref> state=<state> transition=<…> direction=inbound
|
|
@@ -57,24 +57,24 @@
|
|
|
57
57
|
# Trailing summary line (stderr) for the SKILL / human reader:
|
|
58
58
|
# SUMMARY scanned=<N> catchup=<N> skip-logged=<N> skip-out-of-band=<N>
|
|
59
59
|
#
|
|
60
|
-
# @problem
|
|
61
|
-
# @adr
|
|
62
|
-
# @adr
|
|
63
|
-
# @adr
|
|
64
|
-
# @adr
|
|
65
|
-
# @adr
|
|
66
|
-
# @adr
|
|
67
|
-
# @adr
|
|
60
|
+
# @problem problem-080-no-bidirectional-update-of-upstream-reported-problems-local-lifecycle-transitions-never-propagate-back-to-the-reporter-problem — no bidirectional update of upstream-reported problems (Phase 2 --catchup)
|
|
61
|
+
# @adr cross-project-problem-reporting-contract-report-upstream-skill-in-windyroad-itil-architecture-rule (amended problem-080-no-bidirectional-update-of-upstream-reported-problems-local-lifecycle-transitions-never-propagate-back-to-the-reporter-problem Phase 2 — --catchup migration mode + idempotency contract)
|
|
62
|
+
# @adr governance-skills-commit-their-own-completed-work-architecture-rule (governance skills commit their own work)
|
|
63
|
+
# @adr progressive-disclosure-once-per-session-budget-for-userpromptsubmit-governance-prose-architecture-rule (progressive disclosure — per-row byte budget)
|
|
64
|
+
# @adr plugin-bundled-scripts-invoked-from-skill-md-resolve-via-bin-on-path-architecture-rule (invoked via wr-itil-catchup-scan bin shim, never repo-relative path)
|
|
65
|
+
# @adr governance-skill-invocation-patterns-foreground-background-with-deferred-question-resumption-architecture-rule (foreground synchronous skill)
|
|
66
|
+
# @adr inbound-reported-problems-rank-ahead-of-internally-discovered-problems-via-a-sort-tier-architecture-rule (reads the `**Origin**: inbound-reported (#NN)` field for the inbound leg)
|
|
67
|
+
# @adr prefer-an-upstream-pull-request-over-an-issue-when-the-upstream-accepts-pull-requests-architecture-rule (prefer an upstream pull request over an issue — the CATCHUP
|
|
68
68
|
# row carries a `disclosure=` discriminator so the consuming skill knows
|
|
69
69
|
# whether to comment on a pull request or an issue. A `pull request` path
|
|
70
70
|
# is actionable, so it is NOT skipped alongside out-of-band / mailbox.)
|
|
71
|
-
# @problem
|
|
72
|
-
# @rfc
|
|
73
|
-
# @jtbd
|
|
74
|
-
# @jtbd
|
|
75
|
-
# @jtbd
|
|
76
|
-
# @jtbd
|
|
77
|
-
# @jtbd
|
|
71
|
+
# @problem catchup-scanner-misses-the-inbound-direction-outbound-templates-carry-the-same-structural-defect-the-rework-fixed-on-the-inbound-side-cross-direction-parity-gap-problem — catchup scanner misses the inbound direction (cross-direction parity)
|
|
72
|
+
# @rfc consume-the-origin-field-for-inbound-reported-fix-released-verdict-release-design (consume the Origin field for inbound-reported verdict — extended to the catchup surface)
|
|
73
|
+
# @jtbd report-a-problem-without-pre-classifying-it-user-outcome (reporter feedback loop — the catchup's primary job)
|
|
74
|
+
# @jtbd progress-the-backlog-while-i-m-away-user-outcome (AFK-safe worklist scanner)
|
|
75
|
+
# @jtbd connect-agents-across-repos-to-collaborate-user-outcome (cross-repo coordination — reconcile local corpus vs upstream trackers)
|
|
76
|
+
# @jtbd enforce-governance-without-slowing-down-user-outcome (governance without slowing down — derive the worklist, no manual policing)
|
|
77
|
+
# @jtbd restore-service-fast-with-an-audit-trail-user-outcome (symmetric local/upstream audit trail)
|
|
78
78
|
|
|
79
79
|
set -uo pipefail
|
|
80
80
|
|
|
@@ -108,7 +108,7 @@ fi
|
|
|
108
108
|
# reporter most wants (fix released / closed) are the ones the pre-Phase-1
|
|
109
109
|
# corpus is missing. Open / Known-Error / Parked tickets are out of scope
|
|
110
110
|
# for the migration (their transitions, if linked, fire the per-ticket
|
|
111
|
-
# path going forward). Dual-tolerant per
|
|
111
|
+
# path going forward). Dual-tolerant per docs-problems-flat-layout-migration-per-state-subdirs-adopter-auto-migration-release-design: flat layout
|
|
112
112
|
# `<NNN>-*.<status>.md` AND per-state subdir `<status>/<NNN>-*.md`.
|
|
113
113
|
|
|
114
114
|
shopt -s nullglob
|
|
@@ -170,7 +170,7 @@ extract_ticket_id() {
|
|
|
170
170
|
}
|
|
171
171
|
|
|
172
172
|
# Extract the actionable inbound issue ref from the `**Origin**:
|
|
173
|
-
# inbound-reported (<ref>)` field (
|
|
173
|
+
# inbound-reported (<ref>)` field (inbound-reported-problems-rank-ahead-of-internally-discovered-problems-via-a-sort-tier-architecture-rule). Returns the `#NN` /
|
|
174
174
|
# `<repo>#NN` token, or empty when the Origin is not inbound-reported OR
|
|
175
175
|
# carries no actionable issue number (e.g. "relayed from other projects").
|
|
176
176
|
extract_inbound_ref() {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
# check-fail-soft-skip-discipline.sh — advisory lint for
|
|
2
|
+
# check-fail-soft-skip-discipline.sh — advisory lint for skills-fail-soft-skip-when-their-precondition-config-is-missing-should-auto-bootstrap-with-user-input-as-needed-rather-than-silently-skipping-problem (skills
|
|
3
3
|
# fail-soft-skip when their precondition config is missing — should
|
|
4
4
|
# auto-bootstrap with user input as needed rather than silently
|
|
5
5
|
# skipping).
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
# Detects SKILL.md prose that names the fail-soft-skip pattern without
|
|
8
8
|
# a paired auto-bootstrap routine. The default behaviour of skills with
|
|
9
9
|
# config-file preconditions has been "fail-soft skip" when the config is
|
|
10
|
-
# missing; the right behaviour (per
|
|
10
|
+
# missing; the right behaviour (per skills-fail-soft-skip-when-their-precondition-config-is-missing-should-auto-bootstrap-with-user-input-as-needed-rather-than-silently-skipping-problem) is to recognise the gap and
|
|
11
11
|
# auto-bootstrap the missing config — invoking AskUserQuestion for any
|
|
12
12
|
# required user input, then proceeding with the original pass. In AFK
|
|
13
13
|
# mode where AskUserQuestion is unavailable, queue a config-direction
|
|
@@ -43,13 +43,13 @@
|
|
|
43
43
|
# Promote `WR_FAIL_SOFT_SKIP_WARN_ONLY=0` once every affected SKILL.md
|
|
44
44
|
# has been migrated to the auto-bootstrap pattern.
|
|
45
45
|
#
|
|
46
|
-
# @adr
|
|
47
|
-
# @adr
|
|
48
|
-
# @adr
|
|
49
|
-
# @adr
|
|
50
|
-
# @jtbd
|
|
51
|
-
# @jtbd
|
|
52
|
-
# @problem
|
|
46
|
+
# @adr session-start-briefing-surface-sessionstart-hook-over-tiered-directory-indexed-readme-architecture-rule (advisory-then-load-bearing reusable pattern)
|
|
47
|
+
# @adr plugin-bundled-scripts-invoked-from-skill-md-resolve-via-bin-on-path-architecture-rule (plugin-bundled scripts; PATH shim)
|
|
48
|
+
# @adr behavioural-tests-default-for-skill-testing-architecture-rule (behavioural-tests-default)
|
|
49
|
+
# @adr structured-user-interaction-for-governance-skill-decisions-architecture-rule Rule 6 (non-interactive fail-safe — advisory exit 0)
|
|
50
|
+
# @jtbd enforce-governance-without-slowing-down-user-outcome (Enforce Governance Without Slowing Down)
|
|
51
|
+
# @jtbd extend-the-suite-with-new-plugins-user-outcome (Extend the Suite with New Plugins)
|
|
52
|
+
# @problem skills-fail-soft-skip-when-their-precondition-config-is-missing-should-auto-bootstrap-with-user-input-as-needed-rather-than-silently-skipping-problem (skills fail-soft-skip when precondition config missing
|
|
53
53
|
# — should auto-bootstrap with user input)
|
|
54
54
|
|
|
55
55
|
set -uo pipefail
|
|
@@ -132,7 +132,7 @@ done
|
|
|
132
132
|
if [ "$violations" -gt 0 ]; then
|
|
133
133
|
echo "" >&2
|
|
134
134
|
echo "check-fail-soft-skip-discipline: $violations potential fail-soft-skip site(s) across $scanned SKILL.md file(s)" >&2
|
|
135
|
-
echo "Phase 1 advisory (WR_FAIL_SOFT_SKIP_WARN_ONLY=$WARN_ONLY). Authors should pair each site with an auto-bootstrap routine per
|
|
135
|
+
echo "Phase 1 advisory (WR_FAIL_SOFT_SKIP_WARN_ONLY=$WARN_ONLY). Authors should pair each site with an auto-bootstrap routine per skills-fail-soft-skip-when-their-precondition-config-is-missing-should-auto-bootstrap-with-user-input-as-needed-rather-than-silently-skipping-problem." >&2
|
|
136
136
|
if [ "$WARN_ONLY" = "0" ]; then
|
|
137
137
|
exit 1
|
|
138
138
|
fi
|
|
@@ -60,18 +60,18 @@
|
|
|
60
60
|
# Exit 3 is a refusal the caller can act on without reading prose, and is
|
|
61
61
|
# distinct from caller-misuse 2.
|
|
62
62
|
#
|
|
63
|
-
# @adr
|
|
63
|
+
# @adr a-fix-proposal-draws-a-release-row-never-a-document-architecture-rule (a fix proposal draws a release row, never a document; the reader
|
|
64
64
|
# is repointed ahead of the writer and fails closed during the window)
|
|
65
|
-
# @adr
|
|
65
|
+
# @adr a-release-row-is-the-rfc-and-the-map-is-the-approval-surface-architecture-rule (a release row is the RFC; the map is the approval surface, and
|
|
66
66
|
# a proposal needing a new map queues for a person)
|
|
67
|
-
# @adr
|
|
68
|
-
# @adr
|
|
69
|
-
# @adr
|
|
67
|
+
# @adr every-fix-goes-through-an-rfc-architecture-rule (every fix goes through an RFC — unconditional, no carve-out)
|
|
68
|
+
# @adr problem-rfc-story-framework-with-mandatory-problem-trace-and-unified-problem-ontology-architecture-rule (I1 load-bearing-from-the-start; I13 fix-proposal invariant)
|
|
69
|
+
# @adr plugin-bundled-scripts-invoked-from-skill-md-resolve-via-bin-on-path-architecture-rule (invoked via the wr-itil-check-fix-rfc-trace bin shim on
|
|
70
70
|
# $PATH; never repo-relative from a SKILL)
|
|
71
|
-
# @adr
|
|
71
|
+
# @adr behavioural-tests-default-for-skill-testing-architecture-rule (behavioural bats coverage in
|
|
72
72
|
# packages/itil/scripts/test/check-fix-rfc-trace.bats)
|
|
73
|
-
# @problem
|
|
74
|
-
# @problem
|
|
73
|
+
# @problem rework-the-fix-time-rfc-trace-gate-wrong-lifecycle-placement-hard-block-should-be-auto-create-per-corrected-known-error-semantics-problem
|
|
74
|
+
# @problem the-fix-proposal-still-instantiates-a-standalone-rfc-document-after-made-it-a-release-row-problem
|
|
75
75
|
|
|
76
76
|
set -uo pipefail
|
|
77
77
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
# check-locale-discipline.sh — advisory lint for
|
|
2
|
+
# check-locale-discipline.sh — advisory lint for bsd-grep-sed-awk-on-macos-silently-fail-or-error-on-utf-8-without-lc-all-en-us-utf-8-problem (BSD locale UTF-8
|
|
3
3
|
# friction on macOS).
|
|
4
4
|
#
|
|
5
5
|
# BSD `grep` / `sed` / `awk` on macOS silently fail (or emit
|
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
# `LC_ALL=en_US.UTF-8` set. Our prose surfaces (ADRs, problem-ticket bodies,
|
|
9
9
|
# briefing entries, SKILL.md files) are pervasively em-dash / smart-quote
|
|
10
10
|
# rich, so any script that grep / sed / awks those surfaces is exposed.
|
|
11
|
-
#
|
|
12
|
-
#
|
|
11
|
+
# bsd-grep-sed-awk-on-macos-silently-fail-or-error-on-utf-8-without-lc-all-en-us-utf-8-problem captures three distinct incident classes from the 2026-05-30
|
|
12
|
+
# generated-docs-decisions-readme-md-compendium-as-token-cheap-load-surface-for-routine-architect-agent-compliance-architecture-rule compendium session.
|
|
13
13
|
#
|
|
14
14
|
# This lint walks `packages/*/scripts/*.sh`, `packages/*/hooks/*.sh`, and
|
|
15
15
|
# `packages/*/lib/*.sh` (including `packages/*/hooks/lib/*.sh`) and reports
|
|
@@ -40,15 +40,15 @@
|
|
|
40
40
|
# been migrated. Until then, the warnings are signal-only — they identify
|
|
41
41
|
# scripts that may silently mis-process UTF-8 input on macOS.
|
|
42
42
|
#
|
|
43
|
-
# @adr
|
|
44
|
-
# @adr
|
|
45
|
-
# @adr
|
|
46
|
-
# @adr
|
|
47
|
-
# @adr
|
|
48
|
-
# @adr
|
|
49
|
-
# @jtbd
|
|
50
|
-
# @jtbd
|
|
51
|
-
# @problem
|
|
43
|
+
# @adr session-start-briefing-surface-sessionstart-hook-over-tiered-directory-indexed-readme-architecture-rule (advisory-then-load-bearing reusable pattern)
|
|
44
|
+
# @adr plugin-bundled-scripts-invoked-from-skill-md-resolve-via-bin-on-path-architecture-rule (plugin-bundled scripts; PATH shim)
|
|
45
|
+
# @adr behavioural-tests-default-for-skill-testing-architecture-rule (behavioural-tests-default)
|
|
46
|
+
# @adr highest-version-wins-shim-wrapper-for-plugin-scaffold-template-shims-architecture-rule (highest-version-wins shim wrapper)
|
|
47
|
+
# @adr structured-user-interaction-for-governance-skill-decisions-architecture-rule Rule 6 (non-interactive fail-safe — advisory exit 0)
|
|
48
|
+
# @adr plugin-testing-strategy-architecture-rule (Plugin testing strategy)
|
|
49
|
+
# @jtbd enforce-governance-without-slowing-down-user-outcome (Enforce Governance Without Slowing Down)
|
|
50
|
+
# @jtbd extend-the-suite-with-new-plugins-user-outcome (Extend the Suite with New Plugins)
|
|
51
|
+
# @problem bsd-grep-sed-awk-on-macos-silently-fail-or-error-on-utf-8-without-lc-all-en-us-utf-8-problem (BSD grep/sed/awk on macOS friction with UTF-8)
|
|
52
52
|
|
|
53
53
|
set -uo pipefail
|
|
54
54
|
|
|
@@ -172,7 +172,7 @@ for f in "${TARGETS[@]}"; do
|
|
|
172
172
|
done
|
|
173
173
|
|
|
174
174
|
if [ "$violations" -gt 0 ]; then
|
|
175
|
-
printf 'check-locale-discipline: %d violation(s) across %d script(s) — add `export LC_ALL=en_US.UTF-8` at the top of each script that calls grep/sed/awk on UTF-8 content, or use an inline `LC_ALL=...` prefix per invocation (
|
|
175
|
+
printf 'check-locale-discipline: %d violation(s) across %d script(s) — add `export LC_ALL=en_US.UTF-8` at the top of each script that calls grep/sed/awk on UTF-8 content, or use an inline `LC_ALL=...` prefix per invocation (bsd-grep-sed-awk-on-macos-silently-fail-or-error-on-utf-8-without-lc-all-en-us-utf-8-problem).\n' \
|
|
176
176
|
"$violations" "$scanned" >&2
|
|
177
177
|
if [ "$WARN_ONLY" = "1" ]; then
|
|
178
178
|
exit 0
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
# packages/itil/scripts/check-problems-readme-budget.sh
|
|
3
3
|
#
|
|
4
4
|
# Diagnose-only advisory script for the docs/problems/README.md "Last
|
|
5
|
-
# reviewed" line (line 3). Sibling to
|
|
5
|
+
# reviewed" line (line 3). Sibling to problem-099-docs-briefing-md-grows-unbounded-via-run-retro-appends-violates-progressive-disclosure-problem's
|
|
6
6
|
# packages/retrospective/scripts/check-briefing-budgets.sh on a
|
|
7
|
-
# different surface — both apply
|
|
7
|
+
# different surface — both apply session-start-briefing-surface-sessionstart-hook-over-tiered-directory-indexed-readme-architecture-rule line 92's reusable triplet
|
|
8
8
|
# (read-only diagnostic + behavioural bats + ADR-tier-budget
|
|
9
9
|
# enforcement clause) to an accumulator-doc surface.
|
|
10
10
|
#
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
#
|
|
14
14
|
# Default <readme-path> is ./docs/problems/README.md.
|
|
15
15
|
# Threshold is read from PROBLEMS_README_LINE3_MAX_BYTES (default 5120
|
|
16
|
-
# — matches
|
|
16
|
+
# — matches session-start-briefing-surface-sessionstart-hook-over-tiered-directory-indexed-readme-architecture-rule Tier 3 Tier 3 envelope; the soft per-fragment cap
|
|
17
17
|
# is 1024 bytes, enforced by the SKILL.md authoring contracts in
|
|
18
18
|
# manage-problem / transition-problem / transition-problems /
|
|
19
19
|
# review-problems / reconcile-readme).
|
|
@@ -23,23 +23,23 @@
|
|
|
23
23
|
# 2 = parse error (README path missing or unreadable)
|
|
24
24
|
#
|
|
25
25
|
# Output format on overflow (one line, terse machine-readable per
|
|
26
|
-
#
|
|
26
|
+
# progressive-disclosure-once-per-session-budget-for-userpromptsubmit-governance-prose-architecture-rule progressive-disclosure budget):
|
|
27
27
|
# OVER <readme-path> line=3 bytes=<N> threshold=<N>
|
|
28
28
|
#
|
|
29
29
|
# Output is empty (no lines) when line 3 is under the threshold.
|
|
30
30
|
#
|
|
31
31
|
# Read-only — does NOT mutate the README. Truncation is owned by the
|
|
32
|
-
# per-operation refresh contracts in manage-problem Step 5
|
|
33
|
-
# Step 7
|
|
32
|
+
# per-operation refresh contracts in manage-problem Step 5 problem-094-wr-itil-manage-problem-does-not-refresh-docs-problems-readme-md-on-ticket-creation-problem +
|
|
33
|
+
# Step 7 problem-062-manage-problem-does-not-refresh-docs-problems-readme-md-on-single-ticket-transitions-fast-path-cache-goes-stale-silently-problem (and the sibling skills).
|
|
34
34
|
#
|
|
35
|
-
# @problem
|
|
36
|
-
# @adr
|
|
35
|
+
# @problem docs-problems-readme-md-line-3-narrative-blob-accumulator-bloat-sibling-to-briefing-tier-3-on-a-different-surface-problem
|
|
36
|
+
# @adr session-start-briefing-surface-sessionstart-hook-over-tiered-directory-indexed-readme-architecture-rule (Session-start briefing surface — Tier 3 budget; line 92's
|
|
37
37
|
# reusable-pattern note explicitly names "problems index" as a
|
|
38
38
|
# candidate surface for this triplet)
|
|
39
|
-
# @adr
|
|
40
|
-
# @adr
|
|
41
|
-
# @adr
|
|
42
|
-
# @jtbd
|
|
39
|
+
# @adr progressive-disclosure-once-per-session-budget-for-userpromptsubmit-governance-prose-architecture-rule (Progressive disclosure — per-row terse budget)
|
|
40
|
+
# @adr structured-user-interaction-for-governance-skill-decisions-architecture-rule Rule 6 (non-interactive fail-safe — advisory exit 0)
|
|
41
|
+
# @adr plugin-testing-strategy-architecture-rule (Plugin testing strategy)
|
|
42
|
+
# @jtbd enforce-governance-without-slowing-down-user-outcome / progress-the-backlog-while-i-m-away-user-outcome / extend-the-suite-with-new-plugins-user-outcome
|
|
43
43
|
|
|
44
44
|
set -uo pipefail
|
|
45
45
|
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
# check-rfc-has-stories.sh —
|
|
2
|
+
# check-rfc-has-stories.sh — every-rfc-has-at-least-one-story-architecture-rule (every RFC has at least one story).
|
|
3
3
|
#
|
|
4
4
|
# The load-bearing detection half of the manage-rfc `proposed -> accepted` gate:
|
|
5
5
|
# an RFC must list >=1 story before it can be accepted. Exits non-zero (with a
|
|
6
6
|
# stderr directive) when the RFC's `stories:` frontmatter is empty (`stories: []`)
|
|
7
7
|
# or missing; exits 0 when >=1 `STORY-NNN` is listed (inline or block-list).
|
|
8
8
|
#
|
|
9
|
-
# This removes the pre-
|
|
10
|
-
# stories: [] /
|
|
9
|
+
# This removes the pre-every-rfc-has-at-least-one-story-architecture-rule empty-stories fallback (the "atomic RFC ships with
|
|
10
|
+
# stories: [] / extend-the-suite-with-new-plugins-user-outcome friction guard" shape). An atomic fix is now an RFC with
|
|
11
11
|
# exactly one full story, never an empty list.
|
|
12
12
|
#
|
|
13
13
|
# Usage: check-rfc-has-stories.sh <rfc-file>
|
|
14
14
|
# Exit: 0 = >=1 story; 1 = empty/missing stories; 2 = usage / file error.
|
|
15
15
|
#
|
|
16
|
-
# Authority:
|
|
16
|
+
# Authority: every-rfc-has-at-least-one-story-architecture-rule. Driver: implement-in-the-skills-and-tests-1-story-per-rfc-story-map-story-ratification-problem. Behavioural test: check-rfc-has-stories.bats.
|
|
17
17
|
set -euo pipefail
|
|
18
18
|
|
|
19
19
|
rfc="${1:-}"
|
|
@@ -30,13 +30,13 @@ fi
|
|
|
30
30
|
stories_line="$(awk '/^stories:/{print; exit}' "$rfc")"
|
|
31
31
|
|
|
32
32
|
if [ -z "$stories_line" ]; then
|
|
33
|
-
echo "check-rfc-has-stories: $rfc has no 'stories:' field — an RFC must list >=1 story (
|
|
33
|
+
echo "check-rfc-has-stories: $rfc has no 'stories:' field — an RFC must list >=1 story (every-rfc-has-at-least-one-story-architecture-rule). Decompose the fix into >=1 story before accepting." >&2
|
|
34
34
|
exit 1
|
|
35
35
|
fi
|
|
36
36
|
|
|
37
37
|
# Reject an explicit empty inline list: `stories: []`.
|
|
38
38
|
if printf '%s' "$stories_line" | grep -qE '^stories:[[:space:]]*\[[[:space:]]*\][[:space:]]*$'; then
|
|
39
|
-
echo "check-rfc-has-stories: $rfc has empty 'stories: []' — an RFC must list >=1 story (
|
|
39
|
+
echo "check-rfc-has-stories: $rfc has empty 'stories: []' — an RFC must list >=1 story (every-rfc-has-at-least-one-story-architecture-rule; the empty-stories fallback is removed). An atomic fix is an RFC with exactly one full story." >&2
|
|
40
40
|
exit 1
|
|
41
41
|
fi
|
|
42
42
|
|
|
@@ -55,5 +55,5 @@ if awk '
|
|
|
55
55
|
exit 0
|
|
56
56
|
fi
|
|
57
57
|
|
|
58
|
-
echo "check-rfc-has-stories: $rfc 'stories:' lists no STORY- ids — an RFC must list >=1 story (
|
|
58
|
+
echo "check-rfc-has-stories: $rfc 'stories:' lists no STORY- ids — an RFC must list >=1 story (every-rfc-has-at-least-one-story-architecture-rule)." >&2
|
|
59
59
|
exit 1
|