Las dos piezas del saneo del dispatcher, el remate del wave C+:
PIEZA 1 — el mapa `actions` baja a la registración de la parte:
- part() gana `actions?` (mismo mapped type que el de runtime, la forma
de states/props/parts). keydown(part, event, anchor?) resuelve
PRIMERO en la registración del anclaje y CAE al mapa de runtime — y el
ancla resuelve LAS DOS MITADES: bindings de la condición y handler,
así que una parte repetida evalúa SU estado, no el del hermano más
nuevo. SomaPartAnchor.keydown(event) despacha con la misma identidad
de registro que trigger. Los 6 consumidores actuales intactos sin
tocarlos.
- El caso FUNDACIONAL cierra: sidebar declaraba Escape→close-sub en
menu-sub y lo ejecutaba en menu-item con firma-workaround
(sidebar-provider:757-762 — «the shared runtime-level actions map
cannot know which sub fired»). El handler vive ahora en la
registración de menu-sub (guardas idénticas) y el item pasó de
EJECUTAR a DESPACHAR (partInstance('menu-sub', el).keydown(event)).
El morfo ya declaraba la verdad; ahora el mecanismo la ejecuta.
- AMBIGUO decidido: el keydown del handle NO se construye (sin
consumidor hoy — nombrado). AMBIGUO nombrado sin corregir: con
ActionNameOf=never el mapped type es {} y acepta cualquier clave — la
trampa que DeclaredSourceMap mata; idéntica en el actions de runtime
preexistente; cerrarla toca ambos niveles (bolsa del autor).
PIEZA 2 — compile recoge las deps de las condiciones de keyboard[]
(deuda nombrada del eje SourceMap): collectConditionDeps sobre los
KeyboardPlans en walkParts. MEDIDO antes→después: 496 entradas, 56
condicionadas, filas sin deps 6→0 — carousel.orientation,
float-panel.draggable/.resizable, search-field.clearOnEscape,
tabs.activationMode, textarea.submitOnEnter ganan su prop en deps.
Alcance recortado EN VOZ ALTA a nivel PARTE: requiredSources es la
adjudicación del censo de fuentes (fichero del otro carril, vetado) —
la asimetría queda CLAVADA en compile.test («leaves requiredSources to
the census»). Cero efecto runtime hoy: corrige el CONTRATO que leen los
instrumentos; la unión AST del censo queda redundante y su retirada
viaja con el otro carril.
Tests: 5 nuevos, CERO re-firmados (nada pineaba el workaround — la
suite de sidebar no tenía ni un Escape): per-registration gana ·
fallback por ACCIÓN no por registración · dos instancias repetidas
resuelven cada una la suya (con la aserción en voz alta de por qué el
ancla existe) · sidebar Escape flotante/en-flujo con providers REALES ·
las deps de condición recogidas + la asimetría clavada.
morfo+runtime 322/322 · sidebar 10/10 · server soma 739/739 · check 71
limpio de ficheros tocados. Constructor Opus 5, sesión coordinando y
verificando.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>