Build Log
The Armory — Building Real Functional Test Coverage After a Production Outage
August 19, 2026
A production outage from an invalid Server Actions export led to a full risk survey of all 95 MedinaCHF server actions, a real functional Playwright test suite proven to catch the bug that started it, live GitHub Actions CI, and four real bugs (two security gaps, one silent-failure bug, one production 500) found and fixed along the way.
Timeline
What shipped
Recovered and shipped a lost session's member-invitation/resend workflow + admin mobile nav + Plan page rework (products/medinaCHF)
Fixed a real formAudience bug in createEvent/updateEvent — a coordinator using the member-facing Plan page got no planner assigned
Fixed a real production outage — an invalid non-async export crashing member-management.ts's whole module at runtime
Rebuilt the dev Neon database from a fresh production snapshot (dev-2026-08-18 branch) after the old one was reported broken
products/medinaCHF/tests/e2e/armory/ — 27 real functional Playwright specs (not screenshot-only) covering ~35 of 95 surveyed server actions, prioritized by risk
products/medinaCHF/scripts/gate-build.mjs + npm run gate:build — real production-build CI check
products/medinaCHF/scripts/cleanup-armory-data.mjs + npm run test:e2e:cleanup — resets accumulated armory test data
.github/workflows/medinachf-tests.yml — typecheck + build + full armory on every push/PR touching products/medinaCHF
Fixed 4 real bugs found while building coverage: lib/email.ts's sendEmail letting a missing API key crash the caller instead of degrading gracefully; updateClaimProgress and addPollOption both had zero auth checks (IDOR-shaped gaps); the original production-outage export bug
“keep going”