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
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/, 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/ 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/, #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/ 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 |