THE ALTITUDE ATLAS — DRAWING SETSHEET 7 / 14

the MEASURED CITY

ALTITUDE 3½ — the same city as sheet 3, surveyed by mass · 52 members in 4 districts, footprint ∝ √sloc, height ∝ authored files, spec mass drawn as an annex, gate severity in colour · counted at origin/main @ 3f55e419 (2026-10-31)

SCALE — footprint side = 1.6 · √sloc (plan area ∝ sloc) · height = 3 px per authored file · mass = sloc × files footprint floored at 12 plan units so the smallest instruments stay visible · annexes massed on the same rule from spec files 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 A B C D E F G packages/ — THE PRODUCT 14 members, 12 published · 109 files · 10,708 sloc 13 of 14 carry a bigger annex than themselves sample-app-shared — 44f · 2,582 sloc the proving ground’s broadest block — outbuilt by six source blocks and five spec annexes apps/ — THE PROVING GROUND 7 members · 93 files · 4,927 sloc the proving ground gates nothing but e2e www/ + examples/ — THE SHOPFRONT 4 members · 65 files · 9,573 sloc docs, its two release workers and examples tools/ — THE INSTRUMENT YARD 27 members · 210 files · 17,759 sloc 6 of its masses sit on this drawing’s minimum footprint lit-ui-router — THE PACKAGE THIS SET IS ABOUT 25 authored files · 3,262 sloc its annex — 33 files · 9,354 sloc, 2.9× the source the biggest thing this district ever built is a test @tools/release — 54f · 2,772 sloc the tallest block on the sheet, and the only publish halt

STRUCTURE SCHEDULE — authored source per member · files · sloc · spec annex · gate tier

#memberfilesslocannex filesannex slocgate tiernote
1lit-ui-router253,262339,354the materialthe subject of this set · annex 2.9× the source
2ui-router-server213,006266,856the materialthe server adapter · annex 2.3×
3lit-ui-router-mobx51444579the materialthe mobx companion · annex 4.0×
4navigation-location-plugin221471,064the materialthe location seat, core's pushStateLocation swapped out · annex 5.0×
5sample-app-shared442,5828883the materialthe routes + views every sample app mounts
6sample-app-lit-vanilla8428——the materialthe plain-lit demo
7sample-app-lit-mobx8450——the materialthe mobx demo
8sample-app-routes71044392the materialthe shared route table, server-side too
9sample-app-lit-e2e942512860STOPS THE PR LINEcypress · drives the docs build
10docs212,153101,309the materialvitepress + the worker that serves it
11examples335,915174the materialstackblitz-ready copies, own lockfiles
12@tools/release542,772243,027HALTS A PUBLISHhosts published-diff — the one publish halt
13@tools/typedoc-plugin2350——never gatesbuilds the API pages, gates nothing
14@tools/dts-backtest9619——STOPS THE PR LINE9 files · 619 lines hold the TS 5.0 floor
15@tools/build_and_test152,93373,343never gatesthe CI graph helper — and its error summary
16@tools/shared115168527never gatesthe library under the instruments
17@tools/workers-builds788931,153gates a later stagethe docs deploy watch
18@tools/bundle-probe65353216never gatessize probe, advisory
19@tools/compat-guards115403556STOPS THE PR LINEthe lit 2 / mobx 6 / peer-floor lanes
20@tools/oxc-emit64873284the materialboth build passes, one emitter
21@tools/release-config21221255the materialthe shared release-it config
22@tools/lit-template-lint3151146never gatesthe lit-analyzer wrapper
23@tools/lit-test-env43662336STOPS THE PR LINEthe browser harness every suite loads
24@tools/vue-check136——never gatesvue-tsc over the docs components
25@tools/lcov-rebase230130never gatescoverage path rewriting
26@tools/happy-dom214159STOPS THE PR LINEthe node-side DOM the unit suites run in
#memberfilesslocannex filesannex slocgate tiernote
27@tools/wintercg-globals————types only — not massedambient types only — nothing to mass
28@tools/lint-elements——133STOPS THE PR LINEthe custom-element rules as an oxlint jsPlugins config the root extends
30@tools/eslint-ts-parser11——never gatesa one-line parser shim — the smallest thing in the yard
31eslint-plugin-lit-ui-router121,481132,560the materialvendored uiSref lint rules · annex 1.7×
32@tools/embed-heights3354153never gatesdocs embed heights, measured in Chromium — outside ci
33@tools/bootstrap3583107never gateszero-dep manifest reads — the one thing that runs before pnpm install
34@tools/eslint52541157never gatesthe repo rule plugin, the complexity ceiling and the Actions formatter root eslint.config.ts composes
35@tools/repo-checks151,532121,464STOPS THE PR LINEgraph edges, inputs, versions, coverage, patches, deps
36sample-app-lit-effect9473——the materialthe effect demo — the fourth app shell the docs site serves
37lit-ui-router-effect428551,093the materialthe effect bindings · annex 3.8×
38lit-ui-router-ssr181,485245,085the materialthe prerender bridge · verdicts in, @lit-labs/ssr pages out · annex 3.4×
39@tools/crap2124178never gatesCRAP hotspots from coverage — reports, gates nothing
40@tools/oxlint-anti-slop353,665——never gatesthe vendored anti-slop rules every oxlint lane loads
41lit-ui-router-signals41704855the materialthe signals bindings · annex 5.0×
42ui-router-signals41042185the materialthe framework-agnostic signal mirror · annex 1.8×
43ui-router-effect330262the materialthe framework-agnostic SubscriptionRef · annex 2.1×
44@repo/route-snapshot145165the materialprivate · inlined into each consumer's dist by oxc-emit · annex 1.4×
45sample-app-lit-signals8465——the materialthe signals demo — no test script, the fifth app shell the docs site serves
46@tools/a11y54913213never gatesaxe over the docs pages and app mounts — acceptance, gates nothing
47ui-router-mobx31172143the materialthe framework-agnostic MobX store · annex 1.2×
48@tools/ci-logs44043440never gatesa CI run's task logs fetched into one file — run by hand, gates nothing
49@repo/dev-gate23124the materialprivate · both halves of each package's #dev-gate import, inlined by oxc-emit · annex 8.0×
50ui-router-registry5362363the materialtyped state names and params · types only · annex 0.2×
51@tools/release-ledger25162588never gatesthe ledger's model — one fold over npm and GitHub
52release-diffs214——the materiala worker that answers 404 · no test script
53release-ledger91,49182,203the materialOIDC claims in, a D1 ledger of every release out

