bare-root-worklist keys verdicts per family, so a gate CI invokes two ways owes two identical rows — key the sweep on the gate source file and fold the nine twins without stranding them #15091

Description

@claude

Filed by the domain:skills seat (session session_019RfFHiRCSs3JXLK4cwcfox, os-steve) from the #14880 patch round (PR #15081), which measured the class and — per its remedy text — recorded the twins rather than re-keying the sweep. Tool-owner design call; this lane's.

What

scripts/pm/bare-root-worklist.mjs keys each recorded verdict on family constant word. A verdict is about a bare-root literal in a gate source file, never about an invocation of it — but since PR #15081 the derivation keys families on (script, args), so a gate CI invokes two ways (plain and --self-test) owes two identical verdicts for one literal. Nine such twins were recorded in the patch round (a labelled SECOND-KEY TWINS section); the class grows with the workflows, not with that file — every gate that gains a second invocation acquires a twin row on the next run, and its verdict must be copied by hand.

What would close it

Key the sweep's dedupe on the gate source file (the thing a verdict is about), folding twins into one row, with a migration that does not strand the existing rows as STALE — the patch round refused to do this because it re-decides which family a surviving row is attributed to, which is a redesign of the file's keying rather than the FRESH remedy its message names. The self-test's "none stale, none missing, none contradicted" invariant must hold across the migration; the recorded-verdict table shrinks by the nine twins in the same PR.

Refs

PR #15081 (the twins section and the reason) · #14880 (the derivation key) · #15083 (the other derivation-key residue on this lane's backlog).


Generated by Claude Code

Activity

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

Metadata

Metadata

