finding(tooling): MCP search_issues returns an empty result instead of an error when it cannot serve a query — 0 hits for a term present in 168 of 270 open issues, so every dedup done in that state passes vacuously #6852

Description

@claude

Filed by the objectuidomain:ui execution seat (PM session session_01CRJge11jso9TpXRWFt1Z49). Unassigned, unlabelled — grading and domain:* are triage's.

The failure

The MCP search_issues tool returns a well-formed empty result instead of an error when it cannot serve a query:

search_issues("repo:objectstack-ai/objectui is:issue is:open finding")
-> {"total_count": 0, "incomplete_results": false, "items": []}

Measured against the same repo at the same moment via repo-scoped REST list + local grep over all 270 open issues:

termMCP search_issuesREST list + grep
finding0168
triage0116
search52
dedup25

⇒ the tool reported zero for a term present in 168 of 270 open issues, with incomplete_results: false asserting the answer is complete.

⚠️It was working an hour earlier in the same sessionsearch_issues("… StudioDesignSurface") returned 3 hits at ~00:05Z and was used as the positive control for a real dedup check. The failure appeared later, so this is a state change, not a permanently broken tool.

⛔ Why this is worse than the 403 already on record

25 open issues already record /search/issues returning 403 ("sessions are bound to their configured repositories"). That is a safe failure: the caller sees an error, knows the channel is unavailable, and switches to REST list + grep — which several dev reports this week did explicitly, and which is what produced the control column above.

A silent empty result is the opposite. It is indistinguishable from "searched, found nothing" — which is exactly the answer a dedup check is looking for. ⇒ every dedup performed while the tool is in this state passes vacuously, and the filer has no signal that anything went wrong. The repo's own discipline (a zero is only a reading if a control term that must hit is run in the same query) is the only thing standing between this and a wave of duplicate cards — and that discipline is a convention, not a mechanism.

⭐ This is the same class the lane has been finding all week in test oracles — a check that cannot fail on the condition it exists to detect — but sitting in the tooling rather than in a test.

Suggested shape (⛔ not a ruling)

Mechanical options, roughly in order of strength:

  1. Make the tool fail loudly. If the underlying call is refused or throttled, surface an error rather than an empty result set. A caller that gets an error switches channels; a caller that gets [] files a duplicate.
  2. Make the agent-side contract require a control. The dedup step in os-dev / PM instructions could require a positive-control term in the same query shape, with the filing blocked unless the control fires — turning the existing convention into a checkable step. (Several dev reports already do this voluntarily and it is what caught this.)
  3. Prefer REST list + local grep as the documented dedup channel for this container, since it is demonstrably reachable and its completeness is provable — one dev report tonight listed 290 rows and matched it against open_issues_count to show the sweep was complete.

Reproduction

# via MCP
search_issues("repo:objectstack-ai/objectui is:issue is:open finding") -> total_count 0
# via repo-scoped REST, same instant
GET /repos/objectstack-ai/objectui/issues?state=open&per_page=100&page=1..3
-> 270 open issues, 168 of which contain "finding" in title or body

Dedup for this card used the REST channel with controls firing (search 52, dedup 25); silently returns empty returned 0 against those live controls, so the zero is a reading. Nearest neighbours checked and distinct: the 25 cards recording the 403, which is the loud failure, not this one.


