Skip documentation navigation
Documentation menu

AI speak patterns, part 1

Built from the packs in hooks/lib/patterns. Each section names its own source.

Phrase patterns are case-insensitive. The left column holds the flagged text, the right column the fix the hook prints.

CategoryLabelPackPresetsFile
claude-tellsClaude tellsbacktick-branches, claude-tells, closing-offerdefault, ryan, technical, allai-speak-patterns.md
british-spellingBritish spellingbritish-spellingryan, allai-speak-patterns.md
chatbotchatbot phraseschatbotdefault, ryan, technical, minimal, allai-speak-patterns.md
closersclosersclosersdefault, ryan, technical, allai-speak-patterns.md
contrastcontrast framescontrastdefault, ryan, technical, allai-speak-patterns.md
copulainterpreting verbscopularyan, ste, allai-speak-patterns.md
elegant-variationelegant variationelegant-variationryan, allai-speak-patterns.md
false-rangesfalse rangesfalse-rangesdefault, ryan, technical, allai-speak-patterns.md
fillerfillerfillerdefault, ryan, technical, allai-speak-patterns.md
formattingformattingformattingdefault, ryan, allai-speak-patterns.md
hedginghedginghedgingryan, ste, allai-speak-patterns.md
inflationsignificance inflationinflationdefault, ryan, technical, allai-speak-patterns-2.md
lexical-diversitylexical diversitylexical-diversitystatistical, allai-speak-patterns-2.md
negative-parallelismnegative parallelismnegative-parallelismdefault, ryan, technical, allai-speak-patterns-2.md
outline-conclusionoutline-restating conclusionsoutline-conclusionryan, allai-speak-patterns-2.md
overgeneralizationovergeneralizationovergeneralizationdefault, ryan, technical, allai-speak-patterns-2.md
paragraph-coherenceparagraph coherenceparagraph-coherenceryan, statistical, allai-speak-patterns-2.md
parallel-bulletsparallel bulletsparallel-bulletsryan, allai-speak-patterns-2.md
passive-voicepassive voicepassive-voiceryan, statistical, allai-speak-patterns-2.md
promotionalpromotional languagepromotionaldefault, ryan, technical, allai-speak-patterns-2.md
punctuation-patternspunctuation patternspunctuation-patternsstatistical, allai-speak-patterns-2.md
rare-wordsrare word usagerare-wordsstatistical, allai-speak-patterns-2.md
readability-gradereadability gradereadability-graderyan, statistical, allai-speak-patterns-2.md
rule-of-threerule of threerule-of-threeryan, allai-speak-patterns-2.md
sentence-variationsentence variationsentence-variationryan, statistical, allai-speak-patterns-2.md
stesimplified technical englishsteste, allai-speak-patterns-2.md
structureopeners and framesstructuredefault, ryan, technical, allai-speak-patterns-2.md
superficial-analysissuperficial analysissuperficial-analysisryan, allai-speak-patterns-2.md
sycophancysycophancysycophancydefault, ryan, technical, minimal, allai-speak-patterns-3.md
terminal-punctuationterminal punctuation uniformityterminal-punctuationstatistical, allai-speak-patterns-3.md
transition-densitytransition densitytransition-densityryan, statistical, allai-speak-patterns-3.md
transitionstransitionstransitionsdefault, ryan, technical, allai-speak-patterns-3.md
undue-emphasisundue emphasisundue-emphasisryan, allai-speak-patterns-3.md
vague-attributionvague attributionvague-attributiondefault, ryan, technical, allai-speak-patterns-3.md
vocabularyAI frequency wordsvocabularydefault, ryan, technical, allai-speak-patterns-3.md
word-frequencyword frequencyword-frequencystatistical, allai-speak-patterns-3.md
wordinesswordinesswordinessryan, ste, allai-speak-patterns-3.md
ai-attributionAI attribution trailerai-attributiondefault, ryan, technical, minimal, git, allai-speak-patterns-3.md
ai-identityAI author identityai-identitydefault, ryan, technical, minimal, git, allai-speak-patterns-3.md
ai-tool-mentionAI tool mentionai-tool-mentiondefault, ryan, technical, git, allai-speak-patterns-4.md
benefit-tailbenefit tailbenefit-tailryan, technical, git, allai-speak-patterns-4.md
canned-reviewcanned reviewcanned-reviewdefault, ryan, technical, git, allai-speak-patterns-4.md
file-narrationfile narrationfile-narrationryan, technical, git, allai-speak-patterns-4.md
praise-sandwichpraise sandwichpraise-sandwichryan, git, allai-speak-patterns-4.md
hidden-charactershidden charactershidden-charactersdefault, ryan, technical, git, allai-speak-patterns-4.md
smart-punctuationsmart punctuationsmart-punctuationdefault, ryan, technical, allai-speak-patterns-4.md
unicode-glyphsunicode glyphsunicode-glyphsdefault, ryan, technical, allai-speak-patterns-4.md

