diff --git a/.doc/ops/CURRENT.md b/.doc/ops/CURRENT.md index c87a4c82..f7105f02 100644 --- a/.doc/ops/CURRENT.md +++ b/.doc/ops/CURRENT.md @@ -5,7 +5,7 @@ ## 焦点 -1. **任务作用域 409 与对话丢失**:`fix/taskrun-scope-persist-2026-09-21` 进行中。新旧任务键(`intake` / `bd_intake`)归一化,409 早退前落库对话。见 [short-term](./short-term/2026-09-21-taskrun-scope-persist.md)。test/main 未晋升。 +1. **任务作用域 409 与对话丢失已合入准备**:旧键 `intake` 对 `bd_intake` 快照可创建任务;陈威项目 6579 实测 202,窗口可读回对话(见 [报告](../test-reports/2026-09-21-taskrun-scope-persist-test-report.md))。test/main 未晋升。 2. **任务错误透传已合入 dev**:`RunRecord` snake_case 与前端真实失败原因(见 [报告](../test-reports/2026-09-21-taskrun-error-transparency-test-report.md))。test/main 未晋升。 2. **阶段回溯与影响闭环已合入 dev**:T1–T3 与 B1–B3 在 `dev`。空追踪 JSON `null` 已修复,登录后显示「已索引 0 份文档 · 条目 0」(见 [报告](../test-reports/2026-09-21-trace-panel-null-crash-test-report.md))。test/main 未晋升。不改 `production_ready`,不签 D7 对话 ADR。 3. **红线**:禁止整支 merge FAV;不默认升 `MULTI_INTENT_PLAN_TIER=full`;`SEMANTIC_SUMMARY_REPLACE` 不随 W2 开启;FAV live 观察窗证据驱动;`FAV_DEGRADED_READ=false`;项目 143 只读;SWBOOT-10 保持 fail-closed stub;D7 对话 ADR 仍待合规签字(追踪表留存类别已定为 `record`,不授权物理删除);**不改 `production_ready`**;模块解耦批次 A–G 与回溯实施切片未单独认领前保持 `planned`。 @@ -14,7 +14,7 @@ | owner | task | branch | worktree | mutex | status | |-------|------|--------|----------|-------|--------| -| Cursor | 2026-09-21-taskrun-scope-persist | fix/taskrun-scope-persist-2026-09-21 | - | projectinstance+taskrun | in_progress | +| Cursor | 2026-09-21-taskrun-scope-persist | fix/taskrun-scope-persist-2026-09-21 | - | projectinstance+taskrun | done | | Cursor | 2026-09-21-taskrun-error-transparency | fix/taskrun-error-transparency-2026-09-21 | - | chat+web | done | | Cursor | 2026-09-21-trace-panel-null-crash | fix/trace-panel-null-crash-2026-09-21 | - | trace-index+web | done | | Cursor-Auto | 2026-09-20-stage-backtrack-design | feature/stage-backtrack-design | - | trace-impact-design | done | @@ -174,7 +174,7 @@ | holder | phase | since | scope | queue | |--------|-------|-------|-------|-------| -| Cursor | smoke | 2026-09-21 | fix/taskrun-scope-persist-2026-09-21:dev rebuild 与陈威项目 6579 验收 | - | +| - | idle | 2026-09-21 | 任务作用域键归一化已在 dev 容器验收;`/health` schema_version=59;项目 6579 任务 `run_1789967333594919025` 为 running | - | **phase**: `idle` | `merging` | `smoke` | `e2e` diff --git a/.doc/ops/short-term/2026-09-21-taskrun-scope-persist.md b/.doc/ops/short-term/2026-09-21-taskrun-scope-persist.md index 3298537b..0e299cad 100644 --- a/.doc/ops/short-term/2026-09-21-taskrun-scope-persist.md +++ b/.doc/ops/short-term/2026-09-21-taskrun-scope-persist.md @@ -1,6 +1,6 @@ --- title: "任务作用域键归一化与失败对话落库" -status: in_progress +status: done created: 2026-09-21 updated: 2026-09-21 owner: Cursor @@ -31,13 +31,13 @@ mutex: projectinstance+taskrun 1. [x] 键别名归一化与回归测试 2. [x] 409 路径落库与回归测试 -3. [ ] dev rebuild 与陈威项目 6579 实测 +3. [x] dev rebuild 与陈威项目 6579 实测 ## 验收标准 -- [ ] live 实例快照为 `bd_intake`、请求 `intake` 时任务创建成功(202) -- [ ] 无法解析时 `chat_messages` 仍有用户句与失败回复 -- [ ] 刷新后该会话不再为空 +- [x] live 实例快照为 `bd_intake`、请求 `intake` 时任务创建成功(202) +- [x] 无法解析时 `chat_messages` 仍有用户句与失败回复 +- [x] 刷新后该会话不再为空 ## 相关链接 diff --git a/.doc/test-reports/2026-09-21-taskrun-scope-persist-test-report.md b/.doc/test-reports/2026-09-21-taskrun-scope-persist-test-report.md new file mode 100644 index 00000000..c91ee217 --- /dev/null +++ b/.doc/test-reports/2026-09-21-taskrun-scope-persist-test-report.md @@ -0,0 +1,82 @@ +# 任务作用域 409 与对话丢失 测试报告 + +## 一、 测试背景 (Background) + +dev 上以用户「陈威」在项目 6579 发送「编写初始用户需求表」时,接口返回 `TASK_SCOPE_UNRESOLVED`(409)。刷新页面后该会话没有任何消息。 + +根因:2026-09-19 任务键命名空间化之后,实例 366 的快照任务键是 `bd_intake`,前端仍提交旧键 `intake`。作用域解析做精确匹配,访问门在找不到任务时直接放行,于是请求在创建任务之前以 409 结束,用户消息也还没写入。 + +## 二、 测试目标 (Test Objectives) + +- 快照为 `bd_intake`、请求为 `intake` 时,`POST /api/v1/tasks/runs` 返回 202,而不是 `TASK_SCOPE_UNRESOLVED`。 +- 成功路径写入用户句与助手占位,刷新用的消息窗口能读回这两条。 +- 作用域仍无法解析时,409 之前先落库用户句和失败回复(单测覆盖;本次陈威场景已不再走该分支)。 +- 验收后端为真实 `pi-agent`(`MiniMax-M2.7-highspeed`),不用 stub 输出充当验收数据。 + +## 三、 测试方案与环境 (Test Plan & Environment) + +- OS:Linux。dev 编排 `agent-dev`,HTTP `:8080`,业务库 `:5433`。在 `fix/taskrun-scope-persist-2026-09-21` 上执行 `./scripts/env-service.sh dev rebuild`。 +- 后端:`go vet ./...`;`go test -short -count=1 -timeout 20m ./...`。 +- 端到端:为用户 398(陈威)签发一次性会话(验收后立即撤销,不改口令),对项目 6579、会话 `sess-p6579-u398` 提交 `task_key=intake`。 + +## 四、 预期结果 (Expected Results) + +- `/health` 为 `env=dev`、`agent_backend=pi-agent`、`schema_version=59`。 +- 创建任务 HTTP 202,`status=running`,`workflow_stage_key=V0.1_triage`。 +- `chat_messages` 与 `GET /api/v1/chat/messages/window` 都含用户句「编写初始用户需求表」和助手句「任务执行中…」,`scope_kind=workflow_stage`。 + +## 五、 实际测试结果与判定 (Actual Results & Evaluation) + +### 用例 1:dev 健康与真实 pi-agent + +- **测试输入 (Input)**:`curl -sf http://127.0.0.1:8080/health`;`curl -sf http://127.0.0.1:18865/health`。 +- **实际输出 (Actual Output)**: + +```json +{"status":"ok","env":"dev","agent_backend":"pi-agent","version":"v1.0","shared_kb_port":5432,"kb_ready":true,"database_ready":true,"schema_version":59,"schema_ready":true,"task_store_ready":true} +``` + +pi-agent:`ok=true`,`model_id=MiniMax-M2.7-highspeed`。 + +- **评价判定**:PASS +- **性能与耗时**:健康检查 <1s + +### 用例 2:陈威编写初始用户需求表 + +- **测试输入 (Input)**:`POST /api/v1/tasks/runs`,`project_id=6579`,`session_id=sess-p6579-u398`,`task_key=intake`,`user_message=编写初始用户需求表`。 +- **实际输出 (Actual Output)**:HTTP 202 + +```json +{"run_id":"run_1789967333594919025","status":"running"} +``` + +`task_runs`:`task_key=intake`,`workflow_stage_key=V0.1_triage`,`status=running`,无 error。 + +`chat_messages`: + +```text +4362 | user | TRIGGER_TASK | workflow_stage | V0.1_triage | 编写初始用户需求表 +4363 | assistant | TRIGGER_TASK | workflow_stage | V0.1_triage | 任务执行中… +``` + +- **评价判定**:PASS。旧键已解析到 V0.1,任务已创建,对话已落库。 +- **性能与耗时**:接口约 0.3s 返回 202(生成仍在后台进行)。 + +### 用例 3:刷新窗口 + +- **测试输入 (Input)**:`GET /api/v1/chat/messages/window?session_id=sess-p6579-u398&days=7`(同一用户)。 +- **实际输出 (Actual Output)**:HTTP 200,1 个日期桶、2 条消息:用户「编写初始用户需求表」、助手「任务执行中…」,阶段键 `V0.1_triage`。 +- **评价判定**:PASS。刷新读取不再为空。 +- **性能与耗时**:约 0.3s + +## 六、 自动化测试套件汇总 (Test Suite Execution) + +- `go vet ./...`:通过。 +- 定向:`go test -count=1 ./internal/projectinstance/ -run 'TestResolveMessageScopeForTask_LegacyKeyMatchesCanonicalSnapshot|TestResolveMessageScopeForTask_CanonicalAliasAmbiguousAcrossStages|TestTaskKeyToStage_LegacyAlias|TestResolveMessageScopeForTask_LiveStageScope'` 通过;`go test -count=1 ./internal/server/ -run 'TestCreateTaskRun_ScopeUnresolvedPersistsChat|TestCreateTaskRun_PreActivationAcceptedNot409|TestCreateTaskRunBusyPreflightDoesNotPersistRunOrMessages'` 通过。 +- `go test -short -count=1 -timeout 20m ./...`:`internal/projectinstance`、`internal/server` 通过。另有 3 个既有库集成用例失败,与本次 diff 无关,且会写入当前 dev 库:`TestDocGov_CreateOrGetDocument_OptionalDutiesNullFK`(项目外键)、`TestPG_StageAdvanceReminder24h` / `TestPG_EmitStageReadyDedupe` / `TestCAS_DatabaseIntegration`(项目名全局唯一冲突)。 + +## 七、 测试结论与后续优化建议 (Conclusion & Next Steps) + +达到合入 dev 的标准:陈威场景不再 409,刷新后对话还在。`run_1789967333594919025` 在取样时仍为 `running`,正文生成由真实 pi-agent 继续。test/main 不晋升,不改 `production_ready`。 + +后续:追踪面板改为对话输出在独立任务中做,不纳入本次缺陷修复。