docs(process): handoff — e3c0899dd es interino, (c') firmada para manana y el brief de #5

CONTINUE-audit-p0.md: bloque «PRIMERO MAÑANA» (el throw uix+escalar rompe
todas las demos; forma firmada (c'): pines si, sources reactivas fuera,
sin throw, pines en el boot; orden del dia con el adversarial cortado que
hay que relanzar entero, el guard de contracts.test que codifica la
doctrina revocada, y la decision de esbuild como devDependency), el acta
de P2 #2 en el cuerpo y el brief completo de #5 al final.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
alpha-0.1-background
dev 3 weeks ago
parent e3c0899dd8
commit 9c465a8445

@ -1,4 +1,34 @@
# CONTINUE — P0 de la auditoría arquitectónica (handoff, act. 2026-08-26 tarde)
# CONTINUE — P0 de la auditoría arquitectónica (handoff, act. 2026-09-14 madrugada)
**⚡ PRIMERO MAÑANA (act. 2026-09-14, 04:40)** — `e3c0899dd` (P2 #2, «un motor, un
sobre, un código») está commiteado y pusheado con un **ESTADO INTERINO declarado**:
`resolvePreferences` (eidos) LANZA con `uix` + escalar/source, y `ActiveEidos.create()`
inyecta `uix` SIEMPRE → **todas las demos que pasan `theme`/`modeSource` lanzan al
arrancar** (≥12 sitios; `web/routes/uix/+layout@.svelte:511`). El autor firmó continuar
con **(c′)** — literal: «mañana continuamos con la opcion c», dicho tras presentarle (c′):
**pines sí** (escalar explícito `theme/mode/density/scaling` = instancia clavada, GANA
sobre prefs; precedente `options.dom ?? options.uix?.dom` en el mismo constructor),
**sources reactivas por eje FUERA** (`modeSource/densitySource/scalingSource` se eliminan
sin shim; la puerta de sustitución entera es `preferences`), **sin throw**, **pines en el
boot** (`renderUixBootScript({ pins })` con una función pura
`resolveVisualPreference(pin, prefs, fallback)` compartida por `prefs-source.ts` y
`boot.ts`; cuarto caso de delta cero: instancia clavada a dark con prefs en light, ni un
attr cambia al hidratar). Eidos standalone (sin uix) sigue al SO para el modo: sin primer
motor no hay segundo. Coste en el árbol congelado: las demos que pasan sources pierden el
tipo (ledger con causa nombrada) y sus toggles dejan de mover a eidos hasta la
reconstrucción; el sitio arranca y los instrumentos validan.
Orden del día: (1) **(c′)** con constructor Opus + adversarial (el adversarial del lote se
CORTÓ por límite de sesión tras confirmar sus 7 sondas — suite y mutaciones sin re-medir por
él: re-lanzarlo ENTERO sobre el árbol resultante); (2) `src/uix/contracts.test.ts:1270-1276`
codifica la doctrina REVOCADA (`prefs.theme`/`setIntent('theme')` prohibidos en
`web/routes/uix`) — invertir o retirar con acta; (3) decisión del autor: `esbuild` como
devDependency (hoy transitiva de vite, 0.27.4; el generador depende de ella; `npm i` exige
servidores PARADOS); (4) **#5** — brief listo al final de este fichero (§«P2 #5»); depende
de que el boot esté vivo (lo está). Menores: `LangNode` import muerto preexistente en
`active-uix.svelte.ts:53`; el bundle del boot pesa 15 KB / 5,6 KB gzip porque compila el
MISMO esquema que la raíz (incluye `region-currencies`, 2,2 KB) — no recortar sin decisión,
recortar rompería «el mismo esquema».
**ACTUALIZACIÓN 2026-08-26 tarde (sesión vicen-42)**: los items 1 y 2 de «Qué
queda» EJECUTADOS. Los 8 guards de contracts.test adjudicados y verdes
@ -496,6 +526,27 @@ autor «continua»; agentes Opus 5 ejecutan, la sesión coordina y verifica
· Quedan de P2 eidos: #2 (attrs de tema pre-hidratación: exige inventar un
contrato de persistencia) y #5 (`data-motion='allow'`: bloqueado por la
doctrina de `$prefs`) — ambos a firma.
- **P2 #2 EJECUTADO `e3c0899dd` (2026-09-14) — «un motor, un sobre, un código»**, firmado
tras DOS rondas de «¿es lo más profesional o un puto parche?» (mis dos rebajas cazadas:
el hook de Kit DENTRO del framework — `src/uix` tiene CERO `$app/*` — y un script de
arranque REPLICADO con «test de paridad» = dos verdades). Forma: `mode` dimensión de
prefs junto a `motion` (`resolveTheme` de `$libs/theme` ya era su gemelo; el entorno ya
traía `colorScheme`); `theme/density/scaling` declaradas por la RAÍZ en módulo puro
(`active-uix/prefs-schema.ts`); eidos lee `uix.prefs` por su puerto
(`eidos/prefs-source.ts`) como ya consume `uix.langs/dom/motion`; REVOCADA la frase de
`arts/prefs/README.md:185`. Sobre `uix.prefs-intent` v1 (`libs/prefs/document.ts`),
adaptador localStorage canónico en la raíz standalone, **hidratación SÍNCRONA** (el
bridge awaitea `load()` aunque sea síncrono → primera resolución con defaults y salto un
tick después = el flash movido; la raíz lee el sobre ANTES de crear el motor). Boot
COMPILADO con esbuild desde los módulos puros (`active-uix/boot/boot.ts` →
`generated/boot.js`, sincronía como `base.css`), `renderUixBootScript` Kit-agnóstico,
NUEVE attrs → delta cero probado con la raíz REAL y tres mutaciones. Hallazgo del test
de delta cero: la raíz NO aplicaba el entorno del navegador (esperaba `onMount` del app)
— ahora lo siembra y lo observa ella. Cifras: 57/593 · suite 453/5306 · check 73 (src/ a
cero) · gate OK. ⚠ INTERINO: el throw `uix`+escalar (forma firmada primero) rompe todas
las demos → (c′) mañana (bloque «PRIMERO MAÑANA» arriba). ⚠ Lección de coordinación:
DOS cortes de agente en una noche (red y límite de sesión) — revisar el diff entero
antes de reanudar, y el adversarial cortado NO cuenta como verificación.
- **FILA 15 — axe-core NO es «instalar o no»: es CUÁNDO** (deliberación a
tres bandas, 2026-08-27; la instalación se RETIRÓ antes de tocar el lock
para no convertir doctrina en hecho consumado). Tres caras:
@ -663,8 +714,8 @@ estos 8 + política para los 4 flaky de carga (¿timeouts subidos? ¿retry?).
refutador (por qué el hold no sirve a su razón declarada) está en el informe.
5. **P2/P3**: eidos ops (HECHOS 2026-09-13: memo `cc586612a` · foundation una
vez `598ea460e` · color-scheme `39edbc8db` ·
apariencia en el TEMA `e2c37f892`; A FIRMA: SSR de tema y
data-motion='allow' real) · sema tubería (canales antes
apariencia en el TEMA `e2c37f892` · boot+prefs `e3c0899dd` (INTERINO: throw vivo,
(c') firmada para el 15); SIGUIENTE: #5 data-motion='allow' real, brief al final) · 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.
@ -714,3 +765,23 @@ estos 8 + política para los 4 flaky de carga (¿timeouts subidos? ¿retry?).
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).
## P2 #5 — brief listo para lanzar (2026-09-14)
LOTE P2 #5 — motion «allow» REAL: eidos y el motor JS leen el valor EFECTIVO, nunca el SO
(firmado por el autor 2026-09-14 como parte de «un motor, un sobre, un código»; se ejecuta DESPUES de que el boot (#2) esté commiteado, porque «solo atributo» exige que data-motion exista desde el primer pintado.)
MEDIDO 2026-09-14:
- Doctrina prefs: resolveMotion (src/libs/motion/resolve.ts:24) — intent 'allow'|'reduce' GANA al hint del SO; 'system' deriva del hint. La proyección estampa el efectivo en data-motion (PREFS_DOM_ATTRS.MOTION).
- eidos CSS: 94 bloques `@media (prefers-reduced-motion: reduce)` en 64 ficheros *.css bajo src/uix/eidos (32 con !important) + 65 selectores `[data-motion='reduce']` ya existentes (conviven: dos fuentes).
- Generador: render-css.ts emite el mismo media en 4 sitios (:534, :1193, :1333, :1376) → 29 bloques en generated/base.css.
- Motor JS: engine-motion.ts:131 `reduced = opts?.reduced ?? dom?.prefersReducedMotion.matches ?? false` — lee el SO por el puerto DOM, no el efectivo de prefs: un 'allow' explícito tampoco llega al JS.
- Colisión de NOMBRE: navigation-menu usa data-motion='fade|slide|from-start|from-end|to-start|to-end' en sus propios elementos (motion.css:14 lo anota como «dos dueños»). Valores distintos ⇒ sin clash funcional con `[data-motion='reduce'] X`; el rename es del eje navigation-menu (vivo, ajeno): FLAGUEAR, no tocar.
FORMA:
1. CSS: cada bloque `@media (prefers-reduced-motion: reduce) { SEL { decl } }` pasa a `[data-motion='reduce'] SEL { decl }` (o `SEL[data-motion='reduce']` cuando SEL es el propio html/raíz). Misma declaración, misma especificidad + 1 attr; revisar los 32 !important uno a uno: si el !important solo compensaba la especificidad del media, cae; si bate estilos inline, queda con acta. Los 65 selectores `[data-motion='reduce']` existentes se unifican con los nuevos (sin duplicar reglas).
2. Generador: los 4 emisores de render-css.ts emiten `[data-motion='reduce']` en vez del media; `npm run generate:eidos-css` en el mismo movimiento; generated-css.test verde; value-channels: los `--nombres` emitidos NO cambian (5751/8034) — comprobarlo.
3. GUARD: test vitest (junto a recipe-css-contract.test.ts) que falla si aparece `prefers-reduced-motion` en cualquier *.css de src/uix/eidos o en la salida de renderGeneratedBaseEidosCss(); con anti-vacío (número de ficheros inspeccionados > 60) y probado por mutación.
4. Motor JS: arts/motion NO importa arts/prefs (puertos). El puerto pasa a ser un `reduced` inyectado por la RAÍZ desde el efectivo de prefs (createActiveUix: motion recibe una fuente `() => prefs.motion.effective === 'reduce'` o suscripción), y `dom?.prefersReducedMotion` deja de ser la fuente por defecto en modo compuesto; standalone (sin raíz) conserva el fallback del SO con acta. Test: intent 'allow' con SO reduce ⇒ el motor NO degrada; intent 'reduce' con SO no-preference ⇒ degrada.
5. Docs: docs/theming/motion.md o el capítulo que documente reduced-motion (grep) + arts/motion/README.md + changelog: «eidos no lee medios: lee atributos; el efectivo lo decide prefs».
VERIFICACIÓN: vitest eidos + arts/motion + active-uix + value-channels; check (src/ a cero; ceiling web/ del ledger); check:gate; eidos:lint; prettier de lo tocado; adversarial con re-medida (grep cero media en eidos, cuenta de reglas antes/después, !important antes/después con acta por cada uno que queda).

Loading…
Cancel
Save

Powered by TurnKey Linux.