os-sdlc: blast-radius agent for any planned change; os-backlog: critique + loop-back step in ticket-decompose before ready-for-agent #647

Closed
opened 2026-09-23 17:00:32 +00:00 by jared · 4 comments
Owner

Problem

Plans reach the os-sdlc pipeline with gaps: missed consumers, tests that pin the old behavior, other repos, ADRs that conflict. The gaps surface at behavior-verifier or never. A push-back at that point costs a full pipeline run.

In session d1aa78d1 (2026-09-23) two hand-dispatched read-only agents mapped the blast radius of the draft plans for #643 and #645. Both drafts changed before filing:

Finding Effect
cc-plugins renderer target has no directory matching its name; no name-to-path object exists #645 changed from "derive from target name" to "explicit root key"
Test#covering (plugins/os-sdlc/lib/os_sdlc/model/project/test.rb:14-18) mirrors after stripping code_path; root-only strip breaks it named risk in #645
two independent literal "Cases" parsers: os-backlog ticket_body_checker.rb:70-74, os-sdlc ticket_shape.rb:6 lockstep requirement in #643
13 open tickets use ## Cases; bodies are snapshotted at open (ADR-0146) migration question in #643

Nothing in either plugin offers this check today. It only happened because the user asked for it by hand.

Approach

Two parts. Each lives in the plugin whose domain it is.

1. os-sdlc:blast-radius agent (os-sdlc)

A read-only agent that takes any described change and reports what it touches. It lives in os-sdlc because it inspects the codebase and preloads the os-sdlc probing skills. It is not tied to tickets: the input may be a ticket Approach, one part of a ticket, an ad hoc plan, or a one-line idea ("I think we should do X").

Frontmatter sketch (description names the trigger and the payoff, not the mechanism):

---
description: Use before committing to any code change, ticket or ad hoc, when the question is "what does this break?" -- returns the consumers, pinning tests, other repos, and ADRs the change touches, plus the three conditions that would make the plan wrong.
tools: Read, Glob, Grep, Bash
skills: [os-sdlc:blast-radius, os-sdlc:code-probe, os-sdlc:lsp-navigate]
model: sonnet
---

Dispatch rules:

  • The user may ask for it directly: "check the blast radius of X."
  • The main agent may dispatch it on its own whenever a plan is about to be acted on and the impact is not already known. It should not wait to be asked.
  • The brief carries the planned change (3-5 lines) and known facts marked "do not re-verify".

Fixed report shape (proven in d1aa78d1):

  1. Code consumers: path:line | symbol | role | break risk
  2. Prose consumers: charters, skills, templates, maps, hooks
  3. Tests that pin current behavior
  4. Data and other repos: open tickets in the old shape, DB snapshots, other projects' .sdlc/project.yaml under /home/jared/dev
  5. ADRs to supersede or amend
  6. Three highest risks and the conditions that make the plan wrong

Required work:

  • Skill plugins/os-sdlc/skills/blast-radius/SKILL.md: the method. Inputs (change, do-not-re-verify facts), probes (evidence CLI, lsp-probe, ast-grep, grep for prose/YAML/maps, other repos under /home/jared/dev), and the six-section report. Modeled on the two dispatch prompts in transcript d1aa78d1 (search "blast radius").
  • Charter at plugins/os-sdlc/agents/blast-radius.md that preloads the skill and prints the report as its final output. No runner handoff.
  • os-sdlc:change-auditor preloads the same skill and gains a step 5, Radius, that emits CONSUMER:, PINS:, and ADR: items into its existing handoff. Downstream roles already receive that handoff through enrich; no map change.
  • The change-auditor is not made directly callable. Its input, Align step, and runner handoff assume a dispatched ticket; a second charter answering "what does this break?" would loosen the pipeline contract.
  • bin/refresh-plugins after the charters land; new agent types need a session restart.

2. Critique step in /os-backlog:ticket-decompose (os-backlog)

After the draft exists and before the ready-for-agent label, the skill dispatches os-sdlc:blast-radius on the draft Approach, then compares draft against report:

  • every consumer is covered by an Approach required-work item
  • every pinning test appears in ## Retired tests
  • every ADR to change is named in Approach
  • migration is stated when data or open tickets carry the old shape

The step updates the draft and shows the user the diff.

Loop-back: when the report changes the approach itself, not only its required-work list, the skill re-enters at Decide and reruns the skeptic gate on the revised draft. One loop-back only; a second change goes to the user as a question.

Cross-plugin dispatch has precedent: ticket-decompose already dispatches os-sdlc:code-probe (SKILL.md:20). ADR-0023 composes plugins by invoking each other's skills.

