@@ -8,11 +8,25 @@ runbook for approach A specifically.
88## STATUS (2026-07-16): approach A done, LOGIC-GAP tail done, 20/21
99
1010Board: ** 20/21 acceptable, 12/13 numbered end-to-end, 13/13 logic-OK** , corpus
11- w=0.976 rGlobal=0.835 rField=0.735 , suite green (260 passed). Reference
12- snapshot: ` baselines/try_42gen .json ` . 13/13 logic-OK means that given ideal
11+ w=0.976 rGlobal=0.835 rField=0.737 , suite green (260 passed). Reference
12+ snapshot: ` baselines/try_final .json ` . 13/13 logic-OK means that given ideal
1313reading order the corrector is now correct on every numbered poster in the
1414corpus; the single remaining failure (8228476) is reading order, not logic.
1515
16+ ** Use the two diagnostics before trusting any number.** Corpus averages hid a
17+ real regression in this very session (gasimova's title fell 1.000 -> 0.706
18+ while its rField still ROSE, because another field gained more):
19+
20+ ~/myenv/bin/python calibration/diagnostics/field_audit.py \
21+ calibration/baselines/after_track_a.json calibration/baselines/try_final.json
22+ ~/myenv/bin/python calibration/diagnostics/annotation_audit.py
23+
24+ ` field_audit.py ` diffs all 177 fields of all 21 posters between two snapshots
25+ (166 of 177 are byte-identical across every change made today, which is what
26+ "did this touch anything else" should be answered with, not an average).
27+ ` annotation_audit.py ` asks whether the ground truth claims things the poster
28+ does not say - the check that caught 42.
29+
1630Read this first if you are comparing to older numbers: ** the eval matcher was
1731too loose and the old scoreboard was inflated.** ` _affil_match ` accepted any
1832assigned string that merely CONTAINED the ground-truth tokens, so a poster
@@ -78,8 +92,39 @@ have moved the poster, so nothing pointed at xy_cut. Fixing the annotation made
7892it winnable, it still failed, and the failure was then diagnosable in minutes.
7993
8094When a poster fails on IDEAL reading order, check the ground truth against the
81- PDF before assuming the corrector is at fault. Cheap test: does every GT
82- affiliation string appear anywhere in ` _raw.md ` ? For 42, three of five did not.
95+ PDF before assuming the corrector is at fault. ` annotation_audit.py ` now does
96+ this for the whole corpus.
97+
98+ Its verdict, so nobody re-runs the search: ** 42 was the only genuinely wrong
99+ annotation.** The audit's other flags are benign and should stay that way -
100+ posters print "VTT", "STScI", "Technion", "A. Perdomo" where deposit metadata
101+ spells them out, and expanding an abbreviation is faithful. The one worth
102+ attention is 8228476, whose ` .json ` and ` _sub-json.json ` disagree on author
103+ ORDER; the corrector anchors its banner search on the first creator, so that
104+ matters, but the poster is RTL and blocked on approach D anyway.
105+
106+ ## Known open items (each measured, none guessed)
107+
108+ - ** gasimova title, 1.000 -> 0.706.** The standing cost of ` _flatten_top_band ` ,
109+ which puts the whole banner on common baselines so the byline's markers can
110+ reach their names. gasimova's logo sits in the top-right * between* the
111+ title's two lines, so flattening interleaves it and the title becomes two
112+ blocks. ` LINE_MAX_GAP ` keeps the logo's words out of the title's text, but
113+ cannot rejoin the halves. Buys the byline (+0.154), Background (+0.396) and
114+ correct affiliations for all seven authors. Fixing it properly means making
115+ the flatten preserve genuine columns instead of dissolving the whole band.
116+ - ** Tried and rejected for it** (both in git history, do not re-run blind):
117+ classifying large top-zone text as title fragments cost 4519718 0.372 on its
118+ banner and AISec2025 0.401; scaling the block-gap threshold to local line
119+ height instead of the page median cost 10890106 its title (0.757 -> 0.495)
120+ and Acknowledgements (0.954 -> 0.549).
121+ - ** 10890106 is extraction, not annotation** (its annotation is clean; audited).
122+ Its weak fields are fragmentation: no block clears the header cutoff at all
123+ (a narrow "Abstract nr" badge drags ` col_start ` to 90.6, cutoff 145.0, while
124+ the title starts at 284.4), so its 72pt title stays two blocks, and Study
125+ design / Conclusions scatter across blocks the metric scores one at a time.
126+ The header cutoff being derived from the topmost narrow block is the common
127+ thread with gasimova's title; that is the next thing worth fixing properly.
83128
84129## TL;DR
85130
0 commit comments