@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,33 +1,33 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: wr-itil:update-upstream
|
|
3
|
-
description: Post a lifecycle-update comment to an upstream issue when a local problem ticket transitions. Drafts a transition-specific update (root-cause confirmed / fix released / closed), composes the prose through the external-comms risk gate + voice-tone gate, auto-posts within appetite, queues above-appetite. Reciprocal sibling to /wr-itil:report-upstream — initial-filing vs lifecycle-update split per
|
|
3
|
+
description: Post a lifecycle-update comment to an upstream issue when a local problem ticket transitions. Drafts a transition-specific update (root-cause confirmed / fix released / closed), composes the prose through the external-comms risk gate + voice-tone gate, auto-posts within appetite, queues above-appetite. Reciprocal sibling to /wr-itil:report-upstream — initial-filing vs lifecycle-update split per the "Cross-project problem-reporting contract — `report-upstream` skill in `@windyroad/itil`" architecture rule amendment (the "Problem 080: No bidirectional update of upstream-reported problems — local lifecycle transitions never propagate back to the reporter" problem).
|
|
4
4
|
allowed-tools: Read, Write, Edit, Bash, Glob, Grep, AskUserQuestion, Skill, Agent
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
<!--
|
|
8
|
-
@jtbd
|
|
9
|
-
@jtbd
|
|
10
|
-
@jtbd
|
|
11
|
-
@jtbd
|
|
12
|
-
@problem
|
|
13
|
-
@adr
|
|
14
|
-
@adr
|
|
15
|
-
@adr
|
|
16
|
-
@adr
|
|
17
|
-
@adr
|
|
18
|
-
@adr
|
|
19
|
-
@adr
|
|
20
|
-
@adr
|
|
21
|
-
@adr
|
|
8
|
+
@jtbd the "Report a Problem Without Pre-Classifying It" user outcome (Report a Problem Without Pre-Classifying It — reporter feedback loop)
|
|
9
|
+
@jtbd the ": Enforce Governance Without Slowing Down" user outcome (Enforce Governance Without Slowing Down — no manual policing of upstream issues)
|
|
10
|
+
@jtbd the "Restore Service Fast with an Audit Trail" user outcome (Restore Service Fast with an Audit Trail — symmetric local/upstream audit trail)
|
|
11
|
+
@jtbd the "Extend the Suite with New Plugins" user outcome (Extend the Suite with Clear Patterns — downstream adopters inherit bidirectional contract)
|
|
12
|
+
@problem the "Problem 080: No bidirectional update of upstream-reported problems — local lifecycle transitions never propagate back to the reporter" problem
|
|
13
|
+
@adr the "Cross-project problem-reporting contract — `report-upstream` skill in `@windyroad/itil`" architecture rule (amended the "Problem 080: No bidirectional update of upstream-reported problems — local lifecycle transitions never propagate back to the reporter" problem — bidirectional lifecycle updates; Phase 2 — --catchup migration mode + idempotency)
|
|
14
|
+
@adr the "Plugin-bundled scripts invoked from SKILL.md resolve via `bin/` on `$PATH`" architecture rule (catchup worklist scanner invoked via wr-itil-catchup-scan bin shim)
|
|
15
|
+
@adr the "External-comms gate — voice-tone + risk/leak evaluators on shared PreToolUse surface" architecture rule (voice-tone gate on `gh issue comment` / `gh issue close`)
|
|
16
|
+
@adr the "Structured User Interaction for Governance-Skill Decisions" architecture rule (Rule 1 AskUserQuestion; Rule 6 AFK fail-safe)
|
|
17
|
+
@adr the "Governance Skills Commit Their Own Completed Work" architecture rule (single-commit grain — transition + back-write + upstream comment)
|
|
18
|
+
@adr the "Rename `wr-problem` Plugin to `wr-itil`" architecture rule amended (sibling-skill naming; split execution ownership)
|
|
19
|
+
@adr the "— Decision-Delegation Contract: when agents act on the framework vs ask the user" architecture rule (decision-delegation contract — framework-resolution boundary)
|
|
20
|
+
@adr the ": promptfoo as the behavioural test harness for agent-prose verdicts" architecture rule (Amendment 2026-06-02 — paired promptfoo eval discharges the ": Functional defects in shipped plugin behaviour" standing risk prose floor)
|
|
21
|
+
@adr the ": promptfoo as the behavioural test harness for agent-prose verdicts" architecture rule (evidence-floor — paired Tier-A/B eval ships in same commit as SKILL)
|
|
22
22
|
-->
|
|
23
23
|
|
|
24
24
|
# Update Upstream — Lifecycle-Update Skill
|
|
25
25
|
|
|
26
26
|
Post a lifecycle-update comment to an upstream issue or pull request when the local problem ticket transitions. Reads the local ticket's `## Reported Upstream` section, drafts a transition-specific update from the templates below, composes the draft through the external-comms risk gate (`wr-risk-scorer:external-comms`) and voice-tone gate (`wr-voice-tone:external-comms`), auto-posts via `gh issue comment` or `gh pr comment` when both gates pass within appetite, closes only issue targets on Verifying → Closed, and queues an `outstanding_questions` entry when either gate scores above appetite.
|
|
27
27
|
|
|
28
|
-
This skill is the **reciprocal sibling** to [`/wr-itil:report-upstream`](../report-upstream/SKILL.md) — that skill files the initial upstream report; this skill keeps the upstream record in sync as the local ticket walks its lifecycle. The split is per [
|
|
28
|
+
This skill is the **reciprocal sibling** to [`/wr-itil:report-upstream`](../report-upstream/SKILL.md) — that skill files the initial upstream report; this skill keeps the upstream record in sync as the local ticket walks its lifecycle. The split is per [the "Rename `wr-problem` Plugin to `wr-itil`" architecture rule](../../../docs/decisions/010-rename-wr-problem-to-wr-itil.proposed.md) amended Skill Granularity rule (one skill per distinct user intent) — initial-filing and lifecycle-update are distinct user intents with distinct autocomplete surfaces.
|
|
29
29
|
|
|
30
|
-
This skill implements the bidirectional extension to
|
|
30
|
+
This skill implements the bidirectional extension to the "Cross-project problem-reporting contract — `report-upstream` skill in `@windyroad/itil`" architecture rule's outbound contract — see the **the "Cross-project problem-reporting contract — `report-upstream` skill in `@windyroad/itil`" architecture rule amendment (the "Problem 080: No bidirectional update of upstream-reported problems — local lifecycle transitions never propagate back to the reporter" problem)** entry in the ADR's `## Amendments` section. The amendment authorises this sibling skill, defines the transition-template shape, and pins the same external-comms + voice-tone gate composition that the post-the "Agent waits for human to initiate upstream report instead of filing on detect — feedback delay class" problem amendment uses for the initial-filing path.
|
|
31
31
|
|
|
32
32
|
## Invocation
|
|
33
33
|
|
|
@@ -36,35 +36,35 @@ This skill implements the bidirectional extension to ADR-024's outbound contract
|
|
|
36
36
|
/wr-itil:update-upstream --catchup # batch-retroactive migration (Phase 2)
|
|
37
37
|
```
|
|
38
38
|
|
|
39
|
-
- `<NNN>`: the three-digit local ticket ID (e.g. `080`). The ticket file is discovered via the same dual-tolerant lookup as [`/wr-itil:report-upstream`](../report-upstream/SKILL.md) (flat layout + per-state subdir per
|
|
40
|
-
- `--catchup`: one-shot batch-retroactive migration mode (
|
|
39
|
+
- `<NNN>`: the three-digit local ticket ID (e.g. `080`). The ticket file is discovered via the same dual-tolerant lookup as [`/wr-itil:report-upstream`](../report-upstream/SKILL.md) (flat layout + per-state subdir per the ": docs/problems/ flat layout migration — per-state subdirs + adopter auto-migration" release design migration window).
|
|
40
|
+
- `--catchup`: one-shot batch-retroactive migration mode (the "Problem 080: No bidirectional update of upstream-reported problems — local lifecycle transitions never propagate back to the reporter" problem Phase 2 — see [§ Catchup migration mode](#catchup-migration-mode-phase-2)). Walks the existing `.verifying.md` + `.closed.md` corpus and posts the lifecycle update each ticket should have received but did not (because it was reported upstream / transitioned before the per-ticket auto-update path shipped). Idempotent — already-updated tickets are skipped.
|
|
41
41
|
|
|
42
|
-
The single-ticket form is typically invoked from `/wr-itil:transition-problem` Step 7's advisory subsection when the transitioning ticket carries a `## Reported Upstream` section (per
|
|
42
|
+
The single-ticket form is typically invoked from `/wr-itil:transition-problem` Step 7's advisory subsection when the transitioning ticket carries a `## Reported Upstream` section (per the "Cross-project problem-reporting contract — `report-upstream` skill in `@windyroad/itil`" architecture rule Confirmation criterion 3a — the back-write that `/wr-itil:report-upstream` Step 7 writes). User-initiated single-ticket invocation is also supported. The `--catchup` form is user-initiated only (a deliberate one-shot migration, never auto-fired from a transition).
|
|
43
43
|
|
|
44
44
|
## Scope
|
|
45
45
|
|
|
46
46
|
**In scope:**
|
|
47
47
|
- Read the local ticket's `## Reported Upstream` section and extract each upstream URL + matched template + disclosure path recorded there (**outbound** direction).
|
|
48
|
-
- Read the local ticket's `**Origin**: inbound-reported (#NN)` field and dispatch a reporter-facing fix-released / closed verdict comment on the originating own-repo issue (**inbound** direction,
|
|
48
|
+
- Read the local ticket's `**Origin**: inbound-reported (#NN)` field and dispatch a reporter-facing fix-released / closed verdict comment on the originating own-repo issue (**inbound** direction, the "Inbound-reported tickets never receive fix-released verdict on originating issue" problem). See [§ Inbound-origin verdict dispatch (the "Inbound-reported tickets never receive fix-released verdict on originating issue" problem)](#inbound-origin-verdict-dispatch-p363).
|
|
49
49
|
- Determine the local ticket's current Status from the filename suffix.
|
|
50
50
|
- Draft a transition-specific lifecycle-update comment per the templates below (Open→KE / KE→Verifying / Verifying→Closed).
|
|
51
51
|
- Compose the drafted prose through `wr-risk-scorer:external-comms` + `wr-voice-tone:external-comms` gates.
|
|
52
|
-
- Within appetite → post via `gh issue comment <n>`, or `gh pr comment <n>` when the disclosure path records a pull request (
|
|
53
|
-
- Above appetite → AskUserQuestion (interactive) / queue `outstanding_questions` (AFK, per
|
|
52
|
+
- Within appetite → post via `gh issue comment <n>`, or `gh pr comment <n>` when the disclosure path records a pull request (the "Prefer an upstream pull request over an issue when the upstream accepts pull requests" architecture rule); on Verifying→Closed also run `gh issue close <n>` — **but never `gh pr close`** (see below).
|
|
53
|
+
- Above appetite → AskUserQuestion (interactive) / queue `outstanding_questions` (AFK, per the "AFK iter default when a skill needs to ask a question and AskUserQuestion is unavailable — should queue the question and move to the next iteration (not halt, not silently skip)" problem queue-and-continue).
|
|
54
54
|
- Back-write a `## Upstream Lifecycle Updates` log entry to the local ticket recording the transition, the matched URL, the posted comment URL, and the disclosure path.
|
|
55
|
-
- **Historical catch-up migration (`--catchup`,
|
|
55
|
+
- **Historical catch-up migration (`--catchup`, the "Problem 080: No bidirectional update of upstream-reported problems — local lifecycle transitions never propagate back to the reporter" problem Phase 2)** — one-shot retroactive scan of the existing `.verifying.md` + `.closed.md` corpus; posts the lifecycle update each linked-upstream ticket should already carry. Idempotent — re-running is safe. See [§ Catchup migration mode](#catchup-migration-mode-phase-2).
|
|
56
56
|
|
|
57
57
|
**Out of scope:**
|
|
58
58
|
- Initial upstream filing — that's `/wr-itil:report-upstream`.
|
|
59
59
|
- Cross-tracker propagation (linking the upstream update back into a different upstream's parallel issue) — out of scope; one local ticket → N upstream URLs is supported, but each URL update is independent.
|
|
60
60
|
|
|
61
|
-
## Step-0 deferral (
|
|
61
|
+
## Step-0 deferral (the "Governance skill auto-delegation — Step 0 delegates skill workflow to a subagent" architecture rule)
|
|
62
62
|
|
|
63
|
-
This skill does NOT implement
|
|
63
|
+
This skill does NOT implement the "Governance skill auto-delegation — Step 0 delegates skill workflow to a subagent" architecture rule's Step-0 auto-delegation pattern. Same rationale as [`/wr-itil:report-upstream`](../report-upstream/SKILL.md) Step-0 deferral: the local ticket and the `## Reported Upstream` extraction must stay in main-agent context for the gate composition and the back-write, so wrapping the flow in a subagent would not reduce main-agent context cost. Trigger to revisit per the "Cross-project problem-reporting contract — `report-upstream` skill in `@windyroad/itil`" architecture rule's Reassessment Criteria — if a third skill that reads `## Reported Upstream` lands, factor the read into a Step-0-delegated subagent.
|
|
64
64
|
|
|
65
|
-
## Voice-tone gate interaction (
|
|
65
|
+
## Voice-tone gate interaction (the "External-comms gate — voice-tone + risk/leak evaluators on shared PreToolUse surface" architecture rule)
|
|
66
66
|
|
|
67
|
-
The skill's `gh issue comment` and `gh issue close` calls are **on the gated surface list per [
|
|
67
|
+
The skill's `gh issue comment` and `gh issue close` calls are **on the gated surface list per [the "External-comms gate — voice-tone + risk/leak evaluators on shared PreToolUse surface" architecture rule](../../../docs/decisions/028-voice-tone-gate-external-comms.proposed.md)** (Voice-tone gate on external communications). Expected behaviour during these tool calls:
|
|
68
68
|
|
|
69
69
|
1. The voice-tone gate fires `PreToolUse:Bash` with a deny-plus-delegate response.
|
|
70
70
|
2. The hook delegates to `wr-voice-tone:agent` to review the drafted body for brand-voice + tone alignment against `docs/VOICE-AND-TONE.md`.
|
|
@@ -78,7 +78,7 @@ If `wr-voice-tone:agent` is not installed in the project, the gate is dormant an
|
|
|
78
78
|
|
|
79
79
|
### 1. Read the local problem ticket
|
|
80
80
|
|
|
81
|
-
Dual-tolerant lookup spans flat layout AND per-state subdir layout (
|
|
81
|
+
Dual-tolerant lookup spans flat layout AND per-state subdir layout (the ": docs/problems/ flat layout migration — per-state subdirs + adopter auto-migration" release design migration window):
|
|
82
82
|
|
|
83
83
|
```bash
|
|
84
84
|
LOCAL_TICKET=$(ls docs/problems/${LOCAL_ID}-*.{open,known-error,verifying,closed,parked}.md docs/problems/*/${LOCAL_ID}-*.md 2>/dev/null | head -1)
|
|
@@ -89,11 +89,11 @@ Extract:
|
|
|
89
89
|
- Title (from H1).
|
|
90
90
|
- Current Status (from filename suffix — `.open.md` / `.known-error.md` / `.verifying.md` / `.closed.md` / `.parked.md`).
|
|
91
91
|
- The `## Reported Upstream` section (zero or more **outbound** upstream entries, each with URL + disclosure path) — the **outbound** direction (a ticket *we* reported up to someone else).
|
|
92
|
-
- The `**Origin**: inbound-reported (#NN)` field (the [
|
|
92
|
+
- The `**Origin**: inbound-reported (#NN)` field (the [the "Inbound-reported problems rank ahead of internally-discovered problems via a sort tier" architecture rule](../../../docs/decisions/076-inbound-reported-problems-rank-ahead-via-sort-tier.proposed.md) rank-authoritative on-ticket field) — the **inbound** direction (a ticket someone else reported *against us* on our own repo, `#NN` being the originating issue). Drives the inbound dispatch leg below (the "Inbound-reported tickets never receive fix-released verdict on originating issue" problem).
|
|
93
93
|
- For `.verifying.md` tickets: the `## Fix Released` section (release marker, version, commit SHA, PR number).
|
|
94
94
|
- For `.known-error.md` tickets: the `## Fix Strategy` section (planned fix path; cited in KE updates so the reporter knows the direction).
|
|
95
95
|
|
|
96
|
-
**No-op exit (dual-direction).** If the ticket has NEITHER a `## Reported Upstream` section NOR an `**Origin**: inbound-reported (#NN)` field, exit cleanly with a one-line message: `No ## Reported Upstream section and no inbound Origin in P${LOCAL_ID}; nothing to update.` This is the **no-op exit** — most local tickets are neither reported upstream nor inbound-originated, and the skill's invocation from `transition-problem` Step 7 is unconditional; a missing surface is the common case, not an error. When EITHER surface is present, proceed: the outbound entries route through Steps 2–6; the inbound Origin field routes through the [§ Inbound-origin verdict dispatch (
|
|
96
|
+
**No-op exit (dual-direction).** If the ticket has NEITHER a `## Reported Upstream` section NOR an `**Origin**: inbound-reported (#NN)` field, exit cleanly with a one-line message: `No ## Reported Upstream section and no inbound Origin in P${LOCAL_ID}; nothing to update.` This is the **no-op exit** — most local tickets are neither reported upstream nor inbound-originated, and the skill's invocation from `transition-problem` Step 7 is unconditional; a missing surface is the common case, not an error. When EITHER surface is present, proceed: the outbound entries route through Steps 2–6; the inbound Origin field routes through the [§ Inbound-origin verdict dispatch (the "Inbound-reported tickets never receive fix-released verdict on originating issue" problem)](#inbound-origin-verdict-dispatch-p363) leg below. When BOTH are present, the two legs fire **independently** (each gate-composed, posted, and logged separately).
|
|
97
97
|
|
|
98
98
|
### 2. Parse each upstream entry
|
|
99
99
|
|
|
@@ -103,7 +103,7 @@ For each `- **URL**: <url>` line under `## Reported Upstream`, extract:
|
|
|
103
103
|
- The disclosure path (`- **Disclosure path**: <path>`).
|
|
104
104
|
- The reported date (`- **Reported**: <YYYY-MM-DD>`).
|
|
105
105
|
|
|
106
|
-
Skip entries whose disclosure path is `drafted-and-saved (mailbox / out-of-band)` — those reports were never filed via `gh`, so there is no issue to comment on. Log a one-line skip note: `Skipping upstream entry <url> — disclosure path is out-of-band; user follow-up required.` The skip is **not** queued as an `outstanding_questions` entry (the user already owns the out-of-band channel per the
|
|
106
|
+
Skip entries whose disclosure path is `drafted-and-saved (mailbox / out-of-band)` — those reports were never filed via `gh`, so there is no issue to comment on. Log a one-line skip note: `Skipping upstream entry <url> — disclosure path is out-of-band; user follow-up required.` The skip is **not** queued as an `outstanding_questions` entry (the user already owns the out-of-band channel per the "Cross-project problem-reporting contract — `report-upstream` skill in `@windyroad/itil`" architecture rule no-infra-for-email constraint).
|
|
107
107
|
|
|
108
108
|
Multiple `## Reported Upstream` entries are supported (the local ticket may have been filed to multiple upstream trackers). Process each entry independently — the gate composition + post + back-write all run per-entry; one above-appetite entry queues only that entry, the rest proceed.
|
|
109
109
|
|
|
@@ -122,7 +122,7 @@ The skill is typically invoked AFTER the local ticket's filename suffix has chan
|
|
|
122
122
|
|
|
123
123
|
If the current suffix matches the last logged Status, exit clean: `No transition since last upstream update; nothing to post.` This guards against re-firing on a manage-problem update that doesn't change Status (Priority/Effort/WSJF edits, root-cause refinement edits).
|
|
124
124
|
|
|
125
|
-
If the current suffix is `.parked.md`, exit clean: `Local ticket is Parked; no upstream lifecycle update applies.` Parking is a transient hold (per
|
|
125
|
+
If the current suffix is `.parked.md`, exit clean: `Local ticket is Parked; no upstream lifecycle update applies.` Parking is a transient hold (per the "Problem lifecycle — add a Verification Pending status between Known Error and Closed" architecture rule) and does not warrant an upstream comment.
|
|
126
126
|
|
|
127
127
|
### 4. Draft the lifecycle-update comment
|
|
128
128
|
|
|
@@ -167,7 +167,7 @@ Update from <downstream-repo-url>/<local-ticket-relative-path>:
|
|
|
167
167
|
|
|
168
168
|
<one-sentence summary from the local ticket's ## Fix Released section>
|
|
169
169
|
|
|
170
|
-
Please upgrade and verify when convenient. We'll close this issue after your confirmation OR after a 14-day quiet period (per
|
|
170
|
+
Please upgrade and verify when convenient. We'll close this issue after your confirmation OR after a 14-day quiet period (per the "Problem 048: manage-problem does not surface Fix Released problems as verification candidates when the fix path has been exercised" problem default). Local tracking: P<NNN>.
|
|
171
171
|
```
|
|
172
172
|
|
|
173
173
|
#### Verification Pending → Closed template
|
|
@@ -192,7 +192,7 @@ After posting the Verifying → Closed comment, the skill also runs `gh issue cl
|
|
|
192
192
|
|
|
193
193
|
#### 5a. External-comms risk gate
|
|
194
194
|
|
|
195
|
-
Score the drafted comment body via the `wr-risk-scorer:external-comms` agent (shipped per [
|
|
195
|
+
Score the drafted comment body via the `wr-risk-scorer:external-comms` agent (shipped per [the "External-comms gate — voice-tone + risk/leak evaluators on shared PreToolUse surface" architecture rule](../../../docs/decisions/028-voice-tone-gate-external-comms.proposed.md) — the same agent the post-the "Agent waits for human to initiate upstream report instead of filing on detect — feedback delay class" problem amendment uses for the initial-filing path's pre-fire gate). Invocation: delegate via the Agent tool with `subagent_type: "wr-risk-scorer:external-comms"` passing the drafted body + the upstream URL + the transition type as context.
|
|
196
196
|
|
|
197
197
|
The agent returns a structured verdict:
|
|
198
198
|
|
|
@@ -209,23 +209,23 @@ reason: <one-line rationale>
|
|
|
209
209
|
|
|
210
210
|
#### 5b. Voice-tone gate
|
|
211
211
|
|
|
212
|
-
`gh issue comment` and `gh issue close` are on the
|
|
212
|
+
`gh issue comment` and `gh issue close` are on the "External-comms gate — voice-tone + risk/leak evaluators on shared PreToolUse surface" architecture rule gated surface list. The PreToolUse:Bash hook fires deny-plus-delegate to `wr-voice-tone:agent`. The agent reads the drafted body against `docs/VOICE-AND-TONE.md` and writes the bypass marker on PASS; the original `gh` call retries automatically.
|
|
213
213
|
|
|
214
214
|
A FAIL verdict on the voice-tone gate is treated identically to an above-appetite risk verdict — branch to 5c.
|
|
215
215
|
|
|
216
216
|
#### 5c. Above-appetite handling
|
|
217
217
|
|
|
218
|
-
The decision policy here is **framework-resolved** per [
|
|
218
|
+
The decision policy here is **framework-resolved** per [the "— Decision-Delegation Contract: when agents act on the framework vs ask the user" architecture rule](../../../docs/decisions/044-decision-delegation-contract.proposed.md) (decision-delegation contract) and the "Structured User Interaction for Governance-Skill Decisions" architecture rule Rule 6 (AFK fail-safe). No per-transition `AskUserQuestion` for the GATE FIRING — the gate scoring is itself the framework. The above-appetite handling differs by orchestrator context:
|
|
219
219
|
|
|
220
|
-
- **Interactive context** (per
|
|
220
|
+
- **Interactive context** (per the "Structured User Interaction for Governance-Skill Decisions" architecture rule Rule 1): use `AskUserQuestion` to surface the drafted comment + the gate verdict + the matched URL, with options:
|
|
221
221
|
- `Post the comment anyway (Recommended after review)` — user has read the draft and judged the post warranted; the skill bypasses the gate for this single post.
|
|
222
222
|
- `Risk-reduce and re-score` — invoke a tighter draft (shorter / fewer claims / stricter source-citation) and re-run the gate.
|
|
223
223
|
- `Queue for later review` — save the draft to `## Queued Upstream Update` on the local ticket; user acts on return.
|
|
224
224
|
- `Skip this update` — exit no-op for this upstream entry; the next transition's invocation re-considers.
|
|
225
225
|
|
|
226
|
-
- **AFK / non-interactive context** (per
|
|
226
|
+
- **AFK / non-interactive context** (per the "Structured User Interaction for Governance-Skill Decisions" architecture rule Rule 6 + the "AFK iter default when a skill needs to ask a question and AskUserQuestion is unavailable — should queue the question and move to the next iteration (not halt, not silently skip)" problem queue-and-continue): the skill applies **silent risk-reduce + re-score** first — re-draft the comment with tighter source-citation + shorter prose, then re-invoke the external-comms gate. If the re-scored verdict is within appetite, proceed via 5b. Otherwise, save the drafted comment to the local ticket's `## Queued Upstream Update` section (shape below) and queue an `outstanding_questions` entry (category: `deviation-approval`) naming the local ticket ID + the matched URL + the residual band + the risk-reduce attempts taken. **The orchestrator continues per the "AFK iter default when a skill needs to ask a question and AskUserQuestion is unavailable — should queue the question and move to the next iteration (not halt, not silently skip)" problem** — do NOT halt the loop on an above-appetite upstream update.
|
|
227
227
|
|
|
228
|
-
The silent risk-reduce step is **mechanical** per
|
|
228
|
+
The silent risk-reduce step is **mechanical** per the "— Decision-Delegation Contract: when agents act on the framework vs ask the user" architecture rule framework-resolution boundary — the skill owns the re-draft; per-iter `AskUserQuestion` for risk-reduce vocabulary is the lazy-deferral anti-pattern the "Agents over-ask in interactive sessions — conflating mechanical-stages with user-interactive-stages of multi-stage skill contracts (inverse-)" problem closes.
|
|
229
229
|
|
|
230
230
|
#### Queued Upstream Update save format
|
|
231
231
|
|
|
@@ -242,7 +242,7 @@ The silent risk-reduce step is **mechanical** per ADR-044 framework-resolution b
|
|
|
242
242
|
<the body that would have been posted as a `gh issue comment`, ready for manual review>
|
|
243
243
|
```
|
|
244
244
|
|
|
245
|
-
Per [
|
|
245
|
+
Per [the "Cross-project problem-reporting contract — `report-upstream` skill in `@windyroad/itil`" architecture rule](../../../docs/decisions/024-cross-project-problem-reporting-contract.proposed.md) amendment (the "Problem 080: No bidirectional update of upstream-reported problems — local lifecycle transitions never propagate back to the reporter" problem), the section name `## Queued Upstream Update` is the lifecycle-update analogue of `## Queued Upstream Report` (the initial-filing analogue per the 2026-06-04 second-amendment leaf (c) rename). Same shape; distinct section so a single local ticket can carry both a queued report (initial filing held) and a queued update (lifecycle update held) without collision.
|
|
246
246
|
|
|
247
247
|
### 5b. (final). Post via gh issue comment
|
|
248
248
|
|
|
@@ -269,7 +269,7 @@ gh issue close "${UPSTREAM_ISSUE_NUMBER}" \
|
|
|
269
269
|
|
|
270
270
|
If the issue is already closed upstream (someone else closed it manually), `gh issue close` returns a benign error — capture the existing state and continue to Step 6 with `closed-already-upstream` recorded in the back-write disclosure path.
|
|
271
271
|
|
|
272
|
-
#### Pull-request targets never get closed (
|
|
272
|
+
#### Pull-request targets never get closed (the "Prefer an upstream pull request over an issue when the upstream accepts pull requests" architecture rule)
|
|
273
273
|
|
|
274
274
|
When the `## Reported Upstream` disclosure path records a **pull request**, post the comment with `gh pr comment` and **stop there**. Do not run `gh pr close`, on this transition or any other.
|
|
275
275
|
|
|
@@ -287,22 +287,22 @@ Append a log entry to the local ticket's `## Upstream Lifecycle Updates` section
|
|
|
287
287
|
- **<YYYY-MM-DD>** — Open → Known Error
|
|
288
288
|
- **Target URL**: <upstream-issue-url>
|
|
289
289
|
- **Comment URL**: <posted-comment-url> (or "queued — see ## Queued Upstream Update" when above-appetite)
|
|
290
|
-
- **Disclosure path**: posted-comment | posted-pr-comment (pull-request target,
|
|
290
|
+
- **Disclosure path**: posted-comment | posted-pr-comment (pull-request target, the "Prefer an upstream pull request over an issue when the upstream accepts pull requests" architecture rule — never closed) | posted-comment-and-closed (Verifying → Closed, issue targets only) | queued-above-appetite | closed-already-upstream | skipped-out-of-band
|
|
291
291
|
- **Gate verdict**: external-comms <band/score> + voice-tone <pass|fail>
|
|
292
292
|
|
|
293
293
|
- **<YYYY-MM-DD>** — Known Error → Verification Pending
|
|
294
294
|
- ... (next entry appends; never replaces earlier entries)
|
|
295
295
|
```
|
|
296
296
|
|
|
297
|
-
The log is append-only — each transition adds an entry; earlier entries are never overwritten. The log is the audit trail per
|
|
297
|
+
The log is append-only — each transition adds an entry; earlier entries are never overwritten. The log is the audit trail per the "Restore Service Fast with an Audit Trail" user outcome's symmetric-audit-trail outcome and per the "Cross-project problem-reporting contract — `report-upstream` skill in `@windyroad/itil`" architecture rule Confirmation criterion 3a's `## Reported Upstream` back-write pattern (extended for the bidirectional case).
|
|
298
298
|
|
|
299
|
-
### Inbound-origin verdict dispatch (
|
|
299
|
+
### Inbound-origin verdict dispatch (the "Inbound-reported tickets never receive fix-released verdict on originating issue" problem)
|
|
300
300
|
|
|
301
|
-
<!-- @jtbd
|
|
301
|
+
<!-- @jtbd the "Report a Problem Without Pre-Classifying It" user outcome (Report a Problem Without Pre-Classifying It — inbound reporter feedback loop: the fix-released verdict leg for tickets someone else filed against us) -->
|
|
302
302
|
|
|
303
|
-
This leg runs **in addition to** Steps 2–6 (the outbound `## Reported Upstream` path), keyed off the `**Origin**: inbound-reported (#NN)` field Step 1 extracted. It closes the
|
|
303
|
+
This leg runs **in addition to** Steps 2–6 (the outbound `## Reported Upstream` path), keyed off the `**Origin**: inbound-reported (#NN)` field Step 1 extracted. It closes the "Report a Problem Without Pre-Classifying It" user outcome fix-released-verdict promise for the **inbound** direction — a plugin-user filed a `problem-report` issue *against us* (recorded at intake by the "Inbound upstream-report discovery + assessment pipeline (peer of )" architecture rule's safe-and-valid branch, which stamps the on-ticket `**Origin**` field per [the "Inbound-reported problems rank ahead of internally-discovered problems via a sort tier" architecture rule](../../../docs/decisions/076-inbound-reported-problems-rank-ahead-via-sort-tier.proposed.md)) and never heard the fix shipped because the outbound machinery only reads `## Reported Upstream`. Authority: [the "Cross-project problem-reporting contract — `report-upstream` skill in `@windyroad/itil`" architecture rule](../../../docs/decisions/024-cross-project-problem-reporting-contract.proposed.md) amendment (the "Inbound-reported tickets never receive fix-released verdict on originating issue" problem, inbound-verdict dispatch leg).
|
|
304
304
|
|
|
305
|
-
**Why the Origin field, not `## Reported Upstream` (
|
|
305
|
+
**Why the Origin field, not `## Reported Upstream` (the "Inbound-reported tickets never receive fix-released verdict on originating issue" problem design):** the inbound issue lives on OUR OWN repo (it was filed against us). Writing it into `## Reported Upstream` would contaminate `/wr-itil:check-upstream-responses` (the "No process for issue reporters to check for responses — symmetric gap to inbound discovery" problem), which polls that section as OUTBOUND issues we filed *elsewhere*. Consuming the `**Origin**` field — distinct by construction — keeps the inbound and outbound data shapes separate and the "No process for issue reporters to check for responses — symmetric gap to inbound discovery" problem uncontaminated.
|
|
306
306
|
|
|
307
307
|
#### I1. Parse the inbound origin
|
|
308
308
|
|
|
@@ -314,20 +314,20 @@ Reuse Step 3's transition table (filename-suffix vs last-logged Status) — it i
|
|
|
314
314
|
|
|
315
315
|
#### I3. Generate the inbound verdict comment (reporter-facing, LLM-generated — no templates)
|
|
316
316
|
|
|
317
|
-
These comments are **generated from the local ticket's context, not filled from canned templates** (
|
|
317
|
+
These comments are **generated from the local ticket's context, not filled from canned templates** (the "Inbound-reported tickets never receive fix-released verdict on originating issue" problem rework, Directive 1). Templates produce cold, patterned prose that reporters recognise as form-letters; instead the agent reads the source-of-truth sections below and GENERATES each comment per the per-transition prompt, then rides the gate chain in [I5](#i5-compose-through-gates--post-same-composition-as-step-5) (cog-a11y → risk → voice-tone).
|
|
318
318
|
|
|
319
319
|
**Source-of-truth sections** (read from the local ticket before generating): `## Description` (the reporter's original symptom report), `## Workaround`, `## Root Cause Analysis`, `## Fix Released` (the release marker, version, commit SHA — the released `@windyroad/<pkg>@<version>` upgrade target comes from here).
|
|
320
320
|
|
|
321
|
-
**No-invention rule (load-bearing, carried from Step 4):** if a cited section is absent or empty, say so honestly ("we don't have a workaround to share yet") — NEVER synthesise technical claims. The gates cannot catch invented facts; the no-invention rule does. This mirrors
|
|
321
|
+
**No-invention rule (load-bearing, carried from Step 4):** if a cited section is absent or empty, say so honestly ("we don't have a workaround to share yet") — NEVER synthesise technical claims. The gates cannot catch invented facts; the no-invention rule does. This mirrors the "Inbound upstream-report discovery + assessment pipeline (peer of )" architecture rule's safe-and-valid acknowledgement shape (Decision Outcome step 6).
|
|
322
322
|
|
|
323
|
-
**Anti-leakage discipline (
|
|
323
|
+
**Anti-leakage discipline (the "Inbound-discovery ack comments are bureaucratic, not verdict-shaped ( violation)" problem/the "agent surfaces decisions to user using opaque IDs (P-numbers, ADR-numbers, JTBD-numbers) without explaining what they mean — empathy gap" problem — REVISED per repo visibility, Directive 3):** these bodies are reporter-facing on our own repo. Determine repo visibility once: `gh repo view --json visibility -q .visibility` → `PUBLIC` / `PRIVATE` / `INTERNAL`.
|
|
324
324
|
|
|
325
325
|
- **PUBLIC** — you MAY refer to a problem / ADR / RFC / JTBD / Story, but ALWAYS by its **title AND as a link**, never a bare ID:
|
|
326
|
-
- Bad (bare ID, opaque): `Tracked locally as
|
|
326
|
+
- Bad (bare ID, opaque): `Tracked locally as the "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.`
|
|
327
327
|
- Bad (title only, no link): `Tracked as the octal-eval bug.`
|
|
328
|
-
- Good (title + linked ID): `Tracked as [Latent octal-eval bug in next-ID formula](https://github.com/windyroad/agent-plugins/blob/main/docs/problems/known-error/164-octal-eval-bug-in-next-id-formula-across-ticket-creator-skills-fires-when-ids-cross-099.md) (
|
|
329
|
-
- Resolve the link: ADR / RFC / JTBD / Story canonical paths live on `main`; for a problem ticket the filename carries the state suffix + slug — resolve the actual filename via `ls docs/<class>/<NNN>-*` (or `gh search code`) before linking. Grounded in [
|
|
330
|
-
- **PRIVATE / INTERNAL / indeterminate** — strict ban (the prior
|
|
328
|
+
- Good (title + linked ID): `Tracked as [Latent octal-eval bug in next-ID formula](https://github.com/windyroad/agent-plugins/blob/main/docs/problems/known-error/164-octal-eval-bug-in-next-id-formula-across-ticket-creator-skills-fires-when-ids-cross-099.md) (the "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).`
|
|
329
|
+
- Resolve the link: ADR / RFC / JTBD / Story canonical paths live on `main`; for a problem ticket the filename carries the state suffix + slug — resolve the actual filename via `ls docs/<class>/<NNN>-*` (or `gh search code`) before linking. Grounded in [the "Plugin-published artefacts use namespace-prefixed permalinks for internal IDs" architecture rule](../../../docs/decisions/055-plugin-published-namespace-prefixed-internal-ids.proposed.md)'s permalink-progressive-enhancement shape and the "Inbound-discovery ack comments are bureaucratic, not verdict-shaped ( violation)" problem's jargon-vs-link distinction.
|
|
330
|
+
- **PRIVATE / INTERNAL / indeterminate** — strict ban (the prior the "Inbound-discovery ack comments are bureaucratic, not verdict-shaped ( violation)" problem rule): omit problem / ADR / RFC / JTBD / Story references entirely. External readers can't reach the URLs, so a link is worse than no reference.
|
|
331
331
|
|
|
332
332
|
**Always banned (regardless of visibility):** classification tokens (`safe-and-valid`, `inbound-reported`, `clear-malicious`, `above-threshold-pushback`), internal step IDs (`Step 4.5e`, `step 6`), agent-internal vocabulary (`framework-resolution boundary`, `mechanical-stage carve-out`), runtime-detail prose (`marker-vs-file deadlock`, `subprocess-boundary contract`), and absolute `docs/problems/...` path strings (always prefer the rendered link). The released `@windyroad/<pkg>@<version>` upgrade target is always permitted.
|
|
333
333
|
|
|
@@ -422,15 +422,15 @@ The verdict marker is the released `@windyroad/<pkg>@<version>` string (plus the
|
|
|
422
422
|
|
|
423
423
|
Route the GENERATED comment through the reporter-facing gate chain — **cognitive-accessibility → external-comms (risk) → voice-tone** (Directive 1's "run cog-a11y, risk, voice and tone"). The risk + voice-tone legs are the SAME `wr-risk-scorer:external-comms` + `wr-voice-tone:external-comms` dual gate (AND composition) as Step 5 — no weaker path for inbound.
|
|
424
424
|
|
|
425
|
-
**Cog-a11y gate (when-available,
|
|
425
|
+
**Cog-a11y gate (when-available, the "Phase 2 — cognitive-accessibility evaluator on the 4 external-comms surfaces (gh / npm / changeset / git commit), shipped as a NEW `@windyroad/cognitive-a11y` plugin" problem-gated — do NOT block):** the cognitive-accessibility evaluator rides FIRST so reporter-facing prose is checked for plain-language / reading-level before the risk + voice-tone legs. `@windyroad/cognitive-a11y` does not exist yet ([the "Phase 2 — cognitive-accessibility evaluator on the 4 external-comms surfaces (gh / npm / changeset / git commit), shipped as a NEW `@windyroad/cognitive-a11y` plugin" problem](../../../docs/problems/open/338-p082-phase-2-cognitive-a11y-evaluator-on-external-comms-surfaces-new-windyroad-cognitive-a11y-plugin.md) Open) — until it lands the chain degrades to the existing external-comms + voice-tone dual gate, exactly as the "External-comms gate — voice-tone + risk/leak evaluators on shared PreToolUse surface" architecture rule's per-evaluator marker scheme handles an uninstalled evaluator (an absent evaluator's gate is simply not registered → the remaining legs' PASS unblocks the retry). The cog-a11y-as-third-external-comms-evaluator declaration is recorded in [the "External-comms gate — voice-tone + risk/leak evaluators on shared PreToolUse surface" architecture rule](../../../docs/decisions/028-voice-tone-gate-external-comms.proposed.md)'s `## Amendments` (the locus the "External-comms gate — voice-tone + risk/leak evaluators on shared PreToolUse surface" architecture rule's own Reassessment Criteria designate for a third evaluator); this leg is the consumer-side wiring note only. **Do NOT block this iteration's inbound dispatch on the "Phase 2 — cognitive-accessibility evaluator on the 4 external-comms surfaces (gh / npm / changeset / git commit), shipped as a NEW `@windyroad/cognitive-a11y` plugin" problem** — ship the wiring, ride the dual gate today.
|
|
426
426
|
|
|
427
|
-
Above-appetite handling is identical to Step 5c (silent risk-reduce + re-score; if still above, save to `## Queued Upstream Update` + queue an `outstanding_questions` entry; the orchestrator continues per
|
|
427
|
+
Above-appetite handling is identical to Step 5c (silent risk-reduce + re-score; if still above, save to `## Queued Upstream Update` + queue an `outstanding_questions` entry; the orchestrator continues per the "AFK iter default when a skill needs to ask a question and AskUserQuestion is unavailable — should queue the question and move to the next iteration (not halt, not silently skip)" problem — do NOT halt). Within appetite, post on our own repo:
|
|
428
428
|
|
|
429
429
|
```bash
|
|
430
430
|
gh issue comment "${NN}" --repo "${OWN_OWNER_REPO}" --body "${INBOUND_BODY}"
|
|
431
431
|
```
|
|
432
432
|
|
|
433
|
-
On the **Verification Pending → Closed** transition, after the comment, also close the originating issue so our own tracker matches the local `.closed.md` state (this addresses the
|
|
433
|
+
On the **Verification Pending → Closed** transition, after the comment, also close the originating issue so our own tracker matches the local `.closed.md` state (this addresses the "work-problems orchestrator carries prior-ticket Fix Strategy text into iter dispatch without re-grounding in design intent" problem #97 *silent-and-unclosed* witness):
|
|
434
434
|
|
|
435
435
|
```bash
|
|
436
436
|
gh issue close "${NN}" --repo "${OWN_OWNER_REPO}" --comment "" --reason completed
|
|
@@ -450,39 +450,39 @@ Append to the same `## Upstream Lifecycle Updates` log (Step 6 shape), tagged fo
|
|
|
450
450
|
- **Gate verdict**: external-comms <band/score> + voice-tone <pass|fail>
|
|
451
451
|
```
|
|
452
452
|
|
|
453
|
-
The log stays append-only and direction-tagged; `/wr-itil:check-upstream-responses` (
|
|
453
|
+
The log stays append-only and direction-tagged; `/wr-itil:check-upstream-responses` (the "No process for issue reporters to check for responses — symmetric gap to inbound discovery" problem) does NOT read this section, so logging inbound entries here cannot contaminate the outbound poller.
|
|
454
454
|
|
|
455
455
|
#### I7. Both-direction tickets
|
|
456
456
|
|
|
457
457
|
A ticket may carry BOTH a `## Reported Upstream` section AND an inbound `**Origin**` field (we reported it upstream *and* someone reported it against us). The two legs are **independent**: the outbound entries run Steps 2–6 against their external URLs; the inbound leg runs I1–I6 against the own-repo issue. Each gate-composes, posts, and logs separately — one above-appetite leg queues only itself; the other proceeds.
|
|
458
458
|
|
|
459
|
-
### 7. Commit per
|
|
459
|
+
### 7. Commit per the "Governance Skills Commit Their Own Completed Work" architecture rule
|
|
460
460
|
|
|
461
|
-
When invoked from `transition-problem` Step 7's advisory subsection, the upstream comment + back-write + the ticket rename + the README refresh all join the **same single commit** per
|
|
461
|
+
When invoked from `transition-problem` Step 7's advisory subsection, the upstream comment + back-write + the ticket rename + the README refresh all join the **same single commit** per the "Governance Skills Commit Their Own Completed Work" architecture rule's single-commit grain — never split across commits. The transition-problem skill owns the commit; this skill's edits ride that commit as additional staged changes.
|
|
462
462
|
|
|
463
463
|
When invoked user-initiatedly (no transition in this session, e.g. retroactive catch-up), the skill commits its own work:
|
|
464
464
|
|
|
465
465
|
1. `git add docs/problems/<state>/<NNN>-<title>.md` (the back-write + any `## Queued Upstream Update` appendage).
|
|
466
|
-
2. Score commit/push/release risk via `wr-risk-scorer:pipeline` subagent (or fall back to `/wr-risk-scorer:assess-release` skill per
|
|
466
|
+
2. Score commit/push/release risk via `wr-risk-scorer:pipeline` subagent (or fall back to `/wr-risk-scorer:assess-release` skill per the "On-Demand Assessment Skills for Governance Plugins" architecture rule).
|
|
467
467
|
3. `git commit -m "docs(problems): P<NNN> upstream lifecycle update — <transition>"`.
|
|
468
468
|
|
|
469
|
-
If the cumulative pipeline risk lands above appetite and `AskUserQuestion` is unavailable, apply the [
|
|
469
|
+
If the cumulative pipeline risk lands above appetite and `AskUserQuestion` is unavailable, apply the [the "Structured User Interaction for Governance-Skill Decisions" architecture rule Rule 6](../../../docs/decisions/013-structured-user-interaction-for-governance-decisions.proposed.md) non-interactive fail-safe: skip the commit and report the uncommitted state. Do NOT auto-commit above appetite without the user's call.
|
|
470
470
|
|
|
471
471
|
## Catchup migration mode (Phase 2)
|
|
472
472
|
|
|
473
|
-
`/wr-itil:update-upstream --catchup` runs a one-shot batch-retroactive migration. It exists because the per-ticket auto-update path (Phase 1) only fires on transitions that happen *after* it shipped — every ticket reported upstream and transitioned *before* Phase 1 silently missed its lifecycle update, leaving upstream issues looking abandoned. Catchup back-fills that history. Authority: [
|
|
473
|
+
`/wr-itil:update-upstream --catchup` runs a one-shot batch-retroactive migration. It exists because the per-ticket auto-update path (Phase 1) only fires on transitions that happen *after* it shipped — every ticket reported upstream and transitioned *before* Phase 1 silently missed its lifecycle update, leaving upstream issues looking abandoned. Catchup back-fills that history. Authority: [the "Cross-project problem-reporting contract — `report-upstream` skill in `@windyroad/itil`" architecture rule](../../../docs/decisions/024-cross-project-problem-reporting-contract.proposed.md) amendment (the "Problem 080: No bidirectional update of upstream-reported problems — local lifecycle transitions never propagate back to the reporter" problem Phase 2).
|
|
474
474
|
|
|
475
475
|
This mode is **user-initiated only** — it is never auto-fired from a transition. It is a deliberate corpus-wide migration the maintainer runs once (or re-runs safely, thanks to idempotency).
|
|
476
476
|
|
|
477
477
|
### C1. Build the worklist (read-only scan)
|
|
478
478
|
|
|
479
|
-
Invoke the worklist scanner via its [
|
|
479
|
+
Invoke the worklist scanner via its [the "Plugin-bundled scripts invoked from SKILL.md resolve via `bin/` on `$PATH`" architecture rule](../../../docs/decisions/049-plugin-script-resolution-via-bin-on-path.proposed.md) `$PATH` shim — **never** via a repo-relative `packages/...` path (that path does not resolve in adopter trees):
|
|
480
480
|
|
|
481
481
|
```bash
|
|
482
482
|
wr-itil-catchup-scan
|
|
483
483
|
```
|
|
484
484
|
|
|
485
|
-
The scanner (`packages/itil/scripts/catchup-scan.sh`, dispatched by the `wr-itil-catchup-scan` bin shim) is **read-only and local** — it makes no `gh` calls and writes nothing. It walks the `.verifying.md` + `.closed.md` corpus (dual-tolerant flat + per-state subdir per
|
|
485
|
+
The scanner (`packages/itil/scripts/catchup-scan.sh`, dispatched by the `wr-itil-catchup-scan` bin shim) is **read-only and local** — it makes no `gh` calls and writes nothing. It walks the `.verifying.md` + `.closed.md` corpus (dual-tolerant flat + per-state subdir per the ": docs/problems/ flat layout migration — per-state subdirs + adopter auto-migration" release design), filters to tickets carrying a `## Reported Upstream` section, applies marker-based idempotency, and prints a worklist:
|
|
486
486
|
|
|
487
487
|
```
|
|
488
488
|
CATCHUP P<NNN> <url> state=<verifying|closed> transition=<KE->Verifying|Verifying->Closed>
|
|
@@ -494,7 +494,7 @@ plus a `SUMMARY scanned=… catchup=… skip-logged=… skip-out-of-band=…` li
|
|
|
494
494
|
|
|
495
495
|
### C2. Idempotency contract
|
|
496
496
|
|
|
497
|
-
Catchup is **idempotent** (
|
|
497
|
+
Catchup is **idempotent** (the "Problem 080: No bidirectional update of upstream-reported problems — local lifecycle transitions never propagate back to the reporter" problem Phase 2 acceptance criterion 3). The scanner skips a ticket whose `## Upstream Lifecycle Updates` log already records an entry for the current target state:
|
|
498
498
|
|
|
499
499
|
- `.verifying.md` → already-logged iff the log contains a `→ Verification Pending` entry.
|
|
500
500
|
- `.closed.md` → already-logged iff the log contains a `→ Closed` entry.
|
|
@@ -506,36 +506,36 @@ The append-only log (written by Step 6 on every post) is the source of truth —
|
|
|
506
506
|
For each `CATCHUP` line, parse its `disclosure=` token and run the **existing per-ticket flow** (Steps 4–6) against that ticket ID. `disclosure=pull-request` selects `gh pr comment` and forbids any close command; `disclosure=issue` selects `gh issue comment` and permits `gh issue close` for Verifying → Closed:
|
|
507
507
|
|
|
508
508
|
1. Draft the transition template (Step 4) for the entry's transition (`KE->Verifying` → Known Error → Verification Pending template; `Verifying->Closed` → Verification Pending → Closed template). Only an issue disclosure also runs `gh issue close`; a pull-request disclosure never runs `gh pr close`.
|
|
509
|
-
2. Compose through the external-comms + voice-tone gates (Step 5) — **identical** dual-gate composition as the per-ticket path. Above-appetite handling (Step 5c) is unchanged: silent risk-reduce + re-score, then queue to `## Queued Upstream Update` + `outstanding_questions` (category `deviation-approval`) per
|
|
509
|
+
2. Compose through the external-comms + voice-tone gates (Step 5) — **identical** dual-gate composition as the per-ticket path. Above-appetite handling (Step 5c) is unchanged: silent risk-reduce + re-score, then queue to `## Queued Upstream Update` + `outstanding_questions` (category `deviation-approval`) per the "AFK iter default when a skill needs to ask a question and AskUserQuestion is unavailable — should queue the question and move to the next iteration (not halt, not silently skip)" problem if still above. Catchup does NOT bypass the gates.
|
|
510
510
|
3. Post within appetite (Step 5b final) and back-write the `## Upstream Lifecycle Updates` log (Step 6).
|
|
511
511
|
|
|
512
512
|
Process entries one at a time so a single above-appetite entry queues only itself; the rest proceed. There is no batch-cap on the number of catchup posts — the gate composition is the rate-limit, and the corpus is bounded (one pass over local tickets).
|
|
513
513
|
|
|
514
|
-
### C4. Commit per
|
|
514
|
+
### C4. Commit per the "Governance Skills Commit Their Own Completed Work" architecture rule
|
|
515
515
|
|
|
516
|
-
The catchup migration is user-initiated, so it owns its commit per the Step 7 user-initiated path: stage every touched ticket's back-write (and any `## Queued Upstream Update` appendage), score commit/push/release risk via `wr-risk-scorer:pipeline`, and commit once covering the whole pass — `docs(problems): upstream lifecycle catchup migration — <N> tickets (
|
|
516
|
+
The catchup migration is user-initiated, so it owns its commit per the Step 7 user-initiated path: stage every touched ticket's back-write (and any `## Queued Upstream Update` appendage), score commit/push/release risk via `wr-risk-scorer:pipeline`, and commit once covering the whole pass — `docs(problems): upstream lifecycle catchup migration — <N> tickets (the "Problem 080: No bidirectional update of upstream-reported problems — local lifecycle transitions never propagate back to the reporter" problem Phase 2)`. Above-appetite-and-no-AskUserQuestion → the "Structured User Interaction for Governance-Skill Decisions" architecture rule Rule 6 fail-safe (report the uncommitted state, do not auto-commit).
|
|
517
517
|
|
|
518
518
|
### C5. Verification
|
|
519
519
|
|
|
520
|
-
The live-upstream end-to-end confirmation (
|
|
520
|
+
The live-upstream end-to-end confirmation (the "Problem 080: No bidirectional update of upstream-reported problems — local lifecycle transitions never propagate back to the reporter" problem acceptance criterion 7 — a catchup comment actually lands on a real upstream issue) is the overall the "Problem 080: No bidirectional update of upstream-reported problems — local lifecycle transitions never propagate back to the reporter" problem verification step. Running `--catchup` against the real corpus (e.g. the "`/wr-itil:report-upstream` is installed and enabled but does not appear in Claude Code slash-command autocomplete" problem's `https://github.com/anthropics/claude-code/issues/52831`) and confirming the comment posts is what closes the "Problem 080: No bidirectional update of upstream-reported problems — local lifecycle transitions never propagate back to the reporter" problem to Verifying once a fresh release ships the mode.
|
|
521
521
|
|
|
522
522
|
## AFK behaviour summary
|
|
523
523
|
|
|
524
|
-
Four distinct AFK branches. Per the [
|
|
524
|
+
Four distinct AFK branches. Per the [the "Cross-project problem-reporting contract — `report-upstream` skill in `@windyroad/itil`" architecture rule](../../../docs/decisions/024-cross-project-problem-reporting-contract.proposed.md) amendment (the "Problem 080: No bidirectional update of upstream-reported problems — local lifecycle transitions never propagate back to the reporter" problem) — same composition shape as the post-the "Agent waits for human to initiate upstream report instead of filing on detect — feedback delay class" problem initial-filing path — ALL pre-post branches route through the `wr-risk-scorer:external-comms` + `wr-voice-tone:external-comms` gates. Below-appetite proceeds; above-appetite silent risk-reduces + re-scores; if still above, queues per the "AFK iter default when a skill needs to ask a question and AskUserQuestion is unavailable — should queue the question and move to the next iteration (not halt, not silently skip)" problem queue-and-continue without halting the loop.
|
|
525
525
|
|
|
526
526
|
| Branch | AFK behaviour | Authority |
|
|
527
527
|
|---|---|---|
|
|
528
|
-
| Below-appetite post (Step 5b final) | Post via `gh issue comment`; on Verifying→Closed also `gh issue close`. Back-write to `## Upstream Lifecycle Updates`. Voice-tone gate per
|
|
529
|
-
| Above-appetite — silent risk-reduce + re-score within appetite | Re-draft with tighter source-citation + shorter prose; re-invoke `wr-risk-scorer:external-comms`. If within → post per the below-appetite branch. |
|
|
530
|
-
| Above-appetite — silent risk-reduce did not bring within appetite | Save drafted comment to `## Queued Upstream Update` + queue `outstanding_questions` entry (category: `deviation-approval`). Orchestrator continues per
|
|
531
|
-
| Above-appetite commit (Step 7) | Skip the commit, report uncommitted state. |
|
|
532
|
-
| **Inbound-origin verdict (
|
|
528
|
+
| Below-appetite post (Step 5b final) | Post via `gh issue comment`; on Verifying→Closed also `gh issue close`. Back-write to `## Upstream Lifecycle Updates`. Voice-tone gate per the "External-comms gate — voice-tone + risk/leak evaluators on shared PreToolUse surface" architecture rule may delegate-and-retry on the post; treat as expected. | the "Cross-project problem-reporting contract — `report-upstream` skill in `@windyroad/itil`" architecture rule amendment (the "Problem 080: No bidirectional update of upstream-reported problems — local lifecycle transitions never propagate back to the reporter" problem); the "External-comms gate — voice-tone + risk/leak evaluators on shared PreToolUse surface" architecture rule |
|
|
529
|
+
| Above-appetite — silent risk-reduce + re-score within appetite | Re-draft with tighter source-citation + shorter prose; re-invoke `wr-risk-scorer:external-comms`. If within → post per the below-appetite branch. | the "Cross-project problem-reporting contract — `report-upstream` skill in `@windyroad/itil`" architecture rule amendment (the "Problem 080: No bidirectional update of upstream-reported problems — local lifecycle transitions never propagate back to the reporter" problem); the "— Decision-Delegation Contract: when agents act on the framework vs ask the user" architecture rule framework-resolution boundary; the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule within-axis precedent (open-vocabulary risk-reducing measures) |
|
|
530
|
+
| Above-appetite — silent risk-reduce did not bring within appetite | Save drafted comment to `## Queued Upstream Update` + queue `outstanding_questions` entry (category: `deviation-approval`). Orchestrator continues per the "AFK iter default when a skill needs to ask a question and AskUserQuestion is unavailable — should queue the question and move to the next iteration (not halt, not silently skip)" problem. | the "Cross-project problem-reporting contract — `report-upstream` skill in `@windyroad/itil`" architecture rule amendment (the "Problem 080: No bidirectional update of upstream-reported problems — local lifecycle transitions never propagate back to the reporter" problem); the "Structured User Interaction for Governance-Skill Decisions" architecture rule Rule 6; the "AFK iter default when a skill needs to ask a question and AskUserQuestion is unavailable — should queue the question and move to the next iteration (not halt, not silently skip)" problem |
|
|
531
|
+
| Above-appetite commit (Step 7) | Skip the commit, report uncommitted state. | the "Structured User Interaction for Governance-Skill Decisions" architecture rule Rule 6 |
|
|
532
|
+
| **Inbound-origin verdict (the "Inbound-reported tickets never receive fix-released verdict on originating issue" problem)** | When the ticket carries `**Origin**: inbound-reported (#NN)`, run the [§ Inbound-origin verdict dispatch](#inbound-origin-verdict-dispatch-p363) leg (I1–I7): idempotency-guard, then **GENERATE** the verdict comment from ticket context (no templates; O→KE shares the workaround with provenance-credit), route through the cog-a11y → external-comms → voice-tone gate chain (cog-a11y when-available per the "Phase 2 — cognitive-accessibility evaluator on the 4 external-comms surfaces (gh / npm / changeset / git commit), shipped as a NEW `@windyroad/cognitive-a11y` plugin" problem; dual gate today), post `gh issue comment` on our own repo (and `gh issue close` on Verifying → Closed), back-write a direction-tagged lifecycle log entry. Above-appetite queues per the rows above (does NOT halt). Reporter-facing prose; anti-leakage visibility-gated (PUBLIC → titled+linked refs; PRIVATE/indeterminate → strict ban; classification tokens / step IDs / internal vocab always banned — the "Inbound-discovery ack comments are bureaucratic, not verdict-shaped ( violation)" problem/the "agent surfaces decisions to user using opaque IDs (P-numbers, ADR-numbers, JTBD-numbers) without explaining what they mean — empathy gap" problem). | the "Cross-project problem-reporting contract — `report-upstream` skill in `@windyroad/itil`" architecture rule amendment (the "Inbound-reported tickets never receive fix-released verdict on originating issue" problem); the "External-comms gate — voice-tone + risk/leak evaluators on shared PreToolUse surface" architecture rule (cog-a11y third evaluator, the "Phase 2 — cognitive-accessibility evaluator on the 4 external-comms surfaces (gh / npm / changeset / git commit), shipped as a NEW `@windyroad/cognitive-a11y` plugin" problem); the "Plugin-published artefacts use namespace-prefixed permalinks for internal IDs" architecture rule (linked-title); the "Inbound-reported problems rank ahead of internally-discovered problems via a sort tier" architecture rule (Origin field); the "AFK iter default when a skill needs to ask a question and AskUserQuestion is unavailable — should queue the question and move to the next iteration (not halt, not silently skip)" problem |
|
|
533
533
|
|
|
534
|
-
The pre-amendment "halt-the-orchestrator on above-appetite" semantics are **superseded** by queue-and-continue per
|
|
534
|
+
The pre-amendment "halt-the-orchestrator on above-appetite" semantics are **superseded** by queue-and-continue per the "AFK iter default when a skill needs to ask a question and AskUserQuestion is unavailable — should queue the question and move to the next iteration (not halt, not silently skip)" problem — same shape as the post-the "Agent waits for human to initiate upstream report instead of filing on detect — feedback delay class" problem initial-filing path.
|
|
535
535
|
|
|
536
536
|
## Triggered from transition-problem Step 7
|
|
537
537
|
|
|
538
|
-
[`/wr-itil:transition-problem`](../transition-problem/SKILL.md) Step 7 hosts an advisory subsection that fires this skill when the transitioning ticket carries a `## Reported Upstream` section. The advisory wires the trigger; this skill owns the execution. The same "copy, not move" pattern (per [
|
|
538
|
+
[`/wr-itil:transition-problem`](../transition-problem/SKILL.md) Step 7 hosts an advisory subsection that fires this skill when the transitioning ticket carries a `## Reported Upstream` section. The advisory wires the trigger; this skill owns the execution. The same "copy, not move" pattern (per [the "Rename `wr-problem` Plugin to `wr-itil`" architecture rule](../../../docs/decisions/010-rename-wr-problem-to-wr-itil.proposed.md) amended Split-skill execution ownership rule, the "Problem 093: `/wr-itil:transition-problem` ↔ `/wr-itil:manage-problem` circular delegation for `<NNN> <status>` args" problem) replicates the advisory in `/wr-itil:manage-problem`'s in-skill Step 7 block so in-skill callers (Step 9b auto-transition, Step 9d closure, the Parked path) also fire the lifecycle update.
|
|
539
539
|
|
|
540
540
|
Both call sites delegate via the Skill tool:
|
|
541
541
|
|
|
@@ -547,26 +547,26 @@ The skill's no-op exit (Step 1) means firing the trigger unconditionally on ever
|
|
|
547
547
|
|
|
548
548
|
## References
|
|
549
549
|
|
|
550
|
-
- [
|
|
551
|
-
- [
|
|
550
|
+
- [the "Cross-project problem-reporting contract — `report-upstream` skill in `@windyroad/itil`" architecture rule](../../../docs/decisions/024-cross-project-problem-reporting-contract.proposed.md) — primary contract this skill extends. The "Problem 080: No bidirectional update of upstream-reported problems — local lifecycle transitions never propagate back to the reporter" problem amendment in `## Amendments` authorises the bidirectional lifecycle-update sibling skill, the transition-template shape, and the external-comms + voice-tone gate composition; the **the "Problem 080: No bidirectional update of upstream-reported problems — local lifecycle transitions never propagate back to the reporter" problem Phase 2 amendment** authorises the `--catchup` migration mode, the read-only worklist scanner, and the marker-based idempotency contract.
|
|
551
|
+
- [the "Plugin-bundled scripts invoked from SKILL.md resolve via `bin/` on `$PATH`" architecture rule](../../../docs/decisions/049-plugin-script-resolution-via-bin-on-path.proposed.md) — the catchup worklist scanner is invoked as `wr-itil-catchup-scan` ($PATH shim), never via a repo-relative `packages/...` path.
|
|
552
552
|
- [`packages/itil/scripts/catchup-scan.sh`](../../scripts/catchup-scan.sh) — read-only local worklist scanner for `--catchup`; behavioural bats at `packages/itil/scripts/test/catchup-scan.bats`.
|
|
553
|
-
- [
|
|
554
|
-
- [
|
|
555
|
-
- [
|
|
556
|
-
- [
|
|
557
|
-
- [
|
|
558
|
-
- [
|
|
559
|
-
- [
|
|
560
|
-
- [
|
|
561
|
-
- **
|
|
562
|
-
- **
|
|
563
|
-
- [
|
|
564
|
-
- [
|
|
565
|
-
- [
|
|
566
|
-
- **
|
|
567
|
-
- **
|
|
553
|
+
- [the "External-comms gate — voice-tone + risk/leak evaluators on shared PreToolUse surface" architecture rule](../../../docs/decisions/028-voice-tone-gate-external-comms.proposed.md) — voice-tone gate on `gh issue comment` and `gh issue close`.
|
|
554
|
+
- [the "Structured User Interaction for Governance-Skill Decisions" architecture rule](../../../docs/decisions/013-structured-user-interaction-for-governance-decisions.proposed.md) — interaction policy; Rule 1 governs the interactive above-appetite path; Rule 6 governs the AFK fail-safe.
|
|
555
|
+
- [the "Governance Skills Commit Their Own Completed Work" architecture rule](../../../docs/decisions/014-governance-skills-commit-their-own-work.proposed.md) — single-commit grain for transition + back-write + upstream post.
|
|
556
|
+
- [the "Rename `wr-problem` Plugin to `wr-itil`" architecture rule](../../../docs/decisions/010-rename-wr-problem-to-wr-itil.proposed.md) amended — sibling-skill naming + split execution ownership (the "Problem 093: `/wr-itil:transition-problem` ↔ `/wr-itil:manage-problem` circular delegation for `<NNN> <status>` args" problem "copy, not move").
|
|
557
|
+
- [the "— Decision-Delegation Contract: when agents act on the framework vs ask the user" architecture rule](../../../docs/decisions/044-decision-delegation-contract.proposed.md) — framework-resolution boundary; the gate verdict IS the framework, no per-transition AskUserQuestion for the gate firing itself.
|
|
558
|
+
- [the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule](../../../docs/decisions/042-auto-apply-scorer-remediations-open-vocabulary.proposed.md) — within-axis precedent for open-vocabulary risk-reducing measures.
|
|
559
|
+
- [the ": promptfoo as the behavioural test harness for agent-prose verdicts" architecture rule](../../../docs/decisions/075-promptfoo-agent-prose-verdict-eval-harness.proposed.md) Amendment 2026-06-02 — paired promptfoo Tier-A/B eval discharges the ": Functional defects in shipped plugin behaviour" standing risk prose-floor for SKILL surfaces.
|
|
560
|
+
- [the ": promptfoo as the behavioural test harness for agent-prose verdicts" architecture rule](../../../docs/decisions/075-agent-prose-behavioural-test-harness.proposed.md) — evidence-floor; the paired eval ships in the same commit as this SKILL prose for atomic the ": Functional defects in shipped plugin behaviour" standing risk discharge.
|
|
561
|
+
- **the "Problem 080: No bidirectional update of upstream-reported problems — local lifecycle transitions never propagate back to the reporter" problem** — driving problem ticket (No bidirectional update of upstream-reported problems).
|
|
562
|
+
- **the "Inbound-reported tickets never receive fix-released verdict on originating issue" problem** — driving problem ticket for the [§ Inbound-origin verdict dispatch](#inbound-origin-verdict-dispatch-p363) leg (inbound-reported tickets never received a fix-released verdict on the originating issue). Fix option (b) — consume the `**Origin**` field — user-ratified 2026-06-22. **Rework 2026-06-23** (four user directives): the inbound verdict is LLM-generated per-context (not templated); O→KE shares the workaround with reporter/commenter provenance-credit; anti-leakage is visibility-gated (PUBLIC → titled+linked refs); the gate chain gains a cog-a11y leg first (the "Phase 2 — cognitive-accessibility evaluator on the 4 external-comms surfaces (gh / npm / changeset / git commit), shipped as a NEW `@windyroad/cognitive-a11y` plugin" problem-gated).
|
|
563
|
+
- [the "Plugin-published artefacts use namespace-prefixed permalinks for internal IDs" architecture rule](../../../docs/decisions/055-plugin-published-namespace-prefixed-internal-ids.proposed.md) — grounds the PUBLIC-repo titled+linked reference discipline (permalink-progressive-enhancement; cures the bare-ID collision failure mode).
|
|
564
|
+
- [the "Inbound-reported problems rank ahead of internally-discovered problems via a sort tier" architecture rule](../../../docs/decisions/076-inbound-reported-problems-rank-ahead-via-sort-tier.proposed.md) — owns the `**Origin**: inbound-reported (#NN)` on-ticket field this leg consumes.
|
|
565
|
+
- [the "Inbound upstream-report discovery + assessment pipeline (peer of )" architecture rule](../../../docs/decisions/062-inbound-upstream-report-discovery-assessment-pipeline.proposed.md) — inbound intake-time pipeline; its safe-and-valid branch is the Origin-field writer this leg reads at fix-released time.
|
|
566
|
+
- **the "Problem 079: No inbound sync of upstream-reported problems — reports filed via the intake templates never surface in the local backlog" problem** — sibling problem (inbound-discovery leg); together the "Problem 079: No inbound sync of upstream-reported problems — reports filed via the intake templates never surface in the local backlog" problem + the "Problem 080: No bidirectional update of upstream-reported problems — local lifecycle transitions never propagate back to the reporter" problem close the reporter-loop end-to-end.
|
|
567
|
+
- **the "Problem 078: Assistant does not offer to capture a problem ticket when the user delivers strong-signal correction" problem** — capture-on-correction; the manage-problem trap this skill closes (manual upstream-update step gets forgotten under load).
|
|
568
568
|
- [`packages/itil/skills/report-upstream/SKILL.md`](../report-upstream/SKILL.md) — reciprocal sibling (initial-filing path); shares the `## Reported Upstream` contract this skill consumes.
|
|
569
569
|
- [`packages/itil/skills/transition-problem/SKILL.md`](../transition-problem/SKILL.md) — Step 7 advisory subsection fires this skill.
|
|
570
|
-
- [`packages/itil/skills/manage-problem/SKILL.md`](../manage-problem/SKILL.md) — in-skill Step 7 copy fires this skill (per
|
|
570
|
+
- [`packages/itil/skills/manage-problem/SKILL.md`](../manage-problem/SKILL.md) — in-skill Step 7 copy fires this skill (per the "Rename `wr-problem` Plugin to `wr-itil`" architecture rule amended "copy, not move").
|
|
571
571
|
|
|
572
572
|
$ARGUMENTS
|