From 1a98c0cdebddef4071b9ea189b64c0333dccb950 Mon Sep 17 00:00:00 2001 From: weichen Date: Sun, 13 Sep 2026 23:23:28 +0000 Subject: [PATCH] docs(ops): record phase-split UI acceptance results JSON Document that main keeps ui-acceptance-results.json and post-restart writes a sibling ledger so the 18-case main book is not overwritten. Co-authored-by: Cursor --- ...26-09-13-document-revision-post-restart-selector.md | 1 + ...26-09-13-document-revision-post-restart-selector.md | 1 + ...26-09-13-document-revision-runtime-ui-acceptance.md | 4 ++-- ...26-09-13-document-revision-post-restart-selector.md | 3 ++- ...26-09-13-document-revision-post-restart-selector.md | 10 ++++++---- .doc/status/FEATURE-MATRIX.md | 2 +- 6 files changed, 13 insertions(+), 8 deletions(-) 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 index 57516593..455e0f73 100644 --- a/.doc/audit/2026-09-13-document-revision-post-restart-selector.md +++ b/.doc/audit/2026-09-13-document-revision-post-restart-selector.md @@ -27,6 +27,7 @@ strict mode violation: getByText('UI验收-超声微创系统-mu0eq020') resolve | 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 自动化可寻址缺口**,不是项目未恢复。 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 index 928f9103..d00f8d07 100644 --- 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 @@ -13,6 +13,7 @@ related_task: "2026-09-13-document-revision-post-restart-selector.md" - [x] 点击来自侧栏可见项目入口(complementary exact title),不用 `.first()` 弱化 - [x] 恢复断言为 banner 内 exact 项目名 - [x] `UI_PHASE` 分离 `playwright-output-main|post-restart` 与 `playwright-report-main|post-restart` +- [x] 结果 JSON 分文件:`ui-acceptance-results.json`(main)与 `ui-acceptance-results-post-restart.json`;phase-state/secrets 仍共享 - [x] helper 契约测试 + `npm test` / `npm run build` - [ ] 真实 UI-15 post-restart(本轮不做) 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 4a1e4ce9..5bb1005e 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` 本地文件)。产物目录:`playwright-output-main` / `playwright-report-main` +1. `RUN_UI_ACCEPTANCE=1 UI_PHASE=main` 跑主场景(写 `phase-state.json`,密码仅落 `phase-secrets.local.json` 本地文件)。产物:`playwright-output-main` / `playwright-report-main` / `ui-acceptance-results.json` 2. 宿主执行 docker restart(脚本不碰 docker) -3. `RUN_UI_ACCEPTANCE=1 UI_PHASE=post-restart` 仅页面登录校验 UI-15。产物目录:`playwright-output-post-restart` / `playwright-report-post-restart`(不得覆盖 main) +3. `RUN_UI_ACCEPTANCE=1 UI_PHASE=post-restart` 仅页面登录校验 UI-15。产物:`playwright-output-post-restart` / `playwright-report-post-restart` / `ui-acceptance-results-post-restart.json`(不得覆盖 main 总账或 trace) 证据:`.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 index 64409434..34048dc3 100644 --- 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 @@ -18,6 +18,7 @@ status: open - post-restart:侧栏 exact title 点击 + banner exact 项目名断言 - Playwright 产物按 `UI_PHASE` 分目录,避免第二阶段覆盖主阶段 +- 结果 JSON:main 仍写 `ui-acceptance-results.json`;post-restart 写 `ui-acceptance-results-post-restart.json`;`phase-state` / secrets 共享 - helper 契约测试;`npm test` / `npm run build` ## 未完成 @@ -53,7 +54,7 @@ cd web && npm test && npm run build # 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`。 +产物:`playwright-output-main` / `playwright-report-main` / `ui-acceptance-results.json` 与 `playwright-output-post-restart` / `playwright-report-post-restart` / `ui-acceptance-results-post-restart.json`。`phase-state.json` 与 `phase-secrets.local.json` 跨阶段共享;`UI-15-post-restart.png` 可与主阶段截图同目录。 ## 风险 / Blocker 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 index cf0c7607..42c56194 100644 --- 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 @@ -13,7 +13,7 @@ mutex: document-revision-post-restart-selector ## 目标 -第18轮 main 18 PASS 后,post-restart 在页面已恢复项目时因项目名同时出现在顶栏与侧栏而 strict violation。改为 banner 内唯一 exact 断言,点击仍走可见项目入口;Playwright output/report 按 `UI_PHASE` 分目录。 +第18轮 main 18 PASS 后,post-restart 在页面已恢复项目时因项目名同时出现在顶栏与侧栏而 strict violation。改为 banner 内唯一 exact 断言,点击仍走可见项目入口;Playwright output/report 与结果 JSON 按 `UI_PHASE` 分离(main 仍用 `ui-acceptance-results.json`)。 ## 范围 @@ -33,15 +33,17 @@ mutex: document-revision-post-restart-selector 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(本轮不做) +4. [x] 结果 JSON:main 保持 `ui-acceptance-results.json`;post-restart 写 `ui-acceptance-results-post-restart.json` +5. [x] `npm test` / `npm run build` +6. [x] 原子提交 +7. [ ] 占槽后重跑 post-restart(本轮不做) ## 验收标准 - [x] 页面级 `getByText(项目名)` 在 2 命中时契约判定失败 - [x] 入口为 complementary exact title;当前项目为 banner exact text - [x] main / post-restart 产物目录不同 +- [x] post-restart `recordPass` 不覆盖 main 的 `ui-acceptance-results.json` - [ ] 真实 UI-15 post-restart(未跑) ## 相关链接 diff --git a/.doc/status/FEATURE-MATRIX.md b/.doc/status/FEATURE-MATRIX.md index 81eb5f6d..47b75bad 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`;post-restart 项目名须 banner exact,产物按 UI_PHASE 分目录 | `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;产物与结果 JSON 按 UI_PHASE 分文件 | `ci` | ---