@tea-agent/loop-agent 0.10.0 → 0.12.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 (207) hide show
  1. package/AGENTS.md +10 -2
  2. package/CHANGELOG.md +91 -24
  3. package/README.md +84 -12
  4. package/dist/application/dag/args.js +1 -12
  5. package/dist/application/dag/generate-task-dag.js +38 -2
  6. package/dist/application/dag/run-dag.js +11 -27
  7. package/dist/application/dag/validate-dag.js +13 -2
  8. package/dist/application/loop/run-action.js +0 -4
  9. package/dist/cli/command-definitions.js +44 -16
  10. package/dist/cli/program.js +40 -23
  11. package/dist/cli/update/notifier.js +117 -0
  12. package/dist/cli/update/npm-client.js +151 -0
  13. package/dist/cli/update/policy.js +58 -0
  14. package/dist/cli/update/state.js +68 -0
  15. package/dist/cli.js +33 -0
  16. package/dist/commands/cursor-prompt.js +42 -82
  17. package/dist/commands/dag-approve.js +36 -0
  18. package/dist/commands/delegate.js +75 -77
  19. package/dist/commands/doctor.js +0 -18
  20. package/dist/commands/init.js +547 -95
  21. package/dist/commands/instructions.js +7 -10
  22. package/dist/commands/loop.js +4 -20
  23. package/dist/commands/plan.js +50 -0
  24. package/dist/executors/config-core.js +0 -51
  25. package/dist/executors/dag-pi-executor.js +1 -1
  26. package/dist/executors/dag.js +0 -1
  27. package/dist/executors/index.js +0 -2
  28. package/dist/executors/model-routing.js +9 -9
  29. package/dist/executors/shell-executor.js +1 -1
  30. package/dist/governance/checks.js +6 -3
  31. package/dist/governance/exec-plans.js +545 -0
  32. package/dist/governance/manifest-types.js +24 -2
  33. package/dist/infrastructure/harness/loop-action-store.js +0 -3
  34. package/dist/records/harvest.js +2 -23
  35. package/dist/records/one-shot-runs.js +1 -1
  36. package/dist/shared/artifacts-core.js +24 -5
  37. package/dist/shared/output-truncation.js +37 -0
  38. package/dist/shared/package-metadata.js +488 -0
  39. package/dist/{executors/cursor-executor.js → sidecars/cursor-prompt/executor.js} +2 -42
  40. package/dist/sidecars/cursor-prompt/index.js +3 -0
  41. package/dist/sidecars/cursor-prompt/stream.js +121 -0
  42. package/dist/task/config-types.js +29 -12
  43. package/dist/task/delegate.js +9 -21
  44. package/dist/task/runtime.js +1 -2
  45. package/dist/worker/cli.js +32 -3
  46. package/dist/worker/delivery/final-verification.js +47 -11
  47. package/dist/worker/delivery/package.js +63 -10
  48. package/dist/worker/feature/run.js +60 -8
  49. package/dist/worker/loop-agent/loop-agent-client.js +329 -126
  50. package/dist/worker/observability/event-history.js +216 -0
  51. package/dist/worker/observability/read-model.js +338 -83
  52. package/dist/worker/observe/paths.js +17 -0
  53. package/dist/worker/observe/routes.js +165 -21
  54. package/dist/worker/observe/server.js +59 -1
  55. package/dist/worker/observe/static/api.js +27 -0
  56. package/dist/worker/observe/static/app.js +120 -2317
  57. package/dist/worker/observe/static/constants.js +148 -0
  58. package/dist/worker/observe/static/copy.js +67 -0
  59. package/dist/worker/observe/static/dag-helpers.js +172 -0
  60. package/dist/worker/observe/static/dag-model.js +72 -0
  61. package/dist/worker/observe/static/dom.js +61 -0
  62. package/dist/worker/observe/static/format-pool.js +67 -0
  63. package/dist/worker/observe/static/format.js +292 -0
  64. package/dist/worker/observe/static/index.html +300 -82
  65. package/dist/worker/observe/static/kpi.js +94 -0
  66. package/dist/worker/observe/static/relations.js +128 -0
  67. package/dist/worker/observe/static/router.js +85 -0
  68. package/dist/worker/observe/static/run-processing.js +148 -0
  69. package/dist/worker/observe/static/shell-chrome.js +68 -0
  70. package/dist/worker/observe/static/state.js +253 -0
  71. package/dist/worker/observe/static/styles.css +1720 -495
  72. package/dist/worker/observe/static/views/batch.js +226 -0
  73. package/dist/worker/observe/static/views/dag-graph.js +172 -0
  74. package/dist/worker/observe/static/views/dag-inspector.js +477 -0
  75. package/dist/worker/observe/static/views/dag.js +362 -0
  76. package/dist/worker/observe/static/views/dashboard.js +442 -0
  77. package/dist/worker/observe/static/views/failures.js +143 -0
  78. package/dist/worker/observe/static/views/feature.js +453 -0
  79. package/dist/worker/observe/static/views/pool.js +347 -0
  80. package/dist/worker/observe/static/views/run.js +453 -0
  81. package/dist/worker/observe/static/views/session-timeline.js +205 -0
  82. package/dist/worker/observe/static/views/shell.js +7 -0
  83. package/dist/worker/observe/static/views/task.js +260 -0
  84. package/dist/worker/observe/static/views/timeline.js +163 -0
  85. package/dist/worker/preflight.js +49 -1
  86. package/dist/worker/run-task/run-task.js +22 -12
  87. package/dist/worker/runner/run-ready.js +76 -12
  88. package/dist/worker/task-spec/schema.js +0 -1
  89. package/dist/workflows/dag/controller-identity.js +104 -0
  90. package/dist/workflows/dag/convergence/controller.js +1 -1
  91. package/dist/workflows/dag/executor-registry.js +0 -2
  92. package/dist/workflows/dag/init-hybrid.js +797 -27
  93. package/dist/workflows/dag/node-execution.js +183 -35
  94. package/dist/workflows/dag/repair-artifact.js +91 -0
  95. package/dist/workflows/dag/report.js +50 -0
  96. package/dist/workflows/dag/retry-policy.js +138 -0
  97. package/dist/workflows/dag/runner.js +77 -17
  98. package/dist/workflows/dag/runtime-contract.js +87 -0
  99. package/dist/workflows/dag/scheduler.js +7 -2
  100. package/dist/workflows/dag/sdd-embedded.js +128 -0
  101. package/dist/workflows/dag/skill-instructions.js +5 -4
  102. package/dist/workflows/dag/skill-snapshot.js +529 -0
  103. package/dist/workflows/dag/types.js +86 -10
  104. package/dist/workflows/dag/validate.js +73 -12
  105. package/dist/workflows/loop/actions/dag-action.js +0 -2
  106. package/dist/workflows/loop/actions/shared.js +1 -1
  107. package/dist/workflows/loop/actions.js +14 -31
  108. package/dist/workflows/loop/benchmark.js +1 -1
  109. package/dist/workflows/loop/index.js +1 -1
  110. package/dist/workflows/loop/policy/auto-policy.js +22 -14
  111. package/dist/workflows/loop/policy/path-patterns.js +13 -0
  112. package/docs/README.md +36 -33
  113. package/docs/agent-dag-recovery-playbook.md +1 -1
  114. package/docs/agent-dag-runner.md +28 -3
  115. package/docs/architecture/README.md +26 -0
  116. package/docs/architecture/dag-execution.md +140 -0
  117. package/docs/architecture/evolution.md +53 -0
  118. package/docs/architecture/facts-and-state.md +58 -0
  119. package/docs/architecture/runtime-boundaries.md +45 -17
  120. package/docs/architecture/system-overview.md +93 -0
  121. package/docs/architecture/worker-and-feature.md +81 -0
  122. package/docs/cursor-prompt-sidecar.md +36 -0
  123. package/docs/decisions/README.md +13 -1
  124. package/docs/design/README.md +43 -21
  125. package/docs/development-principles.md +2 -2
  126. package/docs/exec-plans/active/README.md +1 -3
  127. package/docs/exec-plans/completed/README.md +23 -0
  128. package/docs/feature-workflow.md +78 -4
  129. package/docs/harness-methodology-debugging.md +1 -1
  130. package/docs/harness-methodology-tdd.md +3 -3
  131. package/docs/init-surface.manifest.json +60 -25
  132. package/docs/loop-agent-harness.md +28 -4
  133. package/docs/progress/README.md +50 -1
  134. package/docs/reports/README.md +90 -18
  135. package/docs/skills/README.md +2 -1
  136. package/docs/skills/vetted-skill-registry.md +2 -1
  137. package/docs/templates/agent-dag-report.schema.json +23 -6
  138. package/docs/templates/agent-dag.base.json +0 -5
  139. package/docs/templates/agent-dag.final-verification.json +0 -5
  140. package/docs/templates/agent-dag.schema.json +70 -3
  141. package/docs/templates/agent-dag.supervised-implementation.json +9 -8
  142. package/docs/templates/backend-test-dag.generate-pytest.prompt.md +139 -0
  143. package/docs/templates/backend-test-dag.json +276 -0
  144. package/docs/templates/backend-test-dag.retrospect.prompt.md +125 -0
  145. package/docs/templates/backend-test-dag.review-cases.prompt.md +81 -0
  146. package/docs/templates/frontend-design-contract.md +33 -0
  147. package/docs/templates/frontend-task-constraints.md +25 -0
  148. package/docs/templates/frontend-task-requirement.md +61 -0
  149. package/docs/templates/harness.schema.json +10 -12
  150. package/docs/templates/hybrid-dag.json +1 -6
  151. package/docs/templates/interactive-ui-round2-experiment.md +1 -1
  152. package/docs/templates/product-line/task.yaml +0 -1
  153. package/docs/templates/project-start-checklist.md +2 -2
  154. package/docs/templates/worker-dogfood-evidence.md +28 -0
  155. package/docs/templates/worker-dogfood-setup.md +20 -0
  156. package/docs/verification-matrix.md +10 -0
  157. package/examples/decision-gate-agent-dag.json +87 -33
  158. package/examples/example-dag.json +0 -5
  159. package/examples/hybrid-loop-agent-dag.json +0 -5
  160. package/harness.json +7 -15
  161. package/package.json +22 -46
  162. package/scripts/check-product-line-docs.sh +10 -7
  163. package/skills/agent-worker/SKILL.md +37 -0
  164. package/skills/agent-worker/references/agent-worker-operator.md +43 -0
  165. package/skills/frontend-design-review/SKILL.md +59 -0
  166. package/skills/frontend-design-review/references/review-checklist.md +37 -0
  167. package/skills/frontend-implementation/SKILL.md +51 -0
  168. package/skills/frontend-implementation/references/code-standards.md +34 -0
  169. package/skills/frontend-implementation/references/design-spec.md +46 -0
  170. package/skills/frontend-implementation/references/node-contracts.md +32 -0
  171. package/skills/frontend-review/SKILL.md +53 -0
  172. package/skills/frontend-review/references/review-findings.md +42 -0
  173. package/skills/frontend-verification/SKILL.md +40 -0
  174. package/skills/frontend-verification/references/verification-checklist.md +56 -0
  175. package/skills/grill-me/SKILL.md +10 -0
  176. package/skills/grill-with-docs/SKILL.md +88 -0
  177. package/skills/grill-with-docs/adr-format.md +47 -0
  178. package/skills/grill-with-docs/context-format.md +60 -0
  179. package/skills/loop-agent/SKILL.md +11 -9
  180. package/skills/loop-agent/references/command-reference.md +14 -15
  181. package/skills/loop-agent/references/docs-converge.md +126 -0
  182. package/skills/loop-agent/references/harness-policy.md +7 -7
  183. package/skills/loop-agent/references/hybrid-dag.md +36 -20
  184. package/skills/loop-agent/references/long-running-loop.md +4 -6
  185. package/skills/loop-agent/references/multi-worktree.md +6 -6
  186. package/skills/loop-agent/references/orchestrator-and-interventions.md +3 -3
  187. package/skills/loop-agent/references/pi-subagent-assisted-mode.md +14 -11
  188. package/skills/loop-agent/references/task-workflow.md +1 -1
  189. package/skills/loop-agent/references/verification-and-failure-handling.md +6 -0
  190. package/skills/using-git-worktrees/SKILL.md +215 -0
  191. package/dist/commands/cursor-worker.js +0 -43
  192. package/dist/cursor-worker-entry.js +0 -8
  193. package/dist/executors/cursor-artifacts.js +0 -33
  194. package/dist/executors/cursor-execution-log.js +0 -81
  195. package/dist/executors/cursor-executor-artifacts.js +0 -134
  196. package/dist/executors/cursor-run.js +0 -115
  197. package/dist/executors/cursor-tool.js +0 -94
  198. package/dist/executors/cursor-worker-client.js +0 -223
  199. package/dist/executors/cursor-worker-protocol.js +0 -18
  200. package/dist/executors/cursor-worker-server.js +0 -54
  201. package/dist/executors/cursor-worker.js +0 -3
  202. package/dist/executors/cursor.js +0 -6
  203. package/dist/executors/dag-cursor-executor.js +0 -87
  204. package/dist/workflows/loop/actions/cursor-fix.js +0 -191
  205. package/dist/workflows/loop/policy/cursor-fix-policy.js +0 -31
  206. package/docs/cursor-executor-usage.md +0 -25
  207. package/docs/dynamic-workflow-dag-engine-roadmap.md +0 -1749