claude-tells

Presets: default, ryan, technical, all. Source: Measured on 1.29M words of Opus 5.5 Claude Code replies against 1.13M words of npm READMEs and 87K words of pre-2023 commits; Anthropic’s Opus 5.5 and Fable 5.1 prompting guides; Anthropic’s Opus 5.5 prompting guide lists “an offer to carry on with something unless the user would prefer otherwise” as a habit to suppress; 1.93 per 10,000 words in Opus 5.5 replies, none in the baselines.

Phrasing that Claude 5.x models write far more often than people do.

FlaggedFix
Phrasing that Claude 5.x models write far more often than people do.branches = ["main","master","dev","develop","development","staging","stage","production","prod","release","trunk","next","beta","canary"]
the doc admits, the code pretends, the test liessay what the text states: the doc says X
admits it, concedes as muchsay what the text states
Existing bug, not a regressioncut the not X tail, the label already says it
the big migration, the huge refactorcut the size word, or give the size
covers this path, hits that pathname the branch: the function, condition, or flag
on purposeput intentionally before the verb, or give the reason
, by design., , as intended.cut the tag, or give the reason
, with your low call volume noteput the aside in parentheses, or make it a clause
quietlycut it, or say what is not logged or reported
earns its keep, earns its placesay what it does
Want me to ...? or Do you want me to ...? at the end of the textcut the offer, or name the step that needs approval
Flagged (tier 2)Fix
a real bug, the real gap, the real storycut real
reads well, reads cleanlysay what works

Flags a branch name in backticks after from, into, onto, against, or a similar word, or before branch. Prose files stay out of scope: docs often set branch names as code by convention. Set options.branches to match the repo’s branch names.

Every tier-1 row fired at most 0.02 times per 10,000 words in the README and commit baselines. The status-label row needs a verbless fragment at the start of a line or sentence, so This is a known limitation, not a bug stays with the contrast pack. The closing offer lives in closing-offer.json so it can be excluded alone.

Fires only when the offer is the last sentence of the text. A question followed by a reason, such as Do you want me to delete it? It has two unmerged commits., stays unflagged. A setup that asks before every test run can list closing-offer in excludePacks.

british-spelling

Presets: ryan, all. Source: Measured on Claude Code transcripts: Opus 5.5 wrote behaviour in 31% of uses, labelled in 58%, and grey in 77%; npm READMEs used them in 11%, 20%, and 30%.

British spellings in text that otherwise uses American English.

FlaggedFix
behaviour, behaviours, behaviouralbehavior
colour, colours, colouredcolor
favour, honour, neighbour, labour, flavour, humour, rumour, harbour, armour, vapourdrop the u: favor, honor, neighbor
labelled, modelling, travelled, signalled, levelled, channelledone l: labeled, modeling
centre, metre, litre, fibre, theatre-er: center, meter
-ise and -isation forms such as normalise, initialised, organisation-ize, -ization
analyse, analysed, analysing-yze: analyze
grey, greys, greyed, greyinggray
whilstwhile
amongstamong
programme, programmesprogram
licence[ds]?license
defence, offencedefense, offense
catalogue[ds]?catalog
artefact, artefactsartifact
spelt, learntspelled, learned
per centpercent

