fix: purge AI slop from judgment essay, add voice linting pipeline
- 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>
This commit is contained in:
@@ -0,0 +1,164 @@
|
||||
---
|
||||
skill:
|
||||
name: voice-check
|
||||
description: >
|
||||
LLM-as-judge anti-slop and voice authenticity check for blog posts.
|
||||
Runs a mechanical lint (em-dashes, trigger words, hedging) then an LLM
|
||||
evaluation against the author's voice profile for deeper pattern detection.
|
||||
version: 1.0.0
|
||||
context: fork
|
||||
user-invocable: true
|
||||
disable-model-invocation: true
|
||||
model_role: critique
|
||||
---
|
||||
|
||||
# Voice Check -- Anti-Slop & Voice Authenticity Judge
|
||||
|
||||
You are a writing quality judge. Your job is to evaluate a blog post for AI slop
|
||||
and voice authenticity. You are ruthless, specific, and constructive.
|
||||
|
||||
## Steps
|
||||
|
||||
### Step 1: Gather inputs
|
||||
|
||||
Read these three files:
|
||||
|
||||
1. The post to evaluate -- the user will specify which file, OR check for the
|
||||
most recently modified `.md` file in `src/content/posts/`
|
||||
2. The voice profile at `.amplifier/VOICE.md`
|
||||
3. Run the mechanical linter: `./scripts/lint-voice.sh <post-file>` and capture
|
||||
its output
|
||||
|
||||
If `lint-voice.sh` doesn't exist or fails, skip the mechanical lint and note it.
|
||||
|
||||
### Step 2: Mechanical lint results
|
||||
|
||||
Report the output of `lint-voice.sh` verbatim. This catches:
|
||||
- Em-dash density (FAIL if >5 per post)
|
||||
- AI trigger words (delve, tapestry, nuanced, landscape, etc.)
|
||||
- Hedging phrases
|
||||
- Filler transitions
|
||||
- Resolution closers
|
||||
- Receipt count (links, URLs, code blocks)
|
||||
- Sentence length uniformity
|
||||
|
||||
### Step 3: LLM Judge evaluation
|
||||
|
||||
Using VOICE.md as the reference profile, evaluate the post on these 8 dimensions.
|
||||
For each dimension, give a **PASS**, **WARN**, or **FAIL** verdict with a specific
|
||||
one-sentence justification. Quote the problematic text when failing.
|
||||
|
||||
#### Dimension 1: Em-Dash Addiction
|
||||
Does the post overuse em-dashes? Count them. The author's real writing uses 0-2
|
||||
per 1000 words. More than 5 per 1000 = FAIL.
|
||||
|
||||
Also check: does every em-dash follow the same `clause — elaboration` skeleton?
|
||||
If so, that's a Claude fingerprint even if the count is low.
|
||||
|
||||
#### Dimension 2: Conviction Posture
|
||||
Does the writing hedge when it should assert? Look for:
|
||||
- "might", "could", "arguably", "potentially" used to soften claims the author
|
||||
clearly believes
|
||||
- Passive constructions that hide the actor ("it was found" vs "I found")
|
||||
- False balance ("on the other hand" when there IS no valid other hand)
|
||||
|
||||
The voice profile says: "High, earned. States opinions as conclusions from
|
||||
experience, not as positions to defend."
|
||||
|
||||
#### Dimension 3: Evidence Instinct (Receipts)
|
||||
Does the post show receipts? The voice profile says this is NON-NEGOTIABLE.
|
||||
Check for:
|
||||
- Links to PRs, repos, packages, docs
|
||||
- Code blocks that prove a point
|
||||
- Specific numbers with sources
|
||||
- Named real-world examples
|
||||
|
||||
A 1000+ word post with zero links AND zero code = FAIL unless it's explicitly
|
||||
framed as a manifesto or opinion piece (not a war story).
|
||||
|
||||
#### Dimension 4: Narrative Engine Match
|
||||
What structural device drives the post? Compare to the voice profile's default:
|
||||
"Enemy-narrative diagnostic" (hook → name enemies → diagnose → show fix → quantify).
|
||||
|
||||
Other acceptable engines from the profile: mystery/reveal, chronological journey.
|
||||
Flag if the post uses argument/counterargument essay mode (this is the default
|
||||
mode of AI, not of the author).
|
||||
|
||||
#### Dimension 5: Structural Parallelism
|
||||
Are bullet lists too clean? Look for:
|
||||
- 3+ bullets all following the exact same grammatical skeleton
|
||||
- Lists where every item is the same length
|
||||
- The "tricolon" pattern: exactly 3 items in every list (AI defaults to 3)
|
||||
|
||||
Human writers vary their list item structure. AI makes them suspiciously parallel.
|
||||
|
||||
#### Dimension 6: Opening Quality
|
||||
Does the post open with the problem or the hook? Or does it open with a generic
|
||||
topic-setting frame?
|
||||
|
||||
BAD: "In the evolving landscape of AI engineering..."
|
||||
BAD: "Today I want to talk about..."
|
||||
GOOD: "Our cache was lying to us for six months."
|
||||
GOOD: "What if I told you your Webpack is doing too much work?"
|
||||
|
||||
The voice profile says: "Open with the problem or the hook, not the topic."
|
||||
|
||||
#### Dimension 7: Ending Quality
|
||||
Does the post end when it's done? Or does it:
|
||||
- Restate the intro (the "In conclusion" anti-pattern in disguise)
|
||||
- Wrap up too neatly
|
||||
- Add a generic call-to-action
|
||||
|
||||
The voice profile says: "End when you're done. No summary paragraph restating
|
||||
everything. The last section's fix or the closing thought IS the ending."
|
||||
|
||||
#### Dimension 8: Personality Presence
|
||||
Does the author's personality show? Look for:
|
||||
- At least one moment of humor, self-awareness, or dry observation per 1000 words
|
||||
- The "aside" pattern: a brief parenthetical or sentence that breaks the serious
|
||||
tone with personality
|
||||
- Any moment where you can tell a specific human wrote this, not a generic smart
|
||||
person
|
||||
|
||||
The voice profile says humor is "a pressure release valve in otherwise dense
|
||||
technical content" and should be "sparse but present."
|
||||
|
||||
### Step 4: Specific Fix Recommendations
|
||||
|
||||
For every FAIL and WARN, provide a SPECIFIC fix. Not "reduce em-dashes" but
|
||||
"Line 23: replace '— it fools everyone longer' with '. It fools everyone longer'"
|
||||
|
||||
Group fixes by effort:
|
||||
- **Quick fixes** (find-and-replace, delete a phrase): do these now
|
||||
- **Structural fixes** (rewrite a section, add evidence): flag for the author
|
||||
- **Voice fixes** (reframe the narrative engine, add personality): author decision
|
||||
|
||||
### Step 5: Scorecard
|
||||
|
||||
```
|
||||
DIMENSION VERDICT NOTES
|
||||
Em-dash addiction PASS/WARN/FAIL count, density
|
||||
Conviction posture PASS/WARN/FAIL hedge count
|
||||
Evidence instinct PASS/WARN/FAIL receipt count
|
||||
Narrative engine match PASS/WARN/FAIL engine identified
|
||||
Structural parallelism PASS/WARN/FAIL worst offender
|
||||
Opening quality PASS/WARN/FAIL opening type
|
||||
Ending quality PASS/WARN/FAIL ending type
|
||||
Personality presence PASS/WARN/FAIL moment count
|
||||
|
||||
MECHANICAL LINT: X failures, Y warnings
|
||||
LLM JUDGE: X failures, Y warnings
|
||||
|
||||
OVERALL: PUBLISH / REVISE / REWRITE
|
||||
```
|
||||
|
||||
**PUBLISH** = 0 failures, 0-2 warnings
|
||||
**REVISE** = 0-1 failures (fixable with quick edits), any warnings
|
||||
**REWRITE** = 2+ failures or structural/voice failures that need rework
|
||||
|
||||
## Important
|
||||
|
||||
- Be harsh. It's better to catch slop before publishing than after.
|
||||
- Quote specific lines. Vague feedback is useless feedback.
|
||||
- The author WANTS to hear this. Don't soften.
|
||||
- If the post is genuinely good, say so. Don't manufacture criticism.
|
||||
Reference in New Issue
Block a user