| 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:
- Unsupported claim presented as fact — a numeric/standard/causal/comparative statement with no ledger row, or a row still marked
待核 (unverified) / 冲突 (conflict).
- Title ≠ body — the headline promises something the article doesn't deliver (clickbait / intent mismatch).
- Self-contradiction — two places in the article state incompatible numbers or claims.
- 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.
- 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.
- 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.
- 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.
- Record every claim in the reconciliation table. Any unreconciled claim = factual-accuracy fail = no-ship.
| 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. 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
## 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.