No CI job ran the showcase unit suites. Verified per suite on 91f0321397:
showcase/harness 3646 tests NOT RUN
showcase/shell-dashboard 1331 tests NOT RUN
showcase/shell 57 tests NOT RUN
showcase/scripts - run by showcase_validate.yml
`test_unit.yml` excludes them twice over: `paths-ignore` lists `showcase/**`
AND its nx selection is scoped to `--projects='packages/**'`.
`showcase_validate.yml` runs vitest only in `showcase/scripts`; its two
`working-directory: showcase/harness` steps are a CVDIAG perf bench and an ESM
boot-smoke. `static_quality.yml` runs `nx run-many -t check-types` and the
harness's script is named `typecheck`, so it is not typechecked there either.
So ~5000 showcase unit tests gated nothing — a PR could carry real defects in
`showcase/harness/src/**` and still show an all-green check list.
This adds `test / unit-showcase` with two parallel jobs (harness via nx,
dashboard via npm since it is deliberately outside the pnpm workspace). Both
hazards that make a bare `vitest run` useless here are handled as job steps:
- generated artifacts: `showcase/.gitignore` ignores `shell/src/data/*.json`
and `shell-dashboard/src/data/*.json`, but tests statically import
`frontend-catalog.json` and `docs-status.json` — a missing file is a module
load error, not a test failure. Generated before the suite runs.
- `runtime-env-switch.spike.test.ts` HANGS: vitest sits at 0.0% CPU with zero
output and never spawns the `next build` its beforeAll calls. It is an
integration spike (one `next build` plus two `next start` boots on fixed
ports) that this package's own config comment already calls "too heavy for
the per-file unit suite". Excluded from the unit gate; it needs its own job
with a real server budget.
A separate workflow rather than steps in showcase_validate.yml: that file is a
single ~900-line job already budgeted at 25 minutes, and the two suites need
different package managers, so they parallelize instead of lengthening the
critical job. Naming matches test_unit.yml / test_unit-python-sdk.yml.
No `continue-on-error` and no `|| true` anywhere in the file.