Generated by Claude Code

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
       blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
      }
      } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
      })();
      (function(){
      try {
      var __m = "github.com";
      var __re = new RegExp('^' + "github\\.com" + '
      
      Skip to content

      finding(tooling): MCP search_issues returns an empty result instead of an error when it cannot serve a query — 0 hits for a term present in 168 of 270 open issues, so every dedup done in that state passes vacuously #6852

      Description

      @claude

      Filed by the objectuidomain:ui execution seat (PM session session_01CRJge11jso9TpXRWFt1Z49). Unassigned, unlabelled — grading and domain:* are triage's.

      The failure

      The MCP search_issues tool returns a well-formed empty result instead of an error when it cannot serve a query:

      search_issues("repo:objectstack-ai/objectui is:issue is:open finding")
      -> {"total_count": 0, "incomplete_results": false, "items": []}
      

      Measured against the same repo at the same moment via repo-scoped REST list + local grep over all 270 open issues:

      termMCP search_issuesREST list + grep
      finding0168
      triage0116
      search52
      dedup25

      ⇒ the tool reported zero for a term present in 168 of 270 open issues, with incomplete_results: false asserting the answer is complete.

      ⚠️It was working an hour earlier in the same sessionsearch_issues("… StudioDesignSurface") returned 3 hits at ~00:05Z and was used as the positive control for a real dedup check. The failure appeared later, so this is a state change, not a permanently broken tool.

      ⛔ Why this is worse than the 403 already on record

      25 open issues already record /search/issues returning 403 ("sessions are bound to their configured repositories"). That is a safe failure: the caller sees an error, knows the channel is unavailable, and switches to REST list + grep — which several dev reports this week did explicitly, and which is what produced the control column above.

      A silent empty result is the opposite. It is indistinguishable from "searched, found nothing" — which is exactly the answer a dedup check is looking for. ⇒ every dedup performed while the tool is in this state passes vacuously, and the filer has no signal that anything went wrong. The repo's own discipline (a zero is only a reading if a control term that must hit is run in the same query) is the only thing standing between this and a wave of duplicate cards — and that discipline is a convention, not a mechanism.

      ⭐ This is the same class the lane has been finding all week in test oracles — a check that cannot fail on the condition it exists to detect — but sitting in the tooling rather than in a test.

      Suggested shape (⛔ not a ruling)

      Mechanical options, roughly in order of strength:

      1. Make the tool fail loudly. If the underlying call is refused or throttled, surface an error rather than an empty result set. A caller that gets an error switches channels; a caller that gets [] files a duplicate.
      2. Make the agent-side contract require a control. The dedup step in os-dev / PM instructions could require a positive-control term in the same query shape, with the filing blocked unless the control fires — turning the existing convention into a checkable step. (Several dev reports already do this voluntarily and it is what caught this.)
      3. Prefer REST list + local grep as the documented dedup channel for this container, since it is demonstrably reachable and its completeness is provable — one dev report tonight listed 290 rows and matched it against open_issues_count to show the sweep was complete.

      Reproduction

      # via MCP
      search_issues("repo:objectstack-ai/objectui is:issue is:open finding") -> total_count 0
      # via repo-scoped REST, same instant
      GET /repos/objectstack-ai/objectui/issues?state=open&per_page=100&page=1..3
      -> 270 open issues, 168 of which contain "finding" in title or body
      

      Dedup for this card used the REST channel with controls firing (search 52, dedup 25); silently returns empty returned 0 against those live controls, so the zero is a reading. Nearest neighbours checked and distinct: the 25 cards recording the 403, which is the loud failure, not this one.


      Generated by Claude Code

      Metadata

      Metadata

      Assignees

      No one assigned

        Type

        Projects

        No projects

          Milestone

          No milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
          Skip to content

          finding(tooling): MCP search_issues returns an empty result instead of an error when it cannot serve a query — 0 hits for a term present in 168 of 270 open issues, so every dedup done in that state passes vacuously #6852

          Description

          @claude

          Filed by the objectuidomain:ui execution seat (PM session session_01CRJge11jso9TpXRWFt1Z49). Unassigned, unlabelled — grading and domain:* are triage's.

          The failure

          The MCP search_issues tool returns a well-formed empty result instead of an error when it cannot serve a query:

          search_issues("repo:objectstack-ai/objectui is:issue is:open finding")
          -> {"total_count": 0, "incomplete_results": false, "items": []}
          

          Measured against the same repo at the same moment via repo-scoped REST list + local grep over all 270 open issues:

          termMCP search_issuesREST list + grep
          finding0168
          triage0116
          search52
          dedup25

          ⇒ the tool reported zero for a term present in 168 of 270 open issues, with incomplete_results: false asserting the answer is complete.

          ⚠️It was working an hour earlier in the same sessionsearch_issues("… StudioDesignSurface") returned 3 hits at ~00:05Z and was used as the positive control for a real dedup check. The failure appeared later, so this is a state change, not a permanently broken tool.

          ⛔ Why this is worse than the 403 already on record

          25 open issues already record /search/issues returning 403 ("sessions are bound to their configured repositories"). That is a safe failure: the caller sees an error, knows the channel is unavailable, and switches to REST list + grep — which several dev reports this week did explicitly, and which is what produced the control column above.

          A silent empty result is the opposite. It is indistinguishable from "searched, found nothing" — which is exactly the answer a dedup check is looking for. ⇒ every dedup performed while the tool is in this state passes vacuously, and the filer has no signal that anything went wrong. The repo's own discipline (a zero is only a reading if a control term that must hit is run in the same query) is the only thing standing between this and a wave of duplicate cards — and that discipline is a convention, not a mechanism.

          ⭐ This is the same class the lane has been finding all week in test oracles — a check that cannot fail on the condition it exists to detect — but sitting in the tooling rather than in a test.

          Suggested shape (⛔ not a ruling)

          Mechanical options, roughly in order of strength:

          1. Make the tool fail loudly. If the underlying call is refused or throttled, surface an error rather than an empty result set. A caller that gets an error switches channels; a caller that gets [] files a duplicate.
          2. Make the agent-side contract require a control. The dedup step in os-dev / PM instructions could require a positive-control term in the same query shape, with the filing blocked unless the control fires — turning the existing convention into a checkable step. (Several dev reports already do this voluntarily and it is what caught this.)
          3. Prefer REST list + local grep as the documented dedup channel for this container, since it is demonstrably reachable and its completeness is provable — one dev report tonight listed 290 rows and matched it against open_issues_count to show the sweep was complete.

          Reproduction

          # via MCP
          search_issues("repo:objectstack-ai/objectui is:issue is:open finding") -> total_count 0
          # via repo-scoped REST, same instant
          GET /repos/objectstack-ai/objectui/issues?state=open&per_page=100&page=1..3
          -> 270 open issues, 168 of which contain "finding" in title or body
          

          Dedup for this card used the REST channel with controls firing (search 52, dedup 25); silently returns empty returned 0 against those live controls, so the zero is a reading. Nearest neighbours checked and distinct: the 25 cards recording the 403, which is the loud failure, not this one.


          Generated by Claude Code

          Metadata

          Metadata

          Assignees

          No one assigned

            Type

            Projects

            No projects

              Milestone

              No milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
              Skip to content

              finding(tooling): MCP search_issues returns an empty result instead of an error when it cannot serve a query — 0 hits for a term present in 168 of 270 open issues, so every dedup done in that state passes vacuously #6852

              Description

              @claude

              Filed by the objectuidomain:ui execution seat (PM session session_01CRJge11jso9TpXRWFt1Z49). Unassigned, unlabelled — grading and domain:* are triage's.

              The failure

              The MCP search_issues tool returns a well-formed empty result instead of an error when it cannot serve a query:

              search_issues("repo:objectstack-ai/objectui is:issue is:open finding")
              -> {"total_count": 0, "incomplete_results": false, "items": []}
              

              Measured against the same repo at the same moment via repo-scoped REST list + local grep over all 270 open issues:

              termMCP search_issuesREST list + grep
              finding0168
              triage0116
              search52
              dedup25

              ⇒ the tool reported zero for a term present in 168 of 270 open issues, with incomplete_results: false asserting the answer is complete.

              ⚠️It was working an hour earlier in the same sessionsearch_issues("… StudioDesignSurface") returned 3 hits at ~00:05Z and was used as the positive control for a real dedup check. The failure appeared later, so this is a state change, not a permanently broken tool.

              ⛔ Why this is worse than the 403 already on record

              25 open issues already record /search/issues returning 403 ("sessions are bound to their configured repositories"). That is a safe failure: the caller sees an error, knows the channel is unavailable, and switches to REST list + grep — which several dev reports this week did explicitly, and which is what produced the control column above.

              A silent empty result is the opposite. It is indistinguishable from "searched, found nothing" — which is exactly the answer a dedup check is looking for. ⇒ every dedup performed while the tool is in this state passes vacuously, and the filer has no signal that anything went wrong. The repo's own discipline (a zero is only a reading if a control term that must hit is run in the same query) is the only thing standing between this and a wave of duplicate cards — and that discipline is a convention, not a mechanism.

              ⭐ This is the same class the lane has been finding all week in test oracles — a check that cannot fail on the condition it exists to detect — but sitting in the tooling rather than in a test.

              Suggested shape (⛔ not a ruling)

              Mechanical options, roughly in order of strength:

              1. Make the tool fail loudly. If the underlying call is refused or throttled, surface an error rather than an empty result set. A caller that gets an error switches channels; a caller that gets [] files a duplicate.
              2. Make the agent-side contract require a control. The dedup step in os-dev / PM instructions could require a positive-control term in the same query shape, with the filing blocked unless the control fires — turning the existing convention into a checkable step. (Several dev reports already do this voluntarily and it is what caught this.)
              3. Prefer REST list + local grep as the documented dedup channel for this container, since it is demonstrably reachable and its completeness is provable — one dev report tonight listed 290 rows and matched it against open_issues_count to show the sweep was complete.

              Reproduction

              # via MCP
              search_issues("repo:objectstack-ai/objectui is:issue is:open finding") -> total_count 0
              # via repo-scoped REST, same instant
              GET /repos/objectstack-ai/objectui/issues?state=open&per_page=100&page=1..3
              -> 270 open issues, 168 of which contain "finding" in title or body
              

              Dedup for this card used the REST channel with controls firing (search 52, dedup 25); silently returns empty returned 0 against those live controls, so the zero is a reading. Nearest neighbours checked and distinct: the 25 cards recording the 403, which is the loud failure, not this one.


              Generated by Claude Code

              Metadata

              Metadata

              Assignees

              No one assigned

                Type

                Projects

                No projects

                  Milestone

                  No milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions

                  , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
                  Skip to content

                  finding(tooling): MCP search_issues returns an empty result instead of an error when it cannot serve a query — 0 hits for a term present in 168 of 270 open issues, so every dedup done in that state passes vacuously #6852

                  Description

                  @claude

                  Filed by the objectuidomain:ui execution seat (PM session session_01CRJge11jso9TpXRWFt1Z49). Unassigned, unlabelled — grading and domain:* are triage's.

                  The failure

                  The MCP search_issues tool returns a well-formed empty result instead of an error when it cannot serve a query:

                  search_issues("repo:objectstack-ai/objectui is:issue is:open finding")
                  -> {"total_count": 0, "incomplete_results": false, "items": []}
                  

                  Measured against the same repo at the same moment via repo-scoped REST list + local grep over all 270 open issues:

                  termMCP search_issuesREST list + grep
                  finding0168
                  triage0116
                  search52
                  dedup25

                  ⇒ the tool reported zero for a term present in 168 of 270 open issues, with incomplete_results: false asserting the answer is complete.

                  ⚠️It was working an hour earlier in the same sessionsearch_issues("… StudioDesignSurface") returned 3 hits at ~00:05Z and was used as the positive control for a real dedup check. The failure appeared later, so this is a state change, not a permanently broken tool.

                  ⛔ Why this is worse than the 403 already on record

                  25 open issues already record /search/issues returning 403 ("sessions are bound to their configured repositories"). That is a safe failure: the caller sees an error, knows the channel is unavailable, and switches to REST list + grep — which several dev reports this week did explicitly, and which is what produced the control column above.

                  A silent empty result is the opposite. It is indistinguishable from "searched, found nothing" — which is exactly the answer a dedup check is looking for. ⇒ every dedup performed while the tool is in this state passes vacuously, and the filer has no signal that anything went wrong. The repo's own discipline (a zero is only a reading if a control term that must hit is run in the same query) is the only thing standing between this and a wave of duplicate cards — and that discipline is a convention, not a mechanism.

                  ⭐ This is the same class the lane has been finding all week in test oracles — a check that cannot fail on the condition it exists to detect — but sitting in the tooling rather than in a test.

                  Suggested shape (⛔ not a ruling)

                  Mechanical options, roughly in order of strength:

                  1. Make the tool fail loudly. If the underlying call is refused or throttled, surface an error rather than an empty result set. A caller that gets an error switches channels; a caller that gets [] files a duplicate.
                  2. Make the agent-side contract require a control. The dedup step in os-dev / PM instructions could require a positive-control term in the same query shape, with the filing blocked unless the control fires — turning the existing convention into a checkable step. (Several dev reports already do this voluntarily and it is what caught this.)
                  3. Prefer REST list + local grep as the documented dedup channel for this container, since it is demonstrably reachable and its completeness is provable — one dev report tonight listed 290 rows and matched it against open_issues_count to show the sweep was complete.

                  Reproduction

                  # via MCP
                  search_issues("repo:objectstack-ai/objectui is:issue is:open finding") -> total_count 0
                  # via repo-scoped REST, same instant
                  GET /repos/objectstack-ai/objectui/issues?state=open&per_page=100&page=1..3
                  -> 270 open issues, 168 of which contain "finding" in title or body
                  

                  Dedup for this card used the REST channel with controls firing (search 52, dedup 25); silently returns empty returned 0 against those live controls, so the zero is a reading. Nearest neighbours checked and distinct: the 25 cards recording the 403, which is the loud failure, not this one.


                  Generated by Claude Code

                  Metadata

                  Metadata

                  Assignees

                  No one assigned

                    Type

                    Projects

                    No projects

                      Milestone

                      No milestone

                      Relationships

                      None yet

                      Development

                      No branches or pull requests

                      Issue actions

                      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
                      Skip to content

                      finding(tooling): MCP search_issues returns an empty result instead of an error when it cannot serve a query — 0 hits for a term present in 168 of 270 open issues, so every dedup done in that state passes vacuously #6852

                      Description

                      @claude

                      Filed by the objectuidomain:ui execution seat (PM session session_01CRJge11jso9TpXRWFt1Z49). Unassigned, unlabelled — grading and domain:* are triage's.

                      The failure

                      The MCP search_issues tool returns a well-formed empty result instead of an error when it cannot serve a query:

                      search_issues("repo:objectstack-ai/objectui is:issue is:open finding")
                      -> {"total_count": 0, "incomplete_results": false, "items": []}
                      

                      Measured against the same repo at the same moment via repo-scoped REST list + local grep over all 270 open issues:

                      termMCP search_issuesREST list + grep
                      finding0168
                      triage0116
                      search52
                      dedup25

                      ⇒ the tool reported zero for a term present in 168 of 270 open issues, with incomplete_results: false asserting the answer is complete.

                      ⚠️It was working an hour earlier in the same sessionsearch_issues("… StudioDesignSurface") returned 3 hits at ~00:05Z and was used as the positive control for a real dedup check. The failure appeared later, so this is a state change, not a permanently broken tool.

                      ⛔ Why this is worse than the 403 already on record

                      25 open issues already record /search/issues returning 403 ("sessions are bound to their configured repositories"). That is a safe failure: the caller sees an error, knows the channel is unavailable, and switches to REST list + grep — which several dev reports this week did explicitly, and which is what produced the control column above.

                      A silent empty result is the opposite. It is indistinguishable from "searched, found nothing" — which is exactly the answer a dedup check is looking for. ⇒ every dedup performed while the tool is in this state passes vacuously, and the filer has no signal that anything went wrong. The repo's own discipline (a zero is only a reading if a control term that must hit is run in the same query) is the only thing standing between this and a wave of duplicate cards — and that discipline is a convention, not a mechanism.

                      ⭐ This is the same class the lane has been finding all week in test oracles — a check that cannot fail on the condition it exists to detect — but sitting in the tooling rather than in a test.

                      Suggested shape (⛔ not a ruling)

                      Mechanical options, roughly in order of strength:

                      1. Make the tool fail loudly. If the underlying call is refused or throttled, surface an error rather than an empty result set. A caller that gets an error switches channels; a caller that gets [] files a duplicate.
                      2. Make the agent-side contract require a control. The dedup step in os-dev / PM instructions could require a positive-control term in the same query shape, with the filing blocked unless the control fires — turning the existing convention into a checkable step. (Several dev reports already do this voluntarily and it is what caught this.)
                      3. Prefer REST list + local grep as the documented dedup channel for this container, since it is demonstrably reachable and its completeness is provable — one dev report tonight listed 290 rows and matched it against open_issues_count to show the sweep was complete.

                      Reproduction

                      # via MCP
                      search_issues("repo:objectstack-ai/objectui is:issue is:open finding") -> total_count 0
                      # via repo-scoped REST, same instant
                      GET /repos/objectstack-ai/objectui/issues?state=open&per_page=100&page=1..3
                      -> 270 open issues, 168 of which contain "finding" in title or body
                      

                      Dedup for this card used the REST channel with controls firing (search 52, dedup 25); silently returns empty returned 0 against those live controls, so the zero is a reading. Nearest neighbours checked and distinct: the 25 cards recording the 403, which is the loud failure, not this one.


                      Generated by Claude Code

                      Metadata

                      Metadata

                      Assignees

                      No one assigned

                        Type

                        Projects

                        No projects

                          Milestone

                          No milestone

                          Relationships

                          None yet

                          Development

                          No branches or pull requests

                          Issue actions

                          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
                          Skip to content

                          finding(tooling): MCP search_issues returns an empty result instead of an error when it cannot serve a query — 0 hits for a term present in 168 of 270 open issues, so every dedup done in that state passes vacuously #6852

                          Description

                          @claude

                          Filed by the objectuidomain:ui execution seat (PM session session_01CRJge11jso9TpXRWFt1Z49). Unassigned, unlabelled — grading and domain:* are triage's.

                          The failure

                          The MCP search_issues tool returns a well-formed empty result instead of an error when it cannot serve a query:

                          search_issues("repo:objectstack-ai/objectui is:issue is:open finding")
                          -> {"total_count": 0, "incomplete_results": false, "items": []}
                          

                          Measured against the same repo at the same moment via repo-scoped REST list + local grep over all 270 open issues:

                          termMCP search_issuesREST list + grep
                          finding0168
                          triage0116
                          search52
                          dedup25

                          ⇒ the tool reported zero for a term present in 168 of 270 open issues, with incomplete_results: false asserting the answer is complete.

                          ⚠️It was working an hour earlier in the same sessionsearch_issues("… StudioDesignSurface") returned 3 hits at ~00:05Z and was used as the positive control for a real dedup check. The failure appeared later, so this is a state change, not a permanently broken tool.

                          ⛔ Why this is worse than the 403 already on record

                          25 open issues already record /search/issues returning 403 ("sessions are bound to their configured repositories"). That is a safe failure: the caller sees an error, knows the channel is unavailable, and switches to REST list + grep — which several dev reports this week did explicitly, and which is what produced the control column above.

                          A silent empty result is the opposite. It is indistinguishable from "searched, found nothing" — which is exactly the answer a dedup check is looking for. ⇒ every dedup performed while the tool is in this state passes vacuously, and the filer has no signal that anything went wrong. The repo's own discipline (a zero is only a reading if a control term that must hit is run in the same query) is the only thing standing between this and a wave of duplicate cards — and that discipline is a convention, not a mechanism.

                          ⭐ This is the same class the lane has been finding all week in test oracles — a check that cannot fail on the condition it exists to detect — but sitting in the tooling rather than in a test.

                          Suggested shape (⛔ not a ruling)

                          Mechanical options, roughly in order of strength:

                          1. Make the tool fail loudly. If the underlying call is refused or throttled, surface an error rather than an empty result set. A caller that gets an error switches channels; a caller that gets [] files a duplicate.
                          2. Make the agent-side contract require a control. The dedup step in os-dev / PM instructions could require a positive-control term in the same query shape, with the filing blocked unless the control fires — turning the existing convention into a checkable step. (Several dev reports already do this voluntarily and it is what caught this.)
                          3. Prefer REST list + local grep as the documented dedup channel for this container, since it is demonstrably reachable and its completeness is provable — one dev report tonight listed 290 rows and matched it against open_issues_count to show the sweep was complete.

                          Reproduction

                          # via MCP
                          search_issues("repo:objectstack-ai/objectui is:issue is:open finding") -> total_count 0
                          # via repo-scoped REST, same instant
                          GET /repos/objectstack-ai/objectui/issues?state=open&per_page=100&page=1..3
                          -> 270 open issues, 168 of which contain "finding" in title or body
                          

                          Dedup for this card used the REST channel with controls firing (search 52, dedup 25); silently returns empty returned 0 against those live controls, so the zero is a reading. Nearest neighbours checked and distinct: the 25 cards recording the 403, which is the loud failure, not this one.


                          Generated by Claude Code

                          Metadata

                          Metadata

                          Assignees

                          No one assigned

                            Type

                            Projects

                            No projects

                              Milestone

                              No milestone

                              Relationships

                              None yet

                              Development

                              No branches or pull requests

                              Issue actions

                              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
                              Skip to content

                              finding(tooling): MCP search_issues returns an empty result instead of an error when it cannot serve a query — 0 hits for a term present in 168 of 270 open issues, so every dedup done in that state passes vacuously #6852

                              Description

                              @claude

                              Filed by the objectuidomain:ui execution seat (PM session session_01CRJge11jso9TpXRWFt1Z49). Unassigned, unlabelled — grading and domain:* are triage's.

                              The failure

                              The MCP search_issues tool returns a well-formed empty result instead of an error when it cannot serve a query:

                              search_issues("repo:objectstack-ai/objectui is:issue is:open finding")
                              -> {"total_count": 0, "incomplete_results": false, "items": []}
                              

                              Measured against the same repo at the same moment via repo-scoped REST list + local grep over all 270 open issues:

                              termMCP search_issuesREST list + grep
                              finding0168
                              triage0116
                              search52
                              dedup25

                              ⇒ the tool reported zero for a term present in 168 of 270 open issues, with incomplete_results: false asserting the answer is complete.

                              ⚠️It was working an hour earlier in the same sessionsearch_issues("… StudioDesignSurface") returned 3 hits at ~00:05Z and was used as the positive control for a real dedup check. The failure appeared later, so this is a state change, not a permanently broken tool.

                              ⛔ Why this is worse than the 403 already on record

                              25 open issues already record /search/issues returning 403 ("sessions are bound to their configured repositories"). That is a safe failure: the caller sees an error, knows the channel is unavailable, and switches to REST list + grep — which several dev reports this week did explicitly, and which is what produced the control column above.

                              A silent empty result is the opposite. It is indistinguishable from "searched, found nothing" — which is exactly the answer a dedup check is looking for. ⇒ every dedup performed while the tool is in this state passes vacuously, and the filer has no signal that anything went wrong. The repo's own discipline (a zero is only a reading if a control term that must hit is run in the same query) is the only thing standing between this and a wave of duplicate cards — and that discipline is a convention, not a mechanism.

                              ⭐ This is the same class the lane has been finding all week in test oracles — a check that cannot fail on the condition it exists to detect — but sitting in the tooling rather than in a test.

                              Suggested shape (⛔ not a ruling)

                              Mechanical options, roughly in order of strength:

                              1. Make the tool fail loudly. If the underlying call is refused or throttled, surface an error rather than an empty result set. A caller that gets an error switches channels; a caller that gets [] files a duplicate.
                              2. Make the agent-side contract require a control. The dedup step in os-dev / PM instructions could require a positive-control term in the same query shape, with the filing blocked unless the control fires — turning the existing convention into a checkable step. (Several dev reports already do this voluntarily and it is what caught this.)
                              3. Prefer REST list + local grep as the documented dedup channel for this container, since it is demonstrably reachable and its completeness is provable — one dev report tonight listed 290 rows and matched it against open_issues_count to show the sweep was complete.

                              Reproduction

                              # via MCP
                              search_issues("repo:objectstack-ai/objectui is:issue is:open finding") -> total_count 0
                              # via repo-scoped REST, same instant
                              GET /repos/objectstack-ai/objectui/issues?state=open&per_page=100&page=1..3
                              -> 270 open issues, 168 of which contain "finding" in title or body
                              

                              Dedup for this card used the REST channel with controls firing (search 52, dedup 25); silently returns empty returned 0 against those live controls, so the zero is a reading. Nearest neighbours checked and distinct: the 25 cards recording the 403, which is the loud failure, not this one.


                              Generated by Claude Code

                              Metadata

                              Metadata

                              Assignees

                              No one assigned

                                Type

                                Projects

                                No projects

                                  Milestone

                                  No milestone

                                  Relationships

                                  None yet

                                  Development

                                  No branches or pull requests

                                  Issue actions