NAI OS

/nai-review — evidence-checked review preparation

Findings drafted with quoted evidence, every citation adversarially checked — you deliver the review.

You drop the material under review into 09 Review Packs/inputs/<slug>/subject/ — “solution designs, ADRs, landscape excerpts, model exports, in whatever shape the client produced” — optionally a criteria catalog as criteria.md and EA-repository exports under ea/ beside it, and type /nai-review <slug>. Three waves run in order: review-scoper inventories the drop and establishes which criteria are in force, finding-drafter writes findings each anchored to a verbatim quote from a dropped file, and finding-checker re-opens every cited file and verdicts each citation CONFIRMED or UNSUPPORTED. The orchestrator then synthesizes the pack itself, and cockpit-writer renders it as one self-contained HTML page. The command states the boundary in its own opening line: “You prepare and check; you NEVER deliver — the review verdict, the trade-off calls, and all stakeholder communication belong to the human.”

What makes this one different from /nai-option-study is the shape of the middle. The command file names the contrast directly: “Where /nai-option-study is the repo's worked example of an iterating loop, this system is its deliberate contrast: one adversarial verify pass, no loop. A finding whose evidence does not hold is flagged for the human, never sent back for redrafting — iterating would let the drafter rewrite findings until they slip past the checker.” The waves are also kept apart in time, not just in context: each dispatch happens “Only after Wave 1 returns — never in the same message”, and the same again for Wave 3.

%%{init: {'theme':'neutral', 'flowchart':{'htmlLabels':false,'nodeSpacing':45,'rankSpacing':55}}}%%
flowchart TD
    H["Human types /nai-review <slug>"] --> C

    subgraph L1 ["1 - Orchestrator (.claude/commands)"]
        C["/nai-review<br/>three waves, one pass each<br/>then synthesizes the pack itself"]
    end

    C -->|"Wave 1"| S["review-scoper<br/>inventory, criteria in force, gaps"]
    S -.->|"review-brief.md"| C

    subgraph L2 ["2 - One pass, no loop"]
        D["finding-drafter<br/>no quote, no finding"]
        V["finding-checker<br/>tries to break each citation"]
    end

    C -->|"Wave 2"| D
    D -.->|"working/findings.md"| V
    V -.->|"working/verification.md<br/>CONFIRMED / UNSUPPORTED"| C

    C ==> PACK["review-pack.md<br/>synthesized by the orchestrator"]
    PACK --> W["cockpit-writer (profile: review)<br/>a view, never a calculator"]
    W ==> OUT["review-pack.html<br/>you deliver the review"]

    S --> T1
    D --> T1
    W --> T1
    V --> T2
    subgraph L3 ["3 - Tools (the only route out)"]
        T1["Read / Write / Glob<br/>dropped files only — no web, anywhere"]
        T2["Read / Write / Grep<br/>only the files findings cite"]
    end

    classDef orch fill:#dcefe9,stroke:#0f6f63,stroke-width:2px
    classDef tool fill:#f4f1ea,stroke:#8a7a5a
    classDef human fill:#fdf3e0,stroke:#8a5a00,stroke-width:2px
    class C orch
    class T1,T2 tool
    class H,PACK,OUT human
A pipeline, deliberately not a loop. The drafter may not write a finding it cannot quote; the checker re-opens every cited file and verdicts each citation. UNSUPPORTED findings are flagged for the human, never redrafted.

The subagents and what they may touch

SubagentWavetools: grantWhat it produces
review-scoperWave 1Read, Write, Glob “Exactly one file: 09 Review Packs/packs/<slug>/review-brief.md” — under review, subject inventory, criteria in force, landscape context, material gaps. Returns review brief: <N> subject files, <M> criteria in force, <K> gaps.
finding-drafterWave 2Read, Write, Glob “Exactly one file: 09 Review Packs/packs/<slug>/working/findings.md” — one ### block per finding (ID, Severity, Criterion, Statement, Evidence), plus ## Open questions. Returns findings: <N> drafted (<H> HIGH, <M> MEDIUM, <L> LOW), <Q> open questions.
finding-checkerWave 3Read, Write, Grep “Exactly one file: 09 Review Packs/packs/<slug>/working/verification.md” — one verdict block per finding, “in the drafter's ID order, titles copied verbatim”. Returns verification: <N> findings checked, <C> CONFIRMED, <U> UNSUPPORTED.
cockpit-writerStep 4.5Read, Write, Glob “review profile → 09 Review Packs/packs/<slug>/review-pack.html” — one self-contained HTML page. Returns cockpit: <output path> — <N> decision item(s).

The checker's grant is the one that differs, and the difference is deliberate: it has Grep where the others have Glob, because its input list is fixed by the findings themselves — “You read only cited files — you never go looking for substitute evidence in files a finding does not cite.” The orchestrator writes review-pack.md itself, in a step the command file labels “Synthesis (you do this yourself)”.

The guardrails, and where each one lives

Enforced inGuardrail, quoted
nai-review.md “If 09 Review Packs/inputs/<slug>/subject/ is missing or contains no files, STOP and tell the user what to drop where … Never run without a subject.”
nai-review.md “An absent criteria.md is not blocking — it is a valid run limited to consistency and completeness; the scoper states it. An empty ea/ is not blocking either. Absent optional inputs are stated, never guessed.”
nai-review.md “If 09 Review Packs/packs/<slug>/ exists and contains any files, STOP and ask the user whether to overwrite. They may have annotated the pack. Never silently overwrite.”
nai-review.md “Text, severities, and criteria copied verbatim from findings.md; verdicts copied verbatim from verification.md — you re-derive nothing.” The executive summary's figures are likewise “copied from the working files' own header lines, never recounted”.
review-scoper.md “You have no web tools. Everything in your brief comes from the dropped files, plus whatever the research library (below) actually contains — never from memory.”
review-scoper.md “Never fabricate to fill a gap. A criterion, application, or constraint that no dropped file states does not appear in your brief as fact.”
finding-drafter.md The evidence rule is absolute: no verbatim quote from a dropped file, no finding. A concern you cannot anchor to a quote goes under ## Open questions, stated as a question for the human reviewer.”
finding-drafter.md Zero findings is a valid answer. A subject that holds together produces an empty findings table and a stated zero — never a fabricated finding, and never missing.”
finding-checker.md You verdict findings; you never write them. You do not edit a finding's text, severity, or criterion; you do not add findings you think the drafter missed; you do not drop findings you think are weak. One verdict per finding, nothing else.”
finding-checker.md You check the citation, not the architecture. Whether the quoted text exists and supports the claim is your question. Whether the finding's architectural judgment is wise is the human reviewer's.”
finding-checker.md Default to UNSUPPORTED when uncertain. A quote you cannot locate, a context you cannot read as supporting the claim — that is an UNSUPPORTED verdict with a reason, never a benefit of the doubt.”
finding-checker.md “Verdict every finding. The count of verdicts equals the count of findings — always.” A cited file that is absent or unreadable does not get a substitute: “that finding is UNSUPPORTED with Reason: cited file absent — <full path>. Never substitute another file.”
cockpit-writer.md You are a view, never a calculator. Every figure, date, and label you render must appear verbatim in a file you read. You do no arithmetic on the data — no sums, no differences, no percentages, no currency conversion, no rounding, no re-formatting of a number.”
cockpit-writer.md You never edit the markdown you read. You write exactly one file: the cockpit.” And for the page itself: “No CDN, no external font, no remote image, no fetch, no network of any kind.

Each of the four agent files also carries the repo's standard boundary paragraph verbatim: “Read-only against every remote system. You write files inside this repo only, and only the files named in ## Output. You NEVER create, change, delete, or send anything in a remote system — you have no such tools and must not attempt it.” Neither the scoper nor the drafter nor the checker is granted a web tool, and the drafter says why: “a review is grounded in what the client dropped, not in what the web says about it.”

What a run leaves behind

Four markdown files and one HTML page, all under 09 Review Packs/packs/<slug>/: review-brief.md, working/findings.md, working/verification.md, the synthesized review-pack.md, and review-pack.html. The pack's own sections are fixed by the command file: a header, an executive summary, a findings table (ID | Title | Severity | Criterion | Verdict), a per-finding block pairing the drafter's statement and quote with the checker's verdict, then three sections written for the human to act on — “Unsupported findings — evidence did not hold”, “Open questions — needs your judgment”, and “Material gaps: the brief's gaps list, carried forward”. The first two are never dropped when empty: “If there are none, say so plainly; never omit the section.”

The cockpit is the reading surface for the same content, and its extraction rules decide what lands in its ⚠ Needs you block: “every finding in the ‘Findings’ table whose severity is HIGH (severity high) or MEDIUM (severity medium); every entry under ‘Unsupported findings — evidence did not hold’ (severity high); every numbered item under ‘Open questions — needs your judgment’ (severity high). LOW findings are detail, not decision items.” Verdicts and severities are “rendered verbatim — never recomputed, never re-tallied”, and where the pack and a working file disagree the cockpit “render[s] both and say[s] so; do not reconcile them.” Ticking a checkbox is convenience only: “It is never read back into the markdown, and the markdown stays the record.”

Both endpoints close on the same boundary, worded verbatim in their own files. The pack ends: “Human-only: the review verdict, the trade-off calls, and stakeholder communication are yours — this pack prepares the review, it does not deliver it.” The cockpit footer ends: “Human-only: the review verdict and stakeholder communication are yours.” And the command's final report line is “Agent prepared the review — you deliver it.”

Next/nai-spec-drafter