Skip to content

feat(resolve)!: split validation from fixing — Triager + Coder-as-fixer, blast-radius dispositions, verification gate#253

Open
dean0x wants to merge 8 commits into
mainfrom
feat/resolve-triager-split
Open

feat(resolve)!: split validation from fixing — Triager + Coder-as-fixer, blast-radius dispositions, verification gate#253
dean0x wants to merge 8 commits into
mainfrom
feat/resolve-triager-split

Conversation

@dean0x

@dean0x dean0x commented Jul 8, 2026

Copy link
Copy Markdown
Owner

Summary

  • Retired the single-Resolver design that self-validated and self-fixed, replacing it with a strict separation: an opus Triager validates every issue via a blast-radius disposition matrix, Coder agents fix only pre-classified FIX_NOW items (with PUSH: false so parallel batches share one branch), and a haiku Validator gate runs build/typecheck/lint/test with up to 2 fix-retry cycles before recording an honest pass/fail in the summary.
  • Addresses mined failure modes from 328 resolution reports: self-ratifying vacuous tests, positive-spin summaries, security findings dismissed on soft rationales, and verification documented in only 19% of runs.
  • Resolves the "no agent grades its own homework" principle already established in dynamic-build, now applied to core /resolve.

Changes

New agentshared/agents/triager.md (opus, validation-only):

  • Blast-radius matrix: SECURITY GATE (overrides all) → FALSE_POSITIVE (requires cited evidence) → BY_DESIGN (requires ADR or code doc) → FIX_NOW (default, Standard/Careful risk tier) → FIX_SEPARATE (must become manage-debt ticket) → TECH_DEBT (last resort only)
  • Applies ADR/PF decisions via devflow:apply-decisions (frontmatter-preloaded, avoids PF-002 re-entrancy)
  • Reads DIFF_FILES from Git validate-branch to scope FIX_NOW vs FIX_SEPARATE

Retiredshared/agents/resolver.md (applies ADR-003: clean end-state, no tombstones)

Updatedshared/agents/coder.md:

  • New inputs: OPERATION (implement | issue-fix | validation-fix | ci-fix), ISSUES, SCOPE, PUSH (default true)
  • New Mode: issue-fix section: no re-litigation, regression-test rule (INCOMPLETE if no failing-then-passing test), Verification block in output
  • Responsibility 6: PUSH: false commits only; orchestrator owns push/CI

Restructuredcommands/resolve.mds (10-phase pipeline):

  • Phase 2: Global Triager (single opus agent, cross-issue consistency)
  • Phase 3: Batch FIX_NOW (same-file sequential, distinct-file parallel, max 5/batch)
  • Phase 4: Coder × N (OPERATION: issue-fix, PUSH: false, CREATE_PR: false)
  • Phase 5: Early summary write (compaction safety)
  • Phase 7: Verification Gate (Validator haiku + 2-retry Coder loop)
  • resolution-summary.md: adds ## Verification, ## By Design, ## Fix Separately, ## Escalations; Deferred = FIX_SEPARATE + TECH_DEBT (fp_ratio formula unchanged, byte-for-byte)

Updatedshared/agents/git.md: validate-branch adds ### Diff Scope output block; manage-debt ingests ## Fix Separately + ## Deferred to Tech Debt

Updatedshared/agents/reviewer.md: Cross-Cycle Awareness also parses ## By Design to avoid re-raising intentional code

Updated — registry: src/cli/plugins.ts, plugins/devflow-{resolve,ambient}/.claude-plugin/plugin.json, .gitignore

