You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
[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
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:
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.
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.
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.
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.
Filed unassigned by the seat implementing #10629. Observation class — no⚠️ The
pm:queue.domain:clilabel 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 aloggerkey holding a partial LoggerConfig. It declares nologLevelkey at any level. So this spelling, which appears 12 times across 7 files:sets an unknown property.
ObjectLoggeris then constructed fromconfig.logger, which isundefined, and its level falls to the default:The kernel therefore logs at
info— everywarn,errorandfatalincluded — in a fixture whose author wrote the word "silent".⛔ The level vocabulary itself is fine, and this finding does not claim otherwise.
LEVEL_ORDERin the same file does carrysilent: 5, andisEnabledcompares against it correctly (probed both directions:erroranddebugare both disabled atsilent). The correct spelling works. The defect is key placement only:Why nothing catches it
tscdoes catch it — measured, not assumed. Running the runtime package'stsc --noEmitwith the test exclusion lifted reports:But
packages/runtime/tsconfig.jsonexcludes**/*.test.ts, so the package's owntypecheckscript never reads the file, and the error is one of the 227 that the@objectstack/runtimeTEST_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/runtimefixtures. Two of them —notifications.hono.integration.test.tsand its siblingnotification-schema-conformance.integration.test.ts(quieted earlier by #10630) — passlogLevel: '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
silentwould 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.tsCounted with
grep -rn "logLevel:" packages --include=*.tsfiltered toObjectKernelconstruction; the file list isgrep -rl "new ObjectKernel({ logLevel".What a disposition has to decide
⛔ No recommendation offered — the two framings have different owners and different blast radii.
logLevelconvenience key the kernel actually reads, or making the excess-property error reachable by a gate rather than only by a ledgeredtscrun, 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
packages/.