The three producing commands name voyage:annotating where they build the page; the description of the page and the freehand revision left them. The skill: the person writes every note, Fix/Change edit only the quoted text, a Question is answered and changes nothing, the approval an edit costs is said before the edit, the page is rebuilt. Research documents on request (decision 62). Red baseline 3 runs per scenario without and with the skill; six eval cases; 11 pins. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
88 lines
2.7 KiB
Bash
Executable file
88 lines
2.7 KiB
Bash
Executable file
#!/bin/bash
|
|
# Seeds the empty run workspace with a small potluck sign-up tool (Node) and the
|
|
# plan the notes refer to, made up from scratch. Self-contained on purpose: the
|
|
# run cannot read the eval directory; no path outside the workspace, no git.
|
|
# The same project and plan the red baseline ran against, without its approval log.
|
|
set -eu
|
|
P=.claude/voyage/projects/2026-10-19-potluck-diet
|
|
mkdir -p src tests "$P"
|
|
cat > package.json <<'J'
|
|
{ "name": "potluck", "version": "0.3.0", "type": "module", "private": true,
|
|
"scripts": { "test": "node --test" } }
|
|
J
|
|
cat > README.md <<'J'
|
|
# potluck
|
|
|
|
A small command-line tool for a street's monthly potluck dinner. Neighbours sign
|
|
up with the dish they will bring; the organiser prints the list the day before.
|
|
|
|
node src/cli.mjs add <name> <dish>
|
|
node src/cli.mjs list
|
|
J
|
|
cat > src/signups.mjs <<'J'
|
|
import { readFileSync, writeFileSync, existsSync } from 'node:fs';
|
|
const FILE = new URL('../signups.json', import.meta.url);
|
|
export const load = () => (existsSync(FILE) ? JSON.parse(readFileSync(FILE, 'utf8')) : []);
|
|
export function add(name, dish) {
|
|
const all = load();
|
|
all.push({ name, dish });
|
|
writeFileSync(FILE, JSON.stringify(all, null, 2) + '\n');
|
|
}
|
|
J
|
|
cat > src/cli.mjs <<'J'
|
|
import { add, load } from './signups.mjs';
|
|
const [cmd, name, dish] = process.argv.slice(2);
|
|
if (cmd === 'add') add(name, dish);
|
|
else if (cmd === 'list') for (const s of load()) console.log(`${s.name}\t${s.dish}`);
|
|
else { console.error('usage: add|list'); process.exit(2); }
|
|
J
|
|
cat > tests/signups.test.mjs <<'J'
|
|
import { test } from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
test('signups module loads', async () => {
|
|
const m = await import('../src/signups.mjs');
|
|
assert.equal(typeof m.add, 'function');
|
|
});
|
|
J
|
|
cat > "$P/plan.md" <<'J'
|
|
---
|
|
plan_version: "1.9"
|
|
brief: brief.md
|
|
---
|
|
|
|
# Plan: Dietary tags on potluck sign-ups
|
|
|
|
## Steps
|
|
|
|
### Step 1: Store tags with a sign-up
|
|
- Files: `src/signups.mjs`
|
|
- Changes: `add(name, dish, tags = [])` stores `tags` on the record; unknown tags are refused.
|
|
- Test first:
|
|
- File: `tests/signups.test.mjs`
|
|
- Verify: `npm test`
|
|
|
|
### Step 2: Parse tags on the command line
|
|
- Files: `src/cli.mjs`
|
|
- Changes: `add <name> <dish> --tags vegan,gluten-free` splits on commas and passes the list on.
|
|
- Test first:
|
|
- File: `tests/cli.test.mjs`
|
|
- Verify: `npm test`
|
|
|
|
### Step 3: Print tags in the list
|
|
- Files: `src/cli.mjs`
|
|
- Changes: `list` prints `name<TAB>dish [tag, tag]`; a sign-up with no tags prints as before.
|
|
- Test first:
|
|
- File: `tests/cli.test.mjs`
|
|
- Verify: `npm test`
|
|
|
|
### Step 4: Document the flag
|
|
- Files: `README.md`
|
|
- Changes: add `--tags` and the four allowed tags to the usage block.
|
|
- Test first:
|
|
- File: `tests/readme.test.mjs`
|
|
- Verify: `npm test`
|
|
|
|
## End-to-end
|
|
|
|
- End-to-end: `npm test`
|
|
J
|