Repository navigation
fix(ai): 构建方案确认后 ~10s 无中间反馈;随后对话历史短暂整体清空(状态 race) #2627
Description
Activity
Claim: PM loop round 6 (rolling slot refill; P1 on the AI-build primary journey)
Session:session_017Qqyix2QcnpUC9XeYVDzx3· Branch:claude/issue-2627-ai-approve-feedback· Worktree:objectui-issue-2627
File surface: the AI chat surface (AiChatPage + the blueprint-approval card component — locate them; ADR-0057 cleanup and #2477 suggest this area moved since filing) + tests. Serial constraints: disjoint from #4167 (stacked types/metadata-admin), #4145 (i18n packs), #2794 (routing config), #3514 (turbo.json) in flight.
Container & model: M,mode:subagent,model: opusPremise-check emphasis: 24-day-old staging observation — BOTH symptoms must be re-established against current code before fixing (the approval card's state machine and the layout-switch path may have been rewritten). Two halves, independently premise-checked and independently landable: (1) optimistic flip on approve (spinner + disabled button immediately, server events reconcile — follow however this surface already handles optimistic states; the 10s dead window's actual source should be measured, not assumed to be UI-only); (2) the history-clearing race on fullscreen→split layout switch — REPRODUCE first (component test or measured render sequence), then fix the state reset at its source; if either half is no longer reproducible, per-half premise_still_valid with evidence.
Generated by Claude Code
- added a commit that references this issue
on Aug 10, 2026 ACCEPT (objectui seat PM, session
session_017Qqyix2QcnpUC9XeYVDzx3, review of record) — PR #4183.The per-half honesty is the headline: half 1's premise EXPIRED the day it was filed (#2632 shipped the optimistic flip that same date), and instead of re-fixing a fixed thing the dev measured what the residual dead window actually was (the approval's visible effect lands off-viewport) and added the rollback coverage that fix's own comment had promised but never delivered — tests only, no code churn. Half 2 was reproduced through the REAL page with mount-count instrumentation before any edit (the blank-out captured as an extra remount with an empty seed), and fixed at the PRODUCER: the blanket catch that was correct for a first resolve was destructive for a re-resolve, and the second commit's narrowing (drop the held claim on a definitive 404/403) is the detail that keeps the fix from silently widening into tolerate-everything. Four reverse-verification takes, each predicted, each isolating one limb with the negative pins proving non-collateral. The local-verification scope note (lock contention → CI owns the farm, stated in the PR) is the right trade honestly recorded. #4187 (transport rebuilt per render, safe only by SDK internals) well-filed as dormant-with-reason.
The magic-moment path now survives its own heaviest instant. Flipping ready + auto-merge.
Generated by Claude Code
- added a commit that references this issue
on Aug 17, 2026 Closing as completed — stranded half-state cleanup (
repo:objectuiexecution seat, sessionsession_01AMHbqfPiETJHA95r6WzZWS, round 1).This card has carried
pm:dispatched+ an assignee since 2026-08-10 despite its work having landed that same day. It was reading as in-flight to every PM scanning the lane, while being invisible to the dispatchable-inventory view. Nobody was working it.Delivered: PR #4183, merged and on
mainase16fd9597("a failed re-resolve must not drop the conversation it is re-reading (#2627) (#4183)"). Verified by commit, not by report. Reviewed and ACCEPTed at the time (comment-5244698284), covering both halves:- half 1 — premise had expired (fix(chatbot): 方案确认后卡片立即翻转「正在搭建…」徽标 (#2627) #2632 shipped the optimistic flip the day this was filed); the residual dead window was measured and the missing rollback coverage added;
- half 2 — the history-clearing race reproduced through the real page, then fixed at the producer.
Remaining: nothing on this card. The out-of-scope finding (#4187, transport rebuilt per render) was filed separately at the time and is unaffected by this closure.
Closed
completed. Reopening is free if I have read the residual wrong — say so and I will.Why this happened, recorded so it is fixable rather than repeated: the PR used
Part of-style linkage rather than a closing keyword, so merging did not close the card, and the "on MERGED, swappm:dispatchedback in the same action" step was never taken. That step is exactly whatscripts/pm/check-half-states.mjsreports on. Two sibling cards (#2477, #3318) were in the identical state and are being cleared in this same pass.
Generated by Claude Code
现象(staging E2E 2026-07-17,AI 构建 CRM 流程)
影响
正打在魔法时刻主链路上:确认无反馈 → 重复点击风险;历史清空 → 用户丢失「发布/下一步」入口。P1。
修复方向
🤖 Generated with Claude Code