feat(bitwarden-code-review): route changed SKILL.md to plugin-dev:skill-reviewer - #206
feat(bitwarden-code-review): route changed SKILL.md to plugin-dev:skill-reviewer#206withinfocus wants to merge 5 commits into
Conversation
🤖 Bitwarden Claude Code ReviewOverall Assessment: APPROVE Re-reviewed at Code Review DetailsNo findings. Verified this pass:
Coverage note: The two items the PR body defers — Agent 4's two-output-contracts mismatch, and |
…ll-reviewer claude-config-validator 2.0.0 declines SKILL.md, and neither review path invoked plugin-dev:skill-reviewer, so skill changes were left uncovered while both paths still advertised progressive-disclosure review. The multi-agent pipeline gains a conditional Agent 5 on the plugin-dev:skill-reviewer subagent type, emitting source_agent "skill" with id prefix skl. The single-agent reviewer gains Task, scoped by its definition to that one delegation.
Nine of this repo's ten skill support directories are references/, so enumerating only reference/ dropped them from Claude-configuration detection.
56effe5 to
94fed57
Compare
…omitting silently SKILL.md sits outside the Claude-configuration bucket, so a missing plugin-dev leaves no agent applying the skill lens. The report gains a Not covered line so the omission cannot read as a pass.
… contract plugin-dev:skill-reviewer holds Read, Grep, Glob and emits a fixed prose report, so it can satisfy neither the Review Rules bundle nor the Finding Shape schema. The orchestrator now translates its report in Step 3 under a named carve-out. SKILL.md also stays in the scope handed to reviewing-claude-config: its credential scan runs over every file whatever the type, and only its routing declines the file, so dropping it from that bucket had removed the secret scan. Task cannot be scoped per subagent in frontmatter, so the limit is documented as a convention rather than a boundary.
… contract A spawned subagent takes its tools from its own definition, so Task put unrestricted Bash one delegation from an agent that reads contributor diffs unattended in CI. The single-agent path now states that skill content review did not run and names the pipeline that covers it. Agent 5 gains a scope fence, keeps Tool Discipline minus its gh/git bullet, takes Untrusted Input Boundary widened from hunks to whole files, harvests the reviewer's section-level issue lists, and is classified against the pipeline's own severity definitions.
🎟️ Tracking
Stacked on #201, which must merge first. This branch is based on
config-validator-guardrailsrather thanmain, so the diff shown here is only this layer.Closes the follow-up #201 records under
### Migrationin theclaude-config-validatorchangelog.Paired with bitwarden/gh-actions#907, which installs
plugin-devin the code-review action so the new routing actually fires in CI.No Jira ticket, matching #197, #198, and #201.
📔 Objective
claude-config-validator2.0.0 stops reviewingSKILL.mdand hands the file toplugin-dev:skill-reviewer.bitwarden-code-reviewsendsSKILL.mdtoSkill(claude-config-validator:reviewing-claude-config)in both of its review paths and invokesplugin-dev:skill-reviewerin neither. After #201 that leaves a skill change with a stated omission instead of a review, while both paths go on advertising that they check progressive-disclosure structure.Multi-agent pipeline
Step 3 gains Agent 5, conditional on a changed
SKILL.mdand an installedplugin-dev, running on theplugin-dev:skill-reviewersubagent type.That agent will not fit the pipeline's contract as-is, and the paragraph says why rather than pretending otherwise. It declares
tools: ["Read", "Grep", "Glob"], so it cannot invoke the security-context skill the Review Rules mandate, and its system prompt fixes its output as a prose report, so asking it for Finding Shape JSON would put two output contracts in one context. Markdown carries noid, and Steps 4 and 6 merge onid, so its findings would have dropped out of the merge unnoticed.So it gets a named carve-out receiving Line Number Accuracy, Tool Discipline minus its
gh/gitbullet, and Untrusted Input Boundary widened from diff hunks to whole files, since it reads files rather than hunks. The orchestrator translates its prose in Step 3: scope fence first, because a whole-skill reviewer cannot see what changed and would otherwise fill Step 4 with findings to dismiss; then severity judged against this pipeline's own definitions rather than a fixed map, because itsCriticalis not this pipeline's Blocker; thenid,source_agent,file,line,title,detail, andconfidence. The carve-out is explicitly not extensible to any agent that emits Finding Shape objects itself.finding-shape.mdgainsskl → skillandreport-template.mdrenders it as "Skill review agent". Step 6 merges byid, so a second agent emittingcfg-Nwould have collided with Agent 4.plugin-devjoinsclaude-config-validatoras an optional enhancer, detected by resolvability and excluded from the prerequisite abort check.Single-agent reviewer
bitwarden-code-reviewerdoes not get skill content review, and says so.Reaching
plugin-dev:skill-reviewerneedsTask, because it is an agent rather than a skill. GrantingTaskthere is not worth it: a spawned subagent takes its tool set from its own definition, andgeneral-purposedeclaresTools: *, so the grant would put unrestrictedBash,Write, andWebFetchone hop from an agent whose whole tool line is a deliberately narrowBash(gh pr view:*)allowlist. That agent runs unattended in Actions over contributor-authored diffs, and the plugin'ssettings.jsondoes not contain the blast radius: it deniesghsubcommands only, and it sits inside the plugin directory rather than the repository under review.The path now reports in its Step 6 summary that description quality, length, and progressive disclosure went unreviewed, names the pipeline as what covers them, and is told not to substitute its own opinion of skill quality.
Clean PRs: brief approval onlycarries a clause so a cleanSKILL.md-only pull request cannot swallow the note.Bucketing
SKILL.mdleaves the Claude-configuration bucket for content review in both paths, but stays in the scope handed toreviewing-claude-config. That skill's credential scan is its Step 2 and covers every file whatever the type; only its Step 3 routing declinesSKILL.md. Dropping the file from that scope would have removed it from the secret scan.The support-file detection list covers
reference/andreferences/both. Thirteen of the fourteen support directories in this repo use the plural, including the two this PR changes, andclaude-config-validatoris the lone exception.Version
1.13.1to1.14.0.Deferred
Both pre-existing, both want their own change. Agent 4 has the same two-output-contracts problem the Agent 5 paragraph now names, since
reviewing-claude-configemits four severities and declines to score confidence while the pipeline expects three and a threshold. Andperforming-multi-agent-code-reviewdeclaresallowed-toolswithoutTaskwhile launching subagents throughout Steps 2 to 5.