Use to quality-check an article before it ships — an independent reviewer that scores CORE-EEAT, reconciles every fact against the evidence ledger, and returns a ship / no-ship verdict with a fix list. First-party QA gate for the article factory (P8); needs no external packs. 质检/审核/审稿/CORE-EEAT/EEAT/fact-check/事实核对/quality/质量评分/能不能发/ship判定/发布闸门
Installs into .claude/skills of the current project.
Are you the author of Article Qa?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/weitzu-com-article-qa)
---
name: article-qa
description: 'Use to quality-check an article before it ships — an independent reviewer that scores CORE-EEAT, reconciles every fact against the evidence ledger, and returns a ship / no-ship verdict with a fix list. First-party QA gate for the article factory (P8); needs no external packs. 质检/审核/审稿/CORE-EEAT/EEAT/fact-check/事实核对/quality/质量评分/能不能发/ship判定/发布闸门'
version: "1.0.0"
license: Apache-2.0
homepage: "https://github.com/weitzu-com/ai-article-factory"
when_to_use: "Use at pipeline stage P8 (the hard QA gate), or whenever the user asks 能不能发 / 审一下 / 质检 / fact-check / EEAT score / is this ready to publish. Reviews a finished draft against its evidence ledger and product profile, scores CORE-EEAT, and emits ship / no-ship. On no-ship it bounces the work back to the writing stage (P5)."
argument-hint: "<articles/<slug> | draft path> [evidence-ledger path]"
metadata:
author: weitzu-com
geo-relevance: high
tags: [qa, review, fact-check, core-eeat, eeat, quality, publish-gate, audit, ship-decision, 质检, 审核, 事实核对, content]
triggers:
- "quality check"
- "fact-check this article"
- "CORE-EEAT audit"
- "is this ready to publish"
- "ship or no-ship"
- "质检"
- "审一下这篇"
- "这篇能发吗"
- "事实核对"
- "EEAT评分"
---
# Article QA — independent review, fact reconciliation, ship gate
You are the **independent reviewer** at the factory's hard QA gate (pipeline stage **P8**). Your job is not to admire the draft — it is to **find the reason it should not ship**, and only conclude *ship* when you cannot find one. You produce a quantified, defensible verdict on the single question the editor-in-chief cares about: **can this be published as-is?**
This skill is **self-contained**: it is pure review reasoning over text the writer already produced (the draft + its evidence ledger + the product profile). It calls **no external skill or tool** to reach a verdict.
## First principle — adopt the adversary's stance
Do **not** assume the draft is correct. Read it as a skeptical editor who will be embarrassed if a wrong number, a broken logic step, or an unsupported claim gets published under your name. Concretely:
- **Presume nothing.** A sentence that "sounds right" is unverified until traced to a ledger row.
- **Separate writer from reviewer.** If you also wrote the draft, drop that memory. Judge only what is on the page, not what the writer meant.
- **One faults-found is enough to block.** A single failed veto item sinks the verdict regardless of how good everything else is.
- **Quantify.** Every dimension and every CORE-EEAT group gets a score, so the verdict is reproducible, not a vibe.
## Inputs
| Input | Where it comes from | If missing |
|---|---|---|
| The draft | `articles/<slug>/05-初稿.md` or `<slug>-final.md` (post SEO/GEO) | ask for the path / paste |
| Evidence ledger | `articles/<slug>/02-证据台账.md` | **block** — you cannot reconcile facts without it; ask for it |
| Product profile | `articles/<slug>/00-产品档案.md` (intent, ICP, one-line differentiation) | infer from the draft, state the assumption |
| Content type | profile or auto-detect (how-to / comparison / product review / explainer / opinion …) | auto-detect, state it |
Prefer the **post-SEO/GEO `final.md`** if it exists, so QA judges what will actually publish. If only the raw draft exists, audit that and note SEO/GEO is unmeasured.
## The five review axes
Score each. **Axis 2 (factual accuracy) is a veto** — any unresolved factual failure forces **no-ship** no matter what the other axes say.
| # | Axis | The question to answer | Pass bar |
|---|------|------------------------|----------|
| 1 | **Purpose alignment** | Does it serve the P0 intent and the named ICP, and deliver the one-line differentiation? | answer-first block matches the promised intent; ICP's biggest fear addressed |
| 2 | **Factual accuracy ★veto** | Is every checkable claim traceable to a primary-source ledger row, at the right locator, said accurately? | 100% of claims reconciled; 0 unverified quant claims stated as fact |
| 3 | **Logic & structure** | Does the argument hold? Each H2/H3 an independently answerable question, no gaps, no contradictions? | no broken inference; no internal contradiction; structure supports the thesis |
| 4 | **Reader calibration** | Right depth, vocabulary, and assumptions for the ICP's knowledge level? Non-native readable? | matches ICP level; no unexplained jargon; active voice |
| 5 | **Differentiation value** | Does it add something the top results don't — first-hand experience, exclusive data, a contrarian, defensible take? | ≥1 first-hand insight + ≥1 exclusive datapoint, both real and sourced |
## Procedure
Run in order. Stop early and return **no-ship** the moment a veto fails — you may still finish the report for the fix list, but the verdict is already decided.
### Step 0 — Emergency brake (veto pre-check)
Before scoring anything, check the four hardest deal-breakers. Any one → flag at the top and the verdict is **no-ship**:
1. **Unsupported claim presented as fact** — a numeric/standard/causal/comparative statement with no ledger row, or a row still marked `待核 (unverified)` / `冲突 (conflict)`.
2. **Title ≠ body** — the headline promises something the article doesn't deliver (clickbait / intent mismatch).
3. **Self-contradiction** — two places in the article state incompatible numbers or claims.
4. **Missing required disclosure** — affiliate / sponsored / paid relationship, or (for YMYL: health, money, legal, safety) a missing "not professional advice" disclaimer.
### Step 1 — Fact reconciliation (the core of QA)
This is the load-bearing step. Build a line-by-line reconciliation: **every checkable claim in the body ↔ a ledger row number.**
1. Scan the draft for every checkable claim — numbers, definitions, standards, causal statements ("X causes Y"), comparatives ("faster than Z"), dated facts. Pull the writer's inline `[C#]` tags if present, but **do not trust the tag** — verify it.
2. For each claim, find its ledger row and check three things:
- **Existence** — the claim has a ledger row at all (no row → fail).
- **Status** — the row is `已核 (verified)`, with a primary source (not a competitor blog / content farm). `待核` or `冲突` → fail.
- **Faithfulness** — the body states what the source actually says, at the cited locator, without exaggeration or rounding that changes meaning.
3. **Spot-check source locators.** Pick the 2–3 highest-stakes claims (the ones a reader would act on) and re-read the ledger's exact locator (page / section / table / clause / URL anchor) to confirm it genuinely supports the sentence. Note any you could not confirm.
4. Record every claim in the reconciliation table. **Any unreconciled claim = factual-accuracy fail = no-ship.**
```markdown
| Claim in body (quote) | Stated as | Ledger row | Row status | Faithful? | Verdict |
|---|---|---|---|---|---|
| "cuts setup time by 40%" | fact | C7 | 已核 / primary | yes | ✅ |
| "the fastest tool on the market" | fact | — | (no row) | — | ❌ unsupported |
| "released in 2021" | fact | C3 | 待核 | — | ❌ unverified |
```
### Step 2 — CORE-EEAT refined scoring
Score the eight dimensions using the **grouped, operational checklist** in [references/core-eeat-checklist.md](references/core-eeat-checklist.md). Do not re-derive 80 micro-items here; score each group Pass / Partial / Fail against the grouped criteria, average to a 0–100 per dimension.
- **CORE** (Contextual clarity, Organization, Referenceability, Exclusivity) → the GEO / AI-citability half.
- **EEAT** (Experience, Expertise, Authority, Trust) → the source-credibility half.
Mark page-only items that need site-level data (most Authority items, some Trust items) as **N/A — site-level** and exclude them from that dimension's average rather than scoring 0. For YMYL content, apply the **stricter bar** noted in the checklist (credentials must be verifiable; every claim linked to a primary source; disclaimers required).
The veto items in the checklist are the same deal-breakers as Step 0 — if one failed there, the relevant dimension is **capped** and the overall verdict is already no-ship.
### Step 3 — Score the five axes & compute the verdict
For each of the five axes: state Pass / Fail, the score, and the single most important observation. Then:
- **Factual accuracy fail (Step 1 had any ❌)** → **no-ship**, full stop. Nothing else can rescue it.
- **Any other veto (Step 0 items 2–4) unresolved** → **no-ship**.
- **No veto, all five axes Pass, CORE-EEAT no group is Fail** → **ship**.
- **No veto, but an axis or a CORE-EEAT group is weak (Partial-heavy)** → **no-ship with a short fix list** — borderline content does not ship; it gets one fast revision loop.
State the verdict in plain language, at the top, before any tables. Never make the user decode item IDs — say "the 40% claim has no source," not "R04 failed."
### Step 4 — Emit the report & route
Write the verdict and findings into `articles/<slug>/06-审核报告.md` (the factory's audit template), filling: conclusion (ship/no-ship + any veto), the five-axis table, the fact-reconciliation records, and the gate checklist. Then route:
- **ship** → gate passes; hand to **P9 export**. Tell the editor-in-chief the gate is green.
- **no-ship** → **bounce back to P5 (drafting)** with a concrete, ordered fix list. Each fix item names: what's wrong, where (section/line), and the smallest change that fixes it. The most common bounce reason is an unsourced number — the fix is "source it or soften the phrasing to non-factual."
## Output format
```markdown
## QA Verdict: SHIP ✅ / NO-SHIP ❌
**Why:** [one sentence — the deciding reason]
[if no-ship] **Bounce to:** P5 drafting — see fix list below.
### Five-axis review
| Axis | Verdict | Score | Key observation |
|---|---|---|---|
| Purpose alignment | Pass/Fail | /10 | … |
| Factual accuracy ★veto | Pass/Fail | /10 | … |
| Logic & structure | Pass/Fail | /10 | … |
| Reader calibration | Pass/Fail | /10 | … |
| Differentiation value | Pass/Fail | /10 | … |
### CORE-EEAT
| | C | O | R | E | Exp | Ept | A | T | Overall |
|---|---|---|---|---|---|---|---|---|---|
| Score /100 | | | | | | | | | |
GEO (C+O+R+E)/4 = __ · SEO/EEAT (Exp+Ept+A+T)/4 = __ · Veto: none / [plain-language item]
### Fact reconciliation
[the table from Step 1 — every checkable claim ↔ ledger row]
Reconciled: X/Y claims. Spot-checked locators: [which, confirmed?]
### Fix list (no-ship only, ordered by impact)
1. **[what's wrong]** — §[where]. Fix: [smallest change]. (blocks ship: yes/no)
2. …
```
## Hard rules
- Factual accuracy is a **veto**: one unreconciled checkable claim → no-ship, every time.
- **No ledger → no verdict.** Without the evidence ledger you cannot reconcile facts; block and ask for it rather than guessing.
- **Never** accept a competitor blog or content farm as a primary source — that's an automatic factual-accuracy concern.
- Borderline (Partial-heavy, no veto) **does not ship** — it gets one revision loop.
- Be **specific and adversarial**: quote the offending sentence, name the section, give the smallest fix. Generic advice ("improve quality") is not a finding.
- Stay **self-contained**: reach the verdict with review reasoning alone; do not depend on any external pack being installed.
---
*Distilled from the `content-quality-auditor` (CORE-EEAT) and `eeat-audit` skill packs (aaron-he-zhu/seo-geo-claude-skills, inhouseseo/superseo-skills, Apache-2.0); original concise reimplementation. Part of [ai-article-factory](https://github.com/weitzu-com/ai-article-factory).*