Calidad, en vivo: el resultado de cada corrida de pruebas de mis proyectos, publicado por el propio CI. Nadie edita esta página a mano.
| Suite | Qué prueba | Cuándo corre |
|---|---|---|
portafolio-e2e |
Playwright contra davidameth.dev: escritorio y teléfono, enlaces, SEO y datos estructurados, llms.txt, paridad ES/EN y axe WCAG 2.1 AA |
lunes, jueves y sábado, 06:00 (Panamá) |
api-torneo |
pytest, Hypothesis, Schemathesis y oráculo contra api.davidameth.dev (código) | en cada push a main |
red-dns |
El dominio desde fuera: DNSSEC, SPF, DMARC, CAA, certificados, http→https, HSTS y redirecciones (checks/red_dns.py) |
todos los días, 07:00 (Panamá); publica con el GITHUB_TOKEN de este repo |
lab-red |
Containerlab con la red de un banco: configuraciones, rutas, caminos del tráfico, cortes de enlace, ataques y la red de cajeros (código) | en cada push a main y los lunes, 06:00 (Panamá) |
- Al empezar, cada suite sube un aviso a
data/en-curso/<suite>/<corrida>-<intento>.jsony la página la muestra en azul, «en ejecución». Al terminar lo borra, conif: always(): pase, falle o se cancele. Un aviso con más de dos horas se ignora, por si una corrida se cayó sin limpiarlo. - Al terminar, el resultado se guarda como un archivo nuevo,
data/corridas/<suite>/<fecha>-<corrida>-<intento>.json. Un archivo por corrida, para que dos suites que terminan a la vez nunca choquen.portafolio-e2eyapi-torneocorren en sus propios repositorios: resumen su informe (el JSON de Playwright o el JUnit y la cobertura de pytest) y lo suben aquí con la API de contenidos de GitHub y un token de grano fino que solo puede escribir en este repo (QA_TOKEN).red-dnscorre en este mismo repo (checks/red_dns.py) y hace commit con elGITHUB_TOKENde la corrida.
- Cada archivo es un commit, y Vercel vuelve a desplegar:
node build.mjsarmadist/sin dependencias, con una portada por idioma y una página por corrida.
Las corridas anteriores al 2026-10-02 se importaron del historial de GitHub Actions con scripts/importar_historial.py. De las que ya no tenían informe (Playwright lo guarda 14 días) solo queda el resultado, y se dibujan con rayas. Volver a correrlo no duplica nada: solo completa el detalle que falte.
Los datos crudos están también en /estado.json.
El repo del portafolio es privado, así que sus corridas no llevan enlace: se publican las cifras y los títulos de las pruebas.
{
"suite": "api-torneo",
"fecha": "2026-10-02T04:38:52Z",
"resultado": "pasa",
"pasadas": 90,
"fallidas": 0,
"inestables": 0,
"omitidas": 0,
"duracion_s": 44,
"cobertura": 99.4,
"commit": "dfadcbb",
"corrida": "https://github.com/daveprojectdev/api-torneo/actions/runs/…",
"fallos": [],
"detalle": true,
"pruebas": [
{
"archivo": "tests/test_api.py",
"titulo": "test_equipos_en_orden_de_siembra",
"proyecto": null,
"estado": "pasa",
"ms": 81,
"error": null
}
]
}resultadoespasa,fallaono-corrio(el CI terminó en rojo antes de llegar a las pruebas; llevamotivocon el paso que falló).pruebastrae cada prueba con su estado (pasa,falla,inestableuomitida);proyectoesdesktopomobileen las e2e.detalle: falsemarca una corrida de la que solo queda el resultado;importada: true, una que vino del historial.estado.jsonpublica todo menospruebas, que haría el archivo enorme: el detalle está endata/corridas/.
node build.mjs
Las fuentes de public/fuentes/ (Schibsted Grotesk, Atkinson Hyperlegible Next e IBM Plex Mono) están bajo la SIL Open Font License 1.1.