dira decision memory for AI coding agents
$dira whydec-0016
int-0002Zero-ceremony operation — one binary, no server, no daemonactive 2026-07-29
dec-0016Self-host TeX Gyre Pagella; the system-font stack was silently broken on Linuxaccepted 2026-07-30
✗ Keep the system stack — Palatino, Palatino Linotype, Book Antiqua, Georgia, serifIt resolves on macOS, mostly on Windows, and on a stock Linux install resolves to none of them, falling through to DejaVu Serif whose metrics are nothing like Palatino's.
✗ URW P052, the other Palatino metric cloneEliminated on licence, not on design.
✗ Source Serif 4The cleanest licence of the set (OFL 1.1) and, contrary to the framing this bake-off started from, it preserves the existing ratios exactly.
✗ Literata or NewsreaderBoth purpose-built for long-form screen reading and the most distinctive of the candidates, but both carry different metrics, so every measure and leading value would need re-tuning.
…1 further refusals on record
int-0002Zero-ceremony operation — one binary, no server, no daemon
dec-0016Self-host TeX Gyre Pagella; the system-font stack was silently broken on Linux
✗Keep the system stack — Palatino, Palatino Linotype, Book Antiqua, Georgia, serif
✗URW P052, the other Palatino metric clone
✗Source Serif 4
✗Literata or Newsreader
…1 further refusals on record
dec-0016 ◆ accepted 2026-07-30

Arising from int-0002 — Zero-ceremony operation — one binary, no server, no daemon

Self-host TeX Gyre Pagella; the system-font stack was silently broken on Linux

dira embeds subsetted **TeX Gyre Pagella** — regular, italic and bold — and stops relying on a font stack that resolves differently per platform.

Why this is a correctness fix, not a taste preference

`dec-0012` established that the UI is server-rendered and embedded in a Go binary that must work offline, and the reasoning recorded at the time was that webfonts "bloat the binary for zero functional gain." **That trade was miscounted.** The gain is cross-platform typographic determinism, which is exactly what the system-font rule existed to buy and was not delivering. `embed.FS` puts the subset inside the binary with no network call, so the offline guarantee is untouched. Total payload: 60.6 KB for three faces.

Why Pagella specifically

It is a **Palatino metric clone**, so every measure, leading and scale value already tuned in this system stays valid — self-hosting became a pure determinism fix with zero re-tuning. It was also the **only candidate with complete glyph coverage** for the characters this design uses, and the smallest subsetted payload of the five tested.

Licence obligations, met

GUST Font Licence (LPPL 1.3c). Renaming a derived work is *requested, not required* — GUST says so explicitly — and these files keep the Pagella name with outlines unaltered. LPPL 6b requires prominent notice of the nature of any change: these are **subsets**, recorded in `NOTICE` and `assets/fonts/README.md`.

What this does not change

The fallback chain stays in place behind the embedded face, so a build that somehow ships without the font still renders. `dec-0012`'s server-rendered, no-SPA architecture is untouched — this narrows only the "no webfont" reading of the offline constraint.

The reason this was found at all

Not by the design gates. A critic briefed to argue the direction should be reopened found it while building a case it ultimately conceded, and it is the third gate this session shown blind to what it appeared to guarantee — the coverage checker could not see its own untracked source, the contrast matrix could not see a composited tint, and the render harness cannot see a font fallback it will never experience. Same shape each time: the check validates the declaration rather than the rendered result.

Alternatives on record — 5

✗Keep the system stack — Palatino, Palatino Linotype, Book Antiqua, Georgia, serifrefused It resolves on macOS, mostly on Windows, and on a stock Linux install resolves to none of them, falling through to DejaVu Serif whose metrics are nothing like Palatino's.

A git-native developer tool has a large Linux audience, and every measure, leading and ratio in this design was tuned by rendering on macOS with Palatino loaded. That is precisely the failure the system-font rule was adopted to prevent, relocated to where the render harness structurally cannot see it, because the harness runs on macOS.

✗URW P052, the other Palatino metric clonerefused Eliminated on licence, not on design.

It is AGPL-3.0 with an exception covering PostScript and PDF documents ONLY. Embedding a woff2 in a Go binary and serving it over HTTP is neither a PostScript file nor a PDF, so the exception does not reach it, leaving bare AGPL-3.0 on an Apache-2.0 project. There is also no "URW Palladio" on Google Fonts; four candidate paths were checked and all 404.

✗Source Serif 4refused The cleanest licence of the set (OFL 1.1) and, contrary to the framing this bake-off started from, it preserves the existing ratios exactly.

Lost narrowly on glyph coverage: it lacks U+2011, the non-breaking hyphen, which this project's own documents use.

revisit ifa licence audit ever rules the GUST Font Licence unacceptable

✗Literata or Newsreaderrefused Both purpose-built for long-form screen reading and the most distinctive of the candidates, but both carry different metrics, so every measure and leading value would need re-tuning.

Both also have glyph gaps, and Newsreader has no arrows at all — a standing constraint for a tool that renders arbitrary agent-written prose.

✗Re-tune every ratio against DejaVu Serif, the worst-case fallbackrefused Correct for the weakest case and merely nicer everywhere else, at no binary cost.

Rejected because it accepts that the design a reviewer approves is not the design a third of the audience sees, and fixes the symptom rather than the determinism.

Every decision in this repo is recorded like this one.

Keep your own →