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 }
2513 Commits (astra)
| Author | SHA1 | Message | Date |
|---|---|---|---|
|
|
35d0005de4 |
docs(focus): las seis especies se RENDERIZAN, y añadir una séptima romperá al compilar
- FocusPolicyTable ensancha de 2 a 6 especies, cada una con las columnas que
su forma tiene y una frase que dice qué SIGNIFICA para quien lee la demo
(el lector de esa pestaña quiere saber cómo se comporta el foco, no ver el
tipo). De paso muere el `{:else}` desnudo que renderizaba la tabla de
roving para CUALQUIER kind — el mismo bug que, al ensanchar la unión, dio
6 errores de tipo.
- Cableada en las 9 páginas declarantes (las 2 que el lote no alcanzó —
command y combobox — cableadas aquí con el patrón de la casa).
- morfo.md: la fila de runtime nombra las SEIS especies con su ejecutor, y la
convergencia queda escrita como doctrina: la declaración de foco nombra la
ESPECIE y el primitivo de teclado la EJECUTA.
EL `<h4>` HUÉRFANO, cerrado por el TIPO y no por una rama muerta (hallazgo
del adversarial): el encabezado vive fuera de la cadena de ramas, así que una
séptima especie sin rama imprimiría un título con nada debajo. Un fallback en
runtime NO puede expresar eso — TypeScript demuestra que la cadena es
exhaustiva HOY y la rama sería código muerto (medido: `Property 'kind' does
not exist on type 'never'`). En su lugar queda una prueba EN EL TIPO: añadir
un kind deja de compilar. Es la ley de la casa — lo que se añade rompe al
compilar, no deriva.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
1 month ago |
|
|
8178c41520 |
feat(morfo)!: decisión 3/3 — la unión de foco nombra SEIS especies: dos contratos, una taxonomía
Firmada por el autor (
|
1 month ago |
|
|
c8361a6880 |
docs(morfo): el ±1 del censo NO era un fantasma — era 10(b), y 11(a) lo tapo al dia siguiente
La cabecera declaraba un desajuste sin explicar: una corrida imprimio 764
claves (628 props) y (c1a) 5 contra las 763 (627) y el 6 documentados, y se
anoto como «un ±1 que precede a este lote y pertenece a un movimiento que no
hizo». Medido sobre arbol quieto, replicando el escaneo del propio censo sobre
CADA rev de la ola con `git archive`: esa frase era falsa en las dos mitades.
LA CAUSA: fue la decision 10(b) misma, dos commits antes. `2d7d2d698` registro
`timeRangePickerMorfo.props.invalid` y esa UNA registracion movio LAS DOS
cifras a la vez — claves 763->764 (props 627->628) Y (c1a) 6->5 — porque el
morfo declara `data-invalid` por `propRef('invalid')` sin fuente y sin mano
escrita: la fila (c1a) de manual, y justamente la que el propio fichero cita
mas abajo como regla `.css` seleccionando un attr que nunca llego al DOM. La
corrida que imprimio 764 se tomo con `2d7d2d698` en HEAD y TENIA RAZON; lo
rancio era la cabecera contra la que se comparaba.
POR QUE PARECIA UN FANTASMA: el commit siguiente lo cancelo. La decision 11(a)
(`c1f5b4925`) retiro `tooltipMorfo.props.disabled` junto con SUS DOS refs
(`data-disabled` y `aria-disabled`), devolviendo props 628->627 y el total a
763. Dos movimientos independientes, signos opuestos, un commit de distancia:
el arbol en el que se abrio 12(a) volvia a medir 763 y el +1 no habia dejado
rastro visible. Solo los EXTREMOS del +25 estaban un commit atrasados.
EL CAMINO MEDIDO, de punta a punta: 729 (`d1e955eef`, `168a0fba0`) -> 752
(`84bbe1d3d`) -> 763 (`2f09c7a79` … `2503e7f09`) -> 764 (`2d7d2d698`) -> 763
(`c1f5b4925`) -> 788 (`cb70927e9`, y hoy). NADA EN ESTA CABECERA QUEDA SIN
EXPLICAR — que es la mitad que faltaba: una cifra sin causa es solo medio
arreglo, y este fichero existe para no tener cabeceras que su propia salida
desmienta.
De paso, dos correcciones al parrafo que la ola dejo escrito: el total de hoy
es 788, no 789; y su reparto +20/+5 es en realidad +21/+4 — 21 en el trio de
fields (15 filas DISTINTAS, contadas 21 veces porque la clave `segment` se
registra CUATRO veces en date-field y en time-field) y +4 en chronos, cuyas
cinco claves de Region llegan nombradas una a una y retiran el marcador
`…spread` que sustituyen, que es tambien por lo que `unreadable` cayo a 0. El
total siempre estuvo bien; el reparto no se habia medido.
Se re-titula el parrafo de las 763: decia «WHAT THIS TREE MEASURES TODAY» y ya
no es hoy. Un parrafo rotulado TODAY con la cifra de anteayer es la misma
enfermedad que este fichero corrige en los demas.
Suite verde. Cifras de la corrida de hoy: morfos=104 calls=716 keys=788
(75/652/61) unreadable=0 · orphans=20 deadPerPart=0 · advisory 34 = 3/15/16.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
1 month ago |
|
|
062384ccaa |
docs(morfo)!: filas 13 y 14 — los TRES estados de una entrada sin fuente, y la regla de alpha deja de vivir solo en prosa
FILA 13(c), firmada: una entrada declarada sin `value` tiene tres estados y la diferencia era invisible. (1) con value: la emite la bolsa y la verifican compilador, resolver e instrumento. (2) sin value, required, sin condición: la emite el PROVIDER y morfo-check EXIGE el attr en el elemento — la única forma sin fuente que alguien verifica. (3) sin value con optional o con condición: CONTRATO-ONLY — nadie la emite y nadie la exige; legitima el attr cuando aparece y documenta que el provider puede emitirlo, nada más. El tercer estado se QUEDA porque es la única forma de decir «el provider lo posee Y es condicional» — descartadas (a) exigir siempre (pondría rojo el caso legítimo) y (b) prohibir la condición (quita expresividad honesta). Se escribe donde se lee: el JSDoc del campo, el comentario del pase (d) que prometía más de lo que el código hace, y una tabla en morfo.md. Dato para no optimizar lo minúsculo: en ese pase `severity` es el filtro DOMINANTE y `condition` el marginal. FILA 14(a), firmada: `web/routes/alpha` (TERMINATED) pasa de doctrina en prosa a entrada de .gitignore con su acta. La lección que la motiva es del peer vicen-e1: `git add <directorio>` consulta .gitignore, JAMÁS doctrina — una regla que solo vive en prosa no la hace cumplir nadie, y anoche entró en un commit por eso. De paso deja de ensuciar el status de las tres sesiones. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
1 month ago |
|
|
482bb5cd94 |
docs(process): la bolsa de 12 ejecutada — 8 lotes anclados, gate 5224 verde, y la fila 13 que nació de la 7
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
1 month ago |
|
|
cb70927e92 |
fix(soma): decisión 12 — las fuentes de segmento se registran, la mano muere y chronos deja de esconder su contrato
RECONCILIAR (bloque L3): los dos instrumentos decían cosas contrarias sobre el MISMO (parte, attr) y ambos tenían razón sobre elementos distintos — el segmento de CANAL llevaba los attrs escritos a mano, y el segmento `literal` (el #, la coma, el paréntesis del valor formateado) es un separador inerte que no los lleva; la cosecha, midiendo instancia a instancia, los contaba ausentes. No era defecto de emisión: era defecto de DECLARACIÓN. Ejecutado en el ORDEN firmado, que no es negociable: (1) registrar las fuentes en la parte `segment` de color-field, date-field y time-field; (2) sólo entonces la condición prop-defined significa lo que dice y distingue el separador del canal; (3) hecho eso, morir la mano (getAriaProps) y emitir la bolsa (ley P0). Al revés, la condición habría quedado como guarda permanentemente falsa silenciando el síntoma. UNCERTAIN (chronos): de las 6 filas estampadas, 4 se habían disuelto ya con la retirada de espejos ( |
1 month ago |
|
|
c1f5b49253 |
fix(uix)!: decisión 11(a) — la cáscara del Tooltip no pinta ni anuncia la señal de un control ajeno
El trigger de Tooltip es una CÁSCARA que envuelve el control del consumidor, y `disabled` en Tooltip significa «este tip no se abre» (gatea handleOpen), jamás «este control está muerto». Aun así el elemento llevaba data-disabled + aria-disabled y el archetype del sistema los usa para atenuar al 40 % con not-allowed: un botón VIVO envuelto se veía muerto. La medida que eligió la rama (peer vicen-e1, verificada): quien atenúa es `data-disabled`, NO el aria — cero ocurrencias de aria-disabled en los 181 CSS de eidos. Retirar solo el aria habría dejado la PEOR combinación: atenuado y además mudo para AT. Bajo la firma («la cáscara no pinta NADA») caen las DOS entradas del morfo, enteras, y con ellas el registro de la fuente en el provider (quitar la lectura y retirar la registración son UN movimiento: si no, nace una huérfana que el censo de fuentes caza con razón). La regla CSS muere con acta. Corregido además el README de eidos que documentaba la intención CONTRARIA («soma debe propagar la prop del wrapped element»): son dos significados del mismo attr y la firma elige el primero — dicho, no elegido en silencio. Trampa del auditor sorteada: `component-audit` decide si exigir R-1.2 con un `includes` sobre el TEXTO del morfo, así que el acta de retirada no escribe esa cadena literal ahí dentro. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
1 month ago |
|
|
2d7d2d698d |
fix(soma): decisión 10(b) — el picker LEE el inválido de su field compuesto: UNA sola verdad
`data-invalid` del time-range-picker se declaraba sin fuente que lo alimentara. Descartadas las otras dos ramas con medida: retirar la declaración era falso (no es composición — el field se crea con ref NULA y su bolsa nunca llega al elemento del picker; los 3 hermanos declaran y registran; dos reglas CSS vivas dependen del attr), y `invalid: () => false` habría registrado una fuente incapaz de emitir: sacar la fila del censo sin curar el DOM, que es amañar el instrumento. La forma firmada: el field COMPUESTO posee la validación y el picker la lee. Una verdad, su dueño la computa, quien la necesita la consume — en vez de las ~30 líneas duplicadas que habría costado la vía «cada uno la suya» (dos verdades para el mismo hecho, contra «bolsa = única tubería» y no-façades). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
1 month ago |
|
|
2503e7f096 |
fix(soma): decisiones 5 y 6 — la copia atrasada del cruce de borde alcanza a la buena, y el salto de año se DECLARA
DECISIÓN 5(a): al cruzar el borde del mes con las flechas, calendar pasaba por `setPlaceholder` (con puerta min/maxViewValue y anuncio a AT) y range-calendar escribía el placeholder directo, SIN puerta y SIN anuncio. No era decisión: era la misma máquina escrita dos veces con una copia atrasada — un range-calendar con `maxViewValue` navegaba más allá de su tope y AT no oía el cambio de mes. Nivelado por los callbacks que el primitivo grid-walk ya expone; cambio de conducta INTENCIONAL con tests. DECISIÓN 6(a): Shift+PageUp / Shift+PageDown = ±1 año se DECLARA en ambos calendarios (`prev-year`/`next-year`, el vocabulario que month-grid ya usa). Conducta embarcada desde la primera versión y prescrita por APG, invisible al contrato y a las 42 páginas de docs hasta hoy. Cero conducta. Los comentarios de los dos providers que decían «undeclared in the morfo» quedaron FALSOS por este mismo commit y viajan corregidos (defecto que marcó el adversarial del lote). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
1 month ago |
|
|
fe31a3f165 |
feat(morfo)!: decisiones 1-4 — la familia de VALOR habla un solo vocabulario y el par de fields entra en su especie
DECISIÓN 1(a) — Home/End se unifica a `set-min`/`set-max` en slider,
rating-group, number-field y css-field. Declaraban `first-item`/`last-item`
para LA MISMA conducta mientras knob y gradient-builder ya decían set-min/max,
y la razón estaba ESCRITA en el corpus desde antes (los morfos de segmento:
«first-item / last-item is the LIST one and names an item that a segment does
not have»). Un valor no tiene items: el vocabulario de lista se había
filtrado. Cero conducta — ninguno usa el dispatcher.
DECISIÓN 2(a) — rating-group: el salto por dígito se guarda con /^[0-9]$/
(precedente media-player) y se DECLARA como kind:'display'. Antes parseaba con
Number(e.key) y, como Number(' ') es 0, ESPACIO PONÍA LA VALORACIÓN A CERO:
un accidente de coerción, no verdad embarcada con intención.
DECISIÓN 3(a) — gradient-builder: medir primero, la medida elige la rama. El
track NO espeja en RTL (medido en las TRES superficies que lo deciden: el
ramp `linear-gradient(90deg)` que el track fija izquierda→derecha
«independent of the gradient's angle», la colocación `left: {pos}%` centrada
por un translate físico, y el arrastre `(clientX - rect.left) / rect.width`).
Posición 0 es el borde físico izquierdo bajo cualquier dirección, así que un
par espejado movería el stop CONTRA lo que el usuario ve. Rama tomada: acta
de physicality, al modo de la de knob.
DECISIÓN 4(a) — number-field y css-field migran a valueStep EN PAR (sus
keydowns eran copias casi literales entre sí). El primitivo se ensancha con
lo leído: min/max OPCIONALES ⇒ sin cotas, Home/End NO son suyas y caen al
cursor de texto, que es la conducta embarcada.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
1 month ago |
|
|
04ac452a17 |
fix(soma)!: decisiones 8 y 9 — el mapa `actions` deja de aceptar cualquier clave, y el handle NO gana keydown
DECISIÓN 8(a): con un morfo sin `keyboard` en ninguna parte (97 de los 168 de
hoy), `ActionNameOf<M>` colapsa a never y el mapped type `{ [K in never]?: }`
es `{}` — que en TypeScript ACEPTA CUALQUIER OBJETO. Un provider podía
registrar `actions: { loQueSea: handler }` y el tipo callaba mientras el
handler no se ejecutaba jamás. La cura ya vivía A UN METRO, en el mismo
fichero: `DeclaredSourceMap` la mata con `[Names] extends [never] ? never` y
su acta medida. Aplicada a los DOS niveles (el mapa de runtime y el
per-registración de
|
1 month ago |
|
|
0d7a97cb7a |
fix(web): desactivar la mina de las tablas de contrato antes de que alguien pise la puerta
La decisión 7 abre la entrada sin `value`. Las tablas de contrato de las
demos desreferencian `{a.value.kind}` PELADO y el gate de tipos está CIEGO
por construcción (las páginas castean la parte cruda con `as unknown as`),
así que `npm run check` no lo cazaría jamás: la PRIMERA entrada sin value
reventaría esa tabla con un TypeError en runtime.
Endurecidas al patrón que la casa ya tenía en dos sitios (el gemelo de data[]
diez líneas más arriba en la propia página y date-range-field:874):
`{a.value?.kind ?? '—'}`. El guion solo aparece cuando no hay fuente; con
value, las tablas pintan exactamente lo mismo que antes.
Hoy hay CERO entradas sin value en el corpus, así que esto no cura un defecto
vivo: desarma una bomba ARMADA. Hallazgo del peer vicen-e1 en su medida de la
decisión 7.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
1 month ago |
|
|
0556b9a1ac |
feat(morfo)!: decisión 7 — `value` es OPCIONAL en aria[]/attrs[]: declarar la EXISTENCIA sin poseer el valor
Firmada por el autor (bolsa de 12, 2026-08-27). La asimetría con data[] —que
siempre admitió la entrada sin fuente— hacía INEXPRESABLE la cura del lote L5
(un attr cuya aritmética el morfo no puede computar: depth+1, colIndex+1);
un constructor lo midió con tsc y paró. Ahora el contrato puede decir «este
attr existe, el provider posee su valor», que es la forma que data[] practica.
- types.ts: `value?`, con la doctrina en el JSDoc.
- compile.ts: guard `if (!entry.value) continue` en ambos cubos, réplica
LITERAL del de data[] (:452): sin plan y sin deps, pero la entrada consta.
- schema.ts: `value` opcional + invariante nuevo — `ariaBoolean` sin value
LANZA (pedir stringificación booleana de un valor inexistente es
declaración incoherente).
- resolver.ts: consecuencia OBLIGADA que el lote destapó — `resolvePartAttrs`
escribía `undefined` en la bolsa para una entrada sin fuente, y `dom.apply`
lee undefined como BORRA: habría pisado el valor del provider (la ley de
wave por la otra puerta). Ahora salta, simétrico a data.
- morfo-check: el pase ARIA ya distinguía «declarado sin fuente» de «no
declarado» por construcción (declaredAria mapea por attr); queda la ley
escrita y la mitad «required sin condición» SIGUE exigiéndose: que el
provider posea el valor es la promesa de que emite uno.
PROVENIENCIA CORREGIDA en los 3 sitios (JSDoc de schema, JSDoc del flag y el
MENSAJE QUE SE LANZA): citaban la regresión
|
1 month ago |
|
|
830cd76715 |
fix(theming): la aguja del censo dejaba de ver lo que Prettier partia en dos lineas
M0. `classify` decide la clase de cada knob con seis AGUJAS sobre su valor, y
cinco exigian `var(--` con nada entre el parentesis y los guiones. Pero el
valor llega normalizado a espacios simples, asi que una declaracion que
Prettier habia roto en dos lineas llegaba como `var( --x` y la aguja fallaba.
El censo clasificaba por ORTOGRAFIA: el mismo knob puntuaba distinto segun si
su linea cabia o no en 100 columnas.
DOS VICTIMAS en todo el catalogo, una por aguja, medidas y verificadas en el
fichero por el pase adversarial:
- palabras.css:227 (la zebra) — puntuaba `literal`, es `public`. Su hermana
de :220 ya puntuaba public solo por caber en la linea.
- split-button.css:66 (el `min-inline-size` del menu) — puntuaba `global`,
es `channel`: un canal de valor por instancia que el censo llamaba
primitivo crudo. Cumple los tres requisitos de la clase, verificados uno
a uno.
Las otras tres agujas (`SYSTEM`, `STYLE_LAYER` y el `var(--` pelado) llevaban
el MISMO defecto con cero victimas hoy. Se corrigen igual: dejarlas ciegas deja
el bug armado para la proxima linea que Prettier rompa, y esta medido que no
cuesta nada — las cifras salen identicas con y sin ellas (cuatro variantes
construidas y medidas por el adversarial). La tolerancia esta COPIADA, no
inventada: `recipe-css-contract.test.ts:150`, el instrumento hermano de esta
misma casa sobre este mismo constructo, ya la tenia.
LEDGER: dos filas quedan STALE y se retiran con acta en la CABECERA (dentro
del mapa las borraria la proxima regeneracion). NO es deuda perdonada: ninguna
receta cambio, se corrigio una misclasificacion en su origen. Verificado por
cuatro vias independientes, la ultima byte a byte contra lo que el generador
escribiria, que no se borra ni una fila de deuda VIVA.
SUELO: `minAtHundred` 66 -> 67, y el acta dice la verdad sobre el mecanismo
porque el pase adversarial cazo que no la decia. NO es un re-base — en un
re-base se mueve la PREGUNTA y una multitud se mueve con ella sin haber
avanzado (14->45 al corregir el criterio; 45->65 cuando 252 knobs salieron del
denominador). Aqui no se mueve ni el criterio ni la doctrina, pero el
DENOMINADOR SI se mueve, por exactamente un knob: split-button cruza al 100 %
porque su knob no alcanzado SALE del ratio (`global` -> `channel`, excluida por
diseno), no porque ninguno se volviera publico. Lo que gana el alza de todos
modos es que su receta YA era correcta y el censo puntuaba ese trabajo bueno
como primitivo crudo. Misma lectura que la entrada de `tabs`, un piso mas
arriba. `reachPct` deliberadamente INTACTO: la otra victima mueve el ratio
72,7273 % -> 72,7682 %, que sigue siendo 73 — un suelo que subiera con eso
estaria citando ruido.
CIFRAS, predichas -> medidas: public 3072 -> 3073 · literal 325 -> 324 ·
channel 41 -> 42 · global 761 -> 760 · themeable 4224 -> 4223 · atHundred
66 -> 67 · ledger 1152 -> 1150 registered, 0 NEW, 0 STALE. Sobre 5187 knobs
escaneados cambian de clase EXACTAMENTE dos, y son los dos anunciados: cero
sobre-captura, medido por sonda independiente. Suite `theming-reach-floor`
verde; scope `src/uix/eidos` verde.
ANOTADO, no tocado (pre-existente, no de este lote): `scripts/theming-census.ts`
ya venia sucio de Prettier en HEAD — probado formateando la version intacta de
HEAD y obteniendo los mismos hunks desplazados +38, que es el delta de este
commit. Y `scripts/component-audit.ts:1137` arrastra el MISMO defecto de aguja
(cero victimas hoy). Las fichas generadas de split-button y palabras quedan
desfasadas hasta la proxima corrida de `--report`.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
1 month ago |
|
|
5a1492952b |
test(morfo): el censo deja de inventar lectores — la guarda de 7(a) en attrs[] y aria[]
Desde que `value` es opcional (decision 7(a), 2026-08-27) el compilador
descarta la entrada declarada sin fuente ANTES de recoger su condicion
(compile.ts:488 y :508, por delante de :496-497 y :516-517). El censo no
lo espejaba: contaba la condicion de una entrada sin value y FABRICABA un
lector. Fallaban LAS DOS ramas, no solo aria[].
Dos consecuencias, las dos medidas:
- la calibracion («the instrument agrees with the compiler»), que este
fichero declara condicion de validez de todas sus filas, caia con la
PRIMERA entrada sin value que llevara condicion. Trampa armada y sin
detonar: hoy son 0 de 134 attrs y 0 de 860 aria.
- y la grave: el uso fantasma TAPABA el gate de huerfanas. Medido sobre
accordion — retirado el value, la registracion viva de
accordion-provider.svelte.ts:318 que el runtime ya no leeria se
quedaba VERDE. El gate de componente y el de parte iban
desincronizados; la guarda los alinea.
La guarda espeja la de data[], que lleva ahi desde siempre.
Anade el NEGATIVO permanente que las dos guardas necesitan: llegan
inertes (cero entradas sin value en el arbol) y un guard que inspecciona
vacio pasa. Se vio ROJO sobre el arbol pre-guarda antes de verse verde
aqui — la mitad del compilador pasaba ya, la del censo era la que
reventaba, que es el eje bajo prueba. Es el detector entero: nada mas en
el fichero cazaria la retirada de las guardas.
Cabecera: la cifra de UNCERTAIN decia SEIS y son TRES. El seis era
honesto cuando se escribio; la caida esta DENTRO de
|
1 month ago |
|
|
7e23fe53be |
docs(process): C+ COMPLETO Y VERIFICADO — gate 5207 verde, morfo-check 161/161 con el gate ARIA dentro
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
1 month ago |
|
|
445ca917e0 |
refactor(morfo): la union por AST de keyboard-deps se RETIRA del censo - compile la recoge desde 3a394c1d4
La retirada que la cabecera del censo esperaba con fecha, ejecutada con la prueba que ella misma definio: deadPerPart = 0 con la union fuera = la recogida de collectConditionDeps sobre los KeyboardPlans esta completa (los 5 deps historicos + los que el wave keyboard sumo). La mitad requiredSources queda DELIBERADA en el censo (compile.test pinea 'leaves requiredSources to the census'): el bucle de usesOf permanece como modelo de esa mitad — retirarlo re-orfanizaria las fuentes que esas condiciones leen. Deuda nombrada de la firma C: SALDADA en su mitad compilador por el carril P1; comentarios de ambos sitios reescritos a la verdad nueva. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
1 month ago |
|
|
0da97636bd |
docs(morfo): la fila keyboard dice la arquitectura C+ — declaración única, ejecución por especies, dispatcher como conveniencia de hoja
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
1 month ago |
|
|
3a394c1d4f |
feat(soma)!: C+ cierre — actions POR REGISTRACIÓN (sidebar deja de rodear su propio mecanismo) y compile recoge las deps de teclado
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>
|
1 month ago |
|
|
39f7dd1ed3 |
docs(process): C+ tanda de especies completa (4 primitivos, 4 commits) — bolsa de decisiones de autor consolidada
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
1 month ago |
|
|
5436fa2971 |
feat(soma)!: C+ especie 4 — value-step: las flechas que mueven un VALOR son UN primitivo
Cuarta especie del veredicto C+ (
|
1 month ago |
|
|
4cad87c24a |
feat(soma)!: C+ especie 3 — highlight-walk: el cursor virtual del trío activedescendant es UN primitivo
Tercera especie del veredicto C+ (
|
1 month ago |
|
|
2f09c7a798 |
feat(soma): mini-lote de fuentes desbloqueadas — las 5 formas curadas se alimentan y las manos mueren
Carril fuentes de la adjudicacion unificada (fila-cero b-ii; ciclo previo 84bbe1d3d; las curas de forma en |
1 month ago |
|
|
271c79dea2 |
feat(soma)!: C+ especie 2 — segment-walk: el paseo entre segmentos de los 3 fields es UN primitivo
Segunda especie del veredicto C+ (
|
1 month ago |
|
|
b105421104 |
feat(soma)!: C+ especie 1 — grid-walk: el paseo 2D de los 4 calendarios es UN primitivo
Primera especie del veredicto C+ (firmado b54bb3ad0: la ejecución de
teclado converge en primitivos por especie). El censo midió ~90 % de
máquina compartida hand-rolleada ×4; ahora:
- soma/keyboard/grid-walk.ts: gridWalk<T>(event, from, opts) — puro y
genérico sobre la UNIDAD del host (DateValue, {year,month}, number).
Devuelve false en teclas ajenas (un Popover envolvente sigue viendo su
Escape). Flechas 2D con dir lógica (RTL voltea X) · Home/End vía
bounds() del host · PageUp/Down con evento (los calendarios leen
shiftKey) · compare() decide el SENTIDO del cruce por ORDEN (jamás por
tecla) · isOutsidePage/showPage = la máquina de bordes con hop ·
onLand ANTES del giro (orden embarcado) · salto de foco unificado
(queueMicrotask + attr tipado + dom.focus). Enter/' ' NO entra: los 4
comprometen distinto — un commit no es un paseo. ~78 líneas de doctrina
a propósito.
- 4 providers = delegados finos (−58 en ejecutores; calendar −16,
range-calendar −12, month-grid −14, year-grid −16). Los Shift+ de rango
y Escape quedan en range-calendar (especie propia).
- CERO tests re-firmados (ninguno pineaba máquina interna — los dos de
teclado ya extraían conducta). +9 casos en grid-walk.test.ts, cerrando
un hueco PREEXISTENTE: month-grid y year-grid no tenían NI UN fichero
de test client.
- Censo focus: la señal getDirectionalKeys+dom.focus la absorbió el
primitivo — la red reconoce gridWalk (+6) sin debilitarse. Los 4 morfos
actualizan su executor.custom a la verdad nueva: ejecutado por el
primitivo 2D COMPARTIDO, no el RovingFocusGroup 1D.
- De paso mueren los 4 selectores morfo-targeting a mano
([data-calendar-day] etc.) → attrs tipados de createAttrs (la ley del
builder).
AMBIGUOS retenidos con acta (no unificados en silencio): Home/End de
month/year-grid = PÁGINA ENTERA (lo declarado y lo embarcado; el brief
suponía fila) · los DOS calendarios difieren en la puerta del borde
(min/maxViewValue y announceNavigation solo en calendar) — conservado en
sus callbacks · Shift+PageUp/Down ±1 año sin declarar (clase modificador
del censo keyboard) · skip de disabled: NINGUNO de los 4 lo hace.
morfo+keyboard 285/285 · calendar/range-calendar client 19/19 · census
109/109 · check 71. Constructor Opus 5, sesión coordinando y verificando.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
1 month ago |
|
|
9cca75a3ef |
docs(process): fila cero CERRADA (4 commits, cosecha a CERO, pase ARIA gatea) — cola descongelada, C+ arranca
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
1 month ago |
|
|
5027c135fb |
feat(morfo)!: la ARISTA es ley — instrumento composition-aware, residuo a cero y el pase ARIA GATEA
El instrumento de la fila cero, en su forma magra firmada por ambos carriles: la identidad del compuesto YA viaja por la tubería única (cada parte compuesta estampa su attr identificador namespaced en el mismo elemento), así que morfo-check resuelve la arista desde los ATTRS CO-LOCALIZADOS — la cláusula del pase data («allow other components' part attrs») generalizada al ARIA que esas partes declaran. Cero superficie nueva de contrato. Índice de 919 attrs con guardia de colisión ruidosa (cero hoy, medido). Límites DECLARADOS en el header: ARIA de consumidor sigue flagged (search-field) · lo que no monta es invisible (clase RateButton) · dos-contratos-mismo-attr = check futuro nombrado. Disparador NOMBRADO para el marcador explícito: si el flip bidireccional del censo de fuentes destapa filas que lo estático no adjudica. Resultado medido: cosecha 258 → 16 → CERO (la clase de composición cayó al 100 % por construcción; dos pasadas byte-idénticas + confirmación con gate armado: 161/161, exit 0). El residuo, adjudicado leyendo: - card-group: la causa raíz era UN STRIP — la eidos amputaba data-collapsible-trigger/content «para que solo pinte Button/grid» (comentario literal). El attr identificador ES contrato, jamás un toggle de estilo: RESTAURADO, y el conflicto de pintura se resuelve con la arista EN CSS — collapsible guarda sus 4 bloques de trigger con :not([data-button]) (un Button del sistema trae su pintura — §15, el canal sigue al dueño) y card-group neutraliza el padding con el selector de DOS attrs [data-collapsible-content][data-card-group-content] (la arista como selector, especificidad 2). Verificado en vivo: pintura de Button intacta, padding 0, clip del colapso conservado, ambas aristas presentes. (El no-toggle con dispatch sintético es limitación de sonda — el Collapsible plano tampoco; perm-check con clicks reales lo ejercita.) - gradient-builder.angle-dial: forma de parte corregida — era un WRAPPER de layout declarando role slider + trío de un elemento que eidos renderiza como div contenedor del <Slider> compuesto (el Slider posee su semántica en SUS partes). - table demo: la celda FALSA deja de reclamar data-table-cell (attr de parte sin su parte = mentira al instrumento); su pintura prestada queda re-escrita demo-side. - Excepciones FIRMADAS ×2 con dueño de la cura: search-field.input ×3 (harness combobox escrito por LA DEMO) · palabras.status aria-live (la eidos escribe el div a mano por su propia doctrina 4.1.3 — fila del eje palabras). FLIP: el pase ARIA deja de ser advisory y GATEA (la ley P0: el gate se arma DESPUÉS del cero). La maquinaria advisory queda documentada como patrón de rollout de la casa para el próximo pase. morfo 264/264 · confirmación gateada 161/161 exit 0. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
1 month ago |
|
|
84bbe1d3df |
feat(soma): lote L6+L1p del carril fuentes — 19 attrs prometidos llegan al DOM por la bolsa
Ejecución de la adjudicación unificada (veredicto fila-cero b-ii del autor, 2026-08-27; dossier en scratchpad). 19 filas «registrar la fuente y retirar la escritura manual» en 11 providers: L1 tooltip.disabled (data-disabled + aria-disabled emiten por fin — el defecto vivo que abrió el expediente) · L6a table x6, tree-view x3, grid-list x1 · L6b navigation-menu, carousel, stepper x2, timeline, color-field, command, drag-drop. Constructor + adversarial Opus ultra, sesión coordinando. tooltip.css:183 NEUTRALIZADA con acta: la regla estaba MUERTA (el attr nunca llegó al DOM) y su body viejo (pointer-events:none heredado) mataba el control ENVUELTO al revivir — contrafactico MEDIDO por el adversarial (body viejo inline => 0 clics al boton envuelto; sin el => 1 clic; con tooltip habilitado + body viejo => 1 clic: la muerte era especifica del estado). disabled en Tooltip = «no se abre» (gate JS), jamas «el control esta muerto». PENDIENTE DE AUTOR: el archetype del sistema (archetypes.css:86-89) SI casa ahora (cursor not-allowed + opacity 0.4 heredada sobre el control vivo) — fila de decision presentada. Adversarial: C1/C4/C5/C6 CONFIRMADOS (18/19 filas en Chromium real con puntero de verdad — page.mouse, no page.click, que se niega ante aria-disabled; la 19a sin superficie de demo, cubierta por test de provider y forma identica viva; la mordida del String() en condiciones probada por mutacion con sha256). C2(d) refuto el cursor (venia del archetype, no de la regla neutralizada) y C3 las cifras del censo (el arbol se movio DOS veces bajo el lote: |
1 month ago |
|
|
c0c03818cb |
fix(morfo): las 5 filas verificadas del carril de fuentes + L5 por el precedente aria-rowindex
Cinco veredictos VERIFICADOS heredados del carril de vicen-e1 (citas en su
exec-l6-informe §2-3) + las 2 L5 que su constructor midió inexpresables:
- tree-view branch+item aria-selected: la forma de table.row (propRef +
condition prop-truthy selectionEnabled + optional) — aria-selected
AUSENTE sobre treeitem significa «no seleccionable» (APG); la forma
vieja (literal-si-selected) mentía en multi-select. La migración de la
fuente queda para el carril de fuentes (forma lista, mano en su sitio
mientras tanto — sin regresión interina).
- tree-grid y grid-list row aria-selected: misma condición (la nota del
propio provider en tree-grid:617 lo pedía).
- css-field: aria-valuenow ← propRef('valueNumber') — DOS refs para DOS
valores (número parseado vs cadena CSS entera); una fuente para ambos
solo podía mentir en una dirección u otra.
- password-field data-strength gana emit:'value' (precedente chronos ×5):
sin él compilaba a html-presence y BORRABA el score que la receta CSS
selecciona — desbloquea la registración de strength del otro carril.
- L5 (la cura «attr sin value» resultó INEXPRESABLE — value obligatorio,
tsc citado por el constructor): cerrada por la vía del precedente
aria-rowindex — el REF nombra lo computado y el provider lo registra:
tree-view aria-level ← propRef('level') con level: depth+1 registrado
(×2, branch e item) · table.cell aria-colindex ← propRef('index') con
index: colIndex+1 registrado. Las manos correspondientes RETIRADAS —
tubería única (ley P0); ensanchar value a opcional queda como decisión
de autor NO tomada.
morfo 264/264 · clientes tocados 23/23.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
1 month ago |
|
|
216ac01163 |
feat(morfo)!: fila cero ejecutada — los 35 espejos de composición se RETIRAN; la arista es la verdad única
Veredicto del autor (dossier unificado, fila cero, confirmado en ambas
sesiones): doctrina COMPOSITION-AWARE — cuando una parte anfitriona
comparte su elemento con un componente compuesto, el ARIA de ese elemento
pertenece al morfo del compuesto; el anfitrión no declara nada que no
posee. TODO espejo cae, incluidos los 13 literales «inofensivos» (un
espejo inofensivo es la semilla de la próxima deriva).
- 35 retirados, no 32: el instrumento del dossier (mirrors.mjs) era ciego
a la forma `{ attr: 'role', value: literal }` — los 3 invisibles
(card-group title/content/item role) estaban adjudicados comp:true por
su propio compo-final.json; dejarlos era medio espejo. La aritmética
cuadra con §1.3: 47 añadidas − 5 ciegas − 1 hotfix = 41 = 32+9.
- 6 `states:` retirados de rebote (único consumidor un stateRef retirado,
sin registro en ningún provider).
- Conservado con acta: aria-label de reaction-add (naming del anfitrión) ·
role:'button' preexistente · las entradas PREEXISTENTES de
natural-time-picker/split-button que el wave no añadió · las 9 propias
del anfitrión, verificadas una a una.
- chat-message.reaction-add: cae también el aria-haspopup literal que el
hotfix
|
1 month ago |
|
|
3fa4b7954f |
docs(process): hotfix f48acab37 + dossier unificado COMPLETO y presentado — ley de wave en cabecera
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
1 month ago |
|
|
168a0fba03 |
fix(morfo): source-census fix-2 - la particion c1a/c1b deja de mentir (14 filas re-particionadas)
Hallazgo del dossier unificado: el clasificador c1a probaba la escritura manual solo sobre ficheros que REGISTRAN fuentes - se le escapaban el atributo de plantilla y el eidos que pinta sin registrar. 14 filas c1a eran c1b disfrazadas (field-langs x5, onion-menu x4, menu-dial x2, metrics x2, dialog aria-label), cada una con su sitio de escritura citado. Particion: c1a 31->17, c1b 41->55, c2 17; advisory 89 (la cadena completa: firmado 78 -> wave1 +12 fabricadas 90 -> hotfix
|
1 month ago |
|
|
f48acab379 |
fix(morfo)!: hotfix regresión del wave 1 — reaction-add retira el espejo de aria-expanded
El stateRef('open') sin fuente registrada emitía 'false' CONSTANTE (modo
aria-boolean: nunca se retira) y la bolsa, última en el mergeProps del
componente, PISABA el valor vivo del Popover compuesto que llega por
restProps. Cadena trazada por el dossier de vicen-e1 y verificada aquí
salto a salto + en navegador real: cerrado='false', clic → popover
montado y aria-expanded='true'. El estado de disclosure pertenece al
Popover compuesto; el espejo se RETIRA (con acta en sitio) y el juicio
espejo-vs-composición queda en la fila cero del dossier unificado.
aria-haspopup se queda: literal idéntico al del popover, no puede mentir.
Gemelas auditadas del mismo commit 338c49d67: chat-list.item (stateRef
'selected') y chronos peek (stateRef 'open') quedan LATENTES — sus
composes ponen la bolsa compuesta ÚLTIMA y el valor verdadero gana;
card-group es eidos-scope (sin runtime, nada emite). Las tres van al
dossier como evidencia de la fila cero, no como fuego.
morfo 263/263 · chat-message client 4/4.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
1 month ago |
|
|
c8db4c8d64 |
docs(process): gobernanza unificada confirmada por el autor — wave 1 anclado, cola en pausa hasta el dossier
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
1 month ago |
|
|
338c49d675 |
feat(morfo): wave 1 de la cosecha ARIA — 232/258 adjudicados leyendo la fuente; la clase de composición queda ABIERTA
Cosecha advisory (258, byte-idéntica ×2) adjudicada por hallazgo contra provider/eidos/demo, jamás a ciegas: - 183 declarados (regla A4: la declaración alcanza, con la fuente REAL leída — propRef/stateRef/ariaBoolean/attr-sin-value según posea soma). - 32 declaraciones corregidas: los tríos aria-value* required-sin-condición codifican ahora CUÁNDO se emiten (condition/severity leídos del provider). - 17 fuentes corregidas: aria-hidden decorativo que eidos perdía (chart ×3, metrics, qr-code) + range-calendar deja de escribir aria-multiselectable en soma (la bolsa lo posee — tubería única; techo del audit intacto). - chronos entero (120): roledescription declarado (propRef con acta — un morfo no compila translationRef ajeno) y dropeffect con el acta de deprecación precedente de drag-drop. - 26 AMBIGUO con causa verificada, NO tocados: 6 aria-controls hacia contenido de compuesto innombrable por partRef · calendar month/year select con DOS renderizados de una parte (declarado, medido, REVERTIDO) · 3 escritos por LA DEMO · 5 celda falsa de la demo de table · 3 angle-dial (forma de parte) · 1 palabras.status (componer haría live-region la barra entera, contra su propia doctrina 4.1.3). ABIERTO PARA EL DOSSIER UNIFICADO (gobernanza firmada por el autor 2026-08-27: esta cosecha y el advisory de fuentes de vicen-e1 se adjudican JUNTOS): el 74 % de la cosecha es UNA clase — ARIA de componente compuesto sobre el elemento que la parte anfitriona comparte. Resuelto aquí espejando (la regla vigente), pero cada espejo duplica el contrato de otro morfo; el juicio espejo-vs-instrumento-composition-aware es del dossier. El pase advisory NO se voltea a gate hasta ese juicio. Insumo completo del dossier: scripts/__wave1-aria-resultado.md (scratch). Trampas medidas en el cuerpo del insumo: literal-sin-condición escribe incondicional (guarda = prop-equals; prop-falsy NO sirve sin fuente). morfo 263/263 · server 1129/1129 · client 12 providers 74/74 · check 71 · translations 0. Ejecutado por agente Opus 5, sesión coordinando. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
1 month ago |
|
|
d1e955eef7 |
feat(soma)!: la GRIETA cierra — states/parts rompen en el tipo y el censo de fuentes vigila el resto
Firma C del autor (2026-08-27), ciclo completo con agentes Opus ultra
(expediente + C1 censo + C2 tipos + adversarial + C1-fix), sesion
coordinando y supervisando.
LAS DOS MITADES. (1) TIPOS: StateNameOf<M> desde part.states[] (terminador
de profundidad con su consecuencia escrita; degrada a string sobre el Morfo
ancho, jamas colapsa a never) y PartKebabOf<M>, estrictos en nivel
componente y nivel parte, con la clausula [Names] extends [never] ? never
(molde de dir?: never) — que cazo en compilacion un QUINTO defecto que
ningun censo podia contar: knob registraba states:{} sobre un morfo sin
estados. props queda SourceMap CON ACTA en el propio tipo (v.propRef tira
el literal; generificar arrastra 3 builders en fichero de otro eje) y un
type-test con 4 @ts-expect-error como guard permanente — el negativo de A1
reproducido en compilacion. (2) CENSO source-census.test.ts: 2 GATES
(huerfana nueva - fuente muerta per-parte nueva) + 78 filas advisory
c1a/c1b/c2 nominales para adjudicacion del autor + excepciones-vivas +
negativos PROBADOS en rojo.
Defectos REALES retirados (cada uno verificado sin regresion en navegador
real por el adversarial): button states.loading (error de CUBO — el morfo
lee loading como PROP; vivia de la duplicacion; data-loading intacto,
SSR incluido por curl) - tabs states.value y radio-group states.value
(huerfanos: nada los consumia) - media-player rate-button props.label
(fuente muerta con comentario falso; el aria-label resuelve por
translationRef) - knob states:{}.
Adversarial: 5 CONFIRMADOS + 2 parciales. El material: el descubrimiento
del censo ignoraba los .part() con parte por VARIABLE (9 sitios, no los 5
que el propio adversarial conto) => >=4 filas falsas en advisory y un
unreadable=0 que mentia. C1-fix con CONVERGENCIA contra el censo
independiente del adversarial: keys 729==729, props 602==602, orphans
20==20 fila a fila; el delta restante 100% definicional nombrado; las
filas alimentadas por spreads opacos se estampan UNCERTAIN en vez de
afirmarse. Mordidas verificadas con plantado y restauracion por sha256
(typo nuevo => check lo nombra con linea exacta; check en los 71 de linea
base EXACTOS, todos en web/).
TRES COMPROMISOS vigentes (acta en el tipo y en next-features):
(i) generificacion de stateRef/propRef/mapRef como eje propio al liberarse
types.ts — cierra props (594/729); (ii) flip del censo a gate BIDIRECCIONAL
cuando el autor adjudique las 78 filas (el tooltip deshabilitado mudo esta
ahi); (iii) wave c1b->bolsa (36 escrituras manuales) bajo la ley de
unica-tuberia de P0. Deudas nombradas: keyboard[]-deps invisibles a
CompiledPart.deps (poblacion CRECIENTE, dato vicen-42; el censo las une por
AST con retirada fechada; secuenciar con el dueño de compile.ts) -
StateNameOf en runtime (casa natural morfo/selectors.ts) - label del
rate-button huerfano (anotado) - MediaPlayer.RateButton no se renderiza en
ningun sitio del repo (hallazgo lateral).
Convivencia: types/schema/compile/resolver INTACTOS (wave ARIA del peer
aterrizado antes,
|
1 month ago |
|
|
b54bb3ad0c |
docs(process): las 3 decisiones de arquitectura FIRMADAS por el autor — cola de waves fijada
1/3 keyboard C+: declaración = contrato único; ejecución converge en PRIMITIVOS POR ESPECIE (grid-walk, segment-walk, highlight-typeahead, value-step) + actions por registración. 2/3 server-only: *.server.ts nativo en la PUERTA de cada motor svrs, alias absorbe el rename, censo como segunda capa, ley del tier. 3/3 foco: la unión gana walk / activedescendant / slider / segments — la taxonomía de foco CALCA la de los primitivos C+ (dos contratos, una taxonomía). Premisa que rige las tres: «lo mejor para la arquitectura, coherencia y diseño INDEPENDIENTEMENTE de lo que cueste». Cola: cosecha ARIA → C+ → kinds → server-only, cada wave sobre árbol asentado. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
1 month ago |
|
|
f00d1fc10e |
docs(process): P1 — cosecha ARIA advisory FIRMADA: 258 hallazgos en 32 morfos, byte-idéntica entre pasadas
161/161 PASS en caliente (los 2 fríos = clase documentada). Dossier de 5 clases en el handoff; chronos concentra 120/258 (roledescription ×59 + dropeffect deprecado ×42). El wave de adjudicación es el siguiente ejecutable y ESPERA al C2 de vicen-e1 (orden por canal); el flip del pase a gate va al final de ese wave. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
1 month ago |
|
|
17c6adddcb |
feat(morfo)!: P1 — split attrs[]/aria[] y vocabulario ARIA cerrado: cada cubo su territorio
El cubo aria[] mentía un 13,5 %: 989 entradas medidas — 847 aria-*, 8 role, y 134 impostores (type ×130, tabindex ×2, for, contenteditable). - MorfoPart.attrs[]: cubo nuevo para atributos HTML genéricos, misma forma de entrada y mismo compilado (un solo builder para ambos cubos). - aria[] se CIERRA por tipo: MorfoAriaAttr = 'role' | unión del spec (53 nombres, DERIVADA del array ARIA_ATTR_VOCABULARY — nunca lista paralela, la lección MorfoElement). aria-grabbed/aria-dropeffect deprecados-en-1.2 con acta (verdad embarcada de drag-drop); braille*/description son 1.3 y entran anotados. Un typo muere en el tipo. - Esquema guarda el territorio en AMBAS direcciones: aria[] con no-aria LANZA sugiriendo attrs[]; attrs[] con aria-*/role o data-* LANZA. - Codemod: 134 entradas movidas en 62 morfos (133 bloques). Orden de emisión MEDIDO y conservado: data → attrs → aria (132/133 bloques declaraban el impostor como prefijo contiguo de aria[]); snapshot de los 921 parts × 168 morfos: 920/921 byte-idénticos — la única divergencia (breadcrumb.ellipsis, type tras un aria-label consumerWins) no cambia la bolsa renderizada. - Consumidores de part.aria censados: compile/resolver/schema actualizados; morfo-check pierde un filtro MUERTO (el cubo ya llega cerrado por tipo+schema); landmark-census y tests de la mitad aria sin cambio. - morfo.md documenta los dos cubos. 13 tests nuevos (8 schema territorio + 5 compile paridad). morfo 262/262 · soma entera 1314/1314 · check 71. Nota de árbol compartido: src/uix/morfo/source-census.test.ts (sin trackear) es el eje SourceMap de vicen-e1 y NO viaja aquí (add -u); su censo re-medirá sobre este árbol asentado, orden acordado por canal. Ejecutado por agente Opus 5, sesión coordinando y verificando (guardas de territorio probadas en vivo, suite re-corrida). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
1 month ago |
|
|
da9f342c61 |
feat(scripts): P1·A11Y — morfo-check gana el pase ARIA en modo ADVISORY
Presencia de entradas aria required SIN condición · role declarado vs renderizado · aria-* sin declarar (tría A-85 del consumidor exenta: aria-label/labelledby/describedby). Imprime y cuenta APARTE, no gatea: la cosecha se adjudica primero y entonces se voltea a gate (la lección de P0 — medir, adjudicar, y solo después armar). El handoff registra el estado P1 completo con deudas nombradas. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
1 month ago |
|
|
e15caf9c92 |
feat(morfo)!: P1 — wave keyboard: dos poblaciones en el tipo, prop-equals, y las verdades del censo ejecutadas
Censo previo (agente Opus): 460 entradas / 68 morfos; el mecanismo del morfo ejecuta 26 (5,7%); dos poblaciones de key: confirmadas (451 spec + 9 no-ejecutables). Este wave ejecuta las adjudicaciones firmadas: CONTRATO - MorfoKeyboard.kind: 'spec' | 'display' (default spec). spec = ejecutable contra KeyboardEvent.key real; display = prosa para tablas de docs (rangos '0-9', teclas layout-dependientes '<' '>'), jamás ejecutable. - schema: gramática de specs (modificadores + tecla nombrada o UN carácter; letra MINÚSCULA — e.key da minúscula sin Shift, 'Ctrl+B' con shift:false era INALCANZABLE). El guard se auto-validó: cazó los dos defectos reales antes de tocarlos. - MorfoCondition gana prop-equals (hermano enum de state-equals): resolver + compile deps + schema + tests. VERDADES (cita del censo en cada acta) - palabras Ctrl+B..Y → minúscula (VERIFICADO contra el handler: toLowerCase + mod en :1130 — eran spec mal caseado, no display) · '/' display (el mecanismo real es $derived del texto). - media-player '<' '>' '0-9' → display con acta (switch propio :782-794). - range-calendar Escape→cancel-selection IMPLEMENTADO (única entrada sin ejecutor del corpus): cancelPendingSelection() sobre activeAnchor sin range.end; devuelve false sin pendiente (el Popover envolvente sigue cerrando); NO gated por deselectable (abortar a medias no es des-picar). - Home/End = SEMANA en calendar y range-calendar (la declaración 'first-day-of-week' + APG arbitran — precedente radio-'both'; idioma canónico de calendar/helpers para weekStartsOn/locale). chronos YA movía por semana (el censo sobre-listaba). Ningún test pineaba el mes — solo README:196, corregido; tests de semana añadidos en ambas ramas. - table sort-trigger 'select'→'toggle-sort' (la mentira era el nombre). - combobox: Enter/' ' DUPLICADAS en item (el input maneja Enter de verdad — :424 activedescendant/custom value; item maneja ambas :786). - menu-dial: Enter/' ' de list → action (ejecutor = button nativo). - Catch-up: color-picker area-thumb (8), gradient-builder stop (10), field-langs switcher+menu (mismo handler en ambas), drawer trigger open, tooltip trigger CLOSE (espeja el click :378). - prop-equals aplicado: tabs activationMode (prop virtual, patrón submitOnEnter) + par muerto por orientación en accordion/carousel/ splitter/tabs/toggle-group/toolbar; stepper queda 4-sin-condición con acta (su trigger no expone el eje). CENSO PERMANENTE keyboard-census.test.ts (5 tests): inversa EXACTA sobre soma+eidos con las dos formas (onkeydown y claves de objeto sin comillas — la trampa path-trace/rotate-align), display⇒comentario ±3, suelos 150/68/460, gramática vía validateMorfo. Excepción firmada: UNA (pin-input, onkeydown que descarta el evento). Hoy: 0 ofensores. 174 morfos · 72 declarantes · 498 filas. morfo 241/241 · clientes tocados verdes (calendar/range-calendar/tabs re-verificados por el coordinador) · check estable en 71. Deudas NOMBRADAS: palabras implementa Ctrl+l/e/r/j y Ctrl+Shift+z sin fila en el morfo · asimetría interna de getLastFirstDayOfWeek (vendor, neutralizada con el idioma canónico) · KeyboardPlan SIGUE sin consumidor runtime — si el mecanismo de teclas del morfo crece, muere o queda como contrato+docs+censo es decisión del AUTOR (los números: 26/498 vía mecanismo, ~115 primitivos compartidos, 307 artesanal). Ejecutado por agente Opus 5, sesión coordinando y verificando. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
1 month ago |
|
|
9d4b94e757 |
feat(svrs)!: P1·SEGURIDAD — saneo de auth: split crypto real, entry testing con guard, verifyPassword endurecido, frontera censada
- Split crypto: crypto-node.ts (node:crypto) · crypto-web.ts GENUINO
(subtle+getRandomValues, cero node:crypto en su grafo; sin subtle LANZA
AuthConfigError {port:'crypto'} — el fallback silencioso web→node MUERE:
quien quiera node lo pide) · crypto-test.ts queda solo el determinista.
- Entry $svrs/auth/testing: las 12 factorías test/mock salen del entry de
producción (index.ts conserva scrypt, db y los dos cryptos reales). Guard
de producción compartido adapters/production-warning.ts (warn única
indexada POR MENSAJE — memory-store conserva su semántica exacta y su
API vía alias de tipo); constante nueva en $libs/auth/consts. 7 suites
migradas al entry nuevo. svrs/index.ts NO reexporta testing (a propósito).
- verifyPassword (scrypt): guard temprano de longitud
(> PASSWORD_MAX_LENGTH ⇒ {ok:false} sin ejecutar scrypt — anti-DoS; el
camino de signIn no pasaba por la política de longitudes) y pre-check de
longitudes ante timingSafeEqual ({ok:false} en vez del RangeError de
node con params inconsistentes).
- test/server-boundary.test.ts: censo real de importadores de $svrs/auth
en arts/uix/web (6218 ficheros inspeccionados, umbral anti-vacío, los
hits de docs son template literals blanqueados y el matcher se
auto-testea con fixtures). La convención *.server.ts NO se introduce:
decisión de framework del AUTOR, dicha en el handoff.
- Docs: authExample del docs-site deja de enseñar el hasher de test como
receta (scrypt + crypto explícito); README de auth corrige logr→logger /
timr→timer.
- Tests nuevos: scrypt roundtrip/longitud/params corruptos/needsRehash ·
cryptos web+node · entry testing con su warn. Suite auth 67/67 (14
ficheros); check estable en 71.
Deudas NOMBRADAS (no ampliadas): scryptAsync puede lanzar con params que
node rechace de raíz (catch amplio taparía fallos reales) · README:103
sigue optimista sobre validación en signIn (la política solo corre en
signUp/reset; el guard del hasher tapa el DoS).
Ejecutado por agente Opus 5 sobre medición previa citada; sesión
coordinando y verificando (index limpio, testing poblado, guards en sitio,
suite re-corrida).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
1 month ago |
|
|
8dd658c384 |
feat(soma): P1·A11Y — capa HideOthers: el modal vuelve inert al resto del documento
La capa que Radix/Bits/Reka llevan de serie y este framework no tenía: con
un modal abierto, los hermanos del camino content→body reciben `inert`
(el atributo nativo — foco+AT+puntero de una vez; aria-hidden legacy no).
- soma/layers/hide-others.svelte.ts: HideOthers.use({ enabled, ref, dom,
except }) — patrón FocusScope. Walk una vez por activación; registro
compartido a nivel de módulo (WeakMap elemento → {count, hadInert}) para
ANIDAMIENTO: dos modales sobre el mismo hermano ⇒ count 2; restaurar solo
cuando el último cierra; un elemento ya-inert de la app JAMÁS pierde su
inert por la capa. DOM vía dom.getDocument (corrección iframe).
- `except` (getter vivo, resuelto por walk): el overlay del PROPIO modal es
hermano del content bajo body (Portal monta ambos ahí) — sin except,
inert mataba el onclick de dismiss-outside del drawer (inert bloquea el
puntero; el patrón Element[] de las libs de aria-hidden existe por esto).
Skip de subárbol entero (=== o contains). Cableado con
runtime.partRef('overlay') — la resolución de partes que el runtime ya
expone; cero canal nuevo.
- Cableado: dialog (gate = su propio effectiveTrapFocus — quien renuncia al
trap quiere el fondo alcanzable) y drawer (gate = su isModal, la misma
expresión de su FocusScope). alert-dialog HEREDA (compone DialogProvider
con modal:true — la excepción ya firmada en focus-census).
- Deudas NOMBRADAS en el header: sin MutationObserver (contenido añadido a
body con el modal abierto no se inerta — fuera de esta iteración) y nota
de instrumento (premisa overlay-hermano leída de Portal, no montada E2E;
el test prueba el mecanismo del skip).
- 7 tests (hermanos inert / camino no / restore / ya-inert respetado /
anidamiento / except / except con null). layers 74/74, client de los 3
overlays 9/9, check estable en 71.
Ejecutado por agente Opus 5 (dos rondas: build + except firmado), sesión
coordinando y verificando. P1·A11Y del informe de auditoría.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
1 month ago |
|
|
e5cc05a029 |
feat(soma): P1 — part-present lee el REGISTRO VIVO; el callback a mano pasa a override
El runtime ya poseía la verdad (registrations + liveReg) pero bindings.parts
solo se llenaba si el provider recordaba cablear `parts: { x: () => id }`;
olvidarlo hacía evaluar part-present a false EN SILENCIO (la enfermedad de
deriva que este eje persigue). Ahora:
- readBindings llena bindings.parts desde el registro para cada parte que
los planes de la parte referencian (deps.parts del compilador), ANTES de
leer sources.parts/reg.parts — el feed explícito sigue ganando por orden
de escritura.
- Regla de ambigüedad: con MÁS de una registración (hermanos repetidos) el
registro CALLA — solo el provider sabe a qué hermano apunta un attr; el
callback explícito sigue siendo la única voz ahí.
- La membresía vive en arrays planos (push/splice del attachment), que
Svelte no observa: `partsRevision` ($state) se bumpea en cada mutación y
el resolutor lo toca, así las bolsas dependientes se re-derivan. Grueso a
propósito: el churn de partes es raro.
- createBindingsScratch crea el bucket también cuando deps.parts existe
(antes quedaba undefined sin feed a mano y el default no tenía dónde).
Tests (4): registro responde sin callback · el explícito gana · hermanos
silencian el registro · membresía reactiva vía protocolo de attachment
(attachRef es un attachment de Svelte — el test ejecuta attach/cleanup a
mano, las mismas llamadas del template). Suite soma 1304/1304.
Barrido de redundancia (callbacks a mano ahora superfluos en partes de
instancia única) = seguimiento, no este commit.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
1 month ago |
|
|
b549cfee59 |
docs(theming): el hash del cableado motion en el handoff - e16c14dec
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
1 month ago |
|
|
e16c14dec7 |
feat(eidos): el ritmo de revelado sube a config — primitives.motion.staggerViewport, y su regla emigra a la foundation
Firma opción 1 del autor (cableado EidosConfig.motion → CSS, la última entrada de PENDING_PRIVATE_RENAME). Ejecutada con el esquema completo: expediente + dos constructores en serie + adversarial, todos Opus en ultra, coordinación y supervisión de la sesión. El gancho --motion-stagger-each-default era FICCIÓN: nadie lo declaraba y su único consumo (motion.css:42) resolvía siempre al literal 70ms. Ahora: primitives.motion.staggerViewport: '70ms' (tipo + default + validación + contrato + emisión --motion-stagger-viewport en :root, molde floating-gap verbatim) y la regla [data-stagger] > [data-animation-trigger='viewport'] EMIGRA a renderMotionBlocks — donde vive la máquina entera del stagger. Con ello motion.css queda en sus dos gates de opacity (su veredicto structural, más verdadero), la entrada del registro cayó STALE POR MECÁNICA y el registro, a cero, se DESMONTA con acta (un guard que inspecciona el vacío es un falso verde); la historia completa cierra en canon/recipe-contract.md. E14 (70→20ms) queda APLAZADA con nombre: firma de diseño propia, mueve 8 blocks. Adversarial 9/9 CONFIRMADO: neutralidad término a término contra la línea base histórica en Chrome real con el IntersectionObserver disparando (0/0.07/0.14/0.21/0.28/0.35s en /blocks/team/preview) - override 999ms reescribe la cascada - nombre muerto inerte (5s en :root, cero efecto) - <Cascade> intacto con control positivo quirúrgico (solo el hijo estampado toma el token) - cero empates de hoja posibles (tres escritores en .css, especificidad decide) - el guard del espacio cerrado muerde por mutación - 126 tests, censo 73%/66/1152-0-0, docs 0/0. Sus reservas, con acta en changelog §57: el contrato gana DOS filas (--motion-stagger-each entra como (derived) al emitirse — clase preexistente de index/index-rev) - gates divergentes latentes - path del contrato sin pin. Correcciones del adversarial incluidas: dos citas muertas del ledger de blocks anotadas, el presente falso de component-audit.ts, y el absoluto de canon matizado. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
1 month ago |
|
|
ab54a8821b |
docs+fix: correcciones del pase adversarial (3 Opus, refutar) sobre las firmas del dia
Las tres firmas SE SOSTIENEN (A1 7/7 con 4 refutaciones fracasadas; A2 8/8; A3 8/8). Toda refutacion aceptada era de PROSA y cae aqui: fechas 2026-08-27 -> 2026-08-26 en 17 sitios (los commits son del 26; deriva de sesion) - la promesa API-frozen del CONTINUE del floating layer enmendada (los --floating-* salieron de la lista congelada con la firma SS15; era la fuente del claim de vicen-41) - CONTINUE-direction anotado al alias vivo - el absoluto falso de 5 READMEs corregido (un !important de autor SI gana al inline, congelando la geometria - medido por A2) - precision del positivo de combobox (dependiente de viewport; exacto a 1440x620) - paridad ARIA completada (aria-hidden de los dos indicadores) - ficha de radio-group: seis alias, dos regimenes - residuos de prosa del item 2 anotados - fe de erratas precisada (
|
1 month ago |
|
|
0e63de76fd |
docs(process): cierre del eje focus-first en el handoff — morfo-check 161/161 caliente, perm-check 447/454 con los 10 adjudicados ajenos (2 chips lanzados)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
1 month ago |
|
|
b00544be5e |
docs(focus): la política de foco se RENDERIZA — morfo.md/eidos.md corregidos + 27 páginas
- morfo.md: fila runtime de focus reescrita (FocusScope.use({policy}) +
RovingFocusGroup + censo), ejemplo dialog con kind:'trap', paso 5 con las
dos familias comentadas, fila 2-de-3 de focus firmada (executor + censo +
render en docs: guard más fuerte que la clase grandfather).
- eidos.md: fila FALSA «focus.trap = layout hint» retirada (nunca fue
cierto; eidos no lee focus).
- FocusPolicyTable.svelte (web/routes/uix/lib): renderiza morfo.focus —
tabla trap (kind/atrapa-Tab/initial/return/restore) y roving
(kind/parts/eje/loop/ejecutor compartido vs custom firmado).
- Cableada en 27 páginas de demo tras el h2 de Accessibility (25 por
agente + dialog/toolbar de referencia). chronos NO tiene sección
Accessibility en su página: hueco anotado en el handoff, no inventado.
- PLAN-focus-first.md: el plan del eje con sus leyes.
- CONTINUE-audit-p0.md: sección del eje ejecutado.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
1 month ago |
|
|
1151667abb |
test(morfo): censo de foco bidireccional — la declaración y su ejecutor no pueden divergir
focus-census.test.ts vigila las tres redes: 1. trap ⇒ FocusScope cableado CON policy (y trap:true exige scope); 2. roving ⇒ RovingFocusGroup o executor.custom firmado; 3. INVERSA (la regla fundacional del eje): maquinaria de foco sin declaración falla. Red: FocusScope.use | RovingFocusGroup | registro de stop | getDirectionalKeys COMBINADO con dom.focus — las flechas que mueven VALOR o highlight no son maquinaria de stop. La red inversa destapó 11 no declarados; adjudicados VERIFICANDO providers: 4 declaran (calendarios: roving 2D real) y 7 son ESPECIES fuera de la unión con acta en INVERSE_EXCEPTIONS: accordion (walk: todos los triggers tabulables), navigation-menu (disclosure, eje vivo ajeno), rating-group (slider: flechas mueven VALOR), select (aria-activedescendant), date/time/color-field (segmentos con tabindex 0 constante). Los kinds candidatos (walk/activedescendant/slider/segments) son decisión del AUTOR — registrados, jamás dodge. Mentira plantada y MORDIDA en verificación: toolbar trap:true falso + avatar roving falso ⇒ 2 rojos exactos; restore byte-idéntico. Guard anti-barrido-vacío: >150 morfos, ≥28 declarando. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
1 month ago |