Measured while implementing #11863 (the trigger-api hooks ledger). Filed unassigned — an
observation from that card's population sweep, not a claim on anyone's time.
What was measured
origin/main @ 4019e16cdc. IHttpServer.getMountedRoutes() cannot see a route mounted on
the framework-native handle — "routes an adapter mounts on its framework-native handle behind
getRawApp are outside this table by construction" (packages/spec/src/contracts/http-server.ts).
So the #7526 route-ledger ↔ live-mount parity gate, which reads that table off a booted server,
is structurally blind to every getRawApp() mount, and the per-package ledgers (#3636) are the
only thing that can cover them.
Two of those mounters are covered. The rest are not. Every path below was grepped against all
seven in-repo route ledgers (runtime, rest, service-storage, service-i18n,
service-datasource, service-settings, plugin-auth): zero hits.
| mounting file | route(s) | ledger |
|---|
packages/cloud-connection/src/cloud-connection-plugin.ts (8 mounts, lines 231-634) | GET/POST /api/v1/cloud-connection/{status,bind/start,bind/poll,unbind,install,installation,installed,org-packages} | none |
packages/cloud-connection/src/marketplace-install-local-plugin.ts (5 mounts, lines 246-251) | POST/GET /api/v1/marketplace/install-local, DELETE .../:manifestId, POST .../:manifestId/{reseed,purge}-sample-data | none |
packages/cloud-connection/src/marketplace-proxy-plugin.ts:371 | ALL /api/v1/marketplace/* | none |
packages/cloud-connection/src/runtime-config-plugin.ts:875,877 | GET /api/v1/runtime/config, GET /api/v1/studio/runtime-config | none |
packages/metadata/src/routes/hmr-routes.ts:126,185 (mounted at plugin.ts:468) | GET/POST /api/v1/dev/metadata-events | none |
packages/cli/src/utils/console.ts:536-608 | GET /, GET /_console, GET /_console/*, GET /runtime/assets/:filename | none |
Covered, for contrast — the two that show the shape is answerable:
Why this is the known defect class
It is #11863's own rationale, one population wider: a route surface a package serves that
nobody reviewed the SDK disposition of is what #3528 was, and the /.well-known/objectstack
case (#7526) was found only because something read a live mount table. These cannot be found
that way — the mount table does not contain them.
Secondary effect, the same one #11863 records: #11050's corpus-wide detector takes the ledger
union as its authority, so each of these can only ever land in its unmatched listing.
Not proposed here
Whether each family wants a per-package ledger (#3636), a source-enumerating gate
(check-auth-mount-ledger.mjs's shape, which fits a rawApp mount better), or a single gate
over all raw-app mounters, is a design call — and the cli console rows in particular are
static-asset serving rather than API surface. The measurement is the contribution; the shape
is triage's.
Generated by Claude Code
Generated by Claude Code
Measured while implementing #11863 (the trigger-api hooks ledger). Filed unassigned — an
observation from that card's population sweep, not a claim on anyone's time.
What was measured
origin/main@4019e16cdc.IHttpServer.getMountedRoutes()cannot see a route mounted onthe framework-native handle — "routes an adapter mounts on its framework-native handle behind
getRawAppare outside this table by construction" (packages/spec/src/contracts/http-server.ts).So the #7526 route-ledger ↔ live-mount parity gate, which reads that table off a booted server,
is structurally blind to every
getRawApp()mount, and the per-package ledgers (#3636) are theonly thing that can cover them.
Two of those mounters are covered. The rest are not. Every path below was grepped against all
seven in-repo route ledgers (
runtime,rest,service-storage,service-i18n,service-datasource,service-settings,plugin-auth): zero hits.packages/cloud-connection/src/cloud-connection-plugin.ts(8 mounts, lines 231-634)GET/POST /api/v1/cloud-connection/{status,bind/start,bind/poll,unbind,install,installation,installed,org-packages}packages/cloud-connection/src/marketplace-install-local-plugin.ts(5 mounts, lines 246-251)POST/GET /api/v1/marketplace/install-local,DELETE .../:manifestId,POST .../:manifestId/{reseed,purge}-sample-datapackages/cloud-connection/src/marketplace-proxy-plugin.ts:371ALL /api/v1/marketplace/*packages/cloud-connection/src/runtime-config-plugin.ts:875,877GET /api/v1/runtime/config,GET /api/v1/studio/runtime-configpackages/metadata/src/routes/hmr-routes.ts:126,185(mounted atplugin.ts:468)GET/POST /api/v1/dev/metadata-eventspackages/cli/src/utils/console.ts:536-608GET /,GET /_console,GET /_console/*,GET /runtime/assets/:filenameCovered, for contrast — the two that show the shape is answerable:
packages/plugins/plugin-authmounts on the raw app too, and carriesauth-route-ledger.tsplus a dedicated source-enumerating gate,
scripts/check-auth-mount-ledger.mjs(auth-mount coverage — follow-ups 1/2/4 LANDED; remaining scope is follow-up 3 (sdk bridge) + the #10975 ledger row (body below is the original census, now historical) #10534).packages/triggers/trigger-apiis being closed by trigger-api mounts POST /api/v1/automation/hooks/:flowName/:hookId on the host server with no route ledger anywhere — the unledgered-mount class the ledgers exist to close #11863 with a per-package ledger + guard.Why this is the known defect class
It is #11863's own rationale, one population wider: a route surface a package serves that
nobody reviewed the SDK disposition of is what #3528 was, and the
/.well-known/objectstackcase (#7526) was found only because something read a live mount table. These cannot be found
that way — the mount table does not contain them.
Secondary effect, the same one #11863 records: #11050's corpus-wide detector takes the ledger
union as its authority, so each of these can only ever land in its
unmatchedlisting.Not proposed here
Whether each family wants a per-package ledger (#3636), a source-enumerating gate
(
check-auth-mount-ledger.mjs's shape, which fits arawAppmount better), or a single gateover all raw-app mounters, is a design call — and the
cliconsole rows in particular arestatic-asset serving rather than API surface. The measurement is the contribution; the shape
is triage's.
Generated by Claude Code
Generated by Claude Code