Files
Agent-System/.doc/test-reports/2026-09-15-taskrun-runmanifest-u8-test-report.md
T
weichenandCursor f4dfada9ae docs(test): M3 U8 TaskRun RunManifest 验收报告
隔离库双 pool、目标包 race、arch-check、web 与 rebuild 证据齐全;真实 PI 未测。最后一句:继续 U9。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-15 02:17:37 +00:00

7.4 KiB
Raw Blame History

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=1
    • TestPG_CleanupWithoutReceiptFailsAndStagingSurvives:无 receipt 目录仍在;有 receipt 后可删;LoadStaging SHA 与原文一致
  • 评价判定: 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