contradictsWrapperResolution's docblock still calls functionBodies a flat bare-name index — #13474 made it scope-aware #13787

Description

@claude

One sentence in scripts/check-durability-degradation-log-level.mjs became false when #13474 landed,
and it was left in place deliberately rather than half-obeying an explicit prohibition. This card
is the follow-up that was promised at that moment.

The stale sentence

contradictsWrapperResolution's docblock says:

functionBodies is a flat, file-scoped index keyed by BARE NAME

That was true until #13474 (PR #13784), which replaced exactly that flat last-wins index in
indexFunctionBodies with a scope-aware one: each declaration is recorded with the scope it is
visible from, and get(name, from) walks outward from the call site, innermost first.

Why it was not fixed in that PR

The dispatch order for #13474 and its triage ruling both fenced contradictsWrapperResolution off
by name — the card had argued, correctly, that the guard was doing its job and that changing it
would widen the battlefield. The dev honoured that literally: the guard's predicate and its
docblock are byte-identical between origin/main and the PR head (verified by the PM seat, 8678
characters on both sides).

⭐ The reasoning, which this card exists to preserve: a prohibition half-obeyed is worse than one
obeyed and declared
. The dev flagged the consequence instead of quietly taking the liberty, and the
PM seat ruled the follow-up rather than reopening a fenced region inside a PR that was already green.

Why "it is reconciled elsewhere" is not enough

#13784 does reconcile it from the other side: indexFunctionBodies' new docblock names the guard,
says why it is deliberately unchanged, and records that it stays load-bearing (a unique name
reached on a compound receiver is admitted by the one-declaration rule and refused by that
predicate). ⛔ But that text sits roughly 900 lines away. A reader who lands on
contradictsWrapperResolution — which is exactly what someone debugging a wrapper hop does — is told
something false with nothing nearby to correct it.

This file's own standard is the reason this is a card and not a shrug: it treats a comment that no
longer holds as a hazard, not cosmetics, and it says so in several places.

Scope

Provenance

Raised by the #13474 dev as an open question with three options (leave / follow-up / fix in place),
answered follow-up by the domain:devx PM seat on #13474. Filed unassigned and ungraded —
domain:*, priority and type are triage's field.


Generated by Claude Code

Metadata

