@tea-agent/loop-agent 0.13.0 → 0.14.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 (270) hide show
  1. package/AGENTS.md +157 -157
  2. package/CHANGELOG.md +73 -301
  3. package/README.md +338 -334
  4. package/bin/agent-worker.js +22 -22
  5. package/bin/loop-agent.js +21 -21
  6. package/dist/commands/cursor-prompt.js +6 -6
  7. package/dist/commands/init.js +505 -505
  8. package/dist/commands/loop-benchmark.js +11 -11
  9. package/dist/commands/pi-reuse-benchmark.js +16 -16
  10. package/dist/executors/pi-event-serializer.js +33 -11
  11. package/dist/sidecars/cursor-prompt/executor.js +1 -1
  12. package/dist/task/runtime.js +27 -27
  13. package/dist/worker/observe/spec-evidence.js +19 -10
  14. package/dist/worker/observe/static/api.js +46 -46
  15. package/dist/worker/observe/static/app.js +151 -150
  16. package/dist/worker/observe/static/constants.js +156 -148
  17. package/dist/worker/observe/static/copy.js +67 -67
  18. package/dist/worker/observe/static/dag-helpers.js +201 -172
  19. package/dist/worker/observe/static/dag-layout.d.ts +31 -31
  20. package/dist/worker/observe/static/dag-layout.js +83 -83
  21. package/dist/worker/observe/static/dag-model.js +72 -72
  22. package/dist/worker/observe/static/dom.js +122 -122
  23. package/dist/worker/observe/static/format-pool.d.ts +71 -0
  24. package/dist/worker/observe/static/format-pool.js +134 -67
  25. package/dist/worker/observe/static/format.js +317 -292
  26. package/dist/worker/observe/static/index.html +350 -308
  27. package/dist/worker/observe/static/kpi.js +100 -94
  28. package/dist/worker/observe/static/markdown-render.js +124 -0
  29. package/dist/worker/observe/static/relations.js +133 -133
  30. package/dist/worker/observe/static/router.js +93 -93
  31. package/dist/worker/observe/static/run-processing.js +148 -148
  32. package/dist/worker/observe/static/shell-chrome.js +74 -68
  33. package/dist/worker/observe/static/state.js +273 -267
  34. package/dist/worker/observe/static/styles.css +2504 -1902
  35. package/dist/worker/observe/static/views/batch.js +227 -227
  36. package/dist/worker/observe/static/views/dag-graph.js +172 -172
  37. package/dist/worker/observe/static/views/dag-inspector.js +530 -627
  38. package/dist/worker/observe/static/views/dag.js +371 -371
  39. package/dist/worker/observe/static/views/dashboard.js +86 -100
  40. package/dist/worker/observe/static/views/failures.js +143 -143
  41. package/dist/worker/observe/static/views/feature.js +492 -492
  42. package/dist/worker/observe/static/views/pool.js +708 -350
  43. package/dist/worker/observe/static/views/run.js +453 -453
  44. package/dist/worker/observe/static/views/session-timeline.js +771 -219
  45. package/dist/worker/observe/static/views/shell.js +7 -7
  46. package/dist/worker/observe/static/views/task.js +314 -314
  47. package/dist/worker/observe/static/views/timeline.js +163 -163
  48. package/dist/workflows/dag/canvas-observer.js +275 -275
  49. package/docs/README.md +105 -104
  50. package/docs/agent-dag-recovery-playbook.md +195 -195
  51. package/docs/agent-dag-runner.md +67 -67
  52. package/docs/architecture/README.md +26 -26
  53. package/docs/architecture/dag-execution.md +140 -140
  54. package/docs/architecture/evolution.md +54 -54
  55. package/docs/architecture/facts-and-state.md +71 -71
  56. package/docs/architecture/runtime-boundaries.md +191 -191
  57. package/docs/architecture/system-overview.md +93 -93
  58. package/docs/architecture/worker-and-feature.md +85 -85
  59. package/docs/cursor-prompt-sidecar.md +36 -36
  60. package/docs/decisions/README.md +18 -18
  61. package/docs/design/README.md +167 -167
  62. package/docs/development-principles.md +73 -73
  63. package/docs/exec-plans/README.md +6 -6
  64. package/docs/exec-plans/active/README.md +2 -1
  65. package/docs/exec-plans/completed/README.md +105 -104
  66. package/docs/feature-workflow.md +414 -414
  67. package/docs/harness-methodology-debugging.md +153 -153
  68. package/docs/harness-methodology-tdd.md +130 -130
  69. package/docs/harness-methodology-verification.md +27 -27
  70. package/docs/init-surface.manifest.json +307 -307
  71. package/docs/loop-agent-harness.md +142 -142
  72. package/docs/production-readiness.md +96 -96
  73. package/docs/progress/README.md +59 -58
  74. package/docs/reports/README.md +123 -119
  75. package/docs/skills/README.md +7 -7
  76. package/docs/skills/vetted-skill-registry.md +29 -29
  77. package/docs/templates/adr.md +60 -60
  78. package/docs/templates/agent-dag-authority-surface-audit.prompt.md +94 -94
  79. package/docs/templates/agent-dag-decision-envelope.schema.json +213 -213
  80. package/docs/templates/agent-dag-decision-gate-dogfood-report.md +117 -117
  81. package/docs/templates/agent-dag-decision-gate.prompt.md +246 -246
  82. package/docs/templates/agent-dag-process-supervisor.prompt.md +98 -98
  83. package/docs/templates/agent-dag-report.schema.json +473 -473
  84. package/docs/templates/agent-dag-review-verdict.prompt.md +68 -68
  85. package/docs/templates/agent-dag.base.json +190 -190
  86. package/docs/templates/agent-dag.final-verification.json +185 -185
  87. package/docs/templates/agent-dag.schema.json +411 -411
  88. package/docs/templates/agent-dag.supervised-implementation.json +620 -620
  89. package/docs/templates/backend-test-analysis.schema.json +44 -44
  90. package/docs/templates/backend-test-case-manifest.schema.json +190 -190
  91. package/docs/templates/backend-test-dag.classify.prompt.md +75 -75
  92. package/docs/templates/backend-test-dag.generate-pytest.prompt.md +204 -204
  93. package/docs/templates/backend-test-dag.json +559 -559
  94. package/docs/templates/backend-test-dag.retrospect.prompt.md +139 -139
  95. package/docs/templates/backend-test-dag.review-cases.prompt.md +83 -83
  96. package/docs/templates/backend-test-execution.schema.json +133 -133
  97. package/docs/templates/backend-test-result.schema.json +99 -99
  98. package/docs/templates/exec-plan.md +64 -64
  99. package/docs/templates/feature-spec.md +53 -53
  100. package/docs/templates/frontend-design-contract.md +42 -42
  101. package/docs/templates/frontend-eval/fixtures/failures/01-type-build-error.md +17 -17
  102. package/docs/templates/frontend-eval/fixtures/failures/02-unit-component-test-fail.md +16 -16
  103. package/docs/templates/frontend-eval/fixtures/failures/03-fixture-schema-drift.md +16 -16
  104. package/docs/templates/frontend-eval/fixtures/failures/04-missing-loading-empty-error-state.md +16 -16
  105. package/docs/templates/frontend-eval/fixtures/failures/05-forbidden-write-writeset-expansion.md +16 -16
  106. package/docs/templates/frontend-eval/fixtures/failures/06-unapproved-dependency-add.md +16 -16
  107. package/docs/templates/frontend-eval/fixtures/failures/07-mock-production-on.md +21 -21
  108. package/docs/templates/frontend-eval/fixtures/functional/01-simple-component-style.md +29 -29
  109. package/docs/templates/frontend-eval/fixtures/functional/02-form-validation.md +28 -28
  110. package/docs/templates/frontend-eval/fixtures/functional/03-list-detail-page.md +28 -28
  111. package/docs/templates/frontend-eval/fixtures/functional/04-api-mock.md +29 -29
  112. package/docs/templates/frontend-eval/fixtures/functional/05-permission-auth-gated-ui.md +27 -27
  113. package/docs/templates/frontend-eval/fixtures/functional/06-ssr-server-client-boundary.md +28 -28
  114. package/docs/templates/frontend-eval/fixtures/functional/07-shared-public-component-api.md +28 -28
  115. package/docs/templates/frontend-eval/fixtures/functional/08-pure-local-no-remote.md +27 -27
  116. package/docs/templates/frontend-eval/metrics.md +138 -138
  117. package/docs/templates/frontend-eval/smoke-targets.md +53 -53
  118. package/docs/templates/frontend-implementation-contract.schema.json +27 -27
  119. package/docs/templates/frontend-task-constraints.md +35 -35
  120. package/docs/templates/frontend-task-requirement.md +70 -70
  121. package/docs/templates/frontend-test-dag.generate-cases.prompt.md +5 -5
  122. package/docs/templates/frontend-test-dag.json +23 -23
  123. package/docs/templates/frontend-test-dag.retrieve-context.prompt.md +3 -3
  124. package/docs/templates/frontend-test-dag.retrospect.prompt.md +3 -3
  125. package/docs/templates/frontend-test-dag.review-cases.prompt.md +3 -3
  126. package/docs/templates/frontend-test-dag.review-execution.prompt.md +3 -3
  127. package/docs/templates/harness.schema.json +221 -221
  128. package/docs/templates/hybrid-dag.json +188 -188
  129. package/docs/templates/init-evolution-review.md +35 -35
  130. package/docs/templates/interactive-ui-round2-experiment.md +66 -66
  131. package/docs/templates/knowledge-graph-bootstrap-dag.json +118 -118
  132. package/docs/templates/knowledge-sync-dag.json +178 -178
  133. package/docs/templates/knowledge-sync-draft.schema.json +71 -71
  134. package/docs/templates/product-line/AGENTS.md +8 -8
  135. package/docs/templates/product-line/README.md +9 -9
  136. package/docs/templates/product-line/acceptance.yaml +14 -14
  137. package/docs/templates/product-line/closeout.yaml +9 -9
  138. package/docs/templates/product-line/design.md +13 -13
  139. package/docs/templates/product-line/links.md +10 -10
  140. package/docs/templates/product-line/requirement.md +17 -17
  141. package/docs/templates/product-line/task-graph.yaml +15 -15
  142. package/docs/templates/product-line/task.yaml +64 -64
  143. package/docs/templates/product-line/test-plan.md +7 -7
  144. package/docs/templates/production-readiness-checklist.md +57 -57
  145. package/docs/templates/progress-log.md +17 -17
  146. package/docs/templates/project-start-checklist.md +9 -9
  147. package/docs/templates/qa-report.md +48 -48
  148. package/docs/templates/sprint-contract.md +29 -29
  149. package/docs/templates/worker-dogfood-evidence.md +80 -80
  150. package/docs/templates/worker-dogfood-setup.md +68 -68
  151. package/docs/verification-matrix.md +70 -70
  152. package/examples/decision-gate-agent-dag.json +173 -173
  153. package/examples/example-dag.json +46 -46
  154. package/examples/hybrid-loop-agent-dag.json +188 -188
  155. package/harness.json +66 -66
  156. package/package.json +88 -52
  157. package/scripts/check-product-line-docs.sh +29 -29
  158. package/scripts/check-task-pool-root.sh +32 -32
  159. package/scripts/kb-bootstrap-init-skeleton.sh +240 -240
  160. package/scripts/kb-graph-incremental-prepare.mjs +386 -386
  161. package/scripts/kb-graph-incremental-prepare.sh +5 -5
  162. package/scripts/kb-graph-materialize.mjs +105 -105
  163. package/scripts/kb-graph-materialize.sh +4 -4
  164. package/scripts/kb-graph-promote.mjs +164 -164
  165. package/scripts/kb-graph-promote.sh +4 -4
  166. package/scripts/kb-query.mjs +554 -554
  167. package/scripts/kb-query.sh +5 -5
  168. package/skills/agent-worker/SKILL.md +39 -39
  169. package/skills/agent-worker/references/agent-worker-operator.md +60 -60
  170. package/skills/ai-engineering-context/SKILL.md +48 -48
  171. package/skills/analyze-product-dependencies/SKILL.md +67 -67
  172. package/skills/analyze-product-dependencies/agents/openai.yaml +4 -4
  173. package/skills/analyze-product-dependencies/references/api-documentation-schema.md +30 -30
  174. package/skills/analyze-product-dependencies/references/dependency-analysis-schema.md +28 -28
  175. package/skills/analyze-product-dependencies/references/example.md +76 -76
  176. package/skills/analyze-product-dependencies/references/forward-test-cases.md +35 -35
  177. package/skills/analyze-product-dependencies/references/input-contract.md +11 -11
  178. package/skills/analyze-product-dependencies/references/scouting-rules.md +61 -61
  179. package/skills/analyze-product-dependencies/scripts/test-validators.mjs +267 -267
  180. package/skills/analyze-product-dependencies/scripts/validate-api-documentation.mjs +101 -101
  181. package/skills/analyze-product-dependencies/scripts/validate-dependency-analysis.mjs +142 -142
  182. package/skills/analyze-product-dependencies/scripts/validate-product-requirement-input.mjs +76 -76
  183. package/skills/analyze-product-dependencies/scripts/validation-helpers.mjs +146 -146
  184. package/skills/analyze-product-requirements/SKILL.md +90 -90
  185. package/skills/analyze-product-requirements/agents/openai.yaml +4 -4
  186. package/skills/analyze-product-requirements/references/acceptance-criteria.md +91 -91
  187. package/skills/analyze-product-requirements/references/clarification-and-knowledge.md +56 -56
  188. package/skills/analyze-product-requirements/references/example.md +86 -86
  189. package/skills/analyze-product-requirements/references/forward-test-cases.md +66 -66
  190. package/skills/analyze-product-requirements/references/product-analysis-schema.md +32 -32
  191. package/skills/analyze-product-requirements/references/product-requirement-schema.md +33 -33
  192. package/skills/analyze-product-requirements/references/requirement-clarification-schema.md +35 -35
  193. package/skills/analyze-product-requirements/scripts/test-validators.mjs +193 -193
  194. package/skills/analyze-product-requirements/scripts/validate-product-analysis.mjs +69 -69
  195. package/skills/analyze-product-requirements/scripts/validate-product-requirement.mjs +97 -97
  196. package/skills/analyze-product-requirements/scripts/validate-requirement-clarification.mjs +98 -98
  197. package/skills/analyze-product-requirements/scripts/validation-helpers.mjs +156 -156
  198. package/skills/browser-tools/SKILL.md +196 -196
  199. package/skills/browser-tools/browser-content.js +103 -103
  200. package/skills/browser-tools/browser-cookies.js +35 -35
  201. package/skills/browser-tools/browser-eval.js +53 -53
  202. package/skills/browser-tools/browser-hn-scraper.js +108 -108
  203. package/skills/browser-tools/browser-nav.js +44 -44
  204. package/skills/browser-tools/browser-pick.js +162 -162
  205. package/skills/browser-tools/browser-screenshot.js +34 -34
  206. package/skills/browser-tools/browser-start.js +86 -86
  207. package/skills/browser-tools/package-lock.json +2556 -2556
  208. package/skills/browser-tools/package.json +19 -19
  209. package/skills/code-review-core/SKILL.md +20 -20
  210. package/skills/codebase-scout/SKILL.md +19 -19
  211. package/skills/frontend-design-review/SKILL.md +66 -66
  212. package/skills/frontend-design-review/references/review-checklist.md +58 -58
  213. package/skills/frontend-implementation/SKILL.md +49 -49
  214. package/skills/frontend-implementation/references/code-standards.md +32 -32
  215. package/skills/frontend-implementation/references/design-spec.md +46 -46
  216. package/skills/frontend-implementation/references/node-contracts.md +27 -27
  217. package/skills/frontend-review/SKILL.md +59 -59
  218. package/skills/frontend-review/references/review-findings.md +47 -47
  219. package/skills/frontend-verification/SKILL.md +53 -53
  220. package/skills/frontend-verification/references/verification-checklist.md +68 -68
  221. package/skills/grill-me/SKILL.md +10 -10
  222. package/skills/grill-with-docs/SKILL.md +88 -88
  223. package/skills/grill-with-docs/adr-format.md +47 -47
  224. package/skills/grill-with-docs/context-format.md +60 -60
  225. package/skills/init-capability-evolution/SKILL.md +70 -70
  226. package/skills/loop-agent/SKILL.md +151 -151
  227. package/skills/loop-agent/references/README.md +67 -67
  228. package/skills/loop-agent/references/command-reference.md +527 -527
  229. package/skills/loop-agent/references/docs-converge.md +126 -126
  230. package/skills/loop-agent/references/harness-policy.md +263 -263
  231. package/skills/loop-agent/references/hybrid-dag.md +243 -243
  232. package/skills/loop-agent/references/learned/README.md +21 -21
  233. package/skills/loop-agent/references/long-running-loop.md +57 -57
  234. package/skills/loop-agent/references/model-routing.md +36 -36
  235. package/skills/loop-agent/references/multi-worktree.md +54 -54
  236. package/skills/loop-agent/references/one-shot-runs.md +85 -85
  237. package/skills/loop-agent/references/orchestrator-and-interventions.md +169 -169
  238. package/skills/loop-agent/references/pi-prompt.md +23 -23
  239. package/skills/loop-agent/references/pi-subagent-assisted-mode.md +84 -84
  240. package/skills/loop-agent/references/post-implementation-and-patterns.md +44 -44
  241. package/skills/loop-agent/references/task-workflow.md +89 -89
  242. package/skills/loop-agent/references/verification-and-failure-handling.md +141 -141
  243. package/skills/playwright-cli/SKILL.md +420 -420
  244. package/skills/playwright-cli/references/element-attributes.md +23 -23
  245. package/skills/playwright-cli/references/playwright-tests.md +39 -39
  246. package/skills/playwright-cli/references/request-mocking.md +87 -87
  247. package/skills/playwright-cli/references/running-code.md +241 -241
  248. package/skills/playwright-cli/references/session-management.md +225 -225
  249. package/skills/playwright-cli/references/storage-state.md +275 -275
  250. package/skills/playwright-cli/references/test-generation.md +433 -433
  251. package/skills/playwright-cli/references/tracing.md +139 -139
  252. package/skills/playwright-cli/references/video-recording.md +143 -143
  253. package/skills/playwright-cli-case-generator/SKILL.md +74 -74
  254. package/skills/requesting-code-review/SKILL.md +101 -101
  255. package/skills/requesting-code-review/code-reviewer.md +168 -168
  256. package/skills/systematic-debugging/CREATION-LOG.md +119 -119
  257. package/skills/systematic-debugging/SKILL.md +296 -296
  258. package/skills/systematic-debugging/condition-based-waiting-example.ts +158 -158
  259. package/skills/systematic-debugging/condition-based-waiting.md +115 -115
  260. package/skills/systematic-debugging/defense-in-depth.md +122 -122
  261. package/skills/systematic-debugging/find-polluter.sh +63 -63
  262. package/skills/systematic-debugging/root-cause-tracing.md +169 -169
  263. package/skills/systematic-debugging/test-academic.md +14 -14
  264. package/skills/systematic-debugging/test-pressure-1.md +58 -58
  265. package/skills/systematic-debugging/test-pressure-2.md +68 -68
  266. package/skills/systematic-debugging/test-pressure-3.md +69 -69
  267. package/skills/test-driven-development/SKILL.md +20 -20
  268. package/skills/using-git-worktrees/SKILL.md +215 -215
  269. package/skills/verification-before-completion/SKILL.md +154 -154
  270. package/skills/webapp-testing/SKILL.md +19 -19
