# My Voice

> Use when drafting any first-person content in my voice — LinkedIn posts, articles, blog drafts, announcements, customer-facing writeups. Forces an ordered protocol that builds an internal model of me-as-writer from the corpus and drafts from inside that model. Compose with topic-specific skills for grounding.

- **Type:** Skill
- **Install:** `agentstack add skill-abbaseya-claude-voice-skill-claude-voice-skill`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [abbaseya](https://agentstack.voostack.com/s/abbaseya)
- **Installs:** 0
- **Category:** [Agent Skills](https://agentstack.voostack.com/c/agent-skills)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [abbaseya](https://github.com/abbaseya)
- **Source:** https://github.com/abbaseya/claude-voice-skill

## Install

```sh
agentstack add skill-abbaseya-claude-voice-skill-claude-voice-skill
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

# My voice

This skill produces drafts in my voice by forcing the model — at every invocation — to **inhabit me as a writer** before drafting, draft from inside that inhabitation, and critique the draft as I would. The corpus is the source. Annotations and anti-corpus calibrate. Hard rules (`hard-rules.md`) are absolute — they override the writer-model and the corpus whenever they conflict. The protocol is the forcing function: it makes the inhabitation cheap to do and expensive to skip.

The mechanism has a known structural ceiling around 85% voice match — text-only context conditioning cannot exceed that without weight-level fine-tuning. The last 10–15% is my editing pass.

---

## Mandatory protocol

Do every step in order. Do not skip steps because the topic seems simple, the draft seems short, or I "already know how the writer writes." The corpus and my prior compete; this protocol is what makes the corpus win.

### 0. Setup

This run's per-invocation artifacts live in a **session-scoped** subdirectory so that concurrent sessions don't clobber each other's draft prep. Resolve (and create) it:

```
python3 ~/.claude/skills/my-voice/scripts/session_runtime.py
```

It prints the absolute path of THIS session's runtime dir — e.g. `~/.claude/skills/my-voice/runtime/sessions//`. Call that path **`$SESSION_DIR`** and use it for every per-invocation artifact below (`topic.md`, `engagement.md`, `ideas.md`, `critique.md`, `draft.md`).

The shared corpus cache — `runtime/voice_model.md` and `runtime/corpus_notes.md` — stays at the `runtime/` root (keyed by corpus hash, identical across sessions). Do not move it under `$SESSION_DIR`.

### 1. Baseline check

Run:

```
python3 ~/.claude/skills/my-voice/scripts/check_baseline.py
```

- If output starts with `BASELINE_OK`: skip to step 4 (the writer-model is current).
- If output starts with `REGENERATE`: continue with steps 2–3 to rebuild the writer-model.

### 2. Per-piece corpus reading (only when regenerating)

Read every file in `corpus/` **one at a time**, with the Read tool, no batching. After each file, append a section to `runtime/corpus_notes.md` in this exact shape:

```
## 
**Summary (one sentence):** 
**Three to five specific moves the writer makes in this piece, with quoted excerpts:**
-  — ""
-  — ""
- ...
```

The quotes are not optional. They are the proof I actually read the piece rather than skimming. A model that skims cannot produce accurate quotes.

`check_baseline.py` mechanically verifies, after the writer-model is generated, that every `corpus/*.md` has its own `## ` section in `corpus_notes.md` and that at least one quoted excerpt per section appears verbatim in the source. Batching multiple files into a single "by inspection" section, or summarising without verbatim quotes, fails this gate and forces a redo. Do not try to economise here — the gate will catch it.

### 3. Synthesize the writer-model (only when regenerating)

Build `runtime/voice_model.md`. The first non-empty line MUST be:

```
> Generated from corpus hash: 
```

Required sections, each with corpus citations by filename:

- **Opening moves.** What the writer's first 1–2 sentences typically do, mechanically. What the writer avoids opening with (cite anti-corpus where applicable).
- **Transition vocabulary.** Specific connectors the writer reaches for. Specific ones the writer doesn't.
- **Paragraph and sentence rhythm.** Variance pattern. Where one-line paragraphs land. How long paragraphs get.
- **What the writer reaches for.** Concrete moves: parenthetical italics, light single-word bold, inline links to references, em-dashes with spaces for asides, story-shaped framing (intro/problem → context/findings → outro/recommendation), or whatever the corpus shows.
- **What the writer avoids.** Drawn from `annotations.md` + `anti-corpus.md` + corpus observation: typographic preferences, formal connectors, balanced tripartite openers, trailing rhetorical questions, formulaic constructs.
- **Handling uncertainty.** How the writer flags estimates, hedges, and admissions of "I don't know."
- **Handling praise.** How the writer gives credit. Cite the corpus piece that shows this.
- **Handling criticism.** How the writer names a failure mode without stacking complaints.
- **Closings.** How the writer ends — declarative observations or terminal claims, never meta-closers like "happy to discuss" or generic meeting invites (unless the corpus actually shows the writer using them).

Each claim cites at least one corpus piece by filename.

### 4. Read the calibrators and hard rules

Read `annotations.md` and `anti-corpus.md` end to end. They calibrate the writer-model — they do not replace it. Do not draft directly from annotations as a checklist; that produces typographic substitution rather than voice.

Then read `hard-rules.md` if it exists. **Hard rules are not calibrators.** Annotations and anti-corpus are soft signals that shaped the writer-model; hard rules are absolute do/don't constraints the writer has set, and they override the writer-model and the corpus whenever they conflict — even if the corpus shows the writer occasionally breaking one. Apply every hard rule as a gate at draft time (step 8) and re-check the draft against each one at critique time (step 9). The machine-checked subset (the rows inside the `machine-checked-rules` markers) is additionally enforced by the safety net in step 11. `hard-rules.md` is read fresh on every run and is not part of the cached writer-model, so editing it takes effect immediately with no regeneration.

### 5. Topic intake

Write `$SESSION_DIR/topic.md` with two short sections:
- **Topic and goal:** one sentence.
- **Closest-shape corpus pieces:** name 2–3 corpus pieces that match the **shape** (length, register, structure) of what's about to be written — not the topic. State why each was picked.

### 6. Engagement note

Write `$SESSION_DIR/engagement.md`. List 5–7 specific moves drawn from `runtime/voice_model.md` that I commit to applying in this draft. Each move ties to a section of the voice model. This is the bridge that puts the writer-model into active reasoning before drafting begins.

### 7. Abstract the input to ideas (only when rewriting a provided input)

If the task is to rewrite an existing draft (input file provided), read the input file **once** and write `$SESSION_DIR/ideas.md` as a **flat unordered list of the core ideas** the input conveys. No structure preserved. No section labels copied. No paragraph order copied. No bullet count preserved. Just the substantive points, each as a single bullet, in whatever order makes sense to me reading them fresh.

After writing `ideas.md`, **do not read the input file again**. This is a hard rule. The input's structural shape is a stronger pull on generation than the writer-model, and the only way to break that pull is to forget the input and rebuild from `ideas.md` + `voice_model.md` from scratch.

If the task is to write a fresh piece (no input), skip this step — my `topic.md` already contains the substance.

### 8. Draft

Write the draft to `$SESSION_DIR/draft.md`. Primary references, in order:
1. `runtime/voice_model.md` — the inhabited writer-model. **The structural shape of the draft comes from here, not from the input.**
2. `$SESSION_DIR/engagement.md` — the moves committed for this specific draft.
3. `$SESSION_DIR/ideas.md` (if rewriting) or `$SESSION_DIR/topic.md` (if fresh) — the substance.
4. `hard-rules.md` — absolute do/don't constraints. These override 1–3 on any conflict.
5. `anti-corpus.md` — patterns to avoid.
6. The corpus itself, only when sampling specific phrasings.

Do **not** open the input file again during drafting (if rewriting). Do **not** consult `annotations.md` directly while drafting. The voice model already incorporated annotations; reopening either of those files reintroduces the structural mimicry or checklist-application failure modes. Hard rules are the exception: apply every rule in `hard-rules.md`, and when a hard rule conflicts with an observed corpus habit, the hard rule wins.

### 9. In-voice critique

Write `$SESSION_DIR/critique.md`. Re-read the draft as the writer. Strike the 3 worst sentences and explain why each one fails, citing `voice_model.md` or `anti-corpus.md`. Be brutal. If I cannot honestly find 3 sentences that sound like Claude pretending to be the writer, I didn't critique honestly — try again with sharper eyes. Also check the draft against every rule in `hard-rules.md`: a hard-rule violation is an automatic strike regardless of how the sentence otherwise reads.

### 10. Revise

Apply the critique. Rewrite the struck sentences. Keep revising until the draft would survive its own critique pass.

### 11. Safety net

Run:

```
python3 ~/.claude/skills/my-voice/scripts/safety_net.py "$SESSION_DIR/draft.md" [--input ]
```

Pass `--input` when rewriting an existing draft. The script then runs both:
- Typography checks (contractions, headings, list density, paragraph variance, anti-tic patterns). It also loads the machine-checked patterns from `hard-rules.md` and flags any match, so mechanically-expressible hard rules are caught here too.
- A **structural drift check**: compares section labels, list shape, and paragraph counts between input and draft. Flags when the draft's structure too closely mirrors the input — the failure mode where voice gets applied as a coat of paint over a preserved input skeleton.

When fresh-drafting (no input), call without `--input`.

- If `NO_VIOLATIONS`: deliver the draft.
- If `VIOLATIONS`: address each one and re-run, or document explicitly why a deviation is intentional (rare — most violations are real).

The safety net is **mechanical**. It catches catastrophic typography drift and structural mimicry. It is **not** a voice judge. Passing it does not mean the draft sounds like the writer; failing it almost certainly means it doesn't.

### 12. Deliver

Show the draft to the user. Mention any safety-net violations that were intentional and unfixed. Do not narrate the protocol — the artifacts in `runtime/` are the work; the draft is the output.

---

## Composition with other skills

This skill provides voice. Topic skills (a `convert-*` skill, a `product-*` skill, etc.) provide grounding. When both apply: read the topic skill for what's true, read this skill for how the writer would say it. Any confidentiality boundary in a topic skill always overrides voice — never copy internal names from a topic skill into voice-matched output.

## What this skill does not do

- It does not guarantee 99% voice match. The structural ceiling for context-conditioned skills is around 85%. Higher fidelity requires fine-tuning, which is not currently exposed for Claude.
- It does not replace the writer's editor pass.
- It does not work for content that isn't the writer's first-person voice (e.g., third-party docs, formal contracts).

## When the corpus changes

Editing or adding a corpus file invalidates `runtime/voice_model.md`. The next invocation's baseline check will detect the hash mismatch and force regeneration via steps 2–3. This adds roughly 30 seconds to one run; subsequent runs reuse the cache.

## When a draft misses voice in a way the protocol didn't catch

Add the failure to `anti-corpus.md` with a 2-sentence diagnosis. The next invocation reads it as part of step 4. If the failure is a recognizable pattern, also add a regex to `ANTI_TIC_PATTERNS` at the top of `scripts/safety_net.py` so the safety net catches it mechanically next time.

## Runtime artifacts

The `runtime/` directory contains the cognitive-forcing artifacts, split into a shared layer and a per-session layer:

**Shared across sessions** — corpus-derived, keyed by corpus hash, identical for every session on the same corpus. Live at the `runtime/` root:

- `voice_model.md` — the inhabited writer-model. Cached; regenerated when corpus changes.
- `corpus_notes.md` — per-piece reading notes. Regenerated when corpus changes.

**Per session** — under `runtime/sessions//` (`$SESSION_DIR`, resolved by `scripts/session_runtime.py` in step 0), so concurrent sessions don't clobber each other:

- `topic.md`, `engagement.md`, `ideas.md`, `critique.md`, `draft.md` — per-invocation. Overwritten on each run within the same session. (`ideas.md` only exists when rewriting an input.)

These artifacts are visible by design. Inspect them if a draft misses voice — the failure usually shows up in `voice_model.md` or `engagement.md` first.

## Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [abbaseya](https://github.com/abbaseya)
- **Source:** [abbaseya/claude-voice-skill](https://github.com/abbaseya/claude-voice-skill)
- **License:** MIT

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** no
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/skill-abbaseya-claude-voice-skill-claude-voice-skill
- Seller: https://agentstack.voostack.com/s/abbaseya
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
