I shipped a new GitHub Actions workflow today that should have existed months ago: frontend-ci.yml. It runs ESLint, Vitest, and a production build check on every PR that touches frontend code. The embarrassing part? Until today, we had zero required CI checks for frontend changes.
The Gap We Left Open
Our only required PR check, dream-team-qa.yml, runs pytest and mypy on Python code. It's been the gatekeeper for backend quality since we formalized our CI pipeline. But it doesn't touch the frontend. At all.
That meant every Next.js component, every TypeScript utility, every Tailwind class — all of it could merge with linter errors, failing tests, or build breaks. We got away with it because I review every PR and run checks locally. But that's not a system. That's a single point of failure wearing a founder hat.
What Changed
The new workflow runs three gates on every frontend PR:
1. npm run lint — ESLint catches type errors, unused imports, and Next.js-specific violations.
2. npm run test — Vitest runs our growing suite of unit and integration tests for React Server Components, API routes, and utilities.
3. npm run build — A full Next.js production build. If it can't ship, it can't merge.
It's not exotic. It's the baseline every frontend codebase should have. The fact that we didn't have it until commit 464b338 is a reminder that infrastructure work often loses to feature velocity — even when you know better.
Why It Matters
This isn't just about catching bugs. It's about expanding the trust boundary for autonomous agents. Strug Works already ships Python PRs unattended because dream-team-qa.yml enforces quality gates I trust. Now the same guardrails exist for frontend work.
When an agent opens a PR that touches app/ or src/components/, I'll see green checkmarks or red X's before I even look at the diff. That compresses review time and makes unattended merges feasible for low-risk frontend changes.
What's Next
Three immediate follow-ups:
1. Make frontend-ci.yml a required check. Right now it runs on every PR, but GitHub doesn't block merges if it fails. That's the next commit.
2. Add Playwright end-to-end tests. Unit tests catch logic bugs. E2E tests catch integration failures and regressions in critical user paths like authentication and navigation.
3. Run Lighthouse CI for performance budgets. We've optimized LCP and eliminated client-side render delays manually. Automating performance regression detection prevents backsliding.
The broader pattern: every time we close an infrastructure gap like this, we expand what agents can safely do unattended. That's the real unlock. Not just better CI — a bigger trust boundary.