@@ -0,0 +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 深度编排等仍是**设计输入**,见 `docs/design/dynamic-workflow-dag-engine-roadmap.md`(带 2026-07-14 校准条)。
@@ -0,0 +1,53 @@
1
+ # 架构演进:当前 vs 未来
2
+
3
+ 本页区分 loop-agent **当前已实现**的架构能力与**未来规划**。当前事实以代码、发布 CLI、已完成计划为准;未来能力一律标「规划 / 未实现 / 前瞻」。权威源:`CHANGELOG.md`、`docs/reports/current-capability-summary.md`、ADR 0001–0003、`docs/exec-plans/completed/`。
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 | `docs/reports/2026-07-13-versioned-self-hosting-bootstrap.md` |
13
+ | Feature 交付(M2) | review/run/approve-followup/delivery/closeout/verify-final | `docs/reports/2026-07-12-m2-completion-audit.md` |
14
+ | Task Pool | 唯一根 `.harness/task-pool/` | ADR 0002 |
15
+ | Observe | 本地只读暖白运营控制台 R1–R5(derived) | `website/docs/guides/observe-ui.md`、`CHANGELOG.md [0.11.0]` |
16
+ | DagSpec / repair | v3 + `runtimeContract`;显式 `repairNodeId` | `CHANGELOG.md [0.11.0]`、`dag-execution.md` |
17
+ | 文档双树 | `website/docs/` 用法 vs `docs/` 治理;docs-converge | ADR 0003 |
18
+ | 文档治理 | `docs/architecture/` 主题文档(本目录)+ package 可达 | 本目录 README |
19
+
20
+ ### 受治理 runtime 的边界(已实现、不变式)
21
+
22
+ - DAG writer 固定 `implement-pi` / `repair-pi`;`executor: "cursor"`、`implement-cursor` / `repair-cursor`、Cursor worker、`cursor-fix` 已从受治理路径移除。
23
+ - 完成权威 = shell verification;model verdict / Observe / 报告是 derived/advisory。
24
+ - Worker 通过已发布 `loop-agent` 子进程执行,不 in-process import runtime kernel(governance 机器校验)。
25
+
26
+ ## 未来规划(第 3–6 月,**未实现**)
27
+
28
+ 以下能力来自 `docs/design/六个月规划.md` 与 `docs/design/dynamic-workflow-dag-engine-roadmap.md`(六个月规划页首 2026-07-15 / 0.11.0 校准;未交付 phase 为**设计输入**,不是已实现证明)。它们**当前不存在于代码或 CLI**:
29
+
30
+ | 未来方向 | 状态 | 规划来源 |
31
+ | --- | --- | --- |
32
+ | 远程 PR / CI | 规划 / 未实现 | `docs/design/六个月规划.md`(第 3 个月起) |
33
+ | 线上 / 云 Worker | 规划 / 未实现 | 同上 |
34
+ | 云 Task Pool / SQL / Orchestrator | 规划 / 未实现 | 同上(第 2 月原始设计已调整为本地 Feature 闭环) |
35
+ | 多仓库平台 | 规划 / 未实现 | 同上 |
36
+ | 组织级服务 | 规划 / 未实现 | 同上 |
37
+ | Web Console(远端) | 规划 / 未实现 | 同上 |
38
+ | Dynamic Workflow runtime limits 强执法、更广 profile | 设计输入 | `docs/design/dynamic-workflow-dag-engine-roadmap.md`(未勾选 phase) |
39
+ | Loop 与 Dynamic Workflow 更深的双向集成、稳定化与自动恢复 | 设计输入 | 同上;当前已有基础 `workflow` action,不应误写为完全缺失 |
40
+
41
+ > 注意:`docs/design/dynamic-workflow-dag-engine-roadmap.md` 是 2026-07-04 历史叙述;文中凡把 Cursor 写成受治理 executor 或 `loop` 的 `cursor-fix` 动作,均为**历史叙述**,现状以 Pi-only + 显式 `cursor-prompt` sidecar 为准。
42
+
43
+ ## 已收敛为 archive / 历史基线(非未来)
44
+
45
+ - 第 1–2 月规划已收敛为 archive/reports 指针,不在本文展开:`docs/design/archive/2026-07-12-第二月规划.md`。
46
+ - `docs/reports/2026-07-02-repository-analysis.md` 自 2026-07-14 起冻结为**历史基线快照**,不再滚动追加 Unreleased 能力。
47
+ - 活能力短摘要在 `docs/reports/current-capability-summary.md`。
48
+
49
+ ## 文档本体的演进边界
50
+
51
+ - 本目录新增文档随发布包发布(`package.json` `files` + manifest `packageRequired` 显式条目),但 **不**投影到目标项目 init surface(AC-7);目标项目 init 仍只投影语言无关的 `runtime-boundaries.md`。
52
+ - `runtime-boundaries.md` 是边界真源;本目录其他文档交叉引用,不复制其 import 方向表 / governance-hook 表 / 版本化自举边界表。
53
+ - 未来如有能力落地,应先改 `src/`/CLI/ADR/completed plan,再回写本目录的「已实现」表。
@@ -0,0 +1,58 @@
1
+ # 事实与状态
2
+
3
+ 本页说明 `.harness/` 各根目录、canonical facts、derived read models 与不可变规则,并逐条标出 canonical|derived 与 writable|read-only。完成权威是 shell verification(ADR 0001);model verdict、Observe、报告都是 derived 或 advisory 视图。
4
+
5
+ ## 六类运行态对象
6
+
7
+ | 对象 | 物理根 | 源码入口 | 性质 |
8
+ | --- | --- | --- | --- |
9
+ | Task | `.harness/tasks/<taskId>/` | `src/task/runtime.ts` `getTaskDir` | canonical,可写 |
10
+ | DAG run | `.harness/dag-runs/{active,paused,completed}/<runId>/` | `src/workflows/dag/lifecycle.ts` `DAG_RUNS_DIR` | canonical,active/paused 可写;completed 受 guard |
11
+ | one-shot run | `.harness/runs/{active,completed,failed}/<slug>/` | `src/infrastructure/harness/one-shot-run-store.ts`(逻辑封装见 `src/records/one-shot-runs.ts`) | canonical;active 可写,completed/failed 为终态事实 |
12
+ | Loop | `.harness/tasks/<taskId>/loop/` | `src/workflows/loop/**` | canonical,**不是独立根**,是 task 之上的多轮状态机 |
13
+ | Task Pool | `.harness/task-pool/`(唯一根) | `src/worker/pool/run-store.ts` `TASK_POOL_RELATIVE_ROOT`(ADR 0002) | canonical,可写(Worker 专用,可选) |
14
+ | Observe snapshot | Worker 内存/HTTP 派生视图 | `src/worker/observability/read-model.ts` `buildGlobalSnapshot` | **derived**,advisory |
15
+
16
+ ### 区分要点
17
+
18
+ - **Task vs DAG run**:Task 是用户意图的源(`source/`、需求、执行约束、artifacts);DAG run 是一次执行实例,`<runId>/` 下落 spec、state、节点 artifacts、skill snapshot、controller identity(`controller-identity.json`,冻结执行 controller 的 package version/binary 哈希/portable fingerprint,state 记录相对 ref 与内容哈希,resume 时重新校验、漂移 fail closed)、decision envelope、convergence。
19
+ - **DAG run vs one-shot run**:DAG run 在 `.harness/dag-runs/`,有三态 lifecycle;one-shot run(当前主要由 `cursor-prompt` 及显式 one-shot evidence 路径产生)在 `.harness/runs/`,三态为 `active|completed|failed`。`pi-prompt` 当前不创建该目录下的 run evidence。两者是不同根、不同 schema。
20
+ - **Loop 不是顶层根**:Loop 状态在 `.harness/tasks/<taskId>/loop/`,是 task 之上的多轮状态机(round、signal、context、failureStreak、closeout)。
21
+ - **Task Pool 是 Worker 专用可选根**:只有使用 `agent-worker` 产品线时才存在;唯一根 `.harness/task-pool/`。
22
+ - **Observe snapshot 不是事实源**:`buildGlobalSnapshot` 投影失败返回安全错误摘要而非全零健康,不改变执行成败。
23
+
24
+ ## canonical(可写)
25
+
26
+ - `.harness/tasks/<taskId>/` — `getTaskDir`。
27
+ - `.harness/dag-runs/{active,paused}/<runId>/` — run 进行中 / 暂停。
28
+ - `.harness/runs/active/<slug>/` — one-shot 运行中;完成或失败后通过 store 迁移到终态目录。
29
+ - `.harness/tasks/<taskId>/loop/` — Loop 状态机。
30
+ - `.harness/task-pool/` — Worker Task Pool(可选)。
31
+
32
+ `.harness/prompts/` 与 `.harness/init-surface.json` 属于初始化投影/控制资料,不是一次执行的 canonical run fact,需与上面的任务和 run 对象区分。
33
+
34
+ ## canonical(只读 / 不可变)
35
+
36
+ - `.harness/dag-runs/completed/<runId>/` — 除 runner 终态 `persistState({ allowCompletedFactsWrite: true })` 与显式 `dag reconcile-run`(`--action supersede|abandon` + reason,runner 已证明停止)外只读。
37
+ - `.harness/runs/completed/<slug>/` 与 `.harness/runs/failed/<slug>/` — one-shot 终态事实;公共写接口只对 active run 开放,完成/失败通过 store 迁移。
38
+ - `completed-facts-guard.ts`(`src/infrastructure/harness/`)是 completed 路径 enforcement 入口:`assertHarnessWriteAllowed(targetPath, { repoRoot, allowCompletedFactsWrite? })`。
39
+ - promotion(completed → task artifacts 回填)由 `src/records/promotion.ts` 经 `loadCompletedDagEvidence` 读 completed state 后写 task artifacts。
40
+
41
+ ## derived / advisory(不可作完成权威)
42
+
43
+ | 视图 | 来源 | 为何不可作权威 |
44
+ | --- | --- | --- |
45
+ | Observe snapshot / 首页 KPI | `buildGlobalSnapshot` 投影 `.harness/` + Task Pool | derived;投影失败安全降级 |
46
+ | decision envelope 的 model verdict | `decision` / `riskLevel` 解析自文本 | `advisoryOnly: true`(`decision-envelope.ts` / `decision-evidence.ts` / `lifecycle.ts`) |
47
+ | canvas / event observer | `notifyRunObserver` / `notifyNodeObserver` | try/catch 吞;明确派生视图,不 affect canonical 执行 |
48
+ | DAG report / doctor | `src/application/dag/report-dag.ts` + `src/workflows/dag/report.ts`;doctor 在 `src/workflows/dag/lifecycle.ts` | 只读总结,operator 决策辅助 |
49
+ | knowledge-curator proposal | `src/workflows/dag/knowledge-curator.ts` | advisory process guidance,不改 accepted learned skill |
50
+ | morning report / metrics | `src/worker/report/**` | derived 统计,含分母/样本量/缺失说明 |
51
+
52
+ ## 完成权威
53
+
54
+ 完成权威 = shell command 的 exit code 与归档 stdout/stderr。执行入口是 `src/executors/shell-executor.ts`,环境/preset helper 在 `src/executors/shell-verification.ts`;`node.verifyEvidence` 保存 DAG authoring 提供的验证阶段、命令来源与标签等元数据。model verdict、Observe、报告都不构成完成判定。
55
+
56
+ ## init 投影的 `.harness` 入口
57
+
58
+ `init --profile full` 在目标项目创建 `.harness/tasks`(directory)、`.harness/dag-runs/active`(directory)、`.harness/prompts/analyze.md`(generated)、`.harness/init-surface.json`(state)。这些是 init surface,不在 `packageExcluded`/`initExcluded` 范围;详见 `docs/init-surface.manifest.json`。
@@ -1,12 +1,13 @@
1
1
  # Runtime Boundaries