TOTAL — 52 members, 50 massed · 477 authored files · 42,967 sloc · plus 254 spec files · 46,674 sloc of annex · counted at origin/main @ 3f55e419 (2026-10-31) (sloc = scc Code)

ROAD REGISTER — NO ROAD IS DRAWN THAT THE REPO DOES NOT CARRY

roadkindthe edge in the repo
Abuilds intopackages/* → the sample apps · lit-ui-router → 4 of them, ui-router-server → routes
Bbuilds into@tools/oxc-emit → all twelve published packages · devDep of each · runs build:js + build:types
Ctests exercise@tools/dts-backtest → the runtime packages it deps on, and ui-router-registry · #test dependsOn ^build
Dtests exercise@tools/lit-test-env + @tools/happy-dom → the annex · devDep of lit-ui-router + -mobx
Etests exercisesample-app-lit-e2e → docs · workspace dep · e2e dependsOn ^build, with @www/lit-ui-router.dev#wrangler:dev
Ftypecheck readslit-ui-router src AND specs → docs · tsconfig include src/** · turbo dependsOn ^build:types
Glibrary under@tools/shared → @tools/release · one of 24 dependents; only this road is drawn

apps → docs is road A continued: docs depends on three sample apps and on ui-router-server

FIG. 7Sheet 3 drew the monorepo as a process; this sheet counts who lives in it. Footprint ∝ √sloc, height ∝ authored files, tests drawn as annexes rather than deleted — and over that census the two things a census alone cannot say: which district each member belongs to, and which roads run between them. Every road is a workspace dependency or a turbo task edge, never an impression.

GENERAL NOTES

Method — one basis, two series. Every count on this sheet is read at build time from the checked-in plate www/atlas.lit-ui-router.dev/data/census-city.json, counted at origin/main @ 3f55e419 (2026-10-31): .ts/.tsx/.js/.jsx/.mjs 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/ test/ tests/ __tests__/ cypress/ is counted into a second series and drawn as that member's annex. 52 members: 477 authored files and 42,967 sloc of source, plus 254 files and 46,674 sloc of spec. The packages district's 14 buildings reconcile exactly with sheet 3's source slab — 109 files, 10,708 lines — because both are queries over one census rather than two hand counts.

Every shipped building but ui-router-registry carries an annex bigger than itself. lit-ui-router: 3,262 authored lines against 9,354 of spec (2.9×). ui-router-server: 3,006 vs 6,856 (2.3×). lit-ui-router-mobx: 144 vs 579 (4.0×). eslint-plugin-lit-ui-router: 1481 vs 2560 (1.7×). lit-ui-router-effect: 285 vs 1093 (3.8×). lit-ui-router-ssr: 1485 vs 5085 (3.4×). navigation-location-plugin: 214 lines in 2 files under 7 spec files (5.0×). lit-ui-router-signals: 170 vs 855 (5.0×). ui-router-signals: 104 vs 185 (1.8×). ui-router-effect: 30 vs 62 (2.1×). ui-router-mobx: 117 vs 143 (1.2×). ui-router-registry is types only: 362 lines against a 63-line fixture (0.2×), because its tests are *.test-d.ts type assertions, which the census leaves out. 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/oxc-emit into all twelve 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/dts-backtest depends on the runtime packages of the district and backtests their emitted d.ts against the TS 5.0 floor; @tools/lit-test-env and @tools/happy-dom 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/lit-ui-router.dev#wrangler:dev, 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 24: that many members depend on @tools/shared, 17 of them instruments, and its src/globs.ts (#655) holds the custom-element glob three lanes share. Only the road to the largest is drawn, because drawing all 24 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/release 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/workers-builds, 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/happy-dom, sitting on the drawing's minimum footprint.

What the districts say. The product is 14 modest buildings — 10,708 lines — against 17,759 in the instrument yard and 4,927 in the proving ground. The broadest source block on the sheet is examples — 5,915 lines of stackblitz copies — with @tools/oxlint-anti-slop just behind at 3,665 and sample-app-shared, which ships to nobody and gates nothing, undefined at 2,582; two spec annexes outbuild examples. @tools/wintercg-globals 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/atlas.lit-ui-router.dev/data/census-city.json, 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 @ 3f55e419 (2026-10-31) — 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)
PROJECTTHE ALTITUDE ATLAS
SHEET TITLEthe MEASURED CITY
SCALEWHOLE WORKSPACE
FORMMEASURED CITY
CLIENTlit-ui-router · simshanith
DATE / REV2026-10-30 · K
DRAWN BYFable (Claude, AI)
SHEET7 OF 14