@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.
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/package.json +1 -1
- package/skills/close-incident/SKILL.md +1 -1
- package/skills/link-incident/SKILL.md +1 -1
- package/skills/manage-incident/SKILL.md +7 -7
- package/skills/manage-problem/SKILL.md +8 -8
- package/skills/mitigate-incident/SKILL.md +1 -1
- package/skills/restore-incident/SKILL.md +1 -1
- package/skills/update-upstream/SKILL.md +38 -35
- package/skills/work-problems/SKILL.md +10 -9
- package/skills-codex/close-incident/SKILL.md +1 -1
- package/skills-codex/link-incident/SKILL.md +1 -1
- package/skills-codex/manage-incident/SKILL.md +7 -7
- package/skills-codex/manage-problem/SKILL.md +8 -8
- package/skills-codex/mitigate-incident/SKILL.md +1 -1
- package/skills-codex/restore-incident/SKILL.md +1 -1
- package/skills-codex/update-upstream/SKILL.md +38 -35
package/package.json
CHANGED
|
@@ -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 (
|
|
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 (
|
|
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 "
|
|
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 —
|
|
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.
|
|
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
|
|
322
|
-
3. **Drain condition**: if `push` and `release` are both within appetite (
|
|
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 (
|
|
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 "
|
|
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 (
|
|
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 "
|
|
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 —
|
|
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.
|
|
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
|
|
1166
|
-
3. **Drain condition**: if `push` and `release` are both within appetite (
|
|
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 (
|
|
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
|
|
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 (
|
|
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 (
|
|
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
|
|
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
|
|
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
|
-
-
|
|
53
|
-
-
|
|
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
|
|
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
|
-
|
|
234
|
-
|
|
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
|
|
243
|
+
A FAIL verdict on the voice-tone gate also branches to 5c.
|
|
241
244
|
|
|
242
|
-
#### 5c.
|
|
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
|
|
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-
|
|
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-
|
|
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**:
|
|
265
|
-
- **Risk-reduce attempts**: <count, e.g. "1 — tighter source-citation; re-
|
|
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
|
|
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-
|
|
317
|
-
- **Gate verdict**: external-comms <
|
|
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
|
-
|
|
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
|
|
521
|
-
- **Disclosure path**: posted-inbound-comment | posted-inbound-comment-and-closed (proven owned issue, confirmed or evidence-authorised close) | already-posted-inbound | queued-
|
|
522
|
-
- **Gate verdict**: external-comms <
|
|
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
|
|
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.
|
|
582
|
-
3. Post
|
|
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
|
|
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.
|
|
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
|
-
|
|
|
601
|
-
|
|
|
602
|
-
|
|
|
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.
|
|
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
|
-
-
|
|
990
|
-
- **
|
|
991
|
-
- **Within appetite (≤
|
|
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
|
|
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 (≤
|
|
1090
|
-
- **Re-score still above appetite (
|
|
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 (≤
|
|
1163
|
-
| Pipeline risk within appetite (≤
|
|
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
|
|
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 (
|
|
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 (
|
|
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 "
|
|
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 —
|
|
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.
|
|
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
|
|
333
|
-
3. **Drain condition**: if `push` and `release` are both within appetite (
|
|
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 (
|
|
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 "
|
|
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 (
|
|
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 "
|
|
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 —
|
|
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.
|
|
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
|
|
1177
|
-
3. **Drain condition**: if `push` and `release` are both within appetite (
|
|
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 (
|
|
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
|
|
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 (
|
|
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 (
|
|
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
|
|
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
|
|
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
|
-
-
|
|
64
|
-
-
|
|
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
|
|
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
|
-
|
|
245
|
-
|
|
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
|
|
254
|
+
A FAIL verdict on the voice-tone gate also branches to 5c.
|
|
252
255
|
|
|
253
|
-
#### 5c.
|
|
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
|
|
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-
|
|
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-
|
|
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**:
|
|
276
|
-
- **Risk-reduce attempts**: <count, e.g. "1 — tighter source-citation; re-
|
|
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
|
|
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-
|
|
328
|
-
- **Gate verdict**: external-comms <
|
|
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
|
-
|
|
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
|
|
532
|
-
- **Disclosure path**: posted-inbound-comment | posted-inbound-comment-and-closed (proven owned issue, confirmed or evidence-authorised close) | already-posted-inbound | queued-
|
|
533
|
-
- **Gate verdict**: external-comms <
|
|
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
|
|
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.
|
|
593
|
-
3. Post
|
|
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
|
|
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.
|
|
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
|
-
|
|
|
612
|
-
|
|
|
613
|
-
|
|
|
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.
|
|
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
|
|