Skip to content

fix(question): prevent AskUserQuestion from resetting answers on re-render - #72

Merged
shaohaozhi286 merged 4 commits into
masterfrom
fix/question-picker-answer-reset
Sep 25, 2026
Merged

shaohaozhi286 merged 4 commits into
masterfrom
fix/question-picker-answer-reset

Conversation

@LIUXIN557

@LIUXIN557 LIUXIN557 commented Sep 24, 2026 •

Copy link
Copy Markdown
Collaborator

问题

多题 AskUserQuestion 在后台事件触发 App 重新渲染时,会清空已答内容并跳回第一题:父组件重新创建 request 对象,进而重建 questions 数组,触发 QuestionPicker 的重置 effect。

审查还发现原方案把新增 useMemo 放在认证提前返回之后,初次连接成功或输入 token 后会因 Hook 数量变化导致主界面崩溃。该问题已在本 PR 中修复。

改动

  • 按请求 UUID 判断是否重置;同请求的新对象引用保留答案、草稿和题号,新请求恢复初始状态。
  • memoize 可见提问,并将 Hook 放到所有认证提前返回之前,保持权限请求优先。
  • 增加真实 QuestionPicker 事件回归、生产 App 的 Hook 顺序回归和自定义草稿保留检查。
  • 修正不存在的 workspace 会话恢复测试,验证实际 404 响应;同步 master 后将过时的侧栏间距断言对齐到已提交布局,消除既有 CI 阻塞。

验证

  • 最终完整前端测试通过,含 2877 条 pass 记录;构建和正则兼容检查通过。
  • 原 Hook 错误已在 Chromium + 真实 React 18 的认证控制流中复现;修复后 5 次认证切换、2 次权限优先级检查通过,无页面错误。
  • OpenSpec strict、Git 差异检查通过。
  • 最终 GitHub CI 三项全部通过:test / 84caeeb2,包括 Web、macOS 安装脚本和 Linux C++ 单元测试。

问题与修复记录

  • 审查发现及复现记录
  • e3106ae2:修复认证路径的 Hook 顺序,并增加回归。
  • 84caeeb2:同步 master,修复主分支原有的侧栏断言,完成整体验证。
  • 设计、任务和验证记录:openspec/changes/fix-question-picker-rerender-state/。

Trae User added 2 commits September 25, 2026 10:10
…ender

The picker's reset effect depended on the `questions` array, which is
rebuilt whenever the request object reference changes. App recreated the
visible question object on every render (inline spread, not memoized), so
any unrelated re-render while the question was pending reset the answers
to their initial state and jumped back to the first question.

- Gate the reset on requestId identity via a ref (reset only on new request)
- Memoize visibleQuestionReq in App to avoid recreating the object
- Add a regression test for same-request re-renders
- Update the inline-permission architecture assertion to verify the
  permission-over-question intent instead of the old syntax
Commit 38b6af5 added workspace-membership checks to the workspaces
resume route, so a missing session short-circuits with 404 before reaching
SessionClient. The escaped-exception test still expected 500 for that
path and failed CI. Assert 404 for the workspace route; the plain
/api/sessions/:id/resume route keeps covering the SESSION_RESUME_FAILED
500 path.
@LIUXIN557
LIUXIN557 force-pushed the fix/question-picker-answer-reset branch from eb19905 to 4111ad0 Compare September 25, 2026 02:12
@shaohaozhi286

Copy link
Copy Markdown
Collaborator

审查发现 1 个需要合并前修复的 P1 问题,本地修复及验证已完成。

问题:认证完成时触发 Hook 数量变化,主界面可能白屏

原提交 4111ad0f 在 App.jsx 的 authState === 'checking' 和 authState === 'need-token' 提前返回之后新增了 visibleQuestionReq = useMemo(...)。首次连接成功或输入 token 后,渲染执行了上一次未执行的 Hook,触发 Rendered more hooks than during the previous render。原 PR 只测试 QuestionPicker 的重渲染,没有覆盖 App 启动路径。

