diff --git a/.doc/audit/2026-09-13-document-revision-post-restart-selector.md b/.doc/audit/2026-09-13-document-revision-post-restart-selector.md new file mode 100644 index 00000000..57516593 --- /dev/null +++ b/.doc/audit/2026-09-13-document-revision-post-restart-selector.md @@ -0,0 +1,49 @@ +--- +title: "post-restart 项目名同时命中顶栏与侧栏" +status: in_progress +created: 2026-09-13 +updated: 2026-09-13 +severity: high +--- + +# post-restart 项目名同时命中顶栏与侧栏 + +## 现象 + +第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 | + +这是 **UI 自动化可寻址缺口**,不是项目未恢复。 + +## 严重度 + +`high` + +## 关联整改 + +- Short-term: [../ops/short-term/2026-09-13-document-revision-post-restart-selector.md](../ops/short-term/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` diff --git a/.doc/audit/INDEX.md b/.doc/audit/INDEX.md index a6831c15..914c31d1 100644 --- a/.doc/audit/INDEX.md +++ b/.doc/audit/INDEX.md @@ -31,6 +31,12 @@ ### 最新专项审计(2026-09-13) +**文件**: [2026-09-13-document-revision-post-restart-selector.md](./2026-09-13-document-revision-post-restart-selector.md) + +**结论**: 第18轮 main 18 PASS;post-restart 在项目已恢复时,页面级项目名同时命中顶栏与侧栏,strict violation,未到 revision-state。 + +**整改**: [short-term](../ops/short-term/2026-09-13-document-revision-post-restart-selector.md) + **文件**: [2026-09-13-document-revision-reviewer-duty-sync.md](./2026-09-13-document-revision-reviewer-duty-sync.md) **结论**: 第17轮 UI-00–12 PASS;精确职责断言暴露真实缺陷——UI-01 已把 B 设为 reviewer,`doc_proj6145_*` 的 `reviewer_id` 却是硬编码 `2`,矩阵为 viewer。 diff --git a/.doc/ops/CURRENT.md b/.doc/ops/CURRENT.md index 0759aa31..86ccf40c 100644 --- a/.doc/ops/CURRENT.md +++ b/.doc/ops/CURRENT.md @@ -1,13 +1,13 @@ # 当前焦点 **更新**: 2026-09-13 -**production_ready**: no(DOCREV:schema **30**;第17轮 UI-13a reviewer 职责未同步;不执行 env-service 重建 / 不声称 E2E 通过) +**production_ready**: no(DOCREV:第18轮 main 18 PASS;post-restart 项目名 selector 未重跑;不执行 env-service 重建 / 不声称 E2E 通过) ## 焦点 -1. **DOCREV-RT**: [项目 reviewer 同步到受控文档职责](short-term/2026-09-13-document-revision-reviewer-duty-sync.md)(`fix/document-revision-reviewer-duty-sync`;heal 同事务锁已提交,暂不合入;不声称 E2E 通过) -2. **DOCREV-RT**: [质量修复子工作区契约](short-term/2026-09-13-document-revision-quality-repair-workspace-contract.md)(已合入 `dev@339e871`;仍 `in_progress`,待占槽重跑 UI-03) -3. **DOCREV-RT**: [编辑弹窗 hydration 竞态](short-term/2026-09-13-document-revision-editor-hydration-race.md)(已合入 `dev@8b1a531`;仍 `in_progress`,待占槽重跑 UI-06) +1. **DOCREV-RT**: [post-restart 项目名 selector](short-term/2026-09-13-document-revision-post-restart-selector.md)(`fix/document-revision-post-restart-selector`;编码已提交,暂不合入;不声称 post-restart 通过) +2. **DOCREV-RT**: [项目 reviewer 同步到受控文档职责](short-term/2026-09-13-document-revision-reviewer-duty-sync.md)(已合入 `dev@b824948`;不声称 E2E 通过) +3. **DOCREV-RT**: [质量修复子工作区契约](short-term/2026-09-13-document-revision-quality-repair-workspace-contract.md)(已合入 `dev@339e871`;仍 `in_progress`,待占槽重跑 UI-03) ## 并行认领 @@ -33,7 +33,8 @@ | Cursor-Auto | document-revision-fast-completion-observation | fix/document-revision-fast-completion-observation | - | document-revision-fast-completion-observation | in_progress | | Cursor-Auto | document-revision-workflow-category-navigation | fix/document-revision-workflow-category-navigation | - | document-revision-workflow-category-navigation | in_progress | | Cursor-Auto | document-revision-duty-cell-assertion | fix/document-revision-duty-cell-assertion | - | document-revision-duty-cell-assertion | in_progress | -| Cursor-Auto | document-revision-reviewer-duty-sync | fix/document-revision-reviewer-duty-sync | - | document-revision-reviewer-duty-sync | in_progress | +| Cursor-Auto | document-revision-reviewer-duty-sync | fix/document-revision-reviewer-duty-sync | - | document-revision-reviewer-duty-sync | done | +| Cursor-Auto | document-revision-post-restart-selector | fix/document-revision-post-restart-selector | - | document-revision-post-restart-selector | in_progress | > 新任务开始前登记。`branch` 必须为 `feature/` 或 `fix/`,**禁止** `dev` / `test` / `main`。同一 `mutex` 同时仅一个 `in_progress`。 diff --git a/.doc/ops/checklists/2026-09-13-document-revision-post-restart-selector.md b/.doc/ops/checklists/2026-09-13-document-revision-post-restart-selector.md new file mode 100644 index 00000000..928f9103 --- /dev/null +++ b/.doc/ops/checklists/2026-09-13-document-revision-post-restart-selector.md @@ -0,0 +1,22 @@ +--- +title: "post-restart 项目名 selector 收紧" +status: in_progress +created: 2026-09-13 +updated: 2026-09-13 +related_task: "2026-09-13-document-revision-post-restart-selector.md" +--- + +# post-restart 项目名 selector 收紧 + +## 本轮 + +- [x] 点击来自侧栏可见项目入口(complementary exact title),不用 `.first()` 弱化 +- [x] 恢复断言为 banner 内 exact 项目名 +- [x] `UI_PHASE` 分离 `playwright-output-main|post-restart` 与 `playwright-report-main|post-restart` +- [x] helper 契约测试 + `npm test` / `npm run build` +- [ ] 真实 UI-15 post-restart(本轮不做) + +## 完成定义 + +- [x] 上述实现项有单测或脚本证据 +- [ ] 现场 post-restart 仍开放,不得标 done diff --git a/.doc/ops/checklists/2026-09-13-document-revision-runtime-ui-acceptance.md b/.doc/ops/checklists/2026-09-13-document-revision-runtime-ui-acceptance.md index 30ed5ed3..4a1e4ce9 100644 --- a/.doc/ops/checklists/2026-09-13-document-revision-runtime-ui-acceptance.md +++ b/.doc/ops/checklists/2026-09-13-document-revision-runtime-ui-acceptance.md @@ -64,9 +64,9 @@ RUN_UI_ACCEPTANCE=1 BASE_URL=http://127.0.0.1:8080 \ 规格文件:`web/e2e/document-revision-runtime.spec.ts` + `web/playwright.config.ts`。 两阶段容器重启: -1. `RUN_UI_ACCEPTANCE=1 UI_PHASE=main` 跑主场景(写 `phase-state.json`,密码仅落 `phase-secrets.local.json` 本地文件) +1. `RUN_UI_ACCEPTANCE=1 UI_PHASE=main` 跑主场景(写 `phase-state.json`,密码仅落 `phase-secrets.local.json` 本地文件)。产物目录:`playwright-output-main` / `playwright-report-main` 2. 宿主执行 docker restart(脚本不碰 docker) -3. `RUN_UI_ACCEPTANCE=1 UI_PHASE=post-restart` 仅页面登录校验 UI-15 +3. `RUN_UI_ACCEPTANCE=1 UI_PHASE=post-restart` 仅页面登录校验 UI-15。产物目录:`playwright-output-post-restart` / `playwright-report-post-restart`(不得覆盖 main) 证据:`.doc/test-reports/assets/2026-09-13-document-revision-runtime-ui/`(trace/video/screenshot);结果 JSON 不得含凭证与 URL query。 diff --git a/.doc/ops/handoffs/2026-09-13-document-revision-post-restart-selector.md b/.doc/ops/handoffs/2026-09-13-document-revision-post-restart-selector.md new file mode 100644 index 00000000..64409434 --- /dev/null +++ b/.doc/ops/handoffs/2026-09-13-document-revision-post-restart-selector.md @@ -0,0 +1,67 @@ +--- +title: "post-restart 项目名 selector:编码后交接" +created: 2026-09-13 +from: Cursor-Auto +to: next-agent +status: open +--- + +# 交接:post-restart 项目名 selector(暂不合入) + +## 目标(下一位 Agent 应完成什么) + +- 不要在本分支继续改职责/业务语义 +- 合入前占 CURRENT 集成槽位;本轮禁止 merge / 重建容器 / 声称 post-restart 通过 +- 占槽后重跑 `UI_PHASE=post-restart`,确认 UI-15 走到 revision-state + +## 已完成 + +- post-restart:侧栏 exact title 点击 + banner exact 项目名断言 +- Playwright 产物按 `UI_PHASE` 分目录,避免第二阶段覆盖主阶段 +- helper 契约测试;`npm test` / `npm run build` + +## 未完成 + +- 真实 UI-15 post-restart +- 合入 `dev` + +## 认领 / 槽位状态 + +| 项 | 值 | +|----|-----| +| mutex 已释放 | no(`document-revision-post-restart-selector` 仍 `in_progress`) | +| 集成槽位 holder | 他人 e2e;本任务未占槽 | +| branch | `fix/document-revision-post-restart-selector` | +| worktree | - | + +> 若 mutex 未释放,下一位须先在 CURRENT 认领或写 blocker。 + +## 关键文件 + +| 路径 | 说明 | +|------|------| +| `web/src/lib/currentProjectRestore.ts` | 入口 / banner locator 契约 | +| `web/src/lib/playwrightPhaseArtifacts.ts` | 阶段目录名 | +| `web/e2e/document-revision-runtime.spec.ts` | post-restart UI-15 | +| `web/playwright.config.ts` | 分阶段 outputDir / HTML report | + +## 如何验证 + +```bash +cd web && npm test && npm run build +# 真实 UI(本轮不做): +# RUN_UI_ACCEPTANCE=1 UI_PHASE=post-restart npx playwright test e2e/document-revision-runtime.spec.ts +``` + +产物:`playwright-output-main` / `playwright-report-main` 与 `playwright-output-post-restart` / `playwright-report-post-restart`。 + +## 风险 / Blocker + +- 侧栏折叠时 complementary 入口不可见,应 FAIL 而非 `.first()` 跳过 +- 不得改删 schema31 失败归档 + +## 相关链接 + +- CURRENT: [../CURRENT.md](../CURRENT.md) +- Task: [../short-term/2026-09-13-document-revision-post-restart-selector.md](../short-term/2026-09-13-document-revision-post-restart-selector.md) +- Checklist: [../checklists/2026-09-13-document-revision-post-restart-selector.md](../checklists/2026-09-13-document-revision-post-restart-selector.md) diff --git a/.doc/ops/short-term/2026-09-13-document-revision-post-restart-selector.md b/.doc/ops/short-term/2026-09-13-document-revision-post-restart-selector.md new file mode 100644 index 00000000..cf0c7607 --- /dev/null +++ b/.doc/ops/short-term/2026-09-13-document-revision-post-restart-selector.md @@ -0,0 +1,57 @@ +--- +title: "post-restart 项目名 selector 与阶段产物隔离" +status: in_progress +created: 2026-09-13 +updated: 2026-09-13 +owner: Cursor-Auto +branch: fix/document-revision-post-restart-selector +worktree: "-" +mutex: document-revision-post-restart-selector +--- + +# post-restart 项目名 selector 与阶段产物隔离 + +## 目标 + +第18轮 main 18 PASS 后,post-restart 在页面已恢复项目时因项目名同时出现在顶栏与侧栏而 strict violation。改为 banner 内唯一 exact 断言,点击仍走可见项目入口;Playwright output/report 按 `UI_PHASE` 分目录。 + +## 范围 + +- `web/e2e/document-revision-runtime.spec.ts` post-restart 项目恢复断言 +- `web/src/lib/currentProjectRestore.ts` 与契约测试 +- `web/playwright.config.ts` + `playwrightPhaseArtifacts` 按阶段分目录 +- audit / checklist / handoff / CURRENT + +## 非目标 + +- 不改业务逻辑、不重跑真实 UI、不动容器、不 merge、不 push +- 不改删 `.doc/test-reports/assets/` 证据 +- 不声称 post-restart / UI-15 通过 + +## 步骤 + +1. [x] 从 `dev@b824948` 认领分支并登记 mutex +2. [x] 项目入口 click + banner exact 断言;禁 `.first()` 弱化 +3. [x] `UI_PHASE` 分离 `playwright-output-*` / `playwright-report-*` +4. [x] `npm test` / `npm run build` +5. [x] 原子提交 +6. [ ] 占槽后重跑 post-restart(本轮不做) + +## 验收标准 + +- [x] 页面级 `getByText(项目名)` 在 2 命中时契约判定失败 +- [x] 入口为 complementary exact title;当前项目为 banner exact text +- [x] main / post-restart 产物目录不同 +- [ ] 真实 UI-15 post-restart(未跑) + +## 相关链接 + +- Audit: [../../audit/2026-09-13-document-revision-post-restart-selector.md](../../audit/2026-09-13-document-revision-post-restart-selector.md) +- Checklist: [../checklists/2026-09-13-document-revision-post-restart-selector.md](../checklists/2026-09-13-document-revision-post-restart-selector.md) +- Handoff: [../handoffs/2026-09-13-document-revision-post-restart-selector.md](../handoffs/2026-09-13-document-revision-post-restart-selector.md) + +## 证据 / 备注 + +- 基线:`dev@b824948` +- 失败归档(只读):`.doc/test-reports/assets/2026-09-13-document-revision-runtime-ui/schema31-postrestart-project-title-selector-failure/` +- **未跑真实 post-restart,不得标 done** diff --git a/.doc/status/FEATURE-MATRIX.md b/.doc/status/FEATURE-MATRIX.md index 7746b482..81eb5f6d 100644 --- a/.doc/status/FEATURE-MATRIX.md +++ b/.doc/status/FEATURE-MATRIX.md @@ -25,7 +25,7 @@ | 前端工作台 | 三栏 + 块文档 + SSE | partial | [test workbench](../test-reports/2026-09-08-three-column-workbench-and-block-document-test-report.md);[现场专项审计](../audit/2026-09-13-conversation-intent-runtime-state.md) | 错误卡片/任务进度/文档 busy 状态刷新恢复与人工抽检待完成 | `web` | | PI Runner / 配置链 | pi-agent + MiniMax 真实链路 | done | [test piagent](../test-reports/2026-09-13-codex-audit-p0-remediation-test-report.md);[container-env](../test-reports/2026-09-13-container-env-configuration-test-report.md) | — | `pi-agent` | | 三环境运维 | dev/test/main + 共享 KB | done | [PROJECT.md](../../PROJECT.md) §4;四环境 healthy | — | `infra` | -| CI / E2E | PG 集成 + 真实 PI E2E | partial | [gap-matrix BUG-08](../remediation/gap-matrix.md);[test pg-ci](../test-reports/2026-09-12-pg-ci-soak-e2e-test-report.md);[UI-13a reviewer 职责同步](../audit/2026-09-13-document-revision-reviewer-duty-sync.md) | CI `TEST_DATABASE_URL` 隔离库;立项/改职责后 reviewer 必须成为受控文档 `reviewer_id`;Heal 以 assigned 为权威;成员写与 heal 同项目锁 | `ci` | +| CI / E2E | PG 集成 + 真实 PI E2E | partial | [gap-matrix BUG-08](../remediation/gap-matrix.md);[test pg-ci](../test-reports/2026-09-12-pg-ci-soak-e2e-test-report.md);[UI-13a reviewer 职责同步](../audit/2026-09-13-document-revision-reviewer-duty-sync.md) | CI `TEST_DATABASE_URL` 隔离库;立项/改职责后 reviewer 必须成为受控文档 `reviewer_id`;post-restart 项目名须 banner exact,产物按 UI_PHASE 分目录 | `ci` | ---