# PROGRESS · 账户弹窗 inert + 校正快照不再静默(2026-09-18) 工作树:`.worktrees/account-dialog-inert-20260918` 分支:`codex/account-dialog-inert-20260918` 基线:`origin/staging` @ `e760b1d6`(任务书写 `1061514f`,开工时 staging 已快进到此) 合入提交:`824ecff0` 任务书:`docs/tasks/TASK-account-dialog-inert-20260918.md` ## 任务状态 | 任务 | 状态 | 说明 | | --- | --- | --- | | 3.1 BUG-968 弹窗移出 inert | 完成 | 选 (a) `createPortal(..., document.body)`。账户弹窗与 onboarding 付费墙都挂到 `document.body`。`SidebarInset` 的 `inert={modalOpen}` 保留,移动端抽屉分支不动。 | | 3.2.1 GET 非 200 记 warn | 完成 | `warnRectificationCaseGet`:401/400/409/404/503 及 supabase 配置失败都打 JSON(`event` / `case_id` / `status` / `code` / `reason`),不含用户资料。 | | 3.2.2 客户端失败不静默 | 完成 | `loadCaseSnapshot` 非 2xx / 网络错误写入 `snapshotFailure`;校正面「这一问还没读到。」+「重新读取」。hydrate 带 `failure.status`。`refreshRectificationCase` 失败走 composer notice。Abort 不当失败。 | | 3.2.3 确定性回复带题干 | 完成 | 下一题是可渲染选择题时,`persistApplied` 与 `persistCollectDenialTurn` 用 `composeCollectSpokenAssistantText` 追加题干并随流发出。口述采集仍只 stream ack(BUG-525)。`attachQuestionsToTurns` 去重。 | ## 方案选择(3.1) 选 **(a) createPortal 到 document.body**,不选 (b) 把节点交给 AppShell。 原因:现有 overlay 的 DOM、焦点圈禁(`overlayRef` + `keepFocusWithin`)、Esc 关闭都不用改;不必扩展 `registerShellControls`。SSR 走 `typeof document === "undefined"` 的原树,现有 `renderToString` 合同继续看见 dialog。 ## 让步 无。3.1 与 3.2 的 1→2→3 都做完。BUG-969 快照失败的根因仍未由线上日志证实,状态写 **mitigated**,不得写 resolved。 ## 测试 | 项 | 结果 | | --- | --- | | `tsc --noEmit` | 0 错 | | `npm run lint` | **0 error** / 120 warning(未顺手修 warning) | | 定向 | `account-dialog-inert-20260918` 4/4;overlay / surface-state / surface-contract / collect-stall / question-in-message / membership / sidebar-contract / a11y / home-shell-growth / answer-choice **全绿** | | 全量 `npm test` | 3480 条,3402 绿,**78 红**。失败清单是 Windows 无 Docker / skill symlink `EPERM` / Unix 部署脚本,与本机近期口径一致;新增 4 条全绿,被改过的 discriminator 断言已按三栏改完。Linux 门禁基线仍是 31 红。 | | `Home()` 冻结 | useState / useRef 未增长 |