Rebuild, real PI, browser reload, and two-pool sessions all passed, so the live report's last sentence is 继续 M2 and the integration slot is idle. Co-authored-by: Cursor <cursoragent@cursor.com>
7.9 KiB
文档可靠性试点 M1 活验签字测试报告
一、 测试背景 (Background)
上一份 M1 试点报告 在 Unit/隔离库通过后,因未占槽 rebuild、无真实 PI/浏览器/4 会话而把最后一句写成 停止扩面。本轮不改写那份结论句;只补活验签字,决定能否开工 U5–U7。
二、 测试目标 (Test Objectives)
- A1:占集成槽,本地
dev--no-ff合入试点分支,env-service.sh dev rebuild,health+ready 来自本分支镜像。 - A2:项目 143 只读打开/刷新/重登;新建项目打开/刷新/重登;
GET .../content为 200 且带consistency;禁止把 missing 当 404。 - A3:真实
pi-agent+ MiniMax 编制一条受控文档,刷新不丢正文。禁止 stub 当终态。 - A4:隔离库两个 pgx pool + 4 会话同 ETag 一赢,同 key+digest 跨 pool 重放。测完
DROP DATABASE。 - A5:分栏签字;最后一句只能是「继续 M2」或「停止扩面」。
三、 测试方案与环境 (Test Plan & Environment)
| 项 | 值 |
|---|---|
| OS | Linux 7.0.0-31-generic |
| Go | 本机 go test;容器 agent-dev-app |
| 合入 | 主仓 dev --no-ff refactor/document-reliability-pilot → cb8eaca |
| 部署 | 主仓 ./scripts/env-service.sh dev rebuild(禁止 compose restart 当证据) |
| Compose | 项目 agent-dev,HTTP :8080 |
| Agent | 真实 pi-agent(AGENT_BACKEND=pi-agent),模型 MiniMax-M2.7-highspeed(云端 API,非 stub) |
| Schema | 33 |
FAV_DEGRADED_READ |
unset / 默认 false |
| 浏览器 | mcr.microsoft.com/playwright:v1.63.0-noble,--network host --ipc host |
| PostgreSQL | 隔离库 agent_rel_itest(shuimu-system-pg-test:5434),测完 DROP;禁止 agent_system_dev/test/main |
| 项目 143 | 只读;未 terminate,未 PUT /143/workflow-plan |
| 证据 | .doc/test-reports/assets/2026-09-14-document-reliability-pilot-live/ |
镜像身份(rebuild 后):app_image=sha256:251fa99d5de47d452b7f099304aa34b1e2aacf1b4e9d2d23d1cb4b850084910e;随后把 pi-agent force-recreate 到 rebuild 所打的 sha256:21fc9b64066c33e94d8db83695b4ff64ea5e49f6d65661f8ccab11ead083042d。见 rebuild-health-ready.txt。
四、 预期结果 (Expected Results)
| 栏 | 期望 |
|---|---|
| Unit / stub | go test -short 全绿;hydrate 把 missing 当正文 |
| PostgreSQL | 双 pool 同 ETag 一赢;同 key+digest 跨 pool 重放;4 会话同 ETag 一赢 |
| 故障注入 | 与上一份隔离库 U2 一致,本轮 -race 再跑目标包 |
| 真实 PI | 新建项目激活后编制,账本 head 可读 |
| 真实浏览器 | 143 与新项目刷新/重登 200 + markdown;页面无「加载失败」;无 PROJECTION 409 |
| restart/rebuild | health/ready status=ok,agent_backend=pi-agent,schema_version=33;ready 不因 vault 未配置假绿,响应无路径泄漏 |
| 跨用户 | 匿名 401;非成员/跨项目/错误 stage-duty 同一 404 DOCUMENT_NOT_FOUND |
五、 实际测试结果与判定 (Actual Results & Evaluation)
5.1 Unit / stub
- 测试输入:
unset TEST_DATABASE_URL; go test -short ./...;npx tsx --test src/lib/controlledDocHydrate.test.ts;./scripts/arch-check.sh --mode warn - 实际输出: 全仓 short 包
ok;hydrate 17 passed;arch-check warn: production gate passed - 评价判定: PASS
- 性能与耗时:
internal/server约 9.6s。日志:go-test-short.txt、hydrate-unit.txt、arch-check-warn.txt
5.2 PostgreSQL 事务与并发
- 测试输入: 隔离库
TEST_DATABASE_URL→./internal/docrevision -run 'TestDocumentCommitConcurrencyPG|TestDocumentCommitTwoPoolsAndFourSessionsPG' - 实际输出:
--- PASS: TestDocumentCommitConcurrencyPG (0.03s)
--- PASS: TestDocumentCommitTwoPoolsAndFourSessionsPG (0.03s)
两个独立 pgxpool 打同一 ETag 仅一赢;赢家 key+digest 跨 pool 重放 head 一致;随后 4 个会话同 ETag 仅一赢。测完 DROP DATABASE agent_rel_itest。
- 评价判定: PASS(不是 4 个 OS 进程,是计划要求的双 pool 模拟两进程 + 4 会话;未使用进程内全局 mutex)
- 性能与耗时: 62ms。日志:
go-test-pg-two-pool.txt
5.3 故障注入
- 测试输入:
go test -race ./internal/app/uow ./internal/app/docflow ./internal/docquery(同一隔离库,DROP 前) - 实际输出: 三包
ok(含 cached) - 评价判定: PASS
- 性能与耗时: 亚秒到约 1.8s
5.4 真实 PI
- 测试输入: Playwright 新建项目 → 未激活编制被 202
blocked_pending_governance→ 配置并激活 → 发送「请基于本项目编制首轮《用户需求》摸底文档…」→ 等待小队终态 → 打开doc_proj*intake - 实际输出: 编制用例 4.2min PASS。
GET /api/v1/docgov/documents/{id}/content200 且markdown非空;刷新与重登正文相同。截图07-new-doc.png/08-new-doc-reload.png/09-new-doc-relogin.png - 评价判定: PASS(真实
pi-agent,非 stub) - 性能与耗时: 编制+打开约 4.2min
5.5 真实浏览器
- 测试输入:
RUN_UI_ACCEPTANCE=1 BASE_URL=http://127.0.0.1:8080;web/e2e/controlled-document-reload.spec.ts(官方 Playwright 镜像) - 实际输出:
✓ project 143 content is 200 with consistency; anonymous is 401; unknown is 404 (4.6s)
✓ non-member GET of project 143 is the same 404 as unknown (7.4s)
✓ new project PI compile then reload keeps ledger markdown (4.2m)
✓ cross-project and wrong-stage GET stay DOCUMENT_NOT_FOUND (3.8s)
4 passed (4.5m)
143 打开/刷新/重登均为 200 + markdown + typed consistency,无 PROJECTION 409,页面无「加载失败」。未对 /143/ 发 PUT workflow-plan,未 terminate。
- 评价判定: PASS
- 性能与耗时: 整套 4.5min。日志:
playwright-controlled-reload.txt;截图screenshots/01–10
5.6 restart / rebuild
- 测试输入: 占槽后
./scripts/env-service.sh dev rebuild;curl -sf http://127.0.0.1:8080/api/v1/health与/api/v1/ready - 实际输出: 两者 HTTP 200,body 均为
{"status":"ok","env":"dev","agent_backend":"pi-agent","version":"v1.0","shared_kb_port":5432,"database_ready":true,"schema_version":33,"schema_ready":true,"task_store_ready":true}
无文件系统路径字段。vault 未配置时 ready 仍按 DB/schema/task_store 判定,不是假绿。
- 评价判定: PASS
- 性能与耗时: rebuild 约 79s。日志:
rebuild-health-ready.txt、health.json、ready.json
5.7 跨用户负例
- 测试输入: 匿名 GET 143;局外人 D GET 143 与新项目文档;审核人 B GET 143 与伪造
_design_controlstage - 实际输出: 匿名 401;其余均为 404
DOCUMENT_NOT_FOUND,不泄露存在性 - 评价判定: PASS
- 性能与耗时: 3.8s。截图
10-fail-closed.png
六、 自动化测试套件汇总 (Test Suite Execution)
| 命令 | 结果 |
|---|---|
go vet ./... |
PASS(合入后、rebuild 前) |
go test -short ./... |
PASS |
| 隔离库双 pool / 4 会话 | PASS,随后 DROP DATABASE |
目标包 -race |
PASS |
arch-check --mode warn |
PASS |
| hydrate 单测 | 17/17 PASS |
| Playwright 活验(官方镜像) | 4 passed |
宿主 npx playwright |
因缺 libatk-1.0.so.0 无法启动;改走已验证的 mcr.microsoft.com/playwright:v1.63.0-noble |
七、 测试结论与后续优化建议 (Conclusion & Next Steps)
活验补齐了上一份报告缺的 rebuild、真实 PI、真实浏览器、双 pool/4 会话与 HTTP 跨用户负例。hazard 真页面 404/409/projection-missing 本轮观测为 0;授权未靠放宽;4 会话赢家来自数据库锁而非进程内 mutex。M1 签字通过,允许按计划实施 U5–U7。上一份「停止扩面」报告保持原句,不改写。
继续 M2