@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,12 +1,12 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
|
-
#
|
|
2
|
+
# afk-iter-packages-plugin-commits-without-changesets-orchestrator-main-turn-back-fill-is-fragile-recovery-hook-level-enforcement-preferable-problem: shared changeset-discipline detection helper.
|
|
3
3
|
#
|
|
4
4
|
# `detect_changeset_required` returns 0 (no change required — allow) /
|
|
5
5
|
# 1 (changeset required but not staged — caller should deny). On 1, the
|
|
6
6
|
# offending plugin slug is echoed on stdout so callers can name it in
|
|
7
7
|
# deny messages without re-parsing diff output.
|
|
8
8
|
#
|
|
9
|
-
# Trap shape (
|
|
9
|
+
# Trap shape (afk-iter-packages-plugin-commits-without-changesets-orchestrator-main-turn-back-fill-is-fragile-recovery-hook-level-enforcement-preferable-problem):
|
|
10
10
|
# `/wr-itil:work-problems` AFK iter subprocesses receive prompt-time
|
|
11
11
|
# guidance to author a `.changeset/*.md` whenever they ship a
|
|
12
12
|
# `packages/<plugin>/` change. Under context pressure (heavy SKILL.md
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
# - allow-list: `README.md`.
|
|
27
27
|
# - allow-list: `docs/<anything>.md` (per architect verdict
|
|
28
28
|
# 2026-05-02 — `*.md` under `docs/` only; SKILL.md is the
|
|
29
|
-
# publishable contract per
|
|
29
|
+
# publishable contract per skill-testing-strategy-contract-assertion-bats-companion-to-architecture-rule framing and is NOT in
|
|
30
30
|
# the allow-list).
|
|
31
31
|
# - otherwise: publishable source — record the slug.
|
|
32
32
|
# * any other path: ignored (non-publishable surface — `.github/`,
|
|
@@ -44,8 +44,8 @@
|
|
|
44
44
|
# is required.
|
|
45
45
|
# * Neither check satisfied → return 1 + echo the slug.
|
|
46
46
|
#
|
|
47
|
-
# Phase 2 rationale (
|
|
48
|
-
# ship a multi-commit slice for one plugin (e.g.
|
|
47
|
+
# Phase 2 rationale (afk-iter-packages-plugin-commits-without-changesets-orchestrator-main-turn-back-fill-is-fragile-recovery-hook-level-enforcement-preferable-problem 2026-05-31): AFK orchestrator iters that
|
|
48
|
+
# ship a multi-commit slice for one plugin (e.g. wr-itil-review-problems-has-no-path-to-close-tickets-that-are-no-longer-relevant-evidence-based-not-age-based-structural-outflow-gap-drives-monotonic-backlog-growth-problem Phase 3 across
|
|
49
49
|
# 4 commits, 2 of which touched `packages/itil/`) should not author N
|
|
50
50
|
# redundant changesets for one logical bump. changesets-action
|
|
51
51
|
# collapses bump-class at version-package time, so per-commit
|
|
@@ -72,32 +72,32 @@
|
|
|
72
72
|
# Cost: one `git diff` invocation per check (~10ms on this repo's
|
|
73
73
|
# working tree). Per-invocation deterministic — runs on every
|
|
74
74
|
# `git commit` invocation rather than relying on per-tool-call
|
|
75
|
-
# session state tracking. Mirrors the
|
|
75
|
+
# session state tracking. Mirrors the staging-trap-recurs-despite-documentation-hook-level-enforcement-candidate-problem `staging-detect.sh`
|
|
76
76
|
# precedent (architect-approved no-marker design).
|
|
77
77
|
#
|
|
78
78
|
# References:
|
|
79
|
-
#
|
|
80
|
-
# `hooks/test/` per
|
|
81
|
-
#
|
|
79
|
+
# plugin-testing-strategy-architecture-rule — plugin testing strategy (hook bats live under
|
|
80
|
+
# `hooks/test/` per problem-081-structural-source-content-tests-are-wasteful-tdd-agent-should-reject-them-and-require-behavioural-tests-framework-stub-enhancements-problem behavioural-test discipline).
|
|
81
|
+
# structured-user-interaction-for-governance-skill-decisions-architecture-rule Rule 1 — deny redirects with mechanical recovery (the deny
|
|
82
82
|
# text names the plugin slug + the literal `bun run
|
|
83
83
|
# changeset` command + the BYPASS env var override).
|
|
84
|
-
#
|
|
84
|
+
# governance-skills-commit-their-own-completed-work-architecture-rule — governance skills commit their own work (this hook
|
|
85
85
|
# ensures iter commits stay self-contained per
|
|
86
|
-
#
|
|
87
|
-
#
|
|
86
|
+
# governance-skills-commit-their-own-completed-work-architecture-rule single-commit grain).
|
|
87
|
+
# inter-iteration-release-cadence-for-afk-loops-architecture-rule — inter-iteration release cadence (this hook strengthens
|
|
88
88
|
# the cadence by ensuring every publishable iter has a
|
|
89
89
|
# changeset to drain at release time).
|
|
90
|
-
#
|
|
91
|
-
#
|
|
90
|
+
# progressive-disclosure-once-per-session-budget-for-userpromptsubmit-governance-prose-architecture-rule — progressive disclosure / deny-message terseness.
|
|
91
|
+
# hook-injection-budget-policy-for-pretooluse-and-posttooluse-hooks-architecture-rule — hook injection budget (Pattern 1 silent-on-pass; deny
|
|
92
92
|
# band ≤300 bytes for this hook).
|
|
93
|
-
#
|
|
93
|
+
# problem-073-no-voice-and-tone-check-or-risk-assessment-on-changeset-bodies-which-populate-changelog-md-release-prs-github-releases-and-npm-release-notes-problem — sibling changeset author-time gate (different surface:
|
|
94
94
|
# Write/Edit on `.changeset/*.md`). Composes-with as
|
|
95
95
|
# defence-in-depth.
|
|
96
|
-
#
|
|
96
|
+
# staging-trap-recurs-despite-documentation-hook-level-enforcement-candidate-problem — sibling staging-trap helper (same enforcement-layer
|
|
97
97
|
# shape — per-invocation deterministic, no markers).
|
|
98
|
-
#
|
|
98
|
+
# afk-iter-packages-plugin-commits-without-changesets-orchestrator-main-turn-back-fill-is-fragile-recovery-hook-level-enforcement-preferable-problem — this helper.
|
|
99
99
|
|
|
100
|
-
#
|
|
100
|
+
# afk-iter-packages-plugin-commits-without-changesets-orchestrator-main-turn-back-fill-is-fragile-recovery-hook-level-enforcement-preferable-problem Phase 2 helper — does any `.changeset/*.md` ALREADY in scope target the plugin
|
|
101
101
|
# slug via its YAML frontmatter `"@windyroad/<slug>": <bump>` line?
|
|
102
102
|
#
|
|
103
103
|
# Scope = files reachable from HEAD but not from `origin/<base>`,
|
|
@@ -170,7 +170,7 @@ EOF
|
|
|
170
170
|
return 0
|
|
171
171
|
}
|
|
172
172
|
|
|
173
|
-
#
|
|
173
|
+
# changeset-discipline-check-2b-is-plugin-scoped-not-change-scoped-plugin-source-commits-ship-undocumented-when-a-sibling-changeset-already-targets-the-plugin-problem helper — echo the space-separated, upper-cased, de-duplicated set of
|
|
174
174
|
# work-item IDs found in the text passed as $1. Work-item identity = problem
|
|
175
175
|
# ticket (`P<NNN>`), RFC (`RFC-<NNN>`), or story (`STORY-<NNN>`). ADR refs are
|
|
176
176
|
# deliberately excluded — an ADR is cross-cutting context cited in passing, not
|
|
@@ -193,9 +193,9 @@ _work_item_ids() {
|
|
|
193
193
|
# not satisfied by either staged Check 2a or in-scope Check 2b.
|
|
194
194
|
#
|
|
195
195
|
# $1 (optional) — the git-commit COMMAND string (or commit message). Its
|
|
196
|
-
# work-item ID(s) are matched against in-scope changesets for the
|
|
196
|
+
# work-item ID(s) are matched against in-scope changesets for the changeset-discipline-check-2b-is-plugin-scoped-not-change-scoped-plugin-source-commits-ship-undocumented-when-a-sibling-changeset-already-targets-the-plugin-problem
|
|
197
197
|
# change-scoped Check 2b. Empty / omitted → Check 2b falls back to the
|
|
198
|
-
# pre-
|
|
198
|
+
# pre-changeset-discipline-check-2b-is-plugin-scoped-not-change-scoped-plugin-source-commits-ship-undocumented-when-a-sibling-changeset-already-targets-the-plugin-problem plugin-scoped behaviour (any covering changeset allows), which
|
|
199
199
|
# is the conservative choice when no commit context is available.
|
|
200
200
|
#
|
|
201
201
|
# Echoes the offending plugin slug on stdout when detected.
|
|
@@ -284,27 +284,27 @@ EOF
|
|
|
284
284
|
return 0
|
|
285
285
|
fi
|
|
286
286
|
|
|
287
|
-
# Check 2b (
|
|
287
|
+
# Check 2b (afk-iter-packages-plugin-commits-without-changesets-orchestrator-main-turn-back-fill-is-fragile-recovery-hook-level-enforcement-preferable-problem Phase 2 + changeset-discipline-check-2b-is-plugin-scoped-not-change-scoped-plugin-source-commits-ship-undocumented-when-a-sibling-changeset-already-targets-the-plugin-problem change-scoped) — an in-scope changeset
|
|
288
288
|
# targeting the plugin satisfies, but only when it is change-scoped to
|
|
289
289
|
# THIS commit. Scope = unpushed-range commits + untracked + modified-
|
|
290
290
|
# not-staged working-tree files. Once consumed onto origin, the changeset
|
|
291
291
|
# is gone and a fresh one is required.
|
|
292
292
|
local covering
|
|
293
293
|
if covering=$(_changeset_in_scope_covers_plugin "$plugin_source_slug"); then
|
|
294
|
-
#
|
|
295
|
-
# changeset for an unrelated change; before
|
|
294
|
+
# changeset-discipline-check-2b-is-plugin-scoped-not-change-scoped-plugin-source-commits-ship-undocumented-when-a-sibling-changeset-already-targets-the-plugin-problem: tighten plugin-scoped → change-scoped. A plugin can carry a
|
|
295
|
+
# changeset for an unrelated change; before changeset-discipline-check-2b-is-plugin-scoped-not-change-scoped-plugin-source-commits-ship-undocumented-when-a-sibling-changeset-already-targets-the-plugin-problem that wrongly covered
|
|
296
296
|
# THIS commit, shipping it to npm with no CHANGELOG record of its own
|
|
297
|
-
# (witnessed:
|
|
297
|
+
# (witnessed: latent-octal-eval-bug-in-next-id-formula-across-all-4-ticket-creator-skills-local-max-1-fails-with-value-too-great-for-base-when-local-max-reaches-099-problem's fix rode extract-risks-from-reports-sh-hardcodes-windy-road-agent-plugins-suite-branding-in-the-adopter-generated-docs-risks-readme-md-problem's changeset). Deny only on positive
|
|
298
298
|
# evidence the covering changeset(s) belong to a DIFFERENT change: the
|
|
299
299
|
# commit cites work-item ID(s), EVERY covering changeset cites work-item
|
|
300
300
|
# ID(s), and none overlap. Any ambiguity allows — a ticket-less commit,
|
|
301
|
-
# a prose-only changeset, or an ID overlap — so the
|
|
301
|
+
# a prose-only changeset, or an ID overlap — so the governance-skills-commit-their-own-completed-work-architecture-rule batch-grain
|
|
302
302
|
# (same-slice commits share a ticket) and prose-only / adopter changesets
|
|
303
303
|
# are never over-fired.
|
|
304
304
|
local commit_ids cs_path cs_ids id has_idless=0 overlap=0
|
|
305
305
|
commit_ids=$(_work_item_ids "$commit_msg")
|
|
306
306
|
|
|
307
|
-
# Commit cites no work-item ID → cannot change-scope; allow (pre-
|
|
307
|
+
# Commit cites no work-item ID → cannot change-scope; allow (pre-changeset-discipline-check-2b-is-plugin-scoped-not-change-scoped-plugin-source-commits-ship-undocumented-when-a-sibling-changeset-already-targets-the-plugin-problem).
|
|
308
308
|
[ -n "$commit_ids" ] || return 0
|
|
309
309
|
|
|
310
310
|
while IFS= read -r cs_path; do
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
|
-
# Shared gate logic for `.claude/` user-space write protection (
|
|
2
|
+
# Shared gate logic for `.claude/` user-space write protection (agents-write-project-generated-artefacts-under-claude-user-controlled-config-space-gate-exclusions-are-read-tolerance-not-write-permission-problem).
|
|
3
3
|
#
|
|
4
4
|
# Sourced by itil-claude-space-protection.sh. Provides:
|
|
5
5
|
# is_protected_claude_path — returns 0 if path is project-scoped `.claude/`
|
|
@@ -14,12 +14,12 @@
|
|
|
14
14
|
# This gate enforces a PERSISTENT "user pre-approved this specific path"
|
|
15
15
|
# marker — different lifecycle (no TTL, no drift, never auto-cleared) and
|
|
16
16
|
# different scope (file-path-keyed, not session-keyed). Architect verdict
|
|
17
|
-
# (
|
|
17
|
+
# (agents-write-project-generated-artefacts-under-claude-user-controlled-config-space-gate-exclusions-are-read-tolerance-not-write-permission-problem Phase 2): keep semantically distinct from existing gate libraries.
|
|
18
18
|
#
|
|
19
19
|
# Marker convention: `.claude/.agent-write-approved-<sha256-of-rel-path>`
|
|
20
20
|
# where `<sha256-of-rel-path>` is the SHA-256 hex of the path relative to
|
|
21
21
|
# project root (PWD). Persistent, in-tree, file-existence test — same
|
|
22
|
-
# shape as
|
|
22
|
+
# shape as repo-local-skills-for-project-specific-workflow-tooling-architecture-rule / install-updates-consent-gate-fires-on-every-invocation-despite-the-answer-being-invariably-all-confirmed-siblings-problem `.claude/.install-updates-consent` precedent.
|
|
23
23
|
#
|
|
24
24
|
# Allow-list scope: paths under `.claude/` that are user-controlled by
|
|
25
25
|
# convention (Claude Code config, user-authored extensions, system state):
|
|
@@ -30,18 +30,18 @@
|
|
|
30
30
|
# - .agent-write-approved-* markers themselves (so user can create them)
|
|
31
31
|
#
|
|
32
32
|
# References:
|
|
33
|
-
#
|
|
33
|
+
# gate-marker-lifecycle-ttl-drift-not-stop-hook-reset-architecture-rule — gate marker lifecycle (this gate adds a NEW persistent
|
|
34
34
|
# marker class; the ADR's session-scoped /tmp markers are
|
|
35
35
|
# unchanged)
|
|
36
|
-
#
|
|
37
|
-
#
|
|
38
|
-
#
|
|
39
|
-
#
|
|
36
|
+
# structured-user-interaction-for-governance-skill-decisions-architecture-rule Rule 6 — non-interactive fail-safe (parse-error => exit 0)
|
|
37
|
+
# repo-local-skills-for-project-specific-workflow-tooling-architecture-rule — install-updates persistent in-tree consent marker precedent
|
|
38
|
+
# progressive-disclosure-once-per-session-budget-for-userpromptsubmit-governance-prose-architecture-rule — progressive disclosure (deny message <500 bytes)
|
|
39
|
+
# hook-injection-budget-policy-for-pretooluse-and-posttooluse-hooks-architecture-rule — hook injection budget (Pattern 1 silent-on-pass; allow path
|
|
40
40
|
# emits zero bytes)
|
|
41
|
-
#
|
|
41
|
+
# agent-bypasses-wr-itil-manage-problem-step-2-duplicate-check-by-writing-tickets-directly-to-docs-problems-problem — manage-problem-enforce-create.sh precedent for itil
|
|
42
42
|
# PreToolUse:Write enforcement hook shape
|
|
43
|
-
#
|
|
44
|
-
#
|
|
43
|
+
# install-updates-consent-gate-fires-on-every-invocation-despite-the-answer-being-invariably-all-confirmed-siblings-problem — install-updates consent-marker persistence precedent
|
|
44
|
+
# agents-write-project-generated-artefacts-under-claude-user-controlled-config-space-gate-exclusions-are-read-tolerance-not-write-permission-problem — this gate's driver
|
|
45
45
|
|
|
46
46
|
# Returns 0 (true) if FILE_PATH is a project-scoped .claude/ path AND is
|
|
47
47
|
# NOT in the user-space allow-list. Returns 1 (false) otherwise.
|
|
@@ -79,9 +79,9 @@ is_protected_claude_path() {
|
|
|
79
79
|
# Strip leading ./ if present
|
|
80
80
|
rel_path="${rel_path#./}"
|
|
81
81
|
|
|
82
|
-
# Must be under
|
|
82
|
+
# Must be under a runtime config directory at project-relative root depth.
|
|
83
83
|
case "$rel_path" in
|
|
84
|
-
.claude/*) ;;
|
|
84
|
+
.claude/*|.codex/*) ;;
|
|
85
85
|
*) return 1 ;;
|
|
86
86
|
esac
|
|
87
87
|
|
|
@@ -114,6 +114,13 @@ is_protected_claude_path() {
|
|
|
114
114
|
# Claude Code's own state: projects/<id>/memory/, worktrees/
|
|
115
115
|
.claude/projects/*) return 1 ;;
|
|
116
116
|
.claude/worktrees/*) return 1 ;;
|
|
117
|
+
# Codex runtime configuration and generated runtime surfaces.
|
|
118
|
+
.codex/config.toml) return 1 ;;
|
|
119
|
+
.codex/AGENTS.md) return 1 ;;
|
|
120
|
+
.codex/hooks.json) return 1 ;;
|
|
121
|
+
.codex/agents/*) return 1 ;;
|
|
122
|
+
.codex/skills/*) return 1 ;;
|
|
123
|
+
.codex/.agent-write-approved-*) return 1 ;;
|
|
117
124
|
esac
|
|
118
125
|
|
|
119
126
|
# Project-scoped .claude/ path NOT on the allow-list — protected.
|
|
@@ -156,11 +163,12 @@ has_approval_marker() {
|
|
|
156
163
|
fi
|
|
157
164
|
|
|
158
165
|
[ -n "$hash" ] || return 1
|
|
159
|
-
|
|
166
|
+
local config_dir="${rel_path%%/*}"
|
|
167
|
+
[ -f "${pwd_root}/${config_dir}/.agent-write-approved-${hash}" ]
|
|
160
168
|
}
|
|
161
169
|
|
|
162
170
|
# Emit fail-closed PreToolUse deny JSON. Reason should be terse (<500
|
|
163
|
-
# bytes per
|
|
171
|
+
# bytes per progressive-disclosure-once-per-session-budget-for-userpromptsubmit-governance-prose-architecture-rule). Hook callers compose the basename + reason inline.
|
|
164
172
|
#
|
|
165
173
|
# Usage: claude_space_deny "BLOCKED: <reason>"
|
|
166
174
|
claude_space_deny() {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
|
-
#
|
|
2
|
+
# hook-substring-matches-git-commit-anywhere-in-bash-command-not-just-actual-git-commit-invocations-problem: shared command-detection helper for PreToolUse:Bash hooks
|
|
3
3
|
# that need to distinguish ACTUAL `git commit` invocations from Bash
|
|
4
4
|
# commands that merely MENTION the literal phrase "git commit" in
|
|
5
5
|
# argument vectors or heredoc bodies (grep patterns, sed patterns,
|
|
@@ -14,11 +14,11 @@
|
|
|
14
14
|
#
|
|
15
15
|
# that 5 sibling PreToolUse:Bash hooks previously used to gate on
|
|
16
16
|
# `git commit`. The substring match misfired on legitimate non-commit
|
|
17
|
-
# Bash whose arguments contained the phrase (
|
|
17
|
+
# Bash whose arguments contained the phrase (hook-substring-matches-git-commit-anywhere-in-bash-command-not-just-actual-git-commit-invocations-problem ticket Description
|
|
18
18
|
# — observed iter-1 retro write and orchestrator grep, ≥3 events per
|
|
19
19
|
# session).
|
|
20
20
|
#
|
|
21
|
-
# Strategy (Fix shape B per
|
|
21
|
+
# Strategy (Fix shape B per hook-substring-matches-git-commit-anywhere-in-bash-command-not-just-actual-git-commit-invocations-problem ticket):
|
|
22
22
|
# 1. Strip leading whitespace from the candidate command string.
|
|
23
23
|
# 2. Iteratively strip env-var-assignment prefixes (`VAR=value `,
|
|
24
24
|
# `VAR="..." `, `VAR='...' `) and a `cd <path> &&` prefix until
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
# string. The end-of-token boundary check stops `git commit-tree`
|
|
29
29
|
# and similar `git commit-*` plumbing commands from matching.
|
|
30
30
|
#
|
|
31
|
-
# Scope deliberately narrow (per
|
|
31
|
+
# Scope deliberately narrow (per hook-substring-matches-git-commit-anywhere-in-bash-command-not-just-actual-git-commit-invocations-problem ticket Description recommended
|
|
32
32
|
# Fix shape B): handles only the prefix shapes the orchestrator and
|
|
33
33
|
# capture/manage/work skills actually emit — direct `git commit`,
|
|
34
34
|
# `cd && git commit`, `VAR=value git commit`. Does NOT split on
|
|
@@ -46,20 +46,20 @@
|
|
|
46
46
|
# `lib/readme-refresh-detect.sh` echoes the offending ticket path).
|
|
47
47
|
#
|
|
48
48
|
# References:
|
|
49
|
-
#
|
|
49
|
+
# plugin-testing-strategy-architecture-rule — plugin testing strategy (this helper's bats live at
|
|
50
50
|
# `packages/itil/hooks/test/command-detect.bats` per
|
|
51
51
|
# behavioural-test discipline).
|
|
52
|
-
#
|
|
52
|
+
# gate-marker-lifecycle-ttl-drift-not-stop-hook-reset-architecture-rule — gate marker lifecycle (helper is per-invocation, no
|
|
53
53
|
# marker state — same precedent as `lib/staging-detect.sh`,
|
|
54
54
|
# `lib/changeset-detect.sh`, `lib/readme-refresh-detect.sh`).
|
|
55
|
-
#
|
|
55
|
+
# hook-injection-budget-policy-for-pretooluse-and-posttooluse-hooks-architecture-rule — hook injection budget (silent-on-pass / silent-on-fail
|
|
56
56
|
# — pure exit-code contract).
|
|
57
|
-
#
|
|
57
|
+
# staging-trap-recurs-despite-documentation-hook-level-enforcement-candidate-problem — sibling staging-trap hook (candidate for follow-up
|
|
58
58
|
# refactor to use this helper).
|
|
59
|
-
#
|
|
60
|
-
#
|
|
61
|
-
# under
|
|
62
|
-
#
|
|
59
|
+
# afk-iter-packages-plugin-commits-without-changesets-orchestrator-main-turn-back-fill-is-fragile-recovery-hook-level-enforcement-preferable-problem — sibling changeset-discipline hook (candidate).
|
|
60
|
+
# readme-refresh-enforcement-gap-iter-subprocess-commits-can-land-a-verifying-md-rename-without-staging-the-corresponding-verification-queue-row-in-docs-problems-readme-md-problem — sibling README-refresh-discipline hook (first consumer
|
|
61
|
+
# under hook-substring-matches-git-commit-anywhere-in-bash-command-not-just-actual-git-commit-invocations-problem).
|
|
62
|
+
# hook-substring-matches-git-commit-anywhere-in-bash-command-not-just-actual-git-commit-invocations-problem — this helper's surfacing ticket.
|
|
63
63
|
|
|
64
64
|
# Returns 0 if $1 is a Bash command that invokes `git commit`.
|
|
65
65
|
# Returns 1 otherwise (including commands that merely mention the
|
package/hooks/lib/create-gate.sh
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
|
-
# Shared gate logic for new-ticket creation enforcement (
|
|
2
|
+
# Shared gate logic for new-ticket creation enforcement (agent-bypasses-wr-itil-manage-problem-step-2-duplicate-check-by-writing-tickets-directly-to-docs-problems-problem).
|
|
3
3
|
#
|
|
4
4
|
# Sourced by manage-problem-enforce-create.sh. Provides:
|
|
5
5
|
# check_create_gate — returns 0 if Step 2 marker present (allow), 1 if absent (deny)
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
# marker; mismatch invalidates the gate). The Step-2 grep marker has
|
|
13
13
|
# different semantics — it records "this session has run the duplicate
|
|
14
14
|
# check at least once" — and has neither a policy file nor drift-relevant
|
|
15
|
-
# state. Per architect approval (
|
|
15
|
+
# state. Per architect approval (agent-bypasses-wr-itil-manage-problem-step-2-duplicate-check-by-writing-tickets-directly-to-docs-problems-problem): keep review-gate.sh untouched and
|
|
16
16
|
# add a sibling helper rather than overload review-gate semantics.
|
|
17
17
|
#
|
|
18
18
|
# Marker convention: /tmp/manage-problem-grep-${SESSION_ID}
|
|
@@ -23,9 +23,9 @@
|
|
|
23
23
|
# scope would block split-create after the first Write.
|
|
24
24
|
#
|
|
25
25
|
# References:
|
|
26
|
-
#
|
|
27
|
-
#
|
|
28
|
-
#
|
|
26
|
+
# gate-marker-lifecycle-ttl-drift-not-stop-hook-reset-architecture-rule — gate marker lifecycle (covers session-scoped /tmp markers).
|
|
27
|
+
# progressive-disclosure-once-per-session-budget-for-userpromptsubmit-governance-prose-architecture-rule — progressive disclosure (deny message stays terse + actionable).
|
|
28
|
+
# structured-user-interaction-for-governance-skill-decisions-architecture-rule Rule 1 — deny redirects to /wr-itil:manage-problem where
|
|
29
29
|
# Step 2 fires AskUserQuestion if duplicates exist.
|
|
30
30
|
#
|
|
31
31
|
# Empty SESSION_ID fallback: returns 1 (no marker) — fail-closed by
|
|
@@ -52,19 +52,19 @@ mark_step2_complete() {
|
|
|
52
52
|
: > "/tmp/manage-problem-grep-${SESSION_ID}"
|
|
53
53
|
}
|
|
54
54
|
|
|
55
|
-
#
|
|
55
|
+
# 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: write the Step 2 grep marker under EVERY
|
|
56
56
|
# candidate SID read from stdin (one UUID per line, as emitted by
|
|
57
57
|
# `get_candidate_session_ids` in lib/session-id.sh).
|
|
58
58
|
#
|
|
59
59
|
# Under concurrent orchestrator+subprocess sessions in the same project,
|
|
60
60
|
# the per-machine runtime-sid marker is last-writer-wins, so agent-side
|
|
61
61
|
# code cannot reliably PREDICT which single SID the create-gate hook will
|
|
62
|
-
# read from the Write's stdin (
|
|
62
|
+
# read from the Write's stdin (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 §Context). Marking under every recent
|
|
63
63
|
# candidate guarantees a matching marker exists whichever SID the hook reads,
|
|
64
|
-
# eliminating the
|
|
64
|
+
# eliminating the create-gate-marker-race-between-concurrent-claude-sessions-via-shared-runtime-sid-file-problem marker-mismatch deny without a process-topology
|
|
65
65
|
# assumption. The candidate set is bounded to recent announce markers + the
|
|
66
66
|
# runtime-sid value by `get_candidate_session_ids` (NOT a global fail-open —
|
|
67
|
-
# the
|
|
67
|
+
# the agent-bypasses-wr-itil-manage-problem-step-2-duplicate-check-by-writing-tickets-directly-to-docs-problems-problem audit invariant holds: each marker still records that THIS session
|
|
68
68
|
# ran the duplicate-check grep).
|
|
69
69
|
#
|
|
70
70
|
# Reuses the unchanged single-SID `mark_step2_complete` per candidate (same
|
|
@@ -85,36 +85,6 @@ mark_step2_complete_candidates() {
|
|
|
85
85
|
[ "$count" -gt 0 ]
|
|
86
86
|
}
|
|
87
87
|
|
|
88
|
-
# Returns 0 if the RFC capture-step marker exists for SESSION_ID; 1 otherwise.
|
|
89
|
-
# Empty SESSION_ID => returns 1 (no marker).
|
|
90
|
-
#
|
|
91
|
-
# Sibling marker per architect verdict on capture-rfc sub-decision (a) —
|
|
92
|
-
# preserves audit-trail per-surface granularity (problem-tier vs RFC-tier
|
|
93
|
-
# capture). Marker name: /tmp/wr-itil-rfc-capture-grep-${SESSION_ID}.
|
|
94
|
-
#
|
|
95
|
-
# Usage: if check_rfc_capture_gate "$SESSION_ID"; then exit 0; fi
|
|
96
|
-
check_rfc_capture_gate() {
|
|
97
|
-
local SESSION_ID="$1"
|
|
98
|
-
[ -n "$SESSION_ID" ] || return 1
|
|
99
|
-
[ -f "/tmp/wr-itil-rfc-capture-grep-${SESSION_ID}" ]
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
# Writes the RFC capture-step marker for SESSION_ID. Empty SESSION_ID => no-op.
|
|
103
|
-
# Idempotent — safe to call more than once per session.
|
|
104
|
-
#
|
|
105
|
-
# Per ADR-060 + capture-rfc Step 2: the marker records that capture-rfc has
|
|
106
|
-
# run its problem-trace validation pass (the RFC-tier analogue of the
|
|
107
|
-
# manage-problem Step 2 duplicate-grep). Per-session scope so a single
|
|
108
|
-
# capture-rfc invocation may write multiple RFC files (e.g. multi-problem
|
|
109
|
-
# trace splits) without re-validating.
|
|
110
|
-
#
|
|
111
|
-
# Usage: mark_rfc_capture_complete "$SESSION_ID"
|
|
112
|
-
mark_rfc_capture_complete() {
|
|
113
|
-
local SESSION_ID="$1"
|
|
114
|
-
[ -n "$SESSION_ID" ] || return 0
|
|
115
|
-
: > "/tmp/wr-itil-rfc-capture-grep-${SESSION_ID}"
|
|
116
|
-
}
|
|
117
|
-
|
|
118
88
|
# Emit fail-closed deny JSON for PreToolUse hooks.
|
|
119
89
|
# Usage: create_gate_deny "BLOCKED: <reason>"
|
|
120
90
|
create_gate_deny() {
|
package/hooks/lib/detectors.sh
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
|
-
#
|
|
2
|
+
# problem-085-assistant-asks-for-input-when-the-next-step-is-obvious-and-uses-prose-asks-instead-of-askuserquestion-when-input-is-actually-needed-problem detector registry: assistant-output-gate + assistant-output-review.
|
|
3
3
|
#
|
|
4
4
|
# Two detection functions sharing a single library so the UserPromptSubmit
|
|
5
5
|
# pre-generation reminder (gate) and the Stop post-hoc review use the
|
|
6
6
|
# same canonical phrasing list — one place to update when a new prose-ask
|
|
7
7
|
# pattern lands.
|
|
8
8
|
#
|
|
9
|
-
# Composition: this registry is the shape
|
|
9
|
+
# Composition: this registry is the shape problem-078-assistant-does-not-offer-to-capture-a-problem-ticket-when-the-user-delivers-strong-signal-correction-problem (correction->ticket) and
|
|
10
10
|
# future itil assistant-output validators extend. Each detector is a
|
|
11
11
|
# pure function — takes text on stdin or as $1, exits 0 on match,
|
|
12
12
|
# non-zero on no-match.
|
|
13
13
|
|
|
14
14
|
# Canonical prose-ask phrasings — the patterns that should be emitted
|
|
15
|
-
# via AskUserQuestion instead. Extracted from
|
|
15
|
+
# via AskUserQuestion instead. Extracted from problem-085-assistant-asks-for-input-when-the-next-step-is-obvious-and-uses-prose-asks-instead-of-askuserquestion-when-input-is-actually-needed-problem ticket + memory
|
|
16
16
|
# feedback_act_on_obvious_decisions.md.
|
|
17
17
|
#
|
|
18
18
|
# Case-insensitive, anchored to word boundaries where meaningful.
|
|
@@ -57,12 +57,12 @@ DIRECTION_PIN_PATTERNS=(
|
|
|
57
57
|
|
|
58
58
|
# Correction-signal patterns — strong-affect correction signals in
|
|
59
59
|
# the user's incoming prompt that should trigger an offer to capture
|
|
60
|
-
# a problem ticket for the underlying behavioural pattern (
|
|
61
|
-
# Extracted from feedback_capture_on_correction.md and the
|
|
60
|
+
# a problem ticket for the underlying behavioural pattern (problem-078-assistant-does-not-offer-to-capture-a-problem-ticket-when-the-user-delivers-strong-signal-correction-problem).
|
|
61
|
+
# Extracted from feedback_capture_on_correction.md and the problem-078-assistant-does-not-offer-to-capture-a-problem-ticket-when-the-user-delivers-strong-signal-correction-problem ticket
|
|
62
62
|
# Root Cause Analysis "missing trigger" vocabulary.
|
|
63
63
|
#
|
|
64
64
|
# Case-insensitive (grep -Eqi). False-positive budget is accepted per
|
|
65
|
-
#
|
|
65
|
+
# problem-078-assistant-does-not-offer-to-capture-a-problem-ticket-when-the-user-delivers-strong-signal-correction-problem Investigation Tasks (a user message quoting the vocabulary in
|
|
66
66
|
# non-correction context will fire — minor over-report traded for
|
|
67
67
|
# signal reliability).
|
|
68
68
|
CORRECTION_SIGNAL_PATTERNS=(
|
|
@@ -79,22 +79,22 @@ CORRECTION_SIGNAL_PATTERNS=(
|
|
|
79
79
|
'\bno\b.*\bwrong\b'
|
|
80
80
|
)
|
|
81
81
|
|
|
82
|
-
#
|
|
82
|
+
# agent-frames-skill-mandatory-mechanical-steps-as-user-optional-problem: mechanical-step-framed-as-user-optional detection. When a skill
|
|
83
83
|
# contract mandates a mechanical step (review-problems Step 7 auto-release,
|
|
84
84
|
# a full re-rank, etc.), the agent must not re-surface the step as a user
|
|
85
85
|
# decision — or as a budget-caution skip — in end-of-turn prose. That
|
|
86
|
-
# reintroduces the exact friction the mechanical-stage carve-out (
|
|
87
|
-
#
|
|
86
|
+
# reintroduces the exact friction the mechanical-stage carve-out (agents-over-ask-in-interactive-sessions-conflating-mechanical-stages-with-user-interactive-stages-of-multi-stage-skill-contracts-inverse-problem /
|
|
87
|
+
# decision-delegation-contract-when-agents-act-on-the-framework-vs-ask-the-user-architecture-rule category 4 silent-framework) was engineered to remove.
|
|
88
88
|
#
|
|
89
89
|
# The detector fires only when ALL THREE co-occur in the turn text: a
|
|
90
90
|
# step-skip verb, a step / mechanical-pass reference, AND an
|
|
91
91
|
# offloaded-justification closer. The three-way AND is the anti-over-fire
|
|
92
|
-
# guard (inverse-
|
|
92
|
+
# guard (inverse-problem-078-assistant-does-not-offer-to-capture-a-problem-ticket-when-the-user-delivers-strong-signal-correction-problem / agents-over-ask-in-interactive-sessions-conflating-mechanical-stages-with-user-interactive-stages-of-multi-stage-skill-contracts-inverse-problem): a legitimately user-owned decision, or a
|
|
93
93
|
# skipped step reported with a substantive reason, does not fire. Same
|
|
94
94
|
# accepted false-positive posture as CORRECTION_SIGNAL_PATTERNS above — a
|
|
95
95
|
# rare over-fire costs only a non-blocking next-turn nudge.
|
|
96
96
|
#
|
|
97
|
-
# Case-insensitive (grep -Eqi). grep matches per line; the two
|
|
97
|
+
# Case-insensitive (grep -Eqi). grep matches per line; the two agent-frames-skill-mandatory-mechanical-steps-as-user-optional-problem
|
|
98
98
|
# evidence phrasings are single-line, so per-line matching is sufficient.
|
|
99
99
|
|
|
100
100
|
# 1. Step-skip verbs — the step was not run.
|
|
@@ -196,7 +196,7 @@ detect_direction_pin() {
|
|
|
196
196
|
}
|
|
197
197
|
|
|
198
198
|
# detect_correction_signal: scans text on stdin for strong-affect
|
|
199
|
-
# correction signals (
|
|
199
|
+
# correction signals (problem-078-assistant-does-not-offer-to-capture-a-problem-ticket-when-the-user-delivers-strong-signal-correction-problem). Exits 0 if any pattern matches, 1
|
|
200
200
|
# otherwise. Writes the first matched phrase to stdout for
|
|
201
201
|
# observability in the hook's systemMessage.
|
|
202
202
|
#
|