# Pre-registration: does blur make a real photograph look AI-generated?

Written 2026-08-30, **before** computing any blur statistic on any image. Nothing in this file
was edited after `blur.py` was first run; the run stamps this file's sha256 into `blur.json`.

## Question

Among **real photographs**, does image blur predict a higher score from the Sieve AI-image
detector (`ft44s-2026-08-19`, sha256 `513da879…2204016`, threshold 0.65)?

## Where the hypothesis came from, and why that is a problem

Three of the seventeen entries to the fool-the-detector bounty cleared the detector's own 0.65
threshold. Looking at those three, they appeared to me to share shallow depth of field or subject
motion blur. That is a post-hoc impression, formed by one person, on n=3 — and two of the three
came from **the same submitter photographing the same dog**. It is a direction to test, not a
result. This document exists so that the test can come out against me.

## Rival hypothesis, pre-specified from prior art

Bellingcat's 2023 evaluation of a *different* detector ("AI or Not", by Optic) found 6 of 20 false
positives on competition photographs and attributed them to sharpness, fine detail, and **large**
depth of field. That predicts the **opposite sign** from mine. The two hypotheses are separable by
the sign of a single correlation, which is the only reason this study is worth running.

## Statistic

Variance of the Laplacian (VoL) of the greyscale image — the standard sharpness measure. High VoL
= sharp, low VoL = blurry. Reported as `log10(VoL)`. Computed on the image file **as stored**,
which is the blur a photographer would describe, not on the model's internal resized tensor.

## Study A — primary, n = 140

The 140 real photographs (`label == 0`) of the archived ft44s **`clean`** run
(`sieve-test/v0.10-ft44s/scores_clean.json`, images in `sieve-test/images/clean/`).

- Spearman ρ between `log10(VoL)` and detector score.
  - **H1 (mine)** predicts ρ **< 0**.
  - **H2 (Bellingcat)** predicts ρ **> 0**.
- **Source is the dominant nuisance variable.** 14 sources × 10 images; `dtd` (textures) and `lfw`
  (faces) differ from each other in both blur and score, so a pooled correlation would mostly
  measure which datasets are in the corpus. The primary estimate is the **within-source** Spearman:
  rank-residualise both variables inside each source, then correlate.
- **Cluster the interval by source.** The images nest in 14 datasets. 10,000 bootstrap resamples
  **of sources, not of images**. An image-level interval here would be a lie about the power.
- **Resolution is a second nuisance.** Four sources are 256 px thumbnails and VoL is per-pixel.
  Report the within-source ρ again with `log10(w·h)` additionally partialled out. **If the two
  estimates disagree in sign, the study is inconclusive and I say so** — no picking the one I like.

## Pre-registered bound — written before the first pass

I predict the within-source ρ is **negative with |ρ| ≥ 0.20**. Decision rule, fixed now:

| computed | verdict | what the page must then say |
|---|---|---|
| ρ ≤ −0.20 and cluster CI excludes 0 | `H1` | blur direction supported at this power |
| ρ ≥ +0.20 and cluster CI excludes 0 | `H2` | **my hypothesis is refuted**; the sharp/large-DoF explanation wins |
| CI includes 0, or the two estimates disagree in sign | `INCONCLUSIVE` | the direction is untested |
| cluster CI half-width > 0.30 | `UNDERPOWERED` | overrides any point estimate above |

**`UNDERPOWERED` is the outcome I expect.** Fourteen clusters is a small number and a
cluster-bootstrap over 14 units gives a wide interval; I am writing that down now so that a wide
interval cannot later be reported as a near miss. The verdict is computed by `blur.py`, written to
`blur.json`, and the page's prose is generated from that field rather than typed — the same
halt-on-drift arrangement already guarding the settlement figures in `gen_page.py`.

## Study B — secondary, descriptive only, n = 17

VoL of the seventeen bounty submissions against their scores. Declared **descriptive in advance**:
seventeen entries with three positives, two of which are one person and one dog, is not a sample
anything can be inferred from. **No p-value will be computed or quoted.** I will report the VoL
rank of the three flagged entries out of seventeen and nothing else.

## What I will not do

No re-scoring, no model inference, no new corpus, no statistics beyond those above, no subgroup
hunting. If the primary test is inconclusive I publish that it is inconclusive and stop.