Assignees

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

    bare-root-worklist keys verdicts per family, so a gate CI invokes two ways owes two identical rows — key the sweep on the gate source file and fold the nine twins without stranding them #15091

    Description

    @claude

    Filed by the domain:skills seat (session session_019RfFHiRCSs3JXLK4cwcfox, os-steve) from the #14880 patch round (PR #15081), which measured the class and — per its remedy text — recorded the twins rather than re-keying the sweep. Tool-owner design call; this lane's.

    What

    scripts/pm/bare-root-worklist.mjs keys each recorded verdict on family constant word. A verdict is about a bare-root literal in a gate source file, never about an invocation of it — but since PR #15081 the derivation keys families on (script, args), so a gate CI invokes two ways (plain and --self-test) owes two identical verdicts for one literal. Nine such twins were recorded in the patch round (a labelled SECOND-KEY TWINS section); the class grows with the workflows, not with that file — every gate that gains a second invocation acquires a twin row on the next run, and its verdict must be copied by hand.

    What would close it

    Key the sweep's dedupe on the gate source file (the thing a verdict is about), folding twins into one row, with a migration that does not strand the existing rows as STALE — the patch round refused to do this because it re-decides which family a surviving row is attributed to, which is a redesign of the file's keying rather than the FRESH remedy its message names. The self-test's "none stale, none missing, none contradicted" invariant must hold across the migration; the recorded-verdict table shrinks by the nine twins in the same PR.

    Refs

    PR #15081 (the twins section and the reason) · #14880 (the derivation key) · #15083 (the other derivation-key residue on this lane's backlog).


    Generated by Claude Code

    Activity

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

    Metadata

    Metadata

    Assignees

    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

      bare-root-worklist keys verdicts per family, so a gate CI invokes two ways owes two identical rows — key the sweep on the gate source file and fold the nine twins without stranding them #15091

      Description

      @claude

      Filed by the domain:skills seat (session session_019RfFHiRCSs3JXLK4cwcfox, os-steve) from the #14880 patch round (PR #15081), which measured the class and — per its remedy text — recorded the twins rather than re-keying the sweep. Tool-owner design call; this lane's.

      What

      scripts/pm/bare-root-worklist.mjs keys each recorded verdict on family constant word. A verdict is about a bare-root literal in a gate source file, never about an invocation of it — but since PR #15081 the derivation keys families on (script, args), so a gate CI invokes two ways (plain and --self-test) owes two identical verdicts for one literal. Nine such twins were recorded in the patch round (a labelled SECOND-KEY TWINS section); the class grows with the workflows, not with that file — every gate that gains a second invocation acquires a twin row on the next run, and its verdict must be copied by hand.

      What would close it

      Key the sweep's dedupe on the gate source file (the thing a verdict is about), folding twins into one row, with a migration that does not strand the existing rows as STALE — the patch round refused to do this because it re-decides which family a surviving row is attributed to, which is a redesign of the file's keying rather than the FRESH remedy its message names. The self-test's "none stale, none missing, none contradicted" invariant must hold across the migration; the recorded-verdict table shrinks by the nine twins in the same PR.

      Refs

      PR #15081 (the twins section and the reason) · #14880 (the derivation key) · #15083 (the other derivation-key residue on this lane's backlog).


      Generated by Claude Code

      Activity

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

      Metadata

      Metadata

      Assignees

      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

        bare-root-worklist keys verdicts per family, so a gate CI invokes two ways owes two identical rows — key the sweep on the gate source file and fold the nine twins without stranding them #15091

        Description

        @claude

        Filed by the domain:skills seat (session session_019RfFHiRCSs3JXLK4cwcfox, os-steve) from the #14880 patch round (PR #15081), which measured the class and — per its remedy text — recorded the twins rather than re-keying the sweep. Tool-owner design call; this lane's.

        What

        scripts/pm/bare-root-worklist.mjs keys each recorded verdict on family constant word. A verdict is about a bare-root literal in a gate source file, never about an invocation of it — but since PR #15081 the derivation keys families on (script, args), so a gate CI invokes two ways (plain and --self-test) owes two identical verdicts for one literal. Nine such twins were recorded in the patch round (a labelled SECOND-KEY TWINS section); the class grows with the workflows, not with that file — every gate that gains a second invocation acquires a twin row on the next run, and its verdict must be copied by hand.

        What would close it

        Key the sweep's dedupe on the gate source file (the thing a verdict is about), folding twins into one row, with a migration that does not strand the existing rows as STALE — the patch round refused to do this because it re-decides which family a surviving row is attributed to, which is a redesign of the file's keying rather than the FRESH remedy its message names. The self-test's "none stale, none missing, none contradicted" invariant must hold across the migration; the recorded-verdict table shrinks by the nine twins in the same PR.

        Refs

        PR #15081 (the twins section and the reason) · #14880 (the derivation key) · #15083 (the other derivation-key residue on this lane's backlog).


        Generated by Claude Code

        Activity

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

        Metadata

        Metadata

        Assignees

        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

          bare-root-worklist keys verdicts per family, so a gate CI invokes two ways owes two identical rows — key the sweep on the gate source file and fold the nine twins without stranding them #15091

          Description

          @claude

          Filed by the domain:skills seat (session session_019RfFHiRCSs3JXLK4cwcfox, os-steve) from the #14880 patch round (PR #15081), which measured the class and — per its remedy text — recorded the twins rather than re-keying the sweep. Tool-owner design call; this lane's.

          What

          scripts/pm/bare-root-worklist.mjs keys each recorded verdict on family constant word. A verdict is about a bare-root literal in a gate source file, never about an invocation of it — but since PR #15081 the derivation keys families on (script, args), so a gate CI invokes two ways (plain and --self-test) owes two identical verdicts for one literal. Nine such twins were recorded in the patch round (a labelled SECOND-KEY TWINS section); the class grows with the workflows, not with that file — every gate that gains a second invocation acquires a twin row on the next run, and its verdict must be copied by hand.

          What would close it

          Key the sweep's dedupe on the gate source file (the thing a verdict is about), folding twins into one row, with a migration that does not strand the existing rows as STALE — the patch round refused to do this because it re-decides which family a surviving row is attributed to, which is a redesign of the file's keying rather than the FRESH remedy its message names. The self-test's "none stale, none missing, none contradicted" invariant must hold across the migration; the recorded-verdict table shrinks by the nine twins in the same PR.

          Refs

          PR #15081 (the twins section and the reason) · #14880 (the derivation key) · #15083 (the other derivation-key residue on this lane's backlog).


          Generated by Claude Code

          Activity

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

          Metadata

          Metadata

          Assignees

          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

            bare-root-worklist keys verdicts per family, so a gate CI invokes two ways owes two identical rows — key the sweep on the gate source file and fold the nine twins without stranding them #15091

            Description

            @claude

            Filed by the domain:skills seat (session session_019RfFHiRCSs3JXLK4cwcfox, os-steve) from the #14880 patch round (PR #15081), which measured the class and — per its remedy text — recorded the twins rather than re-keying the sweep. Tool-owner design call; this lane's.

            What

            scripts/pm/bare-root-worklist.mjs keys each recorded verdict on family constant word. A verdict is about a bare-root literal in a gate source file, never about an invocation of it — but since PR #15081 the derivation keys families on (script, args), so a gate CI invokes two ways (plain and --self-test) owes two identical verdicts for one literal. Nine such twins were recorded in the patch round (a labelled SECOND-KEY TWINS section); the class grows with the workflows, not with that file — every gate that gains a second invocation acquires a twin row on the next run, and its verdict must be copied by hand.

            What would close it

            Key the sweep's dedupe on the gate source file (the thing a verdict is about), folding twins into one row, with a migration that does not strand the existing rows as STALE — the patch round refused to do this because it re-decides which family a surviving row is attributed to, which is a redesign of the file's keying rather than the FRESH remedy its message names. The self-test's "none stale, none missing, none contradicted" invariant must hold across the migration; the recorded-verdict table shrinks by the nine twins in the same PR.

            Refs

            PR #15081 (the twins section and the reason) · #14880 (the derivation key) · #15083 (the other derivation-key residue on this lane's backlog).


            Generated by Claude Code

            Activity

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

            Metadata

            Metadata

            Assignees

            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

              bare-root-worklist keys verdicts per family, so a gate CI invokes two ways owes two identical rows — key the sweep on the gate source file and fold the nine twins without stranding them #15091

              Description

              @claude

              Filed by the domain:skills seat (session session_019RfFHiRCSs3JXLK4cwcfox, os-steve) from the #14880 patch round (PR #15081), which measured the class and — per its remedy text — recorded the twins rather than re-keying the sweep. Tool-owner design call; this lane's.

              What

              scripts/pm/bare-root-worklist.mjs keys each recorded verdict on family constant word. A verdict is about a bare-root literal in a gate source file, never about an invocation of it — but since PR #15081 the derivation keys families on (script, args), so a gate CI invokes two ways (plain and --self-test) owes two identical verdicts for one literal. Nine such twins were recorded in the patch round (a labelled SECOND-KEY TWINS section); the class grows with the workflows, not with that file — every gate that gains a second invocation acquires a twin row on the next run, and its verdict must be copied by hand.

              What would close it

              Key the sweep's dedupe on the gate source file (the thing a verdict is about), folding twins into one row, with a migration that does not strand the existing rows as STALE — the patch round refused to do this because it re-decides which family a surviving row is attributed to, which is a redesign of the file's keying rather than the FRESH remedy its message names. The self-test's "none stale, none missing, none contradicted" invariant must hold across the migration; the recorded-verdict table shrinks by the nine twins in the same PR.

              Refs

              PR #15081 (the twins section and the reason) · #14880 (the derivation key) · #15083 (the other derivation-key residue on this lane's backlog).


              Generated by Claude Code

              Activity

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

              Metadata

              Metadata

              Assignees

              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

                bare-root-worklist keys verdicts per family, so a gate CI invokes two ways owes two identical rows — key the sweep on the gate source file and fold the nine twins without stranding them #15091

                Description

                @claude

                Filed by the domain:skills seat (session session_019RfFHiRCSs3JXLK4cwcfox, os-steve) from the #14880 patch round (PR #15081), which measured the class and — per its remedy text — recorded the twins rather than re-keying the sweep. Tool-owner design call; this lane's.

                What

                scripts/pm/bare-root-worklist.mjs keys each recorded verdict on family constant word. A verdict is about a bare-root literal in a gate source file, never about an invocation of it — but since PR #15081 the derivation keys families on (script, args), so a gate CI invokes two ways (plain and --self-test) owes two identical verdicts for one literal. Nine such twins were recorded in the patch round (a labelled SECOND-KEY TWINS section); the class grows with the workflows, not with that file — every gate that gains a second invocation acquires a twin row on the next run, and its verdict must be copied by hand.

                What would close it

                Key the sweep's dedupe on the gate source file (the thing a verdict is about), folding twins into one row, with a migration that does not strand the existing rows as STALE — the patch round refused to do this because it re-decides which family a surviving row is attributed to, which is a redesign of the file's keying rather than the FRESH remedy its message names. The self-test's "none stale, none missing, none contradicted" invariant must hold across the migration; the recorded-verdict table shrinks by the nine twins in the same PR.

                Refs

                PR #15081 (the twins section and the reason) · #14880 (the derivation key) · #15083 (the other derivation-key residue on this lane's backlog).


                Generated by Claude Code

                Activity

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

                Metadata

                Metadata

                Assignees

                Type

                Projects

                No projects

                  Milestone

                  No milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions