@windyroad/itil 2.4.2 → 2.4.3-preview.1248

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.
@@ -497,5 +497,5 @@
497
497
  }
498
498
  },
499
499
  "name": "wr-itil",
500
- "version": "2.4.2"
500
+ "version": "2.4.3"
501
501
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wr-itil",
3
- "version": "2.4.2",
3
+ "version": "2.4.3",
4
4
  "description": "ITIL problem-management workflows for AI coding agents",
5
5
  "author": {
6
6
  "name": "Windy Road Technology",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@windyroad/itil",
3
- "version": "2.4.2",
3
+ "version": "2.4.3-preview.1248",
4
4
  "description": "ITIL-aligned IT service management for Claude Code and Codex",
5
5
  "bin": {
6
6
  "windyroad-itil": "./bin/install.mjs"
@@ -134,7 +134,7 @@ Otherwise, after the commit in step 7 lands, drain the release queue so the clos
134
134
  - **Primary**: delegate to subagent type `wr-risk-scorer:pipeline` via the Agent tool.
135
135
  - **Fallback**: if that subagent type is not available, invoke skill `/wr-risk-scorer:assess-release` via the Skill tool.
136
136
  2. Read the returned `RISK_SCORES: commit=X push=Y release=Z` line.
137
- 3. **Drain condition**: if `push` and `release` are both within appetite (≤ 4/25, "Low" band per `RISK-POLICY.md`), AND `.changeset/` is non-empty, proceed to the drain action. Otherwise, skip the drain and report the unreleased state.
137
+ 3. **Drain condition**: if `push` and `release` are both within appetite (at or below the effective appetite used by the scorer and gate), AND `.changeset/` is non-empty, proceed to the drain action. Otherwise, skip the drain and report the unreleased state.
138
138
 
139
139
  **Drain action (non-interactive, policy-authorised per the "Structured User Interaction for Governance-Skill Decisions" architecture rule Rule 6):**
140
140
 
@@ -117,7 +117,7 @@ Otherwise, after the commit in step 7 lands, drain the release queue so the link
117
117
  - **Primary**: delegate to subagent type `wr-risk-scorer:pipeline` via the Agent tool.
118
118
  - **Fallback**: if that subagent type is not available, invoke skill `/wr-risk-scorer:assess-release` via the Skill tool.
119
119
  2. Read the returned `RISK_SCORES: commit=X push=Y release=Z` line.
120
- 3. **Drain condition**: if `push` and `release` are both within appetite (≤ 4/25, "Low" band per `RISK-POLICY.md`), AND `.changeset/` is non-empty, proceed to the drain action. Otherwise, skip the drain and report the unreleased state.
120
+ 3. **Drain condition**: if `push` and `release` are both within appetite (at or below the effective appetite used by the scorer and gate), AND `.changeset/` is non-empty, proceed to the drain action. Otherwise, skip the drain and report the unreleased state.
121
121
 
122
122
  **Drain action (non-interactive, policy-authorised per the "Structured User Interaction for Governance-Skill Decisions" architecture rule Rule 6):**
123
123
 
@@ -307,19 +307,19 @@ Commit the completed work per the "Governance Skills Commit Their Own Completed
307
307
  - Incident closed: `docs(incidents): close I<NNN>`
308
308
  4. If commit risk is above appetite: this is **framework-mediated, NOT a category-3 one-time-override ask** (the "Skills, agents, and hooks override RISK-POLICY appetite instead of applying it" problem/the ": Apply RISK-POLICY appetite faithfully across all surfaces" release design amendment 2026-06-24 — there is no incident carve-out). Per **the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule Rule 1b (incident-context scoring)**: an active incident is a risk being realised (Likelihood already 5), so the incident-response change is scored against that live realised-risk baseline — weighing P(the change increases impact) vs P(it reduces impact & likelihood / restores service) + P(it introduces a new incident). If net risk-reducing, it takes the risk-reducing path (the `reducing` bypass — `RISK_BYPASS: reducing`) and proceeds, no ask. This is *better* for restore-service-fast (the "Restore Service Fast with an Audit Trail" user outcome): a genuine hotfix clears via scoring with no consent gate mid-outage. If the change is NOT net-reducing, auto-remediate per the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule Rule 1 or halt per Rule 5. **MUST NOT commit above appetite; MUST NOT `AskUserQuestion` "commit anyway".** If `AskUserQuestion` is unavailable, the "Structured User Interaction for Governance-Skill Decisions" architecture rule Rule 6 fail-safe applies — skip the commit and report the uncommitted state.
309
309
 
310
- ### 15. Auto-release when changesets are queued (the "Governance skills auto-release when changesets are queued" architecture rule)
310
+ ### 15. Auto-release when changesets are queued (the "Reuse valid cumulative risk assessments across pipeline actions" architecture rule)
311
311
 
312
312
  **Skip this step if the skill is running inside an AFK orchestrator.** Orchestrators handle release cadence themselves per the "Inter-iteration release cadence for AFK loops" architecture rule (Step 6.5). When in doubt, defer to the orchestrator by skipping this step.
313
313
 
314
314
  Otherwise, after the commit in step 14 lands, drain the release queue so the fix actually lands on npm without requiring manual user action.
315
315
 
316
- **Mechanism — delegate, do not re-implement scoring (per the "On-Demand Assessment Skills for Governance Plugins" architecture rule):**
316
+ **Mechanism — reuse a valid cumulative assessment; delegate when needed (the "Reuse valid cumulative risk assessments across pipeline actions" architecture rule, the "On-Demand Assessment Skills for Governance Plugins" architecture rule):**
317
317
 
318
- 1. Invoke the release scorer. Two paths are valid:
318
+ 1. Use the Step 14 pipeline assessment's separate `push` and `release` scores if it still covers this exact checkout, assessed content, unpushed and unreleased scope, and current effective appetite, and has not expired or drifted. A commit of identical assessed content does not require another scorer invocation. If any condition fails or cannot be established, invoke the scorer again before pushing or releasing. Two delegation paths are valid:
319
319
  - **Primary**: delegate to subagent type `wr-risk-scorer:pipeline` via the Agent tool.
320
320
  - **Fallback**: if that subagent type is not available, invoke skill `/wr-risk-scorer:assess-release` via the Skill tool. The skill wraps the same pipeline subagent.
321
- 2. Read the returned `RISK_SCORES: commit=X push=Y release=Z` line.
322
- 3. **Drain condition**: if `push` and `release` are both within appetite (≤ 4/25, "Low" band per `RISK-POLICY.md`), AND `.changeset/` is non-empty, proceed to the drain action. Otherwise, skip the drain and report the unreleased state.
321
+ 2. Read `RISK_SCORES: commit=X push=Y release=Z` from the valid assessment. Never substitute the commit score for a push or release score. The action-time `push:watch` and `release:watch` gates still check the relevant score, checkout, state, expiry, appetite, and CI; if a gate rejects stale or changed evidence, resolve the checkout binding or rescore before retrying.
322
+ 3. **Drain condition**: if `push` and `release` are both within appetite (at or below the effective appetite used by the scorer and gate), AND `.changeset/` is non-empty, proceed to the drain action. Otherwise, skip the drain and report the unreleased state.
323
323
 
324
324
  **Drain action (non-interactive, policy-authorised per the "Structured User Interaction for Governance-Skill Decisions" architecture rule Rule 6):**
325
325
 
@@ -329,7 +329,7 @@ Otherwise, after the commit in step 14 lands, drain the release queue so the fix
329
329
 
330
330
  **Failure handling**: If `release:watch` fails (CI failure, publish failure), stop and report the failure clearly. Do not retry non-interactively — the user must intervene.
331
331
 
332
- **Above-appetite branch (per the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule)**: If push or release risk is above appetite (≥ 5/25), the skill MUST auto-apply scorer remediations incrementally until residual risk converges within appetite, OR halt the skill per the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule Rule 5 if the scorer cannot produce a convergent plan. **The skill MUST NOT release above appetite under any circumstance.** The skill MUST NOT call `AskUserQuestion` as a shortcut out of the auto-apply loop.
332
+ **Above-appetite branch (per the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule)**: If push or release risk is above appetite (above the effective appetite used by the scorer and gate), the skill MUST auto-apply scorer remediations incrementally until residual risk converges within appetite, OR halt the skill per the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule Rule 5 if the scorer cannot produce a convergent plan. **The skill MUST NOT release above appetite under any circumstance.** The skill MUST NOT call `AskUserQuestion` as a shortcut out of the auto-apply loop.
333
333
 
334
334
  **Auto-apply mechanism (the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule Rule 2):**
335
335
 
@@ -355,7 +355,7 @@ Otherwise, after the commit in step 14 lands, drain the release queue so the fix
355
355
  - **the "Add `manage-incident` Skill to `wr-itil` Plugin" architecture rule** (`docs/decisions/011-manage-incident-skill.proposed.md`) — incident lifecycle; evidence-first workflow; reversible-mitigation preference; Sev 4-5 lightweight path. Step 6's evidence-gate refactor (2026-04-28) extends the "Add `manage-incident` Skill to `wr-itil` Plugin" architecture rule's evidence-first rule with the documented `Record anyway` audit-trail bypass that mitigate-incident already used (cool-headed-commitment consistency across the two incident skills).
356
356
  - **the "Governance Skills Commit Their Own Completed Work" architecture rule** — governance skills commit their own work. Step 14 unchanged.
357
357
  - **the "On-Demand Assessment Skills for Governance Plugins" architecture rule** — release scorer delegation pattern. Step 15 unchanged.
358
- - **the "Inter-iteration release cadence for AFK loops" architecture rule** + **the "Governance skills auto-release when changesets are queued" architecture rule** — release cadence. Step 15 unchanged.
358
+ - **the "Inter-iteration release cadence for AFK loops" architecture rule** + **the "Reuse valid cumulative risk assessments across pipeline actions" architecture rule** — AFK release cadence and attended reuse of valid cumulative risk scores in Step 15.
359
359
  - **the "Agent output grounding — no fabricated quantitative estimates, cite + persist + uncertainty" architecture rule** — cost-source grounding. Step 6's audit-trail bypass note preserves grounding by capturing the user's justification at deviation time.
360
360
  - **the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule** — auto-apply scorer remediations. Step 15 above-appetite branch unchanged.
361
361
  - **the "Problem 071: Argument-based skill subcommands are not discoverable in Claude Code autocomplete" problem** — skill-split origin (slice 6 — manage-incident is the host with thin-router forwarders for `list`, `mitigate`, `restored`, `close`, `link`).
@@ -1147,23 +1147,23 @@ Commit the completed work per the "Governance Skills Commit Their Own Completed
1147
1147
  - Problem closed: `docs(problems): close P<NNN> <title>`
1148
1148
  - Review/re-rank: `docs(problems): review — re-rank priorities`
1149
1149
  - Fix implemented: `fix(<scope>): <description> (closes P<NNN>)` — include problem file changes (rename to `.verifying.md` + `## Fix Released` section) in the same commit per the "Problem lifecycle — add a Verification Pending status between Known Error and Closed" architecture rule
1150
- 5. If commit risk is above appetite: auto-apply scorer remediations per **the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule Rule 1** incrementally until residual commit risk is within appetite (≤ 4/25), OR halt per the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule Rule 5 if the scorer cannot converge. **The skill MUST NOT commit above appetite, and MUST NOT call `AskUserQuestion` to ask whether to commit anyway** (the "Skills, agents, and hooks override RISK-POLICY appetite instead of applying it" problem/the ": Apply RISK-POLICY appetite faithfully across all surfaces" release design amendment 2026-06-24 — above-appetite is framework-mediated, never a category-3 one-time-override; same invariant the push/release branch at Step 12 already enforces). The "Structured User Interaction for Governance-Skill Decisions" architecture rule Rule 6 fail-safe (no `AskUserQuestion` available / non-interactive → skip the commit and report the uncommitted state) remains the terminal fallback. This applies only to the risk-above-appetite branch, not to the delegation-unavailable case above.
1150
+ 5. If commit risk is above appetite: auto-apply scorer remediations per **the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule Rule 1** incrementally until residual commit risk is within appetite (at or below the effective appetite used by the scorer and gate), OR halt per the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule Rule 5 if the scorer cannot converge. **The skill MUST NOT commit above appetite, and MUST NOT call `AskUserQuestion` to ask whether to commit anyway** (the "Skills, agents, and hooks override RISK-POLICY appetite instead of applying it" problem/the ": Apply RISK-POLICY appetite faithfully across all surfaces" release design amendment 2026-06-24 — above-appetite is framework-mediated, never a category-3 one-time-override; same invariant the push/release branch at Step 12 already enforces). The "Structured User Interaction for Governance-Skill Decisions" architecture rule Rule 6 fail-safe (no `AskUserQuestion` available / non-interactive → skip the commit and report the uncommitted state) remains the terminal fallback. This applies only to the risk-above-appetite branch, not to the delegation-unavailable case above.
1151
1151
 
1152
1152
  **Multi-commit slice changeset discipline (the "AFK iter `packages/<plugin>/` commits without changesets — orchestrator-main-turn back-fill is fragile recovery, hook-level enforcement preferable" problem Phase 2)**: when a single logical fix lands across multiple the "Governance Skills Commit Their Own Completed Work" architecture rule-grain commits targeting the same plugin (e.g. helper extraction in commit 1, callers wired in commit 2, SKILL note + transition in commit 3 — all `packages/<plugin>/`), author ONE changeset on the first commit in the slice. Subsequent same-plugin commits do NOT need their own changeset — the `itil-changeset-discipline.sh` hook's Check 2b recognises any `.changeset/*.md` already in the unpushed slice scope (`origin/<base>..HEAD` + untracked + modified-not-staged) that targets `"@windyroad/<plugin>": <any-bump>` and allows. This eliminates the per-commit changeset ceremony that previously produced N redundant `.changeset/*.md` files for one logical release entry (changesets-action collapses bump-class at version-package time, so per-commit changesets rendered N near-identical CHANGELOG bullets for one release). Once a changeset hits `origin/<base>` (drained at release time), it no longer counts — a fresh changeset is required for the next slice. Cross-plugin coverage is NOT permitted: an `@windyroad/itil` changeset does not satisfy a `packages/voice-tone/` commit.
1153
1153
 
1154
- ### 12. Auto-release when changesets are queued (the "Governance skills auto-release when changesets are queued" architecture rule)
1154
+ ### 12. Auto-release when changesets are queued (the "Reuse valid cumulative risk assessments across pipeline actions" architecture rule)
1155
1155
 
1156
1156
  **Skip this step if the skill is running inside an AFK orchestrator** (e.g. `/wr-itil:work-problems`). Orchestrators handle release cadence themselves per the "Inter-iteration release cadence for AFK loops" architecture rule (Step 6.5). Detect via the presence of an orchestrator marker in the invoking prompt — look for phrases like "AFK", "work-problems", "batch-work", or the sentinel `ALL_DONE` convention. When in doubt, defer to the orchestrator by skipping this step.
1157
1157
 
1158
1158
  Otherwise, after the commit in step 11 lands, drain the release queue so the fix actually lands on npm without requiring manual user action.
1159
1159
 
1160
- **Mechanism — delegate, do not re-implement scoring (per the "On-Demand Assessment Skills for Governance Plugins" architecture rule):**
1160
+ **Mechanism — reuse a valid cumulative assessment; delegate when needed (the "Reuse valid cumulative risk assessments across pipeline actions" architecture rule, the "On-Demand Assessment Skills for Governance Plugins" architecture rule):**
1161
1161
 
1162
- 1. Invoke the release scorer. Two paths are valid:
1162
+ 1. Use the Step 11 pipeline assessment's separate `push` and `release` scores if it still covers this exact checkout, assessed content, unpushed and unreleased scope, and current effective appetite, and has not expired or drifted. A commit of identical assessed content does not require another scorer invocation. If any condition fails or cannot be established, invoke the scorer again before pushing or releasing. Two delegation paths are valid:
1163
1163
  - **Primary**: delegate to subagent type `wr-risk-scorer:pipeline` via the Agent tool.
1164
1164
  - **Fallback**: if that subagent type is not available, invoke skill `/wr-risk-scorer:assess-release` via the Skill tool. The skill wraps the same pipeline subagent.
1165
- 2. Read the returned `RISK_SCORES: commit=X push=Y release=Z` line.
1166
- 3. **Drain condition**: if `push` and `release` are both within appetite (≤ 4/25, "Low" band per `RISK-POLICY.md`), AND `.changeset/` is non-empty, proceed to the drain action. Otherwise, skip the drain and report the unreleased state.
1165
+ 2. Read `RISK_SCORES: commit=X push=Y release=Z` from the valid assessment. Never substitute the commit score for a push or release score. The action-time `push:watch` and `release:watch` gates still check the relevant score, checkout, state, expiry, appetite, and CI; if a gate rejects stale or changed evidence, resolve the checkout binding or rescore before retrying.
1166
+ 3. **Drain condition**: if `push` and `release` are both within appetite (at or below the effective appetite used by the scorer and gate), AND `.changeset/` is non-empty, proceed to the drain action. Otherwise, skip the drain and report the unreleased state.
1167
1167
 
1168
1168
  **Drain action (non-interactive, policy-authorised per the "Structured User Interaction for Governance-Skill Decisions" architecture rule Rule 6):**
1169
1169
 
@@ -1173,7 +1173,7 @@ Otherwise, after the commit in step 11 lands, drain the release queue so the fix
1173
1173
 
1174
1174
  **Failure handling**: If `release:watch` fails (CI failure, publish failure), stop and report the failure clearly. Do not retry non-interactively — the user must intervene.
1175
1175
 
1176
- **Above-appetite branch (per the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule)**: If push or release risk is above appetite (≥ 5/25), the skill MUST auto-apply scorer remediations incrementally until residual risk converges within appetite, OR halt the skill per the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule Rule 5 if the scorer cannot produce a convergent plan. **The skill MUST NOT release above appetite under any circumstance.** The skill MUST NOT call `AskUserQuestion` as a shortcut out of the auto-apply loop.
1176
+ **Above-appetite branch (per the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule)**: If push or release risk is above appetite (above the effective appetite used by the scorer and gate), the skill MUST auto-apply scorer remediations incrementally until residual risk converges within appetite, OR halt the skill per the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule Rule 5 if the scorer cannot produce a convergent plan. **The skill MUST NOT release above appetite under any circumstance.** The skill MUST NOT call `AskUserQuestion` as a shortcut out of the auto-apply loop.
1177
1177
 
1178
1178
  **Auto-apply mechanism (the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule Rule 2):**
1179
1179
 
@@ -1196,7 +1196,7 @@ Otherwise, after the commit in step 11 lands, drain the release queue so the fix
1196
1196
  - The final `RISK_SCORES:` line
1197
1197
  - An "Auto-apply trail" subsection listing each remediation attempted with outcome
1198
1198
  - Any Verification Pending ticket IDs implicated per Rule 2b
1199
- - A one-line scorer-gap note (e.g., "available remediations did not reduce residual risk below 5/25 — extend scorer vocabulary per the "Scorer `RISK_REMEDIATIONS:` block is free-form prose — agent must parse descriptions to decide what to do" problem")
1199
+ - A one-line scorer-gap note (e.g., "available remediations did not reduce residual risk to within the effective appetite — extend scorer vocabulary per the "Scorer `RISK_REMEDIATIONS:` block is free-form prose — agent must parse descriptions to decide what to do" problem")
1200
1200
 
1201
1201
  The user resolves interactively — typical resolutions include splitting the commit, feature-flagging the change, or opening a problem ticket documenting the scorer gap.
1202
1202
 
@@ -182,7 +182,7 @@ Otherwise, after the commit in step 8 lands, drain the release queue so the fix
182
182
  - **Primary**: delegate to subagent type `wr-risk-scorer:pipeline` via the Agent tool.
183
183
  - **Fallback**: if that subagent type is not available, invoke skill `/wr-risk-scorer:assess-release` via the Skill tool.
184
184
  2. Read the returned `RISK_SCORES: commit=X push=Y release=Z` line.
185
- 3. **Drain condition**: if `push` and `release` are both within appetite (≤ 4/25, "Low" band per `RISK-POLICY.md`), AND `.changeset/` is non-empty, proceed to the drain action. Otherwise, skip the drain and report the unreleased state.
185
+ 3. **Drain condition**: if `push` and `release` are both within appetite (at or below the effective appetite used by the scorer and gate), AND `.changeset/` is non-empty, proceed to the drain action. Otherwise, skip the drain and report the unreleased state.
186
186
 
187
187
  **Drain action (non-interactive, policy-authorised per the "Structured User Interaction for Governance-Skill Decisions" architecture rule Rule 6):**
188
188
 
@@ -160,7 +160,7 @@ Otherwise, after the commit in step 8 lands, drain the release queue so the fix
160
160
  - **Primary**: delegate to subagent type `wr-risk-scorer:pipeline` via the Agent tool.
161
161
  - **Fallback**: if that subagent type is not available, invoke skill `/wr-risk-scorer:assess-release` via the Skill tool.
162
162
  2. Read the returned `RISK_SCORES: commit=X push=Y release=Z` line.
163
- 3. **Drain condition**: if `push` and `release` are both within appetite (≤ 4/25, "Low" band per `RISK-POLICY.md`), AND `.changeset/` is non-empty, proceed to the drain action. Otherwise, skip the drain and report the unreleased state.
163
+ 3. **Drain condition**: if `push` and `release` are both within appetite (at or below the effective appetite used by the scorer and gate), AND `.changeset/` is non-empty, proceed to the drain action. Otherwise, skip the drain and report the unreleased state.
164
164
 
165
165
  **Drain action (non-interactive, policy-authorised per the "Structured User Interaction for Governance-Skill Decisions" architecture rule Rule 6):**
166
166
 
@@ -1,6 +1,6 @@
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 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)."
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 on PASS, queues unresolved FAIL verdicts. 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
 
@@ -23,7 +23,7 @@ allowed-tools: Read, Write, Edit, Bash, Glob, Grep, AskUserQuestion, Skill, Agen
23
23
 
24
24
  # Update Upstream — Lifecycle-Update Skill
25
25
 
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.
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, closes only issue targets on Verifying → Closed, and queues an `outstanding_questions` entry when either gate still FAILS after risk reduction.
27
27
 
28
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
 
@@ -49,8 +49,8 @@ The single-ticket form is typically invoked from `/wr-itil:transition-problem` S
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 (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).
52
+ - Both gates PASS → 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
+ - Gate FAIL → 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
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
 
@@ -105,7 +105,7 @@ For each `- **URL**: <url>` line under `## Reported Upstream`, extract:
105
105
 
106
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
- 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.
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 failed gate queues only that entry, the rest proceed.
109
109
 
110
110
  ### 3. Determine the transition that fired this invocation
111
111
 
@@ -223,33 +223,36 @@ Score the drafted comment body via the `wr-risk-scorer:external-comms` agent (sh
223
223
  The agent returns a structured verdict:
224
224
 
225
225
  ```
226
- EXTERNAL_COMMS_RISK_VERDICT
227
- band: Low (<=4/25) | Medium (5..16) | High (17+)
228
- score: <0..25>
229
- pass: true | false
230
- reason: <one-line rationale>
226
+ EXTERNAL_COMMS_RISK_VERDICT: PASS
231
227
  ```
232
228
 
233
- - **`pass: true` AND band ≤ Low (4/25)**: within appetite per RISK-POLICY.md commit-layer. Proceed to 5b (voice-tone).
234
- - **`pass: false` OR band > Low**: above appetite. Branch to 5c (above-appetite handling).
229
+ Or, on failure:
230
+
231
+ ```
232
+ EXTERNAL_COMMS_RISK_VERDICT: FAIL
233
+ EXTERNAL_COMMS_RISK_REASON: <one-line rationale>
234
+ ```
235
+
236
+ - **PASS**: proceed to 5b (voice-tone).
237
+ - **FAIL**: branch to 5c (gate-failure handling).
235
238
 
236
239
  #### 5b. Voice-tone gate
237
240
 
238
241
  `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.
239
242
 
240
- A FAIL verdict on the voice-tone gate is treated identically to an above-appetite risk verdict — branch to 5c.
243
+ A FAIL verdict on the voice-tone gate also branches to 5c.
241
244
 
242
- #### 5c. Above-appetite handling
245
+ #### 5c. Gate-failure handling
243
246
 
244
- 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:
247
+ 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 verdict is itself the framework. The failure handling differs by orchestrator context:
245
248
 
246
249
  - **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:
247
250
  - `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.
248
- - `Risk-reduce and re-score` — invoke a tighter draft (shorter / fewer claims / stricter source-citation) and re-run the gate.
251
+ - `Risk-reduce and re-review` — invoke a tighter draft (shorter / fewer claims / stricter source-citation) and re-run the gate.
249
252
  - `Queue for later review` — save the draft to `## Queued Upstream Update` on the local ticket; user acts on return.
250
253
  - `Skip this update` — exit no-op for this upstream entry; the next transition's invocation re-considers.
251
254
 
252
- - **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.
255
+ - **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-review** first — re-draft the comment with tighter source-citation + shorter prose, then re-invoke the external-comms gate. If the new verdict is PASS, 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 FAIL reason + 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 a failed upstream update gate.
253
256
 
254
257
  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.
255
258
 
@@ -261,8 +264,8 @@ The silent risk-reduce step is **mechanical** per the "— Decision-Delegation C
261
264
  - **Drafted**: <YYYY-MM-DD>
262
265
  - **Transition**: Open → Known Error | Known Error → Verification Pending | Verification Pending → Closed
263
266
  - **Target URL**: <upstream-issue-url>
264
- - **Halt reason**: above-appetite external-comms gate (band: <verdict band>; score: <verdict score>; reason: <verdict reason>) | above-appetite voice-tone gate (reason: <verdict reason>)
265
- - **Risk-reduce attempts**: <count, e.g. "1 — tighter source-citation; re-scored band Medium">
267
+ - **Halt reason**: external-comms gate FAIL (reason: <EXTERNAL_COMMS_RISK_REASON>) | voice-tone gate FAIL (reason: <verdict reason>)
268
+ - **Risk-reduce attempts**: <count, e.g. "1 — tighter source-citation; re-reviewed FAIL">
266
269
  - **Drafted comment body**:
267
270
 
268
271
  <the body that would have been posted as a `gh issue comment`, ready for manual review>
@@ -312,9 +315,9 @@ Append a log entry to the local ticket's `## Upstream Lifecycle Updates` section
312
315
 
313
316
  - **<YYYY-MM-DD>** — Open → Known Error
314
317
  - **Target URL**: <upstream-issue-url>
315
- - **Comment URL**: <posted-comment-url> (or "queued — see ## Queued Upstream Update" when above-appetite)
316
- - **Disclosure path**: posted-comment | posted-pr-comment (pull-request target — never closed) | posted-comment-and-closed (confirmed Verifying → Closed, issue targets only) | posted-comment-local-close-only (outbound evidence-authorised close) | queued-above-appetite | closed-already-upstream | skipped-out-of-band
317
- - **Gate verdict**: external-comms <band/score> + voice-tone <pass|fail>
318
+ - **Comment URL**: <posted-comment-url> (or "queued — see ## Queued Upstream Update" when a gate fails)
319
+ - **Disclosure path**: posted-comment | posted-pr-comment (pull-request target — never closed) | posted-comment-and-closed (confirmed Verifying → Closed, issue targets only) | posted-comment-local-close-only (outbound evidence-authorised close) | queued-gate-failure | closed-already-upstream | skipped-out-of-band
320
+ - **Gate verdict**: external-comms <PASS|FAIL> + voice-tone <PASS|FAIL>
318
321
 
319
322
  - **<YYYY-MM-DD>** — Known Error → Verification Pending
320
323
  - ... (next entry appends; never replaces earlier entries)
@@ -494,7 +497,7 @@ Route the GENERATED comment through the reporter-facing gate chain — **cogniti
494
497
 
495
498
  **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.
496
499
 
497
- 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:
500
+ Gate-failure handling is identical to Step 5c (silent risk-reduce + re-review; if still FAIL, 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). When both gates PASS, post on our own repo:
498
501
 
499
502
  ```bash
500
503
  gh issue comment "${NN}" --repo "${OWN_OWNER_REPO}" --body "${INBOUND_BODY}"
@@ -517,16 +520,16 @@ Append to the same `## Upstream Lifecycle Updates` log (Step 6 shape), tagged fo
517
520
  ```markdown
518
521
  - **<YYYY-MM-DD>** — Known Error → Verification Pending (inbound)
519
522
  - **Target**: inbound #<NN> (own repo <OWN_OWNER_REPO>)
520
- - **Comment URL**: <posted-comment-url> (or "skipped — already-posted-inbound" when the idempotency guard matched, or "queued — see ## Queued Upstream Update" when above-appetite)
521
- - **Disclosure path**: posted-inbound-comment | posted-inbound-comment-and-closed (proven owned issue, confirmed or evidence-authorised close) | already-posted-inbound | queued-above-appetite | closed-already | inbound-channel-unresolved
522
- - **Gate verdict**: external-comms <band/score> + voice-tone <pass|fail>
523
+ - **Comment URL**: <posted-comment-url> (or "skipped — already-posted-inbound" when the idempotency guard matched, or "queued — see ## Queued Upstream Update" when a gate fails)
524
+ - **Disclosure path**: posted-inbound-comment | posted-inbound-comment-and-closed (proven owned issue, confirmed or evidence-authorised close) | already-posted-inbound | queued-gate-failure | closed-already | inbound-channel-unresolved
525
+ - **Gate verdict**: external-comms <PASS|FAIL> + voice-tone <PASS|FAIL>
523
526
  ```
524
527
 
525
528
  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.
526
529
 
527
530
  #### I7. Both-direction tickets
528
531
 
529
- 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.
532
+ 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 failed gate queues only its own leg; the other proceeds.
530
533
 
531
534
  ### 7. Commit per the "Governance Skills Commit Their Own Completed Work" architecture rule
532
535
 
@@ -578,10 +581,10 @@ The append-only log (written by Step 6 on every post) is the source of truth —
578
581
  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:
579
582
 
580
583
  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`.
581
- 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.
582
- 3. Post within appetite (Step 5b final) and back-write the `## Upstream Lifecycle Updates` log (Step 6).
584
+ 2. Compose through the external-comms + voice-tone gates (Step 5) — **identical** dual-gate composition as the per-ticket path. Gate-failure handling (Step 5c) is unchanged: silent risk-reduce + re-review, 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 FAIL. Catchup does NOT bypass the gates.
585
+ 3. Post after both gates PASS (Step 5b final) and back-write the `## Upstream Lifecycle Updates` log (Step 6).
583
586
 
584
- 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).
587
+ Process entries one at a time so a single failed gate queues only its own entry; 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).
585
588
 
