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>
138 lines
7.9 KiB
Markdown
138 lines
7.9 KiB
Markdown
# 文档可靠性试点 M1 活验签字测试报告
|
||
|
||
## 一、 测试背景 (Background)
|
||
|
||
上一份 [M1 试点报告](./2026-09-14-document-reliability-pilot-test-report.md) 在 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}/content` **200** 且 `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_control` stage
|
||
- **实际输出**: 匿名 **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
|