# AUDIT — tier `blocks`: registro de hallazgos (ledger) > **Fuente única del estado de calidad del tier desde 2026-08-05.** > Sustituye a la clasificación de > [`AUDIT-blocks-2026-08-01.md`](./AUDIT-blocks-2026-08-01.md), que se conserva > intacta: sus **reclamaciones, evidencias y sugerencias son válidas** y esta tabla > las indexa. Lo que no sirve de aquel documento es el veredicto. ## Por qué existe este fichero En el documento del 2026-08-01 los campos «Veredicto» están **desemparejados de su hallazgo**: el de `cta`/`Container` lleva un veredicto sobre `Card`/`BoxProps`; el del contraste de `hero`, uno sobre el drawer de `site-header`; el del import de `$libs/forms`, uno sobre `--_link-palette-text`. La lista de refutados arrastra el mismo desplazamiento: su primera justificación refuta el hallazgo de `feature-grid` que la sección de confirmados declara CONFIRMADO. La reclamación, la evidencia y la sugerencia sí casan entre sí dentro de cada entrada. Lo que viajó movido es el veredicto — y con él la etiqueta CONFIRMADO/REFUTADO. La causa más probable es un **join por posición** entre el array de veredictos y el de hallazgos: un agente caído desplaza la lista entera. El journal del workflow era de sesión y ya no existe, así que el emparejamiento original no se puede recuperar: **hay que volver a medir**. ## Las reglas de este registro 1. **Toda escritura es por `id`.** Ningún proceso vuelve a unir dos listas por posición. Un verificador que no devuelve su `id` no escribe fila. 2. **Las 90 filas parten de `PENDIENTE`**, incluidas las 29 «confirmadas» y las 11 «refutadas»: su etiqueta viajó con el veredicto movido y no es evidencia de nada. 3. **El `id` es re-derivable**: es el orden documental del fichero del 2026-08-01 (`A-01`…`A-29` confirmados · `A-30`…`A-79` sin verificar · `A-80`…`A-90` refutados). Se extrae mecánicamente; no se renumera nunca. 4. **El veredicto se escribe con su mecanismo y su evidencia**, en la ficha de abajo. Un `REFUTADO` sin motivo escrito es exactamente el fallo que estamos arreglando. Estados: `PENDIENTE` · `CONFIRMADO` · `REFUTADO` · `DATO` (cierto y sin defecto) · `ARREGLADO` · `DIFERIDO` (confirmado, disposición firmada, no se toca ahora). Columna **or.** = de qué sección del documento viejo salió la fila (`C` confirmado · `SV` sin verificar · `R` refutado). Es trazabilidad, **no** un veredicto. ## Índice de hallazgos | id | block | dim | sev | or. | afirmación | ancla | estado | | ---- | ---------------------------------------- | ---------- | ----- | --- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------- | ---------- | | A-01 | `cta` | doctrina | ALTA | C | La disposición «Panel a sangre → app-land, la app pone `container="full"`» es falsa: `Container` siempre aplica padding inline y el block no ofrece… | `src/uix/blocks/cta/README.md` | ARREGLADO | | A-02 | `hero` | percepcion | ALTA | C | En `layout="background"` la CTA secundaria mide 1.78:1 contra su fondo — muy por debajo de AA — y el token que la demo escribe a mano para arreglarlo… | `web/routes/blocks/hero/HeroSite.svelte` | ARREGLADO | | A-03 | `feature-grid` | doctrina | ALTA | C | El README no declara landmark ni cómo ajustar la jerarquía de encabezados, que es obligación explícita de B-8 y de la plantilla; sus dos hermanos sí… | `src/uix/blocks/feature-grid/README.md` | ARREGLADO | | A-04 | `contact` | doctrina | ALTA | C | `CONTACT_ACTION` («la acción nombra lo que está pasando», state.ts:86) solo se cumple a la vista: el nombre accesible del botón es siempre «Enviar»,… | `src/uix/blocks/contact/state.ts` | ARREGLADO | | A-05 | `contact` | doctrina | ALTA | C | El block importa de `$libs/forms`, que no está en la lista de importaciones permitidas de la frontera dura 1 («may import `$uix`, `$adom` and the… | `src/uix/blocks/contact/contact.svelte` | ARREGLADO | | A-06 | `site-footer` | percepcion | ALTA | C | El éxito del alta en la banda de sign-up del footer es PERCEPTIVAMENTE NULO: no suena, no estampa y no emite — el único momento que merecía… | `web/routes/blocks/site-footer/SiteFooterSite.svelte:105` | ARREGLADO | | A-07 | `faq` | doctrina | MEDIA | C | La sección «Coordination» declara UNA sola costura (`value`) pero el block también expone `disabled`: una pregunta que no se puede abrir, sin nada… | `src/uix/blocks/faq/types.ts` | ARREGLADO | | A-08 | `cta` | doctrina | MEDIA | C | La medida de la descripción se construye a mano con un valor fuera de escala (`60ch`) en vez de usar el vocabulario de medida que el canon ya expone… | `src/uix/blocks/cta/cta.svelte` | ARREGLADO | | A-09 | `stats-band` | doctrina | MEDIA | C | En modo `live` el anuncio a lectores de pantalla puede llevar la cifra CRUDA mientras en pantalla se ve la formateada por locale: el block pasa… | `src/uix/blocks/stats-band/stats-band-value.svelte` | CONFIRMADO | | A-10 | `site-header` | doctrina | MEDIA | C | Si el cajón está abierto y el viewport cruza el `breakpoint`, el propio block esconde cajón + overlay + trigger con `display:none`, pero el Drawer… | `src/uix/blocks/site-header/site-header.svelte` | ARREGLADO | | A-11 | `site-header` | doctrina | MEDIA | C | Las demos de site-header y hero redeclaran a mano uniones que ya existen en el canon, y ya han derivado: el `xxl` de `ContainerSize` es inalcanzable… | `web/routes/blocks/site-header/SiteHeaderSite.svelte` | CONFIRMADO | | A-12 | `feature-grid` | doctrina | MEDIA | C | El tipo y la demo describen el chip del icono como `Surface` soft; el código lo pinta solid por defecto, y el README dice solid. Dos de las cuatro… | `src/uix/blocks/feature-grid/types.ts` | ARREGLADO | | A-13 | `testimonials` | percepcion | MEDIA | C | Mismo defecto: `height="100%"` sobre `Card` es inerte, así que la tarjeta no rellena la altura de fila y las caras NO se alinean cuando las citas… | `src/uix/blocks/testimonials/testimonials-item.svelte` | ARREGLADO | | A-14 | `feature-split · pricing · testimonials` | doctrina | MEDIA | C | Ninguno de los tres README declara el landmark ni la jerarquía de encabezados, que es la segunda mitad literal de B-8 y el único apartado a11y propio… | `src/uix/blocks/pricing/README.md` | ARREGLADO | | A-15 | `contact` | doctrina | MEDIA | C | La frase del estado no llega a la tecnología de apoyo: el submit va `disabled` nativo (no es alcanzable con teclado, así que un lector de pantalla… | `src/uix/blocks/contact/contact-reason.svelte` | ARREGLADO | | A-16 | `contact` | doctrina | MEDIA | C | Deriva README↔código: el README afirma en negrita que el block «no valida y no pinta los errores de los campos», y `Contact.Fields` hace exactamente… | `src/uix/blocks/contact/README.md` | ARREGLADO | | A-17 | `content-section` | doctrina | MEDIA | C | La pestaña API de la demo (superficie obligatoria por B-9) publica un default falso para `ContentSection.Media`: dice `width` «def. wide» cuando el… | `web/routes/blocks/content-section/+page.svelte` | ARREGLADO | | A-18 | `team` | doctrina | MEDIA | C | Comentario nuevo en castellano dentro de la fuente de un block, contra la regla del proyecto (comentarios en inglés; los castellanos que quedan son… | `src/uix/blocks/team/team-member-links.svelte` | ARREGLADO | | A-19 | `faq` | percepcion | BAJA | C | El typedoc de `Faq.Header` promete un Box «centered» que el propio root desmiente: la raíz apila con `align="stretch"`, así que la cabecera queda… | `src/uix/blocks/faq/types.ts` | ARREGLADO | | A-20 | `faq` | doctrina | BAJA | C | B-8 incumplido: el block emite un encabezado por pregunta con `aria-level` FIJO en 3, no ofrece forma de ajustarlo y el README no documenta ni el… | `src/uix/blocks/faq/README.md` | ARREGLADO | | A-21 | `stats-band` | doctrina | BAJA | C | El typedoc de `countOptions` anuncia una opción `style` que `CountUp` NO acepta — pasarla es error de tipos. | `src/uix/blocks/stats-band/types.ts` | ARREGLADO | | A-22 | `stats-band` | doctrina | BAJA | C | El README no documenta landmark ni jerarquía de encabezados (B-8); el dato solo vive en la pestaña A11y de la demo. | `src/uix/blocks/stats-band/README.md` | ARREGLADO | | A-23 | `pricing` | doctrina | BAJA | C | Pulsar el segmento de periodo YA ACTIVO devuelve la sección entera al periodo contrario: el block posee el estado y su propio control lo mueve a un… | `src/uix/blocks/pricing/pricing-switch.svelte` | ARREGLADO | | A-24 | `pricing` | percepcion | BAJA | C | Las tarjetas de plan NO son de igual alto y los CTA NO se alinean: `height="100%"` sobre `Card` es un atributo HTML inerte, no una prop. El README y… | `src/uix/blocks/pricing/pricing-plan.svelte` | ARREGLADO | | A-25 | `pricing` | doctrina | BAJA | C | La demo documenta una elevación que el código se niega explícitamente a hacer y que el propio README lista como brecha abierta del canon. | `web/routes/blocks/pricing/+page.svelte` | ARREGLADO | | A-26 | `pricing` | doctrina | BAJA | C | El block exige a la app tres cadenas obligatorias para nombrar el ÚNICO estado que coordina, y justifica esa exigencia citando una lectura de B-7 que… | `src/uix/blocks/pricing/pricing-switch.svelte` | REFUTADO | | A-27 | `testimonials` | doctrina | BAJA | C | El tipo público documenta un default de `variant` que el componente no usa. | `src/uix/blocks/testimonials/types.ts` | ARREGLADO | | A-28 | `testimonials` | doctrina | BAJA | C | `.Items` tipa toda la superficie de `AutoGrid` pero descarta en silencio parte de ella: el spread del consumidor va ANTES de props fijadas a mano. | `src/uix/blocks/testimonials/testimonials-items.svelte` | ARREGLADO | | A-29 | `pricing · testimonials` | percepcion | BAJA | C | Las vistas de 375/768 de estas dos demos no heredan NINGUNO de los ejes de la sección: siempre salen en claro, español y ltr — justo la rama estrecha… | `web/routes/blocks/pricing/+page.svelte` | CONFIRMADO | | A-30 | `newsletter` | doctrina | ALTA | SV | UNA sola pulsación de Enter dentro del campo de correo emite DOS `commit-submit` con intents contradictorios (neutral y fulfill) y suenan DOS earcons… | `src/uix/blocks/newsletter/newsletter.svelte:105` | ARREGLADO | | A-31 | `newsletter` | doctrina | ALTA | SV | `signal-warn-invalid` está declarado `persistence:'untilFix'` pero NUNCA se limpia al arreglar: corregido el correo, el form sigue estampado en… | `src/uix/soma/components/form/form-provider.svelte.ts:129` | REFUTADO | | A-32 | `site-header` | percepcion | ALTA | SV | El pack de sema de NavigationMenu NUNCA casa: su regla de cascada apunta a la parte `item` y el estampado cae siempre en el `trigger`, asi que el nav… | `src/uix/sema/components/navigation-menu.ts` | ARREGLADO | | A-33 | `site-header` | percepcion | ALTA | SV | El nav del header emite `commit-select` + `affirm` — con earcon audible — por el simple HOVER del puntero, sin un solo clic: un barrido del raton… | `src/uix/soma/components/navigation-menu/navigation-menu-provider.svelte.ts` | ARREGLADO | | A-34 | `site-header` | percepcion | ALTA | SV | Inversion de dominancia atencional: pasar el raton por encima del nav suena mas largo y mas fuerte que pulsar el CTA principal del block, y con… | `web/routes/blocks/site-header/SiteHeaderSite.svelte` | ARREGLADO | | A-35 | `site-header` | percepcion | ALTA | SV | MUDOS: 4 de los 7 elementos interactivos visibles del header no emiten NADA, y son precisamente los que navegan — el brand «Acme», los… | `web/routes/blocks/site-header/SiteHeaderSite.svelte` | ARREGLADO | | A-36 | `site-header` | percepcion | ALTA | SV | Carrera de estampado en el trigger del drawer: `contact-activate` vive 3 ms antes de que `emerge.open` lo pise en el MISMO nodo, asi que el feedback… | `src/uix/blocks/site-header/site-header.svelte` | ARREGLADO | | A-37 | `banner` | doctrina | ALTA | SV | El block cablea el descarte con `variant="ghost"` y sin tinta, así que la ✕ se pinta SIEMPRE con el ink `primary` del Button sobre el lienzo que el… | `src/uix/blocks/banner/banner.svelte` | ARREGLADO | | A-38 | `banner` | percepcion | ALTA | SV | La pestaña «Notas» afirma que la acción en línea HEREDA la tinta de contraste de la tira «en todos los roles y en los dos modos». La medición lo… | `web/routes/blocks/banner/+page.svelte` | ARREGLADO | | A-39 | `newsletter` | doctrina | ALTA | SV | El ejemplo de uso de la puerta de entrada del block anuncia `onValidSubmit` — exactamente el prop que el block decidió NO exponer porque es un no-op… | `src/uix/blocks/newsletter/index.ts` | ARREGLADO | | A-40 | `contact` | percepcion | ALTA | SV | El clic sobre «Enviar mensaje» —la accion principal de la seccion— no estampa NINGUN evento sema en el momento del gesto; la unica emision llega 915… | `src/uix/blocks/contact/contact-submit.svelte` | ARREGLADO | | A-41 | `contact` | percepcion | ALTA | SV | Un solo Enter dentro de un campo estampa DOS commits con intents distintos; y cuando el envio esta bloqueado estampa un commit que no commitea nada. | `src/uix/morfo/components/field.ts` | ARREGLADO | | A-42 | `contact` | percepcion | ALTA | SV | El nombre accesible del boton de envio queda congelado en «Enviar» en los cinco estados: las palabras de estado que el block posee por B-7 nunca… | `src/uix/blocks/contact/contact-submit.svelte` | ARREGLADO | | A-43 | `contact` | percepcion | ALTA | SV | `Contact.Reason` —la frase que el block existe para que ningun estado bloqueado quede mudo— no es region viva ni esta enlazada al control: cambia sin… | `src/uix/blocks/contact/contact-reason.svelte` | ARREGLADO | | A-44 | `contact` | doctrina | ALTA | SV | Con los tres campos rellenos y el correo mal formado, la seccion afirma «Completa todos los campos para enviar.» y no marca el campo: el camino de… | `src/uix/blocks/contact/contact-fields.svelte` | ARREGLADO | | A-45 | `pricing` | percepcion | ALTA | SV | Un solo clic sobre el periodo YA activo VACIA el segmented control: la seccion queda sin ningun periodo marcado mientras los precios siguen siendo… | `src/uix/blocks/pricing/pricing-switch.svelte` | ARREGLADO | | A-46 | `cta` | percepcion | ALTA | SV | La accion secundaria del cluster («Hablar con ventas») es MUDA: no emite ningun evento sema, y en reposo es tipograficamente identica al parrafo de… | `web/routes/blocks/cta/CtaSite.svelte:72` | REFUTADO | | A-47 | `cta` | percepcion | ALTA | SV | El anillo de foco es practicamente invisible sobre el panel solido: los DOS unicos elementos interactivos del block quedan sin indicador de foco por… | `src/uix/blocks/cta/cta.svelte:111` | CONFIRMADO | | A-48 | `banner` | percepcion | MEDIA | SV | El descarte —el ÚNICO gesto que el block cablea— sólo expresa `contact-activate` (una pulsación); la desaparición de la tira no la expresa nadie, y… | `src/uix/blocks/banner/banner.svelte:59` | CONFIRMADO | | A-49 | `banner` | percepcion | MEDIA | SV | La única llamada a la acción del banner («Ver qué cambia →») es completamente muda: ni estampa ni suena, en clic, en Enter ni en hover. | `web/routes/blocks/banner/BannerSite.svelte:56` | REFUTADO | | A-50 | `site-footer` | percepcion | MEDIA | SV | 18 de los 24 elementos interactivos del footer son `Link` y TODOS son mudos: el block cuya función entera es navegar no tiene canal perceptivo para… | `src/uix/blocks/site-footer/site-footer.svelte:77` | REFUTADO | | A-51 | `newsletter` | doctrina | MEDIA | SV | La acción principal del block no tiene `contact` propio: pulsar «Suscribirme» no estampa NADA sobre el control — el único estampado es el `commit`… | `src/uix/morfo/components/form.ts:90` | ARREGLADO | | A-52 | `site-header` | percepcion | MEDIA | SV | La costura `mobileOpen` cierra el drawer en SILENCIO: el unico camino de cierre que el block documenta como suyo es el unico que no se anuncia,… | `src/uix/blocks/site-header/site-header.svelte` | REFUTADO | | A-53 | `hero` | percepcion | MEDIA | SV | Las dos acciones del hero viven en el mismo `Group`, con la misma jerarquia de par primario/secundario, y responden de forma opuesta: el CTA emite… | `web/routes/blocks/hero/HeroSite.svelte` | CONFIRMADO | | A-54 | `site-header` | doctrina | MEDIA | SV | El morfo de `NavigationMenu` carga el intent evaluable en el MARCO: declara un unico evento, `commit-select` + `affirm`, para lo que solo despliega… | `src/uix/morfo/components/navigation-menu.ts` | ARREGLADO | | A-55 | `banner` | doctrina | MEDIA | SV | «full-bleed por fuera, en columna por dentro» deja de ser cierto en cuanto se pasa `onDismiss`: el `margin-inline-start:auto` del Close es un TERCER… | `src/uix/blocks/banner/banner.svelte` | CONFIRMADO | | A-56 | `banner` | doctrina | MEDIA | SV | B-9 exige el block A SANGRE en la página de demo, «nunca dentro de un marco con padding». En la galería el block se pinta dentro del raíl del… | `web/routes/blocks/_lib/BlockDemo.svelte` | REFUTADO | | A-57 | `newsletter` | percepcion | MEDIA | SV | Con `panel={false}` la nota de privacidad se pinta con MÁS fuerza que la línea de apoyo: la descripción cae a `muted` y la nota se queda con la tinta… | `src/uix/blocks/newsletter/newsletter.svelte` | ARREGLADO | | A-58 | `site-footer` | doctrina | MEDIA | SV | La demo construye tintas a mano en app-land (`color="var(--color-content-*)"`) y son INERTES: con `variant="subtle"` el recipe del Link fuerza… | `web/routes/blocks/site-footer/SiteFooterSite.svelte` | ARREGLADO | | A-59 | `site-footer` | percepcion | MEDIA | SV | El título del grupo se pinta MÁS PEQUEÑO que los enlaces que nombra y con la misma tinta: la única señal de jerarquía que queda es el peso. | `src/uix/blocks/site-footer/site-footer-column-title.svelte` | ARREGLADO | | A-60 | `site-footer` | percepcion | MEDIA | SV | «Tantas columnas como caben, el mismo código para 2 o para 5 grupos» describe el código, no el resultado: `AutoGrid` usa `auto-fill`, que crea las… | `src/uix/blocks/site-footer/site-footer.svelte` | CONFIRMADO | | A-61 | `contact` | percepcion | MEDIA | SV | El submit bloqueado sale del orden de tabulacion, asi que quien navega con teclado nunca llega al control ni se topa con la frase que lo explica. | `src/uix/blocks/contact/contact-submit.svelte` | CONFIRMADO | | A-62 | `team` | percepcion | MEDIA | SV | Los 12 IconButton que el block pone en escena estampan contact-activate y no hacen absolutamente nada: el contacto inicia y nada resuelve, doce veces. | `web/routes/blocks/team/TeamSite.svelte` | CONFIRMADO | | A-63 | `contact` | percepcion | MEDIA | SV | El `Link` «hola@vicen.dev» dentro de `Contact.Detail` es mudo: es el unico elemento interactivo de la columna de datos y no emite nada. | `web/routes/blocks/contact/ContactSite.svelte` | REFUTADO | | A-64 | `pricing` | percepcion | MEDIA | SV | Ese mismo clic muerto emite `commit-toggle` + intent `neutral`: el sistema anuncia que algo quedo fijado cuando la seccion no cambio de estado (los… | `src/uix/blocks/pricing/pricing-switch.svelte` | ARREGLADO | | A-65 | `pricing` | percepcion | MEDIA | SV | Un solo gesto sobre el CTA de un plan produce DOS eventos sema sobre el MISMO elemento a 1 ms: el `commit-select` de la app pisa el… | `web/routes/blocks/pricing/PricingSite.svelte` | CONFIRMADO | | A-66 | `pricing` | percepcion | MEDIA | SV | El plan destacado se grada `fulfill` en lo visual pero su consecuencia suena `affirm`, exactamente igual que los otros dos planes: la lectura… | `web/routes/blocks/pricing/PricingSite.svelte` | REFUTADO | | A-67 | `faq` | percepcion | MEDIA | SV | Un solo clic que cambia de pregunta dispara DOS earcons emerge simultaneos y sin atenuar (collapse descendente + expand ascendente): un gesto, dos… | `src/uix/blocks/faq/faq-list.svelte:14` | CONFIRMADO | | A-68 | `stats-band` | percepcion | MEDIA | SV | Los contadores corren detras de `opacity: 0` — dos observadores distintos (CountUp threshold 0 · Motion 0.1/-10%) y un IO no mira la opacidad… | `src/uix/blocks/stats-band/stats-band-value.svelte:20` | ARREGLADO | | A-69 | `stats-band` | percepcion | MEDIA | SV | Las cuatro cifras no aterrizan nunca juntas y `duration` no significa segundos: con el valor por defecto (2), la cifra grande tarda 7,9 s en… | `src/uix/eidos/components/count-up/count-up.svelte:169` | ARREGLADO | | A-70 | `feature-grid` | percepcion | BAJA | SV | DATO, NO DEFECTO: `feature-grid` no tiene ningun elemento interactivo — nada que emitir y nada que auditar perceptivamente en el. | `src/uix/blocks/feature-grid/feature-grid.svelte` | REFUTADO | | A-71 | `site-footer` | doctrina | BAJA | SV | La página de demo pinta el block ANTES de su propio `h1`, así que el documento arranca en h2/h3 y el h1 llega el último — jerarquía de encabezados… | `web/routes/blocks/_lib/BlockDemo.svelte` | CONFIRMADO | | A-72 | `contact` | percepcion | BAJA | SV | La ventana de vuelo (900 ms) no tiene canal perceptivo propio: ningun `sustain.*`, ningun spinner — solo el cambio de etiqueta visible. | `src/uix/blocks/contact/contact-submit.svelte` | REFUTADO | | A-73 | `content-section` | percepcion | BAJA | SV | DATO, no defecto: el block no pone NINGUN elemento interactivo — cero en toda su region — y nada en el estampa sema. | `web/routes/blocks/content-section/ContentSectionSite.svelte` | DATO | | A-74 | `feature-split` | percepcion | BAJA | SV | Los 3 unicos elementos interactivos del block emiten su contact correctamente, pero no llevan a ningun sitio: los href apuntan a fragmentos que no… | `web/routes/blocks/feature-split/FeatureSplitSite.svelte` | CONFIRMADO | | A-75 | `pricing` | percepcion | BAJA | SV | Volver a pulsar el CTA de un plan YA elegido re-emite un `commit-select`+`affirm` identico: no hay diferencia perceptiva entre «acabas de elegirlo» y… | `web/routes/blocks/pricing/PricingSite.svelte` | CONFIRMADO | | A-76 | `testimonials` | percepcion | BAJA | SV | DATO, no defecto: el block no pone NINGUN elemento interactivo — no hay nada que pulsar y, por tanto, nada mudo; ademas sus Card no fingen afordancia. | `src/uix/blocks/testimonials/testimonials.svelte` | DATO | | A-77 | `stats-band` | percepcion | BAJA | SV | DATO, no defecto: el block no pone NINGUN elemento interactivo — no hay nada que pulsar y por tanto nada que estampar. Toda su superficie perceptiva… | `src/uix/blocks/stats-band/stats-band.svelte` | DATO | | A-78 | `stats-band` | doctrina | BAJA | SV | El
del block sale sin nombre accesible Y sin ningun encabezado dentro, asi que no es una region navegable ni por landmarks ni por… | `src/uix/blocks/stats-band/stats-band.svelte:26` | ARREGLADO | | A-79 | `site-footer` | percepcion | SOSP | SV | Cambiar de idioma en el selector del footer cambia el régimen de toda la página (langs, formatos, dirección) pero suena y se estampa exactamente… | `web/routes/blocks/site-footer/SiteFooterSite.svelte:164` | CONFIRMADO | | A-80 | `faq` | — | — | R | El block reimplementa la autogeneración del `value` que el canon ya hace, y README+index la venden como «la única conveniencia» de `.Item`. | — | ARREGLADO | | A-81 | `cta` | — | — | R | El ejemplo del `index.ts` anuncia `variant="soft"`, una prop que se CORTÓ a propósito: copiarlo es un error de tipos. | — | ARREGLADO | | A-82 | `cta` | — | — | R | La demo redeclara en app-land la unión que el block EXPORTA (`CtaLayout`), duplicando vocabulario. | — | ARREGLADO | | A-83 | `hero` | — | — | R | El block deriva el estado «la copia va sobre sólido» y lo aplica solo a dos de sus piezas, sin publicarlo: cada consumidor lo re-deriva en el punto… | — | ARREGLADO | | A-84 | `feature-grid` | — | — | R | `align` está aplicado a medias: el block declara la prop y solo mueve la caja de la cabecera; el propio tipo instruye al app a repetir la alineación… | — | ARREGLADO | | A-85 | `site-header` | — | — | R | El `aria-label` que la demo escribe para el trigger del cajón nunca llega al DOM: el lector de pantalla anuncia la etiqueta genérica del canon. | — | ARREGLADO | | A-86 | `pricing` | — | — | R | El ejemplo de uso de la superficie pública del block no compila: omite dos props obligatorias. | — | ARREGLADO | | A-87 | `contact` | — | — | R | El propio gating del block deja INALCANZABLE el error por campo: con `progressive` los errores solo se escriben tras un envío inválido, y el envío… | — | ARREGLADO | | A-88 | `team` | — | — | R | `marginTop: 'auto'` no ancla nada: el ítem de la retícula es el `
` del `Motion` (block, estirado), y el `Stack` de dentro mide su contenido, así… | — | ARREGLADO | | A-89 | `contact` | — | — | R | `sent` es un estado TERMINAL del que el block no sabe salir, y lo entra él solo: tras un envío correcto el formulario sigue editable pero la sección… | — | REFUTADO | | A-90 | `contact` | — | — | R | Vocabulario paralelo: `ContactVerification` re-declara palabra por palabra el `ProofOfHumanStatus` del canon, y lo hace señalando a ese mismo… | — | ARREGLADO | | A-91 | `banner` | doctrina | BAJA | F7 | El block re-expone el eje `intent` de `Banner` —que el canon declara fuera del sistema de color abierto, en su propio typedoc— sin registrarlo en sus Gaps… | `src/uix/blocks/banner/README.md` | ARREGLADO | | A-92 | `pricing` | doctrina | BAJA | F7 | Una restricción estructural del modelo de cascada (sólo los presets CSS participan del stagger) vive en un comentario del block y falta en §D.13 de la doctrina… | `docs/theming/motion.md` | CONFIRMADO | | A-93 | `stats-band` | doctrina | MEDIA | F7 | `Motion` no expone su momento «visto» (privado + `data-animation-pending`), así que un block no puede sincronizarse con el revelado sin violar B-6… | `src/uix/eidos/components/motion/motion.svelte` | ARREGLADO | | A-94 | `feature-grid · team · testimonials` | doctrina | MEDIA | F7 | Los tres declaran `= AutoGridProps` y ponen `{...rest}` antes de props fijadas: el consumidor tipa `align`/`width` y se descartan en silencio (A-28 ×3)… | `src/uix/blocks/testimonials/types.ts` | ARREGLADO | | A-95 | `banner` | doctrina | MEDIA | F7 | Con `affix="top"` la tira fijada tapa la cabecera pegada y la navegación queda inalcanzable; la pieza que falta es la que posee las alturas de página (`app-shell`)… | `web/routes/blocks/banner/BannerSite.svelte` | CONFIRMADO | | A-96 | `banner` | doctrina | BAJA | F7 | `affixOffset` es prop público sin control vivo en la demo, contra la regla «cada prop público, un control»… | `web/routes/blocks/banner/+page.svelte` | CONFIRMADO | | A-97 | `feature-grid + 6 blocks` | percepcion | MEDIA | F7 | El texto `color="muted"` mide 3,70:1 en claro — bajo AA de cuerpo — en 8 sitios de 7 blocks; el hallazgo estaba enterrado en la ficha de A-70, que es REFUTADO… | `src/uix/blocks/feature-grid/feature-grid-item-text.svelte` | REFUTADO | | A-98 | `hero` | percepcion | MEDIA | F7 | Las acciones no apilan en móvil: `Group` es row/nowrap y a 375px los dos botones ocupan 315 de 327px. Síntoma de [A-99]; cae sin tocar el block… | `src/uix/blocks/hero/hero.svelte` | ARREGLADO | | A-99 | `Group` (canon) | doctrina | MEDIA | F7 | `Group` no aplica NINGUNO de los dos defaults de action row que su README promete (`wrap: wrap` y `align: center`): nunca se los pasa a `Flex`, y el recipe no puede suplirlos… | `src/uix/eidos/components/group/group.svelte` | ARREGLADO | | A-100 | `cta` | percepcion | ALTA | F5-bg | Dentro del panel sólido, las dos tramas TINTADAS hunden el titular blanco bajo AA: `glow` 5,18 → 3,06:1 y `mesh` → 2,27:1. Las de línea oscurecen y suben la copia a 14,35:1 | `src/uix/blocks/cta/cta.svelte` | ARREGLADO | | A-101 | `cta` | doctrina | MEDIA | F5-bg | Un `glow` tintado con el acento del propio panel resuelve EXACTAMENTE al fondo del panel: el halo es invisible por construcción. El acento debe viajar como tinta on-solid | `src/uix/blocks/cta/cta.svelte` | ARREGLADO | | A-102 | `stats-band` | percepcion | BAJA | F5-bg | Sin decoración de sección (columna B: «reveal + Backdrop»); el reveal ya estaba, el fondo no | `src/uix/blocks/stats-band/stats-band.svelte` | ARREGLADO | | A-103 | `testimonials` | percepcion | BAJA | F5-bg | Sin decoración de sección; el halo detrás de las citas es el acabado que las referencias pintan a mano | `src/uix/blocks/testimonials/testimonials.svelte` | ARREGLADO | | A-104 | `feature-split` | percepcion | BAJA | F5-bg | Columna B pedía «`Backdrop` alterno» por fila; se resuelve en la SECCIÓN — una banda por fila obligaría a cada `Row` a poseer estado de alternancia | `src/uix/blocks/feature-split/feature-split.svelte` | ARREGLADO | | A-105 | `site-footer + banner` | doctrina | BAJA | F5-bg | Ambos ganan la capacidad de decoración APAGADA por defecto: la columna B no pide acabado en ninguno, y encenderlo sería inventar un aspecto que nadie pidió | `src/uix/blocks/site-footer/site-footer.svelte` | ARREGLADO | ## Reparto | Dimensión | Filas | Cómo se verifica | | -------------------------------- | ----- | ------------------------------------------------------------------------------------------- | | doctrina | 35 | lectura dirigida de la fuente que ancla la fila, contra `architecture/blocks.md` | | percepcion | 44 | navegador con sondas (audio + MutationObserver al nodo), tras la puerta de hidratación real | | sin dimensión (los 11 refutados) | 11 | se clasifica al verificar | Severidad ALTA declarada en origen: **24** filas. ## Fase 1 — doctrina re-verificada por lectura (2026-08-05) 43 filas cerradas leyendo la fuente que cada una ancla: **39 CONFIRMADO · 4 REFUTADO**. Lo que la re-verificación cambió respecto de lo que decía el documento viejo: - **A-04 (`contact`, ALTA) — el hecho se sostiene, la CAUSA no.** El canon SÍ tiene escotilla: soma `form-submit` acepta `aria-label` y `form-provider.svelte.ts:187-189` hace ganar al valor explícito del consumidor. El nombre accesible está congelado porque `contact-submit.svelte:21` **no lo pasa**, no porque el canon lo imponga. La sugerencia original mandaba a tocar soma sin necesidad. - **Cuatro refutados con motivo escrito**: A-26 (la doctrina acota la propiedad de las palabras a las secciones que pueden bloquear; `pricing` no bloquea nada), A-31 (`form-provider.svelte.ts:129` SÍ limpia el `signal-warn-invalid`, en la línea que la propia reclamación anclaba), A-56 (B-9 prohíbe marco con padding o caja con scroll, y la región de contenido no aporta ninguno de los dos), A-89 (`sent` es un prop `$bindable`: la vuelta existe y es del app). - **A-87 es duplicado de A-44** — la MISMA reclamación aparecía como «sin verificar» y como «refutada» en el documento viejo. Por sí solo prueba que la clasificación estaba movida. - **A-83 no era doctrinal, era la causa de A-02**: `hero` deriva `onDark` y solo lo aplica a dos piezas, así que la tinta on-solid no llega a lo que el app pone en `actions` — de ahí el 1.78:1. - **B-8 es más grave de lo que decía el handoff**: 8 de 15 READMEs sin declaración de landmark, no 6. - **Tres puertas de entrada del tier tienen ejemplos que no compilan**: A-39 (`newsletter`), A-81 (`cta`), A-86 (`pricing`). ## Fase 2 — percepción re-verificada en navegador (2026-08-05) 47 filas (44 de percepción + 3 que exigían medir) por workflow adversarial, en cuatro tandas, **un agente por `id`**. Resultado del registro completo: **75 CONFIRMADO · 12 REFUTADO · 3 DATO**, y 30 de las confirmadas ya ARREGLADAS. - **La causa raíz del desastre anterior, reproducida y neutralizada**: el journal del workflow devuelve los resultados en un orden distinto al de entrada (en la primera tanda salió `A-42` primero y `A-02` penúltimo). Unir por posición habría vuelto a cruzar cada veredicto con la reclamación equivocada. Aquí la unión es por `id` y el desorden es irrelevante. - **La tasa de refutación real es del 13%** (12 de 90), no el 28% que declaraba el documento viejo — y las refutaciones se concentraron en las tandas 2–4, así que no es complacencia: `A-46`, `A-49`, `A-50`, `A-52`, `A-70`, `A-72` cayeron con motivo escrito. - **Los verificadores corrigieron reclamaciones además de juzgarlas**: `A-02` mide 1.61:1, no 1.78:1; `A-42` afecta a los SIETE estados, no a cinco; `A-36` no trunca el feedback, NUNCA lo pinta; `A-60` mide el 62% de región muerta con 2 grupos. - **El retrato que sale del conjunto**: de las 12 ALTA de percepción, **8 tienen la causa raíz en el CANON** (`NavigationMenu`, `Form.Submit`, morfo de `Field`, `Link`), no en los blocks. Los blocks componen bien; lo que está roto es el arco perceptivo del canon. ## Fase 6 — re-medición de los confirmados (2026-08-10) Las 33 filas que seguían CONFIRMADAS, medidas otra vez ANTES de tocar código. El motivo: de las 12 ALTA de percepción, 8 tenían la causa raíz en el CANON, y el canon se arregló el 2026-08-06 — cada fila de percepción viva era sospechosa de estar ya cerrada. **Seis lo estaban** (A-07 · A-30 · A-40 · A-51 · A-78 · A-82), y sus fichas llevan la evidencia. Quedan **27**. Método: lectura dirigida para doctrina; para percepción, Playwright headless contra un dev server propio (`:5201`), con la puerta de hidratación honesta (`#uix-blocks-display` + ida y vuelta reactiva) y dos sondas — contador de nodos WebAudio parcheado antes de cargar y `MutationObserver` de `data-event*` sobre todo el documento. **Lo que la re-medición corrige del método anterior**, y que vale para la siguiente: el cero de la escala tiene que ser el GESTO. Anclado a la carga, un `contact-activate` a +270 ms parece llegar tarde; con un CONTROL en el mismo entorno (el `