586
589
  ### C4. Commit per the "Governance Skills Commit Their Own Completed Work" architecture rule
587
590
 
@@ -593,15 +596,15 @@ The live-upstream end-to-end confirmation (the "Problem 080: No bidirectional up
593
596
 
594
597
  ## AFK behaviour summary
595
598
 
596
- 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.
599
+ 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. PASS proceeds; FAIL silently risk-reduces + re-reviews; an unresolved FAIL 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.
597
600
 
598
601
  | Branch | AFK behaviour | Authority |
599
602
  |---|---|---|
600
- | 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 |
601
- | 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) |
602
- | 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 |
603
+ | Both gates PASS (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 |
604
+ | Gate FAIL — silent risk-reduce yields PASS | Re-draft with tighter source-citation + shorter prose; re-invoke `wr-risk-scorer:external-comms`. On PASS → post through the voice-tone gate. | 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) |
605
+ | Gate FAIL — silent risk-reduce still FAILS | 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 |
603
606
  | Above-appetite commit (Step 7) | Skip the commit, report uncommitted state. | the "Structured User Interaction for Governance-Skill Decisions" architecture rule Rule 6 |
604
- | **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 |
607
+ | **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. Failed gates queue 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 |
605
608
 
606
609
  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.
607
610
 
@@ -986,9 +986,10 @@ After the iteration's commit lands but before starting the next iteration, check
986
986
  - **Fallback**: if that subagent type is not available, invoke skill `/wr-risk-scorer:assess-release` via the Skill tool. The skill wraps the same pipeline subagent.
987
987
  2. Read the returned `RISK_SCORES: commit=X push=Y release=Z` line and the `RISK_REMEDIATIONS:` block (if present).
988
988
  3. **Classify the residual + queue state (the "work-problems Step 6.5 "≤3 within appetite — no drain" clause defers low-risk releases, encoding accumulation" problem)**:
989
- - **Above appetite (≥ 5/25)** — route to the **Above-appetite branch** below. Do NOT drain. Do NOT proceed to Step 6.75 until either (a) the auto-apply loop re-converges within appetite and drain succeeds, or (b) Rule 5 halt fires.
990
- - **Within appetite (≤ 4/25) AND there is releasable material** (any unpushed commits on `HEAD..origin/<base>` OR any entries in `.changeset/`) — drain the queue per the Drain action below, then proceed to Step 6.75. The release-action threshold is "is there something to release?", NOT "has accumulated risk reached the safety band?" Per user direction 2026-05-17 (the "work-problems Step 6.5 "≤3 within appetite — no drain" clause defers low-risk releases, encoding accumulation" problem Description): *"If it's low risk, you should release."* Low cost to release + low residual risk = release now; never accumulate.
991
- - **Within appetite (≤ 4/25) AND empty queue** (no unpushed commits AND no `.changeset/` entries) — no drain (literally nothing to release). Proceed to Step 6.75. This is the genuine no-op fast-path; the gate is *absence of releasable material*, not residual band.
989
+ - Use the scorer's **effective appetite** (`RISK_APPETITE` override, then `RISK-POLICY.md`, then default 5); a score equal to that appetite is within it.
990
+ - **Above appetite (push or release score > effective appetite)** — route to the **Above-appetite branch** below. Do NOT drain. Do NOT proceed to Step 6.75 until either (a) the auto-apply loop re-converges within appetite and drain succeeds, or (b) Rule 5 halt fires.
991
+ - **Within appetite (both scores ≤ effective appetite) AND there is releasable material** (any unpushed commits on `HEAD..origin/<base>` OR any entries in `.changeset/`) — drain the queue per the Drain action below, then proceed to Step 6.75. The release-action threshold is "is there something to release?", NOT "has accumulated risk reached the safety band?" Per user direction 2026-05-17 (the "work-problems Step 6.5 "≤3 within appetite — no drain" clause defers low-risk releases, encoding accumulation" problem Description): *"If it's low risk, you should release."* Low cost to release + low residual risk = release now; never accumulate.
992
+ - **Within appetite (both scores ≤ effective appetite) AND empty queue** (no unpushed commits AND no `.changeset/` entries) — no drain (literally nothing to release). Proceed to Step 6.75. This is the genuine no-op fast-path; the gate is *absence of releasable material*, not residual band.
992
993
 
