Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -174,11 +174,17 @@ These patterns are invisible at the word level but scream "AI wrote this" at the
| Telling instead of showing | "The error handling was bad" / "The code had security problems" | Describe the specific technical mechanic: "Anyone could access another user's data by changing the ID in the URL." Show the failure, don't label it. |
| Fluffy AI narration | "The alerts fire correctly for a full quarter. Then someone upgrades Rails..." | Replace generalized dramatic present-tense with specific past-tense incident: name the client (anonymized), version, timeline, exact failure. |
| Fake authority generalization | "We've seen this on every codebase we've inherited" | Replace with specific count and detail: "The last three codebases we inherited all had this." |
| Mannerism-noun refrain | Words like `discipline`, `cycle`, `pattern`, `canonical`, `workflow`, `framework` recurring as thematic anchors. Empirically: Posts B+C combined had 33 occurrences (5,046 words). Comfort-blanket nouns the writer reaches for instead of the concrete thing. | Cap to 3 total per post combined across these tell-words. Pick the concrete noun the action lives in: not "the discipline runs the cycle" but "the test fails, you commit, you move on." |
| Mannerism-noun refrain | Words like `discipline`, `cycle`, `pattern`, `canonical`, `workflow`, `framework`, `cadence`, `rhythm`, `contract`, `gate`, `gatekeeper`, `layer`, `round`, `review`, `pass` recurring as thematic anchors. Empirically: across 10 recent posts, the TDD/XP cluster averages 9-18 occurrences per post (cap is 3). Once the post architecture leans on a vocabulary, the writer reaches for those words instead of the concrete thing happening. | Cap to 5 total per post combined across these tell-words. Pick the concrete noun the action lives in: not "the discipline runs the cycle" but "the test fails, you commit, you move on." When the post's structure depends on a label (e.g., "the contracts layer"), use the label once when introduced and switch to the actual files or actions afterward ("the voice file", "Agent J", "the build"). |
| Round-number authority anchors | "Q1 2026 / 4,000-commit Rails repo / 11 failures / 40+ rescues / $80K-$200K" stamped on every claim. Specifics are real, but density of stamps is the tell — humans drop one anchor and move on; AI stamps twice per H2. | Budget: max 2 numeric stamps per H2 section. After two, switch to a story without numbers ("a few rescues ago") or aggregate. |
| "every X / never X" generalizations | "Every cycle that mattered", "never bisect", "every safe move", "on every codebase". Authority-by-quantifier. | Replace with a specific count or a named instance: "the last three rescues", "three of the four times we tried". |
| Generalized-actor framing | "The developer", "the team", "most teams", "the senior dev who told you", "the team had skipped". Recurring nameless actors. | Force a named (anonymized OK) actor or a quoted line of speech: "Marcus on the Acme rescue" / "their lead said in our retro: 'we just stopped writing tests'". Strip the sentence if neither fits. |
| Definitional cadence | "X is the canonical version of this pattern" / "the largest unit a reviewer can hold" / "is the part heavyweight Y throws away". Schoolteacher cadence. | Ban the construction `is the (canonical|largest|right|whole|real|first|last|part|version|move|cycle|rule|pattern|story|reason|point|kind) (of\|that)`. Replace with a concrete story or example. |
| Anaphora pairs | Two or more sentences in the same paragraph starting with the same first word ("The X. The Y." / "We X. We Y." / "A X. A Y."). Empirically: appears in 10/10 recent posts; the most pervasive surviving tell. The writer agent uses parallel openers as default sentence starts because it sounds tidy. | Read the paragraph aloud after writing it. If two sentences share their first word, rewrite one to start with a verb, a person, a time, or a clause. Vary the actor instead of stamping the noun: "The build runs cleanly. Hugo emits 660 pages. The og:image resolves." → "The build runs cleanly. Hugo emits 660 pages and the og:image resolves." |
| "The..." opener density | More than 20% of paragraphs starting with "The..." across the post. Empirically: the TDD/XP cluster runs 18-33% (target ≤20%). Definitional cadence at the paragraph level rather than the sentence level. | Vary the lead. Start paragraphs with a verb, a person, a time, a scene, a question, or a quoted line. Reserve "The..." paragraph leads for moments where the noun is the load-bearing subject. |
| "We..." opener density | "We saw [X]." / "We've seen [Y]." / "We work the [Z]." / "We commit on every [W]." stamping the team's first-person plural at the start of repeated paragraphs and sentences. JT's "we" voice is correct in moderation; at high density it reads as authority-by-stamping. | Same fix as the "The..." opener: vary the lead. The team voice can use "we" once or twice per H2 section without setting off the alarm. After that, switch to a named teammate ("Marcus pulled the diff..."), a passive observation ("The diff showed..."), a quoted line ("'It's a one-line fix' came back from the senior dev..."), or a time-stamped scene. |
| Long paragraphs (cap break) | Paragraphs running over 3 sentences OR over 70 words. Voice-guide cap is 3 sentences; the cap is unenforced when topic is procedural. Empirically: 39-58% of paragraphs in the recent TDD/XP cluster break the cap. Reading flow drops sharply once a paragraph runs past 3 sentences for an online reader. | Treat 3 sentences and 70 words as the working cap. If the idea genuinely needs more, the paragraph wants to be two paragraphs. The split point is usually where a sentence transitions from "what" to "why" or from "rule" to "example". |
| Architecture enumeration | Listing the post's structural pillars in order ("X, then Y, then Z" / "five layers feed into each other") inside the body. Reads as table-of-contents, not prose. The H2 headings already carry the structure; restating it inside the body is signposting. | Let the H2 headings do structural work. Inside the body, describe what happens at each step using verbs and named outcomes, not the architectural label. If you need to introduce the system once, use one short paragraph and move on - never a numbered list inside prose. |
| Formulaic founder-anecdote hook | The recurring shape "A founder we'll call [NAME] [time-stamped contact]. The MVP had been live for [duration]. She'd opened it to her first cohort - [N] paying users on a [INDUSTRY] [product type] she'd been building for [period] - and [specific failure mechanic]. [N] of those [N] users hit the bug in the first [duration]. Her solo agent had built the entire app in [weekend/sprint], told her it had '[reassuring claim]', and not once mentioned [missing thing]." Reads as practitioner specificity but at this density the template is the tell. Empirically: appears in 5 of the last 5 founder-pain posts with the same beats (Priya, Marcus, Sarah). | Vary the opener shape across posts. The next 3 posts should use 3 different hook shapes - one might open on a Slack message verbatim, one on a code diff, one on a number from a CI dashboard. The "fictional founder + specific stats + 'told her X but not Y' reveal" formula is now the post's own tell. Use it once a quarter, not every post. |

