E-E-A-T

Human-in-the-Loop Editing and Fact-Checking

⏱ 16 min

Lesson 3 named the practices E-E-A-T requires, a real byline, real citations, a real subject-matter review. This lesson turns that into an actual editorial pipeline: a sequence where AI produces a draft, and a human does specific, well-defined work on top of it before anything gets published. The goal isn’t “have a human skim it,” it’s a workflow with a clear job at each stage, and a small WordPress ability that helps a human fact-checker by surfacing the claims in a draft that actually need checking, rather than leaving them to reread the whole thing and hope they notice.

What you'll learn in this lesson
A five-stage human-in-the-loop editorial workflow
From AI draft through to publish, with a specific human responsibility at each stage.
Why "a human edited it" isn't the same as "a human fact-checked it"
Two different jobs that get conflated in practice, with different failure modes.
A claim-extraction ability that supports the fact-checking stage
Using wp_ai_client_prompt() to pull out checkable factual claims from a draft, for a human to verify, not auto-approve.
How this connects to Course 6's content-generation tools
This workflow wraps around the blog post generator and SEO optimizer built there, it doesn't replace them.
Prerequisites

Course 6’s automated blog post generator project (or an equivalent AI drafting step of your own), and Course 1’s wp_register_ability() basics. This lesson adds a review stage around existing drafting tools, it doesn’t rebuild them.

Step 1: The five stages, and who’s actually responsible for each

1
AI draft
A model produces a first draft, using Course 6's generator or your own prompt. This stage is fast and cheap, and it's where an AI produces the most output relative to time spent.
2
Claim extraction
Before a human reads for tone or flow, a separate pass pulls out every checkable factual claim in the draft into a discrete list. This is the ability built in Step 3.
3
Human fact-check
A person verifies each extracted claim against a real source, not against their general sense that it sounds right. This is a distinct job from editing prose.
4
Human expertise and experience pass
A subject-matter-qualified person adds or confirms anything Lesson 3 flagged: firsthand notes, technical nuance a generic draft would miss, corrections a non-expert wouldn't catch.
5
Publish with attribution
A named author byline goes on the piece, reflecting who actually did the expertise and experience pass, not a generic or absent byline.

The critical separation is between stage 3 and stage 4. “A human read this and it sounds fine” is not fact-checking, it’s a fluency check, and fluent, wrong content is exactly what an unreviewed AI draft can produce. Fact-checking means confirming specific claims against sources outside the draft itself.

Editing for tone is not fact-checking, even when it feels like review happened

It’s easy to ship a draft that a human genuinely read and improved, tightened a sentence, fixed a typo, and still contains a wrong statistic or a misattributed quote, because nobody at any stage checked that specific claim against a source. If your workflow doesn’t have an explicit, separate fact-checking stage, it likely doesn’t have real fact-checking happening at all, however much human attention went into the piece.

Step 2: Why claim extraction earns its place as a separate ability

A human fact-checker reading a full draft for the first time has to do two things at once: read for meaning, and simultaneously notice every specific, checkable assertion buried in normal prose. That’s a lot to hold in attention at once, and specific numbers, dates, and attributions are easy to skim past when they’re embedded in otherwise-fluent sentences. Pulling every checkable claim into its own list first turns fact-checking into a task with a visible, completable checklist instead of an open-ended “read carefully” instruction.

Step 3: Build the claim-extraction ability

The ability takes a draft’s post ID, reads its content, and asks a model to extract factual claims worth checking, specifically excluding opinion and stylistic statements that have nothing to verify.

// File: content-review/content-review.php
add_action( 'wp_abilities_api_init', function () {
	wp_register_ability(
		'content-review/extract-claims',
		array(
			'label'               => __( 'Extract checkable claims from a draft', 'content-review' ),
			'description'         => __( 'Reads a draft post and returns a list of specific, checkable factual claims (statistics, dates, names, attributions) for a human fact-checker to verify. Does not verify anything itself.', 'content-review' ),
			'category'            => 'content',
			'input_schema'        => array(
				'type'       => 'object',
				'properties' => array(
					'post_id' => array( 'type' => 'integer' ),
				),
				'required'   => array( 'post_id' ),
			),
			'output_schema'       => array(
				'type'       => 'object',
				'properties' => array(
					'claims' => array(
						'type'  => 'array',
						'items' => array(
							'type'       => 'object',
							'properties' => array(
								'claim'   => array( 'type' => 'string' ),
								'context' => array( 'type' => 'string' ),
							),
						),
					),
				),
			),
			'permission_callback' => function ( $input ) {
				return current_user_can( 'edit_post', $input['post_id'] );
			},
			'execute_callback'    => 'content_review_extract_claims',
			'meta' => array(
				'annotations' => array( 'readonly' => true ),
				'mcp'         => array( 'public' => true ),
			),
		)
	);
} );

function content_review_extract_claims( $input ) {
	$post = get_post( $input['post_id'] );
	if ( ! $post ) {
		return new WP_Error( 'not_found', 'No post found with that ID.' );
	}

	$body = wp_strip_all_tags( $post->post_content );

	$prompt = <<<PROMPT
Read this draft and list every specific, checkable factual claim it makes: statistics,
dates, named studies, attributed quotes, named people or organizations, and specific
numeric assertions. Exclude opinions, stylistic statements, and generic advice that has
nothing concrete to verify.

For each claim, return the claim itself and a short snippet of surrounding context so a
human fact-checker can find it in the draft.

Draft:
{$body}
PROMPT;

	$response = wp_ai_client_prompt( $prompt )
		->using_model_preference( 'anthropic/claude', 'openai/gpt', 'google/gemini' )
		->generate_text();

	if ( empty( $response ) ) {
		return new WP_Error( 'empty_response', 'The AI provider returned no claims.' );
	}

	return array( 'claims' => content_review_parse_claims( $response ) );
}

function content_review_parse_claims( $response ) {
	$lines  = array_filter( array_map( 'trim', explode( "\n", $response ) ) );
	$claims = array();

	foreach ( $lines as $line ) {
		if ( preg_match( '/^[-*\d.]+\s*(.+)/', $line, $m ) ) {
			$claims[] = array(
				'claim'   => $m[1],
				'context' => $m[1],
			);
		}
	}

	return $claims;
}

This ability never touches the post. It reads content and returns a list, which is why meta.annotations.readonly is true, the same pattern the SEO Content Optimizer used in Course 6. The human fact-checker takes that list and does the actual verification against real sources, the ability’s job ends at surfacing what needs checking.

Step 4: Wiring it into the workflow

Run claim extraction right after the AI draft stage
Before a human reads for tone, so the checklist exists from the start of review.
Give the fact-checker the claims list alongside the draft
Not instead of the draft, they still need context, but the list keeps specific claims from getting lost in fluent prose.
Require each claim marked checked or flagged before publish
A simple editorial rule: no claim goes out unverified or silently ignored.
Route flagged claims to the subject-matter reviewer from Lesson 3
A generalist fact-checker can confirm a citation exists, they may need a specialist to confirm a technical claim is actually correctly stated.

Recap

A human-in-the-loop workflow needs a clear job at each stage, not just “a human looked at it.” AI produces the draft, a claim-extraction ability surfaces every specific factual assertion worth checking, a human verifies those claims against real sources, a qualified person adds or confirms genuine expertise and experience, and only then does a named byline go on the piece. The content-review/extract-claims ability built here stays strictly read-only. It supports the fact-checking stage, it never replaces the human judgment that stage actually requires.

Resources & further reading

← Building E-E-A-T Into an AI Content Workflow What Generative Engine Optimization Actually Means →