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
src/pages/settings/__tests__/SettingsView.shellLeave-13231.test.tsx has ejected 2 pull requests from the merge
queue within a rolling 24 hours — 2 independent hits 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.
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.
Claim: PM loop round 3 · 2026-10-26T14:31Z
Session: session_01SMps7wq7rBTk53e8KTSEup
Account: os-steve
Branch: claude/issue-26096-settings-shell-leave-wait
Worktree: objectstack-issue-26096
Domain: domain:ui
Seat: domain:ui#2
File surface: ui/apps/console/src/pages/settings/__tests__/SettingsView.shellLeave-13231.test.tsx only (the waits before the post-navigation queries); root .changeset/ only if the repo's changeset gate asks for one on a test-only diff (stop on breach; explain in the report). ⛔ SettingsView sources, ui/packages/**, ui/.github/** and the root .github/workflows/ci.yml are out of bounds. scripts/sdui-manifest.* stays untouched (apps/console is outside the registry closure).
Container & model: S, mode:subagent, model: default tier, effort: medium
Clause-②: no
Metadata-protocol: none
Responsibility: the console settings page's shell-leave test, which races a 1000 ms default wait on a loaded shard | the save's settled state the case already observes | every ui PR whose merge-queue build lands on that shard (#26027, #26057, #25996 so far)
Thread-read: 6415752036
Premise: holds 2026-10-26T14:30Z — on origin/main3993793dc8, SettingsView.shellLeave-13231.test.tsx:195await screen.findByText('Profile page') after the save-settled waitFor (:192) uses the default 1000 ms; queue build 40337868008 (#26027) failed it at 1064 ms and the triage seat measured 1066 ms on #26057 — a timing cliff, not a behaviour change. Same pattern at :162 and :184.
Serial constraints cleared: none — no open claim holds this test file.
Writes: PR only via the relay op pr_create; comments only via the relay write tools; ⛔ no GitHub MCP writes.
Ruling section: triage 6415752036 — make the wait match what the case awaits; ⛔ no quarantine, no skip, no retry.
Seat's route: the post-navigation query awaits the route change it depends on (e.g. findByText(..., {}, { timeout }) sized to the suite's established budget for console route loads, or awaiting the navigation signal the test already has) — no product change, no sleep. Apply the same to the other two findByText('Profile page') sites. Fixes #26096 (the anchor closes with the fix).
{
"issue": 26096,
"status": "done",
"branch": "claude/issue-26096-settings-shell-leave-wait",
"pr": "https://github.com/objectstack-ai/objectstack/pull/26212",
"session": "session_01SMps7wq7rBTk53e8KTSEup",
"premise_still_valid": true,
"summary": "The flake is real and pinned to :195 (the after-save case, both ejections), but it is not a timing cliff. The save commits outside act. The page's unsaved-edits registration is released one passive-effect task later, and on a loaded worker the bar-wait returns in between. The Profile click then meets a still-registered page, confirmUnsavedLeave asks, the stubbed confirm answers Cancel, and the route never changes, so no timeout could help. The fix waits on the registration itself before the click: a cancelable beforeunload that is no longer prevented. This is the exact pattern the sibling SettingsView.leaveGuard-13163 save case already uses (objectui#13317). It is test-only, +16/-0 in the one claimed file, with assertions unchanged and no timeout, sleep, retry, skip or product change. :162 and :184 are untouched: a probe showed Profile page is already in the DOM synchronously after those clicks, and neither case can hit the race. This deviates from the seat's suggested timeout-sizing route, which would not fix it and which ui/AGENTS.md (测试纪律) forbids.",
"tests": "All runs under os-verify-lock, vitest --project @object-ui/console --maxWorkers=2. (1) Mechanism probe (throwaway, deleted): the save commit runs with IS_REACT_ACT_ENVIRONMENT=false, and at that commit held=true bar=false. (2) Unfixed case with an emulated starved worker (3 ms CPU burn after the queued microtasks once the bar goes): FAILED 2/2 with registrationHeld=true at the click, confirmCalls=1, path=/settings/localization, 'NOT FOUND after 1006 ms', which is the CI signature; it passes without the emulation. (3) Fixed case under the same emulation: 3/3 'Tests 6 passed (6)'. (4) Natural load on main: NOT reproduced (plain main runs are green; no CPU hog was run on the shared box). (5) Fixed file 5x in a row at f7b810df: 5 x 'Tests 6 passed (6)', VERDICT command-exit 0. (6) Whole @object-ui/console project at f7b810df: 'Test Files 247 passed (247) / Tests 2488 passed (2488)', VERDICT command-exit 0 (839 s held). (7) After merging origin/main (head 9c7d1a00) and rebuilding console^... (70/70 tasks): this file plus leaveGuard-13163 gave 'Test Files 2 passed (2) / Tests 18 passed (18)', VERDICT command-exit 0. Ablation: n/a, because a test-only diff changes no tested behaviour; the unfixed-vs-fixed emulation pair is the reverse proof.",
"gates": "At head 9c7d1a00: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 23 commands; each was run with its exit captured before any pipe, and all 23 exit 0 (check-sdui-manifest exit 0, so the record is untouched). --ran reconciliation: '23 derived, 23 run, 0 NOT-MEASURED, 0 UNRUN (a DERIVED zero)'. pnpm --filter @object-ui/console run type-check exits 0, but its program does not list this test file (--listFiles count 0), so it is not coverage of the change. CI on the PR: in_progress at report time (28 check-runs: 19 in_progress, 2 success, 7 skipped, none red). Not waited on, per contract.",
"dogfood_battery": "n/a: no '!' in the PR title and no (narrowing) arm",
"mcp_calls": "0",
"api_writes": "2: (1) fleet-write relay pr_create (POST /repos/objectstack-ai/objectstack/dispatches, run 40352715114, which executed POST /pulls plus POST /issues/26212/assignees [os-steve] and POST /issues/26212/labels [skip-changeset]; read-back identical, 5236 bytes); (2) this os-dev-report comment via post-stamped.mjs (POST /issues/26096/comments). Plus 3 git pushes (empty branch, fix commit, merge of origin/main), which are not REST writes.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none. Noted in the PR Acceptance notes only: the triage reading 'timing cliff, 1066 ms against the 1000 ms default' (triage 6415752036, and the devx re-queue on #26057 citing a 'timeout-shaped red') misread a swallowed click as a slow navigation. A re-queue cannot cure this signature on a loaded shard. No card is filed (not a defect class)."
]
}
Status: the after-save case now waits until the page releases its unsaved-edits registration, rather than a timeout. The flake's measured cause was a swallowed click: the registration was still held when the test clicked. pm:dispatched removed; the anchor is done.
Activity
objectstack-fleet commentedon Oct 26, 2026
Triage: first grade —
bug·tests·priority:p2·domain:ui·area:records·pm:queue(findingremoved) · triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-26T12:14Z⛔ Not a claim, ⛔ not a dispatch.
findByText('Profile page')atSettingsView.shellLeave-13231.test.tsx:195timed out at 1066 ms against the 1000 ms default, on a fully loadedTest UI11/16 shard. That is a timing cliff, not a behaviour change.Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
Claim: PM loop round 3 · 2026-10-26T14:31Z
Session:
session_01SMps7wq7rBTk53e8KTSEupAccount:
os-steveBranch:
claude/issue-26096-settings-shell-leave-waitWorktree:
objectstack-issue-26096Domain:
domain:uiSeat:
domain:ui#2File surface:
ui/apps/console/src/pages/settings/__tests__/SettingsView.shellLeave-13231.test.tsxonly (the waits before the post-navigation queries); root.changeset/only if the repo's changeset gate asks for one on a test-only diff (stop on breach; explain in the report). ⛔SettingsViewsources,ui/packages/**,ui/.github/**and the root.github/workflows/ci.ymlare out of bounds.scripts/sdui-manifest.*stays untouched (apps/console is outside the registry closure).Container & model:
S,mode:subagent,model: default tier,effort: mediumClause-②: no
Metadata-protocol: none
Responsibility:
the console settings page's shell-leave test, which races a 1000 ms default wait on a loaded shard|the save's settled state the case already observes|every ui PR whose merge-queue build lands on that shard (#26027, #26057, #25996 so far)Thread-read: 6415752036
Premise: holds 2026-10-26T14:30Z — on
origin/main3993793dc8,SettingsView.shellLeave-13231.test.tsx:195await screen.findByText('Profile page')after the save-settledwaitFor(:192) uses the default 1000 ms; queue build 40337868008 (#26027) failed it at 1064 ms and the triage seat measured 1066 ms on #26057 — a timing cliff, not a behaviour change. Same pattern at :162 and :184.Serial constraints cleared: none — no open claim holds this test file.
Writes: PR only via the relay op
pr_create; comments only via the relay write tools; ⛔ no GitHub MCP writes.findByText(..., {}, { timeout })sized to the suite's established budget for console route loads, or awaiting the navigation signal the test already has) — no product change, no sleep. Apply the same to the other twofindByText('Profile page')sites.Fixes #26096(the anchor closes with the fix).objectstack-fleet commentedon Oct 26, 2026
os-dev-report
{ "issue": 26096, "status": "done", "branch": "claude/issue-26096-settings-shell-leave-wait", "pr": "https://github.com/objectstack-ai/objectstack/pull/26212", "session": "session_01SMps7wq7rBTk53e8KTSEup", "premise_still_valid": true, "summary": "The flake is real and pinned to :195 (the after-save case, both ejections), but it is not a timing cliff. The save commits outside act. The page's unsaved-edits registration is released one passive-effect task later, and on a loaded worker the bar-wait returns in between. The Profile click then meets a still-registered page, confirmUnsavedLeave asks, the stubbed confirm answers Cancel, and the route never changes, so no timeout could help. The fix waits on the registration itself before the click: a cancelable beforeunload that is no longer prevented. This is the exact pattern the sibling SettingsView.leaveGuard-13163 save case already uses (objectui#13317). It is test-only, +16/-0 in the one claimed file, with assertions unchanged and no timeout, sleep, retry, skip or product change. :162 and :184 are untouched: a probe showed Profile page is already in the DOM synchronously after those clicks, and neither case can hit the race. This deviates from the seat's suggested timeout-sizing route, which would not fix it and which ui/AGENTS.md (测试纪律) forbids.", "tests": "All runs under os-verify-lock, vitest --project @object-ui/console --maxWorkers=2. (1) Mechanism probe (throwaway, deleted): the save commit runs with IS_REACT_ACT_ENVIRONMENT=false, and at that commit held=true bar=false. (2) Unfixed case with an emulated starved worker (3 ms CPU burn after the queued microtasks once the bar goes): FAILED 2/2 with registrationHeld=true at the click, confirmCalls=1, path=/settings/localization, 'NOT FOUND after 1006 ms', which is the CI signature; it passes without the emulation. (3) Fixed case under the same emulation: 3/3 'Tests 6 passed (6)'. (4) Natural load on main: NOT reproduced (plain main runs are green; no CPU hog was run on the shared box). (5) Fixed file 5x in a row at f7b810df: 5 x 'Tests 6 passed (6)', VERDICT command-exit 0. (6) Whole @object-ui/console project at f7b810df: 'Test Files 247 passed (247) / Tests 2488 passed (2488)', VERDICT command-exit 0 (839 s held). (7) After merging origin/main (head 9c7d1a00) and rebuilding console^... (70/70 tasks): this file plus leaveGuard-13163 gave 'Test Files 2 passed (2) / Tests 18 passed (18)', VERDICT command-exit 0. Ablation: n/a, because a test-only diff changes no tested behaviour; the unfixed-vs-fixed emulation pair is the reverse proof.", "gates": "At head 9c7d1a00: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 23 commands; each was run with its exit captured before any pipe, and all 23 exit 0 (check-sdui-manifest exit 0, so the record is untouched). --ran reconciliation: '23 derived, 23 run, 0 NOT-MEASURED, 0 UNRUN (a DERIVED zero)'. pnpm --filter @object-ui/console run type-check exits 0, but its program does not list this test file (--listFiles count 0), so it is not coverage of the change. CI on the PR: in_progress at report time (28 check-runs: 19 in_progress, 2 success, 7 skipped, none red). Not waited on, per contract.", "dogfood_battery": "n/a: no '!' in the PR title and no (narrowing) arm", "mcp_calls": "0", "api_writes": "2: (1) fleet-write relay pr_create (POST /repos/objectstack-ai/objectstack/dispatches, run 40352715114, which executed POST /pulls plus POST /issues/26212/assignees [os-steve] and POST /issues/26212/labels [skip-changeset]; read-back identical, 5236 bytes); (2) this os-dev-report comment via post-stamped.mjs (POST /issues/26096/comments). Plus 3 git pushes (empty branch, fix commit, merge of origin/main), which are not REST writes.", "open_questions": [], "out_of_scope_findings": [ "carrier: none. Noted in the PR Acceptance notes only: the triage reading 'timing cliff, 1066 ms against the 1000 ms default' (triage 6415752036, and the devx re-queue on #26057 citing a 'timeout-shaped red') misread a swallowed click as a slow navigation. A re-queue cannot cure this signature on a loaded shard. No card is filed (not a defect class)." ] }Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
Landed · seat 2 · 2026-10-26T16:58Z
f42b55f2, head9c7d1a00(test-only, +16/−0, ACCEPT 6420477259)origin/mainf2e70836, containsf42b55f2(git merge-base --is-ancestorexit 0)gh-readonly-queue/main/pr-26212-*: none left (consumed)Fixes #26096on #26212Status: the after-save case now waits until the page releases its unsaved-edits registration, rather than a timeout. The flake's measured cause was a swallowed click: the registration was still held when the test clicked.
pm:dispatchedremoved; the anchor is done.