CONTENT SKILL
Pre-publish editorial QA
Pre-publish QA that catches problems instead of ticking boxes: brief adherence, voice consistency, fact accuracy as a halt condition, an AI-content audit with eleven tells and six hallucination patterns, SEO and AEO compliance, link and schema validation, and sampling discipline at scale.
No key, no account needed
Claude CodeClaude.ai (zip upload)Anthropic API
npx skills add addition-labs/skills --skill editorial-qa
Run this in a terminal inside your project folder. Claude Code, Cursor and Codex then read the skill from where it lands.
- Step 01Open a terminal in your project folder
- Step 02Paste the command and press Enter
- Step 03Pick the agents to install to
- Step 04Ask the agent for the job; it reads the skill
editorial-qaaddition-labs/skillsMIT licencecommit a67dd34updated 2026-09-07
Its founding distinction is between thin QA ("I read it once, it’s fine"), thick QA (a 47-item checklist nobody completes honestly) and catch-problems QA, where each check earns its keep by naming the class of failure it catches. The litmus test: if the team cannot name the last three problems a check caught, cut the check.
The gates run in a fixed order because brief adherence is the cheapest one that can halt a piece, and fact accuracy halts too: hallucinated statistics, quotes, case studies and 404 citations do not ship. Voice and structure flag; SEO, AEO and schema mostly auto-fix.
For programmatic sets it replaces full audit with sampling: a fixed count per set-size band, automated structure and duplicate checks on everything, manual review on the sample, and a halt if more than 5% of sampled pages fail.
When to use it
The phrases that trigger it
Say any of these and an agent that has the skill installed will usually load it; you can also call it by name. The phrases are the skill’s own, from its description.
- editorial QA
- content review
- pre-publish review
- AI-content audit
- hallucination check
- content sampling
- voice consistency check
- brief adherence check
What’s inside
The playbook, section by section
Brief adherence, first
Keyword and cluster placement, SERP format match, audience, heading structure, required entities, specified internal links, named anti-patterns, success criteria.
Fact accuracy and citation discipline
Every number sourced or removed, every quote attributed to a real person, every case study real or labelled hypothetical, no citation laundering, sources under three years for fast topics.
The AI-content audit
Eleven tells (em-dash excess, throat-clearing openers, forced bilateral framing, bridging fluff, hedge stacking) and six hallucination patterns, plus voice drift by section four.
AEO checks
A 40 to 60 word answer after each H2 question, a TL;DR on pillars, FAQ where Q and A applies, cited statistics, consistent named entities, an attributable point of view.
Halt, flag, or auto-fix
Brief and fact gates halt; voice and structure flag; SEO, AEO and schema auto-fix. One QA owner per piece, not a committee.
Twelve considerations
The checklist for designing or auditing a QA process, ending with sequencing and threshold gating.
Reference files the agent loads on demand
10 files in the skill folder, read only when an instruction calls for one.
brief-adherence-checklist.md- Every brief field as a check: how to verify it and what failure looks like.
voice-consistency-patterns.md- Vocabulary, rhythm, stance and register, with sampling for long pieces and the voice-drift failure mode.
fact-accuracy-and-citation-discipline.md- Verification method, hallucination detection, citation rules, source-age guidelines.
structure-and-clarity-review.md- Lede patterns, sectioning, endings and the structural anti-patterns.
ai-content-audit-patterns.md- The eleven AI tells, six hallucination patterns and voice-drift detection, with a worked example.
seo-aeo-compliance-checklist.md- Search and answer-engine checks in one workflow.
internal-linking-and-schema-validation.md- Link discipline, anchor variation, schema patterns and validation.
qa-at-scale-patterns.md- Sampling, automated checks and threshold gating for programmatic-scale page sets.
qa-workflow-templates.md- Ownership, sequencing, halt versus flag versus auto-fix, escalation.
common-qa-failures.md- Eleven recurring QA failures with diagnosis and fix.
See it in action
One real run, in full
The request on the left went to the skill as installed. On the right is everything it returned, unedited; scroll inside the box to read it all.
Fetch https://addition-labs.com/resources/glossary/conversion-rate-optimization and run your pre-publish QA on it as a single editorial piece. The brief was: target query 'what is conversion rate optimization', audience ecommerce founders, definition-first, under 900 words, links to the CRO guide. Report per gate: halt, flag, or pass.
Editorial QA: "What is conversion rate optimization"
Piece: https://addition-labs.com/resources/glossary/conversion-rate-optimization (fetched 2026-09-11, HTTP 200, dateModified 2026-09-07) Brief as supplied: target query "what is conversion rate optimization" · audience ecommerce founders · definition-first · under 900 words · links to the CRO guide Shape: single editorial piece, full QA, gates run in the sequencing-template order.
Verdict by gate
| # | Gate | Verdict | One line |
|---|---|---|---|
| 1 | Brief adherence | HALT | Word limit missed: 1,047 words of body prose against a 900 cap (1,377 with tables and figure captions, about 1,590 with the FAQ). Every other brief field passes. |
| 2 | Fact accuracy | HALT | One sourced number is misquoted: the piece says "a 10 percent return fee", the Bizrate source says "a $10 return fee on a $50 purchase". Two further claims could not be verified against their cited pages in this run. |
| 3 | Structure and clarity | FLAG | Sections uneven (87 to 419 words); two figures sit under the wrong H2; one dangling "Those"; one sentence that contradicts the one before it. |
| 4 | AI-content audit | PASS | 0 em dashes in about 1,400 words; 0 of the 11 tells matched; sentence and paragraph rhythm varied. |
| 5 | Voice consistency | FLAG | Not checked against a voice system (none supplied). Observable: US and UK spelling mixed in one piece. |
| 6 | SEO and AEO | PASS with auto-fixes | Title 47 chars, meta 135 chars, both just under band; 2 of 5 H2 answer paragraphs outside 40 to 60 words; "4 min read" label understates the length. |
| 7 | Linking and schema | FLAG | Breadcrumb schema says "Glossarys"; one Sources entry describes the wrong page; one external link returned 403 to a scripted fetch (verify by hand). Links otherwise live, anchors varied, count in band. |
| 8 | Final read | done | Notes below. The piece is close; the halts are one cut and one number. |
Under the sequencing template a gate-1 halt would have stopped the review there. The remaining gates were run anyway so the return note covers everything in one round instead of two.
Gate 1: Brief adherence (HALT)
| Field | Result | Evidence |
|---|---|---|
| Target keyword | pass | "conversion rate optimization" in <title>, H1, first sentence, and H2 "What conversion rate optimization means". 10 exact-match uses across the page; no stuffing. |
| Search intent / SERP format | pass (SERP not checked) | Definitional query; the piece is a definition entry with formula, FAQ and pointer to the method. The brief gave no SERP format and I did not pull the SERP, so format match is asserted from the query shape only. |
| Target audience | pass | Vocabulary is store, orders, basket, average order value, dashboard, paid click. First and last 200 words both address a store owner, not a generic reader. |
| Heading structure | pass | Brief gave no outline. "Definition-first" is met: the definition is sentence one under the H1 and again as the first H2. |
| Required entities | n/a | Brief named none. |
| Internal links | pass | CRO guide (/resources/guides/cro) linked three times with three different anchors: "conversion rate optimization for ecommerce", "conversion rate optimization guide", and the "Where to go next" card. |
| Anti-patterns | n/a | Brief named none. (0 em dashes regardless.) |
| Success criteria / constraints | fail | Under 900 words. Counted three ways from the fetched HTML: body <p> prose from H1 to the Sources heading = 1,047; same span including the two tables, figure captions and table of contents = 1,377; adding the FAQ = about 1,590. No reading of "the piece" comes in under 900. |
Return note (gate 1). The piece misses the brief in one place: length. The brief specified under 900 words; the body prose is 1,047 before the FAQ. Cut roughly 150 to 250 words. The natural cuts are in the two long sections ("How the number is calculated", 387 words; "Why the rate alone can mislead you", 419 words), where the denominator argument is made three times (the GA4 table, the paragraph after it, and again in "Why CRO is not the same as SEO" via the three-percentages figure).
Gate 2: Fact accuracy (HALT)
Every external claim was checked against its cited page where the page could be fetched.
Verified against the primary source
- IRP Commerce, July 2026: all-market conversion rate 2.26% (table); top sector Arts and Crafts 5.23%, bottom Baby & Child 0.55%; 5.23 / 0.55 = 9.5x; basis stated on the page as "Transactions ÷ Sessions × 100 (Session Conversion Rate)". All four match the piece. Note for the writer: the same IRP page carries a narrative line saying "Session Conversion Rates: July 2026 ... 1.91% to 2.22%" beside the 2.26% table. The piece uses the table figure, which is defensible, but the source is internally inconsistent and a reader who clicks through may see 2.22 first.
- Google Analytics Data API schema:
sessionKeyEventRate= "The percentage of sessions in which any key event was triggered";userKeyEventRate= "The percentage of users who triggered any key event". The piece quotes both verbatim. - Littledata: "benchmarked 2,800 Shopify sites in 2023", "average conversion rate for Shopify was 1.4%". Matches, including the piece's note that the page does not state its denominator (confirmed: it does not).
- Bizrate Insights, 7 May 2026: sample 1,010 US adults, margin about ±3.1 points; "Forty-two percent of shoppers say they frequently or very often abandon a cart due to unexpected costs". The piece's "often or very often" is a fair paraphrase of "frequently or very often".
- Google Ads Help: CTR = "clicks ÷ impressions". Matches.
- Google Analytics Help (12946393): "Whenever someone performs an action that's meaningful to your business, you can measure the action as a key event." The screenshot caption on the page quotes this accurately.
- The Good: dated December 3, 2024 on the page; the page argues that business model and calculation method make benchmark comparison unreliable. Supports the claim it is listed for.
Misquoted (halt)
- Piece: *"A 10 percent return fee put 72 percent of them off ordering from you at all."*
Source: *"A $10 return fee on a $50 purchase is enough to drive 72% of shoppers to abandon the transaction."* Two problems. "10 percent" is not what the source says (a $10 fee on a $50 basket is 20 percent, and the survey asked about a dollar amount, not a rate). "Off ordering from you at all" is stronger than "abandon the transaction"; the source does add that 72% "will walk, half of them straight to a competitor", so the spirit is close, but the wording claims more than the survey measured. Fix: "A $10 return fee on a $50 order was enough for 72 percent of them to abandon the purchase."
Could not be verified in this run (flag; writer to confirm or soften)
- Unbounce sector medians, "7.1 percent median for food and beverage against 1.3 for fashion". The cited report page is gated and its sector figures are rendered client-side; the fetched HTML contains neither number nor the words "fashion" or "food". Only the all-industry median (6.6%) is visible. The numbers may well be in the full report; they are not on the page as cited.
- Kohavi, Deng and Vermeer, "A/B Testing Intuition Busters" (KDD 2022), used for "published success rates put even the strongest programs between 8 and 33 percent". The paper is real. The ACM link returned HTTP 403 to a scripted fetch and no open copy was reachable, so the 8 to 33 range was not checked against the text. Verify by hand before ship.
Citation discipline
- Nine sources, all dated on the page, with an honest age note on the two older ones (Littledata 2023, The Good 2024). Good.
- Littledata, Unbounce and Bizrate are vendor pages, but each reports its own dataset, so they are first-party for the numbers used. The Good is a commentary page, not data; it is used for an argument, not a number, which is acceptable, but it is the one hop that is closer to citation laundering.
- The Sources entry for Google Analytics Help is described as "How to measure key events: session-based and user-based rates". That page does not define the two rates; the Data API schema page (cited separately) does. Relabel the entry to what the page actually supplies: the definition of a key event.
Gate 3: Structure and clarity (FLAG)
- Lede: pass. The first 60 words define CRO, name the ecommerce action, give one sourced benchmark and state the method. A reader from the SERP has the answer before the table of contents.
- Sectioning: pass with one note. The H2 sequence (means, calculated, misleads, not SEO, where next) follows a reader's question order. "What conversion rate optimization means" at 87 words is thin for the section the query lands on, while the two middle sections run 387 and 419. This is the same imbalance the length cut has to solve.
- Figure placement: flag. The figure "One store, one month, three numbers that are all called a rate" and its caption ("Three correct percentages describing the same month. They differ because the denominator differs") sit under "Why CRO is not the same as SEO". The argument they illustrate lives in "How the number is calculated". Move them up.
- Ending: flag. The last prose section ends on a specific CTA ("the page changes that move it are our landing page optimization service"), which is the right kind of ending. But two proof blocks (the GA4 rate-columns figure and the key-event screenshot with its two-step caption) come after that CTA, so the section trails off into evidence for a point made two sections earlier. Either move the proof up beside the GA4 table or end the section on the CTA.
- Dangling reference: flag. "Why CRO is not the same as SEO" opens with "Those are all things you can do to the store." The preceding paragraph is a survey result about fees and returns, not a list of things to do. Name the antecedent or cut the sentence.
- Self-contradiction: flag. Under the GA4 table: "The two denominators differ by exactly the return visits your site gets" is followed two sentences later by "The size of the gap is not itself a count of anything." The first sentence says the gap is a count; the second says it is not. The second sentence is presumably about the gap between the two *rates*, not the two *denominators*. Say which.
- Reading flow: pass. Paragraph lengths run from 3 to 107 words, sentence counts from 1 to 12. No uniform-medium rhythm.
- Specificity: pass. Every benchmark carries a number, a source and a date. "Sector averages are not targets" and "Untested is not optimised" are positions, not hedges.
Gate 4: AI-content audit (PASS)
Checklist walked in full.
- Em dashes: 0 in the whole page (threshold 8 per 1,000 words; page is about 1,400 words of body). En dashes: 0.
- Opening: specific to the query, no fast-paced-world or whether-you-are opener.
- Closing: ends on a CTA, no "by following these steps" wrap-up.
- Bullets: none in the body; two tables carry the comparisons.
- "However" / "on the other hand": 1 / 0, and the one "however" is "however many times they come back", not a pivot.
- Forced bilateral framing: none found; the piece takes sides (RPV is "the one to steer by").
- Sentence-end filler, bridging fluff ("that said", "moving on"), hedge stacking: none found. "Often" appears twice, both inside the survey's own response scale.
- Rhythm: varied (see gate 3).
- Hallucination patterns: covered at gate 2. No invented company, no unattributed quote, no dead internal link.
0 of 7 checklist items flagged (halt threshold is 3).
Gate 5: Voice consistency (FLAG)
Not run against a voice system. No brand voice document was supplied with the request, so vocabulary, stance and register could not be checked against a defined standard. What follows is what is observable from the piece alone.
- Start, middle and end samples read in one register: plain, declarative, opinionated, short aphorisms used as section pivots ("Untested is not optimised." "Two metrics, one name." "Sector averages are not targets."). No mid-piece drift to model-default.
- Spelling is mixed: "optimization" ×13 (US) beside "optimised" ×2 (UK); "programs" beside "programme"; "behaviour" ×3 (UK). Pick one variety. Auto-fixable, but it is the kind of thing readers notice in a glossary that is defining the term.
- "mix up" as a noun should be "mix-up". Auto-fix.
Gate 6: SEO and AEO compliance (PASS with auto-fixes)
SEO
- Title "What Is Conversion Rate Optimization | Addition": keyword present, 47 characters (band 50 to 65). Auto-fix if you want the extra room; not a halt.
- One H1, matches title intent. Hierarchy clean: H1 then eight H2s, no H3s, no orphans.
- Meta description: keyword-aware, benefit-shaped, 135 characters (band 140 to 160). Auto-fix.
- Slug
/resources/glossary/conversion-rate-optimization: short, lowercase, keyword, no date. Canonical points to itself. - Alt text: three content images have descriptive alts; the one
alt=""is a decorative 22px icon, correct. - External links: all nine
target="_blank"withrel="noopener nofollow". Consistent. - "4 min read" label: at 1,377 body words that is closer to 5 to 6 minutes at 250 wpm. Auto-fix (or it corrects itself after the cut).
AEO
- Answer paragraph after each H2 (40 to 60 words): "means" 34, "calculated" 44, "misleads" 68, "not SEO" 54, "where to read" about 40. Two of five outside band; the "means" paragraph is the one that matters most for the target query and is the short one. Flag for the writer, not a halt.
- H2s are statements rather than questions. The brief did not ask for question headings; noting only that the FAQ block carries the question-shaped entries instead.
- FAQ with FAQPage schema: four genuine questions, answers match on-page text.
- Statistics with sources: yes, every number is cited (see gate 2 for the two unverified ones).
- Entities: GA4 metric names, IRP Commerce, Littledata, Unbounce, Bizrate, Kohavi, Core Web Vitals, Google Ads CTR. Consistent.
- Distinctive POV: yes, and attributable (steer by revenue per visitor; a rate rise with falling revenue is a false win).
- TL;DR: not required; this is a glossary entry, not a pillar.
Gate 7: Internal linking and schema (FLAG)
Links
- Brief-required link (CRO guide): present, three anchors, all different. Pass.
- Same-target anchor variation: CRO guide ×3, all varied. AOV ×2 (body link plus card), varied. Pass.
- Liveness: all 7 in-body internal targets and all 3 images return 200. All 9 external links return 200 except
dl.acm.org(403 to a scripted fetch with a browser user agent; ACM blocks bots, so this is probably not dead, but confirm in a browser). - Count: 7 in-body internal links in a 1,000 to 1,400 word piece. In band (3 to 7).
- Self-cannibalization:
/resources/guides/crotargets the method ("conversion rate optimization for ecommerce"); this entry targets the definition. The split reads as intentional. Not verified with a site search. - The Good is in the Sources list but the body claim it supports ("Traffic source, business model and calculation method all differ between you and the average") carries no inline link. Add one or leave the sources block to do the work; noting only that the other numbered claims are linked inline.
Schema (JSON-LD parsed without error; three types in one @graph)
- Article: headline, description, author and publisher (Organization), datePublished 2026-07-03, dateModified 2026-09-07, mainEntityOfPage. Dates agree with the visible "Updated 7 September 2026". No
imagefield; optional, but the page has three usable figures. - BreadcrumbList: position 3 is named "Glossarys". The visible eyebrow says "Glossary". Schema-content mismatch and a typo in one; auto-fix.
- FAQPage: four Question/Answer pairs, text matches the on-page FAQ. Answer 2 contains a literal
\n\n; harmless, but flatten it. - No rating, HowTo or other claims not on the page. Pass.
Gate 8: Final read
The piece does what the brief asked in every respect but length, and its one factual slip is a single misquoted number. The denominator argument is the piece's real contribution and it is made well; it is also made three times, which is where the 150 to 250 word cut comes from. Ship after the return note below is worked.
Return note to the writer (halt items)
This piece needs revision before round 2. Two halts:
- Length. Brief said under 900 words; body prose is 1,047. Cut 150 to 250 words from "How the number is calculated" and "Why the rate alone can mislead you", where the denominator point repeats.
- Bizrate misquote. Change "A 10 percent return fee put 72 percent of them off ordering from you at all" to match the source: a $10 return fee on a $50 purchase, and "abandon the purchase" rather than "off ordering from you at all".
And two unverified claims to confirm or soften: the Unbounce 7.1 / 1.3 sector medians (not on the cited page as fetched) and the Kohavi 8 to 33 percent range (cited page not reachable to me).
Flag-and-revise (inline)
- [Structure] Move the "three numbers that are all called a rate" figure from the CRO-vs-SEO section to "How the number is calculated".
- [Structure] End "Where to read the full method" on the CTA; move the two GA4 proof blocks up beside the GA4 table.
- [Clarity] "Those are all things you can do to the store": name what "those" refers to.
- [Clarity] "differ by exactly the return visits" vs "the gap is not itself a count of anything": say which gap (denominators vs rates) each sentence means.
- [AEO] Grow the first paragraph under "What conversion rate optimization means" from 34 to 40 to 60 words; it is the citation candidate for the target query.
Auto-fix log (no writer action)
- Breadcrumb schema "Glossarys" to "Glossary".
- Sources entry for Google Analytics Help relabelled to "key event definition" (the two-rate definition is the Data API schema entry).
- Spelling normalised to one variety (optimization/optimised, program/programme, behaviour).
- "mix up" to "mix-up".
- Title padded toward 50 to 65 characters; meta description toward 140 to 160.
- "4 min read" recomputed after the cut.
\n\nflattened in FAQ answer 2.
What this review did not do
No SERP pull for the target query, so intent and format match rest on the query shape. No brand voice document, so gate 5 is observational only. No schema validator run beyond parsing the JSON-LD; required fields were checked by eye against schema.org. The ACM and Unbounce claims are open until someone opens those pages in a browser.
What this run could not do
No brand-voice document for gate 5 (the check is observational only), no SERP pull for the intent and format check, no schema validator run (checked by parsing and by eye), and the Unbounce sector medians and the Kohavi 8 to 33 percent range could not be verified against their cited pages (gated or bot-blocked), so they are reported as unverified, not false.
Method behind it
Where we would differ, and why
Our content engine runs a version of this before every piece ships, as fifty-odd deterministic gates rather than a reviewer’s checklist: filler words, defence language, source-scaffold sentences, repeated sentences, heading terms, readability. The skill is the human version of that list; our guide describes why each gate exists.
The AEO checklist asks for FAQPage schema where Q and A applies. Google limited FAQ rich results to government and health sites in 2023 and stopped them for all sites in May 2026; the schema still clarifies entities and does nothing for a visible result. The claude-seo seo-content skill states this; editorial-qa does not.
Its AI-tells list flags excessive em-dashes. Our site rule bans them entirely in copy, which makes that check moot here and useful everywhere else.

SKILL.md
The file the agent reads
Written by RampStack and published under the MIT licence. Read the full file (3,134 words) on GitHub, at the commit we reviewed: rampstackco/claude-skills/skills/editorial-qa/SKILL.md. The reference files are in the same folder.
Questions
Questions people ask before installing
Can it QA a piece with no brief?
Partly. Fact Accuracy, Structure, AI Audit, SEO and AEO gates run; brief adherence cannot, and the skill tells you to fix briefs first.
Does it detect AI-written text?
It looks for patterns, not authorship. Its bar is "would a careful human editor have shipped this", and it says AI was almost always used anyway.
How does sampling work for 1,000 pages?
A fixed sample size per band from the reference file, balanced across data shape; automated checks on all pages; manual review of the sample; generation halts above a 5% failure rate.