Required work:

  • New phase in plugins/os-backlog/skills/ticket-decompose/SKILL.md between Decompose and Report.
  • Loop-back rule to Decide with a one-loop cap.
  • Not on every capture: cost is roughly 60,000-80,000 subagent tokens per run and many captures are never built. Optional at capture time for code-shaped tickets.

Acceptance criteria

  • A user can say "check the blast radius of " in an os-sdlc project and get the six-section report without naming a ticket.
  • The main agent dispatches the agent unprompted before acting on a plan whose impact is unknown (charter and session-start guidance say so).
  • os-sdlc:change-auditor handoffs carry CONSUMER:, PINS:, and ADR: items produced by the shared skill.
  • /os-backlog:ticket-decompose on a code ticket runs the critique step before applying ready-for-agent, and the draft diff shows consumer, test, and ADR coverage.
  • When the report changes the approach, decompose re-enters Decide and reruns the skeptic once.

Rejected alternatives

  • Folding the check into change-auditor as a callable mode: its input, Align step, and runner handoff all assume a dispatched ticket. Shared skill instead.
  • One blast-radius agent per plugin: same probes, same report, only the brief differs. Two charters to maintain, and the os-backlog copy could not preload os-sdlc skills without an unproven cross-plugin preload.
  • Running at every capture: pays the cost on tickets that are never built.
  • Running only at pipeline start via change-auditor: too late for cheap human push-back.
  • Sharing one skill across plugins by marketplace symlink: documented, but not needed while the agent lives in os-sdlc. Revisit only if cross-plugin dispatch becomes a pain point.

Dependency

#643 is closed; the critique step fits the ticket model it shipped (Problem, Approach with required work, Acceptance criteria, Owner sketch). Related: #645, #646, #644.

Origin

  • Trigger: user request mid-session after two blast-radius agent runs changed draft tickets #643 and #645; rewritten 2026-09-24 in session 5d191346 after an ownership discussion.
  • Chain: late-caught plan gaps <- no pre-decompose consumer/test/ADR check <- DESIGN (no such check exists today)
  • Root candidate: this ticket
  • Where: plugins/os-sdlc agents (agent); plugins/os-backlog skill ticket-decompose (critique step)
  • Session: d1aa78d1-c840-471e-bdd0-2be657c7d950
  • Transcript: /home/jared/.claude/projects/-home-jared-dev-cc-os/d1aa78d1-c840-471e-bdd0-2be657c7d950.jsonl

Implementer: read the transcript above and search it for "blast radius" for the two original dispatch prompts and their exact findings. They are the charter's model.

