Coverage¶
Measured with npm run test:serial against v2026.08.33 on 29 August
2026, on acc at 1e7fb19. All five packages were measured in the same run,
on the merged branch — unlike the previous pass, where pa-demo still sat on a
feature branch and carried its own date.
| Package | Statements | Branches | Functions | Lines | Δ since v2026.08.23 |
|---|---|---|---|---|---|
| Backend | 98.35% | 91.49% | 96.65% | 98.75% | unchanged |
| Frontend | 88.07% | 80.09% | 83.53% | 88.96% | see the note below |
| pa-cockpit | 86.16% | 75.55% | 83.46% | 88.53% | new package |
| pa-demo | 91.30% | 86.95% | 85.00% | 91.66% | +17.36 / +23.54 / +12.78 / +17.79 |
| Public site | 86.82% | 70.39% | 87.63% | 88.76% | unchanged |
The frontend row is not comparable to v2026.08.23
The Public Affairs cockpit was extracted into packages/pa-cockpit in this
window, taking 41 test files and 368 tests with it. The frontend percentage
is therefore measured over a different, smaller body of code than the
87.47% recorded last time — it did not simply improve. Read the frontend and
pa-cockpit rows together.
pa-demo's jump is the vendored fork leaving, not a testing campaign. Its
figures previously spanned a byte-identical copy of the cockpit with
src/vendor/** excluded by hand; the fork was deleted in v2026.08.28 and the
package is now a thin host adapter over @ronl/pa-cockpit. There is nothing
left to exclude — see pa-demo by area below.
Backend and public site are unchanged because nothing under their src/ trees
was touched in this window; both reproduced the 22 August figures exactly.
The last two decimals are noise
Frontend coverage is not deterministic. Six runs at the same commit, with no source change between them, produced 87.34% twice and 87.47% four times — the same 6789-statement denominator, nine statements apart. Clearing the Vite cache changed nothing. Treat a mismatch in the second decimal as expected rather than as something to chase; a difference of a whole point is worth investigating.
The backend has a different sensitivity: its figures depend on the
invocation. npm test --workspace=@ronl/backend is the command these
numbers come from.
All five configure collectCoverageFrom / coverage.include to span the whole
src tree rather than only the files a test happens to import, so an untested
file shows as 0% instead of silently disappearing from the report. pa-demo no
longer needs a src/vendor/** exclusion, because there is no vendored tree left
to exclude — see pa-demo by area.
What the headline numbers mean here. Backend, frontend and public site have been through a dedicated coverage campaign that closed breadth gaps deliberately — every backend feature area, every frontend component and page, and every public-site module now has at least a test file. What remains there is depth. pa-cockpit inherits the frontend's profile, since it is the code that used to be measured there. pa-demo is the outlier in the other direction (see pa-demo by area):
| Package | Statements → branches | Gap |
|---|---|---|
| Backend | 98.35 → 91.49 | 6.9 |
| Frontend | 88.07 → 80.09 | 8.0 |
| pa-cockpit | 86.16 → 75.55 | 10.6 |
| pa-demo | 91.30 → 86.95 | 4.4 |
| Public site | 86.82 → 70.39 | 16.4 |
The backend's gap has largely closed; the public site's has not moved, because
nothing there changed. pa-demo now has the narrowest gap of the five, which
is a property of what it became rather than of effort spent: a thin host adapter
over a package that carries its own tests. What is left elsewhere is the same
kind of thing:
defensive if (!req.user) guards behind real middleware, ?? null fallbacks,
catch blocks unreachable through a legal input, and deliberately-scoped
"critical interactions only" passes on the largest components — documented
per-file rather than silently absent.
Backend by area¶
These are the rows Jest prints, verbatim, so each can be matched against the
output of npm test --workspace=@ronl/backend -- --coverageReporters=text.
Sub-directories report separately rather than rolling up into their parent, and
istanbul truncates to two decimals rather than rounding.
| Area | Statements | Branches | Functions | Lines |
|---|---|---|---|---|
mcp-servers/edocs |
100 | 100 | 100 | 100 |
mcp-servers/triplydb |
100 | 90.9 | 100 | 100 |
middleware |
100 | 95.83 | 92.3 | 100 |
utils |
100 | 100 | 100 | 100 |
routes |
99.55 | 93.86 | 100 | 99.53 |
services/llm |
99.02 | 92.3 | 100 | 98.95 |
services |
98.87 | 91.26 | 98.13 | 99.24 |
pa-monitoring |
98.32 | 88.01 | 94.82 | 98.37 |
pa-monitoring/sources |
97.07 | 88.6 | 92.2 | 98.1 |
media-aggregator |
96.96 | 92.26 | 98.21 | 98.26 |
services/mcp |
96.33 | 100 | 93.9 | 97.84 |
mcp-servers/lde |
96.07 | 82.14 | 100 | 97.95 |
auth |
88.88 | 85.71 | 84.61 | 88.05 |
utils/ is no longer the exception
Through v2026.08.20 this table's lowest row by a wide margin was utils/
at 43.47% statements and 6.54% branches, documented as an accepted
artifact: config.ts sat at 0% because it self-runs dotenv and
validateConfig on import, and logger.ts was mocked in every test that
touched it.
Both are now closed. Every file in utils/ — altcha, config, env,
errors, logger, operaton-variables, slug, tls-bootstrap — reports
100 / 100 / 100 / 100. tls-bootstrap.ts was also at 0% and is now
fully covered. The area that was the standing excuse is now the best in the
package.
auth/ is now the lowest row, at 88.88% statements — the uncovered lines are
jwt.middleware.ts:23-33.
Frontend by area¶
| Area | Statements | Branches | Functions | Lines |
|---|---|---|---|---|
src/hooks |
100 | 75 | 100 | 100 |
src/pages/infra-board |
99.64 | 97.2 | 100 | 100 |
src/components/WooDashboard |
97.68 | 89.56 | 98.52 | 97.85 |
src/components/…/regelsimulatie |
97.66 | 81.43 | 95.18 | 98.15 |
src/pages/woo |
96.55 | 84.12 | 94.44 | 98.01 |
src/services |
93.48 | 81.14 | 96.55 | 94.02 |
src/components/InfraBoardDashboard |
90.96 | 84.54 | 87.87 | 91.68 |
src/ (root files) |
88.23 | 72.22 | 60 | 88.23 |
src/pages/public-affairs-v2 |
86.67 | 69.69 | 83.83 | 90.28 |
src/components |
86.45 | 70.11 | 94.73 | 90.62 |
src/components/CaseworkerDashboard |
86.33 | 81.37 | 84.53 | 88.19 |
src/components/PADashboardV2 |
84.77 | 73.2 | 81.87 | 87.41 |
src/components/…/dossierbeheer |
81.35 | 89.12 | 77.96 | 82.89 |
src/components/CaseworkerDashboardV2 |
81.27 | 74.57 | 72.51 | 81.96 |
src/pages |
72.4 | 69.87 | 61.56 | 73.43 |
src/utils |
66.66 | 50 | 100 | 100 |
Two rows moved substantially in this window: src/pages/public-affairs-v2 from
67.83% to 86.67%, and src/components/…/dossierbeheer from 79.29% to
81.35% — both from the PA cockpit work. src/services rose from 93.01% to
93.48%.
src/pages is the lowest of the top-level areas because it is where the
largest, most-recently-added containers live. Per-board detail is on the board
pages: Caseworker,
PA cockpit,
Infra-board,
Woo-dashboard.
Public site by area¶
| Area | Statements | Branches | Functions | Lines |
|---|---|---|---|---|
src/components |
96.77 | 100 | 96.15 | 96.66 |
src/lib |
84.9 | 73.17 | 88.88 | 86.2 |
src/pages |
82 | 61.51 | 79.06 | 84.26 |
Unchanged since v2026.08.20 — see Public site suite for what these files are and what is deliberately not covered.
pa-demo by area¶
| Area | Statements | Branches | Functions | Lines |
|---|---|---|---|---|
| All files | 91.30 | 86.95 | 85.00 | 91.66 |
src/demo |
95.91 | 84.61 | 100 | 97.72 |
src/demo/changelog |
100 | 87.50 | 100 | 100 |
src/demo/shims |
75.00 | 100 | 44.44 | 75.00 |
src/ (root) |
75.00 | 100 | 50.00 | 75.00 |
The src/vendor/** exclusion is gone, because the vendored tree is. Until
v2026.08.28 this package held a byte-identical copy of the cockpit — 39 files
kept honest by a manifest, a sync script and a drift checker — which had to be
excluded from these figures to avoid double-counting code the frontend suite
already exercised. The extraction into
@ronl/pa-cockpit deleted the fork and all of that
machinery, so every figure above is now pa-demo's own demo-owned surface and
nothing else. That is the whole reason the package total jumped from 73.94% to
91.30% without a single test being written for that purpose.
What remains uncovered is almost entirely shims that deliberately return
nothing: the dock stand-in and the session-expiry warning both render null
by design, because the real components pull in chat machinery and session
handling that a public, unauthenticated page must not have. They depress the
function percentage without representing a gap.
Two more files are excluded from coverage entirely, by config rather than by
this table's rounding: src/main.tsx (it calls createRoot; its one
meaningful line, forceMockMode(), is tested separately via the extracted,
fully-covered src/main-helpers.ts) and src/vite-env.d.ts (a type-only
ambient declaration file, nothing to execute). The src/ row above is just
these two remaining root files, App.tsx and main-helpers.ts — 100% on
main-helpers.ts (3/3 statements) pulled down by 0% on App.tsx (0/1) gives
the row's 75%. App.tsx is the lowest-covered file in the package — its one
statement, the route shell itself, has no test rendering it.