Files
Agent-System/.doc/test-reports/2026-09-14-document-reliability-m2-test-report.md
T
weichenandCursor b1ce9b5c41 docs(test): record document reliability M2 go-no-go
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>
2026-09-14 16:07:05 +00:00

8.0 KiB
Raw Blame History

文档可靠性 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