Skip to main content

max / alloy

Split the font-coverage guard by profile too Second instance of the defect the previous commit fixed, found by the next step of the same build. default-fonts-cjk-sans and -other-sans are installed in the client-only block, correctly — they exist so the browser can render CJK, Arabic, Indic and Thai, and a headless box ships no browser — while the assertion that they landed was written before the split and ran on both. The server branch asserts the same claim from the other side: that the coverage really is client-only, that Alloy's own faces are present since the font layers are deliberately unconditional, and that no emoji font arrived. fc-match is not asked there, because the prune takes the skeleton's fontconfig with it and the answer would be the base's opinion rather than Alloy's, which is the mistake the HOME=/etc/skel note directly above warns about.
Co-Authored-By
Claude Opus 5 (1M context) <noreply@anthropic.com>
Author: Max Johnson <me@maxj.phd> · 2026-08-03 23:21 UTC
Signed with PGP, not checked
Commit: 1b038856034e4419800c4bd37974ef4c25db58fc
Parent: 3dc6677
1 file changed, +33 insertions, -8 deletions
M Containerfile +33 -8
@@ -2002,15 +2002,40 @@
2002 2002 # answers "Noto Sans" while the same query under the skeleton answers "Atkinson
2003 2003 # Hyperlegible". A guard written without it would have asserted the base's opinion
2004 2004 # and passed while claiming to check Alloy's.
2005 + #
2006 + # Conditional since 2026-08-03, for the reason the skel-night guard above it
2007 + # is: the coverage metapackages are installed in the client-only block, since
2008 + # they are there for the browser and a headless box has none, while this test
2009 + # was written before the split and asserts them on both. `PROFILE=server`
2010 + # failed here on the first server build.
2011 + #
2012 + # The server branch is not a skip. It asserts the same claim from the other
2013 + # side — that the coverage really is client-only — plus the two that hold
2014 + # everywhere: Alloy's own faces are installed, since the font layers are
2015 + # deliberately unconditional, and no emoji font arrived. `fc-match` is not
2016 + # asked on server: the prune takes etc/skel/.config/fontconfig with the rest of
2017 + # the skeleton, so there are no Alloy aliases left to resolve and the answer
2018 + # would be the base's opinion, which is the exact mistake the HOME=/etc/skel
2019 + # note above warns about.
2005 2020 RUN set -eux; \
2006 - for lang in ja zh-cn zh-tw ko ar he hi th bn ta; do \
2007 - [ "$(fc-list ":lang=$lang" family | wc -l)" -ge 1 ] \
2008 - || { echo "no font covers '$lang'; every page in that script renders as missing glyphs" >&2; exit 1; }; \
2009 - done; \
2010 - HOME=/etc/skel fc-match sans-serif | grep -q 'Atkinson Hyperlegible' \
2011 - || { echo "sans-serif is no longer Atkinson; the added coverage outranked Alloy's own pick" >&2; exit 1; }; \
2012 - HOME=/etc/skel fc-match monospace | grep -q 'IosevkaTerm Nerd Font Mono' \
2013 - || { echo "monospace is no longer IosevkaTerm; a cell grid would get mismeasured icons" >&2; exit 1; }; \
2021 + if [ "$PROFILE" = client ]; then \
2022 + for lang in ja zh-cn zh-tw ko ar he hi th bn ta; do \
2023 + [ "$(fc-list ":lang=$lang" family | wc -l)" -ge 1 ] \
2024 + || { echo "no font covers '$lang'; every page in that script renders as missing glyphs" >&2; exit 1; }; \
2025 + done; \
2026 + HOME=/etc/skel fc-match sans-serif | grep -q 'Atkinson Hyperlegible' \
2027 + || { echo "sans-serif is no longer Atkinson; the added coverage outranked Alloy's own pick" >&2; exit 1; }; \
2028 + HOME=/etc/skel fc-match monospace | grep -q 'IosevkaTerm Nerd Font Mono' \
2029 + || { echo "monospace is no longer IosevkaTerm; a cell grid would get mismeasured icons" >&2; exit 1; }; \
2030 + else \
2031 + [ "$(fc-list ':lang=ja' family | wc -l)" -eq 0 ] \
2032 + || { echo "profile=server carries the browser's script coverage; it ships no browser" >&2; exit 1; }; \
2033 + fc-list family | grep -q 'IosevkaTerm Nerd Font Mono' \
2034 + || { echo "IosevkaTerm is missing; the font layers are unconditional and this profile has a console" >&2; exit 1; }; \
2035 + fc-list family | grep -q 'Atkinson Hyperlegible' \
2036 + || { echo "Atkinson is missing; the font layers are unconditional" >&2; exit 1; }; \
2037 + echo "fonts: Alloy's own faces present, the browser's coverage correctly absent"; \
2038 + fi; \
2014 2039 [ "$(fc-list ':charset=1F600' family | wc -l)" -eq 0 ] \
2015 2040 || { echo "an emoji font arrived; docs/STACK.md says none is shipped, so update the decision or drop the font" >&2; exit 1; }
2016 2041