You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
svelte-kit-vice/docs/process/CONTINUE-audit-p0.md

157 lines
9.7 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 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**.
- `<C2b>` — codemod `renderProps()`→`.props` (83 ficheros, 262 call sites) +
borrado del método/tipo, sin shim; comentarios re-nombrados a «render bag».
- `<C2c pendiente de commit al cierre>` — 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).

Powered by TurnKey Linux.