Skip to content

[finding] new ObjectKernel({ logLevel: 'silent' }) silences nothing — logLevel is not a key of ObjectKernelConfig, and 12 call sites across 7 files believe it is #10984

Description

@os-elon

Filed unassigned by the seat implementing #10629. Observation class — no pm:queue. ⚠️ The domain:cli label is this seat's guess by #10629's anchoring rule (the repairs land in test files); the affected files span three packages, so triage should re-route rather than inherit it.

What was measured

ObjectKernelConfig (packages/core/src/kernel.ts) declares a logger key holding a partial LoggerConfig. It declares no logLevel key at any level. So this spelling, which appears 12 times across 7 files:

kernel=newObjectKernel({logLevel: 'silent'});

sets an unknown property. ObjectLogger is then constructed from config.logger, which is undefined, and its level falls to the default:

level: config.level??'info',// packages/core/src/logger.ts

The kernel therefore logs at info — every warn, error and fatal included — in a fixture whose author wrote the word "silent".

The level vocabulary itself is fine, and this finding does not claim otherwise.LEVEL_ORDER in the same file does carry silent: 5, and isEnabled compares against it correctly (probed both directions: error and debug are both disabled at silent). The correct spelling works. The defect is key placement only:

newObjectKernel({logLevel: 'silent'})// accepted, ignorednewObjectKernel({logger: {level: 'silent'}})// what the author meant

Why nothing catches it

tsc does catch it — measured, not assumed. Running the runtime package's tsc --noEmit with the test exclusion lifted reports:

src/notifications.hono.integration.test.ts(115,33): error TS2353: Object literal may only
specify known properties, and 'logLevel' does not exist in type 'ObjectKernelConfig'.

But packages/runtime/tsconfig.json excludes **/*.test.ts, so the package's own typecheck script never reads the file, and the error is one of the 227 that the @objectstack/runtime TEST_DEBT ledger entry holds frozen. It is real, it is counted, and no gate is red for it — which is exactly the state that entry exists to describe.

The consequence that made this visible

#10629 quieted expected read-failure noise in 16 passing @objectstack/runtime fixtures. Two of them — notifications.hono.integration.test.ts and its sibling notification-schema-conformance.integration.test.ts (quieted earlier by #10630) — pass logLevel: 'silent' and still printed ERROR-level engine frames into the shared shard log. That is not a logger bug; it is this key never having been read. Had the option landed where the kernel looks, those two files would have needed no capture on the engine channel at all.

⛔ Not a suggestion to fix them that way. A blanket silent would suppress the expected line and every unexpected one, which is precisely the mute #10630 and #10629 refused; the captures they landed are strictly better and should stay. This matters for the other 10 call sites, which are not about noise at all.

The 12 call sites

packages/runtime/src/notifications.hono.integration.test.ts · packages/runtime/src/notification-schema-conformance.integration.test.ts · packages/triggers/trigger-record-change/src/multilookup-context.test.ts · packages/triggers/trigger-record-change/src/bulk-write-per-row-context.test.ts · packages/triggers/trigger-record-change/src/record-change-integration.test.ts · packages/triggers/trigger-record-change/src/formula-context.test.ts · packages/plugins/plugin-approvals/src/status-mirror-cascade.integration.test.ts

Counted with grep -rn "logLevel:" packages --include=*.ts filtered to ObjectKernel construction; the file list is grep -rl "new ObjectKernel({ logLevel".

What a disposition has to decide

⛔ No recommendation offered — the two framings have different owners and different blast radii.

  1. Repair the call sites (mechanical, 7 files, and each one changes what that fixture prints — so each needs its output re-read, not just its spelling fixed). Cheap, local, leaves the class open for the next author to re-enter.
  2. Make the shape unable to be written wrong — the Prime Directive Add comprehensive test suite for Zod schema validation #12 direction. Whether that is a logLevel convenience key the kernel actually reads, or making the excess-property error reachable by a gate rather than only by a ledgered tsc run, is the real question. Note the second half generalises well beyond this key: any accepted-and-ignored option in a test-excluded file has the same invisibility.

Not claimed

  • No production call site is shown to be affected. All 12 are test files; this was not swept beyond packages/.
  • No test is shown to be wrong because of it. Every one of the 7 files passes; the cost measured here is log noise and a misleading fixture, not a false assertion.

Metadata

Metadata

Assignees

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions