ALTITUDE · COMPANIONS, CONTRACTED PLATES READ: census-bricks.json · census-couplings.json SEE ALSO 2 2A 

FIT VERDICT2A’s joints made live — every one of the 23 drawn edges is a published contract with its declared range under the pointer: 32 peers to 3 dependencies across the 11 packages, and no dependency is a router

THE ALTITUDE ATLAS — INTERACTIVE PLATESHEET 2B · REV G

the COUPLING BENCH

EVERY EDGE IS A PUBLISHED CONTRACT · 13 NODES · 23 DRAWN CONTRACTS OF 35 · 32 PEERS / 3 DEPENDENCIES · 3 OPTIONAL

@uirouter/core — the socket wall lit — not ours to publish a published package (storeys = brick courses) peerDependency dependency optional peer
HOVER AN EDGE FOR ITS RANGE DRAG TO PAN ← → STEP THE PIN ESC CLEARSPINCH TO ZOOM · ZOOMED, A FINGER PANS · DOUBLE-TAP FITS

BASIS35 contracts read from packages/*/package.json at origin/main @ eb1162da · commit 2026-10-18 · every catalog: spec resolved through the archive's own pnpm-workspace.yaml to the range that ships, and @uirouter/core and lit versions taken from pnpm-lock.yaml, by generator/census-couplings.mjs · massing and storeys from census-bricks.json · layout is sheet 2A's arrangement in five columns — the lit companions, the core-only column of three, the two externals, effect, ssr and ui-router-signals, the eslint bay — computed at build and drawn with cytoscape preset — no physics, and no bowed ties.

FIG. 2BThe same assembly as sheets 2 and 2A, reduced to what a consumer's installer actually reads: 13 buildings and 23 contracts. Hover an edge for the range it declares and the section it lives in; hover a building for its version, what it declares, and what declares it.
THE ALTITUDE ATLAS — DRAWING SETSHEET 2B · METHOD & BASIS

GENERAL NOTES

This plate is sheet 2A with the joints made live. Sheet 2 explodes the assembly and sheet 2A draws each coupling at reading size; both letter the API call that makes the joint. This one drops the API entirely and draws the other contract — the one npm install reads. Its arrangement is deliberately 2A’s: @uirouter/core as the socket wall at the left with lit above it, the lit companions in a column at the right in 2A’s order, the server below them with the coupling that exists only to be crossed out, and beyond that column effect and ssr, which tie the flagship from outside it, with ui-router-signals standing over them.

The middle column is an argument, not a spacer. 5 of the 11 published packages declare lit outright; ui-router-navigation-location-plugin, ui-router-effect and ui-router-mobx need neither it nor anything that does, and the bench says so by standing them in a column of their own between the wall and the lit column, the navigation plugin on the wall’s own baseline. Every other building on this bench reaches left across at least two column gaps; these three reach across one, the navigation plugin along a straight horizontal run, and that run is the whole of its coupling. With that column standing clear, nothing sits between lit-ui-router-mobx and lit-ui-router either, so their tie is a plain vertical. Every line on the plate is straight by construction: the generator throws if a same-column tie is laid through a third building, so a curve drawn around a neighbour is a build error rather than a layout choice.

An edge is one declaration, not a relationship. Every line is a single entry in a published package.json — its section (peerDependencies or dependencies), its declared range, and whether peerDependenciesMeta marks it optional. devDependencies are not drawn: they bind this workspace and never reach a consumer’s install. Of 35 contracts the 11 published packages declare, 23 land on a node that is on this bench; the other 12 are filed on the plate and read out in the panel under OFF THE BENCH — effect, @lit-labs/ssr, eslint and the rest, contracts on things this repo neither publishes nor draws.

Four nodes tie two siblings, and the first is the reason the bench grew a column. lit-ui-router-ssr declares lit-ui-router ^1.16.1 and ui-router-server ^0.2.0 || ^0.3.0 || ^0.4.0. It cannot stand in the companions column: a tie laid down that column to the flagship would run straight through lit-ui-router-mobx, and the generator throws on exactly that rather than bowing the line around it. So it stands one column further out with lit-ui-router-effect, which declares lit-ui-router ^1.15.0 and ui-router-effect ^0.1.0: its flagship tie has the same shape as mobx’s and the same problem, and its second tie runs from that outer column back across the bench to ui-router-effect in the core-only column. lit-ui-router-signals declares lit-ui-router ^1.15.0 and ui-router-signals ^0.1.0, and it can stand in the companions column, over the flagship, because nothing sits between them; its other sibling stands over effect, where the tie between them runs short and its own tie to the wall clears the flagship’s. lit-ui-router-mobx declares lit-ui-router ^1.15.0 and ui-router-mobx ^0.1.0: its flagship tie is the plain vertical down the companions column, and its second runs long from that column back across the bench to ui-router-mobx, which stands under ui-router-effect in the core-only column.

The ranges are the ranges that ship, not the ones written in the file. Every spec in this repo is a catalog reference — catalog:publishedPeer, not ^6.0.8 — which pnpm rewrites at pack time. census-couplings.mjs resolves each one against the archive’s own pnpm-workspace.yaml and the plate carries both, so the panel can show you what is written and what a consumer would see. @uirouter/core and lit carry no range of their own on this bench: their versions (6.0.8 · 6.1.2 and 2.8.0 · 3.3.3) come from the lockfile, which is the only honest source for a resolution.

The whole deps-to-peers decision is legible in one column. 32 of the 35 contracts are peers and only 3 are dependencies — and none of the 3 shipped dependencies is a router. lit-ui-router declares @uirouter/core at ^6.0.8 and lit at ^2.0.0 || ^3.0.0 as peers, and keeps exactly one thing in its tarball’s dependency list: @oxc-project/runtime at >=0.50.0, a runtime helper deliberately declared as wide as it can honestly be; lit-ui-router-ssr ships the same helper at the same range. lit-ui-router-mobx goes further and declares no dependency at all: all 5 of its contracts are peers, including its two brick-to-brick joints — lit-ui-router ^1.15.0, a floor the flagship sits above at 1.16.5, and ui-router-mobx ^0.1.0, a floor its store sits above at 0.1.1.

The lit range is a lane, and it is drawn as one. ^2.0.0 || ^3.0.0 is not a loose bound; it is a supported compatibility lane, and the same range appears on 4 of the 5 packages that declare lit; lit-ui-router-ssr narrows it to ^3.1.2. The bench shows the consequence: the lockfile resolves two lit majors (2.8.0 · 3.3.3), because the compat lane is tested, not merely permitted.

Two contracts are drawn in red, and they are the interesting ones. ui-router-server’s @uirouter/core is an optional peer at ^6.0.8 — sheet 2A draws that same tie crossed out, because the default matcher tier never loads the wall. And eslint-plugin-lit-ui-router stands in a bay of its own: it declares 2 contracts, eslint ^9.0.0 || ^10.0.0 and a shipped eslint-plugin-lit, and not one of them touches anything else on this bench. It is a published package of this repo that couples to none of its siblings — which is exactly why it is drawn here rather than left out.

Counting rules. 10 of the 11 published packages name @uirouter/core; 1 of those name it optionally. ui-router-navigation-location-plugin declares exactly one contract in the world — @uirouter/core ^6.0.8 — which is the plate’s own way of saying it has never heard of Lit. Massing and storeys are the brick schedule’s: front-face area tracks sloc, the smallest companions are clamped up to a legible minimum, and a building’s storeys are its courses band from census-bricks.json, never a pipeline tier.

KEY

a peerDependencies entry — the consumer supplies it
a dependencies entry — it ships inside the tarball
an OPTIONAL peer — peerDependenciesMeta says the install may skip it
a node this repo does not publish — core and lit, versions from the lockfile
a published package — area ≈ sloc, storeys = brick courses
PROJECTTHE ALTITUDE ATLAS
SHEET TITLEthe COUPLING BENCH
SCALE13 NODES · 23 DRAWN CONTRACTS
FORMINTERACTIVE COUPLING GRAPH
CLIENTlit-ui-router · simshanith
DATE / REV2026-10-18 · G
DRAWN BYFable (Claude, AI)
SHEET2B OF 14