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/REVIEW-theming-2026-08-24.md

14 KiB

REVIEW — theming «theme-reach»: la tanda del 23/24 en paralelo (2026-08-24)

Alcance: los 35 commits desde la revisión anterior (0c29c544b) — 23 de componente (emoji-picker meter spin-field pin-input dialog color-swatch progress skip-link form image-picker search-field switch avatar file-upload editable chat-log select calendar chat-composer radio-group toggle ×2 rating-group card) + 12 de docs/fix, ejecutados por seis sesiones en paralelo sobre un worktree compartido. Pregunta: desviaciones del protocolo §7, errores, e incoherencias con el framework.

Método (cada afirmación con su artefacto):

  • Refutación estática commit a commit (scripts/__rv-equiv.mjs): líneas del generado atribuidas, pares prop → token contra el contrato DE ESE commit.
  • Centinela R-5.4 re-corrido para los 23 sobre HEAD limpio.
  • Guards: component-audit PASS 23/23 · eidos-lint 0 invalid en los 22 con morfo (el 23.º abajo, R-8) · vitest src/uix/eidos con un solo rojo, el conocido (skin-media-player) · rtl:check 0 · docs:check 0 · npm run check COMPLETED con 72 errores, CERO en ficheros de los 23 (el que casa «slider» es de 1857c7854, 2026-08-03).
  • Gramática de nombres (theming-census --names): 4543 claves públicas, 4 desviadas, las cuatro de avatar y preexistentes (I-1).
  • Coherencia del vocabulario invalid-* en las 162 recetas (I-2).
  • Artefactos §7: ficha §5 23/23 · README «Talla y tema» 23/23 · pestaña Tokens en los 21 con ruta de demo (los 2 sin ruta, R-8) · capturas citadas en 22/23 mensajes de commit (el 23.º es un commit de SOLO comentarios: no toca píxel).
  • Barrido del centinela sobre el ledger entero (la ley del handoff): §5 abajo.

Estado 2026-08-24: revisión CERRADA. El plan §6 está ejecutado entero — P1, P3, P4, P5, P6 y P7, y P2 con la firma del autor (§7.8 del PLAN).

Veredicto corto: el trabajo de componentes es sólido — los 23 pasan la refutación estática, el centinela y los guards, y las dos únicas sondas que no cerraron a cero declararon el ruido y lo probaron reproduciéndolo. Los errores graves de la tanda no están en el CSS: están en la concurrencia (el índice compartido rompió el ledger en HEAD durante cuatro commits) y en la contabilidad (ocho componentes sin su entrada §8). Nada de lo encontrado mueve un píxel.


1. Errores reales — 2, los dos de la concurrencia, los dos ya corregidos

  • E1 — HEAD llevó CUATRO commits con el ledger del centinela SIN PARSEAR. 007c2af52 cosió dos bloques y dejó },, en el literal: theming-sentinel-exceptions.ts no compilaba, así que el guard R-5.4 no estaba en rojo — estaba MUERTO, y sólo se veía en checkout limpio. Arreglado en 88a208644 (un carácter, reconstruido desde HEAD). Causa raíz en E2.
  • E2 — Un commit fotografió el índice de OTRA sesión. edc019515 (toggle) salió con tres fragmentos de rating-group dentro y sin la mitad de los suyos; 007c2af52 lo reparó (y al hacerlo produjo E1). La causa es estructural y está medida y registrada (§13 + handoff + memoria): hay UN solo .git/index, y verificar el árbol indexado no protege de la ventana entre mirar y confirmar. Regla nueva ya escrita: verificación y git commit en la MISMA invocación de shell.

2. Desviaciones del protocolo — 4

  • D1 — Ocho componentes sin su entrada en el registro §8 (§7.6 paso 21): emoji-picker, spin-field, pin-input, dialog, form, skip-link, image-picker, search-field. Sus menciones a partir de la línea ~2156 del PLAN son filas de la tabla §9 (con cifras VIEJAS), no entradas de registro. meter, color-swatch y progress sí la tienen — la desviación es de commits concretos, no de una sesión. → P1.
  • D2 — La demo de chat-log se editó como instrumento (monta el separador de día, un evento de sistema y el divisor de no-leídos que antes sólo existían en la prosa; once claves no tenían nodo que pintar). El agente lo declaró y es lo mínimo para medir — pero la regla firmada dice que las demos quedan FUERA del plan de theming, así que el precedente «demo como instrumento» era una decisión del autor, no de una sesión. RESUELTA 2026-08-24: el autor FIRMA la excepción acotada (PLAN §7.8). Completar una demo que no monta su propio componente es instrumento, no diseño, con cuatro condiciones verificables: sólo partes del propio componente declaradas en su morfo · contenido mínimo canónico · diff de computed CERO sobre lo ya montado · declarado en el commit. Lo aprendido mirando una demo sigue SIN entrar en el ratio ni en el registro: la excepción abre la mano para medir, no para contabilizar. chat-log cumple las cuatro, así que su commit queda validado retroactivamente.
  • D3 — Fichas de la tanda con «Medido: 2026-08-23» para mediciones del 24. Los §13 de select y calendar dicen «medido 2026-08-24»; sus fichas dicen 23. Cosmética, pero la fecha es parte del artefacto. → P3.
  • D4 — La bala «qué queda en la cola» del handoff (c05349c3f) está incompleta: lista 11 pendientes y omite ~14 no tocados por debajo de 90 % (radio-cards 61, password-field 62, tag-group 65, image-adjustments 67, separator 67, popover 67, timeline 77, knob 78, stepper 79, textarea 80, code-block 81, prose 83, chat-message 84, combobox 85…). Una cola incompleta en el handoff es un recorte de alcance en silencio, aunque sea por omisión. Error mío de la supervisión. → P4.

