Evidence

AI detector accuracy, and everything that qualifies it

Most detectors publish one number on a marketing page. Here is the whole evaluation: how it was measured, what it means, where it breaks, and the script you can run yourself.

0.966
ROC AUC
Probability a generated document outranks a human one
90.5%
Accuracy
At the shipped 60% decision point, cross-validated
4.6%
False positives
Human documents above 70% (6.2% above 60%)
2,743
Documents
1,153 human across ten genres, 1,590 real machine outputs

How these were measured

Stratified five-fold cross-validation over 2,743 documents truncated to exactly 240 words. Humans: Gutenberg fiction, Wikipedia vital articles, pre-LLM arXiv introductions, Wikivoyage guides, informal prose, 741 topic-matched HC3 forum answers and 300 MAGE stories. Machine: 1,140 real ChatGPT answers (HC3) plus 450 multi-model story continuations (MAGE: LLaMA, OPT, GLM, GPT-J, NeoX, BLOOM, davinci, Flan-T5). For each fold the baselines — every human mean, every standard deviation, every generated mean in both registers — are refitted from the other four folds only, then used to score the held-out fold. No document is ever scored by a model that saw it during fitting. Truncating every document to the same length means the classifier cannot cheat by learning that one class is longer than the other.

The 46 signal measurements are combined by a linear fusion fitted by L2-regularised logistic regression, not by hand-set weights, and the coefficients are refitted inside every fold alongside the baselines. Each signal contributescoefficient × log-likelihood ratio, clamped to ±2.5 so no single measurement can decide a verdict alone; the report prints every coefficient and every contribution, and the arithmetic line reproduces the headline exactly.

Because the output is a logistic link on those terms, the percentage is a calibrated probability, not a rescaled score. On the held-out folds the Brier score is 0.069 and the expected calibration error is 2.1 points — when the engine says 80%, roughly four documents in five at that level really are generated. Positive predictive value is 95.2% at the 60% line and 96.2% at 70%.

Reproduce it with npx tsx scripts/evaluate.ts afternpx tsx scripts/build-corpus.ts. The corpus loader, the fold assignment and the metric code are all in the repository, and the machine side is independently downloadable (HC3 and MAGE).

Trade-off

Threshold curve

Detection is a dial, not a switch. Raising the threshold cuts false accusations and misses more generated text. We ship 60% and show you the interval so you can make your own call.

ThresholdGenerated text caughtHuman text falsely flaggedOverall accuracy
40%92.6%12.0%90.7%
50%90.8%8.8%91.0%
55%89.1%7.3%90.6%
60%default88.1%6.2%90.5%
65%86.5%5.4%89.9%
70%84.0%4.6%88.8%
75%81.8%3.2%88.1%
80%79.4%2.8%86.9%
87%73.2%1.8%83.7%
The number that matters

False positives by genre

An aggregate false-positive rate hides the only thing you actually need to know: which humans get flagged. So here it is, broken out. The flags concentrate in technical forum answers and modern stories — careful, impersonal, well-structured human prose.

Human genrenMean scoreFlagged above 60%Risk
Literary fiction
Project Gutenberg — 5 books, 40 excerpts
4010.2%0 / 40None observed
Encyclopedic
English Wikipedia — 40 vital articles
3012.5%2 / 307% — treat with care
Academic
Pre-LLM arXiv full-text introductions
157.5%1 / 157% — treat with care
Travel guides
Wikivoyage destination guides
197.2%0 / 19None observed
Informal / conversational
Hand-written modern prose
819.7%0 / 8None observed
Forum answers (general)
HC3 Reddit ELI5 humans
25017.1%17 / 2507% — treat with care
Forum answers (finance)
HC3 finance-board humans
25014.5%16 / 2506% — treat with care
Forum answers (medical)
HC3 medical-QA humans
1315.4%1 / 138% — treat with care
Forum answers (technical)
HC3 Wiki-CS humans
22815.9%16 / 2287% — treat with care
Modern stories
MAGE WritingPrompts humans
30022.3%18 / 3006% — treat with care
Plain English (probe, untrained)
Simple English Wikipedia — never trained on
1311.8%1 / 138% — treat with care
Generated text
1,140 real ChatGPT answers + 450 multi-model story continuations
159086.3%1400 / 1590 caught88.1% recall
Images

Image forensics, measured separately

The image engine is a different instrument with different numbers, and pooling the two would flatter it. First validation set: 29 camera originals with EXIF intact and 14 generated images, none of which carried provenance metadata — the hardest case for us. Every image was then re-tested after a lossless resize and after a quality-83 4:2:0 recompression, because that is what actually reaches you. A second, fully independent set of22 fresh Wikimedia Commons originals (Nikon, Canon and Samsung bodies, EXIF verified, never seen during development) was then run through the same pipeline: 22 / 22 cleared, mean 10.1%, zero false accusations.

