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 }
2330 Commits (e2c37f8920c6b5674b5f9e9cbac8219aa89f049f)
| Author | SHA1 | Message | Date |
|---|---|---|---|
|
|
e2c37f8920 |
feat(eidos)!: un tema DICE lo que es — appearance obligatorio en ThemeDefinition, una sola fuente de verdad
|
4 weeks ago |
|
|
6505a0e095 |
docs(process): P2 eidos ejecutado — tres lotes, cuatro defectos del adversarial y la costura que va a firma
CONTINUE-audit-p0.md registra los hashes ( |
4 weeks ago |
|
|
39edbc8db5 |
feat(eidos): los bloques de tema declaran color-scheme para la superficie que pinta el UA
eidos no emitia color-scheme en ningun sitio: scrollbar-color ya cubre
las barras (archetypes.css), pero la superficie que el UA pinta y eidos
no puede estilar —el popup del <select> nativo, que el catalogo usa de
verdad: month/year select del calendar, format-select de color-field y
color-picker, range-calendar, form-auto-fields— salia BLANCA en oscuro.
Forma: `appearance?: 'light' | 'dark'` en RenderThemeCssOptions, emitido
como primera declaracion DENTRO de los bloques [data-theme] que ya
existian. La opcion viaja por el sitio que renderiza (generated-css.ts),
porque ThemeDefinition no dice si un tema es claro u oscuro. Sin
data-mode nuevo y sin ningun --nombre nuevo: renderGeneratedBaseEidosCss()
emite 5751 nombres unicos antes y despues (8034 ocurrencias; lost=[]
gained=[]), asi que la derivacion de value-channels.test.ts no se mueve.
base.css regenerado en el mismo movimiento: +2 lineas, nada mas.
Verificado en Chrome (servidor propio, /uix): las UNICAS reglas con
color-scheme del documento son las dos de eidos —`:root,
[data-theme='base-light'], [data-theme='light']` → light y
`[data-theme='base-dark'], [data-theme='dark']` → dark— y con
data-theme=base-dark el estilo computado de <html> es `dark`. El popup
nativo no se captura en un screenshot: su efecto se apoya en el contrato
del UA, no en una imagen.
web/routes/active/styles.css:8,65 ya declaraba lo mismo a mano — la
duplicacion se retira cuando se reconstruya routes (congelado hoy). La
via runtime (apply() → renderThemeCss sin appearance) sigue sin emitirlo:
decision de contrato pendiente de firma (ver
|
4 weeks ago |
|
|
598ea460e8 |
feat(eidos): index-runtime.css, el hermano de index.css sin la fundacion estatica
Hoy la fundacion se emite DOS veces en quien arranca eidos por runtime: index.css importa generated/base.css (495.701 bytes) y apply() escribe el mismo bloque como <style> (431.431 bytes) — ~463 KB duplicados y ~9.500 reglas parseadas dos veces. Los 39 consumidores de index.css viven todos bajo web/routes/** (congelado): no se migra ninguno. ADITIVO: index.css no cambia ni un byte (verificado normalizando CRLF contra HEAD); los dos custodios que lo leen —recipe-css-contract.test.ts y scripts/component-audit.ts— siguen verdes sin editarlos. El hermano es index.css sin `@import './generated/base.css'`, mismo orden; el guard index-runtime-css.test.ts compara las listas de @import de ambos y asierta que index.css contiene la fundacion (no pasa sobre vacio). El XOR de recipe-css-contract.test.ts:251 solo mira index.css: con dos entradas queda compensado por este guard, no cubierto. Costura conocida, sin cerrar: color-scheme vive hoy solo en la via estatica (base.css); apply() no lo emite, asi que quien adopte este fichero no lo recibe. Cerrarlo exige que apply() decida la apariencia desde themeContext.mode — decision de contrato, va a firma del autor. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> |
4 weeks ago |
|
|
cc586612ae |
perf(eidos): renderStaticCss se memoiza por identidad de config + breakpoints vivos
La salida depende solo de la config (readonly, clonada una vez en el constructor y nunca reasignada: un unico `this.#config =`, y todos los getters publicos devuelven clones) y de los breakpoints vivos del dom. La clave es ambas cosas: identidad de config + JSON de los breakpoints; un cambio de breakpoint falla el memo y reconstruye. Mismo resultado, distinto cuando: el test asierta que el memo devuelve EXACTAMENTE lo que devuelve renderStaticCss() directo, antes y despues de cambiar los breakpoints. Medido (adversarial, con reloj, no con vi.mock): 20 llamadas calientes 320,7 ms directas vs 82,8 ms por la clase (16,0 -> 4,1 ms/llamada; lo que queda es assertValid(), que sigue corriendo en cada llamada). En el arranque de la clase se mide UNA construccion antes y despues: la ganancia esta en el camino caliente (apply*/clear*, un editor de temas con un slider), no en el boot. La cifra «tres construcciones en el arranque de /uix» de la medida previa NO se reprodujo y no se reclama. dispose() libera el memo (~431 KB) junto con #lastAttrs. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> |
4 weeks ago |
|
|
a4cf6dbf53 |
test(theming): el anti-vacio del guard de SS16 se aprieta a su medida real
El suelo del vocabulario de sistema estaba en >100 protegiendo un valor de 1058 (5751 nombres emitidos por renderGeneratedBaseEidosCss menos los 4693 del contrato, medido hoy). Diez veces de holgura NO caza el unico fallo que este guard no puede ver de otra forma: si la fundacion deja de viajar en esa funcion - emitida una sola vez en otro sitio, por ejemplo - el conjunto derivado se vacia y cada --space-* o --color-* que escriba un arte pasa a leerse como forma publica sin dueño. Esa degradacion llega como VERDE, no como rojo: hoy soma+arts escriben CERO nombres de sistema, asi que el colapso pasaria inadvertido mientras el guard sigue diciendo que barre. Suelo a 900, pegado a la medida y no a una cifra simbolica, con la razon escrita en el fichero. Memoizar el generador es inofensivo (mismo resultado, mismo conjunto); lo que muerde es que devuelva MENOS. Nace de la coordinacion con el eje P0 (vicen-41), que entra a memoizar y a emitir la fundacion una sola vez: la peticion era un cinturon en SU verificacion, y el sitio correcto es DENTRO del guard - anti-vacio de su propia fuente. value-channels 6/6. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
1 month ago |
|
|
bd7b9ba3ef |
docs(process): fila 15 — axe-core no es «instalar o no», es CUÁNDO
Deliberacion a tres bandas. La instalacion se RETIRO antes de tocar el lock: meterla en una ventana de coordinacion habria BLANQUEADO una decision que espera firma — el hecho consumado disfrazado de logistica. La objecion «viola la dependencia cero» quedo retirada al medir (2 dependencias embarcadas, 23 de andamio: la regla gobierna lo que se embarca). Y el argumento que decide es el TIMING: axe mide el DOM MONTADO, que vive en el arbol congelado que se reconstruye, y sin conduccion de estados solo veria el REPOSO — daria verde sobre lo que nadie ha mirado, y ese verde se cita como evidencia. Forma recomendada de la firma: «si, pero no ahora», con condicion de entrada escrita. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
1 month ago |
|
|
34449a0e2d |
chore(theming): el acta del velo del drawer se retira - el centinela cazo su propia consecuencia
SS16 arreglo el velo, y la entrada `drawer.overlay-bg` del ledger paso a mentir al reves: adjudicaba el token como muerto con la razon "el velo no pinta nada hoy... mueve pixel, asi que no se arregla aqui". Ya pinta. Lo notable no es la retirada sino QUIEN la pidio: el propio centinela, solo - "STALE exception overlay-bg - the token moves now, retire the exact entry". Ese detector existe porque el barrido S1 del 25 le enseño a ver las adjudicaciones por PATRON; antes, una adjudicacion cuyo defecto se arreglaba se quedaba muda para siempre. La cadena completa en dos dias: el guard aprende a hablar, el expediente destapa el bug que la excepcion tapaba, la firma lo arregla, y el guard pide su propia retirada. Retirada con acta que conserva la razon original y la medida del arreglo (reposo 0.408471 donde leia rgba(0,0,0,0); el tema llega por primera vez). Verificado: centinela drawer 30/54 sin STALE ni no-adjudicadas, --debt 1148/0/0 sin moverse, value-channels 6/6. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
1 month ago |
|
|
4040bacc67 |
docs(process): P2 arrancado y tres leyes de coordinacion que costaron sangre ajena
La regla de las dos manos NO escala a tres (hoy dos carriles tocaron el mismo fichero con un commit de diferencia y se salvaron por zonas disjuntas, no por protocolo) · el acoplamiento puede ser por DERIVACION y no por fichero (un guard que deriva su vocabulario restando el contrato a lo que emite el generador enrojece si cambias QUE emite o EN QUE ORDEN, aunque no escribas un nombre nuevo) · y la ley del «se anduvo»: al declarar que algo se emite UNA vez, asertar tambien que cada raiz declarada resolvio a ficheros — un contador a cero se lee igual de verde estando roto, que es la familia del continue mudo de nuestro propio morfo-check. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
1 month ago |
|
|
f1f686d097 |
feat(theming)!: SS16 - el guard vive donde NACE el valor, y el velo del drawer vuelve a pintar
Firma SS16, quinta aplicacion de la doctrina "la capa sostiene la pluma, no es
la dueña". El censo, el ledger y la ley del espacio cerrado auditaban SOLO
quien LEE (recetas de eidos); quien ESCRIBE la custom property por instancia
vive en soma/arts y ningun instrumento del eje lo habia enumerado jamas.
EL BUG VIVO QUE ESTO DESTAPO — y no se parcheo, se diagnostico
--drawer-overlay-opacity era DOS especies bajo un nombre: el knob de tema (el
contrato dice 62%) y el canal del arrastre (0..1). soma escribia el canal SIN
UNIDAD sobre el nombre del knob; color-mix() exige porcentaje, la funcion caia
invalida y el velo computaba rgba(0,0,0,0): NO PINTABA. Y el inline dejaba el
knob inalcanzable para cualquier tema. Se separan: el publico se queda como
knob (nadie lo escribe en runtime), el arrastre pasa a
--_drawer-overlay-progress (sin unidad, que para un multiplicador es lo
correcto) y la receta los COMPONE - calc(knob * progress) -, asi que el
arrastre ATENUA el tema en vez de destruirlo.
Medido en Chrome: reposo 0.408471 (antes rgba 0,0,0,0) - el tema LLEGA (20%
-> 0.1318, 62% -> 0.4085, 100% -> 0.6588; antes ninguno movia nada) - el
arrastre sigue (Escape real -> alpha 0; 0/0.25/0.5/1 lineal) - control
negativo: reinyectando la escritura vieja el velo vuelve a caer, o sea que la
unidad era el SINTOMA y las dos especies la enfermedad.
⚠ Estaba adjudicado EN PROSA en theming-sentinel-exceptions.ts:815 desde hacia
dias: la excepcion se trago el bug.
LOS 18 NOMBRES A SU SITIO
Clase B (11 en command/dialog/scroll-area/toast + 4 del drawer): forma publica
sin contrato y sin UN SOLO lector en el repo - una API publicada que el
framework no consume. A --_{c}-*, y los README de soma dejan de enseñarlos
como API del consumidor: ahora enseñan LA PARTE, con la formulacion verbatim
que SS15 ya habia verificado. Clase D (tree-view, gradient-picker): tenian
lector, verificados en navegador. --scrollbar-width NO se renombro por
inercia: es una escritura sobre el unico <body>, la doctrina no le llega, y
queda REGISTRADA con su razon en vez de inventarle un dueño.
LA AGUJA - src/uix/value-channels.test.ts (fichero propio, 6 tests)
Vitest y no script, porque el gate termina en la suite y eso es lo que
convierte la doctrina en ley. Deriva el vocabulario de sistema RESTANDO el
contrato a lo que emite el generador (lista derivada, nunca a mano). Barre
NUEVE raices - las siete nuevas verificadas a cero ANTES de asertarlas - y el
quinto test asserta que cada raiz declarada se anduvo de verdad: una raiz que
resuelve a cero ficheros es la puerta que nadie habria visto.
Dos correcciones al dimensionado, por medida: el arbol tiene SEIS formas de
escribir, no cuatro, y una de las que faltaban era LA CANONICA (la
--_${component}-... que SS14 y SS15 firmaron) - un guard ciego a ella habria
dado verde sobre su propio destino. Y un barrido mas ancho marcaba en rojo un
anchor-name, que en gramatica es identico a un nombre de propiedad: probado y
REVERTIDO. El instrumento miente primero.
Mutaciones: cinco, con el arbol byte a byte identico. Incluyen las dos que
prueban lo que las correcciones añaden (una clave _ DEL contrato pasa de verde
a rojo; un --_ legitimo en blocks pasa de rojo a verde).
LO QUE EL ADVERSARIAL CORRIGIO DE MI PROPIA LEY
Dictamen: "es LEY sobre la mitad que barre, y sigue siendo PROSA sobre el
absoluto que enuncia". Cierto: decia "toda escritura por instancia" y la aguja
no mira eidos, donde viven ONCE escrituras de nombres contratados. Corregido -
el enunciado nombra sus nueve raices y DECLARA sus dos fronteras (eidos, con
su expediente abierto; web/routes, congelado); las salidas son CUATRO y no
tres (la cuarta, sistema, es verde); y el registro se queda con cuatro campos
por entrada (since, reason, destination, heldBecause) con un test que exige
los cuatro - la diferencia entre un registro y un cajon.
Y la relectura con ojo de abogado encontro DOS absolutos mas, en direccion
contraria, escritos bajo "WHAT THE GUARD DOES NOT CHECK": "por instancia" no
es decidible estaticamente (el antecedente del guard es MAS ANCHO que el de la
doctrina), y el {c} de --_{c}-* no lo comprueba nadie, solo el guion bajo.
SS18 ABIERTO, y es la respuesta medida a "¿puede volver a nacer un nombre sin
dueño sin que nadie se entere?": SI, desde eidos. 11 contratadas + 18 sin
dueño, partidas en dos especies (la fundacion generando su vocabulario, que es
legitima, y las props ergonomicas del consumidor, que no es lo mismo).
dialog-overlay-opacity es el GEMELO EXACTO del velo del drawer y sigue vivo.
No es "añadir el root": distinguir las dos especies EXIGE FIRMA.
Guards: value-channels 6/6 - recipe-css-contract + reach-floor + generated-css
55/55 - docs:check 0/0 sobre 819 - --debt 1148/0/0 - tsc 0 propios - prettier
limpio.
BREAKING: los 18 nombres publicos ya no existen; el canal se lee --_{c}-* y
sigue sin ser de nadie para fijarlo. Y consumir un --{c}-* del contrato desde
un provider es ROJO desde hoy.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
1 month ago |
|
|
839f79eeb7 |
docs(theming): el registro dice la verdad de hoy - y los DOS expedientes que faltaban existen
El handoff describia un arbol de hace horas y apuntaba a dos expedientes que
NO EXISTIAN, justo en los dos items que declaraba prioritarios: el instrumento
era el propio handoff. Reparado, con su adversarial detras.
LOS DOS EXPEDIENTES, escritos con el dimensionado medido (aguja propia sobre
2014 ficheros de soma+arts):
- next-features SS16 - A-1 "el guard vive donde NACE el valor": el censo, el
ledger y la ley del espacio cerrado leen SOLO recetas de eidos; quien
ESCRIBE la custom property por instancia vive en soma/arts y nadie lo
enumero jamas. 49 nombres en 76 escrituras: 1 token que MIENTE, 15 de forma
publica sin contrato y con CERO lectores en todo el repo (API publicada que
el framework no consume), 3 sin dueño, 30 ya --_*. Quince README de soma
llevan "## CSS Variables": cinco publican los crudos y OTROS CINCO publican
--_{host}-floating-* diciendo "esto es interno" - la misma casa hace las dos
cosas, es el acta de una migracion a medias. Es la aplicacion al eje de la
ley que HEAD
|
1 month ago |
|
|
a940706002 |
fix(theming): la sonda deja de leer ciega la geometria, y el centinela restauraba MAL siete atributos
Dos arreglos de INSTRUMENTO, el material sobre el que se apoya cada firma del eje. Ninguno clasifica: ledger 1150 - 0 new - 0 stale sin moverse. LA CEGUERA DE PROPIEDAD DE LA SONDA (scripts/__theming-probe.ts) PROPS gana CUATRO: translate, rotate, gridTemplateColumns, animationDuration - donde viaja de verdad la geometria viva. El control positivo es el criterio y sale ROJO: rompiendo a proposito el canal del indicador de tabs, la sonda de HEAD daba 0 diffs (mentia) y la arreglada da 1 NOMBRANDO la propiedad (translate 259.078px -> 0px). Suelo de ruido medido antes de atribuir: dos corridas limpias, 2859 comparaciones, 0 movidas. - transform y maskImage NO entran: arrastran el peaje de re-verificar los ~59 con ledger y transform reabre una adjudicacion del eje; van con el guard, en su propio pase (next-features SS13). El comentario lo cita. - animationDuration entra MUERTO y queda escrito como tal EN EL FICHERO: freezeMotion() inyecta `animation: none !important` y el shorthand resetea la duracion a 0s (medido en text-gradient: 8s sin congelar, 0s congelado, en los cuatro componentes probados). Una columna que no puede variar se leeria como cobertura: cerrar esa ceguera exige un pase SIN congelar, que es cambio de protocolo, no de array. Se dice en voz alta en vez de fingir verde. - Es ceguera de PROPIEDAD, no de canal: un canal cuyo efecto viva en una propiedad que siga fuera de la lista sigue igual de invisible. El comentario lo dice para que nadie lea cobertura donde hay vacio. LOS TERNARIOS DEL CENTINELA (scripts/theming-sentinel.ts) — eran SIETE El expediente decia dos y una medida posterior cinco: las dos buscaron la forma `? set : remove`. El barrido cerrado POR CAPTURA (los 7 getAttribute del fichero) encontro los siete, y el peor es el que ningun grep previo podia ver: :1279 tiene la forma `: null` y no borra el atributo - deja puesto el valor BARRIDO (data-size="xl"). Los siete restauraban por truthiness, asi que un atributo cuyo valor original era CADENA VACIA se perdia. Mutacion sobre DOM real: tres atributos corrompidos por pase (data-color, data-focus, data-size), y la corrupcion es ACUMULATIVA - no hay recarga entre claves, asi que todo lo medido despues leia un arbol que el propio guard habia mutado. El idioma correcto (comparar contra null) ya estaba en el mismo fichero, nueve lineas mas arriba, en los bucles de barrido. Verificacion: adversarial 5/5 CONFIRMADOS con control positivo independiente (otra propiedad, otro componente) y la asimetria demostrada por dos vias; censo --debt 1150/0/0, reach-floor 5/5, recipe-css-contract 43/43, canario aditivo de la sonda (card 1476 compartidos, 0 movidos, 184 anadidos), tsc 0 propios. Prettier avisa en los dos ficheros y YA avisaba en HEAD (verificado sobre los blobs de HEAD: deuda preexistente). Nota del adversarial, para el pase que traiga transform: `fab.lift` esta hoy adjudicada muerta con la razon "el guard no fotografia translate" - esa adjudicacion existe solo por el hueco que este commit cierra en la sonda, y sale cuando el guard reciba las suyas. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
1 month ago |
|
|
c91dd68bee |
fix(scripts): la estela de M0 — habia OCHO agujas ciegas al corte de Prettier, no una
M0 (`830cd7671`) curo cinco agujas del censo de theming y su cuerpo dejo tres
cabos anotados. Al tirar de ellos aparece que el defecto era mucho mas ancho:
un barrido de `scripts/` entero, con TRES ortografias de la aguja (literal
`var\(--`, cadena `'var\\(--'` y grupo `var\((--`), encuentra SEIS mas. Se
corrigen cinco y se declara la sexta.
POR QUE IMPORTA MAS QUE EN EL CENSO. La aguja del censo produce una MALA
CLASIFICACION, y una mala clasificacion al menos se cuenta en algun sitio.
Estas producen sobre todo FALSOS NEGATIVOS: el guard deja de mirar y PASA en
silencio. Cinco de las seis son de ese sentido.
LAS AGUJAS (todas con CERO victimas hoy, medido antes de tocar; se corrigen por
la misma razon que M0 escribio para las suyas sin victima: dejarlas ciegas deja
el bug armado para la proxima linea que Prettier rompa):
- `theming-census.ts:1267` `scopeFor` — LA DE CLASE VIVA, y esta EN EL FICHERO
QUE M0 DECLARO CURADO, comiendo de la MISMA tuberia (`knob.value`,
normalizado a espacios simples en :579). Escribiria alcance `root` donde la
verdad es `host`. Medido el catalogo: 5187 knobs + 1497 privados, 12 valores
llevan hoy `var( --` y ninguno contiene `palette-`.
- `theming-census.ts:2244` `valenced` y `:2246` el rol neutro — el segundo mata
el clasificador `state-layer` entero: sin match, el knob nunca se encola.
Su entrada es `base.ts`, que NADIE normaliza, y el lector de PRODUCCION de
esos mismos valores ya es tolerante (`render-css.ts` VAR_REF_REGEX).
- `theming-sentinel.ts:867` `kindOfTerm` y `:884` los operandos de
`calc/min/max/clamp` — el segundo es el caso que el propio comentario de
arriba documenta (22 longitudes leidas como numeros). Probado por
EQUIVALENCIA sobre las 4566 entradas de base.ts: 0 diferencias de kind ni de
sentinel entre HEAD y la version tolerante.
- `component-audit.ts:957 / :1137 / :1329` (R-2.6, R-4.3, R-4.6) — la 4.3 era
la peor del lote: opera sobre un valor SIN normalizar, tomado directo del
fuente, y su error se INVIERTE (falso positivo: acusa de «capa de estado
artesanal» a una declaracion que lee la del sistema).
- `__statelayer-analysis.ts:28` — NO TOCADA y declarada: su lector es POR
LINEA, asi que un corte trunca el valor ANTES de que la aguja corra. Anadir
tolerancia daria falsa sensacion de cobertura mientras la limitacion real
sigue en pie. (De paso, defecto preexistente NO tocado en :32: un
`new RegExp` con comillas DOBLES hace que su `\s` sea solo `s` y esa regex no
case nunca.)
`\s*` va a AMBOS lados donde la aguja cierra parentesis, porque el corte produce
`var( --x )`; solo a la izquierda donde no lo cierra. La tolerancia esta COPIADA
del hermano de la casa (`recipe-css-contract.test.ts:150`), no inventada.
DOS CORRECCIONES DOCUMENTALES que el pase adversarial caza:
- `component-audit.ts` ≈:1154 justificaba no usar `/g` con un mecanismo FALSO
(«lastIndex viaja entre llamadas»). Medido: un literal inline se re-crea en
cada evaluacion (`true,true,true`) y sobrevive a la bandera POR ACCIDENTE de
donde esta escrito; el arrastre es del OBJETO regex izado a const de modulo
(`true,FALSE,true`). La decision de no usar `/g` sigue siendo buena y ahora
se sostiene en su razon verdadera. El acta del censo queda como esta: sus
agujas SI estan izadas y alli el arrastre es real.
- `theming-census-debt.ts:58-59` se contradecia con su propia linea :96 tras
la reescritura de la caveat: `87 literal` -> `86` y `583 of the 1154 keys` ->
`582 of the 1150`. Verificado contando el ledger (palabras 272+86+1=359 ·
chronos 198+11+14=223 · 582 de 1150) y con `--debt` («1150 registered, 0 new,
0 stale»). La aritmetica cierra con las actas del propio fichero:
1154 −2 (`8ac23047f`) = 1152 −2 (`830cd7671`) = 1150.
CAVEAT DEL LEDGER reescrita: las claves `--palabras-*` ya NO estan «EN
CUESTION» — la clasificacion esta ADJUDICADA (canal de valor del scheme del
documento) y lo que queda pendiente de firma es la EJECUCION, no el veredicto.
Se anade el dato que faltaba y que cambia como se lee el numero: de los 117
nombres consumidos, el esquema por defecto emite 74 y **43 no los emite nunca**,
de modo que para esos el fallback del CSS ES el valor de diseno. (La particion
que yo habia dado, 75/42, era la resta equivocada: suponia que lo emitido es
subconjunto de lo consumido, y `--palabras-scheme-mark-highlight-bg` se emite y
ninguna receta lo lee.)
FICHAS NO REGENERADAS a proposito: `--only` se parsea pero `writeReport()` lo
ignora, asi que regenerar reescribiria las 171 fichas + README — 172 ficheros
mezclando todos los carriles. Las de split-button y palabras quedan desfasadas
hasta que alguien corra `--report` sobre un arbol quieto.
VERIFICADO: censo antes/despues byte a byte IDENTICO · `component:audit`
PASS 161 / NEEDS-WORK 5 / BROKEN 0, con `tmp/component-audit.md` byte a byte
salvo la linea `Date:` autogenerada · `theming-reach-floor` 5/5 verde · ningun
fichero bajo `web/` tocado (regla del autor: ese arbol se reconstruye).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
1 month ago |
|
|
eb2a62fb89 |
test(soma): el censo de la BOLSA — la parte del contrato que ya no depende de un árbol que se va
La ley nueva («web/routes se reconstruye; el guard vive donde NACE el valor»)
obliga a preguntar cuánta de nuestra verificación de contrato puede dejar de
navegar. La medida se hizo ANTES de construir, y su valor está en el límite,
no en el optimismo:
- pase (d) —aria required sin condición— es MIGRABLE ENTERO: las 281
entradas llevan value (160 literales que la bolsa emite sin fuente alguna).
- pase (a) —data required— sólo en parte: 149 de 372 NO llevan value, así
que `compile.ts:452` las salta y NINGUNA bolsa puede emitirlas jamás.
- pases (c), (e) y (f) —lo no declarado, el role real— son CERO por
construcción: comparar la bolsa con el morfo es preguntarle al compilador
si compiló. Lo que esos pases cazan viene de un escritor que NO es la
bolsa (wrappers de eidos, el consumidor, el orden de merge).
- pase (b) es el peor, y se midió en vez de suponerse: alimentando
`states: { active: () => 'a' }` la bolsa emite `data-state="a"`, fuera del
enum que su morfo declara, y ningún aserto puede quejarse porque el valor
lo puso el propio censo. UN CENSO QUE SE ALIMENTA A SÍ MISMO NO PUEDE
JUZGAR SUS VALORES.
- cobertura: 104 de 168 morfos construyen runtime; los otros 64 son
eidos-scope y 59 de ellos SÍ tienen demo hoy — un censo de bolsa los
pierde enteros.
Así que este censo hace exactamente lo que la medida sostiene y NADA MÁS:
verifica la emisión de lo que la bolsa posee, sobre 921 bolsas reales y 1249
planes (0 vacías), con listas de excepción cuyo TAMAÑO es la afirmación, y
con los límites ESCRITOS uno a uno en su cabecera — incluido el que sólo se
nombró al refutarlo (un literal declarado MAL es invisible aquí: la bolsa ES
ese literal). El instrumento de rutas sigue siendo el único testigo de todo
eso mientras el árbol exista, y ahora está dicho dónde deja de serlo.
Adjudicado del adversarial: el conteo EXACTO de 37 pasa a SUELO — la
población es abierta y declarar un literal más habría puesto rojo el censo
sin defecto de contrato detrás.
8 tests verdes; 3 rojos plantados y reproducidos carácter a carácter.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
1 month ago |
|
|
05dcb4db79 |
docs(process): LEY — web/routes congelado, y la consecuencia: el guard vive donde NACE el valor
El arbol de rutas se reconstruira, asi que escribir ahi es trabajo que se tira. Leerlo como evidencia sigue valiendo. La consecuencia mayor no es de alcance sino de METODO: morfo-check, permutation-check y component-audit validan NAVEGANDO a web/routes/uix/components/<kebab>/+page.svelte, de modo que el 161/161 que este handoff cita mide un arbol que se va — no es evidencia sobre el contrato. Lo construido en src/ sobrevive; lo apoyado en la ruta, no. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
1 month ago |
|
|
22278ee7d4 |
docs(process): P1 CERRADO — kinds de foco, server-only y el gate en 5239 verde
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
1 month ago |
|
|
64ead84072 |
feat(svrs)!: decisión 2/3 — la barrera server-only vive en la PUERTA de cada motor, y la hace cumplir el build
Firmada por el autor (
|
1 month ago |
|
|
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 |