修复

  • 保留按请求 UUID 重置答案的原修复。
  • 将问答 memo 移到所有认证提前返回之前,保持稳定 Hook 顺序与权限优先级。
  • 增加检查生产 App 语法树的 Hook 顺序回归,修复前失败、修复后通过。
  • 扩展同请求重渲染测试,验证自定义草稿也不会丢失。

验证记录

  • 从生产 App 提取认证控制流,使用 Chromium + 真实 React 18 验证:原 PR 复现 Hook 错误;修复后 5 次认证切换、2 次权限优先级检查通过,无页面错误。
  • PR 快照 pnpm test 通过(2784 条 pass 记录),pnpm build 及正则兼容检查通过。
  • 当前 master 与修复合并后的构建通过;318 个前端测试模块中,只有主分支已有的 sidebarAlignmentArchitecture.test.js:22 失败。未合并的 master 同样失败,原因是旧断言要求 gap-0,界面已经使用 gap-2;本 PR 没有新增失败。
  • 原 PR 的三项 CI 已通过;追加修复不修改 C++。
  • OpenSpec 严格验证通过。

修复将追加到本 PR 分支,随后更新远端 CI 和合并结果。当前工作区保持在 master,未改动无关代码。

Move the visible question memo before authentication early returns,
add a production App hook-order regression, and cover retained drafts.
Record PR 72 review findings and baseline-aware validation.
Keep the existing gap-2 layout and update its stale gap-0 assertion.
The integrated frontend suite and build pass; record the baseline cause
and final review validation without changing sidebar behavior.

@shaohaozhi286 shaohaozhi286 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

复审通过,已修复原 PR 中会导致认证切换后主界面崩溃的 P1 问题。

  • e3106ae2:将 visibleQuestionReq 的 useMemo 移到所有认证提前返回之前;新增生产 App 的 Hook 顺序回归,并补充自定义草稿保留检查。
  • 84caeeb2:同步 master,把原有侧栏样式断言从旧的 gap-0 对齐到已提交的 gap-2,解除合并后 Web CI 的基线失败。
  • 按请求 UUID 保留回答、切换新请求重置、权限优先级及原有键盘/IME 行为均已覆盖。
  • 修复后的完整前端测试通过(2877 条 pass 记录);构建、正则兼容、OpenSpec strict 和差异检查通过。
  • 原错误已在真实 React + Chromium 的认证控制流验证中复现;修复后 5 次认证切换和 2 次权限优先级检查通过。

问题与修复过程见前面的审查评论;最终远端 CI 及合并结果以本 PR 后续记录为准。

@shaohaozhi286
shaohaozhi286 merged commit 3992dd6 into master Sep 25, 2026
3 checks passed
@shaohaozhi286

Copy link
Copy Markdown
Collaborator

最终结果:已修复并合并

PR #72 已通过复审并合入 master,合并提交:3992dd625dae05b7f4e946c8be9c752c258befd5。

问题及修复:

  1. P1:认证切换导致 Hook 数量变化并可能白屏。 已通过 e3106ae2 把问答 memo 移到所有认证提前返回之前,并补充可复现原错误的生产 App Hook 顺序测试及草稿保留测试。
  2. 主分支已有的 CI 阻塞:侧栏间距断言过时。 已在 84caeeb2 同步 master,并将断言对齐到已提交的 gap-2 布局。

验证结果:

  • 完整前端测试通过,2877 条 pass 记录;构建、正则兼容、OpenSpec strict、Git 差异检查通过。
  • 真实 React / Chromium 认证控制流验证通过;原 Hook 错误已确认能在修复前复现。
  • 最终 GitHub CI 36128154384 三项全部通过:Web、macOS 安装脚本、Linux C++ 单元测试。
  • 合并提交的文件树与最终审查提交 84caeeb2 完全一致。
  • 本地 master、origin/master 与 GitHub master 均为 3992dd62,工作区干净,分支差异为 0 0。

详细过程见首次审查记录和 PR 内的 openspec/changes/fix-question-picker-rerender-state/review.md。

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants