10 KiB
CONTINUE — normalización de nombres de evento
Handoff de
PLAN-event-name-normalization.md. ✅ EL EJE ESTÁ CERRADO (f44d1486d) y su aceptación cumplida y medida.⛔ Lo que sigue NO es este eje, y no se ejecuta desde aquí. Son cosas que el barrido destapó; cada una necesita su propia iniciativa y su propia puerta. Esta sección existe para que no se pierdan, no para que se hagan a goteo.
El 2026-08-12 se hizo exactamente eso y salió caro: la jornada se cerró a las 03:52, y de 13:59 a 20:43 la sesión siguió trabajando el ledger como si fuera el plan —
monthsen cuatro calendarios,defaultElementen 28 partes, Home/End en tres componentes, y al final el borrado de la librería de sonido, que el autor revirtió (0d10b983e). Ninguno de esos pasos parece un salto; el desvío es que un handoff se leyó como backlog. El trabajo salió bien y verificado — no es el punto. El punto es que nadie decidió cambiar el objetivo.
0 · Estado en una línea
{familia}-{verbo}[-{matiz}] es ley: 256 eventos declarados, 256 con prefijo,
0 ambiguos, y la puerta está cerrada con un guard en validateMorfo más un
barrido que se lo pasa a los 172 morfos del repo (components + internal +
fixtures). Visto fallar antes de darlo por bueno.
Commits: 6f42eebfe (el eje) · f4e414e2e (D1·D3·D4) · f44d1486d (cierre:
las dos mitades que el troceado por hunks dejó al otro lado del corte, y el
barrido de catálogo).
Rama compartida alpha-0.1-dir-prefs: hay trabajo de otra sesión sin
commitear en el árbol (A-85, consumerWins, aria-label en el bag). No lo
barras.
1 · Lo que NO se toca desde aquí
Cada punto de esta sección pertenece a otra iniciativa o a una decisión del
autor. Ninguno se ejecuta sin abrir la suya, con su plan y su puerta — y el
que toque el eje de sonido empieza por
CONTINUE-sound-engine.md, que es lo que no se
hizo el 2026-08-12.
| Punto | Dueño |
|---|---|
| D10 · los 3 resolvers de gesto | |
D13 · tooltip 3 de 3 mudo |
CONTINUE-sema-audit.md, que ya lo tipificó como contrato muerto |
D13 · virtual-list/grid handle-scroll* |
vocabulario de MORFO: falta un emission: 'app' que declare «lo emite la app». No es cableado |
D13 · gradient-picker.commit-reset |
CONTINUE-sema-audit.md §S-14 (1 de 6 verbos delegados) |
| D14 · el foco del teclado de chronos | chronos. Es de foco, no de firma, y pide medición en navegador real |
§1.2 · present-rise sobre el trigger |
decisión de diseño del autor |
§2.2 · handle-drag-progress |
decisión de vocabulario contra docs/CANON.md §verbos |
1.1 · Los 3 resolvers de gesto — D10
Ficha completa en AUDIT-docs-code-ledger.md §D10.
Resumen: el cambio del 2026-08-06 dejó resolveHandleDragSound /
resolveSliderDragSound / resolveSplitterDragSound sin llamador, y cinco
documentos siguen describiéndolos como vigentes — incluido PLAN-sound-engine.md
§4, donde son la columna «sema conserva» de la línea de corte con $sound.
¿Se retiran o se recablean? La tabla de corte hay que actualizarla en los dos
casos. De esta decisión cuelgan también el homónimo SoundContour (5 sitios,
propuesto GestureContour) y los dos comentarios rancios del splitter.
Firmada (2026-08-12): SE RETIRAN — ficha §D10 del ledger, que fija además un
sexto sitio a adjudicar (sema.md §per-emit payload, que aún describía el
payload de la era resolver). Y EJECUTADA el mismo día desde el eje (su
handoff leído primero); el ledger §D10 lleva el detalle y los 8 sitios
adjudicados.
1.2 · present-rise sobre el TRIGGER
Regresión medida durante F4, no arreglada. El sello de apertura de select /
combobox / navigation-menu queda anclado al trigger con fill: forwards. La
causa está diagnosticada: el dialecto partido (open pelado contra
emerge-open) actuaba accidentalmente como filtro, y al unificar los nombres
la firma alcanza sitios que antes se le escapaban. El eje de superficie
perceptual (CONTINUE-perceptual-surface.md)
tiene el contexto: un sello anclado al trigger es un vestigio de la era pre —
mídelo antes de razonarlo.
Lo que hay que decidir: ¿la firma de present se mueve al contenido, o el
trigger se excluye por selector? Es la misma pregunta que resolvió shift al
mover su sello del BOTÓN al grid.
Disposición firmada (2026-08-12): medir primero en navegador. Lo esperable
es la receta F4 otra vez (open pre cuyo content no ha montado, aterrizando en
el trigger — select/combobox están en la cola de F3 justo como «leer
providers»), pero la medida decide, no el razonamiento.
MEDIDO Y ARREGLADO para select/combobox (2026-08-13). La medida matizó la
expectativa: el open YA era post — el vestigio era el targetOverride al
trigger del provider, LEGALIZADO por un allowedTargets del 2026-08-10 (el eje
equivocado). ANTES: open/close sobre TRIGGER y present-rise corriendo sobre
el botón; DESPUÉS: open/close sobre CONTENT, present fuera del trigger.
Receta aplicada: fuera el override y el allowedTargets del open; el close
declara targetFallback ([trigger] / [trigger, input]); la selección ancla por
partInstance al item elegido. Queda navigation-menu (mismo síntoma
declarado aquí; su sitio vive en la cola de colecciones de F3).
2 · Abierto, sin bloquear
2.1 · grid es una parte REPETIDA — CERRADO e5811e422
El sello de shift-navigate se movió del botón al grid en los cuatro
calendarios; con numberOfMonths=2 había dos grid y sólo se sellaba uno
(medido: junio cambiaba de fechas quieto y julio cruzaba). El arreglo no
administra el sello: declara la parte que ES el sujeto — months, la vista
paginada, arquetipo viewport, con targetFallback: [grid]. Medido después:
los dos grids se desplazan 10 px a los 40 ms, y −10 px en RTL.
Se legalizaron de paso dos partes clandestinas (months, month-panel) que los
cuatro demos fabricaban a mano y que la receta estilizaba igualmente.
La ley general quedó escrita en docs/architecture/morfo.md
§A repeated part cannot be the subject of one occurrence: si el destino es una
parte repetida, hay que preguntar si la ocurrencia tiene un sujeto (→
anclarla, como hace table con su fila) o todos (→ el sujeto es el
contenedor, y tiene que existir). 50 de los 252 destinos del catálogo son partes
repetibles; todos los demás son del primer tipo.
2.2 · handle-drag-progress
El nombre quedó así por inercia del renombrado. progress no es un verbo del
canon; el canon para la emisión continua de un arrastre está sin decidir.
Revisar contra docs/CANON.md §verbos antes de tocarlo.
Disposición firmada (2026-08-12): revisar, no renombrar por uniformidad. El
nombre es legal bajo la ley (handle-drag-progress = familia + verbo +
matiz) y el matiz del drawer puede ser deliberado — progreso hacia el umbral de
dismissal, no el drag de valor del slider. Sólo se toca si la decisión de canon
para la emisión continua aterriza en otro nombre.
2.3 · D5 · D6 · D7 · D8 · D9
Cuatro defectos confirmados y uno con un defecto más hondo debajo (D5: el modal
promete un buffer que no existe). Fichas y evidencia en
AUDIT-docs-code-ledger.md. Ninguno se toca sin
que lo pidas: son código obsoleto contra documentación correcta.
3 · Lo que este eje enseñó, y hay que no repetir
- Un nombre partido en dos dialectos no rompe ningún test. Un preset de
movimiento engancha el nombre con
^=; el dialecto pelado no casaba con ninguna firma y simplemente no animaba. Tres auditorías lo vieron, ninguna lo cerró. La invariante es la puerta — por eso el guard, y por eso verlo fallar. - Un validador sin ejecutor vigila a nadie.
validateMorfono lo llamaba nada sobre el catálogo real (registerMorfollama acompileMorfo), así que todas sus invariantes se comprobaban contra fixtures escritas a mano. Debajo había dos fixtures ilegales, verdes. - Trocear un commit por hunks parte cambios lógicos por la mitad, y los
checkque corres son de TU árbol, no del que firmas. Dos commits seguidos salieron rotos con «tests en verde» en el mensaje. Se arregla materializando el árbol INDEXADO en un worktree y midiendo allí. - «No lo referencia nadie» es una observación, no un veredicto. Ver la
regla 4 del ledger, y
D10, que nació de saltársela. 4b. Un handoff no es un backlog. Es la lección más cara de esta jornada y no es técnica. El ledger se creó a las 03:55 para que una sesión futura tomara los defectos con su propia puerta, y a las 13:59 esta misma sesión lo empezó a consumir como lista de trabajo. Nadie decidió cambiar el objetivo: se cambió solo, un «arregla esto» cada vez, porque cada arreglo destapaba dos hallazgos y se iban anexando filas (D11…D14) en vez de leer la lista creciente como la señal de parar que era. Terminó en el borrado de una librería de otro eje. Cuando el trabajo deje de responder al plan que lo abrió, se cierra el plan y se abre otro — no se sigue tirando del hilo. - Una parte declarada sin registro en runtime es un destino inalcanzable y no chilla: el emit se rechaza en silencio (salió arreglando D3).
4 · Cómo verificar que sigue en pie
npx vitest run src/uix/morfo/schema.test.ts
82 tests. Los dos que importan: el barrido encuentra >150 morfos (un glob que
deje de casar convertiría al siguiente en un no-op que reporta éxito) y los 172
pasan validateMorfo entero.