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.

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 cache never invalidates. And that detail turns out to matter more than anything else here. The cache never invalidates. two-beat reveal: state a fact, then announce it was secretly the point. State the point once.
The outage wasn’t the deploy. It was the DNS TTL. The DNS TTL caused the outage; the deploy was a coincidence. negation-first reveal: invent a wrong answer just to knock it down. State what is; delete the strawman.
The step everyone skips: the allowlist. Everyone skips the allowlist. colon-staged intro: a coy fragment that withholds the point for a beat. Make it one normal sentence.
The refactor becomes a conversation about ownership. During the refactor, we argued about who owns the module. false agency: an abstraction doing a human verb, so no one is accountable. Name the humans.
The cron ran twice, revealing a deeper scheduling issue. The cron ran twice because two schedulers were registered. analysis tail: an “-ing” clause bolted on for fake depth. If the tail carries the meaning, the sentence was empty.
The gallery functions as the exhibition arm of the association. The gallery is the exhibition arm of the association. copula avoidance: marketing verbs where “is” belongs. Measured drop of over 10% in is/are usage in academic writing since late 2022.

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:

The families, by what drives them
FamilyThe chassisThe fix
Chatbot leakageHelper-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 isCut. Start where the content starts.
Binary contrastNegate-then-assert: set up a false either/or, reveal the “real” answerState the real answer; delete the invented wrong one.
Significance pufferyMonument-grade vital-role, lasting-legacy language around unremarkable subjectsState the concrete fact; drop the framing.
Hype + hedgeBig adjectives with no committed claim; or stacked maybes around a firm oneReplace with the specific number or the plain claim.
Copula avoidanceMarketing verbs standing in for “is” and “has”Restore the copula.
False agencyInanimate nouns doing human verbs, so accountability evaporatesName the actor, or put the reader in the seat.
Analysis tailsParticiple clauses appended for fake depthDelete the tail; strengthen the sentence.
Vague attributionUnnamed experts and researchers holding conveniently supportive opinionsName the source or drop the claim.
Performed thoughtThe §02 family: prose narrating its own significanceSay the thing.
Structural tellsUniform 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.md scores arbitrary text and returns a density verdict of noise / signal / rewrite. --register is 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.
Why the specimens in §02 are paraphrases: the detector can’t tell using a phrase from mentioning one, and this page has to ship at zero hits through the gate it describes. So every specimen here is a structural stand-in with the same chassis and different surface words, which is also a live demonstration of why phrase lists alone can’t catch the structural families.

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.
The growth loop is the real product. My bank got to 297 rows one flagged sentence at a time over months, with a tiny intake ritual: I type a trigger word, my Claude files the new tic into the CSV, the taxonomy, and the voice rules in one pass, then a consistency check verifies the three homes agree. Steal the loop, not the list.

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.csv in 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 --register flag: 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.

Written with (and about) kaibot, 2026, under the gates it describes. · companion page: Physics, not pleas

Excelsior!
Kai

You’ve reached the end of note 12 of 19

$400 1 hour

Book a call

A 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.

All nineteen field notes, in six chapters