U5–U7 passed isolation-db, race, goose Down, and schema-36 rebuild. The report last sentence is 继续 M3; the integration slot is idle. Co-authored-by: Cursor <cursoragent@cursor.com>
8.0 KiB
文档可靠性 M2(U5–U7)测试报告
一、 测试背景 (Background)
M1 活验报告最后一句为 继续 M2(2026-09-14-document-reliability-pilot-live-test-report.md)。上一份「停止扩面」试点报告保持原句,不改写。本轮只实施并验证 U5 WorkspaceRef、U6 耐久投递、U7 按文件摘取 FAV,并给出能否开工 M3 的停走句。
二、 测试目标 (Test Objectives)
- 2/4 dispatcher 无双 owner;crash-before/after-side-effect/ack 可恢复。
- 乱序 aggregate version 不越过缺号。
- 跨项目事件 / 坏 digest / 伪造 producer → quarantine;auth/integrity 立即死信;attempt 12 后死信。
SKIP LOCKED只用于 claim。- 业务终态、staging、outbox 同事务;失败回滚无泄漏。
- union-deny;中间态(prompt/tool_trace/scratch)准入率 0。
FAV_DEGRADED_READ默认 false;授权成功之后才允许 degraded read。- Goose 00034–00036 重取号;组合 Up+Down;禁止把 FAV 树的 00034 原样合入。
- 占槽后主仓 rebuild;health/ready 为 schema 36,无路径泄漏。
三、 测试方案与环境 (Test Plan & Environment)
| 项 | 值 |
|---|---|
| OS | Linux 7.0.0-31-generic |
| Go | 本机 go test;容器 agent-dev-app |
| 合入 | 主仓 dev --no-ff refactor/document-reliability-pilot → 0872d8f |
| 部署 | 主仓 ./scripts/env-service.sh dev rebuild(禁止 worktree 内 env-service;禁止 compose restart 当证据) |
| Compose | 项目 agent-dev,HTTP :8080 |
| Agent | agent_backend=pi-agent |
| Schema | 36(00034 fencing + 00035 envelopes + 00036 FAV) |
FAV_DEGRADED_READ |
宿主与容器均 unset / 默认 false |
| PostgreSQL | 隔离库 agent_rel_m2(shuimu-system-pg-test:5434),另建 agent_rel_m2_goose 做 Down;测完 DROP;禁止 agent_system_dev/test/main |
| 项目 143 | 只读;本轮未 terminate,未改 workflow-plan |
| 证据 | .doc/test-reports/assets/2026-09-14-document-reliability-m2/ |
镜像身份:app_image=sha256:8ab9f63a05274e08d55322e162f8fec3f5822bd3e14375376df856308329b511。见 rebuild-health-ready.txt。
四、 预期结果 (Expected Results)
| 栏 | 期望 |
|---|---|
| Unit | WorkspaceRef 无物理路径;旧 fencing 被拒;事务内禁止文件 I/O;2/4 dispatcher 单 owner;gap 不跳号;中间态准入 0 |
| PostgreSQL | 00034–00036 Down 到 33 后再 Up;outbox+staging 同 TX,失败零泄漏 |
| 故障注入 | crash-before/after ack 无双副作用;attempt 12 死信 |
| 真实 PI | 本轮不重跑编制;rebuild 后 ready 仍为真实 pi-agent |
| 真实浏览器 | 本轮不重跑 Playwright;web 单测 + production build 必须绿 |
| restart/rebuild | health/ready status=ok,schema_version=36,无路径泄漏,vault 未配置不假绿 |
| 跨用户 / 授权 | 授权失败不碰 vault;tombstone union-deny |
五、 实际测试结果与判定 (Actual Results & Evaluation)
5.1 Unit / stub
- 测试输入:
unset TEST_DATABASE_URL; go test -short ./...;目标包go test -race -short;./scripts/arch-check.sh --mode warn - 实际输出: 全仓 short 包
ok。目标包 race:TestTwoAndFourWorkersNoDoubleOwner、TestCrashBeforeAfterAck、TestGapDoesNotSkipVersion、TestQuarantineBadDigestForgedProducerCrossProject、TestAttempt12GoesDeadLetter、TestStaleFencingRejected、TestEvaluateEligibility_IntermediateAdmissionZero、TestTombstoneUnionDeny、TestFavDegradedReadDefaultOff均为 PASS。arch-check warn: production gate passed。--mode block仍会因既有 path/sql_write 例外基线失败(U1 设计;本里程碑新增 import 已清零)。 - 评价判定: PASS
- 性能与耗时: 全仓 short 约 13s;目标包 race 约 3–4s。日志:
go-test-short.txt、go-test-m2-packages-race.txt、arch-check-warn.txt
5.2 PostgreSQL 事务与并发
- 测试输入: 隔离库
TEST_DATABASE_URL→TestGooseM2_00034to00036_DownThenUp、TestOutboxAndStagingSameTxRollback - 实际输出:
--- PASS: TestGooseM2_00034to00036_DownThenUp (0.36s)
--- PASS: TestOutboxAndStagingSameTxRollback (0.01s)
00034–00036 Up 到 36,Down 到 33 后 event_envelopes/final_artifacts/lease_fencing_token 消失,再 Up 回 36。同 UoW 写入 envelope + FAV staging 后故意 boom,回滚后两表计数为 0。测完 DROP DATABASE agent_rel_m2(goose 子库随测试 Cleanup DROP)。
- 评价判定: PASS
- 性能与耗时: goose 组合约 0.36s。日志:
goose-00034-36-down-up.txt
5.3 故障注入
- 测试输入: 内存 dispatcher crash/lease 过期/重放;attempt 12;目标包
-race - 实际输出: 过期 worker ack 为
ErrStaleFencing;后到 worker 副作用恰好 1;inbox 去重。12 次瞬时失败后 status=dead。 - 评价判定: PASS
- 性能与耗时: 亚秒。日志:
go-test-m2-packages-race.txt
5.4 真实 PI
- 测试输入: 本轮不新编制文档。检查 rebuild 后
/api/v1/ready的agent_backend - 实际输出:
agent_backend=pi-agent,不是 stub。编制活验仍以 M1 报告为准。 - 评价判定: PASS(继承 M1 活验;本轮验证后端身份与 schema 36 ready)
- 性能与耗时: health/ready 亚秒
5.5 真实浏览器
- 测试输入: 本轮未重跑 Playwright(项目 143 只读约束仍在)。
web:npm test+npm run build - 实际输出: tsx 365 passed / 0 fail;vitest 30 passed;production build
✓ built in 8.07s(容器 rebuild 内 web build 同样成功)。 - 评价判定: PASS(页面回归以 M1 活验为准;本轮前端门禁绿)
- 性能与耗时: 单测约 1.4s + vitest 0.5s;本地 build 约 8s。日志:
web-unit.txt、web-build.txt
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":36,"schema_ready":true,"task_store_ready":true}
无文件系统路径字段。vault 未配置时 ready 仍按 DB/schema/task_store 判定。
- 评价判定: PASS
- 性能与耗时: rebuild 约 27s。日志:
rebuild-health-ready.txt、health.json、ready.json
5.7 跨用户 / 授权负例
- 测试输入:
TestFavDegradedReadOnlyAfterAuthorize;TestTombstoneUnionDeny;跨项目 envelope Apply - 实际输出: 授权失败时 vault
calls=0;tombstone 读为ErrUnionDeny;跨项目 delivery 为quarantine - 评价判定: PASS
- 性能与耗时: 亚秒
六、 自动化测试套件汇总 (Test Suite Execution)
| 命令 | 结果 |
|---|---|
go vet ./... |
PASS |
go test -short ./... |
PASS |
| 隔离库 goose Down/Up + 同事务回滚 | PASS,随后 DROP DATABASE |
目标包 -race |
PASS |
arch-check --mode warn |
PASS |
arch-check --mode block |
仍因既有例外基线失败(预期;非本里程碑新增违规) |
web npm test |
365 + 30 PASS |
| web production build | PASS |
| 占槽 rebuild + health/ready | PASS,schema_version=36 |
七、 测试结论与后续优化建议 (Conclusion & Next Steps)
U5–U7 的停走项在本轮全部观测为 PASS:dispatcher 无双 owner,崩溃与过期 fencing 可恢复,缺号不跳过,坏 digest/伪造 producer/跨项目进入 quarantine,FAV 中间态准入为 0,union-deny 生效,outbox 与 staging 同事务回滚,Goose 00034–00036 可 Down。document.agent_version_committed 已从 OnOutbox 正确性路径摘除,改由 events.EventSink 在 UoW 内追加。剩余 agent/coordinator 的 output.md 字面量仍是 U1 例外基线,属 M3 Workspace 清理范围,不构成本轮扩面失败。未把 feature/final-artifact-vault 整支 merge,未启用 FAV_DEGRADED_READ。
继续 M3