@@ -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` 解析本地指令,再回退到包内 `.agents/skills/`,并在各节点 `skills.json` artifact 中记录解析元数据。
50
-
51
- 执行前可用 `dag validate --strict-skills` 做 opt-in skill audit;该门禁会在 missing/error/truncated skill 或 unresolved reference 出现时失败。默认 role skill 应来自 `ai_workspace/loop-agent/.agents/skills/vetted-skill-registry.md` 中记录的 repo-local wrapper。
52
-
53
- 目标项目的 `loop-agent` skill 位于 `.agents/skills/loop-agent/SKILL.md`。loop-agent 源仓库和 npm 包内置版本仍位于 `.agents/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` 解析本地指令,再回退到包内 `.agents/skills/`,并在各节点 `skills.json` artifact 中记录解析元数据。
50
+
51
+ 执行前可用 `dag validate --strict-skills` 做 opt-in skill audit;该门禁会在 missing/error/truncated skill 或 unresolved reference 出现时失败。默认 role skill 应来自 `ai_workspace/loop-agent/.agents/skills/vetted-skill-registry.md` 中记录的 repo-local wrapper。
52
+
53
+ 目标项目的 `loop-agent` skill 位于 `.agents/skills/loop-agent/SKILL.md`。loop-agent 源仓库和 npm 包内置版本仍位于 `.agents/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、`ai_workspace/loop-agent/exec-plans/completed/`、`ai_workspace/loop-agent/reports/current-capability-summary.md`、ADR 0001–0003。
19
- - **规划/设计输入**:`ai_workspace/loop-agent/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` 显式条目 + `ai_workspace/loop-agent/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、`ai_workspace/loop-agent/exec-plans/completed/`、`ai_workspace/loop-agent/reports/current-capability-summary.md`、ADR 0001–0003。
19
+ - **规划/设计输入**:`ai_workspace/loop-agent/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` 显式条目 + `ai_workspace/loop-agent/init-surface.manifest.json` `packageRequired`),但 **不**投影到目标项目 init surface;目标项目 init 仍只投影语言无关的 `runtime-boundaries.md`。
@@ -1,140 +1,140 @@
1
- # Agent DAG 执行架构
2
-
3
- 本页说明 Agent DAG 的主调用链、rank 调度、executor、run-owned skill snapshot、decision gate 与 pause/completed 生命周期。命令面与 `test/cli-contract.test.ts` 一致;符号归属以 `src/` 为准。完整 import 边界与 governance hook 见 `runtime-boundaries.md`。
4
-
5
- ## 主调用链
6
-
7
- ### 生成 + 校验 + 执行(`dag run-task`)
8
-
9
- ```text
10
- src/commands/dag-run-task.ts runDagRunTask
11
- → src/application/dag/generate-task-dag.ts generateTaskDagUseCase
12
- └─ src/workflows/dag/init-hybrid.ts initHybridDagFromTask (生成 DagSpec)
13
- └─ src/application/dag/validate-dag.ts validateDagUseCase (候选 + 最终校验)
14
- └─ assertSafeForExecution (执行前安全检查)
15
- └─ src/application/dag/run-dag.ts runDagUseCase (执行)
16
- ```
17
-
18
- `generateTaskDagUseCase` 内部先 `initHybridDagFromTask` 生成 `DagSpec`,再调用 `validateDagUseCase` 做候选与最终两次校验,随后 `assertSafeForExecution` 确认 DAG 可安全执行,最后委托 `runDagUseCase` 执行。`runDagRunTask` 还 `export` 了 `assertSafeForExecution` 供命令层复用。
19
-
20
- ### 直接执行既有 DAG(`run-dag`)
21
-
22
- ```text
23
- src/commands/run-dag.ts
24
- → src/application/dag/run-dag.ts runDagUseCase
25
- → src/workflows/dag/runner.ts runDag
26
- ```
27
-
28
- `run-dag` 是 top-level 命令,**不**在 `dag` 子树下(与 `dag run-task` 区分)。`runDagUseCase` 是 application 层 typed use-case,`runDag` 是 workflow runtime 核心。
29
-
30
- ### 校验
31
-
32
- ```text
33
- src/commands/dag-validate.ts runDagValidate
34
- → src/application/dag/validate-dag.ts validateDagUseCase
35
- ```
36
-
37
- ### runtime contract preflight 与 repair writer 解析
38
-
39
- - `src/workflows/dag/runtime-contract.ts` `assertRuntimeContractCompatible` 依据 controller capabilities(`DAG_CONTROLLER_CAPABILITIES`:`agentRuntime="pi-only"`、`repairWriterProtocol="explicit-node-v1"`)校验 DagSpec v3 必需的 `runtimeContract`。v3 让旧 controller 在解析阶段拒绝;新 controller 的 `validateDagUseCase`、`runDagUseCase`、`runDag` 与 resume 还会校验 capability 和可选最低版本,不兼容在任何节点执行前 fail-fast。legacy v1/v2 DagSpec 可读但没有 v3 握手。
40
- - `src/workflows/dag/repair-artifact.ts` `resolveRepairTaskForGate` 解析 `shell.repairArtifactGate`:优先显式 `repairNodeId`,否则推导唯一的下游受治理 Pi writer(`repairWriterContractIssues` 校验 executor/toolProfile/writePolicy/path 契约)。`validate.ts` 与 `node-execution.ts` 复用同一 resolver,runtime 不再按节点名硬编码。
41
- - `src/workflows/dag/controller-identity.ts` 在 run 创建前要求 controller identity 可解析,再由 `captureControllerIdentity` 冻结到 `<runDir>/controller-identity.json`;`verifyControllerIdentityForResume` 在 resume 前重新校验并对漂移、篡改或 legacy-unpinned run fail closed。
42
-
43
- ## rank 调度
44
-
45
- 拓扑排序与按 rank 执行的符号归属(校准版,勿笼统归到 `runner.ts`):
46
-
47
- | 职责 | 源码入口 | 说明 |
48
- | --- | --- | --- |
49
- | 拓扑排序 | `src/workflows/dag/topo.ts` `topoSortToRanks` | Kahn 算法,返回 `string[][]` ranks 并检测环 |
50
- | 单次 rank 执行 | `src/workflows/dag/scheduler.ts` `executeDagRanksOnce` | rank 间遍历、节点执行编排 |
51
- | run 主循环 | `src/workflows/dag/runner.ts` `runDag` / `executeDagCheckpoint` | 调用 scheduler + persistence + convergence |
52
-
53
- `scheduler.ts` `executeDagRanksOnce` 内每个 rank:
54
-
55
- 1. `pauseGateRunnable`(满足 `isPauseOnHumanDecisionGate` 的节点,来自 `decision-envelope.ts`)**串行**先跑;任一节点触发 pause 即停止后续。
56
- 2. `regularRunnable` 经 `mapConcurrent` 并发执行,`maxConcurrent` 默认 **4**(`runner.ts` `Math.max(1, opts.maxConcurrent ?? 4)`)。
57
- 3. `rankWriterNodeIds`(`executor === "pi"` && `toolProfile === "write"` && `writePolicy === "exclusive"`)注入同 rank 的不相交 writeSet 上下文(`createExecuteNodeForRank`)。
58
- 4. 依赖未就绪的节点标 `SKIPPED`。
59
-
60
- `mapConcurrent` 来自 `src/shared/concurrency.ts`(或等价 shared 工具)。
61
-
62
- ## executor(Pi-only 受治理 runtime)
63
-
64
- - 注册表:`src/workflows/dag/executor-registry.ts`
65
- `DEFAULT_DAG_EXECUTOR_REGISTRY = { pi, shell, static }`。
66
- - schema:`src/workflows/dag/types.ts`
67
- `dagNodeExecutorSchema = z.enum(["pi","shell","static"])`;DagNodeExecutor 默认 `"pi"`(`executor: dagNodeExecutorSchema.default("pi")`)。
68
- - `executor: "cursor"` 在 schema refine 阶段抛 `CURSOR_DAG_EXECUTOR_REMOVED_ERROR`(Pi-only = ADR 0001)。
69
- - Pi handler 先 `requireModel(input)` 校验已解析 model,再委托 `executeDagPiNode`(`src/executors/dag-pi-executor.ts`)。
70
- - shell handler = `executeDagShellNode`(`src/executors/shell-executor.ts`);static handler = `executeDagStaticNode`(`src/executors/dag-static-executor.ts`)。
71
-
72
- Executor 不得依赖 commands 或 CLI formatting;Cursor 不在受治理路径(`runtime-boundaries.md` §Executors)。
73
-
74
- ## run-owned skill snapshot
75
-
76
- 每个新 DAG run 在首个节点执行前冻结本次注入 prompt 的 skill 集合,保证 live skill 后续被修改/删除/补建不会影响当前 run:
77
-
78
- | 步骤 | 源码入口 |
79
- | --- | --- |
80
- | 首节点前创建 | `runDag` 调 `createSkillSnapshot({ mode: "run-start" })`(`src/workflows/dag/skill-snapshot.ts`) |
81
- | 写入产物 | `writeSkillSnapshot(runDir, snapshot)` → `<runDir>/.runtime/skill-snapshot.json`(常量 `SKILL_SNAPSHOT_REL_PATH = ".runtime/skill-snapshot.json"`) |
82
- | state 只存相对引用 | `state.skillSnapshotRef` = `{ schemaVersion, path: ".runtime/skill-snapshot.json", sha256, createdAt, mode }`,**不**存绝对路径 |
83
- | resume 续用 | `prepareSkillSnapshotForContinuation`(resume 路径,`src/workflows/dag/runner.ts` `resumeDagRun`) |
84
- | 完整性校验 | 普通节点、dynamic child、approve/resume 都执行 integrity gate,ref/artifact/profile/binding 不一致即 fail closed,不回退实时解析 |
85
- | legacy 兼容 | 旧 run 只在 ref 与 artifact 都不存在时可标 `legacy-resume-backfill` 并冻结剩余节点 |
86
-
87
- snapshot 与 controller identity 是两个不同冻结层,详见 `runtime-boundaries.md` §版本化自举边界。
88
-
89
- ## decision gate 与 pause
90
-
91
- - `isPauseOnHumanDecisionGate`(`src/workflows/dag/decision-envelope.ts`):`task.decisionGate?.mode === "pause-on-human"` 且 decision gate 启用时,该节点在 rank 内**串行先跑**。
92
- - `shouldPauseOnHumanEscalation`(`decision-envelope.ts`,在 `src/workflows/dag/node-execution.ts` 调用):decision envelope 判定需人工升级时,写 `human-escalation.json`(与 `human-escalation.md`)并触发 pause。
93
- - pause 时 `state.pausedByNodeId` + `pauseReason` + `humanDecisionNodeId` 被写入;`human-escalation.json` 落在 `<runDir>/<nodeId>/`。
94
-
95
- decision envelope 中的 **model verdict**(`decision` / `riskLevel` 等解析自文本)是 `advisoryOnly: true` 派生视图,**不**是完成权威(`facts-and-state.md`)。
96
-
97
- ## 生命周期:active / paused / completed
98
-
99
- `src/workflows/dag/lifecycle.ts` 定义三个目录:
100
-
101
- | 目录 | 写入规则 |
102
- | --- | --- |
103
- | `.harness/dag-runs/active/<runId>/` | run 进行中 |
104
- | `.harness/dag-runs/paused/<runId>/` | 触发 pause;resume 需 `human-approval.json` |
105
- | `.harness/dag-runs/completed/<runId>/` | 终态;除 runner 终态写外只读(`completed-facts-guard.ts`) |
106
-
107
- 扫描顺序:`DAG_LIFECYCLE_SCAN_ORDER = ["paused", "active", "completed"]`(locate/status 等按此顺序解析 runId)。
108
-
109
- 关键规则:
110
-
111
- - **pause → approve → resume**:`dag approve` 在 paused run 写 `human-approval.json`,将状态改回 `running` 并把目录迁回 `active/`;随后 `resumeDagRun`(`runner.ts`)要求 active lifecycle + approval artifact,并用 `prepareSkillSnapshotForContinuation` 复用 run-owned snapshot。
112
- - **completed 写入**:只有 runner 在终态 `persistState({ allowCompletedFactsWrite: true })`(`runner.ts`)才能写 completed 目录;该 flag 经 `completed-facts-guard.ts` 校验。
113
- - **显式 recovery mutation**:`dag reconcile-run`(`src/commands/dag-reconcile-run.ts`,命令层)默认仅检查;只有给出 `--action supersede|abandon` + reason,且 liveness 证明 runner 已停止时,才在原 lifecycle 写 reconciliation/state 并迁移到 `completed/`。它不是修改既有 completed history 的通用入口。Observe / status / doctor 始终只读。
114
- - **status 枚举**:`DagRunState.status`;`TERMINAL_RUN_STATUSES` 判终态;`isTerminalDagRunStatus` 工具函数。
115
-
116
- ## convergence(可选、supervised)
117
-
118
- - 控制器:`src/workflows/dag/convergence/controller.ts` `runConvergencePassController`,在 runner rank 间被调用。
119
- - 特性默认 **off**(`task/config-types.ts` `convergence` 默认 `{ enabled: false }`)。
120
- - 启用后按 `maxPasses`(默认 3)做多轮 repair,回归时可 `pauseOnRegression`。
121
- - 产物落在 `<runDir>/convergence/pass-<n>/`。
122
-
123
- ## 完成权威 = shell verification
124
-
125
- 完成声明的权威是 shell command 的新鲜 exit code 与归档输出。验证命令执行在 `src/executors/shell-executor.ts`,环境与 preset helper 在 `src/executors/shell-verification.ts`;DAG authoring 写入的 `task.shell.verifyEvidence` 元数据由 `src/workflows/dag/node-execution.ts` 复制到 `node.verifyEvidence`。model verdict、Observe 或报告都不能替代这些 shell facts。
126
-
127
- ## Dynamic Workflow
128
-
129
- Dynamic Workflow 是 DAG runtime 上方的逻辑编排/编译层,**不**重写 runner:
130
-
131
- ```text
132
- WorkflowSpec (src/workflows/dynamic/spec.ts workflowSpecSchema)
133
- → validate (src/workflows/dynamic/validate.ts)
134
- → compile (src/workflows/dynamic/compile.ts compileWorkflowToDag) → DagSpec
135
- → 同一 run-dag 执行
136
- ```
137
-
138
- - 动态语义:`map_agent` / `verify_agent` / `reduce_agent` / `condition` / `loop_until` / `human_gate` / `command` / `artifact_transform`。
139
- - agent-like 节点 executor 仅 `pi` | `static`(schema 已不含 `cursor`)。
140
- - 未完全兑现的 runtime limits 强执法、更广 profile、Loop 原生 `workflow` action 深度编排等仍是**设计输入**,见 `ai_workspace/loop-agent/design/dynamic-workflow-dag-engine-roadmap.md`(带 2026-07-14 校准条)。
1
+ # Agent DAG 执行架构
2
+
3
+ 本页说明 Agent DAG 的主调用链、rank 调度、executor、run-owned skill snapshot、decision gate 与 pause/completed 生命周期。命令面与 `test/cli-contract.test.ts` 一致;符号归属以 `src/` 为准。完整 import 边界与 governance hook 见 `runtime-boundaries.md`。
4
+
5
+ ## 主调用链
6
+
7
+ ### 生成 + 校验 + 执行(`dag run-task`)
8
+
9
+ ```text
10
+ src/commands/dag-run-task.ts runDagRunTask
11
+ → src/application/dag/generate-task-dag.ts generateTaskDagUseCase
12
+ └─ src/workflows/dag/init-hybrid.ts initHybridDagFromTask (生成 DagSpec)
13
+ └─ src/application/dag/validate-dag.ts validateDagUseCase (候选 + 最终校验)
14
+ └─ assertSafeForExecution (执行前安全检查)
15
+ └─ src/application/dag/run-dag.ts runDagUseCase (执行)
16
+ ```
17
+
18
+ `generateTaskDagUseCase` 内部先 `initHybridDagFromTask` 生成 `DagSpec`,再调用 `validateDagUseCase` 做候选与最终两次校验,随后 `assertSafeForExecution` 确认 DAG 可安全执行,最后委托 `runDagUseCase` 执行。`runDagRunTask` 还 `export` 了 `assertSafeForExecution` 供命令层复用。
19
+
20
+ ### 直接执行既有 DAG(`run-dag`)
21
+
22
+ ```text
23
+ src/commands/run-dag.ts
24
+ → src/application/dag/run-dag.ts runDagUseCase
25
+ → src/workflows/dag/runner.ts runDag
26
+ ```
27
+
28
+ `run-dag` 是 top-level 命令,**不**在 `dag` 子树下(与 `dag run-task` 区分)。`runDagUseCase` 是 application 层 typed use-case,`runDag` 是 workflow runtime 核心。
29
+
30
+ ### 校验
31
+
32
+ ```text
33
+ src/commands/dag-validate.ts runDagValidate
34
+ → src/application/dag/validate-dag.ts validateDagUseCase
35
+ ```
36
+
37
+ ### runtime contract preflight 与 repair writer 解析
38
+
39
+ - `src/workflows/dag/runtime-contract.ts` `assertRuntimeContractCompatible` 依据 controller capabilities(`DAG_CONTROLLER_CAPABILITIES`:`agentRuntime="pi-only"`、`repairWriterProtocol="explicit-node-v1"`)校验 DagSpec v3 必需的 `runtimeContract`。v3 让旧 controller 在解析阶段拒绝;新 controller 的 `validateDagUseCase`、`runDagUseCase`、`runDag` 与 resume 还会校验 capability 和可选最低版本,不兼容在任何节点执行前 fail-fast。legacy v1/v2 DagSpec 可读但没有 v3 握手。
40
+ - `src/workflows/dag/repair-artifact.ts` `resolveRepairTaskForGate` 解析 `shell.repairArtifactGate`:优先显式 `repairNodeId`,否则推导唯一的下游受治理 Pi writer(`repairWriterContractIssues` 校验 executor/toolProfile/writePolicy/path 契约)。`validate.ts` 与 `node-execution.ts` 复用同一 resolver,runtime 不再按节点名硬编码。
41
+ - `src/workflows/dag/controller-identity.ts` 在 run 创建前要求 controller identity 可解析,再由 `captureControllerIdentity` 冻结到 `<runDir>/controller-identity.json`;`verifyControllerIdentityForResume` 在 resume 前重新校验并对漂移、篡改或 legacy-unpinned run fail closed。
42
+
43
+ ## rank 调度
44
+
45
+ 拓扑排序与按 rank 执行的符号归属(校准版,勿笼统归到 `runner.ts`):
46
+
47
+ | 职责 | 源码入口 | 说明 |
48
+ | --- | --- | --- |
49
+ | 拓扑排序 | `src/workflows/dag/topo.ts` `topoSortToRanks` | Kahn 算法,返回 `string[][]` ranks 并检测环 |
50
+ | 单次 rank 执行 | `src/workflows/dag/scheduler.ts` `executeDagRanksOnce` | rank 间遍历、节点执行编排 |
51
+ | run 主循环 | `src/workflows/dag/runner.ts` `runDag` / `executeDagCheckpoint` | 调用 scheduler + persistence + convergence |
52
+
53
+ `scheduler.ts` `executeDagRanksOnce` 内每个 rank:
54
+
55
+ 1. `pauseGateRunnable`(满足 `isPauseOnHumanDecisionGate` 的节点,来自 `decision-envelope.ts`)**串行**先跑;任一节点触发 pause 即停止后续。
56
+ 2. `regularRunnable` 经 `mapConcurrent` 并发执行,`maxConcurrent` 默认 **4**(`runner.ts` `Math.max(1, opts.maxConcurrent ?? 4)`)。
57
+ 3. `rankWriterNodeIds`(`executor === "pi"` && `toolProfile === "write"` && `writePolicy === "exclusive"`)注入同 rank 的不相交 writeSet 上下文(`createExecuteNodeForRank`)。
58
+ 4. 依赖未就绪的节点标 `SKIPPED`。
59
+
60
+ `mapConcurrent` 来自 `src/shared/concurrency.ts`(或等价 shared 工具)。
61
+
62
+ ## executor(Pi-only 受治理 runtime)
63
+
64
+ - 注册表:`src/workflows/dag/executor-registry.ts`
65
+ `DEFAULT_DAG_EXECUTOR_REGISTRY = { pi, shell, static }`。
66
+ - schema:`src/workflows/dag/types.ts`
67
+ `dagNodeExecutorSchema = z.enum(["pi","shell","static"])`;DagNodeExecutor 默认 `"pi"`(`executor: dagNodeExecutorSchema.default("pi")`)。
68
+ - `executor: "cursor"` 在 schema refine 阶段抛 `CURSOR_DAG_EXECUTOR_REMOVED_ERROR`(Pi-only = ADR 0001)。
69
+ - Pi handler 先 `requireModel(input)` 校验已解析 model,再委托 `executeDagPiNode`(`src/executors/dag-pi-executor.ts`)。
70
+ - shell handler = `executeDagShellNode`(`src/executors/shell-executor.ts`);static handler = `executeDagStaticNode`(`src/executors/dag-static-executor.ts`)。
71
+
72
+ Executor 不得依赖 commands 或 CLI formatting;Cursor 不在受治理路径(`runtime-boundaries.md` §Executors)。
73
+
74
+ ## run-owned skill snapshot
75
+
76
+ 每个新 DAG run 在首个节点执行前冻结本次注入 prompt 的 skill 集合,保证 live skill 后续被修改/删除/补建不会影响当前 run:
77
+
78
+ | 步骤 | 源码入口 |
79
+ | --- | --- |
80
+ | 首节点前创建 | `runDag` 调 `createSkillSnapshot({ mode: "run-start" })`(`src/workflows/dag/skill-snapshot.ts`) |
81
+ | 写入产物 | `writeSkillSnapshot(runDir, snapshot)` → `<runDir>/.runtime/skill-snapshot.json`(常量 `SKILL_SNAPSHOT_REL_PATH = ".runtime/skill-snapshot.json"`) |
82
+ | state 只存相对引用 | `state.skillSnapshotRef` = `{ schemaVersion, path: ".runtime/skill-snapshot.json", sha256, createdAt, mode }`,**不**存绝对路径 |
83
+ | resume 续用 | `prepareSkillSnapshotForContinuation`(resume 路径,`src/workflows/dag/runner.ts` `resumeDagRun`) |
84
+ | 完整性校验 | 普通节点、dynamic child、approve/resume 都执行 integrity gate,ref/artifact/profile/binding 不一致即 fail closed,不回退实时解析 |
85
+ | legacy 兼容 | 旧 run 只在 ref 与 artifact 都不存在时可标 `legacy-resume-backfill` 并冻结剩余节点 |
86
+
87
+ snapshot 与 controller identity 是两个不同冻结层,详见 `runtime-boundaries.md` §版本化自举边界。
88
+
89
+ ## decision gate 与 pause
90
+
91
+ - `isPauseOnHumanDecisionGate`(`src/workflows/dag/decision-envelope.ts`):`task.decisionGate?.mode === "pause-on-human"` 且 decision gate 启用时,该节点在 rank 内**串行先跑**。
92
+ - `shouldPauseOnHumanEscalation`(`decision-envelope.ts`,在 `src/workflows/dag/node-execution.ts` 调用):decision envelope 判定需人工升级时,写 `human-escalation.json`(与 `human-escalation.md`)并触发 pause。
93
+ - pause 时 `state.pausedByNodeId` + `pauseReason` + `humanDecisionNodeId` 被写入;`human-escalation.json` 落在 `<runDir>/<nodeId>/`。
94
+
95
+ decision envelope 中的 **model verdict**(`decision` / `riskLevel` 等解析自文本)是 `advisoryOnly: true` 派生视图,**不**是完成权威(`facts-and-state.md`)。
96
+
97
+ ## 生命周期:active / paused / completed
98
+
99
+ `src/workflows/dag/lifecycle.ts` 定义三个目录:
100
+
101
+ | 目录 | 写入规则 |
102
+ | --- | --- |
103
+ | `.harness/dag-runs/active/<runId>/` | run 进行中 |
104
+ | `.harness/dag-runs/paused/<runId>/` | 触发 pause;resume 需 `human-approval.json` |
105
+ | `.harness/dag-runs/completed/<runId>/` | 终态;除 runner 终态写外只读(`completed-facts-guard.ts`) |
106
+
107
+ 扫描顺序:`DAG_LIFECYCLE_SCAN_ORDER = ["paused", "active", "completed"]`(locate/status 等按此顺序解析 runId)。
108
+
109
+ 关键规则:
110
+
111
+ - **pause → approve → resume**:`dag approve` 在 paused run 写 `human-approval.json`,将状态改回 `running` 并把目录迁回 `active/`;随后 `resumeDagRun`(`runner.ts`)要求 active lifecycle + approval artifact,并用 `prepareSkillSnapshotForContinuation` 复用 run-owned snapshot。
112
+ - **completed 写入**:只有 runner 在终态 `persistState({ allowCompletedFactsWrite: true })`(`runner.ts`)才能写 completed 目录;该 flag 经 `completed-facts-guard.ts` 校验。
113
+ - **显式 recovery mutation**:`dag reconcile-run`(`src/commands/dag-reconcile-run.ts`,命令层)默认仅检查;只有给出 `--action supersede|abandon` + reason,且 liveness 证明 runner 已停止时,才在原 lifecycle 写 reconciliation/state 并迁移到 `completed/`。它不是修改既有 completed history 的通用入口。Observe / status / doctor 始终只读。
114
+ - **status 枚举**:`DagRunState.status`;`TERMINAL_RUN_STATUSES` 判终态;`isTerminalDagRunStatus` 工具函数。
115
+
116
+ ## convergence(可选、supervised)
117
+
118
+ - 控制器:`src/workflows/dag/convergence/controller.ts` `runConvergencePassController`,在 runner rank 间被调用。
119
+ - 特性默认 **off**(`task/config-types.ts` `convergence` 默认 `{ enabled: false }`)。
120
+ - 启用后按 `maxPasses`(默认 3)做多轮 repair,回归时可 `pauseOnRegression`。
121
+ - 产物落在 `<runDir>/convergence/pass-<n>/`。
122
+
123
+ ## 完成权威 = shell verification
124
+
125
+ 完成声明的权威是 shell command 的新鲜 exit code 与归档输出。验证命令执行在 `src/executors/shell-executor.ts`,环境与 preset helper 在 `src/executors/shell-verification.ts`;DAG authoring 写入的 `task.shell.verifyEvidence` 元数据由 `src/workflows/dag/node-execution.ts` 复制到 `node.verifyEvidence`。model verdict、Observe 或报告都不能替代这些 shell facts。
126
+
127
+ ## Dynamic Workflow
128
+
129
+ Dynamic Workflow 是 DAG runtime 上方的逻辑编排/编译层,**不**重写 runner:
130
+
131
+ ```text
132
+ WorkflowSpec (src/workflows/dynamic/spec.ts workflowSpecSchema)
133
+ → validate (src/workflows/dynamic/validate.ts)
134
+ → compile (src/workflows/dynamic/compile.ts compileWorkflowToDag) → DagSpec
135
+ → 同一 run-dag 执行
136
+ ```
137
+
138
+ - 动态语义:`map_agent` / `verify_agent` / `reduce_agent` / `condition` / `loop_until` / `human_gate` / `command` / `artifact_transform`。
139
+ - agent-like 节点 executor 仅 `pi` | `static`(schema 已不含 `cursor`)。
140
+ - 未完全兑现的 runtime limits 强执法、更广 profile、Loop 原生 `workflow` action 深度编排等仍是**设计输入**,见 `ai_workspace/loop-agent/design/dynamic-workflow-dag-engine-roadmap.md`(带 2026-07-14 校准条)。
@@ -1,54 +1,54 @@
1
- # 架构演进:当前 vs 未来
2
-
3
- 本页区分 loop-agent **当前已实现**的架构能力与**未来规划**。当前事实以代码、发布 CLI、已完成计划为准;未来能力一律标「规划 / 未实现 / 前瞻」。权威源:`CHANGELOG.md`、`ai_workspace/loop-agent/reports/current-capability-summary.md`、ADR 0001–0004、`ai_workspace/loop-agent/exec-plans/completed/` 与 active identity plan 的 progress。
4
-
5
- ## 当前已实现(0.11.0)
6
-
7
- | 域 | 现状 | 权威入口 |
8
- | --- | --- | --- |
9
- | 受治理 Agent runtime | **Pi-only**;`cursor-prompt` 仅显式 one-shot sidecar | ADR 0001、`CHANGELOG.md [0.10.0]` |
10
- | Agent DAG 主链 | `dag run-task` → generate → validate → `run-dag`;report/doctor/reconcile-run | `dag-execution.md`、`test/cli-contract.test.ts` |
11
- | Dynamic Workflow | `WorkflowSpec` → validate → compile → 同一 `run-dag`;agent-like 节点仅 `pi\|static` | `src/workflows/dynamic/{spec,validate,compile}.ts`、`website/docs/guides/dynamic-workflow.md` |
12
- | 版本化自举 | controller identity + run-owned skill snapshot + deterministic canary | `ai_workspace/loop-agent/reports/2026-07-13-versioned-self-hosting-bootstrap.md` |
13
- | Feature 交付(M2) | review/run/approve-followup/delivery/closeout/verify-final | `ai_workspace/loop-agent/reports/2026-07-12-m2-completion-audit.md` |
14
- | Task Pool | 唯一根 `.harness/task-pool/`;**feature-scoped** state v2(`TaskPoolTaskRef`) | ADR 0002、ADR 0004 |
15
- | 本地多 Feature 运营 | 同仓库多 Feature 可共用 Task ID;Ready / retry / Delivery / Observe 按 Feature 隔离 | ADR 0004、`ai_workspace/loop-agent/progress/2026-07-15-task-pool-v2-feature-scoped-task-identity.md` |
16
- | Observe | 本地只读暖白运营控制台 R1–R5(derived);canonical Task route 为 feature-scoped | `website/docs/guides/observe-ui.md`、`CHANGELOG.md [0.11.0]`、ADR 0004 |
17
- | DagSpec / repair | v3 + `runtimeContract`;显式 `repairNodeId` | `CHANGELOG.md [0.11.0]`、`dag-execution.md` |
18
- | 文档双树 | `website/docs/` 用法 vs `ai_workspace/loop-agent/` 治理;docs-converge | ADR 0003 |
19
- | 文档治理 | `ai_workspace/loop-agent/architecture/` 主题文档(本目录)+ package 可达 | 本目录 README |
20
-
21
- ### 受治理 runtime 的边界(已实现、不变式)
22
-
23
- - DAG writer 固定 `implement-pi` / `repair-pi`;`executor: "cursor"`、`implement-cursor` / `repair-cursor`、Cursor worker、`cursor-fix` 已从受治理路径移除。
24
- - 完成权威 = shell verification;model verdict / Observe / 报告是 derived/advisory。
25
- - Worker 通过已发布 `loop-agent` 子进程执行,不 in-process import runtime kernel(governance 机器校验)。
26
-
27
- ## 未来规划(第 3–6 月,**未实现**)
28
-
29
- 以下能力来自 `ai_workspace/loop-agent/design/六个月规划.md` 与 `ai_workspace/loop-agent/design/dynamic-workflow-dag-engine-roadmap.md`(六个月规划页首 2026-07-15 / 0.11.0 校准;未交付 phase 为**设计输入**,不是已实现证明)。它们**当前不存在于代码或 CLI**:
30
-
31
- | 未来方向 | 状态 | 规划来源 |
32
- | --- | --- | --- |
33
- | 远程 PR / CI | 规划 / 未实现 | `ai_workspace/loop-agent/design/六个月规划.md`(第 3 个月起) |
34
- | 线上 / 云 Worker | 规划 / 未实现 | 同上 |
35
- | 云 Task Pool / SQL / Orchestrator | 规划 / 未实现 | 同上(第 2 月原始设计已调整为本地 Feature 闭环) |
36
- | 多仓库平台 | 规划 / 未实现 | 同上 |
37
- | 组织级服务 | 规划 / 未实现 | 同上 |
38
- | Web Console(远端) | 规划 / 未实现 | 同上 |
39
- | Dynamic Workflow runtime limits 强执法、更广 profile | 设计输入 | `ai_workspace/loop-agent/design/dynamic-workflow-dag-engine-roadmap.md`(未勾选 phase) |
40
- | Loop 与 Dynamic Workflow 更深的双向集成、稳定化与自动恢复 | 设计输入 | 同上;当前已有基础 `workflow` action,不应误写为完全缺失 |
41
-
42
- > 注意:`ai_workspace/loop-agent/design/dynamic-workflow-dag-engine-roadmap.md` 是 2026-07-04 历史叙述;文中凡把 Cursor 写成受治理 executor 或 `loop` 的 `cursor-fix` 动作,均为**历史叙述**,现状以 Pi-only + 显式 `cursor-prompt` sidecar 为准。
43
-
44
- ## 已收敛为 archive / 历史基线(非未来)
45
-
46
- - 第 1–2 月规划已收敛为 archive/reports 指针,不在本文展开:`ai_workspace/loop-agent/design/archive/2026-07-12-第二月规划.md`。
47
- - `ai_workspace/loop-agent/reports/2026-07-02-repository-analysis.md` 自 2026-07-14 起冻结为**历史基线快照**,不再滚动追加 Unreleased 能力。
48
- - 活能力短摘要在 `ai_workspace/loop-agent/reports/current-capability-summary.md`。
49
-
50
- ## 文档本体的演进边界
51
-
52
- - 本目录新增文档随发布包发布(`package.json` `files` + manifest `packageRequired` 显式条目),但 **不**投影到目标项目 init surface(AC-7);目标项目 init 仍只投影语言无关的 `runtime-boundaries.md`。
53
- - `runtime-boundaries.md` 是边界真源;本目录其他文档交叉引用,不复制其 import 方向表 / governance-hook 表 / 版本化自举边界表。
54
- - 未来如有能力落地,应先改 `src/`/CLI/ADR/completed plan,再回写本目录的「已实现」表。
1
+ # 架构演进:当前 vs 未来
2
+
3
+ 本页区分 loop-agent **当前已实现**的架构能力与**未来规划**。当前事实以代码、发布 CLI、已完成计划为准;未来能力一律标「规划 / 未实现 / 前瞻」。权威源:`CHANGELOG.md`、`ai_workspace/loop-agent/reports/current-capability-summary.md`、ADR 0001–0004、`ai_workspace/loop-agent/exec-plans/completed/` 与 active identity plan 的 progress。
4
+
5
+ ## 当前已实现(0.11.0)
6
+
7
+ | 域 | 现状 | 权威入口 |
8
+ | --- | --- | --- |
9
+ | 受治理 Agent runtime | **Pi-only**;`cursor-prompt` 仅显式 one-shot sidecar | ADR 0001、`CHANGELOG.md [0.10.0]` |
10
+ | Agent DAG 主链 | `dag run-task` → generate → validate → `run-dag`;report/doctor/reconcile-run | `dag-execution.md`、`test/cli-contract.test.ts` |
11
+ | Dynamic Workflow | `WorkflowSpec` → validate → compile → 同一 `run-dag`;agent-like 节点仅 `pi\|static` | `src/workflows/dynamic/{spec,validate,compile}.ts`、`website/docs/guides/dynamic-workflow.md` |
12
+ | 版本化自举 | controller identity + run-owned skill snapshot + deterministic canary | `ai_workspace/loop-agent/reports/2026-07-13-versioned-self-hosting-bootstrap.md` |
13
+ | Feature 交付(M2) | review/run/approve-followup/delivery/closeout/verify-final | `ai_workspace/loop-agent/reports/2026-07-12-m2-completion-audit.md` |
14
+ | Task Pool | 唯一根 `.harness/task-pool/`;**feature-scoped** state v2(`TaskPoolTaskRef`) | ADR 0002、ADR 0004 |
15
+ | 本地多 Feature 运营 | 同仓库多 Feature 可共用 Task ID;Ready / retry / Delivery / Observe 按 Feature 隔离 | ADR 0004、`ai_workspace/loop-agent/progress/2026-07-15-task-pool-v2-feature-scoped-task-identity.md` |
16
+ | Observe | 本地只读暖白运营控制台 R1–R5(derived);canonical Task route 为 feature-scoped | `website/docs/guides/observe-ui.md`、`CHANGELOG.md [0.11.0]`、ADR 0004 |
17
+ | DagSpec / repair | v3 + `runtimeContract`;显式 `repairNodeId` | `CHANGELOG.md [0.11.0]`、`dag-execution.md` |
18
+ | 文档双树 | `website/docs/` 用法 vs `ai_workspace/loop-agent/` 治理;docs-converge | ADR 0003 |
19
+ | 文档治理 | `ai_workspace/loop-agent/architecture/` 主题文档(本目录)+ package 可达 | 本目录 README |
20
+
21
+ ### 受治理 runtime 的边界(已实现、不变式)
22
+
23
+ - DAG writer 固定 `implement-pi` / `repair-pi`;`executor: "cursor"`、`implement-cursor` / `repair-cursor`、Cursor worker、`cursor-fix` 已从受治理路径移除。
24
+ - 完成权威 = shell verification;model verdict / Observe / 报告是 derived/advisory。
25
+ - Worker 通过已发布 `loop-agent` 子进程执行,不 in-process import runtime kernel(governance 机器校验)。
26
+
27
+ ## 未来规划(第 3–6 月,**未实现**)
28
+
29
+ 以下能力来自 `ai_workspace/loop-agent/design/六个月规划.md` 与 `ai_workspace/loop-agent/design/dynamic-workflow-dag-engine-roadmap.md`(六个月规划页首 2026-07-15 / 0.11.0 校准;未交付 phase 为**设计输入**,不是已实现证明)。它们**当前不存在于代码或 CLI**:
30
+
31
+ | 未来方向 | 状态 | 规划来源 |
32
+ | --- | --- | --- |
33
+ | 远程 PR / CI | 规划 / 未实现 | `ai_workspace/loop-agent/design/六个月规划.md`(第 3 个月起) |
34
+ | 线上 / 云 Worker | 规划 / 未实现 | 同上 |
35
+ | 云 Task Pool / SQL / Orchestrator | 规划 / 未实现 | 同上(第 2 月原始设计已调整为本地 Feature 闭环) |
36
+ | 多仓库平台 | 规划 / 未实现 | 同上 |
37
+ | 组织级服务 | 规划 / 未实现 | 同上 |
38
+ | Web Console(远端) | 规划 / 未实现 | 同上 |
39
+ | Dynamic Workflow runtime limits 强执法、更广 profile | 设计输入 | `ai_workspace/loop-agent/design/dynamic-workflow-dag-engine-roadmap.md`(未勾选 phase) |
40
+ | Loop 与 Dynamic Workflow 更深的双向集成、稳定化与自动恢复 | 设计输入 | 同上;当前已有基础 `workflow` action,不应误写为完全缺失 |
41
+
42
+ > 注意:`ai_workspace/loop-agent/design/dynamic-workflow-dag-engine-roadmap.md` 是 2026-07-04 历史叙述;文中凡把 Cursor 写成受治理 executor 或 `loop` 的 `cursor-fix` 动作,均为**历史叙述**,现状以 Pi-only + 显式 `cursor-prompt` sidecar 为准。
43
+
44
+ ## 已收敛为 archive / 历史基线(非未来)
45
+
46
+ - 第 1–2 月规划已收敛为 archive/reports 指针,不在本文展开:`ai_workspace/loop-agent/design/archive/2026-07-12-第二月规划.md`。
47
+ - `ai_workspace/loop-agent/reports/2026-07-02-repository-analysis.md` 自 2026-07-14 起冻结为**历史基线快照**,不再滚动追加 Unreleased 能力。
48
+ - 活能力短摘要在 `ai_workspace/loop-agent/reports/current-capability-summary.md`。
49
+
50
+ ## 文档本体的演进边界
51
+
52
+ - 本目录新增文档随发布包发布(`package.json` `files` + manifest `packageRequired` 显式条目),但 **不**投影到目标项目 init surface(AC-7);目标项目 init 仍只投影语言无关的 `runtime-boundaries.md`。
53
+ - `runtime-boundaries.md` 是边界真源;本目录其他文档交叉引用,不复制其 import 方向表 / governance-hook 表 / 版本化自举边界表。
54
+ - 未来如有能力落地,应先改 `src/`/CLI/ADR/completed plan,再回写本目录的「已实现」表。