Intercept .js and .jsx — no new grammar needed #8

Description

@HackPoint

What

Reads of .js and .jsx are not intercepted, so a large JavaScript file is billed at full cost
even though Lumen already carries a grammar that can outline it. It is the cheapest item left on the
coverage backlog: extension plumbing, not new parsing.

Evidence

  • Live metering ledger: 97,678 tokens across 20 built-in reads of .js files at or above the
    300-line threshold, over 17 distinct files, the largest 1,232 lines. 57 .js reads in total;
    most fall below the threshold and are out of scope.
  • tree-sitter-typescript 0.23.2 is already a dependency of lumen-core. Its TypeScript grammar is
    a syntactic superset of JavaScript; its TSX grammar handles JSX.
  • crates/lumen-core/queries/typescript-tags.scm already captures class_declaration,
    function_declaration and method_definition — the node kinds JavaScript parses to under that
    grammar.
  • Lists to change: crates/lumen-core/src/coverage.rs:32 (SOURCE_EXTS) and :41
    (INTERCEPTED_SOURCE_EXTS), plus both copies of the hooks' own list —
    .claude/hooks/lumen_read_intercept.sh:118 and the INTERCEPT_TEMPLATE the installer writes,
    lumenator/src-tauri/src/setup.rs:1266. Leaving the second one out recreates the drift
    coverage.rs was written to end.
  • Interception is retroactive in the ledger metric, and this is the part that bites.
    coverage::classify tests today's INTERCEPTED_SOURCE_EXTS against every historical row, so the
    moment js enters that list the 20 above-threshold .js reads already recorded reclassify from
    UncoveredKind to Optimizable — which is precisely what leaked counts.
    crates/lumen-mcp/tests/efficiency.rs:585 asserts leaked == 0 across all rows with no era
    boundary, so that assertion fails on any machine carrying this ledger until the check is
    reconciled; SIGNED_SINCE at :439 is the existing precedent for drawing such a boundary.
    crates/lumen-core/src/coverage.rs:181 likewise asserts a.js at 500 lines is UncoveredKind,
    and has to be rewritten in the same commit.
  • The repository corpus holds no real .js file at or above 300 lines, so this must be validated
    with fixtures rather than the corpus.

Not free. The mts/cts precedent is supported by the tools but deliberately not intercepted,
because interception changes which reads get diverted; the 97,678 tokens only land if js/jsx
enter both lists, which accepts that. Both known parsing failure modes degrade rather than break: a
mis-parsed file yields ERROR nodes, which the outline builder skips and the ranked arm declines as
NoDefs; minified bundles are single-line and never reach the threshold. The ledger
reclassification above is not a degradation — it is a test that goes red by construction, and
deciding how to reconcile it is part of this change rather than a surprise to discover afterwards.

Acceptance criteria

  • lumen_core::structure::detect_lang maps js, mjs, cjs to TypeScript and jsx to Tsx.
  • lumen_core::ranked::TagLang::detect returns the same mapping for those extensions.
  • js and jsx appear in SOURCE_EXTS, in INTERCEPTED_SOURCE_EXTS and in both hook lists;
    the existing superset test still passes, and coverage.rs:181 is updated to assert the new
    classification instead of the old one.
  • A .js fixture with a class, a function and a method outlines all three names, with
    returned_tokens < full_tokens.
  • A .jsx fixture with a component outlines its name, with returned_tokens < full_tokens.
  • The leak check in crates/lumen-mcp/tests/efficiency.rs is reconciled deliberately —
    reads recorded before .js was covered are distinguished from reads after it — and only then
    does the efficiency test report leaked as 0.
  • .js leaves the uncovered-kind rows because it moved to the intercepted side, not because
    past reads were relabelled as defects.
  • No new entry is added to any Cargo.toml.

How to test

cd /path/to/lumen
cargo test --release -p lumen-core structure
cargo test --release -p lumen-core coverage
cargo test --release -p lumen-mcp --test efficiency -- --nocapture
cargo tree -p lumen-core | grep tree-sitter

