| 3 | No hay capa de gesto radial | ✅ RESUELTO | `Gesture.rotate` 4ª especialización en `soma/layers/gesture` (`18b0d44e`); el Knob lo consume |
| 4 | Doctrina `trigger()` continuo sin cerrar | ✅ RESUELTO | sección `## Continuous components` en `sema.md` (`1da36ca6`), fact-check adversarial |
| 5 | Falta condición `part-absent` | ✅ RESUELTO | `{ when: 'part-absent', part }` en morfo (`11504043`); el morfo del Knob la usa |
| 6 | Formato de `langs/components/{kebab}.ts` | ✅ RESUELTO | forma `LangNode` (`{ key: { es, en } }`, anidable, `satisfies`) documentada en morfo/soma/checklist |
| 7 | CSS-vars del provider sin contrato | 🟡 CASI | dirección **recipe→tema** guardada (opción C: guard de fantasmas de tema en `recipe-css-contract` — pilló 3 bugs reales); queda solo el sub-contrato **provider→recipe** (opción A, opcional) |
| 8 | Docs imprescindibles fuera del paquete | ✅ RESUELTO | `component-audit.md §0` lista el paquete mínimo como archivos exactos |
| 9 | Fricciones menores (docs) | ✅ RESUELTO | `### Authoring notes` en `soma.md` §6: `state<T>()` vs `$state`, `role` opcional en Provider, `Without<>`/`PrimitiveDivAttributes`, ownership de pointermove/up del gesture |
## 8. Dos docs imprescindibles no estaban en el paquete
`demo-authoring.md` (el template de 9 tabs está "locked" y es error-level en
D-1.x — imposible producir un demo conforme sin él) y `CANON.md` (sema.md se
declara subordinado a él: "if they ever disagree, the code + canon win").
Un agente con este paquete produce las 4 capas pero no el demo, y no puede
verificar que el vocabulario que usó es el vigente. Para briefs de agentes,
el "paquete mínimo" debería estar definido en el propio component-audit.md
§0 como lista de archivos, no de títulos.
## 9. Fricciones menores
- **`state<T>()` vs `$state`**: el sistema reactivo documenta `state<T>(initial) → State<T>` pero los ejemplos de provider usan `$state` a secas para campos internos. ¿Cuándo cada uno? Deduje que `State<T>` es para pasar por referencia (labelId) y `$state` para campos locales, pero es deducción, no doc.
- **`role` en el Provider raíz con DOM**: el ejemplo de Dialog tiene Provider virtual sin role; para un Provider-contenedor con DOM no hay guía de si omitir `role` es válido o si el campo es requerido por el schema. Lo omití.
- **`Without<...>` / `PrimitiveDivAttributes`**: nombres citados en ejemplos pero sin definición visible; los usé por imitación.
- **El wrapper de gesture**: A15 dice que `.props` del gesture es "only `onpointerdown`" — pero ¿quién registra pointermove/up globales, el layer vía `dom.listen` o el provider? Asumí el layer.
## Qué funcionó notablemente bien
Para ser justos, la mayor parte del camino estuvo pavimentada: el morfo fue
casi mecánico de escribir (los builders `v.*` + las conditions cubren el 90%
del contrato), `SEMA_VERBS` tenía exactamente los verbos que necesitaba
(`handle.rotate` existe, `commit.set` existe — el vocabulario del libro
aguanta un componente que no existía), la política de intent forzó una
decisión de diseño buena (¿qué intent lleva el commit de un knob? → prop
`intent`, y de ahí salió el caso de uso del gain a 0dB), y las reglas
A30/A31/A35/A36 me previnieron de tres bugs de reactividad que habría
escrito con toda seguridad. El framework corrige al agente. Ese era el punto.