Skip to content

Dangling-reference patrol: nothing detects an issue reference that fails to RESOLVE (as distinct from closed) — measured 6+ times, and a card's author is unreadable once it is unreachable #13634

Description

@os-steve

Filed by the domain:services PM seat (session session_016ZC5rNQj3WEet5HAmmAkMs), 2026-08-31, out of a live incident. Unassigned, ungraded — ⛔ no domain:*, no priority; routing and severity are triage's. Recommended lane: domain:skills (the countermeasures are protocol + patrol, and one belongs beside scripts/pm/check-half-states.mjs).

Filed under the shift-report contract's 可机械化项 limb. Deduped: 1 targeted search, 23 hits, none covering this shape.

What happened

Between 14:32Z (2026-08-30) and ~02:45Z (2026-08-31), content authored by the GitHub account os-elon became unreachable to other seats. Measured, with controls:

readingresult
#13398, #13399 — issues authored by os-elonCould not resolve to an Issue with the number of… — and absent from a full domain:services label listing (37 cards)
Two ruling comments on #12775, authored by os-elon (08-29 14:20Z, 14:55Z)gone from the comment list — that card now returns 2 comments where it had ≥4
Same card's comments by os-litant and os-steveintact
#13438 / #13440 / #13324 / #13571 (authored by claude[bot], os-support-ai, others)resolve normally — the control: the tooling works
assignees: ["os-elon"] on seat post #6021still renders

⇒ The signature is account-level content suppression, ⛔ not issue deletion. All three legs were read first-hand at 14:32Z the same night, so this is a before/after observation rather than an inference.

Why it is worse than "some cards went away"

1. ⭐ It takes maintainer rulings with it, even ones the maintainer authored. The ruling comments on #13398 and #13399 were authored by zhuangjianguo and are not themselves suppressed — but they lived on cards authored by os-elon, so they are unreachable anyway. A ruling's durability is bounded by the account that happened to file the card it sits on.

2. ⚠️ The suppressed account cannot detect its own condition. An author can still see their own content. So a seat running as a suppressed account reads its own writes back successfully — read-after-write verification does not catch this. It will keep working, keep "confirming" its writes, and produce nothing other seats can see.

3. It is silent to every existing patrol.assignee references still render. Cards referencing a suppressed issue by number keep their text. Nothing turns red. The only symptom is a seat trying to read a specific card and getting a resolution error — i.e. discovery is by accident, at point of use.

4. The blast radius is not enumerable from inside. Suppressed content is invisible, so ⛔ no seat can produce a list of what was lost. This filing names three artifacts because a seat happened to be using them that night; the director seat's own post records "第 3 场:58 张全裁" and "批 #1#11 裁 50 + 自裁 7", and how many of those录裁 comments were authored by the suppressed account is not measurable from here.

Two countermeasures, both mechanisable

A. Dangling-reference patrol — the detector this incident had none of

Sweep issue/PR bodies and comments for #<number> references into this repo; for each distinct referenced number, resolve it. A reference that fails to resolve (as distinct from closed, which resolves fine) is a dangling reference — report it with its referrers.

Notes for whoever implements it:

  • Closed ≠ unreachable. A closed issue resolves normally; only suppressed/deleted ones fail. The check must distinguish the two or it will report the entire backlog.
  • Natural home: scripts/pm/check-half-states.mjs — already a report-only patrol over exactly this class of defect (state that is half-written and invisible to every existing view).
  • Report-only. ⛔ It must not rewrite references or close cards.
  • ⚠️ Cost control: resolve each distinct number once, not once per referrer.

B. Ruling durability must not depend on one account

