Reverse Turing Test

What was measured, how, and where it fails.

Results

ModelAccuracyF1ROC AUCvs. baseline
Loading…

How the ensemble is built

  1. Base models train on the training split.
  2. The meta-classifier is fitted on the validation split, using the three models' output probabilities as its only inputs.
  3. Every number above is measured on the test split.

The meta-classifier is deliberately fitted on data the base models never trained on. Fitting it on the training split instead would let it learn from their overconfidence on rows they had memorised, and the ensemble would look better than it is.

The three signals

Transformer (DistilBERT)
Fine-tuned on the training split, reading up to 256 tokens. Catches phrasing and semantics that statistics miss, but degrades on text unlike anything it trained on.
Stylometric (logistic regression)
Five features: average sentence length, sentence-length variance, average word length, vocabulary richness, punctuation density. Cheap, interpretable, and surprisingly hard to beat — but it needs enough text for the statistics to stabilise.
Visual CNN
Renders each text as a 224×224 heatmap — one row per sentence, one column per measurement — and classifies the resulting texture. It sees structural rhythm rather than words.

Running in your browser

There is no inference server. Both neural models were converted to int8 ONNX — about four times smaller than the originals — and run through ONNX Runtime Web via WebAssembly, while the stylometric and stacking models are a few lines of arithmetic. The text you paste never leaves your device.

The JavaScript port reproduces the Python pipeline exactly, down to float32 rounding in the heatmap encoding and OpenCV's colour-map table. A fixture of Python-generated values is replayed against it in web/parity.html, so a port that drifted would fail loudly rather than quietly degrade predictions.

How these numbers are checked

Known limitations

Source on GitHub