Text-metrics oracle: measure whether three engines agree on text geometry master
Every corpus this project checks the engine against is text-free by construction and the held-out WPT filter rejects any page with a text node, so nothing had measured whether Chromium, Firefox and WebKit place glyphs closely enough for the 1/60 px geometry vote to run. This measures it, and builds no layout code. - oracle/oracle.mjs: a `textProbe` request that renders a document with a pinned WPT font embedded as a `data:` URL and returns, per engine, the ordinary element dump plus every text node's `Range.getClientRects()` and the font's sha256. An engine whose page fell back to a system font fails the request rather than being measured, because a substituted font would make every agreement figure meaningless. The rule goes inside the document's `<head>`, not ahead of it, so the doctype keeps the page in standards mode. Documented under docs/dump-format.md "Text probe"; the dump format itself is unchanged. - oracle/selftest.mjs: the probe answers in every engine and the pinned Ahem really loaded, checked by measuring it -- two of its glyphs at 100px are exactly 200px. - crates/harness: `Oracle::text_probe`, `dump::TextDump`/`TextRun`/`TextRequest`/ `TextResponse` with `TextDump::geometry()` so element boxes go through `compare::vote` unchanged, `trace::vote_text` applying the same `Consensus` rule at `dump::TOLERANCE_PX` to text-node rects, `text_cases` with its own ten-category corpus in two fonts, and the `text_metrics` measurement binary. - docs/text-metrics.md: the result, on Chromium 153.0.8010.12, Firefox 155.0 and WebKit 26.6, over 70 cases per font. The answer is partly, and the disagreement is sharply localized. Line breaking is unanimous -- all three engines produced the same number of line fragments in 100% of measurements in both fonts -- and element geometry of a text-bearing page is votable at 1/60 px, 99-100% unanimous. The text fragment rect is not: Firefox reports it one pixel taller than the other two in over 90% of measurements, and in Lato the three engines never once agreed on a line's width, half of those being three-way splits with no reference value at all. Chromium rounds every run width to a whole pixel; Firefox and WebKit are themselves over a pixel apart on kerned text. Loosening the tolerance does not rescue it: fifteen times looser buys nothing in Ahem, and reaching 99% needs 1 px, sixty times the vote's. So a text-bearing generated function can be scored in Ahem if a 2-1 majority is an acceptable reference and fractional font sizes are avoided, and cannot be scored in a proportional font at all. That blocks shaping and glyph advances under docs/platform-areas.md "Text and internationalization"; it does not block line breaking, and it does not block the element geometry of pages that contain text. Gates: cargo test --workspace passes (73 test binaries, 0 failures); node oracle/selftest.mjs --engines=chromium,firefox,webkit passes 115/115; bench/fragment-floor.sh 227/227 against a floor of 227; bench/seam-floor.sh holds every floor exactly (floats 109/109, stacking-order 105/105, relative-positioning 104/104, block-height 105/105). The build lane was unreachable, so bench/on-lane.sh took its designed local fallback for the measurement and for both floor checks.