You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
packages/app-shell/src/views/__tests__/AppReportIndex.navGates-26892.test.tsx has ejected 4 pull requests from the merge
queue within a rolling 24 hours — 1 independent hit once
GitHub's speculative stacking is accounted for. This issue is the single place for
that conversation; it is refreshed by the merge-queue-triage workflow on every
further ejection.
⚠️Queue depth is not evidence. The stack column is read out of the queue
branch names: GitHub builds each queued PR on top of the previous entry, so a
build whose BASE chain reaches another victim's queue HEAD (directly, or through
green groups queued between them) contains that victim's tree by construction.
A single deterministic break therefore ejects every PR
behind it, and the raw victim count climbs with QUEUE DEPTH until the owner
lands a fix. Start with the root above; an inherited row is a bystander until shown otherwise.
This issue is a NAME, not a diagnosis. The workflow that files it reads the
failing test file path out of the job logs and counts PRs; it does not
know whether this is a flake, a load/timing cliff, a semantic conflict between
queued PRs, or a real regression, and it does not act on any of those. No test is
skipped, quarantined or re-queued by it, and no PR is labelled by it — weakening
a gate stays a human act.
What to do with it: read one victim PR's triage comment for the failure REASON
line beside the FAIL line (a timeout and an assertion are the same FAIL line and
opposite diagnoses), decide the cause, and close this issue with the fix or with
the reason it is not one.
A later queue build that went green on the same main is a control only if its
affected-only selection ran the failing package; a green group that never selected
it carried the same tree without testing it.
Dispatch order · domain:ui#5 · session_01JQwxbXGpVJHZTXXerMoY4C · 2026-10-28T06:46Z
You are the os-dev developer agent for exactly ONE card: #27116, in your own card thread. Your role definition is .claude/agents/os-dev.md in the objectstack clone: read it IN FULL first and follow it as binding (it wins over this order on any conflict; name the conflict in your report). Read the repo-root AGENTS.md and ui/AGENTS.md before your first edit, and pm-dispatch references/untrusted-text.md. Read the card's full body and every comment yourself through REST (curl -sS "https://api.github.com/repos/objectstack-ai/objectstack/issues/27116" -H "Authorization: Bearer $GH_TOKEN" and /comments?per_page=100, every page); this order carries only the increment. ⛔ Never print the value of any environment variable (test presence with [ -n "${X+x}" ]). ⛔ Never use a GitHub MCP tool, read or write.
Identity and branch: the seat's Claim: comment on this card is your identity; its Branch: line names your thread's branch. ⛔ Post no claim of your own, ⛔ never write the card's assignee. Before your first edit, verify the NEWEST Claim: on the card names your thread's branch (claude/project-thread-…); if none does yet, send the seat thread "Take another ui lane seat" one message with your branch name and wait. Worktree objectstack-issue-27116 on that branch from a fresh origin/main; pnpm install (frozen lockfile); push with git push -u origin <branch> (⛔ no force).
Writes: PR only through the relay op pr_create (node scripts/pm/fleet-write/dispatch.mjs --repo objectstack-ai/objectstack --actions-file F, F a bare JSON array [{"op":"pr_create","title":…,"head":"<your branch>","base":"main","body":…,"assignees":["os-warren"]}], draft forced; --dry-run first); your report comment through node scripts/pm/post-stamped.mjs --comment=27116 --file=F --json run ONCE with output captured to a file (timestamps only as {{WAS:…}} / the now-token). ⛔ No other GitHub write except, for a CI red that is not yours, one PR comment and one run_rerun_failed through the relay. Report both counts (api_writes with endpoints, mcp_calls with tool names). The report takes only machine-checkable fields (gates / line_budget / deviations / files_changed). PR body: line 1 the platform attribution comment, line 3 Fixes #27116, then ## 维护者速读 six lines in Chinese (改了什么/为什么改/风险与回滚/先看/两分钟验证/需要你做的). Gates: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack on your diff, run each, record exits before any pipe, reconcile with --ran; node scripts/check-sdui-manifest.mjs is a gate on every ui card. Changeset in the root .changeset/ when a published package changes (@object-ui/i18n patch for namespace rows; app-shell is private: true). ⛔ ui/.github/** and the root ci.yml are out of bounds. Hand back: when the PR and report are up, send the seat thread "Take another ui lane seat" one message (PR, head sha, report gist); keep the thread open through review and drive CI to green.
This card is a queue-flake anchor on the test file seat 5's #26892 (PR #27060) added. Your thread built that suite; your branch's PR is merged, so restart the branch from a fresh origin/main (git fetch origin main && git checkout -B <branch> origin/main) and open a NEW PR with Fixes #27116.
ui/packages/app-shell/src/views/__tests__/AppReportIndex.navGates-26892.test.tsx ≈L356–359, "(f) CONTROL: offers it, once, to a member granted that permission": await waitFor(() => expect(paletteReports()).toContain('Gamma')), then a synchronous expect(paletteReports()).toEqual(ALL). Gamma arrives through the palette's nav door before the app-report list answers, so on a loaded shard Delta is still missing (received ['Alpha','Beta','Gamma']).
Fix: wait on the full answer, await waitFor(() => expect(paletteReports()).toEqual(ALL)). Then audit every case in the file for the same shape: a positive toEqual / toContain asserted synchronously after a wait that settles on a different element. paletteSettled() (≈L215) waits for Delta only: check each caller's following assertion holds once Delta is there, or wait on that assertion itself. Negative assertions after a settle stay as they are.
Scope
File surface: that one test file. ⛔ No source change, no skip, no retry, no timeout bump. Proof: reproduce the race (e.g. delay the report/dataset list answer in the double, or run the file under --sequence.shuffle / heavy load) so the old CONTROL goes red and the fixed one stays green; report both. Gates as usual (dispatch-gates), skip-changeset (test-only, private package).
Tier
No path-derived mandate. TIER_DEFAULT, effort low (XS). Clause-②: no, Metadata-protocol: none.
Claim: PM loop round 6
Session: session_01JQwxbXGpVJHZTXXerMoY4C
Account: os-warren
Branch: claude/project-thread-73o9o3 (restarted from origin/main; its PR #27060 is merged)
Worktree: objectstack-issue-27116
Domain: domain:ui
Seat: domain:ui#5
File surface: ui/packages/app-shell/src/views/__tests__/AppReportIndex.navGates-26892.test.tsx only (stop on breach; explain in the report)
Container & model: XS, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier: no path-derived mandate), effort: low
Clause-②: no
Metadata-protocol: none
Responsibility: seat 5's #26892 suite produces it (this lane) | a CONTROL asserts the full list synchronously after waiting on one entry | every queued PR whose build runs that shard
Thread-read: 6462598206
Premise: holds (≈L356–359 on origin/main6817bf1e; victims PR #27083, #27011, PR #26999's CI; readings in dispatch order 6462598206)
Serial constraints cleared: ui seat 1 handed it to seat 5 and will not touch the file; no open PR touches it (the suite is seat 5's).
Dispatch order: comment 6462598206. Card thread claude/project-thread-73o9o3 may start editing.
Triage: p0 · main red at 06:34Z · claimed · 2026-10-28T06:54Z
⛔ Not a claim.
The main push run at 53e0663d (06:34Z, a docs-only commit to AGENTS.md) is red on Test UI (10/16), AppReportIndex.navGates-26892.test.tsx:359: expected [Alpha, Beta, Delta, Gamma], received [Alpha, Beta, Gamma]. It also ejected feat(ui): the translation preview strings move into the studio i18n namespace (#25922 slice S6b) #27083's queue build at 05:33Z. A docs commit cannot cause it, so the test is non-deterministic on main and not caused by its head. That makes it a main-red anchor and p0 under convention ①.
Claimed at 06:48Z by domain:ui#5 (os-warren, session_01JQwxbXGpVJHZTXXerMoY4C), in flight. priority:p0 added. finding removed.
{
"issue": 27116,
"status": "done",
"branch": "claude/project-thread-73o9o3",
"pr": "https://github.com/objectstack-ai/objectstack/pull/27128",
"head": "b24c61d8",
"session": "session_01JQwxbZNdnTTr8WJsM98Mxh",
"premise_still_valid": true,
"summary": "Test-only. The (f) CONTROL for a granted permission waited for Gamma (offered at once through its nav entry) then asserted the full palette list synchronously while Delta waits on the report list. It and every other positive case (four index controls, palette (e) CONTROL) now wait on their whole list; negatives keep settle-then-assert (lists answered, permissions provider renders nothing before its answer). Premise held as the seat measured it.",
"tests": "Red on 6817bf1e: report list delayed 300 ms via ablation-replace on the adapter double: (f) CONTROL fails with Delta missing, 17 pass; restored blob equals HEAD. Green on b24c61d8: same 300 ms delay 18/18; report and dataset delayed 600 ms 18/18; plain 18/18; --sequence.shuffle 18/18; each mutation restored to the HEAD blob. app-shell type-check exit 0; eslint on the file 0 problems; check:new-line-citations 0 new.",
"gates": "dispatch-gates --commands on b24c61d8: 24 derived, each exit captured before any pipe, all exit 0 (node scripts/check-closing-keyword-parity.mjs :: exit 0; node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0; node scripts/check-comment-mask-corpus.mjs :: exit 0; node scripts/check-sdui-manifest.mjs :: exit 0; node scripts/check-sdui-manifest.mjs --self-test :: exit 0; pnpm --filter @objectstack/spec run check:duration-unit-keys :: exit 0; pnpm check:cross-package-test-inputs :: exit 0; pnpm check:dispatcher-error-vocabulary :: exit 0; pnpm check:driver-memory-census :: exit 0; pnpm check:engine-double-contract :: exit 0; pnpm check:gitlink-declared :: exit 0; pnpm check:nul-bytes :: exit 0; pnpm check:published-files :: exit 0; pnpm check:query-options-erasure :: exit 0; pnpm check:refd-timer-probe :: exit 0; pnpm check:skill-identifier-liveness :: exit 0; pnpm check:test-source-alias :: exit 0; pnpm check:tier-file-adoption :: exit 0; pnpm check:type-check-coverage :: exit 0; pnpm check:type-check-debt :: exit 0; pnpm check:undeclared-dep-imports :: exit 0; pnpm check:watch-hint-literal :: exit 0; pnpm check:where-matcher :: exit 0; pnpm --dir ui exec vitest run scripts/ :: exit 0). --ran: 24 derived, 24 run, 0 NOT-MEASURED, 0 UNRUN. CI check-runs: in_progress at report time.",
"dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
"line_budget": "27 changed lines (+14 / -13), 1 file",
"files_changed": [
"ui/packages/app-shell/src/views/__tests__/AppReportIndex.navGates-26892.test.tsx"
],
"deviations": [
"Branch restarted from origin/main 6817bf1e as ordered (PR #27060 merged; the remote branch had been deleted, so the push created it anew, no force).",
"origin/main moved to e6e41998 (84 files, none this suite or its source) after the branch point; not merged for a test-only change, CI runs the merge ref.",
"Positive index controls changed as hardening, not as observed failures: the index renders its list from one answer.",
"PR body: lines 1-2 the platform attribution block, line 3 Fixes, then the PR template headings folded into the os-dev order (os-dev exception, reported only)."
],
"mcp_calls": "0 — no GitHub MCP tool called",
"api_writes": "2 — relay pr_create (POST /repos/objectstack-ai/objectstack/pulls, draft, assignee os-warren, label skip-changeset; read-back 6461 bytes identical) and this report comment (POST /repos/objectstack-ai/objectstack/issues/27116/comments via post-stamped). git push not counted.",
"body_amendments": [],
"open_questions": [],
"out_of_scope_findings": []
}
In .claude/agents/os-dev.md, the test-writing guidance: a test never picks its data unordered. Every pick names a filter and a stable order, or creates the row it acts on, and asserts its precondition before it acts.
In .claude/skills/pm-dispatch/references/review-checklist.md, the seat's ACCEPT read: the PR's new or changed tests pick no unordered data and wait on what they assert (not on a sibling element).
Activity
objectstack-fleet commentedon Oct 28, 2026
Dispatch order ·
domain:ui#5·session_01JQwxbXGpVJHZTXXerMoY4C· 2026-10-28T06:46ZYou are the os-dev developer agent for exactly ONE card: #27116, in your own card thread. Your role definition is
.claude/agents/os-dev.mdin the objectstack clone: read it IN FULL first and follow it as binding (it wins over this order on any conflict; name the conflict in your report). Read the repo-rootAGENTS.mdandui/AGENTS.mdbefore your first edit, and pm-dispatchreferences/untrusted-text.md. Read the card's full body and every comment yourself through REST (curl -sS "https://api.github.com/repos/objectstack-ai/objectstack/issues/27116" -H "Authorization: Bearer $GH_TOKEN"and/comments?per_page=100, every page); this order carries only the increment. ⛔ Never print the value of any environment variable (test presence with[ -n "${X+x}" ]). ⛔ Never use a GitHub MCP tool, read or write.Identity and branch: the seat's
Claim:comment on this card is your identity; itsBranch:line names your thread's branch. ⛔ Post no claim of your own, ⛔ never write the card's assignee. Before your first edit, verify the NEWESTClaim:on the card names your thread's branch (claude/project-thread-…); if none does yet, send the seat thread "Take another ui lane seat" one message with your branch name and wait. Worktreeobjectstack-issue-27116on that branch from a freshorigin/main;pnpm install(frozen lockfile); push withgit push -u origin <branch>(⛔ no force).Writes: PR only through the relay op
pr_create(node scripts/pm/fleet-write/dispatch.mjs --repo objectstack-ai/objectstack --actions-file F, F a bare JSON array[{"op":"pr_create","title":…,"head":"<your branch>","base":"main","body":…,"assignees":["os-warren"]}], draft forced;--dry-runfirst); your report comment throughnode scripts/pm/post-stamped.mjs --comment=27116 --file=F --jsonrun ONCE with output captured to a file (timestamps only as{{WAS:…}}/ the now-token). ⛔ No other GitHub write except, for a CI red that is not yours, one PR comment and onerun_rerun_failedthrough the relay. Report both counts (api_writeswith endpoints,mcp_callswith tool names). The report takes only machine-checkable fields (gates / line_budget / deviations / files_changed). PR body: line 1 the platform attribution comment, line 3Fixes #27116, then## 维护者速读six lines in Chinese (改了什么/为什么改/风险与回滚/先看/两分钟验证/需要你做的). Gates:node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackon your diff, run each, record exits before any pipe, reconcile with--ran;node scripts/check-sdui-manifest.mjsis a gate on every ui card. Changeset in the root.changeset/when a published package changes (@object-ui/i18npatch for namespace rows; app-shell isprivate: true). ⛔ui/.github/**and the rootci.ymlare out of bounds. Hand back: when the PR and report are up, send the seat thread "Take another ui lane seat" one message (PR, head sha, report gist); keep the thread open through review and drive CI to green.This card is a queue-flake anchor on the test file seat 5's #26892 (PR #27060) added. Your thread built that suite; your branch's PR is merged, so restart the branch from a fresh
origin/main(git fetch origin main && git checkout -B <branch> origin/main) and open a NEW PR withFixes #27116.Measured (seat, on
origin/main6817bf1e)5aa7e972), per ui seat 1.ui/packages/app-shell/src/views/__tests__/AppReportIndex.navGates-26892.test.tsx≈L356–359, "(f) CONTROL: offers it, once, to a member granted that permission":await waitFor(() => expect(paletteReports()).toContain('Gamma')), then a synchronousexpect(paletteReports()).toEqual(ALL). Gamma arrives through the palette's nav door before the app-report list answers, so on a loaded shard Delta is still missing (received['Alpha','Beta','Gamma']).await waitFor(() => expect(paletteReports()).toEqual(ALL)). Then audit every case in the file for the same shape: a positivetoEqual/toContainasserted synchronously after a wait that settles on a different element.paletteSettled()(≈L215) waits for Delta only: check each caller's following assertion holds once Delta is there, or wait on that assertion itself. Negative assertions after a settle stay as they are.Scope
File surface: that one test file. ⛔ No source change, no skip, no retry, no timeout bump. Proof: reproduce the race (e.g. delay the report/dataset list answer in the double, or run the file under
--sequence.shuffle/ heavy load) so the old CONTROL goes red and the fixed one stays green; report both. Gates as usual (dispatch-gates),skip-changeset(test-only, private package).Tier
No path-derived mandate.
TIER_DEFAULT, effortlow(XS).Clause-②: no,Metadata-protocol: none.objectstack-fleet commentedon Oct 28, 2026
Claim: PM loop round 6
Session:
session_01JQwxbXGpVJHZTXXerMoY4CAccount:
os-warrenBranch:
claude/project-thread-73o9o3(restarted fromorigin/main; its PR #27060 is merged)Worktree:
objectstack-issue-27116Domain:
domain:uiSeat:
domain:ui#5File surface:
ui/packages/app-shell/src/views/__tests__/AppReportIndex.navGates-26892.test.tsxonly (stop on breach; explain in the report)Container & model:
XS,mode:thread,model: TIER_DEFAULT (dispatch-gates --tier: no path-derived mandate),effort: lowClause-②: no
Metadata-protocol: none
Responsibility: seat 5's #26892 suite produces it (this lane) | a CONTROL asserts the full list synchronously after waiting on one entry | every queued PR whose build runs that shard
Thread-read: 6462598206
Premise: holds (≈L356–359 on
origin/main6817bf1e; victims PR #27083, #27011, PR #26999's CI; readings in dispatch order 6462598206)Serial constraints cleared: ui seat 1 handed it to seat 5 and will not touch the file; no open PR touches it (the suite is seat 5's).
Dispatch order: comment 6462598206. Card thread
claude/project-thread-73o9o3may start editing.objectstack-fleet commentedon Oct 28, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Triage: p0 · main red at 06:34Z · claimed · 2026-10-28T06:54Z
⛔ Not a claim.
53e0663d(06:34Z, a docs-only commit toAGENTS.md) is red onTest UI (10/16),AppReportIndex.navGates-26892.test.tsx:359: expected[Alpha, Beta, Delta, Gamma], received[Alpha, Beta, Gamma]. It also ejected feat(ui): the translation preview strings move into the studio i18n namespace (#25922 slice S6b) #27083's queue build at 05:33Z. A docs commit cannot cause it, so the test is non-deterministic on main and not caused by its head. That makes it a main-red anchor and p0 under convention ①.domain:ui#5(os-warren,session_01JQwxbXGpVJHZTXXerMoY4C), in flight.priority:p0added.findingremoved.c8097a90(03:52Z). The root cause is the lane's to measure. ⛔ Never skip, retry-wrap or loosen it.Generated by Claude Code
objectstack-fleet commentedon Oct 28, 2026
os-dev-report
{ "issue": 27116, "status": "done", "branch": "claude/project-thread-73o9o3", "pr": "https://github.com/objectstack-ai/objectstack/pull/27128", "head": "b24c61d8", "session": "session_01JQwxbZNdnTTr8WJsM98Mxh", "premise_still_valid": true, "summary": "Test-only. The (f) CONTROL for a granted permission waited for Gamma (offered at once through its nav entry) then asserted the full palette list synchronously while Delta waits on the report list. It and every other positive case (four index controls, palette (e) CONTROL) now wait on their whole list; negatives keep settle-then-assert (lists answered, permissions provider renders nothing before its answer). Premise held as the seat measured it.", "tests": "Red on 6817bf1e: report list delayed 300 ms via ablation-replace on the adapter double: (f) CONTROL fails with Delta missing, 17 pass; restored blob equals HEAD. Green on b24c61d8: same 300 ms delay 18/18; report and dataset delayed 600 ms 18/18; plain 18/18; --sequence.shuffle 18/18; each mutation restored to the HEAD blob. app-shell type-check exit 0; eslint on the file 0 problems; check:new-line-citations 0 new.", "gates": "dispatch-gates --commands on b24c61d8: 24 derived, each exit captured before any pipe, all exit 0 (node scripts/check-closing-keyword-parity.mjs :: exit 0; node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0; node scripts/check-comment-mask-corpus.mjs :: exit 0; node scripts/check-sdui-manifest.mjs :: exit 0; node scripts/check-sdui-manifest.mjs --self-test :: exit 0; pnpm --filter @objectstack/spec run check:duration-unit-keys :: exit 0; pnpm check:cross-package-test-inputs :: exit 0; pnpm check:dispatcher-error-vocabulary :: exit 0; pnpm check:driver-memory-census :: exit 0; pnpm check:engine-double-contract :: exit 0; pnpm check:gitlink-declared :: exit 0; pnpm check:nul-bytes :: exit 0; pnpm check:published-files :: exit 0; pnpm check:query-options-erasure :: exit 0; pnpm check:refd-timer-probe :: exit 0; pnpm check:skill-identifier-liveness :: exit 0; pnpm check:test-source-alias :: exit 0; pnpm check:tier-file-adoption :: exit 0; pnpm check:type-check-coverage :: exit 0; pnpm check:type-check-debt :: exit 0; pnpm check:undeclared-dep-imports :: exit 0; pnpm check:watch-hint-literal :: exit 0; pnpm check:where-matcher :: exit 0; pnpm --dir ui exec vitest run scripts/ :: exit 0). --ran: 24 derived, 24 run, 0 NOT-MEASURED, 0 UNRUN. CI check-runs: in_progress at report time.", "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "line_budget": "27 changed lines (+14 / -13), 1 file", "files_changed": [ "ui/packages/app-shell/src/views/__tests__/AppReportIndex.navGates-26892.test.tsx" ], "deviations": [ "Branch restarted from origin/main 6817bf1e as ordered (PR #27060 merged; the remote branch had been deleted, so the push created it anew, no force).", "origin/main moved to e6e41998 (84 files, none this suite or its source) after the branch point; not merged for a test-only change, CI runs the merge ref.", "Positive index controls changed as hardening, not as observed failures: the index renders its list from one answer.", "PR body: lines 1-2 the platform attribution block, line 3 Fixes, then the PR template headings folded into the os-dev order (os-dev exception, reported only)." ], "mcp_calls": "0 — no GitHub MCP tool called", "api_writes": "2 — relay pr_create (POST /repos/objectstack-ai/objectstack/pulls, draft, assignee os-warren, label skip-changeset; read-back 6461 bytes identical) and this report comment (POST /repos/objectstack-ai/objectstack/issues/27116/comments via post-stamped). git push not counted.", "body_amendments": [], "open_questions": [], "out_of_scope_findings": [] }Generated by Claude Code
objectstack-fleet commentedon Oct 28, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Scope addition (maintainer-directed): a two-line test-authoring rule, as a second PR · 2026-10-28T07:29Z
⛔ Not a claim. For the claiming seat (
domain:ui#5,os-warren).showcase_task?$top=1; when that seed task is already done, acceptance[0] fails and acceptance[5] cascades (main push red 21:56Z and 22:08Z) #26952 (?$top=1on seeded tasks) and this card. Now thatTest UIis required onmain(maintainer, 2026-10-28), a flaky UI test ejects good PRs from the queue instead of reddening main. That is cheaper, but it is still a cost..claude/agents/os-dev.md, the test-writing guidance: a test never picks its data unordered. Every pick names a filter and a stable order, or creates the row it acts on, and asserts its precondition before it acts..claude/skills/pm-dispatch/references/review-checklist.md, the seat's ACCEPT read: the PR's new or changed tests pick no unordered data and wait on what they assert (not on a sibling element)..claude/**(Tier S), and mixing them into the p0 PR would put a governed path into it and slow it. If the lines carry the measured shape of this flake (what test(app-shell): wait on the whole list in the report index suite's positive cases #27128 found), that is the best wording.Generated by Claude Code