diff --git a/.doc/ops/short-term/2026-09-23-squad-missing-target-retry.md b/.doc/ops/short-term/2026-09-23-squad-missing-target-retry.md new file mode 100644 index 00000000..b2faae7e --- /dev/null +++ b/.doc/ops/short-term/2026-09-23-squad-missing-target-retry.md @@ -0,0 +1,66 @@ +--- +title: "智能体小队故障根治(治理死锁 + MISSING_TARGET 纠偏重试)" +task_id: squad-missing-target-retry-2026-09-23 +status: done +created: 2026-09-23 +updated: 2026-09-23 +owner: Cursor +task_type: implementation +task_tier: multi_stage +policy_revision: "agent-governance-2026-09-21-r1 @ 78c2bcf6" +branch: feature/squad-missing-target-retry-2026-09-23 +worktree: .worktrees/squad-missing-target-retry-2026-09-23 +base_dev_sha: "78c2bcf6b6881dc9b50f5d0b0e9be31fadb1c681" +head_sha: "4830b8ba6d4847cded6463f9c5595b8a6e76967c" +write_scope: ["deploy/pi-agent", "internal/agent", "internal/squad", ".doc"] +allowed_environments: ["test"] +mutex: squad-missing-target-retry +review_state: not_required +integration_state: merged_local_dev_and_test +deployment: test_ok +cleanup: pending +cleanup_owner: 独立维护者 +cleanup_trigger: tip 为 local_dev/origin 祖先且无进程占用后 remove +remote_sync: not_requested +--- + +# 智能体小队故障根治 + +## 用户目标与授权 + +- 用户目标:定位并彻底修复「智能体小队总是出错」。 +- 授权:env:test 运营解锁 + 代码修复 + 合入 local_dev 并晋升 test;不 push 远端、不动 main。 + +## 根因 + +1. **R1 治理死锁(运营)**:单人项目无法配齐三职,且 `workflow.allow_author_only_approval=false` → 规划存不下 → 永远无法激活 → 任务 100% `blocked_pending_governance`。 +2. **R2 MISSING_TARGET(代码)**:PI 正常 settle 但未 write `output.md` 时被判 permanent,零重试直接失败。 + +## 结果 + +| 项 | 值 | +|---|---| +| author_only(test) | `true` revision=1(审计 API) | +| 代码合入 | `dev` merge `357e4ddb`(candidate) | +| test tip | `9984c68d` + tag `rc-v1.1.0-beta.5` | +| pinned | `357e4ddb` digest;`:8081` schema 65 | +| E2E | project 6012 `bd_intake` `run_1790162579970596047` **completed** | + +## 步骤 + +1. [x] test 开启 author_only → 单人项目 save-plan / preview / activate +2. [x] `settled-no-deliverable` → transient + 纠偏 Prompt;settle-policy `retryable=true` +3. [x] Go/Node 回归 + arch-check +4. [x] integrate → promote + pinned rebuild +5. [x] test 真实验收(小队任务 completed) +6. [x] 任务记录与测试报告落盘 + +## 边界 + +- author_only **仅 test** 开启;dev/main 默认关闭。 +- 纠偏重试受 `MaxTransientStepInvocations=2` 硬上限;不把 trace/聊天正文当交付物落盘。 + +## 相关 + +- 报告:[../../test-reports/2026-09-23-squad-missing-target-retry-test-report.md](../../test-reports/2026-09-23-squad-missing-target-retry-test-report.md) +- 晋升:`promote-squad-missing-target-retry-test-2026-09-23` → `rc-v1.1.0-beta.5` diff --git a/.doc/test-reports/2026-09-23-squad-missing-target-retry-test-report.md b/.doc/test-reports/2026-09-23-squad-missing-target-retry-test-report.md new file mode 100644 index 00000000..21c48294 --- /dev/null +++ b/.doc/test-reports/2026-09-23-squad-missing-target-retry-test-report.md @@ -0,0 +1,61 @@ +--- +title: "智能体小队故障根治 — 测试报告" +date: 2026-09-23 +task_id: squad-missing-target-retry-2026-09-23 +verdict: PASS +--- + +# 智能体小队故障根治 — 测试报告 + +## 结论 + +R1(test author_only 解锁)+ R2(settled-no-deliverable 纠偏重试)已落地;local `test@9984c68d` + `rc-v1.1.0-beta.5` pinned 重建后,项目 6012 触发「编写用户初始需求收集表」小队任务 **completed**(不再 `blocked_pending_governance`)。未 push 远端。 + +## 版本矩阵 + +| 项 | 值 | +|---|---| +| feature head | `4830b8ba` | +| integrate candidate / local_dev tip(合入时) | `357e4ddb` | +| local test | `9984c68d` | +| rc tag | `rc-v1.1.0-beta.5` → `9984c68d` | +| pinned commit | `357e4ddb` | +| app digest | `shuimu-agent-app@sha256:038c301cb68f68d2346fe1e8ad9ed67e844f0338556b8fbffbd35dcf1f02d3ef` | +| pi-agent digest | `shuimu-pi-agent@sha256:03e6249ab0f5a44128975f63de48557214498a01a8009ab289bc041082826114` | +| test health schema | 65 | +| author_only | `true` rev=1 | + +## 命令与判定 + +| 步骤 | 判定 | 说明 | +|---|---|---| +| PUT `workflow.allow_author_only_approval` | PASS | CAS revision 0→1 | +| save-plan author_only + activate 6012 | PASS | 7 文档兼任;instance active | +| `go test -short ./internal/agent ./internal/squad ./internal/stream` | PASS | 含 settled-no-deliverable 单测 | +| `node --test deploy/pi-agent/*.test.mjs` | PASS | clean settle+missing → retryable | +| `arch-check --mode block` | PASS | | +| agentctl validate + integrate | PASS | ff `78c2bcf6`→`357e4ddb` | +| promote merge + update-ref + tag | PASS | P1=`c6f0561b` P2=`357e4ddb` | +| candidate-images-build/apply + rebuild | PASS | pinned recreate | +| E2E `bd_intake` | PASS | `run_1790162579970596047` completed;三步均有 `output.md` | + +## E2E 要点 + +- 创建 HTTP 202,`status=running`(非 blocked) +- ~6 分钟后 `completed`;workspace `bd_intake_1790162580039623588` +- 交付物:`01_organize` / `02_draft` / `03_review` / 根 `output.md` 均非空 + +## 资产 + +- [assets/2026-09-23-squad-missing-target-retry/](./assets/2026-09-23-squad-missing-target-retry/) +- [promotion-receipts/357e4ddb…](./assets/promotion-receipts/357e4ddb0fe62e12cf6d1321382376257b0fe674.json) + +## 状态 + +| 字段 | 值 | +|---|---| +| review_state | not_required | +| integration_state | merged_local_dev_and_test | +| deployment | test_ok | +| remote_sync | not_requested | +| cleanup | pending | diff --git a/.doc/test-reports/assets/2026-09-23-squad-missing-target-retry/author-only-setting.txt b/.doc/test-reports/assets/2026-09-23-squad-missing-target-retry/author-only-setting.txt new file mode 100644 index 00000000..57c7d168 --- /dev/null +++ b/.doc/test-reports/assets/2026-09-23-squad-missing-target-retry/author-only-setting.txt @@ -0,0 +1,5 @@ + key | value | revision +-------------------------------------+-------+---------- + workflow.allow_author_only_approval | true | 1 +(1 row) + diff --git a/.doc/test-reports/assets/2026-09-23-squad-missing-target-retry/e2e-result.json b/.doc/test-reports/assets/2026-09-23-squad-missing-target-retry/e2e-result.json new file mode 100644 index 00000000..df0804e0 --- /dev/null +++ b/.doc/test-reports/assets/2026-09-23-squad-missing-target-retry/e2e-result.json @@ -0,0 +1,27 @@ +{ + "create_http": 200, + "run_id": "run_1790162579970596047", + "final": { + "run_id": "run_1790162579970596047", + "session_id": "sess-p6012-u4-squad-e2e", + "project_id": 6012, + "user_id": 4, + "client_turn_id": "turn-d7affa45251e", + "idempotency_key": "turn:sess-p6012-u4-squad-e2e:turn-d7affa45251e", + "task_key": "bd_intake", + "stage": "", + "workflow_instance_id": 1, + "stage_instance_id": 1, + "workflow_stage_key": "V0.1_triage", + "status": "completed", + "workspace_id": "/app/data/workspaces/bizdev/bd_intake_1790162580039623588", + "assistant_message_id": 246, + "worker_id": "", + "lease_expires_at": null, + "created_at": "2026-09-23T11:22:59.971662338Z", + "updated_at": "2026-09-23T11:28:59.203425671Z", + "error_message": "", + "attempt": 1, + "resumable": false + } +} \ No newline at end of file diff --git a/.doc/test-reports/assets/2026-09-23-squad-missing-target-retry/health.json b/.doc/test-reports/assets/2026-09-23-squad-missing-target-retry/health.json new file mode 100644 index 00000000..b3935e53 --- /dev/null +++ b/.doc/test-reports/assets/2026-09-23-squad-missing-target-retry/health.json @@ -0,0 +1 @@ +{"status":"ok","env":"test","agent_backend":"pi-agent","version":"v1.0","shared_kb_port":5432,"kb_ready":true,"database_ready":true,"schema_version":65,"schema_ready":true,"task_store_ready":true} diff --git a/.doc/test-reports/assets/2026-09-23-squad-missing-target-retry/output-paths.txt b/.doc/test-reports/assets/2026-09-23-squad-missing-target-retry/output-paths.txt new file mode 100644 index 00000000..c34276da --- /dev/null +++ b/.doc/test-reports/assets/2026-09-23-squad-missing-target-retry/output-paths.txt @@ -0,0 +1,4 @@ +/app/data/workspaces/bizdev/bd_intake_1790162580039623588/tasks/02_draft/output.md +/app/data/workspaces/bizdev/bd_intake_1790162580039623588/tasks/03_review/output.md +/app/data/workspaces/bizdev/bd_intake_1790162580039623588/tasks/01_organize/output.md +/app/data/workspaces/bizdev/bd_intake_1790162580039623588/output.md diff --git a/.doc/test-reports/assets/2026-09-23-squad-missing-target-retry/output-sizes.txt b/.doc/test-reports/assets/2026-09-23-squad-missing-target-retry/output-sizes.txt new file mode 100644 index 00000000..0472e6fc --- /dev/null +++ b/.doc/test-reports/assets/2026-09-23-squad-missing-target-retry/output-sizes.txt @@ -0,0 +1,5 @@ +14218 /app/data/workspaces/bizdev/bd_intake_1790162580039623588/tasks/02_draft/output.md +19238 /app/data/workspaces/bizdev/bd_intake_1790162580039623588/tasks/03_review/output.md +13821 /app/data/workspaces/bizdev/bd_intake_1790162580039623588/tasks/01_organize/output.md +19239 /app/data/workspaces/bizdev/bd_intake_1790162580039623588/output.md +66516 total diff --git a/.doc/test-reports/assets/2026-09-23-squad-missing-target-retry/task-run.txt b/.doc/test-reports/assets/2026-09-23-squad-missing-target-retry/task-run.txt new file mode 100644 index 00000000..692a02e2 --- /dev/null +++ b/.doc/test-reports/assets/2026-09-23-squad-missing-target-retry/task-run.txt @@ -0,0 +1,5 @@ + run_id | status | task_key | workspace_id +-------------------------+-----------+-----------+----------------------------------------------------------- + run_1790162579970596047 | completed | bd_intake | /app/data/workspaces/bizdev/bd_intake_1790162580039623588 +(1 row) + diff --git a/.doc/test-reports/assets/2026-09-23-squad-missing-target-retry/versions.txt b/.doc/test-reports/assets/2026-09-23-squad-missing-target-retry/versions.txt new file mode 100644 index 00000000..ef9e6863 --- /dev/null +++ b/.doc/test-reports/assets/2026-09-23-squad-missing-target-retry/versions.txt @@ -0,0 +1,5 @@ +dev=5cdcee26 +test=9984c68d +tag=9984c68d +code_sha=357e4ddb +promote_sha=9984c68d diff --git a/.doc/test-reports/assets/2026-09-23-squad-missing-target-retry/workflow.json b/.doc/test-reports/assets/2026-09-23-squad-missing-target-retry/workflow.json new file mode 100644 index 00000000..783f6c7c --- /dev/null +++ b/.doc/test-reports/assets/2026-09-23-squad-missing-target-retry/workflow.json @@ -0,0 +1,64 @@ +{ + "workflow_id": "wf_bd_intake_1790162580043670880", + "task_key": "bd_intake", + "title": "用户初始需求收集表", + "planning_mode": "fixed_adaptive", + "status": "completed", + "current_step_index": 0, + "steps": [ + { + "id": "step_01_organize", + "role": "organizer", + "title": "抽取材料事实并回填字段", + "sub_workspace": "tasks/01_organize", + "mode": "execute", + "parallel": false, + "accept": [ + "抽取材料中的客户身份与产品定义", + "回填 fields.json 结构化数据", + "向 blackboard 写入 facts 与 gaps" + ], + "status": "completed", + "frozen": true, + "archived_at": "2026-09-23T11:25:52.244130335Z" + }, + { + "id": "step_02_draft", + "role": "writer", + "title": "撰写用户初始需求收集表初稿", + "sub_workspace": "tasks/02_draft", + "mode": "execute", + "parallel": false, + "needs": [ + "tasks/01_organize/output.md" + ], + "accept": [ + "按 template.md 各章节严格四段式展开", + "正文翔实,各节须实质展开", + "文末集中附录字段快照与待确认清单" + ], + "status": "completed", + "frozen": true, + "archived_at": "2026-09-23T11:27:44.140019845Z" + }, + { + "id": "step_03_review", + "role": "leader", + "title": "审核并定稿交付", + "sub_workspace": "tasks/03_review", + "mode": "execute", + "parallel": false, + "needs": [ + "tasks/02_draft/output.md" + ], + "accept": [ + "核验全文逻辑一致性与出处标注", + "汇编待确认清单并给出下一步建议", + "交付终稿 output.md" + ], + "status": "completed", + "frozen": true, + "archived_at": "2026-09-23T11:28:59.149263421Z" + } + ] +} \ No newline at end of file diff --git a/.doc/test-reports/assets/promotion-receipts/357e4ddb0fe62e12cf6d1321382376257b0fe674.images.json b/.doc/test-reports/assets/promotion-receipts/357e4ddb0fe62e12cf6d1321382376257b0fe674.images.json new file mode 100644 index 00000000..ef0e39bc --- /dev/null +++ b/.doc/test-reports/assets/promotion-receipts/357e4ddb0fe62e12cf6d1321382376257b0fe674.images.json @@ -0,0 +1,21 @@ +{ + "commit": "357e4ddb0fe62e12cf6d1321382376257b0fe674", + "source_tree": "c09b36c2f8fbfde8ccd35f3fdf0caa6f32f253ea", + "source_context": "git-archive", + "recorded_at": "2026-09-23T11:20:50Z", + "tags": { + "app": "shuimu-agent-app:candidate-357e4ddb0fe6", + "events": "shuimu-agent-events:candidate-357e4ddb0fe6", + "pi-agent": "shuimu-pi-agent:candidate-357e4ddb0fe6" + }, + "image_ids": { + "app": "sha256:038c301cb68f68d2346fe1e8ad9ed67e844f0338556b8fbffbd35dcf1f02d3ef", + "events": "sha256:038c301cb68f68d2346fe1e8ad9ed67e844f0338556b8fbffbd35dcf1f02d3ef", + "pi-agent": "sha256:03e6249ab0f5a44128975f63de48557214498a01a8009ab289bc041082826114" + }, + "image_digests": { + "app": "shuimu-agent-app@sha256:038c301cb68f68d2346fe1e8ad9ed67e844f0338556b8fbffbd35dcf1f02d3ef", + "events": "shuimu-agent-app@sha256:038c301cb68f68d2346fe1e8ad9ed67e844f0338556b8fbffbd35dcf1f02d3ef", + "pi-agent": "shuimu-pi-agent@sha256:03e6249ab0f5a44128975f63de48557214498a01a8009ab289bc041082826114" + } +} diff --git a/.doc/test-reports/assets/promotion-receipts/357e4ddb0fe62e12cf6d1321382376257b0fe674.json b/.doc/test-reports/assets/promotion-receipts/357e4ddb0fe62e12cf6d1321382376257b0fe674.json new file mode 100644 index 00000000..632be349 --- /dev/null +++ b/.doc/test-reports/assets/promotion-receipts/357e4ddb0fe62e12cf6d1321382376257b0fe674.json @@ -0,0 +1,18 @@ +{ + "verdict": "pass", + "commit": "357e4ddb0fe62e12cf6d1321382376257b0fe674", + "recorded_at": "2026-09-23T11:21:06Z", + "runner_url": "http://127.0.0.1:18865", + "model_id": "MiniMax-M2.7-highspeed", + "protocol": "typed-result-v1", + "image_digests": { + "app": "shuimu-agent-app@sha256:038c301cb68f68d2346fe1e8ad9ed67e844f0338556b8fbffbd35dcf1f02d3ef", + "events": "shuimu-agent-app@sha256:038c301cb68f68d2346fe1e8ad9ed67e844f0338556b8fbffbd35dcf1f02d3ef", + "pi-agent": "shuimu-pi-agent@sha256:03e6249ab0f5a44128975f63de48557214498a01a8009ab289bc041082826114" + }, + "suite": "squad-settled-no-deliverable-unit", + "failure_class": "none", + "evidence_refs": [ + "/tmp/squad-r2-images-build.txt" + ] +}