Files
Agent-System/.doc/test-reports/2026-09-13-conversation-intent-runtime-state-test-report.md
weichenandCursor 8a8f64a931 docs(test): close intent dual-tab busy gate and release the mutex
Record project 6275 PI 409 DOC_BUSY plus Docker screenshots, mark CHAT-INTENT-STATE PASS, and archive the short-term so CURRENT has no in_progress rows.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-15 06:22:58 +00:00

7.2 KiB
Raw Permalink Blame History

对话意图与运行态可恢复性 测试报告

一、 测试背景 (Background)

真实会话出现诊断探针污染、只读“总结”误触发文档写任务、刷新后错误动作退化、文档被编辑时无持续状态提示。本报告验证本轮代码整改;真实 PI 浏览器验收须在合入 dev 并重建容器后补录。

二、 测试目标 (Test Objectives)

  • 文档名词和只读动作不触发 task_runs
  • 明确写动作仍正确映射 intake/user_requirements
  • 错误信息、恢复动作与任务请求可从历史消息重建
  • 文档租约可经项目文档 API 投影并显示为编辑中
  • 文档忙分型为 DOC_BUSY,不提供误导性重试动作
  • Go 与前端全量基础门禁通过

三、 测试方案与环境 (Test Plan & Environment)

  • 日期:2026-09-13 UTC
  • 分支/worktree:fix/conversation-intent-state / .worktrees/fix-conversation-intent-state
  • 后端:Go 单元与 -short 全量套件;未启动 worktree 容器
  • 前端:Node test + Vitest + TypeScript/Vite production build
  • 现场取证:dev PostgreSQL 只读查询;未修改用户消息、任务或文档

四、 预期结果 (Expected Results)

场景 预期
总结一下用户初始需求表 进入服务端鉴权只读总结链路,返回已有正文摘要且不创建任务
请开始编写用户初始需求表 映射 intake
失败消息刷新 恢复 errorInfo.actions 与 taskRequest
文档有有效租约 API 返回 holder/到期/心跳;正文和抽屉显示编辑中
并发写命中租约 DOC_BUSY,不创建误导性重试动作

五、 实际测试结果与判定 (Actual Results & Evaluation)

用例 A:只读负例与明确写入正例

  • Input: tsx --test src/engine/templateMatch.test.ts
  • Actual Output: 12 tests PASS;含 5 个只读负例与 2 个明确写入正例
  • Evaluation: PASS

用例 B:刷新后错误/任务上下文恢复

  • Input: vitest run ...chatWindowArtifact.test.ts
  • Actual Output: 结构化错误动作、原请求与 legacy busy 分型测试 PASS
  • Evaluation: PASS

用例 C:租约服务端投影与前端合并

  • Input: go test -short ./internal/docgov;vitest run ...deliverableSync.test.ts
  • Actual Output: active lease holder/expiry/heartbeat 投影与前端映射 PASS
  • Evaluation: PASS

用例 D:真实现场状态核对

  • Input: 只读查询 sess-p143-u9、task_runs、task_run_events、document_records
  • Actual Output: 误启动 run run_1789270446838831656 于 03:42 UTC 完成,质量 100;租约已释放;用户数据未被本轮修改
  • Evaluation: PASS(根因证据);不代表修复后 E2E

用例 E:真实 PI + 浏览器刷新/双标签页

  • Input: 新建项目 INTENT双标签-061002(id 6275,禁止 143)/ sess-p6275-u10;Tab A POST /api/v1/tasks/runs「请开始编写用户初始需求表」真实 pi-agent;租约出现后 Tab B 再 POST;浏览器双标签打开同一项目
  • Actual Output:
    • health/ready schema 38、agent_backend=pi-agent
    • Tab A 202 run_1789452602295343365 status=running;2ms 内 lease_holder_type=squad
    • Tab B HTTP 409 DOC_BUSY,响应无 run_id;PG task_runs 仅 1 行
    • 聊天窗 assistant error_info.code=DOC_BUSY 且 actions=[],另有 task_status=running 占位;再次 GET window 同集
    • 真实 PI completed(约 280s,质量 100);租约在终态探测后 1ms 已空(无需客户端刷新)
    • 终态后再 GET window:DOC_BUSY 卡仍 actions=[],无重试动作
    • 浏览器(Docker Playwright,宿主机缺 libatk):双标签可见「本文档正由【项目助手】编辑/生成中」、聊天 DOC_BUSY、发送按钮 disabled、刷新后仍无重试。截图 assets/2026-09-15-conversation-intent-dual-tab/screenshots/
  • Evaluation: PASS
  • 性能与耗时: API 活验 281s;Docker UI 4.4s。产物:assets/2026-09-15-conversation-intent-dual-tab/live.json、playwright-docker.json
  • 诊断污染:sess-p143-u9 未写入、未删除历史探针

用例 F:dev 集成冒烟

  • Input: go vet ./...、go test -short ./...、前端测试/构建、/health、/ready
  • Actual Output: 全部 PASS;前端 Node 187 + Vitest 24;dev rebuild 后 /ready 返回 HTTP 200,数据库、schema 27 与 task store 均 ready
  • Evaluation: PASS;但 env-service.sh dev restart 只重启旧镜像,不能作为新代码已部署的证据

用例 G:服务端鉴权只读文档总结

  • Input: 原句意图测试、协调层只读 reader 测试、文档别名选择测试、提示注入隔离测试
  • Actual Output: 原句识别为 QUERY_DOC_STATUS/query_topic=doc_summary;正文只从服务端项目/阶段权限过滤后的 reader 获取;无 PendingAction;生成目录仅允许 reply.md
  • Evaluation: PASS

用例 H:dev 真实 PI 隔离会话总结

  • Input: fixture-summary-20260913-codex-01 / project 143 / 总结一下用户初始需求表
  • Actual Output: QUERY_DOC_STATUS、query_topic=doc_summary、target_doc=用户初始需求表、reply_source=pi-agent、pending_action=null;返回现有文档实质摘要;task_runs 前后均为 0;租约前后为空;用户原会话 sess-p143-u9 最大消息 ID 仍为 567
  • Evaluation: PASS;fixture 的 2 条消息、1 条会话及 2 个隔离对话工作区已精确清理,清理后消息/run 均为 0

用例 I:容器代码新鲜度

  • Input: 先 dev restart,再重建 app 镜像后重复用例 H
  • Actual Output: restart 后仍返回旧版 CASUAL_CHAT;重建后返回新版 QUERY_DOC_STATUS/doc_summary
  • Evaluation: 首次 FAIL、整改后 PASS;./scripts/env-service.sh dev rebuild 已实跑通过,集成冒烟统一改用该命令

用例 J:文档 busy 服务端预检

  • Input: 文档持有有效人工租约时请求 /api/v1/tasks/runs,携带明确写入语句
  • Actual Output: HTTP 409 / DOC_BUSY;响应不含 run_id;服务端持久化 user + assistant 两条消息,assistant 含 error_info.actions=[] 与原 task_request
  • Evaluation: PASS;刷新后仍可恢复“当前请求未创建新任务”的状态卡,且不会显示重试按钮

六、 自动化测试套件汇总 (Test Suite Execution)

go vet ./...                 PASS
go test -short ./...         PASS(全部 Go 包)
cd web && npm test           PASS(Node 187 + Vitest 24)
cd web && npm run build      PASS(Vite 生产构建)
git diff --check             PASS
硬编码 localhost 调试上报扫描 PASS(0 命中)

七、 测试结论与后续优化建议 (Conclusion & Next Steps)

代码级、构建门禁、真实 PI 只读总结与 新建项目双标签 busy 已通过。项目 6275 / run_1789452602295343365:并发写 409 DOC_BUSY 不新增第二 run;刷新后 actions=[];PI 终态后租约自动解除。浏览器双标签截图见 assets/2026-09-15-conversation-intent-dual-tab/screenshots/。真实会话 sess-p143-u9 中的诊断消息与误启动产物只记录证据,不在未获确认时删除或回滚。production_ready 仍为 no(CI 三工作流 E2E / 前端抽检等其它 blocker)。