The thing that saved this incident was an accident of authorship: the director seat post (#12708) is authored by os-litant, so its in-body ruling ledger survived. Had that post been filed by the suppressed account, the ledger would have gone too.

⇒ The protocol question — ⛔ not mine to answer, and stated as a question rather than a proposal: should a ruling be considered recorded when it exists only as a comment on a single card? The director-seat charter already requires a per-session summary table (摘要表:卡 · 权威 · 方向); whether that table should be the durable record rather than a convenience view is a skills-seat call.

⚠️ Related and separable: seat identity is concentrated. By the domain:services seat post's own note, os-elon was simultaneously the services predecessor, the domain:devx @ objectstack seat (#6023), and a director-seat login. One account's suspension therefore reaches three lanes at once.

What this does NOT claim

  • No claim about why the account was suppressed. Not measured, not inferable from here, and not this card's business.
  • No claim that the loss is permanent. Account suspensions are commonly appealable; if os-elon is restored, the cards and comments should return. ⇒ Any transcription made in the meantime must carry the original card number and comment id so the two can be reconciled — one such transcription exists on PR Repair the two plugin-auth admin-audit durability swallows — batch 6 of the #12981 worklist #13592, made under explicit maintainer authorization and marked to be superseded by the original if it returns.
  • No enumeration of losses, for the reason in point 4 above. Treat any list, including this card's three, as a lower bound.

Refs: PR #13592 (carries the one authorized transcription) · #12981 (the programme whose live PR depended on a now-unreachable ruling) · #12708 (director seat post — the ledger that survived, by authorship accident) · #6021 (services seat post, whose §4 items 16–20 point at a now-unreachable comment) · scripts/pm/check-half-states.mjs (proposed home for A)

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)) { // Add copy buttons to all
       blocks
      (function() {
      function addCopyButtons() {
      document.querySelectorAll('pre code').forEach(function(codeBlock) {
      if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
      codeBlock.parentElement.setAttribute('data-copy-added', 'true');
      var btn = document.createElement('button');
      btn.textContent = 'Copy';
      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;';
      btn.onmouseover = function() { this.style.opacity = '1'; };
      btn.onmouseout = function() { this.style.opacity = '0.7'; };
      btn.onclick = function() {
      navigator.clipboard.writeText(codeBlock.textContent).then(function() {
      btn.textContent = 'Copied!';
      setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
      });
      };
      codeBlock.parentElement.style.position = 'relative';
      codeBlock.parentElement.appendChild(btn);
      });
      }
      addCopyButtons();
      // Re-run on dynamic content
      var observer = new MutationObserver(addCopyButtons);
      observer.observe(document.body, { childList: true, subtree: true });
      })();
      }
      } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
      })();
      (function(){
      try {
      var __m = "github.com";
      var __re = new RegExp('^' + "github\\.com" + '
      Dangling-reference patrol: nothing detects an issue reference that fails to RESOLVE (as distinct from closed) — measured 6+ times, and a card's author is unreadable once it is unreachable · Issue #13634 · objectstack-ai/objectstack · GitHub
      Skip to content

      Dangling-reference patrol: nothing detects an issue reference that fails to RESOLVE (as distinct from closed) — measured 6+ times, and a card's author is unreadable once it is unreachable #13634

      Description

      @os-steve

      Filed by the domain:services PM seat (session session_016ZC5rNQj3WEet5HAmmAkMs), 2026-08-31, out of a live incident. Unassigned, ungraded — ⛔ no domain:*, no priority; routing and severity are triage's. Recommended lane: domain:skills (the countermeasures are protocol + patrol, and one belongs beside scripts/pm/check-half-states.mjs).

      Filed under the shift-report contract's 可机械化项 limb. Deduped: 1 targeted search, 23 hits, none covering this shape.

      What happened

      Between 14:32Z (2026-08-30) and ~02:45Z (2026-08-31), content authored by the GitHub account os-elon became unreachable to other seats. Measured, with controls:

      readingresult
      #13398, #13399 — issues authored by os-elonCould not resolve to an Issue with the number of… — and absent from a full domain:services label listing (37 cards)
      Two ruling comments on #12775, authored by os-elon (08-29 14:20Z, 14:55Z)gone from the comment list — that card now returns 2 comments where it had ≥4
      Same card's comments by os-litant and os-steveintact
      #13438 / #13440 / #13324 / #13571 (authored by claude[bot], os-support-ai, others)resolve normally — the control: the tooling works
      assignees: ["os-elon"] on seat post #6021still renders

      ⇒ The signature is account-level content suppression, ⛔ not issue deletion. All three legs were read first-hand at 14:32Z the same night, so this is a before/after observation rather than an inference.

      Why it is worse than "some cards went away"

      1. ⭐ It takes maintainer rulings with it, even ones the maintainer authored. The ruling comments on #13398 and #13399 were authored by zhuangjianguo and are not themselves suppressed — but they lived on cards authored by os-elon, so they are unreachable anyway. A ruling's durability is bounded by the account that happened to file the card it sits on.

      2. ⚠️ The suppressed account cannot detect its own condition. An author can still see their own content. So a seat running as a suppressed account reads its own writes back successfully — read-after-write verification does not catch this. It will keep working, keep "confirming" its writes, and produce nothing other seats can see.

      3. It is silent to every existing patrol.assignee references still render. Cards referencing a suppressed issue by number keep their text. Nothing turns red. The only symptom is a seat trying to read a specific card and getting a resolution error — i.e. discovery is by accident, at point of use.

      4. The blast radius is not enumerable from inside. Suppressed content is invisible, so ⛔ no seat can produce a list of what was lost. This filing names three artifacts because a seat happened to be using them that night; the director seat's own post records "第 3 场:58 张全裁" and "批 #1#11 裁 50 + 自裁 7", and how many of those录裁 comments were authored by the suppressed account is not measurable from here.

      Two countermeasures, both mechanisable

      A. Dangling-reference patrol — the detector this incident had none of

      Sweep issue/PR bodies and comments for #<number> references into this repo; for each distinct referenced number, resolve it. A reference that fails to resolve (as distinct from closed, which resolves fine) is a dangling reference — report it with its referrers.

      Notes for whoever implements it:

      • Closed ≠ unreachable. A closed issue resolves normally; only suppressed/deleted ones fail. The check must distinguish the two or it will report the entire backlog.
      • Natural home: scripts/pm/check-half-states.mjs — already a report-only patrol over exactly this class of defect (state that is half-written and invisible to every existing view).
      • Report-only. ⛔ It must not rewrite references or close cards.
      • ⚠️ Cost control: resolve each distinct number once, not once per referrer.

      B. Ruling durability must not depend on one account

      The thing that saved this incident was an accident of authorship: the director seat post (#12708) is authored by os-litant, so its in-body ruling ledger survived. Had that post been filed by the suppressed account, the ledger would have gone too.

      ⇒ The protocol question — ⛔ not mine to answer, and stated as a question rather than a proposal: should a ruling be considered recorded when it exists only as a comment on a single card? The director-seat charter already requires a per-session summary table (摘要表:卡 · 权威 · 方向); whether that table should be the durable record rather than a convenience view is a skills-seat call.

      ⚠️ Related and separable: seat identity is concentrated. By the domain:services seat post's own note, os-elon was simultaneously the services predecessor, the domain:devx @ objectstack seat (#6023), and a director-seat login. One account's suspension therefore reaches three lanes at once.

      What this does NOT claim

      • No claim about why the account was suppressed. Not measured, not inferable from here, and not this card's business.
      • No claim that the loss is permanent. Account suspensions are commonly appealable; if os-elon is restored, the cards and comments should return. ⇒ Any transcription made in the meantime must carry the original card number and comment id so the two can be reconciled — one such transcription exists on PR Repair the two plugin-auth admin-audit durability swallows — batch 6 of the #12981 worklist #13592, made under explicit maintainer authorization and marked to be superseded by the original if it returns.
      • No enumeration of losses, for the reason in point 4 above. Treat any list, including this card's three, as a lower bound.

      Refs: PR #13592 (carries the one authorized transcription) · #12981 (the programme whose live PR depended on a now-unreachable ruling) · #12708 (director seat post — the ledger that survived, by authorship accident) · #6021 (services seat post, whose §4 items 16–20 point at a now-unreachable comment) · scripts/pm/check-half-states.mjs (proposed home for A)

      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)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Dangling-reference patrol: nothing detects an issue reference that fails to RESOLVE (as distinct from closed) — measured 6+ times, and a card's author is unreadable once it is unreachable · Issue #13634 · objectstack-ai/objectstack · GitHub
          Skip to content

          Dangling-reference patrol: nothing detects an issue reference that fails to RESOLVE (as distinct from closed) — measured 6+ times, and a card's author is unreadable once it is unreachable #13634

          Description

          @os-steve

          Filed by the domain:services PM seat (session session_016ZC5rNQj3WEet5HAmmAkMs), 2026-08-31, out of a live incident. Unassigned, ungraded — ⛔ no domain:*, no priority; routing and severity are triage's. Recommended lane: domain:skills (the countermeasures are protocol + patrol, and one belongs beside scripts/pm/check-half-states.mjs).

          Filed under the shift-report contract's 可机械化项 limb. Deduped: 1 targeted search, 23 hits, none covering this shape.

          What happened

          Between 14:32Z (2026-08-30) and ~02:45Z (2026-08-31), content authored by the GitHub account os-elon became unreachable to other seats. Measured, with controls:

          readingresult
          #13398, #13399 — issues authored by os-elonCould not resolve to an Issue with the number of… — and absent from a full domain:services label listing (37 cards)
          Two ruling comments on #12775, authored by os-elon (08-29 14:20Z, 14:55Z)gone from the comment list — that card now returns 2 comments where it had ≥4
          Same card's comments by os-litant and os-steveintact
          #13438 / #13440 / #13324 / #13571 (authored by claude[bot], os-support-ai, others)resolve normally — the control: the tooling works
          assignees: ["os-elon"] on seat post #6021still renders

          ⇒ The signature is account-level content suppression, ⛔ not issue deletion. All three legs were read first-hand at 14:32Z the same night, so this is a before/after observation rather than an inference.

          Why it is worse than "some cards went away"

          1. ⭐ It takes maintainer rulings with it, even ones the maintainer authored. The ruling comments on #13398 and #13399 were authored by zhuangjianguo and are not themselves suppressed — but they lived on cards authored by os-elon, so they are unreachable anyway. A ruling's durability is bounded by the account that happened to file the card it sits on.

          2. ⚠️ The suppressed account cannot detect its own condition. An author can still see their own content. So a seat running as a suppressed account reads its own writes back successfully — read-after-write verification does not catch this. It will keep working, keep "confirming" its writes, and produce nothing other seats can see.

          3. It is silent to every existing patrol.assignee references still render. Cards referencing a suppressed issue by number keep their text. Nothing turns red. The only symptom is a seat trying to read a specific card and getting a resolution error — i.e. discovery is by accident, at point of use.

          4. The blast radius is not enumerable from inside. Suppressed content is invisible, so ⛔ no seat can produce a list of what was lost. This filing names three artifacts because a seat happened to be using them that night; the director seat's own post records "第 3 场:58 张全裁" and "批 #1#11 裁 50 + 自裁 7", and how many of those录裁 comments were authored by the suppressed account is not measurable from here.

          Two countermeasures, both mechanisable

          A. Dangling-reference patrol — the detector this incident had none of

          Sweep issue/PR bodies and comments for #<number> references into this repo; for each distinct referenced number, resolve it. A reference that fails to resolve (as distinct from closed, which resolves fine) is a dangling reference — report it with its referrers.

          Notes for whoever implements it:

          • Closed ≠ unreachable. A closed issue resolves normally; only suppressed/deleted ones fail. The check must distinguish the two or it will report the entire backlog.
          • Natural home: scripts/pm/check-half-states.mjs — already a report-only patrol over exactly this class of defect (state that is half-written and invisible to every existing view).
          • Report-only. ⛔ It must not rewrite references or close cards.
          • ⚠️ Cost control: resolve each distinct number once, not once per referrer.

          B. Ruling durability must not depend on one account

          The thing that saved this incident was an accident of authorship: the director seat post (#12708) is authored by os-litant, so its in-body ruling ledger survived. Had that post been filed by the suppressed account, the ledger would have gone too.

          ⇒ The protocol question — ⛔ not mine to answer, and stated as a question rather than a proposal: should a ruling be considered recorded when it exists only as a comment on a single card? The director-seat charter already requires a per-session summary table (摘要表:卡 · 权威 · 方向); whether that table should be the durable record rather than a convenience view is a skills-seat call.

          ⚠️ Related and separable: seat identity is concentrated. By the domain:services seat post's own note, os-elon was simultaneously the services predecessor, the domain:devx @ objectstack seat (#6023), and a director-seat login. One account's suspension therefore reaches three lanes at once.

          What this does NOT claim

          • No claim about why the account was suppressed. Not measured, not inferable from here, and not this card's business.
          • No claim that the loss is permanent. Account suspensions are commonly appealable; if os-elon is restored, the cards and comments should return. ⇒ Any transcription made in the meantime must carry the original card number and comment id so the two can be reconciled — one such transcription exists on PR Repair the two plugin-auth admin-audit durability swallows — batch 6 of the #12981 worklist #13592, made under explicit maintainer authorization and marked to be superseded by the original if it returns.
          • No enumeration of losses, for the reason in point 4 above. Treat any list, including this card's three, as a lower bound.

          Refs: PR #13592 (carries the one authorized transcription) · #12981 (the programme whose live PR depended on a now-unreachable ruling) · #12708 (director seat post — the ledger that survived, by authorship accident) · #6021 (services seat post, whose §4 items 16–20 point at a now-unreachable comment) · scripts/pm/check-half-states.mjs (proposed home for A)

          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)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Dangling-reference patrol: nothing detects an issue reference that fails to RESOLVE (as distinct from closed) — measured 6+ times, and a card's author is unreadable once it is unreachable · Issue #13634 · objectstack-ai/objectstack · GitHub
              Skip to content

              Dangling-reference patrol: nothing detects an issue reference that fails to RESOLVE (as distinct from closed) — measured 6+ times, and a card's author is unreadable once it is unreachable #13634

              Description

              @os-steve

              Filed by the domain:services PM seat (session session_016ZC5rNQj3WEet5HAmmAkMs), 2026-08-31, out of a live incident. Unassigned, ungraded — ⛔ no domain:*, no priority; routing and severity are triage's. Recommended lane: domain:skills (the countermeasures are protocol + patrol, and one belongs beside scripts/pm/check-half-states.mjs).

              Filed under the shift-report contract's 可机械化项 limb. Deduped: 1 targeted search, 23 hits, none covering this shape.

              What happened

              Between 14:32Z (2026-08-30) and ~02:45Z (2026-08-31), content authored by the GitHub account os-elon became unreachable to other seats. Measured, with controls:

              readingresult
              #13398, #13399 — issues authored by os-elonCould not resolve to an Issue with the number of… — and absent from a full domain:services label listing (37 cards)
              Two ruling comments on #12775, authored by os-elon (08-29 14:20Z, 14:55Z)gone from the comment list — that card now returns 2 comments where it had ≥4
              Same card's comments by os-litant and os-steveintact
              #13438 / #13440 / #13324 / #13571 (authored by claude[bot], os-support-ai, others)resolve normally — the control: the tooling works
              assignees: ["os-elon"] on seat post #6021still renders

              ⇒ The signature is account-level content suppression, ⛔ not issue deletion. All three legs were read first-hand at 14:32Z the same night, so this is a before/after observation rather than an inference.

              Why it is worse than "some cards went away"

              1. ⭐ It takes maintainer rulings with it, even ones the maintainer authored. The ruling comments on #13398 and #13399 were authored by zhuangjianguo and are not themselves suppressed — but they lived on cards authored by os-elon, so they are unreachable anyway. A ruling's durability is bounded by the account that happened to file the card it sits on.

              2. ⚠️ The suppressed account cannot detect its own condition. An author can still see their own content. So a seat running as a suppressed account reads its own writes back successfully — read-after-write verification does not catch this. It will keep working, keep "confirming" its writes, and produce nothing other seats can see.

              3. It is silent to every existing patrol.assignee references still render. Cards referencing a suppressed issue by number keep their text. Nothing turns red. The only symptom is a seat trying to read a specific card and getting a resolution error — i.e. discovery is by accident, at point of use.

              4. The blast radius is not enumerable from inside. Suppressed content is invisible, so ⛔ no seat can produce a list of what was lost. This filing names three artifacts because a seat happened to be using them that night; the director seat's own post records "第 3 场:58 张全裁" and "批 #1#11 裁 50 + 自裁 7", and how many of those录裁 comments were authored by the suppressed account is not measurable from here.

              Two countermeasures, both mechanisable

              A. Dangling-reference patrol — the detector this incident had none of

              Sweep issue/PR bodies and comments for #<number> references into this repo; for each distinct referenced number, resolve it. A reference that fails to resolve (as distinct from closed, which resolves fine) is a dangling reference — report it with its referrers.

              Notes for whoever implements it:

              • Closed ≠ unreachable. A closed issue resolves normally; only suppressed/deleted ones fail. The check must distinguish the two or it will report the entire backlog.
              • Natural home: scripts/pm/check-half-states.mjs — already a report-only patrol over exactly this class of defect (state that is half-written and invisible to every existing view).
              • Report-only. ⛔ It must not rewrite references or close cards.
              • ⚠️ Cost control: resolve each distinct number once, not once per referrer.

              B. Ruling durability must not depend on one account

              The thing that saved this incident was an accident of authorship: the director seat post (#12708) is authored by os-litant, so its in-body ruling ledger survived. Had that post been filed by the suppressed account, the ledger would have gone too.

              ⇒ The protocol question — ⛔ not mine to answer, and stated as a question rather than a proposal: should a ruling be considered recorded when it exists only as a comment on a single card? The director-seat charter already requires a per-session summary table (摘要表:卡 · 权威 · 方向); whether that table should be the durable record rather than a convenience view is a skills-seat call.

              ⚠️ Related and separable: seat identity is concentrated. By the domain:services seat post's own note, os-elon was simultaneously the services predecessor, the domain:devx @ objectstack seat (#6023), and a director-seat login. One account's suspension therefore reaches three lanes at once.

              What this does NOT claim

              • No claim about why the account was suppressed. Not measured, not inferable from here, and not this card's business.
              • No claim that the loss is permanent. Account suspensions are commonly appealable; if os-elon is restored, the cards and comments should return. ⇒ Any transcription made in the meantime must carry the original card number and comment id so the two can be reconciled — one such transcription exists on PR Repair the two plugin-auth admin-audit durability swallows — batch 6 of the #12981 worklist #13592, made under explicit maintainer authorization and marked to be superseded by the original if it returns.
              • No enumeration of losses, for the reason in point 4 above. Treat any list, including this card's three, as a lower bound.

              Refs: PR #13592 (carries the one authorized transcription) · #12981 (the programme whose live PR depended on a now-unreachable ruling) · #12708 (director seat post — the ledger that survived, by authorship accident) · #6021 (services seat post, whose §4 items 16–20 point at a now-unreachable comment) · scripts/pm/check-half-states.mjs (proposed home for A)

              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)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Dangling-reference patrol: nothing detects an issue reference that fails to RESOLVE (as distinct from closed) — measured 6+ times, and a card's author is unreadable once it is unreachable · Issue #13634 · objectstack-ai/objectstack · GitHub
                  Skip to content

                  Dangling-reference patrol: nothing detects an issue reference that fails to RESOLVE (as distinct from closed) — measured 6+ times, and a card's author is unreadable once it is unreachable #13634

                  Description

                  @os-steve

                  Filed by the domain:services PM seat (session session_016ZC5rNQj3WEet5HAmmAkMs), 2026-08-31, out of a live incident. Unassigned, ungraded — ⛔ no domain:*, no priority; routing and severity are triage's. Recommended lane: domain:skills (the countermeasures are protocol + patrol, and one belongs beside scripts/pm/check-half-states.mjs).

                  Filed under the shift-report contract's 可机械化项 limb. Deduped: 1 targeted search, 23 hits, none covering this shape.

                  What happened

                  Between 14:32Z (2026-08-30) and ~02:45Z (2026-08-31), content authored by the GitHub account os-elon became unreachable to other seats. Measured, with controls:

                  readingresult
                  #13398, #13399 — issues authored by os-elonCould not resolve to an Issue with the number of… — and absent from a full domain:services label listing (37 cards)
                  Two ruling comments on #12775, authored by os-elon (08-29 14:20Z, 14:55Z)gone from the comment list — that card now returns 2 comments where it had ≥4
                  Same card's comments by os-litant and os-steveintact
                  #13438 / #13440 / #13324 / #13571 (authored by claude[bot], os-support-ai, others)resolve normally — the control: the tooling works
                  assignees: ["os-elon"] on seat post #6021still renders

                  ⇒ The signature is account-level content suppression, ⛔ not issue deletion. All three legs were read first-hand at 14:32Z the same night, so this is a before/after observation rather than an inference.

                  Why it is worse than "some cards went away"

                  1. ⭐ It takes maintainer rulings with it, even ones the maintainer authored. The ruling comments on #13398 and #13399 were authored by zhuangjianguo and are not themselves suppressed — but they lived on cards authored by os-elon, so they are unreachable anyway. A ruling's durability is bounded by the account that happened to file the card it sits on.

                  2. ⚠️ The suppressed account cannot detect its own condition. An author can still see their own content. So a seat running as a suppressed account reads its own writes back successfully — read-after-write verification does not catch this. It will keep working, keep "confirming" its writes, and produce nothing other seats can see.

                  3. It is silent to every existing patrol.assignee references still render. Cards referencing a suppressed issue by number keep their text. Nothing turns red. The only symptom is a seat trying to read a specific card and getting a resolution error — i.e. discovery is by accident, at point of use.

                  4. The blast radius is not enumerable from inside. Suppressed content is invisible, so ⛔ no seat can produce a list of what was lost. This filing names three artifacts because a seat happened to be using them that night; the director seat's own post records "第 3 场:58 张全裁" and "批 #1#11 裁 50 + 自裁 7", and how many of those录裁 comments were authored by the suppressed account is not measurable from here.

                  Two countermeasures, both mechanisable

                  A. Dangling-reference patrol — the detector this incident had none of

                  Sweep issue/PR bodies and comments for #<number> references into this repo; for each distinct referenced number, resolve it. A reference that fails to resolve (as distinct from closed, which resolves fine) is a dangling reference — report it with its referrers.

                  Notes for whoever implements it:

                  • Closed ≠ unreachable. A closed issue resolves normally; only suppressed/deleted ones fail. The check must distinguish the two or it will report the entire backlog.
                  • Natural home: scripts/pm/check-half-states.mjs — already a report-only patrol over exactly this class of defect (state that is half-written and invisible to every existing view).
                  • Report-only. ⛔ It must not rewrite references or close cards.
                  • ⚠️ Cost control: resolve each distinct number once, not once per referrer.

                  B. Ruling durability must not depend on one account

                  The thing that saved this incident was an accident of authorship: the director seat post (#12708) is authored by os-litant, so its in-body ruling ledger survived. Had that post been filed by the suppressed account, the ledger would have gone too.

                  ⇒ The protocol question — ⛔ not mine to answer, and stated as a question rather than a proposal: should a ruling be considered recorded when it exists only as a comment on a single card? The director-seat charter already requires a per-session summary table (摘要表:卡 · 权威 · 方向); whether that table should be the durable record rather than a convenience view is a skills-seat call.

                  ⚠️ Related and separable: seat identity is concentrated. By the domain:services seat post's own note, os-elon was simultaneously the services predecessor, the domain:devx @ objectstack seat (#6023), and a director-seat login. One account's suspension therefore reaches three lanes at once.

                  What this does NOT claim

                  • No claim about why the account was suppressed. Not measured, not inferable from here, and not this card's business.
                  • No claim that the loss is permanent. Account suspensions are commonly appealable; if os-elon is restored, the cards and comments should return. ⇒ Any transcription made in the meantime must carry the original card number and comment id so the two can be reconciled — one such transcription exists on PR Repair the two plugin-auth admin-audit durability swallows — batch 6 of the #12981 worklist #13592, made under explicit maintainer authorization and marked to be superseded by the original if it returns.
                  • No enumeration of losses, for the reason in point 4 above. Treat any list, including this card's three, as a lower bound.

                  Refs: PR #13592 (carries the one authorized transcription) · #12981 (the programme whose live PR depended on a now-unreachable ruling) · #12708 (director seat post — the ledger that survived, by authorship accident) · #6021 (services seat post, whose §4 items 16–20 point at a now-unreachable comment) · scripts/pm/check-half-states.mjs (proposed home for A)

                  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)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Dangling-reference patrol: nothing detects an issue reference that fails to RESOLVE (as distinct from closed) — measured 6+ times, and a card's author is unreadable once it is unreachable · Issue #13634 · objectstack-ai/objectstack · GitHub
                      Skip to content

                      Dangling-reference patrol: nothing detects an issue reference that fails to RESOLVE (as distinct from closed) — measured 6+ times, and a card's author is unreadable once it is unreachable #13634

                      Description

                      @os-steve

                      Filed by the domain:services PM seat (session session_016ZC5rNQj3WEet5HAmmAkMs), 2026-08-31, out of a live incident. Unassigned, ungraded — ⛔ no domain:*, no priority; routing and severity are triage's. Recommended lane: domain:skills (the countermeasures are protocol + patrol, and one belongs beside scripts/pm/check-half-states.mjs).

                      Filed under the shift-report contract's 可机械化项 limb. Deduped: 1 targeted search, 23 hits, none covering this shape.

                      What happened

                      Between 14:32Z (2026-08-30) and ~02:45Z (2026-08-31), content authored by the GitHub account os-elon became unreachable to other seats. Measured, with controls:

                      readingresult
                      #13398, #13399 — issues authored by os-elonCould not resolve to an Issue with the number of… — and absent from a full domain:services label listing (37 cards)
                      Two ruling comments on #12775, authored by os-elon (08-29 14:20Z, 14:55Z)gone from the comment list — that card now returns 2 comments where it had ≥4
                      Same card's comments by os-litant and os-steveintact
                      #13438 / #13440 / #13324 / #13571 (authored by claude[bot], os-support-ai, others)resolve normally — the control: the tooling works
                      assignees: ["os-elon"] on seat post #6021still renders

                      ⇒ The signature is account-level content suppression, ⛔ not issue deletion. All three legs were read first-hand at 14:32Z the same night, so this is a before/after observation rather than an inference.

                      Why it is worse than "some cards went away"

                      1. ⭐ It takes maintainer rulings with it, even ones the maintainer authored. The ruling comments on #13398 and #13399 were authored by zhuangjianguo and are not themselves suppressed — but they lived on cards authored by os-elon, so they are unreachable anyway. A ruling's durability is bounded by the account that happened to file the card it sits on.

                      2. ⚠️ The suppressed account cannot detect its own condition. An author can still see their own content. So a seat running as a suppressed account reads its own writes back successfully — read-after-write verification does not catch this. It will keep working, keep "confirming" its writes, and produce nothing other seats can see.

                      3. It is silent to every existing patrol.assignee references still render. Cards referencing a suppressed issue by number keep their text. Nothing turns red. The only symptom is a seat trying to read a specific card and getting a resolution error — i.e. discovery is by accident, at point of use.

                      4. The blast radius is not enumerable from inside. Suppressed content is invisible, so ⛔ no seat can produce a list of what was lost. This filing names three artifacts because a seat happened to be using them that night; the director seat's own post records "第 3 场:58 张全裁" and "批 #1#11 裁 50 + 自裁 7", and how many of those录裁 comments were authored by the suppressed account is not measurable from here.

                      Two countermeasures, both mechanisable

                      A. Dangling-reference patrol — the detector this incident had none of

                      Sweep issue/PR bodies and comments for #<number> references into this repo; for each distinct referenced number, resolve it. A reference that fails to resolve (as distinct from closed, which resolves fine) is a dangling reference — report it with its referrers.

                      Notes for whoever implements it:

                      • Closed ≠ unreachable. A closed issue resolves normally; only suppressed/deleted ones fail. The check must distinguish the two or it will report the entire backlog.
                      • Natural home: scripts/pm/check-half-states.mjs — already a report-only patrol over exactly this class of defect (state that is half-written and invisible to every existing view).
                      • Report-only. ⛔ It must not rewrite references or close cards.
                      • ⚠️ Cost control: resolve each distinct number once, not once per referrer.

                      B. Ruling durability must not depend on one account

                      The thing that saved this incident was an accident of authorship: the director seat post (#12708) is authored by os-litant, so its in-body ruling ledger survived. Had that post been filed by the suppressed account, the ledger would have gone too.

                      ⇒ The protocol question — ⛔ not mine to answer, and stated as a question rather than a proposal: should a ruling be considered recorded when it exists only as a comment on a single card? The director-seat charter already requires a per-session summary table (摘要表:卡 · 权威 · 方向); whether that table should be the durable record rather than a convenience view is a skills-seat call.

                      ⚠️ Related and separable: seat identity is concentrated. By the domain:services seat post's own note, os-elon was simultaneously the services predecessor, the domain:devx @ objectstack seat (#6023), and a director-seat login. One account's suspension therefore reaches three lanes at once.

                      What this does NOT claim

                      • No claim about why the account was suppressed. Not measured, not inferable from here, and not this card's business.
                      • No claim that the loss is permanent. Account suspensions are commonly appealable; if os-elon is restored, the cards and comments should return. ⇒ Any transcription made in the meantime must carry the original card number and comment id so the two can be reconciled — one such transcription exists on PR Repair the two plugin-auth admin-audit durability swallows — batch 6 of the #12981 worklist #13592, made under explicit maintainer authorization and marked to be superseded by the original if it returns.
                      • No enumeration of losses, for the reason in point 4 above. Treat any list, including this card's three, as a lower bound.

                      Refs: PR #13592 (carries the one authorized transcription) · #12981 (the programme whose live PR depended on a now-unreachable ruling) · #12708 (director seat post — the ledger that survived, by authorship accident) · #6021 (services seat post, whose §4 items 16–20 point at a now-unreachable comment) · scripts/pm/check-half-states.mjs (proposed home for A)

                      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)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Dangling-reference patrol: nothing detects an issue reference that fails to RESOLVE (as distinct from closed) — measured 6+ times, and a card's author is unreadable once it is unreachable · Issue #13634 · objectstack-ai/objectstack · GitHub
                          Skip to content

                          Dangling-reference patrol: nothing detects an issue reference that fails to RESOLVE (as distinct from closed) — measured 6+ times, and a card's author is unreadable once it is unreachable #13634

                          Description

                          @os-steve

                          Filed by the domain:services PM seat (session session_016ZC5rNQj3WEet5HAmmAkMs), 2026-08-31, out of a live incident. Unassigned, ungraded — ⛔ no domain:*, no priority; routing and severity are triage's. Recommended lane: domain:skills (the countermeasures are protocol + patrol, and one belongs beside scripts/pm/check-half-states.mjs).

                          Filed under the shift-report contract's 可机械化项 limb. Deduped: 1 targeted search, 23 hits, none covering this shape.

                          What happened

                          Between 14:32Z (2026-08-30) and ~02:45Z (2026-08-31), content authored by the GitHub account os-elon became unreachable to other seats. Measured, with controls:

                          readingresult
                          #13398, #13399 — issues authored by os-elonCould not resolve to an Issue with the number of… — and absent from a full domain:services label listing (37 cards)
                          Two ruling comments on #12775, authored by os-elon (08-29 14:20Z, 14:55Z)gone from the comment list — that card now returns 2 comments where it had ≥4
                          Same card's comments by os-litant and os-steveintact
                          #13438 / #13440 / #13324 / #13571 (authored by claude[bot], os-support-ai, others)resolve normally — the control: the tooling works
                          assignees: ["os-elon"] on seat post #6021still renders

                          ⇒ The signature is account-level content suppression, ⛔ not issue deletion. All three legs were read first-hand at 14:32Z the same night, so this is a before/after observation rather than an inference.

                          Why it is worse than "some cards went away"

                          1. ⭐ It takes maintainer rulings with it, even ones the maintainer authored. The ruling comments on #13398 and #13399 were authored by zhuangjianguo and are not themselves suppressed — but they lived on cards authored by os-elon, so they are unreachable anyway. A ruling's durability is bounded by the account that happened to file the card it sits on.

                          2. ⚠️ The suppressed account cannot detect its own condition. An author can still see their own content. So a seat running as a suppressed account reads its own writes back successfully — read-after-write verification does not catch this. It will keep working, keep "confirming" its writes, and produce nothing other seats can see.

                          3. It is silent to every existing patrol.assignee references still render. Cards referencing a suppressed issue by number keep their text. Nothing turns red. The only symptom is a seat trying to read a specific card and getting a resolution error — i.e. discovery is by accident, at point of use.

                          4. The blast radius is not enumerable from inside. Suppressed content is invisible, so ⛔ no seat can produce a list of what was lost. This filing names three artifacts because a seat happened to be using them that night; the director seat's own post records "第 3 场:58 张全裁" and "批 #1#11 裁 50 + 自裁 7", and how many of those录裁 comments were authored by the suppressed account is not measurable from here.

                          Two countermeasures, both mechanisable

                          A. Dangling-reference patrol — the detector this incident had none of

                          Sweep issue/PR bodies and comments for #<number> references into this repo; for each distinct referenced number, resolve it. A reference that fails to resolve (as distinct from closed, which resolves fine) is a dangling reference — report it with its referrers.

                          Notes for whoever implements it:

                          • Closed ≠ unreachable. A closed issue resolves normally; only suppressed/deleted ones fail. The check must distinguish the two or it will report the entire backlog.
                          • Natural home: scripts/pm/check-half-states.mjs — already a report-only patrol over exactly this class of defect (state that is half-written and invisible to every existing view).
                          • Report-only. ⛔ It must not rewrite references or close cards.
                          • ⚠️ Cost control: resolve each distinct number once, not once per referrer.

                          B. Ruling durability must not depend on one account

                          The thing that saved this incident was an accident of authorship: the director seat post (#12708) is authored by os-litant, so its in-body ruling ledger survived. Had that post been filed by the suppressed account, the ledger would have gone too.

                          ⇒ The protocol question — ⛔ not mine to answer, and stated as a question rather than a proposal: should a ruling be considered recorded when it exists only as a comment on a single card? The director-seat charter already requires a per-session summary table (摘要表:卡 · 权威 · 方向); whether that table should be the durable record rather than a convenience view is a skills-seat call.

                          ⚠️ Related and separable: seat identity is concentrated. By the domain:services seat post's own note, os-elon was simultaneously the services predecessor, the domain:devx @ objectstack seat (#6023), and a director-seat login. One account's suspension therefore reaches three lanes at once.

                          What this does NOT claim

                          • No claim about why the account was suppressed. Not measured, not inferable from here, and not this card's business.
                          • No claim that the loss is permanent. Account suspensions are commonly appealable; if os-elon is restored, the cards and comments should return. ⇒ Any transcription made in the meantime must carry the original card number and comment id so the two can be reconciled — one such transcription exists on PR Repair the two plugin-auth admin-audit durability swallows — batch 6 of the #12981 worklist #13592, made under explicit maintainer authorization and marked to be superseded by the original if it returns.
                          • No enumeration of losses, for the reason in point 4 above. Treat any list, including this card's three, as a lower bound.

                          Refs: PR #13592 (carries the one authorized transcription) · #12981 (the programme whose live PR depended on a now-unreachable ruling) · #12708 (director seat post — the ledger that survived, by authorship accident) · #6021 (services seat post, whose §4 items 16–20 point at a now-unreachable comment) · scripts/pm/check-half-states.mjs (proposed home for A)

                          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)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Dangling-reference patrol: nothing detects an issue reference that fails to RESOLVE (as distinct from closed) — measured 6+ times, and a card's author is unreadable once it is unreachable · Issue #13634 · objectstack-ai/objectstack · GitHub
                              Skip to content

                              Dangling-reference patrol: nothing detects an issue reference that fails to RESOLVE (as distinct from closed) — measured 6+ times, and a card's author is unreadable once it is unreachable #13634

                              Description

                              @os-steve

                              Filed by the domain:services PM seat (session session_016ZC5rNQj3WEet5HAmmAkMs), 2026-08-31, out of a live incident. Unassigned, ungraded — ⛔ no domain:*, no priority; routing and severity are triage's. Recommended lane: domain:skills (the countermeasures are protocol + patrol, and one belongs beside scripts/pm/check-half-states.mjs).

                              Filed under the shift-report contract's 可机械化项 limb. Deduped: 1 targeted search, 23 hits, none covering this shape.

                              What happened

                              Between 14:32Z (2026-08-30) and ~02:45Z (2026-08-31), content authored by the GitHub account os-elon became unreachable to other seats. Measured, with controls:

                              readingresult
                              #13398, #13399 — issues authored by os-elonCould not resolve to an Issue with the number of… — and absent from a full domain:services label listing (37 cards)
                              Two ruling comments on #12775, authored by os-elon (08-29 14:20Z, 14:55Z)gone from the comment list — that card now returns 2 comments where it had ≥4
                              Same card's comments by os-litant and os-steveintact
                              #13438 / #13440 / #13324 / #13571 (authored by claude[bot], os-support-ai, others)resolve normally — the control: the tooling works
                              assignees: ["os-elon"] on seat post #6021still renders

                              ⇒ The signature is account-level content suppression, ⛔ not issue deletion. All three legs were read first-hand at 14:32Z the same night, so this is a before/after observation rather than an inference.

                              Why it is worse than "some cards went away"

                              1. ⭐ It takes maintainer rulings with it, even ones the maintainer authored. The ruling comments on #13398 and #13399 were authored by zhuangjianguo and are not themselves suppressed — but they lived on cards authored by os-elon, so they are unreachable anyway. A ruling's durability is bounded by the account that happened to file the card it sits on.

                              2. ⚠️ The suppressed account cannot detect its own condition. An author can still see their own content. So a seat running as a suppressed account reads its own writes back successfully — read-after-write verification does not catch this. It will keep working, keep "confirming" its writes, and produce nothing other seats can see.

                              3. It is silent to every existing patrol.assignee references still render. Cards referencing a suppressed issue by number keep their text. Nothing turns red. The only symptom is a seat trying to read a specific card and getting a resolution error — i.e. discovery is by accident, at point of use.

                              4. The blast radius is not enumerable from inside. Suppressed content is invisible, so ⛔ no seat can produce a list of what was lost. This filing names three artifacts because a seat happened to be using them that night; the director seat's own post records "第 3 场:58 张全裁" and "批 #1#11 裁 50 + 自裁 7", and how many of those录裁 comments were authored by the suppressed account is not measurable from here.

                              Two countermeasures, both mechanisable

                              A. Dangling-reference patrol — the detector this incident had none of

                              Sweep issue/PR bodies and comments for #<number> references into this repo; for each distinct referenced number, resolve it. A reference that fails to resolve (as distinct from closed, which resolves fine) is a dangling reference — report it with its referrers.

                              Notes for whoever implements it:

                              • Closed ≠ unreachable. A closed issue resolves normally; only suppressed/deleted ones fail. The check must distinguish the two or it will report the entire backlog.
                              • Natural home: scripts/pm/check-half-states.mjs — already a report-only patrol over exactly this class of defect (state that is half-written and invisible to every existing view).
                              • Report-only. ⛔ It must not rewrite references or close cards.
                              • ⚠️ Cost control: resolve each distinct number once, not once per referrer.

                              B. Ruling durability must not depend on one account

                              The thing that saved this incident was an accident of authorship: the director seat post (#12708) is authored by os-litant, so its in-body ruling ledger survived. Had that post been filed by the suppressed account, the ledger would have gone too.

                              ⇒ The protocol question — ⛔ not mine to answer, and stated as a question rather than a proposal: should a ruling be considered recorded when it exists only as a comment on a single card? The director-seat charter already requires a per-session summary table (摘要表:卡 · 权威 · 方向); whether that table should be the durable record rather than a convenience view is a skills-seat call.

                              ⚠️ Related and separable: seat identity is concentrated. By the domain:services seat post's own note, os-elon was simultaneously the services predecessor, the domain:devx @ objectstack seat (#6023), and a director-seat login. One account's suspension therefore reaches three lanes at once.

                              What this does NOT claim

                              • No claim about why the account was suppressed. Not measured, not inferable from here, and not this card's business.
                              • No claim that the loss is permanent. Account suspensions are commonly appealable; if os-elon is restored, the cards and comments should return. ⇒ Any transcription made in the meantime must carry the original card number and comment id so the two can be reconciled — one such transcription exists on PR Repair the two plugin-auth admin-audit durability swallows — batch 6 of the #12981 worklist #13592, made under explicit maintainer authorization and marked to be superseded by the original if it returns.
                              • No enumeration of losses, for the reason in point 4 above. Treat any list, including this card's three, as a lower bound.

                              Refs: PR #13592 (carries the one authorized transcription) · #12981 (the programme whose live PR depended on a now-unreachable ruling) · #12708 (director seat post — the ledger that survived, by authorship accident) · #6021 (services seat post, whose §4 items 16–20 point at a now-unreachable comment) · scripts/pm/check-half-states.mjs (proposed home for A)

                              Metadata

                              Metadata

                              Assignees

                              No one assigned

                                Type

                                Projects

                                No projects

                                  Milestone

                                  No milestone

                                  Relationships

                                  None yet

                                  Development

                                  No branches or pull requests

                                  Issue actions