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.
- Run. zurdo run verifies every automated hint. A task whose remaining criteria are [manual] stops at passed-pending-review.
- List. zurdo review --no-prompt prints what's waiting, with the automated evidence beside it.
- Sign. zurdo review --sign-off task:n --by name signs one criterion and appends it to the review log.
- 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 reachpassed-pending-review, neverpassed. - Beside automated hints, the automated hints still gate. The
[manual]part adds a sign-off on top. - A task whose criteria are all
[manual]reachespassed-pending-reviewat pre-flight, without calling the agent. passed-pending-reviewsatisfiesDepends-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 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":[]}
| Field | Meaning |
|---|---|
address | What to pass to --sign-off: <task-id>:<n>, n the criterion's 1-based position among the task's criteria |
automated | The task's other criteria, with their hints and whether they passed: the evidence to decide on |
run_diff | The run's diff against its starting tree |
log_valid | Whether the review log's chain checks out. Sign-offs are refused when it doesn't. |
coverage_notes | One 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"
{"address":"task-deploy:2","task_id":"task-deploy","criterion_index":1,
"by":"alice","via":"headless","task_status":"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:
| Tool | Arguments | CLI twin |
|---|---|---|
pending_signoffs | prd | zurdo review <prd> --no-prompt |
sign_off | prd, address, by, optional note | zurdo 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.