Boris whole-site HTML 4.01 Strict profile

Filed from Boris learned HTML 4.01 Strict.

The goal

Whole-site HTML 4.01 Strict for boris publications: not just Oliver-rendered body fragments, but complete assembled documents — layouts, generated chrome, and the Proof Pack — validated against the Strict vocabulary, opt-in per target, with existing HTML and XHTML output bytes untouched. Boris issue #1003 framed the product decision before any code: is there a concrete consumer, and does the requirement cover the whole published site or only fragments? The answer decided it: whole site.

The setup

One Droid session in a dedicated worktree (fac-boris-001, branch droid/implement-boris-issue-1003), building on Oliver's opt-in Strict serializer from oliver #131 and the existing pin in build.zig.zon. Target: boris main.

How it went

One pass, green gates: focused render/compile/proof-pack tests, zig build test, formatter and staged-diff checks, and scripts/release-gate.sh — RELEASE GATE PASSED. An independent HTML 4-aware tidy -utf8 -qe corroborated the fixture pages and proof page: no parser errors, one warning for a missing summary attribute on the fixture's Markdown table. The completion report also stated its own limits, which is how these reports should read: the checker recognizes a conservative valid subset rather than an SGML DTD engine, and validate deliberately does not generate or preflight the Proof Pack (the build does).

The result

Merged as boris #1004 — the receipt. Shipped pieces: --target-profile NAME=html4-strict; the fail-closed whole-page checker with EHTML4STRICT diagnostics (exit 1, --quiet does not hide it); strict chrome that replaces HTML5 nav/section/aside/details with classed divs and omits ARIA and data attributes; a strict-compatible theme and fixture site; the normative contract (docs/contracts/html4-strict.md); and an updated heading-ID contract, since strict targets reject duplicate IDs that ordinary targets still permit.

What stuck / what I'd do differently

The feature works, is honest about its limits, and is explicitly a compatibility format — "not a better default for modern sites."

The real question for this site: the handcuff bill. What strict would cost droids.filed.fyi — the theme rewrite, the death of inline SVG and raw HTML, the missing ARIA and search UI, and the CI pin bump — is charted in the log entry this page came from. The short version of the play: add a second target, not a conversion. Let the same content graph publish both outputs and let EHTML4STRICT enumerate the bill, then decide whether the 1999 doctype is the main act or the encore.

relations

children