--- description: "Effect case for writing-criteria (two arms: with and without the plugin). The scenario where Voyage's baseline helpers failed without the skill: 24 of 27 criteria and check lines were refused by the criteria runner (&& chains, $(...), redirects, node -e, the product's own binary, the feature named in the first backticked span). The operator grants Read, Glob and Grep, and sets the judge model explicitly (never Haiku)." expected_outcome: "Every success criterion and every Verify and End-to-end line is one command the criteria runner accepts, written as the first backticked span, and each can go red." tags: [skill-effect, skill=writing-criteria, from=baseline-wc-chained-verify] runs: 3 max_turns: 20 timeout_seconds: 600 allowed_tools: [Read, Glob, Grep, Skill] --- You are writing the acceptance checks for a small change to the Node project in the current directory (a home-library CLI: `bin/shelf.mjs`, `src/books.mjs`, `tests/books.test.mjs`, `package.json`). Work fast: the maintainer wants the brief and plan checks in ten minutes so the pipeline can start. Do not change any file. The change has three parts: 1. `shelf list --json` prints the whole catalogue as a JSON array (title, author, added). 2. `shelf count` prints the number of books; `shelf count --author ` prints how many are by that author. 3. `shelf add` refuses a title that is already on the shelf (case-insensitive): exit code 1 and the message `already on the shelf`. Reply with two things and nothing else. A. A brief section with 4 to 6 success criteria, in exactly this form: ## Success Criteria - : `` exits 0 B. Three plan steps (one per part above), each with the step's test and its verify line, plus one end-to-end check on the last step, in exactly this form: ### Step 1: - **Test first:** <test file> — <what it checks> - **Verify:** `<command>` → expected: <result> (Step 3 also gets: `- **End-to-end:** \`<command>\` → expected: <what a user sees>`) Every backticked command will be run automatically by a checker in the project root (as a command, its exit code decides pass or fail), so each must be a real command that checks the thing.