A repo that writes British English lists british-spelling in excludePacks. cancelled, judgement, acknowledgement, towards, and dialogue are left out because American writers use them too. analyses is left out because it is also the plural of analysis. Elixir’s @behaviour attribute sits in code, which the scan skips.

chatbot

Presets: default, ryan, technical, minimal, all. Source: avoid-ai-writing by Conor Bronsdon (MIT) and Ryan Yannelli’s house rules.

Assistant boilerplate that belongs to a chat window.

FlaggedFix
certainly!, absolutely!, of course! (sentence-initial)cut
I hope this helps, hope this helpscut
great question, excellent question, good questioncut
feel free to reach out, feel free to ask, feel free to contact, feel free to let me knowcut
don't hesitate tocut
let me know if you, let me know if there, let me know if that, let me know if this, let me know if itcut
happy to helpcut
I'd be happy to, I would be happy tocut
as an AI, as an AI language modelcut
as of my last update, as of my last training, as of my last knowledge, as of my latest update, as of my latest training, as of my latest knowledge, knowledge cutoffcut
I don't have access to real-timecut
As a language modelcut
I am an AIcut
I'm just an AIcut
As an assistantcut
I cannot browsecut, state the limit
I don't have personal opinionscut
I'm unable to browse, verify this, and the likestate what you can do
please note thatstate the fact
Kindly + verbimperative without “kindly”

closers

Presets: default, ryan, technical, all. Source: avoid-ai-writing by Conor Bronsdon (MIT) and Ryan Yannelli’s house rules.

Endings that restate the text instead of stopping.

FlaggedFix
Ultimately (sentence-initial)cut
As we move forward, Moving forward (sentence-initial)cut
in conclusion, in summary, to summarize, to sum upcut, end on the last fact
at the end of the day, only time will tell, stay tuned, exciting times, happy coding, thank me latercut
the future looks bright, the future is bright, the possibilities are endlesscut
one thing is certain, one thing is clearstate it
worth reading, worth a look, worth a read, worth exploring, worth checking out, worth your timesay why
the journey begins, the journey continues, the journey is just beginning, the adventure begins, the adventure continues, the adventure is just beginningcut
the bottom line, the key takeaway, the takeaway herestate it
I look forward to, we look forward tocut, or state the next step and date

contrast

Presets: default, ryan, technical, all. Source: avoid-ai-writing by Conor Bronsdon (MIT), Ryan Yannelli’s house rules, and Wikipedia:Signs of AI writing.

Frames that define the subject by what it is not.

