{
  "version": "2026-11-05-v1",
  "canonicalOwner": {
    "domain": "aifontgenerator.net",
    "siteId": "aifontgenerator-net"
  },
  "observedAt": "2026-11-05T12:56:33.478101+00:00",
  "evidenceThesis": "In this fixed catalog, nominal combining-code-point presence and actual NFC/NFD shaping output are different measurements. A frozen Unicode case set exposes convergence, missing-glyph results and different nonmissing glyph paths.",
  "claims": [
    {
      "id": "cmap-and-shaping-differ",
      "statement": "Across 61 exact public font files and 497 Latin canonical decomposition cases, 4,816 font-case pairs in 51 fonts lacked a complete direct cmap mapping for NFD yet shaped to the same non-.notdef glyph IDs and positions as NFC.",
      "evidence": [
        "manifest.json",
        "cases.json",
        "results.json",
        "results.csv",
        "raw-shapes.jsonl.gz"
      ],
      "limits": "This is a count of bounded font-case pairs using one pinned runtime, not all NFD strings or all fonts."
    },
    {
      "id": "equivalence-is-not-assumed",
      "statement": "Eight font-case pairs in two fonts had no .notdef on either input form but different glyph output; five pairs in two other fonts had no .notdef for NFC but included .notdef for NFD.",
      "evidence": [
        "results.csv",
        "raw-shapes.jsonl.gz"
      ],
      "limits": "Glyph-path differences are not proof of visibly different rendering; this study does not assign Unicode conformance."
    },
    {
      "id": "noncomposable-controls",
      "statement": "232 of 244 explicit noncomposable control font-case pairs produced .notdef.",
      "evidence": [
        "cases.json",
        "results.csv",
        "raw-shapes.jsonl.gz"
      ],
      "limits": "Only four specified control sequences were tested; absence of .notdef is not a visual-quality score."
    }
  ],
  "procedure": [
    "Enumerate the 61 unique public detail URLs from the public /fonts directory pages 1–3; distinguish the 60 sitemap entries.",
    "Save the detail HTML digest and displayed manifest version. Match the primary specimen-cover family/version to its preview WOFF2, excluding related-font assets. Fetch those public files and pin SHA-256 and byte length.",
    "Build the 497 canonical cases from pinned UnicodeData 15.0.0: LATIN-named Letter category, nonempty canonical decomposition, NFD length > 1, and NFC(NFD(c))==c. Add four named controls that remain uncomposed under NFC. Use Python unicodedata 15.0.0.",
    "Decode each WOFF2 into an in-memory SFNT using fontTools without altering outlines, cmap, glyph order or metrics; shape raw NFC and raw NFD separately in one HarfBuzz font with the recorded OpenType settings.",
    "Record getBestCmap mappings independently of shape output; .notdef is gid=0. Compare only the glyph ID and x/y advance/offset sequence; preserve clusters and flags without using them to decide equality.",
    "Aggregate all font-case outcomes, retaining unsuccessful and divergent cases. Run the entire measurement twice from the frozen inputs and compare all output bytes."
  ],
  "runtime": {
    "python": "3.12.13",
    "unicodedata": "15.0.0",
    "fontTools": "4.65.0",
    "uharfbuzz": "0.56.1",
    "harfbuzz": "14.4.0",
    "direction": "ltr",
    "script": "Latn",
    "language": "en",
    "clusterLevel": "MONOTONE_GRAPHEMES (0)",
    "bufferFlags": "DEFAULT (0)",
    "featureOverrides": {},
    "shapers": [
      "ot"
    ],
    "fontScale": "unitsPerEm on both axes",
    "fontVariations": {},
    "comparisonFields": [
      "gid",
      "xAdvance",
      "yAdvance",
      "xOffset",
      "yOffset"
    ],
    "recordedButExcludedFromEquality": [
      "cluster",
      "flags"
    ],
    "fallback": "none; one HarfBuzz font per call",
    "inputs": {
      "manifest.json": "4a86614a9936d2178a32333c5109c6a731312e08a4b1f2af3f52929748e6305a",
      "cases.json": "55731162d2ffcade236fc99f323b2c32aac026fe61917c043a5dc7ca35c256a9"
    }
  },
  "reproduction": {
    "command": "python reproduce.py --root . --output ./recomputed --download",
    "dependencies": {
      "Python": "3.12.13 used",
      "fonttools[brotli]": "4.65.0 used",
      "uharfbuzz": "0.56.1 used (bundled HarfBuzz 14.4.0)"
    },
    "downloadPolicy": "Only exact publicly linked preview WOFF2 URLs. No authenticated paid-download route is used; downloaded bytes must match manifest SHA-256. Original font binaries are not attachments.",
    "buildCases": "Download the pinned UnicodeData.txt URL, then run build_cases.py --unicode-data UnicodeData-15.0.0.txt --output rebuilt-cases.json with unicodedata 15.0.0. cases.json is frozen so shaping reproduction does not need to regenerate it."
  },
  "limits": [
    "This is a census of 61 published current-version preview files in one commercial catalog at one observation time. It is not a representative sample of fonts, AI-generated fonts, Latin typography or the internet.",
    "497 Unicode 15.0.0 Latin-named canonically decomposable letters and four explicit noncomposable controls are a bounded test set. No claim covers all combining sequences, all Unicode characters, all languages or arbitrary text.",
    "Only one isolated test string per call is shaped, using the OpenType shaper with fixed ltr/Latn/en parameters and default feature behavior. Whole-word context, other scripts, language-specific shaping, ligatures, kerning, browser fallback, variable axes and platform renderers are not assessed.",
    "No cross-font fallback, replacement fonts or post-shaping repair is used. HarfBuzz OpenType default normalization and fallback mark positioning remain enabled; therefore offsets must not be attributed solely to a font GPOS table.",
    "A nonzero glyph ID means that this shaping run avoided .notdef. It does not prove visible ink, correct accent placement, legibility, rasterization quality, semantic correctness, complete language coverage or production suitability.",
    "Equal output means an identical sequence of glyph IDs and x/y advances and offsets within the same font. Cluster values and glyph flags are recorded but excluded from this comparison. Unequal output does not by itself prove a visible difference; no raster-image equality or visual-quality test was run.",
    "Glyph IDs are local to each font. Comparing glyph IDs between different fonts has no meaning. FontTools getBestCmap presence is a separate nominal code-point mapping measure and is never used as a substitute for shaping.",
    "Some NFC strings shape without .notdef even when the original precomposed code point has no cmap entry; some equivalent NFC/NFD paths differ. Five observed cases have no .notdef for NFC but do for NFD. These outcomes are not Unicode conformance judgments or universal HarfBuzz guarantees.",
    "Runtime and font hashes are pinned. Other HarfBuzz versions, feature settings or font revisions may produce different outputs. Public font URLs can cease to be available; the manifest hashes identify the measured bytes. No font binaries are redistributed with the data.",
    "60 of the 61 published detail pages were in the sitemap. Bubble Pillow Square was publicly visible and included in the catalog census but omitted from the sitemap; publication and search indexing eligibility are distinct."
  ],
  "independentReaderValue": "A reproducible input corpus, per-font and per-case outcomes, complete raw glyph output, counterexamples and source hashes that remain useful without a product purchase."
}