993
994
  **Drain action (non-interactive, policy-authorised per the "Structured User Interaction for Governance-Skill Decisions" architecture rule Rule 6):**
994
995
 
@@ -1068,7 +1069,7 @@ After a successful release-cadence drain has shipped a new plugin version to npm
1068
1069
 
1069
1070
  #### Above-appetite branch (per the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule)
1070
1071
 
1071
- **Invariant**: the orchestrator MUST NOT release above appetite. There is no code path in Step 6.5 that releases at residual push/release ≥ 5/25. The orchestrator MUST NOT call `AskUserQuestion` as a shortcut out of the auto-apply loop — the scorer is the decision surface, not the user. The branch terminates in either a within-appetite drain or a Rule 5 halt.
1072
+ **Invariant**: the orchestrator MUST NOT release above the effective appetite. There is no code path in Step 6.5 that releases when either residual push or release score exceeds it. The orchestrator MUST NOT call `AskUserQuestion` as a shortcut out of the auto-apply loop — the scorer is the decision surface, not the user. The branch terminates in either a within-appetite drain or a Rule 5 halt.
1072
1073
 
1073
1074
  **Auto-apply loop (the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule Rule 2):**
1074
1075
 
@@ -1086,8 +1087,8 @@ After a successful release-cadence drain has shipped a new plugin version to npm
1086
1087
  - `disable-or-revert`: remove the risky behaviour from shipped code until its required evidence or control exists.
1087
1088
  5. Re-invoke the risk scorer (same delegation path as step 1 above — subagent preferred, skill fallback). Read the new `RISK_SCORES:` line.
1088
1089
  6. **Loop classification**:
1089
- - **Re-score within appetite (≤ 4/25)** — proceed to Drain action above. Done with the above-appetite branch.
1090
- - **Re-score still above appetite (≥ 5/25)** — continue working to reduce risk. The agent reads the new remediations and decides what to do next. Loop.
1090
+ - **Re-score within appetite (both scores ≤ effective appetite)** — proceed to Drain action above. Done with the above-appetite branch.
1091
+ - **Re-score still above appetite (either score > effective appetite)** — continue working to reduce risk. The agent reads the new remediations and decides what to do next. Loop.
1091
1092
  - **No remediations remain** or **the agent has exhausted its own ideas** — Rule 5 halt.
1092
1093
 
1093
1094
  **Governance gates per auto-apply (the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule Rule 3):** each auto-apply that requires a commit (the amend in step 4 above) goes through the standard the "Governance Skills Commit Their Own Completed Work" architecture rule commit flow — architect review, JTBD review, risk-scorer gate. A gate rejection falls through to Rule 5 halt. The scorer's suggestions do NOT bypass gates.
@@ -1159,12 +1160,12 @@ When `AskUserQuestion` is unavailable or the user is AFK, the skill (and the del
1159
1160
  | Scope expansion during work | Update problem file, re-score WSJF, move to next problem instead of continuing |
1160
1161
  | Commit when risk within appetite | Auto-commit (manage-problem step 9e fallback) |
1161
1162
  | Commit when risk above appetite | Skip commit, report uncommitted state |
1162
- | Pipeline risk within appetite (≤ 4/25) with releasable material (any unpushed commits OR any `.changeset/` entries) | Drain release queue (`push:watch` then, if releasable changesets exist, `release:watch`) before next iteration — per the "Inter-iteration release cadence for AFK loops" architecture rule (Step 6.5) as amended by the "work-problems Step 6.5 "≤3 within appetite — no drain" clause defers low-risk releases, encoding accumulation" problem. Trigger is *presence of releasable material*, not residual band reaching appetite. User direction 2026-05-17: "If it's low risk, you should release." |
1163
- | Pipeline risk within appetite (≤ 4/25) AND empty queue (no unpushed commits AND no `.changeset/`) | No drain — literally nothing to release. Proceed directly to Step 6.75. The genuine no-op fast-path per the "work-problems Step 6.5 "≤3 within appetite — no drain" clause defers low-risk releases, encoding accumulation" problem. |
1163
+ | Pipeline risk within effective appetite (both scores ≤ effective appetite) with releasable material (any unpushed commits OR any `.changeset/` entries) | Drain release queue (`push:watch` then, if releasable changesets exist, `release:watch`) before next iteration — per the "Inter-iteration release cadence for AFK loops" architecture rule (Step 6.5) as amended by the "work-problems Step 6.5 "≤3 within appetite — no drain" clause defers low-risk releases, encoding accumulation" problem. Trigger is *presence of releasable material*, not residual band reaching appetite. User direction 2026-05-17: "If it's low risk, you should release." |
1164
+ | Pipeline risk within effective appetite (both scores ≤ effective appetite) AND empty queue (no unpushed commits AND no `.changeset/`) | No drain — literally nothing to release. Proceed directly to Step 6.75. The genuine no-op fast-path per the "work-problems Step 6.5 "≤3 within appetite — no drain" clause defers low-risk releases, encoding accumulation" problem. |
1164
1165
  | Post-release K→V auto-transition between iters (the ".known-error.md → .verifying.md transition not happening consistently at release time" problem) | After a successful within-appetite Drain action shipped a release to npm, invoke `wr-itil-enumerate-postrelease-kv-candidates` to enumerate `.known-error.md` tickets whose `**Release vehicle**: .changeset/<name>.md` citation matches a just-shipped (deleted-from-tree) changeset, and dispatch `/wr-itil:transition-problem <NNN> verifying` per emitted `KV_CANDIDATE` line. Conditional on actual release (skipped when `push:watch` ran alone with no changeset); non-blocking on individual transition failure (logs per-ticket, continues to next candidate; persistent failures route to Step 2.5b accumulated questions). V→C remains a maintainer-only surface — this callback fires K→V only. Per the "Problem lifecycle — add a Verification Pending status between Known Error and Closed" architecture rule + the "Inter-iteration release cadence for AFK loops" architecture rule + the "Rename `wr-problem` Plugin to `wr-itil`" architecture rule amended the "Problem 093: `/wr-itil:transition-problem` ↔ `/wr-itil:manage-problem` circular delegation for `<NNN> <status>` args" problem + the "Governance Skills Commit Their Own Completed Work" architecture rule + the "Structured User Interaction for Governance-Skill Decisions" architecture rule Rule 5 + the "— Decision-Delegation Contract: when agents act on the framework vs ask the user" architecture rule + the ".known-error.md → .verifying.md transition not happening consistently at release time" problem + the "AFK iter subprocess plugin cache stale after release — just-shipped hook does not protect the next iter" problem + the "Codify `derive-release-vehicle.sh` helper for K→V release-cycle citation" problem + the "derive-release-vehicle helper requires pre-edit of ticket changeset reference — three-touch when one-touch would suffice" problem (Step 6.5 Post-release K→V auto-transition subsection). |
1165
1166
  | Post-release plugin cache refresh between iters (the "AFK iter subprocess plugin cache stale after release — just-shipped hook does not protect the next iter" problem) | After a successful within-appetite Drain action shipped a release to npm, chain `/install-updates` to refresh the plugin cache before the next iter dispatches. Conditional on actual release (skipped when `push:watch` ran alone with no changeset); non-blocking on `/install-updates` failure (degrades to cache-stays-stale, equivalent to pre-amendment behaviour). Mid-loop ask discipline preserved by treating any `/install-updates` AskUserQuestion surface AS the Non-interactive fallback dry-run path. Per the "Structured User Interaction for Governance-Skill Decisions" architecture rule Rule 5 + the "— Decision-Delegation Contract: when agents act on the framework vs ask the user" architecture rule + the "`/wr-itil:work-problems` orchestrator defaults to subprocess dispatch even when the user is observably interactive — loses real-time presence advantage" problem + the "`/install-updates` Step 7 uses `claude plugin install` which silently no-ops when a plugin is already installed — updates never actually land" problem + the "AFK iter subprocess plugin cache stale after release — just-shipped hook does not protect the next iter" problem (Step 6.5 Post-release cache refresh subsection). |
1166
1167
  | CI failure during Step 6.5 drain (within-appetite branch) | Diagnose via `gh run view --log-failed`, classify against the closed fixable-in-iter allow-list (the "Problem 081: Structural source-content tests are wasteful — TDD agent should reject them and require behavioural tests (+ framework / stub enhancements)" problem-class stale-grep-string, hook stub mismatch, test ID drift, environmental flake), fix-and-continue for fixable classes (each retry rides its own the "Governance Skills Commit Their Own Completed Work" architecture rule commit gate), 3-retry cap per iteration, halt for unrecoverable classes. Ambiguous classification defaults to halt. the "Structured User Interaction for Governance-Skill Decisions" architecture rule Rule 5 policy-authorised. Per the "Agent output grounding — no fabricated quantitative estimates, cite + persist + uncertainty" architecture rule grounding + the "— Decision-Delegation Contract: when agents act on the framework vs ask the user" architecture rule framework-resolution boundary + the "`/wr-itil:work-problems` Step 6.5 halt-on-CI-failure direction should be fix-and-continue when failure is mechanically fixable (-class stale assertions)" problem (Step 6.5 Failure handling). |
1167
- | Pipeline risk above appetite (push or release >= 5/25) | Auto-apply scorer remediations incrementally (the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule Rule 2). The agent reads suggestions and decides what to do. Re-score after each apply; drain when within appetite. **Never release above appetite** (the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule Rule 1) — no AskUserQuestion shortcut. Halt the loop with `outcome: halted-above-appetite` if the loop exhausts without convergence (the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule Rule 5). Verification Pending commits excluded from auto-revert (Rule 2b). Per the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule (Step 6.5 Above-appetite branch). |
1168
+ | Pipeline risk above appetite (push or release score > effective appetite) | Auto-apply scorer remediations incrementally (the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule Rule 2). The agent reads suggestions and decides what to do. Re-score after each apply; drain when within appetite. **Never release above appetite** (the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule Rule 1) — no AskUserQuestion shortcut. Halt the loop with `outcome: halted-above-appetite` if the loop exhausts without convergence (the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule Rule 5). Verification Pending commits excluded from auto-revert (Rule 2b). Per the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule (Step 6.5 Above-appetite branch). |
1168
1169
  | Origin diverged before start (Branch 1) | Pull `--ff-only` if trivial; route to Branch 3 (stop with `git log HEAD..origin/<base>` and reverse report) if non-fast-forward — per the "AFK orchestrator preflight: get the repo into a clean state before starting" architecture rule (Step 0 Branch 1 / Branch 3). |
1169
1170
  | Pre-existing uncommitted work attributable to prior iter's in-flight flow (Branch 2 — DEFERRED) | Per the "AFK orchestrator preflight: get the repo into a clean state before starting" architecture rule Branch 2 (currently routes → Branch 3 until follow-up lands the auto-commit mechanism + the ": Enforce Governance Without Slowing Down" user outcome gate composition + bats). Auto-commit criteria when shipped: (a) provenance unambiguous AND (b) risk within appetite per the "Inter-iteration release cadence for AFK loops" architecture rule. Commit subject convention: `chore(preflight): recover prior-session in-flight work — <ticket-ref>` (the ": Progress the Backlog While I'm Away" user outcome audit trail). |
1170
1171
  | Prior-session partial work detected at start (Branch 3 detection — session-continuity dirty: untracked `docs/decisions/*.proposed.md` / `docs/problems/*.md`, `.afk-run-state/iter-*.json` with `is_error: true` or `api_error_status >= 400`, stale `.claude/worktrees/*`, uncommitted SKILL.md/source/ADR edits) | Halt the loop with a structured Prior-Session State report in the AFK summary — deliberate carve-out from the 2026-06-06 Rule 6 queue-and-continue default (ambiguous state would mask the bug this preflight surfaces). Do NOT attempt non-interactive resume. Interactive invocations prompt via `AskUserQuestion` with 4 options (resume / discard / leave-and-lower-priority / halt). Per the "`/wr-itil:work-problems` preflight Step 0 does not detect prior-session partial-work state (untracked ADRs, `.afk-run-state/iter-*.json` with 429/error statuses, existing `.claude/worktrees/*` branches)" problem + the "Structured User Interaction for Governance-Skill Decisions" architecture rule Rule 6 + the "AFK orchestrator preflight: get the repo into a clean state before starting" architecture rule (Step 0 Branch 3 detection mechanism). |
@@ -145,7 +145,7 @@ Otherwise, after the commit in step 7 lands, drain the release queue so the clos
145
145
  - **Primary**: delegate to subagent type `wr-risk-scorer:pipeline` via the native Codex subagent tool.
146
146
  - **Fallback**: if that subagent type is not available, invoke skill `/wr-risk-scorer:assess-release` via the installed skill invocation.
147
147
  2. Read the returned `RISK_SCORES: commit=X push=Y release=Z` line.
148
- 3. **Drain condition**: if `push` and `release` are both within appetite (≤ 4/25, "Low" band per `RISK-POLICY.md`), AND `.changeset/` is non-empty, proceed to the drain action. Otherwise, skip the drain and report the unreleased state.
148
+ 3. **Drain condition**: if `push` and `release` are both within appetite (at or below the effective appetite used by the scorer and gate), AND `.changeset/` is non-empty, proceed to the drain action. Otherwise, skip the drain and report the unreleased state.
149
149
 
150
150
  **Drain action (non-interactive, policy-authorised per the "Structured User Interaction for Governance-Skill Decisions" architecture rule Rule 6):**
151
151
 
@@ -128,7 +128,7 @@ Otherwise, after the commit in step 7 lands, drain the release queue so the link
128
128
  - **Primary**: delegate to subagent type `wr-risk-scorer:pipeline` via the native Codex subagent tool.
129
129
  - **Fallback**: if that subagent type is not available, invoke skill `/wr-risk-scorer:assess-release` via the installed skill invocation.
130
130
  2. Read the returned `RISK_SCORES: commit=X push=Y release=Z` line.
131
- 3. **Drain condition**: if `push` and `release` are both within appetite (≤ 4/25, "Low" band per `RISK-POLICY.md`), AND `.changeset/` is non-empty, proceed to the drain action. Otherwise, skip the drain and report the unreleased state.
131
+ 3. **Drain condition**: if `push` and `release` are both within appetite (at or below the effective appetite used by the scorer and gate), AND `.changeset/` is non-empty, proceed to the drain action. Otherwise, skip the drain and report the unreleased state.
132
132
 
133
133
  **Drain action (non-interactive, policy-authorised per the "Structured User Interaction for Governance-Skill Decisions" architecture rule Rule 6):**
134
134
 
@@ -318,19 +318,19 @@ Commit the completed work per the "Governance Skills Commit Their Own Completed
318
318
  - Incident closed: `docs(incidents): close I<NNN>`
319
319
  4. If commit risk is above appetite: this is **framework-mediated, NOT a category-3 one-time-override ask** (the "Skills, agents, and hooks override RISK-POLICY appetite instead of applying it" problem/the ": Apply RISK-POLICY appetite faithfully across all surfaces" release design amendment 2026-06-24 — there is no incident carve-out). Per **the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule Rule 1b (incident-context scoring)**: an active incident is a risk being realised (Likelihood already 5), so the incident-response change is scored against that live realised-risk baseline — weighing P(the change increases impact) vs P(it reduces impact & likelihood / restores service) + P(it introduces a new incident). If net risk-reducing, it takes the risk-reducing path (the `reducing` bypass — `RISK_BYPASS: reducing`) and proceeds, no ask. This is *better* for restore-service-fast (the "Restore Service Fast with an Audit Trail" user outcome): a genuine hotfix clears via scoring with no consent gate mid-outage. If the change is NOT net-reducing, auto-remediate per the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule Rule 1 or halt per Rule 5. **MUST NOT commit above appetite; MUST NOT `request_user_input` "commit anyway".** If `request_user_input` is unavailable, the "Structured User Interaction for Governance-Skill Decisions" architecture rule Rule 6 fail-safe applies — skip the commit and report the uncommitted state.
320
320
 
321
- ### 15. Auto-release when changesets are queued (the "Governance skills auto-release when changesets are queued" architecture rule)
321
+ ### 15. Auto-release when changesets are queued (the "Reuse valid cumulative risk assessments across pipeline actions" architecture rule)
322
322
 
323
323
  **Skip this step if the skill is running inside an AFK orchestrator.** Orchestrators handle release cadence themselves per the "Inter-iteration release cadence for AFK loops" architecture rule (Step 6.5). When in doubt, defer to the orchestrator by skipping this step.
324
324
 
325
325
  Otherwise, after the commit in step 14 lands, drain the release queue so the fix actually lands on npm without requiring manual user action.
326
326
 
327
- **Mechanism — delegate, do not re-implement scoring (per the "On-Demand Assessment Skills for Governance Plugins" architecture rule):**
327
+ **Mechanism — reuse a valid cumulative assessment; delegate when needed (the "Reuse valid cumulative risk assessments across pipeline actions" architecture rule, the "On-Demand Assessment Skills for Governance Plugins" architecture rule):**
328
328
 
329
- 1. Invoke the release scorer. Two paths are valid:
329
+ 1. Use the Step 14 pipeline assessment's separate `push` and `release` scores if it still covers this exact checkout, assessed content, unpushed and unreleased scope, and current effective appetite, and has not expired or drifted. A commit of identical assessed content does not require another scorer invocation. If any condition fails or cannot be established, invoke the scorer again before pushing or releasing. Two delegation paths are valid:
330
330
  - **Primary**: delegate to subagent type `wr-risk-scorer:pipeline` via the native Codex subagent tool.
331
331
  - **Fallback**: if that subagent type is not available, invoke skill `/wr-risk-scorer:assess-release` via the installed skill invocation. The skill wraps the same pipeline subagent.
332
- 2. Read the returned `RISK_SCORES: commit=X push=Y release=Z` line.
333
- 3. **Drain condition**: if `push` and `release` are both within appetite (≤ 4/25, "Low" band per `RISK-POLICY.md`), AND `.changeset/` is non-empty, proceed to the drain action. Otherwise, skip the drain and report the unreleased state.
332
+ 2. Read `RISK_SCORES: commit=X push=Y release=Z` from the valid assessment. Never substitute the commit score for a push or release score. The action-time `push:watch` and `release:watch` gates still check the relevant score, checkout, state, expiry, appetite, and CI; if a gate rejects stale or changed evidence, resolve the checkout binding or rescore before retrying.
333
+ 3. **Drain condition**: if `push` and `release` are both within appetite (at or below the effective appetite used by the scorer and gate), AND `.changeset/` is non-empty, proceed to the drain action. Otherwise, skip the drain and report the unreleased state.
334
334
 
335
335
  **Drain action (non-interactive, policy-authorised per the "Structured User Interaction for Governance-Skill Decisions" architecture rule Rule 6):**
336
336
 
@@ -340,7 +340,7 @@ Otherwise, after the commit in step 14 lands, drain the release queue so the fix
340
340
 
341
341
  **Failure handling**: If `release:watch` fails (CI failure, publish failure), stop and report the failure clearly. Do not retry non-interactively — the user must intervene.
342
342
 
343
- **Above-appetite branch (per the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule)**: If push or release risk is above appetite (≥ 5/25), the skill MUST auto-apply scorer remediations incrementally until residual risk converges within appetite, OR halt the skill per the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule Rule 5 if the scorer cannot produce a convergent plan. **The skill MUST NOT release above appetite under any circumstance.** The skill MUST NOT call `request_user_input` as a shortcut out of the auto-apply loop.
343
+ **Above-appetite branch (per the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule)**: If push or release risk is above appetite (above the effective appetite used by the scorer and gate), the skill MUST auto-apply scorer remediations incrementally until residual risk converges within appetite, OR halt the skill per the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule Rule 5 if the scorer cannot produce a convergent plan. **The skill MUST NOT release above appetite under any circumstance.** The skill MUST NOT call `request_user_input` as a shortcut out of the auto-apply loop.
344
344
 
345
345
  **Auto-apply mechanism (the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule Rule 2):**
346
346
 
@@ -366,7 +366,7 @@ Otherwise, after the commit in step 14 lands, drain the release queue so the fix
366
366
  - **the "Add `manage-incident` Skill to `wr-itil` Plugin" architecture rule** (`docs/decisions/011-manage-incident-skill.proposed.md`) — incident lifecycle; evidence-first workflow; reversible-mitigation preference; Sev 4-5 lightweight path. Step 6's evidence-gate refactor (2026-04-28) extends the "Add `manage-incident` Skill to `wr-itil` Plugin" architecture rule's evidence-first rule with the documented `Record anyway` audit-trail bypass that mitigate-incident already used (cool-headed-commitment consistency across the two incident skills).
367
367
  - **the "Governance Skills Commit Their Own Completed Work" architecture rule** — governance skills commit their own work. Step 14 unchanged.
368
368
  - **the "On-Demand Assessment Skills for Governance Plugins" architecture rule** — release scorer delegation pattern. Step 15 unchanged.
369
- - **the "Inter-iteration release cadence for AFK loops" architecture rule** + **the "Governance skills auto-release when changesets are queued" architecture rule** — release cadence. Step 15 unchanged.
369
+ - **the "Inter-iteration release cadence for AFK loops" architecture rule** + **the "Reuse valid cumulative risk assessments across pipeline actions" architecture rule** — AFK release cadence and attended reuse of valid cumulative risk scores in Step 15.
370
370
  - **the "Agent output grounding — no fabricated quantitative estimates, cite + persist + uncertainty" architecture rule** — cost-source grounding. Step 6's audit-trail bypass note preserves grounding by capturing the user's justification at deviation time.
371
371
  - **the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule** — auto-apply scorer remediations. Step 15 above-appetite branch unchanged.
372
372
  - **the "Problem 071: Argument-based skill subcommands are not discoverable in Codex autocomplete" problem** — skill-split origin (slice 6 — manage-incident is the host with thin-router forwarders for `list`, `mitigate`, `restored`, `close`, `link`).
@@ -1158,23 +1158,23 @@ Commit the completed work per the "Governance Skills Commit Their Own Completed
1158
1158
  - Problem closed: `docs(problems): close P<NNN> <title>`
1159
1159
  - Review/re-rank: `docs(problems): review — re-rank priorities`
1160
1160
  - Fix implemented: `fix(<scope>): <description> (closes P<NNN>)` — include problem file changes (rename to `.verifying.md` + `## Fix Released` section) in the same commit per the "Problem lifecycle — add a Verification Pending status between Known Error and Closed" architecture rule
1161
- 5. If commit risk is above appetite: auto-apply scorer remediations per **the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule Rule 1** incrementally until residual commit risk is within appetite (≤ 4/25), OR halt per the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule Rule 5 if the scorer cannot converge. **The skill MUST NOT commit above appetite, and MUST NOT call `request_user_input` to ask whether to commit anyway** (the "Skills, agents, and hooks override RISK-POLICY appetite instead of applying it" problem/the ": Apply RISK-POLICY appetite faithfully across all surfaces" release design amendment 2026-06-24 — above-appetite is framework-mediated, never a category-3 one-time-override; same invariant the push/release branch at Step 12 already enforces). The "Structured User Interaction for Governance-Skill Decisions" architecture rule Rule 6 fail-safe (no `request_user_input` available / non-interactive → skip the commit and report the uncommitted state) remains the terminal fallback. This applies only to the risk-above-appetite branch, not to the delegation-unavailable case above.
1161
+ 5. If commit risk is above appetite: auto-apply scorer remediations per **the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule Rule 1** incrementally until residual commit risk is within appetite (at or below the effective appetite used by the scorer and gate), OR halt per the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule Rule 5 if the scorer cannot converge. **The skill MUST NOT commit above appetite, and MUST NOT call `request_user_input` to ask whether to commit anyway** (the "Skills, agents, and hooks override RISK-POLICY appetite instead of applying it" problem/the ": Apply RISK-POLICY appetite faithfully across all surfaces" release design amendment 2026-06-24 — above-appetite is framework-mediated, never a category-3 one-time-override; same invariant the push/release branch at Step 12 already enforces). The "Structured User Interaction for Governance-Skill Decisions" architecture rule Rule 6 fail-safe (no `request_user_input` available / non-interactive → skip the commit and report the uncommitted state) remains the terminal fallback. This applies only to the risk-above-appetite branch, not to the delegation-unavailable case above.
1162
1162
 
1163
1163
  **Multi-commit slice changeset discipline (the "AFK iter `packages/<plugin>/` commits without changesets — orchestrator-main-turn back-fill is fragile recovery, hook-level enforcement preferable" problem Phase 2)**: when a single logical fix lands across multiple the "Governance Skills Commit Their Own Completed Work" architecture rule-grain commits targeting the same plugin (e.g. helper extraction in commit 1, callers wired in commit 2, SKILL note + transition in commit 3 — all `packages/<plugin>/`), author ONE changeset on the first commit in the slice. Subsequent same-plugin commits do NOT need their own changeset — the `itil-changeset-discipline.sh` hook's Check 2b recognises any `.changeset/*.md` already in the unpushed slice scope (`origin/<base>..HEAD` + untracked + modified-not-staged) that targets `"@windyroad/<plugin>": <any-bump>` and allows. This eliminates the per-commit changeset ceremony that previously produced N redundant `.changeset/*.md` files for one logical release entry (changesets-action collapses bump-class at version-package time, so per-commit changesets rendered N near-identical CHANGELOG bullets for one release). Once a changeset hits `origin/<base>` (drained at release time), it no longer counts — a fresh changeset is required for the next slice. Cross-plugin coverage is NOT permitted: an `@windyroad/itil` changeset does not satisfy a `packages/voice-tone/` commit.
1164
1164
 
1165
- ### 12. Auto-release when changesets are queued (the "Governance skills auto-release when changesets are queued" architecture rule)
1165
+ ### 12. Auto-release when changesets are queued (the "Reuse valid cumulative risk assessments across pipeline actions" architecture rule)
1166
1166
 
1167
1167
  **Skip this step if the skill is running inside an AFK orchestrator** (e.g. `/wr-itil:work-problems`). Orchestrators handle release cadence themselves per the "Inter-iteration release cadence for AFK loops" architecture rule (Step 6.5). Detect via the presence of an orchestrator marker in the invoking prompt — look for phrases like "AFK", "work-problems", "batch-work", or the sentinel `ALL_DONE` convention. When in doubt, defer to the orchestrator by skipping this step.
1168
1168
 
1169
1169
  Otherwise, after the commit in step 11 lands, drain the release queue so the fix actually lands on npm without requiring manual user action.
1170
1170
 
1171
- **Mechanism — delegate, do not re-implement scoring (per the "On-Demand Assessment Skills for Governance Plugins" architecture rule):**
1171
+ **Mechanism — reuse a valid cumulative assessment; delegate when needed (the "Reuse valid cumulative risk assessments across pipeline actions" architecture rule, the "On-Demand Assessment Skills for Governance Plugins" architecture rule):**
1172
1172
 
1173
- 1. Invoke the release scorer. Two paths are valid:
1173
+ 1. Use the Step 11 pipeline assessment's separate `push` and `release` scores if it still covers this exact checkout, assessed content, unpushed and unreleased scope, and current effective appetite, and has not expired or drifted. A commit of identical assessed content does not require another scorer invocation. If any condition fails or cannot be established, invoke the scorer again before pushing or releasing. Two delegation paths are valid:
1174
1174
  - **Primary**: delegate to subagent type `wr-risk-scorer:pipeline` via the native Codex subagent tool.
1175
1175
  - **Fallback**: if that subagent type is not available, invoke skill `/wr-risk-scorer:assess-release` via the installed skill invocation. The skill wraps the same pipeline subagent.
1176
- 2. Read the returned `RISK_SCORES: commit=X push=Y release=Z` line.
1177
- 3. **Drain condition**: if `push` and `release` are both within appetite (≤ 4/25, "Low" band per `RISK-POLICY.md`), AND `.changeset/` is non-empty, proceed to the drain action. Otherwise, skip the drain and report the unreleased state.
1176
+ 2. Read `RISK_SCORES: commit=X push=Y release=Z` from the valid assessment. Never substitute the commit score for a push or release score. The action-time `push:watch` and `release:watch` gates still check the relevant score, checkout, state, expiry, appetite, and CI; if a gate rejects stale or changed evidence, resolve the checkout binding or rescore before retrying.
1177
+ 3. **Drain condition**: if `push` and `release` are both within appetite (at or below the effective appetite used by the scorer and gate), AND `.changeset/` is non-empty, proceed to the drain action. Otherwise, skip the drain and report the unreleased state.
1178
1178
 
1179
1179
  **Drain action (non-interactive, policy-authorised per the "Structured User Interaction for Governance-Skill Decisions" architecture rule Rule 6):**
1180
1180
 
@@ -1184,7 +1184,7 @@ Otherwise, after the commit in step 11 lands, drain the release queue so the fix
1184
1184
 
1185
1185
  **Failure handling**: If `release:watch` fails (CI failure, publish failure), stop and report the failure clearly. Do not retry non-interactively — the user must intervene.
1186
1186
 
1187
- **Above-appetite branch (per the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule)**: If push or release risk is above appetite (≥ 5/25), the skill MUST auto-apply scorer remediations incrementally until residual risk converges within appetite, OR halt the skill per the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule Rule 5 if the scorer cannot produce a convergent plan. **The skill MUST NOT release above appetite under any circumstance.** The skill MUST NOT call `request_user_input` as a shortcut out of the auto-apply loop.
1187
+ **Above-appetite branch (per the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule)**: If push or release risk is above appetite (above the effective appetite used by the scorer and gate), the skill MUST auto-apply scorer remediations incrementally until residual risk converges within appetite, OR halt the skill per the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule Rule 5 if the scorer cannot produce a convergent plan. **The skill MUST NOT release above appetite under any circumstance.** The skill MUST NOT call `request_user_input` as a shortcut out of the auto-apply loop.
1188
1188
 
1189
1189
  **Auto-apply mechanism (the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule Rule 2):**
1190
1190
 
@@ -1207,7 +1207,7 @@ Otherwise, after the commit in step 11 lands, drain the release queue so the fix
1207
1207
  - The final `RISK_SCORES:` line
1208
1208
  - An "Auto-apply trail" subsection listing each remediation attempted with outcome
1209
1209
  - Any Verification Pending ticket IDs implicated per Rule 2b
1210
- - A one-line scorer-gap note (e.g., "available remediations did not reduce residual risk below 5/25 — extend scorer vocabulary per the "Scorer `RISK_REMEDIATIONS:` block is free-form prose — agent must parse descriptions to decide what to do" problem")
1210
+ - A one-line scorer-gap note (e.g., "available remediations did not reduce residual risk to within the effective appetite — extend scorer vocabulary per the "Scorer `RISK_REMEDIATIONS:` block is free-form prose — agent must parse descriptions to decide what to do" problem")
1211
1211
 
1212
1212
  The user resolves interactively — typical resolutions include splitting the commit, feature-flagging the change, or opening a problem ticket documenting the scorer gap.
1213
1213
 
@@ -193,7 +193,7 @@ Otherwise, after the commit in step 8 lands, drain the release queue so the fix
193
193
  - **Primary**: delegate to subagent type `wr-risk-scorer:pipeline` via the native Codex subagent tool.
194
194
  - **Fallback**: if that subagent type is not available, invoke skill `/wr-risk-scorer:assess-release` via the installed skill invocation.
195
195
  2. Read the returned `RISK_SCORES: commit=X push=Y release=Z` line.
196
- 3. **Drain condition**: if `push` and `release` are both within appetite (≤ 4/25, "Low" band per `RISK-POLICY.md`), AND `.changeset/` is non-empty, proceed to the drain action. Otherwise, skip the drain and report the unreleased state.
196
+ 3. **Drain condition**: if `push` and `release` are both within appetite (at or below the effective appetite used by the scorer and gate), AND `.changeset/` is non-empty, proceed to the drain action. Otherwise, skip the drain and report the unreleased state.
197
197
 
198
198
  **Drain action (non-interactive, policy-authorised per the "Structured User Interaction for Governance-Skill Decisions" architecture rule Rule 6):**
199
199
 
@@ -171,7 +171,7 @@ Otherwise, after the commit in step 8 lands, drain the release queue so the fix
171
171
  - **Primary**: delegate to subagent type `wr-risk-scorer:pipeline` via the native Codex subagent tool.
172
172
  - **Fallback**: if that subagent type is not available, invoke skill `/wr-risk-scorer:assess-release` via the installed skill invocation.
173
173
  2. Read the returned `RISK_SCORES: commit=X push=Y release=Z` line.
174
- 3. **Drain condition**: if `push` and `release` are both within appetite (≤ 4/25, "Low" band per `RISK-POLICY.md`), AND `.changeset/` is non-empty, proceed to the drain action. Otherwise, skip the drain and report the unreleased state.
174
+ 3. **Drain condition**: if `push` and `release` are both within appetite (at or below the effective appetite used by the scorer and gate), AND `.changeset/` is non-empty, proceed to the drain action. Otherwise, skip the drain and report the unreleased state.
175
175
 
176
176
  **Drain action (non-interactive, policy-authorised per the "Structured User Interaction for Governance-Skill Decisions" architecture rule Rule 6):**
177
177
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: 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 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)."
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 on PASS, queues unresolved FAIL verdicts. 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, request_user_input, Skill, Agent
5
5
  ---
