@ -106,25 +106,23 @@ channel consume it; `sema-map.ts`'s per-family hold column died). The chapter
holds in ~34 places. **Blocked** : the file is the author's WIP (uncommitted
edits) — sync it when the author's pass lands, not before.
## 6. THM-2 rollout — per-instance palette to all surfaces — SHIPPED 2026-07-12
## 6. THM-2 rollout — per-instance palette to all surfaces — SHIPPED 2026-07-12; scope boundaries REVERTED by the open-color-cage initiative (2026-07-18/19)
Shipped in `05f0031c` (media-player Batch-4 + 14 surfaces + vocab + 4 props)
and `cc7e9a16` (avatar root). Every per-component palette cascade now collapses
into the shared `--palette-*` layer (size win, behavior-preserving for roles);
the vocabulary gained the alpha `surface` /`surface-hover` + `hover` slots. The
`color` prop was widened to `ComponentColor` (roles + 33 scales) where arbitrary
color is meaningful (badge, tag-group, tags-input, toggle-group; button/toggle/
card already had it); semantic controls (checkbox/radio/stepper/editable/select/
file-upload) stay role-restricted by design. Full detail + the per-component
verification: the plan's §THM-2 block.
**Deliberate scope boundary — `Avatar.Badge` is OUT of the per-instance scale
palette, by design** (aligned with the ecosystem): a status badge takes a
role/intent (online→affirm, alert→threat) or a direct CSS color — MUI/Spectrum/
Bootstrap use semantic status colors, Chakra/Mantine/Ant use a direct color; NO
framework routes an avatar's status badge through a brand-scale palette. So the
badge keeps its role palette + custom-CSS; migrating it (per-part forward + ~36
orphan prunes) would exceed the convention. Not debt — a design decision.
the vocabulary gained the alpha `surface` /`surface-hover` + `hover` slots.
> **REVERSED (2026-07-18/19) — "abrir la jaula del color".** THM-2 originally
> kept semantic controls (checkbox/radio/stepper/editable/select/file-upload)
> and `Avatar.Badge` role-restricted "by design". A later user decision reverses
> that: `color` accepts the FULL system (role / intent / 33 scales / raw CSS =
> `ComponentColorProp` ) on **every** component, no exceptions — content-ink
> primitives keep their axis as an additive union. Enforced by two guards in
> `recipe-css-contract.test.ts` . Full record + the closed queue (incl. the
> chart SVG resolver and the Card/Avatar custom-color fix):
> [`process/open-color-cage-2026-07.md` ](./process/open-color-cage-2026-07.md ).
> Only `qr-code` stays out (its `color` is the QR module ink, not a scale).
## 5. Book editorial note — "el hold es suelo, no tijera" — 2026-07-06