29 / 29
Photographs cleared, original files
Mean score 9.3%. No false accusations.
14 / 14
Generated images caught, original files
Mean score 71.7%. The shipped v1 engine caught 2 of 8.
1.35
Best single-signal separation (d)
Cross-channel residual agreement, first set. Text's best is 1.69.

The same images, after the file has been through something

A detector that only works on originals is not a detector. These are the same 43 images re-run after the two transformations a real file is most likely to have suffered.

File conditionPhotos clearedFalse accusationsGenerated caughtTypical outcome
Original file29 / 29 (mean 9.3%)014 / 14 (mean 71.7%)Decisive both ways
Resized to 1408px, lossless27 / 29 (mean 32.8%)2 (6.9%)not tested11 / 29 inconclusive
Recompressed q83 4:2:028 / 29 (mean 46.6%)1 (3.4%)0 / 14 (46–55%)22 / 29 inconclusive

Read the bottom row carefully, because it is the honest headline: on a recompressed 4:2:0 JPEG the engine catches nothing. It does not falsely accuse either — almost everything lands in the inconclusive band, which is the correct behaviour when the evidence has been destroyed, but it is not a result you can use. If you need an answer from the pixels, give us the original file.

Why 4:2:0 specifically

Our strongest measurement asks whether the red, green and blue high-frequency residuals agree with each other. JPEG 4:2:0 stores colour at half resolution, averaging chroma over 2×2 blocks — which forces the channels to share their fine detail and manufactures the synthetic signature on genuine photographs. The separation collapses:

EncodingPhotosGeneratedSeparation (d)
PNG, no compression0.88590.97961.38
JPEG q95 4:4:40.88770.97931.37
JPEG q85 4:4:40.89960.98001.23
JPEG q95 4:2:00.96510.98850.86
JPEG q85 4:2:00.96740.98850.76

Note that quality barely matters and subsampling matters enormously — q95 4:2:0 is worse than q85 4:4:4. So the engine reads the JPEG SOF sampling factors, and when it finds subsampling it cuts those two tests to 12% of their weight and tells you it did, on the result card.

What this means, plainly

The pixel tier is now genuinely useful on original files and honest about saying nothing on degraded ones. It is still weaker than the text engine and always will be: text carries its statistics in the words themselves, while an image carries them in fragile high-frequency detail that every upload pipeline strips.

Where the image engine is strongest is still provenance. C2PA Content Credentials, EXIF generator tags, Stable Diffusion parameter blocks and ComfyUI workflow graphs are recovered reliably and reported as records rather than probabilities. When one is present the answer is not statistical at all.

The honest caveat on these numbers: 14 generated images is a small sample from a narrow set of model families. The cross-channel effect follows from how a latent decoder works, so we expect it to generalise across diffusion architectures — but a generator that adds per-channel noise after decoding would defeat it, and we have not been able to test one.

Video & audio

AI video detector and AI audio detector: honest limits, no invented numbers

We do not publish a video ROC AUC or an audio accuracy percentage — there is no public corpus to measure them on, and printing one would be fake data. What we publish instead is the method, the priors and the damping that keeps both honest.

V1

Video: frames reuse measured centres, temporal uses priors

Per-frame cross-channel agreement (d = 1.35) and spectral falloff reuse the image engine's measured centres on 29 camera originals versus 14 generated images. Temporal grain, flicker, stability and optical-flow centres are physics-based engineering priors with wide spreads — stated as heuristic in every report — because no verified camera-versus-generated video corpus exists.

A1

Audio: acoustic priors, clamped fusion, voice-gated reliability

Spectral, bispectral (vocoder phase coupling) and temporal voice centres are acoustic engineering priors, not corpus fits. Every LLR is clamped to ±4, the logit to ±6, and reliability requires voiced content — pure tones, silence and sub-second clips damp to low reliability instead of a saturated fake 100%.

V2

Video: provenance honesty matches images

Only a strong decoded-field record (container metadata, never a file name) may claim origin — a clip saved as “sora.mp4” is logged as a weak filename hint and can never trigger a conclusive verdict. When the frames clearly disagree, the record stays visible but unconfirmed at reduced weight, a disagreement finding is added, and reliability caps at low. A camera-maker tool string votes toward camera so the headline reflects both sides.

A2

Audio: contradiction handling and measured diagnostics

