Building this site with Zurdo
How Zurdo built the Site launch initiative, 66 tasks across 14 PRD runs, checking every criterion against the working tree itself, and what happened around the runs.
Most of this site was built by Zurdo, from PRDs. The Site launch initiative took 14 PRD runs across nine phases, from docs/site-launch/prds/prd-01-public-site.md onwards. Some work was built directly, outside a PRD: phase-13 and a few smaller changes. Every PRD task lists the acceptance criteria that decide whether it is done.
The loop
One command drives a whole PRD:
zurdo run docs/site-launch/prds/prd-01-public-site.mdFor each task, in dependency order:
- Zurdo hands the task to a coding agent.
- When the agent stops, Zurdo ignores the agent's summary.
- It checks every acceptance criterion against the working tree itself.
- The task passes only if every criterion passes. Otherwise the agent gets another attempt.
That rule held for these runs, made with zurdo 1.30.1. Newer releases add two checks: from v1.31.0 a changed-line coverage gate can fail an attempt whose criteria are all green, and from v1.33.0 a file that a passing criterion read must not change before the last criterion runs. This repo opts out of the coverage gate.
Run state stays local under .zurdo/, and nothing reaches git until a person commits it.
Criteria are checks, not claims
Take the task in prd-01 that published this blog. These are its criteria, as the PRD writes them:
- [ ] every post has complete frontmatter, is listed on /blog and opens on its own page [shell: npx playwright test e2e/blog.spec.ts timeout:10m] [proves: req-1, req-2]
- [ ] the Zurdo post exists [file-exists: content/blog/building-this-site-with-zurdo.md] [proves: req-2]
- [ ] the Carol post exists [file-exists: content/blog/planning-in-the-open-with-carol.md] [proves: req-2]
- [ ] both posts are accurate, short and approved [manual] [proves: req-3]The [proves:] tag ties each line to the requirement it proves. The task uses three kinds of check:
shell: a command that must exit 0. Here, a Playwright spec, given ten minutes.file-exists: a path that must be there.manual: a judgement only a person can make.
Across all 14 PRDs there are more: grep, no-grep, file-absent and callers as well.
The Playwright spec was written before the run and frozen. If the agent edits a frozen file, the edit fails the attempt.
The manual criterion isn't decided by the agent either. A person signs it off with zurdo review:
zurdo review --sign-off task-03:4 --by ElOrlis docs/site-launch/prds/prd-01-public-site.mdBy the numbers
The Site launch initiative's record as of its phase-10 review, 2026-10-28:
| Number | What it counts | Source |
|---|---|---|
| 14 | PRD runs across nine phases, 5 of them follow-ups | .zurdo/*/prd.json |
| 66 tasks | every task in those PRDs: 65 passed, 1 failed | .zurdo/*/prd.json |
| 45 of 48 | tasks an agent worked that passed on the first attempt; 2 more passed on a retry, 1 failed after 3 | carol score --report |
| 18 | tasks that passed with no agent attempt: [manual] deploy and sign-off tasks, and one follow-up whose criteria already held | carol score --report, progress.log |
| 53 | agent attempts: 29 on Sonnet, 17 on Opus, 7 on Haiku, picked by each task's Effort | model per iteration in .zurdo/*/prd.json |
| ~3.2 h | agent time, iteration start to end | .zurdo/*/prd.json |
| ~$40.7 | estimated cost; prd-12-docs-rewrite alone was $20.99, about half | cost_usd_est in .zurdo/*/prd.json |
| 167 | machine-checked criteria, 147 of them shell | - [ ] lines in docs/site-launch/prds/*.md |
| 42 | [manual] criteria | the same lines |
| 41 | sign-offs logged, all headless, by ElOrlis | review-log.jsonl |
The agent time and cost count only the runs. They leave out the planning and review sessions, and the hours a run spent waiting on a sign-off.
What happens around the run
A run is one station in the cycle. These are the ones around it.
A failed task and its follow-up. In prd-02-docs-port, task-04 was the Lighthouse gate, and with mermaid diagrams on the pages it scored 0.80. After three attempts Zurdo marked it failed, and its issue, #32, is still open with zurdo:failed. A follow-up PRD, prd-02-docs-port-followup, redid it as task-03. When that ran, all three of its tasks already held at pre-flight, so Zurdo passed them without starting the agent.
A phase review that changed course. Passing criteria don't prove a phase is done, so a phase ends with a review of intent (zurdo-prd-review). Phase-12 passed 8 of 8, and its review still found drift. A follow-up PRD fixed it. The review also found that task-08's agent had edited the frozen e2e/docs.spec.ts, and Zurdo had not flagged it.
A lesson. That miss became lessons/lesson-f53a86af.md: a frozen guard spec must not pin a count that the PRD's own work changes, or the task can go green only if the agent edits the spec. The initiative has 15: 10 from authoring trails, 5 from intent reviews.
The handoff at each stop. Every session ends by writing docs/site-launch/handoff.md, checked with carol handoff check, so the next session starts from the files. The handoff has 43 commits so far.