THE ALTITUDE ATLAS — DRAWING SETSHEET 12 / 14

the REGISTER PLATE

ALTITUDE 3¼ — the monorepo as its CI reads it · every task node punched · surveyed at origin/main @ eb1162da (2026-10-18) · turbo 2.11.8

THE PR CI TASK GRAPH, PUNCHED one card-hole per (package, task) node turbo puts in the graph · turbo 2.11.8 · --dry=json 1154 NODES · 310 RUN A COMMAND 4,706 EDGES · 187 JOIN TWO REAL TASKS GATHER EMIT CHECK PROVE ROLL-UP transit build:types build:js build docs:api typecheck typecheck:tsc typecheck:src typecheck:lit2 typecheck:mobx6 typecheck:effect3 lint lint:oxlint format:check format:check:oxfmt test test:coverage test:lit2-compat test:mobx6-compat test:effect3-compat check:bundle check:dev-split ci:pull_request ci PACKAGES/ — THE PRODUCT ×13 APPS/ — SAMPLE + E2E ×7 DOCS + EXAMPLES ×2 TOOLS/ — INSTRUMENTS ×26 ROOT // — NO FANNED TASKS @repo/dev-gate @repo/route-snapshot eslint-plugin-lit-ui-router lit-ui-router lit-ui-router-effect lit-ui-router-mobx lit-ui-router-signals lit-ui-router-ssr ui-router-effect ui-router-mobx ui-router-navigation-location-plugin ui-router-server ui-router-signals sample-app-shared sample-app-routes sample-app-lit-vanilla sample-app-lit-mobx sample-app-lit-effect sample-app-lit-signals sample-app-lit-e2e @www/lit-ui-router.dev examples @tools/a11y @tools/bootstrap @tools/build_and_test @tools/bundle-probe @tools/ci-logs @tools/compat-guards @tools/crap @tools/dts-backtest @tools/embed-heights @tools/eslint @tools/eslint-ts-parser @tools/happy-dom @tools/lcov-rebase @tools/lint-elements @tools/lit-template-lint @tools/lit-test-env @tools/oxc-emit @tools/oxlint-anti-slop @tools/release @tools/release-config @tools/repo-checks @tools/shared @tools/typedoc-plugin-lit-ui-router @tools/vue-check @tools/wintercg-globals @tools/workers-builds // ci:main test:engines test:matrix check:pack ci:main OVERLAY +50 nodes · 4 names · +5 real 048 1247 1248 548 1010 048 4548 1148 448 248 248 048 4748 048 4748 3748 1248 448 248 248 1048 648 048 048 run a command → nodes minted → SIX COLUMNS RUN NOTHING transit · typecheck · lint format:check · ci:pull_request · ci have no script in any of the 48 packages — they exist only so other tasks can depend on them. THE PHANTOM SHARE 1154 nodes in the PR graph. 844 of them run nothing at all: command "<NONEXISTENT>", a stub turbo mints so a ^self chain has somewhere to land an edge. 73% PLACEHOLDER DEEPEST CHAIN IN THE GRAPH — 14 DEEP @tools/bootstrap#build:types @tools/shared#build:types @tools/build_and_test#build:types @tools/bundle-probe#build:types ui-router-server#build:types sample-app-routes#build:types sample-app-routes#build sample-app-shared#build sample-app-lit-vanilla#build:hash sample-app-lit-vanilla#build @www/lit-ui-router.dev#build sample-app-lit-e2e#build sample-app-lit-e2e#ci:pull_request sample-app-lit-e2e#ci 4 of those 14 run a command. The longest all-real chain is 6 — 6 build steps, @tools/typedoc-plugin-lit-ui-router#build:types to sample-app-lit-e2e#build, with placeholder hops between the rungs. THE UNCACHEABLE THIRTEEN every cache:false definition in the repo — 7 at root, 6 in member files (@tools/ and @www/ elided) none of them reachable from ci codecov:bundlereports to a third party formatWRITER — rewrites its own inputs //#format:rootWRITER //#format:tomlWRITER — taplo devpersistent server docspersistent server e2epersistent server lit-ui-router.dev#docs:previewpersistent server lit-ui-router.dev#wrangler:devpersistent server lit-ui-router.dev#docspersistent server release#resolve:publishedreads the LIVE registry workers-builds#checkreads the LIVE deploy API lit-ui-router.dev#check:embedsreads the HOST THE RAGGED TAIL — 41 SINGLETON TASKS, ONE NODE EACH, NO FAN 14 of them belong to the root package «//», which appears in no fanned column at all @tools/release#check:exports @tools/release#check:release-closure @tools/release#pack:all @tools/repo-checks#check:dedupe @tools/repo-checks#check:graph-edges @tools/repo-checks#check:knip @tools/repo-checks#check:package-coverage @tools/repo-checks#check:patches @tools/repo-checks#check:shared-source @tools/repo-checks#check:single-version @tools/repo-checks#check:task-inputs @www/lit-ui-router.dev#typecheck:vue @www/lit-ui-router.dev#typecheck:worker @www/lit-ui-router.dev#typecheck:worker:tests @www/lit-ui-router.dev#types:worker //#format:check:root //#format:check:toml //#lint:actionlint //#lint:complexity //#lint:elements //#lint:markdown //#lint:package-json //#lint:root //#lint:shellcheck //#lint:templates //#lint:toml //#lint:workflows //#lint:zizmor //#typecheck:root eslint-plugin-lit-ui-router#lint:docs eslint-plugin-lit-ui-router#lint:rules eslint-plugin-lit-ui-router#test:oxlint eslint-plugin-lit-ui-router#test:peer-floor eslint-plugin-lit-ui-router#test:unit examples#build:embeds examples#lint:examples lit-ui-router#build:custom-elements sample-app-lit-vanilla#build:hash sample-app-lit-vanilla#build:vanilla ui-router-server#typecheck:runtime-globals ui-router-server#typecheck:tests STRUCTURE SCHEDULE — TASK GRAPHS BY PIPELINE PIPELINE NODES REAL PHANTOM EDGES REAL←REAL CHAIN / REAL ci115431073%470618714 / 6the PR gate — 48 packages × 24 fanned names ci:main120431574%503218814 / 6+50 nodes over 4 names; PR graph folded in build1734475%6163412 / 6the emit tier alone — four fifths placeholder lint1598248%11476911 / 4the densest real graph here — 52% real pack:all862670%283188 / 4one real task atop a 86-node cone No duration is encoded anywhere on this plate: CI wall-clock comparisons in this repo are confounded by cache state and task counts.
FIG. 12The pull-request graph is a near-rectangle: 48 packages against 24 fanned task names, plus a ragged tail of 41 one-offs. 73% of the holes are unpunched — placeholder nodes that run nothing, minted so a ^self chain has somewhere to land an edge or an umbrella something to fan out from.