3. Incoherencias con el framework — 1 real (preexistente), 3 de instrumento

  • I1 — Las CUATRO únicas claves del catálogo que violan la gramática de tinta son de avatar, y son CONTRATO público: ring-color-custom, badge-color-custom, badge-color-custom-contrast, group-carve-color (la ranura de tinta es fg, R-5.3). Preexistentes — ahora VISIBLES porque f68bac4a6 enseñó al censo a leer la IIFE de avatar. El --names ya propone los nombres del codemod (ring-fg-custom…), pero renombrar es romper contrato público → espera firma. Es la única desviación de gramática en 4543 claves.
  • I2 — El vocabulario invalid-* de la tanda es COHERENTE, y la gramática quedó verificada (para que la próxima tanda no la re-derive): la regla es modificador + nombre del slot EXISTENTE. checkbox (la caja ES la raíz, slot border) → invalid-border desnudo; radio-group (slot indicator-border, dos partes con borde) → invalid-indicator-border; select (precedente interno disabled-border/bg/fg desnudos + catálogo con 8 invalid-border) → desnudo; switch y file-upload (tres partes con borde cada uno) → invalid-track-border / invalid-dropzone-border. Los gemelos no divergen: nombran slots distintos porque sus partes lo son.
  • I3 — eidos-lint no conoce la exención CSS_ONLY_LAYERS que el test vitest sí tiene: sobre spin-field (capa CSS compartida tras css-field/number-field, sin morfo POR DISEÑO) el script muere con «No morfo file» en vez de eximirlo. Hueco menor de instrumento, preexistente. → P5.
  • I4 — La columna size del censo infra-informa el eje que vive en el TSC: radio-group y rating-group subieron sus escalas al contrato con scope: 'size:{k}' y retiraron los bloques [data-size] del CSS — la columna (que lee el CSS) los deja de marcar (57 → 55) aunque el eje talla existe y es MÁS canónico que antes. Nota de instrumento. → P5.
  • (Ya registrados en §13 durante la tanda, no se repiten aquí: el guard no fotografía transform (3 componentes) · el barrido de descendientes de file-upload (única ocurrencia en 162 recetas) · la cascada de paleta se lleva también el tono por defecto · el canal inline filtrado al contrato son 4 claves · la sonda/guard mueren bajo --import tsx/esm.)

4. Refutado (se comprobó, no hay hallazgo)

  • R1 — «dialog cambió defaults al acuñar tonos»: los «4 a ojo» de __rv-equiv son un límite del script (dos reglas con la misma propiedad en un hunk se emparejan mal). El CSS real ya leía threat/fulfill/neutral correctos regla a regla; ningún default se movió.
  • R2 — «pin-input cambió valores»: los 11 pares eran retirada de respaldos MUERTOS (var(--pin-input-x, fallback) → var(--pin-input-x)); el bloque del contrato preexistía al commit, así que el fallback nunca aplicó. Idéntico por construcción. Ídem los 3 de form (shorthand con dos tokens).
  • R3 — «faltan §8 para los DIEZ de la mañana»: mi primera regex era estricta de más; meter, color-swatch y progress SÍ registraron. El hallazgo real queda en OCHO (D1).
  • R4 — «el 0/98 de card y el rojo de toggle»: árbol de trabajo rancio con el guard duplicando un bloque; desde HEAD limpio 49/98 y verde (ya en §13).
  • R5 — «72 errores de check»: todos preexistentes, cero en ficheros de los 23 (el de slider es del 2026-08-03).
  • R6 — «el primer barrido del ledger dio 59/59 rotos»: mi propia lista llevaba CRLF (Python en Windows escribe \r\n por stdout); cada nombre llevaba un \r invisible y el guard buscaba anchor-nav\r. La firma «TODOS fallan igual» delata al instrumento, no al código.
  • R7 — «spin-field y color-swatch sin pestaña Tokens»: no tienen ruta de demo propia (color-swatch es el quinto sin ruta; spin-field es capa compartida) — el paso no aplica.
  • R8 — «spin-field sin morfo»: exento POR DISEÑO (CSS_ONLY_LAYERS del test); lo que falla es el script de lint (I3).
  • R9 — Los centinelas de los 23: verdes sobre HEAD limpio. Dos carreras conocidas y ADJUDICADAS con medición: editable.submit-fg (vivo 3 de 4) y emoji-picker.open-trigger-fg (la entrada del ledger ya dice «oscillates run to run; measured alive four times» — cuando cae del lado vivo, el guard avisa STALE: falsa alarma esperada, el guard no tiene vocabulario para «oscilante, se queda»). → P6 propone dárselo.

