Weft 0.2: code look-alikes, Latin Extended-A, combining marks, box drawing, hinting

RI
9h ago
+1375-311

Summary

machine-made Weft 0.2 (font version 0.200). Only the loom, tools and docs changed by hand. The fonts are rebuilt from them.

  • Look-alikes for code. l (stem at x 3, longer tail), I (6-unit serifs), 1 (longer flag, wider base), 0 (longer slash), q (spur at the foot). The dotted zero is ss01. The slashed zero stays the default: it gave fewer 0→O confusions than the dotted one, and both read the same overall.
  • wght 900. Accents above the base scale to 1.25 at Black, and the gap to the base grows with weight (0.95 units at Black). « » are two ‹ › components, and " “ ” „ two single quotes. They move apart at heavy weights. Offsets are piecewise linear between the master widths, so the variable font and the statics agree.
  • Glyphs. All of Latin Extended-A, Ș ș Ț ț, ẞ, Ǿ ǿ, Ǎ ǎ Ǔ ǔ Ẽ ẽ. New marks: caron, vertical caron (ď ľ ť Ľ), breve, dot above, double acute, ogonek, comma below. 14 combining marks (U+0300 to U+0328) with no advance, a mark feature, GDEF, and ccmp for i/j. ‹ › ‚ „ − and the spacing accents. £ ¥ § ¶ ± × ÷ ¢ ½ ¼ ¾ were in 0.1 already.
  • Code. Box drawing ─ │ ┌ ┐ └ ┘ ├ ┤ ┬ ┴ ┼ with a new "butt" stroke kind (no caps): the lines end on the cell edges and join across cells and lines. Arrows ← → ↑ ↓. Every glyph keeps the 750 advance.
  • Hinting. The static TTFs are hinted with ttfautohint (ttfautohint-py 0.6.1, pinned). The build stays byte-identical.
  • Drift lock rebuilt with tools/relock.py (now aware of the scaled accents).
  • Docs and site. CHANGELOG, RELEASE-NOTES-0.2.md, STATUS.md (deviations from the sketch, accepted WARNs). Site download links point to releases/tag/weft-v0.2.0.

Checks

All run locally on this branch (weft.yml triggers only on pull requests and main, so there was no branch run).

  • pytest: 1749 passed.

  • Rebuild: byte-identical (hinted TTFs included); a fresh build leaves fonts/weft unchanged.

  • fonttools varLib.interpolatable: clean on the designspace, the 12 masters and the variable font.

  • Fontspector 1.9.0 universal: 0 FAIL, 0 ERROR. VF 4 WARN, static TTF 31 WARN, static OTF 22 WARN, all in the accepted list in weft/STATUS.md.

  • OCR gate (Tesseract 5.3.4), look-alike CER (DejaVu Sans Mono 0.0875):

    FRAG 0FRAG 8FRAG 15
    Weft 0.10.1210.1280.122
    Weft 0.20.0710.0790.078

    Paragraph CER 0.0034 / 0.0011 / 0.0023 (DejaVu 0.0046). The gate now covers FRAG 8, q is in the look-alike set, and the look-alike margin is 0 (was 0.06).

  • shaperglot 1.2.2 (not in CI): all mandatory checks pass for the Central European, Baltic, Turkish and Romanian languages. Only the small-caps checks are skipped.

  • Site: site/build.py passes, the static checks pass, no external requests, no horizontal scroll at 360 px.

Review

Proofs to look at in proofs/weft/:

  • weft-before-after-lookalikes.png, weft-before-after-black.png
  • weft-lookalikes.png, weft-accents.png, weft-code.png
  • weft-charset.png, weft-designspace.png, weft-sketch-compare.png (coverage IoU 0.940)
  • weft-weight-waterfall.png, weft-frag-waterfall.png, weft-body-text.png

Changed metrics: win ascent/descent go to 1250/403 (were 1167/339). The cause is the bigger accents at Black with FRAG 100 drift, and the comma below. The advance, typo/hhea (906/−281/0), x-height, cap height and axes do not change, so the tracking on machine-made.github.io stays valid. Its fonts.py would cut a 24.6 KB subset (was 23.7 KB).

Open: ½ ¼ ¾ still merge from Regular up, # merges at Black, and there are no small caps.


Generated by Claude Code