## Problem Plans reach the os-sdlc pipeline with gaps: missed consumers, tests that pin the old behavior, other repos, ADRs that conflict. The gaps surface at behavior-verifier or never. A push-back at that point costs a full pipeline run. In session d1aa78d1 (2026-09-23) two hand-dispatched read-only agents mapped the blast radius of the draft plans for #643 and #645. Both drafts changed before filing: | Finding | Effect | | --- | --- | | cc-plugins `renderer` target has no directory matching its name; no name-to-path object exists | #645 changed from "derive from target name" to "explicit root key" | | `Test#covering` (plugins/os-sdlc/lib/os_sdlc/model/project/test.rb:14-18) mirrors after stripping code_path; root-only strip breaks it | named risk in #645 | | two independent literal "Cases" parsers: os-backlog ticket_body_checker.rb:70-74, os-sdlc ticket_shape.rb:6 | lockstep requirement in #643 | | 13 open tickets use `## Cases`; bodies are snapshotted at open (ADR-0146) | migration question in #643 | Nothing in either plugin offers this check today. It only happened because the user asked for it by hand. ## Approach Two parts. Each lives in the plugin whose domain it is. ### 1. `os-sdlc:blast-radius` agent (os-sdlc) A read-only agent that takes any described change and reports what it touches. It lives in os-sdlc because it inspects the codebase and preloads the os-sdlc probing skills. It is not tied to tickets: the input may be a ticket Approach, one part of a ticket, an ad hoc plan, or a one-line idea ("I think we should do X"). Frontmatter sketch (description names the trigger and the payoff, not the mechanism): ```yaml --- description: Use before committing to any code change, ticket or ad hoc, when the question is "what does this break?" -- returns the consumers, pinning tests, other repos, and ADRs the change touches, plus the three conditions that would make the plan wrong. tools: Read, Glob, Grep, Bash skills: [os-sdlc:blast-radius, os-sdlc:code-probe, os-sdlc:lsp-navigate] model: sonnet --- ``` Dispatch rules: - The user may ask for it directly: "check the blast radius of X." - The main agent may dispatch it on its own whenever a plan is about to be acted on and the impact is not already known. It should not wait to be asked. - The brief carries the planned change (3-5 lines) and known facts marked "do not re-verify". Fixed report shape (proven in d1aa78d1): 1. Code consumers: path:line | symbol | role | break risk 2. Prose consumers: charters, skills, templates, maps, hooks 3. Tests that pin current behavior 4. Data and other repos: open tickets in the old shape, DB snapshots, other projects' `.sdlc/project.yaml` under /home/jared/dev 5. ADRs to supersede or amend 6. Three highest risks and the conditions that make the plan wrong Required work: - Skill `plugins/os-sdlc/skills/blast-radius/SKILL.md`: the method. Inputs (change, do-not-re-verify facts), probes (evidence CLI, lsp-probe, ast-grep, grep for prose/YAML/maps, other repos under /home/jared/dev), and the six-section report. Modeled on the two dispatch prompts in transcript d1aa78d1 (search "blast radius"). - Charter at `plugins/os-sdlc/agents/blast-radius.md` that preloads the skill and prints the report as its final output. No runner handoff. - `os-sdlc:change-auditor` preloads the same skill and gains a step 5, Radius, that emits `CONSUMER:`, `PINS:`, and `ADR:` items into its existing handoff. Downstream roles already receive that handoff through `enrich`; no map change. - The change-auditor is not made directly callable. Its input, Align step, and runner handoff assume a dispatched ticket; a second charter answering "what does this break?" would loosen the pipeline contract. - `bin/refresh-plugins` after the charters land; new agent types need a session restart. ### 2. Critique step in `/os-backlog:ticket-decompose` (os-backlog) After the draft exists and before the `ready-for-agent` label, the skill dispatches `os-sdlc:blast-radius` on the draft Approach, then compares draft against report: - every consumer is covered by an Approach required-work item - every pinning test appears in `## Retired tests` - every ADR to change is named in Approach - migration is stated when data or open tickets carry the old shape The step updates the draft and shows the user the diff. Loop-back: when the report changes the approach itself, not only its required-work list, the skill re-enters at Decide and reruns the skeptic gate on the revised draft. One loop-back only; a second change goes to the user as a question. Cross-plugin dispatch has precedent: ticket-decompose already dispatches `os-sdlc:code-probe` (SKILL.md:20). ADR-0023 composes plugins by invoking each other's skills. Required work: - New phase in plugins/os-backlog/skills/ticket-decompose/SKILL.md between Decompose and Report. - Loop-back rule to Decide with a one-loop cap. - Not on every capture: cost is roughly 60,000-80,000 subagent tokens per run and many captures are never built. Optional at capture time for code-shaped tickets. ## Acceptance criteria - A user can say "check the blast radius of <any change>" in an os-sdlc project and get the six-section report without naming a ticket. - The main agent dispatches the agent unprompted before acting on a plan whose impact is unknown (charter and session-start guidance say so). - `os-sdlc:change-auditor` handoffs carry `CONSUMER:`, `PINS:`, and `ADR:` items produced by the shared skill. - `/os-backlog:ticket-decompose` on a code ticket runs the critique step before applying `ready-for-agent`, and the draft diff shows consumer, test, and ADR coverage. - When the report changes the approach, decompose re-enters Decide and reruns the skeptic once. ## Rejected alternatives - Folding the check into change-auditor as a callable mode: its input, Align step, and runner handoff all assume a dispatched ticket. Shared skill instead. - One blast-radius agent per plugin: same probes, same report, only the brief differs. Two charters to maintain, and the os-backlog copy could not preload os-sdlc skills without an unproven cross-plugin preload. - Running at every capture: pays the cost on tickets that are never built. - Running only at pipeline start via change-auditor: too late for cheap human push-back. - Sharing one skill across plugins by marketplace symlink: documented, but not needed while the agent lives in os-sdlc. Revisit only if cross-plugin dispatch becomes a pain point. ## Dependency #643 is closed; the critique step fits the ticket model it shipped (Problem, Approach with required work, Acceptance criteria, Owner sketch). Related: #645, #646, #644. ## Origin - Trigger: user request mid-session after two blast-radius agent runs changed draft tickets #643 and #645; rewritten 2026-09-24 in session 5d191346 after an ownership discussion. - Chain: late-caught plan gaps <- no pre-decompose consumer/test/ADR check <- DESIGN (no such check exists today) - Root candidate: this ticket - Where: plugins/os-sdlc agents (agent); plugins/os-backlog skill ticket-decompose (critique step) - Session: d1aa78d1-c840-471e-bdd0-2be657c7d950 - Transcript: /home/jared/.claude/projects/-home-jared-dev-cc-os/d1aa78d1-c840-471e-bdd0-2be657c7d950.jsonl Implementer: read the transcript above and search it for "blast radius" for the two original dispatch prompts and their exact findings. They are the charter's model.
jared changed title from os-backlog: blast-radius agent + draft critique step before a ticket becomes ready-for-agent to os-sdlc: blast-radius agent for any planned change; os-backlog: critique + loop-back step in ticket-decompose before ready-for-agent 2026-09-24 18:03:43 +00:00
Author
Owner

