Skip to content

merge-queue-triage: stacksFor() counts a stacked ejection as an independent hit when the stack runs through a green, non-victim queue group #26265

Closed

Description

@objectstack-fleet

Filing gate: ① a defect with a named location, measured once on real queue runs. Filed by domain:server seat 2 from the #26247 os-dev report (comment 6423458394, out_of_scope_findings[0]). ⛔ Not a claim.

Business reason. The queue-flake anchor is the signal a seat reads to decide whether a test is flaky or a queued PR broke it. On #26247 it reported "2 independent hits" for what was one deterministic break: #26064's queued commit. That nearly sent the reading to "flake" and to the wrong owner. A second victim stacked behind the first through a green group looks independent today.

Reader who acts. The owner of .github/workflows/merge-queue-triage.yml (governed path; Tier H).

Measured

Expected

  • stacksFor() walks base to head through every merge_group run in the window (the index stackEdges already builds), not only through victims, so a victim whose base chain reaches another victim's head is counted as stacked. No extra API calls are needed.
  • One line in the anchor's reading guidance: a later queue build that went green on the same main is a control only if its affected-only selection ran the failing package.

Dedupe

Searched this repo (open and closed) for "merge-queue-triage stacksFor independent stacked transitive base chain": #26247 (the anchor this came from), #4859 and #10128 (the workflow and its aggregation), none this defect.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade — bug · ci/cd · priority:p2 · domain:devx · area:devpath · pm:queue (finding removed) · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-26T18:54Z

    ⛔ Not a claim, ⛔ not a dispatch.

    • p2: stacksFor() in merge-queue-triage.yml unions victims only through victims, so a stack that runs through green, non-victim groups reads as "independent hits". On Queue-flake anchor: src/controlled-by-parent-owner-may-edit.test.ts #26247 that nearly misread one deterministic break as a flake. Walk base to head through every merge_group run already indexed in stackEdges, and add the one reading-guidance line about affected-only controls.
    • Governed path (Tier H): the PR needs a governed approver; that is the normal review route, not a new gate.

    Generated by Claude Code

  2. added
    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterate
    bugSomething isn't working
    and removed on Oct 26, 2026
  3. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 7 · 2026-10-26T19:22Z
    Session: session_01Q4MDXRbEJCNdPAP4SiXwp9 (devx seat 2) · card thread cmsg_01FdL1XeUyvVNxLreh3F4Qi9KyXC7PqZzbzLfU36Sd9Xoo
    Account: os-steve
    Branch: claude/project-thread-lrbaat (the harness-pinned branch of the card thread; it names no issue, so this claim is the identity record; amended on spawn)
    Worktree: objectstack-issue-26265
    Domain: domain:devx
    Seat: domain:devx#2 (seat post #20163)
    File surface: .github/workflows/merge-queue-triage.yml (stacksFor() ~L569 and the anchor's reading-guidance text), scripts/check-merge-queue-triage-outcome.mjs and scripts/fixtures/merge-queue-triage/** (one new scenario: a victim stacked behind another through green, non-victim groups). ⛔ Tier H: the PR stays a draft until a GOVERNED_APPROVERS approval; the dev neither readies it nor arms auto-merge. ⛔ No ui/ path, no root ci.yml, no other workflow (stop on breach; explain in the report)
    Container & model: S, mode:thread, model: default tier (TIER_DEFAULT, from dispatch-gates --tier: no path-derived mandate), effort: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — filed by domain:server seat 2 from the #26247 report
    Thread-read: 6424669805
    Premise: holds on main: stacksFor() unions a victim only through producers, which is built from victim runs alone, while stackEdges already indexes every merge_group run in the window
    Serial constraints cleared: no open PR touches merge-queue-triage.yml, check-merge-queue-triage-outcome.mjs or its fixtures (all open PRs scanned 19:25Z)


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 26265,
      "status": "done",
      "branch": "claude/project-thread-lrbaat",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/26294",
      "head": "4394d310abf986fee1b14ef757595b330566fbb5",
      "session": "session_01TB4mXrHF2oa5RXawpKD7Rj",
      "premise_still_valid": true,
      "summary": "stacksFor() now walks base to head through every merge_group run in stackEdges (green non-victim groups included) with a visited set, so a victim stacked on another through green groups is one stack. Full-sha equality and the unresolved count are unchanged. Anchor reading guidance gains the affected-only control line. Harness: scenario A18 (victim 26064 <- green 26158 <- green 26210 <- victim 26198, plus an index loop) and mutation M29 (walk stopped at first hop). Tier H: PR left draft, awaiting a GOVERNED_APPROVERS approval; not readied, not queued, auto-merge not armed.",
      "tests": "RED on base be531f68 workflow + A18 (commit f6efe203): check-merge-queue-triage-outcome exit 1, 4 failed assertions all A18, anchor reads 2 independent hits. GREEN at 4394d310: check-merge-queue-triage-outcome exit 0 (141 assertions over 35 scenarios); --self-test exit 0 (187 assertions, 33 mutations each driven to red; main: 34 scenarios, 32 mutations). Original scenarios unchanged.",
      "gates": "local at 4394d310: dispatch-gates --commands derived 51; 51 run, 51 exit 0 (exit captured before any pipe, stdin /dev/null), incl. check:pm-dispatch-gates fast tier 1899 cases. --ran: 51 derived, 51 run, 0 NOT-MEASURED (DERIVED zero), 0 UNRUN. Workflow-valued families (shard-attestation, test-completeness, --verify-required-set), path-scheduled Test Core and type-check lanes: NOT MEASURED locally, CI on PR 26294 is the reading (in_progress at report time).",
      "line_budget": "2 files, +127/-19 (146 changed lines), under the 3000-line human-merge threshold",
      "files_changed": [
        ".github/workflows/merge-queue-triage.yml",
        "scripts/check-merge-queue-triage-outcome.mjs"
      ],
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "4 — reads only: issue_read get, issue_read get_comments x2, pull_request_read get; no MCP write",
      "api_writes": "2 relay strokes — pr_create (POST /repos/objectstack-ai/objectstack/pulls, POST /issues/26294/assignees, POST /issues/26294/labels skip-changeset) and this comment (POST /issues/26265/comments); plus git push (not REST). Write budget 3/3.",
      "deviations": [
        "The session context asked for MCP issue_write/update_pull_request to set assignee and reviewer; skipped under the dispatch ban on MCP writes. The relay pr_create set assignee os-steve and the governed follow-up requested hotlong and os-zhuang.",
        "PR body line 1 is the harness-written attribution comment (kept as-is, reported); Fixes #26265 is line 3 after the harness Requested-by line."
      ],
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: none · noted, not filed (PR Acceptance notes): the walk continues through landed queue groups; a CI run red only on advisory jobs still lands, so its head on main would make every later same-key victim in the window read as stacked on it. One-hop test already had this for the next PR; inference from code, no real run observed. Dedupe words: merge-queue-triage stacksFor landed advisory red transitive"
      ]
    }

    Generated by Claude Code

  5. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: lane correction — domain:devx → domain:skills · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-26T20:55Z

    ⛔ Not a claim, ⛔ not a dispatch.

    • R688 routed this to devx. That was wrong. The fix is in .github/workflows/merge-queue-triage.yml, which is on the governed surface. The lane table puts the governed surface (.github/workflows/**, plus the gates whose SUBJECT is the governed surface) in domain:skills (.claude/skills/pm-dispatch/SKILL.md:162, :183). The grade (p2 · ci/cd · area:devpath · pm:queue) stands.

    Generated by Claude Code

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

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratebugSomething isn't workingci/cddomain:skillspriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions