Files
Agent-System/.doc/test-reports/2026-09-14-controlled-content-ui-acceptance.md
T

15 KiB
Raw Blame History

受控文档正文修复真实 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-15 post-restart 2.8s 秒级通过)
    • 受控正文与版本账本运行时综合判定: PASS
    • 整个系统 production_ready: no(保留无关系统级 blocker,如 CHAT-INTENT-STATE 等;本报告不把模块 PASS 写成全仓可发布)

一、 测试背景与核心约束

受控文档正文拉取此前存在模板槽未就绪、假 doc-upload 占位、正文未进入不可变账本及初始 legacy doc-001 水合等问题。在开发分支依次合入 d0e8f60(含 f693e1c 停止水合本地 legacy 假文档)与 36e4bc3(含 08bf615 修复工作流同步导致的缓存清空死锁)后,本轮针对以下部分进行严格的真实 UI 验收:

  1. 项目 143 独立回归:验证既有项目在纯页面交互下的文档加载、30 秒静置稳定性、双击块编辑保存与修订递增、三模式对比及登出重登持久化。
  2. 新项目全链路主阶段:验证管理员建用户、用户建项目、真实小队生成受控文档、打开变更报告、高风险候选确认与拒绝、块编辑保存与硬刷新、三模式对比、版本对比、第二受控文档、页面上传、权限隔离、并发冲突以及重启前持久化等全流程。
  3. 重启后恢复核验(post-restart):宿主机执行 ./scripts/env-service.sh dev restart 容器重启后,纯页面登录,核对同一项目、docId、最终正文标记、版本 V3/r2,验证目标 404 严格为 0。

强制测试边界

  • 零后端旁路: 严禁 psql、docker exec、API 直调、curl、page.route mock/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 OK
  • GET /api/v1/docgov/documents/doc_proj6173_intake/content -> 200 OK
  • GET /api/v1/documents/doc_proj6173_intake/versions -> 200 OK
  • GET /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/):

  1. 项目 143 独立回归 (clean-run3/):
    • 结构化结果: clean-run3/proj143-ui-acceptance-results.json
    • 全套页面截图: 13 张(UI-143-01 至 UI-143-08d)
    • 会话视频: clean-run3/videos/page@eedfc29121e052e4ca3355f0542261dd.webm
  2. 新项目全链路最终产物 (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。