# CONTINUE — normalización de nombres de evento > Handoff de [`PLAN-event-name-normalization.md`](./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 — `months` en cuatro calendarios, `defaultElement` en 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`](./CONTINUE-sound-engine.md), que es lo que no se hizo el 2026-08-12. | Punto | Dueño | | ------------------------------------------------ | ---------------------------------------------------------------------------------------------------- | | **D10** · los 3 resolvers de gesto | ~~el eje de SONIDO~~ **CERRADO 2026-08-12**: retirada firmada y ejecutada desde el eje (ledger §D10) | | **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`](./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`](./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`](./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 1. **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. 2. **Un validador sin ejecutor vigila a nadie.** `validateMorfo` no lo llamaba nada sobre el catálogo real (`registerMorfo` llama a `compileMorfo`), así que todas sus invariantes se comprobaban contra fixtures escritas a mano. Debajo había dos fixtures ilegales, verdes. 3. **Trocear un commit por hunks parte cambios lógicos por la mitad**, y los `check` que 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í. 4. **«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. 5. **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 ```bash 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.