finding(plugin-charts): scatter is NOT MEASURED for the degenerate-magnitude class — its all-positive CONTROL drew zero marks, so the sweep's zeros say nothing #7171

Description

@os-warren

Filed by the domain:ui PM seat from a measurement in objectui#7147 (PR #7169). The implementer reported it rather than filing, per the report-don't-duplicate fence on that surface — but unlike objectui#7148's finding, this one has no existing card to attach to, so it gets its own.

What is NOT known

objectui#7147 swept 8 chart families × 9 datasets = 74 tiles in real Chromium, MD5'd and pixel-diffed against a literally empty div, to find where a degenerate magnitude (zero, negative, null, unparseable) produces a chart that misrepresents its data.

It reached verdicts for seven families:

familyverdict
pie / donut / funnel / treemapdefective — fixed in PR objectui#7169
bar / radarmeasured and clean — deliberately untouched
scatterNOT MEASURED

Scatter is not clean. It is unmeasured, and the distinction is the whole point of this card.

Why the sweep could not read it

Every scatter tile drew zero marks — including the all-positive CONTROL (markN 0).

A control that returns zero is no control. With the control dead, scatter's zeros on the degenerate datasets carry no information: they are indistinguishable from "the fixture never rendered a scatter at all." Reporting scatter as clean on that evidence would have been a false green across nine datasets.

The cause is identified: scatter takes two measures (x and y), and objectui#7147's fixture supplies a single measure. The fixture does not bind scatter, so scatter never had a chance to draw.

What a correct measurement needs

  • A two-measure fixture for the scatter arm, so its all-positive control actually draws marks. ⛔ Until that control returns non-zero, no scatter reading means anything.
  • Then the same nine datasets, with the degenerate value applied to each measure independently and to both — a scatter can plausibly degenerate on x, on y, or on both, and those may not behave alike.
  • Per-tile screenshot hashing against per-family all-positive and one-row controls, the instrument that produced verdicts for the other seven families. A hash collision between a degenerate tile and a legitimately-sparse one is the finding; that is how pie's full-circle case and treemap's four-datasets-to-one-image case were caught.

Blocked, and on what

pm:blocked on PR #7169 landing — it is live in packages/plugin-charts/src/AdvancedChartImpl.tsx, which is where any scatter arm work would sit. Unblocks automatically.

Why this is worth tracking rather than dropping

⚠️This is the shape that produces false confidence. After PR objectui#7169 lands, the honest statement is "seven of eight families measured; scatter unknown." Without this card, the natural summary becomes "the degenerate-magnitude class is handled," which is not what was measured — and the next person to look would have to re-derive the whole sweep to discover the hole.

⚠️ And note the pattern this card family keeps producing: objectui#7140 (early return), objectui#7147 (degenerate geometry), objectui#7148 (silent row drop) are three distinct mechanisms behind one reader-facing symptom. Scatter may be a fourth. ⛔ Do not assume PR objectui#7169's predicate transfers to it — measure first.

Related

objectui#7147 / PR objectui#7169 (the sweep and the fix) · objectui#7148 (silent row drop) · objectui#7140 (the empty-frame early return) · objectui#7146.

Metadata

Metadata

Assignees

Labels

domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatfinding

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(plugin-charts): scatter is NOT MEASURED for the degenerate-magnitude class — its all-positive CONTROL drew zero marks, so the sweep's zeros say nothing #7171

    Description

    @os-warren

    Filed by the domain:ui PM seat from a measurement in objectui#7147 (PR #7169). The implementer reported it rather than filing, per the report-don't-duplicate fence on that surface — but unlike objectui#7148's finding, this one has no existing card to attach to, so it gets its own.

    What is NOT known

    objectui#7147 swept 8 chart families × 9 datasets = 74 tiles in real Chromium, MD5'd and pixel-diffed against a literally empty div, to find where a degenerate magnitude (zero, negative, null, unparseable) produces a chart that misrepresents its data.

    It reached verdicts for seven families:

    familyverdict
    pie / donut / funnel / treemapdefective — fixed in PR objectui#7169
    bar / radarmeasured and clean — deliberately untouched
    scatterNOT MEASURED

    Scatter is not clean. It is unmeasured, and the distinction is the whole point of this card.

    Why the sweep could not read it

    Every scatter tile drew zero marks — including the all-positive CONTROL (markN 0).

    A control that returns zero is no control. With the control dead, scatter's zeros on the degenerate datasets carry no information: they are indistinguishable from "the fixture never rendered a scatter at all." Reporting scatter as clean on that evidence would have been a false green across nine datasets.

    The cause is identified: scatter takes two measures (x and y), and objectui#7147's fixture supplies a single measure. The fixture does not bind scatter, so scatter never had a chance to draw.

    What a correct measurement needs

    • A two-measure fixture for the scatter arm, so its all-positive control actually draws marks. ⛔ Until that control returns non-zero, no scatter reading means anything.
    • Then the same nine datasets, with the degenerate value applied to each measure independently and to both — a scatter can plausibly degenerate on x, on y, or on both, and those may not behave alike.
    • Per-tile screenshot hashing against per-family all-positive and one-row controls, the instrument that produced verdicts for the other seven families. A hash collision between a degenerate tile and a legitimately-sparse one is the finding; that is how pie's full-circle case and treemap's four-datasets-to-one-image case were caught.

    Blocked, and on what

    pm:blocked on PR #7169 landing — it is live in packages/plugin-charts/src/AdvancedChartImpl.tsx, which is where any scatter arm work would sit. Unblocks automatically.

    Why this is worth tracking rather than dropping

    ⚠️This is the shape that produces false confidence. After PR objectui#7169 lands, the honest statement is "seven of eight families measured; scatter unknown." Without this card, the natural summary becomes "the degenerate-magnitude class is handled," which is not what was measured — and the next person to look would have to re-derive the whole sweep to discover the hole.

    ⚠️ And note the pattern this card family keeps producing: objectui#7140 (early return), objectui#7147 (degenerate geometry), objectui#7148 (silent row drop) are three distinct mechanisms behind one reader-facing symptom. Scatter may be a fourth. ⛔ Do not assume PR objectui#7169's predicate transfers to it — measure first.

    Related

    objectui#7147 / PR objectui#7169 (the sweep and the fix) · objectui#7148 (silent row drop) · objectui#7140 (the empty-frame early return) · objectui#7146.

    Metadata

    Metadata

    Assignees

    Labels

    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatfinding

    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(plugin-charts): scatter is NOT MEASURED for the degenerate-magnitude class — its all-positive CONTROL drew zero marks, so the sweep's zeros say nothing #7171

      Description

      @os-warren

      Filed by the domain:ui PM seat from a measurement in objectui#7147 (PR #7169). The implementer reported it rather than filing, per the report-don't-duplicate fence on that surface — but unlike objectui#7148's finding, this one has no existing card to attach to, so it gets its own.

      What is NOT known

      objectui#7147 swept 8 chart families × 9 datasets = 74 tiles in real Chromium, MD5'd and pixel-diffed against a literally empty div, to find where a degenerate magnitude (zero, negative, null, unparseable) produces a chart that misrepresents its data.

      It reached verdicts for seven families:

      familyverdict
      pie / donut / funnel / treemapdefective — fixed in PR objectui#7169
      bar / radarmeasured and clean — deliberately untouched
      scatterNOT MEASURED

      Scatter is not clean. It is unmeasured, and the distinction is the whole point of this card.

      Why the sweep could not read it

      Every scatter tile drew zero marks — including the all-positive CONTROL (markN 0).

      A control that returns zero is no control. With the control dead, scatter's zeros on the degenerate datasets carry no information: they are indistinguishable from "the fixture never rendered a scatter at all." Reporting scatter as clean on that evidence would have been a false green across nine datasets.

      The cause is identified: scatter takes two measures (x and y), and objectui#7147's fixture supplies a single measure. The fixture does not bind scatter, so scatter never had a chance to draw.

      What a correct measurement needs

      • A two-measure fixture for the scatter arm, so its all-positive control actually draws marks. ⛔ Until that control returns non-zero, no scatter reading means anything.
      • Then the same nine datasets, with the degenerate value applied to each measure independently and to both — a scatter can plausibly degenerate on x, on y, or on both, and those may not behave alike.
      • Per-tile screenshot hashing against per-family all-positive and one-row controls, the instrument that produced verdicts for the other seven families. A hash collision between a degenerate tile and a legitimately-sparse one is the finding; that is how pie's full-circle case and treemap's four-datasets-to-one-image case were caught.

      Blocked, and on what

      pm:blocked on PR #7169 landing — it is live in packages/plugin-charts/src/AdvancedChartImpl.tsx, which is where any scatter arm work would sit. Unblocks automatically.

      Why this is worth tracking rather than dropping

      ⚠️This is the shape that produces false confidence. After PR objectui#7169 lands, the honest statement is "seven of eight families measured; scatter unknown." Without this card, the natural summary becomes "the degenerate-magnitude class is handled," which is not what was measured — and the next person to look would have to re-derive the whole sweep to discover the hole.

      ⚠️ And note the pattern this card family keeps producing: objectui#7140 (early return), objectui#7147 (degenerate geometry), objectui#7148 (silent row drop) are three distinct mechanisms behind one reader-facing symptom. Scatter may be a fourth. ⛔ Do not assume PR objectui#7169's predicate transfers to it — measure first.

      Related

      objectui#7147 / PR objectui#7169 (the sweep and the fix) · objectui#7148 (silent row drop) · objectui#7140 (the empty-frame early return) · objectui#7146.

      Metadata

      Metadata

      Assignees

      Labels

      domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatfinding

      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(plugin-charts): scatter is NOT MEASURED for the degenerate-magnitude class — its all-positive CONTROL drew zero marks, so the sweep's zeros say nothing #7171

        Description

        @os-warren

        Filed by the domain:ui PM seat from a measurement in objectui#7147 (PR #7169). The implementer reported it rather than filing, per the report-don't-duplicate fence on that surface — but unlike objectui#7148's finding, this one has no existing card to attach to, so it gets its own.

        What is NOT known

        objectui#7147 swept 8 chart families × 9 datasets = 74 tiles in real Chromium, MD5'd and pixel-diffed against a literally empty div, to find where a degenerate magnitude (zero, negative, null, unparseable) produces a chart that misrepresents its data.

        It reached verdicts for seven families:

        familyverdict
        pie / donut / funnel / treemapdefective — fixed in PR objectui#7169
        bar / radarmeasured and clean — deliberately untouched
        scatterNOT MEASURED

        Scatter is not clean. It is unmeasured, and the distinction is the whole point of this card.

        Why the sweep could not read it

        Every scatter tile drew zero marks — including the all-positive CONTROL (markN 0).

        A control that returns zero is no control. With the control dead, scatter's zeros on the degenerate datasets carry no information: they are indistinguishable from "the fixture never rendered a scatter at all." Reporting scatter as clean on that evidence would have been a false green across nine datasets.

        The cause is identified: scatter takes two measures (x and y), and objectui#7147's fixture supplies a single measure. The fixture does not bind scatter, so scatter never had a chance to draw.

        What a correct measurement needs

        • A two-measure fixture for the scatter arm, so its all-positive control actually draws marks. ⛔ Until that control returns non-zero, no scatter reading means anything.
        • Then the same nine datasets, with the degenerate value applied to each measure independently and to both — a scatter can plausibly degenerate on x, on y, or on both, and those may not behave alike.
        • Per-tile screenshot hashing against per-family all-positive and one-row controls, the instrument that produced verdicts for the other seven families. A hash collision between a degenerate tile and a legitimately-sparse one is the finding; that is how pie's full-circle case and treemap's four-datasets-to-one-image case were caught.

        Blocked, and on what

        pm:blocked on PR #7169 landing — it is live in packages/plugin-charts/src/AdvancedChartImpl.tsx, which is where any scatter arm work would sit. Unblocks automatically.

        Why this is worth tracking rather than dropping

        ⚠️This is the shape that produces false confidence. After PR objectui#7169 lands, the honest statement is "seven of eight families measured; scatter unknown." Without this card, the natural summary becomes "the degenerate-magnitude class is handled," which is not what was measured — and the next person to look would have to re-derive the whole sweep to discover the hole.

        ⚠️ And note the pattern this card family keeps producing: objectui#7140 (early return), objectui#7147 (degenerate geometry), objectui#7148 (silent row drop) are three distinct mechanisms behind one reader-facing symptom. Scatter may be a fourth. ⛔ Do not assume PR objectui#7169's predicate transfers to it — measure first.

        Related

        objectui#7147 / PR objectui#7169 (the sweep and the fix) · objectui#7148 (silent row drop) · objectui#7140 (the empty-frame early return) · objectui#7146.

        Metadata

        Metadata

        Assignees

        Labels

        domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatfinding

        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(plugin-charts): scatter is NOT MEASURED for the degenerate-magnitude class — its all-positive CONTROL drew zero marks, so the sweep's zeros say nothing #7171

          Description

          @os-warren

          Filed by the domain:ui PM seat from a measurement in objectui#7147 (PR #7169). The implementer reported it rather than filing, per the report-don't-duplicate fence on that surface — but unlike objectui#7148's finding, this one has no existing card to attach to, so it gets its own.

          What is NOT known

          objectui#7147 swept 8 chart families × 9 datasets = 74 tiles in real Chromium, MD5'd and pixel-diffed against a literally empty div, to find where a degenerate magnitude (zero, negative, null, unparseable) produces a chart that misrepresents its data.

          It reached verdicts for seven families:

          familyverdict
          pie / donut / funnel / treemapdefective — fixed in PR objectui#7169
          bar / radarmeasured and clean — deliberately untouched
          scatterNOT MEASURED

          Scatter is not clean. It is unmeasured, and the distinction is the whole point of this card.

          Why the sweep could not read it

          Every scatter tile drew zero marks — including the all-positive CONTROL (markN 0).

          A control that returns zero is no control. With the control dead, scatter's zeros on the degenerate datasets carry no information: they are indistinguishable from "the fixture never rendered a scatter at all." Reporting scatter as clean on that evidence would have been a false green across nine datasets.

          The cause is identified: scatter takes two measures (x and y), and objectui#7147's fixture supplies a single measure. The fixture does not bind scatter, so scatter never had a chance to draw.

          What a correct measurement needs

          • A two-measure fixture for the scatter arm, so its all-positive control actually draws marks. ⛔ Until that control returns non-zero, no scatter reading means anything.
          • Then the same nine datasets, with the degenerate value applied to each measure independently and to both — a scatter can plausibly degenerate on x, on y, or on both, and those may not behave alike.
          • Per-tile screenshot hashing against per-family all-positive and one-row controls, the instrument that produced verdicts for the other seven families. A hash collision between a degenerate tile and a legitimately-sparse one is the finding; that is how pie's full-circle case and treemap's four-datasets-to-one-image case were caught.

          Blocked, and on what

          pm:blocked on PR #7169 landing — it is live in packages/plugin-charts/src/AdvancedChartImpl.tsx, which is where any scatter arm work would sit. Unblocks automatically.

          Why this is worth tracking rather than dropping

          ⚠️This is the shape that produces false confidence. After PR objectui#7169 lands, the honest statement is "seven of eight families measured; scatter unknown." Without this card, the natural summary becomes "the degenerate-magnitude class is handled," which is not what was measured — and the next person to look would have to re-derive the whole sweep to discover the hole.

          ⚠️ And note the pattern this card family keeps producing: objectui#7140 (early return), objectui#7147 (degenerate geometry), objectui#7148 (silent row drop) are three distinct mechanisms behind one reader-facing symptom. Scatter may be a fourth. ⛔ Do not assume PR objectui#7169's predicate transfers to it — measure first.

          Related

          objectui#7147 / PR objectui#7169 (the sweep and the fix) · objectui#7148 (silent row drop) · objectui#7140 (the empty-frame early return) · objectui#7146.

          Metadata

          Metadata

          Assignees

          Labels

          domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatfinding

          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(plugin-charts): scatter is NOT MEASURED for the degenerate-magnitude class — its all-positive CONTROL drew zero marks, so the sweep's zeros say nothing #7171

            Description

            @os-warren

            Filed by the domain:ui PM seat from a measurement in objectui#7147 (PR #7169). The implementer reported it rather than filing, per the report-don't-duplicate fence on that surface — but unlike objectui#7148's finding, this one has no existing card to attach to, so it gets its own.

            What is NOT known

            objectui#7147 swept 8 chart families × 9 datasets = 74 tiles in real Chromium, MD5'd and pixel-diffed against a literally empty div, to find where a degenerate magnitude (zero, negative, null, unparseable) produces a chart that misrepresents its data.

            It reached verdicts for seven families:

            familyverdict
            pie / donut / funnel / treemapdefective — fixed in PR objectui#7169
            bar / radarmeasured and clean — deliberately untouched
            scatterNOT MEASURED

            Scatter is not clean. It is unmeasured, and the distinction is the whole point of this card.

            Why the sweep could not read it

            Every scatter tile drew zero marks — including the all-positive CONTROL (markN 0).

            A control that returns zero is no control. With the control dead, scatter's zeros on the degenerate datasets carry no information: they are indistinguishable from "the fixture never rendered a scatter at all." Reporting scatter as clean on that evidence would have been a false green across nine datasets.

            The cause is identified: scatter takes two measures (x and y), and objectui#7147's fixture supplies a single measure. The fixture does not bind scatter, so scatter never had a chance to draw.

            What a correct measurement needs

            • A two-measure fixture for the scatter arm, so its all-positive control actually draws marks. ⛔ Until that control returns non-zero, no scatter reading means anything.
            • Then the same nine datasets, with the degenerate value applied to each measure independently and to both — a scatter can plausibly degenerate on x, on y, or on both, and those may not behave alike.
            • Per-tile screenshot hashing against per-family all-positive and one-row controls, the instrument that produced verdicts for the other seven families. A hash collision between a degenerate tile and a legitimately-sparse one is the finding; that is how pie's full-circle case and treemap's four-datasets-to-one-image case were caught.

            Blocked, and on what

            pm:blocked on PR #7169 landing — it is live in packages/plugin-charts/src/AdvancedChartImpl.tsx, which is where any scatter arm work would sit. Unblocks automatically.

            Why this is worth tracking rather than dropping

            ⚠️This is the shape that produces false confidence. After PR objectui#7169 lands, the honest statement is "seven of eight families measured; scatter unknown." Without this card, the natural summary becomes "the degenerate-magnitude class is handled," which is not what was measured — and the next person to look would have to re-derive the whole sweep to discover the hole.

            ⚠️ And note the pattern this card family keeps producing: objectui#7140 (early return), objectui#7147 (degenerate geometry), objectui#7148 (silent row drop) are three distinct mechanisms behind one reader-facing symptom. Scatter may be a fourth. ⛔ Do not assume PR objectui#7169's predicate transfers to it — measure first.

            Related

            objectui#7147 / PR objectui#7169 (the sweep and the fix) · objectui#7148 (silent row drop) · objectui#7140 (the empty-frame early return) · objectui#7146.

            Metadata

            Metadata

            Assignees

            Labels

            domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatfinding

            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(plugin-charts): scatter is NOT MEASURED for the degenerate-magnitude class — its all-positive CONTROL drew zero marks, so the sweep's zeros say nothing #7171

              Description

              @os-warren

              Filed by the domain:ui PM seat from a measurement in objectui#7147 (PR #7169). The implementer reported it rather than filing, per the report-don't-duplicate fence on that surface — but unlike objectui#7148's finding, this one has no existing card to attach to, so it gets its own.

              What is NOT known

              objectui#7147 swept 8 chart families × 9 datasets = 74 tiles in real Chromium, MD5'd and pixel-diffed against a literally empty div, to find where a degenerate magnitude (zero, negative, null, unparseable) produces a chart that misrepresents its data.

              It reached verdicts for seven families:

              familyverdict
              pie / donut / funnel / treemapdefective — fixed in PR objectui#7169
              bar / radarmeasured and clean — deliberately untouched
              scatterNOT MEASURED

              Scatter is not clean. It is unmeasured, and the distinction is the whole point of this card.

              Why the sweep could not read it

              Every scatter tile drew zero marks — including the all-positive CONTROL (markN 0).

              A control that returns zero is no control. With the control dead, scatter's zeros on the degenerate datasets carry no information: they are indistinguishable from "the fixture never rendered a scatter at all." Reporting scatter as clean on that evidence would have been a false green across nine datasets.

              The cause is identified: scatter takes two measures (x and y), and objectui#7147's fixture supplies a single measure. The fixture does not bind scatter, so scatter never had a chance to draw.

              What a correct measurement needs

              • A two-measure fixture for the scatter arm, so its all-positive control actually draws marks. ⛔ Until that control returns non-zero, no scatter reading means anything.
              • Then the same nine datasets, with the degenerate value applied to each measure independently and to both — a scatter can plausibly degenerate on x, on y, or on both, and those may not behave alike.
              • Per-tile screenshot hashing against per-family all-positive and one-row controls, the instrument that produced verdicts for the other seven families. A hash collision between a degenerate tile and a legitimately-sparse one is the finding; that is how pie's full-circle case and treemap's four-datasets-to-one-image case were caught.

              Blocked, and on what

              pm:blocked on PR #7169 landing — it is live in packages/plugin-charts/src/AdvancedChartImpl.tsx, which is where any scatter arm work would sit. Unblocks automatically.

              Why this is worth tracking rather than dropping

              ⚠️This is the shape that produces false confidence. After PR objectui#7169 lands, the honest statement is "seven of eight families measured; scatter unknown." Without this card, the natural summary becomes "the degenerate-magnitude class is handled," which is not what was measured — and the next person to look would have to re-derive the whole sweep to discover the hole.

              ⚠️ And note the pattern this card family keeps producing: objectui#7140 (early return), objectui#7147 (degenerate geometry), objectui#7148 (silent row drop) are three distinct mechanisms behind one reader-facing symptom. Scatter may be a fourth. ⛔ Do not assume PR objectui#7169's predicate transfers to it — measure first.

              Related

              objectui#7147 / PR objectui#7169 (the sweep and the fix) · objectui#7148 (silent row drop) · objectui#7140 (the empty-frame early return) · objectui#7146.

              Metadata

              Metadata

              Assignees

              Labels

              domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatfinding

              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(plugin-charts): scatter is NOT MEASURED for the degenerate-magnitude class — its all-positive CONTROL drew zero marks, so the sweep's zeros say nothing #7171

                Description

                @os-warren

                Filed by the domain:ui PM seat from a measurement in objectui#7147 (PR #7169). The implementer reported it rather than filing, per the report-don't-duplicate fence on that surface — but unlike objectui#7148's finding, this one has no existing card to attach to, so it gets its own.

                What is NOT known

                objectui#7147 swept 8 chart families × 9 datasets = 74 tiles in real Chromium, MD5'd and pixel-diffed against a literally empty div, to find where a degenerate magnitude (zero, negative, null, unparseable) produces a chart that misrepresents its data.

                It reached verdicts for seven families:

                familyverdict
                pie / donut / funnel / treemapdefective — fixed in PR objectui#7169
                bar / radarmeasured and clean — deliberately untouched
                scatterNOT MEASURED

                Scatter is not clean. It is unmeasured, and the distinction is the whole point of this card.

                Why the sweep could not read it

                Every scatter tile drew zero marks — including the all-positive CONTROL (markN 0).

                A control that returns zero is no control. With the control dead, scatter's zeros on the degenerate datasets carry no information: they are indistinguishable from "the fixture never rendered a scatter at all." Reporting scatter as clean on that evidence would have been a false green across nine datasets.

                The cause is identified: scatter takes two measures (x and y), and objectui#7147's fixture supplies a single measure. The fixture does not bind scatter, so scatter never had a chance to draw.

                What a correct measurement needs

                • A two-measure fixture for the scatter arm, so its all-positive control actually draws marks. ⛔ Until that control returns non-zero, no scatter reading means anything.
                • Then the same nine datasets, with the degenerate value applied to each measure independently and to both — a scatter can plausibly degenerate on x, on y, or on both, and those may not behave alike.
                • Per-tile screenshot hashing against per-family all-positive and one-row controls, the instrument that produced verdicts for the other seven families. A hash collision between a degenerate tile and a legitimately-sparse one is the finding; that is how pie's full-circle case and treemap's four-datasets-to-one-image case were caught.

                Blocked, and on what

                pm:blocked on PR #7169 landing — it is live in packages/plugin-charts/src/AdvancedChartImpl.tsx, which is where any scatter arm work would sit. Unblocks automatically.

                Why this is worth tracking rather than dropping

                ⚠️This is the shape that produces false confidence. After PR objectui#7169 lands, the honest statement is "seven of eight families measured; scatter unknown." Without this card, the natural summary becomes "the degenerate-magnitude class is handled," which is not what was measured — and the next person to look would have to re-derive the whole sweep to discover the hole.

                ⚠️ And note the pattern this card family keeps producing: objectui#7140 (early return), objectui#7147 (degenerate geometry), objectui#7148 (silent row drop) are three distinct mechanisms behind one reader-facing symptom. Scatter may be a fourth. ⛔ Do not assume PR objectui#7169's predicate transfers to it — measure first.

                Related

                objectui#7147 / PR objectui#7169 (the sweep and the fix) · objectui#7148 (silent row drop) · objectui#7140 (the empty-frame early return) · objectui#7146.

                Metadata

                Metadata

                Assignees

                Labels

                domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatfinding

                Type

                No type

                Projects

                No projects

                  Milestone

                  No milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions