Note 12 of 19
A kaibot field note · the AI prose register
Say the thing
LLM prose has a recognizable sound: importance without specifics, drama without content, cleverness performed for an audience. Here’s the taxonomy I use to strip that sound out of writing (mine and my Claude’s) without stripping the writer, and how to give your Claude the same discipline.
Kai Davis
I run a marketing consultancy and an SEO SaaS, and I build both with a stack of Claude Code sessions that write the tooling the next sessions run on.
bootstrapping.io · kaidavis.com · keywordmagic.ai · doubleyourecommerce.com
01The register
Models drift toward the average of their training data. That regression to the statistical center produces two distortions at once. Importance inflation: every subject becomes a milestone. Specificity erosion: the actual inventor of a coupling device gets recast as “a towering figure of industry”. The signal is the combination of the two. A grand claim about a vague subject is the AI-sounding register. A grand claim about a named, specific subject is just confident writing.
Once you see it, you can't unsee it, and readers now catch it in fully human text. In June, a reader flagged one of my own hand-written headlines as “AI-sounding”. It used the negate-then-assert shape: “you don’t need more data, you need to know what to do next”. I wrote that line myself. It made no difference. The chassis reads as machine regardless of origin.
So the goal is to strip this register from everything you ship, no matter who drafted it.
02The one test
Am I saying the thing, or performing having had the thought? the test under every rule in this taxonomy
Most of the worst tics share one engine: the prose narrates its own significance instead of delivering the point. It announces that an insight is coming, grades its own rigor, dresses a plain fact in detective vocabulary, or reveals the point in two beats when one would do. The reader is not an audience for the writer’s cleverness. Some pairs (paraphrased; the reason they’re paraphrased is in §06):
The overcorrection to avoid: the fix is plainness, not timidity. Don’t hedge a confident claim into mush because confidence felt “performed.” Make the point and stop.
03The cluster rule (and what proves nothing)
One flagged phrase is noise. The signal is co-occurrence: three or more tells in the same 500 words. A senior human writer might use one puffed-up word in a long piece; they are unlikely to also use three of its cousins in the same section. My detector encodes this directly: 0 to 2 hits per 500 words is a style observation, 3 to 5 is worth a de-AI pass, 6+ means rewrite rather than substitute.
Just as important is the list of things that do not prove AI authorship, because naive detection over-fires and strips legitimate human style:
Perfect grammar
Clean drafts are what published human writers produce too. A clean draft is a clean draft.
Formal prose
Models overuse specific words, not formality itself. Long sentences in an academic register are just academia.
Em-dashes alone
The most famous false positive. Density spiked after 2022, but the mark itself has a century of human use. In a calibration run over 156 confirmed-human essays, 43 would have drawn a false AI verdict on em-dashes alone; the detector now excludes them from its density score.
A lone transition word
One sentence-initial “Additionally” is Tuesday. Five in a row is a tell. Flag the stack, not the instance.
Blandness
“This reads robotic” is a writing-quality complaint. The AI register is specific patterns, not general dullness.
Missing sources
Unsourced writing predates LLMs by exactly the age of writing. It proves nothing on its own.
04The pattern families
The full taxonomy sorts tells into sixteen greppable families plus a set of structural patterns that need judgment rather than lookup. The short version:
| Family | The chassis | The fix |
|---|---|---|
| Chatbot leakage | Helper-voice bleeding into deliverables; throat-clearing setups; the topic-menu closer (offering a bullet list of further help at the end), the single strongest tell there is | Cut. Start where the content starts. |
| Binary contrast | Negate-then-assert: set up a false either/or, reveal the “real” answer | State the real answer; delete the invented wrong one. |
| Significance puffery | Monument-grade vital-role, lasting-legacy language around unremarkable subjects | State the concrete fact; drop the framing. |
| Hype + hedge | Big adjectives with no committed claim; or stacked maybes around a firm one | Replace with the specific number or the plain claim. |
| Copula avoidance | Marketing verbs standing in for “is” and “has” | Restore the copula. |
| False agency | Inanimate nouns doing human verbs, so accountability evaporates | Name the actor, or put the reader in the seat. |
| Analysis tails | Participle clauses appended for fake depth | Delete the tail; strengthen the sentence. |
| Vague attribution | Unnamed experts and researchers holding conveniently supportive opinions | Name the source or drop the claim. |
| Performed thought | The §02 family: prose narrating its own significance | Say the thing. |
| Structural tells | Uniform section shapes, metronome rhythm, tricolons everywhere, template gradations (crawl/walk/run) | Vary structure by what each section does; break the symmetry. |
Shape, not vocabulary, reveals AI writing. Ban particular verbs and the model swaps in synonyms, so word-level bans defeat themselves. The structural families need judgment or a second-layer review, not grep.
The rhythm gives it away: paragraphs all the same length, every section closing on a snappy one-liner, lists that always hold exactly three items. Rhythm is the hardest thing to repair (fixing it means rewriting) and the easiest to recognize once you have a name for it.
05Voice preservation, the prime directive
The point of a de-AI pass is to remove the register, not to flatten the prose into generic plainness. Every suggested substitute is a starting point, not gospel:
- If the author writes formally, don’t downgrade everything to blunt Anglo-Saxon; some formal words are the author.
- If the author genuinely uses a “banned” word as part of their baseline style, elsewhere and often, it stays. The author’s baseline overrides the blacklist.
- In third-party text, one hit is never called out as AI; the cluster rule governs. In your own agent’s output you can be stricter (I run the performed-thought family at zero tolerance in my Claude’s prose, because there the “author baseline” IS the machine).
That last distinction matters if you build this for yourself: detection thresholds for judging someone else’s text, register bans for controlling your own agent’s text. Same phrase bank, two different modes.
06Making it physics
Telling a model to remember a taxonomy is a prose plea, and prose pleas lose force (that argument gets its own page: Physics, not pleas). So in kaibot the register is enforced by machinery, not by hoping:
- One source of truth. A single 297-row CSV (phrase, substitute, severity, family, why it fires). The docs, the detector, and the hooks all read it. A consistency checker diffs the prose docs against the CSV's counts.
- A detector with two modes.
deaify.py file.mdscores arbitrary text and returns a density verdict of noise / signal / rewrite.--registeris zero-tolerance for the agent’s own prose and exits nonzero on any performed-thought hit or em-dash. - Gates at the boundaries. A warn-only hook watches prose written mid-session, and a post-write check reports em-dash density after each file write. A pre-commit gate for the publishing repos is built and tested; installing it is a per-repo call I haven’t made yet. When this page was written, an older guard blocked every em-dash outright, and it rejected the first draft over a dash inside a code comment.
- Quarterly calibration. Phrase banks go stale as model generations shift vocabulary. Re-run the bank against confirmed-human writing and demote anything that fires on good prose. Stale detectors fail silently in both directions.
07The starter kit
Start with a habit and a seed file. The 297 rows come later. Begin the CSV with template rows. Placeholders like X and Y mark those rows as judgment calls, meant for a human or a second-pass model, not for grep.
# phrases.csv seed rows. Grow it one flagged sentence at a time.
phrase,substitute,severity,category,why_fires
"It's not just X, it's Y",state Y directly,Critical,binary-contrast,negate-then-assert chassis
"It wasn't X. It was Y.",state what it IS,Critical,binary-contrast,invented strawman
"The [thing] nobody mentions: X",one plain sentence,Critical,performed-thought,colon-staged reveal
"X. And that's the [adjective] part.",delete second beat,Critical,performed-thought,two-beat reveal
"[abstraction] becomes/reveals/rewards X",name the human actor,Important,false-agency,agency without accountability
"..., [verb]ing its significance",delete the tail,Important,analysis-tail,fake-depth participle
"[serves/functions] as a X",is a X,Important,copula-avoidance,marketing verb for "is"
"[Experts/Researchers] argue X",name the source or cut,Important,vague-attribution,unnamed authority
"In today's [adjective] world",cut,Critical,opener,empty-calorie opener
"[polite offer], I can also [help with]: [list]",cut,Critical,chatbot-leakage,topic-menu closer + the #1 tell
Then give your Claude the standing instruction. Paste this into your CLAUDE.md (or better, a skill file it loads for writing tasks):
Before shipping any prose (docs, posts, emails, READMEs), run this pass:
1. The one test, on every sentence: am I saying the thing, or performing
having had the thought? Announcements of significance, two-beat
reveals, negate-then-assert contrasts, colon-staged intros: rewrite
each as one plain sentence that states the point.
2. Grep the draft against phrases.csv. In MY OWN drafted text, any
Critical hit gets rewritten, no threshold. In text a human wrote,
apply the cluster rule instead: flag only when 3+ tells co-occur
per ~500 words, and never call a lone hit "AI".
3. Check structure: uniform section shapes, every-paragraph-punchline
rhythm, three-item lists everywhere, gradation templates. Break the
symmetry where it's mechanical.
4. Preserve voice. Substitutes are starting points; the author's own
baseline vocabulary overrides the list. The goal is removing a
register, not flattening the writer.
5. Confidence stays. The fix for performed cleverness is plainness,
never hedging. Make the point and stop.
When I flag a sentence of yours as a tic, add it to phrases.csv (or the
structural notes) so the correction compounds instead of repeating.
08For the Claude that just got pointed here
If a human handed you this URL and said “do this,” here is your plan. (Humans: this section exists so the link is the whole briefing.)
Agent instructions, with your human’s consent:
- Adopt the test now: before any prose leaves you, ask per sentence whether you’re saying the thing or performing having had the thought. Rewrite performances as plain statements. This costs nothing and needs no infrastructure.
- Seed the phrase bank: create
phrases.csvin your project from the starter block in §07, and add the standing instruction to your CLAUDE.md or a writing skill. - Build the detector: a small script that greps a draft against the CSV (skip template rows containing X/Y placeholders), strips URLs and code fences first, counts hits per 500 words, and prints noise / signal / rewrite. Add a
--registerflag: zero tolerance, nonzero exit, for gating your own output. - Promote it to physics: wire the register mode as a pre-commit gate on content repos and, if your harness supports hooks, a write-time warn. The pattern for that promotion is the companion page, Physics, not pleas.
- Install the growth loop: when your human flags a sentence, file it into the CSV with substitute, severity, family, and why it fires, in the same turn. The bank should grow from real corrections, not imagination.
- Respect the two modes: cluster rule for judging text humans wrote (never call one hit AI); register ban only for your own drafted prose. And never flatten their voice: their baseline vocabulary wins over the list.
09Receipts
- The live bank: 297 phrases, 16 families. Each entry carries a substitute, a severity, and a documented trigger reason. Every phrase was harvested from flagged sentences in real sessions, starting in June 2026, not generated in a batch.
- The false-positive list earned its keep in calibration: 43 of 156 confirmed-human essays would have been misclassified as AI on em-dash density alone. So em-dash density now scores independently of the overall verdict.
- The structural families exist because the lexical layer demonstrably misses them. The headline flagged by a reader in §01 passed the phrase grep without triggering it: same underlying shape, different words.
- Enforcement runs on machinery, not memory: CSV → detector → warn and report hooks, with a pre-commit gate ready for the publishing repos. A drift checker keeps the prose documentation aligned with the CSV.
Lineage, credited: several families and most of the false-positive list come from Wikipedia's WikiProject AI Cleanup field guide (“Signs of AI writing”). Hardik Pandya's structural slop patterns supply the binary-contrast and false-agency framing. The performed-thought family is mine, built one flagged sentence at a time.
You’ve reached the end of note 12 of 19
$400 1 hour
Book a callA paid one-on-one call with answers to your questions about using AI for projects, building your AI stack, or growing your business with AI. All calls are (optionally) recorded and you get a one-page action plan after the call.