6
6
 
@@ -34,7 +34,7 @@ allowed-tools: Read, Write, Edit, Bash, Glob, Grep, request_user_input, Skill, A
34
34
 
35
35
  # Update Upstream — Lifecycle-Update Skill
36
36
 
37
- 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.
37
+ 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, closes only issue targets on Verifying → Closed, and queues an `outstanding_questions` entry when either gate still FAILS after risk reduction.
38
38
 
39
39
  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.
40
40
 
@@ -60,8 +60,8 @@ The single-ticket form is typically invoked from `/wr-itil:transition-problem` S
60
60
  - Determine the local ticket's current Status from the filename suffix.
61
61
  - Draft a transition-specific lifecycle-update comment per the templates below (Open→KE / KE→Verifying / Verifying→Closed).
62
62
  - Compose the drafted prose through `wr-risk-scorer:external-comms` + `wr-voice-tone:external-comms` gates.
63
- - 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).
64
- - Above appetite → request_user_input (interactive) / queue `outstanding_questions` (AFK, per the "AFK iter default when a skill needs to ask a question and request_user_input is unavailable — should queue the question and move to the next iteration (not halt, not silently skip)" problem queue-and-continue).
63
+ - Both gates PASS → 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).
64
+ - Gate FAIL → request_user_input (interactive) / queue `outstanding_questions` (AFK, per the "AFK iter default when a skill needs to ask a question and request_user_input is unavailable — should queue the question and move to the next iteration (not halt, not silently skip)" problem queue-and-continue).
65
65
  - 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.
