Lote mínimo de honestidad de API del plan de cierre. Cuatro items, cada prueba
vista fallar; constructor y adversarial Opus (este con mutaciones propias y la
verificación global sobre los mismos bytes).
1. A-106 — `<Button bind:ref>` de eidos nunca recibía el elemento: el Button
pasaba `...headlessProps` al de soma y un spread de rest props transporta
el valor, no el binding (el proxy de rest props de Svelte 5.55 no tiene
setter). Ahora `ref = $bindable(null)` + `bind:ref`, el patrón de los 14
wrappers que ya lo hacían. Test client (Chromium) con raíz real: sin el
arreglo `Received: null`. El adversarial lo midió también con asChild,
loading y dentro de ButtonGroup (llega el nodo pintado en los cinco casos)
y mutando `bind:ref` → `{ref}` (rojo).
2. Opciones del motor de sonido con motor compartido — el censo viejo decía
«descartadas en silencio»; ya no lo eran (engine.ts aplica `masterGain` y
avisa de las claves inaplicables), pero nada lo pineaba. Test nuevo desde
`createActiveUix` con logger real: el gain cae en `uix.sound` y el aviso
nombra exactamente `audioContextFactory` y `fetcher`. Lo tumban cinco
mutaciones, una de ellas en la raíz (sema con un motor privado).
3. docs/architecture/sema.md §Announce decía «opt-in» a secas. Cierto para un
`EngineSemantic` desnudo; falso en las raíces, que registran el canal por
defecto (S-19(ii)). El título y el primer párrafo lo separan, con el
opt-out exacto de cada modo. Cada frase ejecutada por el adversarial contra
motor desnudo, standalone y attach.
4. SemaSignatureOverride, rama `Record<string, DeltaValue>` — NO se retira:
es por donde entran los ops que sema.md:257-263 documenta para overrides de
haptic (`{ op: 'add', value: 0.1 }`), y el resolver los honra en runtime
(medido: 0.5 → 0.6). Retirarla rompe 0 sitios en svelte-check (no los 8 del
plan) pero volvería error de tipos la forma doctrinal. El tipo exacto por
hoja con DeltaOp es fila del ledger; channels.ts byte-idéntico.
Filas que deja para el ledger: el mismo defecto de ref en 532 ficheros de 99
componentes de eidos (muestra runtime 3/3); la rama Record admite typos y
valores basura; applyOverride clona un DeltaOp literal como firma cuando la
familia no tiene slice haptic base (HapticChannel lanza); «opt-in» sin
calificar en book-deviations.md:508 y announce.ts:13; attach/motor desnudo sin
pin directo de announce.
Verificación (adversarial, lote con sha256 5/5 idéntico al commiteado):
check:gate OK (89 de web/ dentro del ledger, src/ a cero) · suite 466/466
ficheros · 5445/5445 tests (+2/+3) · docs:check 0/0 en 820 docs · eidos:lint
0 inválidos · apps:check verde (smoke boot 27/27, 0 errores) · el resto de
miembros del gate exit 0 · prettier limpio en lo nuevo (button.svelte arrastra
dos líneas de deuda previa, idénticas en HEAD; las cierra el one-shot de F5).
Coordinador: los tres ficheros de test tocados, 45/45; docs:check 0/0.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>