GENERAL NOTES

Method. turbo run ci --dry=json and turbo run ci:main --dry=json against a materialized, installed archive of the ref — surveyed at origin/main @ eb1162da (2026-10-18) · turbo 2.11.8 — and the same for build, lint and pack:all in the schedule. Every number on the plate is read from www/atlas.lit-ui-router.dev/data/census-plate.json, the checked-in snapshot census-plate.mjs writes; this sheet holds placement and prose only. A node is one (package, task) pair turbo placed in the graph. A node is command-bearing when its resolved command is not the literal <NONEXISTENT> — turbo's marker for a task it had to invent because something depends on it in that package. An edge is real only when both of its ends are. No duration is drawn anywhere: wall-clock comparisons here are confounded by cache state and by the task counts themselves, so this plate measures shape and nothing else.

Why an inventory and not a city. Sheet 3 argues that a task manager is not a place; drawing this graph in isometric would smuggle back the geography that sheet's note denies. What a CI graph actually is, is a register: a fixed set of names crossed against a fixed set of packages, with most of the intersections empty. The honest form is the plate that shape already implies — a punchcard, read by column.

The finding. 1154 nodes; 310 run a command. 4,706 dependency edges; 187 join two real tasks. Of the 24 fanned names, 3 carry a ^self chain — transit, build:types, build — and a self-chain is what mints placeholders: turbo needs a node in every package to hang the chain on, whether or not that package has such a script. 6 names are 100% placeholder in all 48 packages: transit (which has no implementation anywhere in the repo — it exists purely as an edge), the three umbrellas typecheck, lint and format:check, which carry no script and only fan out to the leaf beside them, and the two roll-ups ci:pull_request and ci. The plate's rightmost columns and its leftmost are, in the strictest sense, empty, and so are three columns in its check stage.

Depth is mostly scaffolding too. The deepest chain is 14 nodes and 4 of them run anything. The longest chain counted in real nodes alone is 6 — 6 build steps, from @tools/typedoc-plugin-lit-ui-router#build:types to sample-app-lit-e2e#build — and even it climbs through placeholder hops between its real rungs, which is what a plate makes visible that a node-and-arrow render never does.

What the plate is not evidence for. Placeholders are cheap — turbo schedules and skips them, and the phantom share is not a runtime cost. The argument is about legibility: 73% of what a maintainer sees in --graph output is scaffolding, and the two ratios worth watching are the real-node share per column and the real-edge count. Note also the one tier that never appears here at all: the repo's 13 cache:false definitions — four writers, six persistent servers, two live-network readers and one host-bound measurement (@www/lit-ui-router.dev#check:embeds, #703) — are all outside every ci:* graph by design. A cache hit on any of them would be wrong, and the gate depends on their read-only twins instead (format:check for format).

The overlay. ci:main is not a different pipeline; it swallows ci:pull_request whole and adds 50 nodes across 4 names — ci:main, test:engines, test:matrix, check:pack — of which 5 are command-bearing. The main-branch graph is 4% larger and buys three engine tests (test:engines), one d.ts back-test (test:matrix) and one pack check (check:pack).

Where the real edges are, and are not. The docs:api column is punched in every package it stands in: @www/lit-ui-router.dev#build names its four producers directly rather than walking ^docs:api through devDependencies it never imports (#693). That is this plate's thesis arriving from the other side — scaffolding leaves the graph and the real work stays. It is also why real→real edges are a small fraction of 4,706: most edges land on a node that runs nothing.

KEY

punched — the task runs a command
unpunched — placeholder node, runs nothing
phantom by design — the whole column
grid station — no node in this graph
ci:main overlay — main-branch only
cache:false — a cache hit would be wrong
accent column head = carries a ^self chain
PROJECTTHE ALTITUDE ATLAS
SHEET TITLEthe REGISTER PLATE
SCALEPR CI GRAPH
FORMREGISTER PLATE
CLIENTlit-ui-router · simshanith
DATE / REV2026-10-18 · F
DRAWN BYFable (Claude, AI)
SHEET12 OF 14