隔离库双 pool、目标包 race、arch-check、web 与 rebuild 证据齐全;真实 PI 未测。最后一句:继续 U9。 Co-authored-by: Cursor <cursoragent@cursor.com>
7.4 KiB
M3 U8 TaskRun 终态与 RunManifest 测试报告
一、 测试背景 (Background)
权威停走门是 M2 报告最后一句 继续 M3(2026-09-14-document-reliability-m2-test-report.md)。整改计划 U8 要求 TaskRun 终态与类型化 RunManifest 同一 UoW,并在重复 finalize、cancel 竞态、SSE 断线和 workspace 清理后保持一致。本轮不做 U9(dataset/八轨/销毁),不碰 M4–M6 / chat / intent。
二、 测试目标 (Test Objectives)
- RunManifest 规范字节、SHA-256、workspace_id、storage_identity、members 持久化;Evidence/Gaps 不进核心协议。
- 重复 finalize:同一 status、同一 manifest SHA、助手消息 1 条、envelope/staging 不加倍。
- finalize ∥ cancel:恰好一个合法终态(双 pool,不用进程全局 mutex)。
- SSE
done不出现在 TX 失败路径;commit 前失败后占位正文不落终态。 - workspace 无 verified receipt 则 cleanup FAIL;有 receipt 则可清,且 staging 仍能取出原 SHA。
- server 不再
Join(workDir, "output.md");Backend 由服务端 policy 解析。 - Goose 00037 Up+Down;占槽 rebuild 后 schema 37。
三、 测试方案与环境 (Test Plan & Environment)
| 项 | 值 |
|---|---|
| OS | Linux 7.0.0-31-generic |
| Go | 本机 go test;容器 agent-dev-app |
| 分支 | feature/taskrun-runmanifest(从本地 dev 检出) |
| 部署 | 主仓 ./scripts/env-service.sh dev rebuild(禁止 worktree 内 env-service) |
| Compose | 项目 agent-dev,HTTP :8080 |
| Agent | agent_backend=pi-agent |
| Schema | 37(00037 task_run_manifests) |
| PostgreSQL | 隔离库 agent_rel_m3_u8(admin 连 shuimu-system-pg-test:5434/postgres 自建);测完 DROP;禁止 agent_system_dev/test/main |
| 项目 143 | 只读;本轮未 terminate,未改 workflow-plan |
| 证据 | .doc/test-reports/assets/2026-09-15-taskrun-runmanifest-u8/ |
镜像身份:app_image=sha256:fb3eec56ae5684fd323b1bd9e3c5c521c2e415730c2edd7f8c65a86b85aa6fb9。见 rebuild-health-ready.txt。
提交:2234af4 docs(ops) 认领 → eb75f85 feat(db) → 7be8730 feat(taskrun) → 2ddaf76 feat(workspace) → 3997a04 test(taskrun)。
四、 预期结果 (Expected Results)
| 栏 | 期望 |
|---|---|
| Unit | 规范 SHA 稳定;未授权 backend / 敏感正文拒绝;重复 finalize 不改 turn;cancel 后 finalize 采用已有终态 |
| PG | 双 pool 重复 finalize 计数均为 1;cancel race 唯一终态;commit 失败无 done;无 receipt 拒清理 |
| 故障注入 | BeforeCommit 失败回滚助手占位;done 不出现 |
| 真实 PI | 本轮未新开编制任务;dev 已 pi-agent ready;143 只读 |
| 浏览器 | web 单测 + production build 必做;页面回归继承 M1 |
| restart-rebuild | health/ready schema 37,pi-agent |
| 跨用户 | Backend 调用方不能塞任意字符串;敏感字段从 metadata 剥离 |
五、 实际测试结果与判定 (Actual Results & Evaluation)
5.1 Unit / stub
- 测试输入:
unset TEST_DATABASE_URL; go test -short ./internal/taskrun ./internal/workspace ./internal/server -run 'TestFinalize|TestCommands|TestRunManifest|TestCleanup|TestOpaque|TestManager_Done' - 实际输出:
TestRunManifest_FreezeStableSHA、TestCommands_DuplicateFinalizeMemory、TestCommands_CancelWinsOverFinalizeMemory、TestCleanup_RequiresVerifiedReceipts、TestFinalizeTaskRun_HashesViaWorkspaceCapability、TestManager_FinalizeFailureDoesNotEmitDone均为 PASS。 - 评价判定: PASS
- 性能与耗时: 亚秒。日志:
go-test-short.txt
5.2 PostgreSQL 隔离库(双 pool)
- 测试输入:
TEST_DATABASE_URL指向 5434 上非共享库名;go test ./internal/taskrun -run TestPG_。Admin 连postgres,CREATE DATABASE agent_rel_m3_u8,goose 至 37。 - 实际输出:
TestPG_DuplicateFinalizeIdempotent:messages=1 manifests=1 envelopes=1 staging=1,两侧 SHA 相同TestPG_FinalizeCancelRaceOneTerminal:status ∈ {completed, cancelled},助手 turn=1TestPG_CleanupWithoutReceiptFailsAndStagingSurvives:无 receipt 目录仍在;有 receipt 后可删;LoadStagingSHA 与原文一致
- 评价判定: PASS
- 性能与耗时: 含 goose 约 0.35s。测完
DROP DATABASE;psql确认agent_rel_m3%为 0 行。
5.3 故障注入 / SSE
- 测试输入:
uow.PG.BeforeCommit返回inject commit fail;Manager worker finalize。 - 实际输出: status=
finalizing_failed;task_run_events无done;助手正文仍为「任务执行中…」。 - 评价判定: PASS
- 性能与耗时: 40ms
5.4 真实 PI
- 测试输入: 本轮未对新项目发起编制;
GET /health显示agent_backend=pi-agent。项目 143 只读未打开。 - 实际输出: 模型容器在线,但 U8 未跑一条新的真实编制链路。
- 评价判定: FAIL(未测) — 不构成 U8 停走项(停走项是重复 finalize / 双终态 / 提前
done/ 无 receipt 清理 / 仅进程 mutex)。浏览器页面回归继承 M1。 - 性能与耗时: 未测
5.5 浏览器
- 测试输入:
cd web && npm test;npm run build - 实际输出: tsx 365 passed + vitest 30 passed;production build ✓ 8.29s
- 评价判定: PASS(单测+build)。页面 finalize 后刷新继承 M1,本轮未重跑 Playwright。
- 性能与耗时: 单测 ~1.3s;build 8.29s
5.6 restart / rebuild
- 测试输入: 主仓占槽
./scripts/env-service.sh dev rebuild;curl -sf http://127.0.0.1:8080/health与/ready - 实际输出:
{"status":"ok","env":"dev","agent_backend":"pi-agent","version":"v1.0","shared_kb_port":5432,"database_ready":true,"schema_version":37,"schema_ready":true,"task_store_ready":true}
- 评价判定: PASS
- 性能与耗时: rebuild 约 23s。日志:
rebuild.log、health.json、ready.json
5.7 跨用户 / Backend policy
- 测试输入:
TestResolveBackend_StripsUnauthorized;TestStripSecretsAndSensitive;TestCommands_RejectsSensitiveMarkdown - 实际输出:
evil-shell拒绝;api_key从 metadata 剥离;含api_key=的正文 finalize 失败 - 评价判定: PASS
- 性能与耗时: 亚秒
六、 自动化测试套件汇总 (Test Suite Execution)
| 命令 | 结果 |
|---|---|
go vet ./... |
PASS |
go test -short ./... |
PASS |
隔离库 goose 00037 Up + 双 pool 竞态 + DROP DATABASE |
PASS |
目标包 -race(taskrun/workspace/ctxmgr) |
PASS |
arch-check --mode warn |
PASS |
web npm test |
365 + 30 PASS |
| web production build | PASS |
| 占槽 rebuild + health/ready | PASS,schema_version=37 |
七、 测试结论与后续优化建议 (Conclusion & Next Steps)
U8 停走项全部观测为 PASS:重复 finalize 不产生第二 turn / 第二份 staging;cancel 与 finalize 只有一个合法终态;TX 失败路径无 SSE done;无 verified receipt 不得删 workspace;正确性由 SELECT … FOR UPDATE 与 UNIQUE(run_id) 承担,而不是进程 mutex。Goose 00037 可随隔离库 Down(随 Down to 33 验证表消失)。server 已去掉 filepath.Join(workDir, "output.md")。未做 U9 backfill/corpus/八轨/销毁,未整支 merge FAV,未启用 FAV_DEGRADED_READ,未终止项目 143。真实 PI 编制本轮未新开,不作为 U8 扩面失败理由。
继续 U9