a951c00e35
- Killed 16 em-dashes (Claude fingerprint, 15.9/1000 words -> 0) - Replaced all clause-dash-elaboration patterns with periods, colons, restructuring - Removed 'The One-Sentence Version' section (restated the intro, voice anti-pattern) - Broke tricolon at lines 56-58 (too-clean parallel structure) - Collapsed 'How to Actually Help' listicle into connective prose - Added receipt link for ~100x inference cost claim - Heading dashes replaced with colons (Tradesman Analogy, Excellence vs Functional) New tooling: - scripts/lint-voice.sh: mechanical anti-slop linter (em-dashes, trigger words, hedging, filler, receipts, sentence uniformity) - .amplifier/skills/voice-check/SKILL.md: LLM-as-judge voice authenticity check (8 dimensions against VOICE.md profile) - .amplifier/AGENTS.md: standing rule requiring both checks before any publish 🤖 Generated with Amplifier Co-Authored-By: Amplifier <240397093+microsoft-amplifier@users.noreply.github.com>
304 lines
14 KiB
Markdown
304 lines
14 KiB
Markdown
# Writing Voice Framework & Profile
|
|
|
|
## Part I: The Framework -- Dimensions of Writing Voice
|
|
|
|
Writing voice is not a single thing. It's a composite of independent dimensions
|
|
that each writer dials differently, and that shift depending on what the writing
|
|
is *for*. Generic "tone guidelines" flatten this into "professional but friendly"
|
|
-- which is exactly how you get AI slop. Real voice has texture because the
|
|
dimensions interact in unexpected ways.
|
|
|
|
### Person-Stable Dimensions (the writer's fingerprint)
|
|
|
|
These are relatively constant across everything a person writes. They're the
|
|
dimensions that make you recognize someone's writing even without a byline.
|
|
|
|
**1. Conviction Posture**
|
|
How strongly opinions are held and expressed. Ranges from constant hedging
|
|
("it might be worth considering...") to full-throat assertion ("this is wrong
|
|
and here's why"). Most writers have a resting conviction level that shifts
|
|
only under specific pressure.
|
|
|
|
**2. Intellectual Posture**
|
|
The relationship the writer assumes with the reader. Not "reading level" --
|
|
it's deeper than that. Options:
|
|
- Teaching-down: "Let me explain..."
|
|
- Peer-to-peer: "You've probably seen this..."
|
|
- Thinking-aloud: "I wonder if..."
|
|
- Diagnostic: "The issue here is that..."
|
|
|
|
Most people have a default. The best writers shift fluidly but have a home base.
|
|
|
|
**3. Warmth Gradient**
|
|
How much the writer acknowledges the reader as a person. "We" vs "one." Asides
|
|
about shared struggles vs pure information delivery. Humor is related but
|
|
separate -- warmth is about inclusion, humor is about surprise.
|
|
|
|
**4. Humor Register**
|
|
Not "funny or not" -- the *type* of humor. Options:
|
|
- Deadpan understatement ("This is fine.")
|
|
- Playful escalation ("MOAR!")
|
|
- Self-deprecating ("I'm keeping this strange little name")
|
|
- Dry observation ("your application starts to look like a sideways mountain")
|
|
- Absurdist aside
|
|
- None / earnest
|
|
|
|
**5. Sentence Architecture**
|
|
Not just "short vs long" -- the *rhythm*. Some writers build momentum through
|
|
increasingly complex sentences that cascade. Others alternate: short punch.
|
|
Then the explanation. Some embed parenthetical asides (like this) constantly.
|
|
Others never interrupt themselves.
|
|
|
|
**6. Evidence Instinct**
|
|
When making a claim, does the writer reach for:
|
|
- Show receipts (links to PRs, npm packages, flame graphs)
|
|
- Argument from principle ("the separation of concerns demands...")
|
|
- Personal experience ("at work, we found...")
|
|
- Authority citation ("as John-David Dalton told me")
|
|
- Code that proves the point
|
|
|
|
This is deeply habitual. Receipt-showers always show receipts. Principle-
|
|
arguers always argue from principle. The instinct persists even when the other
|
|
approach would serve better.
|
|
|
|
### Purpose-Shifting Dimensions (changes with the writing)
|
|
|
|
These dimensions move depending on what the piece is trying to do. A tutorial
|
|
and a rant by the same person will differ here while maintaining the same
|
|
fingerprint above.
|
|
|
|
**7. Information Density**
|
|
How much per paragraph. Tutorials are sparse -- one concept, one example,
|
|
breathe. Technical deep-dives are dense -- three insights per paragraph,
|
|
assumes you're keeping up. Manifestos are medium -- big ideas with space
|
|
to land.
|
|
|
|
**8. Formality Register**
|
|
Casual first-person ("I found this bug") vs. detached ("the bug was
|
|
identified") vs. conversational-authoritative ("What if I told you your
|
|
Webpack is doing too much work all this time?"). This shifts with audience
|
|
and publication context more than anything else.
|
|
|
|
**9. Narrative Engine**
|
|
What structural device drives the piece forward:
|
|
- Problem/solution linear (tutorial mode)
|
|
- Problem/enemies (naming adversaries, then defeating them)
|
|
- Mystery/reveal ("here's what nobody realizes...")
|
|
- Chronological journey ("first we tried X, then Y")
|
|
- Argument/counterargument (essay mode)
|
|
|
|
**10. Reader Model**
|
|
Who the writer imagines reading this. Not demographics -- *competence
|
|
assumptions*. "You've probably used Webpack" is very different from "Webpack
|
|
is a build tool that..." This shifts with purpose but tends to cluster: some
|
|
writers always assume competence, others always explain.
|
|
|
|
---
|
|
|
|
## Part II: Ken's Voice Profile
|
|
|
|
### Sources Analyzed
|
|
|
|
- Blog post: "Localize React without Bloating the Bundle" (2019)
|
|
- Blog post: "Speeding Up Webpack Typescript Incremental Builds by 7x" (2019)
|
|
- 10+ Amplifier session transcripts (2025-2026)
|
|
- Agent delegation instructions and bug reports
|
|
|
|
### The Fingerprint (Person-Stable)
|
|
|
|
**Conviction: High, earned**
|
|
Ken states opinions as conclusions from experience, not as positions to defend.
|
|
"I believe that localization is difficult because it requires excellence in
|
|
several pieces of a stack at the same time." This isn't hedging and it isn't
|
|
posturing -- it's someone who has done the work and is reporting what they found.
|
|
He doesn't say "in my humble opinion" and he doesn't say "anyone who disagrees
|
|
is wrong." He says "here's what I found" and trusts you to evaluate it.
|
|
|
|
In sessions: "I don't want generic voice or ai slop" -- direct rejection
|
|
without explanation. He knows what he doesn't want and says so plainly.
|
|
|
|
**Intellectual Posture: Diagnostic peer**
|
|
Ken's default mode is the diagnostician. "The issue here is that Webpack 4
|
|
gave toJson a lot more information, but it also regressed the performance
|
|
tremendously as a result." He's not teaching you what Webpack is. He's not
|
|
wondering aloud what the problem might be. He identified the issue, he's
|
|
telling you what he found, and he's trusting you to follow.
|
|
|
|
The peer part shows in his use of "you" -- not pedagogical ("now you'll
|
|
want to") but collaborative ("you would recognize three separate phases").
|
|
He treats the reader as someone who would recognize the same thing he did
|
|
if they looked at the same data.
|
|
|
|
**Warmth: Present but understated**
|
|
Not effusive. Not cold. Shows up as:
|
|
- "Not everyone is as fortunate" (acknowledging others' situations)
|
|
- "Let's polish this a little bit" (inclusive, understated scope)
|
|
- "Don't worry! It is only one HOC for the entire app" (quick reassurance)
|
|
- "Let's name some enemies" (inviting the reader into the hunt)
|
|
|
|
He warms up through inclusion, not through sentiment.
|
|
|
|
**Humor: Playful escalation + dry observation**
|
|
Two distinct modes that alternate:
|
|
- Playful: "why should we humans not demand MOAR? Yes, MOAR speed!!!"
|
|
- Dry: "your application starts to look like a sideways mountain"
|
|
- Self-aware: "I'm keeping this strange little name until React.createResource()
|
|
becomes a thing maybe in the future"
|
|
|
|
The humor is never mean, never forced, and never the point. It's a pressure
|
|
release valve in otherwise dense technical content. It signals: "I'm a person,
|
|
and this should be fun."
|
|
|
|
**Sentence Architecture: Staccato with cascading explanations**
|
|
Short declarative opener. Then a longer sentence that unpacks it. Then evidence.
|
|
Then another short sentence that re-anchors.
|
|
|
|
Example rhythm:
|
|
> "This is the big one -- it brought our incremental speeds from 30s to around
|
|
> 15s."
|
|
|
|
One sentence. The claim, the proof, the dash-connected aside. No preamble.
|
|
|
|
In sessions, even more compressed: "look at [URL] and get me a bundle.md that
|
|
includes this thing." Subject, verb, object. Done.
|
|
|
|
**Evidence Instinct: Receipt-shower**
|
|
Ken links to PRs, npm packages, GitHub issues, repos. Every claim comes with
|
|
a URL or a code block. "Here's the bug: [link]". "I've published a temporary
|
|
fork: [link]". "I've created a repo to demonstrate: [link]".
|
|
|
|
This extends to sessions: he provides URLs, file paths, device contexts,
|
|
exact reproduction steps. He doesn't argue from principle -- he shows you
|
|
what he's looking at.
|
|
|
|
### The Shifts (Purpose-Dependent)
|
|
|
|
**Blog posts: Enemy-narrative diagnostic**
|
|
Both existing posts follow the same engine:
|
|
1. Hook that frames the stakes ("What if I told you...")
|
|
2. List the enemies or stages (numbered, named, personified)
|
|
3. Diagnose each one with specific evidence
|
|
4. Show the fix with code
|
|
5. Quantify the improvement
|
|
6. Brief, personality-forward closing
|
|
|
|
This is the "war story" structure. Not tutorial, not essay, not rant.
|
|
It's "here's what we fought and here's how we won." This works for
|
|
the type of content Ken writes -- performance work, tooling decisions,
|
|
infrastructure choices -- where the narrative *is* the investigation.
|
|
|
|
**Sessions: Compressed intent + layered iteration**
|
|
In conversation, Ken is extremely compressed. "get me a bundle.md that
|
|
includes this thing." No context dump, no over-specification. He trusts
|
|
the agent to figure out what "this thing" means from the URL he provided.
|
|
|
|
When the first pass isn't right, he layers: "well, I'm also going to
|
|
need..." "I can confirm that..." "Maybe we should have..." Each message
|
|
adds one thing. He doesn't try to specify everything upfront.
|
|
|
|
**Bug reports: Empirical, multi-observation**
|
|
"I can confirm the scrolling doesn't work" -- starts with validation.
|
|
Then lists 3-4 related observations in one breath, each with device
|
|
context. Then proposes a fix direction. Then adds "also the icons..."
|
|
as an afterthought. The bug report is a stream of observations, not
|
|
a structured ticket.
|
|
|
|
### Anti-Patterns (What Sounds Unlike Ken)
|
|
|
|
- Opening with "In this blog post, we will explore..." (generic framing)
|
|
- "It is important to note that..." (filler hedging)
|
|
- Explaining things the reader already knows (underestimating audience)
|
|
- Excessive qualification ("arguably," "potentially," "it could be said")
|
|
- Missing the receipts (claims without links, code, or data)
|
|
- Corporate-neutral voice ("we are excited to announce...")
|
|
- Ending with a generic summary that restates the intro
|
|
- Emoji-heavy prose
|
|
- Bullet-point listicles without connective narrative
|
|
|
|
### The Voice in One Paragraph
|
|
|
|
Ken writes like a senior engineer at a whiteboard -- he draws the architecture,
|
|
points at the problem, shows you the profiler output, and says "see this? that's
|
|
what's killing us." He assumes you know what a flame graph is. He names his
|
|
problems like enemies in a video game. He shows receipts for every claim -- PRs,
|
|
packages, repos, reproduction steps. When the fix works, he tells you the number.
|
|
When he's excited, he says MOAR. When he's done, he stops. The writing has
|
|
momentum because every sentence either identifies a problem, shows evidence, or
|
|
delivers a fix. Nothing exists to fill space.
|
|
|
|
---
|
|
|
|
## Part III: Voice Application Rules
|
|
|
|
### For Writing New Content
|
|
|
|
1. **Open with the problem or the hook, not the topic.** Not "Today I want to
|
|
talk about caching." Instead: "Our cache was lying to us and we didn't know
|
|
it for six months."
|
|
|
|
2. **Name the enemies.** Give problems identities. "Enemy #1: stats.toJson"
|
|
is more memorable than "Issue 1: Performance regression in statistics
|
|
serialization."
|
|
|
|
3. **Show the receipt immediately after the claim.** Claim, then code block
|
|
or link. Not claim, then three paragraphs of context, then evidence.
|
|
|
|
4. **Assume competence.** Don't explain what React is. Don't explain what
|
|
a build tool does. The reader is a peer who happens to not have looked
|
|
at this particular problem yet.
|
|
|
|
5. **Quantify the win.** "This brought us from 30s to 15s." Not "this
|
|
significantly improved performance."
|
|
|
|
6. **One aside per section, max.** The humor and personality live in the
|
|
asides -- "MOAR!", "sideways mountain", "strange little name." But they
|
|
work because they're rare. Two per section and it becomes a comedy act.
|
|
|
|
7. **End when you're done.** No summary paragraph restating everything.
|
|
No "in conclusion." The last section's fix or the closing thought IS
|
|
the ending.
|
|
|
|
### For AI-Assisted Writing
|
|
|
|
When using an AI to draft or extend content in Ken's voice:
|
|
|
|
- Feed the AI the specific problem, the evidence (links, data, code), and
|
|
the conclusion. Let it connect them. Don't ask it to "write a blog post
|
|
about X" -- that's how you get slop.
|
|
- Review for conviction. If the draft says "might," "could," "arguably" --
|
|
those are almost always wrong. Ken knows what he found. State it.
|
|
- Check the evidence instinct. Every paragraph should either set up a claim
|
|
or pay it off with proof. If a paragraph does neither, cut it.
|
|
- The humor should feel accidental. If it feels constructed, remove it.
|
|
Ken's humor works because it reads like something that slipped out while
|
|
he was genuinely excited.
|
|
|
|
### For Text-to-Speech
|
|
|
|
The voice should match the writing's energy:
|
|
- Not radio-announcer smooth. Slightly conversational.
|
|
- Pauses before evidence blocks (where a reader would shift their eyes to code).
|
|
- Slightly faster on the enthusiasm moments ("MOAR speed!!!").
|
|
- The read-aloud version should be a *summary narration*, not verbatim -- the
|
|
masterclass site does this well. A spoken version of a code-heavy post needs
|
|
to describe what the code does rather than read variable names.
|
|
|
|
---
|
|
|
|
## Part IV: Dimensions Quick Reference
|
|
|
|
For any new piece of writing, calibrate these:
|
|
|
|
| Dimension | Ken's Default | Adjustable Range |
|
|
|-----------|--------------|-----------------|
|
|
| Conviction | High, earned | Never hedge to hedge. Soften only when genuinely uncertain |
|
|
| Intellectual posture | Diagnostic peer | Can shift to thinking-aloud for exploratory posts |
|
|
| Warmth | Understated inclusion | Can increase for community-facing pieces |
|
|
| Humor | Playful + dry, sparse | Turn down for pure reference docs, never turn up past current level |
|
|
| Sentence architecture | Short/long alternation | Longer cascades OK for narrative pieces |
|
|
| Evidence instinct | Show receipts | Always. Non-negotiable |
|
|
| Density | Medium-high | Lower for tutorials, higher for deep-dives |
|
|
| Formality | Conversational-authoritative | Never corporate-neutral |
|
|
| Narrative engine | Enemy-narrative diagnostic | Can use mystery/reveal or journey for different content |
|
|
| Reader model | Assumes competence | Only lower for explicit beginner content, and even then, only slightly |
|