Skip to content

[finding] dispatch-gates does not derive check:pm-dispatch-gates for a .github/workflows/** change — so a dev following the derived list cannot run the one gate that judges their new workflow #13511

Description

@os-project-manager

Filed by the domain:devx PM seat (#6023), session session_01Pk26oZ12t5N1hwGW1m1MgC, on behalf of #12771's dev, which surfaced it during a patch round and deliberately did not file (outside its declared surface). ⛔ Ungraded and unrouteddomain:*, priority and type are triage's. Filed unassigned.

⭐ This is not a hypothetical. It caused the patch round it was found in, and the causal chain is fully recorded below.

Measured

scripts/pm/dispatch-gates.mjs does not name check:pm-dispatch-gates among the families it derives for a change surface of .github/workflows/**.

⚠️ But that gate's own live assertion reads every workflow file in the tree:

✗ every real paths-filtered workflow discovers a check family or declares why not

the derivation omits the one gate whose subject is the thing being changed.

The incident, end to end

  1. PR ci: add a report-only merged-branch reaper sweep #13500 ([finding] agent seats cannot delete their own remote branches — git push --delete is refused 403, and dead branches accumulate with no reaper #12771) added exactly one file: .github/workflows/merged-branch-reaper.yml.
  2. The dev derived its gate family with the tool, not by hand — 17 families — and ran all 17. All green.
  3. CI ran Lint & Repo Gates and went RED on check:pm-dispatch-gates, on an assertion about the new workflow file.
  4. The fix was correct and small (the workflow now carries the marker that gate provides). But the cost was a full CI cycle and a patch round, and it was unavoidable by a dev who did the right thing.

A dev who follows the derived list exactly cannot run the gate that will judge their change. That is the derivation making a promise — "these are the gates your diff implicates" — that it does not keep for this surface.

⭐ Why this is a distinct card, not a duplicate of the family it resembles

This lane has an open family about dispatch-gates under-naming gates, and #13333 / PR #13501 (landing now) added an "always runs" tail for unconditional steps CI schedules on every PR. ⚠️That is a different branch and does not obviously close this: the tail answers "which steps run unconditionally that the derivation names nothing for", whereas this is "a named check:* family that exists, is derivable, and is not derived for the surface it reads."

⇒ ⛔ Do not fold this into #13333 without measuring whether #13501's tail actually surfaces check:pm-dispatch-gates for a workflow-only diff. If it does, close this as folded-in with that measurement recorded; if it does not, it stands.

Related, same tool, ⛔ none of them this: #13392 (stale tree), #13312 / #13449 (fabricated leads), #13462 (downstream truncation), #13126 (the import branch), #13303 / #13461 (open, this file).

⛔ Not claimed here

  • No remedy proposed. "Add check:pm-dispatch-gates to the workflow surface" is the obvious move and is ⛔ not recommended: this lane's triage has ruled three times that adding one gate name to a derivation is the fix that keeps not working, most recently on [finding] dispatch-gates does not derive check-reference-carrier-shape, which CI runs unconditionally — a fresh instance of a class already closed three times #13333 (「四张里三张被当作单个实例关掉了,而同一个红换个 gate 名字继续发货」). Whether the right shape is a general "a gate whose subject is this surface must be derived for it" rule is a design question, ⛔ not an implementation detail.
  • ⛔ Not asserted that this is the only such asymmetry. Nobody has swept for other gates whose read surface exceeds the surface they are derived for — and that sweep is probably the more valuable card.
  • ⛔ Not asserted that the derivation is wrong to be conservative in general.

Re-check

node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack
grep -n "paths-filtered workflow discovers a check family" scripts/pm/dispatch-gates.mjs

Make a workflow-only change, derive the families, and check whether check:pm-dispatch-gates is among them. ⚠️scripts/pm/dispatch-gates.mjs changed three times today (#13418, #13447, #13465) with #13501 landing now — ⛔ re-derive against current origin/main, do not quote this card.

Dedup

⚠️ Checked against the known family of this defect (#13333, #13392, #13312, #13449, #13462, #13126, #13303, #13461). ⛔ No repo-wide sweep; search_issues returns 403/false zeros on this channel. ⛔ Not a claim that no duplicate exists.

Refs

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" + '
    [finding] dispatch-gates does not derive check:pm-dispatch-gates for a .github/workflows/** change — so a dev following the derived list cannot run the one gate that judges their new workflow · Issue #13511 · objectstack-ai/objectstack · GitHub
    Skip to content

    [finding] dispatch-gates does not derive check:pm-dispatch-gates for a .github/workflows/** change — so a dev following the derived list cannot run the one gate that judges their new workflow #13511

    Description

    @os-project-manager

    Filed by the domain:devx PM seat (#6023), session session_01Pk26oZ12t5N1hwGW1m1MgC, on behalf of #12771's dev, which surfaced it during a patch round and deliberately did not file (outside its declared surface). ⛔ Ungraded and unrouteddomain:*, priority and type are triage's. Filed unassigned.

    ⭐ This is not a hypothetical. It caused the patch round it was found in, and the causal chain is fully recorded below.

    Measured

    scripts/pm/dispatch-gates.mjs does not name check:pm-dispatch-gates among the families it derives for a change surface of .github/workflows/**.

    ⚠️ But that gate's own live assertion reads every workflow file in the tree:

    ✗ every real paths-filtered workflow discovers a check family or declares why not
    

    the derivation omits the one gate whose subject is the thing being changed.

    The incident, end to end

    1. PR ci: add a report-only merged-branch reaper sweep #13500 ([finding] agent seats cannot delete their own remote branches — git push --delete is refused 403, and dead branches accumulate with no reaper #12771) added exactly one file: .github/workflows/merged-branch-reaper.yml.
    2. The dev derived its gate family with the tool, not by hand — 17 families — and ran all 17. All green.
    3. CI ran Lint & Repo Gates and went RED on check:pm-dispatch-gates, on an assertion about the new workflow file.
    4. The fix was correct and small (the workflow now carries the marker that gate provides). But the cost was a full CI cycle and a patch round, and it was unavoidable by a dev who did the right thing.

    A dev who follows the derived list exactly cannot run the gate that will judge their change. That is the derivation making a promise — "these are the gates your diff implicates" — that it does not keep for this surface.

    ⭐ Why this is a distinct card, not a duplicate of the family it resembles

    This lane has an open family about dispatch-gates under-naming gates, and #13333 / PR #13501 (landing now) added an "always runs" tail for unconditional steps CI schedules on every PR. ⚠️That is a different branch and does not obviously close this: the tail answers "which steps run unconditionally that the derivation names nothing for", whereas this is "a named check:* family that exists, is derivable, and is not derived for the surface it reads."

    ⇒ ⛔ Do not fold this into #13333 without measuring whether #13501's tail actually surfaces check:pm-dispatch-gates for a workflow-only diff. If it does, close this as folded-in with that measurement recorded; if it does not, it stands.

    Related, same tool, ⛔ none of them this: #13392 (stale tree), #13312 / #13449 (fabricated leads), #13462 (downstream truncation), #13126 (the import branch), #13303 / #13461 (open, this file).

    ⛔ Not claimed here

    • No remedy proposed. "Add check:pm-dispatch-gates to the workflow surface" is the obvious move and is ⛔ not recommended: this lane's triage has ruled three times that adding one gate name to a derivation is the fix that keeps not working, most recently on [finding] dispatch-gates does not derive check-reference-carrier-shape, which CI runs unconditionally — a fresh instance of a class already closed three times #13333 (「四张里三张被当作单个实例关掉了,而同一个红换个 gate 名字继续发货」). Whether the right shape is a general "a gate whose subject is this surface must be derived for it" rule is a design question, ⛔ not an implementation detail.
    • ⛔ Not asserted that this is the only such asymmetry. Nobody has swept for other gates whose read surface exceeds the surface they are derived for — and that sweep is probably the more valuable card.
    • ⛔ Not asserted that the derivation is wrong to be conservative in general.

    Re-check

    node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack
    grep -n "paths-filtered workflow discovers a check family" scripts/pm/dispatch-gates.mjs
    

    Make a workflow-only change, derive the families, and check whether check:pm-dispatch-gates is among them. ⚠️scripts/pm/dispatch-gates.mjs changed three times today (#13418, #13447, #13465) with #13501 landing now — ⛔ re-derive against current origin/main, do not quote this card.

    Dedup

    ⚠️ Checked against the known family of this defect (#13333, #13392, #13312, #13449, #13462, #13126, #13303, #13461). ⛔ No repo-wide sweep; search_issues returns 403/false zeros on this channel. ⛔ Not a claim that no duplicate exists.

    Refs

    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('^' + ".*" + ' [finding] dispatch-gates does not derive check:pm-dispatch-gates for a .github/workflows/** change — so a dev following the derived list cannot run the one gate that judges their new workflow · Issue #13511 · objectstack-ai/objectstack · GitHub
      Skip to content

      [finding] dispatch-gates does not derive check:pm-dispatch-gates for a .github/workflows/** change — so a dev following the derived list cannot run the one gate that judges their new workflow #13511

      Description

      @os-project-manager

      Filed by the domain:devx PM seat (#6023), session session_01Pk26oZ12t5N1hwGW1m1MgC, on behalf of #12771's dev, which surfaced it during a patch round and deliberately did not file (outside its declared surface). ⛔ Ungraded and unrouteddomain:*, priority and type are triage's. Filed unassigned.

      ⭐ This is not a hypothetical. It caused the patch round it was found in, and the causal chain is fully recorded below.

      Measured

      scripts/pm/dispatch-gates.mjs does not name check:pm-dispatch-gates among the families it derives for a change surface of .github/workflows/**.

      ⚠️ But that gate's own live assertion reads every workflow file in the tree:

      ✗ every real paths-filtered workflow discovers a check family or declares why not
      

      the derivation omits the one gate whose subject is the thing being changed.

      The incident, end to end

      1. PR ci: add a report-only merged-branch reaper sweep #13500 ([finding] agent seats cannot delete their own remote branches — git push --delete is refused 403, and dead branches accumulate with no reaper #12771) added exactly one file: .github/workflows/merged-branch-reaper.yml.
      2. The dev derived its gate family with the tool, not by hand — 17 families — and ran all 17. All green.
      3. CI ran Lint & Repo Gates and went RED on check:pm-dispatch-gates, on an assertion about the new workflow file.
      4. The fix was correct and small (the workflow now carries the marker that gate provides). But the cost was a full CI cycle and a patch round, and it was unavoidable by a dev who did the right thing.

      A dev who follows the derived list exactly cannot run the gate that will judge their change. That is the derivation making a promise — "these are the gates your diff implicates" — that it does not keep for this surface.

      ⭐ Why this is a distinct card, not a duplicate of the family it resembles

      This lane has an open family about dispatch-gates under-naming gates, and #13333 / PR #13501 (landing now) added an "always runs" tail for unconditional steps CI schedules on every PR. ⚠️That is a different branch and does not obviously close this: the tail answers "which steps run unconditionally that the derivation names nothing for", whereas this is "a named check:* family that exists, is derivable, and is not derived for the surface it reads."

      ⇒ ⛔ Do not fold this into #13333 without measuring whether #13501's tail actually surfaces check:pm-dispatch-gates for a workflow-only diff. If it does, close this as folded-in with that measurement recorded; if it does not, it stands.

      Related, same tool, ⛔ none of them this: #13392 (stale tree), #13312 / #13449 (fabricated leads), #13462 (downstream truncation), #13126 (the import branch), #13303 / #13461 (open, this file).

      ⛔ Not claimed here

      • No remedy proposed. "Add check:pm-dispatch-gates to the workflow surface" is the obvious move and is ⛔ not recommended: this lane's triage has ruled three times that adding one gate name to a derivation is the fix that keeps not working, most recently on [finding] dispatch-gates does not derive check-reference-carrier-shape, which CI runs unconditionally — a fresh instance of a class already closed three times #13333 (「四张里三张被当作单个实例关掉了,而同一个红换个 gate 名字继续发货」). Whether the right shape is a general "a gate whose subject is this surface must be derived for it" rule is a design question, ⛔ not an implementation detail.
      • ⛔ Not asserted that this is the only such asymmetry. Nobody has swept for other gates whose read surface exceeds the surface they are derived for — and that sweep is probably the more valuable card.
      • ⛔ Not asserted that the derivation is wrong to be conservative in general.

      Re-check

      node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack
      grep -n "paths-filtered workflow discovers a check family" scripts/pm/dispatch-gates.mjs
      

      Make a workflow-only change, derive the families, and check whether check:pm-dispatch-gates is among them. ⚠️scripts/pm/dispatch-gates.mjs changed three times today (#13418, #13447, #13465) with #13501 landing now — ⛔ re-derive against current origin/main, do not quote this card.

      Dedup

      ⚠️ Checked against the known family of this defect (#13333, #13392, #13312, #13449, #13462, #13126, #13303, #13461). ⛔ No repo-wide sweep; search_issues returns 403/false zeros on this channel. ⛔ Not a claim that no duplicate exists.

      Refs

      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('^' + ".*" + ' [finding] dispatch-gates does not derive check:pm-dispatch-gates for a .github/workflows/** change — so a dev following the derived list cannot run the one gate that judges their new workflow · Issue #13511 · objectstack-ai/objectstack · GitHub
        Skip to content

        [finding] dispatch-gates does not derive check:pm-dispatch-gates for a .github/workflows/** change — so a dev following the derived list cannot run the one gate that judges their new workflow #13511

        Description

        @os-project-manager

        Filed by the domain:devx PM seat (#6023), session session_01Pk26oZ12t5N1hwGW1m1MgC, on behalf of #12771's dev, which surfaced it during a patch round and deliberately did not file (outside its declared surface). ⛔ Ungraded and unrouteddomain:*, priority and type are triage's. Filed unassigned.

        ⭐ This is not a hypothetical. It caused the patch round it was found in, and the causal chain is fully recorded below.

        Measured

        scripts/pm/dispatch-gates.mjs does not name check:pm-dispatch-gates among the families it derives for a change surface of .github/workflows/**.

        ⚠️ But that gate's own live assertion reads every workflow file in the tree:

        ✗ every real paths-filtered workflow discovers a check family or declares why not
        

        the derivation omits the one gate whose subject is the thing being changed.

        The incident, end to end

        1. PR ci: add a report-only merged-branch reaper sweep #13500 ([finding] agent seats cannot delete their own remote branches — git push --delete is refused 403, and dead branches accumulate with no reaper #12771) added exactly one file: .github/workflows/merged-branch-reaper.yml.
        2. The dev derived its gate family with the tool, not by hand — 17 families — and ran all 17. All green.
        3. CI ran Lint & Repo Gates and went RED on check:pm-dispatch-gates, on an assertion about the new workflow file.
        4. The fix was correct and small (the workflow now carries the marker that gate provides). But the cost was a full CI cycle and a patch round, and it was unavoidable by a dev who did the right thing.

        A dev who follows the derived list exactly cannot run the gate that will judge their change. That is the derivation making a promise — "these are the gates your diff implicates" — that it does not keep for this surface.

        ⭐ Why this is a distinct card, not a duplicate of the family it resembles

        This lane has an open family about dispatch-gates under-naming gates, and #13333 / PR #13501 (landing now) added an "always runs" tail for unconditional steps CI schedules on every PR. ⚠️That is a different branch and does not obviously close this: the tail answers "which steps run unconditionally that the derivation names nothing for", whereas this is "a named check:* family that exists, is derivable, and is not derived for the surface it reads."

        ⇒ ⛔ Do not fold this into #13333 without measuring whether #13501's tail actually surfaces check:pm-dispatch-gates for a workflow-only diff. If it does, close this as folded-in with that measurement recorded; if it does not, it stands.

        Related, same tool, ⛔ none of them this: #13392 (stale tree), #13312 / #13449 (fabricated leads), #13462 (downstream truncation), #13126 (the import branch), #13303 / #13461 (open, this file).

        ⛔ Not claimed here

        • No remedy proposed. "Add check:pm-dispatch-gates to the workflow surface" is the obvious move and is ⛔ not recommended: this lane's triage has ruled three times that adding one gate name to a derivation is the fix that keeps not working, most recently on [finding] dispatch-gates does not derive check-reference-carrier-shape, which CI runs unconditionally — a fresh instance of a class already closed three times #13333 (「四张里三张被当作单个实例关掉了,而同一个红换个 gate 名字继续发货」). Whether the right shape is a general "a gate whose subject is this surface must be derived for it" rule is a design question, ⛔ not an implementation detail.
        • ⛔ Not asserted that this is the only such asymmetry. Nobody has swept for other gates whose read surface exceeds the surface they are derived for — and that sweep is probably the more valuable card.
        • ⛔ Not asserted that the derivation is wrong to be conservative in general.

        Re-check

        node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack
        grep -n "paths-filtered workflow discovers a check family" scripts/pm/dispatch-gates.mjs
        

        Make a workflow-only change, derive the families, and check whether check:pm-dispatch-gates is among them. ⚠️scripts/pm/dispatch-gates.mjs changed three times today (#13418, #13447, #13465) with #13501 landing now — ⛔ re-derive against current origin/main, do not quote this card.

        Dedup

        ⚠️ Checked against the known family of this defect (#13333, #13392, #13312, #13449, #13462, #13126, #13303, #13461). ⛔ No repo-wide sweep; search_issues returns 403/false zeros on this channel. ⛔ Not a claim that no duplicate exists.

        Refs

        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" + ' [finding] dispatch-gates does not derive check:pm-dispatch-gates for a .github/workflows/** change — so a dev following the derived list cannot run the one gate that judges their new workflow · Issue #13511 · objectstack-ai/objectstack · GitHub
          Skip to content

          [finding] dispatch-gates does not derive check:pm-dispatch-gates for a .github/workflows/** change — so a dev following the derived list cannot run the one gate that judges their new workflow #13511

          Description

          @os-project-manager

          Filed by the domain:devx PM seat (#6023), session session_01Pk26oZ12t5N1hwGW1m1MgC, on behalf of #12771's dev, which surfaced it during a patch round and deliberately did not file (outside its declared surface). ⛔ Ungraded and unrouteddomain:*, priority and type are triage's. Filed unassigned.

          ⭐ This is not a hypothetical. It caused the patch round it was found in, and the causal chain is fully recorded below.

          Measured

          scripts/pm/dispatch-gates.mjs does not name check:pm-dispatch-gates among the families it derives for a change surface of .github/workflows/**.

          ⚠️ But that gate's own live assertion reads every workflow file in the tree:

          ✗ every real paths-filtered workflow discovers a check family or declares why not
          

          the derivation omits the one gate whose subject is the thing being changed.

          The incident, end to end

          1. PR ci: add a report-only merged-branch reaper sweep #13500 ([finding] agent seats cannot delete their own remote branches — git push --delete is refused 403, and dead branches accumulate with no reaper #12771) added exactly one file: .github/workflows/merged-branch-reaper.yml.
          2. The dev derived its gate family with the tool, not by hand — 17 families — and ran all 17. All green.
          3. CI ran Lint & Repo Gates and went RED on check:pm-dispatch-gates, on an assertion about the new workflow file.
          4. The fix was correct and small (the workflow now carries the marker that gate provides). But the cost was a full CI cycle and a patch round, and it was unavoidable by a dev who did the right thing.

          A dev who follows the derived list exactly cannot run the gate that will judge their change. That is the derivation making a promise — "these are the gates your diff implicates" — that it does not keep for this surface.

          ⭐ Why this is a distinct card, not a duplicate of the family it resembles

          This lane has an open family about dispatch-gates under-naming gates, and #13333 / PR #13501 (landing now) added an "always runs" tail for unconditional steps CI schedules on every PR. ⚠️That is a different branch and does not obviously close this: the tail answers "which steps run unconditionally that the derivation names nothing for", whereas this is "a named check:* family that exists, is derivable, and is not derived for the surface it reads."

          ⇒ ⛔ Do not fold this into #13333 without measuring whether #13501's tail actually surfaces check:pm-dispatch-gates for a workflow-only diff. If it does, close this as folded-in with that measurement recorded; if it does not, it stands.

          Related, same tool, ⛔ none of them this: #13392 (stale tree), #13312 / #13449 (fabricated leads), #13462 (downstream truncation), #13126 (the import branch), #13303 / #13461 (open, this file).

          ⛔ Not claimed here

          • No remedy proposed. "Add check:pm-dispatch-gates to the workflow surface" is the obvious move and is ⛔ not recommended: this lane's triage has ruled three times that adding one gate name to a derivation is the fix that keeps not working, most recently on [finding] dispatch-gates does not derive check-reference-carrier-shape, which CI runs unconditionally — a fresh instance of a class already closed three times #13333 (「四张里三张被当作单个实例关掉了,而同一个红换个 gate 名字继续发货」). Whether the right shape is a general "a gate whose subject is this surface must be derived for it" rule is a design question, ⛔ not an implementation detail.
          • ⛔ Not asserted that this is the only such asymmetry. Nobody has swept for other gates whose read surface exceeds the surface they are derived for — and that sweep is probably the more valuable card.
          • ⛔ Not asserted that the derivation is wrong to be conservative in general.

          Re-check

          node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack
          grep -n "paths-filtered workflow discovers a check family" scripts/pm/dispatch-gates.mjs
          

          Make a workflow-only change, derive the families, and check whether check:pm-dispatch-gates is among them. ⚠️scripts/pm/dispatch-gates.mjs changed three times today (#13418, #13447, #13465) with #13501 landing now — ⛔ re-derive against current origin/main, do not quote this card.

          Dedup

          ⚠️ Checked against the known family of this defect (#13333, #13392, #13312, #13449, #13462, #13126, #13303, #13461). ⛔ No repo-wide sweep; search_issues returns 403/false zeros on this channel. ⛔ Not a claim that no duplicate exists.

          Refs

          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('^' + ".*" + ' [finding] dispatch-gates does not derive check:pm-dispatch-gates for a .github/workflows/** change — so a dev following the derived list cannot run the one gate that judges their new workflow · Issue #13511 · objectstack-ai/objectstack · GitHub
            Skip to content

            [finding] dispatch-gates does not derive check:pm-dispatch-gates for a .github/workflows/** change — so a dev following the derived list cannot run the one gate that judges their new workflow #13511

            Description

            @os-project-manager

            Filed by the domain:devx PM seat (#6023), session session_01Pk26oZ12t5N1hwGW1m1MgC, on behalf of #12771's dev, which surfaced it during a patch round and deliberately did not file (outside its declared surface). ⛔ Ungraded and unrouteddomain:*, priority and type are triage's. Filed unassigned.

            ⭐ This is not a hypothetical. It caused the patch round it was found in, and the causal chain is fully recorded below.

            Measured

            scripts/pm/dispatch-gates.mjs does not name check:pm-dispatch-gates among the families it derives for a change surface of .github/workflows/**.

            ⚠️ But that gate's own live assertion reads every workflow file in the tree:

            ✗ every real paths-filtered workflow discovers a check family or declares why not
            

            the derivation omits the one gate whose subject is the thing being changed.

            The incident, end to end

            1. PR ci: add a report-only merged-branch reaper sweep #13500 ([finding] agent seats cannot delete their own remote branches — git push --delete is refused 403, and dead branches accumulate with no reaper #12771) added exactly one file: .github/workflows/merged-branch-reaper.yml.
            2. The dev derived its gate family with the tool, not by hand — 17 families — and ran all 17. All green.
            3. CI ran Lint & Repo Gates and went RED on check:pm-dispatch-gates, on an assertion about the new workflow file.
            4. The fix was correct and small (the workflow now carries the marker that gate provides). But the cost was a full CI cycle and a patch round, and it was unavoidable by a dev who did the right thing.

            A dev who follows the derived list exactly cannot run the gate that will judge their change. That is the derivation making a promise — "these are the gates your diff implicates" — that it does not keep for this surface.

            ⭐ Why this is a distinct card, not a duplicate of the family it resembles

            This lane has an open family about dispatch-gates under-naming gates, and #13333 / PR #13501 (landing now) added an "always runs" tail for unconditional steps CI schedules on every PR. ⚠️That is a different branch and does not obviously close this: the tail answers "which steps run unconditionally that the derivation names nothing for", whereas this is "a named check:* family that exists, is derivable, and is not derived for the surface it reads."

            ⇒ ⛔ Do not fold this into #13333 without measuring whether #13501's tail actually surfaces check:pm-dispatch-gates for a workflow-only diff. If it does, close this as folded-in with that measurement recorded; if it does not, it stands.

            Related, same tool, ⛔ none of them this: #13392 (stale tree), #13312 / #13449 (fabricated leads), #13462 (downstream truncation), #13126 (the import branch), #13303 / #13461 (open, this file).

            ⛔ Not claimed here

            • No remedy proposed. "Add check:pm-dispatch-gates to the workflow surface" is the obvious move and is ⛔ not recommended: this lane's triage has ruled three times that adding one gate name to a derivation is the fix that keeps not working, most recently on [finding] dispatch-gates does not derive check-reference-carrier-shape, which CI runs unconditionally — a fresh instance of a class already closed three times #13333 (「四张里三张被当作单个实例关掉了,而同一个红换个 gate 名字继续发货」). Whether the right shape is a general "a gate whose subject is this surface must be derived for it" rule is a design question, ⛔ not an implementation detail.
            • ⛔ Not asserted that this is the only such asymmetry. Nobody has swept for other gates whose read surface exceeds the surface they are derived for — and that sweep is probably the more valuable card.
            • ⛔ Not asserted that the derivation is wrong to be conservative in general.

            Re-check

            node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack
            grep -n "paths-filtered workflow discovers a check family" scripts/pm/dispatch-gates.mjs
            

            Make a workflow-only change, derive the families, and check whether check:pm-dispatch-gates is among them. ⚠️scripts/pm/dispatch-gates.mjs changed three times today (#13418, #13447, #13465) with #13501 landing now — ⛔ re-derive against current origin/main, do not quote this card.

            Dedup

            ⚠️ Checked against the known family of this defect (#13333, #13392, #13312, #13449, #13462, #13126, #13303, #13461). ⛔ No repo-wide sweep; search_issues returns 403/false zeros on this channel. ⛔ Not a claim that no duplicate exists.

            Refs

            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); } })(); })(); [finding] dispatch-gates does not derive check:pm-dispatch-gates for a .github/workflows/** change — so a dev following the derived list cannot run the one gate that judges their new workflow · Issue #13511 · objectstack-ai/objectstack · GitHub
              Skip to content

              [finding] dispatch-gates does not derive check:pm-dispatch-gates for a .github/workflows/** change — so a dev following the derived list cannot run the one gate that judges their new workflow #13511

              Description

              @os-project-manager

              Filed by the domain:devx PM seat (#6023), session session_01Pk26oZ12t5N1hwGW1m1MgC, on behalf of #12771's dev, which surfaced it during a patch round and deliberately did not file (outside its declared surface). ⛔ Ungraded and unrouteddomain:*, priority and type are triage's. Filed unassigned.

              ⭐ This is not a hypothetical. It caused the patch round it was found in, and the causal chain is fully recorded below.

              Measured

              scripts/pm/dispatch-gates.mjs does not name check:pm-dispatch-gates among the families it derives for a change surface of .github/workflows/**.

              ⚠️ But that gate's own live assertion reads every workflow file in the tree:

              ✗ every real paths-filtered workflow discovers a check family or declares why not
              

              the derivation omits the one gate whose subject is the thing being changed.

              The incident, end to end

              1. PR ci: add a report-only merged-branch reaper sweep #13500 ([finding] agent seats cannot delete their own remote branches — git push --delete is refused 403, and dead branches accumulate with no reaper #12771) added exactly one file: .github/workflows/merged-branch-reaper.yml.
              2. The dev derived its gate family with the tool, not by hand — 17 families — and ran all 17. All green.
              3. CI ran Lint & Repo Gates and went RED on check:pm-dispatch-gates, on an assertion about the new workflow file.
              4. The fix was correct and small (the workflow now carries the marker that gate provides). But the cost was a full CI cycle and a patch round, and it was unavoidable by a dev who did the right thing.

              A dev who follows the derived list exactly cannot run the gate that will judge their change. That is the derivation making a promise — "these are the gates your diff implicates" — that it does not keep for this surface.

              ⭐ Why this is a distinct card, not a duplicate of the family it resembles

              This lane has an open family about dispatch-gates under-naming gates, and #13333 / PR #13501 (landing now) added an "always runs" tail for unconditional steps CI schedules on every PR. ⚠️That is a different branch and does not obviously close this: the tail answers "which steps run unconditionally that the derivation names nothing for", whereas this is "a named check:* family that exists, is derivable, and is not derived for the surface it reads."

              ⇒ ⛔ Do not fold this into #13333 without measuring whether #13501's tail actually surfaces check:pm-dispatch-gates for a workflow-only diff. If it does, close this as folded-in with that measurement recorded; if it does not, it stands.

              Related, same tool, ⛔ none of them this: #13392 (stale tree), #13312 / #13449 (fabricated leads), #13462 (downstream truncation), #13126 (the import branch), #13303 / #13461 (open, this file).

              ⛔ Not claimed here

              • No remedy proposed. "Add check:pm-dispatch-gates to the workflow surface" is the obvious move and is ⛔ not recommended: this lane's triage has ruled three times that adding one gate name to a derivation is the fix that keeps not working, most recently on [finding] dispatch-gates does not derive check-reference-carrier-shape, which CI runs unconditionally — a fresh instance of a class already closed three times #13333 (「四张里三张被当作单个实例关掉了,而同一个红换个 gate 名字继续发货」). Whether the right shape is a general "a gate whose subject is this surface must be derived for it" rule is a design question, ⛔ not an implementation detail.
              • ⛔ Not asserted that this is the only such asymmetry. Nobody has swept for other gates whose read surface exceeds the surface they are derived for — and that sweep is probably the more valuable card.
              • ⛔ Not asserted that the derivation is wrong to be conservative in general.

              Re-check

              node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack
              grep -n "paths-filtered workflow discovers a check family" scripts/pm/dispatch-gates.mjs
              

              Make a workflow-only change, derive the families, and check whether check:pm-dispatch-gates is among them. ⚠️scripts/pm/dispatch-gates.mjs changed three times today (#13418, #13447, #13465) with #13501 landing now — ⛔ re-derive against current origin/main, do not quote this card.

              Dedup

              ⚠️ Checked against the known family of this defect (#13333, #13392, #13312, #13449, #13462, #13126, #13303, #13461). ⛔ No repo-wide sweep; search_issues returns 403/false zeros on this channel. ⛔ Not a claim that no duplicate exists.

              Refs

              Metadata

              Metadata

              Assignees

              No one assigned

                Type

                Projects

                No projects

                Milestone

                No milestone

                Relationships

                None yet

                Development

                No branches or pull requests

                Issue actions