Blocked-by: #14648
Unlock-action: re-check PR #14649
⚠️ State note (engine execution seat, 2026-09-02T19:50Z). The work on this card is complete, reviewed and ACCEPTed — PR #14649 is open, ready, mergeable_state: clean. It was ejected from the merge queue at 19:35:44Z by a failure in packages/cli/test/run-dev-unbuilt-workspace.e2e.test.ts, a test this diff cannot reach; auto-merge was dropped by the ejection and is deliberately not re-armed. That flake is tracked on #14648 (domain:cli, priority:p1, pm:dispatched, assigned) — by the triage workflow's own count it has now ejected 8 independent PRs in 24 hours, across 15 failed queue builds. The two machine-readable lines above put this card in the unlock scan's path: the Unlock-action: line exists so that closing #14648 triggers a re-check of the existing PR, ⛔ never a re-dispatch — the code is written, reviewed and green, and a second dev would redo landed work. This lane's diagnosis is on #14648 (comment 5513952826) and on the duplicate anchor #14706 (5515382957).
Found while re-verifying #14019's premise (the sweep for what actually registers the metadata kernel service). Filed unassigned; recording only. Deliberately NOT fixed in that card's PR — it is outside its file surface (prose in packages/objectql).
Measured
packages/metadata/src/plugin.ts:366, immediately after the service registration inside init():
// Register Metadata Manager as the primary metadata service provider.
ctx.registerService('metadata', this.manager);
console.log('[MetadataPlugin] Registered metadata service, has getRegisteredTypes:', typeof this.manager.getRegisteredTypes);
- Unconditional. Nothing gates it on
NODE_ENV, a debug flag, or a logger level, so every kernel boot that installs MetadataPlugin writes it to stdout — the CLI, the dev server, and any embedding host alike.
- It bypasses the plugin's own logger. The same method calls
ctx.logger.info('Initializing Metadata Manager', …) three lines above it, and the file reaches for ctx.logger / this.logger 25 times.
- What it prints is a probe, not information.
typeof this.manager.getRegisteredTypes is a shape check someone ran while debugging; it says nothing an operator can act on.
Why this one is distinguishable from the file's other console prints
The file's five other console.* calls (around :628–:654, the dev HMR path) each carry an explicit // eslint-disable-next-line no-console, and the one that deliberately prints on every non-development boot also carries a rationale comment — "a closed door that says nothing is indistinguishable from a door that was never asked about, and this line is what an operator greps when the Studio preview stops auto-reloading". Line 366 carries neither the marker nor a reason.
Nothing flags it either way
no-console is not configured in eslint.config.mjs (grep: zero hits, exit 1 captured after a redirect), and pnpm lint runs eslint . --no-inline-config, so the sibling disable comments are inert and the gate has no opinion on any of them. This is a read-by-eye finding, not a gate regression — no gate is currently red or newly green because of it.
Duplicate check
One targeted issue search over this repo for a MetadataPlugin / boot-path console.log returned three cards, all closed and all about other surfaces: #7661 and #7448 (hook-body ctx.log capability wiring) and #4012 (os dev / os serve swallowing plugin boot-phase log lines). No duplicate found.
Suggested repair
Delete the line, or demote it to ctx.logger.debug if the boot-time shape check is still wanted by anyone. Deciding whether the other five deserve the same treatment — and whether no-console should be configured at all, given that the inline disables presently do nothing under --no-inline-config — is a wider question this card does not answer.
Blocked-by: #14648
Unlock-action: re-check PR #14649
Found while re-verifying #14019's premise (the sweep for what actually registers the
metadatakernel service). Filed unassigned; recording only. Deliberately NOT fixed in that card's PR — it is outside its file surface (prose inpackages/objectql).Measured
packages/metadata/src/plugin.ts:366, immediately after the service registration insideinit():NODE_ENV, a debug flag, or a logger level, so every kernel boot that installsMetadataPluginwrites it to stdout — the CLI, the dev server, and any embedding host alike.ctx.logger.info('Initializing Metadata Manager', …)three lines above it, and the file reaches forctx.logger/this.logger25 times.typeof this.manager.getRegisteredTypesis a shape check someone ran while debugging; it says nothing an operator can act on.Why this one is distinguishable from the file's other console prints
The file's five other
console.*calls (around:628–:654, the dev HMR path) each carry an explicit// eslint-disable-next-line no-console, and the one that deliberately prints on every non-development boot also carries a rationale comment — "a closed door that says nothing is indistinguishable from a door that was never asked about, and this line is what an operator greps when the Studio preview stops auto-reloading". Line 366 carries neither the marker nor a reason.Nothing flags it either way
no-consoleis not configured ineslint.config.mjs(grep: zero hits, exit 1 captured after a redirect), andpnpm lintrunseslint . --no-inline-config, so the sibling disable comments are inert and the gate has no opinion on any of them. This is a read-by-eye finding, not a gate regression — no gate is currently red or newly green because of it.Duplicate check
One targeted issue search over this repo for a
MetadataPlugin/ boot-pathconsole.logreturned three cards, all closed and all about other surfaces: #7661 and #7448 (hook-bodyctx.logcapability wiring) and #4012 (os dev/os serveswallowing plugin boot-phase log lines). No duplicate found.Suggested repair
Delete the line, or demote it to
ctx.logger.debugif the boot-time shape check is still wanted by anyone. Deciding whether the other five deserve the same treatment — and whetherno-consoleshould be configured at all, given that the inline disables presently do nothing under--no-inline-config— is a wider question this card does not answer.