{"_id":"@dhalarewich/writers-room","_rev":"4-67571fd7e7d264a03b3c76d14e106305","name":"@dhalarewich/writers-room","dist-tags":{"latest":"1.0.0-alpha.9"},"versions":{"1.0.0-alpha.3":{"name":"@dhalarewich/writers-room","version":"1.0.0-alpha.3","license":"MIT","_id":"@dhalarewich/writers-room@1.0.0-alpha.3","maintainers":[{"name":"dhalarewich","email":"dhalarewich+nsgttvug@gmail.com"}],"homepage":"https://github.com/dhalarewich/writers-room#readme","bugs":{"url":"https://github.com/dhalarewich/writers-room/issues"},"bin":{"wr":"dist/cli/main.js"},"dist":{"shasum":"e95e94c9ef6dacbf97ccaa302078568a7cf0c5df","tarball":"https://registry.npmjs.org/@dhalarewich/writers-room/-/writers-room-1.0.0-alpha.3.tgz","fileCount":72,"integrity":"sha512-lqQe5yyER6BTvzd722DC8d6An+CCg/BQjXHLIZqf0Jt39xKPR0tz2YR06fi+xXdLaZYiZWKjIp2bcWGigzO5vQ==","signatures":[{"sig":"MEYCIQDloWxDRj5NLlTyInfti6H5hsGWRqliDdwGPkN7KRtZwwIhAOPmG8Jozq+wCP7nH/Waez3BXiVtrJYC178rKXNtC089","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":189711},"type":"module","engines":{"node":">=20"},"gitHead":"1be057abe23b48a0c5decb6df7115ea798a472d1","scripts":{"dev":"tsx src/cli/main.ts","test":"vitest run","build":"tsc -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"dhalarewich","email":"dhalarewich+nsgttvug@gmail.com"},"repository":{"url":"git+https://github.com/dhalarewich/writers-room.git","type":"git"},"_npmVersion":"11.11.0","description":"A local-first editorial studio for one distinctive voice","directories":{},"_nodeVersion":"25.8.1","dependencies":{"ink":"^5.2.1","yaml":"^2.5.0","react":"^18.3.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.16.0","vitest":"^2.0.0","typescript":"^5.5.0","@types/node":"^20.14.0","@types/react":"^18.3.31"},"_npmOperationalInternal":{"tmp":"tmp/writers-room_1.0.0-alpha.3_1784152615276_0.8718873215134999","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-alpha.5":{"name":"@dhalarewich/writers-room","version":"1.0.0-alpha.5","license":"MIT","_id":"@dhalarewich/writers-room@1.0.0-alpha.5","maintainers":[{"name":"dhalarewich","email":"dhalarewich+nsgttvug@gmail.com"}],"homepage":"https://github.com/dhalarewich/writers-room#readme","bugs":{"url":"https://github.com/dhalarewich/writers-room/issues"},"bin":{"wr":"dist/cli/main.js"},"dist":{"shasum":"ae61f55fffd74fa2a7dfadf4e2e9d019b4748055","tarball":"https://registry.npmjs.org/@dhalarewich/writers-room/-/writers-room-1.0.0-alpha.5.tgz","fileCount":72,"integrity":"sha512-KLt6fgZtXJTwwzalyBeYFWcGeD3KawLlfFmo1grmYKODptY8z+XoGbARJy/zMiEUcxN+sFs1RsTYhjdO9dv4zw==","signatures":[{"sig":"MEUCIQDwOA3T4y+aXBgWkbANnxm+TklQzQTuKTS4zi3eX1uZ5QIgGz+gWNHbD7MQ5/R2FH0/SqUScIwNYrCQj0ltzzZqAJg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":196365},"type":"module","engines":{"node":">=20"},"gitHead":"94cd8f1a13a5c2e74422b548a903c5860d1d6893","scripts":{"dev":"tsx src/cli/main.ts","test":"vitest run","build":"tsc -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"dhalarewich","email":"dhalarewich+nsgttvug@gmail.com"},"repository":{"url":"git+https://github.com/dhalarewich/writers-room.git","type":"git"},"_npmVersion":"11.11.0","description":"A local-first editorial studio for one distinctive voice","directories":{},"_nodeVersion":"25.8.1","dependencies":{"ink":"^5.2.1","yaml":"^2.5.0","react":"^18.3.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.16.0","vitest":"^2.0.0","typescript":"^5.5.0","@types/node":"^20.14.0","@types/react":"^18.3.31"},"_npmOperationalInternal":{"tmp":"tmp/writers-room_1.0.0-alpha.5_1784156031189_0.018087427722395466","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-alpha.6":{"name":"@dhalarewich/writers-room","version":"1.0.0-alpha.6","license":"MIT","_id":"@dhalarewich/writers-room@1.0.0-alpha.6","maintainers":[{"name":"dhalarewich","email":"dhalarewich+nsgttvug@gmail.com"}],"homepage":"https://github.com/dhalarewich/writers-room#readme","bugs":{"url":"https://github.com/dhalarewich/writers-room/issues"},"bin":{"wr":"dist/cli/main.js"},"dist":{"shasum":"e4202976342ea322f196beabae9ca36d9ed07f86","tarball":"https://registry.npmjs.org/@dhalarewich/writers-room/-/writers-room-1.0.0-alpha.6.tgz","fileCount":75,"integrity":"sha512-lZ3DAReMMt/3WW8As6U1dEAgs2eANxONlMUmXPgGgS+KZJ3PLJcPXyOoSUb5a/w7nvh3nOiN/DeTTPD2rWc2YA==","signatures":[{"sig":"MEUCIFD2WrSpfQ1SMaA3jt/8ZruP9hritGzW3A/D3VyqV0/nAiEA4X9yazxt1SJ5i/VjexIEYWj98lcC2iDKuuHTNSDtKkE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":224036},"type":"module","engines":{"node":">=20"},"gitHead":"1d8cb39bc4956f2fb32b31d853a42c8d98c03459","scripts":{"dev":"tsx src/cli/main.ts","test":"vitest run","build":"tsc -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"dhalarewich","email":"dhalarewich+nsgttvug@gmail.com"},"repository":{"url":"git+https://github.com/dhalarewich/writers-room.git","type":"git"},"_npmVersion":"11.11.0","description":"A local-first editorial studio for one distinctive voice","directories":{},"_nodeVersion":"25.8.1","dependencies":{"ink":"^5.2.1","yaml":"^2.5.0","react":"^18.3.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.16.0","vitest":"^2.0.0","typescript":"^5.5.0","@types/node":"^20.14.0","@types/react":"^18.3.31"},"_npmOperationalInternal":{"tmp":"tmp/writers-room_1.0.0-alpha.6_1784158642880_0.7943987563119015","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-alpha.9":{"name":"@dhalarewich/writers-room","version":"1.0.0-alpha.9","description":"A local-first editorial studio for one distinctive voice","type":"module","license":"MIT","repository":{"type":"git","url":"git+https://github.com/dhalarewich/writers-room.git"},"bin":{"wr":"dist/cli/main.js"},"publishConfig":{"access":"public"},"engines":{"node":">=20"},"scripts":{"build":"tsc -p tsconfig.json","test":"vitest run","dev":"tsx src/cli/main.ts","prepublishOnly":"npm run build"},"dependencies":{"ink":"^5.2.1","react":"^18.3.1","yaml":"^2.5.0"},"devDependencies":{"@types/node":"^20.14.0","@types/react":"^18.3.31","tsx":"^4.16.0","typescript":"^5.5.0","vitest":"^2.0.0"},"gitHead":"0a02bc0c31fc490f1ecc80cfe0877925308fcc3c","_id":"@dhalarewich/writers-room@1.0.0-alpha.9","bugs":{"url":"https://github.com/dhalarewich/writers-room/issues"},"homepage":"https://github.com/dhalarewich/writers-room#readme","_nodeVersion":"25.8.1","_npmVersion":"11.11.0","dist":{"integrity":"sha512-MzYzGJLTwgfnp8pC3rtJYBEj2o5pJfq3j4lSA237l2sBBN/TXOgo6qOd/DEhedvWxO09W0b0Rt5FsLxfBHSUdA==","shasum":"2a9172bd302a0f808cd86791714606e86d1ca02b","tarball":"https://registry.npmjs.org/@dhalarewich/writers-room/-/writers-room-1.0.0-alpha.9.tgz","fileCount":75,"unpackedSize":227033,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIHLvRkbJcwgXXZbA8GB18kyguh7PDqw30OBvlDpdJ97QAiBwOtnbu6hJd1zsRzSRhPHjsL+8WNJWttFG6JQdz5AK3g=="}]},"_npmUser":{"name":"dhalarewich","email":"dhalarewich+nsgttvug@gmail.com"},"directories":{},"maintainers":[{"name":"dhalarewich","email":"dhalarewich+nsgttvug@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/writers-room_1.0.0-alpha.9_1784183673017_0.16519072185972483"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-15T21:56:55.063Z","modified":"2026-07-16T06:34:33.316Z","1.0.0-alpha.3":"2026-07-15T21:56:55.431Z","1.0.0-alpha.5":"2026-07-15T22:53:51.325Z","1.0.0-alpha.6":"2026-07-15T23:37:23.043Z","1.0.0-alpha.9":"2026-07-16T06:34:33.168Z"},"bugs":{"url":"https://github.com/dhalarewich/writers-room/issues"},"license":"MIT","homepage":"https://github.com/dhalarewich/writers-room#readme","repository":{"type":"git","url":"git+https://github.com/dhalarewich/writers-room.git"},"description":"A local-first editorial studio for one distinctive voice","maintainers":[{"name":"dhalarewich","email":"dhalarewich+nsgttvug@gmail.com"}],"readme":"<div align=\"center\">\n\n<img src=\"assets/wordmark.svg\" alt=\"Writers Room\" width=\"416\">\n\n<p><code>The local-first editorial studio for one distinctive voice</code></p>\n\n# AI-assisted writing that actually sounds like you.\n\n**Writers Room is a local-first editorial studio that turns rough ideas into researched, fact-checked, edited drafts and learns from every change you make.**\n\n[![tests](https://img.shields.io/badge/tests-90%20passing-4c9a52)](#the-eval)\n[![node](https://img.shields.io/badge/node-%3E%3D20-6aa84f)](package.json)\n[![version](https://img.shields.io/badge/version-1.0.0--alpha.9-c47a3d)](https://github.com/dhalarewich/writers-room/releases)\n[![Claude Code](https://img.shields.io/badge/Claude%20Code-plugin-D97757)](#install)\n[![Codex](https://img.shields.io/badge/Codex-planned-8a7f70)](#hosts)\n[![license](https://img.shields.io/badge/license-MIT-3d7dc4)](LICENSE)\n\n[Try it](#try-it-in-two-minutes) · [Why it's different](#why-its-different) · [Install](#install) · [Set up](#set-up-your-first-studio) · [A week with it](#a-week-with-it) · [Under the hood](#under-the-hood) · [Eval](#the-eval)\n\n</div>\n\n---\n\n**For people who publish under their own name and already use AI assistants.** Built for [Claude Code](https://claude.com/claude-code). Plain Markdown files on your own disk. No hosted backend.\n\nMost content tools mass-produce text, then bolt a \"humanizer\" on the end to sand off the slop. Writers Room works the other way around: the AI drafts *as you*, checked against a voice spec distilled from pieces you actually published, and every hand-edit you make before publishing is captured as a diff and mined back into memory. The system gets more *you* with every piece. If a draft doesn't read unmistakably like its author, it doesn't ship.\n\n- **It learns from what you change, not just what you upload.** The difference between its draft and your published piece becomes evidence for the next one.\n- **Grounded in writing that genuinely sounds like you.** Every voice rule quotes one of your real samples: no sample line, no rule.\n- **Independent fact, critique, and voice checks.** Reviews run outside the drafting context, so they catch what a drafting agent can't reliably catch in its own work.\n- **Plain Markdown, start to finish.** The board, knowledge, drafts, and memory are ordinary files you can read, grep, and back up.\n- **You stay the publisher.** Ideas don't advance and pieces don't ship without an explicit decision from you.\n\n<div align=\"center\">\n\n<video src=\"https://github.com/user-attachments/assets/64cf034a-3675-4bfd-b2a0-10c581ff978e\"></video>\n\n</div>\n\n## Try it in two minutes\n\nA complete synthetic studio ships in the repo. No voice setup, no interview.\n\n```bash\nnpm i -g @dhalarewich/writers-room\ngit clone https://github.com/dhalarewich/writers-room\ncd writers-room/fixtures/demo-studio\nwr studio        # full-screen board, or `wr serve` for the web view\n```\n\nYou get a real board with cards at every stage and a fictional voice already dialled in, enough to feel the interface before deciding whether to onboard your own voice.\n\n## Why it's different\n\n**Your pushback and edits teach it how to sound more like you.**\nThe final diff between its draft and your published piece becomes evidence for future work. Corrections don't evaporate, they compound.\n\n**You can write beside it, not just review its output.**\n`/muse` turns a half-formed thought into a finished piece through dialogue, and by default every sentence in that piece is one you actually said, quarried from the conversation and reordered rather than paraphrased. Writing *with* the AI instead of sitting back to approve its guesses is the most natural anti-slop pattern there is.\n\n**Voice rules are auditable.**\nEvery rule points back to a real sample, edit, or correction. Nothing silently drifts into your profile; rules earn their way into the ratified spec through ships survived and your sign-off.\n\n**Quality checks are independent.**\nFact, critique, and voice reviews run in fresh contexts, outside the one that wrote the draft. Mechanical AI tells are counted by code, not vibes.\n\n**Your work stays legible and portable.**\nThe board is folders. The drafts are Markdown. The memory is an append-only ledger. No database, no lock-in, no export button because nothing was ever locked in.\n\n**You remain the publisher.**\nTwo gates on the board move only by your hand: deciding what's worth drafting, and deciding what ships. Nothing automated ever crosses the second.\n\n## Install\n\nPrerequisites: [Claude Code](https://claude.com/claude-code) and Node 20+.\n\nAdd the plugin in Claude Code:\n\n```\n/plugin marketplace add dhalarewich/plugins\n/plugin install writers-room@dhalarewich\n```\n\nThen install the `wr` CLI, the deterministic substrate the agents drive:\n\n```bash\nnpm i -g @dhalarewich/writers-room\n```\n\n`wr --help` lists the verbs. (To hack on the CLI itself, clone the repo and run `npm install && npm run build && npm link` instead.)\n\n## Set up your first studio\n\n```bash\nmkdir ~/writing/my-studio && cd ~/writing/my-studio\nwr init . --name \"My Studio\" --prefix ms\n```\n\nThen open Claude Code in that folder and run **`/setup`**. Bring 3–8 pieces you actually published, the ones where a friend would say \"this sounds exactly like you.\" Setup interviews you and:\n\n- distills your **Style DNA** from the samples, where every rule must quote a sample line (\"no sample line, no rule\");\n- **measures** your mechanical ceilings (em dashes, contrast-snaps) from your real pieces instead of guessing;\n- asks \"what do you delete on sight?\" and turns every answer into a machine-enforced phrase ban;\n- asks \"what has AI gotten wrong about you before?\" and turns every answer into a Fact-Checker guardrail;\n- fills strategy (north star, audiences, what counts as a winner) and the scoring rubric.\n\nIt takes 15–20 minutes and is fully resumable. **`wr doctor`** shows what's seeded and what's still template, so you can stop anytime and pick up later. The router refuses to ghostwrite on an unseeded studio.\n\n**Second board?** Every folder is its own studio. `/setup --from ~/writing/first-studio` carries your voice (style DNA, bans, samples, bio) over in two minutes; pillars, strategy, and feeds stay per-board.\n\n## A week with it\n\nThe whole product in one loop: an idea gets scored, drafted, checked, shipped, and your hand-edits teach it something. Walkthrough on the demo studio (`fixtures/demo-studio`, prefix `fn`).\n\n**Monday, `/feed`.** It stocks the inbox from every viable source and hands back a ranked list:\n\n```\nfn-0004  Fuel-per-boil is the spec sheet lie          81  gear-truth\n  honest line: the canister log is the piece; without it this is a take\nfn-0005  Buy gear for the trips you take               64  trail-craft\n  honest line: needs the actual audit numbers to clear 72\n```\n\nYou read both. `fn-0005` is short of the auto-promote threshold, but you've already run the trip-log audit it's asking for. Worth drafting anyway, and that call is yours to make, not the score's:\n\n```\nwr move fn-0005 approved\n```\n\n**Tuesday, `/write fn-0005`.** It runs the fact brief, draft, and edit passes and closes with the report `/write` always gives: gate states plus the Editor's Bet, a falsifiable line about how the piece will land.\n\n```\nfn-0005  Buy gear for the trips you take → 5-ready/\n  gates: facts passed · critique passed · voice passed\n  Editor's Bet: comments beat shares here. reads as confession, not advice\n```\n\n**Wednesday**, before anything ships, you open `board/5-ready/fn-0005-*.md` in your own editor, cut two sentences the Editor left in, then run `/ship fn-0005`: the recap, the one question that keeps the voice loop alive, and the result.\n\n```\nBuy gear for the trips you take · linkedin · facts/critique/voice: passed\nEditor's Bet: comments beat shares here. reads as confession, not advice\n\nIs the card text exactly what went (or is going) live? Paste the final\nversion, or say `as-is`.\n> as-is\n\n⇥ fn-0005 published\n  hand edits captured → memory/edits/fn-0005.diff\n  run /learn to mine them into voice memory\n```\n\nTwo hunks in that diff: the two sentences you cut.\n\n**Friday, `/learn`.** It mines the diff and appends a rule, evidence attached, to the same append-only ledger `memory/learnings.md` already holds entries like this in:\n\n```\n1 diff mined, 1 rule appended:\n\"Cut the hedge before the numbers. The confession lands harder cold.\"\n```\n\nThat last line is the whole point in miniature: a concrete, evidence-backed editorial rule, learned from a decision you actually made. The next draft won't make the same mistake.\n\n<div align=\"center\"><img src=\"assets/screenshots/board.png\" alt=\"wr board, themed terminal render of the demo studio\" width=\"720\"></div>\n\n## Daily use\n\n**The board flows left to right.** Every card starts in `0-inbox` and moves one column rightward until it ships. Your whole job is deciding what advances.\n\n<div align=\"center\"><img src=\"assets/diagrams/board-flow.svg\" alt=\"board flow, two human gates: ideas to approved, ready to published\" width=\"820\"></div>\n\n**Two of those arrows are yours alone.** Everything *between* them the pipeline drives on its own: `/write` runs a card from `approved` through the three gates to `ready`. But the two human gates never move without you, promoting `ideas → approved` and `ready → published`, and while `/write --auto` can cross the first when a score clears your threshold, nothing automated ever crosses the second.\n\n**Moving a card is its own small act**, separate from the work a stage does. Three ways, whichever's in reach:\n\n| To move a card | Do this | When |\n|---|---|---|\n| **Just ask Claude** | \"move ms-7 to approved\" | you're in a Claude Code session |\n| **Terminal** | `wr move ms-7 approved` | you're in the shell |\n| **Drag the file** | drag its `.md` between `board/` folders in Finder, or on the web board | you're looking at the board |\n\nAll three do the same thing: the card's `.md` file physically moves from one `board/` folder to the next. The folder **is** the stage, there's no other state to touch.\n\nFive verbs in Claude Code:\n\n| Command | What it does |\n|---|---|\n| `/feed` | stocks the inbox: all viable sources by default, or focus it in plain words (\"just my feeds\", \"find gaps\", \"something provocative\"). Sources: your published winners, RSS, pillar gaps, stale backlog, theme clusters, dormant knowledge, plus one *provocation* (a real tension between things you've said) |\n| `/muse` | interactive co-writing. Talk through a half-formed thought and it digs out what you actually think (Socratic probes, Five Whys, steelman, hot-take excavation). Stop at a sharp idea card, or keep going (`--piece`) all the way to a finished draft assembled only from sentences *you* said in the conversation (`--cowrite` lifts that restriction so it writes connective prose in your voice). Writing beside it, not reviewing its guesses |\n| `/write` | pipeline engine: fact brief → draft → edit → three gates → `5-ready/`. Single card, batch, `--auto` (score-threshold promotion), or `--table` (round-table treatment for high-stakes pieces) |\n| `/ship` | your publish gate. Recaps gates and the Editor's bet, runs `wr ship`, which diffs the agent-final text against what you actually shipped. `--analytics` logs performance later |\n| `/learn` | closes the loop: classifies your pushback, re-runs the one responsible stage, and mines your ship-time edit diffs into rules (each citing its diff as evidence) |\n\nThe rhythm: `/feed` or `/muse`, review the scored ideas, move what you believe in to `2-approved/`, `/write`, edit the piece in `5-ready/` with your own hands, `/ship`, then `/learn` when you've corrected something.\n\nFrom the terminal, `wr` covers everything without a model: `wr capture \"thought\"` (quick capture to inbox from anywhere; `--set-default` once to make a studio the target), `wr board` (themed render), `wr studio` (full-screen TUI), `wr serve` (web board: drag cards between stages, open a card, archive, ship with paste-back; loads in Claude Code desktop's browser pane), `wr sweep <id>` (count the AI tells in any text), `wr check` (schema lint), `wr doctor` (onboarding state), `wr find` / `wr index` (vault search), `wr adopt` (turn stray notes into cards). A statusline script in `statusline/` shows live pipeline state.\n\nThe same board in the web view (`wr serve`, loads in Claude Code desktop's browser pane):\n\n<div align=\"center\"><img src=\"assets/screenshots/web-board.png\" alt=\"wr serve, the web board in the field-station theme\" width=\"860\"></div>\n\n## Getting things in\n\nCapture has to be instant and judgment-free: no positioning, no scoring, no deciding if it's good. That thinking happens later, at the `/feed` split. Right now the only job is not losing the thought.\n\n```bash\nwr capture \"fuel math nobody does\"\n```\n\nRun it once inside a studio with `--set-default` and captures from anywhere land there, no `cd` required:\n\n```bash\nwr capture --set-default\n```\n\nIt also reads stdin, and can carry its source along:\n\n```bash\n# anything that can pipe text can capture\npbpaste | wr capture -\n\n# --url appends the link as its own trailing paragraph\nwr capture \"the repair math cuts both ways\" --url https://example.com/thread\n```\n\nA few ways to make capture instant on whatever you carry:\n\n- **macOS Shortcut or share sheet**: a shortcut that pipes selected text or a URL into a `wr capture` shell action, callable from anywhere the share sheet shows up.\n- **Raycast script command**: bind a hotkey to a script that shells out to `wr capture \"$1\"`.\n- **Phone**: sync the studio folder (iCloud Drive, Syncthing) and save `.md` files into `board/0-inbox/` from any notes app; `/feed` adopts and splits them like anything else.\n\nAnything that writes a file is a capture client. No account, no API, no server.\n\n## Under the hood\n\nA **studio** is a folder you own. Each project folder is its own independent board:\n\n```\nmy-studio/\n  studio.yml            # name, channels, pillars, thresholds, feeds\n  board/\n    0-inbox/            # raw captures: drop .md/.txt files here from anywhere\n    1-ideas/            # split, positioned, scored\n    2-approved/         # you promoted it: worth drafting\n    3-drafting/  4-editing/\n    5-ready/            # you edit here, in your own editor, as much as you like\n    6-published/\n  vault/\n    voice/style-dna.md        # how you write: every rule cites one of your samples\n    voice/banned-patterns.md  # phrase bans + mechanical ceilings, machine-enforced\n    voice/samples/            # the real pieces the spec was distilled from\n    bio.md                    # facts about you: the anti-hallucination anchor\n    strategy.md  rubric.md    # who it's for, what scores\n    knowledge/                # your subject-matter notes, plain markdown\n  memory/\n    learnings.md        # append-only corrections: the voice memory\n    edits/              # diffs of your hand-edits, captured at ship time\n```\n\n- **Channels**: where you publish. `linkedin`, `blog`, whatever `studio.yml` lists.\n- **Pillars**: the 3–5 themes you own. `/feed` hunts gaps per pillar; the rubric scores how well a piece ladders back to one.\n- **Vault**: ratified memory. Facts and rules you've signed off on: bio, strategy, rubric, style DNA, samples. Agents read it as truth; it changes only on purpose.\n- **Memory**: provisional memory. A machine-written, append-only ledger, every rule citing its evidence. Rules earn their way into the vault through ships survived and your sign-off. Nothing drifts in silently.\n\n<div align=\"center\"><img src=\"assets/diagrams/anatomy.svg\" alt=\"studio anatomy: channels and pillars meet in a card; vault and memory feed the draft\" width=\"820\"></div>\n\nA card's stage **is** its folder. There is no second copy of the truth. Each card carries the working draft plus a `## Dossier`: positioning, rubric score, a per-claim fact table, the edit log, the voice-gate report, and a `Pulled` list of which vault files each stage consulted and why. Retrieval is a table of contents you can read (`vault/INDEX.md`), wiki-links, and lexical search. No embeddings, fully auditable.\n\nThe work is split across six agents by *context boundary*: the reviews that have to stay honest run in a context that never saw the draft being reviewed. That isolation, not the head-count, is the point.\n\n| Agent | Job |\n|---|---|\n| Scout | mines sources, splits captures into distinct positioned ideas |\n| Critic | scores against your rubric; critique gate on finished pieces, never shares the maker's context |\n| Fact-Checker | bio first, vault second, web last; per-claim table with confidence tiers |\n| Writer | drafts as you: voice embodiment is the whole job |\n| Editor | density, hook, close; the Writer's designed adversary |\n| Warden | the voice gate: tool-counted de-slop sweep + fidelity verdict, always last |\n\nEach role runs on a fixed model chosen for its job: the Writer, Editor, Fact-Checker, and Warden run on Opus, where voice fidelity and defensibility are worth the cost; the Scout and Critic run on Sonnet. To change the split, edit the `model:` line in the matching `agents/*.md` file.\n\nPlus the Muse, who lives in the main conversation: a Socratic interviewer that can stop at a sharp idea card, or keep going to a finished piece built only from sentences you actually said in the transcript.\n\nEvery piece passes three gates before it reaches `5-ready/`: facts, critique, voice. Nothing ever auto-publishes. `5-ready → published` is yours alone.\n\n## The voice memory loop\n\nThree channels feed `memory/learnings.md`:\n\n1. **You say so**: notes on a card, classified and routed by `/learn`.\n2. **Onboarding**: `/setup` distills the starting spec from published pieces.\n3. **Your hands**: when a card enters `5-ready/`, the agent-final text is snapshotted; when you ship, the diff is captured and mined into rules. Rules that hold graduate into the style DNA, or become regex-enforced bans. The best fate for a correction is becoming a mechanical check.\n\n## The eval\n\nThe six-context lineup is a hypothesis, not a belief, and the honest result is why the marketing above sells *independent checks*, not *more agents*. `wr eval` runs seed cards (reverse-engineered from real published pieces, identical pre-verified fact briefs for both sides) through the lineup and through one well-prompted solo agent, scores both mechanically (`wr sweep`) and by a blind judge against the real published references, and writes the report.\n\nThe short version: overall draft quality came out roughly even with a well-prompted solo agent. The lineup won 3–2 at `n=5`. The measurable edge wasn't better prose; it was **restraint and fewer mechanical AI tells**, from the independent voice gate and tool-counted checks. The eval also caught a real pipeline failure: the room leaking its own scaffolding into a piece. Full numbers and methodology in [docs/EVAL-RESULTS.md](docs/EVAL-RESULTS.md). Run it on your own studio; if solo ties the lineup for your voice, use fewer contexts.\n\n## Hosts\n\nBuilt as a **Claude Code** plugin today; **Codex support is planned**. The substrate is deliberately host-agnostic: the board, vault, and memory are plain markdown operated through the `wr` CLI, and every agent behavior is a markdown instruction file. Nothing in the working system depends on a specific model host except the thin packaging (`.claude-plugin/`, `skills/`, `commands/`, `agents/`).\n\nPorting to **Codex** (or any CLI agent) means: an AGENTS.md router mirroring `skills/writers-room/SKILL.md`, custom prompts mirroring `commands/`, and running the pipeline stages as separate headless CLI calls instead of subagents. That's a pattern the eval harness already uses: each stage is an isolated call with a file-assembled prompt, which preserves the fresh-context property the gates depend on. The eval runner's engine binary is overridable via `WR_ENGINE`.\n\n## Contributing\n\nThis is alpha, single-author, and moving fast, so expect sharp edges. Issues and PRs welcome; good first areas are the Codex port, additional capture clients, and studio themes. If you're building on the `wr` CLI, `wr --help` and the tests (`npm test`) are the fastest map of what's stable.\n\n## What this is not\n\nNo scheduler, no multi-platform distribution, no analytics dashboards, no vector database, no growth hacks. It writes with you and protects your voice; you publish. That's the job.\n\n## License\n\nMIT\n","readmeFilename":"README.md"}