#431 Add deep-review-ci agent (actionlint static + LLM semantic pass)#444
Conversation
There was a problem hiding this comment.
Review
PR #444 adds a new deep-review-ci.md agent and updates README.md.
deep-review-ci.md (new)
Frontmatter — name, description, tools (Read, Grep, Glob, Bash(actionlint *), Bash(shellcheck *)), model: sonnet — all correct. Tool restriction is sound: Read/Grep/Glob plus two named Bash invocations prevent shell escape.
Static-tool pass — step 2 runs actionlint which internally invokes shellcheck. Step 3 calls shellcheck directly against an extracted script when inline output is ambiguous.
Non-trivial markers — 7 triggers: if: conditions on event metadata/ref/actor, multi-job needs:/matrix, ref fetches, pull_request_target/workflow_run/repository_dispatch triggers, secret writes, concurrency:/schedule:/workflow_dispatch.inputs:.
LLM semantic checklist — 9 items. head_sha availability for non-checked-out branches flagged at HIGH citing PR #205. pull_request_target injection, workflow_run fork-originated triggers, token scoping, concurrency on push-back, action pinning, secret output handling, job timeout, secret-in-expression all covered. Citations use short IDs.
Output format — consistent with existing review-agents style.
DoD items 1, 2, 4, 5 confirmed in diff. Item 3 (PR #205 recall benchmark) correctly excluded in scope notes.
README.md
actionlint row correctly added to prerequisites table. Optional-tools sentence updated to include actionlint.
Finding
The agent is well-scoped, tool restriction is sound, LLM checklist is comprehensive, README update is accurate. One non-blocking inline comment at line 4. No blocking issues. APPROVE.
Reviewed by proxy/@preset/minimax-minimax-m2-7-no-thinking
…broaden version-tag example
There was a problem hiding this comment.
Summary
PR #431 adds .claude/agents/deep-review-ci.md — a CI/GitHub Actions specialist agent wired into /deep-review-next — plus orchestrator wiring changes in SKILL.md and a README.md prerequisites row.
What was reviewed
.claude/agents/deep-review-ci.md(new, ~117 lines): frontmatter (tools: Read, Grep, Glob, Bash(actionlint *), Bash(shellcheck *),model: sonnet), Sources section citingOWASP-T10,OWASP-ASVS,CWE-T25,CWEIDs resolved againstREFERENCES.md, Inputs section describing the stop rule,## How to runprocedure (static-tool pass → trivial-vs-non-trivial gate → LLM semantic pass), non-trivial markers list, LLM semantic checklist with 9 items (head_sha availability, pull_request_target injection, workflow_run fork-origin guard, token scoping, secret in shell, artifact/secret output, action pinning, concurrency, job timeout), categories, confidence threshold, severity levels, and the pipe-delimited output schema..claude/skills/deep-review-next/SKILL.md: addsdeep-review-cirow to the current roster table, removes it from the roadmap table, updates the orchestrator dispatch comment to note theBashexception, adds the conditional dispatch block, adds### deep-review-cito Step 2 aggregate output, and extendstotal:/status:to coverci HIGH/MEDIUM/LOW.README.md: addsactionlintrow to Prerequisites table (with install instructions) and updates the optional-tools sentence.
Findings
No executable code is introduced. All content is documentation or orchestrator configuration. The agent's tools: frontmatter correctly restricts Bash to the two named analyzers. The orchestrator wiring correctly gates the dispatch on workflow-file paths. The README.md prerequisites entry references /deep-review-next by its actual name. The sources map CI concerns to short IDs that exist in REFERENCES.md. No blocking issues.
Reviewed by proxy/@preset/minimax-minimax-m2-7-no-thinking
Summary
Adds
.claude/agents/deep-review-ci.md— a CI / GitHub Actions specialist agent for the/deep-review-nextorchestrator under epic #436. The agent runsactionlint(which embedsshellcheck) first as a zero-LLM-token static pass, and only escalates to an LLM semantic pass when the workflow shows non-trivial markers (if:conditions,needs:graphs / matrices, ref fetches,pull_request_target/workflow_runtriggers, secret writes,concurrency:/schedule:/workflow_dispatch.inputs:). The LLM checklist's first item explicitly catches thehead_shaavailability bug from PR #205 (actions/checkout@vNwithfetch-depth: 0does not fetch refs from non-checked-out branches) at HIGH severity, citingOWASP-T10 A08, CWE 1395.The agent's frontmatter is the only one in the roster that whitelists
Bash: it addsBash(actionlint *)andBash(shellcheck *)because the static-tool pass needs to spawn those two analyzers. No other shell access. The orchestrator'sRead, Grep, Glob-only generalization is updated to call out this exception.Per sibling-PR precedent (#426 / #427 / #428 / #429 each bundled "agent + orchestrator wiring"), this PR also wires
deep-review-ciinto/deep-review-next: adds the row to the current roster table, removes the row from the Pending table, adds the conditional dispatch in Step 1 (only when.github/workflows/**.yml/.yamloraction.yml/action.yamlis in scope), adds the### deep-review-cisection to the Step 2 aggregate output, and extends thetotal:line andstatus:rule to includeci HIGH/ci MEDIUM/ci LOW.README.mdPrerequisites adds anactionlintrow (with thebrew install actionlint shellcheckinstall line) and the optional-tools sentence is updated to include it.Closes #431
Contributes to #436
DoD coverage
.claude/agents/deep-review-ci.mdwith restrictedtoolsfrontmatter.claude/agents/deep-review-ci.mdlines 1–6## How to runsteps 2–4 +## Non-trivial markersactionlintREADME.mdline 109## Sourcesblock uses realOWASP-T10,OWASP-ASVS,CWE-T25,CWEIDs from.claude/skills/deep-review-next/REFERENCES.md(#425 already merged)ghtoken scope (onlygist, read:org, repogranted;projectscope needed)Citation mapping note
The issue's AC names "GitHub Actions security hardening docs" and "OWASP CI/CD Top 10" as the LLM-pass sources. Neither short ID exists in the project's
REFERENCES.mdbibliography. The agent maps each CI concern to the closest in-scope IDs that DO exist inREFERENCES.md:head_shaavailability /pull_request_targetcheckout-and-execute /workflow_runprovenanceOWASP-T10 A08, CWE 1395permissions:OWASP-T10 A01, OWASP-T10 A05, OWASP-ASVS V14${{ secrets.* }}shell expressionOWASP-T10 A03, CWE-T25 78OWASP-T10 A02, CWE-T25 200OWASP-T10 A06, CWE 1357OWASP-ASVS V14OWASP-T10 A05If
REFERENCES.mdlater adds aGH-HARDENorOWASP-CICDentry, the agent prose can be retrofitted in a one-line sweep.Scope notes
head_sharegression at HIGH — is documented as the first item of the LLM semantic checklist so the recall test in [tooling] Sonnet recall benchmark for deep-review-pro #434 has a deterministic target to assert against.Test plan
git diff origin/main --statshows three files:.claude/agents/deep-review-ci.md(new, 117 lines),.claude/skills/deep-review-next/SKILL.md(+14/-3, orchestrator wiring),README.md(+2/-1, Prerequisites row).tools:line restricts toRead, Grep, Glob, Bash(actionlint *), Bash(shellcheck *)per the issue spec.model: sonnetis set.head_sharegression at HIGH severity, citingOWASP-T10 A08, CWE 1395..claude/skills/deep-review-next/REFERENCES.md.<severity> | <category> | <file>:<line> | <description> | <recommended fix>plussummary:line)..github/workflows/**.yml/.yamloraction.yml/action.yamlpath is in the diff;### deep-review-cisection +ci HIGH/MEDIUM/LOWcounters added to Step 2 aggregate./deep-review-next(matches the orchestrator's actual name)./security-review(manual against this branch's diff): clean — no executable code, no secrets, no auth surface./deep-reviewchecklist: 5 pass / 13 N/A / 0 fail.tools:*glob — replied with the rationale (Claude Code tool-frontmatter syntax;<file>placeholder is not interpreted).playwright-typescript-lint.yml) is N/A for this PR (noplaywright/typescript/**changes); GitHub will skip it./deep-review-nextend-to-end smoke against a PR that touches.github/workflows/*.yml(verifies dispatch-by-glob and thatdeep-review-cireturns the expected schema). Sequence with the other agent rollouts; not tracked here.