Appendix·auto-generated

Genres

40 leaves across 12 families. Each leaf adds Demands, Forbids, Tolerates, and AI tells specific to that genre. The 76 LLM lint targets enrich the base catalog when that genre is active.

error
exits non-zero; blocks CI
warning
should fix, won’t block
info
aggregate signal — one is fine, many is a fingerprint

How this page works

One leaf per genre. Each leaf is small on purpose.

A leaf only carries what is specific to that genre. Universal rules (cadence theory, AI fossils, reader personas) live in the catalog and apply everywhere. Parent rules (e.g., everything marketing/ shares) live in skills/pilcrow/reference/_genres.md. At critique time, pilcrow critique --genre <slug> merges the base 21 LLM rules with the active leaf’s additions, walking the parent chain.

narrative/

3 leaves

Narrator-driven prose. Many pilcrow rules fire on intentional craft here; tread carefully.

narrative/fiction

2 LLM rules

Story for a reader who chose this over their phone. They bring imagination and a low tolerance for prose that sounds like prose; they want a world to step into and a voice they trust enough to follow off the path.

Demands
  • show, don't summarize, at every scene's load-bearing moment: the gesture, the object, the line of dialogue that makes the feeling unnecessary to name (Wood on free indirect style)
  • free indirect style or first-person voice that lets the reader hear the character think; not the author explaining the character
  • specificity that crowds the page: proper nouns, weather, the brand of cigarette, what's on the radio (Le Guin's "crowding")
  • dialogue with subtext: characters say what people say, not what the plot needs them to say (McKee)
Forbids
  • adverbial dialogue tags as a habit (she said quietly, he muttered angrily); King's dandelion rule
  • camera-narrator omniscience that floats above and explains motive in flat declarative
  • "she felt X" / "he was Y" telling where a beat of action or dialogue would carry the same weight
Tolerates
  • ambiguity, unresolved interiority, withheld information; fiction is allowed to not explain
  • registers shifting between narrator and characters; characters can talk like characters
Common AI tells
  • the workshop voice: every scene opens with weather and a sigh; every character has a coffee cup
  • summary disguised as scene: paragraph of action with no concrete sensory anchor
  • "she didn't know it yet, but…" foreshadowing as narrative shortcut
  • emotion explicitly named immediately after it's shown (her hands shook. she was nervous.)
LLM lint additions 2
fiction-emotion-double-named info Emotion shown then named

A bodily or behavioral signal of emotion is immediately followed by a sentence that names the same emotion abstractly. The naming makes the showing redundant; cut the label.

Good
Her hands shook. She set the cup down before she dropped it.
Bad
Her hands shook. She was nervous about what he might say next.
fiction-adverb-dialogue-tag info Adverb-modified dialogue tag

A dialogue tag carries an -ly adverb doing the emotional work the line itself should do (she said angrily, he whispered nervously). Recast the line so the adverb is unnecessary, or replace the tag with a beat of action.

Good
\"Get out,\" she said. She did not look up from the paper.
Bad
\"Get out,\" she said angrily, glaring at him furiously.

narrative/memoir

2 LLM rules

A self looking back at an earlier self. The reader brings curiosity about how the writer became the writer and wants a persona honest enough to be unsparing on the version of itself that was wrong.

Demands
  • the situation and the story: what happened, and the wisdom the writer has come to about what happened; both load-bearing (Gornick)
  • carnal detail: taste, smell, the weight of the room, the body's record of the moment (Karr)
  • the persona is constructed and consistent: the looking-back self has a voice the reader recognizes by page two
  • show the earlier self with the limits and stupidities intact; the retrospective self may comment but never rescues
Forbids
  • present-tense moral conclusions tacked on as the paragraph closer (I realize now that…, looking back, I see…) without earned reflection
  • score-settling rendered as memoir; the writer who is always right in the scene is the writer the reader stops trusting
  • composite characters or merged scenes presented without a note; truth-contract is the genre's load
Tolerates
  • a narrator whose memory is admitted to be partial; "I think she said" beats invented quotation
  • digression into research, history, the writer's reading; memoir is allowed to think
Common AI tells
  • generic-childhood beats (the smell of grandma's kitchen, the long summer afternoons) with no specific object
  • universalizing close (and isn't that what we all carry?); flattens the particular into the inspirational
  • redemption-arc framing imposed on material that didn't earn it; trauma resolved in the last paragraph
  • the persona absent: events happen, no voice metabolizes them
LLM lint additions 2
memoir-retrospective-overlay warning Retrospective-overlay sentence

A scene's emotional content is replaced by the older narrator's tidy interpretation (I realize now…, what I didn't understand then was…) without the scene first carrying the weight. The reflection is fine when the scene has earned it; flag when the line stands in for the scene.

Good
I lit the cigarette anyway. Years later I would learn what that gesture cost her; in the kitchen I only saw her hands go still.
Bad
Looking back, I realize that this moment was when I began to understand the depth of my mother's quiet sacrifice.
memoir-persona-absent warning Persona absent from the scene

A paragraph of memoir reads as third-person reportage of events the narrator was present for, with no interior register, no judgment, no voice; the constructed self has gone missing. Restore the persona's stance.

Good
He was drunk, of course; we'd built our week around his being drunk. I watched him try the door three times before I let him in.
Bad
My father arrived home at 11pm. He had been drinking. He had difficulty with the door. Eventually he entered the house.

narrative/script

2 LLM rules

Prose meant to be performed: staged for an actor's mouth and a camera's eye, not a reader's silence. The reader (editor, actor, director) brings genre literacy and is scanning for what someone wants right now; anything that isn't action or speech in service of that want is dead weight.

Demands
  • every scene has a protagonist with a pressing need, a present-tense obstacle, and a turn; Mamet's who wants what, what happens if they don't get it, why now
  • subtext over text: characters pursue a goal sideways and the audience reads the goal through the friction (McKee on on-the-nose)
  • action lines in present tense, third-person, only what the camera sees; no interior reportage (she remembers her mother is uncameraable)
  • format conventions hold: scene headings (INT. KITCHEN - NIGHT), CHARACTER name centered above the line, parentheticals only where direction is otherwise ambiguous
Forbids
  • on-the-nose dialogue where the character states feeling, intent, or backstory the scene is meant to dramatize (I'm angry because my father left when I was six)
  • two characters discussing an absent third for the audience's benefit; Mamet's expository scene tell
  • novelistic action lines that report unfilmable interior states (he felt the old fear return)
Tolerates
  • white space: action paragraphs of one or two lines; scenes that end on a beat with no closing summary
  • repetition of a charged phrase across scenes when the repetition itself is the dramatic structure
Common AI tells
  • monologue speeches where two pages of one character's eloquence stand in for a scene
  • evenly distributed dialogue: every character speaks in the same register, no accent of want
  • as-you-know-Bob exposition between intimates (As you know, our mother died in 1997…)
  • weather-and-establishing opener that has no scene work in it; pure atmosphere
LLM lint additions 2
script-on-the-nose-dialogue warning On-the-nose dialogue

A character speaks the scene's emotional or thematic content directly: naming the feeling, stating the want, or summarizing the backstory the scene is supposed to dramatize. Rewrite so the want is pursued sideways and the audience infers it from the friction.

Good
MAYA: You said seven. (beat) DAD: I said I'd try for seven.
Bad
MAYA: I'm angry that you're late again, Dad, because it makes me feel like I'm not a priority in your life.
script-uncameraable-action warning Uncameraable action line

Action lines describe interior states, memories, or knowledge the camera cannot photograph (she remembers, he knows, she has always feared). Translate to a visible behavior or cut.

Good
She stops at the door. Looks at the photograph. Turns the frame face-down.
Bad
She remembers the summer her father left, and a familiar dread rises in her chest.

argumentative/

3 leaves

Prose with a thesis the writer believes. Ledes carry the piece; the argument is load-bearing.

argumentative/essay

2 LLM rules

A writer thinking on the page in front of a reader who came for the thinking. The reader brings time, intelligence, and a question of their own; they want to leave with the writer's mind, not a summary of the topic.

Demands
  • the essay discovers: the close lands somewhere the opener didn't already know; if the conclusion is the thesis word-for-word, the essay didn't happen (Didion: writing to find out what I think)
  • a recognizable narrator with a stance: first-person where the genre allows, but always a distinguishable mind; no view-from-nowhere
  • specific instances do the argument's work: the anecdote, the named figure, the dated event the abstraction emerged from (Graham's "useful" writing)
  • the strongest version of the counter-position is named in the writer's own words, not strawmanned
Forbids
  • five-paragraph-essay shape: intro-thesis, three supporting paragraphs, conclusion-thesis-restated; the academic template AI defaults to
  • thesis-by-list (three reasons, four implications, five takeaways) when the form is argument, not enumeration
  • generic-anyone ("we live in a world where…") framing that could have opened any essay on any topic
Tolerates
  • digression that earns its way back; an essay is allowed to walk in the woods if the walk changes the argument
  • contradiction-with-itself; an essay may notice it disagrees with its own opening, and that's the form working
Common AI tells
  • "in this essay I will argue that…" opener; the meta-promise instead of the argument
  • balanced-on-both-sides without the writer's stake: every paragraph reaches for however, no commitment lands
  • the survey of viewpoints in place of the writer's view (Some argue X. Others argue Y. Still others contend Z.)
  • invented academic-sounding categories capitalized as if real (the Attention Economy, the Productivity Paradox)
LLM lint additions 2
essay-thesis-promised-not-argued warning Promised thesis instead of argued thesis

The opening announces what the essay will do (In this essay I'll argue…, This piece explores…) instead of doing it. The promise is the AI structure-by-template tell; replace with the argument itself.

Good
Half of what software engineers call 'experience' is the memory of having seen this exact bug before.
Bad
In this essay, I will explore the role of pattern-matching in what we call engineering experience and argue that experience is largely memory.
essay-survey-without-stake warning Survey-of-views without a stake

A passage presents two or three positions in parallel (some argue…, others contend…, still others suggest…) without the writer committing to one. Essays are not lit reviews; flag when the survey replaces the argument.

Good
Cowen calls this stagnation; Thiel calls it the great stagnation; I think they're both describing what happens when a field runs out of cheap experiments. Here's why.
Bad
Some economists argue we are stagnating. Others contend we are in a new phase of growth. Still others suggest the truth lies somewhere in between.

argumentative/op-ed

2 LLM rules

650–800 words for a reader who is skimming the page next to a coffee. The reader brings five minutes of attention and the day's news; they want one sharp claim, hooked to a fresh event, defended fast.

Demands
  • a news peg in the first two sentences: the dated event, ruling, study, or moment that makes the argument timely now
  • exactly one thesis, stated explicitly inside the first scroll; op-eds with two arguments lose both (OpEd Project)
  • the writer has standing the reader can audit: the credential, the experience, the dataset that makes this writer the right one to argue this
  • a concrete recommendation, prediction, or stake; the piece ends with something to do, to believe, or to expect, not a vibe
Forbids
  • two-handed economist close (but at the end of the day, both sides have a point); the form is argument, not balance
  • thesis withheld for narrative effect; op-ed is not essay, and the lede is the claim
  • 1,200-word drift; the genre's editor will cut for length and the cut will be your weakest paragraph
Tolerates
  • a single rhetorical question if it carries weight; one anecdote opening if it pegs to the news
  • pointed first-person where the writer's standing is the credential; sharp adjectives the op-ed page would otherwise blunt
Common AI tells
  • the timeless-hook opener (Throughout history, debates over X have shaped societies) with no current event
  • the false-balance close: argument throughout, then a final paragraph that gives the opposition its due and dilutes everything before it
  • generic civic-voice register (We must come together as a nation to…) that could have been any column on any topic
  • evergreen-hedge language (many would argue, it could be said); op-eds commit; this voice doesn't
LLM lint additions 2
op-ed-news-peg-missing error Missing news peg

The opening does not anchor to a specific, recent, dated event: ruling, election, study, statement, anniversary. Op-ed editors reject for absence of news peg; flag any opener that could have run six months ago or six months from now unchanged.

Good
Last Tuesday's Supreme Court ruling in *Carter v. Vance* changes who pays for water in the West, and the West isn't ready.
Bad
Throughout American history, the question of water rights has been a contentious one with significant implications for communities.
op-ed-double-thesis warning Double thesis

The piece argues two distinct claims that can't be collapsed into one (e.g., "X policy is wrong" and "the media misreported X."). Op-eds win one argument; flag any draft whose conclusion has to defend two.

Good
The school-board recall is not about books. It's a campaign by a single donor to take control of a $400m budget.
Bad
The school-board recall is not really about books, and also the coverage by local media has badly misrepresented the financial picture of the district.

argumentative/review

2 LLM rules

Verdict-plus-evidence on a specific work for a reader deciding whether to spend money, time, or attention on it. The reader brings curiosity about the work and a wariness about the critic's taste; they want a clear judgment, the textual evidence that earned it, and a voice they can calibrate against.

Demands
  • the verdict lands inside the first scroll: like, dislike, mixed-with-reasons; ambivalence is allowed, evasion is not (Kael, Ebert)
  • evidence from the work itself: a specific scene, a quoted line, the brushwork in the third panel; not plot summary, not pull-quotes from the press kit
  • the critic's stance is calibrated: what the critic generally likes, distrusts, brings to this work; the reader needs to know how to weight the verdict
  • a position on the work's ambition vs. its execution: a fair review judges what the work was trying to do, then whether it did it
Forbids
  • plot recap as a substitute for argument; synopsis is not criticism, and the reader can read the dust jacket
  • score-without-stakes (7/10, ★★★½) that the prose doesn't earn back paragraph by paragraph
  • bias-by-genre: pre-judging the work because of the category it belongs to (another superhero movie, naturally…) before engaging with the specific piece
Tolerates
  • first-person plural, the personal anecdote, the digression into the work's antecedents; Kael, Lane, Mendelsohn all do this
  • a sharp adjective, an unkind verdict, a mixed verdict; refusal of the consensus take when the prose earns it
Common AI tells
  • the cataloguing review: three paragraphs each summarizing an act of the film, then a closing line of evaluation
  • both-sides-and-the-other-side close (Whether you'll enjoy it depends on what you're looking for)
  • press-kit register (a visually stunning meditation on grief and resilience); copy-shaped sentences indistinguishable from marketing
  • generic-merit verbs (delivers, offers, showcases, boasts) where the critic's actual reaction belongs
LLM lint additions 2
review-verdict-absent error Verdict absent from first scroll

The review reaches the first scroll without a clear evaluative stance: like, dislike, or named ambivalence with a reason. Plot summary and context-setting are not stances. The reader needs to know what the critic thinks before being asked to keep reading.

Good
Anora is the best thing Sean Baker has made and also the most exhausting; the relentless first half earns the third act, but only just.
Bad
Anora, the new film from Sean Baker, follows a young Brooklyn sex worker who marries the son of a Russian oligarch. The film premiered at Cannes and won the Palme d'Or.
review-plot-recap-substitute warning Plot recap as criticism

A paragraph (or more) summarizes the work's plot, premise, or contents without making an evaluative observation about it. Synopsis-as-criticism; cut to the specific moment that earned the verdict instead.

Good
The setpiece in the second act, Ani's first walk through the oligarch's empty mansion, is where Baker's camera commits: it follows her past the marble, the gold, the wrong-sized furniture, and refuses to make any of it look beautiful.
Bad
Ani is a sex worker in Brighton Beach who meets a young Russian client. They marry impulsively in Las Vegas. When his parents find out, they send three henchmen to bring him home.

documentation/

4 leaves

Diátaxis four. Never mix modes within one page.

documentation/tutorial

2 LLM rules

Teaches a beginner by doing. The reader arrives with hands on the keyboard; they don't need the why yet, they need to type the next command and see the expected result.

Demands
  • show the destination in the first scroll: "by the end you'll have X running locally" with a screenshot or sample output (Procida)
  • each step ends in observable output the reader can compare against (you should see → ...); no run of >3 commands without a checkpoint
  • every command runnable verbatim, including version pins and prereqs at the top; broken or assumed-installed paths are the failure mode (Procida §10)
  • one happy path only; alternatives, edge cases, and configuration variants get cut or sent elsewhere
Forbids
  • mid-tutorial explanation drift; when the writer pauses to teach the why, the reader loses momentum and the page becomes an explanation
  • decision branching ("if you're on Windows, see…"); collapse to one OS or write three tutorials
  • "for advanced users" asides; the audience is beginners by definition
Tolerates
  • repetition the experienced reader finds tedious (run npm install again); beginners need the reassurance
  • dense prereq blocks at the top; readers expect them
  • a closing "what you just did" recap that names the steps in past tense, then signposts to the explanation page
Common AI tells
  • "comprehensive" tutorials that cover the full feature surface: the AI default; real tutorials cut ruthlessly to one happy path
  • preamble paragraphs framing what the reader will learn before any step appears (In this tutorial, we'll explore…)
  • skipped intermediate steps the model assumes are obvious (now configure the database with no command)
LLM lint additions 2
tutorial-no-checkpoint warning Missing checkpoint

A run of 3+ commands or actions with no observable-output checkpoint (you should see, expected output, screenshot reference). Beginners lose orientation; one wrong character three steps back becomes unrecoverable.

Good
Run `npm run dev`. You should see `Listening on http://localhost:3000` in the terminal.
Bad
Run `npm install`. Then run `npm run build`. Then run `npm run dev`. Then open your browser.
tutorial-explanation-drift warning Explanation drift

The tutorial pauses to teach why a concept works (>2 sentences of conceptual prose between actions). Tutorials are learning-by-doing; the why belongs in the explanation page linked at the end.

Good
Run `pilcrow audit README.md`. You should see findings listed by file.
Bad
Run `pilcrow audit README.md`. Audit works by combining deterministic regex rules with LLM-judged checks; this hybrid approach allows pilcrow to catch patterns that pure pattern matching would miss, while staying fast on the common case.

documentation/how-to

2 LLM rules

Walks a competent user through a specific task they came to do. The reader already knows the tool's basics and the vocabulary; they searched a verb-phrase title (how to rotate the signing key) and want the answer fast. Unlike a tutorial, they may skim; write so they can.

Demands
  • title is a literal task (How to <verb> <noun>) and the page does exactly that, no more (Procida)
  • prereqs in a short list at the top so the reader bounces before they're 60% through and missing a binary
  • numbered steps when order matters, unordered when it doesn't; one outcome per step
  • end on a verifiable success state (the new key is now active in /etc/ssl/) so the reader knows they're done; link alternates for forks (OS, version) rather than branching mid-page
Forbids
  • background sections, motivation paragraphs, "why this matters" framing; the reader brought their own motivation
  • exhaustive flag/option enumeration; that's reference-docs territory and the reader will leave
  • screenshots used in place of the exact command; they go stale, the command does not
Tolerates
  • abrupt openings with no lede ("Run kubectl apply -f keys.yaml."); the title was the lede
  • omitted explanation of intermediate state; the audience is competent
  • a closing "see also" linking to the explanation page if the reader wants the why
Common AI tells
  • bloated preamble paragraph re-introducing the tool ("Kubernetes is a container orchestration platform…") before the steps
  • exhaustive "you might also want to…" sections that pad the page and dilute the task
  • closing summary that restates the steps as bullets; the steps were already bullets
LLM lint additions 2
how-to-not-task-shaped warning Not task-shaped

The page drifts from "do X" into conceptual prose: paragraphs explaining how the system works, why this approach was chosen, or what trade-offs exist. That content belongs in an explanation page. A how-to is action-only.

Good
1. Generate the key: `openssl genrsa -out new.key 4096`. 2. Replace the existing key on each node…
Bad
Before rotating the key, it's worth understanding how the signing infrastructure works. The signer service was designed to support hot rotation because…
how-to-multi-task-page info Multi-task page

One how-to page covers two or more distinct tasks (How to rotate the key and configure the new signer). Split into separate pages; each task is a separate search query and a separate page.

Good
"How to rotate the signing key": one task, one page; linked from "How to configure a new signer".
Bad
How to rotate the signing key, also covers signer configuration, key revocation, and audit logging.

documentation/reference-docs

2 LLM rules

Describes the machinery. The reader knows what they're looking for (a parameter name, a return type, an error code, a flag) and arrives via search, in-app help, or a deep link. They don't read top to bottom; they consult.

Demands
  • structure mirrors the code: one entity per page or per anchored section; the order of headings matches the order of the source (Procida)
  • each entry: signature, parameter table (name · type · default · description), return value, errors, one minimal example (Stripe, Vue.js API)
  • consistent skeleton across every entry, stable anchors so other docs can deep-link
  • short, complete examples: runnable, no , no prose filler around them
Forbids
  • interpretation, recommendation, or opinion; "we recommend", "the best approach", "in most cases" belong in how-to or explanation, not here
  • prose paragraphs over ~3 sentences; reference is consulted, not read
  • marketing register or persuasive framing; powerful, flexible, seamless describe sales pages, not parameters
Tolerates
  • terse fragments where a complete sentence would dilute (Returns: a User. Throws: NotFound if id missing.)
  • the same phrasing repeated across hundreds of entries; consistency beats prose variety
  • jargon, acronyms, and type signatures with no gloss; the reader brought the vocabulary
Common AI tells
  • conversational throat-clearing inside entries (This method allows you to…, If you want to retrieve a user, you can use…) instead of Retrieves a user by id.
  • inconsistent example shapes (different variable names, languages, or import styles across adjacent entries); the model writes each entry fresh instead of holding the skeleton
  • inflated descriptions that restate the entry name (The createUser method creates a new user.)
LLM lint additions 2
reference-interpretation-creep warning Interpretation creep

A reference entry includes recommendation, opinion, or judgment (we recommend, the best approach, prefer X over Y, in most cases). Reference describes the machinery; guidance belongs in how-to or explanation. Move it or cut it.

Good
`timeout` (number, default 30): request timeout in seconds. Maximum 600.
Bad
`timeout` (number, default 30): request timeout in seconds. We recommend keeping this low for interactive use, but in most cases you should test with your own workload to find the right value.
reference-prose-creep warning Prose creep

An entry contains a paragraph of >3 sentences of running prose where a parameter list, table, or terse fragment would do. Reference is consulted, not read; every sentence of prose is a sentence the reader has to skim.

Good
Returns: `User`. Throws: `NotFound` if no user with that id exists. `Forbidden` if the caller lacks `users:read`.
Bad
This method will return a User object representing the user that was retrieved. In the case that no user exists with the specified id, the method will throw a NotFound exception. Additionally, if the calling principal does not have the required permission…

documentation/explanation

2 LLM rules

Builds a mental model. The reader already used the thing; maybe followed the tutorial, hit a sharp edge in a how-to, or skimmed the reference and felt the shape but not the reason. They came back to understand why it's built this way, what alternatives were rejected, and what the trade-offs cost.

Demands
  • name the mental model the reader is meant to build, near the top: one sentence the reader can paraphrase back ("reactivity is dependency tracking plus reactive effects", from Vue's Reactivity in Depth)
  • give the historical or design context: what problem this approach solves, what came before, what was tried and rejected (Procida)
  • engage at least one real alternative (not strawman, not "of course we picked the right thing"); name where the trade-off bites
  • ground abstraction in at least one concrete example per major concept; the reader should be able to point to "this is what that looks like in real code"
Forbids
  • step-by-step instructions; if the reader needs to do something, link out to a how-to
  • exhaustive parameter or feature lists; that's reference's job, and the reader's working memory is the budget
  • false neutrality; the writer has a position, and pretending otherwise reads as evasion
Tolerates
  • long sentences and dense paragraphs the reference page would flag; explanation rewards the patient reader
  • digressions that serve the model (the analogy, the brief history, the rejected design); they're not filler if they earn the reader's intuition
  • explicit opinion and qualified judgment ("this trade-off is mostly worth it, and here's where it isn't")
Common AI tells
  • the "let's explore" frame that promises understanding but never names the model; the reader finishes with paragraphs but no claim they could repeat
  • both-sides hedging on every design choice (there are pros and cons to each approach) instead of taking a position
  • analogies that don't survive contact with the next paragraph (think of it like a library, but actually like a factory, well, more of a registry…)
LLM lint additions 2
explanation-no-mental-model warning No named mental model

The page runs for paragraphs of detail without naming the model the reader is meant to build. The reader should be able to paraphrase the central claim in one sentence after reading the first scroll; if they can't, the explanation is doing reference work instead.

Good
Reactivity in Vue is two things: tracking which values an effect reads, and re-running that effect when any of those values change.
Bad
Reactivity is one of Vue's most distinctive features. There are many aspects to how it works. Let's explore the different mechanisms involved.
explanation-no-alternative-engaged info No alternative engaged

The page presents a design choice as if it had no contender. Explanation earns trust by naming at least one real alternative and showing where the chosen approach pays and where it costs. Skipping this reads as marketing.

Good
Svelte's compile-time reactivity gives sharper syntax at the cost of a build step; Vue's runtime approach trades that for fewer edge cases.
Bad
We use Proxies because they're the right tool for this job.

overview/

3 leaves

Composite doorway docs. Marketing top, tutorial middle, signposts down to deeper docs.

overview/readme

2 LLM rules

First contact with a project. Most readers arrive from a search result, a link in a thread, or a gh star feed; they want to know what this is, whether it solves their problem, and how to try it, in under 30 seconds. The README is a doorway, not a manual.

Demands
  • opening sentence answers "what is this" in plain noun-phrase form: pilcrow is a prose linter for AI-tell detection. Project name first, category second
  • install or try-it command visible without scrolling: npm install pilcrow or a hosted demo link; if neither is possible, say why in one line
  • one concrete example of input → output, not a feature list (Make a README)
  • license and badge row at the top (license, build status, version), terse, no decorative emoji
Forbids
  • philosophy or origin story before the user knows what the project is (In a world where developers struggle with…)
  • exhaustive feature lists with checkmarks before the example; feature tally is a pitch failure
  • screenshots embedded at full width before the install command; they push the load-bearing content below the fold
Tolerates
  • marketing register if anchored to a specific claim: 42% faster cold start than Webpack is fine; blazingly fast is not
  • duplicated phrasing across name, tagline, and opening sentence; the reader skims and benefits from the repetition
  • a "comparison with X" table when the project lives in a known category and the comparison is honest
Common AI tells
  • the marketing-hero opener: imperative tricolon (Ship faster. Build smarter. Scale forever.) used as the tagline; this is the canonical AI tell
  • "✨ Features" headed by decorative emoji, every bullet leading with *Bold:* then a vague benefit phrase
  • the "Why X?" section pitched at no specific competitor: generic-positive prose that names nothing the project actually does differently
LLM lint additions 2
readme-pitch-vague error Vague pitch

The opening sentence doesn't say what the project is in concrete terms. The reader should be able to extract <project> is a <category> for <audience> from sentence 1. Adjectives like "powerful", "modern", "next-generation" without a noun-phrase identity fail this rule.

Good
pilcrow is a prose linter that catches AI tells and style-guide violations in markdown.
Bad
pilcrow is a powerful, modern toolkit for elevating your writing workflow.
readme-quickstart-buried warning Buried quickstart

The install command, try-it link, or first runnable example is not visible in the first scroll (roughly the first 30 lines of rendered markdown, excluding the badge row). Readers bounce before scrolling; the quickstart is the conversion moment.

Good
Badges → one-sentence pitch → `npm install pilcrow` → minimal example, all in the first scroll.
Bad
Badges → philosophy paragraph → feature list with 14 emoji bullets → "Why pilcrow" section → finally, in section 6, the install command.

overview/project-home

2 LLM rules

The front door to a docs site. Distinct from the GitHub README: the reader has already decided to look, otherwise they wouldn't be on docs.example.com. The job is to route, by job-to-be-done, not by topic outline. Most readers arrive looking for a specific section and use this page as a switchboard.

Demands
  • one-line definition at the top, then immediately fork by reader intent: New here? → Tutorial · Building something? → How-to · Looking up a flag? → Reference (Tailwind, SvelteKit, Linear)
  • prominent search affordance; on a docs site the reader expects / or ⌘K
  • visible link to one tutorial, one canonical how-to, and the reference index: the three doorways down to Diátaxis quadrants
  • a "what's new" or version-pinned link so the reader knows the docs match the code they're running; flag pre-1.0 status if applicable
Forbids
  • duplicating the GitHub README's marketing copy verbatim; if the reader is here they already converted, and rehashing the pitch wastes the slot
  • a homepage that is itself the tutorial; that's a routing failure; link to the tutorial instead
  • exhaustive feature taxonomies on the front page; the sidebar carries that
Tolerates
  • a hero card with a code sample as the only above-fold content; the docs site can lean visual where the README can't
  • short brand register if the rest of the docs maintain it consistently
  • a curated "popular pages" or "start here" list; readers genuinely use these as the entry log
Common AI tells
  • the page is structured as an outline of the docs site rather than as a router for the reader's next click
  • the lede restates the README's tagline word-for-word: same hero, same tricolon, same emoji
  • a "Getting started" section that is neither a tutorial nor a link to one, but three paragraphs of orientation prose that delays the reader's actual click
LLM lint additions 2
project-home-no-routing warning No routing

The front page does not route readers to the three Diátaxis quadrants (tutorial, how-to, reference) within the first scroll. Without explicit links keyed to reader intent, the page becomes a second README; readers must scan a feature list to find their way down.

Good
New? Start with the tutorial. Building something specific? See the how-to guides. Looking up an option? Browse the reference.
Bad
Welcome to the docs! Below you'll find an overview of features, philosophy, and the project's history.
project-home-readme-duplication info README duplication

The opening section is the same pitch as the GitHub README: same tagline, same hero copy, same feature bullets. The reader is already on the docs site; reusing the conversion pitch wastes the most valuable slot.

Good
pilcrow is a prose linter. The CLI handles deterministic checks; this skill handles judgment calls. Below: tutorial, how-to, reference.
Bad
Front page hero identical to the README hero, followed by the same bullet list of features.

overview/one-pager

2 LLM rules

A single-sheet decision document. The reader is a busy stakeholder (an exec, a cross-functional partner, a sponsor) being asked to greenlight, fund, or align on something. They'll read once, scan, and decide. The format is a forcing function: if it doesn't fit on a page, the thinking isn't done.

Demands
  • the ask, the recommendation, or the headline outcome lands in the first paragraph: what changes if this is approved, in one sentence (Rachitsky; Amazon PR/FAQ)
  • a "problem / proposal / why now" spine: the proposal exists because of a specific problem, and the timing has a reason
  • success metric named: what number will tell us this worked, by when, measured how (Andy Grove; Working Backwards)
  • the cost (budget, headcount, scope) and one rejected alternative with the reason: "we considered X, didn't pick it because…"
Forbids
  • second page; if it spills, cut something; the constraint is the discipline
  • bullet lists where the bullets are the whole content; the reader needs prose connective tissue to follow the argument
  • appendix links the decision genuinely depends on; if load-bearing, the one-pager isn't done
Tolerates
  • small fonts, tight margins, sidebars; this is a designed artifact, not a blog post
  • terse fragments in scannable rows (Cost: $480k Y1 · Owner: Maya · Decision needed: 2026-06-01)
  • explicit confidence levels and hedges where the evidence is partial (we're ~70% on the revenue model)
Common AI tells
  • the "context" paragraph that warms up before the ask: three sentences of background where the recommendation should be
  • both-sides framing of the recommendation (there are compelling arguments on each side); the one-pager is for taking a position
  • success metric written as a verb-phrase aspiration (improve customer satisfaction) instead of a number with a date
LLM lint additions 2
one-pager-no-ask error No explicit ask

The first paragraph doesn't contain the recommendation, decision-requested, or headline outcome. The reader should know what they're being asked to approve or align on by the end of sentence 2. If the ask is in the middle or end, the one-pager has failed its first job.

Good
Recommendation: ship the cache rewrite in Q3. Cost: 4 eng-quarters; expected p99 drop 35%; decision needed by 2026-06-01.
Bad
Over the past two quarters, our team has been investigating performance bottlenecks across the system. We've identified several areas of concern…
one-pager-success-metric-vague warning Vague success metric

The success metric is a verb-phrase aspiration (improve onboarding, drive engagement, enhance reliability) instead of a measurable number with a deadline and a source. Reviewers can't approve what they can't audit later.

Good
Success: median activation time drops from 11 to 5 days by EOQ3, measured via the activation dashboard.
Bad
Success: improved user activation and a smoother onboarding experience.

informational/

2 leaves

Teach a concept to a non-expert. Definitions on first use, examples after every abstraction.

informational/explainer

2 LLM rules

A "how X works" piece for a general-curious reader. Not docs; software docs use the Diátaxis four. This is the long-form Wait But Why / Vox shape: a question the reader can't quite answer ("how does a vaccine actually work?", "why is the rent so high?"), unpacked with patience, analogy, and arc until they could explain it to a friend.

Demands
  • the question stated explicitly near the top: what specifically the reader will be able to answer after reading
  • a controlling analogy or scaffolding image, named once and threaded through the piece; the reader should remember the image a week later (Urban; Evans)
  • mechanism before consequence: show how the thing works before claiming what follows from it
  • a takeaway the reader can paraphrase in one sentence; if they can't, the piece was inventory not explanation
Forbids
  • "let's explore" / "in this article we'll examine" framings that promise a journey but never name the question
  • jargon as load-bearing without definition on first use; the reader is general-interest, not the writer's colleague
  • comprehensive coverage; an explainer cuts hard to the one thread the reader came for
Tolerates
  • digressions that earn their place (the historical note, the surprising analogue, the rejected hypothesis); these are why long-form explainers exist
  • voice: opinions, jokes, a recurring narrator stance; the reader stays for the writer as much as the topic
  • a single anchoring example carried across the whole piece rather than a parade of new ones
Common AI tells
  • the encyclopedic-overview structure ("section 1: definition · section 2: history · section 3: types · section 4: examples · section 5: conclusion"); Wikipedia register applied to a question that wanted a take
  • analogies that drift across the piece: opens as "imagine a library", becomes "more like a factory", ends as "essentially a marketplace"; no single image holds
  • a closing paragraph that lists what was covered instead of leaving the reader with the takeaway
LLM lint additions 2
explainer-no-controlling-analogy warning No controlling analogy

The piece runs for paragraphs without a named scaffolding image, metaphor, or mental model that holds across the whole explainer. The reader needs one image to compress the mechanism; without it, the explainer becomes a list of facts.

Good
Think of the immune system as a library of templates. The first time a pathogen visits, the library has to make a new card; the second time, the card is already there.
Bad
Eight paragraphs on antibody response, with no carrying image; just a sequence of mechanisms named in order.
explainer-encyclopedic-structure info Encyclopedic structure

Section headings read as the topic's taxonomic outline (Definition · History · Types · Applications · Conclusion) rather than the arc of the question being answered. Wikipedia is the foil; an explainer follows curiosity, not taxonomy.

Good
Sections shaped as story beats: "The puzzle · what changed · the mechanism · what this lets us predict".
Bad
1. What is X · 2. The history of X · 3. Types of X · 4. Applications of X · 5. Conclusion.

informational/faq

2 LLM rules

A page grouped by questions the reader is actually asking. The reader arrived confused about one specific thing and scans headings for their question phrased the way they'd phrase it. The format only earns its place when the questions are real, drawn from tickets, threads, or search logs. Otherwise it's a content dump pretending to be a structure (which is why GOV.UK argues against it; worth engaging that argument before reaching for the format).

Demands
  • each heading is a complete interrogative sentence, phrased the way the reader would type it into search: Why was I charged twice? not Billing discrepancies
  • questions sourced from real signal: ticket categories, search queries, repeated thread replies; not invented
  • answer first, context second; the reader scanned to this heading, so lead with the answer in sentence 1, then add necessary context
  • if a question recurs because the product is confusing, link to the fix being shipped; the FAQ entry is an admission, not a substitute
Forbids
  • invented questions; "What makes X the best in its category?" is marketing, not FAQ
  • yes/no questions answered with a paragraph; if the answer is "yes" or "no", lead with the word
  • the entry that begins "Great question!" or any sycophant opener; this is a fossil
Tolerates
  • terse fragments in answers, even one-word answers (Q: Can I cancel anytime? A: Yes.)
  • duplicated phrasing across answers when the same constraint applies; consistency helps scanners
  • a "still need help?" link at the bottom rather than per-entry; the page is a router, not a support channel
Common AI tells
  • invented questions phrased in marketing voice (What makes our platform stand out?): the model fabricates plausible-looking questions when real ones weren't provided
  • every answer the same length and shape: three sentences, opening with "Great question," middle restating the question, close on a generic invitation to learn more
  • questions ordered by topical taxonomy rather than frequency or reader-search-intent
LLM lint additions 2
faq-non-question warning Non-question heading

A heading is not a real interrogative sentence the reader would type: a noun phrase (Billing), a fragment (About cancellation), or a marketing line (Why customers love X). FAQ headings are search bait: phrased the way the reader asks, ending with a question mark.

Good
Why was I charged twice in the same month?
Bad
Billing discrepancies and account adjustments.
faq-invented-question warning Invented question

The question has no evidence of being frequently asked: no ticket signal, no thread, no search query. It reads like a writer guessing what users might ask, often in marketing register. Real FAQs cite the source of the question (or are obviously built from one); fabricated ones don't.

Good
Why is my export missing rows? (most common ticket category, Q1 2026)
Bad
What makes pilcrow different from other linters?
References

reportorial/

5 leaves

The news is the news. Outcome in the first sentence; specific numbers, named people, dated events.

reportorial/news

2 LLM rules

Reports an event to a reader who hasn't heard it yet and may quit after the first paragraph. The lede carries the five Ws plus the freshest fact; the rest descends in importance so an editor can cut from the bottom without losing the story.

Demands
  • the new development in the first sentence: what changed today, not what's been true for months (inverted pyramid; AP)
  • attribution on every non-trivial claim: who said it, when, in what setting (per a Tuesday filing, said in a Wednesday press call)
  • numbers, dates, and proper nouns in the lede paragraph; vague antecedents (the company, officials) only after the named referent appears once
  • a nut graf within the first three paragraphs naming why this matters now: the news peg, not the topic's general importance
Forbids
  • editorial verbs in the news section (slammed, blasted, revealed for ordinary statements); reserve evaluative verbs for analysis pieces
  • single-source claims on contested facts presented as settled; said with no second voice on anything one party disputes
  • "in a statement" attribution without the statement's date or channel; readers can't audit a quote dated recently
Tolerates
  • short paragraphs, even one-sentence ones; the form wants scanability
  • repetition of the principal's full name and title after long quote blocks (radio-clean attribution)
  • the kicker-quote close that lands an aside; anti-pyramid by design, fine when the piece earns it
Common AI tells
  • the explainer lede that opens with context (Amid growing concerns over X, the company on Tuesday…) instead of the action; context belongs after the verb
  • balance-by-formula (Some say X. Others say Y.) without naming either side or weighting evidence
  • omniscient sourcing (reports indicate, sources familiar with the matter) where the model is laundering a guess as attribution
LLM lint additions 2
news-context-before-action warning Context-before-action lede

First sentence opens with a participial or prepositional setup (Amid, As, Following, In a move that) before the actor and the verb. The new development should be the first independent clause; context follows.

Good
The FAA grounded all 737 MAX 9 aircraft on Tuesday, citing the door-plug failure on Alaska 1282.
Bad
Amid growing concerns over aircraft safety, the FAA on Tuesday took action against Boeing's 737 MAX 9 fleet.
news-unnamed-source-laundering warning Unnamed-source laundering

Attribution to sources, reports, observers, or analysts with no count, no relationship to the matter, and no reason for anonymity. Either name the source, name the count and proximity, or cut the claim.

Good
Two officials with direct knowledge of the negotiations, speaking on condition of anonymity because the talks are ongoing, said the deadline slipped to Friday.
Bad
Sources say the deadline has slipped to Friday.

reportorial/feature

2 LLM rules

Reports a subject to a reader who has the time and wants the texture: scene, character, status detail, the writer's earned point of view. The piece earns its length by showing what the news version had to compress out: the room, the silence between answers, the contradiction the subject hasn't noticed about himself.

Demands
  • a load-bearing scene in the first scroll: sensory, dated, located; not a stage-set abstract (Wolfe's "scene by scene construction")
  • a central tension named before the reader is asked to care: a subject in conflict with himself, with another party, with the institution around him
  • reporting that names what the writer saw vs. what the writer was told vs. what the writer infers; separate registers, never collapsed
  • status detail (what the subject wears, owns, surrounds himself with) used to characterize, not to decorate (Talese on Sinatra's grey hairpiece)
Forbids
  • composite scenes presented as a single witnessed moment; if the moment is stitched from three visits, the piece says so
  • dialogue reconstructed from memory or notes presented in quotation marks without a sourcing note
  • the "I asked, he said, I followed up" register that turns a feature into a transcript; the writer is a narrator, not a stenographer
Tolerates
  • a 60-word opening sentence that performs the scene's pacing; cadence rules cede to scene-craft here
  • long stretches without attribution where the writer's reporting is doing the seeing; sources cluster in a later passage
  • a subject the writer plainly likes or dislikes, where the stance is earned by reporting and the writer says so
Common AI tells
  • panoramic openers (On a crisp October morning…) substituted for a specific moment; the model knows the shape of a scene without the scene
  • universal-truth closers that promote the subject into a stand-in for an Era; the feature is about one person, not the human condition
  • decorative status detail that doesn't characterize; his sleek black laptop reads like prop direction, not observation
LLM lint additions 2
feature-scene-without-stakes warning Scene without stakes

A scene runs for more than a paragraph (sensory detail, blocking, dialogue) with no consequence anchored to it; nobody loses, gains, decides, or reveals anything the reader can carry forward. Scene that doesn't move the piece is set-dressing.

Good
The senator unfolded the napkin twice before answering. When he did, the staffer in the corner stopped typing; the campaign had a new line, and she would have to fit it to the schedule before midnight.
Bad
Sunlight slanted through the cafe windows. The senator stirred his coffee. The waiter refilled the water glass. Outside, a bus passed.
feature-universal-truth-closer warning Universal-truth closer

The final paragraph generalizes the subject into a parable about an era, a generation, or the human condition. Close on the specific (a return to the opening scene, a remaining question, an image), not the takeaway.

Good
He locked the back door and pulled the shade. The light over the sign would stay on another week.
Bad
In the end, his story is the story of every American who came of age in the long shadow of the postwar dream.

reportorial/postmortem

2 LLM rules

Reports an incident to colleagues who want to recognize the same conditions next time. The piece is for learning, not adjudication. The reader brings system knowledge and wants the timeline, the conditions that enabled the incident, what changed, and which action items survived triage.

Demands
  • timeline in absolute timestamps with timezone; mark inference (probably, we infer) where direct evidence is absent
  • treat people as characters: name what each responder saw, knew, and thought at decision time; present tense for narrative, past for impact (Hochstein)
  • contributing factors plural; the structure enforces it; no single "root cause" (Cook §3)
  • action items have named owners and a closed state (done / in flight / dropped; not "future work")
Forbids
  • counterfactual framing: should have, could have, failed to, if only, didn't notice X. Replace with the conditions that made the actual choice make sense at the time
  • singular-cause framing: the root cause was, caused by, due to followed by one thing
  • agent-of-failure attribution that names a person where the system gave permission (the on-call pushed a bad configthe deploy pipeline accepted a change with no canary)
Tolerates
  • dense technical paragraphs, acronyms, dashboard links as citations, code and config excerpts
  • repetition where the timeline genuinely cycles (alert → respond → revert → re-alert)
  • honest hedging where evidence is partial (we believe X based on Y; Z is unconfirmed)
Common AI tells
  • the wry-deprecating cliché (we shipped Tuesday and the team learned a lot); surface humility, blame-substance underneath
  • sycophant praise of responders (Alex did an excellent job under pressure); flatten to specifics or cut
  • stakes inflation or marketing register on impact (a critical outage shook the platform; luckily, thankfully)
LLM lint additions 2
postmortem-counterfactual warning Counterfactual framing

Sentence uses should have, could have, failed to, if only, or similar retrospective-judgment language about what someone did or didn't do. Replace with the conditions that made the actual choice make sense at the time.

Good
At 02:14 the responder did not check the runbook; the alert had not previously correlated with the runbook's symptoms.
Bad
The responder should have checked the runbook at 02:14.
postmortem-singular-cause warning Singular-cause framing

The piece names "the root cause" or "the cause" as a single thing. Complex systems fail through interacting conditions; flag the framing.

Good
Contributing factors: undetected schema drift, an alerting gap on staging, a runbook edited mid-incident the previous week.
Bad
The root cause was a missing database index.

reportorial/status-update

2 LLM rules

Reports a week of work to colleagues and a manager who will spend ninety seconds on it. The reader wants state changes (shipped, decided, blocked), not activity; the update earns its place by making the reader's next decision easier: fund this, unblock that, escalate this thing nobody else can see yet.

Demands
  • outcomes and state changes, not activity verbs; decision pending owner beats met with team to discuss
  • every blocker has a named owner, an explicit ask, and a date the writer needs the answer by; "we're blocked on X" without an ask is a vent, not an update
  • last week's predictions reconciled against what actually happened; call out the ones that slipped, by name (5-15 / Larson)
  • one explicit confidence statement on the headline item: on track, at risk because X, slipping by N days; never the unmodified green
Forbids
  • the activity log disguised as outcomes (had three meetings, reviewed the doc, paired with Y); these are inputs, not state
  • watermelon status: green outside, red inside; an update that lands on track on Friday and we need to slip on Monday has lied
  • the project-name-only bullet (Project Athena: progress); name what moved, by how much, since when
Tolerates
  • dense acronyms, dashboard links, ticket IDs, code snippets as evidence; the reader works here
  • short bullets without verbs where the structure already supplies them (Athena: spec landed, build starts Mon)
  • repeated structure week to week (same five headings); the form is supposed to be skim-aligned across weeks
Common AI tells
  • the wrap-up cliché (overall, the team made solid progress); say what moved, not how the team felt about moving it
  • compliment paragraphs that name no one specifically (shoutout to engineering for the great work); flatten to specifics or cut
  • the "what's next" section that restates last week's "what's next"; the model recycles the same goals because the actual delta is missing
LLM lint additions 2
status-no-ask warning Blocker without an ask

The update names a blocker, risk, or open question with no named owner, no specific ask, and no date by which an answer is needed. Surfacing a problem without making it actionable is venting; the reader can't help.

Good
Blocked on the data-platform team for the new replica (owner: Priya). Need a go/no-go by Thu so we don't slip the May 22 launch.
Bad
We're still blocked on the data side, which is making things hard.
status-activity-not-outcome warning Activity instead of outcome

A bullet or paragraph reports what the team did (meetings held, reviews done, pairing sessions) without naming what changed as a result: decisions, ships, state transitions, numbers moved. If the reader can't tell whether the week mattered, the update is an activity log.

Good
Shipped the index migration to staging Wed; p99 read latency 180ms → 64ms on the canary.
Bad
Spent the week on the index migration; lots of pairing and discussion with the platform team.

reportorial/changelog

2 LLM rules

Reports a release to a user who wants to know whether to upgrade, what will break, and what they can now do that they couldn't before. The reader scans; the entry that doesn't tell them what changed for them is wasted ink.

Demands
  • each entry leads with the change in user-visible terms: what now works, what changed shape, what's gone (Keep a Changelog)
  • breaking changes flagged in their own section or with an unmissable marker, before the "added" section; migration link or inline note attached
  • a version header with an ISO date and a comparison link to the previous version; readers triangulate releases by date as often as by number
  • semver-honest version numbers: a breaking change in a minor bump is a bug in the release, not a marketing choice
Forbids
  • the vague-improvement bullet (improved performance, various fixes, general stability); name what got faster, by how much, on what workload, or omit
  • internal-only changes mixed into the user-facing list (refactored the auth module, migrated CI to bazel); these belong in a commits log, not the changelog
  • the "and more!" closer; if the entry isn't worth naming, it isn't worth including
Tolerates
  • terse bullet fragments, parallel shape across an entire section; the form is a list and reads like one
  • the same verb opening every bullet within a category (Added, Added, Added); that's the category, not anaphora
  • code fences, command-line snippets, and exact path references as the body of an entry; readers came to copy-paste
Common AI tells
  • the marketing-register bullet (We're excited to introduce…); changelog is for users mid-upgrade, not the launch post
  • parallel-shape filler that pads a small release into a long one: five bullets that each rephrase the same fix
  • the speculative-future bullet (lays the groundwork for upcoming X) included as if it were shipped; if it doesn't work today, it isn't in this release
LLM lint additions 2
changelog-vague-improvement warning Vague-improvement bullet

An entry uses words like improved, enhanced, optimized, better, or general fixes without a measurable claim, a named subsystem, or a before/after the reader can verify. Either name the workload and the delta, name the bug fixed, or cut.

Good
Cold-start time for the CLI dropped from 480ms to 110ms on Node 22 (issue #1842).
Bad
Improved performance and general stability.
changelog-feature-parade-density warning Feature-parade density

A release section stacks five or more bullets in identical parallel shape (Added X. / Added Y. / Added Z.) where most items are minor and the rhythm is doing the work of importance. The shape inflates a small release; collapse small items into a single line or move them under a subhead.

Good
Added: webhook retry on 5xx (configurable via `retry.max`). Other small additions: `--quiet` flag on `init`, ESM export for `pilcrow/rules`, prettier error on missing `VOICE.md`.
Bad
Added a new feature. Added another new feature. Added a helpful new flag. Added improved error messaging. Added more polish to the CLI.

correspondence/

3 leaves

Workplace decision documents. Recommendation in sentence 1; no preamble; dense paragraphs fine.

correspondence/memo

2 LLM rules

Proposes a decision to colleagues who will accept it, push back, or kill it. The reader is busy, technical, and reading on the way to a meeting where the memo is the agenda; they want the recommendation, the forces that produced it, the alternatives considered, and the consequences they'll be living with.

Demands
  • recommendation as the first sentence, written We will … in active voice (Nygard); title and TL;DR resolve to the same call
  • Context names the forces (technical, organizational, financial) in value-neutral language; alternatives listed with the reason each was rejected
  • Consequences include the negative ones the writer is signing up for, not only the upside
  • status is explicit (proposed / accepted / superseded by ADR-N) and dated; superseded memos are linked, not deleted
  • two-pages for routine ADRs (Nygard); the 6-pager (Bryar) is for strategic narrative; pick the form that fits
Forbids
  • preamble that previews the memo (This memo will outline …, In this document we explore …); the recommendation is the preview
  • bullets used to dodge full sentences in the Decision section; Nygard's rule, "Bullets are acceptable only for visual style, not as an excuse for writing sentence fragments"
  • single-sided Consequences (only the upside listed); if you can't name the cost you're paying, you haven't decided
Tolerates
  • acronyms, internal system names, link-only citations to dashboards or PRs
  • a coined name for the pattern (the staging-replica drift problem) once defined; repeat use is fine
Common AI tells
  • preamble openers (I'm writing to propose …, This memo will examine …); meta-discourse instead of the call
  • both-sides Consequences read as a pros/cons listicle with no choice carried
  • recommendation written It is recommended that …: agentless passive where Nygard demands We will
LLM lint additions 2
memo-no-recommendation error Missing recommendation

First paragraph has no sentence of the form We will X (or equivalent active-voice decision). A memo without a recommendation in the first scroll is a status update.

Good
We will move the staging Aurora replica to its own VPC by April 30.
Bad
There are several options we have been considering for the staging replica, and this memo reviews them.
memo-preamble warning Preamble opener

Memo opens with meta-discourse (I'm writing to, wanted to, This memo will, In this document) rather than the recommendation.

Good
We will adopt RFC-style ADRs for every architectural change touching more than one service.
Bad
This memo will walk through our options for documenting architectural decisions and propose a path forward.

correspondence/email

2 LLM rules

Reaches a busy individual whose inbox is already at 800. The reader scans the first three lines on a phone, decides whether to engage, and acts; they want to know what is being asked, by when, and why they specifically are the right person to receive this.

Demands
  • subject line is the lede, not a category (Need your call on the Aurora migration date by Thu beats Aurora migration)
  • the ask in the first three lines and answerable without scrolling; deadline named in calendar form (by Thu Apr 30 EOD PT), not "ASAP"
  • one ask per email; if there are two, send two
  • a single closing line that names what happens next (I'll proceed unless I hear back by Thursday); not a chat sign-off
Forbids
  • throat-clearing openers (Hope you're well, Hope this finds you, Just wanted to check in, Quick question followed by a slow one)
  • buried ask: the actual request beneath context the reader could have read after acting
  • circling back, following up on my last email, per my last email, bumping this as the lede; if you must nudge, nudge with new information
Tolerates
  • a one-line context preface where the recipient genuinely needs the frame (Context: you owned the staging VPC last quarter.); explicit, not preamble
  • long technical paragraphs below the ask; the reader has already decided whether to read them
  • dropping greeting and signature in ongoing threads with someone you write to weekly
Common AI tells
  • the wellness opener (I hope this email finds you well): fossil-class throat-clearing
  • chat sign-offs leaked from training data (Let me know if you have any questions!, Happy to provide more details!)
  • generic compliments before the ask (Loved your recent post on …); sycophant warm-up; cut or make specific
LLM lint additions 2
email-throat-clearing error Throat-clearing opener

Email opens with a wellness or check-in formula (Hope you're well, Hope this finds you well, Just wanted to check in, Quick question, Sorry to bother you) instead of the ask.

Good
Can you sign off on the Aurora migration date (Thu Apr 30)? I'll proceed unless I hear back.
Bad
Hope this finds you well! I just wanted to quickly check in about the Aurora migration when you get a chance.
email-buried-ask warning Buried ask

The actual request sits below the first three lines, after context or pleasantries. A reader scanning on a phone closes the email before reaching it.

Good
Ask: can you approve the staging Aurora VPC change for Thu Apr 30? \nContext below.
Bad
I wanted to give some background on our staging setup, our recent reliability work, and where things stand before getting to a small ask at the end.

correspondence/message

1 LLM rule

A line or two dropped into someone's notification stream. The reader sees a banner, decides in under a second whether to switch contexts, and either replies, reacts, or moves on; they want the point and a reason to care, in the space where a sentence used to live.

Demands
  • one or two sentences; if it needs three, it's a doc; link, don't paste
  • the ask, status, or update lands in the first eight words (Fried: "writing solidifies, chat dissolves")
  • thread the follow-ups; the top-level message is the headline, the thread is the substance
  • @mention only the people you genuinely need from; broadcast pings are interruptions billed to a stranger
Forbids
  • the no-hello hello (hey, quick q, you there?, and then nothing) that asks for attention without spending it
  • pasting a five-paragraph wall into the channel; the channel is not a doc store
  • bumping this, ^^, @here ping as the sole content of a follow-up message; nudging without information
  • the chat-essay: a single sentence stretched over four lines with conjunctions and parentheticals (So I was thinking, and this might be wrong, but maybe we …)
Tolerates
  • fragments, lowercase starts, missing periods, emoji as punctuation if the room speaks that way
  • a deliberate split across two messages where the second carries the ask the first set up (re the Aurora replica:can you take the migration window Thursday?)
  • :+1: / :eyes: / :ack: reactions as acknowledgment in place of a reply
  • code blocks, links, and screenshots that the room's audience already knows how to parse
Common AI tells
  • the essay-drift message: a paragraph in chat, often opening So, just thinking out loud here, …
  • chat sign-offs imported to chat (Let me know if you have any questions!) where the room would never say them
  • formal connectives (Furthermore, Moreover, Additionally) inside a one-line message
  • the assistant's mid-thread thesis sentence (To summarize, …) when the thread is six lines long
LLM lint additions 1
message-essay-drift warning Essay drift in chat

Message reads as a paragraph (three or more sentences, formal connectives, no fragments) where the room's register is one or two lines. Move it to a thread, a doc, or rewrite as a one-line ask.

Good
Can you take the Aurora migration window Thursday? Details in :thread:
Bad
So I've been thinking about the Aurora migration. There are a few things to consider. First, the staging replica. Second, the VPC. Furthermore, the on-call schedule.

marketing/

5 leaves

Persuasive commerce. The family where AI tells cluster densest; every editor reflex applies.

marketing/landing

2 LLM rules

Sells a product to a visitor who arrived with intent but no patience; they will leave inside seven seconds unless the hero answers what this is and what it changes for them. The reader is the buyer or the buyer's deputy, scanning for a fit signal before they commit to reading the second scroll.

Demands
  • the hero names the product and the change in one line; a reader who reads only that line knows what is sold and who it's for (Shapiro's litmus)
  • every benefit claim grounded in a feature or proof point on the same screen: number, screenshot, customer name, before/after
  • the page declares its audience early; if "for X" cannot be substituted with a specific role or job, the page targets nobody
  • one primary CTA per scroll, action-verbed, no parallel "or also" CTA competing for the click
Forbids
  • aspiration substituted for product description (reimagine your workflow, unlock your potential); name the thing it does
  • comparator-less superlatives (the fastest, the easiest, the most powerful) without a named what-than
  • testimonial soup: three quotes saying "great product" with no specific outcome named
Tolerates
  • short, hammered sentences when the page has earned them with a specific claim
  • fragments and one-line paragraphs as visual rhythm (the page is read in scroll-units, not paragraphs)
  • repetition of the product name across sections; SEO and recall both want it
Common AI tells
  • hero-tagline tricolon as the headline (Ship faster. Build smarter. Scale forever.): the marketing-template signature in its purest form
  • abstract-noun stacking in the subhead (a platform for productivity, collaboration, and growth) where nothing is named
  • value-prop trio of Powerful. Simple. Scalable. adjectives below the hero, in the bento card grid
LLM lint additions 2
landing-feature-without-benefit warning Feature without benefit

Hero or feature-card copy names a capability (real-time sync, AI-powered search) but not what changes for the reader using it. The buyer cannot translate the capability into their own day.

Good
Real-time sync: your designer sees the comment the moment you leave it; no more refresh-and-ask.
Bad
Real-time sync. AI-powered search. Enterprise-grade security.
landing-superlative-pile warning Superlative pile without comparator

Hero stacks superlatives (fastest, easiest, most powerful, simplest) without naming what is being beaten or by how much. The claim is unfalsifiable, so the skeptical reader discounts the whole page.

Good
Builds in 90 seconds, down from 11 minutes on our previous CI.
Bad
The fastest, easiest, most powerful build system on the market.

marketing/product-copy

2 LLM rules

Describes a single feature or product surface to a reader who is past the hero, considering whether to adopt; they want the shape of the thing, not the brand pitch. They bring a job to be done and a vague memory of three competing tools; the page either translates the feature into their workflow or loses them.

Demands
  • one user noun on the page that the reader recognizes from their own week (the on-call eng, the procurement lead, the trial-balance reviewer) before any technical noun
  • every feature stated as does X so the user can Y: the second clause is load-bearing; if it can be cut without losing meaning, the feature isn't a benefit yet
  • one screenshot, code snippet, or before/after per section the way a sales engineer would demo it
  • pricing, limits, and integration surface named on the page or one click from it; adoption decisions need shape, not vibes
Forbids
  • noun-stacks of technical jargon read as a buzzword string (AI-powered observability platform with cloud-native telemetry pipelines) with no concrete user noun
  • inflated category framing (the future of work, the operating system for X) on a feature page; the hero may earn this, the feature page does not
  • "trusted by industry leaders" without naming three
Tolerates
  • jargon native to the buyer's role; a developer page can say idempotent, webhook, OAuth scopes without explaining them
  • dense parameter tables and config snippets; the product is technical, the copy can be
  • repeated product name and verb-noun pairs across feature cards; searchability and parallelism both want them
Common AI tells
  • the empty-positioning paragraph: three sentences explaining what category the product belongs to without saying what it does
  • benefit adjectives doing the work that benefit clauses should do (a powerful, intuitive, scalable solution); Ogilvy's first rule, broken
  • the joel-spolsky failure mode: feature list reads like a spec sheet without naming who wins from each item
LLM lint additions 2
product-copy-jargon-stack warning Jargon stack without user noun

A noun phrase stacks three or more technical or category modifiers without a concrete user noun in the same paragraph. The reader cannot recover whose job changes.

Good
Cuts the on-call eng's first-response time: alerts route to the right runbook in under five seconds.
Bad
An AI-powered, cloud-native observability platform with real-time telemetry pipelines for the modern enterprise.
product-copy-benefitless-feature-list warning Benefitless feature list

Three or more consecutive feature names or bullets with no so that clause naming the user outcome. The page lists capabilities a competitor could also list.

Good
Branch protection: main can't be force-pushed, so the on-call doesn't get paged at 2 a.m. by a rebase.
Bad
Branch protection. Required reviewers. Status checks. Merge queues.

marketing/sales-email

2 LLM rules

A cold or warm message designed to earn one reply: not a meeting, not a demo, a reply. The reader's inbox already has 40 like it this week; they will decide in three seconds whether to archive, and the decision is made on the preview pane (subject + first line + sender).

Demands
  • subject reads like a colleague wrote it, not a campaign: lowercase if your inbox is lowercase, no [CASE STUDY] brackets, no emoji
  • first line is not about the sender; it is a specific observable thing about the recipient (a shipped feature, a hire, a public number) the sender can defend in a follow-up
  • one ask, phrased so a one-word reply ("sure" / "send it" / "next week") closes the loop
  • signature is a person with a job title, not a brand; McKenzie's "specific person at specific company" test
Forbids
  • the "Hope this finds you well" / "Hope you're having a great week" preamble; the reader archives the moment they see it
  • fake-warm personalization (I saw you're a big fan of X from a scrape); the reader knows the scrape and resents it more than no personalization
  • the multi-paragraph value-prop dump before the ask; sales emails are not landing pages
Tolerates
  • a P.S. that does real work (a specific concession, a deferred ask, a relevant link); P.S. is read more than the body
  • a deliberately short body (≤ 75 words); Efti and McKenzie both endorse this; the reader counts paragraphs before reading words
  • direct mention of price, scope, or timing in the first email; vague openers ("would love to chat") signal nothing to commit to
Common AI tells
  • the chatgpt-cold-email template: hook ("I noticed…") + bridge ("which made me think…") + soft ask ("would you be open to a 15-min chat?")
  • compliment-then-pivot opener (Loved your recent post on X, it really resonated): the model's idea of warmth, the reader's idea of slop
  • the false-specific personalization that names a public fact and adds nothing: Saw you raised a Series B, congrats!
LLM lint additions 2
sales-email-personalization-fake warning Fake-warm personalization

Opener references a public fact about the recipient (post, hire, raise, talk) but does not use it to do work in the email; no specific question, no relevant offer downstream. The reader recognizes the scrape.

Good
Your post on cache invalidation in monorepos lined up with a problem we just shipped a fix for at $COMPANY; happy to share the write-up if useful.
Bad
I really enjoyed your recent post on engineering culture! It made me think about how $PRODUCT could help your team.
sales-email-buried-ask warning Buried or absent ask

Email runs past three short paragraphs before naming what the sender wants, or names it so softly ("would love to chat sometime") that no one-word reply closes the loop.

Good
Worth a 20-minute call next Tuesday or Wednesday to see if it fits? Yes / no is fine.
Bad
We'd love to explore opportunities to potentially collaborate and would welcome the chance to discuss further at your convenience.

marketing/press-release

2 LLM rules

A 250–500-word announcement written so a tired reporter can paste the lede and the third paragraph into a story before lunch. The reader is the journalist, not the customer; they want a verifiable fact, a quotable line, and a contact who picks up, not the brand's mood board.

Demands
  • inverted pyramid: who, what, when, where, why in the first sentence; the rest is supporting paragraphs ranked by what survives a cut from the bottom
  • dateline (SAN FRANCISCO, May 15, 2026 –) and an embargo line if applicable; both are signals to the journalist that the writer knows the form
  • one or two specific numbers in the first three paragraphs (customers, ARR, percentage gain, hire count) that the reporter can quote with confidence
  • contact block at the bottom with a human name, role, email, and phone; no media@company.com black hole
Forbids
  • the Bezos-failure mode: a release that reads like a strategy memo instead of a customer-visible product launch; if no one outside the company can describe what shipped, the release isn't ready
  • internal-quote soup: the CEO, the CTO, and the head of product all quoted on the same announcement, each saying a variant of "we are excited"
  • adjective-stacked product names (our revolutionary, next-generation, AI-first platform); the journalist will cut every adjective on first edit
Tolerates
  • a marketing-register quote if it carries one fact a journalist would otherwise have to ask for ("we crossed 10,000 paying teams in April")
  • formulaic boilerplate paragraph at the end (About $COMPANY:); convention, not a tell
  • ### or -30- end-mark; convention, not a tell
Common AI tells
  • the empty CEO quote: "We are thrilled to announce…"; the model's default, carries no fact and reads as a stage cue
  • stakes-inflation in the lede (transforming the way humanity Xs`) attached to a routine product update: the genre-cliché version of fintech-confident voice
  • the from-X-to-Y industry-sweep paragraph (From startups to Fortune 500s, every team needs Y) used as the second paragraph
LLM lint additions 2
press-release-internal-quote-soup warning Internal-quote soup

Two or more executive quotes in one release, none carrying a fact a reporter would otherwise have to dig for. The quotes mostly express enthusiasm or restate the headline.

Good
'We crossed 10,000 paying teams in April, up from 4,000 in January,' said CFO Maya Chen.
Bad
'We are thrilled to deliver this transformative capability,' said CEO. 'This represents the next chapter,' added CTO. 'Our customers will love it,' said head of product.
press-release-empty-lede error Empty lede

The first sentence names a company action but no concrete result, comparison, or quantity. A reporter cannot lift the sentence as the first line of their story.

Good
Stripe today announced support for instant payouts in 14 new markets, bringing same-day settlement to merchants in 47 countries.
Bad
Stripe today announced a transformative new initiative to empower the future of global commerce.

marketing/about-page

2 LLM rules

The page a reader lands on when they want to know who's behind the product, usually after they like the product enough to vet the company. They are looking for evidence that real people are accountable, that the company has an opinion, and that the story behind the product is more than a content-strategy artifact.

Demands
  • a founding moment grounded in a specific year, place, and irritation: Fried's "what is this?" or Mailchimp's "the alternative to expensive email software of the early 2000s"
  • at least one named human, in their own voice or attributed to them, with a job that sounds like a job (Jason, co-founder not our visionary leadership)
  • a position the company holds that a competitor wouldn't: opinions about how work should be done, who they won't sell to, what they refuse to build
  • numbers where they exist (year founded, headcount band, customer count, money raised); they ground every abstract claim above
Forbids
  • mission-statement abstractions interchangeable with any company in the category (empowering people to do their best work)
  • founder-mythology cliché (a sticky-note on a napkin, building from a dorm room) without the specific scene attached
  • the corporate-citizenship paragraph as substitute for a position (we believe in diversity, sustainability, and innovation): convictions, not vibes
Tolerates
  • first-person and first-person-plural, freely; this is one of the few marketing pages where we and I belong on the page
  • a long, narrative paragraph in the middle; the about page can carry one block of real prose where the rest of the site is scannable
  • mild self-deprecation and admitted mess (we dropped balls, we still aren't sure); Basecamp-style honesty beats polished mythology
Common AI tells
  • the mailchimp-knockoff voice without the substance: "plainspoken" and "human" as adjectives without the actual prose to back them
  • the From X to Y, we've always believed Z sweep: survey-of-the-field cadence on a page that should be specific to one company
  • the values bullet list (Curiosity. Craft. Customer obsession.) doing the work that lived examples should do
LLM lint additions 2
about-page-mission-soup warning Mission-statement soup

Mission, vision, or "we believe" paragraph reads as interchangeable abstractions; could appear on any competitor's About page with the company name swapped. No specific year, person, customer, or refusal anchors the claim.

Good
We started Basecamp in 2004 because our consulting clients kept asking what we used to manage their projects. The answer was an internal tool. We sold the tool.
Bad
Our mission is to empower people and organizations to do their best work and unlock their full potential in an ever-evolving world.
about-page-values-bullets info Values bullets as substitute for position

A Our values or What we believe section is a bulleted list of one- or two-word abstractions (Curiosity. Craft. Trust.) with no specific consequence or trade-off named. The reader cannot guess what the company would refuse to do.

Good
We won't sell to ad-tech, even when they pay above list; we built the product to keep user data private, and that means saying no.
Bad
Our values: Curiosity. Craft. Customer Obsession. Diversity. Sustainability. Innovation.

microcopy/

4 leaves

In-product short text. One idea, ≤8 words where possible. Helpful, not chirpy.

microcopy/ui-label

2 LLM rules

The smallest unit of product copy: a button, a form field label, a menu item, a tooltip. The reader is mid-task; they are not reading prose, they are scanning for the verb that completes the action they came to do. Every word is competing with the user's existing mental model of "what should this button say?"

Demands
  • the label names the action from the user's point of view as a verb-object (Save changes, Cancel subscription, Download invoice); never a state, never a sentence
  • form-field labels match the data the field collects (Work email, not Please enter your email address below); the label is the noun, not a request
  • destructive actions named with the verb that matches the consequence (Delete account, Discard draft); never softened to Continue or OK
  • consistent capitalization and tense across the surface: sentence case or title case, picked once, applied everywhere
Forbids
  • passive or stateful labels where an action is happening (Page is loading… instead of Loading…; Your changes are being saved instead of Saving…)
  • the chirpy preamble (Oops!, Let's get started!, Woo-hoo!); corporate-cute is friction, not warmth
  • ambiguous dual-action confirmations (OK / Cancel on "discard your draft?") where the destructive verb should be on the button
Tolerates
  • one-word commands where context is unambiguous (Save, Send, Done)
  • "now" or other time words if they distinguish from a deferred option (Apply now vs Apply later); otherwise drop them per GOV.UK
  • truncation glyphs () on labels that open a longer flow (Move to…, Share with…)
Common AI tells
  • the full-sentence button (Click here to save your changes): model defaulting to instruction prose where a verb belongs
  • politeness inflation (Please enter your email, Kindly confirm): corporate-helpful tone imported to a label that should be a noun
  • the "Let's" prefix on action labels (Let's get started, Let's connect your account): chat-assistant voice on a button
LLM lint additions 2
ui-label-passive-voice warning Passive or stateful label

A button, label, or status string describes a state instead of an action, or uses passive construction where the agent matters. The user reads more words to extract less information.

Good
Loading…" / "Saving changes" / "Delete account
Bad
Page is being loaded…" / "Your changes are now being saved" / "The account will be deleted
ui-label-preamble info Label preamble

Label opens with throat-clearing or politeness inflation (Please, Kindly, Let's, Click here to, Tap to) before the actual verb. The first words of the label do no work; the user's eye skips them anyway.

Good
Save changes" / "Connect account" / "Email address
Bad
Please save your changes" / "Let's connect your account" / "Click here to enter your email address

microcopy/error-message

2 LLM rules

A line of UI text that fires when the system can't do what the user asked. The reader is interrupted, often stressed, frequently confused; they need three things in order: what happened, why it's not their fault, and what to try next. Nothing else belongs on the screen.

Demands
  • first clause names the failure in plain language (Card declined, Couldn't reach the server); not the technology, not the validator
  • the next clause names a recovery path the user can act on now (Try a different card, Check your connection and retry); if no path exists, the message says who's working on it and when to come back
  • the system, not the user, owns the failure; describe the state of the system, not the user's mistake
  • consistent grammar across messages on the same surface; pick Couldn't… or Unable to…, pick periods or no periods, hold the line
Forbids
  • blame words (invalid, illegal, forbidden, you forgot); GOV.UK's veto list, they re-trigger the stress the message should defuse
  • apology fossils (Sorry, something went wrong, Oops!) without specific recovery; apology costs the user time and supplies nothing
  • developer-language leakage (Error 503: upstream connection refused, null is not an object) on a user-facing surface
Tolerates
  • an error code or correlation ID below the human message, for the user to send to support; never as the message
  • terse single-line messages with no recovery path when the failure is fully self-explanatory (Wrong password) and the surface offers an obvious retry
  • the system-state opener even when the user did mis-type (We couldn't find that email); the goal is to keep the user moving, not to score correctness
Common AI tells
  • the chirpy-apology hybrid (Oops! Looks like something went wrong on our end, we're so sorry!): sycophantic-tone fossil compressed into 12 words
  • generic catch-all (Something went wrong. Please try again.) where the actual failure is known and could be named
  • the over-helpful explanation paragraph attached to a one-line error; error messages should not have second paragraphs
LLM lint additions 2
error-message-blame-user error Blame-the-user framing

Error message names what the user did wrong (You entered an invalid email, You forgot to fill in a field) instead of describing the system state and the recovery. Carries the GOV.UK veto words (invalid, illegal, forbidden, you forgot, you must).

Good
We couldn't recognize that email format; double-check for typos.
Bad
You entered an invalid email address. Please correct it before proceeding.
error-message-stack-trace-creep error Developer-language leakage

A user-facing error string surfaces internal language (status codes as the headline, exception class names, internal field IDs, system jargon like null reference, upstream, gateway, deserialization) instead of a human description of the failure.

Good
We couldn't reach the payment processor. Try again in a minute; we'll keep your cart.
Bad
Error 502: upstream connection refused at /api/v2/checkout/session. Internal correlation ID: e7c2-…

microcopy/empty-state

2 LLM rules

The screen a user sees when there's nothing yet: a fresh inbox, an unwritten project, a search with no results. The reader is one of two people: a brand-new user who needs the first step named, or an experienced user whose query missed and who needs a path back to something useful. Either way, the screen is an onboarding moment disguised as a blank.

Demands
  • name the absence in one specific phrase (No invoices yet, No results for "p99 latency"); never just Nothing here or an illustrated shrug
  • give one concrete next action with a button or link the reader can click immediately (Create your first invoice, Clear filters, Import a CSV)
  • distinguish the first-run empty (the user hasn't done it yet) from the no-results empty (they did something, it returned nothing); the copy and the action differ
  • if the action requires preconditions (connect an integration, invite a teammate), name them; never hand the user a button that opens another empty state
Forbids
  • decorative illustration with copy that explains the illustration (Looks like your inbox is feeling lonely!); fills space, does no work
  • "Get started" or "Learn more" buttons that point at a marketing page when the user is already inside the product
  • empty states that hide as zero-result tables (just headers, no message); that's not an empty state, that's a bug the design didn't catch
Tolerates
  • a single playful line of voice when the brand earns it (No issues, quiet shift); Slack's principle: jokes are fine when the user isn't blocked
  • a short hint about what the populated state will look like (Once you add a project, you'll see status, owner, and last update here)
  • a secondary link to docs below the primary action, never replacing it
Common AI tells
  • the upbeat-encouragement opener (Welcome! Looks like you're just getting started.): chat-assistant warmth where a specific action belongs
  • empty-state-as-mission-statement: the blank screen explains what the feature is rather than what to do next
  • "It's quiet in here" / "Crickets" / "Nothing to see here": the stock-empty-state cliché trio, all of them substitutes for naming the action
LLM lint additions 2
empty-state-no-action error Empty state with no first action

Empty-state copy describes the absence but offers no clickable next step, or the step is a generic Learn more that points away from the product. The user reads the screen and has nowhere to go.

Good
No invoices yet. **Create your first invoice**, or import from Stripe.
Bad
It's quiet in here! You'll see invoices once they're created.
empty-state-decoration-only warning Decorative empty state

Empty-state content is mostly a stock illustration plus a sentence that comments on the illustration or the blankness (Crickets!, It's quiet here). The copy does not name the absence specifically or supply a path forward.

Good
No results for 'p99 latency in March'. Try a shorter query or **clear the date filter**.
Bad
🦗 Crickets! Looks like there's nothing here yet.

microcopy/notification

2 LLM rules

An unrequested message that interrupts the user: push, toast, banner, badge. The reader is in the middle of something else; the notification gets one glance and one decision (tap, dismiss, mute). Every notification is auditioning for its right to fire next time; fail to be worth the interruption and the user mutes the channel.

Demands
  • the notification names a specific event with the noun a human would use (Maya replied to your PR, Build #482 failed: linter, Ride 4 min away); not the system's name for the event
  • the user can act on the consequence from the surface (open the conversation, retry the build, watch the car approach), or the notification shouldn't fire
  • timing is part of the copy: if the notification is time-sensitive, it says when (Order arriving in 12 min); if not, it shouldn't have fired urgently
  • character budget respected: title ≤ 25 chars, body ≤ 65 chars for the lock-screen-truncation surface
Forbids
  • "You have a new notification" / "New activity" / "Something happened": the generic stand-in for the specific event the system actually knows
  • urgency inflation on routine updates (URGENT: your weekly digest is ready): the boy-who-cried-wolf failure; once it fires, the channel is dead
  • marketing register on transactional notifications (Get ready to fall in love with your new dashboard!); wrong surface for the brand voice
Tolerates
  • truncation glyphs and clipped sentences when the surface enforces the limit; better truncated specific than full-length generic
  • a deliberately quiet, dry tone for high-volume notifications (CI, monitoring, queue items); the user reads dozens, voice is friction
  • emoji when it does work the words can't (a status glyph at the start: ✅ Deploy succeeded, ⚠ Build failed); never as decoration
Common AI tells
  • the chirpy nudge (Hey there! Don't forget to check your dashboard 👋): re-engagement template imported to a notification surface
  • the generic-event title (Update available) where the specific event (v0.15.0 released: security fix) is known to the sender
  • the dual-clause "engagement" body that doubles length to halve clarity (Maya replied! Tap to see what she said.); the second clause is throat-clearing
LLM lint additions 2
notification-no-stake warning Notification with no consequence

Notification fires with no event the user can act on: generic activity ping (New activity, Something happened, Update available) instead of the specific noun-and-verb the system actually knows. The user cannot decide whether to tap.

Good
Maya replied: 'looks good, merging Monday'
Bad
You have new activity in your workspace.
notification-urgency-inflation warning Urgency inflation

Routine or low-stakes notification borrows urgent-channel language (URGENT, ACTION REQUIRED, Don't miss out!, capitalized priority words, exclamation points on transactional events). The channel's signal-to-noise collapses; the next real urgent message gets dismissed too.

Good
Weekly digest: 3 PRs need review
Bad
URGENT: Your weekly digest is ready! Don't miss out!

social/

2 leaves

Public short-form. First 7 words decide whether the rest is read.

social/social-post

2 LLM rules

A single self-contained post: tweet, LI status, IG caption. The reader is mid-scroll, owes nothing, gives the post one second to earn the next; the post delivers a complete beat in one screen or loses them.

Demands
  • the post stands alone: a stranger landing cold gets the whole point without a referent, a continuation, or a "context in replies"
  • one observation, one image, one number, or one judgment; never two halves of an idea sharing the screen
  • concrete unit attached to any claim (saved ~20 tickets/week, cut p99 by 42%); abstract claims die in this format
  • a closing beat that actually closes: landing the joke, the verdict, or the surprise; no cliffhanger pretending to be one
Forbids
  • thread-bait openers on what is structurally a single post (a 🧵, here's why, (1/x)) with no thread following
  • engagement-farming framing (RT if you agree, like for part 2, who else?) written for the algorithm not the reader
  • screenshot-of-paragraph dressed as a tweet; if it's an essay, link the essay
Tolerates
  • fragments, no-cap, one-line paragraphs, asymmetric punctuation; the format rewards compression
  • direct address, "you", second person; the writer is in the room
  • profanity, dry irony, slang where the writer's other posts read that way; voice is the product
Common AI tells
  • the bland-aphorism shape (great writing is just thinking clearly): true, generic, defendable by anyone, owned by no one
  • the LinkedIn parable: short-line paragraphs, faux-vulnerability lede, single-word emphasis lines (Listen.), and a bullet-list inside the post
  • the antithesis closer the model loves (it's not about X. it's about Y.) when X and Y are paraphrases
LLM lint additions 2
social-post-thread-bait warning Thread-bait on single post

The post opens like a thread (a 🧵, here's why, (1/X), let me explain) but is structurally a single post with no continuation. The reader was promised a payload that never lands.

Good
We shipped the cache rewrite last night. p99 dropped from 1.4s to 380ms.
Bad
Why your team's caching strategy is broken: a thread 🧵
social-post-engagement-farm warning Engagement-farm framing

The post asks for retweets, likes, or replies as the mechanic (RT if you agree, like for part 2, who else has experienced this?) rather than offering something the reader chooses to engage with. The shape is written for the feed algorithm, not the reader.

Good
The deploy pipeline accepted a config change with no canary at 02:14. Here's the timeline.
Bad
RT if your team has ever shipped a Friday deploy 👇 Like for the postmortem in part 2.

social/social-thread

2 LLM rules

A numbered sequence of posts advancing one argument or story across a feed. The reader arrived because the first post delivered its own beat; each subsequent post earns the tap, and the thread pays off in the final post or doesn't get reshared.

Demands
  • the first post is a complete idea by itself: strong enough to be quoted without the rest, and good enough that someone who never reads post 2 still got value
  • each post in the run advances the argument: new fact, new turn, new objection, new beat; never a paraphrase of the previous post
  • the close lands somewhere different from the open: a verdict, a number, a surprise, a call, not "those are my thoughts, follow for more"
  • length is auditioned: every post that could collapse into the previous one without loss is one post too many
Forbids
  • (1/X) numbering attached to a thread that didn't need numbers; the form is a tell when the content is three posts dressed as twelve
  • the "bookmark this thread" / "follow me for more threads like this" closer; the engagement-bait closing move
  • screenshot-of-essay broken into posts; threads pace for the feed, not the page
Tolerates
  • repetition where the thread genuinely returns to a hook (callback in post 8 to the question in post 1)
  • one-line posts, dropped subjects, fragments; the form rewards tight beats
  • a single image / chart per beat, used as evidence not decoration
Common AI tells
  • explainer-thread shape: post 1 "here's why X matters", post 2 "first, some context", post 3 generic definition, real point at post 9 (buried-lede in thread form)
  • parallel-anaphora run where every post opens identically (1/ The thing about X… 2/ The thing about Y… 3/ The thing about Z…)
  • listicle-as-thread: each post Lesson N: <generic abstraction> with no scene, no number, no named person
LLM lint additions 2
social-thread-spread-thin warning Thread spread thin

The thread runs 8+ posts but the substance compresses to ~4 sentences. Each post adds framing, transition, or rephrase rather than a new fact, turn, objection, or beat. Collapse adjacent posts whose information is identical.

Good
Post 4 names the specific config change. Post 5 shows the dashboard. Post 6 names the responder's mental model at the moment the alert fired. Each post moves.
Bad
Post 4: This is where it gets interesting. Post 5: Stick with me. Post 6: The thing is, the system was complex. Post 7: Really complex. (Four posts, one sentence of content.)
social-thread-hollow-hook warning Hollow hook

Post 1 promises a payoff the thread doesn't deliver: here's what I learned, the answer surprised me, most people get this wrong. The hook is engagement framing, not a load-bearing claim the rest of the thread defends.

Good
p99 dropped 42% the week we removed the cache. Counterintuitive: here's the trace that explains it.
Bad
Most engineers get caching wrong. Here's what I've learned after 10 years building systems. 🧵 (1/14)

personal/

3 leaves

Self-as-subject documents. Terse, parallel, auditable.

personal/cv

2 LLM rules

A skim-scan document a hiring manager reads in 20–40 seconds to decide whether to keep reading. The reader brings a role spec, a stack of other CVs, and a checklist; they want named scope, named impact, and proof, not narrative.

Demands
  • bullets open with a strong past-tense verb (shipped, cut, migrated, owned, negotiated); not responsible for, not worked on, not helped
  • every load-bearing bullet carries a number, a scope, or a named system (cut p99 latency 42% across the payments path; migrated 14 services off Aurora to Postgres 16); vague verbs without a unit don't survive triage
  • parallel structure within a role: every bullet same tense, same shape, same punctuation, same capitalization
  • chronology unambiguous: every role dated to the month, gaps named (not hidden); current role in present tense if any tense is present
Forbids
  • first-person pronouns and full sentences (I led a team that…, I am responsible for…); the form drops I and trims to fragments
  • adjective-stack self-rating (hardworking team player, detail-oriented, passionate about X); claims without proof on a document whose entire job is proof
  • skill-soup paragraphs and "objective" / "summary" blocks longer than two sentences; the bullets do the work; voice lives in the verb choice and the metric, not in punctuation
Tolerates
  • fragments (the dominant unit), missing articles, dropped subjects; fragment-cadence rules don't apply here
  • dense verb-led parallelism every bullet, every section; parallel-triplet density is the form, not a tell
  • acronyms and stack names without expansion if the role's reader knows them; the audience is technical, not general
Common AI tells
  • the corporate-verb pool (leveraged, spearheaded, orchestrated, championed, pioneered, unlocked, optimized) in place of the specific verb that describes what happened
  • the bullet expanded into a narrative sentence with subordinate clauses (Led a cross-functional team of engineers to deliver a critical migration that enabled the platform to scale); the genre wants the verb, the object, the number, full stop
  • soft-skill clichés (strong communicator, proven leader, cross-functional collaborator); assertions a CV cannot prove and a reader has already dismissed
LLM lint additions 2
cv-vague-impact warning Vague impact bullet

A bullet claims impact (drove growth, improved performance, significant impact, owned the strategy, delivered results) without a number, percentage, scope, named system, or comparable. The bullet either gets a unit or it gets cut.

Good
Cut p99 latency 42% across the payments path (Q3 2024); shipped the cache rewrite that took the on-call from 6 pages/week to 1.
Bad
Drove significant performance improvements across the platform and delivered key results for the business.
cv-narrative-creep warning Narrative creep in CV bullet

A bullet has become a sentence with I, subordinate clauses, or explanatory prose. CV bullets open with a verb and stay fragmentary; full sentences belong in the cover letter.

Good
Migrated 14 services from Aurora to Postgres 16; led the dual-write window and the cutover (zero downtime, March 2024).
Bad
I was responsible for leading the team that migrated our services to a new database, which was a critical initiative for the business.

personal/cover-letter

2 LLM rules

A short letter that the CV cannot write itself: why this role at this company, with one piece of evidence the CV doesn't already carry. The reader has the CV open in another tab, has thirty seconds, and is testing whether the writer has read the job spec or sent the same letter to forty companies.

Demands
  • a first sentence that proves the letter is not a template: name the role, name something specific about the company or team the writer actually engaged with (a product decision, a public post, a known problem), and the writer's angle on it
  • one piece of evidence the CV doesn't carry (a project shipped, a problem solved, a number, a named system), chosen because it answers this role, not the writer's greatest hits
  • a clear ask: interview, conversation, next step, phrased in plain language, not "I would welcome the opportunity to discuss"
  • length: one page at the absolute maximum; three short paragraphs is plenty
Forbids
  • the template opener (I am writing to apply for the [Position] role at [Company], Please find attached my resume for your consideration) and the closing fossils (I look forward to hearing from you at your earliest convenience)
  • adjective-stack self-rating with no proof (I am a hardworking, passionate, detail-oriented team player who…); every adjective is a debit; replace with a specific past action
  • restating the CV in paragraph form; the reader has the CV, and the letter explains what the CV can't
Tolerates
  • a strong first-person voice, contractions, the writer's actual register; the letter is the one document where the reader hears the writer
  • one sentence of opinion or angle on the company's work (the briefcase move: "I noticed the X your team shipped does not handle Y; here is how I'd approach Y")
  • formatting plain: salutation, three paragraphs, sign-off; no headers, no bullets, no callout boxes
Common AI tells
  • the four-paragraph generated shape: paragraph 1 announces, paragraph 2 generic-praises, paragraph 3 paraphrases the CV, paragraph 4 thanks; the structure is the tell
  • the I am particularly drawn to your company's mission of empowering users to… sentence, with the mission lifted verbatim from the careers page
  • corporate softeners (I would be thrilled to, It would be an honor to, I am incredibly excited about the opportunity to); register-mismatch with anything said in the rest of the letter
LLM lint additions 2
cover-letter-template-feel error Template-feel opener

The opening sentence reads as a fill-in-the-blank template: I am writing to apply for the [role] at [company], Please accept this letter as my application for…, I came across your job posting and was excited to learn more about…. The reader has seen a thousand of these and stops.

Good
Your team's post on the cache rewrite is what convinced me this role is mine to apply for; I shipped the equivalent migration at Acme last year and the failure modes you described are exactly the ones we hit.
Bad
I am writing to express my strong interest in the Senior Engineer position at your company, which I came across on your careers page.
cover-letter-self-rating warning Adjective-stack self-rating

The letter asserts personal qualities (hardworking, detail-oriented, passionate, team player, excellent communicator, proven leader) without a specific action that proves them. Adjective claims about oneself are negative evidence in this genre; the reader discounts them by default.

Good
When the payments outage hit Q3, I owned the timeline and the comms; the postmortem is public if you want the artefact.
Bad
I am a hardworking, detail-oriented team player with a passion for building great products and excellent communication skills.

personal/bio

2 LLM rules

A short self-description for a website, a conference program, a podcast intro, a Twitter sidebar, or a book jacket. The reader is mid-decision (read the post? book the talk? follow the account?) and is testing whether this person is worth more of their attention; the bio either lands one specific, surprising, or load-bearing thing or it gets skimmed past.

Demands
  • a concrete fact a stranger can verify (a specific project, a company, a publication, a place, a number); the bio is anchored to one piece of public evidence
  • third person if the surface demands it (speaker program, book jacket, masthead), first person if the surface tolerates it (personal site, Twitter); pick one and stay
  • length sized to the surface: one line for a profile, two–three sentences for a site, one short paragraph for a jacket; never longer
  • one element that no other person could have written: a specific past role, an unusual pairing of fields, a recurring topic, a town, a hobby that means something
Forbids
  • the credential pile with no work named (engineer, writer, speaker, advisor, mentor, builder, thinker); a list of nouns is not a bio
  • abstract self-positioning (passionate about technology and helping people, at the intersection of X and Y); the X-and-Y phrase is the AI fingerprint of the form
  • mission-statement register (on a mission to empower builders to unlock their potential); marketing-speak imported to a personal surface
Tolerates
  • humor, oddity, a single specific hobby ("plays bad chess", "keeps bees", "from a town no one has heard of"); voice is the whole point
  • a one-line bio that is just a fact (programmer. wrote X. lives in Berlin.); fragments are correct here
  • a confessional or self-deprecating note where the writer's other prose reads that way; the bio is a sample, so match the sample
Common AI tells
  • the X-and-Y intersection sentence (writer, engineer, and educator working at the intersection of technology and storytelling): generic credential-stack with the intersection cliché closing it
  • title-case Capitalized Compounds as identity (Engineer. Builder. Storyteller.): three-noun fragment cadence imported from marketing
  • the journey arc compressed to a sentence (Her journey took her from finance to founding her own company): narrative cliché where one specific role would do the work
LLM lint additions 2
bio-credential-pile warning Credential pile

The bio is a stack of credentials, role nouns, or self-positioning adjectives (engineer, writer, speaker, advisor, mentor, builder) with no specific project, company, place, or fact named. The reader cannot picture what the person actually does.

Good
Patrick McKenzie sells software to small businesses, writes long-form about software businesses at Kalzumeus, and works on infrastructure at Stripe.
Bad
Patrick is an entrepreneur, writer, advisor, and builder passionate about software, business, and helping others succeed.
bio-intersection-cliche warning Intersection-of-X-and-Y cliché

The bio positions the writer "at the intersection of X and Y", "where X meets Y", or as "a bridge between X and Y" with no specific work named. The framing is the AI bio fingerprint; replace with a project, a company, or a sentence about what the person actually did.

Good
She runs the security team at Acme; before that she wrote the Rust crate everyone uses for OAuth.
Bad
She works at the intersection of security, engineering, and human-centered design.

presentations/

2 leaves

Slide-shaped and speaker-shaped prose. One idea per slide; text is signage.

presentations/deck

2 LLM rules

Slide text seen behind a speaker by an audience that can't pause, scroll, or zoom. The reader has six to fifteen seconds per slide while also listening; they want a visual anchor that confirms what the speaker just said and a phrase they can carry into the next slide, not a paragraph to read in parallel.

Demands
  • a slide title that makes a claim, not names a topic (Cache misses doubled in Q3 beats Cache performance); Duarte's first move
  • text sized so the back row reads it; one chart, one diagram, or one short list per slide
  • a stake or number on every claim slide; a deck of titles with no numbers is a table of contents
Forbids
  • the slide-as-paragraph: full sentences with conjunctions and subclauses on the slide itself (Tufte: PowerPoint's bullets "dilute thought"; Reynolds: replace lists with images and one-idea slides)
  • the feature-list slide: six bullets naming features with no claim about why the audience should care
  • dense tables with more than ~12 cells the audience must scan while you talk; export to a handout
  • the agenda slide repeated as the section-divider slide repeated as the closing-recap slide; three slides for the same content
Tolerates
  • fragments, dropped articles, telegraphic phrasing (p99: 42% lower); slide text is signage
  • the same word repeated across consecutive slides if it's the through-line of the talk
  • the deliberately blank slide that lets the speaker hold the room without competing visuals
Common AI tells
  • the bulleted feature-list slide (Robust • Scalable • Seamless • Enterprise-ready): vocabulary class, slide format
  • the colon-headline pattern repeated as the deck's section style (Caching: A Modern Approach)
  • the marketing-template tricolon as the closer slide (Ship faster. Build smarter. Scale forever.): fossil-class on a slide
LLM lint additions 2
deck-slide-paragraph warning Slide-as-paragraph

A slide's body text is a full grammatical paragraph (subject, verb, conjunction, subclause) rather than signage. The audience reads it instead of listening; the slide replaces the speaker.

Good
Cache misses doubled in Q3. \ndriven by the staging-replica VPC change
Bad
In Q3, our cache-miss rate doubled, which was largely driven by changes we made to the staging-replica VPC, and this had downstream effects on p99 latency.
deck-feature-list-slide warning Feature-list slide

Slide is a vertical list of feature names or capability labels (Scalable • Robust • Secure) with no claim about consequence or stake. The audience leaves with a vocabulary, not a point.

Good
Cut p99 latency 42%; the on-call eng now ships during the on-call.
Bad
• Scalable infrastructure \n• Robust monitoring \n• Seamless deployments \n• Enterprise-ready security

presentations/speaker-notes

1 LLM rule

Cues a human who is about to say this aloud, not text the audience will read. The "reader" is the speaker themselves at rehearsal and again two minutes before going on; they want a phrase that triggers the right beat, the transition into the next slide, and a few load-bearing numbers; they don't want a script to recite (Anderson distinguishes scripted from unprepared).

Demands
  • speaker-facing, not audience-facing: written in the cues and stage directions of the spoken talk, not the prose of the article version
  • one beat per slide, written as the bridge into the next slide as well as the point of this one (Duarte's contrast structure: what is, what could be)
  • numbers, names, and quotations spelled out for the mouth (forty-two percent, not 42%); units pronounced (p-ninety-nine)
  • explicit time cues for opener, closer, and any STAR-moment beat the speaker wants memorized verbatim (Anderson: memorize opening and closing)
Forbids
  • the verbatim script: paragraph prose under every slide that mirrors the slide, with the speaker tempted to read it aloud
  • repeating the slide text in the notes (the slide is already on screen); the notes earn their space by saying what the slide can't
  • audience-register marketing copy in the notes (Our revolutionary platform unlocks …); the notes leak into the talk
Tolerates
  • fragments, dashes, ALL-CAPS for emphasis the speaker should hit (SLOW HERE, PAUSE: let the chart land)
  • second-person addressed to the speaker (take a breath; check the back row)
  • stage directions in brackets ([click to next slide], [pause for laugh], [if running long, skip the Aurora anecdote])
  • inside-baseball that the speaker won't say aloud but needs as a hook (Q3 retro: the one Alex ran)
Common AI tells
  • the verbatim-script note that reads like a polished article paragraph: the form defeated; the assistant defaulted to prose
  • present-participle tails (, highlighting the importance of caching strategies); written for an audience, not a speaker
  • the from-X-to-Y sweep in the opener cue (From healthcare to finance, every industry is being reshaped); survey tone in talking points
  • audience-flattering sycophancy in the opener (What a fantastic audience, what a privilege to be here)
LLM lint additions 1
speaker-notes-script-creep warning Script creep

Notes drift from cues into verbatim sentences the speaker will be tempted to read aloud. The form is the tell: three or more complete sentences in formal register under a single slide.

Good
[click] cache misses doubled, Q3. landed the staging-VPC change. PAUSE. → next: what we did
Bad
In the third quarter of last year, our cache-miss rate doubled. This was largely the result of changes to our staging-replica VPC, and it had significant downstream effects on user-facing latency.

(stub)

1 leaf

Stub leaf. Pilcrow's lens only partially covers academic prose; full coverage is out of scope for now.

stubacademic

Stub. Academic prose has its own conventions (abstract / method / results / discussion shape, dense citation, third-person register) that pilcrow's lens only partially addresses. This file exists so path inference resolves cleanly; full coverage is out of scope for now.

Tolerates
  • nominalization chains, hedge clusters, long sentences, passive voice, formal third-person, dense citation parentheticals
Common AI tells
  • generic-introduction openers ("In recent years, the field of X has seen significant growth")
  • stakes inflation in abstract claims
  • abstract-without-concrete across the introduction
References
  • (intentionally a stub)