Stamp $type on basicTheme colours so Bluesky renders the enhanced card
site.standard.theme.basic types each colour (background/foreground/accent/
accentForeground) as a union of site.standard.theme.color#rgb, and atproto
requires a $type discriminator on every union member. SkyPress was writing
bare { r, g, b } triples, so the site.standard.publication record was invalid
against the lexicon.
Bluesky's AppView validates the document + publication records it resolves
from a post's app.bsky.embed.external.associatedRefs; on an invalid record it
silently drops the enhanced standard.site link card (no source/theme/avatar/
reading-time) and falls back to a bare external embed.
Stamp COLOR_TYPE on every colour built (rgb()) or re-validated (parseBasicTheme)
so the single write boundary always emits lexicon-valid records. Existing
publications stay invalid until re-saved.
Regression tests cover both the parse boundary and the stored record; doc the
constraint in Decision 0012.