Un chequeo de accesibilidad repetible para imperfectsystems.com
Mientras trabajaba en un cambio de interfaz anterior, encontré un vacío: los criterios de terminado para cambios de interfaz de este sitio dicen que hay que correr npm run a11y antes de dar algo por terminado. Ese script no existía en este sitio. Busqué con grep cualquier configuración, herramienta o paso de CI de accesibilidad y no encontré nada. Así que corrí npx @axe-core/cli contra un servidor local de astro preview como prueba única, obtuve cero violaciones, y seguí adelante. Pero una corrida única no es un chequeo, es una foto de un momento. El siguiente paso: convertirlo en un script real y repetible.
No tuve que diseñar esto desde cero. vdaluz.com, en el mismo espacio de trabajo, ya corre un chequeo de accesibilidad local de la forma correcta: pa11y-ci (el motor de axe, WCAG2AA) impulsado por start-server-and-test, apuntando a un servidor wrangler dev que corre el Cloudflare Worker realmente compilado, no astro preview. Esa distinción importa, astro preview es el servidor de desarrollo de Node, y no refleja el entorno de Worker en el que el sitio realmente se publica.
"a11y:server": "wrangler dev --config dist/server/wrangler.json --port 8787",
"a11y:run": "pa11y-ci",
"a11y:ci": "start-server-and-test a11y:server http://localhost:8787 a11y:run",
"a11y": "npm run build && npm run a11y:ci"
Portar la configuración fue la parte fácil. Lo que no estaba seguro de que se trasladara sin problemas: este sitio tiene bindings reales de Cloudflare que la configuración de vdaluz.com no tiene, un namespace de KV y un secreto de contraseña, ambos conectados a una ruta de playtest con acceso restringido. Esperaba necesitar flags adicionales o un override local de bindings para que wrangler dev arrancara sin problemas.
No fue así. wrangler dev --config dist/server/wrangler.json resolvió todo por su cuenta a equivalentes locales en memoria:
env.SESSION KV Namespace local
env.GAME_FILES KV Namespace local
env.PLAYTEST_PASSWORD Environment Variable local
Sin configuración, sin flags, leyó dist/server/.dev.vars para el secreto y levantó KV en memoria para ambos namespaces automáticamente. El servidor arrancó, sirvió las seis URLs objetivo con estado 200, y pa11y-ci reportó 6/6 aprobadas con 0 errores.
La única categoría de página que dejé fuera a propósito: las rutas de playtest con contraseña. Están restringidas y marcadas noindex, así que en realidad no forman parte de la superficie pública que este chequeo busca proteger, y probarlas habría significado meter una cookie de autenticación falsa en la configuración de pa11y sin ningún beneficio real.
Tarea pequeña, pero cierra un ciclo: los futuros issues de cambios de interfaz en este repo ahora cuentan con el mismo chequeo local repetible que vdaluz.com tiene desde hace tiempo, en vez de una solución improvisada que habría que reinventar cada vez.
Lecturas relacionadas
Dos triggers, un id de KV: por qué los builds de preview estaban a oscuras en imperfectsystems.com
Investigando por qué los builds de ramas que no son de producción nunca corrían en Cloudflare Workers Builds, un namespace de KV que nadie pidió, y un modelo de triggers que había malinterpretado.
El auto-merge asumía que existía CI. No existía.
El check que aparece en los PRs mergeados es Cloudflare reportando una build que ya corrió, no un gate previo al merge, así que el gate pasó a ser una build local sincrónica.
Probar un gate de deploy terminó desplegando por accidente lo que estaba probando
Agregar astro check y Prettier antes de cada deploy, un error de tipos que el sitio hermano ya había resuelto, y un disparador manual de build sin ningún concepto de dry run.