66
66
  - **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).
67
67
 
@@ -116,7 +116,7 @@ For each `- **URL**: <url>` line under `## Reported Upstream`, extract:
116
116
 
117
117
  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).
118
118
 
119
- 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.
119
+ 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 failed gate queues only that entry, the rest proceed.
120
120
 
121
121
  ### 3. Determine the transition that fired this invocation
122
122
 
@@ -234,33 +234,36 @@ Score the drafted comment body via the `wr-risk-scorer:external-comms` agent (sh
234
234
  The agent returns a structured verdict:
235
235
 
236
236
  ```
237
- EXTERNAL_COMMS_RISK_VERDICT
238
- band: Low (<=4/25) | Medium (5..16) | High (17+)
239
- score: <0..25>
240
- pass: true | false
241
- reason: <one-line rationale>
237
+ EXTERNAL_COMMS_RISK_VERDICT: PASS
242
238
  ```
243
239
 
244
- - **`pass: true` AND band ≤ Low (4/25)**: within appetite per RISK-POLICY.md commit-layer. Proceed to 5b (voice-tone).
245
- - **`pass: false` OR band > Low**: above appetite. Branch to 5c (above-appetite handling).
240
+ Or, on failure:
241
+
242
+ ```
243
+ EXTERNAL_COMMS_RISK_VERDICT: FAIL
244
+ EXTERNAL_COMMS_RISK_REASON: <one-line rationale>
245
+ ```
246
+
247
+ - **PASS**: proceed to 5b (voice-tone).
248
+ - **FAIL**: branch to 5c (gate-failure handling).
246
249
 
247
250
  #### 5b. Voice-tone gate
248
251
 
249
252
  `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.
250
253
 
251
- A FAIL verdict on the voice-tone gate is treated identically to an above-appetite risk verdict — branch to 5c.
254
+ A FAIL verdict on the voice-tone gate also branches to 5c.
252
255
 
253
- #### 5c. Above-appetite handling
256
+ #### 5c. Gate-failure handling
254
257
 
255
- 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 `request_user_input` for the GATE FIRING — the gate scoring is itself the framework. The above-appetite handling differs by orchestrator context:
258
+ 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 `request_user_input` for the GATE FIRING — the gate verdict is itself the framework. The failure handling differs by orchestrator context:
256
259
 
257
260
  - **Interactive context** (per the "Structured User Interaction for Governance-Skill Decisions" architecture rule Rule 1): use `request_user_input` to surface the drafted comment + the gate verdict + the matched URL, with options:
258
261
  - `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.
259
- - `Risk-reduce and re-score` — invoke a tighter draft (shorter / fewer claims / stricter source-citation) and re-run the gate.
262
+ - `Risk-reduce and re-review` — invoke a tighter draft (shorter / fewer claims / stricter source-citation) and re-run the gate.
260
263
  - `Queue for later review` — save the draft to `## Queued Upstream Update` on the local ticket; user acts on return.
261
264
  - `Skip this update` — exit no-op for this upstream entry; the next transition's invocation re-considers.
262
265
 
263
- - **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 request_user_input 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 request_user_input 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.
266
+ - **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 request_user_input 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-review** first — re-draft the comment with tighter source-citation + shorter prose, then re-invoke the external-comms gate. If the new verdict is PASS, 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 FAIL reason + the risk-reduce attempts taken. **The orchestrator continues per the "AFK iter default when a skill needs to ask a question and request_user_input is unavailable — should queue the question and move to the next iteration (not halt, not silently skip)" problem** — do NOT halt the loop on a failed upstream update gate.
264
267
 
265
268
  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 `request_user_input` 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.
266
269
 
@@ -272,8 +275,8 @@ The silent risk-reduce step is **mechanical** per the "— Decision-Delegation C
272
275
  - **Drafted**: <YYYY-MM-DD>
273
276
  - **Transition**: Open → Known Error | Known Error → Verification Pending | Verification Pending → Closed
274
277
  - **Target URL**: <upstream-issue-url>
275
- - **Halt reason**: above-appetite external-comms gate (band: <verdict band>; score: <verdict score>; reason: <verdict reason>) | above-appetite voice-tone gate (reason: <verdict reason>)
276
- - **Risk-reduce attempts**: <count, e.g. "1 — tighter source-citation; re-scored band Medium">
278
+ - **Halt reason**: external-comms gate FAIL (reason: <EXTERNAL_COMMS_RISK_REASON>) | voice-tone gate FAIL (reason: <verdict reason>)
279
+ - **Risk-reduce attempts**: <count, e.g. "1 — tighter source-citation; re-reviewed FAIL">
277
280
  - **Drafted comment body**:
278
281
 
279
282
  <the body that would have been posted as a `gh issue comment`, ready for manual review>
@@ -323,9 +326,9 @@ Append a log entry to the local ticket's `## Upstream Lifecycle Updates` section
323
326
 
324
327
  - **<YYYY-MM-DD>** — Open → Known Error
325
328
  - **Target URL**: <upstream-issue-url>
326
- - **Comment URL**: <posted-comment-url> (or "queued — see ## Queued Upstream Update" when above-appetite)
327
- - **Disclosure path**: posted-comment | posted-pr-comment (pull-request target — never closed) | posted-comment-and-closed (confirmed Verifying → Closed, issue targets only) | posted-comment-local-close-only (outbound evidence-authorised close) | queued-above-appetite | closed-already-upstream | skipped-out-of-band
328
- - **Gate verdict**: external-comms <band/score> + voice-tone <pass|fail>
329
+ - **Comment URL**: <posted-comment-url> (or "queued — see ## Queued Upstream Update" when a gate fails)
330
+ - **Disclosure path**: posted-comment | posted-pr-comment (pull-request target — never closed) | posted-comment-and-closed (confirmed Verifying → Closed, issue targets only) | posted-comment-local-close-only (outbound evidence-authorised close) | queued-gate-failure | closed-already-upstream | skipped-out-of-band
331
+ - **Gate verdict**: external-comms <PASS|FAIL> + voice-tone <PASS|FAIL>
329
332
 
330
333
  - **<YYYY-MM-DD>** — Known Error → Verification Pending
331
334
  - ... (next entry appends; never replaces earlier entries)
@@ -505,7 +508,7 @@ Route the GENERATED comment through the reporter-facing gate chain — **cogniti
505
508
 
506
509
  **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.
507
510
 
508
- 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 request_user_input 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:
511
+ Gate-failure handling is identical to Step 5c (silent risk-reduce + re-review; if still FAIL, 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 request_user_input is unavailable — should queue the question and move to the next iteration (not halt, not silently skip)" problem — do NOT halt). When both gates PASS, post on our own repo:
509
512
 
510
513
  ```bash
511
514
  gh issue comment "${NN}" --repo "${OWN_OWNER_REPO}" --body "${INBOUND_BODY}"
@@ -528,16 +531,16 @@ Append to the same `## Upstream Lifecycle Updates` log (Step 6 shape), tagged fo
528
531
  ```markdown
529
532
  - **<YYYY-MM-DD>** — Known Error → Verification Pending (inbound)
530
533
  - **Target**: inbound #<NN> (own repo <OWN_OWNER_REPO>)
531
- - **Comment URL**: <posted-comment-url> (or "skipped — already-posted-inbound" when the idempotency guard matched, or "queued — see ## Queued Upstream Update" when above-appetite)
532
- - **Disclosure path**: posted-inbound-comment | posted-inbound-comment-and-closed (proven owned issue, confirmed or evidence-authorised close) | already-posted-inbound | queued-above-appetite | closed-already | inbound-channel-unresolved
533
- - **Gate verdict**: external-comms <band/score> + voice-tone <pass|fail>
534
+ - **Comment URL**: <posted-comment-url> (or "skipped — already-posted-inbound" when the idempotency guard matched, or "queued — see ## Queued Upstream Update" when a gate fails)
535
+ - **Disclosure path**: posted-inbound-comment | posted-inbound-comment-and-closed (proven owned issue, confirmed or evidence-authorised close) | already-posted-inbound | queued-gate-failure | closed-already | inbound-channel-unresolved
536
+ - **Gate verdict**: external-comms <PASS|FAIL> + voice-tone <PASS|FAIL>
534
537
  ```
535
538
 
536
539
  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.
537
540
 
538
541
  #### I7. Both-direction tickets
539
542
 
540
- 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.
543
+ 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 failed gate queues only its own leg; the other proceeds.
541
544
 
542
545
  ### 7. Commit per the "Governance Skills Commit Their Own Completed Work" architecture rule
543
546
 
@@ -589,10 +592,10 @@ The append-only log (written by Step 6 on every post) is the source of truth —
589
592
  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:
590
593
 
591
594
  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`.
592
- 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 request_user_input 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.
593
- 3. Post within appetite (Step 5b final) and back-write the `## Upstream Lifecycle Updates` log (Step 6).
595
+ 2. Compose through the external-comms + voice-tone gates (Step 5) — **identical** dual-gate composition as the per-ticket path. Gate-failure handling (Step 5c) is unchanged: silent risk-reduce + re-review, 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 request_user_input is unavailable — should queue the question and move to the next iteration (not halt, not silently skip)" problem if still FAIL. Catchup does NOT bypass the gates.
596
+ 3. Post after both gates PASS (Step 5b final) and back-write the `## Upstream Lifecycle Updates` log (Step 6).
594
597
 
595
- 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).
598
+ Process entries one at a time so a single failed gate queues only its own entry; 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).
596
599
 
