@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,41 +1,41 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
|
-
# wr-itil — PreToolUse:Bash gate (
|
|
2
|
+
# wr-itil — PreToolUse:Bash gate (a-story-cannot-be-implemented-while-in-draft-implementation-requires-accepted-architecture-rule / implement-in-the-skills-and-tests-1-story-per-rfc-story-map-story-ratification-problem). A story in `draft` is NEVER
|
|
3
3
|
# implementable. Blocks a `git commit` whose `Refs: STORY-NNN` trailer names a
|
|
4
4
|
# story still in docs/stories/draft/ — implementation requires `accepted` (where
|
|
5
|
-
# the INVEST + RFC-trace gates +
|
|
5
|
+
# the INVEST + RFC-trace gates + story-maps-and-stories-carry-a-drift-invalidated-human-oversight-marker-architecture-rule ratification fire). Capture commits are
|
|
6
6
|
# exempt (they CREATE the draft story). Bootstrap-exempt commits bypass
|
|
7
|
-
# (
|
|
7
|
+
# (problem-rfc-story-framework-with-mandatory-problem-trace-and-unified-problem-ontology-architecture-rule A4). Degrades to a no-op on abnormal paths — characterised, not
|
|
8
8
|
# authorised; see the header note below.
|
|
9
9
|
#
|
|
10
10
|
# This is the enforcement locus the architect named as the ONLY one that catches
|
|
11
|
-
# the exact
|
|
11
|
+
# the exact implement-in-the-skills-and-tests-1-story-per-rfc-story-map-story-ratification-problem bypass — a direct implementing commit against a draft story,
|
|
12
12
|
# whether from the orchestrator or by hand.
|
|
13
13
|
#
|
|
14
|
-
# It ALSO enforces the
|
|
15
|
-
# (
|
|
14
|
+
# It ALSO enforces the story-maps-and-stories-carry-a-drift-invalidated-human-oversight-marker-architecture-rule ratification a-story-cannot-be-implemented-while-in-draft-implementation-requires-accepted-architecture-rule names but never implemented
|
|
15
|
+
# (the-story-accepted-gate-names-ratification-but-no-surface-enforces-it-problem): a commit against an `accepted`/`in-progress` story is blocked unless
|
|
16
16
|
# that story is ratified. This half is UNCONDITIONAL — a pure tightening, no
|
|
17
|
-
# config, no opt-in — because putting an
|
|
18
|
-
# would be the decision conflict. Under
|
|
17
|
+
# config, no opt-in — because putting an story-maps-and-stories-carry-a-drift-invalidated-human-oversight-marker-architecture-rule-mandated check behind a flag
|
|
18
|
+
# would be the decision conflict. Under a-release-row-is-the-rfc-and-the-map-is-the-approval-surface-architecture-rule the approval surface is the story
|
|
19
19
|
# MAP: a story carries no oversight marker of its own, and is approved when every
|
|
20
20
|
# map in its `story-maps:` field is ratified.
|
|
21
21
|
#
|
|
22
22
|
# Bypass: BYPASS_NO_IMPLEMENT_DRAFT=1.
|
|
23
23
|
#
|
|
24
|
-
# @adr
|
|
25
|
-
#
|
|
26
|
-
#
|
|
27
|
-
# @problem
|
|
24
|
+
# @adr a-story-cannot-be-implemented-while-in-draft-implementation-requires-accepted-architecture-rule (no-implement-while-draft) problem-rfc-story-framework-with-mandatory-problem-trace-and-unified-problem-ontology-architecture-rule (lifecycle)
|
|
25
|
+
# story-map-membership-and-story-content-completeness-are-enforced-at-capture-architecture-rule (sibling capture-time gates) behavioural-tests-default-for-skill-testing-architecture-rule (bats)
|
|
26
|
+
# story-maps-and-stories-carry-a-drift-invalidated-human-oversight-marker-architecture-rule (drift-invalidated ratification) a-release-row-is-the-rfc-and-the-map-is-the-approval-surface-architecture-rule (map is the approval surface)
|
|
27
|
+
# @problem implement-in-the-skills-and-tests-1-story-per-rfc-story-map-story-ratification-problem the-story-accepted-gate-names-ratification-but-no-surface-enforces-it-problem afk-iter-cannot-progress-a-ratified-known-error-when-the-fix-vehicle-rfc-has-empty-stories-problem
|
|
28
28
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
29
29
|
# shellcheck source=lib/command-detect.sh
|
|
30
30
|
source "$SCRIPT_DIR/lib/command-detect.sh" 2>/dev/null || exit 0
|
|
31
31
|
# Degrades to a no-op on a missing lib. NOT authorised by any in-force decision:
|
|
32
|
-
#
|
|
32
|
+
# structured-user-interaction-for-governance-skill-decisions-architecture-rule (Structured user interaction for governance-skill decisions) Rule 6
|
|
33
33
|
# governs a skill that cannot reach AskUserQuestion, and its Continue clause
|
|
34
34
|
# reads "Do NOT silently fail-soft-skip". This posture is CHARACTERISED, not
|
|
35
35
|
# endorsed — see "the gate degrades to a no-op when its predicate lib is
|
|
36
36
|
# missing" in hooks/test/. Both source guards are terminal and both precede
|
|
37
37
|
# every check, so a missing lib — either one — degrades to no gate at all.
|
|
38
|
-
# Open question queued at
|
|
38
|
+
# Open question queued at plugin-removes-hook-file-but-adopter-session-still-invokes-it-via-stale-binding-architect-compendium-refresh-discipline-sh-case-2026-06-17-problem.
|
|
39
39
|
# shellcheck source=../lib/story-oversight.sh
|
|
40
40
|
source "$SCRIPT_DIR/../lib/story-oversight.sh" 2>/dev/null || exit 0
|
|
41
41
|
|
|
@@ -82,10 +82,10 @@ while IFS= read -r id; do
|
|
|
82
82
|
[ -n "$id" ] || continue
|
|
83
83
|
shopt -s nullglob; draftfiles=(./docs/stories/draft/${id}-*.md); shopt -u nullglob
|
|
84
84
|
if [ ${#draftfiles[@]} -gt 0 ]; then
|
|
85
|
-
deny "BLOCKED (
|
|
85
|
+
deny "BLOCKED (a-story-cannot-be-implemented-while-in-draft-implementation-requires-accepted-architecture-rule / implement-in-the-skills-and-tests-1-story-per-rfc-story-map-story-ratification-problem): this commit references ${id} via a Refs: trailer, but ${id} is still in draft. A draft story cannot be implemented — accept it first via /wr-itil:manage-story ${id} accepted (it runs the INVEST + RFC-trace gates + ratification), then re-commit. Bypass: BYPASS_NO_IMPLEMENT_DRAFT=1."
|
|
86
86
|
fi
|
|
87
87
|
|
|
88
|
-
#
|
|
88
|
+
# story-maps-and-stories-carry-a-drift-invalidated-human-oversight-marker-architecture-rule ratification at the implementation locus (the-story-accepted-gate-names-ratification-but-no-surface-enforces-it-problem). a-story-cannot-be-implemented-while-in-draft-implementation-requires-accepted-architecture-rule's Decision
|
|
89
89
|
# Outcome claims no unratified story can ever be implemented; nothing enforced
|
|
90
90
|
# it until here. Scoped to accepted/in-progress — done/archived stories are
|
|
91
91
|
# past implementation and are not gated.
|
|
@@ -95,10 +95,10 @@ while IFS= read -r id; do
|
|
|
95
95
|
[ ${#livefiles[@]} -gt 0 ] || continue
|
|
96
96
|
story="${livefiles[0]}"
|
|
97
97
|
|
|
98
|
-
#
|
|
98
|
+
# a-release-row-is-the-rfc-and-the-map-is-the-approval-surface-architecture-rule: a story's approval is its story MAP's. The story itself carries no
|
|
99
99
|
# oversight marker, so there is one question to ask and one place to fix it.
|
|
100
100
|
if ! story_is_approved "$story"; then
|
|
101
|
-
deny "BLOCKED (
|
|
101
|
+
deny "BLOCKED (a-release-row-is-the-rfc-and-the-map-is-the-approval-surface-architecture-rule / a-story-cannot-be-implemented-while-in-draft-implementation-requires-accepted-architecture-rule / the-story-accepted-gate-names-ratification-but-no-surface-enforces-it-problem): this commit references ${id}, but ${id} is not approved. A story is approved by its story map: every map in its \`story-maps:\` field must be ratified, and ${id} either names no map or names one that is unratified or has drifted since it was ratified. Ratify the map via /wr-itil:manage-story-map <MAP-ID> ratify, then re-commit. Bypass: BYPASS_NO_IMPLEMENT_DRAFT=1."
|
|
102
102
|
fi
|
|
103
103
|
done <<< "$STORIES"
|
|
104
104
|
|
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
|
-
# wr-itil — SessionStart hook (
|
|
2
|
+
# wr-itil — SessionStart hook (ship-pending-questions-surface-hook-auto-surface-accumulated-outstanding-questions-from-afk-run-state-outstanding-questions-jsonl-at-session-start-when-user-returns-interactive-problem, governance-skill-invocation-patterns-foreground-background-with-deferred-question-resumption-architecture-rule ship-pending-questions-surface-hook-auto-surface-accumulated-outstanding-questions-from-afk-run-state-outstanding-questions-jsonl-at-session-start-when-user-returns-interactive-problem amendment, session-start-briefing-surface-sessionstart-hook-over-tiered-directory-indexed-readme-architecture-rule precedent)
|
|
3
3
|
#
|
|
4
4
|
# Surfaces accumulated `outstanding_questions` entries from the AFK loop's
|
|
5
5
|
# session-level queue file at .afk-run-state/outstanding-questions.jsonl
|
|
6
6
|
# when the user starts a new interactive session. The queue is populated
|
|
7
7
|
# between iters by /wr-itil:work-problems Step 5 / Step 2.5 / Step 2.5b
|
|
8
|
-
# (
|
|
8
|
+
# (decision-delegation-contract-agents-over-apply-rule-1-s-interactive-default-to-framework-resolved-decisions-codify-the-framework-resolution-boundary-afk-loop-s-batched-questions-as-deliverable-lazy-askuserquestion-measurement-problem Phase 3 + decision-delegation-contract-when-agents-act-on-the-framework-vs-ask-the-user-architecture-rule 6-class taxonomy schema).
|
|
9
9
|
#
|
|
10
10
|
# Without this hook, accumulated questions persist across session boundaries
|
|
11
11
|
# unread when an AFK loop halts before its Step 2.5 / Step 2.5b emit fires
|
|
12
12
|
# (manual stop, quota exhaustion, network failure). With this hook, the
|
|
13
13
|
# accumulated queue surfaces deterministically on session start; the agent
|
|
14
|
-
# fires AskUserQuestion in batches (<=4 per call per
|
|
14
|
+
# fires AskUserQuestion in batches (<=4 per call per structured-user-interaction-for-governance-skill-decisions-architecture-rule Rule 1) on the
|
|
15
15
|
# user's first interactive turn and rewrites the queue file to remove
|
|
16
16
|
# resolved entries.
|
|
17
17
|
#
|
|
18
18
|
# Wired from packages/itil/hooks/hooks.json SessionStart array with
|
|
19
|
-
# matcher "startup" (per
|
|
20
|
-
# empty, or whitespace-only per
|
|
19
|
+
# matcher "startup" (per session-start-briefing-surface-sessionstart-hook-over-tiered-directory-indexed-readme-architecture-rule Option A). Silent exit if queue is missing,
|
|
20
|
+
# empty, or whitespace-only per session-start-briefing-surface-sessionstart-hook-over-tiered-directory-indexed-readme-architecture-rule Mechanism step 1.
|
|
21
21
|
#
|
|
22
|
-
# AFK-iter cross-context-leak prevention (
|
|
22
|
+
# AFK-iter cross-context-leak prevention (governance-skill-invocation-patterns-foreground-background-with-deferred-question-resumption-architecture-rule line 127): when invoked
|
|
23
23
|
# inside a /wr-itil:work-problems iter subprocess (which inherits the
|
|
24
24
|
# orchestrator's queue file), the orchestrator's Step 5 dispatch block sets
|
|
25
25
|
# WR_SUPPRESS_PENDING_QUESTIONS=1 before each `claude -p` spawn. The hook
|
|
@@ -38,11 +38,11 @@ fi
|
|
|
38
38
|
|
|
39
39
|
QUEUE_FILE="${CLAUDE_PROJECT_DIR:-.}/.afk-run-state/outstanding-questions.jsonl"
|
|
40
40
|
|
|
41
|
-
# Silent-on-no-content per
|
|
41
|
+
# Silent-on-no-content per session-start-briefing-surface-sessionstart-hook-over-tiered-directory-indexed-readme-architecture-rule Mechanism step 1.
|
|
42
42
|
[ -f "$QUEUE_FILE" ] || exit 0
|
|
43
43
|
[ -s "$QUEUE_FILE" ] || exit 0
|
|
44
44
|
|
|
45
|
-
#
|
|
45
|
+
# decision-delegation-contract-when-agents-act-on-the-framework-vs-ask-the-user-architecture-rule 6-class taxonomy precedence — lower rank value = higher priority.
|
|
46
46
|
# Strings match the JSONL schema in work-problems SKILL.md Step 5 verbatim.
|
|
47
47
|
rank_for_category() {
|
|
48
48
|
case "$1" in
|
|
@@ -85,7 +85,7 @@ ENTRIES_TSV=$(
|
|
|
85
85
|
|
|
86
86
|
ENTRY_COUNT=$(printf '%s\n' "$ENTRIES_TSV" | wc -l | tr -d ' ')
|
|
87
87
|
|
|
88
|
-
# Emit additionalContext on stdout (
|
|
88
|
+
# Emit additionalContext on stdout (session-start-briefing-surface-sessionstart-hook-over-tiered-directory-indexed-readme-architecture-rule plain-stdout shape per
|
|
89
89
|
# session-start-briefing.sh precedent).
|
|
90
90
|
{
|
|
91
91
|
echo "PENDING QUESTIONS FROM PRIOR AFK LOOP — accumulated outstanding_questions"
|
|
@@ -93,7 +93,7 @@ ENTRY_COUNT=$(printf '%s\n' "$ENTRIES_TSV" | wc -l | tr -d ' ')
|
|
|
93
93
|
echo ""
|
|
94
94
|
echo "These are direction / deviation-approval / one-time-override / silent-framework"
|
|
95
95
|
echo "/ taste / correction-followup observations queued by /wr-itil:work-problems"
|
|
96
|
-
echo "iters per
|
|
96
|
+
echo "iters per decision-delegation-contract-when-agents-act-on-the-framework-vs-ask-the-user-architecture-rule 6-class taxonomy. Surface them via AskUserQuestion batched"
|
|
97
97
|
echo "<=4 per call (sequential when >4) on the user's first interactive turn,"
|
|
98
98
|
echo "ranked deviation-approval > direction > one-time-override > silent-framework"
|
|
99
99
|
echo "> taste > correction-followup. After resolving each entry, remove the"
|
|
@@ -117,7 +117,7 @@ ENTRY_COUNT=$(printf '%s\n' "$ENTRIES_TSV" | wc -l | tr -d ' ')
|
|
|
117
117
|
echo ""
|
|
118
118
|
if [ "$ENTRY_COUNT" -gt 4 ]; then
|
|
119
119
|
echo "Note: ${ENTRY_COUNT} entries exceeds the AskUserQuestion <=4 per-call"
|
|
120
|
-
echo "cap (
|
|
120
|
+
echo "cap (structured-user-interaction-for-governance-skill-decisions-architecture-rule Rule 1). Fire sequential calls — first 4 highest-ranked"
|
|
121
121
|
echo "first, then the next batch, until the queue is drained."
|
|
122
122
|
fi
|
|
123
123
|
} 2>/dev/null
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
|
-
#
|
|
2
|
+
# 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: PreToolUse:Bash hook — denies `git commit` invocations whose
|
|
3
3
|
# staged set includes a `docs/problems/<state>/NNN-*.md` ticket change
|
|
4
4
|
# but does NOT also stage a `docs/problems/README.md` refresh. Hook-
|
|
5
|
-
# level enforcement replaces the declarative-only
|
|
5
|
+
# level enforcement replaces the declarative-only problem-094-wr-itil-manage-problem-does-not-refresh-docs-problems-readme-md-on-ticket-creation-problem / problem-062-manage-problem-does-not-refresh-docs-problems-readme-md-on-single-ticket-transitions-fast-path-cache-goes-stale-silently-problem contract
|
|
6
6
|
# in manage-problem SKILL.md Step 5 / Step 7 — iter subprocess commits
|
|
7
7
|
# previously could ship a `.verifying.md` rename or Status edit without
|
|
8
8
|
# the corresponding Verification Queue / WSJF Rankings row update in
|
|
@@ -12,14 +12,14 @@
|
|
|
12
12
|
# Detection delegates to `lib/readme-refresh-detect.sh::detect_readme_refresh_required`.
|
|
13
13
|
# When the helper returns 1, this hook emits PreToolUse deny JSON with
|
|
14
14
|
# the offending ticket path inline and the literal `git add
|
|
15
|
-
# docs/problems/README.md` recovery command, satisfying
|
|
15
|
+
# docs/problems/README.md` recovery command, satisfying structured-user-interaction-for-governance-skill-decisions-architecture-rule
|
|
16
16
|
# Rule 1's "deny redirects to a recovery path" contract via the
|
|
17
17
|
# mechanical-recovery shape (no skill wrapper required — staging the
|
|
18
18
|
# README is a single command).
|
|
19
19
|
#
|
|
20
|
-
# Allow paths (exit 0 silently per
|
|
20
|
+
# Allow paths (exit 0 silently per hook-injection-budget-policy-for-pretooluse-and-posttooluse-hooks-architecture-rule Pattern 1):
|
|
21
21
|
# - tool_name != "Bash" (only Bash invocations are gated)
|
|
22
|
-
# - command does not invoke (
|
|
22
|
+
# - command does not invoke (hook-substring-matches-git-commit-anywhere-in-bash-command-not-just-actual-git-commit-invocations-problem: leading-executable check
|
|
23
23
|
# `git commit` as its leading- via `lib/command-detect.sh`
|
|
24
24
|
# effective command — replaces prior substring match
|
|
25
25
|
# that misfired on grep/sed/cat
|
|
@@ -32,23 +32,23 @@
|
|
|
32
32
|
# - parse failure on stdin (mirrors create-gate.sh fail-open)
|
|
33
33
|
#
|
|
34
34
|
# References:
|
|
35
|
-
#
|
|
36
|
-
#
|
|
35
|
+
# plugin-testing-strategy-architecture-rule — plugin testing strategy (hook bats live under hooks/test/).
|
|
36
|
+
# gate-marker-lifecycle-ttl-drift-not-stop-hook-reset-architecture-rule — gate marker lifecycle (this hook deliberately does NOT
|
|
37
37
|
# use markers; detection is per-invocation deterministic
|
|
38
|
-
# — same precedent as
|
|
39
|
-
#
|
|
40
|
-
#
|
|
41
|
-
#
|
|
42
|
-
#
|
|
43
|
-
#
|
|
38
|
+
# — same precedent as staging-trap-recurs-despite-documentation-hook-level-enforcement-candidate-problem + afk-iter-packages-plugin-commits-without-changesets-orchestrator-main-turn-back-fill-is-fragile-recovery-hook-level-enforcement-preferable-problem).
|
|
39
|
+
# structured-user-interaction-for-governance-skill-decisions-architecture-rule Rule 1 — deny redirects with mechanical recovery.
|
|
40
|
+
# governance-skills-commit-their-own-completed-work-architecture-rule — single-commit grain (the contract this hook enforces).
|
|
41
|
+
# problem-lifecycle-add-a-verification-pending-status-between-known-error-and-closed-architecture-rule — `.verifying.md` lifecycle status.
|
|
42
|
+
# progressive-disclosure-once-per-session-budget-for-userpromptsubmit-governance-prose-architecture-rule — progressive disclosure / deny-message terseness budget.
|
|
43
|
+
# hook-injection-budget-policy-for-pretooluse-and-posttooluse-hooks-architecture-rule — hook injection budget (Pattern 1 silent-on-pass; deny
|
|
44
44
|
# band ≤300 bytes for this hook).
|
|
45
|
-
#
|
|
46
|
-
#
|
|
47
|
-
#
|
|
48
|
-
#
|
|
49
|
-
#
|
|
50
|
-
#
|
|
51
|
-
#
|
|
45
|
+
# problem-062-manage-problem-does-not-refresh-docs-problems-readme-md-on-single-ticket-transitions-fast-path-cache-goes-stale-silently-problem — parent (README refresh on transition contract).
|
|
46
|
+
# problem-094-wr-itil-manage-problem-does-not-refresh-docs-problems-readme-md-on-ticket-creation-problem — parent (README refresh on creation contract).
|
|
47
|
+
# docs-problems-readme-md-drifts-from-filesystem-truth-across-sessions-despite-refresh-on-create-and-refresh-on-transition-both-closed-problem — sibling reconcile-readme recovery path.
|
|
48
|
+
# staging-trap-recurs-despite-documentation-hook-level-enforcement-candidate-problem — sibling staging-trap hook (same enforcement-layer shape).
|
|
49
|
+
# afk-iter-packages-plugin-commits-without-changesets-orchestrator-main-turn-back-fill-is-fragile-recovery-hook-level-enforcement-preferable-problem — sibling changeset-discipline hook (same shape).
|
|
50
|
+
# 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 — this hook.
|
|
51
|
+
# hook-substring-matches-git-commit-anywhere-in-bash-command-not-just-actual-git-commit-invocations-problem — leading-executable-token command-detect helper.
|
|
52
52
|
|
|
53
53
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
54
54
|
# shellcheck source=lib/readme-refresh-detect.sh
|
|
@@ -85,14 +85,14 @@ except:
|
|
|
85
85
|
# `lib/command-detect.sh::command_invokes_git_commit`, which strips
|
|
86
86
|
# common prefix shapes (leading whitespace, env-var assignments,
|
|
87
87
|
# `cd <path> &&`) and checks whether the residual leading token pair
|
|
88
|
-
# is literally `git commit`.
|
|
88
|
+
# is literally `git commit`. hook-substring-matches-git-commit-anywhere-in-bash-command-not-just-actual-git-commit-invocations-problem: replaced the prior substring match
|
|
89
89
|
# `*"git commit"*` that misfired on non-commit Bash whose argument
|
|
90
90
|
# vectors merely mentioned the phrase (grep/sed/cat-heredoc/echo).
|
|
91
91
|
command_invokes_git_commit "$COMMAND" || exit 0
|
|
92
92
|
|
|
93
93
|
# Run detection. Helper echoes offending ticket path on stdout when
|
|
94
94
|
# detected; returns 1 in that case. Returns 0 (allow) on no-trap,
|
|
95
|
-
# bypass env, a registered RISK_BYPASS commit-message trailer (
|
|
95
|
+
# bypass env, a registered RISK_BYPASS commit-message trailer (hook-does-not-recognise-risk-bypass-adr-031-migration-trailer-blocks-step-0a-auto-migrate-problem —
|
|
96
96
|
# `$COMMAND` is threaded in so the helper can inspect the trailer), or
|
|
97
97
|
# fail-open (non-git tree, parse error).
|
|
98
98
|
TRAPPED_TICKET=$(detect_readme_refresh_required "$COMMAND" 2>/dev/null) && exit 0
|
|
@@ -100,7 +100,7 @@ TRAPPED_TICKET=$(detect_readme_refresh_required "$COMMAND" 2>/dev/null) && exit
|
|
|
100
100
|
# Extract the leading ticket-ID digits from the basename so the deny
|
|
101
101
|
# names the ticket as `P<NNN>` rather than the full descriptive path
|
|
102
102
|
# (problem tickets carry long slugs; embedding the full path can
|
|
103
|
-
# exceed
|
|
103
|
+
# exceed hook-injection-budget-policy-for-pretooluse-and-posttooluse-hooks-architecture-rule deny-band 300 bytes). `git status` reveals the exact
|
|
104
104
|
# staged path for recovery; the deny only needs to name the ticket
|
|
105
105
|
# distinctly.
|
|
106
106
|
BASENAME="${TRAPPED_TICKET##*/}"
|
|
@@ -111,14 +111,14 @@ case "$TICKET_NUM" in
|
|
|
111
111
|
esac
|
|
112
112
|
|
|
113
113
|
# Trap detected — emit deny with terse recovery.
|
|
114
|
-
# Voice-tone budget per
|
|
114
|
+
# Voice-tone budget per hook-injection-budget-policy-for-pretooluse-and-posttooluse-hooks-architecture-rule deny-band ≤300 bytes total. Names the
|
|
115
115
|
# offending ticket ID, the literal recovery command, the BYPASS env
|
|
116
|
-
# var escape with correct propagation syntax (
|
|
117
|
-
#
|
|
116
|
+
# var escape with correct propagation syntax (readme-refresh-discipline-hook-deny-message-advertises-bypass-readme-refresh-gate-1-inline-prefix-that-does-not-propagate-to-the-pretooluse-hook-recurrence-of-at-a-new-surface-problem / bypass-gate-env-vars-do-not-propagate-from-bash-subshell-to-pretooluse-hook-context-problem), and the
|
|
117
|
+
# 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 cite. Inline-prefix `VAR=1 git commit ...` does NOT propagate
|
|
118
118
|
# from a Bash subshell to PreToolUse hooks; the env field of
|
|
119
119
|
# `.claude/settings.json` (or shell `export` before `claude` launch)
|
|
120
120
|
# is the working path.
|
|
121
|
-
REASON="BLOCKED:
|
|
121
|
+
REASON="BLOCKED: 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. ${TICKET_ID} needs README refresh: git add docs/problems/README.md. Bypass: BYPASS_README_REFRESH_GATE=1 via .claude/settings.json env (bypass-gate-env-vars-do-not-propagate-from-bash-subshell-to-pretooluse-hook-context-problem)."
|
|
122
122
|
|
|
123
123
|
cat <<EOF
|
|
124
124
|
{
|
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
# wr-itil — SessionStart hook (
|
|
2
|
+
# wr-itil — SessionStart hook (rfc-lifecycle-is-not-self-maintaining-it-leans-on-human-memory-problem/rfc-lifecycle-self-maintenance-release-design; human-oversight-marker-wr-architect-review-decisions-drain-for-recorded-decisions-architecture-rule/068 oversight-nudge clone)
|
|
3
3
|
#
|
|
4
4
|
# Surfaces a one-line nudge when RFCs lack the human-oversight marker, so the
|
|
5
5
|
# user can ratify them via /wr-itil:manage-rfc <RFC-NNN> (the accepted
|
|
6
6
|
# transition ratifies RFC scope). Sibling of architect-oversight-nudge.sh
|
|
7
|
-
# (
|
|
8
|
-
# shape as the
|
|
9
|
-
# every session instead of leaning on the user's memory (
|
|
7
|
+
# (human-oversight-marker-wr-architect-review-decisions-drain-for-recorded-decisions-architecture-rule) and jtbd-oversight-nudge.sh (jtbd-persona-human-oversight-marker-wr-jtbd-confirm-jobs-and-personas-drain-sibling-of-architecture-rule); same class-B SessionStart
|
|
8
|
+
# shape as the session-start-briefing-surface-sessionstart-hook-over-tiered-directory-indexed-readme-architecture-rule session-start surface — so ratification is auto-surfaced
|
|
9
|
+
# every session instead of leaning on the user's memory (rfc-lifecycle-is-not-self-maintaining-it-leans-on-human-memory-problem).
|
|
10
10
|
#
|
|
11
11
|
# Detection is token-cheap: delegates to detect-unoversighted-rfcs.sh (a grep
|
|
12
12
|
# over docs/rfcs/ frontmatter — no body reads, no per-RFC LLM call). Silent
|
|
13
13
|
# when the unoversighted count is zero (steady state once ratified).
|
|
14
14
|
#
|
|
15
15
|
# AFK self-suppress: shares the suite-wide WR_SUPPRESS_OVERSIGHT_NUDGE guard
|
|
16
|
-
# with the architect + jtbd oversight nudges (
|
|
16
|
+
# with the architect + jtbd oversight nudges (jtbd-persona-human-oversight-marker-wr-jtbd-confirm-jobs-and-personas-drain-sibling-of-architecture-rule § shared cross-plugin
|
|
17
17
|
# contracts). AFK orchestrators export it once and every oversight nudge
|
|
18
18
|
# self-suppresses — so this interactive ratify nudge never fires into an
|
|
19
|
-
# absent-user subprocess (
|
|
20
|
-
# suppresses. Silent-on-zero; fail-open;
|
|
19
|
+
# absent-user subprocess (progress-the-backlog-while-i-m-away-user-outcome friction guard). Only the literal "1"
|
|
20
|
+
# suppresses. Silent-on-zero; fail-open; session-start-briefing-surface-sessionstart-hook-over-tiered-directory-indexed-readme-architecture-rule ≤2KB budget (one line).
|
|
21
21
|
|
|
22
22
|
set -uo pipefail
|
|
23
23
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
|
-
#
|
|
2
|
+
# 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: PostToolUse:Bash hook — detects `git commit` invocations whose
|
|
3
3
|
# HEAD commit message carries a `Refs: RFC-<NNN>` trailer (the
|
|
4
|
-
# commit-message RFC trailer convention introduced by
|
|
4
|
+
# commit-message RFC trailer convention introduced by problem-rfc-story-framework-with-mandatory-problem-trace-and-unified-problem-ontology-architecture-rule Phase 1
|
|
5
5
|
# item 12 + finding 8). For each such trailer, the hook checks whether
|
|
6
6
|
# the driving problem ticket(s) `## RFCs` reverse-trace section lists
|
|
7
7
|
# the RFC; emits a stderr advisory when stale.
|
|
@@ -14,14 +14,14 @@
|
|
|
14
14
|
# `Refs: RFC-<NNN>` trailers but were authored OUTSIDE the RFC skills
|
|
15
15
|
# and therefore did not run the inline refresh.
|
|
16
16
|
#
|
|
17
|
-
# Advisory-only per architect Q2 verdict +
|
|
17
|
+
# Advisory-only per architect Q2 verdict + governance-skills-commit-their-own-completed-work-architecture-rule single-commit grain:
|
|
18
18
|
# the hook NEVER auto-fixes (no follow-up commit; no working-tree edit
|
|
19
19
|
# after the commit lands). It emits a stderr advisory pointing the
|
|
20
20
|
# user at `/wr-itil:manage-rfc <RFC-NNN>` to refresh the reverse-trace
|
|
21
21
|
# in a subsequent commit, OR at `wr-itil-reconcile-rfcs docs/rfcs
|
|
22
22
|
# docs/problems` to verify drift in batch.
|
|
23
23
|
#
|
|
24
|
-
# Allow paths (silent-on-pass per
|
|
24
|
+
# Allow paths (silent-on-pass per hook-injection-budget-policy-for-pretooluse-and-posttooluse-hooks-architecture-rule Pattern 1):
|
|
25
25
|
# - tool_name != "Bash" (only Bash invocations gated)
|
|
26
26
|
# - command lacks `git commit` (non-commit Bash bypasses)
|
|
27
27
|
# - BYPASS_RFC_TRAILER_ADVISORY=1 (env-var escape)
|
|
@@ -34,10 +34,10 @@
|
|
|
34
34
|
# Multi-`Refs:` malformed-per-finding-8 advisory: when HEAD's commit
|
|
35
35
|
# message carries multiple `Refs: RFC-<NNN>` trailer lines, the hook
|
|
36
36
|
# emits a malformed-per-finding-8 advisory directing the user to split
|
|
37
|
-
# the commit (one commit advances at most one RFC per
|
|
37
|
+
# the commit (one commit advances at most one RFC per problem-rfc-story-framework-with-mandatory-problem-trace-and-unified-problem-ontology-architecture-rule finding
|
|
38
38
|
# 8). The split itself is user-side work; the hook flags only.
|
|
39
39
|
#
|
|
40
|
-
# Failmode (per
|
|
40
|
+
# Failmode (per structured-user-interaction-for-governance-skill-decisions-architecture-rule Rule 6 fail-open): on parse error in the
|
|
41
41
|
# trailer, on a Refs: trailer pointing to a non-existent RFC file
|
|
42
42
|
# (could be a capture-rfc invocation in flight), on `git interpret-trailers`
|
|
43
43
|
# failure — exit 0 silently. The reconcile-rfcs.sh batch surface
|
|
@@ -45,37 +45,37 @@
|
|
|
45
45
|
# Confirmation criterion 3.
|
|
46
46
|
#
|
|
47
47
|
# Cost: one git invocation per `git commit` Bash call (~30-60ms). No
|
|
48
|
-
# marker (per-invocation deterministic; mirrors
|
|
49
|
-
# and
|
|
48
|
+
# marker (per-invocation deterministic; mirrors staging-trap-recurs-despite-documentation-hook-level-enforcement-candidate-problem staging-detect.sh
|
|
49
|
+
# and afk-iter-packages-plugin-commits-without-changesets-orchestrator-main-turn-back-fill-is-fragile-recovery-hook-level-enforcement-preferable-problem itil-changeset-discipline.sh precedent).
|
|
50
50
|
#
|
|
51
51
|
# Command-shape detection delegates to
|
|
52
52
|
# `lib/command-detect.sh::command_invokes_git_commit`, which strips
|
|
53
53
|
# common prefix shapes (leading whitespace, env-var assignments,
|
|
54
54
|
# `cd <path> &&`) and checks whether the residual leading token pair
|
|
55
|
-
# is literally `git commit`.
|
|
55
|
+
# is literally `git commit`. itil-rfc-trailer-advisory-sh-hook-substring-matches-git-commit-anywhere-in-bash-command-sibling-problem: replaced the prior substring match
|
|
56
56
|
# `*"git commit"*` that misfired on non-commit Bash whose argument
|
|
57
57
|
# vectors merely mentioned the phrase (grep / sed / cat-heredoc /
|
|
58
58
|
# echo / `git log --grep`).
|
|
59
59
|
#
|
|
60
60
|
# References:
|
|
61
|
-
#
|
|
62
|
-
#
|
|
63
|
-
#
|
|
61
|
+
# plugin-testing-strategy-architecture-rule — plugin testing strategy (hook bats live under hooks/test/).
|
|
62
|
+
# structured-user-interaction-for-governance-skill-decisions-architecture-rule Rule 6 — fail-open on missing inputs / parse errors.
|
|
63
|
+
# governance-skills-commit-their-own-completed-work-architecture-rule — single-commit grain (this hook never auto-fixes via
|
|
64
64
|
# follow-up commit; advisory-only).
|
|
65
|
-
#
|
|
65
|
+
# shared-code-duplicated-into-per-package-lib-kept-in-sync-by-script-ci-drift-check-architecture-rule — shared-code sync pattern (command-detect.sh canonical at
|
|
66
66
|
# packages/shared/hooks/lib/).
|
|
67
|
-
#
|
|
68
|
-
#
|
|
69
|
-
#
|
|
67
|
+
# progressive-disclosure-once-per-session-budget-for-userpromptsubmit-governance-prose-architecture-rule — progressive disclosure / advisory band ≤300 bytes.
|
|
68
|
+
# hook-injection-budget-policy-for-pretooluse-and-posttooluse-hooks-architecture-rule — hook injection budget; Pattern 1 silent-on-pass.
|
|
69
|
+
# windyroad-plugin-readmes-anchor-on-jtbd-job-ids-with-load-bearing-commit-hook-prose-woven-framing-architecture-rule — load-bearing-from-the-start (drift detection ships at
|
|
70
70
|
# the same time as the convention; never deferred).
|
|
71
|
-
#
|
|
72
|
-
#
|
|
73
|
-
#
|
|
74
|
-
#
|
|
75
|
-
#
|
|
76
|
-
#
|
|
77
|
-
#
|
|
78
|
-
#
|
|
71
|
+
# behavioural-tests-default-for-skill-testing-architecture-rule — behavioural-tests default; bats live alongside.
|
|
72
|
+
# problem-rfc-story-framework-with-mandatory-problem-trace-and-unified-problem-ontology-architecture-rule — Phase 1 item 12 + Confirmation criterion 3.
|
|
73
|
+
# 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 — driving problem ticket.
|
|
74
|
+
# problem-081-structural-source-content-tests-are-wasteful-tdd-agent-should-reject-them-and-require-behavioural-tests-framework-stub-enhancements-problem — behavioural tests preferred over structural greps.
|
|
75
|
+
# staging-trap-recurs-despite-documentation-hook-level-enforcement-candidate-problem — sibling per-invocation no-marker hook precedent.
|
|
76
|
+
# afk-iter-packages-plugin-commits-without-changesets-orchestrator-main-turn-back-fill-is-fragile-recovery-hook-level-enforcement-preferable-problem — sibling commit-time gate hook precedent.
|
|
77
|
+
# hook-substring-matches-git-commit-anywhere-in-bash-command-not-just-actual-git-commit-invocations-problem — shared `command_invokes_git_commit` helper.
|
|
78
|
+
# itil-rfc-trailer-advisory-sh-hook-substring-matches-git-commit-anywhere-in-bash-command-sibling-problem — sibling-hook refactor: substring-match → helper here.
|
|
79
79
|
|
|
80
80
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
81
81
|
# shellcheck source=lib/command-detect.sh
|
|
@@ -106,7 +106,7 @@ except:
|
|
|
106
106
|
print('')
|
|
107
107
|
" 2>/dev/null || echo "")
|
|
108
108
|
|
|
109
|
-
# Only fire on actual `git commit` invocations.
|
|
109
|
+
# Only fire on actual `git commit` invocations. itil-rfc-trailer-advisory-sh-hook-substring-matches-git-commit-anywhere-in-bash-command-sibling-problem: delegates to the
|
|
110
110
|
# shared `command_invokes_git_commit` helper for leading-executable
|
|
111
111
|
# semantics (was substring match prone to grep/sed/echo false positives).
|
|
112
112
|
command_invokes_git_commit "$COMMAND" || exit 0
|
|
@@ -138,7 +138,7 @@ TRAILERS=$(printf '%s\n' "$COMMIT_MSG" | git interpret-trailers --parse 2>/dev/n
|
|
|
138
138
|
# Multi-Refs: malformed-per-finding-8 advisory.
|
|
139
139
|
TRAILER_COUNT=$(printf '%s\n' "$TRAILERS" | wc -l | tr -d ' ')
|
|
140
140
|
if [ "$TRAILER_COUNT" -gt 1 ]; then
|
|
141
|
-
echo "
|
|
141
|
+
echo "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 ADVISORY: HEAD commit carries ${TRAILER_COUNT} Refs: RFC trailers (malformed-per-finding-8 — one commit advances at most one RFC per problem-rfc-story-framework-with-mandatory-problem-trace-and-unified-problem-ontology-architecture-rule). Recovery: split the commit; rerun /wr-itil:manage-rfc on each RFC. Bypass: BYPASS_RFC_TRAILER_ADVISORY=1." >&2
|
|
142
142
|
exit 0
|
|
143
143
|
fi
|
|
144
144
|
|
|
@@ -209,6 +209,6 @@ done
|
|
|
209
209
|
# No drift → silent.
|
|
210
210
|
[ -n "$STALE_PIDS" ] || exit 0
|
|
211
211
|
|
|
212
|
-
# Emit advisory (per
|
|
213
|
-
echo "
|
|
212
|
+
# Emit advisory (per hook-injection-budget-policy-for-pretooluse-and-posttooluse-hooks-architecture-rule ≤300 byte band; stderr; exit 0).
|
|
213
|
+
echo "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 ADVISORY: HEAD commit ${RFC_ID} trailer; problem(s) ${STALE_PIDS} ## RFCs section stale (skill-side refresh missed). Recovery: /wr-itil:manage-rfc ${RFC_ID} OR wr-itil-reconcile-rfcs docs/rfcs docs/problems. Bypass: BYPASS_RFC_TRAILER_ADVISORY=1." >&2
|
|
214
214
|
exit 0
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
|
-
#
|
|
2
|
+
# phase-4-get-current-session-id-helper-system-priority-bug-subprocess-sids-win-mtime-selection-over-orchestrator-sid-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: runtime-SID instrumentation PreToolUse hook.
|
|
3
3
|
#
|
|
4
4
|
# Captures the runtime stdin `session_id` from Claude Code's PreToolUse
|
|
5
5
|
# JSON payload and writes it to a per-machine, per-user, per-project
|
|
6
6
|
# marker file. The `get_current_session_id` helper (lib/session-id.sh)
|
|
7
7
|
# reads this marker as the authoritative current-session UUID, replacing
|
|
8
8
|
# the Phase 3 mtime-based announce-marker selection that misfired in
|
|
9
|
-
# orchestrator main turns AFTER subprocess dispatch (
|
|
9
|
+
# orchestrator main turns AFTER subprocess dispatch (phase-4-get-current-session-id-helper-system-priority-bug-subprocess-sids-win-mtime-selection-over-orchestrator-sid-problem ticket).
|
|
10
10
|
#
|
|
11
11
|
# Why a NEW PreToolUse hook (not an extension of an existing one):
|
|
12
12
|
# - manage-problem-enforce-create.sh already runs on PreToolUse:Write,
|
|
@@ -15,8 +15,8 @@
|
|
|
15
15
|
# ensures the marker is in place by the time enforce-create reads.
|
|
16
16
|
# - The architect-enforce-edit / jtbd-enforce-edit / tdd-enforce hooks
|
|
17
17
|
# are owned by sibling plugins; cross-plugin coupling is rejected
|
|
18
|
-
# per
|
|
19
|
-
# - A standalone, single-purpose hook is the cleanest fit for
|
|
18
|
+
# per shared-code-duplicated-into-per-package-lib-kept-in-sync-by-script-ci-drift-check-architecture-rule (shared-code-sync).
|
|
19
|
+
# - A standalone, single-purpose hook is the cleanest fit for hook-injection-budget-policy-for-pretooluse-and-posttooluse-hooks-architecture-rule
|
|
20
20
|
# Pattern 1 (silent-on-pass, side-effect-only).
|
|
21
21
|
#
|
|
22
22
|
# Matcher: PreToolUse:Bash|Write|Edit|Read covers the tool calls that
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
# Read is included for completeness — every tool call that fires a
|
|
26
26
|
# PreToolUse hook contributes a fresh marker).
|
|
27
27
|
#
|
|
28
|
-
#
|
|
28
|
+
# hook-injection-budget-policy-for-pretooluse-and-posttooluse-hooks-architecture-rule Pattern 1 binding: this hook MUST emit 0 bytes on stdout.
|
|
29
29
|
# Adding stdout output would burn the per-tool-call context budget.
|
|
30
30
|
# All side effects are filesystem writes; observability is via the
|
|
31
31
|
# marker file itself.
|
|
@@ -37,12 +37,12 @@
|
|
|
37
37
|
# announce-marker priority logic.
|
|
38
38
|
#
|
|
39
39
|
# References:
|
|
40
|
-
#
|
|
41
|
-
#
|
|
42
|
-
#
|
|
43
|
-
#
|
|
44
|
-
#
|
|
45
|
-
#
|
|
40
|
+
# 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 — runtime-SID instrumentation surface (this hook).
|
|
41
|
+
# documented-recovery-from-gate-misfire-is-the-prescribed-surface-not-bypass-architecture-rule — gate-misfire recovery (superseded by 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).
|
|
42
|
+
# hook-injection-budget-policy-for-pretooluse-and-posttooluse-hooks-architecture-rule — hook injection budget; Pattern 1 binding.
|
|
43
|
+
# progressive-disclosure-once-per-session-budget-for-userpromptsubmit-governance-prose-architecture-rule — announce-marker contract (cold-path fallback consumer).
|
|
44
|
+
# phase-4-get-current-session-id-helper-system-priority-bug-subprocess-sids-win-mtime-selection-over-orchestrator-sid-problem — the ticket this hook closes.
|
|
45
|
+
# wr-itil-manage-problem-step-2-substep-7-session-id-discovery-is-brittle-agent-has-no-env-var-must-scrape-marker-filenames-problem — Phase 3 helper this hook complements.
|
|
46
46
|
|
|
47
47
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
48
48
|
# shellcheck source=lib/runtime-sid.sh
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
# wr-itil — SessionStart hook (
|
|
2
|
+
# wr-itil — SessionStart hook (oversight-hash-treats-the-status-body-mirror-as-substance-so-an-accept-transition-self-invalidates-its-own-ratification-problem / lifecycle-state-is-not-duplicated-inside-hashed-story-content-release-design / lifecycle-transitions-preserve-a-story-s-ratification-delivery-story).
|
|
3
3
|
#
|
|
4
4
|
# Surfaces a one-line nudge when any story still carries the `**Status**:` body
|
|
5
5
|
# line that duplicates its frontmatter `status:`. That duplicate is why an accept
|
|
@@ -12,27 +12,27 @@
|
|
|
12
12
|
# adopter's repo — as a control it depends entirely on someone remembering. A
|
|
13
13
|
# maintenance action with no automatic trigger does not happen, so artefacts
|
|
14
14
|
# predating the fix would keep the defect indefinitely while newly captured
|
|
15
|
-
# stories were immune.
|
|
15
|
+
# stories were immune. migrate-adopter-artefacts-when-a-plugin-layout-evolves-user-outcome already sanctions this shape: "Idempotency is
|
|
16
16
|
# what makes the speculative invocation safe — and what makes the skill safe to
|
|
17
17
|
# wire into bootstrap / install flows."
|
|
18
18
|
#
|
|
19
|
-
# NUDGE ONLY — this hook MUST NOT run the migration.
|
|
19
|
+
# NUDGE ONLY — this hook MUST NOT run the migration. migrate-adopter-artefacts-when-a-plugin-layout-evolves-user-outcome's ratified
|
|
20
20
|
# "Foreground-synchronous + self-committed" outcome is explicit that the
|
|
21
21
|
# developer reviews the rewritten artefacts before they ship, so migrating
|
|
22
22
|
# unattended would breach a ratified outcome rather than serve it.
|
|
23
23
|
#
|
|
24
|
-
# Names the
|
|
24
|
+
# Names the plugin-bundled-scripts-invoked-from-skill-md-resolve-via-bin-on-path-architecture-rule PATH shim, never a repo-relative `packages/...` path — the
|
|
25
25
|
# latter resolves only in the source monorepo, which is exactly the blind spot
|
|
26
|
-
# source-repo dogfooding hides (
|
|
26
|
+
# source-repo dogfooding hides (published-skills-reference-repo-relative-script-paths-adopter-bash-invocations-hard-fail-at-step-0-problem/published-skills-enumerate-repo-relative-directories-adopter-sessions-get-zero-byte-attribution-rows-from-missing-trees-problem/manage-problem-skill-md-uses-repo-relative-script-path-that-fails-for-plugin-installed-users-problem/capture-problem-capture-rfc-manage-problem-step-2-create-gate-marker-step-sources-repo-relative-packages-itil-hooks-lib-sh-fails-in-adopter-installs-recurring-published-path-class-problem).
|
|
27
27
|
#
|
|
28
28
|
# Detection is token-cheap: one grep over story filenames, no body reads beyond
|
|
29
29
|
# the match, no LLM call. Silent when clean (the steady state after migrating),
|
|
30
|
-
# fail-open, one line, within the
|
|
30
|
+
# fail-open, one line, within the session-start-briefing-surface-sessionstart-hook-over-tiered-directory-indexed-readme-architecture-rule ≤2KB budget.
|
|
31
31
|
#
|
|
32
32
|
# AFK self-suppress: shares the suite-wide WR_SUPPRESS_OVERSIGHT_NUDGE guard
|
|
33
33
|
# with the architect / jtbd / itil-rfc oversight nudges, so an orchestrator
|
|
34
34
|
# exports it once and every nudge self-suppresses rather than firing at an
|
|
35
|
-
# absent user (
|
|
35
|
+
# absent user (progress-the-backlog-while-i-m-away-user-outcome friction guard). Only the literal "1" suppresses.
|
|
36
36
|
|
|
37
37
|
set -uo pipefail
|
|
38
38
|
|
package/hooks/lib/block-list.sh
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
|
-
#
|
|
3
|
-
# Per
|
|
2
|
+
# blocked-user-list-mechanism-for-inbound-report-management-refuse-future-tickets-from-clearly-malicious-reporters-problem: shared block-list helper for the inbound-report block mechanism.
|
|
3
|
+
# Per blocked-reporters-persistence-per-repo-hashed-id-audit-log-first-architecture-rule §v1 implementation contract — audit-log-only.
|
|
4
4
|
#
|
|
5
5
|
# Functions:
|
|
6
6
|
# is_blocked(<reporter-id-hash>)
|
|
@@ -17,16 +17,16 @@
|
|
|
17
17
|
# Helper does NOT compute hashes. Caller supplies an opaque hex string;
|
|
18
18
|
# the helper validates SHA-256-width hex shape (64 chars, [0-9a-f]).
|
|
19
19
|
# Rationale (architect verdict, this iter): keeping the helper GitHub-
|
|
20
|
-
# agnostic means non-GitHub channel adoption (out-of-scope per
|
|
20
|
+
# agnostic means non-GitHub channel adoption (out-of-scope per blocked-reporters-persistence-per-repo-hashed-id-audit-log-first-architecture-rule
|
|
21
21
|
# §Reassessment) wouldn't require helper changes — only the hashing
|
|
22
22
|
# step on the caller side would differ.
|
|
23
23
|
#
|
|
24
24
|
# Persistence:
|
|
25
25
|
# $BLOCK_LIST_FILE — default `docs/blocked-reporters.json`. JSON array
|
|
26
|
-
# of hash strings. Tracked in git per
|
|
26
|
+
# of hash strings. Tracked in git per blocked-reporters-persistence-per-repo-hashed-id-audit-log-first-architecture-rule.
|
|
27
27
|
# $AUDIT_LOG_FILE — default `docs/blocked-reporters.audit.jsonl`.
|
|
28
28
|
# One JSON object per line (append-only). Five-field
|
|
29
|
-
# shape per
|
|
29
|
+
# shape per blocked-reporters-persistence-per-repo-hashed-id-audit-log-first-architecture-rule Q2: type, reporter_id_hash,
|
|
30
30
|
# evidence_ticket, timestamp, author.
|
|
31
31
|
#
|
|
32
32
|
# Both file paths are relative to the caller's CWD so test fixtures
|
|
@@ -39,20 +39,20 @@
|
|
|
39
39
|
# cycle for append).
|
|
40
40
|
#
|
|
41
41
|
# References:
|
|
42
|
-
#
|
|
43
|
-
#
|
|
44
|
-
# called by future
|
|
42
|
+
# plugin-testing-strategy-architecture-rule — plugin testing strategy (helper bats live alongside).
|
|
43
|
+
# governance-skills-commit-their-own-completed-work-architecture-rule — governance skills commit their own work (this helper is
|
|
44
|
+
# called by future problem-079-no-inbound-sync-of-upstream-reported-problems-reports-filed-via-the-intake-templates-never-surface-in-the-local-backlog-problem / report-upstream consumers; their
|
|
45
45
|
# commits include the block-list mutation).
|
|
46
|
-
#
|
|
47
|
-
#
|
|
46
|
+
# shared-code-duplicated-into-per-package-lib-kept-in-sync-by-script-ci-drift-check-architecture-rule — shared-code-sync pattern (helper ships ahead of consumers).
|
|
47
|
+
# problem-lifecycle-add-a-verification-pending-status-between-known-error-and-closed-architecture-rule — verification-pending status (blocked-user-list-mechanism-for-inbound-report-management-refuse-future-tickets-from-clearly-malicious-reporters-problem ships audit-log-only,
|
|
48
48
|
# transitions to verifying; full enforcement in future iters).
|
|
49
|
-
#
|
|
50
|
-
#
|
|
51
|
-
#
|
|
49
|
+
# diagnose-before-implement-structured-hypothesis-evidence-red-for-the-right-reason-gate-architecture-rule — diagnose before implement (blocked-reporters-persistence-per-repo-hashed-id-audit-log-first-architecture-rule is the diagnosis).
|
|
50
|
+
# repo-local-skills-for-project-specific-workflow-tooling-architecture-rule — repo-local skills / per-repo artefact precedent.
|
|
51
|
+
# skill-testing-strategy-contract-assertion-bats-companion-to-architecture-rule — skill testing strategy (this is hook-shared-helper, not
|
|
52
52
|
# skill content; bats partition under hooks/test/).
|
|
53
|
-
#
|
|
53
|
+
# blocked-reporters-persistence-per-repo-hashed-id-audit-log-first-architecture-rule — blocked-reporters persistence (proposed → accepted with
|
|
54
54
|
# this iter); §v1 implementation contract names this helper.
|
|
55
|
-
#
|
|
55
|
+
# blocked-user-list-mechanism-for-inbound-report-management-refuse-future-tickets-from-clearly-malicious-reporters-problem — primary ticket.
|
|
56
56
|
|
|
57
57
|
# Default paths — caller's CWD relative. Override for tests by exporting
|
|
58
58
|
# BLOCK_LIST_FILE / AUDIT_LOG_FILE before sourcing.
|
|
@@ -62,7 +62,7 @@
|
|
|
62
62
|
# SHA-256 hex width (64 chars). Helper rejects any input that doesn't
|
|
63
63
|
# match this shape — per architect verdict, we don't allow alternate
|
|
64
64
|
# hash widths in v1 (single-shape contract is simpler to reason about
|
|
65
|
-
# and the
|
|
65
|
+
# and the extend-the-suite-with-new-plugins-user-outcome "decide once, encode it" pattern wins here).
|
|
66
66
|
_BLOCK_LIST_HASH_RE='^[0-9a-f]{64}$'
|
|
67
67
|
|
|
68
68
|
# Validate that a string is SHA-256-width hex. Returns 0 on match.
|
|
@@ -80,7 +80,7 @@ _block_list_ensure_file() {
|
|
|
80
80
|
fi
|
|
81
81
|
}
|
|
82
82
|
|
|
83
|
-
# Append one JSONL audit-log entry. Five-field shape per
|
|
83
|
+
# Append one JSONL audit-log entry. Five-field shape per blocked-reporters-persistence-per-repo-hashed-id-audit-log-first-architecture-rule Q2.
|
|
84
84
|
# `evidence_ticket` carries the reason string for unblock entries
|
|
85
85
|
# (type-tagged; the unblock reason reuses the same slot).
|
|
86
86
|
_block_list_audit_append() {
|