Updated — docs: CLAUDE.md, README.md, docs/commands.md, docs/reference/*, orchestrator-charter.md

Updated — tests: plugins.test.ts, resolve/decisions-citation.test.ts, decisions/command-adoption.test.ts

Breaking Changes

shared/agents/resolver.md is deleted. Any plugin that declared resolver in its agents array must switch to triager (+ coder for fix operations). The devflow-resolve and devflow-ambient plugins have been updated.

The resolution-summary.md schema gains new sections (## By Design, ## Fix Separately, ## Escalations, ## Verification). The ## Statistics table gains By Design and Escalated rows. Parser-coupled literals (Fixed, False Positive, Deferred, ## Fixed Issues, ## False Positives columns) are preserved verbatim for fp_ratio back-compat.

Reviewer Focus Areas

  • triager.md blast-radius matrix: verify the 5-clause ordering is correct (SECURITY GATE first), evidence requirements for FALSE_POSITIVE/BY_DESIGN, and that PF-002 is honored (no Skill-tool invocation of preloaded skills)
  • resolve.mds Phase 7 verification gate: push-before-validate sequence, 2-retry loop, honest failure recording
  • Convergence back-compat: fp_ratio formula stays fp/(fp+fixed+deferred) — By Design and Escalated excluded from denominator; confirm deferred_count still maps correctly to the Deferred statistics row
  • Test coverage: 1908 tests pass; new assertions cover triager.md structure, new template headings in resolve.md, devflow-resolve agent registry

dean0x and others added 8 commits July 8, 2026 19:36
…er, blast-radius dispositions, verification gate

- Add shared/agents/triager.md (opus): validates all issues via blast-radius disposition matrix
  (SECURITY GATE → FALSE_POSITIVE → BY_DESIGN → FIX_NOW → FIX_SEPARATE → TECH_DEBT)
  with cited evidence, risk tiers (Standard/Careful), ADR/PF citations; never edits code
- Delete shared/agents/resolver.md (applies ADR-003: clean end-state, no tombstones)
- Add OPERATION/ISSUES/SCOPE/PUSH inputs + issue-fix mode to shared/agents/coder.md;
  PUSH:false enables parallel commits without push; regression-test rule enforced
- Restructure commands/resolve.mds: 10-phase pipeline — global Triager (Phase 2) →
  FIX_NOW batching (Phase 3) → Coder fixes (Phase 4) → early summary write (Phase 5) →
  Simplify (Phase 6) → Verification Gate with Validator haiku + 2-retry loop (Phase 7) →
  CI gate (Phase 8) → manage-debt (Phase 9) → display (Phase 10)
- resolution-summary.md gains ## Verification, ## By Design, ## Fix Separately,
  ## Escalations sections; By Design/Escalated excluded from fp_ratio denominator
- Update shared/agents/git.md: validate-branch adds ### Diff Scope output (DIFF_FILES);
  manage-debt now ingests ## Fix Separately + ## Deferred to Tech Debt from resolution-summary.md
- Update shared/agents/reviewer.md: Cross-Cycle Awareness also parses ## By Design
- Update commands/code-review.mds: clarifying note that By Design excluded from fp_ratio
- Update registry: devflow-resolve → [triager, coder, simplifier, validator] + apply-decisions skill;
  devflow-ambient: resolver → triager (avoids PF-002 in triager.md frontmatter: no Skill-tool re-entrancy)
- Update docs: CLAUDE.md roster/model-strategy/resolve description, README.md, docs/commands.md,
  docs/reference/skills-architecture.md, docs/reference/file-organization.md, orchestrator-charter.md
- Update tests: plugins.test.ts (resolver→triager; new devflow-resolve assertions),
  resolve/decisions-citation.test.ts (resolver.md→triager.md; new template heading assertions),
  decisions/command-adoption.test.ts (resolver.md→triager.md in consumer-agents arrays)
…er boundary

Retired resolver agent was missing from LEGACY_AGENT_NAMES, so devflow init
would leave stale ~/.claude/agents/devflow/resolver.md on existing installs.
Added cleanup entry and a test assertion to enforce it for future retirements.

Tightened ambiguous triager.md Boundaries bullet: "that is the Coder's job
boundary" → "dispositions are final once assigned" (no rule change, clearer intent).
Complete the Resolver-agent retirement end-state (ADR-003): strip stale
references to the removed Resolver agent from shared skills/agents that the
branch missed:
- git skill: 'Used by Coder and Git agents' (Triager does no git work)
- docs-framework: resolution-summary.md now written by /resolve orchestrator
- test-driven-development: RESOLVE TDD enforced via Coder (issue-fix mode)
- bug-analyzer: 'the resolve pipeline' instead of 'Resolvers'

Harden the /code-review convergence parser contract in resolve.mds: document
that the Deferred statistic = FIX_SEPARATE + TECH_DEBT and that the parser-
coupled row labels/headings must stay byte-stable.
…tials

Resolver is retired; Coder is the sole fix-writer. Two prose lines in
_roster.mds and _engine.mds still named the removed agent. Rewrite to
the end-state doctrine per ADR-003 (leave the end-state, strip residue).

Co-Authored-By: Claude <noreply@anthropic.com>
Scrutinizer is listed in Gate 1 as a code-touching agent (line 12).
Adding it to the "no other agent writes code" exclusion list in invariant 1
was a contradiction. Drop it — the invariant now correctly reads:
"not Reviewer, not Evaluator."

Co-Authored-By: Claude <noreply@anthropic.com>
Move the git push in Phase 7 from the top (before Validator runs) to
after the gate concludes. The single push now covers both outcomes:
- PASS: branch pushed, Phase 8 CI gate proceeds
- FAILED after 2 attempts: branch pushed so the failure is visible in
  the PR before debt management runs

Remove the per-retry push that was triggering redundant CI runs on every
validation-fix attempt.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant