@tea-agent/loop-agent 0.13.0-alpha.0 → 0.13.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (262) hide show
  1. package/AGENTS.md +155 -153
  2. package/CHANGELOG.md +326 -301
  3. package/README.md +345 -326
  4. package/bin/agent-worker.js +22 -22
  5. package/bin/loop-agent.js +21 -21
  6. package/dist/application/dag/generate-task-dag.js +28 -58
  7. package/dist/application/evaluation/candidate-hash.js +75 -0
  8. package/dist/application/evaluation/candidate.js +52 -0
  9. package/dist/application/evaluation/replay.js +289 -0
  10. package/dist/application/evaluation/types.js +130 -0
  11. package/dist/cli/command-definitions.js +17 -4
  12. package/dist/cli/program.js +8 -4
  13. package/dist/commands/cursor-prompt.js +6 -6
  14. package/dist/commands/eval.js +235 -0
  15. package/dist/commands/init.js +544 -506
  16. package/dist/commands/loop-benchmark.js +11 -11
  17. package/dist/commands/pi-reuse-benchmark.js +16 -16
  18. package/dist/executors/pi-sdk-executor.js +38 -24
  19. package/dist/executors/shell-executor.js +34 -2
  20. package/dist/executors/shell-presets.js +20 -0
  21. package/dist/executors/shell-verification.js +7 -0
  22. package/dist/governance/manifest-types.js +1 -0
  23. package/dist/infrastructure/evaluation/candidate-store.js +435 -0
  24. package/dist/infrastructure/evaluation/store.js +40 -0
  25. package/dist/sidecars/cursor-prompt/executor.js +1 -1
  26. package/dist/task/config-types.js +23 -0
  27. package/dist/task/runtime.js +27 -27
  28. package/dist/worker/observe/routes.js +18 -3
  29. package/dist/worker/observe/spec-evidence.js +1 -1
  30. package/dist/worker/observe/static/api.js +46 -46
  31. package/dist/worker/observe/static/app.js +150 -150
  32. package/dist/worker/observe/static/constants.js +148 -148
  33. package/dist/worker/observe/static/copy.js +67 -67
  34. package/dist/worker/observe/static/dag-helpers.js +172 -172
  35. package/dist/worker/observe/static/dag-layout.d.ts +31 -31
  36. package/dist/worker/observe/static/dag-layout.js +83 -83
  37. package/dist/worker/observe/static/dag-model.js +72 -72
  38. package/dist/worker/observe/static/dom.js +61 -61
  39. package/dist/worker/observe/static/format-pool.js +67 -67
  40. package/dist/worker/observe/static/format.js +292 -292
  41. package/dist/worker/observe/static/index.html +308 -308
  42. package/dist/worker/observe/static/kpi.js +94 -94
  43. package/dist/worker/observe/static/relations.js +133 -133
  44. package/dist/worker/observe/static/router.js +93 -93
  45. package/dist/worker/observe/static/run-processing.js +148 -148
  46. package/dist/worker/observe/static/shell-chrome.js +68 -68
  47. package/dist/worker/observe/static/state.js +253 -253
  48. package/dist/worker/observe/static/styles.css +1902 -1902
  49. package/dist/worker/observe/static/views/batch.js +227 -227
  50. package/dist/worker/observe/static/views/dag-graph.js +172 -172
  51. package/dist/worker/observe/static/views/dag-inspector.js +607 -596
  52. package/dist/worker/observe/static/views/dag.js +362 -362
  53. package/dist/worker/observe/static/views/dashboard.js +445 -445
  54. package/dist/worker/observe/static/views/failures.js +143 -143
  55. package/dist/worker/observe/static/views/feature.js +492 -492
  56. package/dist/worker/observe/static/views/pool.js +350 -350
  57. package/dist/worker/observe/static/views/run.js +453 -453
  58. package/dist/worker/observe/static/views/session-timeline.js +205 -205
  59. package/dist/worker/observe/static/views/shell.js +7 -7
  60. package/dist/worker/observe/static/views/task.js +314 -314
  61. package/dist/worker/observe/static/views/timeline.js +163 -163
  62. package/dist/workflows/dag/backend-test-analysis-contract.js +120 -0
  63. package/dist/workflows/dag/canvas-observer.js +275 -275
  64. package/dist/workflows/dag/dynamic-runtime/map.js +90 -2
  65. package/dist/workflows/dag/init-hybrid.js +1415 -200
  66. package/dist/workflows/dag/node-execution.js +9 -0
  67. package/dist/workflows/dag/prompt.js +9 -0
  68. package/dist/workflows/dag/report.js +35 -1
  69. package/dist/workflows/dag/runner.js +28 -2
  70. package/dist/workflows/dag/task-demand-routing.js +383 -0
  71. package/dist/workflows/dag/types.js +50 -13
  72. package/dist/workflows/dag/upstream-artifacts.js +1 -0
  73. package/dist/workflows/dag/validate.js +59 -1
  74. package/docs/README.md +106 -104
  75. package/docs/agent-dag-recovery-playbook.md +195 -193
  76. package/docs/agent-dag-runner.md +67 -67
  77. package/docs/architecture/README.md +26 -26
  78. package/docs/architecture/dag-execution.md +140 -140
  79. package/docs/architecture/evolution.md +54 -54
  80. package/docs/architecture/facts-and-state.md +71 -71
  81. package/docs/architecture/runtime-boundaries.md +191 -191
  82. package/docs/architecture/system-overview.md +93 -93
  83. package/docs/architecture/worker-and-feature.md +85 -85
  84. package/docs/cursor-prompt-sidecar.md +36 -36
  85. package/docs/decisions/README.md +18 -18
  86. package/docs/design/README.md +167 -85
  87. package/docs/development-principles.md +73 -73
  88. package/docs/exec-plans/README.md +6 -6
  89. package/docs/exec-plans/active/README.md +15 -11
  90. package/docs/exec-plans/completed/README.md +85 -74
  91. package/docs/feature-workflow.md +389 -339
  92. package/docs/harness-methodology-debugging.md +153 -153
  93. package/docs/harness-methodology-tdd.md +130 -130
  94. package/docs/harness-methodology-verification.md +27 -27
  95. package/docs/init-surface.manifest.json +289 -280
  96. package/docs/loop-agent-harness.md +142 -141
  97. package/docs/production-readiness.md +96 -96
  98. package/docs/progress/README.md +64 -58
  99. package/docs/reports/README.md +117 -100
  100. package/docs/skills/README.md +7 -7
  101. package/docs/skills/vetted-skill-registry.md +29 -27
  102. package/docs/templates/adr.md +60 -60
  103. package/docs/templates/agent-dag-authority-surface-audit.prompt.md +94 -94
  104. package/docs/templates/agent-dag-decision-envelope.schema.json +213 -213
  105. package/docs/templates/agent-dag-decision-gate-dogfood-report.md +117 -117
  106. package/docs/templates/agent-dag-decision-gate.prompt.md +246 -246
  107. package/docs/templates/agent-dag-process-supervisor.prompt.md +98 -98
  108. package/docs/templates/agent-dag-report.schema.json +473 -473
  109. package/docs/templates/agent-dag-review-verdict.prompt.md +68 -68
  110. package/docs/templates/agent-dag.base.json +190 -190
  111. package/docs/templates/agent-dag.final-verification.json +185 -185
  112. package/docs/templates/agent-dag.schema.json +411 -383
  113. package/docs/templates/agent-dag.supervised-implementation.json +501 -501
  114. package/docs/templates/backend-test-analysis.schema.json +44 -0
  115. package/docs/templates/backend-test-dag.generate-pytest.prompt.md +202 -139
  116. package/docs/templates/backend-test-dag.json +311 -288
  117. package/docs/templates/backend-test-dag.retrospect.prompt.md +125 -125
  118. package/docs/templates/backend-test-dag.review-cases.prompt.md +81 -81
  119. package/docs/templates/exec-plan.md +64 -64
  120. package/docs/templates/feature-spec.md +53 -53
  121. package/docs/templates/frontend-design-contract.md +42 -33
  122. package/docs/templates/frontend-task-constraints.md +35 -25
  123. package/docs/templates/frontend-task-requirement.md +70 -61
  124. package/docs/templates/frontend-test-dag.generate-cases.prompt.md +5 -0
  125. package/docs/templates/frontend-test-dag.json +23 -0
  126. package/docs/templates/frontend-test-dag.retrieve-context.prompt.md +3 -0
  127. package/docs/templates/frontend-test-dag.retrospect.prompt.md +3 -0
  128. package/docs/templates/frontend-test-dag.review-cases.prompt.md +3 -0
  129. package/docs/templates/frontend-test-dag.review-execution.prompt.md +3 -0
  130. package/docs/templates/harness.schema.json +221 -221
  131. package/docs/templates/hybrid-dag.json +188 -188
  132. package/docs/templates/init-evolution-review.md +35 -35
  133. package/docs/templates/interactive-ui-round2-experiment.md +66 -66
  134. package/docs/templates/knowledge-graph-bootstrap-dag.json +118 -118
  135. package/docs/templates/knowledge-sync-dag.json +178 -177
  136. package/docs/templates/knowledge-sync-draft.schema.json +71 -71
  137. package/docs/templates/product-line/AGENTS.md +8 -8
  138. package/docs/templates/product-line/README.md +9 -9
  139. package/docs/templates/product-line/acceptance.yaml +14 -14
  140. package/docs/templates/product-line/closeout.yaml +9 -9
  141. package/docs/templates/product-line/design.md +13 -13
  142. package/docs/templates/product-line/links.md +10 -10
  143. package/docs/templates/product-line/requirement.md +17 -17
  144. package/docs/templates/product-line/task-graph.yaml +15 -15
  145. package/docs/templates/product-line/task.yaml +64 -64
  146. package/docs/templates/product-line/test-plan.md +7 -7
  147. package/docs/templates/production-readiness-checklist.md +57 -57
  148. package/docs/templates/progress-log.md +17 -17
  149. package/docs/templates/project-start-checklist.md +9 -9
  150. package/docs/templates/qa-report.md +48 -48
  151. package/docs/templates/sprint-contract.md +29 -29
  152. package/docs/templates/worker-dogfood-evidence.md +80 -80
  153. package/docs/templates/worker-dogfood-setup.md +68 -68
  154. package/docs/verification-matrix.md +70 -67
  155. package/examples/decision-gate-agent-dag.json +177 -177
  156. package/examples/example-dag.json +46 -46
  157. package/examples/hybrid-loop-agent-dag.json +189 -189
  158. package/harness.json +66 -66
  159. package/package.json +88 -52
  160. package/scripts/check-product-line-docs.sh +29 -29
  161. package/scripts/check-task-pool-root.sh +32 -32
  162. package/scripts/kb-bootstrap-init-skeleton.sh +240 -239
  163. package/scripts/kb-graph-incremental-prepare.mjs +386 -372
  164. package/scripts/kb-graph-incremental-prepare.sh +5 -5
  165. package/scripts/kb-graph-materialize.mjs +105 -105
  166. package/scripts/kb-graph-materialize.sh +4 -4
  167. package/scripts/kb-graph-promote.mjs +164 -153
  168. package/scripts/kb-graph-promote.sh +4 -4
  169. package/scripts/kb-query.mjs +554 -554
  170. package/scripts/kb-query.sh +5 -5
  171. package/skills/agent-worker/SKILL.md +39 -39
  172. package/skills/agent-worker/references/agent-worker-operator.md +60 -60
  173. package/skills/ai-engineering-context/SKILL.md +48 -48
  174. package/skills/analyze-product-dependencies/SKILL.md +67 -0
  175. package/skills/analyze-product-dependencies/agents/openai.yaml +4 -0
  176. package/skills/analyze-product-dependencies/references/api-documentation-schema.md +30 -0
  177. package/skills/analyze-product-dependencies/references/dependency-analysis-schema.md +28 -0
  178. package/skills/analyze-product-dependencies/references/example.md +76 -0
  179. package/skills/analyze-product-dependencies/references/forward-test-cases.md +35 -0
  180. package/skills/analyze-product-dependencies/references/input-contract.md +11 -0
  181. package/skills/analyze-product-dependencies/references/scouting-rules.md +61 -0
  182. package/skills/analyze-product-dependencies/scripts/test-validators.mjs +267 -0
  183. package/skills/analyze-product-dependencies/scripts/validate-api-documentation.mjs +101 -0
  184. package/skills/analyze-product-dependencies/scripts/validate-dependency-analysis.mjs +142 -0
  185. package/skills/analyze-product-dependencies/scripts/validate-product-requirement-input.mjs +76 -0
  186. package/skills/analyze-product-dependencies/scripts/validation-helpers.mjs +146 -0
  187. package/skills/analyze-product-requirements/SKILL.md +90 -0
  188. package/skills/analyze-product-requirements/agents/openai.yaml +4 -0
  189. package/skills/analyze-product-requirements/references/acceptance-criteria.md +91 -0
  190. package/skills/analyze-product-requirements/references/clarification-and-knowledge.md +56 -0
  191. package/skills/analyze-product-requirements/references/example.md +86 -0
  192. package/skills/analyze-product-requirements/references/forward-test-cases.md +66 -0
  193. package/skills/analyze-product-requirements/references/product-analysis-schema.md +32 -0
  194. package/skills/analyze-product-requirements/references/product-requirement-schema.md +33 -0
  195. package/skills/analyze-product-requirements/references/requirement-clarification-schema.md +35 -0
  196. package/skills/analyze-product-requirements/scripts/test-validators.mjs +193 -0
  197. package/skills/analyze-product-requirements/scripts/validate-product-analysis.mjs +69 -0
  198. package/skills/analyze-product-requirements/scripts/validate-product-requirement.mjs +97 -0
  199. package/skills/analyze-product-requirements/scripts/validate-requirement-clarification.mjs +98 -0
  200. package/skills/analyze-product-requirements/scripts/validation-helpers.mjs +156 -0
  201. package/skills/code-review-core/SKILL.md +20 -20
  202. package/skills/codebase-scout/SKILL.md +19 -19
  203. package/skills/frontend-design-review/SKILL.md +66 -61
  204. package/skills/frontend-design-review/references/review-checklist.md +58 -37
  205. package/skills/frontend-implementation/SKILL.md +45 -52
  206. package/skills/frontend-implementation/references/code-standards.md +32 -34
  207. package/skills/frontend-implementation/references/design-spec.md +46 -46
  208. package/skills/frontend-implementation/references/node-contracts.md +76 -63
  209. package/skills/frontend-review/SKILL.md +59 -53
  210. package/skills/frontend-review/references/review-findings.md +47 -42
  211. package/skills/frontend-verification/SKILL.md +53 -40
  212. package/skills/frontend-verification/references/verification-checklist.md +68 -56
  213. package/skills/grill-me/SKILL.md +10 -10
  214. package/skills/grill-with-docs/SKILL.md +88 -88
  215. package/skills/grill-with-docs/adr-format.md +47 -47
  216. package/skills/grill-with-docs/context-format.md +60 -60
  217. package/skills/init-capability-evolution/SKILL.md +70 -70
  218. package/skills/loop-agent/SKILL.md +151 -151
  219. package/skills/loop-agent/references/README.md +67 -67
  220. package/skills/loop-agent/references/command-reference.md +505 -453
  221. package/skills/loop-agent/references/docs-converge.md +126 -126
  222. package/skills/loop-agent/references/harness-policy.md +263 -263
  223. package/skills/loop-agent/references/hybrid-dag.md +238 -233
  224. package/skills/loop-agent/references/learned/README.md +21 -21
  225. package/skills/loop-agent/references/long-running-loop.md +57 -57
  226. package/skills/loop-agent/references/model-routing.md +36 -36
  227. package/skills/loop-agent/references/multi-worktree.md +54 -54
  228. package/skills/loop-agent/references/one-shot-runs.md +85 -85
  229. package/skills/loop-agent/references/orchestrator-and-interventions.md +169 -169
  230. package/skills/loop-agent/references/pi-prompt.md +23 -23
  231. package/skills/loop-agent/references/pi-subagent-assisted-mode.md +84 -84
  232. package/skills/loop-agent/references/post-implementation-and-patterns.md +44 -44
  233. package/skills/loop-agent/references/task-workflow.md +89 -89
  234. package/skills/loop-agent/references/verification-and-failure-handling.md +139 -139
  235. package/skills/playwright-cli/SKILL.md +420 -0
  236. package/skills/playwright-cli/references/element-attributes.md +23 -0
  237. package/skills/playwright-cli/references/playwright-tests.md +39 -0
  238. package/skills/playwright-cli/references/request-mocking.md +87 -0
  239. package/skills/playwright-cli/references/running-code.md +241 -0
  240. package/skills/playwright-cli/references/session-management.md +225 -0
  241. package/skills/playwright-cli/references/storage-state.md +275 -0
  242. package/skills/playwright-cli/references/test-generation.md +433 -0
  243. package/skills/playwright-cli/references/tracing.md +139 -0
  244. package/skills/playwright-cli/references/video-recording.md +143 -0
  245. package/skills/playwright-cli-case-generator/SKILL.md +74 -0
  246. package/skills/requesting-code-review/SKILL.md +101 -101
  247. package/skills/requesting-code-review/code-reviewer.md +168 -168
  248. package/skills/systematic-debugging/CREATION-LOG.md +119 -119
  249. package/skills/systematic-debugging/SKILL.md +296 -296
  250. package/skills/systematic-debugging/condition-based-waiting-example.ts +158 -158
  251. package/skills/systematic-debugging/condition-based-waiting.md +115 -115
  252. package/skills/systematic-debugging/defense-in-depth.md +122 -122
  253. package/skills/systematic-debugging/find-polluter.sh +63 -63
  254. package/skills/systematic-debugging/root-cause-tracing.md +169 -169
  255. package/skills/systematic-debugging/test-academic.md +14 -14
  256. package/skills/systematic-debugging/test-pressure-1.md +58 -58
  257. package/skills/systematic-debugging/test-pressure-2.md +68 -68
  258. package/skills/systematic-debugging/test-pressure-3.md +69 -69
  259. package/skills/test-driven-development/SKILL.md +20 -20
  260. package/skills/using-git-worktrees/SKILL.md +215 -215
  261. package/skills/verification-before-completion/SKILL.md +154 -154
  262. package/skills/webapp-testing/SKILL.md +19 -19
@@ -1,193 +1,195 @@
1
- # Agent DAG Recovery Playbook(恢复手册)
2
-
3
- > **关联**:[`agent-dag-runner.md`](agent-dag-runner.md)(CLI 与 run 语义)· [`templates/agent-dag-decision-gate.prompt.md`](templates/agent-dag-decision-gate.prompt.md)(Decision Gate 消费 recovery 证据)
4
-
5
- ## 定位
6
-
7
- Agent DAG **recovery planning 是只读、派生、advisory** 的。`dag report` 与 `buildDagDecisionGateEvidence()` 从 `.harness/dag-runs/` 的 canonical facts 聚合 `normalizedFailureCategory` → `recoveryRecommendation`,供人工或 Decision Gate prompt 消费。
8
-
9
- Production Readiness v0.1 normalized DAG category 之上增加 product-line routing。Report doctor 输出应保留 raw DAG fact 并派生,不重写已完成 facts:
10
-
11
- ```text
12
- raw_failure_category
13
- dag_normalized_failure_category
14
- product_line_failure_category
15
- recommended_follow_up
16
- ```
17
-
18
- Product-line taxonomy 定义见 `docs/design/state-and-failure-taxonomy.md`。
19
-
20
- ### 前端设计门禁专用恢复路径
21
-
22
- 前端 DAG 的 design gate shell 失败(`frontend-first-design-gate-shell`、`frontend-final-design-gate-shell`、`frontend-design-gate-shell`)**不路由为 `ProductBug` / `dev-fix`**。此类失败固定路由为:
23
-
24
- - `productLineFailureCategory`: `ContractMismatch`
25
- - `recommendedFollowUp`: `frontend-plan-revision-and-rerun`
26
-
27
- 恢复动作由 `planDagRecovery` 根据实际的 `normalizedFailureCategory` 和 run status 决定(通常为 `rerun-after-fix` 或 `manual-review`),但 product-line 维度的分类确保 Task Pool 和 morning report 不会将其混入普通 bug backlog。
28
-
29
- **非目标(本 playbook 不覆盖、runner 不实现):**
30
-
31
- - 自动 retry / resume 节点执行
32
- - 修改 `completed/` 或 `paused/` 下的历史 run facts
33
- - `autoRetryEligible` 当作 runtime 触发器
34
- - 仅凭 recovery 派生字段自动 approve Decision Gate
35
-
36
- ## 快速命令
37
-
38
- ```bash
39
- cd .
40
-
41
- # 全局 runtime 健康(active/paused/completed 摘要 + healthIssues;advisoryOnly)
42
- npm run dev -- dag doctor
43
-
44
- # run 生命周期(approvalFlow、hasHumanApproval、nextRecommendedAction)
45
- npm run dev -- dag status --run-id <run-id>
46
-
47
- # 聚焦最新 paused run(--paused-latest --lifecycle paused --latest)
48
- npm run dev -- dag report --paused-latest [--json|--markdown]
49
-
50
- # 默认 compact Markdown 表格
51
- npm run dev -- dag report --run-id <run-id>
52
-
53
- # 机器可读 JSON(含 primaryFailure / primaryRecovery / downstreamSkippedNodes)
54
- npm run dev -- dag report --run-id <run-id> --json
55
-
56
- # 人类交接 Recovery Plan(四段结构化 Markdown)
57
- npm run dev -- dag report --run-id <run-id> --markdown
58
-
59
- # 过滤器
60
- npm run dev -- dag report --failed-only # 仅失败/需恢复
61
- npm run dev -- dag report --latest --failed-only # 最新一条需恢复 run
62
- npm run dev -- dag report --action retry-node # 按 primaryRecovery.action 筛选
63
- npm run dev -- dag report --lifecycle paused --action resume-or-reject
64
-
65
- # Decision Gate envelope dry-run(不 resume/retry;validate 无效时 exit 1)
66
- npm run dev -- dag decision inspect --run-id <run-id> [--node-id <node-id>]
67
- npm run dev -- dag decision validate --run-id <run-id> [--node-id <node-id>]
68
- ```
69
-
70
- ### Paused run operator 路径
71
-
72
- 1. `dag report --paused-latest --json` 或 `dag doctor` — 定位最新 paused run `primaryRecovery`
73
- 2. `dag status --run-id <id>` — 读 `approvalFlow`、`escalationArtifactPath`、`pendingNodes`
74
- 3. (可选)`dag decision validate --run-id <id>`envelope preflight
75
- 4. `dag approve --run-id <id> --option <option-id>` `dag resume --run-id <id>`;或 `dag reject --run-id <id> --reason "..."`
76
-
77
- 精确 approval 顺序见 [`agent-dag-runner.md`](agent-dag-runner.md) §Paused lifecycle。
78
-
79
- Decision Gate prompt 侧:`buildDagDecisionGateEvidence()`(`./src/core/dag-decision-evidence.ts`)从 `DagRunReportEntry` 生成 prompt-friendly 摘要,字段与 JSON report 对齐,**不**写回 run state
80
-
81
- ## `dag report --json` schema 锁定
82
-
83
- - **Schema 文件**:`docs/templates/agent-dag-report.schema.json`
84
- - **Envelope**:`{ schemaVersion: 1, runs: DagRunReportEntry[] }`
85
- - **稳定消费字段**(Decision Gate / tooling 应依赖):`primaryFailure`、`primaryRecovery`、`downstreamSkippedNodes`、`recoveryRecommendation`、`normalizedFailureCategory`;node 级 `decisionEnvelope`、`artifacts`;paused 级 `pausedByNodeId`、`pauseReason`
86
- - **测试**:`./test/dag-report.test.ts` §`dag report JSON schema contract` 对 fixture run 做 schema 校验
87
- - **变更策略**:breaking 字段变更须 bump `schemaVersion` 并同步 schema 文件与测试
88
-
89
- ## Recovery Action 枚举
90
-
91
- | Action | 含义 | 典型触发 |
92
- |--------|------|----------|
93
- | `none` | 无需恢复 | 成功完成 |
94
- | `monitor` | 进行中,等待结束 | `PENDING` / `RUNNING` |
95
- | `retry-node` | 修复瞬态条件后可重跑节点 | timeout;executor 瞬态(network/quota/rate-limit/unavailable) |
96
- | `rerun-after-fix` | 先修根因再重跑 | auth、validation、shell-command、static-error、非瞬态 executor |
97
- | `resume-or-reject` | 人工审批后继续或拒绝 | paused + decision-envelope / human-required |
98
- | `manual-review` | 人工审查后再定路径 | write-guardhuman-rejected、unknown、非 paused 的 decision-envelope |
99
- | `inspect-upstream` | 先查上游失败 | SKIPPED 下游节点 |
100
- | `unknown` | 未映射类别(不应出现在正常派生路径) | 内部兜底 |
101
-
102
- ## Product-Line Routing v0.1
103
-
104
- | Product-line category | Default follow-up |
105
- |---|---|
106
- | `SpecUnclear` | `spec-clarification` |
107
- | `ContractMismatch` | `architecture-contract-fix` |
108
- | `ProductBug` | `dev-fix` |
109
- | `TestBug` | `qa-fix-test` |
110
- | `EnvFailure` | `env-fix` 或 retry verify |
111
- | `FlakyTest` | `flaky-test-analysis` |
112
- | `RiskyChange` | `human-review` / `architecture-review` |
113
- | `DependencyFailure` | unblock dependency |
114
- | `NeedsHuman` | `human-review` |
115
- | `Unknown` | human triage |
116
-
117
- ## 类别 动作 operator 指引
118
-
119
- | Normalized category | Recovery action | Operator guidance | Anti-patterns |
120
- |---------------------|-----------------|-------------------|---------------|
121
- | `success` | `none` | 归档验收;按需 review artifacts | 对成功 run 发起 retry |
122
- | `timeout` | `retry-node` | 查日志/artifacts 确认瞬态;人工重跑节点 | 未查根因就循环重试;指望 runner 自动 retry |
123
- | `executor`(network/quota/rate-limit/unavailable) | `retry-node` | 等后端/配额恢复后重跑 | auth/validation 误判为瞬态 executor |
124
- | `executor`(其他 raw) | `rerun-after-fix` | executor.jsonl、node result | 盲目 retry 非瞬态 backend 错误 |
125
- | `auth` | `rerun-after-fix` | 更新 API key/凭证后重跑 | 在凭证未修复时 retry |
126
- | `write-guard` | `manual-review` | writeSet/writePolicyprompt、result.summary | read-only 节点写根 `artifacts/`;扩大 writeSet 掩盖违规 |
127
- | `validation` | `rerun-after-fix` | schema/output/test 后再跑 | 跳过验证直接 approve |
128
- | `shell-command` | `rerun-after-fix` | stdout/stderr、修命令或 repo 状态 | 只重跑 shell 不改命令 |
129
- | `static-error` | `rerun-after-fix` | static config 与 emitted markdown | LLM 节点 retry |
130
- | `decision-envelope`(paused) | `resume-or-reject` | `dag approve --run-id <id> --option <option-id>` / `dag reject --run-id <id> --reason "..."` → `dag resume --run-id <id>` | 未读 envelope approve;用 recovery 字段单独 auto-approve |
131
- | `decision-envelope`(非 paused) | `manual-review` | decision.envelope.json / validation artifact | 绕过 Decision Gate schema |
132
- | `human-required`(paused) | `resume-or-reject` | 提供人工输入approve/resume | escalation 未解决时 resume |
133
- | `human-required`(非 paused) | `manual-review` | 读 human-escalation artifacts | 忽略 `requiresHuman` |
134
- | `human-rejected` | `manual-review` | 修订 contract/source;**新 run** | 对同一 contract 自动 retry |
135
- | `skipped` | `inspect-upstream` | 修上游 ERROR/SKIPPED 再考虑下游 | 直接 retry SKIPPED 节点 |
136
- | `unknown` | `manual-review` | state.json、executor.jsonl、node artifacts | 假设 `autoRetryEligible` 会触发执行 |
137
-
138
- ## Handoff Recovery Plan 结构
139
-
140
- `dag report --markdown` 的 **Recovery Plan** 含四段(与 JSON 稳定字段一一对应):
141
-
142
- 1. **Primary Failure** `primaryFailure`(node 或 run scope)
143
- 2. **Recovery Action** — `primaryRecovery`(action、summary、reason、flags、commandHint)
144
- 3. **Blocked Downstream / Skipped Nodes** `downstreamSkippedNodes`
145
- 4. **Recommended Operator Action** — 面向 operator 的步骤摘要
146
-
147
- 保存 handoff 时重定向到平台临时目录或 `docs/reports/`,不要写入 `.harness/dag-runs/`。
148
-
149
- ## Decision Gate 消费约定
150
-
151
- 1. 优先 `dag report --json` 或 `buildDagDecisionGateEvidence()` 的 **verified** 派生摘要。
152
- 2. 映射到 `decision` / `nextAction` 须保守;recovery 证据是 **advisory only, not an execution directive**。
153
- 3. `autoRetryEligible: true` 仅表示「规划上可人工重试」,**不**触发 runner。
154
- 4. paused run 的人类路径仍是 M5 CLI:`dag approve --run-id <id> --option <option-id>` / `dag reject --run-id <id> --reason "..."` / `dag resume --run-id <id>`(见 [`agent-dag-runner.md`](agent-dag-runner.md) §Decision Gate)。
155
- 5. Envelope 干跑:`dag decision inspect|validate` 重解析 run facts;`validate` 无效时 exit 1;**不**写 artifact、**不** resume
156
-
157
- ## Active stale run recovery(advisory detection)
158
-
159
- `dag doctor` `dag status` 通过 `detectDagRunHealthIssues()` 检测 lifecycle 不一致,**不** mutate run facts。
160
-
161
- | Code | 典型场景 | operator 指引 |
162
- |------|----------|------------|
163
- | `terminal-in-active` | run 已完成但 `active/<run-id>/` 残留 | 对照 `completed/` canonical facts;手动 archive 或删除 stale 目录 |
164
- | `paused-in-active` | pause 后目录未迁至 `paused/` | `dag doctor` 诊断;修复 facts 后再 approve/resume |
165
- | `lifecycle-status-mismatch` | `paused/` status paused | 同上 |
166
- | `missing-approval-artifact` | approve artifact 缺失 | resume;re-approve restore artifact |
167
- | `non-terminal-in-completed` | completed 目录 status 异常 | manual-review only |
168
- | `run-id-mismatch` / `missing-state-json` | 目录损坏或命名错误 | Inspect;勿 auto-mutate completed facts |
169
-
170
- **Deferred runtime**:无 `dag recover apply` 或自动 cleanup;未来可能增加只读 `dag recover plan`(设计占位,未实现)。
171
-
172
- ## 事实源与边界
173
-
174
- | 类型 | 位置 | 规则 |
175
- |------|------|------|
176
- | Canonical run facts | `.harness/dag-runs/{active\|paused\|completed}/<run-id>/` | **只读**;report 不写回 |
177
- | 派生 report | stdout / 重定向文件 | 可随时再生 |
178
- | 工作块摘要 | `artifacts/` | 非 per-run 历史;read-only DAG 节点不得写 |
179
-
180
- ## 验证
181
-
182
- ```bash
183
- cd . && npx vitest run \
184
- test/dag-report.test.ts \
185
- test/dag-recovery-recommendation.test.ts \
186
- test/dag-decision-gate-recovery-dogfood.test.ts \
187
- test/dag-decision-evidence.test.ts \
188
- test/dag-decision-envelope.test.ts \
189
- test/dag-approve-resume.test.ts \
190
- test/cli-contract.test.ts
191
- ```
192
-
193
- 实现细节与映射逻辑:`./src/core/dag-recovery-recommendation.ts`、`dag-report.ts`、`dag-decision-evidence.ts`。
1
+ # Agent DAG Recovery Playbook(恢复手册)
2
+
3
+ > **关联**:[`agent-dag-runner.md`](agent-dag-runner.md)(CLI 与 run 语义)· [`templates/agent-dag-decision-gate.prompt.md`](templates/agent-dag-decision-gate.prompt.md)(Decision Gate 消费 recovery 证据)
4
+
5
+ ## 定位
6
+
7
+ Agent DAG **recovery planning 是只读、派生、advisory** 的。`dag report` 与 `buildDagDecisionGateEvidence()` 从 `.harness/dag-runs/` 的 canonical facts 聚合 `normalizedFailureCategory` → `recoveryRecommendation`,供人工或 Decision Gate prompt 消费。
8
+
9
+ 中断后不要从上游摘要手工生成 impl-only DAG。先修复 `.harness/tasks/<task-id>/source/` 或计划,再对同一 task 重新执行 `dag run-task`、严格 `dag validate` 和新的 `run-dag`。新生成的完整 DAG 会重新冻结 `sourceBinding` 并经过 contract/scout/plan/gate;v3 孤立 writer 如果既无来源绑定、也无只读 planner 上游,会被 strict governance 拒绝。完整规则见 [`design/dag-source-binding-and-recovery.md`](design/dag-source-binding-and-recovery.md)。
10
+
11
+ Production Readiness v0.1 在 normalized DAG category 之上增加 product-line routing。Report 与 doctor 输出应保留 raw DAG fact 并派生,不重写已完成 facts:
12
+
13
+ ```text
14
+ raw_failure_category
15
+ dag_normalized_failure_category
16
+ product_line_failure_category
17
+ recommended_follow_up
18
+ ```
19
+
20
+ Product-line taxonomy 定义见 `docs/design/state-and-failure-taxonomy.md`。
21
+
22
+ ### 前端设计门禁专用恢复路径
23
+
24
+ 前端 DAG 的 design gate shell 失败(`frontend-first-design-gate-shell`、`frontend-final-design-gate-shell`、`frontend-design-gate-shell`)**不路由为 `ProductBug` / `dev-fix`**。此类失败固定路由为:
25
+
26
+ - `productLineFailureCategory`: `ContractMismatch`
27
+ - `recommendedFollowUp`: `frontend-plan-revision-and-rerun`
28
+
29
+ 恢复动作由 `planDagRecovery` 根据实际的 `normalizedFailureCategory` 和 run status 决定(通常为 `rerun-after-fix` 或 `manual-review`),但 product-line 维度的分类确保 Task Pool 和 morning report 不会将其混入普通 bug backlog。
30
+
31
+ **非目标(本 playbook 不覆盖、runner 不实现):**
32
+
33
+ - 自动 retry / resume 节点执行
34
+ - 修改 `completed/` `paused/` 下的历史 run facts
35
+ - 把 `autoRetryEligible` 当作 runtime 触发器
36
+ - 仅凭 recovery 派生字段自动 approve Decision Gate
37
+
38
+ ## 快速命令
39
+
40
+ ```bash
41
+ cd .
42
+
43
+ # 全局 runtime 健康(active/paused/completed 摘要 + healthIssues;advisoryOnly)
44
+ npm run dev -- dag doctor
45
+
46
+ # 单 run 生命周期(approvalFlow、hasHumanApproval、nextRecommendedAction)
47
+ npm run dev -- dag status --run-id <run-id>
48
+
49
+ # 聚焦最新 paused run(--paused-latest ≡ --lifecycle paused --latest)
50
+ npm run dev -- dag report --paused-latest [--json|--markdown]
51
+
52
+ # 默认 compact Markdown 表格
53
+ npm run dev -- dag report --run-id <run-id>
54
+
55
+ # 机器可读 JSON(含 primaryFailure / primaryRecovery / downstreamSkippedNodes)
56
+ npm run dev -- dag report --run-id <run-id> --json
57
+
58
+ # 人类交接 Recovery Plan(四段结构化 Markdown)
59
+ npm run dev -- dag report --run-id <run-id> --markdown
60
+
61
+ # 过滤器
62
+ npm run dev -- dag report --failed-only # 仅失败/需恢复
63
+ npm run dev -- dag report --latest --failed-only # 最新一条需恢复 run
64
+ npm run dev -- dag report --action retry-node # 按 primaryRecovery.action 筛选
65
+ npm run dev -- dag report --lifecycle paused --action resume-or-reject
66
+
67
+ # Decision Gate envelope dry-run(不 resume/retry;validate 无效时 exit 1)
68
+ npm run dev -- dag decision inspect --run-id <run-id> [--node-id <node-id>]
69
+ npm run dev -- dag decision validate --run-id <run-id> [--node-id <node-id>]
70
+ ```
71
+
72
+ ### Paused run operator 路径
73
+
74
+ 1. `dag report --paused-latest --json` 或 `dag doctor` 定位最新 paused run 与 `primaryRecovery`
75
+ 2. `dag status --run-id <id>` `approvalFlow`、`escalationArtifactPath`、`pendingNodes`
76
+ 3. (可选)`dag decision validate --run-id <id>` — envelope preflight
77
+ 4. `dag approve --run-id <id> --option <option-id>` → `dag resume --run-id <id>`;或 `dag reject --run-id <id> --reason "..."`
78
+
79
+ 精确 approval 顺序见 [`agent-dag-runner.md`](agent-dag-runner.md) §Paused lifecycle
80
+
81
+ Decision Gate prompt 侧:`buildDagDecisionGateEvidence()`(`./src/core/dag-decision-evidence.ts`)从 `DagRunReportEntry` 生成 prompt-friendly 摘要,字段与 JSON report 对齐,**不**写回 run state。
82
+
83
+ ## `dag report --json` schema 锁定
84
+
85
+ - **Schema 文件**:`docs/templates/agent-dag-report.schema.json`
86
+ - **Envelope**:`{ schemaVersion: 1, runs: DagRunReportEntry[] }`
87
+ - **稳定消费字段**(Decision Gate / tooling 应依赖):`primaryFailure`、`primaryRecovery`、`downstreamSkippedNodes`、`recoveryRecommendation`、`normalizedFailureCategory`;node 级 `decisionEnvelope`、`artifacts`;paused `pausedByNodeId`、`pauseReason`
88
+ - **测试**:`./test/dag-report.test.ts` §`dag report JSON schema contract` 对 fixture run 做 schema 校验
89
+ - **变更策略**:breaking 字段变更须 bump `schemaVersion` 并同步 schema 文件与测试
90
+
91
+ ## Recovery Action 枚举
92
+
93
+ | Action | 含义 | 典型触发 |
94
+ |--------|------|----------|
95
+ | `none` | 无需恢复 | 成功完成 |
96
+ | `monitor` | 进行中,等待结束 | `PENDING` / `RUNNING` |
97
+ | `retry-node` | 修复瞬态条件后可重跑节点 | timeout;executor 瞬态(network/quota/rate-limit/unavailable) |
98
+ | `rerun-after-fix` | 先修根因再重跑 | auth、validation、shell-commandstatic-error、非瞬态 executor |
99
+ | `resume-or-reject` | 人工审批后继续或拒绝 | paused + decision-envelope / human-required |
100
+ | `manual-review` | 人工审查后再定路径 | write-guard、human-rejected、unknown、非 paused 的 decision-envelope |
101
+ | `inspect-upstream` | 先查上游失败 | SKIPPED 下游节点 |
102
+ | `unknown` | 未映射类别(不应出现在正常派生路径) | 内部兜底 |
103
+
104
+ ## Product-Line Routing v0.1
105
+
106
+ | Product-line category | Default follow-up |
107
+ |---|---|
108
+ | `SpecUnclear` | `spec-clarification` |
109
+ | `ContractMismatch` | `architecture-contract-fix` |
110
+ | `ProductBug` | `dev-fix` |
111
+ | `TestBug` | `qa-fix-test` |
112
+ | `EnvFailure` | `env-fix` retry verify |
113
+ | `FlakyTest` | `flaky-test-analysis` |
114
+ | `RiskyChange` | `human-review` / `architecture-review` |
115
+ | `DependencyFailure` | unblock dependency |
116
+ | `NeedsHuman` | `human-review` |
117
+ | `Unknown` | human triage |
118
+
119
+ ## 类别 动作 operator 指引
120
+
121
+ | Normalized category | Recovery action | Operator guidance | Anti-patterns |
122
+ |---------------------|-----------------|-------------------|---------------|
123
+ | `success` | `none` | 归档验收;按需 review artifacts | 对成功 run 发起 retry |
124
+ | `timeout` | `retry-node` | 查日志/artifacts 确认瞬态;人工重跑节点 | 未查根因就循环重试;指望 runner 自动 retry |
125
+ | `executor`(network/quota/rate-limit/unavailable) | `retry-node` | 等后端/配额恢复后重跑 | auth/validation 误判为瞬态 executor |
126
+ | `executor`(其他 raw) | `rerun-after-fix` | executor.jsonlnode result | 盲目 retry 非瞬态 backend 错误 |
127
+ | `auth` | `rerun-after-fix` | 更新 API key/凭证后重跑 | 在凭证未修复时 retry |
128
+ | `write-guard` | `manual-review` | writeSet/writePolicy、prompt、result.summary | read-only 节点写根 `artifacts/`;扩大 writeSet 掩盖违规 |
129
+ | `validation` | `rerun-after-fix` | schema/output/test 后再跑 | 跳过验证直接 approve |
130
+ | `shell-command` | `rerun-after-fix` | stdout/stderr、修命令或 repo 状态 | 只重跑 shell 不改命令 |
131
+ | `static-error` | `rerun-after-fix` | static config emitted markdown | LLM 节点 retry |
132
+ | `decision-envelope`(paused) | `resume-or-reject` | `dag approve --run-id <id> --option <option-id>` / `dag reject --run-id <id> --reason "..."` `dag resume --run-id <id>` | 未读 envelope approve;用 recovery 字段单独 auto-approve |
133
+ | `decision-envelope`(非 paused) | `manual-review` | 读 decision.envelope.json / validation artifact | 绕过 Decision Gate schema |
134
+ | `human-required`(paused) | `resume-or-reject` | 提供人工输入 → approve/resume | escalation 未解决时 resume |
135
+ | `human-required`(非 paused) | `manual-review` | human-escalation artifacts | 忽略 `requiresHuman` |
136
+ | `human-rejected` | `manual-review` | 修订 contract/source;**新 run** | 对同一 contract 自动 retry |
137
+ | `skipped` | `inspect-upstream` | 修上游 ERROR/SKIPPED 再考虑下游 | 直接 retry SKIPPED 节点 |
138
+ | `unknown` | `manual-review` | 读 state.json、executor.jsonl、node artifacts | 假设 `autoRetryEligible` 会触发执行 |
139
+
140
+ ## Handoff Recovery Plan 结构
141
+
142
+ `dag report --markdown` 的 **Recovery Plan** 含四段(与 JSON 稳定字段一一对应):
143
+
144
+ 1. **Primary Failure** `primaryFailure`(node run scope)
145
+ 2. **Recovery Action** — `primaryRecovery`(action、summary、reason、flags、commandHint)
146
+ 3. **Blocked Downstream / Skipped Nodes** — `downstreamSkippedNodes`
147
+ 4. **Recommended Operator Action** — 面向 operator 的步骤摘要
148
+
149
+ 保存 handoff 时重定向到平台临时目录或 `docs/reports/`,不要写入 `.harness/dag-runs/`。
150
+
151
+ ## Decision Gate 消费约定
152
+
153
+ 1. 优先 `dag report --json` `buildDagDecisionGateEvidence()` 的 **verified** 派生摘要。
154
+ 2. 映射到 `decision` / `nextAction` 须保守;recovery 证据是 **advisory only, not an execution directive**。
155
+ 3. `autoRetryEligible: true` 仅表示「规划上可人工重试」,**不**触发 runner
156
+ 4. paused run 的人类路径仍是 M5 CLI:`dag approve --run-id <id> --option <option-id>` / `dag reject --run-id <id> --reason "..."` / `dag resume --run-id <id>`(见 [`agent-dag-runner.md`](agent-dag-runner.md) §Decision Gate)。
157
+ 5. Envelope 干跑:`dag decision inspect|validate` 重解析 run facts;`validate` 无效时 exit 1;**不**写 artifact、**不** resume。
158
+
159
+ ## Active stale run recovery(advisory detection)
160
+
161
+ `dag doctor` `dag status` 通过 `detectDagRunHealthIssues()` 检测 lifecycle 不一致,**不** mutate run facts。
162
+
163
+ | Code | 典型场景 | operator 指引 |
164
+ |------|----------|------------|
165
+ | `terminal-in-active` | run 已完成但 `active/<run-id>/` 残留 | 对照 `completed/` canonical facts;手动 archive 或删除 stale 目录 |
166
+ | `paused-in-active` | pause 后目录未迁至 `paused/` | `dag doctor` 诊断;修复 facts 后再 approve/resume |
167
+ | `lifecycle-status-mismatch` | `paused/` status paused | 同上 |
168
+ | `missing-approval-artifact` | approve 后 artifact 缺失 | resume;re-approve restore artifact |
169
+ | `non-terminal-in-completed` | completed 目录 status 异常 | manual-review only |
170
+ | `run-id-mismatch` / `missing-state-json` | 目录损坏或命名错误 | Inspect;勿 auto-mutate completed facts |
171
+
172
+ **Deferred runtime**:无 `dag recover apply` 或自动 cleanup;未来可能增加只读 `dag recover plan`(设计占位,未实现)。
173
+
174
+ ## 事实源与边界
175
+
176
+ | 类型 | 位置 | 规则 |
177
+ |------|------|------|
178
+ | Canonical run facts | `.harness/dag-runs/{active\|paused\|completed}/<run-id>/` | **只读**;report 不写回 |
179
+ | 派生 report | stdout / 重定向文件 | 可随时再生 |
180
+ | 工作块摘要 | 根 `artifacts/` | 非 per-run 历史;read-only DAG 节点不得写 |
181
+
182
+ ## 验证
183
+
184
+ ```bash
185
+ cd . && npx vitest run \
186
+ test/dag-report.test.ts \
187
+ test/dag-recovery-recommendation.test.ts \
188
+ test/dag-decision-gate-recovery-dogfood.test.ts \
189
+ test/dag-decision-evidence.test.ts \
190
+ test/dag-decision-envelope.test.ts \
191
+ test/dag-approve-resume.test.ts \
192
+ test/cli-contract.test.ts
193
+ ```
194
+
195
+ 实现细节与映射逻辑:`./src/core/dag-recovery-recommendation.ts`、`dag-report.ts`、`dag-decision-evidence.ts`。
@@ -1,67 +1,67 @@
1
- # Agent DAG Runner
2
-
3
- Agent DAG 是 loop-agent 的声明式编排 runtime。DAG 将工作拆为节点、按序执行 eligible ranks、记录 artifacts,并用 gate 做 review 与验证。
4
-
5
- ## 基本用法
6
-
7
- ```bash
8
- loop-agent dag run-task <task-id> --profile auto --strict-models --output <temp-dir>/<task-id>-dag.json
9
- loop-agent dag validate --dag <temp-dir>/<task-id>-dag.json --strict-models --strict-governance
10
- loop-agent run-dag --dag <temp-dir>/<task-id>-dag.json --cwd .
11
- ```
12
-
13
- `<temp-dir>` 为平台原生临时目录。Windows 上 `--output`、`--dag`、`--cwd` 的实际值用原生路径。
14
-
15
- ## Executors
16
-
17
- - `static`:确定性生成的 artifacts 或 notes
18
- - `shell`:验证与文件系统检查
19
- - `pi`:规划、review、诊断;节点设 `toolProfile: "write"` 时有界写入
20
-
21
- ## Retry (read-only Pi nodes)
22
-
23
- planner/scout/reviewer/verifier/closeout 角色的只读 Pi 节点可声明 opt-in `retryPolicy`,用于在同一 run 内有界重试模型连接中断、provider 限流、临时不可用或请求 timeout。生成器会为这些安全节点自动声明默认策略:总尝试次数 3(手工配置上限 5),指数退避,单次等待上限 30s。
24
-
25
- - 仅以下原始失败分类默认可重试:`timeout`、`network`、`rate-limit`、`unavailable`。
26
- - `quota`、`auth`、`invalid-output`、`write-guard`、`decision-envelope` 与未知失败不重试。`quota` 不是 rate limit,不会被自动重试。
27
- - 资格由确定性 helper 判断:仅 `writePolicy=read-only|none`(或 Pi 默认只读)的 planner/scout/reviewer/verifier/closeout 可用。supervisor、implementer、writer(`toolProfile=write` 或 `writePolicy=exclusive`)、docs-only、dynamic、shell、static 与 decision-gate 节点一律不重试,DAG validation 会拒绝其策略。
28
- - 每次 attempt 写入独立不可变证据(`<node-id>/attempt-<n>.json`,run-relative path),最终 node record 的 `attempts` 字段引用完整 attempt 历史;后一次成功不会覆盖前一次失败证据。
29
- - 重试期间复用同一 run、controller identity、skill snapshot、prompt、model 与上游输入。节点终态的 `durationMs`、`tokensUsed`、`parsedEvents` 聚合全部 attempts;退避等待会刷新 `lastActivityAt`,避免被误判为 node-quiet。当前退避会占用该节点所在的并发槽。
30
-
31
- 示例:
32
-
33
- ```json
34
- {
35
- "retryPolicy": {
36
- "maxAttempts": 3,
37
- "backoff": "exponential",
38
- "initialDelayMs": 2000,
39
- "maxDelayMs": 30000,
40
- "retryCategories": ["timeout", "network", "rate-limit", "unavailable"]
41
- }
42
- }
43
- ```
44
-
45
- 未声明 `retryPolicy` 的历史 DAG 行为不变(单次执行、无 `attempts` 字段,也不新增 attempt artifact)。
46
-
47
- ## Skills
48
-
49
- DAG spec 可声明 `defaults.skills`、`skillsByRole` 与节点级 `skills`。Runner 优先从目标项目 `.agents/skills/<skill-name>/SKILL.md` 解析本地指令,再回退到包内 `skills/`,并在各节点 `skills.json` artifact 中记录解析元数据。
50
-
51
- 执行前可用 `dag validate --strict-skills` 做 opt-in skill audit;该门禁会在 missing/error/truncated skill 或 unresolved reference 出现时失败。默认 role skill 应来自 `docs/skills/vetted-skill-registry.md` 中记录的 repo-local wrapper。
52
-
53
- 目标项目的 `loop-agent` skill 位于 `.agents/skills/loop-agent/SKILL.md`。loop-agent 源仓库和 npm 包内置版本仍位于 `skills/loop-agent/SKILL.md`;遗留根路径 `skill/SKILL.md` 仅为旧 worktree 保留兼容 fallback。
54
-
55
- ## Artifacts
56
-
57
- DAG artifacts 位于:
58
-
59
- ```text
60
- .harness/dag-runs/<state>/<run-id>/artifacts/<node-id>/
61
- ```
62
-
63
- 根目录 `artifacts/` 不是有效的默认 DAG artifact 位置。
64
-
65
- ## Shell Gates
66
-
67
- - `shell.verdictGate` 从注入的当前 run 目录读取 `$HARNESS_DAG_RUN_DIR/<fromNodeId>.json`;不应自行发现 active run paths。
1
+ # Agent DAG Runner
2
+
3
+ Agent DAG 是 loop-agent 的声明式编排 runtime。DAG 将工作拆为节点、按序执行 eligible ranks、记录 artifacts,并用 gate 做 review 与验证。
4
+
5
+ ## 基本用法
6
+
7
+ ```bash
8
+ loop-agent dag run-task <task-id> --profile auto --strict-models --output <temp-dir>/<task-id>-dag.json
9
+ loop-agent dag validate --dag <temp-dir>/<task-id>-dag.json --strict-models --strict-governance
10
+ loop-agent run-dag --dag <temp-dir>/<task-id>-dag.json --cwd .
11
+ ```
12
+
13
+ `<temp-dir>` 为平台原生临时目录。Windows 上 `--output`、`--dag`、`--cwd` 的实际值用原生路径。
14
+
15
+ ## Executors
16
+
17
+ - `static`:确定性生成的 artifacts 或 notes
18
+ - `shell`:验证与文件系统检查
19
+ - `pi`:规划、review、诊断;节点设 `toolProfile: "write"` 时有界写入
20
+
21
+ ## Retry (read-only Pi nodes)
22
+
23
+ planner/scout/reviewer/verifier/closeout 角色的只读 Pi 节点可声明 opt-in `retryPolicy`,用于在同一 run 内有界重试模型连接中断、provider 限流、临时不可用或请求 timeout。生成器会为这些安全节点自动声明默认策略:总尝试次数 3(手工配置上限 5),指数退避,单次等待上限 30s。
24
+
25
+ - 仅以下原始失败分类默认可重试:`timeout`、`network`、`rate-limit`、`unavailable`。
26
+ - `quota`、`auth`、`invalid-output`、`write-guard`、`decision-envelope` 与未知失败不重试。`quota` 不是 rate limit,不会被自动重试。
27
+ - 资格由确定性 helper 判断:仅 `writePolicy=read-only|none`(或 Pi 默认只读)的 planner/scout/reviewer/verifier/closeout 可用。supervisor、implementer、writer(`toolProfile=write` 或 `writePolicy=exclusive`)、docs-only、dynamic、shell、static 与 decision-gate 节点一律不重试,DAG validation 会拒绝其策略。
28
+ - 每次 attempt 写入独立不可变证据(`<node-id>/attempt-<n>.json`,run-relative path),最终 node record 的 `attempts` 字段引用完整 attempt 历史;后一次成功不会覆盖前一次失败证据。
29
+ - 重试期间复用同一 run、controller identity、skill snapshot、prompt、model 与上游输入。节点终态的 `durationMs`、`tokensUsed`、`parsedEvents` 聚合全部 attempts;退避等待会刷新 `lastActivityAt`,避免被误判为 node-quiet。当前退避会占用该节点所在的并发槽。
30
+
31
+ 示例:
32
+
33
+ ```json
34
+ {
35
+ "retryPolicy": {
36
+ "maxAttempts": 3,
37
+ "backoff": "exponential",
38
+ "initialDelayMs": 2000,
39
+ "maxDelayMs": 30000,
40
+ "retryCategories": ["timeout", "network", "rate-limit", "unavailable"]
41
+ }
42
+ }
43
+ ```
44
+
45
+ 未声明 `retryPolicy` 的历史 DAG 行为不变(单次执行、无 `attempts` 字段,也不新增 attempt artifact)。
46
+
47
+ ## Skills
48
+
49
+ DAG spec 可声明 `defaults.skills`、`skillsByRole` 与节点级 `skills`。Runner 优先从目标项目 `.agents/skills/<skill-name>/SKILL.md` 解析本地指令,再回退到包内 `skills/`,并在各节点 `skills.json` artifact 中记录解析元数据。
50
+
51
+ 执行前可用 `dag validate --strict-skills` 做 opt-in skill audit;该门禁会在 missing/error/truncated skill 或 unresolved reference 出现时失败。默认 role skill 应来自 `docs/skills/vetted-skill-registry.md` 中记录的 repo-local wrapper。
52
+
53
+ 目标项目的 `loop-agent` skill 位于 `.agents/skills/loop-agent/SKILL.md`。loop-agent 源仓库和 npm 包内置版本仍位于 `skills/loop-agent/SKILL.md`;遗留根路径 `skill/SKILL.md` 仅为旧 worktree 保留兼容 fallback。
54
+
55
+ ## Artifacts
56
+
57
+ DAG artifacts 位于:
58
+
59
+ ```text
60
+ .harness/dag-runs/<state>/<run-id>/artifacts/<node-id>/
61
+ ```
62
+
63
+ 根目录 `artifacts/` 不是有效的默认 DAG artifact 位置。
64
+
65
+ ## Shell Gates
66
+
67
+ - `shell.verdictGate` 从注入的当前 run 目录读取 `$HARNESS_DAG_RUN_DIR/<fromNodeId>.json`;不应自行发现 active run paths。
@@ -1,26 +1,26 @@
1
- # 架构文档索引
2
-
3
- 本目录是 loop-agent 维护者架构文档入口。每篇文档回答一个具体问题,不重复 `runtime-boundaries.md` 的依赖方向表与 governance-hook 表;遇到契约级事实请回到该文件。
4
-
5
- ## 阅读路径
6
-
7
- 建议按以下顺序阅读——先全景,再主路径,再边界/事实,最后路线:
8
-
9
- 1. `runtime-boundaries.md` — runtime 层边界、依赖方向与治理 hook 的机器校验契约(**先读,是其他文档的边界真源**)。
10
- 2. `system-overview.md` — loop-agent / agent-worker / 治理层 / 外部系统的全景关系。
11
- 3. `dag-execution.md` — Agent DAG 主调用链、rank 调度、executor、skill snapshot、生命周期。
12
- 4. `worker-and-feature.md` — agent-worker 子进程边界、controller identity、Task Pool、Feature 与 Observe。
13
- 5. `facts-and-state.md` — `.harness/` 各根目录、canonical facts、derived read models 与不可变规则。
14
- 6. `evolution.md` — 当前已实现能力 vs 第 3–6 月未来方向(明确标注规划/未实现)。
15
-
16
- ## 事实与规划的区分
17
-
18
- - **当前事实源**:`src/` 源码、发布 CLI、`docs/exec-plans/completed/`、`docs/reports/current-capability-summary.md`、ADR 0001–0003。
19
- - **规划/设计输入**:`docs/design/`(含 `dynamic-workflow-dag-engine-roadmap.md`、`六个月规划.md`)。这些文件已带 2026-07-14 校准条;凡未兑现的 phase 段落是设计输入,**不是**已实现证明。
20
- - 凡本目录文档描述未来能力,一律使用「规划 / 未实现 / 前瞻」标签。
21
-
22
- ## 与其他文档的分工
23
-
24
- - 本目录不复制 `runtime-boundaries.md` 的 import 方向表、governance-hook 表与版本化自举边界表,只交叉引用。
25
- - 用法与操作说明在 `website/docs/`(使用者双树),不在本目录重复。
26
- - 本目录文档随发布包发布(npm `files` 显式条目 + `docs/init-surface.manifest.json` `packageRequired`),但 **不**投影到目标项目 init surface;目标项目 init 仍只投影语言无关的 `runtime-boundaries.md`。
1
+ # 架构文档索引
2
+
3
+ 本目录是 loop-agent 维护者架构文档入口。每篇文档回答一个具体问题,不重复 `runtime-boundaries.md` 的依赖方向表与 governance-hook 表;遇到契约级事实请回到该文件。
4
+
5
+ ## 阅读路径
6
+
7
+ 建议按以下顺序阅读——先全景,再主路径,再边界/事实,最后路线:
8
+
9
+ 1. `runtime-boundaries.md` — runtime 层边界、依赖方向与治理 hook 的机器校验契约(**先读,是其他文档的边界真源**)。
10
+ 2. `system-overview.md` — loop-agent / agent-worker / 治理层 / 外部系统的全景关系。
11
+ 3. `dag-execution.md` — Agent DAG 主调用链、rank 调度、executor、skill snapshot、生命周期。
12
+ 4. `worker-and-feature.md` — agent-worker 子进程边界、controller identity、Task Pool、Feature 与 Observe。
13
+ 5. `facts-and-state.md` — `.harness/` 各根目录、canonical facts、derived read models 与不可变规则。
14
+ 6. `evolution.md` — 当前已实现能力 vs 第 3–6 月未来方向(明确标注规划/未实现)。
15
+
16
+ ## 事实与规划的区分
17
+
18
+ - **当前事实源**:`src/` 源码、发布 CLI、`docs/exec-plans/completed/`、`docs/reports/current-capability-summary.md`、ADR 0001–0003。
19
+ - **规划/设计输入**:`docs/design/`(含 `dynamic-workflow-dag-engine-roadmap.md`、`六个月规划.md`)。这些文件已带 2026-07-14 校准条;凡未兑现的 phase 段落是设计输入,**不是**已实现证明。
20
+ - 凡本目录文档描述未来能力,一律使用「规划 / 未实现 / 前瞻」标签。
21
+
22
+ ## 与其他文档的分工
23
+
24
+ - 本目录不复制 `runtime-boundaries.md` 的 import 方向表、governance-hook 表与版本化自举边界表,只交叉引用。
25
+ - 用法与操作说明在 `website/docs/`(使用者双树),不在本目录重复。
26
+ - 本目录文档随发布包发布(npm `files` 显式条目 + `docs/init-surface.manifest.json` `packageRequired`),但 **不**投影到目标项目 init surface;目标项目 init 仍只投影语言无关的 `runtime-boundaries.md`。