finding: the engine's structured logger writes ~45k lines per test run that the console-chatter measurement never counted, and no declarative seam exists to quiet it #13986

Description

@zhuangjianguo

Found while re-measuring the console-chatter card (related to #13517 — that card is about the console population and is not addressed or superseded here).

The measurement

Re-measuring on origin/main eb649cb8bc, capturing each suite's combined stdout+stderr and classifying every line, produced a population the earlier measurement could not see. That one counted intercepted console linesconsole.* calls forwarded over vitest's RPC. The engine's structured logger writes to process.stdoutdirectly, so it was never on that path and was never counted, in either direction.

Lines per full suite run, classified:

suiteconsole-carriedstructured logger (TIMESTAMP LEVEL message)total stdout
packages/qa/dogfood41,85825,11866,976
packages/objectql5,34710,83116,178
packages/runtime2,0694,6586,727
packages/verify2,5743,0935,667
packages/rest3,9631,2905,253
total, 5 suites55,81144,990100,802

So the structured logger is ~45% of what these five suites actually write, and in packages/objectql it is the majority of the suite's output (10,831 of 16,178). The five suites here are the top of the console distribution; the remaining 67 packages were not re-run in this pass, so 44,990 is a floor for the repo, not the repo total.

The dominant shapes are engine lifecycle INFO at boot — Loading plugin: NAME (1,578 in dogfood), Plugin registered: NAME (1,585), Plugin loaded: NAME (1,466), Service 'NAME' … (840), the [security] seeding summaries (672+) — emitted once per boot, in suites that boot real apps many times.

Why this is not the same question as the console chatter

The console half has a declarative answer that already exists: OS_REGISTRY_LOG is @objectstack/objectql's own published seam (SchemaRegistryOptions.logLevel / REGISTRY_LOG_LEVELS), so a suite can ask for quiet from its own harness without anything shipped changing.

The structured-logger half has no equivalent seam:

  • packages/core/src/logger.ts reads no level from the environment — grepping process.env in it finds only NO_COLOR. The level is whatever the kernel's constructor was handed.
  • packages/verify/src/harness.ts's BootOptions (:97) declares no logger or log-level field, so the in-process harness the dogfood and verify suites boot through cannot pass one either.
  • packages/cli does have OS_LOG_LEVEL (src/utils/log-level.ts), but it is resolved in the CLI and handed to the kernel it spawns. Nothing reads it below that.

So quieting this population is not a configuration change a test author can make today — it needs a seam to exist first, either an env read in the kernel logger or a level field on BootOptions. Both are shipped-surface decisions, which is why this is filed as an observation rather than attempted.

Not claimed here

  • No urgency. Same cost shape as the console half: CI log volume, not correctness.
  • No recommendation on which seam is right, or whether the engine's boot-time INFO verbosity is correct as shipped. A reader of a production boot log may well want every one of these lines; that is exactly the judgement this observation is handing over rather than making.
  • Whether the same ratio holds across the other 67 packages is unmeasured.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
       blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
      }
      } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
      })();
      (function(){
      try {
      var __m = "github.com";
      var __re = new RegExp('^' + "github\\.com" + '
      
      Skip to content

      finding: the engine's structured logger writes ~45k lines per test run that the console-chatter measurement never counted, and no declarative seam exists to quiet it #13986

      Description

      @zhuangjianguo

      Found while re-measuring the console-chatter card (related to #13517 — that card is about the console population and is not addressed or superseded here).

      The measurement

      Re-measuring on origin/main eb649cb8bc, capturing each suite's combined stdout+stderr and classifying every line, produced a population the earlier measurement could not see. That one counted intercepted console linesconsole.* calls forwarded over vitest's RPC. The engine's structured logger writes to process.stdoutdirectly, so it was never on that path and was never counted, in either direction.

      Lines per full suite run, classified:

      suiteconsole-carriedstructured logger (TIMESTAMP LEVEL message)total stdout
      packages/qa/dogfood41,85825,11866,976
      packages/objectql5,34710,83116,178
      packages/runtime2,0694,6586,727
      packages/verify2,5743,0935,667
      packages/rest3,9631,2905,253
      total, 5 suites55,81144,990100,802

      So the structured logger is ~45% of what these five suites actually write, and in packages/objectql it is the majority of the suite's output (10,831 of 16,178). The five suites here are the top of the console distribution; the remaining 67 packages were not re-run in this pass, so 44,990 is a floor for the repo, not the repo total.

      The dominant shapes are engine lifecycle INFO at boot — Loading plugin: NAME (1,578 in dogfood), Plugin registered: NAME (1,585), Plugin loaded: NAME (1,466), Service 'NAME' … (840), the [security] seeding summaries (672+) — emitted once per boot, in suites that boot real apps many times.

      Why this is not the same question as the console chatter

      The console half has a declarative answer that already exists: OS_REGISTRY_LOG is @objectstack/objectql's own published seam (SchemaRegistryOptions.logLevel / REGISTRY_LOG_LEVELS), so a suite can ask for quiet from its own harness without anything shipped changing.

      The structured-logger half has no equivalent seam:

      • packages/core/src/logger.ts reads no level from the environment — grepping process.env in it finds only NO_COLOR. The level is whatever the kernel's constructor was handed.
      • packages/verify/src/harness.ts's BootOptions (:97) declares no logger or log-level field, so the in-process harness the dogfood and verify suites boot through cannot pass one either.
      • packages/cli does have OS_LOG_LEVEL (src/utils/log-level.ts), but it is resolved in the CLI and handed to the kernel it spawns. Nothing reads it below that.

      So quieting this population is not a configuration change a test author can make today — it needs a seam to exist first, either an env read in the kernel logger or a level field on BootOptions. Both are shipped-surface decisions, which is why this is filed as an observation rather than attempted.

      Not claimed here

      • No urgency. Same cost shape as the console half: CI log volume, not correctness.
      • No recommendation on which seam is right, or whether the engine's boot-time INFO verbosity is correct as shipped. A reader of a production boot log may well want every one of these lines; that is exactly the judgement this observation is handing over rather than making.
      • Whether the same ratio holds across the other 67 packages is unmeasured.

      Metadata

      Metadata

      Assignees

      No one assigned

        Type

        No type

        Projects

        No projects

          Milestone

          No milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
          Skip to content

          finding: the engine's structured logger writes ~45k lines per test run that the console-chatter measurement never counted, and no declarative seam exists to quiet it #13986

          Description

          @zhuangjianguo

          Found while re-measuring the console-chatter card (related to #13517 — that card is about the console population and is not addressed or superseded here).

          The measurement

          Re-measuring on origin/main eb649cb8bc, capturing each suite's combined stdout+stderr and classifying every line, produced a population the earlier measurement could not see. That one counted intercepted console linesconsole.* calls forwarded over vitest's RPC. The engine's structured logger writes to process.stdoutdirectly, so it was never on that path and was never counted, in either direction.

          Lines per full suite run, classified:

          suiteconsole-carriedstructured logger (TIMESTAMP LEVEL message)total stdout
          packages/qa/dogfood41,85825,11866,976
          packages/objectql5,34710,83116,178
          packages/runtime2,0694,6586,727
          packages/verify2,5743,0935,667
          packages/rest3,9631,2905,253
          total, 5 suites55,81144,990100,802

          So the structured logger is ~45% of what these five suites actually write, and in packages/objectql it is the majority of the suite's output (10,831 of 16,178). The five suites here are the top of the console distribution; the remaining 67 packages were not re-run in this pass, so 44,990 is a floor for the repo, not the repo total.

          The dominant shapes are engine lifecycle INFO at boot — Loading plugin: NAME (1,578 in dogfood), Plugin registered: NAME (1,585), Plugin loaded: NAME (1,466), Service 'NAME' … (840), the [security] seeding summaries (672+) — emitted once per boot, in suites that boot real apps many times.

          Why this is not the same question as the console chatter

          The console half has a declarative answer that already exists: OS_REGISTRY_LOG is @objectstack/objectql's own published seam (SchemaRegistryOptions.logLevel / REGISTRY_LOG_LEVELS), so a suite can ask for quiet from its own harness without anything shipped changing.

          The structured-logger half has no equivalent seam:

          • packages/core/src/logger.ts reads no level from the environment — grepping process.env in it finds only NO_COLOR. The level is whatever the kernel's constructor was handed.
          • packages/verify/src/harness.ts's BootOptions (:97) declares no logger or log-level field, so the in-process harness the dogfood and verify suites boot through cannot pass one either.
          • packages/cli does have OS_LOG_LEVEL (src/utils/log-level.ts), but it is resolved in the CLI and handed to the kernel it spawns. Nothing reads it below that.

          So quieting this population is not a configuration change a test author can make today — it needs a seam to exist first, either an env read in the kernel logger or a level field on BootOptions. Both are shipped-surface decisions, which is why this is filed as an observation rather than attempted.

          Not claimed here

          • No urgency. Same cost shape as the console half: CI log volume, not correctness.
          • No recommendation on which seam is right, or whether the engine's boot-time INFO verbosity is correct as shipped. A reader of a production boot log may well want every one of these lines; that is exactly the judgement this observation is handing over rather than making.
          • Whether the same ratio holds across the other 67 packages is unmeasured.

          Metadata

          Metadata

          Assignees

          No one assigned

            Type

            No type

            Projects

            No projects

              Milestone

              No milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
              Skip to content

              finding: the engine's structured logger writes ~45k lines per test run that the console-chatter measurement never counted, and no declarative seam exists to quiet it #13986

              Description

              @zhuangjianguo

              Found while re-measuring the console-chatter card (related to #13517 — that card is about the console population and is not addressed or superseded here).

              The measurement

              Re-measuring on origin/main eb649cb8bc, capturing each suite's combined stdout+stderr and classifying every line, produced a population the earlier measurement could not see. That one counted intercepted console linesconsole.* calls forwarded over vitest's RPC. The engine's structured logger writes to process.stdoutdirectly, so it was never on that path and was never counted, in either direction.

              Lines per full suite run, classified:

              suiteconsole-carriedstructured logger (TIMESTAMP LEVEL message)total stdout
              packages/qa/dogfood41,85825,11866,976
              packages/objectql5,34710,83116,178
              packages/runtime2,0694,6586,727
              packages/verify2,5743,0935,667
              packages/rest3,9631,2905,253
              total, 5 suites55,81144,990100,802

              So the structured logger is ~45% of what these five suites actually write, and in packages/objectql it is the majority of the suite's output (10,831 of 16,178). The five suites here are the top of the console distribution; the remaining 67 packages were not re-run in this pass, so 44,990 is a floor for the repo, not the repo total.

              The dominant shapes are engine lifecycle INFO at boot — Loading plugin: NAME (1,578 in dogfood), Plugin registered: NAME (1,585), Plugin loaded: NAME (1,466), Service 'NAME' … (840), the [security] seeding summaries (672+) — emitted once per boot, in suites that boot real apps many times.

              Why this is not the same question as the console chatter

              The console half has a declarative answer that already exists: OS_REGISTRY_LOG is @objectstack/objectql's own published seam (SchemaRegistryOptions.logLevel / REGISTRY_LOG_LEVELS), so a suite can ask for quiet from its own harness without anything shipped changing.

              The structured-logger half has no equivalent seam:

              • packages/core/src/logger.ts reads no level from the environment — grepping process.env in it finds only NO_COLOR. The level is whatever the kernel's constructor was handed.
              • packages/verify/src/harness.ts's BootOptions (:97) declares no logger or log-level field, so the in-process harness the dogfood and verify suites boot through cannot pass one either.
              • packages/cli does have OS_LOG_LEVEL (src/utils/log-level.ts), but it is resolved in the CLI and handed to the kernel it spawns. Nothing reads it below that.

              So quieting this population is not a configuration change a test author can make today — it needs a seam to exist first, either an env read in the kernel logger or a level field on BootOptions. Both are shipped-surface decisions, which is why this is filed as an observation rather than attempted.

              Not claimed here

              • No urgency. Same cost shape as the console half: CI log volume, not correctness.
              • No recommendation on which seam is right, or whether the engine's boot-time INFO verbosity is correct as shipped. A reader of a production boot log may well want every one of these lines; that is exactly the judgement this observation is handing over rather than making.
              • Whether the same ratio holds across the other 67 packages is unmeasured.

              Metadata

              Metadata

              Assignees

              No one assigned

                Type

                No type

                Projects

                No projects

                  Milestone

                  No milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions

                  , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
                  Skip to content

                  finding: the engine's structured logger writes ~45k lines per test run that the console-chatter measurement never counted, and no declarative seam exists to quiet it #13986

                  Description

                  @zhuangjianguo

                  Found while re-measuring the console-chatter card (related to #13517 — that card is about the console population and is not addressed or superseded here).

                  The measurement

                  Re-measuring on origin/main eb649cb8bc, capturing each suite's combined stdout+stderr and classifying every line, produced a population the earlier measurement could not see. That one counted intercepted console linesconsole.* calls forwarded over vitest's RPC. The engine's structured logger writes to process.stdoutdirectly, so it was never on that path and was never counted, in either direction.

                  Lines per full suite run, classified:

                  suiteconsole-carriedstructured logger (TIMESTAMP LEVEL message)total stdout
                  packages/qa/dogfood41,85825,11866,976
                  packages/objectql5,34710,83116,178
                  packages/runtime2,0694,6586,727
                  packages/verify2,5743,0935,667
                  packages/rest3,9631,2905,253
                  total, 5 suites55,81144,990100,802

                  So the structured logger is ~45% of what these five suites actually write, and in packages/objectql it is the majority of the suite's output (10,831 of 16,178). The five suites here are the top of the console distribution; the remaining 67 packages were not re-run in this pass, so 44,990 is a floor for the repo, not the repo total.

                  The dominant shapes are engine lifecycle INFO at boot — Loading plugin: NAME (1,578 in dogfood), Plugin registered: NAME (1,585), Plugin loaded: NAME (1,466), Service 'NAME' … (840), the [security] seeding summaries (672+) — emitted once per boot, in suites that boot real apps many times.

                  Why this is not the same question as the console chatter

                  The console half has a declarative answer that already exists: OS_REGISTRY_LOG is @objectstack/objectql's own published seam (SchemaRegistryOptions.logLevel / REGISTRY_LOG_LEVELS), so a suite can ask for quiet from its own harness without anything shipped changing.

                  The structured-logger half has no equivalent seam:

                  • packages/core/src/logger.ts reads no level from the environment — grepping process.env in it finds only NO_COLOR. The level is whatever the kernel's constructor was handed.
                  • packages/verify/src/harness.ts's BootOptions (:97) declares no logger or log-level field, so the in-process harness the dogfood and verify suites boot through cannot pass one either.
                  • packages/cli does have OS_LOG_LEVEL (src/utils/log-level.ts), but it is resolved in the CLI and handed to the kernel it spawns. Nothing reads it below that.

                  So quieting this population is not a configuration change a test author can make today — it needs a seam to exist first, either an env read in the kernel logger or a level field on BootOptions. Both are shipped-surface decisions, which is why this is filed as an observation rather than attempted.

                  Not claimed here

                  • No urgency. Same cost shape as the console half: CI log volume, not correctness.
                  • No recommendation on which seam is right, or whether the engine's boot-time INFO verbosity is correct as shipped. A reader of a production boot log may well want every one of these lines; that is exactly the judgement this observation is handing over rather than making.
                  • Whether the same ratio holds across the other 67 packages is unmeasured.

                  Metadata

                  Metadata

                  Assignees

                  No one assigned

                    Type

                    No type

                    Projects

                    No projects

                      Milestone

                      No milestone

                      Relationships

                      None yet

                      Development

                      No branches or pull requests

                      Issue actions

                      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
                      Skip to content

                      finding: the engine's structured logger writes ~45k lines per test run that the console-chatter measurement never counted, and no declarative seam exists to quiet it #13986

                      Description

                      @zhuangjianguo

                      Found while re-measuring the console-chatter card (related to #13517 — that card is about the console population and is not addressed or superseded here).

                      The measurement

                      Re-measuring on origin/main eb649cb8bc, capturing each suite's combined stdout+stderr and classifying every line, produced a population the earlier measurement could not see. That one counted intercepted console linesconsole.* calls forwarded over vitest's RPC. The engine's structured logger writes to process.stdoutdirectly, so it was never on that path and was never counted, in either direction.

                      Lines per full suite run, classified:

                      suiteconsole-carriedstructured logger (TIMESTAMP LEVEL message)total stdout
                      packages/qa/dogfood41,85825,11866,976
                      packages/objectql5,34710,83116,178
                      packages/runtime2,0694,6586,727
                      packages/verify2,5743,0935,667
                      packages/rest3,9631,2905,253
                      total, 5 suites55,81144,990100,802

                      So the structured logger is ~45% of what these five suites actually write, and in packages/objectql it is the majority of the suite's output (10,831 of 16,178). The five suites here are the top of the console distribution; the remaining 67 packages were not re-run in this pass, so 44,990 is a floor for the repo, not the repo total.

                      The dominant shapes are engine lifecycle INFO at boot — Loading plugin: NAME (1,578 in dogfood), Plugin registered: NAME (1,585), Plugin loaded: NAME (1,466), Service 'NAME' … (840), the [security] seeding summaries (672+) — emitted once per boot, in suites that boot real apps many times.

                      Why this is not the same question as the console chatter

                      The console half has a declarative answer that already exists: OS_REGISTRY_LOG is @objectstack/objectql's own published seam (SchemaRegistryOptions.logLevel / REGISTRY_LOG_LEVELS), so a suite can ask for quiet from its own harness without anything shipped changing.

                      The structured-logger half has no equivalent seam:

                      • packages/core/src/logger.ts reads no level from the environment — grepping process.env in it finds only NO_COLOR. The level is whatever the kernel's constructor was handed.
                      • packages/verify/src/harness.ts's BootOptions (:97) declares no logger or log-level field, so the in-process harness the dogfood and verify suites boot through cannot pass one either.
                      • packages/cli does have OS_LOG_LEVEL (src/utils/log-level.ts), but it is resolved in the CLI and handed to the kernel it spawns. Nothing reads it below that.

                      So quieting this population is not a configuration change a test author can make today — it needs a seam to exist first, either an env read in the kernel logger or a level field on BootOptions. Both are shipped-surface decisions, which is why this is filed as an observation rather than attempted.

                      Not claimed here

                      • No urgency. Same cost shape as the console half: CI log volume, not correctness.
                      • No recommendation on which seam is right, or whether the engine's boot-time INFO verbosity is correct as shipped. A reader of a production boot log may well want every one of these lines; that is exactly the judgement this observation is handing over rather than making.
                      • Whether the same ratio holds across the other 67 packages is unmeasured.

                      Metadata

                      Metadata

                      Assignees

                      No one assigned

                        Type

                        No type

                        Projects

                        No projects

                          Milestone

                          No milestone

                          Relationships

                          None yet

                          Development

                          No branches or pull requests

                          Issue actions

                          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
                          Skip to content

                          finding: the engine's structured logger writes ~45k lines per test run that the console-chatter measurement never counted, and no declarative seam exists to quiet it #13986

                          Description

                          @zhuangjianguo

                          Found while re-measuring the console-chatter card (related to #13517 — that card is about the console population and is not addressed or superseded here).

                          The measurement

                          Re-measuring on origin/main eb649cb8bc, capturing each suite's combined stdout+stderr and classifying every line, produced a population the earlier measurement could not see. That one counted intercepted console linesconsole.* calls forwarded over vitest's RPC. The engine's structured logger writes to process.stdoutdirectly, so it was never on that path and was never counted, in either direction.

                          Lines per full suite run, classified:

                          suiteconsole-carriedstructured logger (TIMESTAMP LEVEL message)total stdout
                          packages/qa/dogfood41,85825,11866,976
                          packages/objectql5,34710,83116,178
                          packages/runtime2,0694,6586,727
                          packages/verify2,5743,0935,667
                          packages/rest3,9631,2905,253
                          total, 5 suites55,81144,990100,802

                          So the structured logger is ~45% of what these five suites actually write, and in packages/objectql it is the majority of the suite's output (10,831 of 16,178). The five suites here are the top of the console distribution; the remaining 67 packages were not re-run in this pass, so 44,990 is a floor for the repo, not the repo total.

                          The dominant shapes are engine lifecycle INFO at boot — Loading plugin: NAME (1,578 in dogfood), Plugin registered: NAME (1,585), Plugin loaded: NAME (1,466), Service 'NAME' … (840), the [security] seeding summaries (672+) — emitted once per boot, in suites that boot real apps many times.

                          Why this is not the same question as the console chatter

                          The console half has a declarative answer that already exists: OS_REGISTRY_LOG is @objectstack/objectql's own published seam (SchemaRegistryOptions.logLevel / REGISTRY_LOG_LEVELS), so a suite can ask for quiet from its own harness without anything shipped changing.

                          The structured-logger half has no equivalent seam:

                          • packages/core/src/logger.ts reads no level from the environment — grepping process.env in it finds only NO_COLOR. The level is whatever the kernel's constructor was handed.
                          • packages/verify/src/harness.ts's BootOptions (:97) declares no logger or log-level field, so the in-process harness the dogfood and verify suites boot through cannot pass one either.
                          • packages/cli does have OS_LOG_LEVEL (src/utils/log-level.ts), but it is resolved in the CLI and handed to the kernel it spawns. Nothing reads it below that.

                          So quieting this population is not a configuration change a test author can make today — it needs a seam to exist first, either an env read in the kernel logger or a level field on BootOptions. Both are shipped-surface decisions, which is why this is filed as an observation rather than attempted.

                          Not claimed here

                          • No urgency. Same cost shape as the console half: CI log volume, not correctness.
                          • No recommendation on which seam is right, or whether the engine's boot-time INFO verbosity is correct as shipped. A reader of a production boot log may well want every one of these lines; that is exactly the judgement this observation is handing over rather than making.
                          • Whether the same ratio holds across the other 67 packages is unmeasured.

                          Metadata

                          Metadata

                          Assignees

                          No one assigned

                            Type

                            No type

                            Projects

                            No projects

                              Milestone

                              No milestone

                              Relationships

                              None yet

                              Development

                              No branches or pull requests

                              Issue actions

                              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
                              Skip to content

                              finding: the engine's structured logger writes ~45k lines per test run that the console-chatter measurement never counted, and no declarative seam exists to quiet it #13986

                              Description

                              @zhuangjianguo

                              Found while re-measuring the console-chatter card (related to #13517 — that card is about the console population and is not addressed or superseded here).

                              The measurement

                              Re-measuring on origin/main eb649cb8bc, capturing each suite's combined stdout+stderr and classifying every line, produced a population the earlier measurement could not see. That one counted intercepted console linesconsole.* calls forwarded over vitest's RPC. The engine's structured logger writes to process.stdoutdirectly, so it was never on that path and was never counted, in either direction.

                              Lines per full suite run, classified:

                              suiteconsole-carriedstructured logger (TIMESTAMP LEVEL message)total stdout
                              packages/qa/dogfood41,85825,11866,976
                              packages/objectql5,34710,83116,178
                              packages/runtime2,0694,6586,727
                              packages/verify2,5743,0935,667
                              packages/rest3,9631,2905,253
                              total, 5 suites55,81144,990100,802

                              So the structured logger is ~45% of what these five suites actually write, and in packages/objectql it is the majority of the suite's output (10,831 of 16,178). The five suites here are the top of the console distribution; the remaining 67 packages were not re-run in this pass, so 44,990 is a floor for the repo, not the repo total.

                              The dominant shapes are engine lifecycle INFO at boot — Loading plugin: NAME (1,578 in dogfood), Plugin registered: NAME (1,585), Plugin loaded: NAME (1,466), Service 'NAME' … (840), the [security] seeding summaries (672+) — emitted once per boot, in suites that boot real apps many times.

                              Why this is not the same question as the console chatter

                              The console half has a declarative answer that already exists: OS_REGISTRY_LOG is @objectstack/objectql's own published seam (SchemaRegistryOptions.logLevel / REGISTRY_LOG_LEVELS), so a suite can ask for quiet from its own harness without anything shipped changing.

                              The structured-logger half has no equivalent seam:

                              • packages/core/src/logger.ts reads no level from the environment — grepping process.env in it finds only NO_COLOR. The level is whatever the kernel's constructor was handed.
                              • packages/verify/src/harness.ts's BootOptions (:97) declares no logger or log-level field, so the in-process harness the dogfood and verify suites boot through cannot pass one either.
                              • packages/cli does have OS_LOG_LEVEL (src/utils/log-level.ts), but it is resolved in the CLI and handed to the kernel it spawns. Nothing reads it below that.

                              So quieting this population is not a configuration change a test author can make today — it needs a seam to exist first, either an env read in the kernel logger or a level field on BootOptions. Both are shipped-surface decisions, which is why this is filed as an observation rather than attempted.

                              Not claimed here

                              • No urgency. Same cost shape as the console half: CI log volume, not correctness.
                              • No recommendation on which seam is right, or whether the engine's boot-time INFO verbosity is correct as shipped. A reader of a production boot log may well want every one of these lines; that is exactly the judgement this observation is handing over rather than making.
                              • Whether the same ratio holds across the other 67 packages is unmeasured.

                              Metadata

                              Metadata

                              Assignees

                              No one assigned

                                Type

                                No type

                                Projects

                                No projects

                                  Milestone

                                  No milestone

                                  Relationships

                                  None yet

                                  Development

                                  No branches or pull requests

                                  Issue actions