@ -352,12 +352,69 @@ track paralelo, probado con git stash). Registrado en `docs/next-features.md §6
> **Cierre en el guard** : `soma-attr-audit.test.ts` gana `'media-player': 0`
> con dossier de por qué es 0; el comentario "Still UNMIGRATED" retirado.
### THM-4 · media-player ✅ ADJUDICADO 2026-07-12 — 0 deuda real
Dossier de los **47 `unused`** (columna de `eidos-lint media-player` ) contra la
doctrina `eidos.md §unused` (comportamiento/composición = legítimo; "declarado
para un eje visual que nadie consume, sin razón" = deuda). Clasificación
completa — **cero deuda silenciosa** :
- **21 · estados de botón** (play/mute/fullscreen/pip/caption/seek/settings ×
`data-state` /`data-disabled`/`data-direction`) → **composición legítima** : el
cromo del botón (state-layer, disabled, focus) vive en el `<IconButton>`
compuesto; `data-state` conduce el swap de glifo en Svelte (JS), no en CSS.
- **7 · sliders** (time/volume × `data-orientation` /`data-disabled`/`data-seeking`)
→ **composición** : el visual es el `[data-slider]` compuesto.
- **11 · flags de estado del root** (`data-paused`/`muted`/`seeking`/`ended`/
`error` /`fullscreen`/`pip`/`live`/`can-play`/`captions` + `controls='visible'` )
→ **espejos de comportamiento** del elemento media (el morfo declara toda la
superficie behavioral; `controls='visible'` es el estado por defecto — solo
`hidden` se estiliza).
- **6 · resto** (media-part `data-media` [lo estiliza el padre], time
`data-type='current'/'remaining'` [default; solo `duration` distingue],
captions/buffering/controls `data-*` propios [driven por el padre / superficie
opcional]) → legítimo.
- **2 (nota) · superficies v2 documentadas** : `settings-button` (data-state
open/closed + disabled) y el custom `captions` NO tienen provider/CSS/render —
son **roadmap v2 declarado a propósito** (ambos READMEs lo marcan v2). No es
deuda silenciosa; es superficie futura documentada. Candidatas a poda SOLO si
se abandona el v2.
**Conclusión**: el count alto es porque media-player es un composite grande (10
partes + 10 espejos de engine), no porque tenga deuda. Nada que consumir/podar
sin decisión de feature (p.ej. un badge LIVE o un overlay de error serían
diseño nuevo, no THM-4). **media-player adjudicado, 0 deuda.**
### THM-4 · stepper ✅ ADJUDICADO 2026-07-12 — mayoría legítima + 1 redundancia de API
De los **30 `unused`** : ~la mitad legítimos (`data-state='incomplete'` = estado
base; `data-orientation='horizontal'` = default; estados de content). El
hallazgo: el morfo declara en CADA parte (item/trigger/indicator/separator)
**DOS representaciones del mismo estado** — `data-state` (enum complete/current/
incomplete) **Y** los booleanos `data-current` /`data-complete`/`data-incomplete`
(`propRef`, severity optional). El propio CSS las usa **inconsistentemente** :
enum en trigger/indicator, booleano `data-complete` en el separator. Así que NO
es deuda-sin-consumidor (la forma booleana SÍ se consume en el separator) —
es **redundancia** : cada parte declara ambas formas y usa una. Consolidar en
`data-state` (canónico) + migrar el separator a `data-state='complete'` + podar
los booleanos limpiaría la inconsistencia, PERO es **cambio de API pública**
(un consumidor podría estilizar `[data-complete]` ) → **decisión de diseño** , no
poda unilateral.
### THM-4 — lectura emergente (2 lotes)
media-player (0 deuda) + stepper (0 deuda-real, 1 redundancia de API): los
hotspots son **mayormente legítimos** (composites grandes + superficie
behavioral); la deuda-sin-consumidor genuina es **rara** . Lo accionable son
**decisiones de diseño** (dual-API de stepper), no podas mecánicas. Esto
CONFIRMA la predicción de la doctrina ("la mayoría son legítimos") y sugiere que
**la tasa de deuda NO justifica una regla de máquina** — THM-4 es sobre todo
adjudicación documentada. Restan color-picker/avatar/trp por adjudicar
(probablemente mismo patrón: mayoría legítima + alguna redundancia/decisión).
### Cola pendiente (sin orden fijo — algunas requieren decisión de usuario)
- **THM-2 rollout** — 12 superficies restantes (tracker en §THM-2 arriba):
privadas-forward-ready [toggle-group/tag-group/tags-input/stepper] vs
rol-directo-mini-diseño [badge/card/avatar/…]. Lote estilo S4.
- **THM-4 hotspots** — quema de selectores sin consumidor (media-player 47 ·
stepper 30 · color-picker 29 · avatar 28 · trp 26), dossier por componente.
- **THM-2 rollout** — CERRADO (ver §THM-2; `Avatar.Badge` fuera por diseño).
- **THM-4 hotspots** — **media-player ✅ adjudicado (0 deuda, dossier arriba)** .
Restan: stepper 30 · color-picker 29 · avatar 28 · trp 26 (dossier c/u).
- **F4-D GAP-\** * — menú de personalización (§7): pendiente de SCOPING del
usuario (qué se arranca vs qué se registra como límite deliberado).
- **cascada-vs-firmas** (motion) — cola lateral: las reglas `[data-stagger]`