qa: full log-volume census — structured logger is 77.1% of test output, not ~45% - #14989
Conversation
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0112hMx9hjJ9BgB28X97DS68
Extends Batch 1's ledger (23 packages, driven under the shared verify lock) with 9 more: driver-sqlite-wasm, driver-turso, formula, lint, mcp, metadata, metadata-core, metadata-fs, metadata-protocol. Also: end-to-end control for the OS_LOG_LEVEL premise re-verification (Zone 2 D) — resolveLogLevel() confirmed sensitive to its input, and a repo-wide grep confirms it is read nowhere outside packages/cli (one non-hit is a self-test fixture string in dispatch-gates.mjs). Doc's method/mechanism/reproduction/premise sections carried over from a prior attempt's draft, independently re-verified against source (packages/core/src/logger.ts, packages/verify/src/harness.ts) before being kept — every file:line citation checked out exactly. Provisional structured share (console+structured) at 32/72: ~84%, already far from the five-suite ~45%, in the direction the earlier reading's own explanation predicts. Not the final number — continuing. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0112hMx9hjJ9BgB28X97DS68
+13 packages this batch: observability, platform-objects, embedder-openai, knowledge-memory, knowledge-ragflow, plugin-approvals, plugin-audit, plugin-auth, plugin-dev, plugin-email, plugin-hono-server, plugin-pinyin-search, plugin-reports. plugin-auth is the first non-trivial plugins/ package: 4,840 lines (2,149 structured / 2,678 console) — most plugins so far are near- silent (13 reporter lines only, no kernel boot in their own test script). Provisional structured share (console+structured) at 45/72: ~80%. 27 remain, all services/*, triggers/*, spec, sdui-parser, and the qa/http-conformance + qa/downstream-contract pair. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0112hMx9hjJ9BgB28X97DS68
+10 packages this batch: plugin-security, plugin-sharing, plugin-webhooks, downstream-contract, http-conformance, sdui-parser, service-analytics, service-automation, service-cache, service-cluster. 17 remain: service-cluster-redis, service-datasource, service-i18n, service-job, service-knowledge, service-messaging, service-package, service-queue, service-realtime, service-settings, service-sms, service-storage, spec, trigger-api, trigger-record-change, trigger-schedule, types. Provisional structured share (console+structured) at 55/72: ~79%, holding steady across three checkpoints now (84% -> 80% -> 79%). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0112hMx9hjJ9BgB28X97DS68
+13 packages this batch: service-cluster-redis, service-datasource, service-i18n, service-job, service-knowledge, service-messaging, service-package, service-queue, service-realtime, service-settings, service-sms, service-storage, spec. 4 remain: trigger-api, trigger-record-change, trigger-schedule, types. packages/spec measured read-only (its own `test` script run and stdout captured, nothing edited under it — domain:spec's package stays untouched); 481s of the 480s budget, exit 0. Provisional structured share (console+structured) at 68/72: ~78%. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0112hMx9hjJ9BgB28X97DS68
…ructured-logger-volume-census
… hold All 72 workspace packages with a test script measured, all green. Final totals: 61,980 structured / 17,428 console / 993 reporter / 80,401 total lines — structured share of total 77.1% (comparable to the earlier five-suite framing, whose own `console` bucket absorbed what this instrument tracks separately as `reporter`). The five-suite ~45% figure does not hold, and not toward more noise: it moved to 77.1% structured, decomposed in "The answer" section as two effects — (1) two commits (#13985, #14016) that landed on main between the earlier reading and this one already took the original five suites from ~45% to 86.6% structured on their own, by cutting a `[Registry]` debug-console population; (2) extending to the other 67 packages pulls that back down to 77.1% (not further), since that population's own structured share (57.7%) is lower than the five heaviest suites' but is also a minority (30.3%) of total test-run volume, and most of it (35/72 packages under 30 lines total, 22 of those exactly 13 -- pure reporter boilerplate) never boots a kernel at all. No seam added -- per triage's ruling (comment 5489397004), this document is the measurement; which seam (if either) to build is triage's call. Merged origin/main (dispatch-gates warned STALE TREE, 19 commits behind) -- no relevant file (logger.ts, harness.ts, log-level.ts, vitest configs, package.json test scripts) changed across that range, so the merge does not invalidate any measurement already taken. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0112hMx9hjJ9BgB28X97DS68
…ess.ts Relevant to the fork this card hands back to triage: a BootOptions field on packages/verify's harness would only quiet suites that boot through that harness, not the ~60 other files (85 call sites) that construct a kernel directly -- including packages/objectql's own kernel-factory.ts, which alone accounts for 18.3% of the structured lines measured. Does not choose a seam; changes what each seam would cost to actually reach the population it's meant to quiet. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0112hMx9hjJ9BgB28X97DS68
…ructured-logger-volume-census
Review found three citation defects in docs/audits/2026-09-test-log-volume-census.md — the measurement itself (72-row table, arithmetic) was independently reproduced and is untouched. 1. `new ObjectKernel(` repo-wide count: re-ran the exact grep command on this branch merged with origin/main and got 78 occurrences across 55 files, not 85/62. Corrected the number and the two downstream figures that depend on it (~53 remaining call sites, "all 78 call sites"), and stamped the ref it was verified against so a future drift is reproducible instead of silent. 2. `scripts/pm/dispatch-gates.mjs:14461` is blank on this tree; the real self-test-fixture line is 14478. Corrected and ref-stamped (this file is edited often). 3. `packages/core/src/logger.ts:350-395` — the quoted block actually starts at 349, not 350 (content verbatim-correct, only the start line was off by one; end line shifts by the same one to 394). Re-resolved the other eight citations the reviewer already checked (logger.ts:180/236, harness.ts:96-313/384, kernel.ts:87, log-level.ts:53, kernel-factory.ts:35, and the 72/72 disableConsoleIntercept:true claim) against this branch's merged tree — none of them moved. Part of #13986 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0112hMx9hjJ9BgB28X97DS68
…ructured-logger-volume-census
origin/main moved again (99b4deb) between the first fix commit and the gate sweep. Re-verified all three corrected citations plus the eight already-checked ones against that tree — nothing moved — and updated the inline ref stamps from 48d4422 to 0de50b8 (this branch's HEAD after merging origin/main a second time) so they point at the tree the numbers were actually last confirmed on. Part of #13986 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0112hMx9hjJ9BgB28X97DS68
Review FAIL cleared — all three citations corrected, and the PM seat re-measured them independentlyIndependent review FAILed this PR on three citation defects. The fix round corrected them, and this seat then re-ran the three measurements itself on the branch head
The fix round did more than the three it was asked for, correctly. Two further numbers in the same paragraph were derived from the wrong count and would have silently survived a narrow fix: the "~60 remaining call sites" estimate is now ~53, and "all 85 call sites" is now all 78. Neither was in the review's finding list; catching them is the difference between fixing a symptom and fixing the paragraph. And the actual repair is not the number — it is the ref. Each corrected figure now carries the commit it was verified against ( Everything the review passed stayed untouched, as instructed: the 72-row census table (arithmetically reconciled row by row, Gates: 25 commands derived off the merge base with no path arguments — 24 exit 0, one ( Landing state, stated precisely. Marked ready. ⛔ Auto-merge is deliberately NOT armed yet: 33 of 34 check runs are green or skipped, but Generated by Claude Code |
Part of #13986
What this is
Triage's ruling on this card (comment 5489397004): "the deliverable is the
unmeasured half, not another seam" and "after running the measurement, do
not pick a seam yourself — report a fork back to triage with the results."
This PR is exactly that: the measurement, and nothing else. No seam was
added. Which of the two candidate seams (if either) to build is left for
triage, with the numbers below in hand.
The measurement
scripts/qa/log-volume-census.mjsruns every one of the 72 workspacepackages' own
testscript unchanged, captures combined stdout+stderr, andclassifies every line as structured (the engine logger's fixed
TIMESTAMP LEVEL …/ JSON head), reporter (vitest's own closedvocabulary), or console (the complement — everything else). All 72
packages measured, all green.
structured share of total: 77.1% — comparable to the card's own ~45%
framing (its
consolebucket absorbed what this instrument tracksseparately as
reporter).The ratio does not hold, and not toward more noise — it moved to 77.1%
structured, for two compounding reasons:
mainbetween the card's reading and this one —b79ddf17d(test(dogfood): declare OS_REGISTRY_LOG=warn in the suite's own vitest harness #13985) and5e2c04da7(test(objectql,verify,runtime): declare OS_REGISTRY_LOG=warn in each suite's own vitest harness #14016) — each declaringOS_REGISTRY_LOG=warnin a suite's vitest harness. That alone takes thesame five suites the card measured from ~45% to 86.6% structured,
by cutting a
[Registry]debug-console.logpopulation. Reproduced hereas a control before trusting anything else:
packages/rest, the onesuite of the five nothing touched, moved only +5.8% on
console.further: that population's own structured share (57.7%) is lower than the
five heaviest suites', but it's also a minority of total volume (30.3%
of all lines), and most of it barely writes anything at all — 35 of 72
packages under 30 lines total, 22 of those exactly 13 (pure reporter
boilerplate, nothing else). Structured lines need a kernel boot; a lot of
packages/services/*,packages/triggers/*and thinplugins/*suitesnever construct one.
A finding relevant to which seam triage picks (not a choice)
The premise re-verification found
new ObjectKernel()— no config — appears78 times across 55 files (verified at
54a972905, this branch mergedwith
origin/mainat99b4deba4), not only inpackages/verify's harness.packages/objectql/src/kernel-factory.ts:35has the identical shape, andobjectql alone contributes 18.3% of the structured total measured here. A
BootOptionsfield onpackages/verify's harness would quiet only suitesthat boot through that harness — not objectql's, nor most of the other ~53
call sites — without each being found and updated individually. An env-level
default read at the kernel/logger construction point (
NO_COLOR's existingpattern in the same file is the precedent) would cover all 78 call sites
without touching any of them. Doesn't choose a seam; changes what each one
would actually cost to reach the population it's meant to quiet.
Full per-package table, method, limits, the mechanism verification
(
packages/core/src/logger.tswriting straight toprocess.stdout/stderr,never through
console), and the complete Zone-2-D premise re-verificationare all in
docs/audits/2026-09-test-log-volume-census.md.Not superseded
#13517 covers the
consolepopulation and is untouched by this — the twocards measure different writers, as the original finding said.
Scope
scripts/qa/log-volume-census.mjs(theinstrument) and
docs/audits/2026-09-test-log-volume-census.md(thereading) only.
packages/specmeasured read-only — its owntestscript run, stdoutcaptured, nothing under it edited.
skip-changesetlabel is on and verified by read-back (documentation,size/l,skip-changeset) — the author's own read-back attempts hit theshared GraphQL rate-limit bucket and could not confirm it at the time.
Generated by Claude Code