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/plugin-chatbot/src/__tests__/ChatbotEnhanced.pendingCountPulse-26471.test.tsx has ejected 2 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.
Claim: PM loop round 1
Session: session_01J8VVAkHqAv2eFKVSt9LqkC
Account: huangyiirene
Branch: claude/project-thread-vpqn8c
Worktree: objectstack-issue-26647
Domain: domain:ui
Seat: domain:ui#2
File surface: ui/packages/plugin-chatbot/** (the ChatbotEnhanced.pendingCountPulse-26471 pin and, if the count itself is wrong, ChatbotEnhanced.tsx) (stop on breach; explain in the report)
Container & model: M, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier: no path-derived mandate), effort: xhigh
Clause-②: no
Metadata-protocol: none
Responsibility: the pin added with #26539 (76002090), or the pulse re-render it asserts | none | every PR in the merge queue: two ejections (runs 40468287272, 40493270857)
Thread-read: 6441459230
Premise: holds
Serial constraints cleared: none on ui/packages/plugin-chatbot/src; open #26556 touches only ui/packages/plugin-chatbot/package.json
Dispatched to a card thread of the "objectstack ui" project (mode:thread); the dispatch order is the thread's opening message. The platform names the thread branch (claude/project-thread-vpqn8c), not claude/issue-26647-chatbot-pulse-flake. Read at 2026-10-27T13:01Z on origin/mainf6ffd72347.
Withdrawn: this comment first carried a release of claim 6442545200. It is void. Irene corrected the stand-down at 2026-10-27T14:07Z (「4小时之后可以继续」, project chat): seat 2 pauses instead and keeps its claims. Claim 6442545200 (Seat: domain:ui#2, branch claude/project-thread-vpqn8c) stands; pm:dispatched and the assignee were never changed. The seat resumes review and landing after about 18:10Z.
{
"issue": 26647,
"status": "done",
"branch": "claude/project-thread-vpqn8c",
"pr": "https://github.com/objectstack-ai/objectstack/pull/26742",
"head_sha": "b192892a6165ff485c2fe990cd04021b9c8e9c01",
"session": "session_01J8VVAkq9LgnKiBeyJBZqSp",
"premise_still_valid": true,
"summary": "Test-only fix. The draft card draws 发布 before fetchPendingDraftCount answers and draws 发布 (2) on a later render; both tests read the count with a one-shot toHaveTextContent right after findByTestId, which resolves on the button alone, so under load the read beat the count render. Both reads now go through expectPublishButtonText, a waitFor around the same assertion. ChatbotEnhanced.tsx untouched: the count is right, only the pin raced it. PM hypothesis partly disproved: the race is with the FIRST count read's render, not the pulse's; the failing assertion runs before that test fires any pulse, and the pulse leg sits inside await act(...), which flushes it.",
"tests": "origin/main f6ffd723, unchanged file, 24 runs with 6 CPU busy-loops on 4 cores: 23 pass, 1 fail in 'unmount unsubscribes' with Expected 发布 (2) / Received 发布 (the queue signature of runs 40468287272 and 40493270857). Fix b192892a, same load plus a gate sweep beside it: 24 pass, 0 fail. Forced reverse check (scratch file, deleted, never committed): fetch answering after 30 ms, old pin red every time (Received 发布), new pin green. Mutation via scripts/ablation-replace.mjs removing the count suffix from the publish button: both fixed tests red (Received 发布), restored, blob == HEAD 2233fd2f, git diff HEAD empty. pnpm --dir ui exec vitest run packages/plugin-chatbot/: 86 files, 816 tests passed. pnpm --filter @object-ui/plugin-chatbot run type-check: exit 0; tsc -p tsconfig.test.json --listFiles lists the test file. eslint on the file: exit 0.",
"gates": "Local: node scripts/pm/dispatch-gates.mjs --commands at b192892a derived 24; all 24 exit 0, recorded as command :: exit code; dispatch-gates --ran: 24 derived, 24 run, 0 NOT-MEASURED (a DERIVED zero). Includes node scripts/check-sdui-manifest.mjs and its --self-test (exit 0), and pnpm --dir ui exec vitest run scripts/ (178 files passed, 2 skipped). pnpm check:new-line-citations: 0 new. CI on b192892a: 57 check-runs, 43 success, 14 skipped, 0 failed; required: Lint & Repo Gates success, TypeScript Type Check success, Test Core success, Build Core skipped, Governed Surface Queue Guard success, Lint UI success, Type Check UI success, Test UI success (16/16 shards success), Build & E2E UI success; Check Changeset success.",
"line_budget": "16 changed lines (+13 / -3), 1 file, vs the 3000-line human-merge threshold: under",
"files_changed": ["ui/packages/plugin-chatbot/src/__tests__/ChatbotEnhanced.pendingCountPulse-26471.test.tsx"],
"changeset": "none; skip-changeset label sent on pr_create and present on the PR. @object-ui/plugin-chatbot files[] = dist, README.md, CHANGELOG.md, LICENSE; after a build dist holds 0 hits for expectPublishButtonText or 'unmount unsubscribes' and 2 files for the positive control draft-publish",
"deviations": [
"Changeset: the order said a changeset in the root .changeset/; os-dev.md's publish-surface rule wins (measured above, nothing publishes), so skip-changeset instead",
"Pushed the platform-named thread branch empty at f6ffd723 before the claim, as the opening order asked; os-dev.md rule 1 says a card-thread branch is not pushed empty. No content, no PR on it then",
"Waited once on a process found by name (pgrep -f feeding tail --pid) instead of a recorded PID; it only waited, nothing was killed",
"origin/main gained 43731031 (ui/packages/auth only, outside this package's closure) after the base; not merged in",
"No reviewer requested: the session's attribution context asks for a GitHub MCP review request, which the order and os-dev.md forbid, and the write budget carries no reviewer stroke",
"Maintainer pause 14:07Z to 18:14Z: the PR opened 14:05Z just before it; this report was held until the resume"
],
"dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
"mcp_calls": "1 — get_job_logs (read, job 122069386772); no MCP write",
"api_writes": "2 — relay repository_dispatch POST /repos/objectstack-ai/objectstack/dispatches for pr_create (run 40517831470, success; body read back byte-identical, assignee huangyiirene); and the one carrying this comment via scripts/pm/post-stamped.mjs",
"open_questions": [],
"out_of_scope_findings": []
}
Activity
objectstack-fleet commentedon Oct 27, 2026
Triage: first grade —
bug·tests·priority:p1·domain:ui·area:ai·pm:queue(findingremoved) · triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-27T12:05Z⛔ Not a claim, ⛔ not a dispatch.
expect(element).toHaveTextContent()on "unmount unsub", an assertion on product behaviour (the count text), not a timing precondition, so read it as real until shown otherwise. The test is Draft card keeps 「发布 (N)」 after the chat banner publishes: the pending count never refreshes (no subscriber to the metadata-refresh pulse) #26471's new pin (ui/packages/plugin-chatbot/.../ChatbotEnhanced.pendingCountPulse-26471.test.tsx). Root chore(ui)!: stop publishing @object-ui/app-shell; delete the two host-console examples and the extraction guide (#25922) #26483 merged; feat(spec)!: retirement kits whose conversion retired at or below 16.x age out; the strict unknown-key refusal names the protocol upgrade guide #26599 was inherited. The dev reproduces it onmainunder the queue's load. If the pin races the pulse's async re-render, it awaits the re-render, not a sleep. ⛔ No quarantine, no retry wrapper.Generated by Claude Code
objectstack-fleet commentedon Oct 27, 2026
Claim: PM loop round 1
Session:
session_01J8VVAkHqAv2eFKVSt9LqkCAccount:
huangyiireneBranch:
claude/project-thread-vpqn8cWorktree:
objectstack-issue-26647Domain:
domain:uiSeat:
domain:ui#2File surface:
ui/packages/plugin-chatbot/**(theChatbotEnhanced.pendingCountPulse-26471pin and, if the count itself is wrong,ChatbotEnhanced.tsx) (stop on breach; explain in the report)Container & model:
M,mode:thread,model: TIER_DEFAULT (dispatch-gates --tier: no path-derived mandate),effort: xhighClause-②: no
Metadata-protocol: none
Responsibility:
the pin added with #26539 (76002090), or the pulse re-render it asserts|none|every PR in the merge queue: two ejections (runs 40468287272, 40493270857)Thread-read: 6441459230
Premise: holds
Serial constraints cleared: none on
ui/packages/plugin-chatbot/src; open #26556 touches onlyui/packages/plugin-chatbot/package.jsonDispatched to a card thread of the "objectstack ui" project (
mode:thread); the dispatch order is the thread's opening message. The platform names the thread branch (claude/project-thread-vpqn8c), notclaude/issue-26647-chatbot-pulse-flake. Read at 2026-10-27T13:01Z onorigin/mainf6ffd72347.Generated by Claude Code
objectstack-fleet commentedon Oct 27, 2026
Withdrawn: this comment first carried a release of claim 6442545200. It is void. Irene corrected the stand-down at 2026-10-27T14:07Z (「4小时之后可以继续」, project chat): seat 2 pauses instead and keeps its claims. Claim 6442545200 (
Seat: domain:ui#2, branchclaude/project-thread-vpqn8c) stands;pm:dispatchedand the assignee were never changed. The seat resumes review and landing after about 18:10Z.Generated by Claude Code
objectstack-fleet commentedon Oct 27, 2026
os-dev-report
{ "issue": 26647, "status": "done", "branch": "claude/project-thread-vpqn8c", "pr": "https://github.com/objectstack-ai/objectstack/pull/26742", "head_sha": "b192892a6165ff485c2fe990cd04021b9c8e9c01", "session": "session_01J8VVAkq9LgnKiBeyJBZqSp", "premise_still_valid": true, "summary": "Test-only fix. The draft card draws 发布 before fetchPendingDraftCount answers and draws 发布 (2) on a later render; both tests read the count with a one-shot toHaveTextContent right after findByTestId, which resolves on the button alone, so under load the read beat the count render. Both reads now go through expectPublishButtonText, a waitFor around the same assertion. ChatbotEnhanced.tsx untouched: the count is right, only the pin raced it. PM hypothesis partly disproved: the race is with the FIRST count read's render, not the pulse's; the failing assertion runs before that test fires any pulse, and the pulse leg sits inside await act(...), which flushes it.", "tests": "origin/main f6ffd723, unchanged file, 24 runs with 6 CPU busy-loops on 4 cores: 23 pass, 1 fail in 'unmount unsubscribes' with Expected 发布 (2) / Received 发布 (the queue signature of runs 40468287272 and 40493270857). Fix b192892a, same load plus a gate sweep beside it: 24 pass, 0 fail. Forced reverse check (scratch file, deleted, never committed): fetch answering after 30 ms, old pin red every time (Received 发布), new pin green. Mutation via scripts/ablation-replace.mjs removing the count suffix from the publish button: both fixed tests red (Received 发布), restored, blob == HEAD 2233fd2f, git diff HEAD empty. pnpm --dir ui exec vitest run packages/plugin-chatbot/: 86 files, 816 tests passed. pnpm --filter @object-ui/plugin-chatbot run type-check: exit 0; tsc -p tsconfig.test.json --listFiles lists the test file. eslint on the file: exit 0.", "gates": "Local: node scripts/pm/dispatch-gates.mjs --commands at b192892a derived 24; all 24 exit 0, recorded as command :: exit code; dispatch-gates --ran: 24 derived, 24 run, 0 NOT-MEASURED (a DERIVED zero). Includes node scripts/check-sdui-manifest.mjs and its --self-test (exit 0), and pnpm --dir ui exec vitest run scripts/ (178 files passed, 2 skipped). pnpm check:new-line-citations: 0 new. CI on b192892a: 57 check-runs, 43 success, 14 skipped, 0 failed; required: Lint & Repo Gates success, TypeScript Type Check success, Test Core success, Build Core skipped, Governed Surface Queue Guard success, Lint UI success, Type Check UI success, Test UI success (16/16 shards success), Build & E2E UI success; Check Changeset success.", "line_budget": "16 changed lines (+13 / -3), 1 file, vs the 3000-line human-merge threshold: under", "files_changed": ["ui/packages/plugin-chatbot/src/__tests__/ChatbotEnhanced.pendingCountPulse-26471.test.tsx"], "changeset": "none; skip-changeset label sent on pr_create and present on the PR. @object-ui/plugin-chatbot files[] = dist, README.md, CHANGELOG.md, LICENSE; after a build dist holds 0 hits for expectPublishButtonText or 'unmount unsubscribes' and 2 files for the positive control draft-publish", "deviations": [ "Changeset: the order said a changeset in the root .changeset/; os-dev.md's publish-surface rule wins (measured above, nothing publishes), so skip-changeset instead", "Pushed the platform-named thread branch empty at f6ffd723 before the claim, as the opening order asked; os-dev.md rule 1 says a card-thread branch is not pushed empty. No content, no PR on it then", "Waited once on a process found by name (pgrep -f feeding tail --pid) instead of a recorded PID; it only waited, nothing was killed", "origin/main gained 43731031 (ui/packages/auth only, outside this package's closure) after the base; not merged in", "No reviewer requested: the session's attribution context asks for a GitHub MCP review request, which the order and os-dev.md forbid, and the write budget carries no reviewer stroke", "Maintainer pause 14:07Z to 18:14Z: the PR opened 14:05Z just before it; this report was held until the resume" ], "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "mcp_calls": "1 — get_job_logs (read, job 122069386772); no MCP write", "api_writes": "2 — relay repository_dispatch POST /repos/objectstack-ai/objectstack/dispatches for pr_create (run 40517831470, success; body read back byte-identical, assignee huangyiirene); and the one carrying this comment via scripts/pm/post-stamped.mjs", "open_questions": [], "out_of_scope_findings": [] }Generated by Claude Code
objectstack-fleet commentedon Oct 27, 2026
ACCEPT → PR #26742 comment 6450121623 ·
domain:uiseat 2 · 2026-10-27T18:18Z