name: hc-review-blog description: Voice and structural review of a single hungovercoders blog post against the dataGriff voice guide and blog template allowed-tools: Read, Glob, Grep, Bash(ls:), Bash(wc:), Bash(mkdir:*), Write argument-hint: <optional path or slug — defaults to the most recent post in src/content/blog>
Review a hungovercoders blog post for voice, structure, opinion beats, and metadata. Run this from ~/dev/hungovercoders/site/. Default to the newest post in src/content/blog/ (excluding _drafts/); otherwise treat $ARGUMENTS as either a slug (2026-05-25-quick-beer-with-bento) or an absolute path to a .md file.
Step 1 — Load context
Read in full before reviewing anything:
~/.claude/hungovercoders/voice/datagriff-voice-guide.md— voice rules, opinion beats, title and opener formulas, metaphor library, eight-point self-check. Section 1a (Truth in first-person) is load-bearing.~/.claude/hungovercoders/voice/facts/README.md— per-topic facts convention.~/.claude/hungovercoders/voice/facts/<topic-slug>.md— the source of truth for first-person claims about the post's topic. Resolve the slug from the post'stags/seriesfrontmatter (e.g. a post taggedclaude-code→voice/facts/claude-code.md). Load only this file. If it doesn't exist, every first-person claim with a specific detail in the post is unsourced by default.~/.claude/hungovercoders/voice/blog-tutorial-template.md— mandatory structure including the verdict sectionsrc/content.config.ts(if present) — blog frontmatter schema, so you know what's required
Mandatory pass — fabrication audit. Before the eight-point self-check, sweep every first-person claim with a specific detail (number, duration, physical reaction, named moment, named person/place). For each, confirm it's cited in the matching voice/facts/<topic-slug>.md (cite as: per voice/facts/<slug>.md → <fact short title>). Flag any that isn't. Unsourced first-person specifics are a P0 review finding — they break the brand promise of honest content.
Step 2 — Resolve the target
If $ARGUMENTS is empty, list src/content/blog/*.md (excluding the _drafts/ directory), sort by filename descending, pick the first. Otherwise treat the argument as a slug (look up src/content/blog/<slug>.md) or a path. If the file doesn't exist, stop and report. Print the resolved path to the user before reviewing.
Capture the slug — the filename without .md. You'll need it to check for the matching share image.
Step 3 — Score the post
Read the post in full. Use wc -w for word count. Then score against the criteria below — PASS or FAIL for each, with a short quote and the why on every fail.
| Criterion | What good looks like |
|---|---|
| Frontmatter completeness | title, date, author: dataGriff, description, tags (array including hungovercoders), image.path all present |
| Description hygiene | description is one sentence with no trailing period |
| Title pattern | Matches one of: Quick Beer with X, X with Y, Deploy X on Y, X for/with Z, Adding X to Y. Flag if it defaults to Quick Beer with X when the post isn't actually a short single-tool tutorial |
| Want-led opener | First sentence uses one of the four formulas (The Want / The Rabbit Hole / The Confession / The Cheat). Never a definition or faceless intro |
| Day-context texture | Opener weaves in a real-world moment (warm afternoon, dogs walked, BBQ, etc.) — at least one concrete personal detail |
| Pre-Requisites section | Brief plain bullet list, 3–4 items max |
| Whistle-stop tour | A short section naming the topic's main features, 5–8 bullets, each one sentence. Reader leaves knowing the shape of the topic |
| Composing demo | One working example that combines at least three of the series' headline features — not a single-feature walkthrough |
| Honest moment | Mid-post sentence proving a real person built this ("I'll be honest", "first time I ran this", "this cost me an hour", etc.) |
| Verdict section | Near-end section answering "would I actually use this?" or "how I actually use this" — with worldview hook |
| What I'd do differently | One reflective line in the closer |
| Fellow hungovercoder closer | "Well done… fellow hungovercoder" or another peer-to-peer beat. Never ends with the word "Conclusion" |
| Themed example data | Synthetic data follows priority: alcohol → dogs → food → films → geek → music. Within a single post, theme stays consistent (a film post shouldn't carry beer-brand emails) |
| Corporate filler | No "leverage" (verb, unless ironic), "robust", "best-in-class", "solution" (noun for software), "seamless", "empower", "stakeholder", "journey" (unless literal), "production-grade" |
| AI tells | Zero em dashes (—) or each surviving one justified; no "It's worth noting…", "This is important because…", dramatic two-sentence pairs, or excessive bullet-heavy prose. Grep the file for — and count. |
| British spellings | flavour, colour, behaviour, organisation, prioritisation etc. — not American spellings |
| Links | Both the series link (https://hungovercoders.com/training/<slug>) and the GitHub repo link present and well-formed |
| Length | 1,500–2,500 words. Note actual word count vs target |
| Share image presence | image.path points at /assets/<slug>/link.png; verify the file exists at public/assets/<slug>/link.png |
Step 4 — Uniqueness check against the previous 2–3 posts
List src/content/blog/*.md (excluding _drafts/), sort by date descending, take the 2–3 most recent posts before the one under review. Capture each one's title pattern, opener formula, and three of its themed section headings. Flag any of:
- This post reuses the most recent post's title pattern (e.g. two consecutive Quick Beer with X)
- This post reuses the most recent post's opener formula
- This post reuses ≥ 2 themed headings from the most recent post
The voice guide is explicit: opinion-beat and closer repetition is brand consistency, but title pattern and opener repetition is monotony.
Step 5 — Write the report
Create ~/.claude/reviews/ if missing. Write the report to ~/.claude/reviews/blog-<slug>-YYYY-MM-DD.md (today's date). Structure:
# Blog Post Review — <slug> — <date>
## Summary
- File: <absolute path>
- Word count: <N> (target 1,500–2,500)
- M of 19 criteria passing
- Headline verdict in one sentence
## Criterion-by-criterion findings
For each criterion: PASS / FAIL with a quote-and-why on every FAIL.
## Uniqueness check
- This post's title pattern: <pattern>
- This post's opener formula: <formula>
- Previous post(s): <list with their patterns and formulas>
- Verdict: distinct / repeats previous
## Recommendations (priority order)
1. Highest-impact fix first — file location + exact change suggested
2. ...
Step 6 — Report to the user
Print to chat:
- Headline verdict (passing / needs work)
- Pass count out of 19 criteria
- The top 3 priority issues with file location and exact text to change
- Path to the full report
- One-line suggestion for what to fix first
Don't restate the full report in chat.
Notes on running this
- This skill is intentionally separate from
hc-launchso a post can be reviewed after writing —hc-launchruns the voice checks at write time, this gives an independent second pass. - For a series-wide review of training content (lessons in
learn.*repos), usehc-review-seriesinstead. - If the report file already exists for today, overwrite it — only the latest run matters.