decision(skills): ~3,000 closed cards still carry pm:* state (2,064 pm:dispatched · 846 pm:queue · 555 contradictory) — census is in; rule the cleanup shape #13605

Description

@zhuangjianguo

Filed by the skills lane seat (session session_01EXxTW8mvPBhoHxmyPZ63de) from the #13526 census leg's first honest run — the grading on that card reserved the cleanup as its own decision card, and the census was its precondition. The numbers below are the deliverable.

First honest census (H39, at commit 9086f3ba9, fully paginated, control passed, PRs excluded)

residue on CLOSED cardscountoldest
pm:dispatched2,0642026-08-02 (#4551)
pm:queue8462026-08-02
pm:blocking27
pm:blocked18
pm:on-hold13
pm:awaiting-maintainer2
contradictory (pm:queue AND pm:dispatched, closed)555

Top lanes for closed pm:dispatched: no lane 656 · domain:devx 445 · domain:cli 366 · domain:spec 246 · domain:services 180.

Two corrections to #13526's own body, measured: its "at least 100 per lane per label" floor understates the pm:dispatched total by more than an order of magnitude, and its oldest specimen (2026-08-05) is three days later than the real floor (2026-08-02).

Why this is a decision card, not a sweep already running

The cleanup is ~3,000 label writes against the shared API pool (the 2026-08-16 rate-limit ruling is about exactly this pool). The census leg (H39) now keeps the number honest on every patrol run, so the backlog can no longer hide — but shrinking it is a mass write that wants an explicit shape:

  • A (recommended) — one-time sweep script (scripts/pm/**, pure code, direct lane): batched with off-peak pacing, idempotent, resumable from a cursor, strips pm:* from closed cards only, logs per-card before/after. Plus close-time hygiene: every seat strips pm:* in the same stroke as any close it performs (already the stated convention — the census proves it is systematically unfollowed).
  • B — close-time hygiene only; the ~3,000 backlog stays and the census carries it forever as a known constant.
  • C — sweep only the 555 contradictory cards (the actively misleading subset) + close-time hygiene; revisit the rest if they ever bite a query.

Refs: #13526 (the finding; closes via PR #13601) · PR #13601 (the census leg) · #13597 (value gate under which this filing passed: the residue corrupts every census, patrol and candidate query — mechanical, not prose).

Generated by Claude Code

Metadata

Metadata

Assignees

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

    decision(skills): ~3,000 closed cards still carry pm:* state (2,064 pm:dispatched · 846 pm:queue · 555 contradictory) — census is in; rule the cleanup shape #13605

    Description

    @zhuangjianguo

    Filed by the skills lane seat (session session_01EXxTW8mvPBhoHxmyPZ63de) from the #13526 census leg's first honest run — the grading on that card reserved the cleanup as its own decision card, and the census was its precondition. The numbers below are the deliverable.

    First honest census (H39, at commit 9086f3ba9, fully paginated, control passed, PRs excluded)

    residue on CLOSED cardscountoldest
    pm:dispatched2,0642026-08-02 (#4551)
    pm:queue8462026-08-02
    pm:blocking27
    pm:blocked18
    pm:on-hold13
    pm:awaiting-maintainer2
    contradictory (pm:queue AND pm:dispatched, closed)555

    Top lanes for closed pm:dispatched: no lane 656 · domain:devx 445 · domain:cli 366 · domain:spec 246 · domain:services 180.

    Two corrections to #13526's own body, measured: its "at least 100 per lane per label" floor understates the pm:dispatched total by more than an order of magnitude, and its oldest specimen (2026-08-05) is three days later than the real floor (2026-08-02).

    Why this is a decision card, not a sweep already running

    The cleanup is ~3,000 label writes against the shared API pool (the 2026-08-16 rate-limit ruling is about exactly this pool). The census leg (H39) now keeps the number honest on every patrol run, so the backlog can no longer hide — but shrinking it is a mass write that wants an explicit shape:

    • A (recommended) — one-time sweep script (scripts/pm/**, pure code, direct lane): batched with off-peak pacing, idempotent, resumable from a cursor, strips pm:* from closed cards only, logs per-card before/after. Plus close-time hygiene: every seat strips pm:* in the same stroke as any close it performs (already the stated convention — the census proves it is systematically unfollowed).
    • B — close-time hygiene only; the ~3,000 backlog stays and the census carries it forever as a known constant.
    • C — sweep only the 555 contradictory cards (the actively misleading subset) + close-time hygiene; revisit the rest if they ever bite a query.

    Refs: #13526 (the finding; closes via PR #13601) · PR #13601 (the census leg) · #13597 (value gate under which this filing passed: the residue corrupts every census, patrol and candidate query — mechanical, not prose).

    Generated by Claude Code

    Metadata

    Metadata

    Assignees

    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

      decision(skills): ~3,000 closed cards still carry pm:* state (2,064 pm:dispatched · 846 pm:queue · 555 contradictory) — census is in; rule the cleanup shape #13605

      Description

      @zhuangjianguo

      Filed by the skills lane seat (session session_01EXxTW8mvPBhoHxmyPZ63de) from the #13526 census leg's first honest run — the grading on that card reserved the cleanup as its own decision card, and the census was its precondition. The numbers below are the deliverable.

      First honest census (H39, at commit 9086f3ba9, fully paginated, control passed, PRs excluded)

      residue on CLOSED cardscountoldest
      pm:dispatched2,0642026-08-02 (#4551)
      pm:queue8462026-08-02
      pm:blocking27
      pm:blocked18
      pm:on-hold13
      pm:awaiting-maintainer2
      contradictory (pm:queue AND pm:dispatched, closed)555

      Top lanes for closed pm:dispatched: no lane 656 · domain:devx 445 · domain:cli 366 · domain:spec 246 · domain:services 180.

      Two corrections to #13526's own body, measured: its "at least 100 per lane per label" floor understates the pm:dispatched total by more than an order of magnitude, and its oldest specimen (2026-08-05) is three days later than the real floor (2026-08-02).

      Why this is a decision card, not a sweep already running

      The cleanup is ~3,000 label writes against the shared API pool (the 2026-08-16 rate-limit ruling is about exactly this pool). The census leg (H39) now keeps the number honest on every patrol run, so the backlog can no longer hide — but shrinking it is a mass write that wants an explicit shape:

      • A (recommended) — one-time sweep script (scripts/pm/**, pure code, direct lane): batched with off-peak pacing, idempotent, resumable from a cursor, strips pm:* from closed cards only, logs per-card before/after. Plus close-time hygiene: every seat strips pm:* in the same stroke as any close it performs (already the stated convention — the census proves it is systematically unfollowed).
      • B — close-time hygiene only; the ~3,000 backlog stays and the census carries it forever as a known constant.
      • C — sweep only the 555 contradictory cards (the actively misleading subset) + close-time hygiene; revisit the rest if they ever bite a query.

      Refs: #13526 (the finding; closes via PR #13601) · PR #13601 (the census leg) · #13597 (value gate under which this filing passed: the residue corrupts every census, patrol and candidate query — mechanical, not prose).

      Generated by Claude Code

      Metadata

      Metadata

      Assignees

      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

        decision(skills): ~3,000 closed cards still carry pm:* state (2,064 pm:dispatched · 846 pm:queue · 555 contradictory) — census is in; rule the cleanup shape #13605

        Description

        @zhuangjianguo

        Filed by the skills lane seat (session session_01EXxTW8mvPBhoHxmyPZ63de) from the #13526 census leg's first honest run — the grading on that card reserved the cleanup as its own decision card, and the census was its precondition. The numbers below are the deliverable.

        First honest census (H39, at commit 9086f3ba9, fully paginated, control passed, PRs excluded)

        residue on CLOSED cardscountoldest
        pm:dispatched2,0642026-08-02 (#4551)
        pm:queue8462026-08-02
        pm:blocking27
        pm:blocked18
        pm:on-hold13
        pm:awaiting-maintainer2
        contradictory (pm:queue AND pm:dispatched, closed)555

        Top lanes for closed pm:dispatched: no lane 656 · domain:devx 445 · domain:cli 366 · domain:spec 246 · domain:services 180.

        Two corrections to #13526's own body, measured: its "at least 100 per lane per label" floor understates the pm:dispatched total by more than an order of magnitude, and its oldest specimen (2026-08-05) is three days later than the real floor (2026-08-02).

        Why this is a decision card, not a sweep already running

        The cleanup is ~3,000 label writes against the shared API pool (the 2026-08-16 rate-limit ruling is about exactly this pool). The census leg (H39) now keeps the number honest on every patrol run, so the backlog can no longer hide — but shrinking it is a mass write that wants an explicit shape:

        • A (recommended) — one-time sweep script (scripts/pm/**, pure code, direct lane): batched with off-peak pacing, idempotent, resumable from a cursor, strips pm:* from closed cards only, logs per-card before/after. Plus close-time hygiene: every seat strips pm:* in the same stroke as any close it performs (already the stated convention — the census proves it is systematically unfollowed).
        • B — close-time hygiene only; the ~3,000 backlog stays and the census carries it forever as a known constant.
        • C — sweep only the 555 contradictory cards (the actively misleading subset) + close-time hygiene; revisit the rest if they ever bite a query.

        Refs: #13526 (the finding; closes via PR #13601) · PR #13601 (the census leg) · #13597 (value gate under which this filing passed: the residue corrupts every census, patrol and candidate query — mechanical, not prose).

        Generated by Claude Code

        Metadata

        Metadata

        Assignees

        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

          decision(skills): ~3,000 closed cards still carry pm:* state (2,064 pm:dispatched · 846 pm:queue · 555 contradictory) — census is in; rule the cleanup shape #13605

          Description

          @zhuangjianguo

          Filed by the skills lane seat (session session_01EXxTW8mvPBhoHxmyPZ63de) from the #13526 census leg's first honest run — the grading on that card reserved the cleanup as its own decision card, and the census was its precondition. The numbers below are the deliverable.

          First honest census (H39, at commit 9086f3ba9, fully paginated, control passed, PRs excluded)

          residue on CLOSED cardscountoldest
          pm:dispatched2,0642026-08-02 (#4551)
          pm:queue8462026-08-02
          pm:blocking27
          pm:blocked18
          pm:on-hold13
          pm:awaiting-maintainer2
          contradictory (pm:queue AND pm:dispatched, closed)555

          Top lanes for closed pm:dispatched: no lane 656 · domain:devx 445 · domain:cli 366 · domain:spec 246 · domain:services 180.

          Two corrections to #13526's own body, measured: its "at least 100 per lane per label" floor understates the pm:dispatched total by more than an order of magnitude, and its oldest specimen (2026-08-05) is three days later than the real floor (2026-08-02).

          Why this is a decision card, not a sweep already running

          The cleanup is ~3,000 label writes against the shared API pool (the 2026-08-16 rate-limit ruling is about exactly this pool). The census leg (H39) now keeps the number honest on every patrol run, so the backlog can no longer hide — but shrinking it is a mass write that wants an explicit shape:

          • A (recommended) — one-time sweep script (scripts/pm/**, pure code, direct lane): batched with off-peak pacing, idempotent, resumable from a cursor, strips pm:* from closed cards only, logs per-card before/after. Plus close-time hygiene: every seat strips pm:* in the same stroke as any close it performs (already the stated convention — the census proves it is systematically unfollowed).
          • B — close-time hygiene only; the ~3,000 backlog stays and the census carries it forever as a known constant.
          • C — sweep only the 555 contradictory cards (the actively misleading subset) + close-time hygiene; revisit the rest if they ever bite a query.

          Refs: #13526 (the finding; closes via PR #13601) · PR #13601 (the census leg) · #13597 (value gate under which this filing passed: the residue corrupts every census, patrol and candidate query — mechanical, not prose).

          Generated by Claude Code

          Metadata

          Metadata

          Assignees

          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

            decision(skills): ~3,000 closed cards still carry pm:* state (2,064 pm:dispatched · 846 pm:queue · 555 contradictory) — census is in; rule the cleanup shape #13605

            Description

            @zhuangjianguo

            Filed by the skills lane seat (session session_01EXxTW8mvPBhoHxmyPZ63de) from the #13526 census leg's first honest run — the grading on that card reserved the cleanup as its own decision card, and the census was its precondition. The numbers below are the deliverable.

            First honest census (H39, at commit 9086f3ba9, fully paginated, control passed, PRs excluded)

            residue on CLOSED cardscountoldest
            pm:dispatched2,0642026-08-02 (#4551)
            pm:queue8462026-08-02
            pm:blocking27
            pm:blocked18
            pm:on-hold13
            pm:awaiting-maintainer2
            contradictory (pm:queue AND pm:dispatched, closed)555

            Top lanes for closed pm:dispatched: no lane 656 · domain:devx 445 · domain:cli 366 · domain:spec 246 · domain:services 180.

            Two corrections to #13526's own body, measured: its "at least 100 per lane per label" floor understates the pm:dispatched total by more than an order of magnitude, and its oldest specimen (2026-08-05) is three days later than the real floor (2026-08-02).

            Why this is a decision card, not a sweep already running

            The cleanup is ~3,000 label writes against the shared API pool (the 2026-08-16 rate-limit ruling is about exactly this pool). The census leg (H39) now keeps the number honest on every patrol run, so the backlog can no longer hide — but shrinking it is a mass write that wants an explicit shape:

            • A (recommended) — one-time sweep script (scripts/pm/**, pure code, direct lane): batched with off-peak pacing, idempotent, resumable from a cursor, strips pm:* from closed cards only, logs per-card before/after. Plus close-time hygiene: every seat strips pm:* in the same stroke as any close it performs (already the stated convention — the census proves it is systematically unfollowed).
            • B — close-time hygiene only; the ~3,000 backlog stays and the census carries it forever as a known constant.
            • C — sweep only the 555 contradictory cards (the actively misleading subset) + close-time hygiene; revisit the rest if they ever bite a query.

            Refs: #13526 (the finding; closes via PR #13601) · PR #13601 (the census leg) · #13597 (value gate under which this filing passed: the residue corrupts every census, patrol and candidate query — mechanical, not prose).

            Generated by Claude Code

            Metadata

            Metadata

            Assignees

            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

              decision(skills): ~3,000 closed cards still carry pm:* state (2,064 pm:dispatched · 846 pm:queue · 555 contradictory) — census is in; rule the cleanup shape #13605

              Description

              @zhuangjianguo

              Filed by the skills lane seat (session session_01EXxTW8mvPBhoHxmyPZ63de) from the #13526 census leg's first honest run — the grading on that card reserved the cleanup as its own decision card, and the census was its precondition. The numbers below are the deliverable.

              First honest census (H39, at commit 9086f3ba9, fully paginated, control passed, PRs excluded)

              residue on CLOSED cardscountoldest
              pm:dispatched2,0642026-08-02 (#4551)
              pm:queue8462026-08-02
              pm:blocking27
              pm:blocked18
              pm:on-hold13
              pm:awaiting-maintainer2
              contradictory (pm:queue AND pm:dispatched, closed)555

              Top lanes for closed pm:dispatched: no lane 656 · domain:devx 445 · domain:cli 366 · domain:spec 246 · domain:services 180.

              Two corrections to #13526's own body, measured: its "at least 100 per lane per label" floor understates the pm:dispatched total by more than an order of magnitude, and its oldest specimen (2026-08-05) is three days later than the real floor (2026-08-02).

              Why this is a decision card, not a sweep already running

              The cleanup is ~3,000 label writes against the shared API pool (the 2026-08-16 rate-limit ruling is about exactly this pool). The census leg (H39) now keeps the number honest on every patrol run, so the backlog can no longer hide — but shrinking it is a mass write that wants an explicit shape:

              • A (recommended) — one-time sweep script (scripts/pm/**, pure code, direct lane): batched with off-peak pacing, idempotent, resumable from a cursor, strips pm:* from closed cards only, logs per-card before/after. Plus close-time hygiene: every seat strips pm:* in the same stroke as any close it performs (already the stated convention — the census proves it is systematically unfollowed).
              • B — close-time hygiene only; the ~3,000 backlog stays and the census carries it forever as a known constant.
              • C — sweep only the 555 contradictory cards (the actively misleading subset) + close-time hygiene; revisit the rest if they ever bite a query.

              Refs: #13526 (the finding; closes via PR #13601) · PR #13601 (the census leg) · #13597 (value gate under which this filing passed: the residue corrupts every census, patrol and candidate query — mechanical, not prose).

              Generated by Claude Code

              Metadata

              Metadata

              Assignees

              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

                decision(skills): ~3,000 closed cards still carry pm:* state (2,064 pm:dispatched · 846 pm:queue · 555 contradictory) — census is in; rule the cleanup shape #13605

                Description

                @zhuangjianguo

                Filed by the skills lane seat (session session_01EXxTW8mvPBhoHxmyPZ63de) from the #13526 census leg's first honest run — the grading on that card reserved the cleanup as its own decision card, and the census was its precondition. The numbers below are the deliverable.

                First honest census (H39, at commit 9086f3ba9, fully paginated, control passed, PRs excluded)

                residue on CLOSED cardscountoldest
                pm:dispatched2,0642026-08-02 (#4551)
                pm:queue8462026-08-02
                pm:blocking27
                pm:blocked18
                pm:on-hold13
                pm:awaiting-maintainer2
                contradictory (pm:queue AND pm:dispatched, closed)555

                Top lanes for closed pm:dispatched: no lane 656 · domain:devx 445 · domain:cli 366 · domain:spec 246 · domain:services 180.

                Two corrections to #13526's own body, measured: its "at least 100 per lane per label" floor understates the pm:dispatched total by more than an order of magnitude, and its oldest specimen (2026-08-05) is three days later than the real floor (2026-08-02).

                Why this is a decision card, not a sweep already running

                The cleanup is ~3,000 label writes against the shared API pool (the 2026-08-16 rate-limit ruling is about exactly this pool). The census leg (H39) now keeps the number honest on every patrol run, so the backlog can no longer hide — but shrinking it is a mass write that wants an explicit shape:

                • A (recommended) — one-time sweep script (scripts/pm/**, pure code, direct lane): batched with off-peak pacing, idempotent, resumable from a cursor, strips pm:* from closed cards only, logs per-card before/after. Plus close-time hygiene: every seat strips pm:* in the same stroke as any close it performs (already the stated convention — the census proves it is systematically unfollowed).
                • B — close-time hygiene only; the ~3,000 backlog stays and the census carries it forever as a known constant.
                • C — sweep only the 555 contradictory cards (the actively misleading subset) + close-time hygiene; revisit the rest if they ever bite a query.

                Refs: #13526 (the finding; closes via PR #13601) · PR #13601 (the census leg) · #13597 (value gate under which this filing passed: the residue corrupts every census, patrol and candidate query — mechanical, not prose).

                Generated by Claude Code

                Metadata

                Metadata

                Assignees

                Type

                No type

                Projects

                No projects

                  Milestone

                  No milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions