Skip to content

/nova-review

The last gate before /nova-wrap. Runs in an isolated context window via the nova-review-agent sub-agent so the review is independent of the building session's context.

text
/nova-review

What it does, in order

  1. Locates artifacts: proposal.md, tasks.md, live decisions in context/decisions/ (skipping archived/), and the diff against branch.base.
  2. Runs deterministic checks (BLOCKING): bash novaspec/guardrails/review-checks.sh <ticket> <base>. If it exits non-zero, the verdict is ✗ Needs fixes immediately and the LLM review is skipped — there's no point grading code that already failed objective gates.
  3. Runs the 4-axis LLM review (only if step 2 passed):
    • Spec compliance — does the diff implement what proposal.md said?
    • Conventions — style consistent with surrounding code, names follow repo convention, no dead code/prints/leftover imports.
    • Decisions — does the change contradict any live decision under context/decisions/? Unjustified violations are blockers.
    • Risks — unforeseen side effects, missing safety nets from tasks.md.
  4. Writes the report to context/changes/active/<TICKET>/review.md using novaspec/templates/review.md.
  5. Returns one line to the calling session: Review complete. Verdict: <✓ Ready for /nova-wrap | ✗ Needs fixes: N blocker(s)>.

Guardrails

#Check
1Branch matches branch.pattern
2proposal.md exists
3tasks.md exists (skipped for quick-fix)
4All tasks done (- [x])

What review-checks.sh actually does

CheckWhat it verifiesSkipped if
Diff non-emptygit diff <base>...HEAD and git diff HEAD not both empty
Files-to-touch presentEvery path under ## Files to touch in tasks.md shows up in the difftasks.md has no such section, or quick-fix
Lint cleannpm/pnpm/yarn run lint exits 0No lint script in package.json
Tests passnpm/pnpm/yarn test exits 0No test script in package.json

Skipped checks don't fail — they're reported as ℹ︎ and the review continues.

What it produces

ArtifactWhere
review.mdcontext/changes/active/<TICKET>/review.md

If verdict is , the file ends with the literal line ✓ Ready for /nova-wrap — the review-approved guardrail greps for that exact string.

Next step

text
/nova-wrap

If the verdict is , fix the blockers (or amend the spec if scope was wrong) and re-run /nova-review. The agent doesn't auto-fix — that's still your call.

Errors you may see

ErrorWhyFix
✗ Empty diffNo changes committed or staged against baseYou forgot to commit, or base is wrong; check branch.base
✗ Files declared in tasks.md but missing from diffPlan lists a file you never touchedUpdate tasks.md to remove it, or actually touch the file
✗ Lint failedStyle violationsRun npm run lint locally, fix, re-run review
✗ Tests failedTest red on the branchFix the tests, re-run
LLM review verdict is ✗ Needs fixes despite all deterministic checks passingSpec compliance, conventions, decisions, or risks blockersRead review.md for the specifics

Customizing it

  • The review template structure → edit novaspec/templates/review.md.
  • Add deterministic checks (e.g. "no console.log in src/") → add a section to novaspec/guardrails/review-checks.sh.
  • Different lint/test commands → the script auto-detects the package manager. To force one, set it explicitly inside the script.
  • The 4-axis review prompt → edit novaspec/agents/nova-review-agent.md. Add domain-specific axes (e.g. "Accessibility") if your team needs them.

Released under the MIT License.