[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6N0MKEHHB3C5KGAW7CJX9GA":3,"skill-same:01M6N0MKEHHB3C5KGAW7CJX9GA":88},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":41,"linkOnly":42,"markdownContent":43,"markdownBody":44,"frontMatter":45,"refName":60,"commitSha":61,"skillDirectory":62,"forksCount":63,"repositoryHtmlUrl":64,"repositoryHomepageUrl":6,"ownerHtmlUrl":65,"ownerBlogUrl":66,"ownerDescription":67,"updatedAt":68,"install":69,"resources":81},"01M6N0MKEHHB3C5KGAW7CJX9GA","draft-in-voice",null,"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\u002F\u003Cslug>-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.","garrytan\u002Fgbrain","garrytan","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F19957?v=4","01M6DJCCDDG53MTYYRTXAXFG17","Garry Tan","01M6MZQZCEN3RRMD33E1X9ZZR9",32847,"MIT","https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Fskills\u002Fdraft-in-voice\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40],"draft in voice","draft","voice","as","drafting","ghostwrite","\u003Cslug>","my","drafts","posts","make","people","register","brain","self","options","builder","never","auto","context","write","short","2026-11-10 10:12:30",false,"---\nname: draft-in-voice\nversion: 1.0.0\ndescription: >\n  Ghostwrite content in a specific person's voice from a VALIDATED voice\n  profile — tweets, replies, short posts, launch copy, recruiting blurbs,\n  emails. Loads the subject's voice profile (people\u002F\u003Cslug>-voice) plus\n  first-party context from the brain, drafts 2-3 options in-register, then\n  runs a hard voice-fidelity self-check before showing anything. Includes\n  the profile BUILDER: if no validated profile exists, drafting hard-stops\n  and this skill walks the corpus-to-fingerprint build instead. Never\n  auto-posts.\ntriggers:\n  - \"draft in voice\"\n  - \"write this as\"\n  - \"make this sound like\"\n  - \"ghostwrite\"\n  - \"draft a tweet as\"\n  - \"write a post as\"\n  - \"in their voice\"\n  - \"in my voice\"\n  - \"build a voice profile\"\nmutating: true\nwrites_pages: true\nwrites_to:\n  - people\u002F\nupstream: draft-in-voice@fc834ee\n---\n\n# draft-in-voice — Memory-Grounded Ghostwriting\n\n> **Convention:** see [conventions\u002Fbrain-first.md](..\u002Fconventions\u002Fbrain-first.md) —\n> the voice profile and all substance come from the brain, never from memory\n> or improvisation.\n>\n> **Convention:** see [conventions\u002Fquality.md](..\u002Fconventions\u002Fquality.md) for\n> citation and back-link rules, and\n> [_brain-filing-rules.md](..\u002F_brain-filing-rules.md) — voice profiles are\n> person-subject pages and file under `people\u002F`.\n\n## What this is\n\nGhostwrite in a specific person's voice with high fidelity. The voice work is\ndone UPSTREAM: a validated voice profile already exists in the brain at\n`people\u002F\u003Cslug>-voice` (e.g. `people\u002Falice-example-voice`), and this skill is\nthe disciplined *application* of it. Never freehand \"founder voice\" or \"their\nvoice\" from memory — always load the profile and obey its hard rules.\n\nIf no validated profile exists, drafting **stops** — see\n[Building a voice profile](#building-a-voice-profile) below. A made-up voice\nis worse than asking.\n\n> **The user's own voice is a special case.** If the subject is the user and\n> the harness ships a dedicated personal voice skill (with its own register\n> tuning and anti-AI patterns), prefer that. Use `draft-in-voice` for anyone\n> else with a validated profile — colleagues, founders, partners, the people\n> the user ghostwrites for — or for the user when no dedicated skill exists.\n\n## Source of truth (read these FIRST, every time)\n\n1. **The validated voice profile** — `gbrain get people\u002F\u003Cslug>-voice`. The\n   fingerprint, quantitative stats (median length, diction, rhythm), and the\n   \"how to write as this person\" directive block. **This is binding.** If the\n   page is missing, or its `status` is anything other than `validated`, STOP\n   drafting and go to the builder appendix.\n2. **First-party context** — the subject's main page (`gbrain get\n   people\u002F\u003Cslug>`) plus timeline and backlinks (`gbrain timeline \u003Cslug>`,\n   `gbrain backlinks people\u002F\u003Cslug>`): how they actually frame their work,\n   their origin arc, their texture. Use for *substance* so the content is\n   true to how they think, not just how they sound.\n3. **(optional) Topic-specific pages** — if the draft is about a specific\n   idea or company, pull the relevant page (`gbrain search \"\u003Ctopic>\"`, then\n   `gbrain get \u003Cslug>`) so every claim is accurate, not invented.\n\n## The hard rules (read them OFF the profile)\n\nA good voice profile encodes the person's non-negotiables. Honor whatever the\nprofile states. The six recurring categories to extract and obey:\n\n1. **Tells to avoid.** Most profiles name a #1 giveaway (often em-dashes, a\n   stock opener, a punctuation habit). A draft that trips the named tell is\n   automatically wrong.\n2. **Length discipline.** Match the profile's median length. One thought per\n   short post. Cut.\n3. **Register, picked not blended.** Most people have a casual register and a\n   statement\u002Ftechnical register with different rules (caps, emoji, slang,\n   jargon). Pick ONE per draft; never blend — emoji plus corporate jargon in\n   the same line reads fake.\n4. **Signature moves.** The profile names the person's characteristic\n   constructions — use them.\n5. **Banned boilerplate.** Whatever the profile bans (hashtags, \"excited to\n   announce\", \"1\u002Fn\" threads, specific buzzwords) stays out.\n6. **Worldview to channel.** Substance should reflect how they actually see\n   the thing.\n\n## Procedure\n\n1. **Resolve the subject + load** `people\u002F\u003Cslug>-voice` and first-party\n   context from the brain. No validated profile → stop drafting and offer to\n   build one (appendix below); do not fake it.\n2. **Clarify register + intent** in one line if ambiguous: casual (chat\n   energy) or statement (launch\u002Ftechnical)? Default casual for replies,\n   statement for announcements.\n3. **Draft 2-3 options**, not one. Keep each tight. Vary the angle, not the\n   voice.\n4. **Run the voice self-check** (below). Fix anything that flunks before\n   showing the draft.\n5. **Show the options + the self-check verdict.** Drafting only — posting or\n   sending is the human's call and goes through the normal approval-gated\n   path. This is a contract the agent upholds, not a mechanical guarantee:\n   never wire a draft directly into a send.\n\n## Voice self-check (run before showing any draft)\n\nScore each draft against the loaded profile; fix fails, don't ship them:\n\n- [ ] **Named-tell check:** the profile's #1 tell does not appear (auto-fail\n  if it does).\n- [ ] **Length:** within the profile's stated band, ideally at its median.\n  One thought.\n- [ ] **Register purity:** one register, not a blend.\n- [ ] **No banned boilerplate:** nothing the profile explicitly bans.\n- [ ] **Sounds like them, not generic:** would it sit naturally between two\n  of their real posts? If unsure, pull 3 real adjacent samples from the\n  corpus referenced in the profile's provenance block and compare cadence.\n- [ ] **Substance is true:** every factual claim traces to a real brain page\n  or first-hand fact — never invent metrics, customers, or specifics.\n  Private details stay private unless the person has said them publicly.\n\n## When the voice profile is thin or missing\n\nDo NOT improvise. Either:\n\n- build the profile first (appendix below), or\n- tell the user the profile is missing\u002Fthin and ask for real samples to\n  anchor on.\n\nThis refuse-to-draft-without-memory stance is the point of the skill: it is\nbrain-first discipline applied to voice.\n\n## Building a voice profile\n\nThe builder half of the skill. Run this when drafting hard-stops on a missing\nor unvalidated profile, or when the user asks to \"build a voice profile\".\n\n### Step 0 — Consent\n\nConfirm the user is authorized to ghostwrite for this person and record who\ngranted it and for what scope (e.g. \"tweets and launch copy, not email\").\nConsent goes in the profile page (schema below). No consent recorded → build\nstops the same way drafting stops without a profile.\n\n### Step 1 — Gather the corpus (threshold: 20+ samples, 6+ months)\n\n- **First-party writing only.** Their published posts, essays, emails they\n  wrote, talks they gave. Never third-party descriptions, press coverage, or\n  paraphrases — those capture reputation, not voice.\n- **Minimum bar: 20+ samples spanning 6+ months.** Fewer samples overfit to\n  a mood; a shorter span misses register variation. Below the bar, the\n  profile can only be saved as `status: draft` — which does NOT unlock\n  drafting.\n- **Cover the target format.** If the user will ask for tweets, at least 5\n  samples must be short posts; launch copy needs at least a few statement-\n  register samples.\n- Check what the brain already holds before asking for uploads:\n  `gbrain search \"\u003Cperson name>\"`, `gbrain backlinks people\u002F\u003Cslug>`, and any\n  `media\u002F` archives. Ingest new samples through the normal ingest skills\n  first so the profile's provenance can point at real pages.\n\n### Step 2 — Extract the fingerprint (schema mirrors the six hard rules)\n\nAnalyze the corpus and fill all six categories — each one becomes a section\nof the profile page:\n\n| Fingerprint field | What to extract |\n|---|---|\n| `tells_to_avoid` | The #1 giveaway plus any others: punctuation habits, stock openers, constructions they never use. |\n| `length` | Median length + band per format (tweet, reply, post, email), from actual counts — not vibes. |\n| `registers` | Each distinct register (casual \u002F statement \u002F technical) with its own rules: caps, emoji, slang, jargon. |\n| `signature_moves` | Characteristic constructions, openers, rhythms, recurring turns of phrase. |\n| `banned_boilerplate` | Everything they demonstrably never do: hashtags, \"excited to announce\", thread numbering, buzzwords. |\n| `worldview` | How they actually frame their domain — positions, recurring theses, what they care about. Cite brain pages. |\n\n### Step 3 — Write the profile page\n\nFile at `people\u002F\u003Cslug>-voice` (person-subject page per\n`_brain-filing-rules.md`), via `gbrain put people\u002F\u003Cslug>-voice` with the page\ncontent on stdin. Required top-of-page metadata block:\n\n````markdown\n# Alice Example — Voice Profile\n\n```yaml\nsubject: people\u002Falice-example\nstatus: draft            # draft | validated | stale — only `validated` unlocks drafting\nprofile_version: 1       # bump on every rebuild; prior versions via `gbrain history`\nbuilt_at: 2026-08-11\nvalidated_at: null\nvalidated_by: null\nconsent:\n  granted_by: the user\n  granted_at: 2026-08-11\n  scope: \"tweets + launch copy\"\nprovenance:\n  corpus_size: 26\n  corpus_span: \"2026-01 to 2026-08\"\n  sources:\n    - media\u002Fx\u002Falice-example\u002F\n    - writing\u002Facme-example-launch-draft.md\n```\n\n## Fingerprint\n### 1. Tells to avoid\n### 2. Length discipline\n### 3. Registers\n### 4. Signature moves\n### 5. Banned boilerplate\n### 6. Worldview to channel\n\n## How to write as this person\n(the binding directive block the drafting half reads)\n````\n\nBack-link the profile from the subject's main page (`gbrain link\npeople\u002Falice-example people\u002Falice-example-voice --link-type has-voice-profile`\nor the equivalent `add_link` op in your surface).\n\n### Step 4 — Validate (blind check)\n\nA profile only earns `status: validated` after it survives a blind test:\n\n1. Hold out 5 real samples the fingerprint was NOT extracted from.\n2. Draft 3 test pieces from the profile and interleave them with the\n   held-out real samples.\n3. Show the mixed set to the user (or the subject). If the drafts don't\n   stand out, set `status: validated`, `validated_at`, `validated_by`, and\n   bump nothing. If they do stand out, note WHICH tell exposed them, refine\n   the fingerprint, and repeat.\n\n### Maintenance\n\n- **Staleness:** if the newest corpus sample is over ~12 months old, or the\n  person's public voice visibly shifted, mark `status: stale` and refresh —\n  a stale profile blocks drafting the same as a missing one.\n- **Versioning:** every rebuild bumps `profile_version` and re-runs the blind\n  check. `gbrain history people\u002F\u003Cslug>-voice` is the audit trail.\n\n## Contract\n\nThis skill guarantees:\n\n- Routing matches the canonical triggers in the frontmatter.\n- Drafting NEVER proceeds without a `status: validated` voice profile at\n  `people\u002F\u003Cslug>-voice`; missing, draft, or stale profiles hard-stop into\n  the builder.\n- 2-3 draft options per request, each passed through the voice self-check\n  before display.\n- Output is drafts only — posting\u002Fsending stays a human decision on the\n  approval-gated path.\n- The only brain write this skill performs is the voice-profile page (and\n  its back-link) under `people\u002F`, per `writes_to:`.\n- Privacy contract preserved: no real names in examples, no fork-specific\n  filesystem path literals, no upstream-fork references; drafts never\n  surface private details the subject hasn't made public.\n\n## Output Format\n\n**Drafting mode:** 2-3 labeled options, each with register + length noted,\nfollowed by a self-check verdict per option (pass, or what was fixed).\nNothing is posted, sent, or written to the brain.\n\n```\nOption A (casual, 92 chars): ...\nOption B (casual, 140 chars): ...\nOption C (statement, 210 chars): ...\n\nSelf-check: A pass · B pass (trimmed to band) · C pass\n```\n\n**Builder mode:** the `people\u002F\u003Cslug>-voice` page in the schema above\n(metadata block + six fingerprint sections + directive block), plus a\none-line report of corpus size, span, and validation status.\n\n## When it fails\n\nFollow the [agent operator protocol](..\u002Fconventions\u002Fagent-operator-protocol.md) for any gbrain error `code`, exit code, `[AGENT]` block or notice block. Specific to this skill:\n\n- No consent recorded on the voice profile, or `status: draft`: the skill refuses to draft by design. Ask the user to confirm who authorized the ghostwriting and for what scope.\n- The profile page returns `page_not_found` or the corpus search is empty with a degraded notice: do not draft from general knowledge; tell the user the voice memory is missing or the search was keyword-only.\n- Saving the profile returns `revision_conflict`: re-read and merge; the profile is binding, so never overwrite it from an old read.\n\n## Anti-Patterns\n\n- **Freehanding a voice from memory.** No validated profile → no draft. Ever.\n- **Treating a `draft`\u002F`stale` profile as good enough.** Only `validated`\n  unlocks drafting.\n- **Register blending.** One register per draft; mixing reads fake.\n- **Inventing substance.** No made-up metrics, customers, or specifics —\n  every claim traces to a brain page.\n- **Auto-posting.** Wiring a draft into a send\u002Fpublish path skips the human\n  gate that makes ghostwriting safe.\n- **Building a fingerprint from third-party writing ABOUT the person.**\n  Corpus is first-party only.\n- **Skipping consent.** Ghostwriting without recorded authorization is\n  impersonation, not assistance.\n- **One draft instead of 2-3.** A single option hides the voice-vs-angle\n  tradeoff from the user.\n\n## Dedup (sharp boundaries)\n\n- **`voice-note-ingest`** (`skills\u002Fvoice-note-ingest\u002FSKILL.md`) — ingests the\n  user's AUDIO into brain pages with exact phrasing preserved; it captures\n  voice-as-content. `draft-in-voice` produces NEW prose in a person's textual\n  voice from a profile. The only overlap is the word \"voice\". A voice memo\n  that should become a post routes through voice-note-ingest first (capture),\n  then draft-in-voice (rewrite in-register).\n- **`reports`** \u002F **`briefing`** (`skills\u002Freports\u002FSKILL.md`,\n  `skills\u002Fbriefing\u002FSKILL.md`) — produce agent-voice summaries of brain\n  content. `draft-in-voice` produces person-voice content for a human to\n  publish as their own. If nobody's fingerprint is being imitated, it is not\n  this skill.\n- **Harness-level humanizer-style skills** — remove generic AI tells from any\n  text. `draft-in-voice` targets ONE specific person's fingerprint from a\n  validated profile; \"make this less AI-sounding\" without a named subject is\n  not this skill.\n- **`media-ingest`** (`skills\u002Fmedia-ingest\u002FSKILL.md`) — corpus gathering for\n  the builder appendix routes through the normal ingest skills; this skill\n  reads the resulting pages, it does not own bulk ingestion.\n","# draft-in-voice — Memory-Grounded Ghostwriting\n\n> **Convention:** see [conventions\u002Fbrain-first.md](..\u002Fconventions\u002Fbrain-first.md) —\n> the voice profile and all substance come from the brain, never from memory\n> or improvisation.\n>\n> **Convention:** see [conventions\u002Fquality.md](..\u002Fconventions\u002Fquality.md) for\n> citation and back-link rules, and\n> [_brain-filing-rules.md](..\u002F_brain-filing-rules.md) — voice profiles are\n> person-subject pages and file under `people\u002F`.\n\n## What this is\n\nGhostwrite in a specific person's voice with high fidelity. The voice work is\ndone UPSTREAM: a validated voice profile already exists in the brain at\n`people\u002F\u003Cslug>-voice` (e.g. `people\u002Falice-example-voice`), and this skill is\nthe disciplined *application* of it. Never freehand \"founder voice\" or \"their\nvoice\" from memory — always load the profile and obey its hard rules.\n\nIf no validated profile exists, drafting **stops** — see\n[Building a voice profile](#building-a-voice-profile) below. A made-up voice\nis worse than asking.\n\n> **The user's own voice is a special case.** If the subject is the user and\n> the harness ships a dedicated personal voice skill (with its own register\n> tuning and anti-AI patterns), prefer that. Use `draft-in-voice` for anyone\n> else with a validated profile — colleagues, founders, partners, the people\n> the user ghostwrites for — or for the user when no dedicated skill exists.\n\n## Source of truth (read these FIRST, every time)\n\n1. **The validated voice profile** — `gbrain get people\u002F\u003Cslug>-voice`. The\n   fingerprint, quantitative stats (median length, diction, rhythm), and the\n   \"how to write as this person\" directive block. **This is binding.** If the\n   page is missing, or its `status` is anything other than `validated`, STOP\n   drafting and go to the builder appendix.\n2. **First-party context** — the subject's main page (`gbrain get\n   people\u002F\u003Cslug>`) plus timeline and backlinks (`gbrain timeline \u003Cslug>`,\n   `gbrain backlinks people\u002F\u003Cslug>`): how they actually frame their work,\n   their origin arc, their texture. Use for *substance* so the content is\n   true to how they think, not just how they sound.\n3. **(optional) Topic-specific pages** — if the draft is about a specific\n   idea or company, pull the relevant page (`gbrain search \"\u003Ctopic>\"`, then\n   `gbrain get \u003Cslug>`) so every claim is accurate, not invented.\n\n## The hard rules (read them OFF the profile)\n\nA good voice profile encodes the person's non-negotiables. Honor whatever the\nprofile states. The six recurring categories to extract and obey:\n\n1. **Tells to avoid.** Most profiles name a #1 giveaway (often em-dashes, a\n   stock opener, a punctuation habit). A draft that trips the named tell is\n   automatically wrong.\n2. **Length discipline.** Match the profile's median length. One thought per\n   short post. Cut.\n3. **Register, picked not blended.** Most people have a casual register and a\n   statement\u002Ftechnical register with different rules (caps, emoji, slang,\n   jargon). Pick ONE per draft; never blend — emoji plus corporate jargon in\n   the same line reads fake.\n4. **Signature moves.** The profile names the person's characteristic\n   constructions — use them.\n5. **Banned boilerplate.** Whatever the profile bans (hashtags, \"excited to\n   announce\", \"1\u002Fn\" threads, specific buzzwords) stays out.\n6. **Worldview to channel.** Substance should reflect how they actually see\n   the thing.\n\n## Procedure\n\n1. **Resolve the subject + load** `people\u002F\u003Cslug>-voice` and first-party\n   context from the brain. No validated profile → stop drafting and offer to\n   build one (appendix below); do not fake it.\n2. **Clarify register + intent** in one line if ambiguous: casual (chat\n   energy) or statement (launch\u002Ftechnical)? Default casual for replies,\n   statement for announcements.\n3. **Draft 2-3 options**, not one. Keep each tight. Vary the angle, not the\n   voice.\n4. **Run the voice self-check** (below). Fix anything that flunks before\n   showing the draft.\n5. **Show the options + the self-check verdict.** Drafting only — posting or\n   sending is the human's call and goes through the normal approval-gated\n   path. This is a contract the agent upholds, not a mechanical guarantee:\n   never wire a draft directly into a send.\n\n## Voice self-check (run before showing any draft)\n\nScore each draft against the loaded profile; fix fails, don't ship them:\n\n- [ ] **Named-tell check:** the profile's #1 tell does not appear (auto-fail\n  if it does).\n- [ ] **Length:** within the profile's stated band, ideally at its median.\n  One thought.\n- [ ] **Register purity:** one register, not a blend.\n- [ ] **No banned boilerplate:** nothing the profile explicitly bans.\n- [ ] **Sounds like them, not generic:** would it sit naturally between two\n  of their real posts? If unsure, pull 3 real adjacent samples from the\n  corpus referenced in the profile's provenance block and compare cadence.\n- [ ] **Substance is true:** every factual claim traces to a real brain page\n  or first-hand fact — never invent metrics, customers, or specifics.\n  Private details stay private unless the person has said them publicly.\n\n## When the voice profile is thin or missing\n\nDo NOT improvise. Either:\n\n- build the profile first (appendix below), or\n- tell the user the profile is missing\u002Fthin and ask for real samples to\n  anchor on.\n\nThis refuse-to-draft-without-memory stance is the point of the skill: it is\nbrain-first discipline applied to voice.\n\n## Building a voice profile\n\nThe builder half of the skill. Run this when drafting hard-stops on a missing\nor unvalidated profile, or when the user asks to \"build a voice profile\".\n\n### Step 0 — Consent\n\nConfirm the user is authorized to ghostwrite for this person and record who\ngranted it and for what scope (e.g. \"tweets and launch copy, not email\").\nConsent goes in the profile page (schema below). No consent recorded → build\nstops the same way drafting stops without a profile.\n\n### Step 1 — Gather the corpus (threshold: 20+ samples, 6+ months)\n\n- **First-party writing only.** Their published posts, essays, emails they\n  wrote, talks they gave. Never third-party descriptions, press coverage, or\n  paraphrases — those capture reputation, not voice.\n- **Minimum bar: 20+ samples spanning 6+ months.** Fewer samples overfit to\n  a mood; a shorter span misses register variation. Below the bar, the\n  profile can only be saved as `status: draft` — which does NOT unlock\n  drafting.\n- **Cover the target format.** If the user will ask for tweets, at least 5\n  samples must be short posts; launch copy needs at least a few statement-\n  register samples.\n- Check what the brain already holds before asking for uploads:\n  `gbrain search \"\u003Cperson name>\"`, `gbrain backlinks people\u002F\u003Cslug>`, and any\n  `media\u002F` archives. Ingest new samples through the normal ingest skills\n  first so the profile's provenance can point at real pages.\n\n### Step 2 — Extract the fingerprint (schema mirrors the six hard rules)\n\nAnalyze the corpus and fill all six categories — each one becomes a section\nof the profile page:\n\n| Fingerprint field | What to extract |\n|---|---|\n| `tells_to_avoid` | The #1 giveaway plus any others: punctuation habits, stock openers, constructions they never use. |\n| `length` | Median length + band per format (tweet, reply, post, email), from actual counts — not vibes. |\n| `registers` | Each distinct register (casual \u002F statement \u002F technical) with its own rules: caps, emoji, slang, jargon. |\n| `signature_moves` | Characteristic constructions, openers, rhythms, recurring turns of phrase. |\n| `banned_boilerplate` | Everything they demonstrably never do: hashtags, \"excited to announce\", thread numbering, buzzwords. |\n| `worldview` | How they actually frame their domain — positions, recurring theses, what they care about. Cite brain pages. |\n\n### Step 3 — Write the profile page\n\nFile at `people\u002F\u003Cslug>-voice` (person-subject page per\n`_brain-filing-rules.md`), via `gbrain put people\u002F\u003Cslug>-voice` with the page\ncontent on stdin. Required top-of-page metadata block:\n\n````markdown\n# Alice Example — Voice Profile\n\n```yaml\nsubject: people\u002Falice-example\nstatus: draft            # draft | validated | stale — only `validated` unlocks drafting\nprofile_version: 1       # bump on every rebuild; prior versions via `gbrain history`\nbuilt_at: 2026-08-11\nvalidated_at: null\nvalidated_by: null\nconsent:\n  granted_by: the user\n  granted_at: 2026-08-11\n  scope: \"tweets + launch copy\"\nprovenance:\n  corpus_size: 26\n  corpus_span: \"2026-01 to 2026-08\"\n  sources:\n    - media\u002Fx\u002Falice-example\u002F\n    - writing\u002Facme-example-launch-draft.md\n```\n\n## Fingerprint\n### 1. Tells to avoid\n### 2. Length discipline\n### 3. Registers\n### 4. Signature moves\n### 5. Banned boilerplate\n### 6. Worldview to channel\n\n## How to write as this person\n(the binding directive block the drafting half reads)\n````\n\nBack-link the profile from the subject's main page (`gbrain link\npeople\u002Falice-example people\u002Falice-example-voice --link-type has-voice-profile`\nor the equivalent `add_link` op in your surface).\n\n### Step 4 — Validate (blind check)\n\nA profile only earns `status: validated` after it survives a blind test:\n\n1. Hold out 5 real samples the fingerprint was NOT extracted from.\n2. Draft 3 test pieces from the profile and interleave them with the\n   held-out real samples.\n3. Show the mixed set to the user (or the subject). If the drafts don't\n   stand out, set `status: validated`, `validated_at`, `validated_by`, and\n   bump nothing. If they do stand out, note WHICH tell exposed them, refine\n   the fingerprint, and repeat.\n\n### Maintenance\n\n- **Staleness:** if the newest corpus sample is over ~12 months old, or the\n  person's public voice visibly shifted, mark `status: stale` and refresh —\n  a stale profile blocks drafting the same as a missing one.\n- **Versioning:** every rebuild bumps `profile_version` and re-runs the blind\n  check. `gbrain history people\u002F\u003Cslug>-voice` is the audit trail.\n\n## Contract\n\nThis skill guarantees:\n\n- Routing matches the canonical triggers in the frontmatter.\n- Drafting NEVER proceeds without a `status: validated` voice profile at\n  `people\u002F\u003Cslug>-voice`; missing, draft, or stale profiles hard-stop into\n  the builder.\n- 2-3 draft options per request, each passed through the voice self-check\n  before display.\n- Output is drafts only — posting\u002Fsending stays a human decision on the\n  approval-gated path.\n- The only brain write this skill performs is the voice-profile page (and\n  its back-link) under `people\u002F`, per `writes_to:`.\n- Privacy contract preserved: no real names in examples, no fork-specific\n  filesystem path literals, no upstream-fork references; drafts never\n  surface private details the subject hasn't made public.\n\n## Output Format\n\n**Drafting mode:** 2-3 labeled options, each with register + length noted,\nfollowed by a self-check verdict per option (pass, or what was fixed).\nNothing is posted, sent, or written to the brain.\n\n```\nOption A (casual, 92 chars): ...\nOption B (casual, 140 chars): ...\nOption C (statement, 210 chars): ...\n\nSelf-check: A pass · B pass (trimmed to band) · C pass\n```\n\n**Builder mode:** the `people\u002F\u003Cslug>-voice` page in the schema above\n(metadata block + six fingerprint sections + directive block), plus a\none-line report of corpus size, span, and validation status.\n\n## When it fails\n\nFollow the [agent operator protocol](..\u002Fconventions\u002Fagent-operator-protocol.md) for any gbrain error `code`, exit code, `[AGENT]` block or notice block. Specific to this skill:\n\n- No consent recorded on the voice profile, or `status: draft`: the skill refuses to draft by design. Ask the user to confirm who authorized the ghostwriting and for what scope.\n- The profile page returns `page_not_found` or the corpus search is empty with a degraded notice: do not draft from general knowledge; tell the user the voice memory is missing or the search was keyword-only.\n- Saving the profile returns `revision_conflict`: re-read and merge; the profile is binding, so never overwrite it from an old read.\n\n## Anti-Patterns\n\n- **Freehanding a voice from memory.** No validated profile → no draft. Ever.\n- **Treating a `draft`\u002F`stale` profile as good enough.** Only `validated`\n  unlocks drafting.\n- **Register blending.** One register per draft; mixing reads fake.\n- **Inventing substance.** No made-up metrics, customers, or specifics —\n  every claim traces to a brain page.\n- **Auto-posting.** Wiring a draft into a send\u002Fpublish path skips the human\n  gate that makes ghostwriting safe.\n- **Building a fingerprint from third-party writing ABOUT the person.**\n  Corpus is first-party only.\n- **Skipping consent.** Ghostwriting without recorded authorization is\n  impersonation, not assistance.\n- **One draft instead of 2-3.** A single option hides the voice-vs-angle\n  tradeoff from the user.\n\n## Dedup (sharp boundaries)\n\n- **`voice-note-ingest`** (`skills\u002Fvoice-note-ingest\u002FSKILL.md`) — ingests the\n  user's AUDIO into brain pages with exact phrasing preserved; it captures\n  voice-as-content. `draft-in-voice` produces NEW prose in a person's textual\n  voice from a profile. The only overlap is the word \"voice\". A voice memo\n  that should become a post routes through voice-note-ingest first (capture),\n  then draft-in-voice (rewrite in-register).\n- **`reports`** \u002F **`briefing`** (`skills\u002Freports\u002FSKILL.md`,\n  `skills\u002Fbriefing\u002FSKILL.md`) — produce agent-voice summaries of brain\n  content. `draft-in-voice` produces person-voice content for a human to\n  publish as their own. If nobody's fingerprint is being imitated, it is not\n  this skill.\n- **Harness-level humanizer-style skills** — remove generic AI tells from any\n  text. `draft-in-voice` targets ONE specific person's fingerprint from a\n  validated profile; \"make this less AI-sounding\" without a named subject is\n  not this skill.\n- **`media-ingest`** (`skills\u002Fmedia-ingest\u002FSKILL.md`) — corpus gathering for\n  the builder appendix routes through the normal ingest skills; this skill\n  reads the resulting pages, it does not own bulk ingestion.\n",{"name":5,"version":46,"mutating":47,"triggers":48,"upstream":56,"writes_to":57,"description":59,"writes_pages":47},"1.0.0",true,[19,49,50,24,51,52,53,54,55],"write this as","make this sound like","draft a tweet as","write a post as","in their voice","in my voice","build a voice profile","draft-in-voice@fc834ee",[58],"people\u002F","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\u002F\u003Cslug>-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.\n","master","074ec301549ded4930f04d2c3b22d709a6c095cc","skills\u002Fdraft-in-voice",4902,"https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain","https:\u002F\u002Fgithub.com\u002Fgarrytan","https:\u002F\u002Fblog.garrytan.com","Writes software, dreams. ","2026-11-14 04:11:30",{"source":8,"skillName":5,"commands":70,"prompt":80,"zipAvailable":47},[71,74,77],{"tool":72,"command":73},"npx","npx skills add garrytan\u002Fgbrain --skill draft-in-voice",{"tool":75,"command":76},"bunx","bunx skills add garrytan\u002Fgbrain --skill draft-in-voice",{"tool":78,"command":79},"pnpm","pnpm dlx skills add garrytan\u002Fgbrain --skill draft-in-voice","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Fskills\u002Fdraft-in-voice\u002FSKILL.md",[82],{"path":83,"resourceType":84,"resourceTypeDesc":85,"sizeBytes":86,"sourceHtmlUrl":87},"routing-eval.jsonl","OTHER","其他",1132,"https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Fskills\u002Fdraft-in-voice\u002Frouting-eval.jsonl",[89,102,108,128,155,168],{"skillNo":90,"name":91,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":92,"categories":93,"keywords":94,"publishedAt":41},"01M6N109FNGH1PK49T734PZXGB","query-helper","https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Ftest\u002Ffixtures\u002Fskill-catalog\u002Fskills\u002Fquery-helper\u002FSKILL.md",[],[95,96,97,98,99,100,101],"query helper","helper","query","search","page","find","false",{"skillNo":103,"name":104,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":105,"categories":106,"keywords":107,"publishedAt":41},"01M6N108A23GW6NGQEQ0E7GV0A","broken","https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Ftest\u002Ffixtures\u002Fskill-catalog\u002Fskills\u002Fbroken\u002FSKILL.md",[],[104],{"skillNo":109,"name":110,"nameZh":6,"description":111,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":112,"categories":113,"keywords":114,"publishedAt":41},"01M6N105E88C5K2H03H0CC79G1","brain-ops","Read, enrich, and write brain pages with source attribution.","https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Ftest\u002Ffixtures\u002Fskill-catalog\u002Fskills\u002Fbrain-ops\u002FSKILL.md",[],[115,32,116,117,118,99,119,39,120,121,97,122,30,123,124,125,126,127,98],"brain ops","ops","true","attribution","read","up","look","pages","with","enrich","web","path","source",{"skillNo":129,"name":130,"nameZh":6,"description":131,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":132,"categories":133,"keywords":139,"publishedAt":41},"01M6N102GRMF22TVCNT6RK5MRD","meeting-prep","Build a briefing before you meet someone, from their recent threads, open loops and what they care about.","https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Ftest\u002Ffixtures\u002Fskill-catalog-query\u002Fskills\u002Fmeeting-prep\u002FSKILL.md",[134],{"categoryNo":135,"categoryName":136,"taxonomyType":137,"taxonomyTypeDesc":138},"01JBSEEDCAT000000000000034","行政与办公人员","PROFESSION","适用职业",[140,141,142,143,144,98,145,146,147,97,101,148,149,150,151,152,153,154],"meeting","prep","meeting prep","me","prepare","brief","open","build","loops","about","you","briefing","threads","for","Meet",{"skillNo":156,"name":157,"nameZh":6,"description":158,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":159,"categories":160,"keywords":161,"publishedAt":41},"01M6N1005QK7REHX5KGMNR5PF0","inbox-zero","Triage the inbox into replies, delegations and archives.","https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Ftest\u002Ffixtures\u002Fskill-catalog-query\u002Fskills\u002Finbox-zero\u002FSKILL.md",[],[162,163,164,98,165,101,166,26,167],"inbox zero","ZeRO","inbox","clear","replies","triage",{"skillNo":169,"name":170,"nameZh":6,"description":171,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":172,"categories":173,"keywords":174,"publishedAt":41},"01M6N0ZXQ8RRRW71PNV61T57GP","deal-memo","Draft an investment memo from the deal pages and the founder history already in the brain.","https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Ftest\u002Ffixtures\u002Fskill-catalog-query\u002Fskills\u002Fdeal-memo\u002FSKILL.md",[],[175,176,177,122,32,20,178,39,179,117,98,180],"deal memo","deal","memo","investment","history","founder"]