openwriter 0.35.1 → 0.36.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/assets/{index-Be_l2OOL.css → index-B5p6e-z0.css} +1 -1
- package/dist/client/assets/{index-BPDt3Psd.js → index-BMhKsQ_t.js} +53 -53
- package/dist/client/index.html +2 -2
- package/dist/plugins/authors-voice/skill/LICENSE +21 -0
- package/dist/plugins/authors-voice/skill/README.md +126 -0
- package/dist/plugins/authors-voice/skill/SKILL.md +151 -0
- package/dist/plugins/authors-voice/skill/catalog/ai-tells.md +144 -0
- package/dist/plugins/authors-voice/skill/catalog/anchor-prompt.md +189 -0
- package/dist/plugins/authors-voice/skill/catalog/author-hints.md +119 -0
- package/dist/plugins/authors-voice/skill/catalog/fingerprints.md +175 -0
- package/dist/plugins/authors-voice/skill/catalog/hurdle.md +76 -0
- package/dist/plugins/authors-voice/skill/catalog/post-write-audit.md +105 -0
- package/dist/plugins/authors-voice/skill/docs/analysis.md +31 -0
- package/dist/plugins/authors-voice/skill/docs/anchor-iteration.md +176 -0
- package/dist/plugins/authors-voice/skill/docs/api/import.md +78 -0
- package/dist/plugins/authors-voice/skill/docs/api/protocol.md +140 -0
- package/dist/plugins/authors-voice/skill/docs/api/setup.md +37 -0
- package/dist/plugins/authors-voice/skill/docs/api/tools.md +102 -0
- package/dist/plugins/authors-voice/skill/docs/api/troubleshooting.md +7 -0
- package/dist/plugins/authors-voice/skill/docs/apply-protocol-deep.md +191 -0
- package/dist/plugins/authors-voice/skill/docs/context-hygiene.md +33 -0
- package/dist/plugins/authors-voice/skill/docs/setup.md +74 -0
- package/dist/plugins/authors-voice/skill/docs/tiers.md +13 -0
- package/dist/plugins/authors-voice/skill/package.json +35 -0
- package/dist/plugins/authors-voice/skill/prompts/skeleton.md +29 -0
- package/dist/plugins/authors-voice/skill/voice/README.md +51 -0
- package/dist/plugins/authors-voice/skill/voice/corpus/.gitkeep +0 -0
- package/dist/server/documents.js +7 -10
- package/dist/server/state.js +27 -7
- package/dist/server/title-resolve.js +87 -0
- package/dist/server/workspaces.js +10 -4
- package/package.json +1 -1
package/dist/client/index.html
CHANGED
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
11
11
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
12
12
|
<link href="https://fonts.googleapis.com/css2?family=Charter:ital,wght@0,400;0,700;1,400&family=Crimson+Pro:ital,wght@0,300;0,400;0,600;0,700;1,400&family=DM+Sans:ital,wght@0,400;0,500;0,600;0,700;1,400&family=DM+Serif+Display&family=IBM+Plex+Mono:wght@400;500;600&family=IBM+Plex+Sans:wght@400;500;600&family=Inter:wght@400;500;600;700&family=Libre+Baskerville:ital,wght@0,400;0,700;1,400&family=Literata:ital,opsz,wght@0,7..72,400;0,7..72,600;0,7..72,700;1,7..72,400&family=Newsreader:ital,opsz,wght@0,6..72,400;0,6..72,600;1,6..72,400&family=Playfair+Display:wght@400;600;700;900&family=Source+Serif+4:ital,opsz,wght@0,8..60,400;0,8..60,600;0,8..60,700;1,8..60,400&family=Space+Grotesk:wght@400;500;600;700&family=Space+Mono:wght@400;700&display=swap" rel="stylesheet" />
|
|
13
|
-
<script type="module" crossorigin src="/assets/index-
|
|
14
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
13
|
+
<script type="module" crossorigin src="/assets/index-BMhKsQ_t.js"></script>
|
|
14
|
+
<link rel="stylesheet" crossorigin href="/assets/index-B5p6e-z0.css">
|
|
15
15
|
</head>
|
|
16
16
|
<body>
|
|
17
17
|
<div id="root"></div>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Travis Steward
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# authors-voice
|
|
2
|
+
|
|
3
|
+
> **AI writing that sounds like you, not AI.**
|
|
4
|
+
|
|
5
|
+
Most attempts to make AI sound like you start the same way. Train it. Fine-tune it. Feed it your samples and tell it to imitate. The model doesn't actually learn you from any of this. It pattern-matches at the lexical layer, lifting your common words and sentence shapes without ever building a deep representation of how you think. Cold-start imitation tops out shallow.
|
|
6
|
+
|
|
7
|
+
Flip the direction. The model already carries deep internal representations of widely-published authors it was trained on at scale, voices it can channel with real fidelity because it saw thousands of pages of each. The move is to identify which of those authors a user statistically resembles, assign proportional weights to the closest matches, and instruct the model to write as that weighted blend. Your voice gets reconstructed as a coordinate inside the model's existing author space, anchored to authors it has already mastered.
|
|
8
|
+
|
|
9
|
+
That changes the problem. The model isn't being asked to learn anything new about you. It's being asked to mix voices it knows cold, in proportions that triangulate your position among them. The anchor does the heavy lifting before a single sample of yours enters the prompt. The blend is the voice.
|
|
10
|
+
|
|
11
|
+
The result is AI writing that sounds like you. Not AI imitating you.
|
|
12
|
+
|
|
13
|
+
On top of the anchor, four layers sharpen the output. A list of AI words and constructions the model must never use, because the moment it stops channeling the anchor it reverts to its trained register and reaches for the same fifty tells. Presentation choices you make consistently, like whether you capitalize after a colon or use the Oxford comma, small mechanical preferences that read as authentic. A sentence-length and punctuation rhythm pulled from your own writing, so the cadence matches even when the diction is on loan. A growing folder of your samples that the skill mines as the negative rules and rhythm get re-derived.
|
|
14
|
+
|
|
15
|
+
Each sample you add updates the NEVER rules and the sentence rhythm against your latest corpus. The anchor and presentation fingerprints don't auto-refresh. Regenerate those when you've added enough new writing to shift the matches, or when you want a fresh pass. The profile gets sharper the more you write and the more often you ask for a refresh.
|
|
16
|
+
|
|
17
|
+
Roughly 80% of the way to your real voice. A hard jump above what stock prompting and fine-tuning produce.
|
|
18
|
+
|
|
19
|
+
## Install
|
|
20
|
+
|
|
21
|
+
The skill is **agent-agnostic**. Pure markdown, no language runtime. Any LLM-based agent that can read `SKILL.md` and follow instructions can use it.
|
|
22
|
+
|
|
23
|
+
### Claude Code
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
claude install github:travsteward/authors-voice
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Clones to `~/.claude/skills/authors-voice/` and registers the skill with Claude Code.
|
|
30
|
+
|
|
31
|
+
### Vercel skills CLI (Claude Code, Codex, Cursor, and other agents)
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
npx skills add travsteward/authors-voice
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### Manual (any agent)
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
git clone https://github.com/travsteward/authors-voice
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Then drop the cloned folder wherever your agent loads skills from. The `SKILL.md` at the root has the trigger phrases and routing logic the agent reads.
|
|
44
|
+
|
|
45
|
+
## Quick Start
|
|
46
|
+
|
|
47
|
+
Two paths. Pick one.
|
|
48
|
+
|
|
49
|
+
**Path A: Web tool first (fastest first-run)**
|
|
50
|
+
1. Visit [openwriter.io/voice-match](https://openwriter.io/voice-match), paste 300 to 800 words of your writing, copy the result block.
|
|
51
|
+
2. Tell your agent: *"set up my voice match"*. Paste the block when prompted.
|
|
52
|
+
3. **Seed your corpus**: paste 2 to 5 paragraphs that feel most like you. The agent saves them under `voice/corpus/`.
|
|
53
|
+
4. Done.
|
|
54
|
+
|
|
55
|
+
**Path B: Skill mode (no web round-trip)**
|
|
56
|
+
1. Tell your agent: *"set up my voice match"* and *"I want to skip the web tool."*
|
|
57
|
+
2. Paste 2 to 5 paragraphs of your writing. The agent saves them under `voice/corpus/`.
|
|
58
|
+
3. The agent runs the Anchor Protocol over your corpus and writes `voice/anchor.md` directly.
|
|
59
|
+
4. Done.
|
|
60
|
+
|
|
61
|
+
The skill is self-routing. You don't memorize subcommands. Just tell the agent what you want:
|
|
62
|
+
|
|
63
|
+
- *"voice status"* → reports your current tier and word count
|
|
64
|
+
- *"add this essay to my voice profile"* → appends, re-analyzes
|
|
65
|
+
- *"write me a tweet about X"* → uses your voice automatically
|
|
66
|
+
|
|
67
|
+
## How It Works
|
|
68
|
+
|
|
69
|
+
Your voice profile lives in `voice/` as a handful of `.md` files the agent reads at write time:
|
|
70
|
+
|
|
71
|
+
| File | Source | Purpose |
|
|
72
|
+
|------|--------|---------|
|
|
73
|
+
| `anchor.md` | One-time match from [openwriter.io/voice-match](https://openwriter.io/voice-match) (or skill-mode). Refresh on demand. | 3 to 5 training-data authors with weights |
|
|
74
|
+
| `stats.md` | Auto-regenerated from corpus on every analysis run | Sentence distribution + punctuation density |
|
|
75
|
+
| `never-rules.md` | Auto-regenerated from corpus on every analysis run. Manual additions preserved. | AI words and phrases the model must never use |
|
|
76
|
+
| `fingerprints.md` | Agent extracts from corpus during analysis runs. Manual overrides preserved. | Presentation choices (Oxford comma, capitalization after colon, contraction frequency) |
|
|
77
|
+
| `coined-terms.md` | You curate | Your repeated coinages |
|
|
78
|
+
| `examples.md` | You curate | Reference paragraphs in your voice |
|
|
79
|
+
| `status.md` | Auto-regenerated on every analysis run | Current tier and what's locked next |
|
|
80
|
+
|
|
81
|
+
Plus `voice/corpus/`. Your raw samples accumulating over time. None of `voice/*` is committed. It's all local to your disk.
|
|
82
|
+
|
|
83
|
+
What updates reliably on every sample add: NEVER rules, sentence stats, status. What gets re-derived in protocol but agents sometimes skip: fingerprints (ask for a rebuild if you want certainty). What needs an explicit ask: anchor weights ("regenerate my anchor"). The corpus folder is yours to grow.
|
|
84
|
+
|
|
85
|
+
## Progressive Tiers
|
|
86
|
+
|
|
87
|
+
The more samples you add, the more confident the analysis.
|
|
88
|
+
|
|
89
|
+
| Words | Tier | Active |
|
|
90
|
+
|-------|------|--------|
|
|
91
|
+
| under 300 | 0 | seed corpus first |
|
|
92
|
+
| 300 to 1k | 1 | anchor and basic stats |
|
|
93
|
+
| 1k to 5k | 2 | preliminary NEVER rules and top fingerprints unlock |
|
|
94
|
+
| 5k to 20k | 3 | full NEVER coverage and all fingerprints unlock |
|
|
95
|
+
| 20k and up | 4 | high-confidence profile |
|
|
96
|
+
|
|
97
|
+
## Privacy
|
|
98
|
+
|
|
99
|
+
- Your voice data lives entirely on your disk. `.gitignore` excludes everything in `voice/` from the public repo.
|
|
100
|
+
- The skill never uploads your corpus anywhere.
|
|
101
|
+
- The only thing that leaves your machine is the initial 300 to 800 word paste into openwriter.io/voice-match for the anchor matching step. That's cached 24h by hash and never trained on.
|
|
102
|
+
|
|
103
|
+
## Requirements
|
|
104
|
+
|
|
105
|
+
- A Claude Code or compatible agent that supports skills (no Node.js dependency)
|
|
106
|
+
- An initial visit to [openwriter.io/voice-match](https://openwriter.io/voice-match) for the anchor (free, no signup), or use skill-mode to build it locally
|
|
107
|
+
|
|
108
|
+
## Beyond the skill
|
|
109
|
+
|
|
110
|
+
Pairs naturally with [OpenWriter](https://openwriter.io), the free AI writing surface. Same anchor system also powers the paid Author's Voice plugin (inline voice edits inside OpenWriter) and the paid API (programmatic voice-matched output for workflows and apps). See [authors-voice.com](https://authors-voice.com) when you outgrow the skill alone.
|
|
111
|
+
|
|
112
|
+
## License
|
|
113
|
+
|
|
114
|
+
MIT. See [LICENSE](./LICENSE).
|
|
115
|
+
|
|
116
|
+
## Replaces
|
|
117
|
+
|
|
118
|
+
This skill replaces the older `writers-voice` skill and the legacy `voice-apply`, `voice-generate`, `voice-setup`, `voice-upload`, `voice-manage`, and `voice-automate` skills. They are now one trigger: `/authors-voice`.
|
|
119
|
+
|
|
120
|
+
## History
|
|
121
|
+
|
|
122
|
+
The local-skill half of `/authors-voice` started life as the standalone `writers-voice` skill. Its full development history (every iteration of the anchor protocol, NEVER rules, fingerprints, and tier logic) lives in the archived `travsteward/writers-voice` repo's git log. The repo is private now, but the commit log is preserved as the record of how the constructed-voice architecture evolved before it was unified here.
|
|
123
|
+
|
|
124
|
+
## Credits
|
|
125
|
+
|
|
126
|
+
Built on the negative-first voice profiling architecture from [Author's Voice](https://authors-voice.com). Pairs with [OpenWriter](https://openwriter.io), the writing surface for AI agents.
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: authors-voice
|
|
3
|
+
description: |
|
|
4
|
+
Author's Voice — constructed-voice skill. Anchors writing to a training-data
|
|
5
|
+
author blend, progressively layers NEVER rules, presentation fingerprints,
|
|
6
|
+
sentence stats, coined terms, and curated examples from a growing local
|
|
7
|
+
corpus. Pure markdown, opus sub-agent (the minion) writes prose.
|
|
8
|
+
|
|
9
|
+
Use when: "/authors-voice", "/writers-voice", "set up my voice", "anchor
|
|
10
|
+
my voice", "voice match", "use my voice", "write in my voice", "add to my
|
|
11
|
+
voice profile", "voice profile status", "voice status", "authors voice",
|
|
12
|
+
"writer's voice".
|
|
13
|
+
|
|
14
|
+
API path (plugin / programmatic flows): see `docs/api/` for the rewrite +
|
|
15
|
+
generate endpoints, MCP tools, setup, and troubleshooting. The local skill
|
|
16
|
+
body below is the default; the API is one access point among others.
|
|
17
|
+
metadata:
|
|
18
|
+
author: travsteward
|
|
19
|
+
version: "0.19.1"
|
|
20
|
+
license: MIT
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
# Author's Voice
|
|
24
|
+
|
|
25
|
+
_This skill is the free, any-agent manifestation of the larger Author's Voice ecosystem — the same anchor + NEVER-rules + anti-AI engine that powers the paid API, the OpenWriter plugin, and the dashboard. Free here, productized there; one voice DNA across all surfaces._
|
|
26
|
+
|
|
27
|
+
## FIRM RULES
|
|
28
|
+
|
|
29
|
+
### 1. Editor NEVER writes prose. Every writing task fires a minion.
|
|
30
|
+
|
|
31
|
+
The editor scopes briefs, cuts, reorders, and patches NEVER violations. Editor does NOT write new prose — every word ENTERING the document is minion-written. Applies to: initial drafts, revisions, bridges, closers, openers, transitions, single-line aphorisms, one-paragraph corrections, gap-fillers, idea-extensions — any new prose, full stop.
|
|
32
|
+
|
|
33
|
+
Two carve-outs: (1) **violation patch** at Apply step 6 — 1-3 sentence local fix to NEVER violation or brief-error in otherwise-acceptable minion output; constructive rephrase preferred. (2) **co-write mode** — editor writes directly when ALL THREE hold: continuous real-time collaboration (user steering each move), explicit per-piece authorization for THIS piece, small scope (sentence to short paragraph; max one). Blanket authorizations ("you handle it") do NOT trigger co-write — those are delegations and go to the minion.
|
|
34
|
+
|
|
35
|
+
Editor territory (no minion): cuts, reorders, accept/reject decorations, resolve agent marks, version restores. Cuts that leave holes needing new connective tissue — the connector is minion work.
|
|
36
|
+
|
|
37
|
+
Rationale: editor context is polluted by the live conversation; voice anchors lose to active context; minion in clean context with voice files loaded outperforms editor-with-intent.
|
|
38
|
+
|
|
39
|
+
If the editor catches itself drafting prose mid-conversation, **STOP** and spawn a minion — even for one sentence.
|
|
40
|
+
|
|
41
|
+
### 2. After anchor critique, discuss before revising.
|
|
42
|
+
|
|
43
|
+
Anchor critique returns scores + convergent diagnostic. First move after aggregation: surface to user, discuss what to act on / disagree with / defer, align scope. Then spawn revision minions. Critics are advisory; user owns the prose.
|
|
44
|
+
|
|
45
|
+
Anchor critique result protocol:
|
|
46
|
+
1. Aggregate panel scores + convergent diagnostic.
|
|
47
|
+
2. Surface to user: scores, themes raised by 3+ critics, proposed CUTS (subtraction) and REWRITES / ADDITIONS (new prose).
|
|
48
|
+
3. Discuss. User decides act / disagree / defer. No revision begins until this happens.
|
|
49
|
+
4. Editor executes agreed CUTS directly (Rule 1 carve-out).
|
|
50
|
+
5. Editor scopes briefs for agreed REWRITES / ADDITIONS, spawns revision minions per brief.
|
|
51
|
+
6. Patch micro-violations on returned prose.
|
|
52
|
+
7. Re-fire panel only if user wants another pass.
|
|
53
|
+
|
|
54
|
+
### 3. Revisions must be tighter than the original. If a revision is additive, the editor wrote it.
|
|
55
|
+
|
|
56
|
+
Critique-driven revision produces a smaller word count, not larger. If post-revision is longer than pre-revision, the editor was inventing rather than executing the diagnostic. Revision minion brief specifies a WORD-COUNT TARGET (often "this paragraph in 60% of the original"). Minion compresses. Editor verifies the count dropped.
|
|
57
|
+
|
|
58
|
+
## Architecture
|
|
59
|
+
|
|
60
|
+
Skeleton prompt template (`prompts/skeleton.md`) assembled from per-user `voice/*.md` files at write time. Editor loads skeleton, substitutes `{INCLUDE: ...}` markers, fills `{TASK}`, spawns a fresh opus sub-agent (the minion) with the assembled prompt (Claude Code) or dispatches via `task({ subagent_type: "general", prompt: <assembled skeleton> })` (OpenCode). Minion has no session pollution, returns prose, dies. Editor integrates.
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
writers-voice/
|
|
64
|
+
├── SKILL.md (this file — router + firm rules + Apply Protocol)
|
|
65
|
+
├── docs/ (on-demand: setup, analysis, apply-deep, anchor-iteration, context-hygiene, tiers)
|
|
66
|
+
├── catalog/ (read-only reference: ai-tells, fingerprints, hurdle, anchor-prompt, author-hints, post-write-audit)
|
|
67
|
+
├── prompts/skeleton.md (template + injection points)
|
|
68
|
+
└── voice/ (user-specific — anchor blend, NEVER rules, stats, fingerprints, coined-terms, examples, corpus/)
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Lean / rich split: `voice/*-analysis.md` is human-facing only — never injected into the minion prompt.
|
|
72
|
+
|
|
73
|
+
## Routing
|
|
74
|
+
|
|
75
|
+
| User intent | Action |
|
|
76
|
+
| --- | --- |
|
|
77
|
+
| "set up my voice" / "/writers-voice" / first run | **Setup Flow** — `docs/setup.md` |
|
|
78
|
+
| "add this essay to my voice profile" / "save this writing" | Append to `voice/corpus/`, run **Analysis Protocol** — `docs/analysis.md` |
|
|
79
|
+
| "voice status" / "what's locked" / "tier" | Read `voice/status.md`; tier reference at `docs/tiers.md` |
|
|
80
|
+
| (User asks the agent to write anything) | Run **Apply Protocol** (below) after **Context Hygiene** check — `docs/context-hygiene.md` |
|
|
81
|
+
| "show me my anchor" / "show me my fingerprints" | Read the relevant `voice/*.md` and report |
|
|
82
|
+
| "regenerate my profile" / "re-analyze my corpus" | **Analysis Protocol** — `docs/analysis.md` |
|
|
83
|
+
| "make a book / business / [context] voice anchor" | **Anchor Protocol** for that register — `docs/setup.md` |
|
|
84
|
+
| "split my anchor by register" | **Multi-Register Split** — `docs/setup.md` |
|
|
85
|
+
| Book-scale project (multi-chapter book) | Load `/book-writer` skill — that's the orchestration layer (chapter architecture, beats methodology, workspace management, book mode, long-form orchestration). This skill provides the Apply Protocol that `/book-writer` delegates to for every prose pass. |
|
|
86
|
+
| "polish this" / "iterate to 90" / final-polish ready prose | **Anchor Iteration** — `docs/anchor-iteration.md` |
|
|
87
|
+
| "use the API" / "call author's voice from a workflow" / plugin / programmatic | API path — `docs/api/protocol.md` (rewrite, generate, MCP tools, setup, troubleshooting) |
|
|
88
|
+
|
|
89
|
+
## Apply Protocol (Apply Minion — generative writing from commitments)
|
|
90
|
+
|
|
91
|
+
Four minion types (full taxonomy: `docs/apply-protocol-deep.md`): **Apply** (generative, no source prose) · **Rewrite** (Apply + context awareness, updated commitments) · **Blinder Audit** (critic — paragraph-level substance duplication only) · **Anchor Iteration** (polish — channels voice anchors as panel, iterates critique → rewrite → re-score until 90/100).
|
|
92
|
+
|
|
93
|
+
Pick the wrong minion → weak output. Substance problem → Rewrite, not Apply. Rough draft → not Anchor Iteration.
|
|
94
|
+
|
|
95
|
+
When the user asks for a voice-matched write:
|
|
96
|
+
|
|
97
|
+
1. **Context Hygiene check.** Reset if polluted — `docs/context-hygiene.md`.
|
|
98
|
+
2. **Pick the anchor.** List `voice/anchor*.md`. If only `voice/anchor.md`, use it. If context-specific, infer from request or ask. Fallback: `voice/anchor.md`.
|
|
99
|
+
3. **Assemble the minion prompt.** Read `prompts/skeleton.md`. For each `{INCLUDE: <path>}`, substitute file contents. If a referenced file is missing (e.g., user hasn't curated examples), drop the entire `{INCLUDE: ...}` line AND its section header. Swap `voice/anchor.md` → `voice/anchor-<context>.md` if a context-specific anchor applies.
|
|
100
|
+
4. **Fill `{TASK}`.**
|
|
101
|
+
|
|
102
|
+
**Required: COMMITMENTS** — what must be true of the output (concepts, claims, sequence, register, avoidances, length).
|
|
103
|
+
|
|
104
|
+
**DEFAULT MODE: pure generation (regenerate).** SEMANTIC commitments only — what claims must land, not how to phrase them. No structural beats. No paragraph patterns. No device prescription. No sentence-rhythm prescription. The shape of any prescription becomes a ceiling on what the model produces. Let the minion bring its own moves. Always.
|
|
105
|
+
|
|
106
|
+
### Never write meta-references into commitments
|
|
107
|
+
|
|
108
|
+
Anything the prose reader cannot see — chapter labels, beat numbers, "as discussed earlier", "the previous beat established" — does NOT belong in commitments. The minion reproduces them literally and breaks the fourth wall. Commitments describe what must be COMMUNICATED, never how the editor is thinking about structural position. If continuity from a prior section matters, capture it as the SUBSTANTIVE thread the new section must pick up (the content, not the structural pointer).
|
|
109
|
+
|
|
110
|
+
### COMMITMENTS function as quasi-verbatim instructions
|
|
111
|
+
|
|
112
|
+
When the editor writes a commitment with literal phrasing in parentheses (*"Define sleep debt (lost sleep compounds like unpaid interest)"*), the model treats the parenthetical as exact phrasing to reproduce — every section gets that line. For multi-section work where phrasing should vary, write commitments abstractly (*"Define sleep debt"*) and let the model phrase. Use literal commitments only when a specific phrasing MUST land.
|
|
113
|
+
|
|
114
|
+
### Read prior integrated sections first (multi-section work)
|
|
115
|
+
|
|
116
|
+
Read prior integrated sections before writing this one's brief. Cadence shapes already used, substantive threads to pick up, and heavy-use coined terms are only visible by reading what's on the page. Set the new section's commitments and cadence prescription against that context.
|
|
117
|
+
|
|
118
|
+
### Preservation scope (load-bearing call on a gradient)
|
|
119
|
+
|
|
120
|
+
| Mode | Source prose in TASK? | Commitments shape | Use when |
|
|
121
|
+
|---|---|---|---|
|
|
122
|
+
| **Full preservation (rewrite mode)** | YES | "preserve every load-bearing claim; refine voice while preserving structure and phrasing" | source is already strong; author has specific phrasing that must land; polishing voice-applied work |
|
|
123
|
+
| **Pure generation with selective lifts** | NO | OMIT source. Identify 1-3 specific moves worth keeping. Lift them pre-emptively (MUST-APPEAR-VERBATIM in brief) OR post-edit (patch in after minion returns) | source is mostly weak with 1-3 lines worth keeping. Pre-emptive when known in advance; post-edit when the strong move is only obvious after seeing the minion's output |
|
|
124
|
+
| **Pure generation (regenerate)** | NO | SEMANTIC commitments only — what claims must land, not how to phrase them | source is "good but not great"; want dramatic improvement; existing shape would constrain output; high-stakes piece. The shape of the source becomes a ceiling on what the model produces |
|
|
125
|
+
|
|
126
|
+
### Cadence prescription (optional, recommended for high-stakes writing)
|
|
127
|
+
|
|
128
|
+
Lifts voice fidelity ~0.5 points over baseline. Explicit rhythm scaffolding doesn't constrain content; it frees capacity by removing "what shape should this take?" overhead.
|
|
129
|
+
|
|
130
|
+
Example: *"Para 1: open with 3 short declaratives, stack medium with concrete examples, close with one analytical long. Para 2: alternate short claim with longer explanatory, end with sharp short. Para 3: build with longer analytical, end with single-line aphoristic close."*
|
|
131
|
+
|
|
132
|
+
**Vary cadence prescriptions across sections.** Same prescription per section produces document-scale rhythm repetition (every section opens with 3 shorts, closes with aphorism) — invisible at section scale, mechanical at document scale.
|
|
133
|
+
|
|
134
|
+
Edge-case guidance (Rewrite Minion brief template, Blinder Audit brief shape, multi-section context-loading layers, writing minion taxonomy): `docs/apply-protocol-deep.md`.
|
|
135
|
+
5. **Spawn the minion.** Claude Code: `model: "opus"`, `subagent_type: "general-purpose"`. OpenCode: `subagent_type: "general"` with no model parameter (subagent inherits parent model; encourage using the session's strongest model). Both: `prompt: <assembled skeleton>`.
|
|
136
|
+
6. **Patch NEVER violations + brief-error meta-references.** Smallest local span. Constructive rephrase preferred (contrastive negation → direct statement; banned word → plain equivalent; meta-reference → substantive thread it pointed at). Don't regenerate; minion voice IS the result. Detail: `docs/apply-protocol-deep.md`.
|
|
137
|
+
7. **Post-write audit.** Read `catalog/post-write-audit.md` and apply distribution-level checks (opener repetition, sentence-initial "The", function-word over-use, sentence-length variance, lexical watch list). For each failing check, surgically rewrite the smallest local span — 5-10 light substitutions across a typical draft; heavier rewrites mean misuse. Load-bearing prose wins ties.
|
|
138
|
+
8. **Integrate via openwriter.** `write_to_pad` for edits, `populate_document` for new docs.
|
|
139
|
+
9. **Cross-section coherence review** (multi-section only). (a) Editor self-review — cut test: could you delete this paragraph and lose only redundancy? (b) **Mandatory Blinder Audit Minion** — fresh-context critic, paragraph-level substance duplication only. Most well-written beats produce zero findings. Brief template + exclusions: `docs/apply-protocol-deep.md`.
|
|
140
|
+
10. **Polish (optional, two patterns).** (a) **Parallel pick-best** — N (3-6) Apply minions in parallel, same brief; editor picks best whole, mixes variants, or hands all to user. (b) **Anchor Iteration** — `docs/anchor-iteration.md`. Polish-class only; not for rough drafts.
|
|
141
|
+
11. **`/anti-ai` pass.** MANDATORY after Anchor Iteration (which runs no-context and introduces AI tells). OPTIONAL otherwise. Global surface fingerprints (em-dashes, semicolons, contrastive negation, banned diction, register monotony) vs `voice/never-rules.md` + `voice/fingerprints.md`. Complements step 7.
|
|
142
|
+
|
|
143
|
+
**Use opus (Claude Code).** Sonnet leaks 3+ NEVER violations where opus leaks 0-1. Haiku loses voice. **OpenCode:** subagents inherit the parent model — use the strongest model available in the session for prose generation.
|
|
144
|
+
**Send full editing scope.** If 6 of 8 paragraphs need fixes, send all 8 for flow continuity.
|
|
145
|
+
**One minion per natural editing unit** — beat, section, blog post, tweet thread.
|
|
146
|
+
|
|
147
|
+
## Tiers + Companion Skills
|
|
148
|
+
|
|
149
|
+
Voice profile tiers (Empty / Anchor / Preliminary / Full Coverage / AV-Grade) gate features by corpus word count. Table: `docs/tiers.md`.
|
|
150
|
+
|
|
151
|
+
Companions: `/anti-ai` (final fingerprint scrub) · `/voice-presets` (generic frames, no profile — if installed) · Author's Voice plugin (paid — full RAG, inline edits, deterministic extraction).
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
# AI Tells Catalog
|
|
2
|
+
|
|
3
|
+
> The 60+ words, transitions, phrases, and patterns that signal "this was AI-generated."
|
|
4
|
+
> Use this list when analyzing a user's corpus to decide which NEVER rules to emit.
|
|
5
|
+
|
|
6
|
+
## How to use this catalog
|
|
7
|
+
|
|
8
|
+
For each item below, count how many times it appears in the user's corpus (case-insensitive, whole-word match for words; literal substring for phrases). Then apply the [authenticity hurdle](./hurdle.md):
|
|
9
|
+
|
|
10
|
+
- **If count and rate both clear the hurdle** → the user genuinely uses this. Preserve it. Do NOT emit a NEVER rule.
|
|
11
|
+
- **If it appears but below the hurdle** → corpus contamination (likely from AI-assisted earlier drafts). Emit a NEVER rule.
|
|
12
|
+
- **If it doesn't appear at all** → emit a NEVER rule (training data will push it back in unless explicitly banned).
|
|
13
|
+
|
|
14
|
+
The default state for every item here is "forbidden." It only graduates to "preserved" if the user uses it at signature frequency.
|
|
15
|
+
|
|
16
|
+
## AI Words (whole-word, case-insensitive)
|
|
17
|
+
|
|
18
|
+
Category: `word`. Authenticity hurdle: count ≥ 2 AND rate ≥ 0.15 per 1000 words.
|
|
19
|
+
|
|
20
|
+
- `delve`
|
|
21
|
+
- `delves`
|
|
22
|
+
- `pivotal`
|
|
23
|
+
- `tapestry`
|
|
24
|
+
- `realm`
|
|
25
|
+
- `beacon`
|
|
26
|
+
- `harness`
|
|
27
|
+
- `illuminate`
|
|
28
|
+
- `underscore` / `underscores`
|
|
29
|
+
- `bolster` / `bolsters`
|
|
30
|
+
- `facilitate` / `facilitates`
|
|
31
|
+
- `multifaceted`
|
|
32
|
+
- `foster` / `fosters`
|
|
33
|
+
- `crucial`
|
|
34
|
+
- `vital`
|
|
35
|
+
- `comprehensive`
|
|
36
|
+
- `robust`
|
|
37
|
+
- `leverage` / `leverages`
|
|
38
|
+
- `seamless` / `seamlessly`
|
|
39
|
+
- `navigate` / `navigates`
|
|
40
|
+
- `embark` / `embarks`
|
|
41
|
+
- `nestled`
|
|
42
|
+
- `unwavering`
|
|
43
|
+
- `indelible`
|
|
44
|
+
- `meticulous` / `meticulously`
|
|
45
|
+
- `transformative`
|
|
46
|
+
- `revolutionize` / `revolutionise`
|
|
47
|
+
|
|
48
|
+
## AI Transitions (sentence-initial unless noted)
|
|
49
|
+
|
|
50
|
+
Category: `transition`. Hurdle: count ≥ 2 AND rate ≥ 0.15 per 1000 words.
|
|
51
|
+
|
|
52
|
+
Match these only when they start a sentence (after `.`, `!`, `?`, or paragraph start). The same word mid-sentence is fine — it's the sentence-leading transitional move that signals AI.
|
|
53
|
+
|
|
54
|
+
- `Moreover,` (sentence start)
|
|
55
|
+
- `Furthermore,` (sentence start)
|
|
56
|
+
- `Notably,` (sentence start)
|
|
57
|
+
- `Additionally,` (sentence start)
|
|
58
|
+
- `Consequently,` (sentence start)
|
|
59
|
+
- `Ultimately,` (sentence start)
|
|
60
|
+
- `Therefore,` (sentence start)
|
|
61
|
+
- `However,` (sentence start) — note: sentence-leading "However" is the tell, not all uses
|
|
62
|
+
- `Indeed,` (sentence start)
|
|
63
|
+
- `Thus,` (sentence start)
|
|
64
|
+
- `Subsequently,` (sentence start)
|
|
65
|
+
- `Nonetheless,` (sentence start)
|
|
66
|
+
- `Firstly,` (sentence start)
|
|
67
|
+
- `In conclusion,` (anywhere)
|
|
68
|
+
|
|
69
|
+
## AI Phrases (literal substring, case-insensitive)
|
|
70
|
+
|
|
71
|
+
Category: `phrase`. Hurdle: count ≥ 2 AND rate ≥ 0.05 per 1000 words.
|
|
72
|
+
|
|
73
|
+
- `provides valuable insights` / `provide valuable insights`
|
|
74
|
+
- `gains valuable insights` / `gain valuable insights`
|
|
75
|
+
- `valuable insights`
|
|
76
|
+
- `a rich tapestry`
|
|
77
|
+
- `plays a crucial role`
|
|
78
|
+
- `in today's digital age` / `in today's digital era`
|
|
79
|
+
- `in the fast-paced world` / `in today's fast-paced world`
|
|
80
|
+
- `at its core`
|
|
81
|
+
- `that being said`
|
|
82
|
+
- `to put it simply`
|
|
83
|
+
- `it's worth noting`
|
|
84
|
+
- `it's important to note`
|
|
85
|
+
- `delve into`
|
|
86
|
+
- `dive into`
|
|
87
|
+
- `navigate the complexities` / `navigating the complexities`
|
|
88
|
+
- `the intricate relationship`
|
|
89
|
+
- `a nuanced understanding`
|
|
90
|
+
- `opens new avenues` / `opens up new avenues`
|
|
91
|
+
- `leaves an indelible mark` / `leave an indelible mark`
|
|
92
|
+
- `stands as a testament` / `stand as a testament`
|
|
93
|
+
- `paves the way` / `pave the way`
|
|
94
|
+
- `a stark reminder`
|
|
95
|
+
- `a beacon of`
|
|
96
|
+
|
|
97
|
+
## AI Punctuation
|
|
98
|
+
|
|
99
|
+
Category: `punctuation`. Hurdle: count ≥ 15 AND rate ≥ 1.5 per 1000 words. (Much higher than diction because punctuation is denser.)
|
|
100
|
+
|
|
101
|
+
- **Em-dashes (`—`)** — the single highest punctuation tell. Most human writers use them at <1 per 1000 words. AI defaults to 4-8 per 1000.
|
|
102
|
+
|
|
103
|
+
## AI Structural Patterns (no regex — pattern recognition)
|
|
104
|
+
|
|
105
|
+
These can't be matched with simple string search. Read the corpus and judge whether each pattern appears.
|
|
106
|
+
|
|
107
|
+
### Always banned (unconditional)
|
|
108
|
+
|
|
109
|
+
- **Contrastive negation** — `"It's not X, it's Y"`, `"Not just X but Y"`, `"Rather than X, Y"`, `"Less X, more Y"`. This is the single most identifiable AI-rhetoric move. Emit the NEVER rule regardless of whether the user uses it. Reason: it's so detectable that even occasional use blows the cover.
|
|
110
|
+
|
|
111
|
+
### Vote-to-ban (emit NEVER unless user clearly uses it as signature move)
|
|
112
|
+
|
|
113
|
+
For each of these, decide: does the user use this as a deliberate stylistic move (≥2 clear instances in corpus)? If yes, preserve. If no, emit a NEVER rule.
|
|
114
|
+
|
|
115
|
+
- **Tricolon abstractions** — rule-of-three lists of abstract nouns as a flourish (e.g., `"innovation, collaboration, and excellence"`, `"strength, courage, and resilience"`). Distinct from regular three-item lists about concrete things.
|
|
116
|
+
- **Soft repetition** — restating the same point with only minor wording changes across consecutive sentences. (Anchoring the same idea with different specifics is fine; rewording the same idea isn't.)
|
|
117
|
+
- **Mismatched enthusiasm** — encouragement, excitement, or affirmation beyond what the content warrants. The "wow that's so insightful!" energy that doesn't fit the actual subject.
|
|
118
|
+
- **Representational hedging** — telling the reader what things `"represent"`, `"underscore"`, `"reflect"`, or `"stand as a testament to"`. The interpretive overlay AI loves to add when concrete description would do.
|
|
119
|
+
|
|
120
|
+
## Adjacent never-rules (deduced from punctuation tally, not from this catalog)
|
|
121
|
+
|
|
122
|
+
After the punctuation density count, if the rate is exactly 0 ("never" category) for any of these, emit a NEVER rule for it — UNLESS it's already covered by an AI-tell label above. This handles punctuation the author simply doesn't use, regardless of whether it's an AI tell.
|
|
123
|
+
|
|
124
|
+
- `en_dash` → "No en-dashes."
|
|
125
|
+
- `semicolon` → "No semicolons."
|
|
126
|
+
- `ellipsis` (`...` or `…`) → "No ellipses."
|
|
127
|
+
- `bracket` (`[`) → "No square brackets."
|
|
128
|
+
- `double_quote_curly` (`"` `"`) → "No curly double quotes."
|
|
129
|
+
- `single_quote_curly` (`'` `'`) → "No curly single quotes / apostrophes."
|
|
130
|
+
- `exclamation` (`!`) → "No exclamation marks."
|
|
131
|
+
|
|
132
|
+
## Output format
|
|
133
|
+
|
|
134
|
+
When emitting a NEVER rule for items from this catalog, use this exact format:
|
|
135
|
+
|
|
136
|
+
- Diction (words, transitions, phrases): `NEVER "<label>".`
|
|
137
|
+
- Examples: `NEVER "delve".`, `NEVER "Moreover," (sentence start).`, `NEVER "a rich tapestry".`
|
|
138
|
+
- Punctuation (catalog items): `NEVER "<label>".`
|
|
139
|
+
- Example: `NEVER "em-dashes".`
|
|
140
|
+
- Punctuation (deduced): `No <nicename>.`
|
|
141
|
+
- Example: `No en-dashes.`
|
|
142
|
+
- Structural: use the verbatim NEVER text from the pattern entry above.
|
|
143
|
+
|
|
144
|
+
This format matches what the Author's Voice plugin emits, so the rules read consistently across both tools.
|