597
600
  ### C4. Commit per the "Governance Skills Commit Their Own Completed Work" architecture rule
598
601
 
@@ -604,15 +607,15 @@ The live-upstream end-to-end confirmation (the "Problem 080: No bidirectional up
604
607
 
605
608
  ## AFK behaviour summary
606
609
 
607
- 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 request_user_input 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.
610
+ 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. PASS proceeds; FAIL silently risk-reduces + re-reviews; an unresolved FAIL queues per the "AFK iter default when a skill needs to ask a question and request_user_input 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.
608
611
 
609
612
  | Branch | AFK behaviour | Authority |
610
613
  |---|---|---|
611
- | 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 |
612
- | 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) |
613
- | 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 request_user_input 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 request_user_input is unavailable — should queue the question and move to the next iteration (not halt, not silently skip)" problem |
614
+ | Both gates PASS (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 |
615
+ | Gate FAIL — silent risk-reduce yields PASS | Re-draft with tighter source-citation + shorter prose; re-invoke `wr-risk-scorer:external-comms`. On PASS → post through the voice-tone gate. | 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) |
616
+ | Gate FAIL — silent risk-reduce still FAILS | 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 request_user_input 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 request_user_input is unavailable — should queue the question and move to the next iteration (not halt, not silently skip)" problem |
614
617
  | Above-appetite commit (Step 7) | Skip the commit, report uncommitted state. | the "Structured User Interaction for Governance-Skill Decisions" architecture rule Rule 6 |
615
- | **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 request_user_input is unavailable — should queue the question and move to the next iteration (not halt, not silently skip)" problem |
618
+ | **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. Failed gates queue 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 request_user_input is unavailable — should queue the question and move to the next iteration (not halt, not silently skip)" problem |
616
619
 
617
620
  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 request_user_input 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.
618
621