Measured, CI-enforced quality signals. The numbers below come from CI and the evidence pipeline — they are gated, not hand-asserted: if a score regresses below its threshold, the build fails.
Accessibility — WCAG 2.1 AA
The retained axe-core/Playwright check runs on every CI build
(`.github/workflows/ci.yml`).
axe-core — 0 severe violations across 23 routes
Zero critical / serious / moderate WCAG 2A + 2AA violations are required across
20 static public/workspace routes plus dynamic `/artwork/[id]` and
`/entity/[id]`. `scripts/a11y-check.ts` fails the build on any severe violation
and writes a hashed launch-evidence artifact. Run: `pnpm a11y:ci`.
The former three-route Lighthouse accessibility check was removed in August
2026 because its Puppeteer chain depended on `extract-zip`, for which the active
high-severity path-traversal advisory had no patched npm release. The broader
axe gate remains the authoritative accessibility check; the advisory was not
waived or baselined.
Performance budget — k6 SLOs
`scripts/k6-slo.js` enforces a per-scenario latency + error-rate budget under load (16 req/s, up to 24 VUs). Latest measured run (`artifacts/performance/k6-slo-summary.json`) — all measured scenarios comfortably within budget:
| Scenario | p95 budget | measured p95 | error budget | measured |
| ---------------------- | :--------: | :----------------: | :----------: | :-------: |
| Cached record read | < 200 ms | 73.5 ms | < 1% | 0.00% |
| Cold record read | < 500 ms | 56.1 ms | < 1% | 0.00% |
| Keyword / facet search | < 300 ms | 55.1 ms | < 1% | 0.00% |
| SPARQL (whitelisted) | < 2000 ms | _needs GraphDB_ | < 1% | — |
| IIIF tile serving | < 100 ms | _needs IIIF infra_ | < 1% | — |
The k6 thresholds abort the run on any breach. Enforced by `pnpm k6:slo:ci` in the evidence pipeline (`.github/workflows/era-c-exit-gate-evidence.yml`).
Frontend Core Web Vitals lab baseline
The July 28, 2026 production trace covers Home, Explore, one artwork detail,
Projects, and Pilot on mobile and desktop. All ten cold-load traces pass the
P1.5 budgets: the slowest LCP is Explore mobile at 2,286 ms, the largest CLS
is Pilot desktop at 0.0665, and a representative interaction measures
28 ms INP. CrUX did not return page-level field data, so these are lab
results. Methodology and route-level measurements:
frontend-performance-baseline.md(ops/frontend-performance-baseline.md).
The Step 6 follow-up axe run passes all 18 routes. The Home overflow and
low-resolution V&A thumbnail blockers are fixed locally with regression
coverage. The post-fix local matrix passes every mobile/desktop performance and
visual check, with 0.00 CLS, a maximum 1,628 ms LCP, and 29 ms representative
INP. A deployed-revision capture remains before closing P1.5.
Test coverage
`pnpm test:coverage` (c8) — 89.4% lines · 92.1% functions · 75.5% branches across 1,116 tests, gated in CI (floor 85 / 85 / 70). Core application code: `src/services` 91.9%, `src/adapters` 91.3%, `src/gateway` 100%.
The canonical full suite stays serial for shared-state determinism and uses
Node's compact dot reporter. On July 28, 2026, four diagnostic shards passed
`1,704/1,704` tests in about 158 seconds combined, and the equivalent unsharded
dot-reporter run passed in 154 seconds. The verbose reporter exceeded five
minutes only when its captured output saturated the command channel.
Other CI gates
- Types & lint — TypeScript `strict`, ESLint (`pnpm lint`).
- Linked Art conformance — protocol MUSTs + per-provider SHACL shapes (`shacl-conformance.yml`) + a generated, drift-gated conformance matrix.
- Supply chain — `pnpm audit --prod` (fails on high/critical) + Dependabot.
- Visual — public-trust Playwright smoke with screenshot diffing.
Research Commons browser proof
`pnpm research:commons:browser-proof` builds the current worktree before starting
the production server, then runs the named desktop and mobile researcher journeys.
This prevents a stale `.next` bundle from being retained as evidence for current
source. The latest local run passed all 14 journey executions with zero unexpected
or flaky executions; it remains local implementation evidence, not public-release,
external-review, demand, validation, revenue, or income evidence.
_Last refreshed: 2026-07-28. Accessibility and coverage numbers are reproduced on every CI run; backend performance numbers are from the latest evidence-pipeline run; frontend metrics are the dated production lab baseline._