NAI OS
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
| Subagent | Wave | tools: grant | What it produces |
|---|---|---|---|
| review-scoper | Wave 1 | Read, 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-drafter | Wave 2 | Read, 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-checker | Wave 3 | Read, 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-writer | Step 4.5 | Read, 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)”.
| Enforced in | Guardrail, 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.”
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.”