identity-theft
Overview
This skill rewrites supplied prose in a selected fictional character's voice
while preserving the input format and protecting every non-prose construct.
One personality-agnostic engine drives all characters; each character is one
dossier under references/personalities/. The roster grows by adding
dossiers — the engine never changes.
The engine is a strict transformer with an output gate, not a Markdown
compiler wearing a fake mustache. The model transforms; a bundled script
verifies; output ships only if it passes. The transformation is not
guaranteed to preserve everything — the accepted output is, because
invalid output is rejected.
Primary use: easter-egg documents (README.swanson.md beside a repo's real
README.md). Secondary use: paste text in chat, get converted text back.
Invocation
- A personality is required. It is named at invocation ("swanson-ize
this", "convert README.md as Yoda"). There is no global default
personality. If none is named, ask which character before doing anything.
- Aliases select the dossier. Each dossier's header declares trigger
aliases; match the user's request against them across the roster.
- Modes are per-personality. A dossier may declare
modes; one is marked
default_mode. Select a non-default mode only when the user names it.
Ron Swanson defaults to The Full Swanson.
- Input is pasted text, HTML, or Markdown in chat, or a file path.
- Output format always matches input format. Markdown in → Markdown out.
HTML in → HTML out with every tag and attribute intact and only text nodes
converted. Plain text in → plain text out.
- File input writes a sibling file
<name>.<suffix>.<ext> — e.g.
README + suffix swanson + md → README.swanson.md. The suffix is
declared by the dossier. Never write in place unless the user explicitly
asks for it.
Workflow
Run this sequence for every conversion:
Load the dossier for the selected personality from
references/personalities/<id>.md. Read only that one file — other
personalities stay out of context. Apply its speech patterns, vocabulary,
riff themes, anti-patterns, preamble guidance, and selected mode.
Classify every span of the source into the three content classes
(Protected / Conservative / Free) defined below. Do this before writing a
single word.
Transform the Free and Conservative spans in voice; copy Protected
spans through byte-identically; prepend the preamble per the placement
rules.
Write the result to a temporary file — never directly to the sibling
path.
Run the output gate from this skill's directory:
python3 scripts/validate_output.py SOURCE TEMP
SOURCE is the original file (or a temp file holding the pasted source);
TEMP is the transformed temp file. Exit 0 = pass; exit 1 = fail with a
per-region report.
On pass, move the temp file to the sibling path
<name>.<suffix>.<ext>. On fail, do not create the sibling file.
Report the damage the gate named — region type, occurrence index, expected
content, what was found — and retry once with stricter adherence,
correcting exactly the regions the gate flagged. If the retry also fails,
keep the temp file for diagnostics only and report the failure. Never
ship failed output and never silently downgrade to writing anyway.
Chat inputs validate the same way. Pasted Markdown or HTML is written
to a temp file, validated against the supplied source (also via a temp
file) before the result is returned. Plain text with no recognized
protected constructs needs no region validation.
The gate enforces structural invariants only: protected-region type,
order, count, and exact contents (compared region-by-region, not one
concatenated hash); link-class rules; zero unresolved same-document anchors;
matching output format, line-ending style, and final-newline state. Factual
integrity, quote classification, legal-text recognition, and voice quality
are enforced by these instructions and by review — the script does not check
them, so honor them yourself.
Preamble
The preamble is the engine's wrapper — the character saying "here you go." It
is not part of the transformed body; mode liberty rules govern the body
only. It appears in every output, every personality, every mode.
Emit the transformed document plus this preamble and nothing else. Add no
"Here's the Ron Swanson version" framing, no trailing meta-commentary, no
notes about what you did.
Content handling — three classes
Classify every span before transforming.
Class 1 — Protected (byte-identical)
Executable, referential, legal, and machine-readable content. Copy through
character-for-character, in original order, unchanged:
- fenced and indented code blocks
- inline code spans
<code> / <pre> / <kbd> / <samp> / <script> / <style> /
<textarea> / <template> contents
- HTML comments
- YAML frontmatter
- badges / shields
- HTML tags and attributes (including
alt, title, aria-label —
accessibility text is preserved in HTML)
- file paths
- version numbers
- license and legal text
- link destinations (see Link classes)
Code is data, not prose. A fenced block keeps its info string; an indented
block keeps its indentation; an inline span keeps its backticks and contents.
Class 2 — Conservatively transformed
Headings, table headers, navigation labels, and instructional prose
(requirements, installation steps, warnings). Transform under the meaning
floor and factual-integrity rules; the result must remain followable and
scannable. Exception — headings: reproduce every heading verbatim and in
original order, including duplicate headings; do not rename, merge, or
deduplicate them, because same-document anchors depend on exact heading text
(see Anchor repair for the one permitted change).
Class 3 — Freely transformed
Descriptive and expressive prose. Full personality treatment, subject to
factual integrity and anti-caricature. Default liberty is full editorial license — the character may riff, add asides, and add in-character commentary; a dossier or mode may restrict this.
Class boundaries
- Markdown image alt text is convertible (class 2). HTML attributes are
not (class 1) —
alt, title, and aria-label in HTML stay verbatim.
- Natural-language instructions ("run the installer, then restart the
service") are prose (class 2), not protected commands. Command protection
is structural: it applies to explicitly delimited machine-readable
content only (code fences, spans, the tags above).
- Table structure is protected: the delimiter row (
| --- | --- |),
column count, and cell layout stay exact; only cell text that is class 2/3
prose may be voiced. Task-list checkbox syntax (- [x] / - [ ]) and
its state are protected; only the trailing label text is eligible.
Link classes
- External URLs and non-fragment destinations: byte-identical, always.
This covers inline destinations, reference-style definitions, autolinks,
bare
http(s):// URLs, and HTML href/src. Only link text is voiced.
- Relative links with a path component (
guide.md#setup): external to the
current document; unchanged.
- Same-document fragment links (
#installation): may change only to
repair a renamed heading's anchor, and the repaired fragment must resolve
to exactly one heading in the output.
- Fragments inside code or other protected regions: untouched.
Anchor repair
- Because headings are reproduced verbatim (class 2 exception above), anchors
normally need no repair. Repair applies only if a heading legitimately
changed.
- Compute slugs with GitHub's heading-ID behavior. Use the GitHub-compatible
slug implementation already vendored in the runtime —
gfm_slug in
scripts/validate_output.py — not a hand-rolled algorithm.
- Duplicate headings receive renderer-compatible numeric suffixes
(
-1, -2, …) exactly as the slug function assigns them.
- The gate confirms every rewritten same-document fragment resolves uniquely;
an unresolved fragment fails validation.
Quotes
- Attributed quotations — a named person, a testimonial, cited material,
or any blockquote followed by an em-dash attribution — are reproduced
byte-for-byte, including punctuation and the attribution line. This is a
hard rule, not a hope.
- Decorative callout text converts — its existing wording may be re-voiced
in tone. But no blockquote gains new sentences, asides, or commentary:
converting a callout means re-voicing the text that is there, never
appending to it or changing its factual content or length beyond tone.
Admonitions, notes, and warnings additionally keep meaning-floor
followability.
- Unsure → untouched. If you cannot tell whether a blockquote is a real
quotation, leave it exactly as written.
Factual integrity (universal invariant)
Voice changes tone, never content or claims. Preserve factual propositions,
names, dates, quantities, comparisons, and qualification levels. In-character
additions must be clearly rhetorical and must not:
- introduce personal authorship or attribution claims absent from the source
(do not turn an anonymous "we built this" into "I built this");
- fabricate instructions, remedies, or steps that replace the source's actual
guidance (do not replace "check connectivity" with invented advice);
- assert reliability or quality claims the source does not make ("works most
of the time");
- convert qualified claims into absolute ones;
- attribute fictional opinions to real people or organizations.
Quantifiers are qualifications: "multiple machines" does not become "every
machine you own", "some users" does not become "all users".
Do not editorialize about the document's own content or the task itself
(never call a documented section "a fake problem"). Voiced commentary stays
in-character narration about the subject matter, not meta-commentary that
undermines the document's credibility.
Voice quality (anti-caricature)
- Character comes from sentence rhythm, worldview, priorities, and rhetorical
habits — not catchphrase insertion.
- No signature phrase more than once per document. Not every paragraph
gets a character reference. Rate-limit persona markers rather than leaving
frequency to chance.
- Scale characterization to source length: a short document gets a light
touch, not a saturated one.
- When voice conflicts with the reader's ability to use the document, the
voice yields — clarity wins.
Intellectual property
- Canonical dialogue may be studied for analysis but is never copied into
dossiers or emitted as stock output.
- Do not reproduce or substantially paraphrase memorable copyrighted
dialogue. Capture abstract stylistic traits, not quotation banks.
- All dossier examples are newly written.
File fidelity
- Preserve LF vs CRLF line endings and the presence or absence of a final
newline. The gate fails output that changes either.
- Do not normalize whitespace outside converted prose.
Markdown dialect (v0.1.0)
Supported: GitHub Flavored Markdown — YAML frontmatter, fenced and indented
code blocks, tables, task lists, autolinks, reference-style links, and raw
HTML blocks.
Conservatively preserved (treated as Protected, not transformed): MDX,
template languages (Hugo/Jekyll shortcodes), Mermaid, math, and app-specific
extensions.
Non-goals (v0.1.0)
- Generation of canonical dialogue or exact impersonation
- Modification of code, configuration, or executable commands
- Full MDX / template-language support
- Semantic rewriting of legal text
- Transformation of HTML accessibility attributes
- In-place file modification by default
- Chunked large-document processing
Known limitations
- Intended for README-scale documents. Large documents are processed in one
pass and may exceed practical context or voice-consistency limits.
- MDX, template languages, and app-specific Markdown extensions are
conservatively preserved, not transformed.
- If validation fails after one retry, no final output file is produced.
- The gate's guarantee is structural only; factual integrity, quote
classification, legal-text recognition, and voice quality rest on these
instructions and on review.
1---2name: identity-theft3description: Steals fictional identities, not personal data. Use when the user asks to swanson-ize, yoda-ize, pirate-ify, vader-ize, or otherwise rewrite text, Markdown, HTML, or a document in a fictional character's voice (Ron Swanson, Yoda, a pirate, Shakespeare, Darth Vader, GLaDOS, Mary Poppins, Sherlock Holmes, or any of the 51 personalities in references/personalities/), or to create a character-voiced easter-egg README.4---56# identity-theft78## Overview910This skill rewrites supplied prose in a selected fictional character's voice11while preserving the input format and protecting every non-prose construct.12One personality-agnostic engine drives all characters; each character is one13dossier under `references/personalities/`. The roster grows by adding14dossiers — the engine never changes.1516The engine is a strict transformer with an output gate, not a Markdown17compiler wearing a fake mustache. The model transforms; a bundled script18verifies; output ships only if it passes. The transformation is not19guaranteed to preserve everything — the **accepted output** is, because20invalid output is rejected.2122Primary use: easter-egg documents (`README.swanson.md` beside a repo's real23`README.md`). Secondary use: paste text in chat, get converted text back.2425## Invocation2627- **A personality is required.** It is named at invocation ("swanson-ize28 this", "convert README.md as Yoda"). There is no global default29 personality. If none is named, ask which character before doing anything.30- **Aliases select the dossier.** Each dossier's header declares trigger31 `aliases`; match the user's request against them across the roster.32- **Modes are per-personality.** A dossier may declare `modes`; one is marked33 `default_mode`. Select a non-default mode only when the user names it.34 Ron Swanson defaults to The Full Swanson.35- **Input** is pasted text, HTML, or Markdown in chat, or a file path.36- **Output format always matches input format.** Markdown in → Markdown out.37 HTML in → HTML out with every tag and attribute intact and only text nodes38 converted. Plain text in → plain text out.39- **File input writes a sibling file** `<name>.<suffix>.<ext>` — e.g.40 `README` + suffix `swanson` + `md` → `README.swanson.md`. The suffix is41 declared by the dossier. Never write in place unless the user explicitly42 asks for it.4344## Workflow4546Run this sequence for every conversion:47481. **Load the dossier** for the selected personality from49 `references/personalities/<id>.md`. Read only that one file — other50 personalities stay out of context. Apply its speech patterns, vocabulary,51 riff themes, anti-patterns, preamble guidance, and selected mode.522. **Classify** every span of the source into the three content classes53 (Protected / Conservative / Free) defined below. Do this before writing a54 single word.553. **Transform** the Free and Conservative spans in voice; copy Protected56 spans through byte-identically; prepend the preamble per the placement57 rules.584. **Write the result to a temporary file** — never directly to the sibling59 path.605. **Run the output gate** from this skill's directory:6162 ```bash63 python3 scripts/validate_output.py SOURCE TEMP64 ```6566 `SOURCE` is the original file (or a temp file holding the pasted source);67 `TEMP` is the transformed temp file. Exit 0 = pass; exit 1 = fail with a68 per-region report.696. **On pass**, move the temp file to the sibling path70 `<name>.<suffix>.<ext>`. **On fail**, do not create the sibling file.71 Report the damage the gate named — region type, occurrence index, expected72 content, what was found — and **retry once** with stricter adherence,73 correcting exactly the regions the gate flagged. If the retry also fails,74 keep the temp file for diagnostics only and report the failure. **Never75 ship failed output and never silently downgrade to writing anyway.**767. **Chat inputs validate the same way.** Pasted Markdown or HTML is written77 to a temp file, validated against the supplied source (also via a temp78 file) before the result is returned. Plain text with no recognized79 protected constructs needs no region validation.8081The gate enforces **structural** invariants only: protected-region type,82order, count, and exact contents (compared region-by-region, not one83concatenated hash); link-class rules; zero unresolved same-document anchors;84matching output format, line-ending style, and final-newline state. Factual85integrity, quote classification, legal-text recognition, and voice quality86are enforced by these instructions and by review — the script does not check87them, so honor them yourself.8889## Preamble9091The preamble is the engine's wrapper — the character saying "here you go." It92is **not** part of the transformed body; mode liberty rules govern the body93only. It appears in **every output, every personality, every mode.**9495- **Length:** 1–3 lines, in character, funny. Brief & Blunt uses exactly one96 short line.97- **Placement:**9899 | Input | Preamble goes |100 |---|---|101 | Plain text | At the beginning. |102 | Markdown without frontmatter | At the beginning, as a blockquote. |103 | Markdown with YAML frontmatter | Immediately after the closing frontmatter delimiter, as a blockquote. |104 | HTML document | First child of `<body>`, as a `<blockquote>`. |105 | HTML fragment | Before the first convertible text node. |106107Emit the transformed document plus this preamble and nothing else. Add no108"Here's the Ron Swanson version" framing, no trailing meta-commentary, no109notes about what you did.110111## Content handling — three classes112113Classify every span before transforming.114115### Class 1 — Protected (byte-identical)116117Executable, referential, legal, and machine-readable content. Copy through118character-for-character, in original order, unchanged:119120- fenced and indented code blocks121- inline code spans122- `<code>` / `<pre>` / `<kbd>` / `<samp>` / `<script>` / `<style>` /123 `<textarea>` / `<template>` contents124- HTML comments125- YAML frontmatter126- badges / shields127- HTML tags and attributes (including `alt`, `title`, `aria-label` —128 accessibility text is preserved in HTML)129- file paths130- version numbers131- license and legal text132- link destinations (see Link classes)133134Code is data, not prose. A fenced block keeps its info string; an indented135block keeps its indentation; an inline span keeps its backticks and contents.136137### Class 2 — Conservatively transformed138139Headings, table headers, navigation labels, and instructional prose140(requirements, installation steps, warnings). Transform under the meaning141floor and factual-integrity rules; the result must remain followable and142scannable. **Exception — headings:** reproduce every heading verbatim and in143original order, including duplicate headings; do not rename, merge, or144deduplicate them, because same-document anchors depend on exact heading text145(see Anchor repair for the one permitted change).146147### Class 3 — Freely transformed148149Descriptive and expressive prose. Full personality treatment, subject to150factual integrity and anti-caricature. Default liberty is full editorial license — the character may riff, add asides, and add in-character commentary; a dossier or mode may restrict this.151152### Class boundaries153154- **Markdown image alt text is convertible** (class 2). **HTML attributes are155 not** (class 1) — `alt`, `title`, and `aria-label` in HTML stay verbatim.156- **Natural-language instructions** ("run the installer, then restart the157 service") are prose (class 2), not protected commands. Command protection158 is **structural**: it applies to explicitly delimited machine-readable159 content only (code fences, spans, the tags above).160- **Table structure is protected:** the delimiter row (`| --- | --- |`),161 column count, and cell layout stay exact; only cell text that is class 2/3162 prose may be voiced. **Task-list checkbox syntax** (`- [x]` / `- [ ]`) and163 its state are protected; only the trailing label text is eligible.164165## Link classes166167- **External URLs and non-fragment destinations:** byte-identical, always.168 This covers inline destinations, reference-style definitions, autolinks,169 bare `http(s)://` URLs, and HTML `href`/`src`. Only link *text* is voiced.170- **Relative links with a path component** (`guide.md#setup`): external to the171 current document; unchanged.172- **Same-document fragment links** (`#installation`): may change **only** to173 repair a renamed heading's anchor, and the repaired fragment must resolve174 to exactly one heading in the output.175- **Fragments inside code or other protected regions:** untouched.176177## Anchor repair178179- Because headings are reproduced verbatim (class 2 exception above), anchors180 normally need no repair. Repair applies only if a heading legitimately181 changed.182- Compute slugs with GitHub's heading-ID behavior. Use the GitHub-compatible183 slug implementation already vendored in the runtime — `gfm_slug` in184 `scripts/validate_output.py` — not a hand-rolled algorithm.185- Duplicate headings receive renderer-compatible numeric suffixes186 (`-1`, `-2`, …) exactly as the slug function assigns them.187- The gate confirms every rewritten same-document fragment resolves uniquely;188 an unresolved fragment fails validation.189190## Quotes191192- **Attributed quotations** — a named person, a testimonial, cited material,193 or any blockquote followed by an em-dash attribution — are reproduced194 **byte-for-byte**, including punctuation and the attribution line. This is a195 hard rule, not a hope.196- **Decorative callout text converts** — its existing wording may be re-voiced197 in tone. But **no blockquote gains new sentences, asides, or commentary**:198 converting a callout means re-voicing the text that is there, never199 appending to it or changing its factual content or length beyond tone.200 Admonitions, notes, and warnings additionally keep meaning-floor201 followability.202- **Unsure → untouched.** If you cannot tell whether a blockquote is a real203 quotation, leave it exactly as written.204205## Factual integrity (universal invariant)206207Voice changes tone, never content or claims. Preserve factual propositions,208names, dates, quantities, comparisons, and qualification levels. In-character209additions must be clearly rhetorical and must not:210211- introduce personal authorship or attribution claims absent from the source212 (do not turn an anonymous "we built this" into "I built this");213- fabricate instructions, remedies, or steps that replace the source's actual214 guidance (do not replace "check connectivity" with invented advice);215- assert reliability or quality claims the source does not make ("works most216 of the time");217- convert qualified claims into absolute ones;218- attribute fictional opinions to real people or organizations.219220Quantifiers are qualifications: "multiple machines" does not become "every221machine you own", "some users" does not become "all users".222223Do not editorialize about the document's own content or the task itself224(never call a documented section "a fake problem"). Voiced commentary stays225in-character narration about the subject matter, not meta-commentary that226undermines the document's credibility.227228## Voice quality (anti-caricature)229230- Character comes from sentence rhythm, worldview, priorities, and rhetorical231 habits — not catchphrase insertion.232- **No signature phrase more than once per document.** Not every paragraph233 gets a character reference. Rate-limit persona markers rather than leaving234 frequency to chance.235- Scale characterization to source length: a short document gets a light236 touch, not a saturated one.237- When voice conflicts with the reader's ability to use the document, the238 voice yields — clarity wins.239240## Intellectual property241242- Canonical dialogue may be studied for analysis but is never copied into243 dossiers or emitted as stock output.244- Do not reproduce or substantially paraphrase memorable copyrighted245 dialogue. Capture abstract stylistic traits, not quotation banks.246- All dossier examples are newly written.247248## File fidelity249250- Preserve LF vs CRLF line endings and the presence or absence of a final251 newline. The gate fails output that changes either.252- Do not normalize whitespace outside converted prose.253254## Markdown dialect (v0.1.0)255256Supported: GitHub Flavored Markdown — YAML frontmatter, fenced and indented257code blocks, tables, task lists, autolinks, reference-style links, and raw258HTML blocks.259260Conservatively preserved (treated as Protected, not transformed): MDX,261template languages (Hugo/Jekyll shortcodes), Mermaid, math, and app-specific262extensions.263264## Non-goals (v0.1.0)265266- Generation of canonical dialogue or exact impersonation267- Modification of code, configuration, or executable commands268- Full MDX / template-language support269- Semantic rewriting of legal text270- Transformation of HTML accessibility attributes271- In-place file modification by default272- Chunked large-document processing273274## Known limitations275276- Intended for README-scale documents. Large documents are processed in one277 pass and may exceed practical context or voice-consistency limits.278- MDX, template languages, and app-specific Markdown extensions are279 conservatively preserved, not transformed.280- If validation fails after one retry, no final output file is produced.281- The gate's guarantee is structural only; factual integrity, quote282 classification, legal-text recognition, and voice quality rest on these283 instructions and on review.