FlaggedFix
it's not X, it's Y (also it is not, this is not, that's not, with just, only, about, merely, or simply inside)state the positive claim
isn't about X, it's about Ystate the positive claim
not just X but Y (also not only, not merely, not simply)state Y
X, not Y as the tail of a sentence, up to 3 words after notwrite the claim as “X does Y”
less about X, more about Ystate the positive claim
instead of X, it's Ystate the claim directly
isn't X. It's Y.combine into one claim

A bare rather than is not flagged: it is ordinary technical English. The cross-sentence form stops at a second negation, which the negative-parallelism pack owns.

copula

Presets: ryan, ste, all. Source: avoid-ai-writing by Conor Bronsdon (MIT) and Ryan Yannelli’s house rules.

Verbs that interpret the subject instead of naming what it does.

FlaggedFix
serves as, acts as, stands as, functions asis, or the literal action
boastshas
the source of truthsay what reads it
the key constraintname the constraint
the path forwardthe next step, named
this ensuressay what happens
plays a key role, plays a vital role, plays a critical role, plays a central role, plays a significant role, plays an important rolesay what it does
designed to help, designed to ensure, designed to provide, designed to enable, designed to makesay what it does

State the fact instead of interpreting it.

elegant-variation

Presets: ryan, all. Source: Fowler via Wikipedia:Elegant variation and Wikipedia:The problem with elegant variation.

Rotating synonyms for one referent instead of repeating the name.

FlaggedFix
aforementionedname it again
the eponymousname it directly
self-titledname it directly
the titularname it directly
of the same namename it directly, or cut
Rotating synonyms for one referent instead of repeating the name.minWords = 200, minSynonyms = 3

The counting half needs 200 words and three synonyms from one cluster, each used once. Repeating a word turns the paragraph off.

false-ranges

Presets: default, ryan, technical, all. Source: tropes.fyi directory and the agent-toolkit signs-of-ai-writing mirror.

A “from X to Y” span whose endpoints share no real scale.

FlaggedFix
everything from X to Ylist the specific items
anything from X to Ylist the specific items
runs the gamut from X to Yname the actual range
the full spectrum of X from A to Bname the actual range
from A to B to Csplit into a list

A plain two-point range stays unflagged, so numeric and version ranges pass. The chained form skips a span that holds a digit or a parenthesis, and skips a third to that opens a purpose clause, so from 0 to 1000 to pick a victim and from left to right to reduce the list stay clean. Only the marked forms and chained word spans report.

filler

Presets: default, ryan, technical, all. Source: avoid-ai-writing by Conor Bronsdon (MIT) and Ryan Yannelli’s house rules.

Openers and asides that carry no fact.

FlaggedFix
honestly (sentence-initial)cut
genuinely, truly, quite frankly, to be honest, real talk, at its core, here's the thingcut
let's be clear, let's be honestcut
a genuine improvement, a genuine step, a genuine shift, a genuine change, a genuine concern, a genuine interestcut
it's important to note, it's important to remember, it's important to understand, it is important to note, it is important to remember, it is important to understandstate the point
worth flagging, worth mentioning, worth rememberingstate the point
let's unpack, let's dive in, let's explore, let's take a look, let's break this down, let's break it down, let's examine, let's get startedstart with the point
straightforwardcut, or say what the steps are
a powerful examplethe example
this highlights, this speaks tostate the fact
the broader takeawaystate it
a reminder that, a reminder of, a stark reminder that, a stark reminder of, a powerful reminder that, a powerful reminder of, a timely reminder that, a timely reminder of, an important reminder that, an important reminder ofstate the fact
I recently had the pleasure ofsay what happened
whether you're X or Yname the audience or cut

formatting

Presets: default, ryan, all. Source: avoid-ai-writing by Conor Bronsdon (MIT), Ryan Yannelli’s house rules, Pangram signs-of-ai-writing.

Emoji and bold runs used as structure.

FlaggedFix
an emoji in a headingremove
an emoji ending a lineremove
an emoji starting a lineremove
an emoji before a colonremove

A code check in ai-patterns.mjs reports three or more bold spans in one paragraph or list item; no pattern row covers it. The pack applies one scope to every pattern, so the line-initial emoji rule also runs on commit messages and flags a gitmoji prefix such as a sparkle before feat:. A repo on that convention puts the glyph in allowList.patterns, or ships its own formatting pack with a scope that leaves out commit.

hedging

Presets: ryan, ste, all. Source: avoid-ai-writing by Conor Bronsdon (MIT) and Ryan Yannelli’s house rules.

Qualifiers that leave the claim unowned.

FlaggedFix
Note that (sentence-initial)cut, state the fact
perhaps, arguablycut, or commit
may eventually, could eventuallysay when
could potentially, may potentially, might potentially, might possibly, could possiblycan, or cut
to be clear, in generalcut
keep in mindcut, state the fact
generally, typicallycut, or name the exception
in some cases, in many cases, in most casesname the case
somewhat, to some extentcut, or measure
it could be argued, it could be said, it may be argued, it may be said, it might be argued, it might be saidstate the claim
potentially (bare)cut