All three test commands must pass with the change complete — fixtures included, and with
coverage.rs:181 and the leak check updated as part of it. Run against unmodified assertions on a
machine that carries the ledger above, the second and third commands fail by construction, so a red
run there is the expected starting point rather than a regression. The efficiency run prints its
table: after reconciliation leaked must read 0 and .js must be absent from the uncovered-kind
rows. cargo tree must list the same grammars as before.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    coverageFile kinds the optimizer does not interceptenhancementNew feature or request

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e 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

      Intercept .js and .jsx — no new grammar needed #8

      Description

      @HackPoint

      What

      Reads of .js and .jsx are not intercepted, so a large JavaScript file is billed at full cost
      even though Lumen already carries a grammar that can outline it. It is the cheapest item left on the
      coverage backlog: extension plumbing, not new parsing.

      Evidence

      • Live metering ledger: 97,678 tokens across 20 built-in reads of .js files at or above the
        300-line threshold, over 17 distinct files, the largest 1,232 lines. 57 .js reads in total;
        most fall below the threshold and are out of scope.
      • tree-sitter-typescript 0.23.2 is already a dependency of lumen-core. Its TypeScript grammar is
        a syntactic superset of JavaScript; its TSX grammar handles JSX.
      • crates/lumen-core/queries/typescript-tags.scm already captures class_declaration,
        function_declaration and method_definition — the node kinds JavaScript parses to under that
        grammar.
      • Lists to change: crates/lumen-core/src/coverage.rs:32 (SOURCE_EXTS) and :41
        (INTERCEPTED_SOURCE_EXTS), plus both copies of the hooks' own list —
        .claude/hooks/lumen_read_intercept.sh:118 and the INTERCEPT_TEMPLATE the installer writes,
        lumenator/src-tauri/src/setup.rs:1266. Leaving the second one out recreates the drift
        coverage.rs was written to end.
      • Interception is retroactive in the ledger metric, and this is the part that bites.
        coverage::classify tests today's INTERCEPTED_SOURCE_EXTS against every historical row, so the
        moment js enters that list the 20 above-threshold .js reads already recorded reclassify from
        UncoveredKind to Optimizable — which is precisely what leaked counts.
        crates/lumen-mcp/tests/efficiency.rs:585 asserts leaked == 0 across all rows with no era
        boundary, so that assertion fails on any machine carrying this ledger until the check is
        reconciled; SIGNED_SINCE at :439 is the existing precedent for drawing such a boundary.
        crates/lumen-core/src/coverage.rs:181 likewise asserts a.js at 500 lines is UncoveredKind,
        and has to be rewritten in the same commit.
      • The repository corpus holds no real .js file at or above 300 lines, so this must be validated
        with fixtures rather than the corpus.

      Not free. The mts/cts precedent is supported by the tools but deliberately not intercepted,
      because interception changes which reads get diverted; the 97,678 tokens only land if js/jsx
      enter both lists, which accepts that. Both known parsing failure modes degrade rather than break: a
      mis-parsed file yields ERROR nodes, which the outline builder skips and the ranked arm declines as
      NoDefs; minified bundles are single-line and never reach the threshold. The ledger
      reclassification above is not a degradation — it is a test that goes red by construction, and
      deciding how to reconcile it is part of this change rather than a surprise to discover afterwards.

      Acceptance criteria

      • lumen_core::structure::detect_lang maps js, mjs, cjs to TypeScript and jsx to Tsx.
      • lumen_core::ranked::TagLang::detect returns the same mapping for those extensions.
      • js and jsx appear in SOURCE_EXTS, in INTERCEPTED_SOURCE_EXTS and in both hook lists;
        the existing superset test still passes, and coverage.rs:181 is updated to assert the new
        classification instead of the old one.
      • A .js fixture with a class, a function and a method outlines all three names, with
        returned_tokens < full_tokens.
      • A .jsx fixture with a component outlines its name, with returned_tokens < full_tokens.
      • The leak check in crates/lumen-mcp/tests/efficiency.rs is reconciled deliberately —
        reads recorded before .js was covered are distinguished from reads after it — and only then
        does the efficiency test report leaked as 0.
      • .js leaves the uncovered-kind rows because it moved to the intercepted side, not because
        past reads were relabelled as defects.
      • No new entry is added to any Cargo.toml.

      How to test

      cd /path/to/lumen
      cargo test --release -p lumen-core structure
      cargo test --release -p lumen-core coverage
      cargo test --release -p lumen-mcp --test efficiency -- --nocapture
      cargo tree -p lumen-core | grep tree-sitter

      All three test commands must pass with the change complete — fixtures included, and with
      coverage.rs:181 and the leak check updated as part of it. Run against unmodified assertions on a
      machine that carries the ledger above, the second and third commands fail by construction, so a red
      run there is the expected starting point rather than a regression. The efficiency run prints its
      table: after reconciliation leaked must read 0 and .js must be absent from the uncovered-kind
      rows. cargo tree must list the same grammars as before.

      Activity

      Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

      Metadata

      Metadata

      Assignees

      No one assigned

        Labels

        coverageFile kinds the optimizer does not interceptenhancementNew feature or request

        Projects

        No projects

          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

          Intercept .js and .jsx — no new grammar needed #8

          Description

          @HackPoint

          What

          Reads of .js and .jsx are not intercepted, so a large JavaScript file is billed at full cost
          even though Lumen already carries a grammar that can outline it. It is the cheapest item left on the
          coverage backlog: extension plumbing, not new parsing.

          Evidence

          • Live metering ledger: 97,678 tokens across 20 built-in reads of .js files at or above the
            300-line threshold, over 17 distinct files, the largest 1,232 lines. 57 .js reads in total;
            most fall below the threshold and are out of scope.
          • tree-sitter-typescript 0.23.2 is already a dependency of lumen-core. Its TypeScript grammar is
            a syntactic superset of JavaScript; its TSX grammar handles JSX.
          • crates/lumen-core/queries/typescript-tags.scm already captures class_declaration,
            function_declaration and method_definition — the node kinds JavaScript parses to under that
            grammar.
          • Lists to change: crates/lumen-core/src/coverage.rs:32 (SOURCE_EXTS) and :41
            (INTERCEPTED_SOURCE_EXTS), plus both copies of the hooks' own list —
            .claude/hooks/lumen_read_intercept.sh:118 and the INTERCEPT_TEMPLATE the installer writes,
            lumenator/src-tauri/src/setup.rs:1266. Leaving the second one out recreates the drift
            coverage.rs was written to end.
          • Interception is retroactive in the ledger metric, and this is the part that bites.
            coverage::classify tests today's INTERCEPTED_SOURCE_EXTS against every historical row, so the
            moment js enters that list the 20 above-threshold .js reads already recorded reclassify from
            UncoveredKind to Optimizable — which is precisely what leaked counts.
            crates/lumen-mcp/tests/efficiency.rs:585 asserts leaked == 0 across all rows with no era
            boundary, so that assertion fails on any machine carrying this ledger until the check is
            reconciled; SIGNED_SINCE at :439 is the existing precedent for drawing such a boundary.
            crates/lumen-core/src/coverage.rs:181 likewise asserts a.js at 500 lines is UncoveredKind,
            and has to be rewritten in the same commit.
          • The repository corpus holds no real .js file at or above 300 lines, so this must be validated
            with fixtures rather than the corpus.

          Not free. The mts/cts precedent is supported by the tools but deliberately not intercepted,
          because interception changes which reads get diverted; the 97,678 tokens only land if js/jsx
          enter both lists, which accepts that. Both known parsing failure modes degrade rather than break: a
          mis-parsed file yields ERROR nodes, which the outline builder skips and the ranked arm declines as
          NoDefs; minified bundles are single-line and never reach the threshold. The ledger
          reclassification above is not a degradation — it is a test that goes red by construction, and
          deciding how to reconcile it is part of this change rather than a surprise to discover afterwards.

          Acceptance criteria

          • lumen_core::structure::detect_lang maps js, mjs, cjs to TypeScript and jsx to Tsx.
          • lumen_core::ranked::TagLang::detect returns the same mapping for those extensions.
          • js and jsx appear in SOURCE_EXTS, in INTERCEPTED_SOURCE_EXTS and in both hook lists;
            the existing superset test still passes, and coverage.rs:181 is updated to assert the new
            classification instead of the old one.
          • A .js fixture with a class, a function and a method outlines all three names, with
            returned_tokens < full_tokens.
          • A .jsx fixture with a component outlines its name, with returned_tokens < full_tokens.
          • The leak check in crates/lumen-mcp/tests/efficiency.rs is reconciled deliberately —
            reads recorded before .js was covered are distinguished from reads after it — and only then
            does the efficiency test report leaked as 0.
          • .js leaves the uncovered-kind rows because it moved to the intercepted side, not because
            past reads were relabelled as defects.
          • No new entry is added to any Cargo.toml.

          How to test

          cd /path/to/lumen
          cargo test --release -p lumen-core structure
          cargo test --release -p lumen-core coverage
          cargo test --release -p lumen-mcp --test efficiency -- --nocapture
          cargo tree -p lumen-core | grep tree-sitter

          All three test commands must pass with the change complete — fixtures included, and with
          coverage.rs:181 and the leak check updated as part of it. Run against unmodified assertions on a
          machine that carries the ledger above, the second and third commands fail by construction, so a red
          run there is the expected starting point rather than a regression. The efficiency run prints its
          table: after reconciliation leaked must read 0 and .js must be absent from the uncovered-kind
          rows. cargo tree must list the same grammars as before.

          Activity

          Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

          Metadata

          Metadata

          Assignees

          No one assigned

            Labels

            coverageFile kinds the optimizer does not interceptenhancementNew feature or request

            Projects

            No projects

              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 \u003e 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

              Intercept .js and .jsx — no new grammar needed #8

              Description

              @HackPoint

              What

              Reads of .js and .jsx are not intercepted, so a large JavaScript file is billed at full cost
              even though Lumen already carries a grammar that can outline it. It is the cheapest item left on the
              coverage backlog: extension plumbing, not new parsing.

              Evidence

              • Live metering ledger: 97,678 tokens across 20 built-in reads of .js files at or above the
                300-line threshold, over 17 distinct files, the largest 1,232 lines. 57 .js reads in total;
                most fall below the threshold and are out of scope.
              • tree-sitter-typescript 0.23.2 is already a dependency of lumen-core. Its TypeScript grammar is
                a syntactic superset of JavaScript; its TSX grammar handles JSX.
              • crates/lumen-core/queries/typescript-tags.scm already captures class_declaration,
                function_declaration and method_definition — the node kinds JavaScript parses to under that
                grammar.
              • Lists to change: crates/lumen-core/src/coverage.rs:32 (SOURCE_EXTS) and :41
                (INTERCEPTED_SOURCE_EXTS), plus both copies of the hooks' own list —
                .claude/hooks/lumen_read_intercept.sh:118 and the INTERCEPT_TEMPLATE the installer writes,
                lumenator/src-tauri/src/setup.rs:1266. Leaving the second one out recreates the drift
                coverage.rs was written to end.
              • Interception is retroactive in the ledger metric, and this is the part that bites.
                coverage::classify tests today's INTERCEPTED_SOURCE_EXTS against every historical row, so the
                moment js enters that list the 20 above-threshold .js reads already recorded reclassify from
                UncoveredKind to Optimizable — which is precisely what leaked counts.
                crates/lumen-mcp/tests/efficiency.rs:585 asserts leaked == 0 across all rows with no era
                boundary, so that assertion fails on any machine carrying this ledger until the check is
                reconciled; SIGNED_SINCE at :439 is the existing precedent for drawing such a boundary.
                crates/lumen-core/src/coverage.rs:181 likewise asserts a.js at 500 lines is UncoveredKind,
                and has to be rewritten in the same commit.
              • The repository corpus holds no real .js file at or above 300 lines, so this must be validated
                with fixtures rather than the corpus.

              Not free. The mts/cts precedent is supported by the tools but deliberately not intercepted,
              because interception changes which reads get diverted; the 97,678 tokens only land if js/jsx
              enter both lists, which accepts that. Both known parsing failure modes degrade rather than break: a
              mis-parsed file yields ERROR nodes, which the outline builder skips and the ranked arm declines as
              NoDefs; minified bundles are single-line and never reach the threshold. The ledger
              reclassification above is not a degradation — it is a test that goes red by construction, and
              deciding how to reconcile it is part of this change rather than a surprise to discover afterwards.

              Acceptance criteria

              • lumen_core::structure::detect_lang maps js, mjs, cjs to TypeScript and jsx to Tsx.
              • lumen_core::ranked::TagLang::detect returns the same mapping for those extensions.
              • js and jsx appear in SOURCE_EXTS, in INTERCEPTED_SOURCE_EXTS and in both hook lists;
                the existing superset test still passes, and coverage.rs:181 is updated to assert the new
                classification instead of the old one.
              • A .js fixture with a class, a function and a method outlines all three names, with
                returned_tokens < full_tokens.
              • A .jsx fixture with a component outlines its name, with returned_tokens < full_tokens.
              • The leak check in crates/lumen-mcp/tests/efficiency.rs is reconciled deliberately —
                reads recorded before .js was covered are distinguished from reads after it — and only then
                does the efficiency test report leaked as 0.
              • .js leaves the uncovered-kind rows because it moved to the intercepted side, not because
                past reads were relabelled as defects.
              • No new entry is added to any Cargo.toml.

              How to test

              cd /path/to/lumen
              cargo test --release -p lumen-core structure
              cargo test --release -p lumen-core coverage
              cargo test --release -p lumen-mcp --test efficiency -- --nocapture
              cargo tree -p lumen-core | grep tree-sitter

              All three test commands must pass with the change complete — fixtures included, and with
              coverage.rs:181 and the leak check updated as part of it. Run against unmodified assertions on a
              machine that carries the ledger above, the second and third commands fail by construction, so a red
              run there is the expected starting point rather than a regression. The efficiency run prints its
              table: after reconciliation leaked must read 0 and .js must be absent from the uncovered-kind
              rows. cargo tree must list the same grammars as before.

              Activity

              Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

              Metadata

              Metadata

              Assignees

              No one assigned

                Labels

                coverageFile kinds the optimizer does not interceptenhancementNew feature or request

                Projects

                No projects

                  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

                  Intercept .js and .jsx — no new grammar needed #8

                  Description

                  @HackPoint

                  What

                  Reads of .js and .jsx are not intercepted, so a large JavaScript file is billed at full cost
                  even though Lumen already carries a grammar that can outline it. It is the cheapest item left on the
                  coverage backlog: extension plumbing, not new parsing.

                  Evidence

                  • Live metering ledger: 97,678 tokens across 20 built-in reads of .js files at or above the
                    300-line threshold, over 17 distinct files, the largest 1,232 lines. 57 .js reads in total;
                    most fall below the threshold and are out of scope.
                  • tree-sitter-typescript 0.23.2 is already a dependency of lumen-core. Its TypeScript grammar is
                    a syntactic superset of JavaScript; its TSX grammar handles JSX.
                  • crates/lumen-core/queries/typescript-tags.scm already captures class_declaration,
                    function_declaration and method_definition — the node kinds JavaScript parses to under that
                    grammar.
                  • Lists to change: crates/lumen-core/src/coverage.rs:32 (SOURCE_EXTS) and :41
                    (INTERCEPTED_SOURCE_EXTS), plus both copies of the hooks' own list —
                    .claude/hooks/lumen_read_intercept.sh:118 and the INTERCEPT_TEMPLATE the installer writes,
                    lumenator/src-tauri/src/setup.rs:1266. Leaving the second one out recreates the drift
                    coverage.rs was written to end.
                  • Interception is retroactive in the ledger metric, and this is the part that bites.
                    coverage::classify tests today's INTERCEPTED_SOURCE_EXTS against every historical row, so the
                    moment js enters that list the 20 above-threshold .js reads already recorded reclassify from
                    UncoveredKind to Optimizable — which is precisely what leaked counts.
                    crates/lumen-mcp/tests/efficiency.rs:585 asserts leaked == 0 across all rows with no era
                    boundary, so that assertion fails on any machine carrying this ledger until the check is
                    reconciled; SIGNED_SINCE at :439 is the existing precedent for drawing such a boundary.
                    crates/lumen-core/src/coverage.rs:181 likewise asserts a.js at 500 lines is UncoveredKind,
                    and has to be rewritten in the same commit.
                  • The repository corpus holds no real .js file at or above 300 lines, so this must be validated
                    with fixtures rather than the corpus.

                  Not free. The mts/cts precedent is supported by the tools but deliberately not intercepted,
                  because interception changes which reads get diverted; the 97,678 tokens only land if js/jsx
                  enter both lists, which accepts that. Both known parsing failure modes degrade rather than break: a
                  mis-parsed file yields ERROR nodes, which the outline builder skips and the ranked arm declines as
                  NoDefs; minified bundles are single-line and never reach the threshold. The ledger
                  reclassification above is not a degradation — it is a test that goes red by construction, and
                  deciding how to reconcile it is part of this change rather than a surprise to discover afterwards.

                  Acceptance criteria

                  • lumen_core::structure::detect_lang maps js, mjs, cjs to TypeScript and jsx to Tsx.
                  • lumen_core::ranked::TagLang::detect returns the same mapping for those extensions.
                  • js and jsx appear in SOURCE_EXTS, in INTERCEPTED_SOURCE_EXTS and in both hook lists;
                    the existing superset test still passes, and coverage.rs:181 is updated to assert the new
                    classification instead of the old one.
                  • A .js fixture with a class, a function and a method outlines all three names, with
                    returned_tokens < full_tokens.
                  • A .jsx fixture with a component outlines its name, with returned_tokens < full_tokens.
                  • The leak check in crates/lumen-mcp/tests/efficiency.rs is reconciled deliberately —
                    reads recorded before .js was covered are distinguished from reads after it — and only then
                    does the efficiency test report leaked as 0.
                  • .js leaves the uncovered-kind rows because it moved to the intercepted side, not because
                    past reads were relabelled as defects.
                  • No new entry is added to any Cargo.toml.

                  How to test

                  cd /path/to/lumen
                  cargo test --release -p lumen-core structure
                  cargo test --release -p lumen-core coverage
                  cargo test --release -p lumen-mcp --test efficiency -- --nocapture
                  cargo tree -p lumen-core | grep tree-sitter

                  All three test commands must pass with the change complete — fixtures included, and with
                  coverage.rs:181 and the leak check updated as part of it. Run against unmodified assertions on a
                  machine that carries the ledger above, the second and third commands fail by construction, so a red
                  run there is the expected starting point rather than a regression. The efficiency run prints its
                  table: after reconciliation leaked must read 0 and .js must be absent from the uncovered-kind
                  rows. cargo tree must list the same grammars as before.

                  Activity

                  Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

                  Metadata

                  Metadata

                  Assignees

                  No one assigned

                    Labels

                    coverageFile kinds the optimizer does not interceptenhancementNew feature or request

                    Projects

                    No projects

                      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

                      Intercept .js and .jsx — no new grammar needed #8

                      Description

                      @HackPoint

                      What

                      Reads of .js and .jsx are not intercepted, so a large JavaScript file is billed at full cost
                      even though Lumen already carries a grammar that can outline it. It is the cheapest item left on the
                      coverage backlog: extension plumbing, not new parsing.

                      Evidence

                      • Live metering ledger: 97,678 tokens across 20 built-in reads of .js files at or above the
                        300-line threshold, over 17 distinct files, the largest 1,232 lines. 57 .js reads in total;
                        most fall below the threshold and are out of scope.
                      • tree-sitter-typescript 0.23.2 is already a dependency of lumen-core. Its TypeScript grammar is
                        a syntactic superset of JavaScript; its TSX grammar handles JSX.
                      • crates/lumen-core/queries/typescript-tags.scm already captures class_declaration,
                        function_declaration and method_definition — the node kinds JavaScript parses to under that
                        grammar.
                      • Lists to change: crates/lumen-core/src/coverage.rs:32 (SOURCE_EXTS) and :41
                        (INTERCEPTED_SOURCE_EXTS), plus both copies of the hooks' own list —
                        .claude/hooks/lumen_read_intercept.sh:118 and the INTERCEPT_TEMPLATE the installer writes,
                        lumenator/src-tauri/src/setup.rs:1266. Leaving the second one out recreates the drift
                        coverage.rs was written to end.
                      • Interception is retroactive in the ledger metric, and this is the part that bites.
                        coverage::classify tests today's INTERCEPTED_SOURCE_EXTS against every historical row, so the
                        moment js enters that list the 20 above-threshold .js reads already recorded reclassify from
                        UncoveredKind to Optimizable — which is precisely what leaked counts.
                        crates/lumen-mcp/tests/efficiency.rs:585 asserts leaked == 0 across all rows with no era
                        boundary, so that assertion fails on any machine carrying this ledger until the check is
                        reconciled; SIGNED_SINCE at :439 is the existing precedent for drawing such a boundary.
                        crates/lumen-core/src/coverage.rs:181 likewise asserts a.js at 500 lines is UncoveredKind,
                        and has to be rewritten in the same commit.
                      • The repository corpus holds no real .js file at or above 300 lines, so this must be validated
                        with fixtures rather than the corpus.

                      Not free. The mts/cts precedent is supported by the tools but deliberately not intercepted,
                      because interception changes which reads get diverted; the 97,678 tokens only land if js/jsx
                      enter both lists, which accepts that. Both known parsing failure modes degrade rather than break: a
                      mis-parsed file yields ERROR nodes, which the outline builder skips and the ranked arm declines as
                      NoDefs; minified bundles are single-line and never reach the threshold. The ledger
                      reclassification above is not a degradation — it is a test that goes red by construction, and
                      deciding how to reconcile it is part of this change rather than a surprise to discover afterwards.

                      Acceptance criteria

                      • lumen_core::structure::detect_lang maps js, mjs, cjs to TypeScript and jsx to Tsx.
                      • lumen_core::ranked::TagLang::detect returns the same mapping for those extensions.
                      • js and jsx appear in SOURCE_EXTS, in INTERCEPTED_SOURCE_EXTS and in both hook lists;
                        the existing superset test still passes, and coverage.rs:181 is updated to assert the new
                        classification instead of the old one.
                      • A .js fixture with a class, a function and a method outlines all three names, with
                        returned_tokens < full_tokens.
                      • A .jsx fixture with a component outlines its name, with returned_tokens < full_tokens.
                      • The leak check in crates/lumen-mcp/tests/efficiency.rs is reconciled deliberately —
                        reads recorded before .js was covered are distinguished from reads after it — and only then
                        does the efficiency test report leaked as 0.
                      • .js leaves the uncovered-kind rows because it moved to the intercepted side, not because
                        past reads were relabelled as defects.
                      • No new entry is added to any Cargo.toml.

                      How to test

                      cd /path/to/lumen
                      cargo test --release -p lumen-core structure
                      cargo test --release -p lumen-core coverage
                      cargo test --release -p lumen-mcp --test efficiency -- --nocapture
                      cargo tree -p lumen-core | grep tree-sitter

                      All three test commands must pass with the change complete — fixtures included, and with
                      coverage.rs:181 and the leak check updated as part of it. Run against unmodified assertions on a
                      machine that carries the ledger above, the second and third commands fail by construction, so a red
                      run there is the expected starting point rather than a regression. The efficiency run prints its
                      table: after reconciliation leaked must read 0 and .js must be absent from the uncovered-kind
                      rows. cargo tree must list the same grammars as before.

                      Activity

                      Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

                      Metadata

                      Metadata

                      Assignees

                      No one assigned

                        Labels

                        coverageFile kinds the optimizer does not interceptenhancementNew feature or request

                        Projects

                        No projects

                          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

                          Intercept .js and .jsx — no new grammar needed #8

                          Description

                          @HackPoint

                          What

                          Reads of .js and .jsx are not intercepted, so a large JavaScript file is billed at full cost
                          even though Lumen already carries a grammar that can outline it. It is the cheapest item left on the
                          coverage backlog: extension plumbing, not new parsing.

                          Evidence

                          • Live metering ledger: 97,678 tokens across 20 built-in reads of .js files at or above the
                            300-line threshold, over 17 distinct files, the largest 1,232 lines. 57 .js reads in total;
                            most fall below the threshold and are out of scope.
                          • tree-sitter-typescript 0.23.2 is already a dependency of lumen-core. Its TypeScript grammar is
                            a syntactic superset of JavaScript; its TSX grammar handles JSX.
                          • crates/lumen-core/queries/typescript-tags.scm already captures class_declaration,
                            function_declaration and method_definition — the node kinds JavaScript parses to under that
                            grammar.
                          • Lists to change: crates/lumen-core/src/coverage.rs:32 (SOURCE_EXTS) and :41
                            (INTERCEPTED_SOURCE_EXTS), plus both copies of the hooks' own list —
                            .claude/hooks/lumen_read_intercept.sh:118 and the INTERCEPT_TEMPLATE the installer writes,
                            lumenator/src-tauri/src/setup.rs:1266. Leaving the second one out recreates the drift
                            coverage.rs was written to end.
                          • Interception is retroactive in the ledger metric, and this is the part that bites.
                            coverage::classify tests today's INTERCEPTED_SOURCE_EXTS against every historical row, so the
                            moment js enters that list the 20 above-threshold .js reads already recorded reclassify from
                            UncoveredKind to Optimizable — which is precisely what leaked counts.
                            crates/lumen-mcp/tests/efficiency.rs:585 asserts leaked == 0 across all rows with no era
                            boundary, so that assertion fails on any machine carrying this ledger until the check is
                            reconciled; SIGNED_SINCE at :439 is the existing precedent for drawing such a boundary.
                            crates/lumen-core/src/coverage.rs:181 likewise asserts a.js at 500 lines is UncoveredKind,
                            and has to be rewritten in the same commit.
                          • The repository corpus holds no real .js file at or above 300 lines, so this must be validated
                            with fixtures rather than the corpus.

                          Not free. The mts/cts precedent is supported by the tools but deliberately not intercepted,
                          because interception changes which reads get diverted; the 97,678 tokens only land if js/jsx
                          enter both lists, which accepts that. Both known parsing failure modes degrade rather than break: a
                          mis-parsed file yields ERROR nodes, which the outline builder skips and the ranked arm declines as
                          NoDefs; minified bundles are single-line and never reach the threshold. The ledger
                          reclassification above is not a degradation — it is a test that goes red by construction, and
                          deciding how to reconcile it is part of this change rather than a surprise to discover afterwards.

                          Acceptance criteria

                          • lumen_core::structure::detect_lang maps js, mjs, cjs to TypeScript and jsx to Tsx.
                          • lumen_core::ranked::TagLang::detect returns the same mapping for those extensions.
                          • js and jsx appear in SOURCE_EXTS, in INTERCEPTED_SOURCE_EXTS and in both hook lists;
                            the existing superset test still passes, and coverage.rs:181 is updated to assert the new
                            classification instead of the old one.
                          • A .js fixture with a class, a function and a method outlines all three names, with
                            returned_tokens < full_tokens.
                          • A .jsx fixture with a component outlines its name, with returned_tokens < full_tokens.
                          • The leak check in crates/lumen-mcp/tests/efficiency.rs is reconciled deliberately —
                            reads recorded before .js was covered are distinguished from reads after it — and only then
                            does the efficiency test report leaked as 0.
                          • .js leaves the uncovered-kind rows because it moved to the intercepted side, not because
                            past reads were relabelled as defects.
                          • No new entry is added to any Cargo.toml.

                          How to test

                          cd /path/to/lumen
                          cargo test --release -p lumen-core structure
                          cargo test --release -p lumen-core coverage
                          cargo test --release -p lumen-mcp --test efficiency -- --nocapture
                          cargo tree -p lumen-core | grep tree-sitter

                          All three test commands must pass with the change complete — fixtures included, and with
                          coverage.rs:181 and the leak check updated as part of it. Run against unmodified assertions on a
                          machine that carries the ledger above, the second and third commands fail by construction, so a red
                          run there is the expected starting point rather than a regression. The efficiency run prints its
                          table: after reconciliation leaked must read 0 and .js must be absent from the uncovered-kind
                          rows. cargo tree must list the same grammars as before.

                          Activity

                          Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

                          Metadata

                          Metadata

                          Assignees

                          No one assigned

                            Labels

                            coverageFile kinds the optimizer does not interceptenhancementNew feature or request

                            Projects

                            No projects

                              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

                              Intercept .js and .jsx — no new grammar needed #8

                              Description

                              @HackPoint

                              What

                              Reads of .js and .jsx are not intercepted, so a large JavaScript file is billed at full cost
                              even though Lumen already carries a grammar that can outline it. It is the cheapest item left on the
                              coverage backlog: extension plumbing, not new parsing.

                              Evidence

                              • Live metering ledger: 97,678 tokens across 20 built-in reads of .js files at or above the
                                300-line threshold, over 17 distinct files, the largest 1,232 lines. 57 .js reads in total;
                                most fall below the threshold and are out of scope.
                              • tree-sitter-typescript 0.23.2 is already a dependency of lumen-core. Its TypeScript grammar is
                                a syntactic superset of JavaScript; its TSX grammar handles JSX.
                              • crates/lumen-core/queries/typescript-tags.scm already captures class_declaration,
                                function_declaration and method_definition — the node kinds JavaScript parses to under that
                                grammar.
                              • Lists to change: crates/lumen-core/src/coverage.rs:32 (SOURCE_EXTS) and :41
                                (INTERCEPTED_SOURCE_EXTS), plus both copies of the hooks' own list —
                                .claude/hooks/lumen_read_intercept.sh:118 and the INTERCEPT_TEMPLATE the installer writes,
                                lumenator/src-tauri/src/setup.rs:1266. Leaving the second one out recreates the drift
                                coverage.rs was written to end.
                              • Interception is retroactive in the ledger metric, and this is the part that bites.
                                coverage::classify tests today's INTERCEPTED_SOURCE_EXTS against every historical row, so the
                                moment js enters that list the 20 above-threshold .js reads already recorded reclassify from
                                UncoveredKind to Optimizable — which is precisely what leaked counts.
                                crates/lumen-mcp/tests/efficiency.rs:585 asserts leaked == 0 across all rows with no era
                                boundary, so that assertion fails on any machine carrying this ledger until the check is
                                reconciled; SIGNED_SINCE at :439 is the existing precedent for drawing such a boundary.
                                crates/lumen-core/src/coverage.rs:181 likewise asserts a.js at 500 lines is UncoveredKind,
                                and has to be rewritten in the same commit.
                              • The repository corpus holds no real .js file at or above 300 lines, so this must be validated
                                with fixtures rather than the corpus.

                              Not free. The mts/cts precedent is supported by the tools but deliberately not intercepted,
                              because interception changes which reads get diverted; the 97,678 tokens only land if js/jsx
                              enter both lists, which accepts that. Both known parsing failure modes degrade rather than break: a
                              mis-parsed file yields ERROR nodes, which the outline builder skips and the ranked arm declines as
                              NoDefs; minified bundles are single-line and never reach the threshold. The ledger
                              reclassification above is not a degradation — it is a test that goes red by construction, and
                              deciding how to reconcile it is part of this change rather than a surprise to discover afterwards.

                              Acceptance criteria

                              • lumen_core::structure::detect_lang maps js, mjs, cjs to TypeScript and jsx to Tsx.
                              • lumen_core::ranked::TagLang::detect returns the same mapping for those extensions.
                              • js and jsx appear in SOURCE_EXTS, in INTERCEPTED_SOURCE_EXTS and in both hook lists;
                                the existing superset test still passes, and coverage.rs:181 is updated to assert the new
                                classification instead of the old one.
                              • A .js fixture with a class, a function and a method outlines all three names, with
                                returned_tokens < full_tokens.
                              • A .jsx fixture with a component outlines its name, with returned_tokens < full_tokens.
                              • The leak check in crates/lumen-mcp/tests/efficiency.rs is reconciled deliberately —
                                reads recorded before .js was covered are distinguished from reads after it — and only then
                                does the efficiency test report leaked as 0.
                              • .js leaves the uncovered-kind rows because it moved to the intercepted side, not because
                                past reads were relabelled as defects.
                              • No new entry is added to any Cargo.toml.

                              How to test

                              cd /path/to/lumen
                              cargo test --release -p lumen-core structure
                              cargo test --release -p lumen-core coverage
                              cargo test --release -p lumen-mcp --test efficiency -- --nocapture
                              cargo tree -p lumen-core | grep tree-sitter

                              All three test commands must pass with the change complete — fixtures included, and with
                              coverage.rs:181 and the leak check updated as part of it. Run against unmodified assertions on a
                              machine that carries the ledger above, the second and third commands fail by construction, so a red
                              run there is the expected starting point rather than a regression. The efficiency run prints its
                              table: after reconciliation leaked must read 0 and .js must be absent from the uncovered-kind
                              rows. cargo tree must list the same grammars as before.

                              Activity

                              Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

                              Metadata

                              Metadata

                              Assignees

                              No one assigned

                                Labels

                                coverageFile kinds the optimizer does not interceptenhancementNew feature or request

                                Projects

                                No projects

                                  Relationships

                                  None yet

                                  Development

                                  No branches or pull requests

                                  Issue actions