### Punctuation

Expand Down
51 changes: 48 additions & 3 deletions docs/workflows/blog-pipeline.md
Original file line number Diff line number Diff line change
Expand Up @@ -74,9 +74,32 @@ failure mode that lands every first draft at AI-score 78/100):
- Per H2 section: at least one sentence under 9 words AND at least one over 22 words.
- No three consecutive sentences within 3 words of each other in length.
- One paragraph per H2 must be a single sentence.
- One paragraph per H2 should run over 70 words with at least one comma-spliced clause.
- Cap mannerism nouns (`discipline`, `cycle`, `pattern`, `canonical`, `workflow`,
`framework`) at 3 occurrences total per post combined across all of them.
- Cap any paragraph at 3 sentences AND 70 words. If the idea genuinely needs
more, the paragraph wants to be two paragraphs. Reading flow drops sharply
past 3 sentences for an online reader.
- Anaphora rule: no two sentences within the same paragraph may start with
the same first word. If the writer's natural draft has "The X. The Y." or
"We X. We Y.", rewrite the second sentence to start with a verb, a person,
a time, or a clause. Vary the actor instead of stamping the noun.
- Opener variety: keep paragraphs starting with "The..." under 20% of total
paragraphs, AND keep paragraphs starting with "We..." (or sentences within a
paragraph leading with "We saw / We've seen / We work / We commit") under
15% of total paragraphs. Both are AI tells when stamped repeatedly.
Lead with verbs, named teammates, times, scenes, quoted lines, or passive
observations. "We..." reads as practitioner voice once per H2; at higher
density it reads as authority-by-stamping.
- Hook variety: the "fictional founder + specific stats + 'told her X but
not Y' reveal" formula (Priya / Marcus / Sarah opening) has appeared in
the last 5 founder-pain posts. It is now the post's own tell. Pick a
different opening shape: a Slack message verbatim, a code diff, a number
from a CI dashboard, a one-line quote from a kickoff retro, or a
time-stamped scene that does not name a fictional founder. Use the
fictional-founder formula at most once a quarter.
- Cap mannerism nouns at 5 total per post combined across this set:
`discipline`, `cycle`, `pattern`, `canonical`, `workflow`, `framework`,
`cadence`, `rhythm`, `contract`, `gate`, `gatekeeper`, `layer`, `round`,
`review`, `pass`. Once introduced, switch to the actual file or action
("the voice file", "Agent J", "the build") instead of stamping the label.
- Round-number anchors (Q1/Q3 dates, dollar ranges, exact line counts, "40+"
rescue counts): max 2 per H2 section. Switch to a story without numbers
after two stamps.
Expand All @@ -85,6 +108,10 @@ failure mode that lands every first draft at AI-score 78/100):
- Force named (anonymized OK) actors or quoted speech: "Marcus on the Acme
rescue", not "the developer". Strip sentences that can't pass this test.
- Ban definitional cadence: `is the (canonical|largest|whole|real|part|version|move|rule|pattern|reason|kind) (of|that)`. Replace with a story.
- Don't enumerate the post's architecture inside the body. The H2 headings
already carry the structure; restating it as "X, then Y, then Z" or
"five layers feed into each other" reads as table-of-contents prose.
If the system needs introducing, use one short paragraph and move on.

