FIT VERDICTthe census with districts and roads — tests as annexes, every edge cited: the 14-line harness stops every PR, and all 48 members are measured on the scc ruler
the MEASURED CITY
ALTITUDE 3½ — the same city as sheet 3, surveyed by mass · 48 members in 4 districts, footprint ∝ √sloc, height ∝ authored files, spec mass drawn as an annex, gate severity in colour · counted at origin/main @ eb1162da (2026-10-18)
GENERAL NOTES
Method — one basis, two series. Every count on this sheet is read at build time from the checked-in plate www/, counted at origin/main @ eb1162da (2026-10-18): .ts/ under each member's source directory, excluding *.d.ts, *.test-d.ts, fixtures, dist/ and node_modules/; sloc is scc's Code count — string-aware, so the interior of a template literal counts as code rather than as one line. Sheet 3 throws test code away; this sheet does not — anything matching *.{spec,test,cy}.* or living under specs/ is counted into a second series and drawn as that member's annex. 48 members: 415 authored files and 36,620 sloc of source, plus 212 files and 37,012 sloc of spec. The packages district's 13 buildings reconcile exactly with sheet 3's source slab — 87 files, 8,156 lines — because both are queries over one census rather than two hand counts.
Every shipped building carries an annex bigger than itself. lit-ui-router: 2,860 authored lines against 8,609 of spec (3.0×). ui-router-server: 1,670 vs 4,587 (2.7×). lit-ui-router-mobx: 145 vs 588 (4.1×). eslint-plugin-lit-ui-router: 1462 vs 2437 (1.7×). lit-ui-router-effect: 281 vs 1078 (3.8×). lit-ui-router-ssr: 1127 vs 2989 (2.7×). navigation-location-plugin: 208 lines in 2 files under 7 spec files (5.0×). lit-ui-router-signals: 171 vs 864 (5.1×). ui-router-signals: 95 vs 185 (1.9×). ui-router-effect: 21 vs 62 (3.0×). ui-router-mobx: 68 vs 143 (2.1×). The test budget lives exactly where the repo says it should — in packages/, and nowhere else at that ratio.
Every road is citable. Solid roads are build edges: packages/ into the sample apps, the apps into docs, @tools/ into all eleven published packages — each a workspace: dependency, each backed by turbo's build/docs tasks depending on ^build. Dashed soft roads are the test lane: @tools/ depends on the runtime packages of the district and backtests their emitted d.ts against the TS 5.0 floor; @tools/ and @tools/ run up into lit-ui-router's annex because they are its devDependencies and the harness its suites load; sample-app-lit-e2e depends on docs, and turbo's e2e depends on ^build and runs with @www/, so Cypress drives the built shopfront under its worker rather than a vite dev server. The accent road is the one that leaves a member twice — once from the source block and once from the spec annex — because the package's typecheck reads both: tsconfig.json includes src/, specs and all (only the narrower typecheck:src excludes them), while the ^build:types dependency is what carries the result into the next district. One faint road stands for 22: that many members depend on @tools/, 16 of them instruments, and its src/ (#655) holds the custom-element glob three lanes share. Only the road to the largest is drawn, because drawing all 22 would turn the yard into hatching.
Severity in colour, mass in geometry — and they disagree. The tiers are sheet 3's, applied to whole members: @tools/ is solid red because it hosts published-diff, the only structure that halts a publish; red hatch marks the seven members that can stop a pull request — Cypress e2e, dts-backtest, compat-guards, lit-test-env, happy-dom, lint-elements, whose eslint lane runs at --max-warnings 0, and repo-checks, whose six checks — graph edges, task inputs, single version, patches, knip and dedupe — ride the lint lane; accent hatch marks @tools/, which gates the docs deploy and nothing earlier. Here the two encodings happen to agree once, on release, and disagree everywhere else: the harness that can stop every pull request in the repo is 14 authored lines of @tools/, sitting on the drawing's minimum footprint.
What the districts say. The product is 13 modest buildings — 8,156 lines — against 16,757 in the instrument yard and 4,776 in the proving ground. The broadest source block on the sheet is examples — 5,798 lines of stackblitz copies — with @tools/ just behind at 3,665 and sample-app-shared, which ships to nobody and gates nothing, sixth at 2,493; the only footprint that outbuilds examples is lit-ui-router's spec annex. @tools/ is drawn on the floor with no mass at all: it is ambient types, and a census that hides its empty members is not a census.
Numbers by import, not by paste. Every count above and on the drawing is read from www/, the snapshot census-city.mjs writes out of the master per-file census; this module holds placement, tiers and prose only. The plate is measured at a named ref rather than at whatever a working tree happens to hold — counted at origin/main @ eb1162da (2026-10-18) — so every number here is citable to a committed file, and a member the sheet draws but the plate does not carry is a build error rather than a stale constant.
KEY
| a member, massed — footprint ∝ √sloc, height ∝ files | |
| its spec annex — the test mass, same rule | |
| halts a publish (@tools/release) | |
| stops the PR line | |
| gates a later stage (the docs deploy) | |
| never gates — reporters, libraries, the material | |
| builds into — a workspace dep feeding a build | |
| tests exercise — harness in, backtest out | |
| typecheck reads — from src AND annex | |
| library under the instruments | |
| district (workspace glob) |