astra
alpha-0.1-background
alpha-0.1-dir-prefs
alpha-0.1-sec-dom
menubar-v4-safe
active-uix
morfo-runtime
morfo-driven-soma
semantuix
glm-5
main
sium-v1.0
${ noResults }
25 Commits (06f3c264006da1ebe0e2d187e6a1c13f01f3e577)
| Author | SHA1 | Message | Date |
|---|---|---|---|
|
|
cb1fd54d10 |
docs(process): handoff nuevo para la cola de auditorias, con el protocolo de trabajo delante
El eje perceptual quedo completo hoy (F1-F6), asi que lo que sigue ya no es «su» cola: es la cola de auditorias — sema, fable, blocks, eje B, chronos C5. Este handoff la lleva, y pone PRIMERO lo que cambio hoy de verdad: el protocolo. §0 · las cinco preguntas del autor antes de CADA accion, un item por mensaje, y parar a esperar firma. Sin puerta que permita auto-autorizarse lo mecanico: lo propuse y se corrigio en el acto. Con las dos precondiciones que hoy costaron dos rectificaciones completas — el SPEC del COMPONENTE es doctrina y se busca ANTES de diagnosticar (chronos), y se barre `docs/` antes de proponer retirar nada (S-33 esta en CANON.md y en la D.3 firmada). La regla que las resume: el codigo nunca corrige al canon; se le pone al autor la contradiccion delante. §1 · S-33 FIRMADO y sin ejecutar, con la receta y la evidencia del probe de `tsc`: el defecto es el `Exclude`, no «falta una rama». Derivar los tres cubos positivamente cierra la puerta sola al flipar el const, y la tercera rama es inerte hoy porque se teclea sobre `never` — medido, delta de conducta CERO. §2 los 6 commits de hoy · §3 las tres decisiones abiertas con su evidencia ya medida (S-35 · S-30/S-38 · S-19, esta ultima partida en dos porque (ii) cambia conducta) · §4 la cola en orden · §5 la base de verificacion, con los 6 fallos ajenos de contracts nombrados uno a uno · §6 las trampas medidas hoy, para no re-descubrirlas: la laxitud DELIBERADA del guard D9 (endurecerlo convierte 27 emisiones reales en violaciones), el panel oculto congelando la linea de tiempo, y los ficheros ya sucios en HEAD para prettier. docs:check 0/624. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
2 months ago |
|
|
a157454913 |
docs(process): la 6a fila de chronos no era un defecto — decision revocada por el SPEC
El item llevaba un mes en la cola como «la 6a fila fantasma» y estaba FIRMADO para arreglarse. Al ir a ejecutarlo aparecio el SPEC del propio componente, que dice lo contrario en TRES sitios coordinados: rejilla de 6 filas constante «estabiliza la altura» (SPEC.md:270), inventario de reuso pidiendo «rejilla de mes 6x7» (:492), y `data-outside-month` como estado declarado de `day-cell` CON su propio token de tema (:311 y :461). Las celdas de fuera de mes son diseno, no relleno. La asimetria con la familia —chronos `true`, los otros cuatro `false`— se leyo como deriva y es al reves: chronos es el unico que escribio su decision, y coincide con el default de sus dos referentes de libreria, verificados en la fuente y no citados de memoria: FullCalendar `fixedWeekCount` viene `true` («the calendar will always be 6 weeks tall») y Toast UI `month.isAlways6Weeks` viene `true`. Google/Apple/Outlook si varian las filas, pero porque son aplicaciones que llenan el viewport; chronos no tiene contrato de altura, asi que la receta propuesta tenia que inventarse la altura con `calc(6 * cell-min-block)` — la altura de 6 filas. Era la misma altura con 5 filas mas gordas, y menos informacion. Medido antes de opinar: hoy son 115 px por fila y 724 px de rejilla en todos los meses; con `fixedWeeks:false`, jul→dic 2026 da 609/724/609/609/724/609, o sea el salto de 115 px que la decision queria evitar. Y crecer las filas no ensenaria ni un evento mas: `maxLanes` es `$state(3)` fijo. Corregidos ademas dos errores de la ficha original: el default vive en DOS sitios (chronos.svelte:20 y engine/state.svelte.ts:64), y chronos.css:278 no es la altura de las filas del mes sino la pista de carriles de chips dentro de una fila. La conducta de Google queda anotada como FUNCIONALIDAD con firma propia (contrato de altura + maxLanes derivado), no como flip de flag. docs:check 0/623. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
2 months ago |
|
|
c00e97b91a |
docs(process): F5 cerrada — los tres sitios de las tres auditorias, medidos DESPUES de la campana
F5 no era «volver a medir cada ola»: es la comprobacion de regresion del eje
entero sobre los tres sitios que fable S1, sema S-17 y blocks A-36/A-65
encontraron por separado — y ahora con la API de emision ya borrada.
site-header 375px contact-activate TRIGGER +8,4ms · emerge-open CONTENT +10,3ms,
press-squeeze corriendo SOBRE el trigger, close en el content
knob handle-drop y commit-set separados por 245,4 ms
dropdown+Button +109 / +112,7 ms, close en content, commit-select en el item
PULSADO («Log out», 3.º de 3)
El numero que cierra S-17 es 245,4: el commit encolado entra justo tras el hold
de 240 del drop — ni aplastado a los 24 ms que S-17 midio, ni 1,6 s tarde como
midio el falso verde de `queue`. Y los tres sitios son la misma geometria: un
elemento con DOS morfos (trigger+button, control para drop+commit).
Anotados los dos artefactos del entorno para que no vuelvan como hallazgos: con
el panel sin componer, rAF esta suspendido (el handle-drag continuo del knob no
estampa nunca) y la linea de tiempo de las animaciones no avanza (el
desestampado cae SIEMPRE en el tope de 1500 ms de la espera de expresion, de ahi
los ~1,7 s de limpieza en las tres trazas). getAnimations() dice que corre sobre
que; para duracion de pintura hace falta Chrome real.
docs:check 0/623.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2 months ago |
|
|
b8aa333fd1 |
feat(soma,morfo)!: targetOverride BORRADO — el estado ilegal del eje es inexpresable
El endgame que §3.0 firmo al abrir F3: con el censo a 0, la opcion de elemento anonimo sale de TriggerOptions, y con ella assertTargetOverride (existia solo para vigilarla; queda assertAnchor, el guard de la puerta que la sustituye). Las dos resoluciones `opts.targetOverride ?? resolveEmitTarget(...)` (emit y foco a11y) quedan en la resolucion unica, y los Omit<..., 'targetOverride'> de los triggers anclados se vuelven vacuos y desaparecen. El tipo lleva LAPIDA doctrinal: la opcion nacio fallbackTarget, se renombro el 2026-08-10 como precondicion del censo, y compensaba un registro sin identidad de instancia — es lo que dejo a tres auditorias (fable S1, sema S-17, blocks A-36/A-65) encontrar la misma deriva sin poder cerrarla. No volver a añadir una opcion de elemento. Y la tesis se probo sola al ejecutarla: el compilador, ya como censo, cazo 9 usos en TESTS que el grep del scratch nunca escaneo. De ellos, 3 eran redundantes (la parte registraba el mismo elemento), 2 del test de metrics migran al registro + trigger plano, y 4 fijaban la conducta borrada — el describe «targetOverride contract» entero y el test del override preferente, retirados con lapida; el guard A-36 de los overlays (morfo sin redireccion + post) se conserva, des-anidado. El scratch del censo, retirado: el censo es `npm run check`. Docs vivos adjudicados: morfo.md §allowedTargets describe la puerta anclada (EventNameTargeting + assertAnchor) y §repeated-part nombra partInstance donde decia targetOverride; los docblocks de las 3 factorias de vistas de eidos dicen la forma nueva; errors.ts deja de ofrecer la opcion muerta como remedio. Las menciones historicas (A-36, «the retired...») se conservan como historia. Verificado: soma navegador 1278✓/1 (el timeout ajeno preexistente de soma-attr-audit, documentado en la base) · runtime+metrics 53/53 · check 69 = base, 0 propios · docs:check 0/623 · prettier limpio en lo que estaba limpio. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
2 months ago |
|
|
e1cedb81ba |
fix(soma): el dropzone de file-upload deja de robar clicks ajenos — un gesto, una ocurrencia
Lo habia dejado ANOTADO en la ola 6 por no cascadear, y estaba mal clasificado: es la clase que este eje persigue (una ocurrencia por gesto), encontrada por mi propia medicion y en un fichero que ya estaba editando. Y al medirlo de verdad, el mecanismo resulto MAS ANCHO que el diagnostico de la nota. No es solo el Trigger burbujeando: el <input type=file> oculto vive tambien DENTRO del Dropzone, asi que el click() SINTETICO que dispara openPicker vuelve a entrar por el mismo manejador. Medido en navegador: UN click en el dropzone llegaba DOS veces, la segunda con target = INPUT[hidden-input] — solo el guard de reentrada que la plataforma pone en click() lo paraba ahi. O sea que TODO click al dropzone duplicaba, no unicamente el del boton. Arreglo: guard por PROPIEDAD en el onclick del dropzone — `closest` sobre los marcadores de `trigger` y `hidden-input`, construidos con partMarkerAttr y nunca a mano, para que un renombrado de parte rompa aqui en vez de ensanchar el alcance en silencio. Es el idioma que table ya practica. Test visto FALLAR con la anidacion real del DOM (trigger + hidden input dentro del dropzone) y los tres casos: la superficie propia abre, el input oculto no re-abre, el boton no re-abre. Medido despues en navegador: click en el dropzone → UN contact-trigger-picker en DROPZONE; click en el boton → UNO en TRIGGER. file-upload 5/5 · check 69 = base, 0 propios. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
2 months ago |
|
|
4854df3c47 |
refactor(morfo,soma): ola 6 de F3 — las colecciones, y el censo baja a 11 (solo palabras)
Ocho componentes, cuatro clases, cada sitio con la pregunta A-36 primero:
NO-OP DE SINGLETON, retirados: virtual-list ×2 y virtual-grid (viewportRef lo
escribe la propia registracion del viewport) y css-field signal-warn-invalid
(el elemento ERA runtime.partRef('input'), el destino declarado — se lee para
clearTarget, no para redirigir).
ANCLAJE POR IDENTIDAD en las repetidas: menubar trigger · navigation-menu
trigger ×2 + link · tags-input item · file-upload item. En color-field y
time-field no es adorno: DOS partes registran el kebab `input` (grupo visible
+ input oculto), y fieldNode es el ref de la visible, asi que partInstance la
nombra sin depender de quien monto ultimo.
TERMINALES devueltos al provider declarado: tags-input commit-set-add ×3 y
commit-reset; file-upload commit-set-add, signal-warn-reject y commit-reset.
El dropzone que recibe el drop y el boton que ordena el borrado son la
superficie del GESTO, no el sujeto de la ocurrencia — la fila de la doctrina
del sello. Con ellos caen los parametros `target` muertos y sus llamantes.
allowedTargets NUEVO, y es el eje correcto: file-upload contact-trigger-picker
declara [dropzone] junto a su target `trigger`. Es familia contact — el gesto
se sella donde esta la MANO — y las dos superficies son eleccion del llamante
en operacion normal, no estado de montaje.
Medido en navegador: nav-menu abre y cierra sobre el trigger PULSADO
(«Solutions», el 2º de 2, que es la prueba de la identidad) y commit-select
sobre el link «Pricing»; file-upload sella DROPZONE al pulsar la zona y
TRIGGER al pulsar el boton.
⚠️ Hallazgo anotado, NO tocado (preexistente, verificado byte a byte contra
HEAD): pulsar el Trigger de file-upload emite contact-trigger-picker DOS veces
— vive dentro del Dropzone, cuyo onclick no filtra el click burbujeado. Ficha
en el handoff; el arreglo es un guard de propiedad y no se cascadea aqui.
Verificado: suites 46/46 · censo 29 → 11 (solo palabras) · check 69 = base, 0
propios · docs:check 0/623 · prettier limpio en lo que estaba limpio en HEAD.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2 months ago |
|
|
aa8a630ed2 |
fix(morfo,soma): ola 5 de F3 — select y combobox dejan de sellar el trigger, y present-rise suelta el boton
El superviviente A-36 mas puro de la campaña: el open YA era post (el content
monta antes del emit) pero el provider seguia forzando targetOverride al
trigger — un vestigio de la era pre LEGALIZADO por el allowedTargets del
2026-08-10, que era el eje equivocado (estado de montaje, no eleccion del
llamante). Con el, la firma de motion present-rise corria SOBRE el boton: la
regresion firmada en §1.2 del handoff de normalizacion, medida hoy.
A/B en navegador (la disposicion firmada mandaba medir primero):
ANTES emerge-open TRIGGER · emerge-close TRIGGER · present-rise en el boton
AHORA emerge-open CONTENT · emerge-close CONTENT · present fuera del boton
commit-select → el ITEM elegido («Pear Soft»), anclado por identidad
Receta (la de F4/ola-1): el open pierde allowedTargets y el override; el close
declara targetFallback ([trigger] en select, [trigger, input] en combobox — un
combobox puede vivir sin boton); la seleccion ancla por partInstance al item
registrado, con el nombre computado de ListSelection (SelectionEvent) por la
puerta tipada.
Verificado: suites 24/24 · censo sin un solo sitio de select/combobox ·
check 69 = base, 0 propios · consola limpia (404s = raiz/favicon del arranque).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2 months ago |
|
|
69b17f741c |
refactor(eidos,soma): ola 4 de F3 — las vistas de eidos REGISTRAN sus partes (censo 38 → 29)
El unico grupo que no era retirar-o-anclar: metrics, menu-dial y onion-menu
emitian con elementos locales que ningun registro conocia, asi que
partInstance daba null y el override era la unica via. Ahora registran:
- metrics: `value` se registra (id + ref del registro) y emite su
signal-notify-update ANCLADO el mismo — el contexto gana `live` + `runtime`
y deja de acarrear elementos crudos (notifyUpdate muere).
- menu-dial: `list` registrado en la raiz (open/close resuelven solos) y cada
`action` registrada en su componente — el attachment del part atraviesa la
cadena Fab→Button→<button> compuesta, medido: los mini-FABs llevan ids del
runtime y el commit-select aterriza en LA accion pulsada.
- onion-menu: `surface` registrada sobre surfaceEl (SVG cabalga el ref
HTMLElement con el mismo cast que usaba el asTarget retirado) y cada sector
`item` por attachment CACHEADO por clave — la membresia es el stream del
attachment (F2): el drill poda y re-añade sin crecimiento. asTarget muere.
Medido en navegador los tres: onion open→SURFACE, expand→sector d1 «Create»
(el pulsado), select→hoja d2 «Note»; menu-dial open→LIST + contact→trigger
(dos superficies expresando); metrics update→el Value del bloque live con 4
instancias registradas — no el mas nuevo, que es la prueba de que el anclaje
importa. Consola limpia.
⚠️ Trampa pagada y anotada: importar `state` de $libs/reactive en un .svelte
que usa la runa $state rompe TODOS los $state<T> del fichero (shadowing) —
alias `state as refState`.
Verificado: suites 19/19 + metrics 3/3 · censo 38 → 29 (−9, cae tambien el
FOREIGN) · check 69 = base, 0 propios.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2 months ago |
|
|
14d0dee4f2 |
refactor(soma): ola 3 de F3 — css/number-field pierden el targetOverride publico (censo 44 → 38)
La QUEDA pedia retirar targetOverride de la API publica de commit(), y el
censo de llamantes dio la razon entera: NADIE externo lo pasaba — solo los
propios scrubbers en pointerup/lostpointercapture, redirigiendo el TERMINAL
commit-set (declarado provider: «the terminal is stamped where the value
lives») al elemento del scrubber. Clase A-36: sobra la redireccion. Y no era
gratis: con el sello en el scrubber, las reglas de pack que seleccionan el
provider no casaban jamas un commit de scrub — la clase TextArea de S-12.
Tambien fuera los 4 handle-pick/handle-drag-scrub con e.currentTarget: el
scrubber es singleton y registra, el override re-decia el destino declarado.
commit() queda { clamp?: boolean }; los finales de scrub llaman sin bolsa y
los handlers sueltan el parametro e que ya no leian.
Verificado: suites 17/17 · censo 44 → 38 (−6 exactos) · check 69 = base, 0
propios.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2 months ago |
|
|
3fdaa8cbb6 |
refactor(soma): ola 2 de F3 — los grids de fecha anclan por identidad (censo 51 → 44)
Clase B entera (el override elegia la instancia correcta de una parte repetida): la eleccion es legitima y se conserva, expresada por la puerta tipada — partInstance + trigger anclado, que verifica la identidad contra el registro en vez de contrabandear un elemento crudo. - calendar: commit-select/unselect anclados al `day` pulsado (1 sitio, 2 eventos). - range-calendar: 5 sitios → helper privado triggerOnDay (select-start · select-range · reset ×3), `day` registrado en :1206. - month-grid y year-grid: commit-set anclado a la `cell` pulsada. Un elemento no registrado o ausente cae a la resolucion del runtime, como en las olas anteriores. Verificado: suites 22/22 · censo 51 → 44 (−7 exactos) · check 69 = base, 0 propios. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
2 months ago |
|
|
f6e4f40723 |
refactor(soma): ola 1 de F3 — los gestos handle sueltan targetOverride (censo 64 → 51)
Los cuatro componentes de gesto con «campos de elemento propios», y la pregunta A-36 primero en cada sitio: - path-trace y rotate-align (3+3): tokenEl/trackEl y needleEl/dialEl SON los elementos que sus partes registran (los escribe la registracion) — el override re-decia el destino declarado singleton. No-op puros, retirados. - float-panel (4): la QUEDA preguntaba ¿allowedTargets o retirar? y la respuesta estaba en la fila de la doctrina del sello: el content ES la posicion (grip y terminal, morfo.md §Where the stamp lands). contentRef es el elemento registrado del target declarado y el ?? dragEl/resizeEl era cinturon de la era fallbackTarget, inalcanzable durante el arrastre del propio panel. Retirados. - drag-drop (3): draggable y droppable son partes REPETIDAS con la instancia correcta en la mano — anclados por identidad (partInstance + trigger anclado, el idioma de tag-group). Verificado que source/target son exactamente los refs registrados (opts.ref.current en los dos call sites), asi que la identidad resuelve; un elemento ajeno cae a la resolucion del runtime. Verificado: suites navegador de los 4 → 34/34 · censo 64 → 51 (−13 exactos) · check 69 = base, 0 propios. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
2 months ago |
|
|
281840db3e |
refactor(morfo,soma): alert-dialog cierra el eje del nombrado — el default es del CONTRATO, cero cadenas mecanicas
La ultima cadena clase 1 del catalogo, excluida del barrido de los 21 porque otra sesion editaba el fichero. Receta identica (morfo.md Step 4): el morfo declara #?components.alert-dialog.action|Confirm y .cancel|Cancel; fuera la cadena resolvedAriaLabel x2, la fuente del runtime, el prop de opts y el destructure de los dos wrappers — el aria-label del consumidor fluye por restProps y gana por politica de merge. ALERT_DIALOG_LANGS queda huerfano (su langs.ts se suma a la lista declarada, 14 → 15; no se borra). El harness del test se alinea con produccion de paso: translate = ts (un solo traductor para las dos puertas — la trampa del harness de editable, donde la identidad dejaba pasar el ref crudo por la cadena resuelta). Medido: navegador en es → aria-label="Confirmar" / "Cancelar" saliendo del contrato, type="button" intacto · translations:check 159 refs compilados (157+2), 0 errores · alert-dialog 2/2 · check 69 = base, 0 propios. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
2 months ago |
|
|
fa79cc5423 |
fix(sema): con sound 'off', prepare ya no abre el AudioContext — la reduccion alcanza la puerta (S-27/S-41)
El gate de shouldPrime solo miraba signal.channels: con la preferencia en 'off' cada emit seguia creando el contexto y registrando los listeners globales de desbloqueo — 'off' silenciaba la salida pero pagaba igual la adquisicion del recurso, contra la cabecera del propio canal y la promesa del art («an app that never makes a sound pays nothing»). La preferencia se lee POR LLAMADA, asi que volver a encenderla prima en el siguiente gesto sin suscripcion. 'reduce' sigue primando (suena, atenuado). El activeChannels de la familia NO se consulta a proposito: prepare corre antes de resolver la cascada y una regla de pack puede ampliar los canales (el 'step' de los sliders cabalga justo eso) — esa mitad de S-41 queda rechazada con la razon escrita en el comentario. El test del canal nacio en ROJO (el de 'off' existente solo ejercitaba handle, que es como el agujero paso inadvertido) y fija ademas la vuelta: off no prima, flip a full y el mismo gesto siguiente prima una vez. chans+sound 84/84. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
2 months ago |
|
|
b7784d34a3 |
docs(process): la ronda de decisiones queda firmada — cinco disposiciones, dos corregidas al re-analizar
D10 SE RETIRA (lo ejecuta el eje de sonido, su handoff PRIMERO), y el re-analisis añade un SEXTO sitio a adjudicar: sema.md §per-emit payload aun describe pitch/gain/contour cuando soma adjunta hoy sound:'step' + curva haptica (dragSignalOverrides del slider y del knob, con el trade-off del 2026-08-06 citado en su comentario). fixedWeeks: alinear a false a secas era la opcion debil — las filas del mes son de altura FIJA (grid-auto-rows, chronos.css:278) y un false pelado cambia la semana fantasma por saltos de altura al navegar. Firmado: crecer las filas (modelo Google), con false incluido; es arreglo de RECETA, no un flip de flag. Chip bloqueado: via (b), y la letra pequeña va INCLUIDA — el morfo de drag-drop YA declara data-disabled (declaracion sin emisor) y el cursor vive en drag-drop.css; pero el chip fusiona tres morfos en un elemento clicable, asi que la regla de archetype item se anula en su receta y aria-disabled NO aterriza en el elemento fusionado. mode/scope: SE RETIRAN, con el barrido de la regla 4 hecho de verdad: 0 hits en docs/, 0 lectores del compilado, 4 ficheros de alcance. SemaCause queda como pregunta hermana (mas muerto aun: ni atraviesa morfo). present-rise: medir primero (lo esperable es la receta F4, pero decide la medida). handle-drag-progress: revisar contra CANON, no renombrar — el matiz es legal y puede ser deliberado. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
2 months ago |
|
|
4ed53f269e |
docs(process): dos correcciones de registro — mi censo repetia uno que ya existia, y peor
D13 mezclaba tres clases en un saco
------------------------------------
`CONTINUE-sema-audit.md` §3.1 YA habia medido esto — «eventos huerfanos: 14 de
249 en 104 morfos con soma» — y, sobre todo, ya los habia CLASIFICADO. Verificado
componente a componente, su clasificacion es la correcta y la mia era gruesa:
- **contrato muerto** — `tooltip` ×3. El unico defecto de la clase D1/D3/D4, y el
unico accionable. Cero `trigger(` en todo su directorio soma.
- **punto de extension documentado** — `virtual-list` / `virtual-grid`
`handle-scroll*`. Los emite la APP; el README los diseca en prosa con su
doctrina. Lo que falta no es cableado: es que el morfo no tiene forma de
DECLARARLO (la auditoria propone `emission: 'app'`).
- **verbo delegado** — `gradient-picker.commit-reset` (S-14, 1 de 6 identicos).
NO se arregla como D3: `GradientPickerProvider` no tiene `clear()` — su
docblock dice que open/commit/cancel/clear viven en el `PickerProvider`
generico compuesto y que esta clase «solo posee el runtime del morfo». No hay
donde enganchar.
Lo que el guard añade sobre aquel censo no es el hallazgo: es que deja de ser una
medicion de una vez y bloquea la regresion. Eso lo demostro D9 al deshacerlo.
`CONTINUE-perceptual-surface.md` afirmaba algo falso sobre chronos
-------------------------------------------------------------------
Su fila de la migracion de `targetOverride` dice «sus chips tampoco REGISTRAN —
plain trigger fallaria igual». No se sostiene, y lo se porque acabo de medirlo
cableando el acarreo (D9): `partInstance('event-chip', el)` RESUELVE, el sello de
`handle-drag` aterriza en el `event-chip`, y el arrastre del tirador da 6
`handle-resize` sobre `event-resize-handle`. Los chips registran.
La otra mitad de la fila (los botones del editor no son partes) queda, y se le
añade lo que dice la auditoria de sema: la exclusion de escritura de chronos se
levanto el 2026-08-10.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2 months ago |
|
|
e8acbbdf0a |
docs(process): el handoff cierra la jornada — una sola cadena mecanica queda viva
El §0 pasa a decir donde esta el eje del nombrado al cerrar, que es lo que se lee manana antes que nada: los cuatro commits pusheados, la unica cadena que sigue pendiente y es mecanica (`alert-dialog`, excluida durante el barrido porque la otra sesion editaba el fichero — su D1 ya esta commiteado, asi que hoy esta libre), y por que las otras diez NO son deuda sino clases medidas (estado, interpolacion, composicion, supresion sobre prop sin default). Queda escrita la decision del autor de NO ensanchar `mapRef`, con su razon: desbloquearia solo una de las tres clases y reintroduce la averia que esta jornada mato — el guard v2 no recorre los valores del mapa y `normalizeTranslationRef` tampoco los tocaria, asi que una clave relativa saldria literal. Y queda escrita la forma correcta por si alguna vez se hace: valores del mapa como FUENTES, no como cadenas traducidas. Anotada la deuda menor medida hoy para que nadie la re-descubra: los diez harnesses cuyo mock ignora su clave, los catorce `langs.ts` sin consumidores (que NO se borran sin instruccion), los doce avisos de huerfanos. Y la linea base con la que medirse manana, incluido el matiz de que `check` da 70 con el WIP ajeno presente y 57 sin el. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
2 months ago |
|
|
61457baac0 |
docs(process): el handoff dice lo que paso, incluido donde el diagnostico viejo mentia
Dos diagnosticos heredados eran falsos y mandaban al sitio equivocado, asi que se corrigen en su sitio en vez de anadir una nota al final: el crash del guard de traducciones no era una url multilinea de un catalogo (era el stripper de comentarios rompiendo un https:// dentro de una cadena) y el guard, ademas, nunca escaneo los call sites que se le atribuian. Dos secciones daban ordenes OPUESTAS a §3.0 y llevaban un dia haciendolo: el hallazgo «chronos estampa fuera del morfo» pedia una decision que C1 ya habia tomado el mismo dia, y «la cola de la campana» listaba como pendientes nueve componentes que las olas 2-3 habian cerrado. Marcadas resuelta y congelada, con los cerrados tachados y remision a la cola viva. Y se escribe lo aprendido en el eje del nombrado: las cinco clases de cadena, las cuatro razones por las que un default NO puede subir al contrato (estado, interpolacion, cross-element, supresion por `<label for>`), la trampa del spread condicional, la del harness cuyo `translate` diverge de `langs.ts`, y la regla que resume la clase — antes de mover un default, mira si el elemento es tuyo. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
2 months ago |
|
|
8864ba93ca |
docs(morfo,chronos): la doctrina alcanza a lo que se construyo hoy
`morfo.md` gana la trampa que se llevo cinco etiquetas: **`texts` es una
DECLARACION, nunca una tabla de consulta**. `normalizeTranslationRef` toma la
clave VERBATIM y no traduce un alias a una ruta, asi que `prevMonth` frente al
`prev-month` del catalogo resuelve a una ruta que no existe y **envia el
fallback ingles sin error ni aviso**. Igual con `commonRef('action.undo')`
cuando `common.action` no existe. Y el aviso que faltaba: el guard que deberia
cazarlo, `npm run translations:check`, **estaba cascando** antes de comprobar
nada — arreglarlo y censar los 166 morfos antes de volver a fiarse.
README de soma/chronos: `SearchButton` faltaba en la tabla de partes, y ahora
documenta los dos permisos de manipulacion directa (`canMove` / `canResize` —
separados a proposito aunque hoy coincidan, porque el handler de teclado
preguntaba el equivocado) y el estado `searchOpen`.
README de eidos/chronos: seccion **Composicion** nueva (la ranura `children`,
que las partes publicas las decide `kind` en el morfo, que son ergonomicas y no
ganchos vacios, y que los overlays los pone la RAIZ). La coletilla «sin API
compound publica» queda marcada como ANULADA en su gap. Busqueda y undo/redo
pasan de hueco a hecho; la recurrencia anota que la manipulacion directa se
bloquea de forma visible y que falta PINTARLO.
`CONTINUE.md` de chronos se marca como NO vigente y apunta al handoff del eje.
El handoff gana una seccion §0 «donde estas» con los seis commits y el orden de
lo siguiente, y §4 recoge las dos decisiones de autor medidas y listas.
docs:check 0/621 · rtl:check 0/177. Los .md tocados que prettier marca ya
estaban asi en HEAD salvo el README de eidos, cuyo contenido SI pasa (el aviso
es solo CRLF del working tree, que git normaliza).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2 months ago |
|
|
56d7f744e9 |
docs(process): retirado el defecto del `data-event-id` — no reproduce
Lo reporte ayer como defecto de contrato C1 tras verlo faltar en tres chips. Al ir a arreglarlo no aparece bajo ninguna condicion: carga limpia con lectura inmediata y a +50/+200/+1000 ms, re-render de mes, arrastre real que aterriza, y el arrastre muestreado en mitad, en el mismo tick del pointerup, en microtask, en macrotask, a un frame y asentado. 17/17 siempre. La explicacion mas probable —no medida, y por eso no la doy por buena— es estado rancio de HMR: la misma sesion produjo otros dos fantasmas (`DayAdd is not defined` y dos `soma::runtime.part`) que en pestana nueva no existian. Leccion de metodo anotada en el handoff: un hallazgo sobre el DOM en una pestana que ha sobrevivido a varios HMR no vale; repetirlo en pestana nueva ANTES de anotarlo. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
2 months ago |
|
|
b7f8899572 |
fix(chronos): una ocurrencia recurrente deja de fingir que se puede arrastrar
Arrastrar una ocurrencia iluminaba la celda de destino y al soltar no pasaba nada: su id es sintetico (`serie::YYYY-MM-DD`) y `moveEventToDay` lo buscaba en `calendar.events`, que solo guarda la SERIE, asi que `find` devolvia undefined y salia en silencio. Iba a resolver el id a la serie —como hace `openEdit`— hasta ver que `canResize` YA excluye las ocurrencias de forma explicita («those edit via the series in v1»). La politica escrita no es desplazar la serie: es bloquear la manipulacion directa y editar por el dialogo. El defecto no era la resolucion del id, era que la afordancia mentia. `canMove(event)` en el provider, espejo de `canResize` y con su razon escrita, y `disabled` en los TRES `DragDrop.Draggable` (mes · all-day · timed). De paso, el handler de teclado gateaba las DOS permisos con `canResize`; ahora cada flecha consulta la suya (Shift → resize, flecha sola → move). Hoy los dos predicados valen lo mismo, asi que en el teclado no cambia la conducta, solo el significado. Medido en navegador: la ocurrencia ya no INICIA el arrastre (ni `data-dragover` ni `data-dragging`), y un evento normal sigue cayendo — Retro 18 jun -> 25 jun. Teclado: flecha sobre la ocurrencia no mueve ni agarra; sobre `Launch` mueve 15 jun -> 16 jun. Queda la mitad cosmetica, anotada: el chip bloqueado sigue con `cursor: grab` y sin `data-disabled`, porque `Draggable` no lo estampa. Pintarlo pide un gancho declarado — decision, no bug. Y el handoff registra por que la rebanada 3 de C5 no es mecanica: casi todos los helpers de la vista de mes los comparten semana y agenda, y varios son COMPORTAMIENTO que pertenece a soma. Partir la vista antes de mover eso repartia la fuga entre cuatro ficheros en vez de arreglarla. check 74 = base · 458 vitest · docs:check 0/621 · rtl:check 0/177 · consola limpia. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
2 months ago |
|
|
fc3a9c0e5a |
feat(eidos): el editor de chronos sube a la raiz, como la paleta
C5 rebanada 2 de 4. El Dialog del editor tenia el mismo hueco que la paleta y se cierra igual: extraido a `chronos-editor.svelte` (Dialog + editorCtx + save/remove) y renderizado por la RAIZ, no por el cuerpo por defecto. Un arbol compuesto que coloque `EditAction` o celdas de dia —partes publicas— ya recibe editor cuando algo llama a `openEdit` / `openCreate`; antes, sencillamente, no tenia ninguno. `chronos-view.svelte` baja de 1199 a 893 lineas y pierde los 7 imports que la extraccion dejo huerfanos. Medido con el discriminador que si distingue de quien es el editor (el portal del Dialog hace que `contains()` no sirva): mover SOLO la instancia compuesta 5 meses y luego elegir desde SU paleta un evento de junio. away -> [junio (defecto), noviembre (compuesta)] elegir «Retro» en la paleta de la COMPUESTA after -> [junio (defecto), junio (compuesta)] la de por defecto NUNCA se movio 1 editor abierto · title «Evento» · EditAction presente El handler corrio en el provider de la instancia compuesta y el editor que aparecio es el suyo. Camino por defecto tambien medido: clic en un chip abre el editor en modo vista, con EditAction traducido, el «when» y el pie. check 74 = base · 458 vitest · docs:check 0/621 · rtl:check 0/177 · consola limpia. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
2 months ago |
|
|
a542f9f10d |
feat(eidos): chronos abre su estructura, y el cuerpo por defecto la estrena
C5 rebanada 1 de 4. Que partes son publicas no es cuestion de gusto: es `kind` en el morfo (21 publicas, 12 privadas). Namespace `Chronos.*` con la forma de Table/Calendar, y la raiz gana ranura de composicion — pasar `children` REEMPLAZA el cuerpo por defecto. Antes se renderizaban ADEMAS de la vista completa, un segundo arbol colgando de un calendario entero; ningun consumidor los pasaba. Ocho partes de toolbar (`Toolbar`, `Heading`, `Prev`/`Next`/`Today`/`Undo`/ `Redo`/`SearchButton`), ergonomicas al estilo `Calendar.PrevButton`: componen el IconButton/Button del sistema, su glifo y la llamada al provider, asi que el consumidor recibe un control que FUNCIONA y no un gancho vacio. El cuerpo por defecto se recompone desde ellas — no es un camino privilegiado, es el primer consumidor de la API compuesta. `searchOpen` sube al provider: en un toolbar compuesto el boton y la paleta viven en subarboles distintos y el provider es el unico sitio que alcanzan los dos. Y la prueba compuesta destapo un hueco real — el SearchButton compuesto no abria nada porque la paleta vivia en el cuerpo por defecto. Los overlays pertenecen a la RAIZ: extraida a `chronos-search-palette.svelte`. El Dialog del editor tiene el mismo hueco y sigue dentro de la vista; es lo primero de la rebanada 2. Dos declaraciones falsas mas, del patron de siempre: `toolbar` declaraba `header` y se pintaba un `div`; `heading` declaraba `div` y se pintaba un `span`. Los wrappers renderizan lo DECLARADO, medido sin desplazamiento. Medido con dos instancias en la misma pagina: next en la compuesta mueve solo la compuesta (junio -> julio), prev en la de por defecto mueve solo esa (junio -> mayo), ids de heading distintos, y la paleta de cada raiz lista sus 18 eventos por separado. check 74 = base · 458 vitest · morfo:check PASS chronos · docs:check 0/621 · rtl:check 0/177 · eidos-lint invalid 0 · consola limpia en las tres vistas. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
2 months ago |
|
|
968fff9cdf |
feat(morfo,soma,eidos): chronos deja de tener partes que el morfo no conoce
C3 cierra con `more-link` y C4 con los seis marcadores que eidos estilizaba sin declaracion. Los tres botones sin fuentes (`day-add`, `edit-action`, `search-button`) comparten una clase; `undo`/`redo` se cablean sobre la del nav; `timegrid` pasa a `time-view` porque estaba a un guion de la parte `time-grid` que vive dentro; `peek-panel` y `day-peek` quedan como partes de display puro con marcador inline. Cada una renderiza un `<button>` real cuando el morfo lo declara: una `Region` que cae a `<div>` pondria el `type` declarado sobre un no-boton. La lupa deja de ser un adorno sin `onclick`: abre una paleta `Command.Dialog` sobre TODOS los eventos, no un filtro de la vista, con `goToDate` nuevo en el provider — la generalizacion de la que `goToday` era un caso particular. El texto buscable viaja en `keywords` porque el scorer de Command lee value + keywords y NUNCA los hijos renderizados, asi que se busca por titulo, por tipo y por fecha. Y tres etiquetas que mentian en silencio: `translationRef` / `commonRef` normalizan la clave LITERAL y no consultan ningun mapa, asi que `prevMonth` / `nextMonth` / `moreEvents` y `action.undo` / `action.redo` caian al fallback ingles en una pagina `es`. Corregidas contra el catalogo, con `common.buttons.undo` / `redo` anadidas. Verificado: check 74 = base (delta cero) · 458 vitest · docs:check 0/621 · rtl:check 0/177 · eidos-lint chronos morfo-backed 32 -> 44, invalid 0 · navegador limpio en las tres vistas, con el A/B del undo medido (18 jun -> drag -> 25 jun -> undo -> 18 jun -> redo -> 25 jun) y el salto de la paleta (noviembre -> elegir Retro -> junio). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
2 months ago |
|
|
56a96114f8 |
feat(morfo,soma): la emisión deja de aceptar un elemento anónimo
El defecto que tres auditorías encontraron y ninguna cerró no era que N eventos redirigieran sin declararlo: era que la API de emisión aceptaba un HTMLElement suelto, compensando que el registro de partes perdía la identidad de instancia. Censar y arreglar a mano reproduce el modo de fallo. Esto lo hace inexpresable. F1 — SomaRuntime<M> genérico, SIN default. Nombres de evento, kebabs de parte y claves de events/actions tipados contra la declaración (EventNameOf / PartKebabOf / ActionNameOf, los extractores que semaSelector ya usaba del otro lado). 104 anotaciones migradas + 3 wrappers que devolvían tipado pero tomaban sources ANCHO. SomaRuntime<Morfo> queda sólo en la tabla de contratos. F2 — registro por instancia: Map<part, PartRegistration[]>, pertenencia mantenida por el stream del attachment (poda al desmontar, re-entrada al remontar), resolución liveReg = la instancia VIVA más nueva. Mata de paso la clase "la más nueva muerta ensombrece a una viva". F3 — tres formas legales de destino: el target declarado; el anclaje por instancia (SomaRuntimePart.trigger, tipado por EventNameTargeting, + runtime.partInstance por identidad de referencia); y targetFallback, la cadena por estado de montaje declarada en el morfo y resuelta por resolveEmitTarget — LA resolución única para validación, emit y foco a11y, que ya no pueden discrepar. ~30 componentes migrados; censo de targetOverride 148 -> 89. F4 — A-36 tenía un superviviente. Medido en dropdown-menu: bajo `pre` el `open` no colisionaba con el contact-activate del Button compuesto, se PERDÍA entero porque su content no había montado. Aplicada la receta de float-panel a dropdown-menu Y context-menu. Ahora: contact-activate en trigger, open en content — dos superficies, ambas expresando. Submenús mudos, tres componentes. No era cableado: el morfo no declaraba el evento. onion-menu recibe emerge-expand/emerge-collapse (la forma de TreeView: un nivel revela sus hijos en el sitio); dropdown-menu y context-menu reciben sub-open/sub-close sobre sub-content, distintos del open raíz a propósito porque el sub es su propia superficie flotante. Nacen con la receta A-36 para no repetirla en código nuevo. chronos — declaraba 26 partes y registraba UNA; 17 role= a mano y el ARIA declarado no llegaba nunca al DOM. Se anula la mitad sobre-extendida de la decisión de 29ffe902a: la reutilización sigue viajando por el motor puro, pero la ESTRUCTURA se compone como en Table y Calendar. C1 (las 6 partes que emiten, chronos con cero targetOverride) + C2 (8 singletons) + C3 8/9. Registrar una parte DESTAPA declaraciones falsas, tres veces en un pase: el chip declaraba defaultElement button y ponía type= sobre un div (anida el asa de resize); grid-row declaraba archetype item y pintó la semana entera como fila de lista; y un aria por propRef desaparece en SILENCIO si el provider no publica la fuente. En los tres el arreglo fue la DECLARACIÓN, no el DOM. Verificado: check 74 = línea base medida con stash, DELTA CERO sostenido en cada lote · 458 pasan (chronos+morfo+sema) · navegador limpio en las tres vistas de chronos, con el contrato ARIA vivo por primera vez (aria-labelledby resolviendo a «junio de 2026», aria-readonly/disabled que no se habían emitido nunca). Handoff en docs/process/CONTINUE-perceptual-surface.md. Aparte, y decidido por el autor: docs/process/PLAN-event-name-normalization.md — prefijo de familia siempre; 36 de 252 sin prefijo, cero ambiguos. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
2 months ago |
|
|
b1b48fb3aa |
fix(sema,morfo,soma): una superficie no admite dos ocurrencias, y el nombre ya no miente
`data-event-*` es UNA RANURA por elemento. Tres auditorias independientes encontraron el mismo defecto y ninguna lo cerro: fable S1 (2026-07-01, con el README diciendo «findings executed»), sema S-17 (2026-08-05, midio el estampado del knob muriendo a los 24ms de un hold de 240) y blocks A-36/A-65 (reproducido en navegador, dos estampados a 1,1ms). Lo que faltaba no era diagnostico: nadie podia distinguir una redireccion legitima de una deriva, porque la opcion que redirigia se llamaba `fallbackTarget` y hacia lo contrario de lo que decia. EL NOMBRE PRIMERO. `fallbackTarget` -> `targetOverride` (202 apariciones, 64 ficheros, dirigido con `git ls-files`). Siempre GANO sobre el ref registrado; el nombre honesto es la precondicion para auditarlo. Las cronicas conservan el viejo por diseño. LA PROPIEDAD. `unstampEventAttrs` recibia el signal y lo DESCARTABA, asi que la ocurrencia que terminaba antes borraba a la que tenia la ranura. Ahora comprueba `data-event-id`. Con eso, `replace` deja de ser el comportamiento roto y pasa a ser el suelo correcto. A-36, SIN `regime`. Los cuatro overlays cedian el estampado del `open` al trigger por un workaround de la era `sequence: 'pre'`; con `post` el content ya esta montado. Retirado el override (float-panel migrado `pre`->`post`, ultimo fuera de la doctrina que sema.md escribe). Medido en /blocks/site-header/preview a 375px: contact-activate en el TRIGGER +18,7ms y open en el CONTENT +20,6ms, con press-squeeze y slide-from-right-full corriendo. Antes: los dos en el trigger, press-squeeze jamas. `regime` DEFINIDO — y son dos valores, no cuatro. `replace` (default) y `queue`, este solo para las 4 parejas irreducibles: los tres toggles (el provider ES el boton) y el knob. `collapse` retirado (su caso murio con la propiedad: medido, 0 huecos en 5 emisiones a 72ms) y `lock` retirado (significaria «un cierre que no se anuncia»), con sus 4 declaraciones muertas. El guard de `queue` PASO EN VERDE SIENDO INCORRECTO: con timers falsos no hay animaciones, asi que awaitExpression volvia al instante. El navegador midio el commit encolado llegando 1,6s tarde. `queue` espera el HOLD, no la expresion. Medir la envolvente no es medir la salida. `renderAttrs` — los attrs que no son partes. Vaciar ACTIVE_DEV_TRACK (palabras y chronos ya no estan excluidos) destapo 23 `data-palabras-*` que ningun morfo declaraba y que palabras.css SI estiliza: aterrizan en el arbol que el usuario escribio, asi que no pueden ser partes. Campo nuevo con la linea afilada —si el consumidor puede componerlo, es una PARTE— y 3 consumidores (palabras, waveform, aura). Declarado en types.ts Y en el esquema sium: la leccion de MorfoElement. Ademas: 5 selectores muertos en el predicado del focus-scope de palabras (barrido de todo el repo: aparecian solo ahi) · RTL-1 real en palabras-chrome (inset logico + translate fisico = doble volteo; rtl:check 1->0) · el union inline al `Direction` canonico, que destapo que el censo de direccion grepea el NOMBRE del tipo · deuda de chronos (scope, barrel, README). Y de la cola: S-36 (barrel 68->71 + guard), S-31 (vibrate(NaN)), S5 (la preferencia de reduced-motion del usuario ya gana a los channels del morfo), SO2 (el warn que el JSDoc prometia), SO4 (validar el target antes del prewrite). Todos los guards nuevos vistos fallar antes de arreglar nada. Base: check 74 (= base) · sema+morfo+contracts 454 verdes / 6 ajenos preexistentes · soma navegador 1258/1259 (el rojo es un timeout ajeno, reproducido con los cambios en stash) · docs:check 0/618 · rtl:check 0/177. Handoff: docs/process/CONTINUE-perceptual-surface.md Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
2 months ago |