STEP 4c — BAD/GOOD pairs (verbatim — abstract bans don't intercept)
Caught in past drafts. Pattern-match these surface features, not abstract rules:
Expand All @@ -104,6 +131,24 @@ GOOD: "Marcus on the Acme rescue did this for a Friday afternoon - landed twelve
BAD: "Refactor stops being a 200-line afternoon and becomes a sequence of 3-line commits, fifteen or twenty of them, every one of which left the suite green."
GOOD: "Refactor stops being a 200-line afternoon. It becomes fifteen or twenty 3-line commits, each one ending on a green suite."

BAD (anaphora pair): "The build runs cleanly. The og:image resolves. The internal links all work."
GOOD: "The build runs cleanly - Hugo emits 660 pages, the og:image resolves, and the internal links work."

BAD (architecture enumeration in body): "We move every post through six layers in order: contracts, then rhythms, then review, then gatekeepers, then reflection."
GOOD: "Six steps run on every post before merge. The first two set the agent's expectations, the next two improve the draft, the last two catch what survived."

BAD (long paragraph, 5 sentences / 110 words): "Last Thursday Marcus had an agent break a feature. The agent was set up with the standard contract and TDD rules. It ran the suite green, then refactored a method, then committed. The next test it generated failed in ways unrelated to the feature it was working on. Marcus bisected and reverted in eleven minutes, but if he had not been pairing the agent would have continued and the failure would have shipped to staging."
GOOD (split at the rule-to-incident transition): "Last Thursday Marcus had an agent break a feature on commit 47. The agent had refactored a method and the next test it generated failed in ways unrelated to the feature it was working on. Marcus bisected and reverted in eleven minutes. Without pairing he would have shipped the failure to staging."

BAD (mannerism noun saturation): "The contract layer feeds into the rhythms layer, which feeds into the review layer. Each layer has its own gatekeeper. The cycle compounds when the reflection layer feeds back."
GOOD: "Voice rules feed into TDD's micro-cycles, which feed into the parallel critic agents. Each step has its own check. The loop compounds when we write what we learned back into the voice rules."

BAD (formulaic founder-anecdote hook - this is now the tell): "A founder we'll call Priya forwarded us her Claude Code transcript on a Sunday night. The MVP had been live for the first week. She'd opened it to her first cohort - 217 paying users on a HealthTech waitlist she'd been building for over a year - and the auth flow silently dropped session tokens for anyone whose email had a plus sign in it. 84 of those 217 users hit the bug in the first 36 hours. Her solo agent had built the entire app in a weekend, told her it had 'comprehensive test coverage', and not once mentioned it had skipped writing a single test for the email parser."
GOOD (vary the opener shape - here's a different one for the same kind of post): "Marcus opened the PR Tuesday morning with one comment in the description: 'agent finished overnight, tests green.' By 11am the staging deploy had failed twice. The auth flow regression was three lines deep in a dependency the agent had upgraded silently. Marcus rolled back, opened the diff, and asked the agent why - it hadn't run the integration suite, only the unit tests it had written itself."

BAD ("We" opener stamping - paragraph after paragraph leading with "We"): "We work the cycle on every cycle. We commit on every green. We saw a few more like Priya's last quarter."
GOOD: "The cycle runs the same way each time, and the team commits on every green. A few more rescues like Priya's came in last quarter."

STEP 4d — TWO-PASS WRITING (mandatory — single-shot lands at AI-score ~78)

Pass 1: write the full draft following all rules above. Match the reference
Expand Down
Loading