Body and title rewritten 2026-09-24 (session 5d191346). Changes: agent moves to os-sdlc and accepts any change, not only a ticket Approach; main agent may dispatch it unprompted; critique step stays in os-backlog with a one-loop re-entry to Decide; per-plugin agent split and skill-sharing symlink rejected. Still blocked by #643.

Body and title rewritten 2026-09-24 (session 5d191346). Changes: agent moves to os-sdlc and accepts any change, not only a ticket Approach; main agent may dispatch it unprompted; critique step stays in os-backlog with a one-loop re-entry to Decide; per-plugin agent split and skill-sharing symlink rejected. Still blocked by #643.
Author
Owner

Update 2026-09-24: #643 is closed, dependency cleared. Decision on change-auditor: not merged. A shared os-sdlc:blast-radius skill holds the method and is preloaded into both a standalone blast-radius agent (prints the report) and change-auditor (new step 5 Radius emits CONSUMER/PINS/ADR items into its handoff). Description no longer says read-only.

Update 2026-09-24: #643 is closed, dependency cleared. Decision on change-auditor: not merged. A shared os-sdlc:blast-radius skill holds the method and is preloaded into both a standalone blast-radius agent (prints the report) and change-auditor (new step 5 Radius emits CONSUMER/PINS/ADR items into its handoff). Description no longer says read-only.
Author
Owner

Work started 2026-09-24 on main (session 5d191346): blast-radius skill + agent in os-sdlc, Radius step in change-auditor, Blast radius phase in ticket-decompose.

Work started 2026-09-24 on main (session 5d191346): blast-radius skill + agent in os-sdlc, Radius step in change-auditor, Blast radius phase in ticket-decompose.
Author
Owner

Resolution

Done: Shipped on main 03a877cf + 39909efb (ADR-0212). skills/blast-radius/SKILL.md (non-invocable method, six-section report) preloaded into new agents/blast-radius.md (prints the report, no handoff) and change-auditor step 5 Radius (CONSUMER/PINS/ADR handoff items). ticket-decompose gains Phase Blast radius for code tickets between Decompose and Report with one loop-back to Decide+Skeptic; ready-for-agent only after it. os-context 10-orchestration names the agent for unprompted dispatch.

Evidence: bin/test os-sdlc os-backlog: 2 suites passed. New tests/blast_radius_agent_test.rb + Radius assertions in change_auditor_agent_test.rb green. Live test: a sonnet agent ran the charter+skill on a rename of the UNMAPPED: prefix and returned a correct six-section report (found the pinning test at change_auditor_agent_test.rb:47 and ADR-0170/0209 to amend); its friction notes produced 39909efb. bin/refresh-plugins run.

Follow-ups: none. The blast-radius agent type loads at the next session start; until then it is dispatchable only by inlining the charter.

## Resolution **Done:** Shipped on main 03a877cf + 39909efb (ADR-0212). skills/blast-radius/SKILL.md (non-invocable method, six-section report) preloaded into new agents/blast-radius.md (prints the report, no handoff) and change-auditor step 5 Radius (CONSUMER/PINS/ADR handoff items). ticket-decompose gains Phase Blast radius for code tickets between Decompose and Report with one loop-back to Decide+Skeptic; ready-for-agent only after it. os-context 10-orchestration names the agent for unprompted dispatch. **Evidence:** bin/test os-sdlc os-backlog: 2 suites passed. New tests/blast_radius_agent_test.rb + Radius assertions in change_auditor_agent_test.rb green. Live test: a sonnet agent ran the charter+skill on a rename of the UNMAPPED: prefix and returned a correct six-section report (found the pinning test at change_auditor_agent_test.rb:47 and ADR-0170/0209 to amend); its friction notes produced 39909efb. bin/refresh-plugins run. **Follow-ups:** none. The blast-radius agent type loads at the next session start; until then it is dispatchable only by inlining the charter.
jared closed this issue 2026-09-24 18:51:23 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
jared/cc-os#647
No description provided.