fix(symbols): track unrenderable variants per-variant so the archive can build
The weekly snapshot has failed since 2026-06-14. The Swift half of that was
fixed earlier this week; today's scheduled run got all the way through the
toolchain, the dylib build and the full corpus sync, then died in
`Build archives`:
SnapshotIncompleteError: 4 pre-rendered SF Symbol variants missing
(public/square.and.arrow.up ultralight/{small,medium,large}, thin/small)
macos-26 draws that symbol at every other weight, so v27's whole-symbol
`render_unsupported` flag never applied: mark-unrenderable.js only set it when
EVERY variant failed, deliberately leaving partial failures to 'stay loud'. But
nothing on the host can ever produce those 4 renders, so 'loud' meant the
completeness gate counted 4 permanently-missing files and refused to build any
snapshot, forever.
Make the concept per-variant (v28 `sf_symbols.unsupported_variants`, a JSON
`"<weight>/<scale>"` array):
- the prerender loop records the exact failing set for a partially-drawable
symbol, and still sets the v27 flag when no variant draws at all;
- the gate skips precisely those variants and keeps counting everything else,
so a real regression still fails the build;
- both are reported separately (skippedRenderUnsupported vs
skippedUnsupportedVariants) instead of being conflated.
Regression tests cover both halves: that a partial failure is recorded rather
than ignored, and that the gate skips recorded variants while still flagging a
genuine gap. Full suite 2480 pass / 0 fail, typecheck + lint clean. G
Gigi committed
0d9c3a8f45296e4ca8bf91f38fb8d9f0bcd5b82e
Parent: e769fbc