Skip to content

feat(l0): flag text that cannot follow a theme - #6

Merged
ymote merged 1 commit into
l0-visualisationsfrom
feat/theme-portability-lint
Aug 30, 2026
Merged

ymote merged 1 commit into
l0-visualisationsfrom
feat/theme-portability-lint

Conversation

@ymote

@ymote ymote commented Aug 30, 2026

Copy link
Copy Markdown
Collaborator

An emoji is painted from the colour font with its colours baked in, so draw_text.color never reaches it. A card using one as an icon renders correctly under exactly the polarity its author had on screen, and is invisible under the other.

How this surfaced

Four separate blind judge verdicts said "white icons vanish on cream" during a palette-transfer experiment. Two rounds were spent tuning the palette on the assumption it was at fault. The icons were never icon widgets — they were:

TextRow(text: "🍽️")

No palette can tint that. The experiment was measuring a defect it could not fix.

What's added

UiL0Report gains a lints channel, separate from diagnostics on purpose: a lint that could refuse a card would be a rule, and this is not a rule. The card is valid and will realize — it just isn't portable, and nothing else in the pipeline can say so.

Only the pictographic blocks are swept (plus U+FE0F, the "render in colour" selector). Latin, CJK, accents, em dashes and ellipses are monochrome and take the theme's ink correctly.

Measured on the corpus

cards flagged 81 / 967
glyph occurrences 138 — mostly 🌳 (44), ☕ (43), 🍽 (27)
cards refused 0

Two tests: an emoji card is flagged but stays valid; ordinary Latin/CJK/accented text carries no lint.

examples/lint_check.rs runs it over any set of cards.

Note: 3 pre-existing failures in tests/profile.rs (catalog/TOML drift) are unrelated and present on main before this change.

🤖 Generated with Claude Code

@ymote
ymote changed the base branch from main to l0-visualisations August 30, 2026 05:46
@ymote
ymote force-pushed the feat/theme-portability-lint branch 2 times, most recently from 0284d03 to d98d217 Compare August 30, 2026 05:47
An emoji is painted from the colour font with its colours baked in, so
`draw_text.color` never reaches it. A card that uses one as an icon renders
correctly under exactly the polarity its author had on screen, and is invisible
under the other — white plates on cream, in the case that surfaced it.

This cost real measurement time to find. Four separate judge verdicts said
"white icons vanish on cream" while an experiment assumed the palette was at
fault and spent two rounds tuning it; the icons were never icon widgets, they
were `TextRow(text: "🍽")`, and no palette can tint them.

`UiL0Report` gains a `lints` channel, separate from `diagnostics` on purpose: a
lint that could refuse a card would be a rule, and this is not a rule. The card
is valid and will realize. It is just not portable, and nothing else in the
pipeline can tell you so.

Swept over the 967-card corpus it flags 81 cards and 138 glyphs — mostly 🌳, ☕
and 🍽 standing in for icons — and refuses none of them. Latin, CJK, accents,
em dashes and ellipses are monochrome and carry no lint.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@ymote
ymote force-pushed the feat/theme-portability-lint branch from d98d217 to 4e6e755 Compare August 30, 2026 06:06
@ymote
ymote merged commit e437b49 into l0-visualisations Aug 30, 2026
8 checks passed
@ymote
ymote deleted the feat/theme-portability-lint branch August 30, 2026 06:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant