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 }
268 Commits (468a9d1134d697546f1b36231d6773d6324a5faa)
| Author | SHA1 | Message | Date |
|---|---|---|---|
|
|
468a9d1134 |
style: prettier de una sola vez sobre el repositorio (F5 del cierre, parte 3)
Formato puro: `npm run format` (dos pases; siete ficheros no convergían en el primero) sobre todo lo que .prettierignore no excluye (web/ congelado, .claude/, artefactos generados). Este commit va en .git-blame-ignore-revs. Neutralidad medida fichero a fichero, compilando y minificando con esbuild (y con el compilador de Svelte, cliente y servidor, para .svelte) la versión de HEAD y la formateada: 1 031 ficheros de código idénticos; 9 CSS que solo difieren en espacios pegados a un paréntesis (`var( --x )` frente a `var(--x)`), que CSS no tokeniza como significativos; 510 Markdown sin compilación posible (docs:check los valida). Los dos generados y el guard que dependía del formato se resolvieron en el commit anterior. Verificación sobre este árbol: npm run lint exit 0 · gate entero verde salvo focus-census, arreglado en el commit anterior y re-ejecutado (9/9): check:gate OK (src/ y scripts/ a cero) · docs:check 0/0 · arts/blocks/packs/rtl/ translations/agent · eidos:lint 0 inválidos · apps:check (boot 27/27, 0 errores) · suite 465/466 → 466/466 con el guard corregido · build de la raíz exit 0. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
3 weeks ago |
|
|
e31ac3ce35 |
chore(gate): scripts/ entra en el comprobador de tipos y debe cero como src/; fuera csstype, esm-env y generate:contracts-docs; prettier ignora web/ y .claude/ (F5 del cierre, parte 1)
Preparación del formateo de una sola vez, en un commit aparte para que ese commit sea formato puro y quepa en .git-blame-ignore-revs. - scripts/ nunca se había tipado. svelte.config.js lo añade al include de Kit; tsconfig.json excluye las sondas de agentes (scripts/__*: el exclude de la raíz pisa el que genera Kit, por eso va ahí). Medido: 7 errores en 4 scripts, todos de tipos. Arreglados sin casts nuevos: tres casts que el compilador rechazaba (component-audit, docs-vocabularies) y un Set tipado estrecho (morfo-vocabulary-check, 3 errores) — el JavaScript que emite esbuild para esos tres scripts es byte-idéntico antes y después. add-contracts-imports.ts es una migración muerta (apunta a $terra, capa borrada): sus 2 errores se arreglan (index ?? 0, e instanceof Error) y borrarla es decisión del autor. - check-gate.ts: src/ y scripts/ deben cero (un ledger no puede absolverlos). Visto fallar: con un cast roto en docs-vocabularies, exit 1 «src/ and scripts/ owe zero»; restaurado byte a byte. - package.json: fuera generate:contracts-docs (su script no existe) y las dependencias csstype y esm-env, que nadie importa (esm-env sigue como transitiva de kit y svelte; npm ls lo confirma). - .prettierignore: web/ (árbol congelado) y .claude/ (configuración de la herramienta, incluido settings.local.json del autor). Verificación: check:gate OK (89 de web/ dentro del ledger; src/ y scripts/ a cero) · morfo:vocabulary exit 0 · docs:check 0/0. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
3 weeks ago |
|
|
9254bcc15e |
refactor(build): un solo mapa de alias — uix.aliases.js lo importan vite.config.ts, svelte.config.js, el compilador del boot y docs-check; muere la copia a mano (F2 del cierre)
La tabla de alias (38 entradas) estaba escrita dos veces, en vite.config.ts y a mano en svelte.config.js, y dos scripts la sacaban de vuelta de la config de Vite con una regex (generate-boot.ts y el invariante 8 de docs-check.ts). Una app del workspace habría sido el cuarto sitio. Ahora vive UNA vez en uix.aliases.js (raíz, .js con JSDoc porque Node carga svelte.config.js sin bundler): UIX_ALIASES con rutas relativas y resolveUixAliases(root) con las absolutas, en el mismo orden. Las dos tablas eran idénticas en claves, valores y orden (comprobado antes de sustituirlas). El orden es contrato: Vite y esbuild casan un alias de cadena por prefijo y SvelteKit se los pasa en orden de inserción (leído en @sveltejs/kit/src/exports/vite/utils.js), así que $svrs/auth/testing y $svrs/auth van antes que $svrs. src/uix/aliases.test.ts lo guarda junto a lo demás: cada destino existe (anti-vacío ≥ 38), resolveUixAliases conserva orden y rutas, ninguna config vuelve a llevar una copia, y el tsconfig generado por SvelteKit tiene paths para cada entrada. Visto fallar: con $svrs delante de $svrs/auth, 1 rojo (restaurado byte a byte). svelte.config.js gana kit.typescript.config para que svelte-check incluya el módulo. readViteAliases muere sin shim; pack.test.ts importa el módulo. CLAUDE.md y AGENTS.md dicen dónde vive la tabla (la sección de AGENTS.md listaba alias que ya no existen). Verificación: aliases.test + pack.test 6/6 · generate:boot byte-idéntico (esbuild recibe el mismo mapa) · docs:check 0/0 · check:gate OK (src/ a cero; 89 en web/, dentro del ledger) · suite entera 464 ficheros / 5 442 tests, exit 0 · npm run build de la raíz exit 0. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
3 weeks ago |
|
|
29e581c721 |
feat(active-uix)!: el boot lo compila el build del SITIO con su propio esquema, y lo que UIX escribe en <html dir> lleva marca de propiedad (fila 2 del boot, F1 del cierre)
F1 del plan de cierre del framework. Cierra el último trabajo del eje boot.
EL DEFECTO. El boot por defecto compilaba un catálogo de preferencias de UN
solo idioma (createDefaultUixPrefsSchema), y la raíz sembraba su entorno
leyendo el <html dir> que el boot acababa de escribir: un usuario árabe de
una app multiidioma no veía un parpadeo, se quedaba en LTR TODA la sesión,
porque el runtime tomaba la salida del boot como si la hubiera declarado la
página.
EL COMPILADOR POR SITIO. Una sola fusión, composeUixPrefsSchema, la consumen
createActiveUix y el boot: no puede derivar. El generador acepta --schema y
--out (el especificador boot/boot-schema.ts apunta al esquema del sitio o a
boot/default-schema.ts); los guards (sin runas, techo de tamaño, ASCII, sin
</script, valores string por atributo) son errores del COMPILADOR con mensajes
para el consumidor, porque ahora el artefacto lo produce el sitio. Un esquema
que importa el barrel $prefs se rechaza nombrándolo. scripts/uix-boot-check.ts
es el guard de rancidez: plugin de Vite que tumba el build con un artefacto
viejo (probado con vite build real) y función para CI. Delta cero por esquema:
por defecto, multiidioma con árabe, ejes redefinidos y esquema parcial.
LA MARCA DE PROPIEDAD, diseño firmado por el autor. El canon de dirección dice
que <html dir> es una proyección y nunca una fuente, con una sola excepción: el
dir del AUTOR en la plantilla o el servidor. El boot rompió la premisa de esa
excepción. Todo lo que UIX escribe en <html dir> lleva ahora
PREFS_DIR_PROJECTED_ATTR (el boot con valor «boot», cada proyección del runtime
con un token de instancia); la semilla solo adopta un dir SIN marca. Un dir
escrito por script no es una fuente: en ejecución la dirección se afirma con
prefs.setIntent('direction') o options.prefs.environment, que ganan a la
semilla. Se descartaron, midiendo, la marca con valor (cierra el script y
congela la dirección al navegar entre layouts) y la inferencia por valor.
dispose solo retira lo que todavía es SUYO: SvelteKit crea la raíz del layout
nuevo ANTES de destruir la vieja (medido), y un retiro a ciegas dejaba el
<html> de la raíz nueva sin dir, lang ni data-motion/sound/haptic (medido hoy:
los nueve atributos a null). Mismo principio que el unstamp de sema, que
comprueba data-event-id.
esbuild se declara como devDependency EXACTA 0.27.4: los bytes del boot y su
hash dependen del minificador, y una subida dentro de un rango rompería la
sincronía. Boot 15 198 B, sha256-hsqdGYcrRu3oEc0Q3G/A67ApQT3q9c/vT9zMDgxROg8=
(el hash se mueve: firmado por el autor).
VERIFICACIÓN. Constructor Opus en cuatro rondas y adversarial Opus en dos
pasadas independientes, con sus reproducciones repetidas tras cada cierre:
en Chromium, entrar en árabe y pasar a inglés y a español sigue al idioma, y al
revés también; el dir de plantilla gana antes y después de hidratar y en una
raíz recreada; una raíz recreada sobre una viva sigue al idioma con y sin boot;
tras create b → destroy a, <html> conserva lo que proyectó b. Diez defectos
declarados por el adversarial, cerrados (D1–D10): marca de propiedad, esquema
parcial que estampaba "undefined", vigilante de dev mudo, plugin sin test,
receta de CI que no cargaba en jsdom, cifras y prosa, y un vite build real que
se cae cuando el boot no compila. Mutaciones en rojo, restauradas byte a byte:
la proyección no marca · dispose sin guard de dueño (también repetida por el
coordinador: 3 rojos) · la semilla compara valor en vez de presencia · marcar
el dir del autor. Suite entera 463 ficheros / 5 437 tests, exit 0 · check 0 errores en src/ y en scripts/ (89 en web/, ledger intacto) ·
docs:check 0/0 · generate:boot dos veces byte-idéntico.
LO QUE NO CIERRA (al ledger de cierre): (1) PREEXISTENTE — en la misma
navegación entre layouts, el ActiveEidos.dispose de la raíz vieja sigue
retirando data-theme/mode/density/scaling de la raíz nueva; exige cambiar el
dispose de eidos, otra capa. (2) La propiedad de los atributos proyectados
cuelga de la marca de dir: si la plantilla declara la dirección, dispose deja
lang y data-motion puestos cuando la raíz se desmonta sin sustituta
(benigno). (3) Sin boot, un script que escribe dir antes de la primera raíz es
indistinguible de la plantilla y se adopta. (4) El vigilante de dev no
reacciona a ficheros nuevos ni a inputs fuera del root.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
3 weeks ago |
|
|
9ae58c2365 |
feat(active-uix)!: el boot viaja como CUERPO CONSTANTE con los parámetros en un atributo — un hash de CSP fijo, sin node:fs, y la delta deja de confirmarse a sí misma (fila 1)
La receta documentada del boot pre-hidratación no funcionaba en ningún despliegue
real, y el panel de diseño de nueve agentes que el autor pidió lo confirmó
midiendo: con el `render.ts` anterior, un build REAL de SvelteKit con
adapter-static revienta el prerender con `ENOENT …/output/server/generated/boot.js`
y devuelve un 500. La causa: `renderUixBootScript` leía el bundle DEL DISCO junto
a su propio módulo, y una vez empaquetado ese fichero no está ahí.
FORMA NUEVA. El generador compila una entrada propia (`boot/entry.ts`), sin
`globalName`, y emite el MISMO fichero de siempre (`generated/boot.js`, sin
borrar nada) como módulo con dos constantes: el texto exacto del script y su
`sha256-…`. `renderUixBootScript` pierde `node:fs`, `node:path`, `node:url`, la
caché y el envoltorio que estaba ESCRITO A MANO: al no haber `globalName`, la
llamada la hace la propia entrada compilada. «Compilado, no escrito» sale
reforzado, no rebajado.
LOS PARÁMETROS VIAJAN EN UN ATRIBUTO del mismo `<script>`, no dentro del cuerpo.
Consecuencia, que es el punto entero de la fila: el cuerpo es CONSTANTE, así que
su hash es constante por versión del framework, igual para todos los sitios y
todos los `themeIds`. La guía pasa a tener UNA sola receta, por hash, que cubre
prerender, SSR y hasta `mode: 'nonce'`; el nonce baja a salida de emergencia. Un
bloque `application/json` hermano se descartó con razón medida: rompería la
invariante de que el tag parsea a exactamente un `<script>` y un minificador de
HTML podría borrarlo sin que nadie se entere.
TRES MENTIRAS DE LA GUÍA, CORREGIDAS. `event.locals.nonce` no existe en Kit
2.55.0 (cero ocurrencias en su código; `respond.js:168` es `locals: {}`), así que
la receta anterior pasaba `undefined`, el navegador bloqueaba el script y volvía
el flash sin un solo error. El placeholder estaba ENCIMA de `%sveltekit.head%`,
donde la política de prerender de Kit no lo alcanza: eso es evadir la CSP, no
cumplirla, y no vale cuando la política llega por cabecera. Y el `html.replace`
con cadena interpreta `$'`, así que ahora la receta usa reemplazo FUNCIÓN. Se
añade el aviso que puede tumbarle la página al consumidor: añadir un hash a un
`script-src` que lleva `'unsafe-inline'` hace que el navegador IGNORE
`unsafe-inline` y bloquee los demás scripts inline del sitio, incluido el
arranque de Kit.
EL CRITERIO SE CORRIGE. `boot-delta.test.ts` gana un tercer snapshot contra un
documento LIMPIO. El anterior arrancaba el runtime sobre el documento ya sellado,
y como `directionDimension.derive` devuelve `env.direction` antes de derivar del
idioma y el entorno se siembra leyendo el `<html dir>` que el boot acaba de
escribir, la columna `dir` se confirmaba a sí misma. Medido con el boot clavado a
`rtl`: los cinco rojos caen todos en la lectura nueva y ninguno en la anterior.
AUDIT DEV. La raíz compara en desarrollo su primera proyección con lo que ya hay
en `<html>` y NOMBRA los ejes que discrepan. Convierte en ruidosos cinco fallos
que hoy son idénticos y mudos: pin olvidado, `themeIds` incompleto, `storageKey`
distinto, artefacto rancio y script bloqueado por la CSP.
Artefacto 14 666 B, `sha256-5fulJ/2Q6DttR258KqIhWSwfm5g7973BEzzzq14fapY=`,
generación determinista. Verificación: suite entera 461 ficheros / 5404 tests, exit 0 · check con
0 errores bajo `src/` y bajo `scripts/` (89 en `web/`, ledger intacto) ·
docs:check 0/0/819 · `npx vitest run src/uix/active-uix` 9 ficheros / 97 tests.
El test nuevo `boot/pack.test.ts` empaqueta `render.ts` y lo ejecuta: sale ROJO
contra el código anterior con el ENOENT literal, y es lo único que impide que
esta clase vuelva.
Adversarial Opus independiente (árbol byte-idéntico al terminar, 14 mutaciones
revertidas): midió el hash bajo CSP real contra un servidor HTTP en Chromium 145,
Firefox 146 y WebKit 26, con control negativo bloqueado; montó una app SvelteKit
real siguiendo la guía al pie de la letra y la vio construir, prerenderizar y
arrancar sin violaciones; y probó el ENOENT con un build real. Declaró 5 defectos
del lote, ninguno bloqueante, cerrados en una segunda ronda y re-verificados uno
a uno con su reproducción original: un universal falso en un comentario, la
puerta del artefacto sin validar el cuerpo (ahora con guard propio importable),
la constante del hash sin comillas para quien escriba su propia cabecera, el
audit que SÍ viaja al bundle de producción (1 428 B medidos, no un supuesto; no
CORRE, gracias a un ternario que el bundler no pliega) y el eje que se nombraba a
profundidad 2 y ahora va en el mensaje. La redacción del guard del artefacto,
último defecto de la segunda pasada, la corregí yo: corre en cada render, 76 us
con artefacto frente a 1,49 us sin él, medido.
Filas que deja para el autor: los 1 428 B del audit en producción, si se gatean
con una bandera que el bundler pliegue · el audit queda mudo si el runtime se
desecha en el mismo turno · la fila 2 debe decidir si la puerta verifica que el
hash describa al cuerpo.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
3 weeks ago |
|
|
2ed9c54937 |
fix(blocks): /blocks habla prefs — modo y densidad por uix.prefs, preview sin persistencia, muere el segundo motor de densidad (P2 #5-D)
Firmado por el autor tras C («arregla también /blocks»). El shell de `/blocks`
(`web/routes/blocks/+layout@.svelte`) y el boot de cada preview
(`web/routes/blocks/_lib/BootUix.svelte`) mantenían su propio `$state` de modo
y lo pasaban a eidos por `modeSource` (muerto en
|
3 weeks ago |
|
|
6e0decb9ed |
feat(motion)!: una fuente de motion, y los cuatro ejes visuales SIEMPRE en prefs — eidos no lee medios, nadie en el árbol uix pregunta al SO, ningún esquema del app deja a eidos sin motor (P2 #5)
La preferencia efectiva de motion la decide prefs UNA vez (`resolveMotion`: la
intención `allow|reduce` gana al hint del SO, `system` deriva) y la proyección la
estampa en `<html data-motion>` — desde
|
3 weeks ago |
|
|
f875f60b97 |
feat(eidos)!: un escalar es una instancia CLAVADA — mueren el throw de la puerta 2 y las fuentes por eje (c')
Cierra el estado INTERINO de
|
3 weeks ago |
|
|
e3c0899dd8 |
feat(prefs)!: un motor, un sobre, un codigo — mode/theme/density/scaling son prefs, sobre canonico y boot compilado
Auditoria P2 #2: los attrs de preferencias se estampaban solo en cliente tras hidratar (app.html sin script, build estatico sin servidor) — flash claro para todo usuario dark — y no podia existir un script de arranque porque no habia contrato de persistencia (PrefsIntentStorage lo aporta cada app) y eidos llevaba un SEGUNDO motor de preferencias (theme / modeSource / densitySource / scalingSource por opciones, sin persistir), por doctrina escrita en arts/prefs/README.md («UIX does not turn it into prefs.theme»). El autor REVOCA esa doctrina. UN MOTOR. `mode` es una dimension de prefs junto a `motion` (mismo patron, `resolveTheme` de $libs/theme, que ya existia como gemelo de `resolveMotion`); `theme` (id de familia), `density` y `scaling` las declara la RAIZ en un modulo PURO (src/uix/active-uix/prefs-schema.ts) — arts/prefs no importa src/uix. Eidos lee `uix.prefs` por su puerto `ActiveEidosPreferenceSource` (src/uix/eidos/prefs-source.ts), como ya consume uix.langs / uix.dom / uix.motion. El resolver de tema baja a una funcion pura `resolveThemeId(theme, mode, isRegistered)` (src/uix/eidos/lib/theme-id.ts); los cuatro nombres de attr de eidos a src/uix/eidos/lib/attrs.ts y los de la proyeccion a src/arts/prefs/dom-attrs.ts: modulos sin Svelte, porque el boot los comparte. UN SOBRE. src/libs/prefs/document.ts: `uix.prefs-intent` v1 bajo la clave `uix.prefs`, espejo del documento de eidos (kind + version estrictos, version desconocida se RECHAZA). Solo intencion — nunca efectivo ni entorno. Adaptador localStorage canonico creado en la raiz standalone (`prefs.storage`: propio gana, `false` desactiva). HIDRATACION SINCRONA: el bridge awaitea `load()` aunque sea sincrono y produciria una primera resolucion con defaults y un salto un tick despues — el flash movido de sitio; la raiz lee el sobre ANTES de crear el motor y lo pasa como `intent`; el bridge queda solo para persistir (skipHydrate). UN CODIGO. El boot no se escribe: se COMPILA con esbuild desde los mismos modulos puros (src/uix/active-uix/boot/boot.ts → generated/boot.js, 15.009 bytes / 5.625 gzip, IIFE sin globales, cero Svelte; test de sincronia, precedente generated/base.css). `renderUixBootScript(params)` (boot/render.ts) es Kit-agnostico: el framework entrega el string; el hook de Kit son tres lineas de la app (receta en docs/theming/guide.md, NO cableada: el layout congelado lleva persistencia propia). Estampa los NUEVE attrs (dir lang data-motion data-sound data-haptic data-theme data-mode data-density data-scaling) → DELTA CERO al hidratar, probado por integracion con la raiz REAL (boot/boot-delta.test.ts, tres casos) y por tres mutaciones (sin hidratacion sincrona → rojo; constante de attr cambiada en un solo lado → rojo; boot compilado con `data-modo` → los tres casos rojos). Hallazgo del test de delta cero: la raiz no aplicaba el entorno del navegador (esperaba que el app llamara detectBrowserEnvironment en onMount) — ahora lo siembra ella (guardado por `document`) y observa sus cambios (watchBrowserEnvironment → patchEnvironment), sustituyendo el listener que eidos tenia en createSystemColorSchemeSource. Cifras: vitest prefs+libs/prefs+active-uix+eidos+value-channels 57/593 · suite completa 453/5306 · check 73 (src/ a cero; ledger intacto) · check:gate OK · eidos:lint 0 · docs:check 0/0 · morfo:vocabulary, arts/blocks/packs/rtl/translations/agent:check OK. ESTADO INTERINO, firmado para manana (acta en CONTINUE-audit-p0.md): `resolvePreferences` LANZA con `uix` + escalar/source (forma firmada originalmente); medido despues, `ActiveEidos.create()` inyecta `uix` SIEMPRE y todas las demos pasan escalares o sources (>=12 sitios, incluido web/routes/uix/+layout@.svelte:511) → el sitio de demos lanza al arrancar hasta la forma (c'): pines si (escalar explicito gana, precedente `options.dom ?? options.uix?.dom`), sources reactivas por eje FUERA, sin throw, pines en el boot. Pendientes anotados: contracts.test.ts:1270-1276 codifica la doctrina revocada; esbuild no es dependencia declarada (transitiva de vite) — decision del autor con servidores parados. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> |
4 weeks ago |
|
|
e2c37f8920 |
feat(eidos)!: un tema DICE lo que es — appearance obligatorio en ThemeDefinition, una sola fuente de verdad
|
4 weeks 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 |
|
|
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 |
|
|
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 |
|
|
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 |
|
|
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 |
|
|
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 |
|
|
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 |
|
|
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 |
|
|
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 |
|
|
53810cb5ec |
refactor(eidos): item 2 - los slots de forma de la capa deslizante llevan el _ del alias
Firma (a) del autor: --indicator-duration/-ease eran el ALIAS de la capa (la especie de --_indicator-x, opcionales-con-fallback), no un pomo de tema - la ortografia bare prometia una superficie que la cascada negaba. Flip a --_indicator-{duration,ease} (1 escritor radio-group.css alimentando desde sus claves de CONTRATO segmented-transition-*, 1 lector lib/sliding-indicator.css); reparto de propiedad escrito: la capa posee QUE propiedades deslizan (y su colapso reduced-motion), el anfitrion A QUE VELOCIDAD via contrato. Contrafactico MEDIDO pre-flip: bare en :root a 9s = 0.18s intacto (no se retira superficie); post 4/4: pixel identico, bare inerte y vacio en el pill, contrato alcanza (7s), alias en :root inerte. Comentarios themeable-so-bare reescritos; prosa del sentinel al nombre vivo (clave intacta). Lint 0 invalid, reach-floor 5/5, censo neutro.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
1 month ago |
|
|
1cb07c1e15 |
refactor(morfo): data-ready es contrato — los morfos lo declaran y la bolsa lo emite
Item 0 del handoff theming (firma ii del autor, 2026-08-27): el estampado manual de data-ready muere en los dos providers; la parte indicadora de tabs y la selection-indicator de radio-group declaran el estado 'ready' (stateRef, presence, severity optional) y el render bag lo emite desde la fuente registrada (() => indicator.ready). ready no es prop: es un hecho de runtime de la instancia — la misma especie que checked o active. La puerta anti-flash (tabs.css:329, sliding-indicator.css:66) queda declarada donde el guard la exige; 'data-ready' sale de EIDOS_ONLY_ATTRS con acta en el propio fichero (ya no es eidos-only: es contrato). Verificado: guard "hardcoded Soma component data attrs" sin los 2 rojos de este eje - morfo 16/16 (222 tests) - suites tabs/radio-group + visual-attrs 3/3 - eidos-lint: [data-tabs-indicator]:not([data-ready]) pasa a morfo-backed, 0 invalid en ambos - dinamica CDP: tabs ready="" opacity 1 y desliza (translate 0 -> 103.9px, inline-size 99.9 -> 75.8); radio-group segmented ready="" y el pill desliza; control negativo: pane oculto (rAF congelado) = sin medida, sin attr, opacity 0 — la puerta anti-flash aguanta. Viajan con atribucion declarada (acuerdo por canal con la sesion P0 vicen-42): las altas de data-aura-status-label/detail y data-waveform-played/remaining en scripts/eidos-only-attrs.ts son suyas (sus guards de contracts.test); su commit sigue a este por dependencia (su guard consume el registro y necesita estas declaraciones en el arbol). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
1 month ago |
|
|
613215fe7c |
docs(theming): el dia queda cerrado - handoff 2026-08-26, causa corregida y suelo en 66
Cierre documental tras el adversarial de SS14 (firma sostenida; un claim de
ACTA cayo y se corrige aqui):
- La causa de la extension transitiva del censo era CONTRAFACTUAL en tres
sitios (census.ts, next-features, CONTINUE): el alias de SS14 no lleva
prefijo propio y el censo lo descarta antes - clasifica global con la
razon CORRECTA (medido construyendolo: 1 new, rojo). La extension se
justifica por tooltip (alias propio sobre canal propio), no por el alias.
Reescrita con el contrafactico medido.
- El suelo sube a minAtHundred 66 - SS14 llevo a tabs al 100% y el
adversarial cazo el suelo rezagado de su propia ley ("only moves up").
- SS15 NUEVO en next-features, redactado por el adversarial: el GEMELO un
piso arriba - floating.svelte.ts publica cinco medidas de instancia como
--floating-* (publico sin dueño, ~8 recetas lectoras); mas grande que SS14
porque el posicionador sirve a muchos hosts. Dimensionar antes de firmar.
- Handoff 2026-08-26: las cinco firmas del dia con sus adversariales, lo
primero de mañana por orden de valor (SS15 - la especie de forma sin dueño
- cableado motion - palabras/timeline), el estado de la rama compartida
(peer vicen-63 con su C2c/hook, que push falta) y las leyes nuevas del dia
(el nombre dice la verdad en las dos direcciones; grep ciego a llaves;
sonda ciega a canales; una causa sin contrafactico acaba corregida).
Suelo 5/5 con 66 - docs:check 0/0.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
1 month ago |
|
|
8ac23047f1 |
refactor(theming)!: MeasuredIndicator escribe en el namespace del HOST - la capa es la pluma, no la dueña
Firma SS14 (2026-08-26, nombre poseido tras rechazar el nombre generico de
capa: habria repetido el defecto un piso abajo). La capa compartida
publicaba el rect medido como --indicator-{x,y,w,h} - forma PUBLICA sin
dueño, invisible para la ley del espacio cerrado (que audita --{c}-*) y
para todos los guards. Tercera aplicacion de la doctrina del canal
(navigation-menu fue la segunda, tabs la habia firmado por escrito citando
a navmenu como precedente).
- MeasuredIndicatorOpts gana `component: string`; los DOS hosts (tabs,
radio-group - barrido completo, no hay mas) pasan xxxMorfo.kebab, NUNCA
un literal: el nombre del canal queda atado a la declaracion que lo posee.
- tabs.css lee el poseido directo; el css COMPARTIDO (sliding-indicator)
lee el alias local que cada receta declara (--_indicator-x:
var(--_radio-group-indicator-x)) - el cableado del puente THM-2, contrato
en el artefacto. --indicator-{duration,ease} INTACTOS a proposito: son
ranuras de FORMA, no canal - el _ separa las dos especies en el mismo
fichero; su falta de dueño queda flagged como especie pendiente.
- El censo aprende el CANAL TRANSITIVO (molde de derivesFromPublic,
memoizado, a prueba de ciclos, con la mutacion que impide que un alias
sobre un privado declarado clasifique canal). Efecto colateral MEDIDO con
acta: tooltip.css:27 pasa de exception a channel - su comentario firmado
ya decia "per-instance VALUE CHANNEL"; faltaba el mecanismo, no el
criterio.
- Ledger: la clave tabs RETIRADA entera (2 entradas global) con acta que
hace la lectura honesta - no se tokenizo nada ni se perdono deuda: se
corrigio una mala clasificacion en su fuente. 1154 -> 1152, 0/0.
- Numeros: tabs 97% -> 100% (global 2->0, channel 0->2, ni una clave
acunada) - atHundred 65 -> 66 - reach global 73% y public 3072 intactos.
- Dinamica verbatim en los dos hosts (radio-group manifiesta en segmented):
el canal poseido LLEVA el rect del item activo (x 784=784, w 71=71 /
x 793=793, w 102=102), el indicador desliza, los nombres viejos computan
vacio, control negativo quieto y positivo probando la CADENA del alias.
Re-verificado DESPUES de aterrizar el codemod del peer. Sonda estandar de
tabs 2528 valores x 10 estados a 0 diffs - dicho en voz alta: esa sonda
es CIEGA al canal; su 0 prueba lo circundante.
- Guards: 154 tests verdes - centinela tabs 70/79 identico (ninguna
adjudicacion citaba las medidas) - audit 162 PASS - docs:check 0/0 -
src/ sigue a 0 errores.
ATRIBUCION DECLARADA (acordada por canal entre sesiones): este commit CARGA
ademas la retirada de 5+5 `syncAttrs: true` en tabs-provider y
radio-group-provider - trabajo de "P0 fase C2c, audit 2026-08-26 - retirada
de syncAttrs, sesion de la auditoria" (vicen-63), que aterrizo en disco
durante esta construccion y cuya restauracion habria sido churn sin valor.
Su commit de C2c anota el viaje desde el otro lado.
BREAKING: --indicator-{x,y,w,h} ya no existen; el canal es
--_{c}-indicator-* del host y el css compartido lee el alias por receta.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
1 month ago |
|
|
9dffa541ef |
fix(uix): fase A cierre — los seis rojos del censo morfo:check, adjudicados
Cada uno leído antes de tocarlo; tres clases distintas: - combobox.input y gradient-builder.track: el morfo declara el data-* SIN value (soma posee el valor — el idioma que el propio trigger de combobox documenta) y nadie lo escribía. El comentario del input además afirmaba que la bolsa lo resolvía, cosa que una declaración sin fuente no puede hacer. Escritura manual, como sus hermanos. - menu-dial.trigger: componente de scope eidos (contrato espejado a mano); el trigger estampaba marker y aria pero olvidó data-state — la lista de al lado sí lo lleva. Espejo del idioma existente. - calendar (data-calendar-surface) y fab (data-fab-size): attrs visuales de wrapper / hooks compartidos de eidos, sancionados FUERA del morfo por la doctrina firmada (precedente: data-combobox-control). El instrumento no conocía la doctrina: nace scripts/eidos-only-attrs.ts como lista ÚNICA que consumen morfo-check y eidos-lint-all, para que los dos instrumentos no puedan divergir. - palabras.handle: el grip porta el escape del focus-scope a propósito (comentario in situ con la razón); la declaración alcanza a la implementación sancionada. Los otros cuatro rojos del censo previo no eran contrato: accordion, background y link eran timeouts de compilación fría (pasan en caliente) y color-field lo sanó la unificación de la bolsa por sí sola. Verificación: morfo:check 160/161 con los seis en PASS — el único rojo restante (natural-time-picker) es la clase flaky del instrumento «demo que navega bajo el eval» (no falló en ninguna de las dos pasadas previas; la ruta verificada a mano en navegador con su contrato completo) · schema sweep 89/89 · eidos:lint exit 0 · combobox 11/11 · palabras 84/84. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
1 month ago |
|
|
2ec0181079 |
feat(gate): fase B de P0 — la puerta existe y sabe fallar
El hallazgo mayor confirmado de la auditoría 2026-08-26: ~16 validadores y
429 ficheros de test que nada ejecutaba (sin CI en ninguna rama de la
historia, hooks .sample, eidos-lint sin script npm). Esta fase los cablea:
- `check:gate` (scripts/check-gate.ts): svelte-check con política — src/
debe cero; web/ se mide contra el ledger menguante scripts/check-debt.ts
(34 ficheros, 71 errores congelados; sólo puede bajar, la disciplina de
theming-census-debt). Guard anti-vacío: sin marcador COMPLETED o con
conteo que no cuadra, falla — un gate que no inspeccionó nada no pasa.
- `eidos:lint` deja de ser invocación cruda (exit 1 real en invalid/dead).
- `gate`: check:gate → validadores rápidos → vitest al final. `lint` queda
deliberadamente FUERA: hay ~2.300 ficheros de deuda de formato
preexistente (nunca se formateó el repo entero; el one-shot pendiente es
`npm run format` en árbol quieto y re-añadirlo — documentado en el hook).
- scripts/hooks/pre-push: la fuente del hook, SIN armar. Se armó en
caliente, bloqueó el push legítimo del eje theming (secuencia mal: verde
primero, puerta después) y se desarmó — de paso la puerta demostró que
sabe fallar, que era el requisito de verificación de la fase.
- .prettierrc endOfLine:auto — neutraliza la clase CRLF/autocrlf de
Windows (~350 falsos rojos), sin cambiar formato real.
Verificación: check:gate exit 0 sobre HEAD (71 dentro del ledger, src/ a
cero tras
|
1 month ago |
|
|
cec75d04e4 |
docs(theming): la deriva que midio el adversarial del espacio cerrado
7/7 claims confirmados; la acunacion de phone-shadow resulto ser la pieza que impide una regresion que el commit habria metido sin ella (verificado el contrafactico). Tres derivas de prosa de la propia firma, saldadas: - base.ts: text-scramble gana sus dos anotaciones - el default `inherit` es inerte POR MECANISMO (CSS-wide keyword en :root -> IACVT -> unset -> hereda, que ES la intencion) y `--font-mono` es nombre de capa app que eidos nunca emite (misma clase que el primitive-neutral-12 de mockup, anotada igual). - color-swatch/README: "la forma que recipe-css-contract sanciona" paso a pasado con anotacion fechada - la sancion la retiro esta ley; la adjudicacion (canal de valor, fuera del contrato) queda intacta y el nombre vive en PENDING_PRIVATE_RENAME con su destino. - component-audit: la nota de R-5.2 que describia el idioma como sancionado se reescribe a la ley nueva (y de paso al ingles, ley del repo). Censo byte-identico tras los comentarios (los lectores textuales de base.ts no se inmutan: 4914/3074/73%, text-scramble 4 knobs contract 2), 50 tests verdes, docs:check 0/0. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
1 month ago |
|
|
1c239bf797 |
docs(theming): precision de prosa que midio el adversarial de los 318
13/13 claims confirmados (particion re-derivada clave a clave, 22 css 100% comentario por tokenizador propio, valvula irrompible ante declaracion ajena, suelo 73/65 exacto sin holgura, canario del centinela byte-identico). Cuatro precisiones de prosa, ninguna de clasificacion: - component-audit: el bloque R-5 decia 1088/74 (cifras del 25); ahora ancla 1154/76 al baseline del 26 con fecha. - theming-census: "los 29 nombres tienen escritor en envoltorio o soma" era 28 de 29 - el 29 (scroll-frames viewport) es el hatch que su contrato firma como geometria del SITIO: su escritor es la pagina, por diseño. - CONTINUE: unidades normalizadas en la lista de contradicciones (timeline 10 knobs/5 notas - listbox 6 knobs/5 notas - proof-of-human ya decia knobs). - recipe-contract: el "(1088 -> 1087)" historico gana su "that day" para no leerse como estado. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
1 month ago |
|
|
90b93a79e0 |
docs(theming): la firma de los 318 queda EJECUTADA - el suelo sube a 73/65
Tercera pieza (F3): los ratchets suben en el commit que los gana y la prosa "318 sin ratchet" pasa a historia fechada. - Suelo: reachPct 69 -> 73 (3074/4228; el numerador NO se movio - ninguna receta cambio un valor; el denominador cayo exactamente los 252 que dejaron de contar como no-alcanzados: 132 bridge + 36 channel + 84 anotados; los 66 del ledger SE QUEDAN dentro) y minAtHundred 45 -> 65. Mordida verificada en ambas direcciones (74/66 -> rojo con el mensaje exacto; restaurado -> 5/5). El bloque de doctrina cuenta el CIERRE del agujero, no el agujero: los dos ratchets dicen lo mismo desde dos alturas - el suelo rechaza una caida NETA, el ledger una clave sin nombre. - recipe-contract SS4: la ley completa de las CINCO salidas de un privado no-derivado (bridge mecanico - channel mecanico - anotacion private: - entrada de ledger - derivar de un publico). 1088 -> 1154 donde era estado. - CONTINUE: la firma pendiente -> EJECUTADA 2026-08-26 con su seccion ( |
1 month ago |
|
|
a74aeec7b6 |
feat(theming): los 150 privados del residuo quedan adjudicados - 84 firmados, 66 contados
Segunda pieza de la firma de los 318 (F2). El residuo que F1 dejo se
adjudica POR CLAVE, cada acta con su medida: 150 = 84 ANOTADOS + 66 al
LEDGER + 0 sin nombre.
- Valvula nueva /* private: <razon> */ -> clase exception (vocabulario
cerrado). Corre en una CUARTA pasada, la ultima: donde una prueba mecanica
ya decidio, una firma no tiene nada que firmar. La nota va en el bloque de
comentario ENCIMA de la declaracion (al final de linea, prettier partiria
el var() - un commit de anotacion no reescribe el CSS que viene a firmar);
el paseo hacia arriba solo salta lineas que eran solo-comentario.
- private es DebtClass: clave `private - {fichero} - {selector} -
{propiedad}`, newDebt y STALE simetricos. Un privado no-derivado nuevo ya
no puede entrar sin nombre. Ledger 1088 -> 1154 (+66, 0 claves perdidas,
verificado contra el blob de HEAD, no regenerado en bloque).
- ANOTADOS 84: 59 con ficha SS5 firmada que lo dice (card, avatar, badge,
surface, switch, timeline, textarea, spinner, skeleton, metrics,
float-panel, image, toolbar, button, drawer, listbox) + 25 medidos
(proof-of-human 17: el puente UN NIVEL bajo el knob, base verbatim del
forward, medido dos veces; form 4: conmutador-identidad; 4 sueltos).
- LEDGER 66: casi todo UN patron - el conmutador de tono A MANO
([data-color=risk] { --_c-accent: var(--color-risk-solid) }) sin adoptar
el forward THM-2 (time-range-picker 19, chronos 14, time-picker 12,
date-range-picker 9...) mas las tallas prestadas de field. Se retiran el
dia que esa familia adopte la escalera de paleta.
- Contradiccion con ficha RESUELTA por medida: metrics SS5 decia que el
conmutador del icono derivaba entero de publicos - cierto para track/text,
falso para solid/contrast (leen roles crudos): 3 anotados, 2 al ledger.
timeline SS5 (pre-B') se respeta y queda señalado para reabrir.
Mutaciones (backup+restore en finally, arbol comprobado): privado nuevo ->
newDebt lo nombra y suelo ROJO; anotado -> verde; registrado -> verde;
ledger'd que gana su nota -> STALE hasta borrar la linea. --debt final:
1154 registered - 0 new - 0 stale, dos corridas. Suelo 5/5, audit 162 PASS
sin flips, tsc 0 propios, diff de los 22 css = 100% comentario (verificado
por strip programatico contra el blob de HEAD), prettier 0 regresiones.
Reach 71% -> 73% (3074/4228). El suelo (69/45) y la prosa "318" los sube F3.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
1 month ago |
|
|
e812d3ffd3 |
feat(theming): el censo distingue PUENTE y CANAL - 318 privados dejan de ser un bulto
Primera pieza de la firma "clasificacion de los 318" (F1). Dos clases nuevas
de knob, MEDIDAS contra el emisor y no adivinadas por nombre (la ceguera del
chooser, escarmentada en este mismo eje):
- bridge (132): el knob lee el privado que el forward THM-2 ESCRIBE -
verificado contra la CSS generada real (la linea `--_{c}-palette-{slot}:
var(--palette-{slot}, ...)` de renderRecipePaletteForward), no contra la
forma del nombre: un `--_c-palette-shadow` que nadie forwardea se queda en
residuo. Alcanzable DOS veces (capa --palette-* + tonos publicos); un
publico encima dejaria a un tema PINearlo y matar el color= por instancia
(los SS5 de card/tags-input/avatar ya lo decian).
- channel (36): el privado que NADIE declara - ni la receta ni el generador -
porque soma o el envoltorio lo escriben POR INSTANCIA (29 nombres, cada
uno con su escritor real verificado). Un tema no debe alcanzarlo.
- Precedencia puente > canal > residuo; `every`, no `some`; un privado
GENERADO nunca es canal (los 4 knobs de gradient finish quedan en residuo
con su razon medida - adjudicar una clase "finish" seria inventarla sin
firma).
Aritmetica: 318 = 132 puente + 36 canal + 150 RESIDUO (la adjudicacion por
clave es de F2). Ambas clases salen del denominador como system/structural:
reach 69% -> 71% (3074/4312). Cero knobs de otras clases movidos (diff
programatico de las 162 filas). Mutacion del instrumento sobre copia:
vaciar los forwards -> bridge 0; declarar-todo -> channel 0 - las clases
las manda la medida. Nuevo `--residue <out>` vuelca el residuo con la
cadena de fuentes de cada privado (el material de F2).
Casos firmados, contrastados: card 8 = 4 puente + 4 residuo (su SS5 exacto) -
tags-input 4/4 puente - toolbar 2 residuo ("esta barra no tiene paleta") -
avatar 6 residuo (su canal custom esta un nivel POR DEBAJO del knob) - el
indicador de tabs NO esta en los 318 (es clase global y ya vive en el
ledger de deuda).
Suelo 5/5 verde (el ledger literal|global no se toca; el ratchet grueso
sube en F3), audit 162 PASS identico, tsc 0 propios, prettier sin
desajustes nuevos. Deuda de prosa (los "318" en cabeceras/docs y el suelo
en 69) queda para F3, nombrada.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
1 month ago |
|
|
1ba518fcc2 |
fix(theming): lo que el adversarial del cierre midio - numeros de prosa y el exit de --debt
La verificacion adversarial del cierre (11 confirmados, 2 refutaciones de NARRACION, 7 mutaciones con arbol restaurado byte a byte) dejo cuatro correcciones, ninguna de mecanismo: - El "114" de palabras eran 117 nombres --palabras-* consumidos (103 con fallback + 14 sin, los 117 bajo --palabras-scheme-*): el punto doctrinal sale REFORZADO - todo el canal es proyeccion del scheme. Corregido en el README y en la cabecera del ledger. - Los "18 sin contrato" de recipe-contract SS4 son 23: el titulo dejaba fuera a los cinco estructurales que su propia enumeracion lista dentro. Renumerado con el desglose recontado. - --debt no fijaba exit code: un modo de chequeo que no puede fallar es medio guard. Ahora process.exitCode=1 con deuda nueva o STALE (verificado por mutacion: HEAD exit 0, con literal inyectado exit 1, restaurado). - El 5o test del suelo se llamaba "mutation probe" y no muta nada: renombrado a lo que es (canario de cordura del scanner), con la historia de donde SI se vio el rojo por mutacion. Hallazgos del adversarial que quedan registrados sin ejecutar: las fichas de docs/audit/theming estan OBSOLETAS respecto a la clase structural (--report sin re-correr; tarea aparte con supervision por ficha) - el desglose "Knobs de apariencia" de la ficha no suma (preexistente) - el suelo de reach tiene ~0,5pp de holgura por redondeo. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
1 month ago |
|
|
69d69d43c6 |
feat(theming)!: R-5.1/5.2 a error contra el LEDGER DE DEUDA - el ratchet es por clave
La pieza grande del CIERRE, con la forma firmada hoy: la deuda de alcance no
se tolera en warn ni se disfraza de excepcion - se REGISTRA, clave a clave,
y desde ahi la regresion es imposible y la mejora queda contada.
- scripts/theming-census-debt.ts (NUEVO): 1088 claves (763 global + 325
literal, 74 componentes), clave `{clase} - {fichero} - {selector} -
{propiedad}` INDEPENDIENTE de linea (mover una regla no fabrica
regresion), comparacion MULTISET, generacion reproducible (dos corridas =
mismo sha256), nace prettier-limpio. NO es un fichero de excepciones: es
deuda registrada, la otra clase de acta - la valvula R-5.x exception de
los README sigue intacta y NUNCA ciega el ratchet. Los carriles WIP ENTRAN
(palabras 359 + chronos 209 = 568): la deuda es real viva donde viva, y
dejarla fuera haria del gate una afirmacion sobre dos tercios del arbol.
Con la salvedad MEDIDA de palabras escrita: sus nombres --palabras-* son
canal de VALOR del scheme del documento, no contrato de tema - sus 103
"public" del censo estan en cuestion.
- theming-census.ts: censusAudit() -> {newDebt, stale} + CLI --debt
[--write] que imprime el delta que va a cometer (regenerar en masa borra
el ratchet: el escritor grita y la cabecera lo prohibe sin firma).
- theming-reach-floor.test.ts (reescrito): newDebt=0 y stale=0 con las
claves NOMBRADAS; los techos burdos maxLiteral/maxGlobal RETIRADOS
(superseded por el por-clave: 5 regresiones ya no se esconden bajo 5
arreglos); reachPct sube a 69 como ratchet grueso - y cubre el hueco
nombrado: los 318 privados no-derivados siguen SIN ratchet por clave
(acotado por la firma a literal|global; pendiente de firma propia);
atHundred corrige su criterio (public>0, 14 -> 45: los 31 de diferencia
eran denominadores vacios, ninguno un avance real).
- component-audit.ts: filas R-5.1 y R-5.2 a ERROR consumiendo censusAudit()
(dos implementaciones de una medida son dos medidas); R-5.2 honesto sobre
los 18 sin-contrato (11 nada-que-declarar all-system/0-knobs; field-langs
cubierto POR el ledger - la entrada ES su registro; 3 consumidores de capa
calendar; mockup y text-scramble PASS con nota del idioma var(..,fallback)
sin contrato - forma real sin nombre, pendiente de decision; palabras
fuera del catalogo del audit). R-5.3 YA estaba en error (verificado,
--names 0 desviadas). El skip por censo roto ahora GRITA por consola (la
leccion del prepareWith: un guard saltado nunca es mudo - y el suelo de
vitest queda de red mecanica).
- docs: canon/recipe-contract.md SS4 y theming/reference.md SS12 reflejan la
ley (gate F3 = censo 100% ADJUDICADO); completion-checklist gana las dos
filas (exigido por el guard I5); el stub RECIPE_CONTRACT.md solo actualiza
su linea de enforcement.
Mutaciones, todas mordiendo: literal nuevo en mark -> newDebt lo nombra,
suelo rojo, R-5.1 falla; clave de aura tokenizada -> STALE rojo hasta borrar
la linea; literal sin registrar en field-langs -> R-5.2 muerde. Guards en
HEAD: component:audit 162 PASS (cero flips; los 4 NEEDS-WORK son R-1.x
ajenos), suelo 5/5, docs:check 0/0.
BREAKING: los techos maxLiteral/maxGlobal del suelo desaparecen; anadir un
literal o un global crudo a una receta exige desde ahora tokenizar, anotar
/* literal: */ o firmar la entrada en el ledger de deuda.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
1 month ago |
|
|
2c61946fba |
feat(theming): la clase structural del censo - el 0% por NATURALEZA deja de contar como deuda
Pieza del CIERRE del eje (SS13: el censo no distingue "0% por deuda" de "0% POR NATURALEZA" y el gate de F3 era inalcanzable por construccion). Nueva clase structural en theming-census.ts, la forma de LAYER_VOCABULARY: la lista Y la razon por componente EN el artefacto, por COMPONENTE entero, con el SS5 firmado de cada ficha como fuente. No es un cajon para "este es dificil": una entrada exige veredicto escrito, y un componente que gane superficie de tema real sale de la lista. Los cinco medidos 2026-08-22: aspect-ratio (faceta de box, knob prestado) - text-blur (el 1px de la tecnica sr-only) - cascade y motion (el opacity del gate antiparpadeo, mecanica del canal cuyo valor vive en EidosConfig.motion) - date-picker (la correccion max-content del pie, un unico valor correcto). Aritmetica cuadrada: structural 9 knobs (global -1, literal -8), knobs 4998 intacto (salen del DENOMINADOR, como system), reach 68% -> 69%, no-contract 23 -> 18, <20% 12 -> 7. Diff de tablas: exactamente 5 filas cambian (0% -> strct), las otras 157 byte a byte. Los knobs estructurales se siguen LISTANDO en SS2-bis de su ficha con su razon; la seccion de propuestas los excluye (proponer un token contradiria el SS5). component:audit identico (162 PASS; el NEEDS-WORK de motion es R-1.1, raiz sin declarar, ortogonal al alcance). Suelo del censo verde con margen. Candidatos NO incluidos, reportados con dato: field-langs es deuda REAL (31 globales crudos) - range-calendar/month-grid/year-grid son la pregunta abierta de las capas compartidas - display/heading/text ya son all-system. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
1 month ago |
|
|
4cb76403a0 |
docs(theming): la GRANDE EJECUTADA y verificada 12/12 - TONE_UNREACHED ha muerto
Cierre de la firma de instrumento grande. La verificacion adversarial
confirmo los 12 claims (aritmetica del ledger cargando el modulo en cada
commit, monotonicidad E2E con comparador propio, seis catas empiricas
incluida la sorpresa de tags-input dos veces y el test de dos caras del
PALETTE_FLOOR, la sonda sana, y la estatica fina del codigo).
- Corrige el acta de la retirada de tags-input en el ledger: la asimetria
del estampado (data-color en todos los nodos vs solo el proveedor) EXISTE
pero NO es la causa de la revivida - medido en forma de produccion, el
token mueve 6 nodos igual porque el privado hereda del proveedor al item.
- Anota en next-features SS13 las tres cegueras como EJECUTADAS (S1/S2/S3
con sus commits y numeros) y registra la deuda nueva del adversarial:
asimetria del estampado, ternario falsy de la restauracion de atributos
(
|
1 month ago |
|
|
b9cef9a43f |
fix(theming): S3 de la GRANDE - el guard mide TONO y ESTADO a la vez, y TONE_UNREACHED muere
Tercer barrido de la firma de instrumento grande (ceguera 2 + su cuarto
defecto). Cuatro piezas en theming-sentinel.ts:
- F2.1: el pase de hover estampa el tono (data-color + data-intent) y lo
restaura al salir, simetrico al estatico.
- F2.2: toneOf() con (^|-){tono}- a nivel de modulo, viajando como parametro
a los dos page.evaluate - el tono MEDIAL existe (censo: 4556 claves, 556
nombran tono, 16 mediales, las 16 de tag-group, cero falsos positivos).
- F2.3: el pase de hover corre para toda clave de TONO que siga muerta,
aunque su nombre no diga hover (las 21 de file-upload).
- F2.4: seis ejes de estado como DATO en COMPONENT_OVERRIDES, cada valor
sacado del morfo/receta/DOM real (button variant; switch state; checkbox
variant x state - indeterminate FUERA con medida, comparte bloque con
checked; radio-group +state; tags-input +state 4o eje; tag-group variant x
state). Ningun eje nuevo bajo ninguna cuenta.
Barrido S3 del ledger entero contra la base S2: 91/91, 43,8 min, 0 rojos,
0 avisos, 0 bajadas, 0 movedores ajenos - exactamente los nueve previstos,
+140 claves (catalogo 2778 -> 2918). 130 de las 132 TONE_UNREACHED reviven;
las 2 que no (checkbox/radio-group primary-solid-hover) nunca fueron la
clase: son el tono HOST por defecto, absorbidas en PALETTE_FLOOR tras el
test de dos caras. La firma de los ocho componentes es una sola: el unico
tono que queda muerto es siempre el default estampado del host.
Ledger: 8 patrones RETIRADOS (button 35/35 - file-upload 28/28, la entrada
que NOMBRO el tercer defecto - switch 10/10 - toggle 10/10 - tags-input
14/14 - tag-group 21/21 y 6/6 - toast action-hover-bg 5/5, la que ESCRIBIO
la clase), 2 ESTRECHADOS a PALETTE_FLOOR (checkbox, radio-group), 5 exactas
retiradas (button.palette-track/-border/-text con su razon corregida - el
guard escribe en el nodo, no solo :root; tag-group.solid-fg que se retiro a
si misma; hover-item-fg re-atribuida: la callaba su data-state=selected
nativo, no el arquetipo), 2 razones reescritas por medida. La constante
TONE_UNREACHED RETIRADA como huerfana - la muerte que su docstring pedia.
Tier de patrones 26 -> 16; 15 de los 16 son ya el unico hecho PALETTE_FLOOR.
Dos contradicciones del expediente, reproducidas dos veces: las -text de
tags-input SI reviven (la causa del arquetipo solo tapa el ITEM RESALTADO y
la escena no tiene ninguno; el token pinta ademas dos nodos hermanos fuera
de esa regla) y tag-group.hover-item-fg estaba mal atribuida. Queda señalado
en acta para expediente propio: el pase estatico estampa data-color en TODOS
los nodos mientras produccion lo estampa solo en el proveedor - anterior a
esta firma.
Los nueve componentes editados re-corridos tras el ledger: verdes, STALE 0.
label 1/2 byte a byte; switch 27->37 por diseño, reproducido dos veces.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
1 month ago |
|
|
b4dd5a9067 |
fix(theming): S2 de la GRANDE - el centinela elige la sonda por el VALOR, no por el nombre
Segundo barrido de la firma de instrumento grande (ceguera 3 del expediente VA). sentinelFor(key) pasa a sentinelFor(key, kind): el guard ya leia base.ts para extraer las claves y ahora captura en el mismo pase el VALOR por defecto de cada una y tipa la sonda por el (literales por sintaxis; var() por el vocabulario del sistema, con resolucion transitiva dentro del catalogo via recipeTokenIndex). La escalera de nombre queda como respaldo para lo no clasificable. La regla: la sonda tiene que ser imposible EN LA DIRECCION en que la propiedad puede moverse. Censo del cambio: 357 claves cambian de sonda (320 clase A color<-1234px en 40 componentes - la clase entera del "vivo por accidente" IACVT - + 17 B + 8 E + 1 F + 11 menores). Easing (52 claves) intacto y explicito. Dos desviaciones del boceto, ambas medidas: el % NO se clasifica (opacity 62% vs width 42% - ambiguo) y el entero/0 tampoco (la "clase E de 24" del expediente era una mala lectura: 22 son calc(px * var(--scaling)), longitudes; y tipar el 0 habria matado en falso 7 claves vivas con default 0 - no monotono). Barrido S2 del ledger entero contra la base S1: 91/91 verdes, MONOTONO (0 componentes bajan), 0 rojos, 0 avisos de prepareWith, 39,7 min. Catalogo 2776/3577 -> 2778/3577: avatar 80->81 y stepper 62->63, exactamente las dos victimas medidas del expediente. Ninguna de las 102 claves clase A cubiertas por patron revivio - esperan la ceguera 2 (S3), como estaba escrito. Un fantasma no reproducido (spin-field 0/20 en 6,2s, la pagina no rindio; rerun 13/20 identico a S1) queda archivado como flake del instrumento. Ledger: DOS retiradas exactas con acta y medida - avatar.badge-fg-custom- contrast (default white, la entrada describia la sonda, no el token) y stepper.neutral-text (el unico caso donde la sonda mala daba VEREDICTO malo: la IACVT caia en la tinta heredada que el tono neutral practicamente es). background.scrim-fg-over-* siguen muertas por su puerta real y su entrada sobrevive tal cual. Re-corridos tras editar: verdes, sin STALE. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
1 month ago |
|
|
6392d6003f |
fix(theming): S1 de la GRANDE - el prepareWith GRITA y el STALE ve los patrones
Primer barrido de la firma de instrumento grande (cegueras 6 + 1 del
expediente VA). Dos cambios en theming-sentinel.ts:
- Ceguera 6: el catch del bucle prepareWith avisa SIEMPRE por stderr - el
count() previo ya filtro la ausencia, asi que lo que cae ahi es un control
que estaba y fallo, la fuente de las muertes fantasma (chat-message midio
59/81 y 77/81 sobre codigo identico). No lanza: un barrido debe terminar,
pero una corrida con aviso NO es certificable.
- Ceguera 1: stale/oscillating filtran por reasonFor(k) (exactas Y patrones)
en vez de k in ledger (solo exactas) - 236 de las 821 ranuras adjudicadas
(29%) no podian disparar STALE, el silencio que costo 207 claves en B'. El
mensaje distingue: exacta -> retirar la entrada; patron -> ESTRECHARLO
(nunca retirarlo: cubre una familia y las demas siguen muertas).
Barrido S1 del ledger ENTERO: 91/91 componentes VERDES, cero unadjudicated,
cero avisos de prepareWith (corrida certificable), 40,8 min. label 1/2 y
switch 27/52 byte a byte identicos a las bases - los cambios no tocan
veredictos, solo el informe.
Cosecha: 18 claves STALE, todas de PATRON, todas de toast - los dos patrones
PLANE_SUPERSEDED ({tono}-{surface|border} y {tono}-accent) adjudicados el
2026-08-24 y dejados rancios ESA MISMA NOCHE por SS12.9 (el plano bajo a
:where() y la receta volvio a ganar; el handoff registra los seis tonos
restaurados). Reproducido 3/3 sobre codigo identico. 18/18 vivas = familias
enteras = ambos patrones RETIRADOS (no estrechados) con acta en el ledger;
toast re-corrido tras la retirada: 72/85, exit 0, 0 STALE. La tercera entrada
de toast (action-hover-bg) es clase tono-en-hover: cosecha de S3, intacta.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
1 month ago |
|
|
0474643895 |
fix(theming): la mitad gratis del instrumento - el codemod lee la IIFE y la sonda habla la puerta del centinela
Firma de instrumento (expediente VA, cegueras 4 y 5): coste de ledger CERO,
tres scripts, ni una entrada de theming-sentinel-exceptions.ts tocada.
- __names-codemod.ts: blocks() devuelve {name, at, end, depth} con offsets
reales del fichero; la IIFE de avatar acota su region al return{...} con
depth 3 (y LANZA si no lo encuentra) y los muros 2-3 leen por fin sus 97
claves (86 publicas + 11 privadas); el pase A renombra a \t{depth}.
Laboratorio sobre copias: duplicado inyectado a 3 tabs DETECTADO,
renombrado de una clave de avatar = 1 linea. La via de carga SE QUEDA en
tsx: theming-census importa src/uix/morfo/compile sin extension y todo
src/uix/morfo esta escrito asi.
- theming-sentinel.ts: COMPONENT_OVERRIDES se exporta (UNA tabla de puertas,
no dos) con guarda de entrypoint via realpathSync - sin el realpath la
guarda muere a traves de un junction (exit 0 sin inspeccionar nada) y este
repo usa worktrees con junctions; UIX_DEV_URL reemplaza el :5173 clavado.
Importarlo: 0,85 s sin navegador. label 1/2 y switch 27/52 byte a byte
identicos a las bases pre-firma. Incluye +10 lineas de comentario
PREEXISTENTES de otra sesion (la justificacion de image-adjustments en
COMPONENT_OVERRIDES, solo prosa, verificada contra su acta del 24).
- __theming-probe.ts: el pase open habla el vocabulario del centinela
(prepareWith/openBy/openWith/openMarker, con OPEN_TRIGGER podada de sus
copias literales) y su catch AVISA en stderr distinguiendo "no hay trigger"
de "el gesto fallo"; editable registra por fin su bloque open (25 filas, 6
con data-editing; dos corridas sobre codigo identico = 0 diffs en TODOS los
bloques); pases nuevos de FOCO (la cabecera lo prometia y nada llamaba a
.focus()) y disabled (bloque aparte y ULTIMO de la corrida);
PROBE_ROLE_BOUND_SCALES + PROBE_SAFE_SCALES + assertProbeSafeScale con la
discrepancia risk amber/orange documentada; UIX_DEV_URL. card y editable a
0 diffs contra sus bases en los bloques pre-firma; menubar (6 nodos -> 7
con el panel) y chat-message (24 filas x 2 corridas, 0 diffs) abren via las
entradas del centinela.
Fuera de la firma, registrado en next-features SS13: el barrido de variantes
de la sonda (ensanche diferido), el clear-trigger de search-field en el pase
open, la asimetria de escenario de los seis con prepareWith sin fila en
DEMO_VARIANTS, y la GRANDE (cegueras 6+1+3+2, barridos S1-S3), que sigue
esperando firma. El catch del prepareWith del centinela sigue MUDO a
proposito: es la ceguera 6, S1 de la GRANDE.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
1 month ago |
|
|
1f8ce293bb |
fix(theming)!: avatar - el contrato dice la verdad: 4 claves, cero desviadas
Las ultimas CUATRO claves fuera de gramatica de las 4.558 publicas del catalogo, resueltas cada una por lo que ES (no eran cuatro iguales): - `badge-color-custom-contrast` -> `badge-fg-custom-contrast`: la unica TINTA real y alcanzable. Nombre derivado DE la gramatica D-TH.6 (la ranura se sustituye EN SU SITIO; `custom` no es interactivo ni rol, va detras) con el precedente firmado scrim-fg-over-dark - y es la salida literal del clasificador que consume R-5.3. Renombre a mano (el codemod ABORTA sobre la IIFE de avatar - deuda registrada en 13): value-preserving, verificado con sonda dirigida (la clave vieja movia antes y no despues; la nueva al reves). - `ring-color-custom` y `badge-color-custom` RETIRADAS del contrato publico: canales de valor INALCANZABLES (puerta data-*-custom y escritura inline nacen de la misma expresion - mentiras bajo R-5.4). Mecanismo: canal privado de envoltorio `--_avatar-*-color-custom` + respaldo currentColor (el patron de las 5 privadas-de-envoltorio del parque, 5/5 sin declaracion en receta), NO borrado (el CSS las lee) NI privada plana (cero precedente). Ley 8.bis re-aplicada: cero lectores fuera de avatar, re-barrido. - `group-carve-color` EXENTA en NAME_EXEMPT con razon medida: alimenta box-shadow (geometria del carve, no tinta; alcanza en 59 instancias) - `fg` seria gramatica correcta con semantica peor. Medido: sonda 7.4 0/576 - pixel visible IDENTICO (anillo ambar, insignia violeta, tinta white) e instancia imposible identica (currentColor preserva el default retirado) - Tokens 88 -> 86 EN VIVO con el nombre nuevo (captura revisada por el supervisor) - censo --names: DESVIADAS 0 EN 0 COMPONENTES (4.556 claves) - centinela exit 0 - lint 0 - docs-check 0/0 - vitest 442+1 ajeno - check 0 atribuibles. Hallazgo de instrumento NUEVO, adjudicado y registrado en 13: el chooser del centinela elige el valor por NOMBRE y no conoce `fg` MEDIAL (su prueba de tinta es `fg$`): las 5 claves que la propia D-TH.6 fabrica (badge-fg-custom- contrast, bubble-fg-in/-out, scrim-fg-over-dark/-light) reciben 1234px, invalido para color - y el veredicto depende de si el respaldo coincide por azar (bubble-fg-* leen vivas POR ACCIDENTE). Arreglarlo obliga a re-verificar el ledger - firma de instrumento aparte. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
2 months ago |
|
|
2ce43db563 |
fix(morfo)!: tags-input - aria-selected sigue al resalte, no a un literal
`v.literal('true')` era el UNICO aria-selected incondicional de los 18 morfos
que declaran el atributo: el AX tree entregaba DOS option selected:true dentro
de un listbox multiselectable:false (mentira de plataforma), archetypes.css
(0,4,0) clavaba el velo de estado EN REPOSO (la etiqueta vivia en su propio
hover: reposo y hover byte-identicos) y `--tags-input-item-fg` no habia
pintado nunca.
Ahora `v.stateRef('active')` - el estado que soma YA deriva de
highlightedIndex, registrado como fuente por parte (states: { active }).
Precedente en casa: tag-group/listbox/tabs. `severity: 'optional'` NO hace
falta (inerte: solo la leen los checks de data-*, verificado en compile.ts).
Medido (ejecutor E-tags, heredando y VERIFICANDO la edicion de un ejecutor
interrumpido - dos claims sin medir corregidos, uno de atribucion: el tono de
la activa lo enmascara [data-highlighted] (0,3,0), no este atributo):
- Sonda: 14 diffs / 2.504 valores, UNA propiedad (backgroundImage), las dos
etiquetas x 7 pases sin puntero - el velo saliendo del reposo. Hover: 0
diffs = la afordancia recuperada (reposo 224,58 / hover 212,10; antes
212,10 = 212,10). Capturas antes/despues revisadas por el supervisor.
- AX: reposo false,false - ArrowLeft false,TRUE - Escape false,false.
Exactamente una navegando, cero en reposo.
- Centinela 63/91 -> 71/91 (revive item-fg; medida directa oklch(0.2435) ->
rgb(1,2,3)), exit 0, 0 sin adjudicar, 0 STALE, ceguera-a-patrones validada
a mano (17 cubiertas, todas muertas).
- Gates: morfo 222/222 - soma tags-input 3/3 - eidos 442+1 ajeno - check 0
atribuibles - docs-check 0/0 - eidos-lint 0 invalid.
Quedan ABIERTOS y registrados en next-features 13 (sin decidir aqui): el
morfo declara apg:grid pero implementa listbox/option - Provider y Control
llevan ambos role=listbox anidados - la tinta de tono de la activa la
enmascara [data-highlighted] (12.5) - migracion a grid (B-b) como
continuacion. Y una observacion de soma al paso: ArrowLeft desde el input no
saca el foco (:381).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2 months ago |
|
|
df3a4d054b |
fix(theming): form cede el cromo de submit/reset al Button que componen
El bloque de accion de form.css vestia CUATRO nodos con las mismas 23 claves:
submit/reset (que COMPONEN el Button canonico - ahi muertas Y contradictorias:
declaraban un boton solido de tinta blanca mientras se pintaba surface verde,
discrepando en silencio desde siempre) y array-add/array-remove, <button>
PELADOS donde las 23 son su UNICO cromo y estan 23/23 VIVAS (medido montandolos
a la fuerza: la demo nunca los monta).
Ejecuta la doctrina YA FIRMADA que nombra a Form.Submit por su nombre
(component-guide.md:126-146, consumer pattern rule 5) - la opcion de escalar a
(0,2,0) queda descartada por escrito: si se quiere el submit solido, el camino
es <Form.Submit variant="solid">, no ganar la cascada.
- El bloque de accion apunta ya SOLO a los dos botones del array; mueren 4
reglas y se estrechan 5 grupos. Los 4 privados THM-2 de submit/reset fuera
(nadie los consumia): el diff del generado son EXACTAMENTE 14 lineas (su
suelo y su forward). Las 23 publicas SE QUEDAN.
- Ceder submit/reset: 0 px sobre 79.296 valores (16 escenarios, V1) + sonda
0/834 con CONTROL POSITIVO (el CSSOM vivo no contiene una sola regla de
submit/reset ni un --_form-palette-*). El cromo del array, intacto contra
los valores pre-firma; su eje de talla sigue llegando por herencia.
- Centinela 22/64 exit 0, identico conjunto: solo cambia la RAZON de las 23
("rama array que la demo no monta") - la anterior era falsa a medias (los
botones del array NO llevan data-button) y el "24" era un error triplicado
(ficha, README, ledger): son 23.
- CONTINUE: la firma del compuesto EJECUTADA; gradient-picker (36) y
emoji-picker (3) des-RANCIADOS - ejecutados el 2026-08-20/23, hoy 0
adjudicaciones por compuesto (verificado; ademas su mecanismo era OTRO:
especificidad de popover.css, no orden de emision).
- next-features 13: DOS expedientes nuevos destapados y NO ejecutados aqui:
los botones del array deben COMPONER el Button (soma+morfo, clase A-112,
y son perceptualmente mudos) - y el eje size de form NO llega a sus
acciones (<Form size="xs"> renderiza acciones md; solo sobrevive el
row-gap).
Verificacion: V1 (verificador independiente, informe recuperado de disco tras
interrupcion) + ejecutor con gates completos (vitest 442+1 ajeno - check 0
atribuibles - docs-check 0/0 - eidos-lint 0 invalid).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2 months ago |
|
|
2daa683fa4 |
fix(theming)!: file-upload pinta lo SUYO - muere el barrido de descendientes
`[data-file-upload] [data-disabled]` (0,2,0) vestia todo nodo disabled bajo el provider, HUESPEDES incluidos, y ganaba el empate por orden de import - el accidente que B' condena. Medido en la composicion documentada del composer: el textarea huesped recibia la atenuacion TRES veces (0.4^3 = 0.064, el placeholder casi ilegible) con el file-upload NI SIQUIERA disabled, y `--chat-composer-disabled-opacity` no alcanzaba nunca. - La mitad descendiente se sustituye por los CINCO selectores por parte (label, dropzone, trigger, item-remove, clear-trigger; el provider ya estaba). El morfo declara `data-disabled` exactamente en esas partes y soma lo estampa siempre junto al atributo de parte: el barrido era 100 % redundante hacia dentro - solo anadia alcance hacia fuera. - Unicidad re-censada HOY: 171 recetas, unica ocurrencia con `data-disabled`. - Medido: file-upload CERO ESTRICTO (4.608 valores x 8 estados + pase disabled propio 0/35); composer recupera EXACTAMENTE 6 valores (opacity y alpha de textarea/input, cursor x2) y nada mas - la excepcion a D-TH.5 firmada, con capturas antes/despues. - Centinela: composer 29 -> 30/33 (revive `disabled-opacity`; su excepcion EXACTA salio STALE por si sola - el reverso de la ceguera a patrones); file-upload 61/98, exit 0 ambos. - README del composer corregido: su adjudicacion "no se ve hasta que un tema mueva" era FALSA para el textarea (triple atenuacion en el tema default). - Registro: PLAN 8 entrada fechada - CONTINUE item 3 EJECUTADA - notas en las fichas de ambos. Aviso de instrumento (en el registro): la sonda sancionada es CIEGA a esta firma (sin paso disabled; su filtro del composer no ve [data-textarea]) - su cero vale como regresion, no como testigo; el gate se cumplio con instrumento dedicado, exacto y sin extras. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
2 months ago |
|
|
8244cb4a62 |
feat(theming)!: FIRMA B' - la cascada de paleta es una ESCALERA sin empates
suelo :where([data-{c}]) (0,0,0) < forward [data-{c}]:where([data-color],
[data-color-custom]) (0,1,0) < tono [data-{c}][data-color='X'] (0,2,0).
El orden de emision deja de decidir: la especificidad ES el contrato,
legible en el artefacto (doctrina hermana de la FIRMA 12.9).
- Emisor (render-css.ts): isPaletteSlotToken PARTE el bucket host - solo
las ranuras de paleta bajan al suelo, el chasis del componente queda a
(0,1,0). 49 suelos + 49 forwards reescritos + 0 pares viejos; bloques
por tono (112), capa compartida y gradient finish byte-identicos.
- Neutra en pixel, MEDIDO: ~297.000 valores computados antes/despues
(105.248 planos lotes A+B, 57.720 planos lote C, 134.464 con los tonos
ESTAMPADOS en las 49 unidades, incluidos 5 @active), 0 diffs reales.
Los 17 crudos, probados ruido por reproduccion sobre codigo identico.
- Guarda por MUTACION (active-eidos-config.test.ts): suelo con contenido,
forward de un peldano, par viejo ausente, tono sin envolver, particion
del host, cierre estructural (toda declaracion de paleta vive en un
peldano) - 6 mutaciones inyectadas, 6 mordidas. El contrato del forward
pasa de vigilar 2 recetas a 49 (privadas incluidas, multi-parte bien).
- Ledger: PALETTE_SUPERSEDED muere (describia el mundo viejo); 207 de sus
353 claves pasan a VIVAS y las 146 restantes quedan bajo PALETTE_FLOOR
(el tono-default estampado resuelve por el forward: quitar el atributo
ES hablar en silencio) o TONE_UNREACHED (ningun paso del guard estampa
tono Y hoverea), con razon medida. stepper y tag-group, barridos por
primera vez. El detector STALE es CIEGO a patrones: la retirada fue
manual y por estrechamiento, guiada por medida.
- Docs: changelog 53 - reference THM-2 - next-features 13 (RESUELTA) -
CONTINUE-theming.
Supervision: 4 agentes Opus en 5 fases (baseline plano + baseline
estampado, emisor, guarda, verificacion de parque completo, docs), con
refutacion del supervisor sobre censo, emisor y guarda.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2 months ago |
|
|
5d71d830e9 |
feat(theming)!: FIRMA §12.9 — el plano de profundidad es el SUELO, no el techo
El plano `data-depth` pinta el bundle de elevación (superficie · borde · sombra
· tipografía on-surface) y hasta hoy lo hacía a (0,1,0), la misma especificidad
que la receta del componente. La Decisión 8 daba por bueno ese empate porque
«las recetas cargan después de la fundación y ganan por ORDEN DE CASCADA».
ESA PREMISA ERA FALSA
La fundación la inyecta ActiveEidos en runtime como <style> gestionado, y las
recetas llegan como chunks code-split de Vite: a igual peso ganaba quien
cargara el último, y se midió AL REVÉS en dev que en producción (§13). No era
una decisión de diseño, era una moneda al aire — y la moneda cayó del lado del
plano.
LO QUE COSTABA, MEDIDO
Un toast `risk` y uno `fulfill` vestían la MISMA TARJETA GRIS: los seis tonos
idénticos y la franja de acento —el rasgo que identifica la intención de un
vistazo— reducida a 0,67 px de gris neutro, porque el atajo `border` del plano
pisaba el longhand `border-inline-start` en los cuatro lados. Las TRES variantes
de tooltip computaban lo mismo: `outline` indistinguible de `solid`, `ghost` un
backdrop-filter invisible tras una superficie opaca. Y ~35 claves públicas
quedaban adjudicadas como mudas en cinco componentes, con tres recetas que
habían RETIRADO su tipografía por esto.
LA REGLA
La regla de apariencia del plano se emite envuelta en `:where(...)` —
especificidad CERO. La receta gana donde el componente HABLA, en cualquier
orden de carga; el plano sigue pintando todo lo que el componente CALLA, que es
exactamente lo que significa «baseline». Vale igual para un plano que añada un
tema (jaula abierta).
EL FROST NO BAJA, Y ES DELIBERADO
`[data-depth='{plane}'][data-frost]` conserva sus (0,2,0). El baseline es un
suelo que la receta puede pisar; el frost es una petición explícita por
elemento —alguien escribió `data-frost`— y honrarla significa ganarle al fondo
propio del componente. Mismo atributo, intención opuesta: queda comentado en el
emisor para que nadie los «armonice», y el guard lo fija por los dos lados.
QUÉ MUEVE DE PÍXEL, ENTERO
De 19 adoptantes, DIECISÉIS con diff CERO sobre ~49.000 valores computados. Los
tres que se mueven son la firma haciendo su trabajo:
- toast: 35 diffs (7 fondos + 7 bordes de tono + 21 anchuras). Cuatro tonos
medidos en la demo real: 4 de 4 DISTINTOS donde antes 3 de 3 eran idénticos,
y la franja de acento pasa de 0,67 px de gris a 3 px del color de la
intención.
- tooltip: sus tres variantes vuelven a distinguirse — solid opaco con sombra,
outline transparente con borde, ghost translúcido al 70 %.
- popover, tooltip y link-preview: `line-height` de 1.25 (el `--leading-ui` del
plano) al que cada receta pide. Es EXACTAMENTE la decisión que la receta de
link-preview tenía escrita desde el 2026-08-21: «se quedan declaradas A
PROPÓSITO; retirarlas arreglaría el empate a favor del plano — una decisión
de píxel que pertenece a la firma pendiente de §12.9».
`font-family` no se movió en ninguno: las recetas piden el mismo
`--style-label-font-family` que el plano pinta, así que la seguridad
tipográfica del portal (Decisión 8) queda intacta.
Refutada una hipótesis propia: temía que el atajo `background` del plano
estuviera matando el velo de hover del sistema y que bajarlo lo resucitara
moviendo píxel. `backgroundImage` no cambia en ninguno de los 19 — el velo vive
en los ítems, no en la superficie.
EL LEDGER
17 claves salieron STALE solas y se retiran: toast (3), tooltip (5),
float-panel (5), link-preview (2), popover (2). Los cinco vuelven verdes —
toast pasa de 51/85 a 72/85. El ledger sigue en 87 bloques, sin duplicados, y
parsea.
DOS VECES QUE EL INSTRUMENTO MINTIÓ
La sonda compartida mide UN nodo en dialog, drawer, popover, tooltip,
context-menu, dropdown-menu y link-preview: nunca abre la superficie, que es
justo donde el plano pinta, así que sus «0 diffs» no probaban nada. La medición
buena reproduce el «antes» EN RUNTIME, inyectando la regla vieja a (0,1,0) al
final del head en vez de revertir el fichero — entra como
`scripts/__plane-open.mjs`.
Y el primer barrido del ledger dio 87 de 87 rojos: «todos fallan igual» es la
firma del instrumento, y era la misma trampa del CR de Python en Windows que ya
está registrada. Re-corrido con la lista limpia.
EL BARRIDO DEL LEDGER ENTERO
87 de 87 componentes con entrada en el ledger, re-corridos tras el flip: cero
NO EFFECT sin adjudicar, cero STALE, cero errores. El cambio es global y se
verificó globalmente.
GUARDS
vitest src/uix/eidos 439/440 (el rojo conocido skin-media-player) ·
active-eidos-config 75/75 · npm run check COMPLETED con los 72 errores
preexistentes de la rama y ninguno en ficheros de este cambio · rtl:check 0 ·
docs:check 0 · eidos-lint 0 invalid en los cinco tocados · capturas de las tres
superficies que se mueven.
Un test hermano afirmaba el selector desnudo para un plano añadido por un tema:
ahora afirma `:where()`, porque un plano de tema es un suelo igual que los
cinco de fábrica.
Doctrina en docs/theming/changelog.md §29 (junto a la Decisión 8 que corrige),
cierre del expediente en next-features §13 y handoff al día.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2 months ago |
|
|
b8eccc1c4f |
uix(toast): temable — 98 % → 100 %, y el plano se lleva la TARJETA ENTERA
El contrato ya tenía sus 85 claves y `global` era CERO: no se acuña ninguna.
Lo único fuera de alcance era un literal, y era identidad.
Lo que entra:
- `opacity: 1` de la tarjeta firmado con su anotación `/* literal: */`
(recipe-contract §3): es el polo EN REPOSO del par abierto/cerrado, y el
que lleva tokens es el otro (`closed-offset`, `closed-scale`). «Presente
del todo» no tiene un segundo valor que sostener. 98 % → 100 %.
- Guard R-5.4: entrada nueva en `COMPONENT_OVERRIDES` que dispara la tarjeta
con el botón del demo — y que DELIBERADAMENTE no pone `openMarker`. Una
tarjeta se auto-descarta a los 5 s, así que «¿ya está abierta?» no tiene
respuesta útil: con `openMarker` tres corridas sobre código idéntico
discreparon en QUÉ token leía muerto. Sin él, el guard cae al marcador por
defecto (una parte que este componente no tiene) y dispara una tarjeta
nueva antes de CADA token: **51/85 en tres corridas seguidas**, determinista.
- Ledger: 34 adjudicaciones, ninguna retirada, todas MEDIDAS.
- La sonda aprende a disparar el toast (`DEMO_VARIANTS`): medía UN nodo (el
viewport) porque un toast no EXISTE hasta que algo lo lanza. Ahora 8.
EL HALLAZGO — §12.9 con una cara nueva y con coste de PRODUCTO:
`toast-item.svelte` sella `data-depth='overlay'`, y el plano declara
`background`, el ATAJO `border` y `box-shadow` con la misma especificidad
(0,1,0) y más tarde. Medido sobre la tarjeta real con transiciones congeladas:
escribir `--toast-{tono}-surface` / `-border`, `--toast-provider-border-width`,
`--toast-accent-width` o `--toast-provider-shadow` no mueve NADA; escribir
`--depth-overlay-surface` / `-border` / `-shadow` y `--border-width` en la
misma raíz lo repinta todo. Son 21 claves de 85, y a diferencia de `tooltip`
esto se VE: un toast `risk` y uno `fulfill` visten la misma tarjeta gris, y la
franja de acento —un `border-inline-start` que el atajo posterior pisa en los
cuatro lados— no aparece nunca en reposo.
Matiz que sólo aparece midiendo: los seis `{tono}-accent` NO están muertos.
Bajo `[data-loading]` la regla del pulso es (0,2,0) y su `@keyframes` gana a
toda declaración normal — 100 fotogramas del pulso real: sin escribir, el
color interpolado corre en oklab L 0.5032..0.8514; con el token en rgb(1,2,3),
0.0823..0.5032. La misma clave miente en reposo y dice la verdad en animación.
§12.9 sigue SIN FIRMAR, así que las 21 se ADJUDICAN con `PLANE_SUPERSEDED` y
la incidencia se registra en `next-features.md` §12. No se toca desde este eje.
Las 13 restantes: la pareja de transición (el guard congela `transition`),
`closed-offset` / `closed-scale` (estado de salida + `transform`, que el guard
no fotografía), los tres del anillo de foco de la acción (el guard hace
`blur`), los cinco `{tono}-action-hover-bg` (el guard estampa el tono en su
pasada estática y no en la de hover) y `provider-max-width`, cuyo centinela de
1234px se capa contra el `min(100%, …)` — medido desde el otro lado, 120px
encoge la tarjeta de 420 a 280.
Censo: 98 % → 100 % (45 knobs · 45 públicos · 0 globales · 0 privados ·
1 excepción firmada). Global 68 %, al 100 % 42 → 45. Sin cambios en
`recipes/base.ts` ni en `generated/base.css`.
Diff de computed: **0 diffs sobre 1.760 valores en 7 estados** (8 nodos en
reposo, 7 en hover). Capturas 2× de la tarjeta byte a byte idénticas — y van
por un script propio, porque su viewport es `position: fixed` y cae fuera del
recorte del escenario que usa `__shot`.
Más README con su sección «Talla y tema», pestaña `Tokens` en la demo (85
claves, verificada en el navegador) y ficha con veredicto §5.
Guards: centinela 51/85 verde (exit 0, sin STALE) · `component-audit --only
toast` PASS · `eidos-lint toast` 0 invalid (24 morfo-backed, 6 eidos-only) ·
`vitest run src/uix/eidos` 35/36 (el rojo conocido es `skin-media-player`) ·
`rtl:check` 0 · `docs:check` 0 · `check` COMPLETED sin un solo error en
ficheros de toast · prettier limpio sobre el contenido normalizado a LF.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2 months ago |
|
|
4d3ca2fd81 |
uix(slider): temable — 97 % → 100 %, y con un solo valor el tick ACTIVO no existe
CERO claves acuñadas. El componente llegaba con `global` a cero, `private` a
cero —sus cuatro privados son la escala por talla, que ya deriva de públicos— y
treinta y nueve claves cubriendo su cromo entero; lo único fuera de alcance era
UN literal. Este commit lo firma, adjudica sus siete silenciosas y escribe los
artefactos que le faltaban.
QUÉ ENTRA
- **El literal se firma como identidad**: `inline-size: 100%` en
`[data-slider][data-orientation='horizontal']` — un rail ocupa su contenedor.
El knob de verdad ya existe y es su SUELO: `min-inline-size`. Mismo
precedente que `separator.css:26`, cerrado el mismo día también sin acuñar.
- **Siete adjudicaciones en el ledger**, todas MEDIDAS sobre los nodos reales,
con `transition` congelada salvo donde el token ES la transición:
- `min-block-size` — sólo la lee `[data-orientation='vertical']` y el
escenario arranca horizontal. Con el chip de orientación: 160px -> 1234px.
- `active-thumb-scale` / `active-thumb-shadow` — el pickup vive en
`[data-slider-thumb]:active`, que pide el puntero MANTENIDO, y el pase
estático del guard lo aparca. Con `mouse.down()` real sobre el thumb real:
scale 1.15 -> 4.56, y la sombra sigue al centinela.
- `active-tick-bg` — un tick lleva `data-active` sólo mientras su valor cae
DENTRO de [min(valores), max(valores)] (soma, `SliderTickProvider.isActive`),
así que un pulgar único en 40 con ticks en 0/50/100 deja los tres inactivos:
la marca activa no es un estado del tick, es una RELACIÓN CON EL RANGO. Con
el chip `multiple` (20–80) el tick 50 se activa y el token alcanza.
- `disabled-opacity` — el escenario arranca habilitado; con su interruptor,
0.4 -> 0.123.
- `transition-duration` / `transition-ease` — SON la transición que el guard
congela; medidos sin congelar, 0.12s -> 11.5s y steps(4).
- README con su sección «Talla y tema» (39 claves por grupo, con la distinción
`hit-size-{k}` = agarre vs `track-size-{k}` = pintura) y veredicto §5 de la
ficha con las cifras.
QUÉ NO SE TOCA
- **Nada se retira ni se renombra**, y no es prudencia: este contrato lo COMPONEN
otros SIETE componentes que re-tiñen o re-dimensionan estas mismas claves sobre
su Slider embebido — `media-player`, `skin-media-player`, `waveform` (su
playhead ES este thumb), `color-picker`, `gradient-builder`,
`image-adjustments` y `time-range-picker`. `min-block-size`, que el centinela
leía muerta, es justo la que `media-player` escribe para su volumen vertical.
- `base.ts` y `generated/base.css`: sin cambio de contrato no hay nada que
regenerar. 39 -> 39 claves.
ARTEFACTOS
- Censo: 97 % (33 knobs · 31 públicos · 1 literal · 1 sistema) -> **100 %**
(32 · 31 · 0 literal · 1 excepción · 1 sistema). Global 68 %, no baja.
- Sonda antes/después: **0 diffs sobre 1.376 valores computados**, 7 estados,
7 nodos (raíz · secondary-range · range · thumb · 3 ticks).
- Captura 2× antes y después: idénticas.
- Centinela R-5.4: **32/39**, las 7 restantes adjudicadas -> verde.
- component-audit PASS · eidos-lint 25 morfo-backed / 5 eidos-only / **0
invalid** · `vitest run src/uix/eidos` 35/36 ficheros (el rojo conocido es
`skin-media-player`) · rtl:check 0 · docs:check 0.
- `npm run check`: UN error en `web/routes/uix/components/slider/+page.svelte`
(`Property 'keyboard' does not exist`, línea del `sliderMorfo.parts[2]`),
**PREEXISTENTE** desde `1857c7854` y ajeno a este commit; ningún otro error en
ficheros de slider.
- Prettier: los hunks de deriva del fichero son los MISMOS que en HEAD (2 en el
README, 0 en el CSS); mi bloque no añade ninguno.
NOTA DE CONCURRENCIA: la pestaña `Tokens` de su demo (paso 11 del protocolo) la
escribí yo, pero entró en HEAD por `9fc38b19a` + `c88b2f861` de otra sesión, que
la arrastró con un `git add` derivado y lo declaró. No se re-commitea aquí.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2 months ago |