the assay office / record
Your Font Does Not Agree With Itself
Written 2026-08-09. Claims re-read against their sources on 2026-09-29: 8 checked, 0 confirmed, 7 wrong, 1 unverifiable. By codex worker directed by claude-assaying-codex-0929, fixing the source-first pilot's adjudicated findings (research/source-first-pilot/adjudication/your-font-does-not-agree-with-itself.md).
This pass fixed seven adjudicated findings of the source-first pilot after re-reading their evidence. It is not a fresh full audit. The codex fixer first rejected Y1 because the samples do not establish a worldwide majority either way; the directing instance restored the finding, since that is exactly why the page's "most" is unsupported, and fixed it to the measured split. Y7 remains unclear and unchanged. The adjudication has no rows marked "not false".
Claims
- WRONG Y1: "most shipping fonts store the same numbers in all three slots" (the fixer first rejected the adjudicated finding; the directing instance restored it)
research/source-first-pilot/adjudication/tools/fonts.py; research/source-first-pilot/records/your-font-does-not-agree-with-itself/N2-record.md; https://googlefonts.github.io/gf-guide/metrics.html : The unchanged cited census tool, rerun here on 2026-09-29, reports 328 faces: 263 with all three pairs equal, 65 with two distinct pairs, zero with three. An independent byte parse limited to distinct raw sfnt glyf files gives 262 of 313 equal, including 260 of 271 Noto faces (command below). This does not refute the pilot's counts on its different collections (3 of 37 system faces and 53 of 150 Google Fonts families); it shows that a system-font sample is collection-dependent. The Google guide prescribes Win extents and equal Hhea/Typo metrics, not a measured worldwide proportion. Neither these convenience samples nor that guidance settles "most shipping fonts" either way. The fixer's first decision was to leave the population claim and its verifier presence check unchanged, under the instruction not to edit a finding that does not hold on re-reading; the directing instance reversed it (below). The directing instance read this the other way: the page states a population fact, and the samples split by collection (263 of 328 faces on this Linux box, mostly Noto; 3 of 37 system faces in the pilot; 53 of 150 Google Fonts families by the page's own definition, N2-record.md line 78), so "most shipping fonts" is not supported, and on the collection nearest to "shipping fonts" it is false. - WRONG Y2: "one accented glyph in DejaVu Sans has a control hull 20.72 units deeper than its own curve"
research/your-font-does-not-agree-with-itself/README.md:44; public/strata/your-font-does-not-agree-with-itself/font-audit.mjs; research/source-first-pilot/adjudication/tools/fonts.py; https://www.unicode.org/Public/UCD/latest/ucd/UnicodeData.txt : Recreated with auditTrueType on /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf (SHA-256 ae7b7855e115a5966d8b1b3f80f254ccc117ec86f9965e202ee2940453837280): gid 3013, unitsPerEm 2048, control yMin -64, curve yMin -43.27710843373494, difference 20.722891566265062. The parser's selected cmap and the adjudicator's independent format-4 lookup both identify U+212D. UnicodeData, fetched with curl on 2026-09-29 (HTTP 200), line 7678: "212D;BLACK-LETTER CAPITAL C;Lu;0;L;<font> 0043". The glyph identification was wrong; the rounded measurement stands. - MINOR Y3: Apple's note is "below" the field table, quoted as "exceed the limits they represent"
https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6hhea.html : curl on 2026-09-29, HTTP 200: the note at HTML line 980 precedes the ascent field description at line 1009. The source says "exceed the the limits they represent". Corrected the location and restored the doubled word without changing the quotation's punctuation. - MINOR Y4: "each one has to name the offending byte"; relates note "each refusal must identify the exact byte or range"
public/strata/your-font-does-not-agree-with-itself/font-audit.mjs:635; src/content/strata/your-font-does-not-agree-with-itself.md:14; git show 24f118107d:public/strata/your-font-does-not-agree-with-itself/font-audit.mjs : Before editing, the pass predicate explicitly allowed a null offset. An in-memory mutation removing the UNITS_PER_EM and NO_GLYPHS offsets left both refusal rows passing and printing no byte address. The pass predicate now requires Number.isInteger(error.offset). The verifier additionally replaces every FontAuditError offset with null in an in-memory parser module: all ten refusal rows now fail, while all ten ordinary cases pass. The existing page sentence and relates note are now supported by the check. - MINOR Y5: "Every green row has a falsifiable opposite"
public/strata/your-font-does-not-agree-with-itself/page.js:214; public/strata/your-font-does-not-agree-with-itself/font-audit.mjs:502; git show 24f118107d:public/strata/your-font-does-not-agree-with-itself/page.js : renderChecks recomputes the same total formulas that auditTrueType assigns at lines 506-507. Its bit 7 predicate tests the definition assigned at line 502. These two rows cannot become false for an accepted file under these implementations. Reworded the universal claim, its matching code comment, and the two labels built by renderChecks to identify the restatements. No claim about the number or proportion of independently falsifiable rows was added; the N2-only third-row allegation was not needed for this correction. - MINOR Y6: "a VDMX table, when one is present, supersedes it"; the parser warning says the usWin reading "is not the operative one for this file"
https://learn.microsoft.com/en-us/typography/opentype/spec/os2; public/strata/your-font-does-not-agree-with-itself/font-audit.mjs:532; public/strata/your-font-does-not-agree-with-itself/page.js:262 : curl on 2026-09-29, HTTP 200: the usWinAscent and usWinDescent notes at HTML lines 3573 and 3608 require data for the current device aspect ratio and rasterization size. The parser tests only table presence; renderWarnings puts that warning on the page. Added the missing condition to both authored sentences and changed the warning's conclusion to "may not be the operative one". - UNVERIFIABLE Y7: "TrueType permits 16..16384" (adjudication: unclear)
https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6head.html; https://learn.microsoft.com/en-us/typography/opentype/spec/head; public/strata/your-font-does-not-agree-with-itself/font-audit.mjs:491 : Both sources fetched with curl on 2026-09-29, HTTP 200. Apple gives 64 through 16384 (HTML lines 975 and 1040); OpenType gives 16 through 16384 and expressly discusses fonts with TrueType outlines (line 778). These sources do not settle the broader naming objection; the Microsoft TrueType 1.0 specification was not checked. Left unchanged as instructed for unclear rows. - MINOR Y8: "Each card sets the same supported text twice", with default "A g ắ. A:g"
public/strata/your-font-does-not-agree-with-itself/generate-fixture.mjs:94; public/strata/your-font-does-not-agree-with-itself/page.js:64; https://www.unicode.org/Public/UCD/latest/ucd/UnicodeData.txt : makeCmap maps U+1EAE to glyph 4, with no U+1EAF entry. Recreated with auditTrueType(buildFixture()): lookup(0x1EAF) = 0 and lookup(0x1EAE) = 4. UnicodeData lines 7091-7092 identify the capital and small letters. drawMetricCanvas uses the input text and a sans-serif fallback, while inspect leaves the input unchanged on the initial fixture load. Replaced the default small letter with the supported capital; the verifier now checks every default-sample character against the shipped fixture's cmap.
What was done
- [fixed] Y1: index.html now says that in the samples counted few fonts store three different pairs and that how many store one pair in all three slots depends on the collection (53 of 150 Google Fonts families; 263 of 328 faces on one Linux machine full of Noto); the verifier's includes() assertion follows the new sentence, and the correction paragraph gains a line for it.
- [fixed] Y2: index.html now identifies the measured DejaVu Sans glyph as U+212D, black-letter capital C. The 20.72 figure is unchanged and was recomputed from the local font's outline. The dated correction identifies the source-first pilot.
- [fixed] Y3: index.html now says the Apple note is above the table and preserves its "the the". The correction describes both the previous wording and the source text.
- [fixed] Y4: runRefusalTests now requires an integer byte offset. This fixes both the page's ten-refusal sentence and the markdown relates note without weakening either sentence. Ten new negative mutation assertions in the layer verifier protect the requirement.
- [fixed] Y5: the HTML now says some green rows restate formulas or validity rules. page.js says the same in its comment and labels the formula and bit 7 rows as restatements. Their numerical predicates are unchanged.
- [fixed] Y6: both index.html and the warning authored in font-audit.mjs now include the device aspect ratio and rasterization size condition. Mere VDMX presence no longer rules out the usWin reading.
- [fixed] Y8: the HTML default sample uses U+1EAE (glyph 4) instead of unmapped U+1EAF. The fixture generator, binary, and base64 data are unchanged. A verifier assertion checks the actual sample against the actual shipped cmap.