--- title: "post-restart 项目名同时命中顶栏与侧栏" status: done created: 2026-09-13 updated: 2026-09-22 severity: high --- # post-restart 项目名同时命中顶栏与侧栏 > **W3 UI-rerun 关闭(2026-09-22)**:`status=done`。真实 Playwright 账本 PASS:[`ui-acceptance-results.json`](../test-reports/assets/2026-09-22-docrev-ui-rerun/ui-acceptance-results.json)(main UI-00..16)+ [`ui-acceptance-results-post-restart.json`](../test-reports/assets/2026-09-22-docrev-ui-rerun/ui-acceptance-results-post-restart.json)(UI-15)。任务 tip 已合入本地 `dev`;详见 [short-term](../ops/short-term/2026-09-22-docrev-ui-rerun.md) 与 [测试报告](../test-reports/2026-09-22-docrev-ui-rerun-test-report.md)。 ## 现象 第18轮真实 UI(schema 31):main **18 PASS / 0 FAIL**。宿主重启 app 后 `UI_PHASE=post-restart` 在页面**已经恢复项目**时失败,尚未走到 `revision-state`。 ``` strict mode violation: getByText('UI验收-超声微创系统-mu0eq020') resolved to 2 elements: 1) getByRole('banner').getByText(...) 2) getByTitle(...) ``` 失败行:`web/e2e/document-revision-runtime.spec.ts` 原第 626 行。 ## 根因分析 | 层 | 问题 | |---|---| | DOM | 顶栏 `header`(banner)写「当前项目:」+ 项目名;侧栏 `aside` 会话行 `title`/`span` 再写同一项目名 | | 脚本 | 点击用 `getByText(..., { exact: false }).first()`;恢复断言用页面级 `getByText(项目名)`,strict 下双命中 | | 产物 | `playwright.config.ts` 的 `outputDir` / HTML report 不按 `UI_PHASE` 分目录,第二阶段会覆盖主阶段 trace | | 总账 | `RESULTS_FILE` 固定 `ui-acceptance-results.json`;post-restart `recordPass` 会覆盖 main 的 18 项 | 这是 **UI 自动化可寻址缺口**,不是项目未恢复。 ## 严重度 `high` ## 关联整改 - Short-term: [../ops/short-term/2026-09-13-document-revision-post-restart-selector.md](../archive/ops/2026-09-13-document-revision-post-restart-selector.md) - 分支: `fix/document-revision-post-restart-selector` ## 证据 - 失败归档(只读,不改不删):`.doc/test-reports/assets/2026-09-13-document-revision-runtime-ui/schema31-postrestart-project-title-selector-failure/` - `error-context.md`:项目名同时出现在 banner 与 complementary title ## 开放问题 - 本轮不重跑真实 post-restart;不得标 UI-15 通过或任务 `done`