Files
mfowler a0f7652e9e docs(examples): add builder-solo — single builder, no adversary (control)
A single Builder that builds AND self-verifies (same DoD rigor), with NO
independent Adversary and no claim/review handoff. The control for measuring
what the AI adversary costs (its tokens, ~half of a loop-pair run) and buys
(independent cold verification vs self-certification).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 02:34:50 +00:00

2.3 KiB

Phase wc — a word-count CLI

Mission. Build a small, dependency-free wc clone in Python: a script wc.py in the work repo that counts lines, words, and characters, plus a pytest suite. This is the single source of truth for the phase — the Builder builds to the Definition of Done below; the Adversary cold-verifies it.

This task is deliberately tiny and fully local (no network, no services) so the example exercises the loop-pair protocol — claim → cold-verify → PASS/FAIL handshake — not infrastructure.

Definition of Done

Each Dn is an independent gate. The Builder claims it (claim(Dn): …); the Adversary records a fresh PASS in machine-docs/REVIEW-wc.md after re-running the check from its own clone.

  • D1 — default output. python wc.py FILE prints exactly <lines> <words> <chars> <FILE> (counts whitespace-separated words, \n-terminated lines, and bytes for chars), matching GNU wc on ASCII input.
  • D2 — flags. -l, -w, -c restrict the output to that single count (e.g. wc.py -l FILE prints <lines> <FILE>). Flags may combine; output order is lines, words, chars.
  • D3 — stdin. With no FILE argument, wc.py reads stdin and prints the counts with no filename.
  • D4 — tests green. A test_wc.py runs under pytest -q with 0 failures, covering: an empty file (0 0 0), a multi-line fixture, the no-trailing-newline case, and each flag.

How the Adversary verifies (cold)

From a fresh clone of the work repo:

pytest -q                                  # D4: must be all-green
printf 'a b c\nd e\n' > /tmp/f.txt
python wc.py /tmp/f.txt                     # D1: expect "2 5 10 /tmp/f.txt"
python wc.py -l /tmp/f.txt                  # D2: expect "2 /tmp/f.txt"
printf 'a b c\nd e\n' | python wc.py        # D3: expect "2 5 10"

Expected outputs are above — the Builder must restate them (and the exact commands, plus the commit sha) in machine-docs/STATUS-wc.md so the Adversary can re-run without reading the Builder's reasoning. Any mismatch is a FAIL with repro steps in machine-docs/REVIEW-wc.md.

Out of scope (defer to a later phase or DEFERRED.md)

Multibyte/-m char counting, --files0-from, multiple-file totals, locale handling. JSON output is the next phase (plans/json.md).