# CONTINUE — P0 de la auditoría arquitectónica (handoff, act. 2026-08-26 madrugada) **Estado**: **P0 = A + B + C, EJECUTADO Y VERIFICADO.** Fase A cerrada (árbol en verde con instrumento afinado) · fase B cerrada (la puerta existe, sabe fallar y pasó en verde sobre HEAD; hook con fuente commiteada) · fase C cerrada entera (C2a bolsa=contrato · C2b renderProps muerto · C2c efecto muerto — **una sola tubería de attrs**). **D (desacoplar emit del handler) quedó FUERA de P0 por decisión de diseño**: la versión barata (D-lite) creaba un contrato condicional (`TriggerResult.id` a-veces-definido) y se retiró; la correcta es **D-full** (`emit()` → `{id, settled}`) y reabre el eje sema con su handoff — ver §D abajo. **Origen**: informe de auditoría (artifact `Auditoría ActiveUix`, https://claude.ai/code/artifact/02076a7a-9a51-4c89-a610-dfd2f6948954) — 70 hallazgos, 10 verificados adversarialmente (7 confirmados / 3 refutados), dos comparativas de mercado. El plan P0→P3 vive en su §5. ## Commits de este eje (todos en `alpha-0.1-background`, sin push) - `58fa3021c` — fase A: `close` huérfano de connection (4 errores) · stepper `'completed'`→`'complete'` (el test pineaba la deriva) · langs stop/record. - `2ec018107` — fase B: `check:gate` (src/=0 duro; web/ contra ledger menguante `scripts/check-debt.ts`, 34 ficheros/71 errores congelados) · `eidos:lint` · `gate` (SIN `lint` — deliberado, ver deuda) · fuente del hook en `scripts/hooks/pre-push` · `.prettierrc` endOfLine:auto. - `3ca138e91` — C2a: `partPropsForRegistration` resuelve el contrato entero; nace `ssr-contract.test.ts` (rojo antes, 6/6 después); pin viejo re-firmado. - `9dffa541e` — fase A cierre: los 6 rojos del censo adjudicados (2 escrituras «soma posee el valor» · menu-dial estampa olvidada · calendar/fab al allowlist compartido nuevo `scripts/eidos-only-attrs.ts` que consumen morfo-check Y eidos-lint · palabras.handle declarado). morfo:check 160/161→**161/161**. - `` — codemod `renderProps()`→`.props` (83 ficheros, 262 call sites) + borrado del método/tipo, sin shim; comentarios re-nombrados a «render bag». - `` — efecto `syncPartAttrs` + flag BORRADOS; ~71 registraciones limpias; suite del runtime re-firmada de asertos-DOM a asertos-de-bolsa; 5 tests de provider (dialog, drawer, pagination×2, popover) re-firmados igual. **tabs-provider y radio-group-provider viajaron en `8ac23047f` del eje theming** con la retirada declarada en su cuerpo (coordinación por canal, opción A). ## Verificación con la que cerró C2c runtime 49/49 · ssr-contract 6/6 · soma-attr-audit verde · **morfo:check 161/161 post-strip** («All routed morfos validate» — el detector definitivo: una parte dependiente del efecto habría perdido sus attrs requeridos) · las 4 suites re-firmadas 13/13 · check con src/ a 0 (71 = ledger exacto). **La PRIMERA pasada de la suite COMPLETA de la historia** (nadie la corría — el hallazgo original demostrándose) destapó y se adjudicó así: - **51 asserts de la clase C2c** en ~29 tests de provider jsdom (elementos sueltos + getAttribute esperando el efecto retirado → null). Re-firmados a asserts de bolsa en serie (3 agentes con contrato de conversión; los 5 primeros a mano: dialog, drawer, pagination×2, popover). REGLA: prewrite (`data-last-action`) SIGUE siendo assert de DOM; el resto, bolsa. - **1 preexistente real**: `lint.test` — `skin-media-player` nació (bf12b8a57) sin registrarse en `COMPETING_ROOTS` (viste el contrato de media-player, clase audio-player). Registrado con razón. - **4 flaky de CARGA** (pasan en solitario): cookie-adapter y orca (timeouts 10 s) · soma-attr-audit y recipe-css-contract (5 s justos bajo CPU saturada). Ley: un timeout con la máquina cargada NO es un rojo — re-correr en solitario antes de adjudicar. ## Los 8 guards rojos de `contracts.test.ts` (preexistentes, PRIMERA tarea de mañana) Nunca los vio nadie (mi patrón de extracción no capturaba el fichero raíz; sin CI nadie corría la suite). Sujetos verificados AJENOS a los diffs de P0: 1. Barrel de soma: falta `waveform -> Waveform` en el export público. 2. Filenames de provider filtrándose a un barrel público (1). 3. **MOR-4**: `audio-player` y `skin-media-player` sin morfo — invisibles a component-audit/eidos-lint (los competing roots necesitan su propia respuesta en la enumeración, como ya la tienen en lint.test). 4. **THEME-SYS-1**: `recipes/base.ts` `'header-z': '2'` z-index crudo ×2 — territorio theming. 5. Soma importando su propio alias público (1). 6. Escritura DOM mutable directa en soma (1). 7. **Hardcoded data attrs (8)**: aura-status ×2 · media-player sliders `data-size` ×2 · waveform played/remaining ×2 · **radio-group y tabs `data-ready`** — estos DOS son de `8ac23047f` (§14 theming, HOY): su constructor estampa `data-ready` a mano y el guard exige declaración o exención. Avisado al eje por canal. 8. Namespaces de traducción no-kebab (4). Cada uno se adjudica leyendo (¿guard exige razón nueva, o deriva real?) — la clase skin-media-player/lint.test de ayer es el precedente del método. ⚠ El hook NO se armó por esto (promesa: solo en verde). Armarlo = cerrar estos 8 + política para los 4 flaky de carga (¿timeouts subidos? ¿retry?). ## Qué queda mañana (en orden) 1. **Los 8 guards de contracts.test** (sección de arriba) — adjudicar uno a uno; con ellos verdes y la política de flaky decidida, el `gate` entero queda verde por primera vez. 2. **Re-armar el hook**: `cp scripts/hooks/pre-push .git/hooks/pre-push` y AVISAR a la sesión del eje theming por SendMessage (prometido dos veces; está conforme). Solo con fase A verde en el árbol. 3. **P1 del plan** (informe §5): ejes muertos de morfo (focus: ejecutar desde `compiled.focus` o amputar+censo · keyboard: censo declaración↔implementación · ARIA: vocabulario cerrado de nombres/roles + separar `attrs[]` de `aria[]` · `part-present` desde registro vivo) · **logger en `Soma.runtime()`** (una línea que resucita TODO el diagnóstico — la más barata de P1) · a11y auditable (capa inert/hide-others para modales, axe en el proyecto client, morfo:check con role/aria) · saneo de `svrs/auth` (adaptadores test a `$svrs/auth/testing` con guard de producción — el patrón ya existe en memory-store; `crypto-web` real sin node:crypto; guard de longitudes en verifyPassword; barrera `*.server.ts`; snippet del docs-site). 4. **D-full como eje propio**: `emit()` → `{id, settled}`; reabre sema (S-07 intocable, handoff CONTINUE-sema-audit), re-firma su suite (~40 asserts) y la prosa doctrinal (engine.ts:639 · morfo.md:801 · sema.md:652). El test A-36 pinea `open=post` y NO estorba. El argumento completo del refutador (por qué el hold no sirve a su razón declarada) está en el informe. 5. **P2/P3**: eidos ops (color-scheme, SSR de tema, memo de renderStaticCss, foundation una vez, data-motion='allow' real) · sema tubería (canales antes de deltas, stack de persistencia, coincident real o borrado, háptica sin reduced-motion, engine.explain) · distribución + LangBase + generación de wrappers. ## Deudas EXPLÍCITAS abiertas (nunca silenciosas) - **`lint` fuera del gate**: ~2.300 ficheros de deuda de formato preexistente (bump de prettier-plugin-svelte 3.4→3.5 + clases nunca formateadas; el pin a 3.4.1 NO movió el número — no es el plugin, es histórico). One-shot pendiente: `npm run format` en árbol QUIETO como commit propio + re-añadir `npm run lint &&` al `gate`. Jamás sobre rama con sesiones vivas. - **Ledger `check-debt.ts`**: 71 errores de `web/` congelados; solo mengua. `web/routes/alpha/**` está TERMINATED (memoria) — si se borra, sus 16 entradas salen del ledger. - **`gradient-builder.track` `data-kind`**: emite `provider.kind` crudo, que incluye `'mesh'` fuera del enum del morfo `[linear|radial|conic]` — misma exposición que el preview (paridad deliberada). Si una demo monta mesh, morfo-check lo flagueará: decidir entonces (ensanchar enum o guardar). - **`natural-time-picker` en morfo:check**: clase flaky «demo que navega bajo el eval» (como `link`); si reincide, endurecer el script (reintento por ruta), no el componente. En la última pasada fue verde. ## Leyes de este eje (caro de re-aprender) - ⚠⚠ **Rama compartida con 2-3 sesiones VIVAS**: add selectivo por lista explícita + `git diff --cached --stat` + commit EN LA MISMA invocación; selección por contenido con `git diff -G"patrón" --name-only` cuando el status mezcla ejes; JAMÁS stash ni checkout de ficheros ajenos. - ⚠ **Coordinación entre sesiones por SendMessage FUNCIONA**: avisar ANTES de tocar ficheros de otro eje; el peer re-lee del disco; inclusión-declarada (opción A) para cambios triviales mezclados — precedente `8ac23047f`. - ⚠ **Un gate se arma DESPUÉS del verde, nunca antes** — armado en caliente bloqueó el push legítimo del peer (y de paso demostró que sabe fallar). - ⚠ **La bolsa entrega valores CRUDOS** (número 20, no '20'); Svelte stringifica al render. Asertos de bolsa ≠ asertos de DOM. - ⚠ **El único escritor imperativo sancionado es el prewrite** de `trigger` (commit declarado por el morfo). Todo lo demás: bolsa. - ⚠ `npm run dev` lleva `--force`: primer morfo:check tras arrancar servidor paga compilación fría → timeouts falsos (accordion/background/link). Pasarlo DOS veces o precalentar. `morfo-check`/`perm`/`smoke` aceptan la URL como argv[2] — usar el servidor PROPIO (5201), nunca el de otra sesión. - ⚠ `| tail` enmascara exit codes TAMBIÉN en los scripts del gate (medido en vivo: check con 76 errores salió 0 por un tail).