Metadata

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

    contradictsWrapperResolution's docblock still calls functionBodies a flat bare-name index — #13474 made it scope-aware #13787

    Description

    @claude

    One sentence in scripts/check-durability-degradation-log-level.mjs became false when #13474 landed,
    and it was left in place deliberately rather than half-obeying an explicit prohibition. This card
    is the follow-up that was promised at that moment.

    The stale sentence

    contradictsWrapperResolution's docblock says:

    functionBodies is a flat, file-scoped index keyed by BARE NAME

    That was true until #13474 (PR #13784), which replaced exactly that flat last-wins index in
    indexFunctionBodies with a scope-aware one: each declaration is recorded with the scope it is
    visible from, and get(name, from) walks outward from the call site, innermost first.

    Why it was not fixed in that PR

    The dispatch order for #13474 and its triage ruling both fenced contradictsWrapperResolution off
    by name — the card had argued, correctly, that the guard was doing its job and that changing it
    would widen the battlefield. The dev honoured that literally: the guard's predicate and its
    docblock are byte-identical between origin/main and the PR head (verified by the PM seat, 8678
    characters on both sides).

    ⭐ The reasoning, which this card exists to preserve: a prohibition half-obeyed is worse than one
    obeyed and declared
    . The dev flagged the consequence instead of quietly taking the liberty, and the
    PM seat ruled the follow-up rather than reopening a fenced region inside a PR that was already green.

    Why "it is reconciled elsewhere" is not enough

    #13784 does reconcile it from the other side: indexFunctionBodies' new docblock names the guard,
    says why it is deliberately unchanged, and records that it stays load-bearing (a unique name
    reached on a compound receiver is admitted by the one-declaration rule and refused by that
    predicate). ⛔ But that text sits roughly 900 lines away. A reader who lands on
    contradictsWrapperResolution — which is exactly what someone debugging a wrapper hop does — is told
    something false with nothing nearby to correct it.

    This file's own standard is the reason this is a card and not a shrug: it treats a comment that no
    longer holds as a hazard, not cosmetics, and it says so in several places.

    Scope

    Provenance

    Raised by the #13474 dev as an open question with three options (leave / follow-up / fix in place),
    answered follow-up by the domain:devx PM seat on #13474. Filed unassigned and ungraded —
    domain:*, priority and type are triage's field.


    Generated by Claude Code

    Metadata

    Metadata

    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

      contradictsWrapperResolution's docblock still calls functionBodies a flat bare-name index — #13474 made it scope-aware #13787

      Description

      @claude

      One sentence in scripts/check-durability-degradation-log-level.mjs became false when #13474 landed,
      and it was left in place deliberately rather than half-obeying an explicit prohibition. This card
      is the follow-up that was promised at that moment.

      The stale sentence

      contradictsWrapperResolution's docblock says:

      functionBodies is a flat, file-scoped index keyed by BARE NAME

      That was true until #13474 (PR #13784), which replaced exactly that flat last-wins index in
      indexFunctionBodies with a scope-aware one: each declaration is recorded with the scope it is
      visible from, and get(name, from) walks outward from the call site, innermost first.

      Why it was not fixed in that PR

      The dispatch order for #13474 and its triage ruling both fenced contradictsWrapperResolution off
      by name — the card had argued, correctly, that the guard was doing its job and that changing it
      would widen the battlefield. The dev honoured that literally: the guard's predicate and its
      docblock are byte-identical between origin/main and the PR head (verified by the PM seat, 8678
      characters on both sides).

      ⭐ The reasoning, which this card exists to preserve: a prohibition half-obeyed is worse than one
      obeyed and declared
      . The dev flagged the consequence instead of quietly taking the liberty, and the
      PM seat ruled the follow-up rather than reopening a fenced region inside a PR that was already green.

      Why "it is reconciled elsewhere" is not enough

      #13784 does reconcile it from the other side: indexFunctionBodies' new docblock names the guard,
      says why it is deliberately unchanged, and records that it stays load-bearing (a unique name
      reached on a compound receiver is admitted by the one-declaration rule and refused by that
      predicate). ⛔ But that text sits roughly 900 lines away. A reader who lands on
      contradictsWrapperResolution — which is exactly what someone debugging a wrapper hop does — is told
      something false with nothing nearby to correct it.

      This file's own standard is the reason this is a card and not a shrug: it treats a comment that no
      longer holds as a hazard, not cosmetics, and it says so in several places.

      Scope

      Provenance

      Raised by the #13474 dev as an open question with three options (leave / follow-up / fix in place),
      answered follow-up by the domain:devx PM seat on #13474. Filed unassigned and ungraded —
      domain:*, priority and type are triage's field.


      Generated by Claude Code

      Metadata

      Metadata

      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

        contradictsWrapperResolution's docblock still calls functionBodies a flat bare-name index — #13474 made it scope-aware #13787

        Description

        @claude

        One sentence in scripts/check-durability-degradation-log-level.mjs became false when #13474 landed,
        and it was left in place deliberately rather than half-obeying an explicit prohibition. This card
        is the follow-up that was promised at that moment.

        The stale sentence

        contradictsWrapperResolution's docblock says:

        functionBodies is a flat, file-scoped index keyed by BARE NAME

        That was true until #13474 (PR #13784), which replaced exactly that flat last-wins index in
        indexFunctionBodies with a scope-aware one: each declaration is recorded with the scope it is
        visible from, and get(name, from) walks outward from the call site, innermost first.

        Why it was not fixed in that PR

        The dispatch order for #13474 and its triage ruling both fenced contradictsWrapperResolution off
        by name — the card had argued, correctly, that the guard was doing its job and that changing it
        would widen the battlefield. The dev honoured that literally: the guard's predicate and its
        docblock are byte-identical between origin/main and the PR head (verified by the PM seat, 8678
        characters on both sides).

        ⭐ The reasoning, which this card exists to preserve: a prohibition half-obeyed is worse than one
        obeyed and declared
        . The dev flagged the consequence instead of quietly taking the liberty, and the
        PM seat ruled the follow-up rather than reopening a fenced region inside a PR that was already green.

        Why "it is reconciled elsewhere" is not enough

        #13784 does reconcile it from the other side: indexFunctionBodies' new docblock names the guard,
        says why it is deliberately unchanged, and records that it stays load-bearing (a unique name
        reached on a compound receiver is admitted by the one-declaration rule and refused by that
        predicate). ⛔ But that text sits roughly 900 lines away. A reader who lands on
        contradictsWrapperResolution — which is exactly what someone debugging a wrapper hop does — is told
        something false with nothing nearby to correct it.

        This file's own standard is the reason this is a card and not a shrug: it treats a comment that no
        longer holds as a hazard, not cosmetics, and it says so in several places.

        Scope

        Provenance

        Raised by the #13474 dev as an open question with three options (leave / follow-up / fix in place),
        answered follow-up by the domain:devx PM seat on #13474. Filed unassigned and ungraded —
        domain:*, priority and type are triage's field.


        Generated by Claude Code

        Metadata

        Metadata

        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

          contradictsWrapperResolution's docblock still calls functionBodies a flat bare-name index — #13474 made it scope-aware #13787

          Description

          @claude

          One sentence in scripts/check-durability-degradation-log-level.mjs became false when #13474 landed,
          and it was left in place deliberately rather than half-obeying an explicit prohibition. This card
          is the follow-up that was promised at that moment.

          The stale sentence

          contradictsWrapperResolution's docblock says:

          functionBodies is a flat, file-scoped index keyed by BARE NAME

          That was true until #13474 (PR #13784), which replaced exactly that flat last-wins index in
          indexFunctionBodies with a scope-aware one: each declaration is recorded with the scope it is
          visible from, and get(name, from) walks outward from the call site, innermost first.

          Why it was not fixed in that PR

          The dispatch order for #13474 and its triage ruling both fenced contradictsWrapperResolution off
          by name — the card had argued, correctly, that the guard was doing its job and that changing it
          would widen the battlefield. The dev honoured that literally: the guard's predicate and its
          docblock are byte-identical between origin/main and the PR head (verified by the PM seat, 8678
          characters on both sides).

          ⭐ The reasoning, which this card exists to preserve: a prohibition half-obeyed is worse than one
          obeyed and declared
          . The dev flagged the consequence instead of quietly taking the liberty, and the
          PM seat ruled the follow-up rather than reopening a fenced region inside a PR that was already green.

          Why "it is reconciled elsewhere" is not enough

          #13784 does reconcile it from the other side: indexFunctionBodies' new docblock names the guard,
          says why it is deliberately unchanged, and records that it stays load-bearing (a unique name
          reached on a compound receiver is admitted by the one-declaration rule and refused by that
          predicate). ⛔ But that text sits roughly 900 lines away. A reader who lands on
          contradictsWrapperResolution — which is exactly what someone debugging a wrapper hop does — is told
          something false with nothing nearby to correct it.

          This file's own standard is the reason this is a card and not a shrug: it treats a comment that no
          longer holds as a hazard, not cosmetics, and it says so in several places.

          Scope

          Provenance

          Raised by the #13474 dev as an open question with three options (leave / follow-up / fix in place),
          answered follow-up by the domain:devx PM seat on #13474. Filed unassigned and ungraded —
          domain:*, priority and type are triage's field.


          Generated by Claude Code

          Metadata

          Metadata

          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

            contradictsWrapperResolution's docblock still calls functionBodies a flat bare-name index — #13474 made it scope-aware #13787

            Description

            @claude

            One sentence in scripts/check-durability-degradation-log-level.mjs became false when #13474 landed,
            and it was left in place deliberately rather than half-obeying an explicit prohibition. This card
            is the follow-up that was promised at that moment.

            The stale sentence

            contradictsWrapperResolution's docblock says:

            functionBodies is a flat, file-scoped index keyed by BARE NAME

            That was true until #13474 (PR #13784), which replaced exactly that flat last-wins index in
            indexFunctionBodies with a scope-aware one: each declaration is recorded with the scope it is
            visible from, and get(name, from) walks outward from the call site, innermost first.

            Why it was not fixed in that PR

            The dispatch order for #13474 and its triage ruling both fenced contradictsWrapperResolution off
            by name — the card had argued, correctly, that the guard was doing its job and that changing it
            would widen the battlefield. The dev honoured that literally: the guard's predicate and its
            docblock are byte-identical between origin/main and the PR head (verified by the PM seat, 8678
            characters on both sides).

            ⭐ The reasoning, which this card exists to preserve: a prohibition half-obeyed is worse than one
            obeyed and declared
            . The dev flagged the consequence instead of quietly taking the liberty, and the
            PM seat ruled the follow-up rather than reopening a fenced region inside a PR that was already green.

            Why "it is reconciled elsewhere" is not enough

            #13784 does reconcile it from the other side: indexFunctionBodies' new docblock names the guard,
            says why it is deliberately unchanged, and records that it stays load-bearing (a unique name
            reached on a compound receiver is admitted by the one-declaration rule and refused by that
            predicate). ⛔ But that text sits roughly 900 lines away. A reader who lands on
            contradictsWrapperResolution — which is exactly what someone debugging a wrapper hop does — is told
            something false with nothing nearby to correct it.

            This file's own standard is the reason this is a card and not a shrug: it treats a comment that no
            longer holds as a hazard, not cosmetics, and it says so in several places.

            Scope

            Provenance

            Raised by the #13474 dev as an open question with three options (leave / follow-up / fix in place),
            answered follow-up by the domain:devx PM seat on #13474. Filed unassigned and ungraded —
            domain:*, priority and type are triage's field.


            Generated by Claude Code

            Metadata

            Metadata

            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

              contradictsWrapperResolution's docblock still calls functionBodies a flat bare-name index — #13474 made it scope-aware #13787

              Description

              @claude

              One sentence in scripts/check-durability-degradation-log-level.mjs became false when #13474 landed,
              and it was left in place deliberately rather than half-obeying an explicit prohibition. This card
              is the follow-up that was promised at that moment.

              The stale sentence

              contradictsWrapperResolution's docblock says:

              functionBodies is a flat, file-scoped index keyed by BARE NAME

              That was true until #13474 (PR #13784), which replaced exactly that flat last-wins index in
              indexFunctionBodies with a scope-aware one: each declaration is recorded with the scope it is
              visible from, and get(name, from) walks outward from the call site, innermost first.

              Why it was not fixed in that PR

              The dispatch order for #13474 and its triage ruling both fenced contradictsWrapperResolution off
              by name — the card had argued, correctly, that the guard was doing its job and that changing it
              would widen the battlefield. The dev honoured that literally: the guard's predicate and its
              docblock are byte-identical between origin/main and the PR head (verified by the PM seat, 8678
              characters on both sides).

              ⭐ The reasoning, which this card exists to preserve: a prohibition half-obeyed is worse than one
              obeyed and declared
              . The dev flagged the consequence instead of quietly taking the liberty, and the
              PM seat ruled the follow-up rather than reopening a fenced region inside a PR that was already green.

              Why "it is reconciled elsewhere" is not enough

              #13784 does reconcile it from the other side: indexFunctionBodies' new docblock names the guard,
              says why it is deliberately unchanged, and records that it stays load-bearing (a unique name
              reached on a compound receiver is admitted by the one-declaration rule and refused by that
              predicate). ⛔ But that text sits roughly 900 lines away. A reader who lands on
              contradictsWrapperResolution — which is exactly what someone debugging a wrapper hop does — is told
              something false with nothing nearby to correct it.

              This file's own standard is the reason this is a card and not a shrug: it treats a comment that no
              longer holds as a hazard, not cosmetics, and it says so in several places.

              Scope

              Provenance

              Raised by the #13474 dev as an open question with three options (leave / follow-up / fix in place),
              answered follow-up by the domain:devx PM seat on #13474. Filed unassigned and ungraded —
              domain:*, priority and type are triage's field.


              Generated by Claude Code

              Metadata

              Metadata

              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

                contradictsWrapperResolution's docblock still calls functionBodies a flat bare-name index — #13474 made it scope-aware #13787

                Description

                @claude

                One sentence in scripts/check-durability-degradation-log-level.mjs became false when #13474 landed,
                and it was left in place deliberately rather than half-obeying an explicit prohibition. This card
                is the follow-up that was promised at that moment.

                The stale sentence

                contradictsWrapperResolution's docblock says:

                functionBodies is a flat, file-scoped index keyed by BARE NAME

                That was true until #13474 (PR #13784), which replaced exactly that flat last-wins index in
                indexFunctionBodies with a scope-aware one: each declaration is recorded with the scope it is
                visible from, and get(name, from) walks outward from the call site, innermost first.

                Why it was not fixed in that PR

                The dispatch order for #13474 and its triage ruling both fenced contradictsWrapperResolution off
                by name — the card had argued, correctly, that the guard was doing its job and that changing it
                would widen the battlefield. The dev honoured that literally: the guard's predicate and its
                docblock are byte-identical between origin/main and the PR head (verified by the PM seat, 8678
                characters on both sides).

                ⭐ The reasoning, which this card exists to preserve: a prohibition half-obeyed is worse than one
                obeyed and declared
                . The dev flagged the consequence instead of quietly taking the liberty, and the
                PM seat ruled the follow-up rather than reopening a fenced region inside a PR that was already green.

                Why "it is reconciled elsewhere" is not enough

                #13784 does reconcile it from the other side: indexFunctionBodies' new docblock names the guard,
                says why it is deliberately unchanged, and records that it stays load-bearing (a unique name
                reached on a compound receiver is admitted by the one-declaration rule and refused by that
                predicate). ⛔ But that text sits roughly 900 lines away. A reader who lands on
                contradictsWrapperResolution — which is exactly what someone debugging a wrapper hop does — is told
                something false with nothing nearby to correct it.

                This file's own standard is the reason this is a card and not a shrug: it treats a comment that no
                longer holds as a hazard, not cosmetics, and it says so in several places.

                Scope

                Provenance

                Raised by the #13474 dev as an open question with three options (leave / follow-up / fix in place),
                answered follow-up by the domain:devx PM seat on #13474. Filed unassigned and ungraded —
                domain:*, priority and type are triage's field.


                Generated by Claude Code

                Metadata

                Metadata

                Type

                Projects

                No projects

                  Milestone

                  No milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions