docs(theming): la revisión adversarial §7.7 de los 26 commits — 5 hipótesis, 5 refutadas

Cierra el punto P5 del plan de la revisión: lo ejecutado desde el 22 (33
componentes, dos bloques) por fin tiene su pasada escéptica, con medición propia
y no leída de los commits.

LA BASE, ANTES DE COMPARAR NADA

Worktree en cd6a9f4e3 con dev server propio, node_modules por junction y
`server: { fs: { allow: [...] } }` — sin eso Vite responde 403 a /@fs/… , la
página NO hidrata y se compara contra una base muerta (la trampa que el handoff
registra). Comprobado que los componentes MONTAN e hidratan antes de medir.

H1 · «el default es idéntico» — 33 de 33

31 con 0 diffs, ~48.000 valores computados en 7-8 estados por componente.
`surface` daba 0 valores por una URL mía equivocada: en su ruta real
(/temas/gradientes) 0 diffs sobre 896. Y los dos con diffs son RUIDO DEL
INSTRUMENTO, probado corriendo dos veces el MISMO código: `image` reproduce su
único diff y `audio-player` da ONCE (más que la comparación base↔HEAD). Las dos
propiedades son estado vivo — la opacity de un <img> con animación de entrada
(la sonda congela transition, nunca animation) y el ancho del rango buffered de
un audio. En §13, con la recomendación de excluirlas del snapshot.

H2 · «el velo cae donde debe» — verde en los cuatro que tocaron :hover

Píxel hacia arriba: dropdown-menu y context-menu pintan el velo en su item
(radio 4px, el nodo CON forma) y el list-surface de debajo queda limpio;
menubar pinta el abierto en su propio <button> sin derramar al contenedor, y la
fila de su panel en el item; anchor-nav no tiene velo en ninguna capa, que es lo
correcto — su hover es sólo tinta. Medido sobre un enlace NO activo: el primero
que casa el selector lleva data-active y pinta otra cosa.

H3 · «no hay doble animación» — no aplica

Ningún commit de los 26 toca animation, @keyframes, data-event ni motion-* en
components/. No hay sello movido que pueda duplicarse.

H4 · «cada token alcanza» — rehecho, y destapó float-panel

El barrido del centinela sobre los 59 con ledger: 0 STALE, 0 errores, un solo
rojo (float-panel), ya arreglado en 233ef989b.

H5 · «el contrato no tiene duplicados ni huérfanos» — limpio

144 bloques sin duplicados, sin claves repetidas dentro de un bloque, y el test
oficial de huérfanos en verde.

⚠ Y aquí mintió mi propio instrumento: un guard estricto de un solo uso reportó
185 huérfanos —los pasos de escala por talla y todos los tonos— porque excluía
`generated/`, que es exactamente donde el TSC emite el nombre resuelto y el
forward de paleta lee los tonos. Un guard de huérfanos que no mira el CSS
GENERADO ve huérfano todo lo que el generador resuelve. En §13.

VEREDICTO: 0 hallazgos nuevos. Los reales de esta revisión salieron del análisis
ESTÁTICO (E1-E5) y ya estaban arreglados antes de esta pasada.

El handoff abre ahora con las cuatro lecciones que cambian cómo se trabaja:
correr el guard sobre el ledger entero · el nombre de un token no es el de la
propiedad · si un paso del protocolo no está en el commit, no se hizo · y
comprobar que la base MONTA antes de comparar contra ella.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
alpha-0.1-background
dev 2 months ago
parent 2f243e1c08
commit 0c29c544b1

@ -1282,6 +1282,21 @@ Lo que `chart` destapó (2026-08-22):
waveform, chronos, los pickers) puede pasarle primitivos crudos sin que el
censo ni `recipe-css-contract` lo vean. Medir cuántas hay antes de decidir si
D-TH.2 se ensancha.
- **Dos propiedades que la sonda NO puede medir: la `opacity` de un `<img>` con
animación de entrada y el `inline-size` del rango *buffered* de un audio**
(medido 2026-08-23 en `image` y `audio-player`). La sonda congela `transition`
pero **nunca `animation`** —congelarla impide que Presence monte los paneles—,
así que la imagen se muestrea a mitad de su fundido y da un valor distinto en
cada corrida; el *buffered* depende de lo que el audio lleve descargado.
Probado: dos corridas sobre el MISMO código dan 1 diff en `image` y **11** en
`audio-player`. Mientras no se resuelva, **un diff en esas dos propiedades se
repite antes de creerlo**, y lo honesto sería excluirlas del snapshot para
esos dos componentes.
- **Un guard de huérfanos que no mira `generated/` ve huérfano casi todo**
(medido 2026-08-23): un script estricto de un solo uso reportó 185 claves «no
leídas» que eran los pasos de escala por talla y los tonos de paleta — los lee
el CSS GENERADO, donde el TSC emite el nombre resuelto y el forward de paleta
resuelve los tonos. El test oficial (`recipe-css-contract.test.ts`) sí los ve.
- **El escenario de la demo de `background` cambia de ANCHO entre corridas**
(medido 2026-08-23, dos veces): 870 px una corrida, 1.350 px la siguiente, con
el mismo código. Produce 2 diffs de `inlineSize` en la sonda —del contenedor,

@ -98,6 +98,32 @@ HTML crudo (prose) o cuyas partes no llevan atributo se mide sobre UN nodo y el
gate no significa nada. Los dos aceptan ya un selector extra
(`EXTRA_NODES` en la sonda, `extraNodes` en `COMPONENT_OVERRIDES`).
## LA REVISIÓN DE LOS 26 (2026-08-23) — lo primero que hay que saber
Todo lo ejecutado desde la revisión del 22 pasó por fin su análisis:
[`REVIEW-theming-2026-08-23.md`](./REVIEW-theming-2026-08-23.md). **33
componentes, 5 errores reales, 5 desviaciones, y la §7.7 con 5 hipótesis y 5
refutaciones.** Arreglado todo (`233ef989b` · `bfe7727b0` · `e522e04e6` ·
`2f243e1c0`). Las cuatro lecciones que cambian cómo se trabaja:
1. **Corre el guard sobre el ledger ENTERO, no sobre lo que tocas.** Así salió
que `float-panel` llevaba DOCE rojos sin adjudicar desde el 22 —escritos como
«lo rojo que queda» en su propio commit— mientras el handoff daba el bloque
viejo por cerrado. Un componente cuyo commit dice «lo que queda» NO está
cerrado.
2. **El nombre de un token no es el de la propiedad.** `badge` acuñó
`min-block-size-{k}` donde la ranura es `height`: 24 componentes dimensionan
por `…-height-{k}` y era el único. R-5.3 no guarda el vocabulario
DIMENSIONAL (§13) — mientras no lo haga, **cuenta el nombre en el catálogo
antes de acuñarlo**, también para las dimensiones.
3. **Los pasos 8 y 9 del protocolo (README «Talla y tema» + pestaña `Tokens`) se
saltaron en 22 componentes de una tanda entera** y nadie lo notó hasta
revisar los `git show --stat`. Si no está en el commit, no se hizo.
4. **Antes de comparar contra una base, comprueba que la base MONTA.** El
worktree necesita `server: { fs: { allow: [...] } }` cuando su `node_modules`
es una junction; sin eso Vite responde 403, la página no hidrata y el diff
sale limpio contra la nada.
## LO QUE DEJÓ LA TANDA DE SIETE (2026-08-23) — léelo antes de seguir
**El instrumento tiene TRES caras del mismo punto ciego, y ninguna se detecta

@ -486,6 +486,35 @@ commits de corrección.
## 8. Registro
- 2026-08-23 — **REVISIÓN DE LOS 26 COMMITS SIN REVISAR (§7.7 incluida)**:
`REVIEW-theming-2026-08-23.md`. 33 componentes, los de los bloques del 22 y el
23. **5 errores reales, 5 desviaciones de protocolo, y la §7.7 con 5 hipótesis
y 5 refutaciones.** Todo arreglado el mismo día:
- **E5 — `float-panel` tenía DOCE rojos sin adjudicar y el guard fallaba en
él** (`233ef989b`). Su commit del 22 los dejó escritos como «lo rojo que
queda» y el handoff dio por cerrado el bloque viejo: la frase era FALSA.
Seis son el plano `overlay` (§12.9), tres estados que la demo no monta, uno
el puente de paleta y dos la ley del congelado. **Sólo se ve corriendo el
guard sobre el ledger ENTERO, no sobre lo que tocas.**
- **E1 — `badge` acuñó la clave con el nombre de la PROPIEDAD**
(`min-block-size-{k}`) donde la ranura es `height` (`bfe7727b0`). 24
componentes dimensionan por `…-height-{k}`; era el único. **R-5.3 no guarda
el vocabulario dimensional** — §13.
- **E2 — una adjudicación mal clasificada**: `background.parallax-travel` no
era «estructural», es que **el guard no fotografía `translate`** — §13.
- **D1 — la sesión de la mañana se saltó los pasos 8 y 9 en los 22
componentes**: ni README «Talla y tema» ni pestaña `Tokens` (`e522e04e6`,
tabla DERIVADA del contrato y del ledger, 21 pestañas verificadas en el
navegador).
- **§7.7**: base en worktree con `server.fs.allow` (sin él no hidrata y se
compara contra una base muerta), **31 de 33 con 0 diffs sobre ~48.000
valores**; los dos con diffs (`image`, `audio-player`) son ruido
reproducible del instrumento —dos corridas del MISMO código dan 1 y 11—;
píxel-arriba verde en los cuatro que tocaron `:hover`; sin dobles
animaciones (ningún commit toca `animation`); contrato sin duplicados ni
huérfanos.
- 2026-08-23 — **`cropper` 60 % → 94 %** (`f03ee5af4`), 2 claves. El cromo del
botón de zoom (radio + `font-size`, costura). **Siete literales de IDENTIDAD**
firmados: cuatro `100%`, dos `50%` (lo que HACE redonda una selección y un

@ -70,7 +70,7 @@ punto P5 del plan.
| P4 | ✅ 22 READMEs «Talla y tema» derivados del contrato + 21 pestañas `Tokens`, verificadas en el navegador | `e522e04e6` |
| P6 | ✅ §13: flicker del escenario de background · `audio-player` sin README · los tres huecos de `PROPS` | `233ef989b` + éste |
| P7 | ✅ PLAN §7: las capturas se exigen DESDE el siguiente componente; píxel-arriba obligatorio si se toca `:hover` | éste |
| P5 | ⏳ la revisión adversarial §7.7 de los 26 commits — lo único que queda | — |
| P5 | ✅ revisión adversarial §7.7: 5 hipótesis, 5 refutadas, 0 hallazgos nuevos (§6) | éste |
### El plan original
@ -88,6 +88,80 @@ punto P5 del plan.
**Orden propuesto**: **P8 (el guard está en rojo hoy)** → P2 + P3 (docs, diez minutos) → P1 (una clave) → P4 (los 20, mecánico) → P6 → P5 (la revisión de verdad, una sesión). Nada de esto mueve un píxel.
## 6. P5 — la revisión adversarial §7.7, ejecutada (2026-08-23)
**Molde Sidebar: intentar REFUTAR cada afirmación con medición propia, no leer
la del commit.** Base = worktree en `cd6a9f4e3` (`G:/tmp/rv-base`), dev server
propio en 5301, `node_modules` por junction y `server.fs.allow` con las dos
rutas — la trampa que el handoff registra: sin eso Vite responde 403 a `/@fs/…`
y la página NO hidrata, y se compara contra una base muerta. **Comprobado ANTES
de comparar nada**: los diez primeros componentes montan e hidratan en la base
(10, 4, 10, 2, 57, 17, 6, 25, 2 y 1 nodos).
### H1 — «el default es idéntico»: **REFUTADA la duda, 33 de 33**
Sonda del HEAD (la misma en los dos lados, para no comparar instrumentos)
contra base y contra HEAD, componente a componente:
- **31 con 0 diffs**, de 192 a 7.360 valores por componente y de 7 a 8 estados.
Total comparado: **~48.000 valores computados**.
- `surface` daba 0 valores por una URL mía equivocada; en su ruta real
(`/temas/gradientes`, la que su propio override declara) → **0 diffs sobre 896
valores, 4 nodos**.
- `image` (1 diff) y `audio-player` (7 diffs + 1 nodo ausente) son **ruido del
instrumento, probado**: corriendo la sonda DOS VECES contra el MISMO código,
`image` reproduce su diff y `audio-player` da **once** — más que la
comparación base↔HEAD. Las dos propiedades implicadas son estado vivo: la
`opacity` de un `<img>` con animación de entrada (la sonda congela
`transition`, **nunca `animation`** — ley conocida) y el `inline-size` del
rango *buffered* de un audio, que depende de lo que lleve cargado.
### H2 — «el velo cae donde debe»: **verde en los cuatro que tocaron `:hover`**
Píxel hacia arriba (`elementsFromPoint` en el centro del control, pila de
ancestros con `backgroundImage`/`backgroundColor`):
- `dropdown-menu` y `context-menu`: el velo está en `[data-…-item]`, **radio
4px** — el nodo CON forma; el `list-surface` de debajo (radio 6px) limpio.
- `menubar`: la barra pinta el abierto en el propio `<button>` (radio 2px) sin
derramar al `[data-menubar]`; la fila del panel, el velo en su item (4px).
- `anchor-nav`: **sin velo en ninguna capa**, y es correcto — su hover es sólo
tinta (`hover-link-fg`), no capa de estado. Medido sobre un enlace NO activo,
porque el primero que casa el selector lleva `data-active` y pinta otra cosa.
_(El `data-uix-stage-area` sale con velo en varias pilas: es el fondo a cuadros
del harness, y las demos están fuera del eje.)_
### H3 — «no hay doble animación»: **no aplica, y se comprobó**
Ninguno de los 26 commits toca `animation`, `@keyframes`, `data-event` ni
`motion-*` en `src/uix/eidos/components/`. No hay sello movido que pueda
duplicarse.
### H4 — «cada token alcanza»: **rehecho, y destapó E5**
El barrido del centinela sobre los 59 con ledger (§5): 0 STALE, 0 errores, y un
único componente en rojo — `float-panel`, ya arreglado (P8).
### H5 — «el contrato no tiene duplicados ni huérfanos»: **limpio**
144 bloques en `base.ts`, cero duplicados y cero claves repetidas dentro de un
bloque. El test oficial de huérfanos (`recipe-css-contract.test.ts`) pasa.
⚠ **Y aquí mintió mi propio instrumento**: un guard estricto de un solo uso
reportó **185 huérfanos** — los pasos de escala por talla y todas las claves de
tono. Falso: excluía `generated/`, que es exactamente donde el TSC emite el
nombre resuelto y donde el forward de paleta lee los tonos. Un guard de
huérfanos que no mira el CSS GENERADO ve huérfano todo lo que el generador
resuelve.
### Veredicto de P5
**5 hipótesis · 5 refutadas · 0 hallazgos nuevos.** Los dos únicos diffs de la
comparación son ruido reproducible del instrumento, no regresiones, y quedan
registrados en §13. Los hallazgos reales de esta revisión estaban en el análisis
ESTÁTICO (E1–E5) y ya están arreglados.
## 5. Barrido del centinela (todo el ledger, tras los cambios del guard de hoy)
`rv-dyn.sh`, 59 componentes con ledger, uno tras otro contra el mismo dev server

Loading…
Cancel
Save

Powered by TurnKey Linux.