Signing off manual checks

[manual] criteria, passed-pending-review, and signing them off with zurdo review: interactively, headlessly with --no-prompt and --sign-off, or through MCP.

zurdo v1.36.0

Some criteria only a person can judge: a design review, a deploy, a page that has to look right. Mark them [manual]. Zurdo can't check them, so it never lets a run pass them on its own. A person signs each one off, and the sign-off is logged.

  1. Run. zurdo run verifies every automated hint. A task whose remaining criteria are [manual] stops at passed-pending-review.
  2. List. zurdo review --no-prompt prints what's waiting, with the automated evidence beside it.
  3. Sign. zurdo review --sign-off task:n --by name signs one criterion and appends it to the review log.
  4. Pass. Signing a task's last [manual] criterion flips it to passed.

[manual] criteria and passed-pending-review

- [ ] the stack deploys and the site answers [manual]
- [ ] the contact form sends mail [shell: npm run test:e2e] [manual]
  • A criterion with only [manual] carries no machine signal. Its task can reach passed-pending-review, never passed.
  • Beside automated hints, the automated hints still gate. The [manual] part adds a sign-off on top.
  • A task whose criteria are all [manual] reaches passed-pending-review at pre-flight, without calling the agent.
  • passed-pending-review satisfies Depends-on, so later tasks don't wait for your sign-off.

Listing what's pending

--no-prompt prints one JSON object instead of opening the review screen. It writes nothing and takes no lock, so it's safe beside an open review session or a running agent.

zurdo review --no-prompt
$ zurdo review prds/launch.md --no-prompt
{"prd":"prds/launch.md","slug":"launch-4c1e","log_valid":true,
 "run_diff":".zurdo/launch-4c1e/run-diff.patch",
 "pending":[{"address":"task-deploy:2","task_id":"task-deploy",
   "task_title":"Deploy the stack","criterion":"the site answers",
   "attempts":1,"automated":[{"criterion":"the stack synthesizes",
   "hints":["shell: npx cdk synth"],"passed":true}]}],
 "coverage_notes":[]}
Wrapped for width. Exits 0 even when pending is empty.
FieldMeaning
addressWhat to pass to --sign-off: <task-id>:<n>, n the criterion's 1-based position among the task's criteria
automatedThe task's other criteria, with their hints and whether they passed: the evidence to decide on
run_diffThe run's diff against its starting tree
log_validWhether the review log's chain checks out. Sign-offs are refused when it doesn't.
coverage_notesOne entry (task, status, threshold, reason, build_files) per task whose coverage result carries a reason (an exemption, an override, a timeout) or a changed build file; threshold is left out for an exemption

It needs a prior zurdo run of the PRD; without one it exits 3.

Signing one off

Check the work yourself, then sign:

zurdo review prds/launch.md --sign-off task-deploy:2 --by alice --note "checked www and apex"
zurdo review --sign-off
{"address":"task-deploy:2","task_id":"task-deploy","criterion_index":1,
 "by":"alice","via":"headless","task_status":"passed"}
That was the task's last unsigned [manual] criterion, so it is now passed.
Flag
--sign-off <task-id>:<n>The criterion to sign. Works with or without a terminal.
--by <name>Required. Recorded on the sign-off.
--note <text>Optional one-line note, recorded alongside.

The gate is the same as the interactive screen's: the review log validates, the task is passed-pending-review, and the criterion carries [manual] and is still unsigned. A refusal names the address and exits 2, writing nothing. Another process holding the run lock exits 3.

Warning

Signing is irreversible. There is no unsign. Each sign-off is appended to a tamper-evident chain, and a flipped task stays passed. Sign only what you have checked.

The review log

Every sign-off, interactive or headless, appends a record to .zurdo/<slug>/review-log.jsonl. The records form a tamper-evident chain, and log_valid in the listing says whether it checks out. Headless sign-offs also record "via": "headless" and by; interactive ones carry neither.

Interactively

zurdo review <prd> opens a terminal screen that walks every task's evidence and diff, and signs [manual] criteria with an explicit confirmation naming the task. It holds the run lock for the whole session. Without a terminal and without flags, it prints a pointer to --no-prompt and exits 2.

From an agent (MCP)

zurdo mcp serve publishes the same two operations as tools, answering in exactly the JSON above:

ToolArgumentsCLI twin
pending_signoffsprdzurdo review <prd> --no-prompt
sign_offprd, address, by, optional notezurdo review <prd> --sign-off <address> --by <name>

pending_signoffs is read-only. sign_off writes, and the write is just as irreversible. An agent can sign on your behalf only if its MCP client lets it call the tool, so decide who may approve that call.