15 KiB
15 KiB
受控文档正文修复真实 UI 验收测试报告
- 日期: 2026-09-14
- 测试执行者: Antigravity (Google DeepMind)
- 判定汇总:
- Part A (项目 143 纯 UI 回归): PASS (UI-143-01 .. UI-143-06 全通)
- Part B (新项目全链路主阶段): PASS (全量重跑
full-chain-final,UI-00 .. UI-16 全部 18 项 PASS) - Part C (容器重启后恢复核验): PASS (宿主容器重启后
UI-15post-restart 2.8s 秒级通过) - 受控正文与版本账本运行时综合判定: PASS
- 整个系统
production_ready: no(保留无关系统级 blocker,如CHAT-INTENT-STATE等;本报告不把模块 PASS 写成全仓可发布)
一、 测试背景与核心约束
受控文档正文拉取此前存在模板槽未就绪、假 doc-upload 占位、正文未进入不可变账本及初始 legacy doc-001 水合等问题。在开发分支依次合入 d0e8f60(含 f693e1c 停止水合本地 legacy 假文档)与 36e4bc3(含 08bf615 修复工作流同步导致的缓存清空死锁)后,本轮针对以下部分进行严格的真实 UI 验收:
- 项目 143 独立回归:验证既有项目在纯页面交互下的文档加载、30 秒静置稳定性、双击块编辑保存与修订递增、三模式对比及登出重登持久化。
- 新项目全链路主阶段:验证管理员建用户、用户建项目、真实小队生成受控文档、打开变更报告、高风险候选确认与拒绝、块编辑保存与硬刷新、三模式对比、版本对比、第二受控文档、页面上传、权限隔离、并发冲突以及重启前持久化等全流程。
- 重启后恢复核验(post-restart):宿主机执行
./scripts/env-service.sh dev restart容器重启后,纯页面登录,核对同一项目、docId、最终正文标记、版本 V3/r2,验证目标 404 严格为 0。
强制测试边界
- 零后端旁路: 严禁
psql、docker exec、API 直调、curl、page.routemock/stub 或localStorage注入。全部用户、项目、会话、任务、正文、修订必须由真实的页面点击、输入与等待生成。 - 环境隔离与有效性:
clean-run3/:项目 143 纯页面回归最终有效验收产物(有效,全部 PASS)。full-chain-final/:新项目全链路主阶段(UI-00 至 UI-16)与重启后恢复(UI-15 post-restart)最终有效产物(有效,全部 PASS)。full-chain-valid/:早期未修复缓存死锁时的历史有效运行记录(UI-00 至 UI-05b PASS,UI-06 FAIL 留档,不冒充通过)。invalid-db-assisted-run1/:包含 DB 辅助查询,归档标记为 INVALID,不计入。invalid-overlap-main/:因已取消旧容器与新容器在输出目录清理竞争产生 ENOENT,归档标记为 INVALID,不计入。clean-run2-fail/:早期历史失败产物,归档保留。
二、 测试方案与 Ubuntu Server 容器运行
2.1 运行环境
- 操作系统: Linux (Ubuntu Server,无图形桌面 / 无需宿主安装浏览器)
- 容器镜像:
mcr.microsoft.com/playwright:v1.63.0-noble,参数--network host --ipc host - 目标服务:
BASE_URL=http://127.0.0.1:3100(前端 Vite),后端shuimu-agent-app-dev(端口 8080,schema 32,PI Agent Ready) - 挂载结构:
- 工作树根目录挂载至容器内
/work - 主仓
web/node_modules只读挂载至/work/web/node_modules:ro
- 工作树根目录挂载至容器内
- 凭证安全处理:
- 管理员凭据仅通过本地运行容器环境变量
ADMIN_USERNAME与ADMIN_PASSWORD读取,并在启动docker run时安全注入。 - 测试脚本、断言、截图、Trace 与报告中严禁包含或打印任何口令、Token 或密钥。
- 本地运行生成的
phase-secrets.local.json包含测试账号临时凭证,已在.gitignore中严格忽略,绝不提交至仓库。
- 管理员凭据仅通过本地运行容器环境变量
2.2 官方 Playwright 容器执行命令
# 1. 项目 143 纯页面回归验收(Part A)
docker run --rm --network host --ipc host \
-e RUN_UI_ACCEPTANCE=1 \
-e BASE_URL=http://127.0.0.1:3100 \
-e UI_ACCEPTANCE_ASSETS_DIR=/work/.doc/test-reports/assets/2026-09-14-controlled-content-ui-acceptance/clean-run3 \
-e ADMIN_USERNAME="$(docker inspect shuimu-agent-app-dev --format '{{range .Config.Env}}{{println .}}{{end}}' | grep '^ADMIN_USERNAME=' | cut -d= -f2-)" \
-e ADMIN_PASSWORD="$(docker inspect shuimu-agent-app-dev --format '{{range .Config.Env}}{{println .}}{{end}}' | grep '^ADMIN_PASSWORD=' | cut -d= -f2-)" \
-v "/home/weichen/projects/Agent-System/.worktrees/fix-controlled-content-ui-acceptance:/work" \
-v "/home/weichen/projects/Agent-System/web/node_modules:/work/web/node_modules:ro" \
-w /work/web \
mcr.microsoft.com/playwright:v1.63.0-noble \
npx playwright test e2e/project143-regression.spec.ts --project=chromium
# 2. 新项目全链路主阶段验收(Part B - main)
docker run --rm --network host --ipc host \
-e RUN_UI_ACCEPTANCE=1 \
-e UI_PHASE=main \
-e BASE_URL=http://127.0.0.1:3100 \
-e UI_ACCEPTANCE_ASSETS_DIR=/work/.doc/test-reports/assets/2026-09-14-controlled-content-ui-acceptance/full-chain-final \
-e ADMIN_USERNAME="$(docker inspect shuimu-agent-app-dev --format '{{range .Config.Env}}{{println .}}{{end}}' | grep '^ADMIN_USERNAME=' | cut -d= -f2-)" \
-e ADMIN_PASSWORD="$(docker inspect shuimu-agent-app-dev --format '{{range .Config.Env}}{{println .}}{{end}}' | grep '^ADMIN_PASSWORD=' | cut -d= -f2-)" \
-v "/home/weichen/projects/Agent-System/.worktrees/fix-controlled-content-ui-acceptance:/work" \
-v "/home/weichen/projects/Agent-System/web/node_modules:/work/web/node_modules:ro" \
-w /work/web \
mcr.microsoft.com/playwright:v1.63.0-noble \
npx playwright test e2e/document-revision-runtime.spec.ts --project=chromium
# 3. 新项目重启后恢复核验(Part C - post-restart)
docker run --rm --network host --ipc host \
-e RUN_UI_ACCEPTANCE=1 \
-e UI_PHASE=post-restart \
-e BASE_URL=http://127.0.0.1:3100 \
-e UI_ACCEPTANCE_ASSETS_DIR=/work/.doc/test-reports/assets/2026-09-14-controlled-content-ui-acceptance/full-chain-final \
-e ADMIN_USERNAME="$(docker inspect shuimu-agent-app-dev --format '{{range .Config.Env}}{{println .}}{{end}}' | grep '^ADMIN_USERNAME=' | cut -d= -f2-)" \
-e ADMIN_PASSWORD="$(docker inspect shuimu-agent-app-dev --format '{{range .Config.Env}}{{println .}}{{end}}' | grep '^ADMIN_PASSWORD=' | cut -d= -f2-)" \
-v "/home/weichen/projects/Agent-System/.worktrees/fix-controlled-content-ui-acceptance:/work" \
-v "/home/weichen/projects/Agent-System/web/node_modules:/work/web/node_modules:ro" \
-w /work/web \
mcr.microsoft.com/playwright:v1.63.0-noble \
npx playwright test e2e/document-revision-runtime.spec.ts --project=chromium
三、 Part A: 项目 143 独立回归验收(clean-run3 全部 PASS)
- 测试套件:
web/e2e/project143-regression.spec.ts - 产物路径:
.doc/test-reports/assets/2026-09-14-controlled-content-ui-acceptance/clean-run3/ - 结果汇总:
| 用例 ID | 步骤与验证点 | 耗时 | 判定 | 真实观测数据与证据 |
|---|---|---|---|---|
| UI-143-01 | 管理员登录并进入项目会话 | 1.74s | PASS | 明确校验从登录开始 doc-001 content/revision 请求数为 0;准确在侧栏匹配并点击「对话协同会话」;目标受控文档 404 为 0 |
| UI-143-02 | 菜单确认打开目标正文与账本就绪 | 0.30s | PASS | doc_proj143_intake 正文成功渲染 146 块、文本 16,642 字符;版本账本就绪显示 V1 / r1;无未就绪提示;目标 404 为 0 |
| UI-143-03 | 30 秒静置稳定性观测 | 30.11s | PASS | 静置期间重复正文请求数为 0;控制台零错误,页面无异常,目标 404 严格为 0 |
| UI-143-04 | 双击块编辑、追加纯中文标记与保存 | 0.70s | PASS | 首块追加 (人工验收标记1789355089269);PATCH 200 成功;页面呈现可见文本;修订号由 r1 递增至 r2 |
| UI-143-05 | 纯净阅读 / 人工修改 / 全部变更模式切换 | 2.25s | PASS | 纯净阅读无遮罩;人工修改与全部变更模式均带有计算样式遮罩修饰;计算样式互不相同,视觉区分明确 |
| UI-143-06 | 页面刷新、退出登录及重新登录持久化 | 2.43s | PASS | 页面硬刷新后标记与 r2 存在;UI 登出后重登打开文档,标记与 r2 完整持久化;目标文档所有接口全程 404 为 0 |
四、 Part B: 新项目全链路主阶段最终验收(full-chain-final 全部 PASS)
- 测试套件:
web/e2e/document-revision-runtime.spec.ts(UI_PHASE=main) - 产物路径:
.doc/test-reports/assets/2026-09-14-controlled-content-ui-acceptance/full-chain-final/ - 项目信息:
UI验收-超声微创系统-mu0oymfg(项目 ID:6173) - 账号体系: 用户 A (
uia_mu0oymfg),用户 B (uib_mu0oymfg),用户 C (uic_mu0oymfg) - 首份受控文档:
doc_proj6173_intake(用户初始需求收集表) - 终态 phase-state:
V3/r2/bodySnippet=A1-win-mu0oymfg - 套件总耗时: 11.7 分钟(18 passed / 1 skipped)
- 逐项结果清单:
| 用例 ID | 步骤与验证点 | 耗时 | 判定 | 真实页面证据 |
|---|---|---|---|---|
| UI-00 | 管理员页面创建 A/B/C 并初始化密码 | 8.7s | PASS | 经管理界面创建三账号,分别重置首登凭据 |
| UI-01 | 用户 A 登录并新建项目,验证模板提示隔离 | 1.3s | PASS | 创建项目「UI验收-超声微创系统-mu0oymfg」,无 doc-p 伪正文泄漏 |
| UI-02 | 对话框向真实小队发送首轮摸底任务 | 310ms | PASS | 任务输入指令发送,PI Agent 接单运行 |
| UI-03 | 真实等待助手回复与受控文档生成 | 2.7m | PASS | 助手回复完成,首份受控文档 doc_proj6173_intake 生成,toolbar V2/r0,标题为「用户初始需求收集表」 |
| UI-04 | 打开变更报告并核验完整字段 | 246ms | PASS | 页面展开「变更报告」,风险评级、项目影响、文档影响、开放问题均完整可见 |
| UI-05 | 高风险候选 #1 挂起(待确认状态) | 2.6m | PASS | 二轮高风险任务触发,受控正文冻结在 head,pending 时保持 V2,版本不提前晋升 |
| UI-05a | 页面点击「确认提交」高风险候选 | 322ms | PASS | POST /decision(commit, confirmed: true),确认后版本晋升至 V3 |
| UI-05b | 二轮高风险候选 #2 页面点击「拒绝」 | 2.7m | PASS | POST /decision(reject),二轮拒绝后版本保持 V3,未被非法合入 |
| UI-06 | 双击块编辑保存后,硬刷新验证标记与修订持久化 | 1.1s | PASS | 在合入 08bf615 修复后 1.1 秒内秒级通过! 刷新后正文立即渲染,标记与 r1 完整可见 |
| UI-07..09 | 纯净阅读 / 人工修改 / 全部变更三模式对比 | 2.4s | PASS | 纯净阅读无遮罩;人工修改与全部变更模式带有琥珀/修饰样式,计算样式互斥生效 |
| UI-10 | 版本历史与两版本 A/B 比较 | 450ms | PASS | 打开版本历史,选择两版进行对比,比较窗口正确呈现 + / - / ~ 差异项 |
| UI-11 | 对话触发第二受控文档 + 页面上传本地材料 | 3.1m | PASS | 第二文档状态为 intake(用户初始需求收集表)V3/r1、prelim_design(系统初步设计方案)V2/r0;页面上传归档为“私密参考文档”,POST 201,激活 doc-free-*(doc-free-1789357696535085171-198)面板 |
| UI-12 | 越权隔离验证:非项目成员 C 无法看到项目 | 2.6s | PASS | 用户 C 登录工作台,侧栏与项目列表中项目均不可见(零泄漏) |
| UI-13a | 审核人只读验证:协作者 B 无正文编辑入口 | 2.1s | PASS | 用户 B 登录打开受控文档,双击段落不唤起编辑对话框,操作权限收口为只读 |
| UI-13b | 并发冲突验证:两作者上下文同修订提交报 409 | 2.7s | PASS | 上下文 A2 提交落后 revision 时页面报 409 冲突,保留冲突稿,A1 赢家正文持久生效 |
| UI-14 | 登出并重新登录恢复 | 1.3s | PASS | UI 登出用户 A,重新登录后项目与会话状态完好恢复 |
| UI-15 | 主阶段收尾:生成重启前持久化凭据与 phase-state | 114ms | PASS | 记录非敏感 phase-state.json,标记 A1-win-mu0oymfg |
| UI-16 | 注册上传交付物使用独立账本 | 366ms | PASS | 验证注册上传物不产生 doc-upload 孤儿槽,账本独立健康 |
五、 Part C: 容器重启后恢复核验(post-restart 全部 PASS)
- 测试套件:
web/e2e/document-revision-runtime.spec.ts(UI_PHASE=post-restart) - 执行命令: 官方 Playwright 容器执行,
UI_PHASE=post-restart - 执行耗时: 2.8 秒 (1 passed / 18 skipped)
- 结果汇总:
| 用例 ID | 步骤与验证点 | 耗时 | 判定 | 真实页面证据 |
|---|---|---|---|---|
| UI-15 (post-restart) | 容器重启后纯页面登录恢复项目与受控文档 | 2.8s | PASS | 用户 A 经页面登录,点击进入项目「UI验收-超声微创系统-mu0oymfg」;受控文档 doc_proj6173_intake 正确打开;版本 V3 / 修订 r2 完全吻合;最终赢家正文标记 A1-win-mu0oymfg 页面完整可见;目标文档接口 404 全程严格为 0 |
5.1 重启后目标文档网络请求核查
从 ui-acceptance-results-post-restart.json 提取的关于目标受控文档 doc_proj6173_intake 的网络日志如下:
GET /api/v1/documents/doc_proj6173_intake/revision-state-> 200 OKGET /api/v1/docgov/documents/doc_proj6173_intake/content-> 200 OKGET /api/v1/documents/doc_proj6173_intake/versions-> 200 OKGET /api/v1/documents/doc_proj6173_intake/manual-overlay-> 200 OK- 目标文档 404 计数: 严格为 0
六、 产物与证据归档清单
本轮提交至仓库的证据与 git ls-files 严格一致(保存在 .doc/test-reports/assets/2026-09-14-controlled-content-ui-acceptance/):
- 项目 143 独立回归 (
clean-run3/):- 结构化结果:
clean-run3/proj143-ui-acceptance-results.json - 全套页面截图: 13 张(
UI-143-01至UI-143-08d) - 会话视频:
clean-run3/videos/page@eedfc29121e052e4ca3355f0542261dd.webm
- 结构化结果:
- 新项目全链路最终产物 (
full-chain-final/):- 结构化结果:
full-chain-final/ui-acceptance-results.json(主阶段 18 passed)与full-chain-final/ui-acceptance-results-post-restart.json(重启后 UI-15 passed) - 重启状态凭据:
full-chain-final/phase-state.json - 页面截图证据: 21 张(含主阶段 20 张截图 +
UI-15-post-restart.png) - 上传测试载荷:
full-chain-final/upload-mu0oymfg.txt - 未提交产物与凭证说明: Playwright Trace、录屏视频与 HTML 测试报告(
playwright-report-main/,playwright-report-post-restart/)仅为本地测试运行产物且未提交 Git,不得声称仓库完整保留;phase-secrets.local.json保持被.gitignore忽略,未提交且不得披露。
- 结构化结果:
七、 结论
- 本次针对受控文档正文与版本账本的纯 UI 真实端到端验收(项目 143 恢复回归 + 新项目主阶段 + 容器重启后恢复)全部通过(PASS)。
- 整个系统保留未关闭的系统级无关 blocker(
CHAT-INTENT-STATE等),系统级production_ready保持为no。