A TTS metadata claim the waveform contradicts stays unconfirmed with dampened scoring and a disagreement finding instead of deciding the verdict. MFCC voice-print shape, pause-length structure, clipping flag and channel facts are computed from every file and shown as measured-but-unfused diagnostics, so future validation can be checked against real numbers.

File conditionVideo behaviourAudio behaviour
Original export, several secondsDecisive when evidence agrees — full frame + temporal vote, high reliabilityDecisive when evidence agrees — full spectral + bispectral + temporal vote, high reliability
Recompressed feed / screen recordingGrain destroyed — damped toward prior, moderate to low reliabilityPhase relationships damaged — damped toward prior, moderate to low reliability
Very short clip (under ~2s video / 1s audio)Temporal tier starved — inconclusive, low reliability by designStatistics starved — inconclusive, low reliability by design
Metadata claims AI, frames/waveform disagreeUnconfirmed record, dampened score, disagreement finding, low reliabilityUnconfirmed record, dampened score, disagreement finding, low reliability

Practical rule: original exports give decisive video and audio readings; recompressed feeds, screen recordings and sub-second clips honestly return low reliability or inconclusive. A high score is a reason to inspect provenance and measurements — never proof, never punishment alone.

Limits

Six things this cannot do

Every one of these applies to every other detector on the market too. The difference is that we are telling you before you rely on it.

01

The AI side covers two registers, not all of them

1,140 real ChatGPT forum answers (HC3) plus 450 multi-model story continuations (MAGE: LLaMA, OPT, GLM, GPT-J, NeoX, BLOOM, davinci, Flan-T5). Every signal carries a centre for each register and scores against the nearer one. Missing: Claude, Gemini, recent GPT releases, base models without alignment tuning, non-English text, and heavily paraphrased output. A new model family can shift the fingerprint; the numbers above are for the families listed, not for AI in general.

02

Sentence-level localization is weak on subtle insertions

Measured on synthetic mixed documents with known ground truth: blatant marker-dense insertions rank well (sentence AUC 0.66–0.70) and the sentence map shows where to look, but same-register insertions without markers are near chance (AUC ≈ 0.5). The explicit run detector was retired for this reason — it added false confidence, not information. Treat the map as relative guidance, never as per-sentence verdicts. The composition bar is the more reliable mixed-authorship signal, but it too degrades when the human sentences are very short, because a short sentence carries little local evidence.

03

Paraphrasers work

Running generated text through a rewriting tool moves exactly the lexical statistics we rely on. Expect scores to fall substantially. We report which signals moved so you can see whether text looks human or merely looks laundered, but we will not always catch it, and no detector reliably does.

04

Non-native English carries elevated risk

This is the best-documented harm in the field. Detectors tuned on predictability systematically flag fluent-but-simple English. Our strongest signals are distributional rather than perplexity-based, which helps, and we hold the prior on the human side, which helps more. Our separate plain-English probe (SimpleWiki, never trained on) flags 1 of 13 at the default threshold. For text that is not English at all we do not score it: function-word coverage is measured, and below 22% the engine returns an explicit refusal instead of a verdict, because every calibration centre here was fitted on English prose. That does not make the risk zero for multilingual writers. If you are assessing a multilingual cohort, weight this accordingly — or do not use a detector at all.

05

Technical forum writing is the hardest human case

Look at the genre table: the false positives concentrate in technical forum answers and modern stories, not in literature or encyclopedias. Careful, impersonal, well-structured human prose is genuinely close to generated prose in measurable dimensions. If you are checking a how-to answer, read the interval, not the number.

06

Short text is mostly noise

Under about eighty words most signals are switched off because a windowed statistic on forty words measures sampling variance. We return a wide interval and a low reliability grade. Other tools will happily give you a confident percentage on a tweet. That confidence is not real.

Responsible use

If you are about to accuse someone

Please read this first. It is the part of the product we care most about getting right.

  • A score is evidence, not proof. There is no detector, anywhere, whose output constitutes proof of authorship. Treat a high score the way you would treat an anonymous tip: worth investigating, never sufficient on its own.
  • Read the interval, not the number. “72%, interval 48–88” and “72%, interval 68–76” are completely different situations. We show you which one you have.
  • Check the reliability grade. If it says low, the text was too short and the number means very little.
  • Look at what actually fired. If the score is driven by hard evidence — zero-width characters, chat scaffolding, a C2PA tag — that is a strong finding. If it is driven by a thin margin across correlated lexical signals, it is not.
  • Account for who wrote it. Multilingual students, autistic writers, people trained in formal technical register, and anyone using grammar-correction software all sit closer to the generated centroid through no fault of their own.
  • Ask, do not conclude. A conversation about process — drafts, sources, what the argument was meant to do — will tell you more in five minutes than any detector will ever tell you.