Page generated: 2026-08-27
Data (model runs) generated: 2026-07-23
Scoring inputs: ground truth 36c390d2, evaluate.py 5c52b890, rules 355f2e77
3-image dataset, 5 models × 3 phases × 10 runs.
Scoring is defined in eval_guidelines.html and implemented in evaluate.py; the equivalence and ignore rules it applies are in EQUIVALENCES.md, read at run time. This page reports results and does not restate the rules — a second copy is how the description and the scoring come apart.
In brief: model rows are paired with ground-truth travelers by name similarity, and F1 counts those pairings — it answers which travelers were found. Name CER is reported beside it and answers how faithfully those names were read: character edits over reference characters, micro-averaged. The two are separate questions and neither substitutes for the other. Per-field accuracy below is computed only on matched rows.
| Model | F1 N | F1 A | F1 B | N→A | A→B | N→B |
|---|---|---|---|---|---|---|
| Claude | 0.79 | 0.79 | 0.98 | -0.00 | +0.20 | +0.19 |
| GPT | 0.47 | 0.41 | 1.00 | -0.06 | +0.59 | +0.53 |
| Gemini 2.5 | 0.63 | 0.71 | 1.00 | +0.08 | +0.29 | +0.37 |
| Gemini 3.1 | 0.89 | 0.92 | 1.00 | +0.03 | +0.08 | +0.11 |
| Claude Thinking | 0.73 | 0.77 | 1.00 | +0.04 | +0.23 | +0.27 |
| Model | Cond | Page 28 — GT 18 | Page 36 — GT 37 | Page 39 — GT 10 | All pages — GT 65 | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| rows returned | matched | name CER | rows returned | matched | name CER | rows returned | matched | name CER | rows returned | matched | name CER | ||
| Claude | N | 18median 18 · +0 vs GT | 15.32.7 unmatched | 13.6%291 of 2145 chars | 34–35median 35 · -2 vs GT | 27.57.4 unmatched | 19.6%829 of 4227 chars | 10median 10 · +0 vs GT | 7.92.1 unmatched | 16.5%212 of 1285 chars | 62–63median 63 · -2 vs GT | 50.712.2 unmatched | 17.4%1332 of 7657 chars |
| A | 19median 19 · +1 vs GT | 181 unmatched | 14.6%374 of 2570 chars | 34–35median 34 · -3 vs GT | 24.69.6 unmatched | 18.9%722 of 3818 chars | 10median 10 · +0 vs GT | 82 unmatched | 16.2%210 of 1300 chars | 63–64median 63 · -2 vs GT | 50.612.6 unmatched | 17.0%1306 of 7688 chars | |
| B | 18median 18 · +0 vs GT | 171 unmatched | 3.9%92 of 2360 chars | 37median 37 · +0 vs GT | 370 unmatched | 0.2%10 of 5450 chars | 10median 10 · +0 vs GT | 100 unmatched | 0.6%10 of 1620 chars | 65median 65 · +0 vs GT | 641 unmatched | 1.2%112 of 9430 chars | |
| GPT | N | 16–23median 18 · +0 vs GT | 10.58.1 unmatched | 22.3%331 of 1484 chars | 26–34median 33 · -4 vs GT | 14.717.5 unmatched | 23.1%539 of 2337 chars | 9–10median 10 · +0 vs GT | 4.45.5 unmatched | 26.6%203 of 764 chars | 58–67median 60.5 · -4 vs GT | 29.631.1 unmatched | 23.4%1073 of 4585 chars |
| A | 24–29median 25 · +7 vs GT | 7.917.2 unmatched | 14.9%171 of 1148 chars | 31–34median 32.5 · -4 vs GT | 15.217.2 unmatched | 23.6%570 of 2418 chars | 10median 10 · +0 vs GT | 46 unmatched | 24.2%167 of 691 chars | 66–70median 67 · +2 vs GT | 27.140.4 unmatched | 21.3%908 of 4257 chars | |
| B | 18median 18 · +0 vs GT | 180 unmatched | 4.3%110 of 2570 chars | 37median 37 · +0 vs GT | 370 unmatched | 0.4%20 of 5450 chars | 10median 10 · +0 vs GT | 100 unmatched | 0.0%0 of 1620 chars | 65median 65 · +0 vs GT | 650 unmatched | 1.3%130 of 9640 chars | |
| Gemini 2.5 | N | 19–20median 20 · +2 vs GT | 163.6 unmatched | 11.5%269 of 2334 chars | 24–36median 32 · -5 vs GT | 16.913.8 unmatched | 19.6%456 of 2327 chars | 10median 10 · +0 vs GT | 6.73.3 unmatched | 25.9%284 of 1096 chars | 54–66median 61 · -4 vs GT | 39.620.7 unmatched | 17.5%1009 of 5757 chars |
| A | 20–21median 20.5 · +2 vs GT | 14.75.8 unmatched | 8.7%187 of 2160 chars | 35–37median 36 · -1 vs GT | 24.711.3 unmatched | 19.4%661 of 3403 chars | 10median 10 · +0 vs GT | 73 unmatched | 17.4%200 of 1150 chars | 66–68median 66 · +1 vs GT | 46.420.1 unmatched | 15.6%1048 of 6713 chars | |
| B | 18–19median 18 · +0 vs GT | 180.1 unmatched | 0.8%20 of 2570 chars | 37median 37 · +0 vs GT | 370 unmatched | 0.3%19 of 5450 chars | 10median 10 · +0 vs GT | 100 unmatched | 0.0%0 of 1620 chars | 65–66median 65 · +0 vs GT | 650.1 unmatched | 0.4%39 of 9640 chars | |
| Gemini 3.1 | N | 19median 19 · +1 vs GT | 181 unmatched | 10.2%262 of 2570 chars | 34median 34 · -3 vs GT | 295 unmatched | 11.3%460 of 4084 chars | 10median 10 · +0 vs GT | 100 unmatched | 12.3%200 of 1620 chars | 63median 63 · -2 vs GT | 576 unmatched | 11.1%922 of 8274 chars |
| A | 19median 19 · +1 vs GT | 181 unmatched | 7.4%191 of 2570 chars | 36median 36 · -1 vs GT | 324 unmatched | 15.5%736 of 4747 chars | 10median 10 · +0 vs GT | 9.60.4 unmatched | 13.2%206 of 1560 chars | 65median 65 · +0 vs GT | 59.65.4 unmatched | 12.8%1133 of 8877 chars | |
| B | 18–19median 18 · +0 vs GT | 180.2 unmatched | 0.8%20 of 2570 chars | 37median 37 · +0 vs GT | 370 unmatched | 0.4%20 of 5450 chars | 10median 10 · +0 vs GT | 100 unmatched | 0.0%0 of 1620 chars | 65–66median 65 · +0 vs GT | 650.2 unmatched | 0.4%40 of 9640 chars | |
| Claude Thinking | N | 17–19median 18 · +0 vs GT | 14.73.3 unmatched | 16.0%328 of 2053 chars | 30–35median 34 · -3 vs GT | 2310.4 unmatched | 21.2%754 of 3561 chars | 10median 10 · +0 vs GT | 8.51.5 unmatched | 19.5%268 of 1376 chars | 58–63median 62 · -3 vs GT | 46.215.2 unmatched | 19.3%1350 of 6990 chars |
| A | 18–19median 18 · +0 vs GT | 15.13 unmatched | 16.1%343 of 2131 chars | 34–36median 35 · -2 vs GT | 25.98.8 unmatched | 20.8%830 of 4000 chars | 10median 10 · +0 vs GT | 8.31.7 unmatched | 19.2%259 of 1351 chars | 62–64median 63 · -2 vs GT | 49.313.5 unmatched | 19.1%1432 of 7482 chars | |
| B | 18median 18 · +0 vs GT | 17.80.2 unmatched | 2.5%64 of 2528 chars | 37median 37 · +0 vs GT | 370 unmatched | 0.3%14 of 5450 chars | 10median 10 · +0 vs GT | 100 unmatched | 0.1%2 of 1620 chars | 65median 65 · +0 vs GT | 64.80.2 unmatched | 0.8%80 of 9598 chars | |
rows returned is the raw count of per-traveler rows the model produced, before any scoring — range across the 10 runs, with the median and its distance from the ground-truth count. matched is the mean number of those rows that paired with a real GT traveler, and unmatched the remainder. name CER is the character error rate of the traveler names on the matched rows, micro-averaged as total edits over total reference length so it composes across pages. Detection and transcription are separate questions, reported separately: a model can return the right number of rows, match all of them, and still have misread the names.
| Model | Cond | unmatched rows | what they were | ||||
|---|---|---|---|---|---|---|---|
| double-listed | under-segmented | fragment | bad read | fabricated | |||
| Claude | N | 122 | 119% | 11% | 97% | 7158% | 3025% |
| A | 126 | 1210% | 0 | 0 | 8265% | 3225% | |
| B | 10 | 0 | 0 | 0 | 10100% | 0 | |
| GPT | N | 311 | 83% | 0 | 93% | 15149% | 14346% |
| A | 404 | 82% | 0 | 102% | 18947% | 19749% | |
| B | 0 | — | — | — | — | — | |
| Gemini 2.5 | N | 207 | 63% | 3416% | 94% | 8340% | 7536% |
| A | 201 | 84% | 0 | 0 | 9648% | 9748% | |
| B | 1 | 1100% | 0 | 0 | 0 | 0 | |
| Gemini 3.1 | N | 60 | 47% | 1017% | 0 | 4677% | 0 |
| A | 54 | 1019% | 0 | 0 | 2444% | 2037% | |
| B | 2 | 2100% | 0 | 0 | 0 | 0 | |
| Claude Thinking | N | 152 | 53% | 21% | 0 | 9864% | 4731% |
| A | 135 | 54% | 32% | 11% | 9067% | 3627% | |
| B | 2 | 0 | 0 | 0 | 2100% | 0 | |
A row that matched no ground-truth traveler is one of: double-listed — the traveler is real but another row already claimed it; under-segmented — two or more travelers in one row, so the others are counted as missed rather than expanded and credited; fragment — part of a name; bad read — a real traveler misread past the matching threshold, recognizable at 0.55 similarity or better; fabricated — nothing on the page it corresponds to. Diagnostic thresholds only: these change no score, and the columns sum to the unmatched figure above.
Computed only on rows that matched a GT traveler (so a model that misses half the travelers does not get a free pass on the half it never produced — those are captured by F1 in section 1).
Scoring per field on a matched row:
title, arrival_date, departure_date, place_of_stay, place_of_origin) — character accuracy = 1 − levenshtein(gt, model) / len(gt) after normalization. A 1-character misspelling on a 16-char string scores ~0.94 rather than 0. Normalization lowercases, collapses whitespace, strips trailing punctuation (and a trailing ? on GT illegible markers), and applies an equivalence dictionary (expand-both-sides, so a correctly-written abbreviation matches the expanded GT).place_of_stay, place_of_origin) get extra Venetian place normalization built from a corpus scan: a leading connective in and commas are dropped; the saint prefix San/Santo/Santa (and abbreviations S./St./Sta/S.ta…) collapse to one canonical, while the plural Santi is kept distinct; Cà/Ca'/Ca collapse together but not to Casa; loc.→locanda, osp.→ospizio, m.→maria, and the quondam group (q.m/qm/q(uonda)m…). Genuine misreadings (e.g. Feltrina→Pestiora) are left intact and scored by character accuracy. See evaluate.py norm_place / ABBREVIATION_EXPANSIONS / PLACE_EXPANSIONS.arrival_date, departure_date) additionally strip a leading zero from the day (February 09 1769 == February 9 1769; GT is non-padded). Differently-formatted dates (day-first, month abbreviations) still differ — those are deviations from the requested Month D YYYY, not equivalents.with_spouse, with_siblings, children_count) — 1.0 if equal, 0.0 if not.This matches venice-39-guided/-naive's text-question scoring so numbers across the three projects are directly comparable.
| Model | title | arrival_date | departure_date | place_of_stay | with_spouse | with_siblings | children_count | place_of_origin |
|---|---|---|---|---|---|---|---|---|
| Claude | 0.84 | 0.25 | 0.63 | 0.20 | 1.00 | 0.98 | 1.00 | 0.63 |
| GPT | 0.83 | 0.19 | 0.60 | 0.07 | 1.00 | 0.75 | 1.00 | 0.51 |
| Gemini 2.5 | 0.83 | 0.12 | 0.66 | 0.33 | 1.00 | 0.96 | 1.00 | 0.62 |
| Gemini 3.1 | 0.90 | 0.33 | 0.65 | 0.58 | 1.00 | 1.00 | 1.00 | 0.73 |
| Claude Thinking | 0.85 | 0.29 | 0.65 | 0.21 | 1.00 | 0.97 | 1.00 | 0.66 |
| Model | title | arrival_date | departure_date | place_of_stay | with_spouse | with_siblings | children_count | place_of_origin |
|---|---|---|---|---|---|---|---|---|
| Claude | 0.84 | 0.39 | 0.64 | 0.26 | 1.00 | 0.94 | 1.00 | 0.68 |
| GPT | 0.86 | 0.34 | 0.65 | 0.03 | 1.00 | 0.88 | 1.00 | 0.54 |
| Gemini 2.5 | 0.84 | 0.72 | 0.77 | 0.32 | 1.00 | 0.96 | 1.00 | 0.68 |
| Gemini 3.1 | 0.79 | 0.71 | 0.71 | 0.54 | 1.00 | 0.93 | 1.00 | 0.69 |
| Claude Thinking | 0.82 | 0.51 | 0.71 | 0.24 | 1.00 | 0.97 | 1.00 | 0.75 |
| Model | title | arrival_date | departure_date | place_of_stay | with_spouse | with_siblings | children_count | place_of_origin |
|---|---|---|---|---|---|---|---|---|
| Claude | 1.00 | 0.95 | 0.69 | 0.83 | 1.00 | 1.00 | 1.00 | 0.84 |
| GPT | 0.99 | 0.95 | 0.84 | 0.80 | 1.00 | 1.00 | 1.00 | 0.91 |
| Gemini 2.5 | 0.97 | 0.92 | 0.81 | 0.95 | 1.00 | 1.00 | 1.00 | 0.90 |
| Gemini 3.1 | 0.96 | 0.95 | 0.85 | 0.95 | 1.00 | 1.00 | 1.00 | 0.82 |
| Claude Thinking | 0.99 | 0.95 | 0.85 | 0.83 | 1.00 | 1.00 | 1.00 | 0.98 |
Split by phase to mirror section 2. Each cell is the mean F1 across the runs for that (model, phase, page); where the runs varied, the min–max range and σ (std) follow beneath in grey. A bare number means every run scored identically (σ = 0). Cells aggregate 10 runs except where a † marks fewer successful runs.
| Model | Page 28 | Page 36 | Page 39 |
|---|---|---|---|
| Claude | 0.850.78–0.89 · σ0.05 | 0.770.72–0.82 · σ0.03 | 0.790.70–0.80 · σ0.03 |
| GPT | 0.570.44–0.67 · σ0.08 | 0.420.35–0.51 · σ0.05 | 0.440.30–0.53 · σ0.07 |
| Gemini 2.5 | 0.850.76–0.89 · σ0.06 | 0.490.23–0.68 · σ0.19 | 0.670.60–0.70 · σ0.05 |
| Gemini 3.1 | 0.97 | 0.82 | 1.00 |
| Claude Thinking | 0.820.72–0.89 · σ0.07 | 0.650.45–0.78 · σ0.09 | 0.850.70–1.00 · σ0.11 |
| Model | Page 28 | Page 36 | Page 39 |
|---|---|---|---|
| Claude | 0.97 | 0.690.67–0.76 · σ0.03 | 0.80 |
| GPT | 0.370.30–0.43 · σ0.04 | 0.440.34–0.50 · σ0.05 | 0.400.30–0.50 · σ0.05 |
| Gemini 2.5 | 0.760.74–0.79 · σ0.02 | 0.680.65–0.69 · σ0.02 | 0.70 |
| Gemini 3.1 | 0.97 | 0.880.85–0.93 · σ0.03 | 0.960.90–1.00 · σ0.05 |
| Claude Thinking | 0.840.67–0.89 · σ0.07 | 0.720.67–0.79 · σ0.04 | 0.830.70–1.00 · σ0.11 |
| Model | Page 28 | Page 36 | Page 39 |
|---|---|---|---|
| Claude | 0.94 | 1.00 | 1.00 |
| GPT | 1.00 | 1.00 | 1.00 |
| Gemini 2.5 | 1.000.97–1.00 · σ0.01 | 1.00 | 1.00 |
| Gemini 3.1 | 0.990.97–1.00 · σ0.01 | 1.00 | 1.00 |
| Claude Thinking | 0.990.94–1.00 · σ0.02 | 1.00 | 1.00 |
| Page ID | Filename | Travelers in GT | F1 mean |
|---|---|---|---|
| 28 | AVS IS 758-781 1766 02.jpg | 18 | 0.86 |
| 36 | AVS IS 758-781 1770 05 28 p1.jpg | 37 | 0.77 |
| 39 | AVS IS 758-781 1770 08.jpg | 10 | 0.83 |
MAX_TOKENS before any JSON was emitted. Resolved by setting thinkingLevel=LOW and max_output_tokens=32768 (collect_responses_gemini31.py:96-99); all current scores reflect successful runs. (thinkingBudget is silently ignored by Gemini 3.1 preview — thinkingLevel is the lever that works.)temperature=1 (Anthropic API constraint). All other models run at temperature=0.response_format=json_object enforcement to avoid degenerate-loop generation at temperature=0. The "image" field was also removed from the response schema after empirical evidence that GPT-5.2 hallucinates hex into a literally-named "image" field. See top of collect_responses.py.json.loads pipeline.gt/. The GT enters the pipeline only at evaluation. Format coincidence (e.g. q.m) comes from the prompt's expert-guidance section, not from the GT.orientation=6 EXIF tags; we verified all current providers auto-orient as of 2026-05-06, but normalization is kept as defensive infrastructure.
The expert guidance was revised once, on 2026-06-24. The earlier version was a condensed rewrite of the scholar's text (4,708 chars, preserved as Claude-modifiedguidance.md); the current EXPERT_GUIDANCE constant is the scholar's wording verbatim, aligned with venice-39-guided for cross-experiment comparison (8,259 chars). Which text produced which checkpoints:
| Phase | Runs | Collected | Guidance |
|---|---|---|---|
| A | 10 × 5 models | 2026-06-24 17:16–18:10 | current (verbatim) |
| B | 10 × 5 models | 2026-06-24 17:16–18:10; gemini31 re-run 2026-07-23 | current (verbatim) |
| N | 10 × 5 models | 2026-05-07 07:27–12:10 | none — naive condition has no guidance |
Phase N predates the revision and was deliberately not re-run: the naive prompt contains no expert guidance, so the revision does not apply to it. This is also why archive_adapted_EG/ — the superseded run under the condensed guidance, collected 2026-05-06/07 — holds only checkpoints_phase_a and checkpoints_phase_b.
Two caveats on the strength of this record:
collect_responses.py defines EXPERT_GUIDANCE — the gemini31 and claude-thinking collectors import build_prompt from it, so no model can have used different text.NAIVE_FIELD_RULES said on 2026-05-07. If the June realignment touched the field-rules blocks and not only the guidance, N would differ from A/B on the field spec. The TODO(next collection) note in collect_responses.py implies the field rules have been stable since collection, but this cannot be confirmed from git.
Runs collected from 2026-08-19 onward record this themselves: record_provenance writes checkpoints_phase_*/prompt_provenance.json with per-component SHA-256 hashes of the guidance, field rules, assembled scaffold, and (Phase B) transcription corpus, plus the git commit and model id — and fingerprint_summary prints the same identity into phase_*.log. Runs skipped on resume are intentionally left unstamped rather than credited to the current prompt. The 150 checkpoints scored above have no sidecar; this section is their record.