Extract Build & Vet into a separate gate job. Use matrix strategy for test and race jobs so dev and prod variants run concurrently after vet passes. Cache keys include label to avoid collisions.
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Add actions/cache@v4 to all four CI jobs. Go module cache (go/pkg/mod + go-build) keyed on go.sum for test, race, and vulns jobs. npm cache (~/.npm + node_modules) keyed on package-lock.json for frontend job. Cuts dependency download time to near-zero on cache hit.
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Remove test and race jobs until lint + vulns are fully green.
The node:22-alpine3.21 base image ships node at /usr/local/bin but
actions/setup-node expects it in the toolcache at /opt/hostedtoolcache.
Create a symlink so all Post-action cleanup steps (cache-save) find
node and don't exit 255.
- Race job: install build-base (gcc) and set CGO_ENABLED=1 for Go's
race detector on Alpine (requires cgo)
- Quality job: run npm run format (prettier --write) before lint to
auto-fix formatting issues instead of failing CI for style nits
- Runner config on server updated to capacity: 8 (parallel jobs)
working-directory wasn't being honored for npm steps in the quality
job. Switch to explicit cd frontend && commands.
Reduce race timeout from 300s to 240s.
Three parallel jobs:
- test: existing Go tests (unchanged)
- race: Go tests with -race flag (catches data races)
- quality: govulncheck + svelte-check + eslint/prettier (no PG needed)
Race job has its own PG service container so all three can run in parallel.