Heddle 0.2: Latin Extended-A, lighter marks, open counters at Black, wdth 85 masters

RI
5h ago
+4128-814

Summary

Closes the "Open issues for 0.2" list in heddle/STATUS.md. Loom changes only; the fonts are rebuilt from it.

  • Drift near wdth 85: 4 masters at wdth 85 (16 in all). Largest shape drift 11.1 % → 8.7 %, largest advance drift 38.8 → 30.6 units (proofs/heddle/drift.json). Tabular figures now take the sketch width at every master width (0.85 at wdth 85; 0.1 gave 0.9).
  • Marks: lighter and smaller. A new .narrow set on ı I l ȷ keeps ï Ï Ĩ ĺ at their base advance. Capital marks stay below 950, so win ascent is now 950 (was 1051).
  • Open counters at Black: a minimum counter rule: inner radius ≥ 0.25 S, capped at 38 units per weight. Hook rings (f t j ſ ŋ Ŋ £) widen so the hook counter stays open; j reaches left of its box at heavy weights. Nothing changes at Regular. ß ð @ © ® % are redrawn with the rule, and § is new.
  • Glyphs: all of Latin Extended-A, Ș ș Ț ț, ¢ £ ¥ § ¶ ± × ÷ −, ½ ¼ ¾, fraction slash, numerators and denominators, spacing marks, and the frac/numr/dnom features. That is 398 glyphs and 338 code points (0.1: 197 and 184). Tests check text samples in 13 Central European languages.
  • Kerning: new lowercase pairs, plus figures against punctuation. Figures are tabular, so they do not kern with each other (Fontspector tabular_kerning). The no-touch test now checks every member of every class in all 16 masters.
  • Boolean step: the pathops fallbacks are gone. The new step unions, snaps to integers, splits self-touching contours (Œ at wght 800 had its counter joined to the outline by a slit, wound wrong for nonzero) and winds each contour by nesting depth. Each static glyph is then checked against the nonzero fill and checked for leftover overlaps. No glyph needs a fallback.
  • Hinting: static TTFs go through ttfautohint 1.8.4 (ttfautohint-py 0.6.1, pinned) with no_info and the head dates kept. The build stays byte-identical.
  • Name: register search for HEDDLE is recorded in heddle/BRIEF.md. No mark for fonts or software was found; HEDDLE & CO. (textile decor) and STEEL HEDDLE (loom parts) exist. The register sites were not reachable from the build machine, so this used web search and Justia. Not renamed.
  • Version 0.200, CHANGELOG.md, RELEASE-NOTES-0.2.md, STATUS.md (open items for 0.3, accepted WARNs). The specimen and download pages now link releases/tag/heddle-v0.2.0.

Checks

All run locally on Python 3.14 with the pinned tools. heddle.yml runs only on PRs, so CI runs when this PR opens.

  • pytest: 533 passed.
  • Byte-identical rebuild, hinting included: yes (git status clean after rebuilding the committed tree).
  • fonttools varLib.interpolatable: clean on the designspace, the 16 master UFOs and the variable font.
  • Fontspector 1.9.0 universal: variable font 0 FAIL / 0 ERROR (4 WARN); 11 statics 0 FAIL / 0 ERROR (47 WARN). Accepted WARNs are listed in heddle/STATUS.md. New ones are suspicious_sidebearings (space, ſ) and alt_caron (decomposed statics).
  • Drift report is current; max shape 8.7 % (was 11.1 %).
  • OCR check (display face, so it guards against regressions only; proofs/heddle/readability.json, Tesseract 5.3.4, 24/32/48 px) gives CER 0.17 / 0.17 / 0 % for Regular / Bold / Black, against 0 / 0.34 / 0 % for 0.1. The gate (at most +1 point) passes.
  • Sketch comparison: IoU 0.96–0.97 at Regular and Black; at wght 250, wdth 85 it is 0.86 (was 0.73).
  • Site: build and static checks pass. No external requests, no console errors and no horizontal scroll at 360 px on all pages, and Heddle loads.

Review

Please look at these:

  • proofs/heddle/heddle-before-after-accents.png
  • proofs/heddle/heddle-before-after-counters.png
  • proofs/heddle/heddle-before-after-drift.png
  • proofs/heddle/heddle-latin-ext.png
  • proofs/heddle/heddle-symbols.png
  • proofs/heddle/heddle-charset.png, heddle-kerning.png, heddle-designspace.png

Things to judge by eye:

  • The open counters at Black show as small notches in s and t. They are on purpose, and are listed as a deviation from the sketch.
  • The ogonek and the vertical caron (ď ľ ť Ľ).
  • The new § (an s with a ring as its spine) and ¶.
  • The j hook reaching left at Black.

Not done:

  • The site repo's tracking values (machine-made.github.io) were not re-checked. Only figure widths at wdth 85 and kerning changed.

Generated by Claude Code