You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
svelte-kit-vice/scripts/theming-census-debt.ts

1465 lines
119 KiB

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
/**
* theming-census-debt — the theme-reach DEBT of the catalogue, registered.
*
* WHAT THIS IS, AND WHAT IT IS NOT. This is NOT an exceptions file. An
* exception asserts «this is fine»; every key below asserts the opposite:
* «this declaration does NOT reach a theme, we measured it, and we are
* freezing it so it cannot grow». It is the other class of written act —
* the sibling of `theming-sentinel-exceptions.ts` in MECHANISM (one written
* line per key, a STALE detector on top) and its opposite in MEANING.
*
* The exception valve is untouched and lives elsewhere: a literal with its
* `/* literal: <reason> *​/` annotation on the declaration (recipe-contract
* §3, class `exception` in the census) and the component-level
* `R-5.1 exception: <reason>` of a README. Those say «signed deviation».
* This file says «unpaid debt, counted».
*
* WHY IT EXISTS. Until 2026-08-25 the floor of this axis was two COARSE
* ceilings (`maxLiteral` / `maxGlobal`): the catalogue could add five
* regressions and hide them under five unrelated fixes, because only the
* TOTAL was asserted. R-5.1 could not graduate to `error` against a total,
* either — a per-component rule needs a per-component truth. The ratchet is
* now PER KEY: a literal or a raw global outside this ledger is a
* regression, and a ledger entry that is no longer debt is STALE. The debt
* only shrinks, key by key. Same doctrine as R-5.4 («a declaration that
* reads no token and carries no act, lies») and the same mechanism that
* caught 18 STALE entries in `toast` the day this was written.
*
* HOW A KEY ENTERS. Only by signature. This baseline was generated ONCE,
* on 2026-08-25, from the census of that day. Regenerating it wholesale
* (`node --import tsx/esm scripts/theming-census.ts --debt --write`) erases
* the ratchet, which is why the writer prints the delta it is about to
* commit: an author reads that delta and decides. New debt is not registered
* by re-running the generator — it is tokenized, or annotated, or signed.
*
* HOW A KEY LEAVES. Four ways, all of them progress:
* 1. TOKENIZED — the declaration now reads `var(--{c}-…)`;
* 2. ANNOTATED — it gained its `/* literal: <reason> *​/` (class
* `exception`), so it is a signed deviation and no longer debt;
* 3. DEAD — the declaration, the rule or the component is gone;
* 4. SYSTEM — it moved to a transversal system the recipe consumes.
* In all four the guard reports the entry as STALE and it must be deleted
* in the same commit that earned it. A stale entry is the same debt as a
* stale allowlist row: it claims a knob is broken that is already fixed.
*
* THE KEY. `{class} · {file} · {selector} · {property}` — deliberately
* LINE-INDEPENDENT, so moving a rule, reformatting a file or inserting a
* comment above it does not fabricate a regression. Repeated identically
* (the same property under the same selector in a `@media` block and in the
* base rule) it appears twice: the comparison is a MULTISET, so the count
* is part of the freeze and a duplicated declaration cannot slip in.
* Two consequences worth knowing before they surprise anyone:
* · renaming a selector reads as one STALE + one new key. That is the
* ratchet working as designed — the debt moved and gets re-signed;
* · turning a literal into a raw global (`8px` → `var(--space-2)`) does
* the same, because the CLASS is part of the identity. It is a partial
* improvement, and re-signing it is what records the improvement.
*
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
* THE WIP TRACKS ARE IN — `palabras` (272 global + 86 literal + 1 private) and
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
* `chronos` (198 global + 11 literal + 14 private) are 582 of the 1148 keys, and they
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
* are registered like everyone else, for one reason: **debt is real
* wherever it lives**. `component-audit` excludes those tracks from its
* catalogue so WIP noise does not read as catalogue breakage — a rule about
* a COMPONENT'S completeness. This ledger answers a different question, the
* catalogue-wide one the floor test asks, and leaving a third of the debt
* out of it would make F3's gate («census 100 % adjudicated») a claim about
* two thirds of the catalogue. Their entries retire when their own track
* tokenizes, not by a commit of this axis.
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
* ⚠ ONE CAVEAT, MEASURED AND WRITTEN DOWN (2026-08-25, adversarial review of
* the debt-B axis) and ADJUDICATED SINCE (2026-08-27): for `palabras` the
* census's classification is wrong, and that is no longer in question. Its two
* recipes consume 117 distinct `--palabras-*` names (103 with a
* `var(…, fallback)`, 14 without — all 117 under `--palabras-scheme-*`) and
* declare ZERO of them; they are not a theme contract but the live projection
* of the document's `scheme-style`, written per instance as
* `--palabras-scheme-*` by `schemeCssVars` (`palabras-scheme.ts:327`). That is
* a VALUE channel — the axis the census's own `channel` class already names —
* so the knobs scored `public` there are misclassified and the «22 % reach» is
* not partial theme reach. What is adjudicated is the VERDICT; the EXECUTION
* is planned and still awaits the author's signature, so the census keeps
* scoring `palabras` the old way until that lands.
*
* ⚠ AND THE PARTITION IS NOT HOMOGENEOUS — measured 2026-08-27, the fact the
* original caveat never carried. Of the 117 names the recipes consume, the
* DEFAULT scheme emits only 74. The other 43 it never writes, so for those the
* FALLBACK in the CSS *is* the design value: nothing per-instance ever
* overrides them, and calling them a value channel would describe a channel
* that carries nothing. (`schemeCssVars` emits 75 names in all — the 74 plus
* `--palabras-scheme-mark-highlight-bg`, which no recipe reads. `117 − 75 = 42`
* is therefore the wrong subtraction; the measured split is 74 / 43.) The 43
* are not unreachable: the emitter is generic over route × prop, so a
* registered scheme could set any of them — they are simply absent from the
* shipped default. Which is why the execution cannot be one stroke over the
* `--palabras-scheme-*` prefix: the two halves are different objects and only
* the emitted half is the channel the verdict names.
*
* What none of that changes is the 359 keys below: they are literals, raw
* globals and one non-derived private (a `::before` inline-size) either way.
* They are frozen AS THE CENSUS MEASURES THEM, which is all a ledger ever
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
* claims — never that the measurement has been adjudicated.
*
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
* WHAT IS NOT HERE — AND THE HOLE THAT CLOSED. The first baseline registered
* only `global` and `literal`; the census's third unreached class, a `private`
* that does NOT derive from a public (318 knobs), had no per-key ratchet and
* this header named that as a hole rather than hiding it. **It is closed.**
* The 318 were adjudicated key by key in two moves, and both are mechanical
* from here on:
*
* 1. the census learned to READ the two shapes the doctrine had already
* adjudicated — the THM-2 palette `bridge` (132) and the per-instance
* value `channel` (36), decided off the GENERATOR'S OUTPUT and not off a
* name (see `PALETTE_BRIDGE` in `theming-census.ts`);
* 2. the remaining RESIDUE of 150 was split by measurement: 84 knobs whose
* shape the doctrine blesses ONE LEVEL BELOW the knob carry a written
* `/* private: <reason> *​/` on the declaration that establishes the
* mechanism — class `exception`, the canon's existing signed-deviation
* class, not a new tier — and the other 66 are registered below like any
* other debt.
*
* So `private` is now a `DebtClass` beside `global` and `literal`: a knob
* reading a private that derives from nothing is new debt, named, and has the
* same three exits as the other two (tokenize it, sign it, register it) plus
* the same STALE detector on the way out. A `private · …` entry that gains its
* annotation, or whose private starts deriving from a public, reports STALE
* and its line goes in the commit that earned it.
*
* What remains outside the ledger is only what is outside the RATIO by
* design: `system`, `structural`, `bridge`, `channel` and `exception` — four
* measured classes and one written act, each documented where it is decided.
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
*
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
* ── ACTA 2026-08-26 — the whole `tabs` key RETIRED, two entries ─────────────
* `global · tabs.css · [data-tabs-indicator] · {block-size, inline-size}` were
* the last two, and they left by exit 1 (TOKENIZED) read strictly, by exit 4
* (SYSTEM) read honestly: the declarations did not change shape, the NAME they
* read did. Firma §14 («MeasuredIndicator con nombre poseído»): the shared soma
* layer used to publish the measured rect as a bare `--indicator-{x,y,w,h}` —
* PUBLIC in shape and owned by nobody, which is why the census could only score
* it `global` and why the closed-namespace law never saw it (that law audits
* `--{c}-*`, and a name with no component prefix is foreign vocabulary). The
* layer now writes into the HOST's namespace, `--_tabs-indicator-*`, so the two
* knobs read as what they always were: the value CHANNEL, out of the ratio.
* Measured: `tabs` global 2 → 0, channel 0 → 2, reach 97 % → 100 %, knobs 77
* unchanged; catalogue `atHundred` 65 → 66. No key was tokenized away and no
* debt was forgiven — a misclassification was corrected at its source, which is
* exactly the reading the header's «renaming a selector reads as one STALE + one
* new key» paragraph anticipates, except here the new key belongs to a class
* this ledger does not register.
*
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
* ── ACTA 2026-08-27 (M0) — two entries RETIRED: the CLASS they registered was
* false ─────────────────────────────────────────────────────────────────────
* `literal · palabras.css · …table[data-palabras-table-zebra]… · background` and
* the whole `split-button` key (`global · split-button.css ·
* [data-dropdown-menu-content][data-split-button-menu] · min-inline-size`) were
* the two knobs the census misread because its needle demanded a literal
* `var(--` and prettier had broken both declarations across lines (`var( --`).
* The zebra always read the component's own public token; the split-button
* `min-inline-size` always read a per-instance value CHANNEL. This is NOT debt
* forgiven — nothing in either recipe changed — it is a misclassification
* corrected at its source, same reading as the `tabs` acta above. Detail and
* measurement: the ACTA over `classify` in `theming-census.ts`.
*
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
* ── ACTA 2026-08-27 (SS16, clase D) — two `gradient-picker` entries RETIRED ──
* `global · gradient-picker.css · {.gradient-picker-trigger-swatch,
* [data-gradient-picker-value-swatch]} · background` left by exit 4 (SYSTEM)
* read honestly, exit 1 (TOKENIZED) read strictly: NOTHING changed shape in the
* recipe — the two `background` declarations read the same channel they always
* read, under a new NAME. Same animal as the `tabs` acta above, one floor down.
* Soma stamped the user's live gradient as `--gp-current-gradient`: public in
* shape, owned by nobody, and ABBREVIATED against theming §6 r5 — so the census
* could only score it `global` and the closed-namespace law never saw it (that
* law audits `--{c}-*`; a name with no component prefix is foreign vocabulary).
* It now writes `--_gradient-picker-current-gradient`, in the component's own
* namespace and unabbreviated, so the two knobs read as what they always were:
* the value CHANNEL, out of the ratio. Measured: `gradient-picker` global 2 → 0,
* channel 0 → 2, reach 96 %, 27 knobs unchanged. No debt was forgiven — a
* misclassification was corrected at its source. The sibling flip of the same
* firma, `--tree-depth` → `--_tree-view-depth`, retires NO entry here: that
* calc also reads `--tree-view-indent`, so the census already scored it
* `bridge` and the bare name never reached this ledger.
* ⚠ AND THE HEADER FIGURE MOVED WITH IT (corrected 2026-08-27, same firma,
* at its close): the WIP-track paragraph above said «582 of the 1150 keys»,
* which was the total before those two lines were retired. The tracks
* themselves did not move — `palabras` 359 + `chronos` 223 = 582 either way —
* so only the denominator was stale: `--debt` reports **1148 · 0 new · 0
* stale**. A total quoted in prose is not regenerated by anything, which is
* exactly why it went stale in the same pass that moved the list.
*
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
* Generated: `node --import tsx/esm scripts/theming-census.ts --debt --write`
* Checked: `node --import tsx/esm scripts/theming-census.ts --debt`
* Guarded: `src/uix/eidos/theming-reach-floor.test.ts` (catalogue) +
* `component-audit` R-5.1 / R-5.2 (per component).
*/
export const CENSUS_DEBT: Record<string, string[]> = {
accordion: [
"literal · accordion.css · [data-accordion-content][data-orientation='horizontal'] · inline-size",
"literal · accordion.css · [data-accordion-indicator] [data-svg='chevron'] · block-size",
"literal · accordion.css · [data-accordion-indicator] [data-svg='chevron'] · inline-size",
'literal · accordion.css · [data-accordion-trigger] · inline-size',
'literal · accordion.css · [data-accordion] · inline-size'
],
announce: ['global · announce.css · [data-announce-region] · font-family'],
'audio-player': [
"global · audio-player.css · [data-media-player][data-variant='bar'] [data-media-player-time-slider] · min-inline-size",
"global · audio-player.css · [data-media-player][data-variant='inline'] · padding",
'global · audio-player.css · [data-media-player][data-variant] [data-media-player-artist] · color',
'global · audio-player.css · [data-media-player][data-variant] [data-media-player-artist] · font-size',
'global · audio-player.css · [data-media-player][data-variant] [data-media-player-controls] · gap',
'global · audio-player.css · [data-media-player][data-variant] [data-media-player-live-indicator][data-live] · color',
'global · audio-player.css · [data-media-player][data-variant] [data-media-player-live-indicator][data-live] · font-size',
'global · audio-player.css · [data-media-player][data-variant] · padding'
],
aura: [
'global · aura.css · [data-aura-ring] · border-radius',
'literal · aura.css · [data-aura-indicator] canvas · block-size',
'literal · aura.css · [data-aura-indicator] canvas · inline-size',
'literal · aura.css · [data-aura-region] · block-size',
'literal · aura.css · [data-aura-region] · inline-size',
'literal · aura.css · [data-aura-ring] svg · block-size',
'literal · aura.css · [data-aura-ring] svg · inline-size'
],
'card-group': [
'literal · card-group.css · [data-card-group-item] · block-size',
'literal · card-group.css · [data-card-group] · inline-size'
],
carousel: [
'literal · carousel.css · [data-carousel][data-block] · inline-size',
"literal · carousel.css · [data-carousel][data-orientation='vertical'] [data-carousel-indicator-group] · inline-size",
"literal · carousel.css · [data-carousel][data-orientation='vertical'] [data-carousel-item-group] · block-size",
"literal · carousel.css · [data-carousel][data-orientation='vertical'] [data-carousel-item] · block-size",
"literal · carousel.css · [data-carousel][data-orientation='vertical'] [data-carousel-viewport] · block-size"
],
chart: [
'literal · chart.css · [data-chart-bar-list-bar] · block-size',
'literal · chart.css · [data-chart-bar-list] · inline-size',
'literal · chart.css · [data-chart-bar-segment-fill] · block-size',
'literal · chart.css · [data-chart-bar-segment] · inline-size',
'literal · chart.css · [data-chart-empty] · block-size',
'literal · chart.css · [data-chart-figure] · inline-size',
'literal · chart.css · [data-chart-frame] · inline-size',
'literal · chart.css · [data-chart-plot] · inline-size',
'literal · chart.css · [data-chart-tooltip] · min-inline-size',
'literal · chart.css · [data-chart] · inline-size'
],
chronos: [
'global · chronos.css · .chronos-agenda · gap',
'global · chronos.css · .chronos-agenda-date · color',
'global · chronos.css · .chronos-agenda-date · font-size',
'global · chronos.css · .chronos-agenda-date · font-weight',
'global · chronos.css · .chronos-agenda-dot · block-size',
'global · chronos.css · .chronos-agenda-dot · border-radius',
'global · chronos.css · .chronos-agenda-dot · inline-size',
'global · chronos.css · .chronos-agenda-empty · color',
'global · chronos.css · .chronos-agenda-group · gap',
'global · chronos.css · .chronos-agenda-item · background',
'global · chronos.css · .chronos-agenda-item · border',
'global · chronos.css · .chronos-agenda-item · border-radius',
'global · chronos.css · .chronos-agenda-item · color',
'global · chronos.css · .chronos-agenda-item · gap',
'global · chronos.css · .chronos-agenda-item · padding',
'global · chronos.css · .chronos-agenda-list · gap',
'global · chronos.css · .chronos-agenda-time · color',
'global · chronos.css · .chronos-agenda-time · font-size',
'global · chronos.css · .chronos-bands · gap',
'global · chronos.css · .chronos-chip-title · font-weight',
'global · chronos.css · .chronos-clock-endpoint · gap',
'global · chronos.css · .chronos-date-badge · border',
'global · chronos.css · .chronos-date-badge · border-radius',
'global · chronos.css · .chronos-date-badge · line-height',
'global · chronos.css · .chronos-date-badge · min-inline-size',
'global · chronos.css · .chronos-date-badge · padding',
'global · chronos.css · .chronos-date-badge-day · color',
'global · chronos.css · .chronos-date-badge-day · font-size',
'global · chronos.css · .chronos-date-badge-day · font-weight',
'global · chronos.css · .chronos-date-badge-month · color',
'global · chronos.css · .chronos-date-badge-month · font-size',
'global · chronos.css · .chronos-date-badge-month · font-weight',
'global · chronos.css · .chronos-day-cell-head · gap',
'global · chronos.css · .chronos-drag-preview · box-shadow',
'global · chronos.css · .chronos-editor-error · color',
'global · chronos.css · .chronos-editor-error · font-size',
'global · chronos.css · .chronos-editor-error · gap',
'global · chronos.css · .chronos-editor-fields · gap',
'global · chronos.css · .chronos-field · gap',
'global · chronos.css · .chronos-field-label · color',
'global · chronos.css · .chronos-field-label · font-family',
'global · chronos.css · .chronos-field-label · font-size',
'global · chronos.css · .chronos-field-label · font-weight',
'global · chronos.css · .chronos-legend · gap',
'global · chronos.css · .chronos-legend · padding-block-start',
'global · chronos.css · .chronos-legend-item · color',
'global · chronos.css · .chronos-legend-item · font-size',
'global · chronos.css · .chronos-legend-item · gap',
'global · chronos.css · .chronos-legend-swatch · block-size',
'global · chronos.css · .chronos-legend-swatch · border-radius',
'global · chronos.css · .chronos-legend-swatch · inline-size',
'global · chronos.css · .chronos-nav-group > :not(:first-child) · border-inline-start',
'global · chronos.css · .chronos-nav-group · border',
'global · chronos.css · .chronos-nav-group · border-radius',
'global · chronos.css · .chronos-overlay · gap',
'global · chronos.css · .chronos-pair, .chronos-band-row · gap',
'global · chronos.css · .chronos-pair-sep · color',
'global · chronos.css · .chronos-peek-allday [data-chronos-event-chip] · padding-block',
'global · chronos.css · .chronos-peek-allday · gap',
'global · chronos.css · .chronos-peek-body · border-block-start',
'global · chronos.css · .chronos-peek-body · padding-block-start',
'global · chronos.css · .chronos-peek-col · border-inline-start',
'global · chronos.css · .chronos-peek-daynum · color',
'global · chronos.css · .chronos-peek-daynum · font-size',
'global · chronos.css · .chronos-peek-daynum · font-weight',
'global · chronos.css · .chronos-peek-daynum · line-height',
'global · chronos.css · .chronos-peek-daynum[data-today] · background',
'global · chronos.css · .chronos-peek-daynum[data-today] · block-size',
'global · chronos.css · .chronos-peek-daynum[data-today] · border-radius',
'global · chronos.css · .chronos-peek-daynum[data-today] · color',
'global · chronos.css · .chronos-peek-daynum[data-today] · min-inline-size',
'global · chronos.css · .chronos-peek-empty · color',
'global · chronos.css · .chronos-peek-empty · font-size',
'global · chronos.css · .chronos-peek-empty · padding-block',
'global · chronos.css · .chronos-peek-fulldate · color',
'global · chronos.css · .chronos-peek-fulldate · font-size',
'global · chronos.css · .chronos-peek-head · border-block-end',
'global · chronos.css · .chronos-peek-head · gap',
'global · chronos.css · .chronos-peek-head · padding-block-end',
'global · chronos.css · .chronos-peek-hour · color',
'global · chronos.css · .chronos-peek-hour · font-size',
'global · chronos.css · .chronos-peek-resize · inline-size',
'global · chronos.css · .chronos-peek-resize::after · background',
'global · chronos.css · .chronos-peek-resize::after · block-size',
'global · chronos.css · .chronos-peek-resize::after · border-radius',
'global · chronos.css · .chronos-peek-resize::after · inline-size',
'global · chronos.css · .chronos-peek-resize:hover::after, .chronos-peek-resize:active::after · background',
'global · chronos.css · .chronos-peek-resize:hover::after, .chronos-peek-resize:active::after · block-size',
'global · chronos.css · .chronos-peek-slot · border-block-end',
'global · chronos.css · .chronos-peek-weekday · color',
'global · chronos.css · .chronos-peek-weekday · font-size',
'global · chronos.css · .chronos-peek-weekday · font-weight',
'global · chronos.css · .chronos-range · color',
'global · chronos.css · .chronos-range · font-size',
'global · chronos.css · .chronos-resize-handle · inline-size',
'global · chronos.css · .chronos-resize-handle-b · block-size',
'global · chronos.css · .chronos-swatch · block-size',
'global · chronos.css · .chronos-swatch · border',
'global · chronos.css · .chronos-swatch · border-radius',
'global · chronos.css · .chronos-swatch · inline-size',
'global · chronos.css · .chronos-swatch[data-selected] · box-shadow',
'global · chronos.css · .chronos-swatches · gap',
'global · chronos.css · .chronos-tg-alldaycol · border-inline-start',
'global · chronos.css · .chronos-tg-alldaycol · gap',
'global · chronos.css · .chronos-tg-alldaycol · padding',
'global · chronos.css · .chronos-tg-body · padding-block-start',
'global · chronos.css · .chronos-tg-col · border-inline-start',
'global · chronos.css · .chronos-tg-dayhead · border-inline-start',
'global · chronos.css · .chronos-tg-dayhead · color',
'global · chronos.css · .chronos-tg-dayhead · font-size',
'global · chronos.css · .chronos-tg-dayhead · gap',
'global · chronos.css · .chronos-tg-dayhead · padding-block',
'global · chronos.css · .chronos-tg-dayhead[data-today] .chronos-tg-daynum · block-size',
'global · chronos.css · .chronos-tg-dayhead[data-today] .chronos-tg-daynum · border-radius',
'global · chronos.css · .chronos-tg-dayhead[data-today] .chronos-tg-daynum · color',
'global · chronos.css · .chronos-tg-dayhead[data-today] .chronos-tg-daynum · font-weight',
'global · chronos.css · .chronos-tg-dayhead[data-today] .chronos-tg-daynum · min-inline-size',
'global · chronos.css · .chronos-tg-head, .chronos-tg-allday · border-block-end',
'global · chronos.css · .chronos-tg-hour · color',
'global · chronos.css · .chronos-tg-hour · font-size',
'global · chronos.css · .chronos-tg-now::before · block-size',
'global · chronos.css · .chronos-tg-now::before · border-radius',
'global · chronos.css · .chronos-tg-now::before · inline-size',
'global · chronos.css · .chronos-tg-railcell · color',
'global · chronos.css · .chronos-tg-railcell · font-size',
'global · chronos.css · .chronos-tg-slot · border-block-end',
'global · chronos.css · .chronos-tg-sticky · background',
'global · chronos.css · .chronos-title-block · gap',
'global · chronos.css · .chronos-title-row · gap',
'global · chronos.css · .chronos-tooltip · gap',
'global · chronos.css · .chronos-tooltip-meta · color',
'global · chronos.css · .chronos-tooltip-meta · font-size',
'global · chronos.css · .chronos-type-option · gap',
'global · chronos.css · .chronos-type-swatch · block-size',
'global · chronos.css · .chronos-type-swatch · border-radius',
'global · chronos.css · .chronos-type-swatch · inline-size',
'global · chronos.css · .chronos-week-badge · border',
'global · chronos.css · .chronos-week-badge · border-radius',
'global · chronos.css · .chronos-week-badge · color',
'global · chronos.css · .chronos-week-badge · font-size',
'global · chronos.css · .chronos-week-badge · padding',
'global · chronos.css · .chronos-when [data-time-range-picker] · gap',
'global · chronos.css · .chronos-when · background',
'global · chronos.css · .chronos-when · border',
'global · chronos.css · .chronos-when · border-radius',
'global · chronos.css · .chronos-when · gap',
'global · chronos.css · .chronos-when · padding',
'global · chronos.css · .chronos-when-field · gap',
'global · chronos.css · .chronos-when-hint · color',
'global · chronos.css · .chronos-when-hint · font-size',
'global · chronos.css · .chronos-when-label · color',
'global · chronos.css · .chronos-when-label · font-size',
'global · chronos.css · .chronos-when-label · font-weight',
'global · chronos.css · .chronos-when-warn · color',
'global · chronos.css · .chronos-when-warn · font-size',
'global · chronos.css · .chronos-when-warn · gap',
'global · chronos.css · [data-chronos-day-cell] · border-inline-end',
'global · chronos.css · [data-chronos-day-cell] · padding',
'global · chronos.css · [data-chronos-day-cell][data-outside-month] [data-chronos-day-number] · color',
'global · chronos.css · [data-chronos-day-cell][data-today] [data-chronos-day-number] · border-radius',
'global · chronos.css · [data-chronos-day-cell][data-today] [data-chronos-day-number] · color',
'global · chronos.css · [data-chronos-day-cell][data-today] [data-chronos-day-number] · font-weight',
'global · chronos.css · [data-chronos-day-cell][data-weekend], [data-chronos-day-cell][data-outside-month] · background',
'global · chronos.css · [data-chronos-day-number] · block-size',
'global · chronos.css · [data-chronos-day-number] · color',
'global · chronos.css · [data-chronos-day-number] · font-size',
'global · chronos.css · [data-chronos-day-number] · min-inline-size',
'global · chronos.css · [data-chronos-day-peek] · gap',
'global · chronos.css · [data-chronos-event-chip] · border-radius',
'global · chronos.css · [data-chronos-event-chip] · font-size',
'global · chronos.css · [data-chronos-event-chip] · gap',
'global · chronos.css · [data-chronos-event-chip] · padding-inline',
'global · chronos.css · [data-chronos-event-chip][data-timed] · padding-block',
'global · chronos.css · [data-chronos-grid-head] · border-block-end',
'global · chronos.css · [data-chronos-grid-row]:not(:last-child) · border-block-end',
'global · chronos.css · [data-chronos-grid] · background',
'global · chronos.css · [data-chronos-grid] · border',
'global · chronos.css · [data-chronos-grid] · border-radius',
'global · chronos.css · [data-chronos-head-cell] · color',
'global · chronos.css · [data-chronos-head-cell] · font-size',
'global · chronos.css · [data-chronos-head-cell] · font-weight',
'global · chronos.css · [data-chronos-head-cell] · padding-block',
'global · chronos.css · [data-chronos-heading] · color',
'global · chronos.css · [data-chronos-heading] · font-size',
'global · chronos.css · [data-chronos-heading] · font-weight',
'global · chronos.css · [data-chronos-peek-panel] · min-block-size',
'global · chronos.css · [data-chronos-peek-panel] · min-inline-size',
'global · chronos.css · [data-chronos-time-view] · background',
'global · chronos.css · [data-chronos-time-view] · border',
'global · chronos.css · [data-chronos-time-view] · border-radius',
'global · chronos.css · [data-chronos-toolbar] · gap',
'global · chronos.css · [data-chronos] · color',
'global · chronos.css · [data-chronos] · font-family',
'global · chronos.css · [data-chronos] · font-size',
'global · chronos.css · [data-chronos] · gap',
'global · chronos.css · [data-chronos] · line-height',
"global · chronos.css · [data-chronos][data-size='lg'] · font-size",
"global · chronos.css · [data-chronos][data-size='sm'] · font-size",
'literal · chronos.css · .chronos-editor-fields [data-date-field-input], .chronos-editor-fields [data-select-trigger], .chronos-editor-fields [data-field-input] · inline-size',
'literal · chronos.css · .chronos-editor-fields [data-date-range-picker] · inline-size',
'literal · chronos.css · .chronos-editor-fields [data-field], .chronos-editor-fields [data-field-control], .chronos-editor-fields [data-date-field], .chronos-editor-fields [data-select] · inline-size',
'literal · chronos.css · .chronos-editor-fields · inline-size',
'literal · chronos.css · .chronos-field · inline-size',
'literal · chronos.css · .chronos-pair > [data-date-range-field-input], .chronos-when-field > [data-time-range-picker], .chronos-band-row > [data-time-range-picker] · inline-size',
'literal · chronos.css · .chronos-peek-scroll · inline-size',
'literal · chronos.css · .chronos-when [data-time-range-field-input] · inline-size',
'literal · chronos.css · [data-chronos-day-cell]:hover [data-chronos-day-add], [data-chronos-day-add]:focus-visible · opacity',
'literal · chronos.css · [data-chronos-event-chip][data-draft] · opacity',
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
'literal · chronos.css · [data-chronos] · inline-size',
'private · chronos.css · .chronos-peek-hour · block-size',
'private · chronos.css · .chronos-peek-slot · block-size',
'private · chronos.css · .chronos-tg-dayhead[data-today] .chronos-tg-daynum · background',
'private · chronos.css · .chronos-tg-hour · block-size',
'private · chronos.css · .chronos-tg-now · border-block-start',
'private · chronos.css · .chronos-tg-now::before · background',
'private · chronos.css · .chronos-tg-slot · block-size',
'private · chronos.css · .chronos-tg-slot[data-dragover], .chronos-tg-alldaycol[data-dragover] · background',
'private · chronos.css · .chronos-tg-slot[data-dragover], .chronos-tg-alldaycol[data-dragover] · box-shadow',
'private · chronos.css · [data-chronos-day-cell][data-dragover] · background',
'private · chronos.css · [data-chronos-day-cell][data-dragover] · box-shadow',
'private · chronos.css · [data-chronos-day-cell][data-today] [data-chronos-day-number] · background',
'private · chronos.css · [data-chronos-event-chip][data-continues-after] · padding-inline-end',
'private · chronos.css · [data-chronos-event-chip][data-continues-before] · padding-inline-start'
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
],
clipboard: ['global · clipboard.css · [data-clipboard-indicator] · font-family'],
'code-block': [
'global · code-block.css · [data-code-block-code] · font-family',
'global · code-block.css · [data-code-block-code] · font-weight',
'global · code-block.css · [data-code-block-code] · letter-spacing'
],
'color-field': [
'global · color-field.css · [data-color-field-swatch][data-color-swatch] · border-radius'
],
'color-picker': [
'global · color-picker.css · [data-color-picker-channel-slider][data-slider]::after · block-size',
'global · color-picker.css · [data-color-picker-channel-slider][data-slider]::after · border-radius',
'literal · color-picker.css · [data-color-picker-area-background]::after · background',
'literal · color-picker.css · [data-color-picker-area-background]::before · background',
'literal · color-picker.css · [data-color-picker-area-background]:dir(rtl)::before · background',
'literal · color-picker.css · [data-color-picker-area] · inline-size',
"literal · color-picker.css · [data-color-picker-area][data-x-channel='hue'][data-y-channel='brightness'] [data-color-picker-area-background]::after · background",
'literal · color-picker.css · [data-color-picker-channel-slider][data-slider] [data-slider-range] · background',
'literal · color-picker.css · [data-color-picker-channel-slider][data-slider] · inline-size',
'literal · color-picker.css · [data-color-picker-swatch-group] · inline-size',
'literal · color-picker.css · [data-color-picker-swatch-indicator] · block-size',
'literal · color-picker.css · [data-color-picker-swatch-indicator] · inline-size',
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
'literal · color-picker.css · [data-color-picker] · inline-size',
'private · color-picker.css · [data-color-picker-label] · font-size',
'private · color-picker.css · [data-color-picker-trigger] · font-size',
'private · color-picker.css · [data-color-picker-value-text] · font-size'
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
],
combobox: [
'global · combobox.css · [data-combobox-selected-tag-remove]:hover · background',
'global · combobox.css · [data-combobox-trigger]:hover:not(:disabled):not([data-disabled]) · background',
'global · combobox.css · [data-combobox-trigger]:hover:not(:disabled):not([data-disabled]) · color',
'literal · combobox.css · [data-combobox-control] · inline-size',
'literal · combobox.css · [data-combobox-input] · inline-size',
"literal · combobox.css · [data-combobox-item][data-state='checked'] [data-combobox-item-indicator] · opacity",
'literal · combobox.css · [data-combobox-selected-tag-remove]:focus-visible · opacity',
'literal · combobox.css · [data-combobox-selected-tag-remove]:hover · opacity',
'literal · combobox.css · [data-combobox] · inline-size'
],
command: ['literal · command.css · [data-command] · inline-size'],
'context-menu': [
'global · context-menu.css · [data-context-menu-content], [data-context-menu-sub-content] · font-family',
'literal · context-menu.css · [data-context-menu-separator] · block-size',
'literal · context-menu.css · [data-context-menu-sub-trigger]::after · block-size',
'literal · context-menu.css · [data-context-menu-sub-trigger]::after · inline-size'
],
cropper: ['global · cropper.css · [data-cropper-zoom-btn]:hover · background'],
'date-range-picker': [
'global · date-range-picker-time.css · .range-time · border-block-start',
'global · date-range-picker-time.css · .range-time · gap',
'global · date-range-picker-time.css · .range-time · padding-block-start',
'global · date-range-picker.css · [data-date-range-field-input] [data-date-range-picker-trigger] · block-size',
'global · date-range-picker.css · [data-date-range-field-input] [data-date-range-picker-trigger] · border-radius',
'global · date-range-picker.css · [data-date-range-field-input] [data-date-range-picker-trigger] · inline-size',
'global · date-range-picker.css · [data-date-range-field-input] [data-date-range-picker-trigger]:hover, [data-date-range-field-input] [data-date-range-picker-trigger]:focus-visible · background',
'global · date-range-picker.css · [data-date-range-field-input] [data-date-range-picker-trigger]:hover, [data-date-range-field-input] [data-date-range-picker-trigger]:focus-visible · color',
'global · date-range-picker.css · [data-date-range-picker-calendar][data-range-calendar] · color',
'global · date-range-picker.css · [data-date-range-picker-calendar][data-range-calendar] · font-family',
'global · date-range-picker.css · [data-date-range-picker-calendar][data-range-calendar] · gap',
'global · date-range-picker.css · [data-date-range-picker-calendar][data-range-calendar] · line-height',
'global · date-range-picker.css · [data-date-range-picker-trigger] · background',
'global · date-range-picker.css · [data-date-range-picker-trigger] · border',
'global · date-range-picker.css · [data-date-range-picker-trigger] · border-radius',
'global · date-range-picker.css · [data-date-range-picker-trigger][data-disabled], [data-date-range-picker-trigger]:disabled · opacity',
'global · date-range-picker.css · [data-date-range-picker-year-view-cell], [data-date-range-picker-month-view-cell] · border',
'global · date-range-picker.css · [data-date-range-picker-year-view-prev], [data-date-range-picker-year-view-next], [data-date-range-picker-month-view-prev], [data-date-range-picker-month-view-next] · border',
'global · date-range-picker.css · [data-date-range-picker][data-invalid] [data-field-control] · border-color',
'literal · date-range-picker.css · [data-date-range-picker-calendar][data-range-calendar] · inline-size',
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
'literal · date-range-picker.css · [data-date-range-picker] · inline-size',
'private · date-range-picker.css · [data-date-range-picker-calendar][data-range-calendar] · font-size',
'private · date-range-picker.css · [data-date-range-picker-trigger] · block-size',
'private · date-range-picker.css · [data-date-range-picker-trigger] · inline-size',
'private · date-range-picker.css · [data-date-range-picker-trigger]:focus-visible · border-color',
'private · date-range-picker.css · [data-date-range-picker-trigger]:hover · background',
'private · date-range-picker.css · [data-date-range-picker-trigger]:hover · border-color',
'private · date-range-picker.css · [data-date-range-picker-trigger]:hover · color',
'private · date-range-picker.css · [data-date-range-picker] · font-size',
'private · date-range-picker.css · [data-date-range-picker] · gap'
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
],
drawer: [
"global · drawer.css · [data-drawer-content][data-side='bottom'] · border-top",
"global · drawer.css · [data-drawer-content][data-side='left'] · border-right",
"global · drawer.css · [data-drawer-content][data-side='right'] · border-left",
"global · drawer.css · [data-drawer-content][data-side='top'] · border-bottom",
"global · drawer.css · [data-drawer-content][data-state='closed'][data-side='bottom'][data-last-action='cancelled'], [data-drawer-content][data-state='closed'][data-side='bottom'][data-last-action='dismissed'], [data-drawer-content][data-state='closed'][data-side='bottom'][data-last-action='dismissed-outside'] · border-top-color",
"global · drawer.css · [data-drawer-content][data-state='closed'][data-side='bottom'][data-last-action='failed'] · border-top-color",
"global · drawer.css · [data-drawer-content][data-state='closed'][data-side='bottom'][data-last-action='saved'] · border-top-color",
"global · drawer.css · [data-drawer-content][data-state='closed'][data-side='left'][data-last-action='cancelled'], [data-drawer-content][data-state='closed'][data-side='left'][data-last-action='dismissed'], [data-drawer-content][data-state='closed'][data-side='left'][data-last-action='dismissed-outside'] · border-right-color",
"global · drawer.css · [data-drawer-content][data-state='closed'][data-side='left'][data-last-action='failed'] · border-right-color",
"global · drawer.css · [data-drawer-content][data-state='closed'][data-side='left'][data-last-action='saved'] · border-right-color",
"global · drawer.css · [data-drawer-content][data-state='closed'][data-side='right'][data-last-action='cancelled'], [data-drawer-content][data-state='closed'][data-side='right'][data-last-action='dismissed'], [data-drawer-content][data-state='closed'][data-side='right'][data-last-action='dismissed-outside'] · border-left-color",
"global · drawer.css · [data-drawer-content][data-state='closed'][data-side='right'][data-last-action='failed'] · border-left-color",
"global · drawer.css · [data-drawer-content][data-state='closed'][data-side='right'][data-last-action='saved'] · border-left-color",
"global · drawer.css · [data-drawer-content][data-state='closed'][data-side='top'][data-last-action='cancelled'], [data-drawer-content][data-state='closed'][data-side='top'][data-last-action='dismissed'], [data-drawer-content][data-state='closed'][data-side='top'][data-last-action='dismissed-outside'] · border-bottom-color",
"global · drawer.css · [data-drawer-content][data-state='closed'][data-side='top'][data-last-action='failed'] · border-bottom-color",
"global · drawer.css · [data-drawer-content][data-state='closed'][data-side='top'][data-last-action='saved'] · border-bottom-color",
"literal · drawer.css · [data-drawer-content][data-variant='persistent'][data-side='left'], [data-drawer-content][data-variant='persistent'][data-side='right'] · block-size",
"literal · drawer.css · [data-drawer-content][data-variant='persistent'][data-side='top'], [data-drawer-content][data-variant='persistent'][data-side='bottom'] · inline-size",
"literal · drawer.css · [data-drawer-content][data-variant='persistent'][data-size='full'] · height",
"literal · drawer.css · [data-drawer-content][data-variant='persistent'][data-size='full'] · width",
"literal · drawer.css · [data-drawer-overlay][data-variant='overlay'] · opacity"
],
'dropdown-menu': [
'global · dropdown-menu.css · [data-dropdown-menu-content], [data-dropdown-menu-sub-content] · font-family'
],
feed: [
'global · feed.css · [data-feed][data-busy] [data-feed-sentinel]::before · border-radius',
'literal · feed.css · [data-feed-root][data-block] · inline-size'
],
'field-langs': [
'global · field-langs.css · [data-field-langs-lang-option]::after · background',
'global · field-langs.css · [data-field-langs-lang-option]::after · border-radius',
'global · field-langs.css · [data-field-langs-lang-option][data-complete]::after · background',
'global · field-langs.css · [data-field-langs-lang-option][data-required]:not([data-complete])::after · background',
'global · field-langs.css · [data-field-langs-menu] [data-field-langs-lang-option] · border-radius',
'global · field-langs.css · [data-field-langs-menu] [data-field-langs-lang-option] · color',
'global · field-langs.css · [data-field-langs-menu] [data-field-langs-lang-option] · font-size',
'global · field-langs.css · [data-field-langs-menu] [data-field-langs-lang-option] · gap',
'global · field-langs.css · [data-field-langs-menu] [data-field-langs-lang-option] · padding',
'global · field-langs.css · [data-field-langs-menu] [data-field-langs-lang-option][data-active] · background',
'global · field-langs.css · [data-field-langs-menu] [data-field-langs-lang-option][data-active] · color',
'global · field-langs.css · [data-field-langs-menu] · gap',
"global · field-langs.css · [data-field-langs-switcher][data-mode='segmented'] [data-field-langs-lang-option] + [data-field-langs-lang-option] · border-inline-start",
"global · field-langs.css · [data-field-langs-switcher][data-mode='segmented'] [data-field-langs-lang-option] · color",
"global · field-langs.css · [data-field-langs-switcher][data-mode='segmented'] [data-field-langs-lang-option] · font-size",
"global · field-langs.css · [data-field-langs-switcher][data-mode='segmented'] [data-field-langs-lang-option] · gap",
"global · field-langs.css · [data-field-langs-switcher][data-mode='segmented'] [data-field-langs-lang-option] · padding-inline",
"global · field-langs.css · [data-field-langs-switcher][data-mode='segmented'] [data-field-langs-lang-option]:disabled · color",
"global · field-langs.css · [data-field-langs-switcher][data-mode='segmented'] [data-field-langs-lang-option][data-active] · background",
"global · field-langs.css · [data-field-langs-switcher][data-mode='segmented'] [data-field-langs-lang-option][data-active] · color",
"global · field-langs.css · [data-field-langs-switcher][data-mode='select'] [data-popover-trigger] · color",
"global · field-langs.css · [data-field-langs-switcher][data-mode='select'] [data-popover-trigger] · font-size",
"global · field-langs.css · [data-field-langs-switcher][data-mode='select'] [data-popover-trigger] · gap",
"global · field-langs.css · [data-field-langs-switcher][data-mode='select'] [data-popover-trigger] · padding-inline",
'global · field-langs.css · [data-field-langs-textarea] [data-field-langs-switcher] · background',
'global · field-langs.css · [data-field-langs-textarea] [data-field-langs-switcher] · border',
'global · field-langs.css · [data-field-langs-textarea] [data-field-langs-switcher] · border-radius',
"global · field-langs.css · [data-field-langs-textarea] [data-field-langs-switcher][data-mode='segmented'] [data-field-langs-lang-option] · padding-block",
'global · field-langs.css · [data-field-langs-textarea] [data-textarea-input] · padding-block-start',
"global · field-langs.css · [data-field-langs][data-switcher-side='end'] [data-field-control] [data-field-langs-switcher][data-mode='segmented'] · border-inline-start",
"global · field-langs.css · [data-field-langs][data-switcher-side='start'] [data-field-control] [data-field-langs-switcher][data-mode='segmented'] · border-inline-end",
'literal · field-langs.css · [data-field-langs-menu] [data-field-langs-lang-option] · inline-size',
'literal · field-langs.css · [data-field-langs-menu] [data-field-langs-lang-option] · line-height',
'literal · field-langs.css · [data-field-langs-menu] · min-inline-size',
"literal · field-langs.css · [data-field-langs-switcher][data-mode='segmented'] [data-field-langs-lang-option] · line-height",
"literal · field-langs.css · [data-field-langs-switcher][data-mode='select'] [data-popover-trigger] · line-height",
'literal · field-langs.css · [data-field-langs] · inline-size'
],
'float-panel': [
'literal · float-panel.css · [data-float-panel-action], [data-float-panel-stage-trigger] · line-height',
'literal · float-panel.css · [data-float-panel-resize-grip] · background-image',
'literal · float-panel.css · [data-float-panel-resize-grip]:dir(rtl) · background-image',
'literal · float-panel.css · [data-float-panel-resize-grip]:focus-visible · opacity',
'literal · float-panel.css · [data-float-panel-resize-grip]:hover, [data-float-panel-resize-grip][data-grabbed] · opacity'
],
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
form: [
'private · form.css · [data-form-auto-fields-array-add], [data-form-auto-fields-array-remove] · background',
'private · form.css · [data-form-auto-fields-array-add], [data-form-auto-fields-array-remove] · color',
'private · form.css · [data-form-auto-fields-array-add]:not(:disabled):hover, [data-form-auto-fields-array-remove]:not(:disabled):hover · background'
],
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
'gradient-builder': [
'global · gradient-builder.css · [data-gradient-builder-stop]:focus-visible · box-shadow',
'literal · gradient-builder.css · [data-gradient-builder-preset] · inline-size',
'literal · gradient-builder.css · [data-gradient-builder-stop-color-sliders] · inline-size',
'literal · gradient-builder.css · [data-gradient-builder] · inline-size'
],
'gradient-picker': [
'literal · gradient-picker.css · [data-gradient-picker-preset] · inline-size'
],
'grid-list': [
'global · grid-list.css · [data-grid-list-row]:hover:not([data-disabled]), [data-grid-list-row][data-highlighted]:not([data-disabled]) · background',
'literal · grid-list.css · [data-grid-list][data-block] · inline-size'
],
kbd: [
'global · kbd.css · [data-kbd] · font-family',
'literal · kbd.css · [data-kbd] · line-height'
],
knob: [
'global · knob.css · [data-knob-value-field] [data-spin-field-input]:focus-visible · border-radius',
'literal · knob.css · [data-knob-control]:hover · filter',
'literal · knob.css · [data-knob-value-field] [data-spin-field-input] · line-height',
'literal · knob.css · [data-knob-value-text] · line-height'
],
link: [
'global · link.css · [data-link]:active, [data-link][data-variant]:active · opacity',
'literal · link.css · [data-link-sr-only] · height',
'literal · link.css · [data-link-sr-only] · width'
],
listbox: [
'global · listbox.css · [data-listbox-item][data-highlighted]:not([data-disabled]) · background',
'literal · listbox.css · [data-listbox][data-block] · inline-size'
],
'media-player': [
'literal · media-player.css · [data-media-player-media] · height',
'literal · media-player.css · [data-media-player-media] · width',
'literal · media-player.css · [data-media-player-poster] · height',
'literal · media-player.css · [data-media-player-poster] · width',
'literal · media-player.css · [data-media-player-rate-float], [data-media-player-caption-float] · inline-size',
'literal · media-player.css · [data-media-player] · width'
],
'menu-dial': [
'global · menu-dial.css · .menu-dial-glyph::before, .menu-dial-glyph::after · border-radius',
'literal · menu-dial.css · .menu-dial-glyph · block-size',
'literal · menu-dial.css · .menu-dial-glyph · inline-size',
'literal · menu-dial.css · .menu-dial-glyph::before, .menu-dial-glyph::after · block-size',
"literal · menu-dial.css · [data-menu-dial-list][data-state='open'] .menu-dial-action · opacity"
],
menubar: [
'global · menubar.css · [data-menubar-panel] · font-family',
'global · menubar.css · [data-menubar-panel] · line-height',
'global · menubar.css · [data-menubar-trigger]:hover:not([data-disabled]), [data-menubar-trigger][data-highlighted]:not([data-disabled]) · background'
],
meter: [
"global · meter.css · [data-meter][data-shape='circular'] [data-meter-indicator]::before · border-radius",
"global · meter.css · [data-meter][data-shape='circular'] · border-radius"
],
metrics: [
'literal · metrics.css · [data-metrics-actions] · inline-size',
'literal · metrics.css · [data-metrics-chart] · inline-size',
'literal · metrics.css · [data-metrics-gauge-value] · line-height',
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
'literal · metrics.css · [data-metrics-progress] · inline-size',
"private · metrics.css · [data-metrics-icon][data-variant='solid'] · background",
"private · metrics.css · [data-metrics-icon][data-variant='solid'] · color"
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
],
mockup: [
'global · mockup.css · [data-box][data-mockup] [data-mockup-bar] · background',
'global · mockup.css · [data-box][data-mockup] [data-mockup-bar] · gap',
'global · mockup.css · [data-box][data-mockup] [data-mockup-bar] · padding-inline',
'global · mockup.css · [data-box][data-mockup] [data-mockup-dot] · background',
'global · mockup.css · [data-box][data-mockup] [data-mockup-dot] · border-radius',
'global · mockup.css · [data-box][data-mockup] [data-mockup-url] · background',
'global · mockup.css · [data-box][data-mockup] [data-mockup-url] · border-radius',
'global · mockup.css · [data-box][data-mockup] [data-mockup-url] · color',
'global · mockup.css · [data-box][data-mockup] [data-mockup-url] · font-size',
'global · mockup.css · [data-box][data-mockup] [data-mockup-url] · padding-block',
'global · mockup.css · [data-box][data-mockup] [data-mockup-url] · padding-inline',
'global · mockup.css · [data-box][data-mockup] · inline-size',
"global · mockup.css · [data-box][data-mockup][data-chrome='phone'] [data-mockup-screen] · background",
'literal · mockup.css · [data-box][data-mockup] [data-mockup-dot] · block-size',
'literal · mockup.css · [data-box][data-mockup] [data-mockup-dot] · inline-size',
'literal · mockup.css · [data-box][data-mockup] [data-mockup-screen] > :where(img, video, picture, svg) · inline-size',
"literal · mockup.css · [data-box][data-mockup][data-chrome='phone']::before · block-size",
"literal · mockup.css · [data-box][data-mockup][data-chrome='phone']::before · inline-size"
],
'month-grid': [
'literal · month-grid.css · [data-month-grid-grid] · inline-size',
'literal · month-grid.css · [data-month-grid-header] · inline-size',
'literal · month-grid.css · [data-month-grid] · inline-size',
'literal · month-grid.css · [data-popover-content] [data-month-grid-grid] · inline-size',
'literal · month-grid.css · [data-popover-content] [data-month-grid] · inline-size'
],
'natural-time-picker': [
'global · natural-time-picker.css · [data-natural-time-picker-panel] · background',
'global · natural-time-picker.css · [data-natural-time-picker-panel] · border',
'global · natural-time-picker.css · [data-natural-time-picker-panel] · border-radius',
'global · natural-time-picker.css · [data-natural-time-picker-panel] · box-shadow',
'global · natural-time-picker.css · [data-natural-time-picker-panel] · color',
'global · natural-time-picker.css · [data-natural-time-picker-panel] · min-inline-size',
'global · natural-time-picker.css · [data-natural-time-picker-panel] · padding-block',
'global · natural-time-picker.css · [data-natural-time-picker-panel] · padding-inline',
"global · natural-time-picker.css · [data-natural-time-picker-panel][data-size='lg'] · min-inline-size",
"global · natural-time-picker.css · [data-natural-time-picker-panel][data-size='lg'] · padding-block",
"global · natural-time-picker.css · [data-natural-time-picker-panel][data-size='lg'] · padding-inline",
"global · natural-time-picker.css · [data-natural-time-picker-panel][data-size='sm'] · min-inline-size",
"global · natural-time-picker.css · [data-natural-time-picker-panel][data-size='sm'] · padding-block",
"global · natural-time-picker.css · [data-natural-time-picker-panel][data-size='sm'] · padding-inline",
'literal · natural-time-picker.css · [data-natural-time-picker-band] · inline-size',
'literal · natural-time-picker.css · [data-natural-time-picker-meridiem] · line-height',
'literal · natural-time-picker.css · [data-natural-time-picker-panel] [data-natural-time-picker-periods]:not([data-icon-only]) [data-button] · inline-size',
'literal · natural-time-picker.css · [data-natural-time-picker-panel] · inline-size',
'literal · natural-time-picker.css · [data-natural-time-picker-tick] · line-height',
'literal · natural-time-picker.css · [data-natural-time-picker-time] · line-height'
],
'nav-tree': [
'literal · nav-tree.css · [data-nav-tree-link], [data-nav-tree-trigger] · inline-size'
],
'onion-menu': [
'global · onion-menu.css · .onion-menu-trigger · background',
'literal · onion-menu.css · .onion-menu-icon :global(svg) · block-size',
'literal · onion-menu.css · .onion-menu-icon :global(svg) · inline-size'
],
palabras: [
'global · palabras-chrome.css · [data-palabras-appearance][data-palabras-appearance], [data-palabras-appearance][data-palabras-appearance] * · font-family',
'global · palabras-chrome.css · [data-palabras-border-caption] · color',
'global · palabras-chrome.css · [data-palabras-border-caption] · font-size',
'global · palabras-chrome.css · [data-palabras-border-field] · column-gap',
'global · palabras-chrome.css · [data-palabras-border-field][data-stack] · row-gap',
'global · palabras-chrome.css · [data-palabras-border-pair] · column-gap',
'global · palabras-chrome.css · [data-palabras-border-row] · column-gap',
'global · palabras-chrome.css · [data-palabras-border] · gap',
'global · palabras-chrome.css · [data-palabras-bubble-divider] · background',
'global · palabras-chrome.css · [data-palabras-bubble-link] input · background',
'global · palabras-chrome.css · [data-palabras-bubble-link] input · border',
'global · palabras-chrome.css · [data-palabras-bubble-link] input · border-radius',
'global · palabras-chrome.css · [data-palabras-bubble-link] input · color',
'global · palabras-chrome.css · [data-palabras-bubble-link] input · font-size',
'global · palabras-chrome.css · [data-palabras-bubble-link] input · padding',
'global · palabras-chrome.css · [data-palabras-bubble-link] input:focus · background',
'global · palabras-chrome.css · [data-palabras-bubble-link] · gap',
'global · palabras-chrome.css · [data-palabras-bubble-typo] · gap',
'global · palabras-chrome.css · [data-palabras-bubble] [data-active] · background',
'global · palabras-chrome.css · [data-palabras-bubble] [data-active] · color',
'global · palabras-chrome.css · [data-palabras-bubble] · background',
'global · palabras-chrome.css · [data-palabras-bubble] · border',
'global · palabras-chrome.css · [data-palabras-bubble] · border-radius',
'global · palabras-chrome.css · [data-palabras-bubble] · box-shadow',
'global · palabras-chrome.css · [data-palabras-bubble] · font-family',
'global · palabras-chrome.css · [data-palabras-bubble] · gap',
'global · palabras-chrome.css · [data-palabras-bubble] · padding',
'global · palabras-chrome.css · [data-palabras-canvas] [data-palabras-block-drop-line] · background',
'global · palabras-chrome.css · [data-palabras-col-resize]::before · background',
'global · palabras-chrome.css · [data-palabras-col-resize]::before · border-radius',
'global · palabras-chrome.css · [data-palabras-col-resize]:hover::before, [data-palabras-col-resize][data-dragging]::before · background',
'global · palabras-chrome.css · [data-palabras-delete] · color',
'global · palabras-chrome.css · [data-palabras-delete]:hover:not(:disabled) · color',
'global · palabras-chrome.css · [data-palabras-doc] [data-button][data-palabras-handle]:hover:not([data-disabled]), [data-palabras-canvas] [data-palabras-column-inserter] [data-button][data-palabras-column-inserter-button]:hover:not([data-disabled]) · background',
'global · palabras-chrome.css · [data-palabras-doc] [data-button][data-palabras-handle]:hover:not([data-disabled]), [data-palabras-canvas] [data-palabras-column-inserter] [data-button][data-palabras-column-inserter-button]:hover:not([data-disabled]) · border-color',
'global · palabras-chrome.css · [data-palabras-doc] [data-button][data-palabras-handle]:hover:not([data-disabled]), [data-palabras-canvas] [data-palabras-column-inserter] [data-button][data-palabras-column-inserter-button]:hover:not([data-disabled]) · color',
'global · palabras-chrome.css · [data-palabras-doc] [data-palabras-handle], [data-palabras-canvas] [data-palabras-column-inserter] [data-palabras-column-inserter-button] · background',
'global · palabras-chrome.css · [data-palabras-doc] [data-palabras-handle], [data-palabras-canvas] [data-palabras-column-inserter] [data-palabras-column-inserter-button] · border',
'global · palabras-chrome.css · [data-palabras-doc] [data-palabras-handle], [data-palabras-canvas] [data-palabras-column-inserter] [data-palabras-column-inserter-button] · border-radius',
'global · palabras-chrome.css · [data-palabras-doc] [data-palabras-handle], [data-palabras-canvas] [data-palabras-column-inserter] [data-palabras-column-inserter-button] · box-shadow',
'global · palabras-chrome.css · [data-palabras-doc] [data-palabras-handle], [data-palabras-canvas] [data-palabras-column-inserter] [data-palabras-column-inserter-button] · color',
'global · palabras-chrome.css · [data-palabras-export-actions] · gap',
'global · palabras-chrome.css · [data-palabras-export-foot] · border-block-start',
'global · palabras-chrome.css · [data-palabras-export-foot] · gap',
'global · palabras-chrome.css · [data-palabras-export-foot] · padding',
'global · palabras-chrome.css · [data-palabras-export-label] · color',
'global · palabras-chrome.css · [data-palabras-export-label] · font-size',
'global · palabras-chrome.css · [data-palabras-export-label] · gap',
'global · palabras-chrome.css · [data-palabras-field-label] · color',
'global · palabras-chrome.css · [data-palabras-field-label] · font-size',
'global · palabras-chrome.css · [data-palabras-field-label] · line-height',
'global · palabras-chrome.css · [data-palabras-field] · column-gap',
'global · palabras-chrome.css · [data-palabras-field] · row-gap',
'global · palabras-chrome.css · [data-palabras-field][data-slider] [data-palabras-slider-head] · gap',
'global · palabras-chrome.css · [data-palabras-field][data-slider] [data-palabras-slider-value] · color',
'global · palabras-chrome.css · [data-palabras-field][data-slider] [data-palabras-slider-value] · font-size',
'global · palabras-chrome.css · [data-palabras-field][data-slider] · row-gap',
'global · palabras-chrome.css · [data-palabras-find-count] · color',
'global · palabras-chrome.css · [data-palabras-find-count] · font-size',
'global · palabras-chrome.css · [data-palabras-find-icon] · color',
'global · palabras-chrome.css · [data-palabras-find-icon] · padding-inline',
'global · palabras-chrome.css · [data-palabras-find-input] · background',
'global · palabras-chrome.css · [data-palabras-find-input] · border',
'global · palabras-chrome.css · [data-palabras-find-input] · border-radius',
'global · palabras-chrome.css · [data-palabras-find-input] · color',
'global · palabras-chrome.css · [data-palabras-find-input] · font-size',
'global · palabras-chrome.css · [data-palabras-find-input] · padding',
'global · palabras-chrome.css · [data-palabras-find-input]:focus · background',
'global · palabras-chrome.css · [data-palabras-find-row] · gap',
'global · palabras-chrome.css · [data-palabras-find-sep] · background',
'global · palabras-chrome.css · [data-palabras-find] [data-active] · background',
'global · palabras-chrome.css · [data-palabras-find] [data-active] · color',
'global · palabras-chrome.css · [data-palabras-find] · background',
'global · palabras-chrome.css · [data-palabras-find] · border',
'global · palabras-chrome.css · [data-palabras-find] · border-radius',
'global · palabras-chrome.css · [data-palabras-find] · box-shadow',
'global · palabras-chrome.css · [data-palabras-find] · font-family',
'global · palabras-chrome.css · [data-palabras-find] · gap',
'global · palabras-chrome.css · [data-palabras-find] · padding',
'global · palabras-chrome.css · [data-palabras-find][data-invalid] [data-palabras-find-row]:first-child [data-palabras-find-input] · border-color',
"global · palabras-chrome.css · [data-palabras-handle-menu] [role='menuitem'] · gap",
'global · palabras-chrome.css · [data-palabras-help] kbd · background',
'global · palabras-chrome.css · [data-palabras-help] kbd · border',
'global · palabras-chrome.css · [data-palabras-help] kbd · border-radius',
'global · palabras-chrome.css · [data-palabras-help] kbd · padding-inline',
'global · palabras-chrome.css · [data-palabras-help] · color',
'global · palabras-chrome.css · [data-palabras-help] · font-size',
'global · palabras-chrome.css · [data-palabras-inspector-fields] · gap',
'global · palabras-chrome.css · [data-palabras-inspector] * · font-family',
'global · palabras-chrome.css · [data-palabras-inspector] :is([data-field-control], [data-css-field], [data-textarea-input]), [data-palabras-inspector] [data-select-trigger] · background',
'global · palabras-chrome.css · [data-palabras-inspector] :is([data-field-control], [data-css-field], [data-textarea-input]), [data-palabras-inspector] [data-select-trigger] · border-radius',
'global · palabras-chrome.css · [data-palabras-inspector] :is([data-textarea-input], [data-field] input) · font-size',
'global · palabras-chrome.css · [data-palabras-inspector] [data-field-control]:focus-within, [data-palabras-inspector] [data-css-field]:focus-within, [data-palabras-inspector] [data-textarea][data-focused] [data-textarea-input], [data-palabras-inspector] [data-select-trigger]:focus-visible · background',
'global · palabras-chrome.css · [data-palabras-inspector] [data-palabras-adjustments] · column-gap',
'global · palabras-chrome.css · [data-palabras-inspector] [data-palabras-adjustments] · row-gap',
'global · palabras-chrome.css · [data-palabras-inspector] [data-palabras-typography] · gap',
'global · palabras-chrome.css · [data-palabras-inspector] · font-family',
'global · palabras-chrome.css · [data-palabras-inspector] · inline-size',
'global · palabras-chrome.css · [data-palabras-inspector] · padding',
'global · palabras-chrome.css · [data-palabras-lang-menu-content] · padding',
'global · palabras-chrome.css · [data-palabras-lang-menu] [data-palabras-lang-option] · min-block-size',
'global · palabras-chrome.css · [data-palabras-lang-menu] · gap',
'global · palabras-chrome.css · [data-palabras-lang-option] · border-radius',
'global · palabras-chrome.css · [data-palabras-lang-option] · color',
'global · palabras-chrome.css · [data-palabras-lang-option] · font-size',
'global · palabras-chrome.css · [data-palabras-lang-option] · gap',
'global · palabras-chrome.css · [data-palabras-lang-option] · min-block-size',
'global · palabras-chrome.css · [data-palabras-lang-option] · padding-inline',
'global · palabras-chrome.css · [data-palabras-lang-option]::before · border',
'global · palabras-chrome.css · [data-palabras-lang-option]::before · border-radius',
'global · palabras-chrome.css · [data-palabras-lang-option]:hover:not([data-active]) · color',
'global · palabras-chrome.css · [data-palabras-lang-option][data-complete]::before · background',
'global · palabras-chrome.css · [data-palabras-lang-option][data-complete]::before · border-color',
"global · palabras-chrome.css · [data-palabras-lang-switcher][data-mode='segmented'] [data-palabras-lang-option][data-active] · background",
"global · palabras-chrome.css · [data-palabras-lang-switcher][data-mode='segmented'] [data-palabras-lang-option][data-active] · color",
"global · palabras-chrome.css · [data-palabras-lang-switcher][data-mode='segmented'] · background",
"global · palabras-chrome.css · [data-palabras-lang-switcher][data-mode='segmented'] · border-radius",
"global · palabras-chrome.css · [data-palabras-lang-switcher][data-mode='segmented'] · gap",
"global · palabras-chrome.css · [data-palabras-lang-switcher][data-mode='segmented'] · padding",
'global · palabras-chrome.css · [data-palabras-lang-trigger] · background',
'global · palabras-chrome.css · [data-palabras-lang-trigger] · border',
'global · palabras-chrome.css · [data-palabras-lang-trigger] · border-radius',
'global · palabras-chrome.css · [data-palabras-lang-trigger] · color',
'global · palabras-chrome.css · [data-palabras-lang-trigger] · font-size',
'global · palabras-chrome.css · [data-palabras-lang-trigger] · gap',
'global · palabras-chrome.css · [data-palabras-lang-trigger] · min-block-size',
'global · palabras-chrome.css · [data-palabras-lang-trigger] · padding-inline',
'global · palabras-chrome.css · [data-palabras-menubar-crumbs] [data-breadcrumb-link] · font-size',
'global · palabras-chrome.css · [data-palabras-menubar-crumbs] · padding-inline',
'global · palabras-chrome.css · [data-palabras-menubar] · gap',
'global · palabras-chrome.css · [data-palabras-outline-item] · border-radius',
'global · palabras-chrome.css · [data-palabras-outline-item] · color',
'global · palabras-chrome.css · [data-palabras-outline-item] · font-size',
'global · palabras-chrome.css · [data-palabras-outline-item] · padding',
'global · palabras-chrome.css · [data-palabras-outline-item]:hover · background',
"global · palabras-chrome.css · [data-palabras-outline-item][data-level='2'] · padding-inline-start",
"global · palabras-chrome.css · [data-palabras-outline-item][data-level='3'] · padding-inline-start",
"global · palabras-chrome.css · [data-palabras-outline-item][data-level='4'], [data-palabras-outline-item][data-level='5'], [data-palabras-outline-item][data-level='6'] · padding-inline-start",
'global · palabras-chrome.css · [data-palabras-outline-trigger] · border-radius',
'global · palabras-chrome.css · [data-palabras-outline-trigger] · color',
'global · palabras-chrome.css · [data-palabras-outline-trigger] · font-size',
'global · palabras-chrome.css · [data-palabras-outline-trigger] · gap',
'global · palabras-chrome.css · [data-palabras-outline-trigger] · padding',
'global · palabras-chrome.css · [data-palabras-outline-trigger]:hover:not(:disabled) · background',
'global · palabras-chrome.css · [data-palabras-panel-crumb-sep] · color',
'global · palabras-chrome.css · [data-palabras-panel-crumb][data-current] · color',
'global · palabras-chrome.css · [data-palabras-panel-crumb][data-current] · font-weight',
'global · palabras-chrome.css · [data-palabras-panel-crumbs] · color',
'global · palabras-chrome.css · [data-palabras-panel-crumbs] · column-gap',
'global · palabras-chrome.css · [data-palabras-panel-crumbs] · font-size',
'global · palabras-chrome.css · [data-palabras-panel-crumbs] · padding',
'global · palabras-chrome.css · [data-palabras-panel-empty] · color',
'global · palabras-chrome.css · [data-palabras-panel-empty] · font-size',
'global · palabras-chrome.css · [data-palabras-panel-empty] · padding',
'global · palabras-chrome.css · [data-palabras-panel-foot] · background',
'global · palabras-chrome.css · [data-palabras-panel-foot] · border-block-start',
'global · palabras-chrome.css · [data-palabras-panel-foot] · color',
'global · palabras-chrome.css · [data-palabras-panel-foot] · font-size',
'global · palabras-chrome.css · [data-palabras-panel-foot] · gap',
'global · palabras-chrome.css · [data-palabras-panel-foot] · padding',
'global · palabras-chrome.css · [data-palabras-panel-head-main] · gap',
'global · palabras-chrome.css · [data-palabras-panel-icon] · background',
'global · palabras-chrome.css · [data-palabras-panel-icon] · block-size',
'global · palabras-chrome.css · [data-palabras-panel-icon] · border-radius',
'global · palabras-chrome.css · [data-palabras-panel-icon] · color',
'global · palabras-chrome.css · [data-palabras-panel-icon] · inline-size',
'global · palabras-chrome.css · [data-palabras-panel] :is([data-field-control], [data-css-field], [data-textarea-input]), [data-palabras-panel] [data-select-trigger], [data-palabras-text], [data-palabras-spacing-cell] · background',
'global · palabras-chrome.css · [data-palabras-panel] :is([data-field-control], [data-css-field], [data-textarea-input]), [data-palabras-panel] [data-select-trigger], [data-palabras-text], [data-palabras-spacing-cell] · border-radius',
'global · palabras-chrome.css · [data-palabras-panel] :is([data-textarea-input], [data-field] input) · font-size',
'global · palabras-chrome.css · [data-palabras-panel] [data-field-control]:focus-within, [data-palabras-panel] [data-css-field]:focus-within, [data-palabras-panel] [data-textarea][data-focused] [data-textarea-input], [data-palabras-panel] [data-select-trigger]:focus-visible, [data-palabras-text]:focus-visible, [data-palabras-spacing-cell]:focus-visible · background',
'global · palabras-chrome.css · [data-palabras-panel] [data-float-panel-header], [data-palabras-panel] [data-palabras-dock-header] · padding',
'global · palabras-chrome.css · [data-palabras-panel] [data-float-panel-title], [data-palabras-panel] [data-drawer-title], [data-palabras-panel] [data-palabras-menu-title] · color',
'global · palabras-chrome.css · [data-palabras-panel] [data-float-panel-title], [data-palabras-panel] [data-drawer-title], [data-palabras-panel] [data-palabras-menu-title] · font-size',
'global · palabras-chrome.css · [data-palabras-panel] [data-float-panel-title], [data-palabras-panel] [data-drawer-title], [data-palabras-panel] [data-palabras-menu-title] · font-weight',
'global · palabras-chrome.css · [data-palabras-panel] [data-palabras-design] [data-accordion-content] · padding',
'global · palabras-chrome.css · [data-palabras-panel] [data-palabras-design] [data-accordion-item] + [data-accordion-item] · border-block-start',
'global · palabras-chrome.css · [data-palabras-panel] [data-palabras-design] [data-accordion-trigger] · color',
'global · palabras-chrome.css · [data-palabras-panel] [data-palabras-design] [data-accordion-trigger] · font-size',
'global · palabras-chrome.css · [data-palabras-panel] [data-palabras-design] [data-accordion-trigger] · font-weight',
'global · palabras-chrome.css · [data-palabras-panel] [data-palabras-design] [data-accordion-trigger] · padding-block',
"global · palabras-chrome.css · [data-palabras-panel] [data-palabras-design] [data-accordion-trigger]:hover, [data-palabras-panel] [data-palabras-design] [data-accordion-trigger][data-state='open'], [data-palabras-panel] [data-palabras-design] [data-accordion-trigger][aria-expanded='true'] · color",
'global · palabras-chrome.css · [data-palabras-panel] [data-palabras-doc-body] · border-block-start',
'global · palabras-chrome.css · [data-palabras-panel] [data-palabras-doc-body] · padding-block',
'global · palabras-chrome.css · [data-palabras-panel] [data-palabras-doc-body] · padding-inline',
'global · palabras-chrome.css · [data-palabras-panel] [data-palabras-dock-controls] · gap',
'global · palabras-chrome.css · [data-palabras-panel] [data-scroll-area]:has([data-scroll-area-scrollbar]) [data-scroll-area-viewport] · padding-inline-end',
'global · palabras-chrome.css · [data-palabras-panel][data-palabras-docked][data-drawer-content] · background',
"global · palabras-chrome.css · [data-palabras-panel][data-palabras-docked][data-side='left'] · border-inline-end",
"global · palabras-chrome.css · [data-palabras-panel][data-palabras-docked][data-side='right'] · border-inline-start",
'global · palabras-chrome.css · [data-palabras-panel][data-palabras-panel], [data-palabras-panel][data-palabras-panel] * · font-family',
'global · palabras-chrome.css · [data-palabras-panel][data-palabras-panel]:not([data-palabras-docked]):not([data-menubar-panel]) · background',
'global · palabras-chrome.css · [data-palabras-panel][data-palabras-panel]:not([data-palabras-docked]):not([data-menubar-panel]) · border',
'global · palabras-chrome.css · [data-palabras-panel][data-palabras-panel]:not([data-palabras-docked]):not([data-menubar-panel]) · border-radius',
'global · palabras-chrome.css · [data-palabras-panel][data-palabras-panel]:not([data-palabras-docked]):not([data-menubar-panel]) · box-shadow',
'global · palabras-chrome.css · [data-palabras-section-reset] · color',
'global · palabras-chrome.css · [data-palabras-select-text][data-empty] · color',
'global · palabras-chrome.css · [data-palabras-slash-desc] · color',
'global · palabras-chrome.css · [data-palabras-slash-desc] · font-size',
'global · palabras-chrome.css · [data-palabras-slash-desc] · padding-inline-start',
'global · palabras-chrome.css · [data-palabras-slash-icon] · color',
'global · palabras-chrome.css · [data-palabras-slash-item] · border-radius',
'global · palabras-chrome.css · [data-palabras-slash-item] · color',
'global · palabras-chrome.css · [data-palabras-slash-item] · font-size',
'global · palabras-chrome.css · [data-palabras-slash-item] · gap',
'global · palabras-chrome.css · [data-palabras-slash-item] · padding',
'global · palabras-chrome.css · [data-palabras-slash-item][data-active] · background',
'global · palabras-chrome.css · [data-palabras-slash-label] · font-weight',
'global · palabras-chrome.css · [data-palabras-slash] · background',
'global · palabras-chrome.css · [data-palabras-slash] · border',
'global · palabras-chrome.css · [data-palabras-slash] · border-radius',
'global · palabras-chrome.css · [data-palabras-slash] · box-shadow',
'global · palabras-chrome.css · [data-palabras-slash] · font-family',
'global · palabras-chrome.css · [data-palabras-slash] · padding',
'global · palabras-chrome.css · [data-palabras-spacing-cell] :is(input, [data-field-input]) · font-size',
'global · palabras-chrome.css · [data-palabras-spacing-cell] :is(input, [data-field-input]) · padding',
'global · palabras-chrome.css · [data-palabras-spacing-head] · gap',
'global · palabras-chrome.css · [data-palabras-spacing-head] · min-block-size',
'global · palabras-chrome.css · [data-palabras-spacing-link] · color',
'global · palabras-chrome.css · [data-palabras-spacing-side] · color',
'global · palabras-chrome.css · [data-palabras-spacing-side] · font-size',
'global · palabras-chrome.css · [data-palabras-spacing] · column-gap',
'global · palabras-chrome.css · [data-palabras-spacing] · row-gap',
'global · palabras-chrome.css · [data-palabras-src-group] · gap',
'global · palabras-chrome.css · [data-palabras-status] · color',
'global · palabras-chrome.css · [data-palabras-status] · font-size',
'global · palabras-chrome.css · [data-palabras-status] · gap',
'global · palabras-chrome.css · [data-palabras-status] · padding-block',
'global · palabras-chrome.css · [data-palabras-tab-empty] · color',
'global · palabras-chrome.css · [data-palabras-tab-empty] · font-size',
'global · palabras-chrome.css · [data-palabras-tab-empty] · padding',
'global · palabras-chrome.css · [data-palabras-tabs] [data-tabs-content] > [data-scroll-area] > [data-scroll-area-viewport] · padding-block',
'global · palabras-chrome.css · [data-palabras-tabs] [data-tabs-content] · border-block-start',
'global · palabras-chrome.css · [data-palabras-tabs] · padding-inline',
'global · palabras-chrome.css · [data-palabras-text] · color',
'global · palabras-chrome.css · [data-palabras-text] · font-family',
'global · palabras-chrome.css · [data-palabras-text] · font-size',
'global · palabras-chrome.css · [data-palabras-text] · padding',
'global · palabras-chrome.css · [data-palabras-text][data-invalid] · border-color',
'global · palabras-chrome.css · [data-palabras-type-pair] · column-gap',
'global · palabras-chrome.css · [data-palabras-type-style] · gap',
'global · palabras-chrome.css · [data-palabras-typography] · gap',
'global · palabras-chrome.css · [data-toggle-group][data-palabras-segmented] [data-toggle-group-item] · border-radius',
'global · palabras-chrome.css · [data-toggle-group][data-palabras-segmented] [data-toggle-group-item] · color',
'global · palabras-chrome.css · [data-toggle-group][data-palabras-segmented] [data-toggle-group-item]:hover · color',
"global · palabras-chrome.css · [data-toggle-group][data-palabras-segmented] [data-toggle-group-item][data-state='on'] · background",
"global · palabras-chrome.css · [data-toggle-group][data-palabras-segmented] [data-toggle-group-item][data-state='on'] · box-shadow",
"global · palabras-chrome.css · [data-toggle-group][data-palabras-segmented] [data-toggle-group-item][data-state='on'] · color",
'global · palabras-chrome.css · [data-toggle-group][data-palabras-segmented] · background',
'global · palabras-chrome.css · [data-toggle-group][data-palabras-segmented] · border-radius',
'global · palabras-chrome.css · [data-toggle-group][data-palabras-segmented] · gap',
'global · palabras-chrome.css · [data-toggle-group][data-palabras-segmented] · padding',
'global · palabras-chrome.css · button[data-palabras-panel-crumb]:hover · color',
'global · palabras.css · [data-palabras-doc] [data-palabras-active] · border-radius',
'global · palabras.css · [data-palabras-doc] [data-palabras-active] · outline',
"global · palabras.css · [data-palabras-doc] [data-palabras-block='columns'] [data-palabras-column] · border",
"global · palabras.css · [data-palabras-doc] [data-palabras-block='columns'] [data-palabras-column] · border-radius",
"global · palabras.css · [data-palabras-doc] [data-palabras-block='columns'] [data-palabras-column] · padding",
"global · palabras.css · [data-palabras-doc] [data-palabras-block='columns'] [data-palabras-column]:hover, [data-palabras-doc] [data-palabras-block='columns'] [data-palabras-column]:focus-within · border-color",
'global · palabras.css · [data-palabras-doc] [data-palabras-content] pre[data-palabras-code-language]::before · font-family',
'global · palabras.css · [data-palabras-doc] [data-palabras-content] pre[data-palabras-code-language]::before · font-size',
'global · palabras.css · [data-palabras-doc] [data-palabras-image-placeholder] · background',
'global · palabras.css · [data-palabras-doc] [data-palabras-image-placeholder] · border',
'global · palabras.css · [data-palabras-doc] [data-palabras-image-placeholder] · border-radius',
'global · palabras.css · [data-palabras-doc] [data-palabras-image-placeholder] · color',
'global · palabras.css · [data-palabras-doc] [data-palabras-image-placeholder] · padding',
'global · palabras.css · [data-palabras-doc] [data-palabras-untranslated] · border-radius',
'global · palabras.css · [data-palabras-doc] [data-palabras-untranslated] · outline',
"global · palabras.css · [data-palabras-doc] figure[data-palabras-block='image'] figcaption · color",
"global · palabras.css · [data-palabras-doc] figure[data-palabras-block='image'] figcaption · font-size",
"global · palabras.css · [data-palabras-doc] figure[data-palabras-block='image'] img · border-radius",
"global · palabras.css · [data-palabras-doc] figure[data-palabras-block='image'][data-palabras-image-fit] :where(img, [data-palabras-image-tile]) · background",
"global · palabras.css · [data-palabras-doc] figure[data-palabras-block='image'][data-palabras-image-fit] :where(img, [data-palabras-image-tile]) · border-radius",
'literal · palabras-chrome.css · [data-menubar-panel][data-palabras-inspector-surface] · inline-size',
'literal · palabras-chrome.css · [data-palabras-appearance] [data-number-field] · inline-size',
'literal · palabras-chrome.css · [data-palabras-border] · inline-size',
'literal · palabras-chrome.css · [data-palabras-bubble-divider] · block-size',
'literal · palabras-chrome.css · [data-palabras-bubble-divider] · inline-size',
'literal · palabras-chrome.css · [data-palabras-bubble-family] · inline-size',
'literal · palabras-chrome.css · [data-palabras-bubble-link] input · inline-size',
'literal · palabras-chrome.css · [data-palabras-bubble-size] [data-number-field], [data-palabras-bubble-family] [data-select-trigger] · inline-size',
'literal · palabras-chrome.css · [data-palabras-bubble-size] · inline-size',
'literal · palabras-chrome.css · [data-palabras-canvas] [data-palabras-block-drop-line] · block-size',
'literal · palabras-chrome.css · [data-palabras-canvas] [data-palabras-block-drop-line] · border-radius',
'literal · palabras-chrome.css · [data-palabras-canvas] [data-palabras-column-inserter][data-visible] · opacity',
'literal · palabras-chrome.css · [data-palabras-col-resize] · inline-size',
'literal · palabras-chrome.css · [data-palabras-doc-card] · min-block-size',
'literal · palabras-chrome.css · [data-palabras-field] [data-css-field] · inline-size',
'literal · palabras-chrome.css · [data-palabras-field][data-disabled] · opacity',
'literal · palabras-chrome.css · [data-palabras-field][data-stack] > [data-toggle-group][data-palabras-segmented] [data-toggle-group-item] · min-inline-size',
'literal · palabras-chrome.css · [data-palabras-find-count] · min-inline-size',
'literal · palabras-chrome.css · [data-palabras-find-input] · inline-size',
'literal · palabras-chrome.css · [data-palabras-find-sep] · block-size',
'literal · palabras-chrome.css · [data-palabras-find-sep] · inline-size',
"literal · palabras-chrome.css · [data-palabras-handle-menu] [role='menuitem'] svg · block-size",
"literal · palabras-chrome.css · [data-palabras-handle-menu] [role='menuitem'] svg · inline-size",
"literal · palabras-chrome.css · [data-palabras-handle-menu] [role='menuitem'] svg · opacity",
'literal · palabras-chrome.css · [data-palabras-insert-grid] · gap',
'literal · palabras-chrome.css · [data-palabras-inspector] [data-css-field], [data-palabras-inspector] [data-select-trigger] · inline-size',
'literal · palabras-chrome.css · [data-palabras-lang-menu] [data-palabras-lang-option] · inline-size',
'literal · palabras-chrome.css · [data-palabras-lang-menu] · min-inline-size',
'literal · palabras-chrome.css · [data-palabras-lang-option] · font-weight',
'literal · palabras-chrome.css · [data-palabras-lang-option]::before · block-size',
'literal · palabras-chrome.css · [data-palabras-lang-option]::before · inline-size',
"literal · palabras-chrome.css · [data-palabras-lang-switcher][data-mode='segmented'] [data-palabras-lang-option][data-active] · font-weight",
'literal · palabras-chrome.css · [data-palabras-live] · block-size',
'literal · palabras-chrome.css · [data-palabras-live] · inline-size',
'literal · palabras-chrome.css · [data-palabras-menubar] · inline-size',
'literal · palabras-chrome.css · [data-palabras-outline-item] · inline-size',
'literal · palabras-chrome.css · [data-palabras-outline-trigger] svg · block-size',
'literal · palabras-chrome.css · [data-palabras-outline-trigger] svg · inline-size',
'literal · palabras-chrome.css · [data-palabras-outline-trigger]:disabled · opacity',
'literal · palabras-chrome.css · [data-palabras-outline] · min-inline-size',
'literal · palabras-chrome.css · [data-palabras-panel-icon] svg · block-size',
'literal · palabras-chrome.css · [data-palabras-panel-icon] svg · inline-size',
'literal · palabras-chrome.css · [data-palabras-panel] [data-float-panel-title], [data-palabras-panel] [data-drawer-title], [data-palabras-panel] [data-palabras-menu-title] · letter-spacing',
'literal · palabras-chrome.css · [data-palabras-panel] [data-palabras-border-radius-scale] · inline-size',
'literal · palabras-chrome.css · [data-palabras-panel] [data-palabras-border-style] · inline-size',
'literal · palabras-chrome.css · [data-palabras-panel] [data-palabras-design] [data-accordion-content] [data-scroll-area] · inline-size',
'literal · palabras-chrome.css · [data-palabras-panel] [data-palabras-design] · inline-size',
'literal · palabras-chrome.css · [data-palabras-panel] [data-palabras-spacing-scale] · inline-size',
'literal · palabras-chrome.css · [data-palabras-panel] [data-palabras-spacing-scale] · min-inline-size',
'literal · palabras-chrome.css · [data-palabras-panel] [data-select-trigger] · inline-size',
'literal · palabras-chrome.css · [data-palabras-panel][data-menubar-panel] · inline-size',
'literal · palabras-chrome.css · [data-palabras-panel][data-palabras-mobile][data-drawer-content] · inline-size',
'literal · palabras-chrome.css · [data-palabras-panel][data-palabras-panel]:not([data-palabras-docked]):not([data-menubar-panel]) · height',
'literal · palabras-chrome.css · [data-palabras-shell] · inline-size',
'literal · palabras-chrome.css · [data-palabras-slash-item] · inline-size',
'literal · palabras-chrome.css · [data-palabras-slash] · gap',
'literal · palabras-chrome.css · [data-palabras-slash] · min-inline-size',
'literal · palabras-chrome.css · [data-palabras-spacing-cell] · inline-size',
'literal · palabras-chrome.css · [data-palabras-spacing] · inline-size',
'literal · palabras-chrome.css · [data-palabras-src-group] · inline-size',
'literal · palabras-chrome.css · [data-palabras-tabs] [data-tabs-content] > [data-scroll-area] · inline-size',
'literal · palabras-chrome.css · [data-palabras-tabs] · inline-size',
'literal · palabras-chrome.css · [data-palabras-text] · border',
'literal · palabras-chrome.css · [data-palabras-text] · inline-size',
'literal · palabras-chrome.css · [data-palabras-typography] · inline-size',
"literal · palabras.css · [data-palabras-doc] [data-palabras-block='columns'] [data-palabras-column] · min-block-size",
"literal · palabras.css · [data-palabras-doc] [data-palabras-content] [data-palabras-block='callout'][data-palabras-callout-icon]::before · font-size",
"literal · palabras.css · [data-palabras-doc] [data-palabras-content] [data-palabras-block='callout'][data-palabras-callout-icon]::before · line-height",
"literal · palabras.css · [data-palabras-doc] [data-palabras-content] [data-palabras-block='callout'][data-palabras-callout-icon]::before · opacity",
'literal · palabras.css · [data-palabras-doc] [data-palabras-content] blockquote[data-palabras-quote-marks]::before · font-size',
'literal · palabras.css · [data-palabras-doc] [data-palabras-content] blockquote[data-palabras-quote-marks]::before · line-height',
'literal · palabras.css · [data-palabras-doc] [data-palabras-content] blockquote[data-palabras-quote-marks]::before · opacity',
'literal · palabras.css · [data-palabras-doc] [data-palabras-content] pre[data-palabras-code-language]::before · font-weight',
'literal · palabras.css · [data-palabras-doc] [data-palabras-content] pre[data-palabras-code-language]::before · letter-spacing',
'literal · palabras.css · [data-palabras-doc] [data-palabras-content] pre[data-palabras-code-language]::before · line-height',
'literal · palabras.css · [data-palabras-doc] [data-palabras-content] table · inline-size',
'literal · palabras.css · [data-palabras-doc] [data-palabras-i18n-fallback]::before · opacity',
'literal · palabras.css · [data-palabras-doc] [data-palabras-image-placeholder] · inline-size',
'literal · palabras.css · [data-palabras-doc] [data-palabras-image-placeholder] · min-block-size',
'literal · palabras.css · [data-palabras-doc] [data-palabras-image-placeholder]::before · background',
'literal · palabras.css · [data-palabras-doc] [data-palabras-image-placeholder]::before · block-size',
'literal · palabras.css · [data-palabras-doc] [data-palabras-image-placeholder]::before · inline-size',
"literal · palabras.css · [data-palabras-doc] figure[data-palabras-block='image'][data-palabras-image-fit] :where(img, [data-palabras-image-tile]) · inline-size",
"literal · palabras.css · [data-palabras-doc] figure[data-palabras-block='image'][data-palabras-image-fit] · inline-size",
"literal · palabras.css · [data-palabras-doc] figure[data-palabras-block='image'][data-palabras-image-full-width] img · inline-size",
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
"literal · palabras.css · [data-palabras-doc] figure[data-palabras-block='image'][data-palabras-image-full-width] · inline-size",
'private · palabras-chrome.css · [data-palabras-col-resize]::before · inline-size'
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
],
'password-field': [
'global · password-field.css · [data-password-field-strength-meter-label] · font-size',
'global · password-field.css · [data-password-field-strength-meter] · padding-inline',
'literal · password-field.css · [data-password-field-caps-lock-glyph] svg · block-size',
'literal · password-field.css · [data-password-field-caps-lock-glyph] svg · inline-size',
'literal · password-field.css · [data-password-field-caps-lock-glyph] · line-height',
'literal · password-field.css · [data-password-field-caps-lock-indicator] · gap',
'literal · password-field.css · [data-password-field-caps-lock-indicator] · padding-block',
'literal · password-field.css · [data-password-field-caps-lock-indicator] · padding-inline',
'literal · password-field.css · [data-password-field-strength-meter] · gap',
'literal · password-field.css · [data-password-field-visibility-trigger] svg · block-size',
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
'literal · password-field.css · [data-password-field-visibility-trigger] svg · inline-size',
'private · password-field.css · [data-password-field-visibility-trigger]:hover:not([data-disabled]) · background',
'private · password-field.css · [data-password-field-visibility-trigger]:hover:not([data-disabled]) · color'
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
],
'picker-shell': ['global · picker-time-row.css · .picker-time-label · font-size'],
popover: [
"global · popover.css · [data-popover-content][data-state='closed'][data-side='bottom'][data-last-action='cancelled'], [data-popover-content][data-state='closed'][data-side='bottom'][data-last-action='dismissed'], [data-popover-content][data-state='closed'][data-side='bottom'][data-last-action='dismissed-outside'] · border-top",
"global · popover.css · [data-popover-content][data-state='closed'][data-side='bottom'][data-last-action='failed'] · border-top",
"global · popover.css · [data-popover-content][data-state='closed'][data-side='bottom'][data-last-action='saved'] · border-top",
"global · popover.css · [data-popover-content][data-state='closed'][data-side='left'][data-last-action='cancelled'], [data-popover-content][data-state='closed'][data-side='left'][data-last-action='dismissed'], [data-popover-content][data-state='closed'][data-side='left'][data-last-action='dismissed-outside'] · border-right",
"global · popover.css · [data-popover-content][data-state='closed'][data-side='left'][data-last-action='failed'] · border-right",
"global · popover.css · [data-popover-content][data-state='closed'][data-side='left'][data-last-action='saved'] · border-right",
"global · popover.css · [data-popover-content][data-state='closed'][data-side='right'][data-last-action='cancelled'], [data-popover-content][data-state='closed'][data-side='right'][data-last-action='dismissed'], [data-popover-content][data-state='closed'][data-side='right'][data-last-action='dismissed-outside'] · border-left",
"global · popover.css · [data-popover-content][data-state='closed'][data-side='right'][data-last-action='failed'] · border-left",
"global · popover.css · [data-popover-content][data-state='closed'][data-side='right'][data-last-action='saved'] · border-left",
"global · popover.css · [data-popover-content][data-state='closed'][data-side='top'][data-last-action='cancelled'], [data-popover-content][data-state='closed'][data-side='top'][data-last-action='dismissed'], [data-popover-content][data-state='closed'][data-side='top'][data-last-action='dismissed-outside'] · border-bottom",
"global · popover.css · [data-popover-content][data-state='closed'][data-side='top'][data-last-action='failed'] · border-bottom",
"global · popover.css · [data-popover-content][data-state='closed'][data-side='top'][data-last-action='saved'] · border-bottom"
],
progress: [
"global · progress.css · [data-progress][data-shape='circular'] [data-progress-indicator] · border-radius",
"global · progress.css · [data-progress][data-shape='circular'] [data-progress-indicator]::before · border-radius"
],
'proof-of-human': [
'global · clock.css · .ck-badge-num · fill',
'global · clock.css · .ck-hand-main, .ck-hand-tail · fill',
'global · clock.css · .ck-house-frame · stroke',
'global · clock.css · .ck-hub · fill',
'global · clock.css · .ck-num · fill',
'global · clock.css · .ck-ring · fill',
'global · clock.css · .ck-ring · stroke',
'global · clock.css · .ck-sill · fill',
'global · clock.css · .ck-tick · stroke',
"global · clock.css · [data-proof-of-human][data-state='verified'] .ck-badge-dot · fill",
"global · clock.css · [data-proof-of-human][data-state='verified'] .ck-roof · fill",
'global · proof-of-human.css · .poh-trace-dot[data-off-path] · background',
'global · proof-of-human.css · .poh-trace-dot[data-off-path] · box-shadow',
'global · proof-of-human.css · [data-path-trace-token]::before · min-block-size',
'global · proof-of-human.css · [data-path-trace-token]::before · min-inline-size',
'global · rotate-align.css · .ra-card · fill',
'global · rotate-align.css · .ra-flag · fill',
'global · rotate-align.css · .ra-hub · fill',
'global · rotate-align.css · .ra-n · fill',
'global · rotate-align.css · .ra-post · fill',
'global · rotate-align.css · .ra-ring · fill',
'global · rotate-align.css · .ra-ring · stroke',
'global · rotate-align.css · .ra-s · fill',
'global · rotate-align.css · .ra-tick · stroke',
"global · rotate-align.css · [data-proof-of-human][data-state='verified'] .ra-box · fill",
"global · rotate-align.css · [data-proof-of-human][data-state='verified'] .ra-flag · fill",
'global · rotate-align.css · [data-rotate-align-needle]::before · min-block-size',
'global · rotate-align.css · [data-rotate-align-needle]::before · min-inline-size',
'global · rotate-align.css · [data-rotate-align-needle]:focus-visible · border-radius',
'literal · clock.css · .ck-face, .ck-hand · block-size',
'literal · clock.css · .ck-face, .ck-hand · inline-size',
'literal · clock.css · 0%, 13% · opacity',
'literal · clock.css · 26%, 62% · opacity',
'literal · clock.css · to · opacity',
'literal · proof-of-human.css · .poh-trace-svg · block-size',
'literal · proof-of-human.css · .poh-trace-svg · inline-size',
'literal · proof-of-human.css · [data-path-trace-token]::before · block-size',
'literal · proof-of-human.css · [data-path-trace-token]::before · inline-size',
'literal · rotate-align.css · .ra-card · font-weight',
'literal · rotate-align.css · .ra-dial, .ra-needle · block-size',
'literal · rotate-align.css · .ra-dial, .ra-needle · inline-size',
'literal · rotate-align.css · [data-rotate-align-dial], [data-rotate-align-needle] · block-size',
'literal · rotate-align.css · [data-rotate-align-dial], [data-rotate-align-needle] · inline-size',
'literal · rotate-align.css · [data-rotate-align-skin] · inline-size'
],
prose: [
'literal · prose.css · :where([data-prose] :is(ul, ol)):not(:where([data-prose-ignore], [data-prose-ignore] *)) · padding-inline-start',
'literal · prose.css · :where([data-prose] blockquote):not(:where([data-prose-ignore], [data-prose-ignore] *)) · padding-inline-start',
'literal · prose.css · :where([data-prose] code):not(:where([data-prose-ignore], [data-prose-ignore] *)) · padding',
'literal · prose.css · :where([data-prose] kbd):not(:where([data-prose-ignore], [data-prose-ignore] *)) · padding',
'literal · prose.css · :where([data-prose] mark):not(:where([data-prose-ignore], [data-prose-ignore] *)) · padding',
'literal · prose.css · :where([data-prose] pre):not(:where([data-prose-ignore], [data-prose-ignore] *)) · padding',
'literal · prose.css · :where([data-prose] table):not(:where([data-prose-ignore], [data-prose-ignore] *)) · inline-size',
'literal · prose.css · :where([data-prose] td):not(:where([data-prose-ignore], [data-prose-ignore] *)) · padding',
'literal · prose.css · :where([data-prose] th):not(:where([data-prose-ignore], [data-prose-ignore] *)) · padding'
],
'radio-cards': [
'global · radio-cards.css · [data-radio-cards-indicator] · background',
'global · radio-cards.css · [data-radio-cards-indicator] · block-size',
'global · radio-cards.css · [data-radio-cards-indicator] · border',
'global · radio-cards.css · [data-radio-cards-indicator] · border-radius',
'global · radio-cards.css · [data-radio-cards-indicator] · inline-size',
'global · radio-cards.css · [data-radio-cards-indicator]::after · background',
'global · radio-cards.css · [data-radio-cards-indicator]::after · border-radius',
'global · radio-cards.css · [data-radio-cards] [data-radio-cards-item][data-disabled] [data-radio-cards-indicator] · background',
'global · radio-cards.css · [data-radio-cards] [data-radio-cards-item][data-disabled] [data-radio-cards-indicator] · border-color',
"global · radio-cards.css · [data-radio-cards] [data-radio-cards-item][data-state='checked'] [data-radio-cards-icon] · color",
"global · radio-cards.css · [data-radio-cards] [data-radio-cards-item][data-state='checked'] [data-radio-cards-indicator] · border-color",
"global · radio-cards.css · [data-radio-cards] [data-radio-cards-item][data-state='checked'] · background",
"global · radio-cards.css · [data-radio-cards] [data-radio-cards-item][data-state='checked'] · border-color",
"global · radio-cards.css · [data-radio-cards] [data-radio-cards-item][data-state='checked']:hover:not([data-disabled]):not([data-readonly]) · background",
"global · radio-cards.css · [data-radio-cards] [data-radio-cards-item][data-state='checked']:hover:not([data-disabled]):not([data-readonly]) · border-color",
"global · radio-cards.css · [data-radio-cards][data-size='lg'] [data-radio-cards-indicator] · block-size",
"global · radio-cards.css · [data-radio-cards][data-size='lg'] [data-radio-cards-indicator] · inline-size",
"global · radio-cards.css · [data-radio-cards][data-size='sm'] [data-radio-cards-indicator] · block-size",
"global · radio-cards.css · [data-radio-cards][data-size='sm'] [data-radio-cards-indicator] · inline-size",
"global · radio-cards.css · [data-radio-cards][data-size='xl'] [data-radio-cards-indicator] · block-size",
"global · radio-cards.css · [data-radio-cards][data-size='xl'] [data-radio-cards-indicator] · inline-size",
"global · radio-cards.css · [data-radio-cards][data-size='xs'] [data-radio-cards-indicator] · block-size",
"global · radio-cards.css · [data-radio-cards][data-size='xs'] [data-radio-cards-indicator] · inline-size",
'literal · radio-cards.css · [data-radio-cards-icon] svg · block-size',
'literal · radio-cards.css · [data-radio-cards-icon] svg · inline-size',
'literal · radio-cards.css · [data-radio-cards-indicator]::after · block-size',
'literal · radio-cards.css · [data-radio-cards-indicator]::after · inline-size'
],
'radio-group': ['global · radio-group.css · [data-radio-group-row] · min-block-size'],
'range-calendar': [
'global · range-calendar.css · [data-range-calendar-day][data-range-end] · font-weight',
'global · range-calendar.css · [data-range-calendar-day][data-range-start] · font-weight',
'literal · range-calendar.css · [data-range-calendar-grid] · inline-size',
'literal · range-calendar.css · [data-range-calendar-header] · inline-size',
'literal · range-calendar.css · [data-range-calendar-month-panel] · min-inline-size',
'literal · range-calendar.css · [data-range-calendar] · inline-size'
],
result: [
'literal · result.css · [data-result-extra] · inline-size',
'literal · result.css · [data-result-media] · line-height'
],
's-text-virtual-list': [
'global · s-text-virtual-list.css · [data-s-text-virtual-list] · font-family',
'global · s-text-virtual-list.css · [data-s-text-virtual-list] · font-size',
'global · s-text-virtual-list.css · [data-s-text-virtual-list] · font-weight'
],
'scroll-frames': [
'global · scroll-frames.css · [data-scroll-frames-loader] · opacity',
'literal · scroll-frames.css · [data-scroll-frames-loader] · line-height',
'literal · scroll-frames.css · [data-scroll-frames-media] · block-size',
'literal · scroll-frames.css · [data-scroll-frames-media] · inline-size',
'literal · scroll-frames.css · [data-scroll-frames] · inline-size'
],
sidebar: [
'global · sidebar.css · [data-sidebar-content] · gap',
'global · sidebar.css · [data-sidebar-group-label] · color',
'global · sidebar.css · [data-sidebar-group-label] · font-weight',
'global · sidebar.css · [data-sidebar-group-label] · line-height',
'global · sidebar.css · [data-sidebar-group-label] · padding-block',
'global · sidebar.css · [data-sidebar-menu-button], [data-sidebar-menu-sub-button] · color',
'global · sidebar.css · [data-sidebar-menu-button]:hover, [data-sidebar-menu-sub-button]:hover · color',
'global · sidebar.css · [data-sidebar-menu-button][data-active], [data-sidebar-menu-sub-button][data-active] · background-color',
'global · sidebar.css · [data-sidebar-menu-button][data-active], [data-sidebar-menu-sub-button][data-active] · color',
'global · sidebar.css · [data-sidebar-menu-button][data-active], [data-sidebar-menu-sub-button][data-active] · font-weight',
'global · sidebar.css · [data-sidebar-menu-button][data-disabled], [data-sidebar-menu-sub-button][data-disabled] · color',
'global · sidebar.css · [data-sidebar-menu-item] · gap',
'global · sidebar.css · [data-sidebar-menu-sub][data-floating] · border-radius',
'global · sidebar.css · [data-sidebar-rail]:hover · background',
'literal · sidebar.css · [data-sidebar-panel] · block-size',
'literal · sidebar.css · [data-sidebar] · block-size',
'literal · sidebar.css · [data-sidebar] · inline-size',
'literal · sidebar.css · [data-sidebar][data-mobile] [data-sidebar-panel] · block-size',
'literal · sidebar.css · [data-sidebar][data-mobile] [data-sidebar-panel] · inline-size'
],
skeleton: ['literal · skeleton.css · [data-skeleton] · inline-size'],
'skin-media-player': [
'global · skin-media-player.css · [data-skin-media-player] · inline-size',
'literal · skin-media-player.css · [data-media-player]:not([data-paused]) .smp-lamp · opacity',
'literal · skin-media-player.css · [data-skin-media-player-cassette] · filter',
'literal · skin-media-player.css · [data-skin-media-player-deck][data-spinning] .smp-lamp · opacity',
'literal · skin-media-player.css · [data-skin-media-player-fader] [data-slider] · inline-size',
'literal · skin-media-player.css · [data-skin-media-player] > svg · block-size',
'literal · skin-media-player.css · [data-skin-media-player] > svg · inline-size'
],
'spin-field': [
'global · spin-field.css · [data-spin-field-increment-trigger], [data-spin-field-decrement-trigger], [data-spin-field-scrubber] · block-size',
'global · spin-field.css · [data-spin-field-increment-trigger], [data-spin-field-decrement-trigger], [data-spin-field-scrubber] · inline-size',
'global · spin-field.css · [data-spin-field-increment-trigger], [data-spin-field-decrement-trigger], [data-spin-field-scrubber] · min-inline-size',
'global · spin-field.css · [data-spin-field-input] · padding-inline',
"global · spin-field.css · [data-spin-field][data-steppers='stacked'] [data-spin-field-increment-trigger], [data-spin-field][data-steppers='stacked'] [data-spin-field-decrement-trigger] · font-size",
"global · spin-field.css · [data-spin-field][data-steppers='stacked'] [data-spin-field-increment-trigger], [data-spin-field][data-steppers='stacked'] [data-spin-field-decrement-trigger] · inline-size",
"global · spin-field.css · [data-spin-field][data-steppers='stacked'] [data-spin-field-increment-trigger], [data-spin-field][data-steppers='stacked'] [data-spin-field-decrement-trigger] · min-inline-size",
"global · spin-field.css · [data-spin-field][data-steppers='stacked'] [data-spin-field-input] · padding-inline"
],
spinner: [
'literal · spinner.css · 0%, 80%, 100% · opacity',
'literal · spinner.css · 40% · opacity',
"literal · spinner.css · [data-spinner][data-variant='dots'] [data-spinner-dot] · border-radius",
"literal · spinner.css · [data-spinner][data-variant='ring'] [data-spinner-track] · border-radius"
],
stepper: [
"literal · stepper.css · [data-stepper-separator][data-orientation='vertical'] · block-size"
],
table: [
'literal · table.css · [data-table-root][data-block] · inline-size',
'literal · table.css · [data-table-sort-trigger][data-sorted] [data-table-sort-indicator] · opacity',
'literal · table.css · [data-table] · inline-size'
],
'tag-group': ['literal · tag-group.css · [data-tag-group-remove-button] · line-height'],
'text-scramble': [
'literal · text-scramble.css · [data-text-scramble-sr] · height',
'literal · text-scramble.css · [data-text-scramble-sr] · width'
],
textarea: [
'literal · textarea.css · [data-textarea-count] · line-height',
'literal · textarea.css · [data-textarea-input] · inline-size',
'literal · textarea.css · [data-textarea] · inline-size'
],
'time-picker': [
'global · time-picker.css · .time-picker-scale · padding-inline',
'global · time-picker.css · .time-picker-scale-mark · background',
'global · time-picker.css · .time-picker-scale-tick · color',
'global · time-picker.css · .time-picker-scale-tick · font-family',
'global · time-picker.css · .time-picker-scale-tick · font-size',
'global · time-picker.css · .time-picker-slider-label · color',
'global · time-picker.css · .time-picker-slider-label · font-family',
'global · time-picker.css · .time-picker-slider-label · font-weight',
'global · time-picker.css · .time-picker-slider-label · letter-spacing',
'global · time-picker.css · [data-time-field-input] [data-time-picker-trigger] · block-size',
'global · time-picker.css · [data-time-field-input] [data-time-picker-trigger] · color',
'global · time-picker.css · [data-time-field-input] [data-time-picker-trigger] · inline-size',
'global · time-picker.css · [data-time-field-input] [data-time-picker-trigger]:focus-visible · background',
'global · time-picker.css · [data-time-field-input] [data-time-picker-trigger]:focus-visible · color',
"global · time-picker.css · [data-time-picker-clock] [data-time-picker-day-period-toggle] [data-toggle-group-item][data-state='on']:hover · background",
"global · time-picker.css · [data-time-picker-clock] [data-time-picker-day-period-toggle] [data-toggle-group-item][data-state='on']:hover · border-color",
'global · time-picker.css · [data-time-picker-clock] · padding',
'global · time-picker.css · [data-time-picker-trigger] · background',
'global · time-picker.css · [data-time-picker-trigger] · border',
'global · time-picker.css · [data-time-picker-trigger] · border-radius',
'global · time-picker.css · [data-time-picker-trigger][data-disabled], [data-time-picker-trigger]:disabled · opacity',
'global · time-picker.css · [data-time-picker] · color',
'global · time-picker.css · [data-time-picker] · font-family',
'global · time-picker.css · [data-time-picker] · line-height',
'literal · time-picker.css · .time-picker-scale · block-size',
'literal · time-picker.css · .time-picker-scale · inline-size',
'literal · time-picker.css · .time-picker-scale-mark · block-size',
'literal · time-picker.css · .time-picker-scale-mark · inline-size',
'literal · time-picker.css · .time-picker-scale-tick · gap',
'literal · time-picker.css · .time-picker-scale-tick · line-height',
'literal · time-picker.css · .time-picker-slider · gap',
'literal · time-picker.css · .time-picker-slider · inline-size',
'literal · time-picker.css · .time-picker-slider-label · line-height',
'literal · time-picker.css · [data-time-picker-clock] [data-slider] · inline-size',
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
'literal · time-picker.css · [data-time-picker] · inline-size',
'private · time-picker.css · .time-picker-slider-label · font-size',
'private · time-picker.css · [data-time-field-input] [data-time-picker-trigger]:hover · background',
'private · time-picker.css · [data-time-field-input] [data-time-picker-trigger]:hover · color',
'private · time-picker.css · [data-time-picker-clock] [data-slider-range] · background',
'private · time-picker.css · [data-time-picker-clock] [data-slider-thumb] · border-color',
'private · time-picker.css · [data-time-picker-trigger] · block-size',
'private · time-picker.css · [data-time-picker-trigger] · inline-size',
'private · time-picker.css · [data-time-picker-trigger]:focus-visible · border-color',
'private · time-picker.css · [data-time-picker-trigger]:hover · background',
'private · time-picker.css · [data-time-picker-trigger]:hover · border-color',
'private · time-picker.css · [data-time-picker-trigger]:hover · color',
'private · time-picker.css · [data-time-picker] · font-size'
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
],
'time-range-picker': [
'global · time-range-picker.css · .time-range-picker-endpoint · gap',
'global · time-range-picker.css · .time-range-picker-endpoint-label · color',
'global · time-range-picker.css · .time-range-picker-endpoint-label · font-weight',
'global · time-range-picker.css · .time-range-picker-endpoint-label · letter-spacing',
'global · time-range-picker.css · .time-range-picker-endpoint:first-child::after · background',
'global · time-range-picker.css · .time-range-picker-endpoint:first-child::after · inline-size',
'global · time-range-picker.css · .time-range-picker-scale · padding-inline',
'global · time-range-picker.css · .time-range-picker-scale-mark · background',
'global · time-range-picker.css · .time-range-picker-scale-tick · color',
'global · time-range-picker.css · .time-range-picker-scale-tick · font-family',
'global · time-range-picker.css · .time-range-picker-scale-tick · font-size',
'global · time-range-picker.css · .time-range-picker-slider-label · color',
'global · time-range-picker.css · .time-range-picker-slider-label · font-family',
'global · time-range-picker.css · .time-range-picker-slider-label · font-weight',
'global · time-range-picker.css · .time-range-picker-slider-label · letter-spacing',
'global · time-range-picker.css · [data-time-range-field-input] [data-time-range-picker-trigger] · border-radius',
'global · time-range-picker.css · [data-time-range-field-input] [data-time-range-picker-trigger] · color',
'global · time-range-picker.css · [data-time-range-field-input] [data-time-range-picker-trigger]:focus-visible · background',
'global · time-range-picker.css · [data-time-range-field-input] [data-time-range-picker-trigger]:focus-visible · color',
'global · time-range-picker.css · [data-time-range-picker-clock] [data-slider-thumb] · box-shadow',
'global · time-range-picker.css · [data-time-range-picker-clock] [data-slider-thumb]:focus-visible · box-shadow',
"global · time-range-picker.css · [data-time-range-picker-clock] [data-time-range-picker-day-period-toggle] [data-toggle-group-item][data-state='on']:hover · background",
"global · time-range-picker.css · [data-time-range-picker-clock] [data-time-range-picker-day-period-toggle] [data-toggle-group-item][data-state='on']:hover · border-color",
'global · time-range-picker.css · [data-time-range-picker-clock] · padding',
'global · time-range-picker.css · [data-time-range-picker-trigger] · background',
'global · time-range-picker.css · [data-time-range-picker-trigger] · border',
'global · time-range-picker.css · [data-time-range-picker-trigger] · border-radius',
'global · time-range-picker.css · [data-time-range-picker-trigger][data-disabled], [data-time-range-picker-trigger]:disabled · opacity',
'global · time-range-picker.css · [data-time-range-picker] · color',
'global · time-range-picker.css · [data-time-range-picker] · font-family',
'global · time-range-picker.css · [data-time-range-picker] · line-height',
'global · time-range-picker.css · [data-time-range-picker][data-invalid] [data-time-range-picker-trigger] · border-color',
'global · time-range-picker.css · [data-time-range-picker][data-invalid] [data-time-range-picker-trigger]:hover · border-color',
'literal · time-range-picker.css · .time-range-picker-scale · block-size',
'literal · time-range-picker.css · .time-range-picker-scale · inline-size',
'literal · time-range-picker.css · .time-range-picker-scale-mark · block-size',
'literal · time-range-picker.css · .time-range-picker-scale-mark · inline-size',
'literal · time-range-picker.css · .time-range-picker-scale-tick · gap',
'literal · time-range-picker.css · .time-range-picker-scale-tick · line-height',
'literal · time-range-picker.css · .time-range-picker-slider · gap',
'literal · time-range-picker.css · .time-range-picker-slider · inline-size',
'literal · time-range-picker.css · .time-range-picker-slider-label · line-height',
'literal · time-range-picker.css · [data-time-range-picker-clock] [data-slider] · inline-size',
'literal · time-range-picker.css · [data-time-range-picker-clock] · min-inline-size',
"literal · time-range-picker.css · [data-time-range-picker-day-period-item] input[type='radio'] · block-size",
"literal · time-range-picker.css · [data-time-range-picker-day-period-item] input[type='radio'] · inline-size",
'literal · time-range-picker.css · [data-time-range-picker-day-period-toggle] · padding',
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
'literal · time-range-picker.css · [data-time-range-picker] · inline-size',
'private · time-range-picker.css · .time-range-picker-endpoint-label · font-size',
'private · time-range-picker.css · .time-range-picker-slider-label · font-size',
'private · time-range-picker.css · [data-time-range-field-input] [data-time-range-picker-trigger] · block-size',
'private · time-range-picker.css · [data-time-range-field-input] [data-time-range-picker-trigger] · inline-size',
'private · time-range-picker.css · [data-time-range-field-input] [data-time-range-picker-trigger]:hover · background',
'private · time-range-picker.css · [data-time-range-field-input] [data-time-range-picker-trigger]:hover · color',
"private · time-range-picker.css · [data-time-range-picker-clock] [data-endpoint='end'] [data-slider-range] · background",
'private · time-range-picker.css · [data-time-range-picker-clock] [data-slider-range] · background',
'private · time-range-picker.css · [data-time-range-picker-clock] [data-slider-thumb] · border-color',
'private · time-range-picker.css · [data-time-range-picker-day-period-item][data-checked] · background',
'private · time-range-picker.css · [data-time-range-picker-day-period-item][data-checked] · color',
'private · time-range-picker.css · [data-time-range-picker-trigger] · block-size',
'private · time-range-picker.css · [data-time-range-picker-trigger] · inline-size',
'private · time-range-picker.css · [data-time-range-picker-trigger]:focus-visible · border-color',
'private · time-range-picker.css · [data-time-range-picker-trigger]:hover · background',
'private · time-range-picker.css · [data-time-range-picker-trigger]:hover · border-color',
'private · time-range-picker.css · [data-time-range-picker-trigger]:hover · color',
'private · time-range-picker.css · [data-time-range-picker] · font-size',
'private · time-range-picker.css · [data-time-range-picker] · gap'
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
],
timeline: ['literal · timeline.css · [data-timeline-marker] · line-height'],
'toggle-group': ['global · toggle-group.css · [data-toggle-group][data-disabled] · opacity'],
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
tooltip: ['private · tooltip.css · [data-tooltip-content] · background'],
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
'tree-grid': ['literal · tree-grid.css · [data-tree-grid-root][data-block] · inline-size'],
'tree-view': ['literal · tree-view.css · [data-tree-view-root][data-block] · inline-size'],
'virtual-grid': [
'literal · virtual-grid.css · [data-virtual-grid-root][data-block] · inline-size',
'literal · virtual-grid.css · [data-virtual-grid-viewport] · block-size',
'literal · virtual-grid.css · [data-virtual-grid-viewport] · inline-size'
],
'virtual-list': [
'literal · virtual-list.css · [data-virtual-list-root][data-block] · inline-size',
'literal · virtual-list.css · [data-virtual-list-viewport] · block-size',
'literal · virtual-list.css · [data-virtual-list-viewport] · inline-size',
'literal · virtual-list.css · [data-virtual-list-window-viewport] · inline-size'
],
waveform: [
'global · waveform.css · [data-waveform]:has([data-slider][data-disabled]) [data-waveform-wave] · opacity'
],
'year-grid': [
'literal · year-grid.css · [data-popover-content] [data-year-grid-grid] · inline-size',
'literal · year-grid.css · [data-popover-content] [data-year-grid] · inline-size',
'literal · year-grid.css · [data-year-grid-grid] · inline-size',
'literal · year-grid.css · [data-year-grid-header] · inline-size',
'literal · year-grid.css · [data-year-grid] · inline-size'
]
};

Powered by TurnKey Linux.