# RA-Bench: receipt extraction, fake detection, evidence and duplicates

We build Receipt Audit and we run this benchmark. Our engine is one of the targets, so read it as a vendor benchmark: headline numbers come from a held-out set nobody tuned on, every run is kept (incomplete ones included), and losses are listed first. The public cases, their labels, every target's outputs and the harness are available on request: email hello@godard.me for them, to reproduce a number or to dispute one.

Reproduce: `cd apps/receipt-check && nub run bench run --cases benchmarks/receipt-audit/heldout-cases.jsonl --split private --targets self,diy:claude-haiku-5.5,diy:gemini-3.8-flash,decision:gpt-6-luna --reps 3`. Dispute a number: hello@godard.me.

**Preliminary · n=151 cases · 3 repetitions · run 2026-10-18 · suite 0.2.0 · private split**

Run `20261018T165538Z-0363fe`, 2026-10-18T16:55:38.100Z to 2026-10-18T17:12:34.377Z. Dataset hash `9cfa2c4c2d6e596579470768c8b182ffc7d264123e0c0fc7ee707a6de9dd6d79`, git `36dc1354ad557fcc6490a5cd144f8960073941db`.
Data: [this summary as JSON](https://receiptaudit.com/benchmarks.json) · [this run's JSON](https://receiptaudit.com/benchmarks/runs/20261018T165538Z-0363fe.json) (never changes) · [JSON Schema](https://receiptaudit.com/benchmarks/schema.json) · [web page](https://receiptaudit.com/benchmarks)

## Where we lose

- Price: $0.016 a check, 16× a plain Claude Haiku call ($0.0010), 4× plain Gemini 3.8 Flash ($0.0044) and about 90× the OpenAI decision model ($0.00017). What it buys is listed under the wins.
- Speed and consistency against the decision model: it answers in 0.4 s at the median (ours 4.1 s) and gave the same decision in every repetition (ours 97%). It catches far fewer fakes (see the wins).

## Where we win

- Duplicates: 99% of resubmitted copies recognised (re-encoded, resized, cropped, rotated, screenshotted and re-photographed; n=30), with 4.5% false matches on look-alike receipts (n=11). Plain prompts and decision models have no memory across checks and can't do this.
- Proof: 53% of fakes were caught with evidence a caller can re-check without trusting a model (amounts that don't add up, an AI or receipt-generator tag in the file, an edit record, a duplicate match); 2.5% of genuine receipts carried such a finding. A plain prompt or a decision model only gives an opinion.
- Against the OpenAI decision model: 78% of fakes caught at a 5% false-flag rate vs 35%, and a ROC AUC of 0.88 vs 0.64.
- Speed against plain prompts: a median of 4.1 s vs 6.6 s (Gemini) and 8.6 s (Claude).

## Ties

- Catching fakes against plain prompts, ahead but not proven: 78% caught at a 5% false-flag rate vs 65% (Gemini) and 53% (Claude); ROC AUC 0.88 vs 0.81. With 40 fakes the 95% intervals overlap.
- Expected cost of decisions per 1,000 receipts at risk ≥ 0.7 (1% of receipts fake, $100 per missed fake, $17 per false flag; sources in the methodology): $483 vs $683 (Gemini), $753 (Claude), $800 (decision model) and $1,000 for approving everything. The intervals overlap with the plain prompts.
- False flags at risk ≥ 0.5: 2.1% of genuine receipts vs 1.2% (Gemini), 2.9% (Claude) and 0% (decision model); not a proven difference.
- Extraction: 97% of documents with every labelled field right, vs 94% for both plain prompts.
- Naming the edited field on edited fakes: 33%, vs 30% (Gemini) and 37% (Claude).
- Calibration error of the risk: 8%, vs 10–12% for the plain prompts and 18% for the decision model.

## Targets

Every target ran the same cases with the same scoring and timeout; only the target changes.

| Target | Kind | Version | Prices as of | Not supported |
|---|---:|---:|---:|---:|
| Receipt Audit (Claude Haiku 5.5) (`self`) | ours | `engine.0.2.1+anthropic/claude-haiku-5.5+prompt.9a2a5877e979+git.36dc1354ad55` | 2026-10-18 | — |
| Claude Haiku 5.5, plain prompt (`diy:claude-haiku-5.5`) | DIY baseline | `claude-haiku-5-5@claude-code-cli+prompt.512dfb3893be+git.36dc1354ad55` | 2026-10-18 | Arithmetic and tax checks, Duplicates, Proof, not opinion |
| Gemini 3.8 Flash, plain prompt (`diy:gemini-3.8-flash`) | DIY baseline | `google/gemini-3.8-flash+prompt.512dfb3893be+git.36dc1354ad55` | 2026-10-18 | Arithmetic and tax checks, Duplicates, Proof, not opinion |
| OpenAI decision model (gpt-6-luna), asked if it's fake (`decision:gpt-6-luna`) | DIY baseline | `openai/gpt-6-luna-decisions+prompt.977e84771afc+git.36dc1354ad55` | 2026-10-12 | Field extraction, Arithmetic and tax checks, Duplicates, Proof, not opinion |

Configuration of `self`:

```json
{
  "engine": "ReceiptChecks (apps/receipt-check/lib/server/ReceiptChecks.ts), in process",
  "engineVersion": "0.2.1",
  "production": true,
  "model": "anthropic/claude-haiku-5.5",
  "prompt": "apps/receipt-check/lib/receipts/model.ts (INSTRUCTIONS, USER_PROMPT and the ModelAnalysis output schema)",
  "promptSha256": "9a2a5877e9795c37df6d2c2cb89f56cae64b76ae10bbd672cc1ab6bb41426a71",
  "instructionsSha256": "da94bf411e9d3c47462a4d77b59a373a2b478a3e6afffb86889dc5e93ad452fb",
  "hashVersion": 2,
  "endpoint": "https://ai-gateway.vercel.sh/v1/chat/completions",
  "reasoningEffort": "low",
  "structuredOutput": true,
  "modelTimeout": "90 seconds",
  "modelRetries": "2, on errors effect/ai marks retryable",
  "filePreparation": "upright, at most 3072 px and 3.75 MB (lib/receipts/model.ts)",
  "duplicateNetwork": "the production Convex functions on an in-memory backend, empty at the start of each repetition",
  "submitter": "one account per case (the case id)",
  "gitSha": "36dc1354ad557fcc6490a5cd144f8960073941db",
  "pricePerCheckUsd": 0.01633333333333333,
  "cost": "cost_per_check_usd is what a caller pays Receipt Audit per check: the list price of the smallest credit pack (credits-3k: $49 for 3,000 checks, $0.0163 per check). model_cost_per_check_usd (and each result's costUsd) is the engine's own model call: tokens × the AI Gateway list price on the price date."
}
```

Configuration of `diy:claude-haiku-5.5`:

```json
{
  "transport": "claude-code-cli",
  "endpoint": "http://127.0.0.1:8789/v1/messages (claude-local: one headless `claude -p` per call, no tools, no MCP, no settings, empty cwd)",
  "billing": "subscription",
  "cli": "claude 2.1.296",
  "thinking": "Claude Code default (adaptive; can't be fully disabled via the CLI)",
  "ignored": [
    "max_tokens"
  ],
  "costUsd": "API-equivalent: the reported tokens × the AI Gateway list price, i.e. what the check costs when called through the API",
  "usage": "as the CLI reports it, including Claude Code's own cached system prompt (about 3,500 tokens, mostly cache reads); inputTokens counts uncached, cache-read and cache-write tokens",
  "model": "claude-haiku-5-5",
  "max_tokens": 4096,
  "message": "one user turn: the file (image block, or document block for a PDF), then the prompt",
  "rateLimits": "HTTP 429 (a subscription limit on claude-local) is retried with backoff like a transport error",
  "prompt": "apps/receipt-check/bench/prompt.ts (DIY_PLAIN_PROMPT)",
  "promptSha256": "512dfb3893be5aa7f89ff7be2259d8f9c94c948fe8b2d6e3dca9bc6f5889bc37",
  "gitSha": "36dc1354ad557fcc6490a5cd144f8960073941db",
  "cost": "cost_per_check_usd and model_cost_per_check_usd are both the API-equivalent token cost: tokens × the AI Gateway list price on the price date"
}
```

Configuration of `diy:gemini-3.8-flash`:

```json
{
  "endpoint": "https://ai-gateway.vercel.sh/v1/chat/completions (Vercel AI Gateway, OpenAI-compatible)",
  "model": "google/gemini-3.8-flash",
  "max_tokens": "not set (provider default)",
  "reasoning": "not set (provider default)",
  "temperature": "not set (provider default)",
  "message": "one user turn: the file (image_url part, or a file part for a PDF), then the prompt",
  "prompt": "apps/receipt-check/bench/prompt.ts (DIY_PLAIN_PROMPT)",
  "promptSha256": "512dfb3893be5aa7f89ff7be2259d8f9c94c948fe8b2d6e3dca9bc6f5889bc37",
  "gitSha": "36dc1354ad557fcc6490a5cd144f8960073941db",
  "cost": "cost_per_check_usd and model_cost_per_check_usd are both the API-equivalent token cost: tokens × the AI Gateway list price on the price date"
}
```

Configuration of `decision:gpt-6-luna`:

```json
{
  "endpoint": "https://ai-gateway.vercel.sh/v1/decisions (Vercel AI Gateway → OpenAI Decisions API, public beta)",
  "model": "openai/gpt-6-luna-decisions",
  "questions": "apps/receipt-check/bench/prompt.ts (DECISION_QUESTIONS): a predicate (is it fake) and two choices (how it was made, which part looks altered)",
  "questionsSha256": "e17d0fb5b77b6147ffdb12fa1e22ed2dc99e5edec56d69731f297ad2c86aca37",
  "input": "one user message: DECISION_INPUT_TEXT and the image as a base64 data URL; a PDF's first page rendered at 150 dpi (pdftoppm)",
  "risk": "the predicate's probability",
  "reasons": "the two choices, in plain words",
  "cost": "input tokens × $0.1 per 1M (no output charge), price of 2026-10-12",
  "gitSha": "36dc1354ad557fcc6490a5cd144f8960073941db"
}
```

## Results

Each cell: value (95% interval), n. "not supported" means the target can't do the task by construction.

### Field extraction

| Metric | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Merchant right (higher is better) | 98.2% (93.2–99.6%), n=95 | 97.9% (92.6–99.4%), n=95 | 98.2% (93.2–99.6%), n=95 | not supported |
| Date right (higher is better) | 98.8% (94.6–99.7%), n=112 | 97.0% (92.0–98.9%), n=112 | 99.1% (95.1–99.8%), n=112 | not supported |
| Currency right (higher is better) | 100.0% (95.8–100.0%), n=88 | 100.0% (95.8–100.0%), n=88 | 100.0% (95.8–100.0%), n=88 | not supported |
| Subtotal right (higher is better) | 93.8% (71.7–98.9%), n=16 | 89.6% (66.4–97.4%), n=16 | 85.4% (61.6–95.5%), n=16 | not supported |
| Tax right (higher is better) | 100.0% (83.9–100.0%), n=20 | 100.0% (83.9–100.0%), n=20 | 100.0% (83.9–100.0%), n=20 | not supported |
| Total right (higher is better) | 100.0% (96.9–100.0%), n=121 | 99.4% (95.9–99.9%), n=121 | 98.1% (93.8–99.4%), n=121 | not supported |
| Receipt number right (higher is better) | 100.0% (74.1–100.0%), n=11 | 100.0% (74.1–100.0%), n=11 | 100.0% (74.1–100.0%), n=11 | not supported |
| All key fields right (higher is better) | 96.7% (91.8–98.7%), n=121 | 93.7% (87.8–96.8%), n=121 | 93.9% (88.2–97.0%), n=121 | not supported |
| Line items (F1) (higher is better) | 97.3% (93.6–100.0%), n=20 | 93.4% (86.9–98.5%), n=20 | 91.1% (83.3–97.7%), n=20 | not supported |
| Valid structured output (higher is better) | 100.0% (96.9–100.0%), n=121 | 100.0% (96.9–100.0%), n=121 | 100.0% (96.9–100.0%), n=121 | not supported |
| Price per check (lower is better) | $0.0163, n=453 | $0.0010, n=453 | $0.0044, n=453 | not supported |
| Latency p95 (lower is better) | 8,907 ms, n=453 | 13,551 ms, n=453 | 15,763 ms, n=453 | not supported |

#### Field extraction: Merchant right by printed amounts

| Printed amounts | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Add up | 98.2% (92.1–99.6%), n=75 | 97.3% (90.8–99.3%), n=75 | 97.8% (91.4–99.5%), n=75 | not supported |
| Don't add up | 98.0% (78.5–99.9%), n=17 | 100.0% (81.6–100.0%), n=17 | 100.0% (81.6–100.0%), n=17 | not supported |

#### Field extraction: Date right by printed amounts

| Printed amounts | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Add up | 98.6% (93.5–99.7%), n=92 | 97.5% (91.9–99.2%), n=92 | 98.9% (94.1–99.8%), n=92 | not supported |
| Don't add up | 100.0% (82.4–100.0%), n=18 | 94.4% (74.2–99.0%), n=18 | 100.0% (82.4–100.0%), n=18 | not supported |

#### Field extraction: Currency right by printed amounts

| Printed amounts | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Add up | 100.0% (95.0–100.0%), n=73 | 100.0% (95.0–100.0%), n=73 | 100.0% (95.0–100.0%), n=73 | not supported |
| Don't add up | 100.0% (78.5–100.0%), n=14 | 100.0% (78.5–100.0%), n=14 | 100.0% (78.5–100.0%), n=14 | not supported |

#### Field extraction: Subtotal right by printed amounts

| Printed amounts | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Add up | 97.0% (69.9–99.8%), n=11 | 84.8% (55.5–96.2%), n=11 | 78.8% (49.2–93.4%), n=11 | not supported |

#### Field extraction: Tax right by printed amounts

| Printed amounts | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Add up | 100.0% (77.2–100.0%), n=13 | 100.0% (77.2–100.0%), n=13 | 100.0% (77.2–100.0%), n=13 | not supported |

#### Field extraction: Total right by printed amounts

| Printed amounts | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Add up | 100.0% (96.3–100.0%), n=100 | 100.0% (96.3–100.0%), n=100 | 100.0% (96.3–100.0%), n=100 | not supported |
| Don't add up | 100.0% (82.4–100.0%), n=18 | 96.3% (76.8–99.5%), n=18 | 87.0% (65.0–96.0%), n=18 | not supported |

#### Field extraction: All key fields right by printed amounts

| Printed amounts | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Add up | 97.0% (91.5–99.0%), n=100 | 94.0% (87.5–97.2%), n=100 | 95.0% (88.8–97.8%), n=100 | not supported |
| Don't add up | 94.4% (74.2–99.0%), n=18 | 90.7% (69.5–97.7%), n=18 | 87.0% (65.0–96.0%), n=18 | not supported |

#### Field extraction: Line items (F1) by printed amounts

| Printed amounts | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Add up | 99.4% (98.1–100.0%), n=13 | 95.8% (89.9–100.0%), n=13 | 94.6% (86.9–100.0%), n=13 | not supported |

#### Field extraction: Valid structured output by printed amounts

| Printed amounts | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Add up | 100.0% (96.3–100.0%), n=100 | 100.0% (96.3–100.0%), n=100 | 100.0% (96.3–100.0%), n=100 | not supported |
| Don't add up | 100.0% (82.4–100.0%), n=18 | 100.0% (82.4–100.0%), n=18 | 100.0% (82.4–100.0%), n=18 | not supported |

#### Field extraction: Merchant right by genuine receipt it was made from

| Genuine receipt it was made from | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| sroie | 98.0% (78.5–99.9%), n=17 | 98.0% (78.5–99.9%), n=17 | 98.0% (78.5–99.9%), n=17 | not supported |

#### Field extraction: Date right by genuine receipt it was made from

| Genuine receipt it was made from | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| sroie | 100.0% (83.9–100.0%), n=20 | 95.0% (76.4–99.1%), n=20 | 100.0% (83.9–100.0%), n=20 | not supported |

#### Field extraction: Currency right by genuine receipt it was made from

| Genuine receipt it was made from | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| sroie | 100.0% (80.6–100.0%), n=16 | 100.0% (80.6–100.0%), n=16 | 100.0% (80.6–100.0%), n=16 | not supported |

#### Field extraction: Total right by genuine receipt it was made from

| Genuine receipt it was made from | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| sroie | 100.0% (83.9–100.0%), n=20 | 96.7% (78.7–99.6%), n=20 | 88.3% (67.9–96.4%), n=20 | not supported |

#### Field extraction: All key fields right by genuine receipt it was made from

| Genuine receipt it was made from | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| sroie | 98.3% (81.2–99.9%), n=20 | 90.0% (69.9–97.2%), n=20 | 86.7% (65.9–95.6%), n=20 | not supported |

#### Field extraction: Valid structured output by genuine receipt it was made from

| Genuine receipt it was made from | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| sroie | 100.0% (83.9–100.0%), n=20 | 100.0% (83.9–100.0%), n=20 | 100.0% (83.9–100.0%), n=20 | not supported |

#### Field extraction: Merchant right by capture

| Capture | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Phone photo | 100.0% (78.5–100.0%), n=14 | 100.0% (78.5–100.0%), n=14 | 100.0% (78.5–100.0%), n=14 | not supported |
| Scan | 97.9% (92.1–99.5%), n=81 | 97.5% (91.4–99.3%), n=81 | 97.9% (92.1–99.5%), n=81 | not supported |

#### Field extraction: Date right by capture

| Capture | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Phone photo | 100.0% (84.5–100.0%), n=21 | 100.0% (84.5–100.0%), n=21 | 98.4% (82.0–99.9%), n=21 | not supported |
| Scan | 98.5% (93.4–99.7%), n=90 | 96.3% (90.1–98.7%), n=90 | 99.3% (94.6–99.9%), n=90 | not supported |

#### Field extraction: Currency right by capture

| Capture | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Phone photo | 100.0% (77.2–100.0%), n=13 | 100.0% (77.2–100.0%), n=13 | 100.0% (77.2–100.0%), n=13 | not supported |
| Scan | 100.0% (95.1–100.0%), n=74 | 100.0% (95.1–100.0%), n=74 | 100.0% (95.1–100.0%), n=74 | not supported |

#### Field extraction: Tax right by capture

| Capture | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Phone photo | 100.0% (75.8–100.0%), n=12 | 100.0% (75.8–100.0%), n=12 | 100.0% (75.8–100.0%), n=12 | not supported |

#### Field extraction: Total right by capture

| Capture | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Phone photo | 100.0% (84.5–100.0%), n=21 | 100.0% (84.5–100.0%), n=21 | 100.0% (84.5–100.0%), n=21 | not supported |
| Scan | 100.0% (96.3–100.0%), n=99 | 99.3% (95.1–99.9%), n=99 | 97.6% (92.4–99.3%), n=99 | not supported |

#### Field extraction: All key fields right by capture

| Capture | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Phone photo | 100.0% (84.5–100.0%), n=21 | 100.0% (84.5–100.0%), n=21 | 96.8% (79.6–99.6%), n=21 | not supported |
| Scan | 96.0% (90.1–98.4%), n=99 | 92.3% (85.3–96.1%), n=99 | 93.3% (86.5–96.8%), n=99 | not supported |

#### Field extraction: Line items (F1) by capture

| Capture | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Phone photo | 95.5% (89.5–100.0%), n=12 | 92.9% (85.8–98.8%), n=12 | 90.4% (79.1–100.0%), n=12 | not supported |

#### Field extraction: Valid structured output by capture

| Capture | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Phone photo | 100.0% (84.5–100.0%), n=21 | 100.0% (84.5–100.0%), n=21 | 100.0% (84.5–100.0%), n=21 | not supported |
| Scan | 100.0% (96.3–100.0%), n=99 | 100.0% (96.3–100.0%), n=99 | 100.0% (96.3–100.0%), n=99 | not supported |

#### Field extraction: Merchant right by fake class

| Fake class | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Fully AI-generated | 100.0% (83.2–100.0%), n=19 | 100.0% (83.2–100.0%), n=19 | 100.0% (83.2–100.0%), n=19 | not supported |
| AI-inpainted edit | 96.7% (67.7–99.8%), n=10 | 100.0% (72.2–100.0%), n=10 | 100.0% (72.2–100.0%), n=10 | not supported |
| genuine | 97.3% (88.3–99.4%), n=49 | 96.6% (87.3–99.2%), n=49 | 97.3% (88.3–99.4%), n=49 | not supported |
| hard_negative | 100.0% (72.2–100.0%), n=10 | 100.0% (72.2–100.0%), n=10 | 100.0% (72.2–100.0%), n=10 | not supported |

#### Field extraction: Date right by fake class

| Fake class | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Fully AI-generated | 100.0% (83.9–100.0%), n=20 | 100.0% (83.9–100.0%), n=20 | 100.0% (83.9–100.0%), n=20 | not supported |
| AI-inpainted edit | 100.0% (72.2–100.0%), n=10 | 90.0% (59.6–98.2%), n=10 | 100.0% (72.2–100.0%), n=10 | not supported |
| genuine | 98.9% (92.3–99.9%), n=62 | 96.8% (89.0–99.1%), n=62 | 98.4% (91.4–99.7%), n=62 | not supported |
| hard_negative | 93.3% (63.5–99.1%), n=10 | 96.7% (67.7–99.8%), n=10 | 100.0% (72.2–100.0%), n=10 | not supported |
| Edited by hand | 100.0% (72.2–100.0%), n=10 | 100.0% (72.2–100.0%), n=10 | 100.0% (72.2–100.0%), n=10 | not supported |

#### Field extraction: Currency right by fake class

| Fake class | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Fully AI-generated | 100.0% (75.8–100.0%), n=12 | 100.0% (75.8–100.0%), n=12 | 100.0% (75.8–100.0%), n=12 | not supported |
| AI-inpainted edit | 100.0% (72.2–100.0%), n=10 | 100.0% (72.2–100.0%), n=10 | 100.0% (72.2–100.0%), n=10 | not supported |
| genuine | 100.0% (93.0–100.0%), n=51 | 100.0% (93.0–100.0%), n=51 | 100.0% (93.0–100.0%), n=51 | not supported |

#### Field extraction: Subtotal right by fake class

| Fake class | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Fully AI-generated | 93.8% (71.7–98.9%), n=16 | 89.6% (66.4–97.4%), n=16 | 85.4% (61.6–95.5%), n=16 | not supported |

#### Field extraction: Tax right by fake class

| Fake class | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Fully AI-generated | 100.0% (83.9–100.0%), n=20 | 100.0% (83.9–100.0%), n=20 | 100.0% (83.9–100.0%), n=20 | not supported |

#### Field extraction: Total right by fake class

| Fake class | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Fully AI-generated | 100.0% (83.9–100.0%), n=20 | 100.0% (83.9–100.0%), n=20 | 100.0% (83.9–100.0%), n=20 | not supported |
| AI-inpainted edit | 100.0% (72.2–100.0%), n=10 | 96.7% (67.7–99.8%), n=10 | 90.0% (59.6–98.2%), n=10 | not supported |
| genuine | 100.0% (94.8–100.0%), n=70 | 100.0% (94.8–100.0%), n=70 | 100.0% (94.8–100.0%), n=70 | not supported |
| hard_negative | 100.0% (74.1–100.0%), n=11 | 100.0% (74.1–100.0%), n=11 | 100.0% (74.1–100.0%), n=11 | not supported |
| Edited by hand | 100.0% (72.2–100.0%), n=10 | 96.7% (67.7–99.8%), n=10 | 86.7% (55.9–97.1%), n=10 | not supported |

#### Field extraction: Receipt number right by fake class

| Fake class | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Fully AI-generated | 100.0% (74.1–100.0%), n=11 | 100.0% (74.1–100.0%), n=11 | 100.0% (74.1–100.0%), n=11 | not supported |

#### Field extraction: All key fields right by fake class

| Fake class | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Fully AI-generated | 95.0% (76.4–99.1%), n=20 | 91.7% (72.0–97.9%), n=20 | 88.3% (67.9–96.4%), n=20 | not supported |
| AI-inpainted edit | 96.7% (67.7–99.8%), n=10 | 86.7% (55.9–97.1%), n=10 | 90.0% (59.6–98.2%), n=10 | not supported |
| genuine | 97.1% (90.2–99.2%), n=70 | 94.8% (86.8–98.0%), n=70 | 96.7% (89.5–99.0%), n=70 | not supported |
| hard_negative | 93.9% (65.9–99.2%), n=11 | 97.0% (69.9–99.8%), n=11 | 100.0% (74.1–100.0%), n=11 | not supported |
| Edited by hand | 100.0% (72.2–100.0%), n=10 | 93.3% (63.5–99.1%), n=10 | 83.3% (52.4–95.8%), n=10 | not supported |

#### Field extraction: Line items (F1) by fake class

| Fake class | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Fully AI-generated | 97.3% (93.5–100.0%), n=20 | 93.4% (86.9–98.5%), n=20 | 91.1% (83.3–97.6%), n=20 | not supported |

#### Field extraction: Valid structured output by fake class

| Fake class | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Fully AI-generated | 100.0% (83.9–100.0%), n=20 | 100.0% (83.9–100.0%), n=20 | 100.0% (83.9–100.0%), n=20 | not supported |
| AI-inpainted edit | 100.0% (72.2–100.0%), n=10 | 100.0% (72.2–100.0%), n=10 | 100.0% (72.2–100.0%), n=10 | not supported |
| genuine | 100.0% (94.8–100.0%), n=70 | 100.0% (94.8–100.0%), n=70 | 100.0% (94.8–100.0%), n=70 | not supported |
| hard_negative | 100.0% (74.1–100.0%), n=11 | 100.0% (74.1–100.0%), n=11 | 100.0% (74.1–100.0%), n=11 | not supported |
| Edited by hand | 100.0% (72.2–100.0%), n=10 | 100.0% (72.2–100.0%), n=10 | 100.0% (72.2–100.0%), n=10 | not supported |

#### Field extraction: Merchant right by country

| Country | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| MY | 97.8% (91.7–99.5%), n=77 | 97.4% (91.0–99.3%), n=77 | 97.8% (91.7–99.5%), n=77 | not supported |

#### Field extraction: Date right by country

| Country | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| MY | 98.4% (92.9–99.7%), n=84 | 96.0% (89.5–98.6%), n=84 | 99.2% (94.2–99.9%), n=84 | not supported |

#### Field extraction: Currency right by country

| Country | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| MY | 100.0% (94.9–100.0%), n=71 | 100.0% (94.9–100.0%), n=71 | 100.0% (94.9–100.0%), n=71 | not supported |

#### Field extraction: Total right by country

| Country | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| MY | 100.0% (96.0–100.0%), n=93 | 99.3% (94.8–99.9%), n=93 | 97.5% (92.0–99.2%), n=93 | not supported |

#### Field extraction: All key fields right by country

| Country | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| MY | 96.4% (90.4–98.7%), n=93 | 91.8% (84.4–95.8%), n=93 | 92.8% (85.7–96.5%), n=93 | not supported |

#### Field extraction: Valid structured output by country

| Country | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| MY | 100.0% (96.0–100.0%), n=93 | 100.0% (96.0–100.0%), n=93 | 100.0% (96.0–100.0%), n=93 | not supported |

#### Field extraction: Merchant right by currency

| Currency | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| MYR | 97.8% (91.7–99.5%), n=77 | 97.4% (91.0–99.3%), n=77 | 97.8% (91.7–99.5%), n=77 | not supported |

#### Field extraction: Date right by currency

| Currency | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| MYR | 98.4% (92.9–99.7%), n=84 | 96.0% (89.5–98.6%), n=84 | 99.2% (94.2–99.9%), n=84 | not supported |

#### Field extraction: Currency right by currency

| Currency | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| MYR | 100.0% (94.9–100.0%), n=71 | 100.0% (94.9–100.0%), n=71 | 100.0% (94.9–100.0%), n=71 | not supported |

#### Field extraction: Total right by currency

| Currency | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| MYR | 100.0% (96.0–100.0%), n=93 | 99.3% (94.8–99.9%), n=93 | 97.5% (92.0–99.2%), n=93 | not supported |

#### Field extraction: All key fields right by currency

| Currency | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| MYR | 96.4% (90.4–98.7%), n=93 | 91.8% (84.4–95.8%), n=93 | 92.8% (85.7–96.5%), n=93 | not supported |

#### Field extraction: Valid structured output by currency

| Currency | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| MYR | 100.0% (96.0–100.0%), n=93 | 100.0% (96.0–100.0%), n=93 | 100.0% (96.0–100.0%), n=93 | not supported |

#### Field extraction: Merchant right by date era

| Date era | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| old | 98.0% (92.1–99.5%), n=82 | 97.6% (91.5–99.3%), n=82 | 98.0% (92.1–99.5%), n=82 | not supported |
| recent | 100.0% (77.2–100.0%), n=13 | 100.0% (77.2–100.0%), n=13 | 100.0% (77.2–100.0%), n=13 | not supported |

#### Field extraction: Date right by date era

| Date era | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| old | 98.5% (93.3–99.7%), n=89 | 96.3% (90.0–98.7%), n=89 | 99.3% (94.5–99.9%), n=89 | not supported |
| recent | 100.0% (85.7–100.0%), n=23 | 100.0% (85.7–100.0%), n=23 | 98.6% (83.3–99.9%), n=23 | not supported |

#### Field extraction: Currency right by date era

| Date era | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| old | 100.0% (95.1–100.0%), n=74 | 100.0% (95.1–100.0%), n=74 | 100.0% (95.1–100.0%), n=74 | not supported |
| recent | 100.0% (78.5–100.0%), n=14 | 100.0% (78.5–100.0%), n=14 | 100.0% (78.5–100.0%), n=14 | not supported |

#### Field extraction: Tax right by date era

| Date era | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| old | 100.0% (72.2–100.0%), n=10 | 100.0% (72.2–100.0%), n=10 | 100.0% (72.2–100.0%), n=10 | not supported |
| recent | 100.0% (72.2–100.0%), n=10 | 100.0% (72.2–100.0%), n=10 | 100.0% (72.2–100.0%), n=10 | not supported |

#### Field extraction: Total right by date era

| Date era | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| old | 100.0% (96.2–100.0%), n=98 | 99.3% (95.0–99.9%), n=98 | 97.6% (92.4–99.3%), n=98 | not supported |
| recent | 100.0% (85.7–100.0%), n=23 | 100.0% (85.7–100.0%), n=23 | 100.0% (85.7–100.0%), n=23 | not supported |

#### Field extraction: All key fields right by date era

| Date era | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| old | 96.6% (90.9–98.8%), n=98 | 92.2% (85.1–96.0%), n=98 | 93.2% (86.4–96.7%), n=98 | not supported |
| recent | 97.1% (81.1–99.6%), n=23 | 100.0% (85.7–100.0%), n=23 | 97.1% (81.1–99.6%), n=23 | not supported |

#### Field extraction: Line items (F1) by date era

| Date era | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| old | 98.4% (95.1–100.0%), n=10 | 92.1% (80.5–100.0%), n=10 | 90.5% (76.2–100.0%), n=10 | not supported |
| recent | 96.2% (89.4–100.0%), n=10 | 94.7% (87.2–100.0%), n=10 | 91.7% (82.5–100.0%), n=10 | not supported |

#### Field extraction: Valid structured output by date era

| Date era | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| old | 100.0% (96.2–100.0%), n=98 | 100.0% (96.2–100.0%), n=98 | 100.0% (96.2–100.0%), n=98 | not supported |
| recent | 100.0% (85.7–100.0%), n=23 | 100.0% (85.7–100.0%), n=23 | 100.0% (85.7–100.0%), n=23 | not supported |

#### Field extraction: Merchant right by document type

| Document type | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| receipt | 98.2% (93.2–99.6%), n=95 | 97.9% (92.6–99.4%), n=95 | 98.2% (93.2–99.6%), n=95 | not supported |

#### Field extraction: Date right by document type

| Document type | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| receipt | 98.8% (94.6–99.7%), n=112 | 97.0% (92.0–98.9%), n=112 | 99.1% (95.1–99.8%), n=112 | not supported |

#### Field extraction: Currency right by document type

| Document type | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| receipt | 100.0% (95.8–100.0%), n=88 | 100.0% (95.8–100.0%), n=88 | 100.0% (95.8–100.0%), n=88 | not supported |

#### Field extraction: Subtotal right by document type

| Document type | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| receipt | 93.8% (71.7–98.9%), n=16 | 89.6% (66.4–97.4%), n=16 | 85.4% (61.6–95.5%), n=16 | not supported |

#### Field extraction: Tax right by document type

| Document type | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| receipt | 100.0% (83.9–100.0%), n=20 | 100.0% (83.9–100.0%), n=20 | 100.0% (83.9–100.0%), n=20 | not supported |

#### Field extraction: Total right by document type

| Document type | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| receipt | 100.0% (96.9–100.0%), n=121 | 99.4% (95.9–99.9%), n=121 | 98.1% (93.8–99.4%), n=121 | not supported |

#### Field extraction: Receipt number right by document type

| Document type | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| receipt | 100.0% (74.1–100.0%), n=11 | 100.0% (74.1–100.0%), n=11 | 100.0% (74.1–100.0%), n=11 | not supported |

#### Field extraction: All key fields right by document type

| Document type | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| receipt | 96.7% (91.8–98.7%), n=121 | 93.7% (87.8–96.8%), n=121 | 93.9% (88.2–97.0%), n=121 | not supported |

#### Field extraction: Line items (F1) by document type

| Document type | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| receipt | 97.3% (93.3–100.0%), n=20 | 93.4% (86.7–98.5%), n=20 | 91.1% (83.9–97.7%), n=20 | not supported |

#### Field extraction: Valid structured output by document type

| Document type | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| receipt | 100.0% (96.9–100.0%), n=121 | 100.0% (96.9–100.0%), n=121 | 100.0% (96.9–100.0%), n=121 | not supported |

#### Field extraction: Merchant right by language

| Language | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| en | 98.0% (92.2–99.5%), n=83 | 97.6% (91.6–99.3%), n=83 | 98.0% (92.2–99.5%), n=83 | not supported |

#### Field extraction: Date right by language

| Language | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| en | 98.5% (93.4–99.7%), n=90 | 96.3% (90.1–98.7%), n=90 | 99.3% (94.6–99.9%), n=90 | not supported |

#### Field extraction: Currency right by language

| Language | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| en | 100.0% (95.1–100.0%), n=74 | 100.0% (95.1–100.0%), n=74 | 100.0% (95.1–100.0%), n=74 | not supported |

#### Field extraction: Tax right by language

| Language | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| en | 100.0% (72.2–100.0%), n=10 | 100.0% (72.2–100.0%), n=10 | 100.0% (72.2–100.0%), n=10 | not supported |

#### Field extraction: Total right by language

| Language | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| en | 100.0% (96.3–100.0%), n=99 | 99.3% (95.1–99.9%), n=99 | 97.6% (92.4–99.3%), n=99 | not supported |

#### Field extraction: All key fields right by language

| Language | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| en | 96.6% (91.0–98.8%), n=99 | 92.3% (85.3–96.1%), n=99 | 93.3% (86.5–96.8%), n=99 | not supported |

#### Field extraction: Line items (F1) by language

| Language | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| en | 98.4% (95.0–100.0%), n=10 | 88.6% (76.2–100.0%), n=10 | 87.0% (72.4–100.0%), n=10 | not supported |

#### Field extraction: Valid structured output by language

| Language | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| en | 100.0% (96.3–100.0%), n=99 | 100.0% (96.3–100.0%), n=99 | 100.0% (96.3–100.0%), n=99 | not supported |

#### Field extraction: Merchant right by provenance metadata

| Provenance metadata | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Left in | 100.0% (81.6–100.0%), n=17 | 98.0% (78.5–99.9%), n=17 | 98.0% (78.5–99.9%), n=17 | not supported |
| none | 97.7% (90.1–99.5%), n=59 | 97.2% (89.3–99.3%), n=59 | 97.7% (90.1–99.5%), n=59 | not supported |
| Stripped | 98.2% (80.4–99.9%), n=19 | 100.0% (83.2–100.0%), n=19 | 100.0% (83.2–100.0%), n=19 | not supported |

#### Field extraction: Date right by provenance metadata

| Provenance metadata | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Left in | 100.0% (83.9–100.0%), n=20 | 95.0% (76.4–99.1%), n=20 | 100.0% (83.9–100.0%), n=20 | not supported |
| none | 98.1% (91.8–99.6%), n=72 | 96.8% (89.8–99.0%), n=72 | 98.6% (92.5–99.8%), n=72 | not supported |
| Stripped | 100.0% (83.9–100.0%), n=20 | 100.0% (83.9–100.0%), n=20 | 100.0% (83.9–100.0%), n=20 | not supported |

#### Field extraction: Currency right by provenance metadata

| Provenance metadata | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Left in | 100.0% (75.8–100.0%), n=12 | 100.0% (75.8–100.0%), n=12 | 100.0% (75.8–100.0%), n=12 | not supported |
| none | 100.0% (94.0–100.0%), n=60 | 100.0% (94.0–100.0%), n=60 | 100.0% (94.0–100.0%), n=60 | not supported |
| Stripped | 100.0% (80.6–100.0%), n=16 | 100.0% (80.6–100.0%), n=16 | 100.0% (80.6–100.0%), n=16 | not supported |

#### Field extraction: Tax right by provenance metadata

| Provenance metadata | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Left in | 100.0% (72.2–100.0%), n=10 | 100.0% (72.2–100.0%), n=10 | 100.0% (72.2–100.0%), n=10 | not supported |
| Stripped | 100.0% (72.2–100.0%), n=10 | 100.0% (72.2–100.0%), n=10 | 100.0% (72.2–100.0%), n=10 | not supported |

#### Field extraction: Total right by provenance metadata

| Provenance metadata | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Left in | 100.0% (83.9–100.0%), n=20 | 98.3% (81.2–99.9%), n=20 | 95.0% (76.4–99.1%), n=20 | not supported |
| none | 100.0% (95.5–100.0%), n=81 | 100.0% (95.5–100.0%), n=81 | 100.0% (95.5–100.0%), n=81 | not supported |
| Stripped | 100.0% (83.9–100.0%), n=20 | 98.3% (81.2–99.9%), n=20 | 93.3% (74.1–98.6%), n=20 | not supported |

#### Field extraction: All key fields right by provenance metadata

| Provenance metadata | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Left in | 100.0% (83.9–100.0%), n=20 | 86.7% (65.9–95.6%), n=20 | 86.7% (65.9–95.6%), n=20 | not supported |
| none | 96.7% (90.2–98.9%), n=81 | 95.1% (88.0–98.1%), n=81 | 97.1% (90.8–99.1%), n=81 | not supported |
| Stripped | 93.3% (74.1–98.6%), n=20 | 95.0% (76.4–99.1%), n=20 | 88.3% (67.9–96.4%), n=20 | not supported |

#### Field extraction: Line items (F1) by provenance metadata

| Provenance metadata | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Left in | 96.9% (90.2–100.0%), n=10 | 95.3% (85.4–100.0%), n=10 | 95.3% (85.4–100.0%), n=10 | not supported |
| Stripped | 97.7% (93.9–100.0%), n=10 | 91.5% (82.9–98.4%), n=10 | 86.8% (75.2–97.2%), n=10 | not supported |

#### Field extraction: Valid structured output by provenance metadata

| Provenance metadata | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Left in | 100.0% (83.9–100.0%), n=20 | 100.0% (83.9–100.0%), n=20 | 100.0% (83.9–100.0%), n=20 | not supported |
| none | 100.0% (95.5–100.0%), n=81 | 100.0% (95.5–100.0%), n=81 | 100.0% (95.5–100.0%), n=81 | not supported |
| Stripped | 100.0% (83.9–100.0%), n=20 | 100.0% (83.9–100.0%), n=20 | 100.0% (83.9–100.0%), n=20 | not supported |

#### Field extraction: Date right by source

| Source | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| commons | 100.0% (77.2–100.0%), n=13 | 100.0% (77.2–100.0%), n=13 | 97.4% (73.4–99.8%), n=13 | not supported |
| edited:sharp-patch | 100.0% (72.2–100.0%), n=10 | 100.0% (72.2–100.0%), n=10 | 100.0% (72.2–100.0%), n=10 | not supported |
| sroie | 97.7% (90.1–99.5%), n=59 | 96.0% (87.6–98.8%), n=59 | 98.9% (91.9–99.9%), n=59 | not supported |

#### Field extraction: Total right by source

| Source | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| commons | 100.0% (77.2–100.0%), n=13 | 100.0% (77.2–100.0%), n=13 | 100.0% (77.2–100.0%), n=13 | not supported |
| edited:sharp-patch | 100.0% (72.2–100.0%), n=10 | 96.7% (67.7–99.8%), n=10 | 86.7% (55.9–97.1%), n=10 | not supported |
| sroie | 100.0% (94.7–100.0%), n=68 | 100.0% (94.7–100.0%), n=68 | 100.0% (94.7–100.0%), n=68 | not supported |

#### Field extraction: All key fields right by source

| Source | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| commons | 100.0% (77.2–100.0%), n=13 | 100.0% (77.2–100.0%), n=13 | 97.4% (73.4–99.8%), n=13 | not supported |
| edited:sharp-patch | 100.0% (72.2–100.0%), n=10 | 93.3% (63.5–99.1%), n=10 | 83.3% (52.4–95.8%), n=10 | not supported |
| sroie | 96.1% (88.5–98.7%), n=68 | 94.1% (85.8–97.7%), n=68 | 97.1% (89.9–99.2%), n=68 | not supported |

#### Field extraction: Valid structured output by source

| Source | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| commons | 100.0% (77.2–100.0%), n=13 | 100.0% (77.2–100.0%), n=13 | 100.0% (77.2–100.0%), n=13 | not supported |
| edited:sharp-patch | 100.0% (72.2–100.0%), n=10 | 100.0% (72.2–100.0%), n=10 | 100.0% (72.2–100.0%), n=10 | not supported |
| sroie | 100.0% (94.7–100.0%), n=68 | 100.0% (94.7–100.0%), n=68 | 100.0% (94.7–100.0%), n=68 | not supported |

#### Field extraction: Merchant right by source

| Source | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| sroie | 97.6% (89.5–99.5%), n=55 | 97.0% (88.6–99.2%), n=55 | 97.6% (89.5–99.5%), n=55 | not supported |

#### Field extraction: Currency right by source

| Source | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| sroie | 100.0% (93.1–100.0%), n=52 | 100.0% (93.1–100.0%), n=52 | 100.0% (93.1–100.0%), n=52 | not supported |

### Arithmetic and tax checks

| Metric | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Totals that don't add up, caught (higher is better) | 38.9% (20.3–61.4%), n=18 | not supported | not supported | not supported |
| Totals flagged that really don't add up (higher is better) | 87.5% (52.9–97.8%), n=8 | not supported | not supported | not supported |
| False alarms on genuine receipts (lower is better) | 1.3% (0.2–6.9%), n=78 | not supported | not supported | not supported |
| Receipts the checks could run on (higher is better) | 59.8% (50.9–68.1%), n=121 | not supported | not supported | not supported |
| Price per check (lower is better) | $0.0163, n=453 | not supported | not supported | not supported |
| Latency p95 (lower is better) | 8,907 ms, n=453 | not supported | not supported | not supported |

#### Arithmetic and tax checks: False alarms on genuine receipts by printed amounts

| Printed amounts | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Add up | 1.3% (0.2–6.9%), n=78 | not supported | not supported | not supported |

#### Arithmetic and tax checks: Receipts the checks could run on by printed amounts

| Printed amounts | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Add up | 61.7% (51.9–70.6%), n=100 | not supported | not supported | not supported |
| Don't add up | 48.1% (27.5–69.4%), n=18 | not supported | not supported | not supported |

#### Arithmetic and tax checks: Totals that don't add up, caught by printed amounts

| Printed amounts | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Don't add up | 38.9% (20.3–61.4%), n=18 | not supported | not supported | not supported |

#### Arithmetic and tax checks: Totals that don't add up, caught by genuine receipt it was made from

| Genuine receipt it was made from | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| sroie | 54.5% (28.0–78.7%), n=11 | not supported | not supported | not supported |

#### Arithmetic and tax checks: Receipts the checks could run on by genuine receipt it was made from

| Genuine receipt it was made from | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| sroie | 58.3% (37.2–76.8%), n=20 | not supported | not supported | not supported |

#### Arithmetic and tax checks: Receipts the checks could run on by capture

| Capture | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Phone photo | 49.2% (29.7–69.0%), n=21 | not supported | not supported | not supported |
| Scan | 62.6% (52.8–71.5%), n=99 | not supported | not supported | not supported |

#### Arithmetic and tax checks: Totals that don't add up, caught by capture

| Capture | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Scan | 53.8% (29.1–76.8%), n=13 | not supported | not supported | not supported |

#### Arithmetic and tax checks: False alarms on genuine receipts by capture

| Capture | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Scan | 1.5% (0.3–7.9%), n=68 | not supported | not supported | not supported |

#### Arithmetic and tax checks: Receipts the checks could run on by fake class

| Fake class | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Fully AI-generated | 30.0% (14.5–51.9%), n=20 | not supported | not supported | not supported |
| AI-inpainted edit | 40.0% (16.8–68.7%), n=10 | not supported | not supported | not supported |
| genuine | 69.0% (57.5–78.6%), n=70 | not supported | not supported | not supported |
| hard_negative | 57.6% (30.4–80.8%), n=11 | not supported | not supported | not supported |
| Edited by hand | 76.7% (45.8–92.7%), n=10 | not supported | not supported | not supported |

#### Arithmetic and tax checks: False alarms on genuine receipts by fake class

| Fake class | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| genuine | 1.5% (0.3–8.0%), n=67 | not supported | not supported | not supported |
| hard_negative | 0.0% (0.0–25.9%), n=11 | not supported | not supported | not supported |

#### Arithmetic and tax checks: Totals that don't add up, caught by country

| Country | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| MY | 53.8% (29.1–76.8%), n=13 | not supported | not supported | not supported |

#### Arithmetic and tax checks: False alarms on genuine receipts by country

| Country | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| MY | 1.5% (0.3–8.1%), n=66 | not supported | not supported | not supported |

#### Arithmetic and tax checks: Receipts the checks could run on by country

| Country | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| MY | 65.6% (55.5–74.5%), n=93 | not supported | not supported | not supported |

#### Arithmetic and tax checks: Totals that don't add up, caught by currency

| Currency | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| MYR | 53.8% (29.1–76.8%), n=13 | not supported | not supported | not supported |

#### Arithmetic and tax checks: False alarms on genuine receipts by currency

| Currency | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| MYR | 1.5% (0.3–8.1%), n=66 | not supported | not supported | not supported |

#### Arithmetic and tax checks: Receipts the checks could run on by currency

| Currency | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| MYR | 65.6% (55.5–74.5%), n=93 | not supported | not supported | not supported |

#### Arithmetic and tax checks: Totals that don't add up, caught by date era

| Date era | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| old | 50.0% (26.8–73.2%), n=14 | not supported | not supported | not supported |

#### Arithmetic and tax checks: False alarms on genuine receipts by date era

| Date era | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| old | 1.5% (0.3–8.1%), n=66 | not supported | not supported | not supported |
| recent | 0.0% (0.0–24.2%), n=12 | not supported | not supported | not supported |

#### Arithmetic and tax checks: Receipts the checks could run on by date era

| Date era | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| old | 63.3% (53.4–72.1%), n=98 | not supported | not supported | not supported |
| recent | 44.9% (26.8–64.5%), n=23 | not supported | not supported | not supported |

#### Arithmetic and tax checks: Totals that don't add up, caught by document type

| Document type | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| receipt | 38.9% (20.3–61.4%), n=18 | not supported | not supported | not supported |

#### Arithmetic and tax checks: False alarms on genuine receipts by document type

| Document type | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| receipt | 1.3% (0.2–6.9%), n=78 | not supported | not supported | not supported |

#### Arithmetic and tax checks: Receipts the checks could run on by document type

| Document type | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| receipt | 59.8% (50.9–68.1%), n=121 | not supported | not supported | not supported |

#### Arithmetic and tax checks: Totals that don't add up, caught by language

| Language | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| en | 50.0% (26.8–73.2%), n=14 | not supported | not supported | not supported |

#### Arithmetic and tax checks: False alarms on genuine receipts by language

| Language | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| en | 1.5% (0.3–8.0%), n=67 | not supported | not supported | not supported |

#### Arithmetic and tax checks: Receipts the checks could run on by language

| Language | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| en | 62.6% (52.8–71.5%), n=99 | not supported | not supported | not supported |

#### Arithmetic and tax checks: Receipts the checks could run on by provenance metadata

| Provenance metadata | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Left in | 43.3% (24.5–64.3%), n=20 | not supported | not supported | not supported |
| none | 67.5% (56.7–76.7%), n=81 | not supported | not supported | not supported |
| Stripped | 45.0% (25.8–65.8%), n=20 | not supported | not supported | not supported |

#### Arithmetic and tax checks: False alarms on genuine receipts by provenance metadata

| Provenance metadata | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| none | 1.3% (0.2–6.9%), n=78 | not supported | not supported | not supported |

#### Arithmetic and tax checks: Totals that don't add up, caught by provenance metadata

| Provenance metadata | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Stripped | 27.3% (9.7–56.6%), n=11 | not supported | not supported | not supported |

#### Arithmetic and tax checks: False alarms on genuine receipts by source

| Source | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| commons | 0.0% (0.0–24.2%), n=12 | not supported | not supported | not supported |
| sroie | 1.5% (0.3–8.1%), n=66 | not supported | not supported | not supported |

#### Arithmetic and tax checks: Receipts the checks could run on by source

| Source | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| commons | 59.0% (33.3–80.5%), n=13 | not supported | not supported | not supported |
| edited:sharp-patch | 76.7% (45.8–92.7%), n=10 | not supported | not supported | not supported |
| sroie | 69.1% (57.4–78.8%), n=68 | not supported | not supported | not supported |

### Edited or generated receipts

| Metric | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| ROC AUC (higher is better) | 0.883 (0.804–0.949), n=121 | 0.807 (0.711–0.898), n=121 | 0.808 (0.703–0.895), n=121 | 0.637 (0.519–0.748), n=121 |
| Fakes caught at a 1% false-flag rate (higher is better) | 52.5% (37.5–82.5%), n=40 | 32.5% (20.0–65.0%), n=40 | 35.0% (22.5–75.0%), n=40 | 32.5% (17.5–47.5%), n=40 |
| Fakes caught at a 5% false-flag rate (higher is better) | 77.5% (55.0–90.0%), n=40 | 52.5% (37.5–72.5%), n=40 | 65.0% (47.5–80.0%), n=40 | 35.0% (22.5–50.0%), n=40 |
| Fakes caught at a 10% false-flag rate (higher is better) | 77.5% (65.0–90.0%), n=40 | 62.5% (45.0–77.6%), n=40 | 65.0% (50.0–77.6%), n=40 | 37.5% (22.5–52.5%), n=40 |
| Fakes caught at risk ≥ 0.5 (higher is better) | 58.3% (43.0–72.2%), n=40 | 45.0% (30.7–60.2%), n=40 | 53.3% (38.3–67.8%), n=40 | 22.5% (12.3–37.5%), n=40 |
| Genuine receipts flagged at risk ≥ 0.5 (lower is better) | 2.1% (0.5–7.9%), n=81 | 2.9% (0.9–9.2%), n=81 | 1.2% (0.2–6.7%), n=81 | 0.0% (0.0–4.5%), n=81 |
| Fakes caught at risk ≥ 0.7 (higher is better) | 51.7% (36.7–66.3%), n=40 | 31.7% (19.4–47.1%), n=40 | 52.5% (37.5–67.1%), n=40 | 20.0% (10.5–34.8%), n=40 |
| Genuine receipts flagged at risk ≥ 0.7 (lower is better) | 0.0% (0.0–4.5%), n=81 | 0.4% (0.0–5.3%), n=81 | 1.2% (0.2–6.7%), n=81 | 0.0% (0.0–4.5%), n=81 |
| Price per check (lower is better) | $0.0163, n=453 | $0.0010, n=453 | $0.0044, n=453 | $0.0002, n=453 |
| Latency p95 (lower is better) | 8,907 ms, n=453 | 13,551 ms, n=453 | 15,763 ms, n=453 | 680 ms, n=453 |

#### Edited or generated receipts: Fakes caught at risk ≥ 0.5 by genuine receipt it was made from

| Genuine receipt it was made from | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| sroie | 45.0% (25.8–65.8%), n=20 | 41.7% (23.2–62.8%), n=20 | 30.0% (14.5–51.9%), n=20 | 5.0% (0.9–23.6%), n=20 |

#### Edited or generated receipts: Fakes caught at risk ≥ 0.7 by genuine receipt it was made from

| Genuine receipt it was made from | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| sroie | 33.3% (16.9–55.1%), n=20 | 26.7% (12.3–48.6%), n=20 | 28.3% (13.4–50.2%), n=20 | 0.0% (0.0–16.1%), n=20 |

#### Edited or generated receipts: ROC AUC by capture

| Capture | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Phone photo | 0.903 (0.741–1.000), n=21 | 0.917 (0.778–1.000), n=21 | 0.981 (0.917–1.000), n=21 | 0.852 (0.667–0.981), n=21 |
| Scan | 0.874 (0.774–0.956), n=99 | 0.800 (0.686–0.902), n=99 | 0.725 (0.603–0.843), n=99 | 0.581 (0.444–0.724), n=99 |

#### Edited or generated receipts: Fakes caught at a 1% false-flag rate by capture

| Capture | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Phone photo | 83.3% (58.3–100.0%), n=12 | 75.0% (50.0–100.0%), n=12 | 91.7% (75.0–100.0%), n=12 | 58.3% (33.3–91.7%), n=12 |
| Scan | 46.4% (28.6–82.1%), n=28 | 25.0% (10.7–60.7%), n=28 | 50.0% (32.1–67.9%), n=28 | 21.4% (7.1–35.7%), n=28 |

#### Edited or generated receipts: Fakes caught at a 5% false-flag rate by capture

| Capture | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Phone photo | 83.3% (58.3–100.0%), n=12 | 75.0% (50.0–100.0%), n=12 | 91.7% (75.0–100.0%), n=12 | 58.3% (33.3–91.7%), n=12 |
| Scan | 75.0% (42.9–89.3%), n=28 | 46.4% (28.6–67.9%), n=28 | 50.0% (32.1–67.9%), n=28 | 25.0% (10.7–42.9%), n=28 |

#### Edited or generated receipts: Fakes caught at a 10% false-flag rate by capture

| Capture | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Phone photo | 83.3% (58.3–100.0%), n=12 | 75.0% (50.0–100.0%), n=12 | 91.7% (75.0–100.0%), n=12 | 58.3% (33.3–91.7%), n=12 |
| Scan | 75.0% (60.7–92.9%), n=28 | 57.1% (35.7–78.6%), n=28 | 50.0% (32.1–67.9%), n=28 | 28.6% (10.7–46.4%), n=28 |

#### Edited or generated receipts: Fakes caught at risk ≥ 0.5 by capture

| Capture | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Phone photo | 66.7% (39.1–86.2%), n=12 | 55.6% (29.7–78.7%), n=12 | 86.1% (58.2–96.5%), n=12 | 50.0% (25.4–74.6%), n=12 |
| Scan | 54.8% (36.9–71.5%), n=28 | 40.5% (24.5–58.7%), n=28 | 39.3% (23.6–57.6%), n=28 | 10.7% (3.7–27.2%), n=28 |

#### Edited or generated receipts: Fakes caught at risk ≥ 0.7 by capture

| Capture | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Phone photo | 66.7% (39.1–86.2%), n=12 | 41.7% (19.3–68.0%), n=12 | 86.1% (58.2–96.5%), n=12 | 50.0% (25.4–74.6%), n=12 |
| Scan | 45.2% (28.5–63.1%), n=28 | 27.4% (14.4–45.8%), n=28 | 38.1% (22.6–56.5%), n=28 | 7.1% (2.0–22.6%), n=28 |

#### Edited or generated receipts: Genuine receipts flagged at risk ≥ 0.5 by capture

| Capture | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Scan | 2.3% (0.6–9.0%), n=71 | 3.3% (1.0–10.4%), n=71 | 0.0% (0.0–5.1%), n=71 | 0.0% (0.0–5.1%), n=71 |

#### Edited or generated receipts: Genuine receipts flagged at risk ≥ 0.7 by capture

| Capture | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Scan | 0.0% (0.0–5.1%), n=71 | 0.5% (0.0–6.0%), n=71 | 0.0% (0.0–5.1%), n=71 | 0.0% (0.0–5.1%), n=71 |

#### Edited or generated receipts: ROC AUC by country

| Country | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| MY | 0.856 (0.741–0.949), n=93 | 0.793 (0.669–0.909), n=93 | 0.690 (0.549–0.819), n=93 | 0.510 (0.357–0.657), n=93 |

#### Edited or generated receipts: Fakes caught at a 1% false-flag rate by country

| Country | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| MY | 44.0% (28.0–80.0%), n=25 | 28.0% (12.0–64.0%), n=25 | 44.0% (24.0–64.0%), n=25 | 12.0% (0.0–28.0%), n=25 |

#### Edited or generated receipts: Fakes caught at a 5% false-flag rate by country

| Country | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| MY | 72.0% (44.0–88.0%), n=25 | 48.0% (28.0–72.0%), n=25 | 44.0% (24.0–64.0%), n=25 | 16.0% (4.0–32.0%), n=25 |

#### Edited or generated receipts: Fakes caught at a 10% false-flag rate by country

| Country | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| MY | 72.0% (56.0–92.0%), n=25 | 52.0% (32.0–80.0%), n=25 | 44.0% (24.0–64.0%), n=25 | 20.0% (4.0–36.0%), n=25 |

#### Edited or generated receipts: Fakes caught at risk ≥ 0.5 by country

| Country | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| MY | 52.0% (33.5–70.0%), n=25 | 41.3% (24.5–60.5%), n=25 | 29.3% (15.2–48.9%), n=25 | 4.0% (0.7–19.5%), n=25 |

#### Edited or generated receipts: Genuine receipts flagged at risk ≥ 0.5 by country

| Country | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| MY | 2.5% (0.6–9.4%), n=68 | 3.4% (1.0–10.8%), n=68 | 0.0% (0.0–5.3%), n=68 | 0.0% (0.0–5.3%), n=68 |

#### Edited or generated receipts: Fakes caught at risk ≥ 0.7 by country

| Country | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| MY | 42.7% (25.6–61.7%), n=25 | 28.0% (14.3–47.6%), n=25 | 28.0% (14.3–47.6%), n=25 | 0.0% (0.0–13.3%), n=25 |

#### Edited or generated receipts: Genuine receipts flagged at risk ≥ 0.7 by country

| Country | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| MY | 0.0% (0.0–5.3%), n=68 | 0.5% (0.0–6.2%), n=68 | 0.0% (0.0–5.3%), n=68 | 0.0% (0.0–5.3%), n=68 |

#### Edited or generated receipts: ROC AUC by currency

| Currency | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| MYR | 0.856 (0.747–0.950), n=93 | 0.793 (0.669–0.903), n=93 | 0.690 (0.546–0.816), n=93 | 0.510 (0.356–0.662), n=93 |

#### Edited or generated receipts: Fakes caught at a 1% false-flag rate by currency

| Currency | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| MYR | 44.0% (28.0–80.0%), n=25 | 28.0% (12.0–64.0%), n=25 | 44.0% (24.0–64.0%), n=25 | 12.0% (0.0–28.0%), n=25 |

#### Edited or generated receipts: Fakes caught at a 5% false-flag rate by currency

| Currency | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| MYR | 72.0% (40.0–88.0%), n=25 | 48.0% (28.0–72.0%), n=25 | 44.0% (24.0–64.0%), n=25 | 16.0% (4.0–32.0%), n=25 |

#### Edited or generated receipts: Fakes caught at a 10% false-flag rate by currency

| Currency | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| MYR | 72.0% (56.0–92.0%), n=25 | 52.0% (32.0–80.0%), n=25 | 44.0% (24.0–60.0%), n=25 | 20.0% (4.0–40.0%), n=25 |

#### Edited or generated receipts: Fakes caught at risk ≥ 0.5 by currency

| Currency | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| MYR | 52.0% (33.5–70.0%), n=25 | 41.3% (24.5–60.5%), n=25 | 29.3% (15.2–48.9%), n=25 | 4.0% (0.7–19.5%), n=25 |

#### Edited or generated receipts: Genuine receipts flagged at risk ≥ 0.5 by currency

| Currency | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| MYR | 2.5% (0.6–9.4%), n=68 | 3.4% (1.0–10.8%), n=68 | 0.0% (0.0–5.3%), n=68 | 0.0% (0.0–5.3%), n=68 |

#### Edited or generated receipts: Fakes caught at risk ≥ 0.7 by currency

| Currency | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| MYR | 42.7% (25.6–61.7%), n=25 | 28.0% (14.3–47.6%), n=25 | 28.0% (14.3–47.6%), n=25 | 0.0% (0.0–13.3%), n=25 |

#### Edited or generated receipts: Genuine receipts flagged at risk ≥ 0.7 by currency

| Currency | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| MYR | 0.0% (0.0–5.3%), n=68 | 0.5% (0.0–6.2%), n=68 | 0.0% (0.0–5.3%), n=68 | 0.0% (0.0–5.3%), n=68 |

#### Edited or generated receipts: ROC AUC by date era

| Date era | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| old | 0.879 (0.785–0.955), n=98 | 0.785 (0.665–0.895), n=98 | 0.742 (0.614–0.850), n=98 | 0.527 (0.385–0.665), n=98 |
| recent | 0.908 (0.738–1.000), n=23 | 0.892 (0.723–1.000), n=23 | 1.000, n=23 | 0.923 (0.785–1.000), n=23 |

#### Edited or generated receipts: Fakes caught at a 1% false-flag rate by date era

| Date era | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| old | 50.0% (33.3–83.3%), n=30 | 30.0% (16.7–60.0%), n=30 | 53.3% (36.7–70.0%), n=30 | 16.7% (3.3–33.3%), n=30 |
| recent | 80.0% (50.0–100.0%), n=10 | 70.0% (40.0–100.0%), n=10 | 100.0%, n=10 | 80.0% (50.0–100.0%), n=10 |

#### Edited or generated receipts: Fakes caught at a 5% false-flag rate by date era

| Date era | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| old | 76.7% (46.7–90.0%), n=30 | 46.7% (30.0–70.0%), n=30 | 53.3% (36.7–70.0%), n=30 | 20.0% (6.7–36.7%), n=30 |
| recent | 80.0% (50.0–100.0%), n=10 | 70.0% (40.0–100.0%), n=10 | 100.0%, n=10 | 80.0% (50.0–100.0%), n=10 |

#### Edited or generated receipts: Fakes caught at a 10% false-flag rate by date era

| Date era | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| old | 76.7% (63.3–93.3%), n=30 | 53.3% (33.3–76.7%), n=30 | 53.3% (36.7–70.0%), n=30 | 23.3% (10.0–40.0%), n=30 |
| recent | 80.0% (50.0–100.0%), n=10 | 70.0% (40.0–100.0%), n=10 | 100.0%, n=10 | 80.0% (50.0–100.0%), n=10 |

#### Edited or generated receipts: Fakes caught at risk ≥ 0.5 by date era

| Date era | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| old | 56.7% (39.2–72.6%), n=30 | 41.1% (25.5–58.7%), n=30 | 37.8% (22.8–55.6%), n=30 | 6.7% (1.8–21.3%), n=30 |
| recent | 63.3% (34.0–85.3%), n=10 | 56.7% (28.6–81.0%), n=10 | 100.0% (72.2–100.0%), n=10 | 70.0% (39.7–89.2%), n=10 |

#### Edited or generated receipts: Genuine receipts flagged at risk ≥ 0.5 by date era

| Date era | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| old | 2.5% (0.6–9.4%), n=68 | 3.4% (1.0–10.8%), n=68 | 0.0% (0.0–5.3%), n=68 | 0.0% (0.0–5.3%), n=68 |
| recent | 0.0% (0.0–22.8%), n=13 | 0.0% (0.0–22.8%), n=13 | 7.7% (1.4–33.3%), n=13 | 0.0% (0.0–22.8%), n=13 |

#### Edited or generated receipts: Fakes caught at risk ≥ 0.7 by date era

| Date era | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| old | 48.9% (32.2–65.9%), n=30 | 27.8% (15.0–45.6%), n=30 | 36.7% (21.9–54.5%), n=30 | 3.3% (0.6–16.7%), n=30 |
| recent | 60.0% (31.3–83.2%), n=10 | 43.3% (19.0–71.4%), n=10 | 100.0% (72.2–100.0%), n=10 | 70.0% (39.7–89.2%), n=10 |

#### Edited or generated receipts: Genuine receipts flagged at risk ≥ 0.7 by date era

| Date era | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| old | 0.0% (0.0–5.3%), n=68 | 0.5% (0.0–6.2%), n=68 | 0.0% (0.0–5.3%), n=68 | 0.0% (0.0–5.3%), n=68 |
| recent | 0.0% (0.0–22.8%), n=13 | 0.0% (0.0–22.8%), n=13 | 7.7% (1.4–33.3%), n=13 | 0.0% (0.0–22.8%), n=13 |

#### Edited or generated receipts: ROC AUC by document type

| Document type | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| receipt | 0.883 (0.803–0.952), n=121 | 0.807 (0.705–0.889), n=121 | 0.808 (0.712–0.892), n=121 | 0.637 (0.524–0.750), n=121 |

#### Edited or generated receipts: Fakes caught at a 1% false-flag rate by document type

| Document type | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| receipt | 52.5% (37.5–85.0%), n=40 | 32.5% (20.0–62.5%), n=40 | 35.0% (22.5–75.0%), n=40 | 32.5% (20.0–47.5%), n=40 |

#### Edited or generated receipts: Fakes caught at a 5% false-flag rate by document type

| Document type | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| receipt | 77.5% (57.5–90.0%), n=40 | 52.5% (37.5–72.5%), n=40 | 65.0% (47.5–80.0%), n=40 | 35.0% (20.0–50.0%), n=40 |

#### Edited or generated receipts: Fakes caught at a 10% false-flag rate by document type

| Document type | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| receipt | 77.5% (65.0–90.0%), n=40 | 62.5% (45.0–80.0%), n=40 | 65.0% (50.0–80.0%), n=40 | 37.5% (22.5–52.5%), n=40 |

#### Edited or generated receipts: Fakes caught at risk ≥ 0.5 by document type

| Document type | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| receipt | 58.3% (43.0–72.2%), n=40 | 45.0% (30.7–60.2%), n=40 | 53.3% (38.3–67.8%), n=40 | 22.5% (12.3–37.5%), n=40 |

#### Edited or generated receipts: Genuine receipts flagged at risk ≥ 0.5 by document type

| Document type | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| receipt | 2.1% (0.5–7.9%), n=81 | 2.9% (0.9–9.2%), n=81 | 1.2% (0.2–6.7%), n=81 | 0.0% (0.0–4.5%), n=81 |

#### Edited or generated receipts: Fakes caught at risk ≥ 0.7 by document type

| Document type | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| receipt | 51.7% (36.7–66.3%), n=40 | 31.7% (19.4–47.1%), n=40 | 52.5% (37.5–67.1%), n=40 | 20.0% (10.5–34.8%), n=40 |

#### Edited or generated receipts: Genuine receipts flagged at risk ≥ 0.7 by document type

| Document type | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| receipt | 0.0% (0.0–4.5%), n=81 | 0.4% (0.0–5.3%), n=81 | 1.2% (0.2–6.7%), n=81 | 0.0% (0.0–4.5%), n=81 |

#### Edited or generated receipts: ROC AUC by language

| Language | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| en | 0.866 (0.768–0.948), n=99 | 0.758 (0.638–0.865), n=99 | 0.744 (0.623–0.855), n=99 | 0.573 (0.435–0.710), n=99 |

#### Edited or generated receipts: Fakes caught at a 1% false-flag rate by language

| Language | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| en | 50.0% (33.3–80.0%), n=30 | 26.7% (13.3–56.7%), n=30 | 53.3% (36.6–70.0%), n=30 | 23.3% (10.0–40.0%), n=30 |

#### Edited or generated receipts: Fakes caught at a 5% false-flag rate by language

| Language | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| en | 73.3% (46.7–90.0%), n=30 | 43.3% (23.3–63.3%), n=30 | 53.3% (33.3–70.0%), n=30 | 26.7% (10.0–43.3%), n=30 |

#### Edited or generated receipts: Fakes caught at a 10% false-flag rate by language

| Language | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| en | 73.3% (56.7–90.0%), n=30 | 50.0% (30.0–73.3%), n=30 | 53.3% (36.7–70.0%), n=30 | 30.0% (13.3–46.7%), n=30 |

#### Edited or generated receipts: Fakes caught at risk ≥ 0.5 by language

| Language | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| en | 56.7% (39.2–72.6%), n=30 | 37.8% (22.8–55.6%), n=30 | 37.8% (22.8–55.6%), n=30 | 13.3% (5.3–29.7%), n=30 |

#### Edited or generated receipts: Genuine receipts flagged at risk ≥ 0.5 by language

| Language | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| en | 2.4% (0.6–9.3%), n=69 | 3.4% (1.0–10.7%), n=69 | 0.0% (0.0–5.3%), n=69 | 0.0% (0.0–5.3%), n=69 |

#### Edited or generated receipts: Fakes caught at risk ≥ 0.7 by language

| Language | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| en | 48.9% (32.2–65.9%), n=30 | 26.7% (14.2–44.4%), n=30 | 36.7% (21.9–54.5%), n=30 | 10.0% (3.5–25.6%), n=30 |

#### Edited or generated receipts: Genuine receipts flagged at risk ≥ 0.7 by language

| Language | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| en | 0.0% (0.0–5.3%), n=69 | 0.5% (0.0–6.2%), n=69 | 0.0% (0.0–5.3%), n=69 | 0.0% (0.0–5.3%), n=69 |

#### Edited or generated receipts: Genuine receipts flagged at risk ≥ 0.5 by source

| Source | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| commons | 0.0% (0.0–22.8%), n=13 | 0.0% (0.0–22.8%), n=13 | 7.7% (1.4–33.3%), n=13 | 0.0% (0.0–22.8%), n=13 |
| sroie | 2.5% (0.6–9.4%), n=68 | 3.4% (1.0–10.8%), n=68 | 0.0% (0.0–5.3%), n=68 | 0.0% (0.0–5.3%), n=68 |

#### Edited or generated receipts: Genuine receipts flagged at risk ≥ 0.7 by source

| Source | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| commons | 0.0% (0.0–22.8%), n=13 | 0.0% (0.0–22.8%), n=13 | 7.7% (1.4–33.3%), n=13 | 0.0% (0.0–22.8%), n=13 |
| sroie | 0.0% (0.0–5.3%), n=68 | 0.5% (0.0–6.2%), n=68 | 0.0% (0.0–5.3%), n=68 | 0.0% (0.0–5.3%), n=68 |

#### Edited or generated receipts: Fakes caught at risk ≥ 0.5 by source

| Source | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| edited:sharp-patch | 36.7% (14.7–66.0%), n=10 | 43.3% (19.0–71.4%), n=10 | 33.3% (12.7–63.2%), n=10 | 0.0% (0.0–27.8%), n=10 |

#### Edited or generated receipts: Fakes caught at risk ≥ 0.7 by source

| Source | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| edited:sharp-patch | 16.7% (4.2–47.6%), n=10 | 30.0% (10.8–60.3%), n=10 | 30.0% (10.8–60.3%), n=10 | 0.0% (0.0–27.8%), n=10 |

#### Edited or generated receipts: Fakes caught at risk ≥ 0.5 by provenance metadata

| Provenance metadata | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Left in | 85.0% (64.0–94.8%), n=20 | 40.0% (21.9–61.3%), n=20 | 53.3% (32.8–72.8%), n=20 | 20.0% (8.1–41.6%), n=20 |
| Stripped | 31.7% (15.7–53.5%), n=20 | 50.0% (29.9–70.1%), n=20 | 53.3% (32.8–72.8%), n=20 | 25.0% (11.2–46.9%), n=20 |

#### Edited or generated receipts: Fakes caught at risk ≥ 0.7 by provenance metadata

| Provenance metadata | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Left in | 83.3% (62.1–93.9%), n=20 | 31.7% (15.7–53.5%), n=20 | 53.3% (32.8–72.8%), n=20 | 20.0% (8.1–41.6%), n=20 |
| Stripped | 20.0% (8.1–41.6%), n=20 | 31.7% (15.7–53.5%), n=20 | 51.7% (31.3–71.5%), n=20 | 20.0% (8.1–41.6%), n=20 |

#### Edited or generated receipts: Genuine receipts flagged at risk ≥ 0.5 by provenance metadata

| Provenance metadata | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| none | 2.1% (0.5–7.9%), n=81 | 2.9% (0.9–9.2%), n=81 | 1.2% (0.2–6.7%), n=81 | 0.0% (0.0–4.5%), n=81 |

#### Edited or generated receipts: Genuine receipts flagged at risk ≥ 0.7 by provenance metadata

| Provenance metadata | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| none | 0.0% (0.0–4.5%), n=81 | 0.4% (0.0–5.3%), n=81 | 1.2% (0.2–6.7%), n=81 | 0.0% (0.0–4.5%), n=81 |

#### Edited or generated receipts: ROC AUC by fake class

| Fake class | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Fully AI-generated | 0.903 (0.784–0.995), n=101 | 0.805 (0.661–0.921), n=101 | 0.956 (0.901–0.999), n=101 | 0.732 (0.572–0.878), n=101 |
| AI-inpainted edit | 0.798 (0.600–0.963), n=91 | 0.788 (0.588–0.945), n=91 | 0.570 (0.339–0.791), n=91 | 0.565 (0.351–0.768), n=91 |
| Edited by hand | 0.930 (0.830–0.993), n=91 | 0.831 (0.643–0.974), n=91 | 0.750 (0.564–0.917), n=91 | 0.518 (0.303–0.715), n=91 |

#### Edited or generated receipts: Fakes caught at a 1% false-flag rate by fake class

| Fake class | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Fully AI-generated | 70.0% (50.0–90.0%), n=20 | 40.0% (20.0–70.0%), n=20 | 55.0% (35.0–95.0%), n=20 | 55.0% (30.0–75.0%), n=20 |
| AI-inpainted edit | 50.0% (20.0–80.0%), n=10 | 20.0% (0.0–70.0%), n=10 | 10.0% (0.0–50.0%), n=10 | 10.0% (0.0–40.0%), n=10 |
| Edited by hand | 20.0% (0.0–90.0%), n=10 | 30.0% (10.0–80.0%), n=10 | 20.0% (0.0–70.0%), n=10 | 10.0% (0.0–30.0%), n=10 |

#### Edited or generated receipts: Fakes caught at a 5% false-flag rate by fake class

| Fake class | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Fully AI-generated | 85.0% (65.0–100.0%), n=20 | 55.0% (35.0–80.0%), n=20 | 90.0% (75.0–100.0%), n=20 | 55.0% (35.0–75.0%), n=20 |
| AI-inpainted edit | 60.0% (30.0–90.0%), n=10 | 50.0% (20.0–80.0%), n=10 | 30.0% (0.0–60.0%), n=10 | 20.0% (0.0–50.0%), n=10 |
| Edited by hand | 80.0% (40.0–100.0%), n=10 | 50.0% (20.0–90.0%), n=10 | 50.0% (20.0–80.0%), n=10 | 10.0% (0.0–40.0%), n=10 |

#### Edited or generated receipts: Fakes caught at a 10% false-flag rate by fake class

| Fake class | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Fully AI-generated | 85.0% (70.0–100.0%), n=20 | 60.0% (40.0–80.0%), n=20 | 90.0% (75.0–100.0%), n=20 | 55.0% (35.0–75.0%), n=20 |
| AI-inpainted edit | 60.0% (30.0–90.0%), n=10 | 60.0% (30.0–90.0%), n=10 | 30.0% (0.0–60.0%), n=10 | 20.0% (0.0–50.0%), n=10 |
| Edited by hand | 80.0% (60.0–100.0%), n=10 | 70.0% (30.0–90.0%), n=10 | 50.0% (20.0–80.0%), n=10 | 20.0% (0.0–50.0%), n=10 |

#### Edited or generated receipts: Fakes caught at risk ≥ 0.5 by fake class

| Fake class | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Fully AI-generated | 71.7% (49.8–86.6%), n=20 | 48.3% (28.5–68.7%), n=20 | 76.7% (54.9–89.9%), n=20 | 40.0% (21.9–61.3%), n=20 |
| AI-inpainted edit | 53.3% (26.1–78.7%), n=10 | 40.0% (16.8–68.7%), n=10 | 26.7% (9.0–57.3%), n=10 | 10.0% (1.8–40.4%), n=10 |
| Edited by hand | 36.7% (14.7–66.0%), n=10 | 43.3% (19.0–71.4%), n=10 | 33.3% (12.7–63.2%), n=10 | 0.0% (0.0–27.8%), n=10 |

#### Edited or generated receipts: Fakes caught at risk ≥ 0.7 by fake class

| Fake class | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Fully AI-generated | 70.0% (48.1–85.5%), n=20 | 36.7% (19.4–58.3%), n=20 | 76.7% (54.9–89.9%), n=20 | 40.0% (21.9–61.3%), n=20 |
| AI-inpainted edit | 50.0% (23.7–76.3%), n=10 | 23.3% (7.3–54.2%), n=10 | 26.7% (9.0–57.3%), n=10 | 0.0% (0.0–27.8%), n=10 |
| Edited by hand | 16.7% (4.2–47.6%), n=10 | 30.0% (10.8–60.3%), n=10 | 30.0% (10.8–60.3%), n=10 | 0.0% (0.0–27.8%), n=10 |

#### Edited or generated receipts: ROC AUC by printed amounts

| Printed amounts | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Add up | 0.818 (0.685–0.934), n=103 | 0.655 (0.512–0.791), n=103 | 0.734 (0.611–0.860), n=103 | 0.664 (0.515–0.799), n=103 |
| Don't add up | 0.963 (0.912–0.997), n=99 | 0.993 (0.980–1.000), n=99 | 0.898 (0.771–0.994), n=99 | 0.604 (0.431–0.770), n=99 |

#### Edited or generated receipts: Fakes caught at a 1% false-flag rate by printed amounts

| Printed amounts | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Add up | 54.5% (36.4–77.3%), n=22 | 4.5% (0.0–31.8%), n=22 | 27.3% (13.6–63.6%), n=22 | 36.4% (18.2–54.5%), n=22 |
| Don't add up | 50.0% (27.8–94.4%), n=18 | 66.7% (44.4–100.0%), n=18 | 44.4% (22.2–94.4%), n=18 | 27.8% (11.1–50.0%), n=18 |

#### Edited or generated receipts: Fakes caught at a 5% false-flag rate by printed amounts

| Printed amounts | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Add up | 68.2% (45.5–86.4%), n=22 | 18.2% (4.5–45.5%), n=22 | 50.0% (27.3–68.2%), n=22 | 36.4% (18.2–59.1%), n=22 |
| Don't add up | 88.9% (61.1–100.0%), n=18 | 94.4% (83.3–100.0%), n=18 | 83.3% (66.7–100.0%), n=18 | 33.3% (11.1–55.6%), n=18 |

#### Edited or generated receipts: Fakes caught at a 10% false-flag rate by printed amounts

| Printed amounts | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Add up | 68.2% (50.0–86.4%), n=22 | 31.8% (9.1–54.5%), n=22 | 50.0% (27.3–68.3%), n=22 | 40.9% (22.7–59.1%), n=22 |
| Don't add up | 88.9% (72.2–100.0%), n=18 | 100.0% (94.4–100.0%), n=18 | 83.3% (66.7–100.0%), n=18 | 33.3% (11.1–55.6%), n=18 |

#### Edited or generated receipts: Fakes caught at risk ≥ 0.5 by printed amounts

| Printed amounts | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Add up | 54.5% (34.7–73.1%), n=22 | 12.1% (4.0–31.5%), n=22 | 45.5% (26.9–65.3%), n=22 | 27.3% (13.2–48.2%), n=22 |
| Don't add up | 63.0% (40.3–81.1%), n=18 | 85.2% (62.9–95.1%), n=18 | 63.0% (40.3–81.1%), n=18 | 16.7% (5.8–39.2%), n=18 |

#### Edited or generated receipts: Fakes caught at risk ≥ 0.7 by printed amounts

| Printed amounts | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Add up | 54.5% (34.7–73.1%), n=22 | 4.5% (0.8–21.8%), n=22 | 45.5% (26.9–65.3%), n=22 | 27.3% (13.2–48.2%), n=22 |
| Don't add up | 48.1% (27.5–69.4%), n=18 | 64.8% (42.0–82.4%), n=18 | 61.1% (38.6–79.7%), n=18 | 11.1% (3.1–32.8%), n=18 |

### Duplicates

| Metric | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Copies recognised (higher is better) | 98.9% (86.8–99.9%), n=30 | not supported | not supported | not supported |
| Exact copies recognised (higher is better) | 6.7% (1.8–21.3%), n=30 | not supported | not supported | not supported |
| Look-alikes wrongly matched (lower is better) | 4.5% (0.8–21.8%), n=22 | not supported | not supported | not supported |
| Other genuine receipts wrongly matched (lower is better) | 0.0% (0.0–6.1%), n=59 | not supported | not supported | not supported |
| Price per check (lower is better) | $0.0163, n=453 | not supported | not supported | not supported |
| Latency p95 (lower is better) | 8,907 ms, n=453 | not supported | not supported | not supported |

#### Duplicates: Copies recognised by printed amounts

| Printed amounts | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Add up | 98.9% (86.8–99.9%), n=30 | not supported | not supported | not supported |

#### Duplicates: Exact copies recognised by printed amounts

| Printed amounts | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Add up | 6.7% (1.8–21.3%), n=30 | not supported | not supported | not supported |

#### Duplicates: Look-alikes wrongly matched by printed amounts

| Printed amounts | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Add up | 4.5% (0.8–21.8%), n=22 | not supported | not supported | not supported |

#### Duplicates: Other genuine receipts wrongly matched by printed amounts

| Printed amounts | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Add up | 0.0% (0.0–6.4%), n=56 | not supported | not supported | not supported |

#### Duplicates: Copies recognised by capture

| Capture | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Scan | 100.0% (84.5–100.0%), n=21 | not supported | not supported | not supported |

#### Duplicates: Exact copies recognised by capture

| Capture | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Scan | 9.5% (2.7–28.9%), n=21 | not supported | not supported | not supported |

#### Duplicates: Look-alikes wrongly matched by capture

| Capture | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Scan | 4.5% (0.8–21.8%), n=22 | not supported | not supported | not supported |

#### Duplicates: Other genuine receipts wrongly matched by capture

| Capture | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Scan | 0.0% (0.0–7.3%), n=49 | not supported | not supported | not supported |

#### Duplicates: Copies recognised by fake class

| Fake class | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| duplicate | 98.9% (86.8–99.9%), n=30 | not supported | not supported | not supported |

#### Duplicates: Exact copies recognised by fake class

| Fake class | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| duplicate | 6.7% (1.8–21.3%), n=30 | not supported | not supported | not supported |

#### Duplicates: Look-alikes wrongly matched by fake class

| Fake class | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| genuine | 0.0% (0.0–25.9%), n=11 | not supported | not supported | not supported |
| hard_negative | 9.1% (1.6–37.7%), n=11 | not supported | not supported | not supported |

#### Duplicates: Other genuine receipts wrongly matched by fake class

| Fake class | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| genuine | 0.0% (0.0–6.1%), n=59 | not supported | not supported | not supported |

#### Duplicates: Copies recognised by country

| Country | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| MY | 98.9% (86.8–99.9%), n=30 | not supported | not supported | not supported |

#### Duplicates: Exact copies recognised by country

| Country | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| MY | 6.7% (1.8–21.3%), n=30 | not supported | not supported | not supported |

#### Duplicates: Look-alikes wrongly matched by country

| Country | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| MY | 4.5% (0.8–21.8%), n=22 | not supported | not supported | not supported |

#### Duplicates: Other genuine receipts wrongly matched by country

| Country | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| MY | 0.0% (0.0–7.7%), n=46 | not supported | not supported | not supported |

#### Duplicates: Copies recognised by currency

| Currency | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| MYR | 98.9% (86.8–99.9%), n=30 | not supported | not supported | not supported |

#### Duplicates: Exact copies recognised by currency

| Currency | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| MYR | 6.7% (1.8–21.3%), n=30 | not supported | not supported | not supported |

#### Duplicates: Look-alikes wrongly matched by currency

| Currency | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| MYR | 4.5% (0.8–21.8%), n=22 | not supported | not supported | not supported |

#### Duplicates: Other genuine receipts wrongly matched by currency

| Currency | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| MYR | 0.0% (0.0–7.7%), n=46 | not supported | not supported | not supported |

#### Duplicates: Copies recognised by date era

| Date era | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| old | 98.9% (86.8–99.9%), n=30 | not supported | not supported | not supported |

#### Duplicates: Exact copies recognised by date era

| Date era | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| old | 6.7% (1.8–21.3%), n=30 | not supported | not supported | not supported |

#### Duplicates: Look-alikes wrongly matched by date era

| Date era | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| old | 4.5% (0.8–21.8%), n=22 | not supported | not supported | not supported |

#### Duplicates: Other genuine receipts wrongly matched by date era

| Date era | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| old | 0.0% (0.0–7.7%), n=46 | not supported | not supported | not supported |
| recent | 0.0% (0.0–22.8%), n=13 | not supported | not supported | not supported |

#### Duplicates: Copies recognised by document type

| Document type | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| receipt | 98.9% (86.8–99.9%), n=30 | not supported | not supported | not supported |

#### Duplicates: Exact copies recognised by document type

| Document type | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| receipt | 6.7% (1.8–21.3%), n=30 | not supported | not supported | not supported |

#### Duplicates: Look-alikes wrongly matched by document type

| Document type | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| receipt | 4.5% (0.8–21.8%), n=22 | not supported | not supported | not supported |

#### Duplicates: Other genuine receipts wrongly matched by document type

| Document type | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| receipt | 0.0% (0.0–6.1%), n=59 | not supported | not supported | not supported |

#### Duplicates: Copies recognised by language

| Language | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| en | 98.9% (86.8–99.9%), n=30 | not supported | not supported | not supported |

#### Duplicates: Exact copies recognised by language

| Language | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| en | 6.7% (1.8–21.3%), n=30 | not supported | not supported | not supported |

#### Duplicates: Look-alikes wrongly matched by language

| Language | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| en | 4.5% (0.8–21.8%), n=22 | not supported | not supported | not supported |

#### Duplicates: Other genuine receipts wrongly matched by language

| Language | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| en | 0.0% (0.0–7.6%), n=47 | not supported | not supported | not supported |

#### Duplicates: Copies recognised by provenance metadata

| Provenance metadata | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| none | 98.9% (86.8–99.9%), n=30 | not supported | not supported | not supported |

#### Duplicates: Exact copies recognised by provenance metadata

| Provenance metadata | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| none | 6.7% (1.8–21.3%), n=30 | not supported | not supported | not supported |

#### Duplicates: Look-alikes wrongly matched by provenance metadata

| Provenance metadata | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| none | 4.5% (0.8–21.8%), n=22 | not supported | not supported | not supported |

#### Duplicates: Other genuine receipts wrongly matched by provenance metadata

| Provenance metadata | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| none | 0.0% (0.0–6.1%), n=59 | not supported | not supported | not supported |

#### Duplicates: Other genuine receipts wrongly matched by source

| Source | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| commons | 0.0% (0.0–22.8%), n=13 | not supported | not supported | not supported |
| sroie | 0.0% (0.0–7.7%), n=46 | not supported | not supported | not supported |

#### Duplicates: Copies recognised by source

| Source | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| sroie | 98.9% (86.8–99.9%), n=30 | not supported | not supported | not supported |

#### Duplicates: Exact copies recognised by source

| Source | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| sroie | 6.7% (1.8–21.3%), n=30 | not supported | not supported | not supported |

#### Duplicates: Look-alikes wrongly matched by source

| Source | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| sroie | 4.5% (0.8–21.8%), n=22 | not supported | not supported | not supported |

### Decisions you can act on

| Metric | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Same decision in every repetition (higher is better) | 96.7% (91.8–98.7%), n=121 | 92.6% (86.5–96.0%), n=121 | 95.9% (90.7–98.2%), n=121 | 100.0% (96.9–100.0%), n=121 |
| Same total in every repetition (higher is better) | 100.0% (96.9–100.0%), n=121 | 98.3% (94.2–99.5%), n=121 | 99.2% (95.5–99.9%), n=121 | 100.0% (96.9–100.0%), n=121 |
| Calibration error (lower is better) | 8.2% (5.9–12.9%), n=121 | 10.2% (7.7–14.1%), n=121 | 11.8% (7.8–17.0%), n=121 | 18.3% (14.7–21.6%), n=121 |
| Expected cost per 1,000 receipts, flagging at risk ≥ 0.5 (lower is better) | $762.96 ($341.67–$1,320.25), n=121 | $1,034.81 ($621.71–$1,586.50), n=121 | $674.44 ($358.33–$1,148.33), n=121 | $775.00 ($625.00–$900.00), n=121 |
| Expected cost per 1,000 receipts, flagging at risk ≥ 0.7 (lower is better) | $483.33 ($333.13–$633.33), n=121 | $752.59 ($575.00–$949.44), n=121 | $682.78 ($358.33–$1,206.86), n=121 | $800.00 ($675.00–$925.00), n=121 |
| Cost per 1,000 receipts of approving everything (lower is better) | $1,000.00, n=121 | $1,000.00, n=121 | $1,000.00, n=121 | $1,000.00, n=121 |
| Price per check (lower is better) | $0.0163, n=453 | $0.0010, n=453 | $0.0044, n=453 | $0.0002, n=453 |
| Latency p95 (lower is better) | 8,907 ms, n=453 | 13,551 ms, n=453 | 15,763 ms, n=453 | 680 ms, n=453 |

#### Decisions you can act on: Expected cost per 1,000 receipts, flagging at risk ≥ 0.5 by cost assumption

| Cost assumption | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| 0.1% of receipts fake | $391.11 ($35.00–$959.39), n=121 | $544.22 ($138.20–$1,110.00), n=121 | $256.33 ($35.00–$683.19), n=121 | $77.50 ($65.00–$90.00), n=121 |
| 5% of receipts fake | $2,415.64 ($1,591.26–$3,340.45), n=121 | $3,215.23 ($2,390.84–$4,105.07), n=121 | $2,532.72 ($1,750.00–$3,333.33), n=121 | $3,875.00 ($3,250.00–$4,500.00), n=121 |
| A missed fake costs $32 | $479.63 ($114.60–$1,041.77), n=121 | $660.81 ($269.19–$1,209.56), n=121 | $357.11 ($114.67–$794.07), n=121 | $248.00 ($208.00–$288.00), n=121 |
| A missed fake costs $182 | $1,104.63 ($621.72–$1,710.78), n=121 | $1,485.81 ($987.74–$2,089.54), n=121 | $1,057.11 ($637.00–$1,594.00), n=121 | $1,410.50 ($1,183.00–$1,638.00), n=121 |
| A false flag costs $8 | $579.63 ($340.17–$900.19), n=121 | $778.15 ($539.44–$1,059.39), n=121 | $564.44 ($358.33–$835.00), n=121 | $775.00 ($650.00–$900.00), n=121 |
| A false flag costs $73 | $1,903.70 ($333.33–$4,349.98), n=121 | $2,631.85 ($930.74–$5,011.11), n=121 | $1,358.89 ($358.33–$3,251.87), n=121 | $775.00 ($625.00–$900.00), n=121 |

#### Decisions you can act on: Expected cost per 1,000 receipts, flagging at risk ≥ 0.7 by cost assumption

| Cost assumption | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| 0.1% of receipts fake | $48.33 ($32.50–$63.35), n=121 | $138.22 ($59.17–$292.17), n=121 | $257.17 ($36.67–$685.67), n=121 | $80.00 ($67.50–$90.00), n=121 |
| 5% of receipts fake | $2,416.67 ($1,666.67–$3,166.67), n=121 | $3,483.13 ($2,816.46–$4,125.00), n=121 | $2,574.38 ($1,791.67–$3,375.15), n=121 | $4,000.00 ($3,375.00–$4,625.00), n=121 |
| A missed fake costs $32 | $154.67 ($106.67–$202.67), n=121 | $287.93 ($184.00–$450.44), n=121 | $359.78 ($119.93–$791.33), n=121 | $256.00 ($216.00–$296.00), n=121 |
| A missed fake costs $182 | $879.67 ($606.67–$1,167.83), n=121 | $1,312.93 ($1,061.67–$1,601.09), n=121 | $1,072.28 ($637.00–$1,639.88), n=121 | $1,456.00 ($1,228.50–$1,638.00), n=121 |
| A false flag costs $8 | $483.33 ($325.00–$633.33), n=121 | $715.93 ($574.98–$856.85), n=121 | $572.78 ($358.33–$832.83), n=121 | $800.00 ($675.00–$925.00), n=121 |
| A false flag costs $73 | $483.33 ($333.33–$625.00), n=121 | $980.74 ($591.67–$1,650.56), n=121 | $1,367.22 ($358.33–$3,235.21), n=121 | $800.00 ($675.00–$900.00), n=121 |

#### Decisions you can act on: Cost per 1,000 receipts of approving everything by cost assumption

| Cost assumption | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| 0.1% of receipts fake | $100.00, n=121 | $100.00, n=121 | $100.00, n=121 | $100.00, n=121 |
| 5% of receipts fake | $5,000.00, n=121 | $5,000.00, n=121 | $5,000.00, n=121 | $5,000.00, n=121 |
| A missed fake costs $32 | $320.00, n=121 | $320.00, n=121 | $320.00, n=121 | $320.00, n=121 |
| A missed fake costs $182 | $1,820.00, n=121 | $1,820.00, n=121 | $1,820.00, n=121 | $1,820.00, n=121 |
| A false flag costs $8 | $1,000.00, n=121 | $1,000.00, n=121 | $1,000.00, n=121 | $1,000.00, n=121 |
| A false flag costs $73 | $1,000.00, n=121 | $1,000.00, n=121 | $1,000.00, n=121 | $1,000.00, n=121 |

### What's wrong, and where

| Metric | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Edited fakes flagged with the edited field named (higher is better) | 33.3% (16.9–55.1%), n=20 | 36.7% (19.4–58.3%), n=20 | 30.0% (14.5–51.9%), n=20 | 5.0% (0.9–23.6%), n=20 |
| Price per check (lower is better) | $0.0163, n=453 | $0.0010, n=453 | $0.0044, n=453 | $0.0002, n=453 |
| Latency p95 (lower is better) | 8,907 ms, n=453 | 13,551 ms, n=453 | 15,763 ms, n=453 | 680 ms, n=453 |

### Proof, not opinion

| Metric | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Fakes caught with verifiable proof (higher is better) | 53.3% (38.3–67.8%), n=40 | not supported | not supported | not supported |
| Genuine receipts with false proof (lower is better) | 2.5% (0.7–8.6%), n=81 | not supported | not supported | not supported |
| Price per check (lower is better) | $0.0163, n=453 | not supported | not supported | not supported |
| Latency p95 (lower is better) | 8,907 ms, n=453 | not supported | not supported | not supported |

#### Proof, not opinion: Fakes caught with verifiable proof by fake class

| Fake class | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Fully AI-generated | 61.7% (40.2–79.4%), n=20 | not supported | not supported | not supported |
| AI-inpainted edit | 53.3% (26.1–78.7%), n=10 | not supported | not supported | not supported |
| Edited by hand | 36.7% (14.7–66.0%), n=10 | not supported | not supported | not supported |

### Cost, speed and failures

| Metric | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Latency p50 (lower is better) | 4,057 ms, n=453 | 8,565 ms, n=453 | 6,598 ms, n=453 | 384 ms, n=453 |
| Latency p95 (lower is better) | 8,907 ms, n=453 | 13,551 ms, n=453 | 15,763 ms, n=453 | 680 ms, n=453 |
| Latency p99 (lower is better) | 10,351 ms, n=453 | 16,298 ms, n=453 | 22,150 ms, n=453 | 876 ms, n=453 |
| Price per check (lower is better) | $0.0163, n=453 | $0.0010, n=453 | $0.0044, n=453 | $0.0002, n=453 |
| Model cost per check (lower is better) | $0.0011, n=453 | $0.0010, n=453 | $0.0044, n=453 | $0.0002, n=453 |
| Errors (lower is better) | 0.0% (0.0–0.8%), n=453 | 0.0% (0.0–0.8%), n=453 | 0.0% (0.0–0.8%), n=453 | 0.0% (0.0–0.8%), n=453 |
| Refusals (lower is better) | 0.0% (0.0–0.8%), n=453 | 0.0% (0.0–0.8%), n=453 | 0.0% (0.0–0.8%), n=453 | 0.0% (0.0–0.8%), n=453 |
| Timeouts (lower is better) | 0.0% (0.0–0.8%), n=453 | 0.0% (0.0–0.8%), n=453 | 0.0% (0.0–0.8%), n=453 | 0.0% (0.0–0.8%), n=453 |

#### Cost, speed and failures: Latency p50 by printed amounts

| Printed amounts | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Add up | 3,936 ms, n=390 | 8,235 ms, n=390 | 6,396 ms, n=390 | 392 ms, n=390 |
| Don't add up | 5,733 ms, n=54 | 10,637 ms, n=54 | 10,914 ms, n=54 | 363 ms, n=54 |

#### Cost, speed and failures: Latency p95 by printed amounts

| Printed amounts | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Add up | 8,564 ms, n=390 | 12,548 ms, n=390 | 12,977 ms, n=390 | 685 ms, n=390 |
| Don't add up | 9,387 ms, n=54 | 15,342 ms, n=54 | 19,329 ms, n=54 | 643 ms, n=54 |

#### Cost, speed and failures: Latency p99 by printed amounts

| Printed amounts | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Add up | 9,740 ms, n=390 | 15,099 ms, n=390 | 19,315 ms, n=390 | 903 ms, n=390 |
| Don't add up | 11,242 ms, n=54 | 16,228 ms, n=54 | 23,502 ms, n=54 | 772 ms, n=54 |

#### Cost, speed and failures: Price per check by printed amounts

| Printed amounts | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Add up | $0.0163, n=390 | $0.0010, n=390 | $0.0041, n=390 | $0.0002, n=390 |
| Don't add up | $0.0163, n=54 | $0.0012, n=54 | $0.0068, n=54 | $0.0002, n=54 |

#### Cost, speed and failures: Model cost per check by printed amounts

| Printed amounts | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Add up | $0.0011, n=390 | $0.0010, n=390 | $0.0041, n=390 | $0.0002, n=390 |
| Don't add up | $0.0012, n=54 | $0.0012, n=54 | $0.0068, n=54 | $0.0002, n=54 |

#### Cost, speed and failures: Errors by printed amounts

| Printed amounts | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Add up | 0.0% (0.0–1.0%), n=390 | 0.0% (0.0–1.0%), n=390 | 0.0% (0.0–1.0%), n=390 | 0.0% (0.0–1.0%), n=390 |
| Don't add up | 0.0% (0.0–6.6%), n=54 | 0.0% (0.0–6.6%), n=54 | 0.0% (0.0–6.6%), n=54 | 0.0% (0.0–6.6%), n=54 |

#### Cost, speed and failures: Refusals by printed amounts

| Printed amounts | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Add up | 0.0% (0.0–1.0%), n=390 | 0.0% (0.0–1.0%), n=390 | 0.0% (0.0–1.0%), n=390 | 0.0% (0.0–1.0%), n=390 |
| Don't add up | 0.0% (0.0–6.6%), n=54 | 0.0% (0.0–6.6%), n=54 | 0.0% (0.0–6.6%), n=54 | 0.0% (0.0–6.6%), n=54 |

#### Cost, speed and failures: Timeouts by printed amounts

| Printed amounts | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Add up | 0.0% (0.0–1.0%), n=390 | 0.0% (0.0–1.0%), n=390 | 0.0% (0.0–1.0%), n=390 | 0.0% (0.0–1.0%), n=390 |
| Don't add up | 0.0% (0.0–6.6%), n=54 | 0.0% (0.0–6.6%), n=54 | 0.0% (0.0–6.6%), n=54 | 0.0% (0.0–6.6%), n=54 |

#### Cost, speed and failures: Latency p50 by arithmetic error

| Arithmetic error | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| totals | 5,574 ms, n=21 | 10,426 ms, n=21 | 10,421 ms, n=21 | 368 ms, n=21 |

#### Cost, speed and failures: Latency p95 by arithmetic error

| Arithmetic error | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| totals | 8,925 ms, n=21 | 13,083 ms, n=21 | 19,274 ms, n=21 | 648 ms, n=21 |

#### Cost, speed and failures: Latency p99 by arithmetic error

| Arithmetic error | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| totals | 9,089 ms, n=21 | 14,237 ms, n=21 | 19,967 ms, n=21 | 754 ms, n=21 |

#### Cost, speed and failures: Price per check by arithmetic error

| Arithmetic error | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| totals | $0.0163, n=21 | $0.0012, n=21 | $0.0067, n=21 | $0.0002, n=21 |

#### Cost, speed and failures: Model cost per check by arithmetic error

| Arithmetic error | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| totals | $0.0011, n=21 | $0.0012, n=21 | $0.0067, n=21 | $0.0002, n=21 |

#### Cost, speed and failures: Errors by arithmetic error

| Arithmetic error | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| totals | 0.0% (0.0–15.5%), n=21 | 0.0% (0.0–15.5%), n=21 | 0.0% (0.0–15.5%), n=21 | 0.0% (0.0–15.5%), n=21 |

#### Cost, speed and failures: Refusals by arithmetic error

| Arithmetic error | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| totals | 0.0% (0.0–15.5%), n=21 | 0.0% (0.0–15.5%), n=21 | 0.0% (0.0–15.5%), n=21 | 0.0% (0.0–15.5%), n=21 |

#### Cost, speed and failures: Timeouts by arithmetic error

| Arithmetic error | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| totals | 0.0% (0.0–15.5%), n=21 | 0.0% (0.0–15.5%), n=21 | 0.0% (0.0–15.5%), n=21 | 0.0% (0.0–15.5%), n=21 |

#### Cost, speed and failures: Latency p50 by genuine receipt it was made from

| Genuine receipt it was made from | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| sroie | 4,662 ms, n=60 | 9,839 ms, n=60 | 8,903 ms, n=60 | 352 ms, n=60 |

#### Cost, speed and failures: Latency p95 by genuine receipt it was made from

| Genuine receipt it was made from | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| sroie | 9,077 ms, n=60 | 15,093 ms, n=60 | 18,169 ms, n=60 | 616 ms, n=60 |

#### Cost, speed and failures: Latency p99 by genuine receipt it was made from

| Genuine receipt it was made from | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| sroie | 11,121 ms, n=60 | 16,225 ms, n=60 | 22,655 ms, n=60 | 800 ms, n=60 |

#### Cost, speed and failures: Price per check by genuine receipt it was made from

| Genuine receipt it was made from | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| sroie | $0.0163, n=60 | $0.0011, n=60 | $0.0056, n=60 | $0.0002, n=60 |

#### Cost, speed and failures: Model cost per check by genuine receipt it was made from

| Genuine receipt it was made from | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| sroie | $0.0011, n=60 | $0.0011, n=60 | $0.0056, n=60 | $0.0002, n=60 |

#### Cost, speed and failures: Errors by genuine receipt it was made from

| Genuine receipt it was made from | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| sroie | 0.0% (0.0–6.0%), n=60 | 0.0% (0.0–6.0%), n=60 | 0.0% (0.0–6.0%), n=60 | 0.0% (0.0–6.0%), n=60 |

#### Cost, speed and failures: Refusals by genuine receipt it was made from

| Genuine receipt it was made from | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| sroie | 0.0% (0.0–6.0%), n=60 | 0.0% (0.0–6.0%), n=60 | 0.0% (0.0–6.0%), n=60 | 0.0% (0.0–6.0%), n=60 |

#### Cost, speed and failures: Timeouts by genuine receipt it was made from

| Genuine receipt it was made from | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| sroie | 0.0% (0.0–6.0%), n=60 | 0.0% (0.0–6.0%), n=60 | 0.0% (0.0–6.0%), n=60 | 0.0% (0.0–6.0%), n=60 |

#### Cost, speed and failures: Latency p50 by capture

| Capture | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Phone photo | 6,139 ms, n=75 | 9,005 ms, n=75 | 9,150 ms, n=75 | 422 ms, n=75 |
| Scan | 3,804 ms, n=360 | 8,469 ms, n=360 | 6,361 ms, n=360 | 379 ms, n=360 |
| Screenshot | 5,540 ms, n=15 | 8,126 ms, n=15 | 6,503 ms, n=15 | 370 ms, n=15 |

#### Cost, speed and failures: Latency p95 by capture

| Capture | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Phone photo | 8,987 ms, n=75 | 14,632 ms, n=75 | 17,109 ms, n=75 | 678 ms, n=75 |
| Scan | 8,902 ms, n=360 | 13,134 ms, n=360 | 14,783 ms, n=360 | 659 ms, n=360 |
| Screenshot | 6,804 ms, n=15 | 10,305 ms, n=15 | 7,402 ms, n=15 | 573 ms, n=15 |

#### Cost, speed and failures: Latency p99 by capture

| Capture | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Phone photo | 10,288 ms, n=75 | 15,267 ms, n=75 | 17,888 ms, n=75 | 782 ms, n=75 |
| Scan | 10,735 ms, n=360 | 16,225 ms, n=360 | 22,944 ms, n=360 | 872 ms, n=360 |
| Screenshot | 6,945 ms, n=15 | 10,717 ms, n=15 | 7,432 ms, n=15 | 628 ms, n=15 |

#### Cost, speed and failures: Price per check by capture

| Capture | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Phone photo | $0.0163, n=75 | $0.0010, n=75 | $0.0055, n=75 | $0.0002, n=75 |
| Scan | $0.0163, n=360 | $0.0010, n=360 | $0.0042, n=360 | $0.0002, n=360 |
| Screenshot | $0.0163, n=15 | $0.0009, n=15 | $0.0039, n=15 | $0.0002, n=15 |

#### Cost, speed and failures: Model cost per check by capture

| Capture | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Phone photo | $0.0012, n=75 | $0.0010, n=75 | $0.0055, n=75 | $0.0002, n=75 |
| Scan | $0.0010, n=360 | $0.0010, n=360 | $0.0042, n=360 | $0.0002, n=360 |
| Screenshot | $0.0011, n=15 | $0.0009, n=15 | $0.0039, n=15 | $0.0002, n=15 |

#### Cost, speed and failures: Errors by capture

| Capture | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Phone photo | 0.0% (0.0–4.9%), n=75 | 0.0% (0.0–4.9%), n=75 | 0.0% (0.0–4.9%), n=75 | 0.0% (0.0–4.9%), n=75 |
| Scan | 0.0% (0.0–1.1%), n=360 | 0.0% (0.0–1.1%), n=360 | 0.0% (0.0–1.1%), n=360 | 0.0% (0.0–1.1%), n=360 |
| Screenshot | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 |

#### Cost, speed and failures: Refusals by capture

| Capture | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Phone photo | 0.0% (0.0–4.9%), n=75 | 0.0% (0.0–4.9%), n=75 | 0.0% (0.0–4.9%), n=75 | 0.0% (0.0–4.9%), n=75 |
| Scan | 0.0% (0.0–1.1%), n=360 | 0.0% (0.0–1.1%), n=360 | 0.0% (0.0–1.1%), n=360 | 0.0% (0.0–1.1%), n=360 |
| Screenshot | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 |

#### Cost, speed and failures: Timeouts by capture

| Capture | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Phone photo | 0.0% (0.0–4.9%), n=75 | 0.0% (0.0–4.9%), n=75 | 0.0% (0.0–4.9%), n=75 | 0.0% (0.0–4.9%), n=75 |
| Scan | 0.0% (0.0–1.1%), n=360 | 0.0% (0.0–1.1%), n=360 | 0.0% (0.0–1.1%), n=360 | 0.0% (0.0–1.1%), n=360 |
| Screenshot | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 |

#### Cost, speed and failures: Latency p50 by fake class

| Fake class | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Fully AI-generated | 5,348 ms, n=60 | 9,542 ms, n=60 | 10,411 ms, n=60 | 408 ms, n=60 |
| AI-inpainted edit | 5,014 ms, n=30 | 7,888 ms, n=30 | 8,941 ms, n=30 | 375 ms, n=30 |
| duplicate | 5,069 ms, n=90 | 8,141 ms, n=90 | 5,743 ms, n=90 | 380 ms, n=90 |
| genuine | 3,627 ms, n=210 | 8,268 ms, n=210 | 6,318 ms, n=210 | 394 ms, n=210 |
| hard_negative | 4,140 ms, n=33 | 8,282 ms, n=33 | 6,135 ms, n=33 | 397 ms, n=33 |
| Edited by hand | 4,530 ms, n=30 | 11,441 ms, n=30 | 8,893 ms, n=30 | 342 ms, n=30 |

#### Cost, speed and failures: Latency p95 by fake class

| Fake class | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Fully AI-generated | 8,620 ms, n=60 | 13,155 ms, n=60 | 18,693 ms, n=60 | 710 ms, n=60 |
| AI-inpainted edit | 8,384 ms, n=30 | 11,348 ms, n=30 | 16,482 ms, n=30 | 696 ms, n=30 |
| duplicate | 9,522 ms, n=90 | 11,510 ms, n=90 | 8,481 ms, n=90 | 564 ms, n=90 |
| genuine | 8,564 ms, n=210 | 13,957 ms, n=210 | 14,554 ms, n=210 | 719 ms, n=210 |
| hard_negative | 8,705 ms, n=33 | 11,066 ms, n=33 | 8,772 ms, n=33 | 651 ms, n=33 |
| Edited by hand | 10,100 ms, n=30 | 16,058 ms, n=30 | 18,853 ms, n=30 | 544 ms, n=30 |

#### Cost, speed and failures: Latency p99 by fake class

| Fake class | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Fully AI-generated | 9,214 ms, n=60 | 15,402 ms, n=60 | 19,629 ms, n=60 | 750 ms, n=60 |
| AI-inpainted edit | 8,588 ms, n=30 | 11,958 ms, n=30 | 18,437 ms, n=30 | 826 ms, n=30 |
| duplicate | 9,997 ms, n=90 | 13,621 ms, n=90 | 16,533 ms, n=90 | 670 ms, n=90 |
| genuine | 11,269 ms, n=210 | 18,092 ms, n=210 | 22,184 ms, n=210 | 956 ms, n=210 |
| hard_negative | 9,631 ms, n=33 | 11,655 ms, n=33 | 10,814 ms, n=33 | 718 ms, n=33 |
| Edited by hand | 11,726 ms, n=30 | 16,241 ms, n=30 | 25,013 ms, n=30 | 626 ms, n=30 |

#### Cost, speed and failures: Price per check by fake class

| Fake class | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Fully AI-generated | $0.0163, n=60 | $0.0011, n=60 | $0.0063, n=60 | $0.0002, n=60 |
| AI-inpainted edit | $0.0163, n=30 | $0.0009, n=30 | $0.0053, n=30 | $0.0002, n=30 |
| duplicate | $0.0163, n=90 | $0.0009, n=90 | $0.0036, n=90 | $0.0002, n=90 |
| genuine | $0.0163, n=210 | $0.0010, n=210 | $0.0041, n=210 | $0.0002, n=210 |
| hard_negative | $0.0163, n=33 | $0.0009, n=33 | $0.0036, n=33 | $0.0002, n=33 |
| Edited by hand | $0.0163, n=30 | $0.0013, n=30 | $0.0059, n=30 | $0.0002, n=30 |

#### Cost, speed and failures: Model cost per check by fake class

| Fake class | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Fully AI-generated | $0.0011, n=60 | $0.0011, n=60 | $0.0063, n=60 | $0.0002, n=60 |
| AI-inpainted edit | $0.0011, n=30 | $0.0009, n=30 | $0.0053, n=30 | $0.0002, n=30 |
| duplicate | $0.0011, n=90 | $0.0009, n=90 | $0.0036, n=90 | $0.0002, n=90 |
| genuine | $0.0010, n=210 | $0.0010, n=210 | $0.0041, n=210 | $0.0002, n=210 |
| hard_negative | $0.0011, n=33 | $0.0009, n=33 | $0.0036, n=33 | $0.0002, n=33 |
| Edited by hand | $0.0012, n=30 | $0.0013, n=30 | $0.0059, n=30 | $0.0002, n=30 |

#### Cost, speed and failures: Errors by fake class

| Fake class | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Fully AI-generated | 0.0% (0.0–6.0%), n=60 | 0.0% (0.0–6.0%), n=60 | 0.0% (0.0–6.0%), n=60 | 0.0% (0.0–6.0%), n=60 |
| AI-inpainted edit | 0.0% (0.0–11.4%), n=30 | 0.0% (0.0–11.4%), n=30 | 0.0% (0.0–11.4%), n=30 | 0.0% (0.0–11.4%), n=30 |
| duplicate | 0.0% (0.0–4.1%), n=90 | 0.0% (0.0–4.1%), n=90 | 0.0% (0.0–4.1%), n=90 | 0.0% (0.0–4.1%), n=90 |
| genuine | 0.0% (0.0–1.8%), n=210 | 0.0% (0.0–1.8%), n=210 | 0.0% (0.0–1.8%), n=210 | 0.0% (0.0–1.8%), n=210 |
| hard_negative | 0.0% (0.0–10.4%), n=33 | 0.0% (0.0–10.4%), n=33 | 0.0% (0.0–10.4%), n=33 | 0.0% (0.0–10.4%), n=33 |
| Edited by hand | 0.0% (0.0–11.4%), n=30 | 0.0% (0.0–11.4%), n=30 | 0.0% (0.0–11.4%), n=30 | 0.0% (0.0–11.4%), n=30 |

#### Cost, speed and failures: Refusals by fake class

| Fake class | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Fully AI-generated | 0.0% (0.0–6.0%), n=60 | 0.0% (0.0–6.0%), n=60 | 0.0% (0.0–6.0%), n=60 | 0.0% (0.0–6.0%), n=60 |
| AI-inpainted edit | 0.0% (0.0–11.4%), n=30 | 0.0% (0.0–11.4%), n=30 | 0.0% (0.0–11.4%), n=30 | 0.0% (0.0–11.4%), n=30 |
| duplicate | 0.0% (0.0–4.1%), n=90 | 0.0% (0.0–4.1%), n=90 | 0.0% (0.0–4.1%), n=90 | 0.0% (0.0–4.1%), n=90 |
| genuine | 0.0% (0.0–1.8%), n=210 | 0.0% (0.0–1.8%), n=210 | 0.0% (0.0–1.8%), n=210 | 0.0% (0.0–1.8%), n=210 |
| hard_negative | 0.0% (0.0–10.4%), n=33 | 0.0% (0.0–10.4%), n=33 | 0.0% (0.0–10.4%), n=33 | 0.0% (0.0–10.4%), n=33 |
| Edited by hand | 0.0% (0.0–11.4%), n=30 | 0.0% (0.0–11.4%), n=30 | 0.0% (0.0–11.4%), n=30 | 0.0% (0.0–11.4%), n=30 |

#### Cost, speed and failures: Timeouts by fake class

| Fake class | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Fully AI-generated | 0.0% (0.0–6.0%), n=60 | 0.0% (0.0–6.0%), n=60 | 0.0% (0.0–6.0%), n=60 | 0.0% (0.0–6.0%), n=60 |
| AI-inpainted edit | 0.0% (0.0–11.4%), n=30 | 0.0% (0.0–11.4%), n=30 | 0.0% (0.0–11.4%), n=30 | 0.0% (0.0–11.4%), n=30 |
| duplicate | 0.0% (0.0–4.1%), n=90 | 0.0% (0.0–4.1%), n=90 | 0.0% (0.0–4.1%), n=90 | 0.0% (0.0–4.1%), n=90 |
| genuine | 0.0% (0.0–1.8%), n=210 | 0.0% (0.0–1.8%), n=210 | 0.0% (0.0–1.8%), n=210 | 0.0% (0.0–1.8%), n=210 |
| hard_negative | 0.0% (0.0–10.4%), n=33 | 0.0% (0.0–10.4%), n=33 | 0.0% (0.0–10.4%), n=33 | 0.0% (0.0–10.4%), n=33 |
| Edited by hand | 0.0% (0.0–11.4%), n=30 | 0.0% (0.0–11.4%), n=30 | 0.0% (0.0–11.4%), n=30 | 0.0% (0.0–11.4%), n=30 |

#### Cost, speed and failures: Latency p50 by country

| Country | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| JP | 4,107 ms, n=12 | 6,893 ms, n=12 | 8,981 ms, n=12 | 445 ms, n=12 |
| MY | 3,924 ms, n=369 | 8,529 ms, n=369 | 6,358 ms, n=369 | 379 ms, n=369 |

#### Cost, speed and failures: Latency p95 by country

| Country | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| JP | 6,432 ms, n=12 | 9,293 ms, n=12 | 14,634 ms, n=12 | 740 ms, n=12 |
| MY | 8,980 ms, n=369 | 12,982 ms, n=369 | 14,707 ms, n=369 | 641 ms, n=369 |

#### Cost, speed and failures: Latency p99 by country

| Country | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| JP | 6,718 ms, n=12 | 9,602 ms, n=12 | 17,094 ms, n=12 | 778 ms, n=12 |
| MY | 10,719 ms, n=369 | 16,220 ms, n=369 | 21,384 ms, n=369 | 868 ms, n=369 |

#### Cost, speed and failures: Price per check by country

| Country | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| JP | $0.0163, n=12 | $0.0008, n=12 | $0.0052, n=12 | $0.0002, n=12 |
| MY | $0.0163, n=369 | $0.0010, n=369 | $0.0041, n=369 | $0.0002, n=369 |

#### Cost, speed and failures: Model cost per check by country

| Country | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| JP | $0.0011, n=12 | $0.0008, n=12 | $0.0052, n=12 | $0.0002, n=12 |
| MY | $0.0011, n=369 | $0.0010, n=369 | $0.0041, n=369 | $0.0002, n=369 |

#### Cost, speed and failures: Errors by country

| Country | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| JP | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 |
| MY | 0.0% (0.0–1.0%), n=369 | 0.0% (0.0–1.0%), n=369 | 0.0% (0.0–1.0%), n=369 | 0.0% (0.0–1.0%), n=369 |

#### Cost, speed and failures: Refusals by country

| Country | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| JP | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 |
| MY | 0.0% (0.0–1.0%), n=369 | 0.0% (0.0–1.0%), n=369 | 0.0% (0.0–1.0%), n=369 | 0.0% (0.0–1.0%), n=369 |

#### Cost, speed and failures: Timeouts by country

| Country | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| JP | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 |
| MY | 0.0% (0.0–1.0%), n=369 | 0.0% (0.0–1.0%), n=369 | 0.0% (0.0–1.0%), n=369 | 0.0% (0.0–1.0%), n=369 |

#### Cost, speed and failures: Latency p50 by currency

| Currency | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| JPY | 4,107 ms, n=12 | 6,893 ms, n=12 | 8,981 ms, n=12 | 445 ms, n=12 |
| MYR | 3,924 ms, n=369 | 8,529 ms, n=369 | 6,358 ms, n=369 | 379 ms, n=369 |

#### Cost, speed and failures: Latency p95 by currency

| Currency | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| JPY | 6,432 ms, n=12 | 9,293 ms, n=12 | 14,634 ms, n=12 | 740 ms, n=12 |
| MYR | 8,980 ms, n=369 | 12,982 ms, n=369 | 14,707 ms, n=369 | 641 ms, n=369 |

#### Cost, speed and failures: Latency p99 by currency

| Currency | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| JPY | 6,718 ms, n=12 | 9,602 ms, n=12 | 17,094 ms, n=12 | 778 ms, n=12 |
| MYR | 10,719 ms, n=369 | 16,220 ms, n=369 | 21,384 ms, n=369 | 868 ms, n=369 |

#### Cost, speed and failures: Price per check by currency

| Currency | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| JPY | $0.0163, n=12 | $0.0008, n=12 | $0.0052, n=12 | $0.0002, n=12 |
| MYR | $0.0163, n=369 | $0.0010, n=369 | $0.0041, n=369 | $0.0002, n=369 |

#### Cost, speed and failures: Model cost per check by currency

| Currency | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| JPY | $0.0011, n=12 | $0.0008, n=12 | $0.0052, n=12 | $0.0002, n=12 |
| MYR | $0.0011, n=369 | $0.0010, n=369 | $0.0041, n=369 | $0.0002, n=369 |

#### Cost, speed and failures: Errors by currency

| Currency | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| JPY | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 |
| MYR | 0.0% (0.0–1.0%), n=369 | 0.0% (0.0–1.0%), n=369 | 0.0% (0.0–1.0%), n=369 | 0.0% (0.0–1.0%), n=369 |

#### Cost, speed and failures: Refusals by currency

| Currency | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| JPY | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 |
| MYR | 0.0% (0.0–1.0%), n=369 | 0.0% (0.0–1.0%), n=369 | 0.0% (0.0–1.0%), n=369 | 0.0% (0.0–1.0%), n=369 |

#### Cost, speed and failures: Timeouts by currency

| Currency | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| JPY | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 |
| MYR | 0.0% (0.0–1.0%), n=369 | 0.0% (0.0–1.0%), n=369 | 0.0% (0.0–1.0%), n=369 | 0.0% (0.0–1.0%), n=369 |

#### Cost, speed and failures: Latency p50 by date era

| Date era | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| old | 3,913 ms, n=384 | 8,492 ms, n=384 | 6,404 ms, n=384 | 381 ms, n=384 |
| recent | 5,167 ms, n=69 | 9,186 ms, n=69 | 9,108 ms, n=69 | 422 ms, n=69 |

#### Cost, speed and failures: Latency p95 by date era

| Date era | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| old | 8,888 ms, n=384 | 12,767 ms, n=384 | 15,249 ms, n=384 | 642 ms, n=384 |
| recent | 8,797 ms, n=69 | 14,978 ms, n=69 | 18,122 ms, n=69 | 785 ms, n=69 |

#### Cost, speed and failures: Latency p99 by date era

| Date era | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| old | 10,576 ms, n=384 | 16,212 ms, n=384 | 20,801 ms, n=384 | 860 ms, n=384 |
| recent | 9,627 ms, n=69 | 16,370 ms, n=69 | 22,138 ms, n=69 | 899 ms, n=69 |

#### Cost, speed and failures: Price per check by date era

| Date era | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| old | $0.0163, n=384 | $0.0010, n=384 | $0.0042, n=384 | $0.0002, n=384 |
| recent | $0.0163, n=69 | $0.0011, n=69 | $0.0054, n=69 | $0.0002, n=69 |

#### Cost, speed and failures: Model cost per check by date era

| Date era | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| old | $0.0011, n=384 | $0.0010, n=384 | $0.0042, n=384 | $0.0002, n=384 |
| recent | $0.0011, n=69 | $0.0011, n=69 | $0.0054, n=69 | $0.0002, n=69 |

#### Cost, speed and failures: Errors by date era

| Date era | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| old | 0.0% (0.0–1.0%), n=384 | 0.0% (0.0–1.0%), n=384 | 0.0% (0.0–1.0%), n=384 | 0.0% (0.0–1.0%), n=384 |
| recent | 0.0% (0.0–5.3%), n=69 | 0.0% (0.0–5.3%), n=69 | 0.0% (0.0–5.3%), n=69 | 0.0% (0.0–5.3%), n=69 |

#### Cost, speed and failures: Refusals by date era

| Date era | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| old | 0.0% (0.0–1.0%), n=384 | 0.0% (0.0–1.0%), n=384 | 0.0% (0.0–1.0%), n=384 | 0.0% (0.0–1.0%), n=384 |
| recent | 0.0% (0.0–5.3%), n=69 | 0.0% (0.0–5.3%), n=69 | 0.0% (0.0–5.3%), n=69 | 0.0% (0.0–5.3%), n=69 |

#### Cost, speed and failures: Timeouts by date era

| Date era | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| old | 0.0% (0.0–1.0%), n=384 | 0.0% (0.0–1.0%), n=384 | 0.0% (0.0–1.0%), n=384 | 0.0% (0.0–1.0%), n=384 |
| recent | 0.0% (0.0–5.3%), n=69 | 0.0% (0.0–5.3%), n=69 | 0.0% (0.0–5.3%), n=69 | 0.0% (0.0–5.3%), n=69 |

#### Cost, speed and failures: Latency p50 by document type

| Document type | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| receipt | 4,057 ms, n=453 | 8,565 ms, n=453 | 6,598 ms, n=453 | 384 ms, n=453 |

#### Cost, speed and failures: Latency p95 by document type

| Document type | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| receipt | 8,907 ms, n=453 | 13,551 ms, n=453 | 15,763 ms, n=453 | 680 ms, n=453 |

#### Cost, speed and failures: Latency p99 by document type

| Document type | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| receipt | 10,351 ms, n=453 | 16,298 ms, n=453 | 22,150 ms, n=453 | 876 ms, n=453 |

#### Cost, speed and failures: Price per check by document type

| Document type | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| receipt | $0.0163, n=453 | $0.0010, n=453 | $0.0044, n=453 | $0.0002, n=453 |

#### Cost, speed and failures: Model cost per check by document type

| Document type | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| receipt | $0.0011, n=453 | $0.0010, n=453 | $0.0044, n=453 | $0.0002, n=453 |

#### Cost, speed and failures: Errors by document type

| Document type | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| receipt | 0.0% (0.0–0.8%), n=453 | 0.0% (0.0–0.8%), n=453 | 0.0% (0.0–0.8%), n=453 | 0.0% (0.0–0.8%), n=453 |

#### Cost, speed and failures: Refusals by document type

| Document type | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| receipt | 0.0% (0.0–0.8%), n=453 | 0.0% (0.0–0.8%), n=453 | 0.0% (0.0–0.8%), n=453 | 0.0% (0.0–0.8%), n=453 |

#### Cost, speed and failures: Timeouts by document type

| Document type | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| receipt | 0.0% (0.0–0.8%), n=453 | 0.0% (0.0–0.8%), n=453 | 0.0% (0.0–0.8%), n=453 | 0.0% (0.0–0.8%), n=453 |

#### Cost, speed and failures: Latency p50 by edited field

| Edited field | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| date | 4,020 ms, n=12 | 7,285 ms, n=12 | 5,910 ms, n=12 | 329 ms, n=12 |
| items+total | 4,662 ms, n=12 | 7,954 ms, n=12 | 6,705 ms, n=12 | 358 ms, n=12 |
| total | 6,057 ms, n=27 | 10,823 ms, n=27 | 11,987 ms, n=27 | 353 ms, n=27 |

#### Cost, speed and failures: Latency p95 by edited field

| Edited field | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| date | 7,186 ms, n=12 | 12,787 ms, n=12 | 11,966 ms, n=12 | 694 ms, n=12 |
| items+total | 7,148 ms, n=12 | 11,643 ms, n=12 | 8,848 ms, n=12 | 603 ms, n=12 |
| total | 10,165 ms, n=27 | 16,106 ms, n=27 | 19,185 ms, n=27 | 532 ms, n=27 |

#### Cost, speed and failures: Latency p99 by edited field

| Edited field | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| date | 7,469 ms, n=12 | 13,329 ms, n=12 | 14,077 ms, n=12 | 820 ms, n=12 |
| items+total | 7,348 ms, n=12 | 11,843 ms, n=12 | 8,857 ms, n=12 | 647 ms, n=12 |
| total | 11,787 ms, n=27 | 16,243 ms, n=27 | 25,249 ms, n=27 | 561 ms, n=27 |

#### Cost, speed and failures: Price per check by edited field

| Edited field | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| date | $0.0163, n=12 | $0.0010, n=12 | $0.0041, n=12 | $0.0002, n=12 |
| items+total | $0.0163, n=12 | $0.0009, n=12 | $0.0038, n=12 | $0.0002, n=12 |
| total | $0.0163, n=27 | $0.0012, n=27 | $0.0076, n=27 | $0.0002, n=27 |

#### Cost, speed and failures: Model cost per check by edited field

| Edited field | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| date | $0.0010, n=12 | $0.0010, n=12 | $0.0041, n=12 | $0.0002, n=12 |
| items+total | $0.0011, n=12 | $0.0009, n=12 | $0.0038, n=12 | $0.0002, n=12 |
| total | $0.0012, n=27 | $0.0012, n=27 | $0.0076, n=27 | $0.0002, n=27 |

#### Cost, speed and failures: Errors by edited field

| Edited field | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| date | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 |
| items+total | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 |
| total | 0.0% (0.0–12.5%), n=27 | 0.0% (0.0–12.5%), n=27 | 0.0% (0.0–12.5%), n=27 | 0.0% (0.0–12.5%), n=27 |

#### Cost, speed and failures: Refusals by edited field

| Edited field | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| date | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 |
| items+total | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 |
| total | 0.0% (0.0–12.5%), n=27 | 0.0% (0.0–12.5%), n=27 | 0.0% (0.0–12.5%), n=27 | 0.0% (0.0–12.5%), n=27 |

#### Cost, speed and failures: Timeouts by edited field

| Edited field | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| date | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 |
| items+total | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 |
| total | 0.0% (0.0–12.5%), n=27 | 0.0% (0.0–12.5%), n=27 | 0.0% (0.0–12.5%), n=27 | 0.0% (0.0–12.5%), n=27 |

#### Cost, speed and failures: Latency p50 by language

| Language | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| en | 3,939 ms, n=387 | 8,461 ms, n=387 | 6,411 ms, n=387 | 381 ms, n=387 |
| ja | 4,107 ms, n=12 | 6,893 ms, n=12 | 8,981 ms, n=12 | 445 ms, n=12 |
| zh | 4,746 ms, n=18 | 10,375 ms, n=18 | 8,873 ms, n=18 | 420 ms, n=18 |

#### Cost, speed and failures: Latency p95 by language

| Language | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| en | 8,881 ms, n=387 | 12,761 ms, n=387 | 14,510 ms, n=387 | 650 ms, n=387 |
| ja | 6,432 ms, n=12 | 9,293 ms, n=12 | 14,634 ms, n=12 | 740 ms, n=12 |
| zh | 8,181 ms, n=18 | 14,884 ms, n=18 | 11,987 ms, n=18 | 669 ms, n=18 |

#### Cost, speed and failures: Latency p99 by language

| Language | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| en | 10,547 ms, n=387 | 16,211 ms, n=387 | 20,684 ms, n=387 | 859 ms, n=387 |
| ja | 6,718 ms, n=12 | 9,602 ms, n=12 | 17,094 ms, n=12 | 778 ms, n=12 |
| zh | 9,831 ms, n=18 | 14,893 ms, n=18 | 17,116 ms, n=18 | 723 ms, n=18 |

#### Cost, speed and failures: Price per check by language

| Language | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| en | $0.0163, n=387 | $0.0010, n=387 | $0.0042, n=387 | $0.0002, n=387 |
| ja | $0.0163, n=12 | $0.0008, n=12 | $0.0052, n=12 | $0.0002, n=12 |
| zh | $0.0163, n=18 | $0.0011, n=18 | $0.0046, n=18 | $0.0002, n=18 |

#### Cost, speed and failures: Model cost per check by language

| Language | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| en | $0.0011, n=387 | $0.0010, n=387 | $0.0042, n=387 | $0.0002, n=387 |
| ja | $0.0011, n=12 | $0.0008, n=12 | $0.0052, n=12 | $0.0002, n=12 |
| zh | $0.0011, n=18 | $0.0011, n=18 | $0.0046, n=18 | $0.0002, n=18 |

#### Cost, speed and failures: Errors by language

| Language | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| en | 0.0% (0.0–1.0%), n=387 | 0.0% (0.0–1.0%), n=387 | 0.0% (0.0–1.0%), n=387 | 0.0% (0.0–1.0%), n=387 |
| ja | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 |
| zh | 0.0% (0.0–17.6%), n=18 | 0.0% (0.0–17.6%), n=18 | 0.0% (0.0–17.6%), n=18 | 0.0% (0.0–17.6%), n=18 |

#### Cost, speed and failures: Refusals by language

| Language | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| en | 0.0% (0.0–1.0%), n=387 | 0.0% (0.0–1.0%), n=387 | 0.0% (0.0–1.0%), n=387 | 0.0% (0.0–1.0%), n=387 |
| ja | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 |
| zh | 0.0% (0.0–17.6%), n=18 | 0.0% (0.0–17.6%), n=18 | 0.0% (0.0–17.6%), n=18 | 0.0% (0.0–17.6%), n=18 |

#### Cost, speed and failures: Timeouts by language

| Language | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| en | 0.0% (0.0–1.0%), n=387 | 0.0% (0.0–1.0%), n=387 | 0.0% (0.0–1.0%), n=387 | 0.0% (0.0–1.0%), n=387 |
| ja | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 |
| zh | 0.0% (0.0–17.6%), n=18 | 0.0% (0.0–17.6%), n=18 | 0.0% (0.0–17.6%), n=18 | 0.0% (0.0–17.6%), n=18 |

#### Cost, speed and failures: Latency p50 by generation prompt

| Generation prompt | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| explicit_amounts | 3,707 ms, n=24 | 9,332 ms, n=24 | 10,439 ms, n=24 | 405 ms, n=24 |
| free | 6,430 ms, n=15 | 8,565 ms, n=15 | 10,049 ms, n=15 | 422 ms, n=15 |
| target_total | 5,574 ms, n=21 | 10,426 ms, n=21 | 10,421 ms, n=21 | 368 ms, n=21 |

#### Cost, speed and failures: Latency p95 by generation prompt

| Generation prompt | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| explicit_amounts | 7,811 ms, n=24 | 11,923 ms, n=24 | 17,954 ms, n=24 | 723 ms, n=24 |
| free | 8,777 ms, n=15 | 15,303 ms, n=15 | 17,260 ms, n=15 | 686 ms, n=15 |
| target_total | 8,925 ms, n=21 | 13,083 ms, n=21 | 19,274 ms, n=21 | 648 ms, n=21 |

#### Cost, speed and failures: Latency p99 by generation prompt

| Generation prompt | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| explicit_amounts | 8,056 ms, n=24 | 12,342 ms, n=24 | 18,902 ms, n=24 | 729 ms, n=24 |
| free | 9,224 ms, n=15 | 15,806 ms, n=15 | 17,522 ms, n=15 | 692 ms, n=15 |
| target_total | 9,089 ms, n=21 | 14,237 ms, n=21 | 19,967 ms, n=21 | 754 ms, n=21 |

#### Cost, speed and failures: Price per check by generation prompt

| Generation prompt | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| explicit_amounts | $0.0163, n=24 | $0.0010, n=24 | $0.0059, n=24 | $0.0002, n=24 |
| free | $0.0163, n=15 | $0.0011, n=15 | $0.0063, n=15 | $0.0002, n=15 |
| target_total | $0.0163, n=21 | $0.0012, n=21 | $0.0067, n=21 | $0.0002, n=21 |

#### Cost, speed and failures: Model cost per check by generation prompt

| Generation prompt | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| explicit_amounts | $0.0010, n=24 | $0.0010, n=24 | $0.0059, n=24 | $0.0002, n=24 |
| free | $0.0012, n=15 | $0.0011, n=15 | $0.0063, n=15 | $0.0002, n=15 |
| target_total | $0.0011, n=21 | $0.0012, n=21 | $0.0067, n=21 | $0.0002, n=21 |

#### Cost, speed and failures: Errors by generation prompt

| Generation prompt | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| explicit_amounts | 0.0% (0.0–13.8%), n=24 | 0.0% (0.0–13.8%), n=24 | 0.0% (0.0–13.8%), n=24 | 0.0% (0.0–13.8%), n=24 |
| free | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 |
| target_total | 0.0% (0.0–15.5%), n=21 | 0.0% (0.0–15.5%), n=21 | 0.0% (0.0–15.5%), n=21 | 0.0% (0.0–15.5%), n=21 |

#### Cost, speed and failures: Refusals by generation prompt

| Generation prompt | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| explicit_amounts | 0.0% (0.0–13.8%), n=24 | 0.0% (0.0–13.8%), n=24 | 0.0% (0.0–13.8%), n=24 | 0.0% (0.0–13.8%), n=24 |
| free | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 |
| target_total | 0.0% (0.0–15.5%), n=21 | 0.0% (0.0–15.5%), n=21 | 0.0% (0.0–15.5%), n=21 | 0.0% (0.0–15.5%), n=21 |

#### Cost, speed and failures: Timeouts by generation prompt

| Generation prompt | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| explicit_amounts | 0.0% (0.0–13.8%), n=24 | 0.0% (0.0–13.8%), n=24 | 0.0% (0.0–13.8%), n=24 | 0.0% (0.0–13.8%), n=24 |
| free | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 |
| target_total | 0.0% (0.0–15.5%), n=21 | 0.0% (0.0–15.5%), n=21 | 0.0% (0.0–15.5%), n=21 | 0.0% (0.0–15.5%), n=21 |

#### Cost, speed and failures: Latency p50 by provenance metadata

| Provenance metadata | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Left in | 4,797 ms, n=60 | 9,978 ms, n=60 | 8,926 ms, n=60 | 391 ms, n=60 |
| none | 3,849 ms, n=333 | 8,228 ms, n=333 | 6,222 ms, n=333 | 387 ms, n=333 |
| Stripped | 5,049 ms, n=60 | 9,147 ms, n=60 | 10,361 ms, n=60 | 367 ms, n=60 |

#### Cost, speed and failures: Latency p95 by provenance metadata

| Provenance metadata | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Left in | 9,140 ms, n=60 | 15,093 ms, n=60 | 18,047 ms, n=60 | 710 ms, n=60 |
| none | 8,867 ms, n=333 | 12,912 ms, n=333 | 11,605 ms, n=333 | 656 ms, n=333 |
| Stripped | 8,414 ms, n=60 | 13,099 ms, n=60 | 18,693 ms, n=60 | 676 ms, n=60 |

#### Cost, speed and failures: Latency p99 by provenance metadata

| Provenance metadata | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Left in | 10,040 ms, n=60 | 16,065 ms, n=60 | 19,629 ms, n=60 | 750 ms, n=60 |
| none | 10,359 ms, n=333 | 16,400 ms, n=333 | 22,166 ms, n=333 | 913 ms, n=333 |
| Stripped | 10,157 ms, n=60 | 14,842 ms, n=60 | 22,655 ms, n=60 | 800 ms, n=60 |

#### Cost, speed and failures: Price per check by provenance metadata

| Provenance metadata | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Left in | $0.0163, n=60 | $0.0011, n=60 | $0.0058, n=60 | $0.0002, n=60 |
| none | $0.0163, n=333 | $0.0010, n=333 | $0.0039, n=333 | $0.0002, n=333 |
| Stripped | $0.0163, n=60 | $0.0011, n=60 | $0.0060, n=60 | $0.0002, n=60 |

#### Cost, speed and failures: Model cost per check by provenance metadata

| Provenance metadata | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Left in | $0.0011, n=60 | $0.0011, n=60 | $0.0058, n=60 | $0.0002, n=60 |
| none | $0.0011, n=333 | $0.0010, n=333 | $0.0039, n=333 | $0.0002, n=333 |
| Stripped | $0.0011, n=60 | $0.0011, n=60 | $0.0060, n=60 | $0.0002, n=60 |

#### Cost, speed and failures: Errors by provenance metadata

| Provenance metadata | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Left in | 0.0% (0.0–6.0%), n=60 | 0.0% (0.0–6.0%), n=60 | 0.0% (0.0–6.0%), n=60 | 0.0% (0.0–6.0%), n=60 |
| none | 0.0% (0.0–1.1%), n=333 | 0.0% (0.0–1.1%), n=333 | 0.0% (0.0–1.1%), n=333 | 0.0% (0.0–1.1%), n=333 |
| Stripped | 0.0% (0.0–6.0%), n=60 | 0.0% (0.0–6.0%), n=60 | 0.0% (0.0–6.0%), n=60 | 0.0% (0.0–6.0%), n=60 |

#### Cost, speed and failures: Refusals by provenance metadata

| Provenance metadata | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Left in | 0.0% (0.0–6.0%), n=60 | 0.0% (0.0–6.0%), n=60 | 0.0% (0.0–6.0%), n=60 | 0.0% (0.0–6.0%), n=60 |
| none | 0.0% (0.0–1.1%), n=333 | 0.0% (0.0–1.1%), n=333 | 0.0% (0.0–1.1%), n=333 | 0.0% (0.0–1.1%), n=333 |
| Stripped | 0.0% (0.0–6.0%), n=60 | 0.0% (0.0–6.0%), n=60 | 0.0% (0.0–6.0%), n=60 | 0.0% (0.0–6.0%), n=60 |

#### Cost, speed and failures: Timeouts by provenance metadata

| Provenance metadata | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Left in | 0.0% (0.0–6.0%), n=60 | 0.0% (0.0–6.0%), n=60 | 0.0% (0.0–6.0%), n=60 | 0.0% (0.0–6.0%), n=60 |
| none | 0.0% (0.0–1.1%), n=333 | 0.0% (0.0–1.1%), n=333 | 0.0% (0.0–1.1%), n=333 | 0.0% (0.0–1.1%), n=333 |
| Stripped | 0.0% (0.0–6.0%), n=60 | 0.0% (0.0–6.0%), n=60 | 0.0% (0.0–6.0%), n=60 | 0.0% (0.0–6.0%), n=60 |

#### Cost, speed and failures: Latency p50 by source

| Source | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| commons | 4,325 ms, n=39 | 8,603 ms, n=39 | 8,228 ms, n=39 | 438 ms, n=39 |
| edited:gemini-nano-banana-2.1 | 5,131 ms, n=12 | 7,888 ms, n=12 | 10,530 ms, n=12 | 357 ms, n=12 |
| edited:gpt-image-2.5-sunburst | 4,797 ms, n=12 | 6,553 ms, n=12 | 7,308 ms, n=12 | 419 ms, n=12 |
| edited:sharp-patch | 4,530 ms, n=30 | 11,441 ms, n=30 | 8,893 ms, n=30 | 342 ms, n=30 |
| generated:flux-3-image | 6,287 ms, n=18 | 9,830 ms, n=18 | 10,701 ms, n=18 | 388 ms, n=18 |
| generated:gemini-nano-banana-2.1 | 5,240 ms, n=21 | 9,603 ms, n=21 | 10,781 ms, n=21 | 366 ms, n=21 |
| generated:gpt-image-2.5-flare | 4,144 ms, n=21 | 8,652 ms, n=21 | 7,885 ms, n=21 | 433 ms, n=21 |
| sroie | 3,835 ms, n=294 | 8,209 ms, n=294 | 6,110 ms, n=294 | 383 ms, n=294 |

#### Cost, speed and failures: Latency p95 by source

| Source | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| commons | 7,691 ms, n=39 | 15,040 ms, n=39 | 19,170 ms, n=39 | 808 ms, n=39 |
| edited:gemini-nano-banana-2.1 | 7,944 ms, n=12 | 10,650 ms, n=12 | 13,330 ms, n=12 | 565 ms, n=12 |
| edited:gpt-image-2.5-sunburst | 7,186 ms, n=12 | 10,759 ms, n=12 | 18,283 ms, n=12 | 721 ms, n=12 |
| edited:sharp-patch | 10,100 ms, n=30 | 16,058 ms, n=30 | 18,853 ms, n=30 | 544 ms, n=30 |
| generated:flux-3-image | 7,821 ms, n=18 | 12,591 ms, n=18 | 17,106 ms, n=18 | 727 ms, n=18 |
| generated:gemini-nano-banana-2.1 | 8,481 ms, n=21 | 15,034 ms, n=21 | 19,274 ms, n=21 | 566 ms, n=21 |
| generated:gpt-image-2.5-flare | 8,925 ms, n=21 | 11,016 ms, n=21 | 12,250 ms, n=21 | 709 ms, n=21 |
| sroie | 8,945 ms, n=294 | 12,206 ms, n=294 | 10,305 ms, n=294 | 627 ms, n=294 |

#### Cost, speed and failures: Latency p99 by source

| Source | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| commons | 9,601 ms, n=39 | 16,395 ms, n=39 | 22,161 ms, n=39 | 953 ms, n=39 |
| edited:gemini-nano-banana-2.1 | 8,268 ms, n=12 | 10,788 ms, n=12 | 14,350 ms, n=12 | 566 ms, n=12 |
| edited:gpt-image-2.5-sunburst | 7,469 ms, n=12 | 10,921 ms, n=12 | 18,543 ms, n=12 | 826 ms, n=12 |
| edited:sharp-patch | 11,726 ms, n=30 | 16,241 ms, n=30 | 25,013 ms, n=30 | 626 ms, n=30 |
| generated:flux-3-image | 7,840 ms, n=18 | 12,985 ms, n=18 | 17,117 ms, n=18 | 729 ms, n=18 |
| generated:gemini-nano-banana-2.1 | 9,165 ms, n=21 | 15,752 ms, n=21 | 19,967 ms, n=21 | 659 ms, n=21 |
| generated:gpt-image-2.5-flare | 9,089 ms, n=21 | 13,823 ms, n=21 | 13,529 ms, n=21 | 766 ms, n=21 |
| sroie | 10,480 ms, n=294 | 15,812 ms, n=294 | 16,744 ms, n=294 | 902 ms, n=294 |

#### Cost, speed and failures: Price per check by source

| Source | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| commons | $0.0163, n=39 | $0.0011, n=39 | $0.0051, n=39 | $0.0002, n=39 |
| edited:gemini-nano-banana-2.1 | $0.0163, n=12 | $0.0008, n=12 | $0.0062, n=12 | $0.0002, n=12 |
| edited:gpt-image-2.5-sunburst | $0.0163, n=12 | $0.0008, n=12 | $0.0052, n=12 | $0.0002, n=12 |
| edited:sharp-patch | $0.0163, n=30 | $0.0013, n=30 | $0.0059, n=30 | $0.0002, n=30 |
| generated:flux-3-image | $0.0163, n=18 | $0.0011, n=18 | $0.0065, n=18 | $0.0002, n=18 |
| generated:gemini-nano-banana-2.1 | $0.0163, n=21 | $0.0011, n=21 | $0.0070, n=21 | $0.0002, n=21 |
| generated:gpt-image-2.5-flare | $0.0163, n=21 | $0.0010, n=21 | $0.0054, n=21 | $0.0002, n=21 |
| sroie | $0.0163, n=294 | $0.0010, n=294 | $0.0037, n=294 | $0.0002, n=294 |

#### Cost, speed and failures: Model cost per check by source

| Source | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| commons | $0.0011, n=39 | $0.0011, n=39 | $0.0051, n=39 | $0.0002, n=39 |
| edited:gemini-nano-banana-2.1 | $0.0011, n=12 | $0.0008, n=12 | $0.0062, n=12 | $0.0002, n=12 |
| edited:gpt-image-2.5-sunburst | $0.0011, n=12 | $0.0008, n=12 | $0.0052, n=12 | $0.0002, n=12 |
| edited:sharp-patch | $0.0012, n=30 | $0.0013, n=30 | $0.0059, n=30 | $0.0002, n=30 |
| generated:flux-3-image | $0.0011, n=18 | $0.0011, n=18 | $0.0065, n=18 | $0.0002, n=18 |
| generated:gemini-nano-banana-2.1 | $0.0011, n=21 | $0.0011, n=21 | $0.0070, n=21 | $0.0002, n=21 |
| generated:gpt-image-2.5-flare | $0.0011, n=21 | $0.0010, n=21 | $0.0054, n=21 | $0.0002, n=21 |
| sroie | $0.0011, n=294 | $0.0010, n=294 | $0.0037, n=294 | $0.0002, n=294 |

#### Cost, speed and failures: Errors by source

| Source | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| commons | 0.0% (0.0–9.0%), n=39 | 0.0% (0.0–9.0%), n=39 | 0.0% (0.0–9.0%), n=39 | 0.0% (0.0–9.0%), n=39 |
| edited:gemini-nano-banana-2.1 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 |
| edited:gpt-image-2.5-sunburst | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 |
| edited:sharp-patch | 0.0% (0.0–11.4%), n=30 | 0.0% (0.0–11.4%), n=30 | 0.0% (0.0–11.4%), n=30 | 0.0% (0.0–11.4%), n=30 |
| generated:flux-3-image | 0.0% (0.0–17.6%), n=18 | 0.0% (0.0–17.6%), n=18 | 0.0% (0.0–17.6%), n=18 | 0.0% (0.0–17.6%), n=18 |
| generated:gemini-nano-banana-2.1 | 0.0% (0.0–15.5%), n=21 | 0.0% (0.0–15.5%), n=21 | 0.0% (0.0–15.5%), n=21 | 0.0% (0.0–15.5%), n=21 |
| generated:gpt-image-2.5-flare | 0.0% (0.0–15.5%), n=21 | 0.0% (0.0–15.5%), n=21 | 0.0% (0.0–15.5%), n=21 | 0.0% (0.0–15.5%), n=21 |
| sroie | 0.0% (0.0–1.3%), n=294 | 0.0% (0.0–1.3%), n=294 | 0.0% (0.0–1.3%), n=294 | 0.0% (0.0–1.3%), n=294 |

#### Cost, speed and failures: Refusals by source

| Source | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| commons | 0.0% (0.0–9.0%), n=39 | 0.0% (0.0–9.0%), n=39 | 0.0% (0.0–9.0%), n=39 | 0.0% (0.0–9.0%), n=39 |
| edited:gemini-nano-banana-2.1 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 |
| edited:gpt-image-2.5-sunburst | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 |
| edited:sharp-patch | 0.0% (0.0–11.4%), n=30 | 0.0% (0.0–11.4%), n=30 | 0.0% (0.0–11.4%), n=30 | 0.0% (0.0–11.4%), n=30 |
| generated:flux-3-image | 0.0% (0.0–17.6%), n=18 | 0.0% (0.0–17.6%), n=18 | 0.0% (0.0–17.6%), n=18 | 0.0% (0.0–17.6%), n=18 |
| generated:gemini-nano-banana-2.1 | 0.0% (0.0–15.5%), n=21 | 0.0% (0.0–15.5%), n=21 | 0.0% (0.0–15.5%), n=21 | 0.0% (0.0–15.5%), n=21 |
| generated:gpt-image-2.5-flare | 0.0% (0.0–15.5%), n=21 | 0.0% (0.0–15.5%), n=21 | 0.0% (0.0–15.5%), n=21 | 0.0% (0.0–15.5%), n=21 |
| sroie | 0.0% (0.0–1.3%), n=294 | 0.0% (0.0–1.3%), n=294 | 0.0% (0.0–1.3%), n=294 | 0.0% (0.0–1.3%), n=294 |

#### Cost, speed and failures: Timeouts by source

| Source | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| commons | 0.0% (0.0–9.0%), n=39 | 0.0% (0.0–9.0%), n=39 | 0.0% (0.0–9.0%), n=39 | 0.0% (0.0–9.0%), n=39 |
| edited:gemini-nano-banana-2.1 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 |
| edited:gpt-image-2.5-sunburst | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 | 0.0% (0.0–24.2%), n=12 |
| edited:sharp-patch | 0.0% (0.0–11.4%), n=30 | 0.0% (0.0–11.4%), n=30 | 0.0% (0.0–11.4%), n=30 | 0.0% (0.0–11.4%), n=30 |
| generated:flux-3-image | 0.0% (0.0–17.6%), n=18 | 0.0% (0.0–17.6%), n=18 | 0.0% (0.0–17.6%), n=18 | 0.0% (0.0–17.6%), n=18 |
| generated:gemini-nano-banana-2.1 | 0.0% (0.0–15.5%), n=21 | 0.0% (0.0–15.5%), n=21 | 0.0% (0.0–15.5%), n=21 | 0.0% (0.0–15.5%), n=21 |
| generated:gpt-image-2.5-flare | 0.0% (0.0–15.5%), n=21 | 0.0% (0.0–15.5%), n=21 | 0.0% (0.0–15.5%), n=21 | 0.0% (0.0–15.5%), n=21 |
| sroie | 0.0% (0.0–1.3%), n=294 | 0.0% (0.0–1.3%), n=294 | 0.0% (0.0–1.3%), n=294 | 0.0% (0.0–1.3%), n=294 |

#### Cost, speed and failures: Latency p50 by transform

| Transform | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Cropped | 3,534 ms, n=15 | 9,005 ms, n=15 | 6,166 ms, n=15 | 384 ms, n=15 |
| jpeg | 3,370 ms, n=15 | 7,868 ms, n=15 | 5,078 ms, n=15 | 359 ms, n=15 |
| Re-photographed | 6,516 ms, n=15 | 9,684 ms, n=15 | 6,773 ms, n=15 | 413 ms, n=15 |
| resize | 5,610 ms, n=15 | 7,188 ms, n=15 | 5,900 ms, n=15 | 232 ms, n=15 |
| rotate | 6,024 ms, n=15 | 8,411 ms, n=15 | 5,302 ms, n=15 | 407 ms, n=15 |
| Screenshot | 5,540 ms, n=15 | 8,126 ms, n=15 | 6,503 ms, n=15 | 370 ms, n=15 |

#### Cost, speed and failures: Latency p95 by transform

| Transform | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Cropped | 9,784 ms, n=15 | 13,772 ms, n=15 | 8,832 ms, n=15 | 669 ms, n=15 |
| jpeg | 7,047 ms, n=15 | 10,876 ms, n=15 | 5,910 ms, n=15 | 510 ms, n=15 |
| Re-photographed | 9,046 ms, n=15 | 11,079 ms, n=15 | 8,999 ms, n=15 | 544 ms, n=15 |
| resize | 7,658 ms, n=15 | 10,357 ms, n=15 | 21,747 ms, n=15 | 485 ms, n=15 |
| rotate | 9,445 ms, n=15 | 11,750 ms, n=15 | 8,727 ms, n=15 | 581 ms, n=15 |
| Screenshot | 6,804 ms, n=15 | 10,305 ms, n=15 | 7,402 ms, n=15 | 573 ms, n=15 |

#### Cost, speed and failures: Latency p99 by transform

| Transform | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Cropped | 9,914 ms, n=15 | 14,219 ms, n=15 | 10,042 ms, n=15 | 855 ms, n=15 |
| jpeg | 9,139 ms, n=15 | 10,946 ms, n=15 | 6,092 ms, n=15 | 526 ms, n=15 |
| Re-photographed | 10,140 ms, n=15 | 11,345 ms, n=15 | 9,513 ms, n=15 | 554 ms, n=15 |
| resize | 8,464 ms, n=15 | 11,344 ms, n=15 | 48,761 ms, n=15 | 525 ms, n=15 |
| rotate | 9,620 ms, n=15 | 12,426 ms, n=15 | 11,117 ms, n=15 | 591 ms, n=15 |
| Screenshot | 6,945 ms, n=15 | 10,717 ms, n=15 | 7,432 ms, n=15 | 628 ms, n=15 |

#### Cost, speed and failures: Price per check by transform

| Transform | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Cropped | $0.0163, n=15 | $0.0010, n=15 | $0.0037, n=15 | $0.0002, n=15 |
| jpeg | $0.0163, n=15 | $0.0009, n=15 | $0.0030, n=15 | $0.0002, n=15 |
| Re-photographed | $0.0163, n=15 | $0.0009, n=15 | $0.0038, n=15 | $0.0002, n=15 |
| resize | $0.0163, n=15 | $0.0008, n=15 | $0.0033, n=15 | $0.0001, n=15 |
| rotate | $0.0163, n=15 | $0.0010, n=15 | $0.0037, n=15 | $0.0002, n=15 |
| Screenshot | $0.0163, n=15 | $0.0009, n=15 | $0.0039, n=15 | $0.0002, n=15 |

#### Cost, speed and failures: Model cost per check by transform

| Transform | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Cropped | $0.0010, n=15 | $0.0010, n=15 | $0.0037, n=15 | $0.0002, n=15 |
| jpeg | $0.0010, n=15 | $0.0009, n=15 | $0.0030, n=15 | $0.0002, n=15 |
| Re-photographed | $0.0012, n=15 | $0.0009, n=15 | $0.0038, n=15 | $0.0002, n=15 |
| resize | $0.0011, n=15 | $0.0008, n=15 | $0.0033, n=15 | $0.0001, n=15 |
| rotate | $0.0012, n=15 | $0.0010, n=15 | $0.0037, n=15 | $0.0002, n=15 |
| Screenshot | $0.0011, n=15 | $0.0009, n=15 | $0.0039, n=15 | $0.0002, n=15 |

#### Cost, speed and failures: Errors by transform

| Transform | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Cropped | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 |
| jpeg | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 |
| Re-photographed | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 |
| resize | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 |
| rotate | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 |
| Screenshot | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 |

#### Cost, speed and failures: Refusals by transform

| Transform | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Cropped | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 |
| jpeg | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 |
| Re-photographed | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 |
| resize | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 |
| rotate | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 |
| Screenshot | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 |

#### Cost, speed and failures: Timeouts by transform

| Transform | Receipt Audit (Claude Haiku 5.5) (ours) | Claude Haiku 5.5, plain prompt (DIY baseline) | Gemini 3.8 Flash, plain prompt (DIY baseline) | OpenAI decision model (gpt-6-luna), asked if it's fake (DIY baseline) |
|---|---:|---:|---:|---:|
| Cropped | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 |
| jpeg | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 |
| Re-photographed | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 |
| resize | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 |
| rotate | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 |
| Screenshot | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 | 0.0% (0.0–20.4%), n=15 |

## Examples

No examples in this run.

## Datasets and licences

| Dataset | Licence | Cases |
|---|---:|---:|
| [SROIE (ICDAR 2019 scanned receipts), Voxel51/scanned_receipts mirror](https://huggingface.co/datasets/Voxel51/scanned_receipts) | CC-BY-4.0 | 98 |
| [RA-Bench fakes from SROIE](https://huggingface.co/datasets/Voxel51/scanned_receipts) | CC-BY-4.0 | 20 |
| RA-Bench generated fakes | CC-BY-4.0 | 20 |
| [Wikimedia Commons (Naha Mama Pavilionz)](https://commons.wikimedia.org/wiki/File:JP_%E6%97%A5%E6%9C%AC_Japan_%E6%B2%96%E7%B9%A9_OKINAWA_Family_Cuisine_Restaurant_January_2025_R12S_01.jpg) | CC0 | 2 |
| [Wikimedia Commons (NORTLAUKAU 26088 JP)](https://commons.wikimedia.org/wiki/File:JP_%E6%97%A5%E6%9C%AC_Japan_%E6%B2%96%E7%B9%A9_OKINAWA_Route_253_%E6%B5%A6%E8%A5%BF_Chome_Yoshinoya_Restaurant_%E7%89%9B%E4%B8%BC%E9%A3%AF_Beef_slice_rice_bowl_February_2026_N13P_05.jpg) | CC0 | 2 |
| [Wikimedia Commons (Solomon203)](https://commons.wikimedia.org/wiki/File:FamilyMart_Keelung_Baifu_Store_e-invoice_WJ90244062.jpg) | CC BY-SA 4.0 | 2 |
| [Wikimedia Commons (Aw58)](https://commons.wikimedia.org/wiki/File:Paragon_fiskalny_-_12.07.2024.jpg) | CC BY-SA 4.0 | 1 |
| [Wikimedia Commons (Grandmaster Huon)](https://commons.wikimedia.org/wiki/File:Grocery_Store_Receipt_in_Vienna.jpg) | Public domain | 1 |
| [Wikimedia Commons (Lantus)](https://commons.wikimedia.org/wiki/File:Migros_Kassenzettel_2025.pdf) | Public domain | 1 |
| [Wikimedia Commons (LIman TADU Foo RUBB)](https://commons.wikimedia.org/wiki/File:SZ_%E6%B7%B1%E5%9C%B3_Shenzhen_%E9%BE%8D%E5%B4%97_Longgang_%E4%BA%94%E5%92%8C%E8%B7%AF_118_Wuhe_Road_%E6%B5%B7%E8%BE%BE%E5%92%8C%E6%88%90%E8%B4%AD%E7%89%A9%E4%B8%AD%E5%BF%83_HaiDa_HeCheng_Shopping_Mall_shop_%E6%B5%81%E6%B5%AA%E6%B3%A1%E6%B3%A1%E7%83%A4%E8%82%89_LiuLang_PaoPao_Korean_BBQ_Buffet_Restaurant_bill_n_rules_November_2025_R12S_01.jpg) | CC0 | 1 |
| [Wikimedia Commons (Sakurakat)](https://commons.wikimedia.org/wiki/File:Bill_Vishwanand_2026-01-28.jpg) | CC0 | 1 |
| [Wikimedia Commons (TaiZiThee 832)](https://commons.wikimedia.org/wiki/File:SZ_%E6%B7%B1%E5%9C%B3_Shenzhen_%E5%AF%B6%E5%AE%89%E4%B8%AD%E5%BF%83_BaoAn_%E5%89%B5%E6%A5%AD%E4%B8%80%E8%B7%AF_Chuangye_1st_Road_mall_AEON_Supermarket_bill_December_2024_R12S_01.jpg) | CC0 | 1 |
| [Wikimedia Commons (YEING Luwem Hai Wangs)](https://commons.wikimedia.org/wiki/File:SZ_%E6%B7%B1%E5%9C%B3_Shenzhen_%E7%A6%8F%E7%94%B0_Futian_%E9%87%91%E7%94%B0%E8%B7%AF_Jintian_Road_%E4%B8%83%E9%AE%AE%E8%B6%85%E5%B8%82_Seven_Fresh_Supermarket_checkout_bill_February_2024_R12S_20.jpg) | CC0 | 1 |

## Limitations

- Preliminary: small samples, so intervals are wide. Read the intervals, not the point estimates.
- Public cases come from datasets that are probably in the models' training data.
- The DIY baselines use one plain prompt; a stronger prompt would do better. A strong-prompt baseline comes later.
- DIY targets have no memory across checks and no deterministic checks: those tasks are marked not supported, not scored as zero.
- Our engine runs in process, so its latency has no network hop to receiptaudit.com; DIY latency includes the round trip to the model.
- Costs are model tokens at list price on the price date; no infrastructure cost is included.
- When the Claude baseline's config says transport claude-code-cli, it ran through Claude Code's CLI on a subscription: thinking is adaptive and can't be fully turned off, its cost is what the same tokens cost through the API, and its latency includes the CLI's start-up.
- The duplicate network starts empty for each repetition: it only knows the run's own earlier cases, not production traffic.
- We made the fakes ourselves, with current image models and edits; fakes in the wild may differ.
- Most genuine receipts are scans from 2016–2018 (SROIE, CORD), with a few recent ones; fakes are dated to match, so a model can't tell them apart by date alone. More recent genuine receipts are being added.
- This run is not blind for false proof. After run 20261012T223232Z-63be0d we looked at held-out outputs to find why 16% of genuine receipts carried a finding labelled proof, and fixed it (engine 0.2.1: a warning is no longer proof; cash rounding for MYR and others). The 2.5% here is measured on those same cases; the next held-out rotation re-checks it.
- The OpenAI decision model (Decisions API, gpt-6-luna) is in public beta.

## Methodology (written before the run)

RA-Bench 0.2.0. These definitions, thresholds and exclusions were written before the run and change only in a new suite version.

Who and what. Receipt Audit runs this benchmark on its own product. Every target gets the same cases, the same files, the same timeout (180 s per attempt by default) and the same scoring; only the target changes. A target is our engine ("self", in process, with the duplicate network on an empty in-memory backend that lives for one repetition) or an agent's own model asked with one plain prompt ("diy"). DIY targets get the same file preparation as our engine (upright, at most 3072 px and 3.75 MB) so that API size limits don't count against them. Transport failures (network errors, HTTP 408, 429 and 5xx) are retried up to 3 times with exponential backoff; nothing else is retried, and a wrong answer is a result. Models are pinned: no fallback to another model.

Units and intervals. A case run several times counts once, with the share of its runs that succeeded. Rates carry a 95% Wilson interval over cases (operations rates: over calls). ROC AUC, detection at a fixed false-flag rate and line-item F1 carry a 95% percentile bootstrap interval (2000 resamples, genuine receipts and fakes resampled separately, seeded per row so a re-scored run gives the same interval). Latency and cost have no interval. Every row reports n. Rows are given for all cases and for every stratum (a "dimension=value" tag on the case, or a label-derived group) with at least 10 cases.

Which cases count. Extraction, checks and authenticity use base cases only: cases that aren't a transform of another case (no lineage). Duplicate transforms count only for the duplicates task. Operations use every call.

Extraction. Scored only on fields the label covers; a field labelled null means the document doesn't show it, and only a null answer is right. Merchant name: lowercase, accents stripped, "&" read as "and", punctuation dropped, then a match at edit-distance similarity ≥ 0.9. Date: the exact ISO date (YYYY-MM-DD). Subtotal, tax total and total: within 0.01. Currency: the exact ISO 4217 code. Receipt number: equal after keeping only letters and digits, lowercased. "All fields right": every labelled scalar field of the document right in that run (line items excluded). Line-item F1: labelled and extracted items paired one to one when descriptions are at least 0.8 alike (same normalisation) and totals match within 0.01, micro-averaged over all documents. Valid output: the call succeeded and returned readable fields. A failed call or an unreadable answer gets every field wrong.

Checks. totals_add_up is scored against the label "the printed amounts add up". A positive is a document whose amounts don't add up; the check flags it when it reports failed. Recall over documents that don't add up; precision over documents it flagged; false alarms over genuine documents that do add up; coverage is the share of documents where the check ran (a check that couldn't run isn't output). Targets without deterministic checks report this task as not supported.

Authenticity (genuine vs fake). Higher risk means more likely fake. ROC AUC uses each target's risk as the score; a result without a risk scores 0.5 (no opinion), ties count half. Detection at a 1%, 5% and 10% false-flag rate: the share of fakes flagged by the lowest threshold that flags at most that share of genuine receipts (ties at the threshold are all flagged). At the documented thresholds risk ≥ 0.5 and risk ≥ 0.7: the share of fakes flagged (detection) and of genuine receipts flagged (false flags); a result without a risk is never flagged. Strata from the labels: each fake class ("class=ai_full", …) and fakes whose amounts add up or don't ("arithmetic=consistent", "arithmetic=inconsistent"), each compared with every genuine receipt; and provenance metadata ("provenance=intact", "stripped", "none"), genuine receipts and fakes alike.

Duplicates. Every case is submitted by a different account, so a repeat is "someone else submitted this receipt before". Recall: the share of duplicate transforms (re-encoded, cropped, re-shot copies of an earlier case) the target recognised as seen before; exact recall counts only matches on the identical image hash. False matches: the share of distinct receipts reported as seen before, for hard negatives (different receipts that look alike: same merchant, template or day; "false_match_rate") and for the other genuine receipts ("false_match_rate_genuine"). Originals always run before their transforms. Targets without memory across checks (DIY prompts) report the task as not supported, not as zero.

Decisions. A decision is the yes/no a caller acts on: flagged when risk ≥ 0.5. Consistency: over base cases run at least twice, the share whose decision is the same in every repetition; total consistency, the share whose extracted total is the same (within 0.01, or absent) in every repetition. Calibration error: expected calibration error of risk against "is fake" over every run with a risk, 10 equal-width bins, weighted by run count (lower is better; it depends on this set's share of fakes). Expected cost per 1,000 receipts at risk ≥ 0.5 and ≥ 0.7: 1000 × ((1 − p) × false-flag rate × C_review + p × (1 − detection) × C_miss). Defaults, each from a cited, graded source (research/41-benchmark-cost-model.md): p = 1% of submitted receipts are fake (SAP Concur's share of receipts flagged as AI-generated; no study measures the true share, so this is the best available assumption, not a measurement); C_miss = $100, the face value of a missed fake (AppZen's mean AI-generated fake, 12 months to May 2026); C_review = $17, one false flag's review (18 minutes, GBTA, at a loaded auditor wage of $57.47/h, BLS). At these defaults one point of false-flag rate costs as much as about 17 points of detection. The sweep varies one assumption at a time over its published spread ("assumption=…": fakes 0.1% and 5%; a missed fake $32 and $182; a review $8 and $73). Approving everything costs 1000 × p × C_miss ($1000 at the defaults), reported as its own row: a detector above it loses money under those assumptions. The formula counts only mistakes (it treats reviewing a fake that was rightly flagged as free) and leaves out unmeasured costs: an employee's time and trust after a false flag, and repeat fraud or tax penalties after a miss. This set has far more fakes than real submissions, so the cost re-weights the measured rates by p rather than using the set's own mix.

Evidence. A yes/no is easy to get from any model; a reviewer also needs to know what is wrong. Edited field named: over fakes whose label names the edited field (AI-inpainted and hand-edited fakes), the share of runs that flag the receipt and whose first 3 reasons point at that field. A reason points at a field through an explicit "@field" tag, a deterministic check about it (an arithmetic check points at the total and subtotal), or, for free-text reasons, a pre-registered keyword (total, amount due; subtotal; tax, VAT, GST; date; merchant, store, vendor, logo, name; item, line, quantity, price).

Verifiable evidence. A finding is proof of tampering when a caller can check it without trusting a model and it shows the document was generated or changed: an AI-generator, AI source-type or receipt/invoice-generator tag read from the file, PDF modification records, a thumbnail that doesn't match the image, a photo taken before the printed purchase date, printed amounts that don't add up (with the numbers), or a duplicate-network match. Other file facts (an editor or office tool, missing camera data) and plausibility or policy checks (tax rate, the receipt's age, currency) are real but don't show tampering, and don't count. A model's visual judgement is an opinion, however confident. Fakes caught with proof: the share of fakes flagged with at least one proof among their reasons. Genuine receipts with proof: the guard against false proof (lower is better). Only targets that can return verifiable findings report this task; a plain prompt returns opinions by construction and reports it as not supported.

Operations. Latency: wall time of the final attempt of each successful call, measured by the harness (p50, p95, p99). Cost per check is what the caller pays for one check: for Receipt Audit, the list price of its smallest credit pack per check; for a DIY baseline, its model tokens × the AI Gateway list price on the run's price date. Model cost per check is the model tokens × that list price for every target, our engine's own model call included (infrastructure not included). Both are averaged over successful calls. Error, refusal and timeout rates over all calls.

Findings. Each of our targets is compared with each baseline on the headline rows of every task (stratum "all"): a win or a loss only when the 95% intervals don't overlap, otherwise a tie; for latency and cost, which have no interval, only when one value is at least 1.2 times the other. A comparison resting on fewer than 10 cases (or calls) on either side is always a tie. A task a baseline can't do by construction is reported as such, not as a score of zero.

## Reproduce or dispute

- Command: `cd apps/receipt-check && nub run bench run --cases benchmarks/receipt-audit/heldout-cases.jsonl --split private --targets self,diy:claude-haiku-5.5,diy:gemini-3.8-flash,decision:gpt-6-luna --reps 3`
- Dispute a number or ask to be included: hello@godard.me

## History

- 2026-10-12: [`20261012T231905Z-2c62d5`](https://receiptaudit.com/benchmarks/runs/20261012T231905Z-2c62d5.json) (incomplete: not a result)
- 2026-10-12: [`20261012T230424Z-fc67c6`](https://receiptaudit.com/benchmarks/runs/20261012T230424Z-fc67c6.json)
- 2026-10-12: [`20261012T223232Z-63be0d`](https://receiptaudit.com/benchmarks/runs/20261012T223232Z-63be0d.json)
- 2026-10-12: [`20261012T203648Z-44a89a`](https://receiptaudit.com/benchmarks/runs/20261012T203648Z-44a89a.json)
