De-AI writing at the layer that actually gives AI away. Fiction gets its narrative architecture repaired before anyone touches word choice; professional documents (release notes, PR replies, postmortems, tickets, technical articles) each get rules matched to
> /plugin marketplace add Nanako0129/sepia> /plugin install sepia@sepia
What's inside
De-AI writing at the layer that actually gives AI away. Fiction gets its narrative architecture repaired before anyone touches word choice; professional documents (release notes, PR replies, postmortems, tickets, technical articles) each get rules matched to their venue.
A portable Agent Skill: any agent that speaks the standard can load it, and the Skills CLI, which supports 77+ agents, installs it with one command. Claude Code, Codex, Grok Build, Antigravity, and QwenPaw additionally get native plugin packaging. One canonical SKILL.md, no per-platform forks. Four operations: write, review (diagnose only), refactor (minimal edits), recreate (full rewrite).
Every popular humanizer edits word choice and syntax. StoryScope (Russell et al., 2026: 61,608 stories, human + 5 frontier LLMs) showed that a classifier using narrative-structure features alone detects AI fiction at 93.2% macro-F1. In the same study's LAMP-edited condition, where human editors had rewritten the surface style, detection dropped only from 95.5% to 93.9%. The tells that survive are architectural: themes explained by the narrator, single-track causally-tidy plots, emotions rendered only as bodily sensation, no real-world references, no reader, linear time, endings resolved by protagonist growth and acceptance.
sepia turns those measured gaps, together with the related studies digested in research/, into a three-pass writing and revision protocol for fiction:
| Pass | Layer | Examples |
|---|---|---|
| 1 | Narrative architecture (fiction) | stop explaining the theme, loosen the causal chain, back-load revelations, mix emotion modes, sparse character networks, name real things |
| 2 | Discourse flow | de-template the paragraph-question sequence, fix the mid-story sag, vary rhythm and positions |
| 3 | Surface style | the classic layer: clichés, syntax templates, vocabulary, register |
A 30-feature diagnosis rubric and per-model fingerprints across two layers apply when the writing or executing model is known:
| Model family | Narrative layer (StoryScope) | Sentence-level prose layer (Vendor prompting guides) |
|---|---|---|
| Claude | Measured | Claude Fable 5.1 and Mythos 5.1, Fable 5 and Mythos 5, Opus 5, Opus 4.8 |
| GPT | Measured | GPT-5.6, GPT-6 Astra |
| Gemini | Measured | Gemini 3 and 3.1 |
| DeepSeek | Measured | Consulted (no guidance published) |
| Kimi | Measured | Consulted (no guidance published) |
Notice: Vendors that publish no prompt guidance are recorded as consulted, not guessed.
Professional prose fails differently, and the structure-level finding holds there too: a 2026 replication of StoryScope on 2,250 company blog posts against 11,250 AI mirrors separated them at 98.0 macro-F1 from structural features alone, with the AI shape described as tidy and self-announcing (SLOPSHAPE-2026 in the ledger, arXiv:2609.15369; a preprint whose features are LLM-scored; it tested detection of original and model-self-reworded posts, never human editing). The studies digested in research/ point at filler that carries no information, hedging where a judgment was needed, chatbot leftovers, register that ignores the venue, and formatting that looks stamped out. Each document type gets a thin rule file on top of one shared checklist:
| Domain | The gist |
|---|---|
| Release notes / announcements | user impact first, artifacts per claim, no marketing inflation |
| PR / issue replies | answer first, cite file:line, no reflex praise, length ∝ stakes |
| Postmortems | blameless toward people, merciless toward mechanisms; timestamps, dead ends, owned action items |
| Tickets / work orders | title = outcome, testable acceptance criteria, link don't repeat |
| Technical articles | open at the problem, one real dead end, one committed opinion, numbers with conditions |
| Long-form journalism (features, investigations, data stories) | lead and body in two registers, quotations keep their spoken texture, every number carries a comparison, no summary ending |
Governing principle: Calibrate to the human distribution, don't invert the AI one. Humans sit at moderate values; a story with every rule applied is a new fingerprint. The skill selects 3–5 moves per story and leaves slack.
The complete plugin package gives Claude Code, Codex, Grok Build, and Antigravity a general router plus five direct entries. QwenPaw gets the /sepia router only, so the table below does not apply there:
| Operation | Claude Code | Codex | Grok Build | Antigravity | Meaning |
|---|---|---|---|---|---|
| write | /sepia-write | $sepia-write | /sepia-write | /sepia-write | Create new prose |
| review | /sepia-review | $sepia-review | /sepia-review | /sepia-review | Diagnose without editing |
| refactor | /sepia-refactor | $sepia-refactor | /sepia-refactor | /sepia-refactor | Make minimal in-place edits |
| recreate | /sepia-recreate | $sepia-recreate | /sepia-recreate | /sepia-recreate | Rewrite from the source facts and intent |
| hemingway | /sepia-hemingway | $sepia-hemingway | /sepia-hemingway | /sepia-hemingway | Write or refactor fiction with the built-in Hemingway voice applied |
The general /sepia (Claude Code, Grok Build, Antigravity, and QwenPaw) or $sepia (Codex) router remains available; on QwenPaw the package installs the six skills into each workspace and registers no per-operation slash commands. What was verified on each platform is stated under Install.
Notice: Standalone wrapper installation is unsupported. The operation wrappers depend on their sibling canonical skill; install the complete plugin package.
Since v0.4.0, sepia defines an interface for stacking a voice or style skill on top of it — a minimalism method, a brand voice, a persona guide. It is opt-in: tell sepia the voice skill is in play, and it loads references/voice-skills.md over the normal route. No external voice is loaded unless you say so.
The interface contract operates under fixed precedence rules across operations and routes:
| Rule dimension | Contract specification |
|---|---|
| Architecture | sepia's architecture decisions come first. |
| Move selection | Voice moves are applied selectively (3–5 signature moves per piece, fewer when a sparse shape or the facts offer fewer; formula endings deliberately broken sometimes). |
| Review diagnostics | Review reports the voice's known costs instead of fixing them away. |
| Uniformity enforcement | Uniformity findings keep full strength: a voice does not excuse a metronome. |
| Professional register | On professional routes, the venue still sets the register. |
| Conflict resolution | Direct conflicts come back to you. |
Notice: The voice-skills interface is grounded in one blind review experiment on a strict-minimalism specimen — a worked example, not measured evidence.
Two built-in profiles ship under references/voices/, alongside a persona profile kind with declared override rights:
| Profile | Target routes | Source & characteristics | Opt-in & invocation |
|---|---|---|---|
Hemingway (references/voices/hemingway.md) | Fiction and professional prose | Iceberg omission for fiction, the Kansas City Star rules for professional prose; each move traced to its source | Direct entry /sepia-hemingway (or $sepia-hemingway). On fiction, asking for strong de-AI on a story counts as opting in (sepia announces the profile and how to decline). Without an opt-in, a fiction review only reports when the text fits the profile and loads nothing. |
Taiwan long-form journalism (references/voices/tw-journalism.md) | Professional routes only | Nine narrative shapes with their moves, drawn from private human-side journalism measurement and its close reading | Opt-in phrase: "apply the Taiwan journalism voice". Follows the same rules as Hemingway. |
Persona template (references/voices/PERSONA-TEMPLATE.md) | Author-defined | One writer's style with declared override rights; checked by scripts/check_persona.py | Author-created profile. Template at references/voices/PERSONA-TEMPLATE.md. |
Nyaneko (references/voices/personas/nyaneko.md) | Professional routes only | Built-in companion voice written from the maintainer's voice specification with her own exemplars | Opt-in phrase: "apply persona Nyaneko" or 「套用 persona Nyaneko」. |
sepia's rules remove tells. Warmth has another source: the writer knowing who is speaking, and to whom. One case from this project's own release, with nothing measured: the v0.12.0 Threads post was drafted twice by the same model from the same release notes. The first prompt handed it a skeleton (version line, bullets, fixes, engineering note, update line) and got a form filled in. The second prompt handed it an identity, "I maintain this project and just shipped v0.12.0; talk to my followers in my own voice; how you organise it is yours", plus the notes as the only fact source and the platform's limits, and got the post the maintainer kept. A sepia review of that post then found its tells clustered at the opening and the close (an opening about how the change came to be, a maxim ending, a few absolutes), and a refactor took them out without touching the middle.
The order that worked:
Do not use tools; everything you need is below.
I am <who>, writing for <whom>, about <what just happened>. Use my own voice; how to organise it is yours.
Platform limits: <length, markup, mentions>.
Facts come only from the notes below; numbers and identifiers must match them.
===== notes =====
<the source document>
A persona profile is that identity written down once so every piece starts from it: what they are to the reader, what their first sentence does, how warmth attaches to a fact, what they never do, and pieces in their own voice as exemplars. The template is references/voices/PERSONA-TEMPLATE.md, the built-in references/voices/personas/nyaneko.md is a worked example, and the interface validator checks the profile structure:
python3 scripts/check_persona.py <file>
Write your own; the exemplars carry more than the description does.
The style pass checks the spread of sentence lengths, the one syntactic measure on which every study that measured it agrees: human text varies more within a passage, in English and in Chinese.
| Syntactic measure | Status | Empirical basis |
FAQ
sepia is a Claude Code plugin with 6 hand-picked skills for writing work, indexed on Flowy. Install it with the command on its page. It includes sepia-hemingway, sepia-recreate, sepia-refactor. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.
Is this plugin yours?
Claim it with GitHubSubmit a pluginPromote it