# Review As JSON

> Runs `/review` and emits the result as a single structured JSON object. Used by CI; use `/review` directly for human-facing reviews.

- Skill: `elliottlawson/review-as-json` (Agent Skill)
- Install (CLI): `npx skillmds@latest add elliottlawson/review-as-json`
- Raw SKILL.md: https://api.skillmd.com/api/skills/elliottlawson/review-as-json/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- License: MIT
- Author: elliottlawson (https://skillmd.com/u/elliottlawson)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/elliottlawson/review-as-json

---


# Review as JSON

Run `/review` on this change and follow it exactly.

Emit the result as a single JSON object instead of a prose report:

```json
{
  "verdict": "approve | changes_needed | hold",
  "summary": "One or two sentences on the change overall.",
  "findings": [
    {
      "severity": "critical | warning | info",
      "type": "issue | suggestion | question",
      "category": "mission | architecture | implementation | craft | security | performance",
      "title": "Short imperative, e.g. 'Sanitize user input before query'",
      "description": "What it is, why it matters, and the consequence.",
      "file": "path/to/file.ts",
      "line": 42,
      "suggestedFix": "Optional concrete fix."
    }
  ],
  "passes": {
    "mission": "met | missing | different | unclear",
    "architecture": "ok | concern | blocking",
    "implementation": "ok | concern | blocking",
    "craft": "ok | concern | blocking",
    "security": "ok | concern | blocking",
    "performance": "ok | concern | blocking"
  },
  "sectionSummaries": {
    "mustFix": "1-2 sentences on the critical findings, if any.",
    "shouldFix": "1-2 sentences on the warnings, if any.",
    "questions": "1-2 sentences on the questions, if any.",
    "suggestions": "1-2 sentences on the suggestions, if any."
  }
}
```

Rules for the output:

- Emit **only** the JSON object. No preamble, no commentary, no markdown fences around it.
- **Severity.** `critical` blocks merge (bugs, security holes, data loss). `warning` should be addressed but isn't a blocker. `info` is a note.
- **Summary.** Never restate the verdict ("This PR is approved", "Changes requested") — the presentation layer renders it. The summary answers *why*.
- **sectionSummaries.** Explain the underlying theme ("Missing input validation across the new endpoints"), never just count findings.
- **Type.** `question` is something you need answered rather than a defect. `suggestion` is an optional improvement. Everything else is an `issue`.
- **Category.** Every finding's `category` is the pass that found it — this is how the passes show up in CI output.
- **Verify before you flag** still applies. Every finding needs a concrete file, line, and consequence. If you can't verify it, make it a `question`.
- If there are no findings, emit an empty `findings` array and an `approve` verdict.