2
2
 
3
- 本文定义 loop-agent 各 runtime 层的 module interface、允许的依赖方向,以及治理检查 hook。目标是把「命令、文档、import 架构」从多处维护收敛为可机器校验的边界契约,而不在本阶段改变 runtime 行为。
3
+ 本文定义 loop-agent 各 runtime 层的 module interface、允许的依赖方向,以及治理检查 hook。目标是把命令、文档、import 架构、controller identity 与 run-owned execution facts 收敛为可机器校验的边界契约。
4
4
 
5
5
  ## 分层概览
6
6
 
7
7
  ```text
8
8
  Skill layer
9
- └─ 入口策略、reference 路由、硬规则(skills/loop-agent/SKILL.md + references/)
9
+ ├─ DAG/runtime 入口策略(skills/loop-agent/)
10
+ └─ Feature/Task Pool 外层 operator 路由(skills/agent-worker/)
10
11
 
11
12
  CLI layer (src/cli/)
12
13
  └─ argv 解析、adapter 解析、调用 application / command handler、格式化输出
@@ -18,11 +19,14 @@ Workflow runtime (src/workflows/)
18
19
  └─ DAG / Dynamic / Loop 核心执行规则;不应依赖 commands
19
20
 
20
21
  Executors (src/executors/)
21
- └─ Cursor / Pi / Shell 等外部工具适配;不应依赖 commands 或 CLI formatting
22
+ └─ Pi / Shell / Static 等受治理外部工具适配;不应依赖 commands 或 CLI formatting
23
+
24
+ Sidecars (src/sidecars/)
25
+ └─ 显式手工 one-shot 工具(如 cursor-prompt);不得被 workflows/application/task/worker 依赖
22
26
 
23
27
  Worker adapter (src/worker/)
24
- └─ 产品线 TaskSpec / Task Pool / Observe 本地适配;以子进程调用已发布 loop-agent CLI
25
- 不得 in-process import CLI、commands 或 application
28
+ └─ 产品线 TaskSpec / Task Pool / Observe 本地适配;冻结已发布 loop-agent controller identity
29
+ 以绝对子进程 launch spec 调用 CLI,不得 in-process import CLI、commands 或 application
26
30
 
27
31
  Infrastructure / Store (src/infrastructure/,逐步引入)
28
32
  └─ .harness 文件系统副作用、run lifecycle、原子写入规则
@@ -35,8 +39,9 @@ Governance (scripts/check-*.sh, src/governance/)
35
39
 
36
40
  ### Skill layer
37
41
 
38
- - **位置**:`skills/loop-agent/SKILL.md` `skills/loop-agent/references/**`
39
- - **职责**:定义 agent 何时启用 loop-agent、默认执行路径(Agent DAG)、硬规则与 reference 路由;不承载完整操作手册。
42
+ - **位置**:`skills/loop-agent/**` `skills/agent-worker/**`
43
+ - **职责**:`loop-agent` skill 定义单个 DAG/runtime 工作的入口、硬规则与 reference 路由;`agent-worker` skill 只定义 Feature Packet、TaskSpec、Task Pool、controller pinning、自举 release train 与失败恢复的外层 operator 路由。
44
+ - **路由边界**:DAG leaf node 不得递归启动 `agent-worker`;`agent-worker` 不得加入 `DEFAULT_SKILLS_BY_ROLE`,也不实现 executor、scheduler、prompt 或 write guard。
40
45
  - **禁止**:在入口 skill 中重复维护 CLI command 列表或与 `src/cli/catalog.ts` 冲突的事实源。
41
46
 
42
47
  ### CLI layer
@@ -56,35 +61,44 @@ Governance (scripts/check-*.sh, src/governance/)
56
61
  ### Workflow runtime
57
62
 
58
63
  - **位置**:`src/workflows/dag/**`、`src/workflows/dynamic/**`、`src/workflows/loop/**`
59
- - **职责**:DAG spec 校验与执行、dynamic workflow 编译与 expansion、Loop 状态机与 action 编排。
64
+ - **职责**:DAG spec 校验与执行、dynamic workflow 编译与 expansion、Loop 状态机与 action 编排;新 DAG run 在任何节点执行前创建 run-owned resolved skill profile snapshot,并在普通节点、dynamic child、approve/resume 路径执行 integrity gate。
65
+ - **skill snapshot 契约**:snapshot ref 使用 run-relative `.runtime/skill-snapshot.json` 与原始 bytes SHA-256;ref、artifact、profile 或 binding 不一致时 fail closed,不允许回退 live skill resolution。旧 run 只有在 ref 与 artifact 都不存在时,才可在 resume 前标记为 `legacy-resume-backfill` 并冻结剩余节点。
60
66
  - **允许依赖**:`src/executors/**`、`src/task/**`、`src/records/**`、`src/shared/**`、application use-case(目标态)。
61
67
  - **禁止**:`import` 来自 `src/commands/**`(见下方过渡例外)。
62
68
 
63
69
  ### Executors
64
70
 
65
71
  - **位置**:`src/executors/**`
66
- - **职责**:封装 Cursor SDK/CLI、Pi SDK/CLI、shell 执行与 write guard。
67
- - **允许依赖**:`src/shared/**`、外部 SDK
68
- - **禁止**:依赖 `src/commands/**` CLI 输出格式。
72
+ - **职责**:封装 Pi SDK、shell 执行、static 输出与 write guard。受治理 Agent runtime 只有 Pi
73
+ - **允许依赖**:`src/shared/**`、外部 SDK(不含 `@cursor/sdk`)。
74
+ - **禁止**:依赖 `src/commands/**`、CLI 输出格式,或 import `src/sidecars/**` / `@cursor/sdk`。
75
+
76
+ ### Sidecars
77
+
78
+ - **位置**:`src/sidecars/cursor-prompt/**`
79
+ - **职责**:`cursor-prompt` one-shot 手工干预;仅在显式调用时动态加载 `@cursor/sdk`。
80
+ - **禁止**:被 `src/workflows/**`、`src/application/**`、`src/task/**`、`src/worker/**` 或普通 `src/executors/**` import。
69
81
 
70
82
  ### Worker adapter
71
83
 
72
84
  - **位置**:`src/worker/**`,独立 `agent-worker` CLI 为 `src/worker/cli.ts`。
73
85
  - **职责**:TaskSpec 校验与物化、Task Pool batch/retry/morning report under `.harness/task-pool/`、失败路由,以及只读 Observe 事件/快照/UI;实际 DAG 执行通过 `LoopAgentClient` 启动已发布的 `loop-agent` 子进程。自 0.8.0 起该目录是唯一受支持的 Task Pool runtime root,旧路径不读取、不迁移、不合并、不重映射。
86
+ - **controller identity**:写入型 Feature/batch/Task/final verification 在任何目标仓库或 Task Pool 状态写入前解析并冻结 schemaVersion 1 identity,包括 package name/version、绝对 entry/real entry、直接可执行 launch spec、binary SHA-256 和覆盖 `package.json`、`bin/**`、`dist/**`、`skills/**` 的 portable fingerprint。expected version/fingerprint 不匹配时 fail-fast;后续 spawn 不重新查询 PATH。
87
+ - **证据传播**:canonical Worker record、Task Pool run、batch/Feature、QA/final evidence 可选携带同一 identity;只有所有相关层都省略 identity 时才按 legacy evidence 接受,部分缺失或锚点不一致会拒绝。
74
88
  - **允许依赖**:TaskSpec、Task Pool、observability、Node filesystem/path 与明确的 shared/task contract;它不是第二套 executor 或 DAG kernel。
75
89
  - **禁止**:in-process import `src/cli/**`、`src/commands/**` 或 `src/application/**`。
76
90
 
77
91
  ### Infrastructure / Store
78
92
 
79
93
  - **位置**:`src/infrastructure/harness/**`(按计划逐步引入);过渡期部分逻辑仍在 `src/workflows/dag/lifecycle.ts`、`src/records/**`。
80
- - **职责**:`.harness/tasks`、`.harness/dag-runs`、`.harness/runs`、loop state 的集中读写;completed run facts 只读约束。
81
- - **DAG recovery mutation**:`dag reconcile-run` 是显式 operator 边界;默认仅检查,只有给出 action + reason 且 runner 已证明停止时才能保存原始快照、写 terminal reconciliation facts 并迁移 lifecycle。Observe、status 和 doctor 始终只读。
82
- - **禁止**:把 raw path mutation 扩散给 runner、loop action 或 command handler。
94
+ - **职责**:`.harness/tasks`、`.harness/dag-runs`、`.harness/runs`、loop state 的集中读写;completed run facts 只读约束。DAG run 自有的 `.runtime/skill-snapshot.json` 随 lifecycle 目录整体迁移,state 只保存相对 ref 和 hash,不保存 active/paused/completed 绝对路径。
95
+ - **DAG recovery mutation**:`dag reconcile-run` 是显式 operator 边界;默认仅检查,只有给出 action + reason 且 runner 已证明停止时才能保存原始快照、写 terminal reconciliation facts 并迁移 lifecycle。Observe、status 和 doctor 始终只读。
96
+ - **禁止**:把 raw path mutation 扩散给 runner、loop action 或 command handler。
83
97
 
84
98
  ### Governance
85
99
 
86
100
  - **位置**:`scripts/check-repo.sh` 及子脚本、`src/governance/**`、相关 Vitest。
87
- - **职责**:在 CI / in-flight DAG 中检测文档链接、exec plan 状态、架构 import、command registry 漂移、skill entry 完整性。
101
+ - **职责**:在 CI / in-flight DAG 中检测文档链接、exec plan 状态、架构 import、command registry 漂移、两个公共 skill entry 与 init/package surface 完整性。源码仓库另提供 `scripts/self-host-canary.mjs` 作为 repo-maintainer candidate takeover 证据入口;它不属于发布 package surface。
88
102
 
89
103
  ## 允许的依赖方向
90
104
 
@@ -111,6 +125,17 @@ Infrastructure ──────────> Shared / node:fs
111
125
  Runner / Loop ──(迁移中)──> 逐步改为仅经 Store / Application
112
126
  ```
113
127
 
128
+ ## 版本化自举边界
129
+
130
+ 版本化自举包含两个不同的冻结层,不能用其中一个替代另一个:
131
+
132
+ | 层 | 冻结对象 | 生命周期 | 权威证据 |
133
+ |---|---|---|---|
134
+ | Controller identity | 实际发布包、entry/realEntry、launch spec、binary hash、portable package fingerprint | Feature/batch/Task/final verification | Worker、Task Pool、batch/Feature、QA/final evidence 中的 `controllerIdentity` |
135
+ | DAG skill snapshot | 某个 run 实际注入 prompt 的 ordered skill profiles、learned flag、budgets 与 dynamic bindings | 单个 DAG run,包括 pause/resume | `state.skillSnapshotRef` + `<runDir>/.runtime/skill-snapshot.json` |
136
+
137
+ 源码仓库的 deterministic candidate canary 是第三类、只读/确定性接棒证据:候选 tarball 安装到隔离 slot,两个 bin 从包内绝对入口启动,PATH 中放置 controller fallback trap,并只执行 Feature dry-run 与 static/shell DAG。它必须证明 `piExecutorObserved=false`、`modelExecutorObserved=false` 和 `featureExecutedTasks=[]`,因此不能被描述为 live Pi takeover,也不承担 candidate-package Pi skill source resolution 证明;snapshot 定向测试和真实 DAG evidence 单独承担后者。
138
+
114
139
  **规则摘要**
115
140
 
116
141
  | From | May import | Must not import |
@@ -136,9 +161,12 @@ Runner / Loop ──(迁移中)──> 逐步改为仅经 Store / Appli
136
161
  |--------|----------|----------|
137
162
  | `scripts/check-architecture-boundaries.sh` | workflow/executor forbidden import,及 Worker → CLI/commands/application import | 新的未 allowlist violation |
138
163
  | `scripts/check-command-registry-drift.sh` | `command-reference.md` 中的 top-level command vs `src/cli/catalog.ts` | 文档引用未注册 command |
139
- | `scripts/check-skill-entry.sh` | `SKILL.md` reference 文件存在、行数阈值 | reference 缺失(fail);行数 > 220(warn) |
164
+ | `scripts/check-exec-plan-index-sync.sh` | `docs/exec-plans/{active,completed}` 目录文件 vs 对应 `README.md` 索引 | 任一 plan 文件未在索引登记 |
165
+ | `scripts/check-skill-entry.sh` | `loop-agent` / `agent-worker` 的 frontmatter、required references、入口行数与 operator trigger vocabulary | 任一公共 skill 缺失、reference/trigger 漂移或入口超过 hard limit |
166
+
167
+ 版本化自举相关 exec plan:`docs/exec-plans/active/2026-07-13-versioned-self-hosting-bootstrap.md`。
140
168
 
141
- 相关 exec plan:`docs/exec-plans/active/2026-07-04-runtime-boundary-remediation.md`。
169
+ `src/governance/exec-plans.ts` exec-plan 创建、完成与索引校验的共享 TypeScript 事实源:`plan create`/`plan complete`/`plan check` 与 `dag run-task` 前置校验都调用它。`scripts/check-exec-plan-index-sync.sh` 是独立的 shell 最终防线,与 TypeScript checker 并存;两者均不删除或弱化。
142
170
 
143
171
  ### 验证命令
144
172
 
@@ -0,0 +1,93 @@
1
+ # 系统全景
2
+
3
+ 本页用一张全景图说明 loop-agent、agent-worker、治理层与外部系统的关系。依赖方向、import 边界与 governance hook 是契约级事实,权威源是 `runtime-boundaries.md`(本页只交叉引用,不复制)。
4
+
5
+ ## 两个 CLI 二进制
6
+
7
+ 发布包 `@tea-agent/loop-agent` 提供两个入口(见 `package.json` `bin`):
8
+
9
+ | 二进制 | 入口 | 角色 |
10
+ | --- | --- | --- |
11
+ | `loop-agent` | `bin/loop-agent.js` → `src/cli.ts` | 仓库级 AI coding 任务运行时与治理控制器 |
12
+ | `agent-worker` | `bin/agent-worker.js` → `src/worker/cli.ts` | 产品线 TaskSpec / Feature / Task Pool / Observe 外层适配 |
13
+
14
+ 两个二进制是独立进程,不共享 in-process runtime。`agent-worker` 真正执行 DAG 时通过已发布的 `loop-agent` 子进程调用(详见 `worker-and-feature.md`)。
15
+
16
+ ## 分层概览(交叉引用)
17
+
18
+ 完整分层图、各层职责、允许/禁止的 import 方向见 `runtime-boundaries.md` §分层概览 与 §各层职责。一句话摘要:
19
+
20
+ ```text
21
+ Skill layer skills/loop-agent、skills/agent-worker(Markdown,非 TS import)
22
+ CLI layer src/cli/ — argv 解析、调用 application/handler、格式化输出
23
+ Application src/application/ — typed use-case(validate/run/generate DAG 等)
24
+ Workflow runtime src/workflows/ — DAG / Dynamic / Loop 核心执行规则
25
+ Executors src/executors/ — Pi / shell / static 受治理外部工具适配
26
+ Sidecars src/sidecars/cursor-prompt — 显式手工 one-shot;不得被 workflow 自动依赖
27
+ Worker adapter src/worker/ — 产品线适配 + Observe;子进程调用已发布 loop-agent
28
+ Infrastructure src/infrastructure/ — .harness 副作用、run lifecycle、原子写入
29
+ Governance scripts/check-*.sh、src/governance/ — 防漂移机器校验
30
+ ```
31
+
32
+ ## 两条入口路径
33
+
34
+ ### 直接任务路径
35
+
36
+ ```text
37
+ 人类 / 主 agent
38
+ │ 写任务源与执行约束(.harness/tasks/<taskId>/source)
39
+
40
+ loop-agent(runtime + 治理控制器)
41
+ │ dag run-task / validate / run-dag / report / doctor / reconcile-run
42
+
43
+ workflow runtime(调度 Pi / shell / static 节点)
44
+ │ 证据落入 .harness/dag-runs/{active,paused,completed}/<runId>/
45
+ └─ report / doctor / promote / closeout 读取并投影证据
46
+ ```
47
+
48
+ ### 产品线 Feature 路径
49
+
50
+ ```text
51
+ 人类 / 外部调度器
52
+ → agent-worker(TaskSpec / Feature / Task Pool)
53
+ → 冻结 controller identity
54
+ → spawn 已发布 loop-agent 子进程
55
+ → 同一 DAG runtime 与 executor registry
56
+ → DAG facts + Task Pool records
57
+ → Feature review / morning report / Observe(派生只读视图)
58
+ ```
59
+
60
+ `agent-worker` 位于核心 runtime 的**上游调用侧**,不是 DAG 执行完成后的必经下游。Observe 可以在任一路径后读取现有事实,但不会改变执行结果。
61
+
62
+ ## 外部边界
63
+
64
+ - npm 发布包:`@tea-agent/loop-agent`,包含两个 bin 与静态能力资料。
65
+ - 目标仓库:`loop-agent init` 投影语言无关治理资料;源码仓库专用架构文档只随包可读,不默认投影。
66
+ - 本地文件系统:`.harness/` 保存运行态事实;Git 工作树保存代码、治理文档与长期交接资料。
67
+ - 远程 Git/PR/CI、云 Worker 与云 Task Pool 当前不是核心 runtime 的已实现内置边界,见 `evolution.md`。
68
+
69
+ ## 治理层入口
70
+
71
+ 治理检查是机器校验,不是文档约定。主入口:
72
+
73
+ - `scripts/check-repo.sh` — 聚合入口,CI / in-flight DAG 均调它。
74
+ - 子脚本:`scripts/check-architecture-boundaries.sh`(import 边界)、`scripts/check-command-registry-drift.sh`(command registry)、`scripts/check-skill-entry.sh`(公共 skill entry)、`scripts/check-doc-index.sh` / `scripts/check-doc-links.sh`(文档链接)、`scripts/check-init-surface.sh`(package/init surface 契约)、`scripts/check-init-evolution-needed.sh`(高影响变更需报告)。
75
+ - `src/governance/**` — 治理逻辑与相关 Vitest。
76
+ - `scripts/self-host-canary.mjs` — 源码仓库的 deterministic candidate takeover 证据入口;**不**属于发布 package surface。
77
+
78
+ 完整的 governance hook 表(哪个脚本检查什么、失败条件)见 `runtime-boundaries.md` §Governance 钩子。
79
+
80
+ ## 受治理 Agent runtime = Pi-only
81
+
82
+ 自 0.10.0 起受治理 Agent runtime 硬切为 Pi-only(ADR 0001)。DAG 中 `dagNodeExecutorSchema = z.enum(["pi","shell","static"])`;`executor: "cursor"` 会抛 `CURSOR_DAG_EXECUTOR_REMOVED_ERROR`。`cursor-prompt` 仅保留为显式手工 one-shot sidecar,不进入 Loop auto-execute 或 Delegate 自动写入。详见 `dag-execution.md` 与 `runtime-boundaries.md` §Executors / §Sidecars。
83
+
84
+ ## 运行态 vs 治理资料 vs 用法文档
85
+
86
+ | 位置 | 内容 | 权威性质 |
87
+ | --- | --- | --- |
88
+ | `.harness/` | 任务、DAG run、one-shot run、Task Pool、live state | 运行态事实(canonical + derived) |
89
+ | 根目录 `docs/` | 原则、边界、计划、报告、模板 | 治理权威 |
90
+ | `website/docs/` | 使用者/贡献者导读与操作说明 | 用法双树 |
91
+ | `skills/` | agent 可加载的入口与 reference | 运行时可加载 |
92
+
93
+ `.harness/` 内部哪些可写、哪些只读、哪些是 derived,详见 `facts-and-state.md`。
@@ -0,0 +1,81 @@
1
+ # Worker 与 Feature 架构
2
+
3
+ 本页说明 `agent-worker` 如何通过冻结的已发布 `loop-agent` 子进程执行 DAG(不 in-process import runtime kernel),以及其上的产品线 read model:TaskSpec、Task Pool、Feature 与 Observe。边界契约权威是 `runtime-boundaries.md` §Worker adapter。
4
+
5
+ ## 核心事实:子进程,非 in-process
6
+
7
+ `agent-worker` 真正执行 DAG 时通过 Node `child_process.spawn` 启动**已发布**的 `loop-agent`,**不** in-process import runtime kernel:
8
+
9
+ | 事实 | 源码入口 |
10
+ | --- | --- |
11
+ | 客户端 | `src/worker/loop-agent/loop-agent-client.ts` `LoopAgentClient` |
12
+ | 执行入口 | `LoopAgentClient.run(args, options)` |
13
+ | spawn 实现 | `spawnCommand(...)` → `spawn(input.command, input.args, { cwd, env, shell: false, stdio: ["ignore", "pipe", "pipe"] })` |
14
+ | 治理禁止 | `scripts/check-architecture-boundaries.sh` 禁止 `src/worker/**` → `src/{cli,commands,application}/**`,transitional allowlist 为空 |
15
+
16
+ `shell: false` + 绝对 launch spec(见下)意味着 Worker 不走 PATH 重新解析,也不在当前进程内加载 CLI command 实现。
17
+
18
+ ## controller identity(冻结的已发布 controller)
19
+
20
+ 每次写入型 Feature/batch/Task/final verification 在任何目标仓库或 Task Pool 状态写入前,`LoopAgentClient` 解析并冻结 schemaVersion 1 identity(`ControllerIdentityV1`,定义在 `src/shared/package-metadata.ts`):
21
+
22
+ | 字段 | 含义 |
23
+ | --- | --- |
24
+ | `schemaVersion` | 固定 `1` |
25
+ | `packageName` | 必须为 `@tea-agent/loop-agent` |
26
+ | `binName` / `requested` / `entry` / `realEntry` | 入口解析链(realEntry 经 `realpathSync`) |
27
+ | `launch.command` / `launch.argsPrefix` | 直接可执行的绝对 launch spec |
28
+ | `binarySha256` | `actualEntry` 二进制 hash |
29
+ | `packageVersion` | `package.json` version |
30
+ | `packageFingerprint` | 覆盖 `package.json`、`bin/**`、`dist/**`、`skills/**` 的 portable fingerprint(`computePackageFingerprint`) |
31
+
32
+ 关键方法:
33
+
34
+ - `resolveIdentity()`(`loop-agent-client.ts`):首次解析并冻结 identity;`this._identityResolved = true`。
35
+ - `assertControllerIdentityUnchangedBeforeSpawn(identity)`(`loop-agent-client.ts`):**每次 spawn 前**重验,漂移即 throw(`run` 与 `runCommand` 路径都调)。
36
+ - `getIdentity()` / `observeReportedVersion(reportedVersion)`:读取/校验子进程回报的版本须与 `packageVersion` 一致。
37
+
38
+ CLI 层(`src/worker/cli.ts`)在写入型命令传 `resolveIdentity: true` 构造 `LoopAgentClient`,并支持 `--expected-controller-version` / `--expected-controller-fingerprint` fail-fast(见 `src/worker/preflight.ts`)。
39
+
40
+ controller identity 与 DAG skill snapshot 是两个不同冻结层(前者跨 Worker/Task Pool/Feature 生命周期,后者单个 DAG run),见 `runtime-boundaries.md` §版本化自举边界。
41
+
42
+ ## 独立 CLI
43
+
44
+ `agent-worker` 是独立 CLI(`bin/agent-worker.js` → `src/worker/cli.ts`),有自己的命令面(`task`、`batch`、`feature`、`report`、`observe` 等)。它**不是**第二套 executor 或 DAG kernel;它编排产品线 Task 并把执行委托给 `loop-agent` 子进程。
45
+
46
+ ## 产品线 read model
47
+
48
+ ### TaskSpec
49
+
50
+ - schema/validate:`src/worker/task-spec/{schema,validate}.ts`。
51
+ - 校验验收条件、依赖、验证命令;`agent-worker task validate-feature` 等用之。
52
+
53
+ ### Task Pool
54
+
55
+ - 唯一 runtime root:`src/worker/pool/run-store.ts`
56
+ `TASK_POOL_RELATIVE_ROOT = ".harness/task-pool"`(ADR 0002)。
57
+ - 旧顶层路径不读取、不迁移、不合并、不重映射。
58
+ - batch/retry/morning report 等都基于此根。
59
+
60
+ ### Feature(M2 交付闭环)
61
+
62
+ - review/run/approve-followup/delivery/closeout/verify-final:`src/worker/feature/{review,run}.ts` 及相关。
63
+ - Follow-up:`src/worker/` 下 draft-followup + approve-followup 事务,覆盖全部失败分类(可执行/Spec/Risk/Human/EnvFailure)。
64
+ - Delivery / Closeout:clean Delivery HEAD 上生成 canonical QA/最终验证证据、Delivery Package、Acceptance Coverage、PR 草稿;Closeout 默认预览,显式 `--apply --owner` 才原子写回。
65
+ - 权威证据:`CHANGELOG.md [0.10.0]`、`docs/reports/2026-07-12-m2-completion-audit.md`。
66
+
67
+ ### Observe(只读 read model)
68
+
69
+ - 模块:`src/worker/observe/`、`src/worker/observability/{read-model,event-store}.ts`。
70
+ - 全局快照:`buildGlobalSnapshot({ repoRoot })`(`src/worker/observability/read-model.ts`),是 **derived** 视图,消费 `.harness/` 与 Task Pool 事实,**不**改变执行成败。
71
+ - Observe 是本地只读暖白控制台;snapshot 投影失败返回安全错误摘要而非全零健康状态(见 `CHANGELOG.md [0.9.0]`)。
72
+
73
+ ## 版本化自举的 deterministic canary
74
+
75
+ 源码仓库的 deterministic candidate canary(`scripts/self-host-canary.mjs`,`npm run self-host:canary -- --deterministic`)是只读/确定性接棒证据:候选 tarball 安装到隔离 slot,两个 bin 从包内绝对入口启动,PATH 中放置 controller fallback trap,只执行 Feature dry-run 与 static/shell DAG。它必须证明 `piExecutorObserved=false` / `modelExecutorObserved=false` / `featureExecutedTasks=[]`,因此**不是** live Pi takeover。该脚本**不**属于发布 package surface(`package.json` `files` 不含它)。
76
+
77
+ ## 不变式
78
+
79
+ - Worker 不得 in-process import `src/cli/**`、`src/commands/**` 或 `src/application/**`(governance 机器校验)。
80
+ - Worker 不实现 executor、scheduler、prompt 或 write guard。
81
+ - `agent-worker` skill(`skills/agent-worker/`)不加入 `DEFAULT_SKILLS_BY_ROLE`;DAG leaf node 不得递归启动 `agent-worker`(`runtime-boundaries.md` §Skill layer)。
@@ -0,0 +1,36 @@
1
+ # cursor-prompt Sidecar
2
+
3
+ `cursor-prompt` 是显式、手工触发的 one-shot sidecar。它不是受治理 Agent runtime,也不参与 DAG、Loop 自动写入、Delegate `--auto-run` 或 task writer 选择。
4
+
5
+ ## 产品定位
6
+
7
+ | 路径 | 角色 |
8
+ |---|---|
9
+ | Pi DAG (`implement-pi` / `repair-pi`) | 唯一受治理 Agent writer |
10
+ | shell / static | 确定性验证与静态输出 |
11
+ | `cursor-prompt` | 人工 one-shot 干预;成功不等于任务完成 |
12
+
13
+ ## 用法
14
+
15
+ ```bash
16
+ loop-agent cursor-prompt --cwd . "bounded task prompt"
17
+ loop-agent cursor-prompt --file <path>
18
+ loop-agent cursor-prompt --stdin
19
+ loop-agent cursor-prompt --model <id>
20
+ loop-agent cursor-prompt --timeout <ms>
21
+ loop-agent cursor-prompt --stream
22
+ loop-agent cursor-prompt --list-models
23
+ ```
24
+
25
+ 调用时才加载 `@cursor/sdk`。缺少 SDK 或 `CURSOR_API_KEY` 时,只有这条命令失败;普通 Agent DAG / doctor / init 不要求 Cursor。
26
+
27
+ ## 约束
28
+
29
+ - 不读取 `harness.json` task config / DAG facts 作为授权来源。
30
+ - 不复制 DAG `writeSet`、repair、resume 或 Loop auto-execute 能力。
31
+ - 返回后由主会话检查 diff,并显式运行 shell verification。
32
+ - one-shot evidence 写入 `.harness/runs/{active,completed,failed}`。
33
+
34
+ ## 迁移说明
35
+
36
+ 旧 `executor: "cursor"` DAG、`executors.cursor`、`loopAutoWritePolicy` 与 `cursor-fix` 已硬切删除。需要写入时请重新生成 Pi-only DAG,或仅在人工干预场景使用本 sidecar。
@@ -1,3 +1,15 @@
1
1
  # 决策
2
2
 
3
- 本目录存放架构决策记录(ADR)。
3
+ 本目录存放架构决策记录(ADR)。模板见 `docs/templates/adr.md`。
4
+
5
+ ## 索引
6
+
7
+ | ADR | 状态 | 摘要 |
8
+ | --- | --- | --- |
9
+ | [`0001-pi-only-agent-runtime.md`](0001-pi-only-agent-runtime.md) | accepted | 受治理 Agent 仅 Pi;`cursor-prompt` 为显式 sidecar |
10
+ | [`0002-task-pool-runtime-root.md`](0002-task-pool-runtime-root.md) | accepted | Task Pool 唯一根 `.harness/task-pool/`,旧 `.task-pool/` 不兼容 |
11
+ | [`0003-docs-dual-tree-converge.md`](0003-docs-dual-tree-converge.md) | accepted | `website/docs/` 用法 vs `docs/` 治理;docs-converge 检查表 |
12
+
13
+ 新增跨版本架构取舍时:用模板新增 `NNNN-title.md`,并更新本表。不要把 ADR 正文复制进 `website/docs/`。
14
+
15
+ 实施细节与证据仍以对应 `docs/exec-plans/completed/` 与 `CHANGELOG.md` 为准;ADR 只固化决策边界。