5. Barrido del centinela — el ledger ENTERO (ejecutado 2026-08-24)

59 componentes (todo el ledger menos los 23 ya re-corridos en esta revisión) barridos uno a uno sobre HEAD limpio: cero NO EFFECT sin adjudicar, cero STALE, cero errores. Con los 23 de la tanda, el ledger entero queda verificado el mismo día — la ley del handoff («corre el guard sobre el LEDGER ENTERO») se cumple por segunda vez, y esta vez sin rojos.

Seis componentes leen 0/N con el guard en verde — la firma que la doctrina manda mirar dos veces: button-group 0/1 · toggle-group 0/1 · scroll-frames 0/4 · clipboard 0/6 · code 0/6 · drag-drop 0/9. Los seis están TOTALMENTE adjudicados, y las razones muestreadas son mediciones con forced -> reaches (el gap de toggle-group colapsa a 0 en el grupo attached y alcanza al quitar el atributo; el filete de button-group sólo dibuja entre botones attached de variante rellena; el preview de drag-drop sólo existe en vuelo) — no es ceguera del instrumento, es superficie que la demo no monta, con su porqué escrito.

El primer intento del barrido murió 59/59 con «no recipe block» — la lista la había escrito Python por stdout en Windows y cada nombre llevaba (R6). La firma «TODOS fallan IGUAL» delata al instrumento antes que al código.

P7 queda VACÍO: el barrido no destapó nada que medir.

6. Plan de solución — EJECUTADO 2026-08-24 (menos P2, que es firma)

  • P1 EJECUTADO: las OCHO entradas §8 escritas e insertadas junto a sus compañeras de tanda. Cada una redactada leyendo su commit, su ficha y su README, y verificada por un pase escéptico independiente contra el censo, el contrato en HEAD y en {sha}^, y el texto de los artefactos. El escéptico corrigió TRES antes de entrar: form (el patrón del ledger casa 23 claves, no las 24 que el commit decía — corregido también en §13, donde el total pasa de ~63 a ~62), search-field (el indicador de carga son NUEVE tokens, no ocho) e image-picker (una cifra de catálogo no reproducible y un precedente mal nombrado, reescritos). Y de propina el mismo defecto en su forma pequeña: trece entradas existentes decían (COMMIT) donde va el sha — resueltos los trece (df839849a).
  • P2 EJECUTADO — FIRMADO por el autor 2026-08-24: de las cuatro opciones analizadas (bendecir con límites · revertir y adjudicar «sin nodo en demo» · ruta de sonda aparte · nodos sintéticos) se firma la primera. La cláusula vive en PLAN §7.8 con sus cuatro condiciones. Descartadas: revertir habría convertido once claves VIVAS en verdes-por-excusa, que es justo lo contrario de lo que R-5.4 significa; una ruta de sonda aparte duplica superficie por componente y contradice «la demo ES el producto»; y los nodos sintéticos chocan de frente con verify-with-real-components.
  • P3 EJECUTADO (9bbc58502): la fecha «Medido» de las seis fichas commiteadas pasada la medianoche dice ya 2026-08-24.
  • P4 EJECUTADO (9bbc58502): la cola del handoff corregida — eran TREINTA Y CUATRO, no once, y separados los 16 nunca tocados de los 18 que sólo deben el README «Talla y tema». Con la regla para regenerarla del censo y no de memoria.
  • P5 EJECUTADO (9bbc58502): los dos huecos de instrumento en §13 (eidos-lint sin las exenciones del test; la columna size del censo que se apaga cuando el eje sube al TSC).
  • P6 EJECUTADO (2e0f4b650): el guard entiende OSCILLATES: — adjudica cuando lee muerto y no grita STALE cuando lee vivo. Marcadas las dos carreras medidas (emoji-picker.open-trigger-fg, editable.submit-fg); verificado con 3 y 4 corridas, exit 0 todas.
  • P7 VACÍO: el barrido del ledger entero (§5) no destapó ningún rojo.

Powered by TurnKey Linux.