La auditoria del tier tenia los veredictos desemparejados de sus hallazgos: un
join por POSICION, y el journal del workflow era de sesion. Reproducido en vivo
al re-verificar — el journal devuelve los resultados en otro orden que la
entrada. Ledger nuevo con 90 ids estables (AUDIT-blocks-ledger.md), union
SIEMPRE por id: 41 arreglados, 34 confirmados, 12 refutados con motivo escrito,
3 dato. La tasa real de refutacion es del 13%, no del 28%.
De las 12 ALTA de percepcion, 8 tenian la causa raiz en el CANON. Los blocks
componen bien; lo que estaba roto era el arco perceptivo.
CANON
- Link: la prop color era inerte en subtle/plain (inherit a 0-2-0 ganaba a la
paleta a 0-1-0), el hover clavaba primary y el active quedaba tapado por el
hover de variante. Medido: el enlace del footer pasa de la tinta del padre a
la suya.
- Card: prometia BoxProps y no los aplicaba — height="100%" era un atributo
inerte. El tipo dice la verdad y el eje de tamano se aplica con un helper
compartido (buildSizeStyle). Tarjetas al fin de igual alto.
- Form.Submit / Form.Reset: componen el Button del canon, asi que la accion
principal de un formulario recupera el contact-activate en el gesto. Y el
aria-label generico deja de pisar el texto propio (WCAG 2.5.3 para todo
consumidor), verificado con el AX tree de Chrome.
- Field: dejaba de duplicar commit-submit dentro de un Form — un Enter emitia
dos commits con intents contradictorios y dos earcons.
- NavigationMenu: commit-select se mueve al Link (navegar es el acto
evaluable), el despliegue habla como emerge-open/close en vez de fingir una
seleccion por hover, y el pack casa por fin con la parte que recibe el
estampado — antes sonaba a la ganancia base, 10x lo disenado.
- Badge: el boton de quitar compone IconButton; la altura del chip pasa a ser
la del control, asi que md significa lo mismo en todo el sistema.
- Fundacion: [data-on] arrastra la propiedad color, no solo las variables.
BLOCKS
- hero: la CTA secundaria pasa de 1.61:1 a 6.61:1.
- contact: separa incomplete de invalid — el camino de error por campo era
inalcanzable por construccion — y su frase llega a la AT.
- newsletter: coordina (fase 4 del plan). Maquina de cinco estados, palabras
propias, Submit y Reason como partes que leen el contexto.
- site-header ya no congela la pagina al cruzar el breakpoint; site-footer
emite su commit; pricing no se vacia; cta llega a sangre de verdad.
DOCTRINA
- La frontera dura 1 nombra $libs/forms como puerta sancionada.
- El contrato B admite un segundo servicio: el anunciador. Un block que posee
las palabras de sus estados tiene que poder decirlas.
Gates: blocks:check 15/0 · vitest 20/20 en blocks y 402/402 en eidos+blocks ·
svelte-check 75/54 (linea base) · docs:check 0/0 · prettier limpio.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>