draft-in-voice — Memory-Grounded Ghostwriting
Convention: see conventions/brain-first.md —
the voice profile and all substance come from the brain, never from memory
or improvisation.
Convention: see conventions/quality.md for
citation and back-link rules, and
_brain-filing-rules.md — voice profiles are
person-subject pages and file under people/.
What this is
Ghostwrite in a specific person's voice with high fidelity. The voice work is
done UPSTREAM: a validated voice profile already exists in the brain at
people/<slug>-voice (e.g. people/alice-example-voice), and this skill is
the disciplined application of it. Never freehand "founder voice" or "their
voice" from memory — always load the profile and obey its hard rules.
If no validated profile exists, drafting stops — see
Building a voice profile below. A made-up voice
is worse than asking.
The user's own voice is a special case. If the subject is the user and
the harness ships a dedicated personal voice skill (with its own register
tuning and anti-AI patterns), prefer that. Use draft-in-voice for anyone
else with a validated profile — colleagues, founders, partners, the people
the user ghostwrites for — or for the user when no dedicated skill exists.
Source of truth (read these FIRST, every time)
- The validated voice profile —
gbrain get people/<slug>-voice. The
fingerprint, quantitative stats (median length, diction, rhythm), and the
"how to write as this person" directive block. This is binding. If the
page is missing, or its status is anything other than validated, STOP
drafting and go to the builder appendix.
- First-party context — the subject's main page (
gbrain get people/<slug>) plus timeline and backlinks (gbrain timeline <slug>,
gbrain backlinks people/<slug>): how they actually frame their work,
their origin arc, their texture. Use for substance so the content is
true to how they think, not just how they sound.
- (optional) Topic-specific pages — if the draft is about a specific
idea or company, pull the relevant page (
gbrain search "<topic>", then
gbrain get <slug>) so every claim is accurate, not invented.
The hard rules (read them OFF the profile)
A good voice profile encodes the person's non-negotiables. Honor whatever the
profile states. The six recurring categories to extract and obey:
- Tells to avoid. Most profiles name a #1 giveaway (often em-dashes, a
stock opener, a punctuation habit). A draft that trips the named tell is
automatically wrong.
- Length discipline. Match the profile's median length. One thought per
short post. Cut.
- Register, picked not blended. Most people have a casual register and a
statement/technical register with different rules (caps, emoji, slang,
jargon). Pick ONE per draft; never blend — emoji plus corporate jargon in
the same line reads fake.
- Signature moves. The profile names the person's characteristic
constructions — use them.
- Banned boilerplate. Whatever the profile bans (hashtags, "excited to
announce", "1/n" threads, specific buzzwords) stays out.
- Worldview to channel. Substance should reflect how they actually see
the thing.
Procedure
- Resolve the subject + load
people/<slug>-voice and first-party
context from the brain. No validated profile → stop drafting and offer to
build one (appendix below); do not fake it.
- Clarify register + intent in one line if ambiguous: casual (chat
energy) or statement (launch/technical)? Default casual for replies,
statement for announcements.
- Draft 2-3 options, not one. Keep each tight. Vary the angle, not the
voice.
- Run the voice self-check (below). Fix anything that flunks before
showing the draft.
- Show the options + the self-check verdict. Drafting only — posting or
sending is the human's call and goes through the normal approval-gated
path. This is a contract the agent upholds, not a mechanical guarantee:
never wire a draft directly into a send.
Voice self-check (run before showing any draft)
Score each draft against the loaded profile; fix fails, don't ship them:
When the voice profile is thin or missing
Do NOT improvise. Either:
- build the profile first (appendix below), or
- tell the user the profile is missing/thin and ask for real samples to
anchor on.
This refuse-to-draft-without-memory stance is the point of the skill: it is
brain-first discipline applied to voice.
Building a voice profile
The builder half of the skill. Run this when drafting hard-stops on a missing
or unvalidated profile, or when the user asks to "build a voice profile".
Step 0 — Consent
Confirm the user is authorized to ghostwrite for this person and record who
granted it and for what scope (e.g. "tweets and launch copy, not email").
Consent goes in the profile page (schema below). No consent recorded → build
stops the same way drafting stops without a profile.
Step 1 — Gather the corpus (threshold: 20+ samples, 6+ months)
- First-party writing only. Their published posts, essays, emails they
wrote, talks they gave. Never third-party descriptions, press coverage, or
paraphrases — those capture reputation, not voice.
- Minimum bar: 20+ samples spanning 6+ months. Fewer samples overfit to
a mood; a shorter span misses register variation. Below the bar, the
profile can only be saved as
status: draft — which does NOT unlock
drafting.
- Cover the target format. If the user will ask for tweets, at least 5
samples must be short posts; launch copy needs at least a few statement-
register samples.
- Check what the brain already holds before asking for uploads:
gbrain search "<person name>", gbrain backlinks people/<slug>, and any
media/ archives. Ingest new samples through the normal ingest skills
first so the profile's provenance can point at real pages.
Step 2 — Extract the fingerprint (schema mirrors the six hard rules)
Analyze the corpus and fill all six categories — each one becomes a section
of the profile page:
| Fingerprint field |
What to extract |
tells_to_avoid |
The #1 giveaway plus any others: punctuation habits, stock openers, constructions they never use. |
length |
Median length + band per format (tweet, reply, post, email), from actual counts — not vibes. |
registers |
Each distinct register (casual / statement / technical) with its own rules: caps, emoji, slang, jargon. |
signature_moves |
Characteristic constructions, openers, rhythms, recurring turns of phrase. |
banned_boilerplate |
Everything they demonstrably never do: hashtags, "excited to announce", thread numbering, buzzwords. |
worldview |
How they actually frame their domain — positions, recurring theses, what they care about. Cite brain pages. |
Step 3 — Write the profile page
File at people/<slug>-voice (person-subject page per
_brain-filing-rules.md), via gbrain put people/<slug>-voice with the page
content on stdin. Required top-of-page metadata block:
# Alice Example — Voice Profile
```yaml
subject: people/alice-example
status: draft # draft | validated | stale — only `validated` unlocks drafting
profile_version: 1 # bump on every rebuild; prior versions via `gbrain history`
built_at: 2026-08-11
validated_at: null
validated_by: null
consent:
granted_by: the user
granted_at: 2026-08-11
scope: "tweets + launch copy"
provenance:
corpus_size: 26
corpus_span: "2026-01 to 2026-08"
sources:
- media/x/alice-example/
- writing/acme-example-launch-draft.md
```
## Fingerprint
### 1. Tells to avoid
### 2. Length discipline
### 3. Registers
### 4. Signature moves
### 5. Banned boilerplate
### 6. Worldview to channel
## How to write as this person
(the binding directive block the drafting half reads)
Back-link the profile from the subject's main page (gbrain link people/alice-example people/alice-example-voice --link-type has-voice-profile
or the equivalent add_link op in your surface).
Step 4 — Validate (blind check)
A profile only earns status: validated after it survives a blind test:
- Hold out 5 real samples the fingerprint was NOT extracted from.
- Draft 3 test pieces from the profile and interleave them with the
held-out real samples.
- Show the mixed set to the user (or the subject). If the drafts don't
stand out, set
status: validated, validated_at, validated_by, and
bump nothing. If they do stand out, note WHICH tell exposed them, refine
the fingerprint, and repeat.
Maintenance
- Staleness: if the newest corpus sample is over ~12 months old, or the
person's public voice visibly shifted, mark
status: stale and refresh —
a stale profile blocks drafting the same as a missing one.
- Versioning: every rebuild bumps
profile_version and re-runs the blind
check. gbrain history people/<slug>-voice is the audit trail.
Contract
This skill guarantees:
- Routing matches the canonical triggers in the frontmatter.
- Drafting NEVER proceeds without a
status: validated voice profile at
people/<slug>-voice; missing, draft, or stale profiles hard-stop into
the builder.
- 2-3 draft options per request, each passed through the voice self-check
before display.
- Output is drafts only — posting/sending stays a human decision on the
approval-gated path.
- The only brain write this skill performs is the voice-profile page (and
its back-link) under
people/, per writes_to:.
- Privacy contract preserved: no real names in examples, no fork-specific
filesystem path literals, no upstream-fork references; drafts never
surface private details the subject hasn't made public.
Output Format
Drafting mode: 2-3 labeled options, each with register + length noted,
followed by a self-check verdict per option (pass, or what was fixed).
Nothing is posted, sent, or written to the brain.
Option A (casual, 92 chars): ...
Option B (casual, 140 chars): ...
Option C (statement, 210 chars): ...
Self-check: A pass · B pass (trimmed to band) · C pass
Builder mode: the people/<slug>-voice page in the schema above
(metadata block + six fingerprint sections + directive block), plus a
one-line report of corpus size, span, and validation status.
Anti-Patterns
- Freehanding a voice from memory. No validated profile → no draft. Ever.
- Treating a
draft/stale profile as good enough. Only validated
unlocks drafting.
- Register blending. One register per draft; mixing reads fake.
- Inventing substance. No made-up metrics, customers, or specifics —
every claim traces to a brain page.
- Auto-posting. Wiring a draft into a send/publish path skips the human
gate that makes ghostwriting safe.
- Building a fingerprint from third-party writing ABOUT the person.
Corpus is first-party only.
- Skipping consent. Ghostwriting without recorded authorization is
impersonation, not assistance.
- One draft instead of 2-3. A single option hides the voice-vs-angle
tradeoff from the user.
Dedup (sharp boundaries)
voice-note-ingest (skills/voice-note-ingest/SKILL.md) — ingests the
user's AUDIO into brain pages with exact phrasing preserved; it captures
voice-as-content. draft-in-voice produces NEW prose in a person's textual
voice from a profile. The only overlap is the word "voice". A voice memo
that should become a post routes through voice-note-ingest first (capture),
then draft-in-voice (rewrite in-register).
reports / briefing (skills/reports/SKILL.md,
skills/briefing/SKILL.md) — produce agent-voice summaries of brain
content. draft-in-voice produces person-voice content for a human to
publish as their own. If nobody's fingerprint is being imitated, it is not
this skill.
- Harness-level humanizer-style skills — remove generic AI tells from any
text.
draft-in-voice targets ONE specific person's fingerprint from a
validated profile; "make this less AI-sounding" without a named subject is
not this skill.
media-ingest (skills/media-ingest/SKILL.md) — corpus gathering for
the builder appendix routes through the normal ingest skills; this skill
reads the resulting pages, it does not own bulk ingestion.
1---2name: draft-in-voice3description: Ghostwrite content in a specific person's voice from a VALIDATED voice profile — tweets, replies, short posts, launch copy, recruiting blurbs, emails. Loads the subject's voice profile (people/<slug>-voice) plus first-party context from the brain, drafts 2-3 options in-register, then runs a hard voice-fidelity self-check before showing anything. Includes the profile BUILDER: if no validated profile exists, drafting hard-stops and this skill walks the corpus-to-fingerprint build instead. Never auto-posts.4---5
6# draft-in-voice — Memory-Grounded Ghostwriting
7
8> **Convention:** see [conventions/brain-first.md](../conventions/brain-first.md) —
9> the voice profile and all substance come from the brain, never from memory
10> or improvisation.
11>
12> **Convention:** see [conventions/quality.md](../conventions/quality.md) for
13> citation and back-link rules, and
14> [_brain-filing-rules.md](../_brain-filing-rules.md) — voice profiles are
15> person-subject pages and file under `people/`.
16
17## What this is
18
19Ghostwrite in a specific person's voice with high fidelity. The voice work is
20done UPSTREAM: a validated voice profile already exists in the brain at
21`people/<slug>-voice` (e.g. `people/alice-example-voice`), and this skill is
22the disciplined *application* of it. Never freehand "founder voice" or "their
23voice" from memory — always load the profile and obey its hard rules.
24
25If no validated profile exists, drafting **stops** — see
26[Building a voice profile](#building-a-voice-profile) below. A made-up voice
27is worse than asking.
28
29> **The user's own voice is a special case.** If the subject is the user and
30> the harness ships a dedicated personal voice skill (with its own register
31> tuning and anti-AI patterns), prefer that. Use `draft-in-voice` for anyone
32> else with a validated profile — colleagues, founders, partners, the people
33> the user ghostwrites for — or for the user when no dedicated skill exists.
34
35## Source of truth (read these FIRST, every time)
36
371. **The validated voice profile** — `gbrain get people/<slug>-voice`. The
38 fingerprint, quantitative stats (median length, diction, rhythm), and the
39 "how to write as this person" directive block. **This is binding.** If the
40 page is missing, or its `status` is anything other than `validated`, STOP
41 drafting and go to the builder appendix.
422. **First-party context** — the subject's main page (`gbrain get
43 people/<slug>`) plus timeline and backlinks (`gbrain timeline <slug>`,
44 `gbrain backlinks people/<slug>`): how they actually frame their work,
45 their origin arc, their texture. Use for *substance* so the content is
46 true to how they think, not just how they sound.
473. **(optional) Topic-specific pages** — if the draft is about a specific
48 idea or company, pull the relevant page (`gbrain search "<topic>"`, then
49 `gbrain get <slug>`) so every claim is accurate, not invented.
50
51## The hard rules (read them OFF the profile)
52
53A good voice profile encodes the person's non-negotiables. Honor whatever the
54profile states. The six recurring categories to extract and obey:
55
561. **Tells to avoid.** Most profiles name a #1 giveaway (often em-dashes, a
57 stock opener, a punctuation habit). A draft that trips the named tell is
58 automatically wrong.
592. **Length discipline.** Match the profile's median length. One thought per
60 short post. Cut.
613. **Register, picked not blended.** Most people have a casual register and a
62 statement/technical register with different rules (caps, emoji, slang,
63 jargon). Pick ONE per draft; never blend — emoji plus corporate jargon in
64 the same line reads fake.
654. **Signature moves.** The profile names the person's characteristic
66 constructions — use them.
675. **Banned boilerplate.** Whatever the profile bans (hashtags, "excited to
68 announce", "1/n" threads, specific buzzwords) stays out.
696. **Worldview to channel.** Substance should reflect how they actually see
70 the thing.
71
72## Procedure
73
741. **Resolve the subject + load** `people/<slug>-voice` and first-party
75 context from the brain. No validated profile → stop drafting and offer to
76 build one (appendix below); do not fake it.
772. **Clarify register + intent** in one line if ambiguous: casual (chat
78 energy) or statement (launch/technical)? Default casual for replies,
79 statement for announcements.
803. **Draft 2-3 options**, not one. Keep each tight. Vary the angle, not the
81 voice.
824. **Run the voice self-check** (below). Fix anything that flunks before
83 showing the draft.
845. **Show the options + the self-check verdict.** Drafting only — posting or
85 sending is the human's call and goes through the normal approval-gated
86 path. This is a contract the agent upholds, not a mechanical guarantee:
87 never wire a draft directly into a send.
88
89## Voice self-check (run before showing any draft)
90
91Score each draft against the loaded profile; fix fails, don't ship them:
92
93- [ ] **Named-tell check:** the profile's #1 tell does not appear (auto-fail
94 if it does).
95- [ ] **Length:** within the profile's stated band, ideally at its median.
96 One thought.
97- [ ] **Register purity:** one register, not a blend.
98- [ ] **No banned boilerplate:** nothing the profile explicitly bans.
99- [ ] **Sounds like them, not generic:** would it sit naturally between two
100 of their real posts? If unsure, pull 3 real adjacent samples from the
101 corpus referenced in the profile's provenance block and compare cadence.
102- [ ] **Substance is true:** every factual claim traces to a real brain page
103 or first-hand fact — never invent metrics, customers, or specifics.
104 Private details stay private unless the person has said them publicly.
105
106## When the voice profile is thin or missing
107
108Do NOT improvise. Either:
109
110- build the profile first (appendix below), or
111- tell the user the profile is missing/thin and ask for real samples to
112 anchor on.
113
114This refuse-to-draft-without-memory stance is the point of the skill: it is
115brain-first discipline applied to voice.
116
117## Building a voice profile
118
119The builder half of the skill. Run this when drafting hard-stops on a missing
120or unvalidated profile, or when the user asks to "build a voice profile".
121
122### Step 0 — Consent
123
124Confirm the user is authorized to ghostwrite for this person and record who
125granted it and for what scope (e.g. "tweets and launch copy, not email").
126Consent goes in the profile page (schema below). No consent recorded → build
127stops the same way drafting stops without a profile.
128
129### Step 1 — Gather the corpus (threshold: 20+ samples, 6+ months)
130
131- **First-party writing only.** Their published posts, essays, emails they
132 wrote, talks they gave. Never third-party descriptions, press coverage, or
133 paraphrases — those capture reputation, not voice.
134- **Minimum bar: 20+ samples spanning 6+ months.** Fewer samples overfit to
135 a mood; a shorter span misses register variation. Below the bar, the
136 profile can only be saved as `status: draft` — which does NOT unlock
137 drafting.
138- **Cover the target format.** If the user will ask for tweets, at least 5
139 samples must be short posts; launch copy needs at least a few statement-
140 register samples.
141- Check what the brain already holds before asking for uploads:
142 `gbrain search "<person name>"`, `gbrain backlinks people/<slug>`, and any
143 `media/` archives. Ingest new samples through the normal ingest skills
144 first so the profile's provenance can point at real pages.
145
146### Step 2 — Extract the fingerprint (schema mirrors the six hard rules)
147
148Analyze the corpus and fill all six categories — each one becomes a section
149of the profile page:
150
151| Fingerprint field | What to extract |
152|---|---|
153| `tells_to_avoid` | The #1 giveaway plus any others: punctuation habits, stock openers, constructions they never use. |
154| `length` | Median length + band per format (tweet, reply, post, email), from actual counts — not vibes. |
155| `registers` | Each distinct register (casual / statement / technical) with its own rules: caps, emoji, slang, jargon. |
156| `signature_moves` | Characteristic constructions, openers, rhythms, recurring turns of phrase. |
157| `banned_boilerplate` | Everything they demonstrably never do: hashtags, "excited to announce", thread numbering, buzzwords. |
158| `worldview` | How they actually frame their domain — positions, recurring theses, what they care about. Cite brain pages. |
159
160### Step 3 — Write the profile page
161
162File at `people/<slug>-voice` (person-subject page per
163`_brain-filing-rules.md`), via `gbrain put people/<slug>-voice` with the page
164content on stdin. Required top-of-page metadata block:
165
166````markdown
167# Alice Example — Voice Profile
168
169```yaml
170subject: people/alice-example
171status: draft # draft | validated | stale — only `validated` unlocks drafting
172profile_version: 1 # bump on every rebuild; prior versions via `gbrain history`
173built_at: 2026-08-11
174validated_at: null
175validated_by: null
176consent:
177 granted_by: the user
178 granted_at: 2026-08-11
179 scope: "tweets + launch copy"
180provenance:
181 corpus_size: 26
182 corpus_span: "2026-01 to 2026-08"
183 sources:
184 - media/x/alice-example/
185 - writing/acme-example-launch-draft.md
186```
187
188## Fingerprint
189### 1. Tells to avoid
190### 2. Length discipline
191### 3. Registers
192### 4. Signature moves
193### 5. Banned boilerplate
194### 6. Worldview to channel
195
196## How to write as this person
197(the binding directive block the drafting half reads)
198````
199
200Back-link the profile from the subject's main page (`gbrain link
201people/alice-example people/alice-example-voice --link-type has-voice-profile`
202or the equivalent `add_link` op in your surface).
203
204### Step 4 — Validate (blind check)
205
206A profile only earns `status: validated` after it survives a blind test:
207
2081. Hold out 5 real samples the fingerprint was NOT extracted from.
2092. Draft 3 test pieces from the profile and interleave them with the
210 held-out real samples.
2113. Show the mixed set to the user (or the subject). If the drafts don't
212 stand out, set `status: validated`, `validated_at`, `validated_by`, and
213 bump nothing. If they do stand out, note WHICH tell exposed them, refine
214 the fingerprint, and repeat.
215
216### Maintenance
217
218- **Staleness:** if the newest corpus sample is over ~12 months old, or the
219 person's public voice visibly shifted, mark `status: stale` and refresh —
220 a stale profile blocks drafting the same as a missing one.
221- **Versioning:** every rebuild bumps `profile_version` and re-runs the blind
222 check. `gbrain history people/<slug>-voice` is the audit trail.
223
224## Contract
225
226This skill guarantees:
227
228- Routing matches the canonical triggers in the frontmatter.
229- Drafting NEVER proceeds without a `status: validated` voice profile at
230 `people/<slug>-voice`; missing, draft, or stale profiles hard-stop into
231 the builder.
232- 2-3 draft options per request, each passed through the voice self-check
233 before display.
234- Output is drafts only — posting/sending stays a human decision on the
235 approval-gated path.
236- The only brain write this skill performs is the voice-profile page (and
237 its back-link) under `people/`, per `writes_to:`.
238- Privacy contract preserved: no real names in examples, no fork-specific
239 filesystem path literals, no upstream-fork references; drafts never
240 surface private details the subject hasn't made public.
241
242## Output Format
243
244**Drafting mode:** 2-3 labeled options, each with register + length noted,
245followed by a self-check verdict per option (pass, or what was fixed).
246Nothing is posted, sent, or written to the brain.
247
248```
249Option A (casual, 92 chars): ...
250Option B (casual, 140 chars): ...
251Option C (statement, 210 chars): ...
252
253Self-check: A pass · B pass (trimmed to band) · C pass
254```
255
256**Builder mode:** the `people/<slug>-voice` page in the schema above
257(metadata block + six fingerprint sections + directive block), plus a
258one-line report of corpus size, span, and validation status.
259
260## Anti-Patterns
261
262- **Freehanding a voice from memory.** No validated profile → no draft. Ever.
263- **Treating a `draft`/`stale` profile as good enough.** Only `validated`
264 unlocks drafting.
265- **Register blending.** One register per draft; mixing reads fake.
266- **Inventing substance.** No made-up metrics, customers, or specifics —
267 every claim traces to a brain page.
268- **Auto-posting.** Wiring a draft into a send/publish path skips the human
269 gate that makes ghostwriting safe.
270- **Building a fingerprint from third-party writing ABOUT the person.**
271 Corpus is first-party only.
272- **Skipping consent.** Ghostwriting without recorded authorization is
273 impersonation, not assistance.
274- **One draft instead of 2-3.** A single option hides the voice-vs-angle
275 tradeoff from the user.
276
277## Dedup (sharp boundaries)
278
279- **`voice-note-ingest`** (`skills/voice-note-ingest/SKILL.md`) — ingests the
280 user's AUDIO into brain pages with exact phrasing preserved; it captures
281 voice-as-content. `draft-in-voice` produces NEW prose in a person's textual
282 voice from a profile. The only overlap is the word "voice". A voice memo
283 that should become a post routes through voice-note-ingest first (capture),
284 then draft-in-voice (rewrite in-register).
285- **`reports`** / **`briefing`** (`skills/reports/SKILL.md`,
286 `skills/briefing/SKILL.md`) — produce agent-voice summaries of brain
287 content. `draft-in-voice` produces person-voice content for a human to
288 publish as their own. If nobody's fingerprint is being imitated, it is not
289 this skill.
290- **Harness-level humanizer-style skills** — remove generic AI tells from any
291 text. `draft-in-voice` targets ONE specific person's fingerprint from a
292 validated profile; "make this less AI-sounding" without a named subject is
293 not this skill.
294- **`media-ingest`** (`skills/media-ingest/SKILL.md`) — corpus gathering for
295 the builder appendix routes through the normal ingest skills; this skill
296 reads the resulting pages, it does not own bulk ingestion.