← Documentation home

Canonical Markdown source · Oct 20, 2018

Quality & Performance

quality.md · 79 lines · SHA-256 4601d6ecb5a2

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._