@tea-agent/loop-agent 0.13.0 → 0.15.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 (272) hide show
  1. package/AGENTS.md +157 -157
  2. package/CHANGELOG.md +116 -305
  3. package/README.md +357 -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/dist/workflows/dag/init-hybrid.js +27 -11
  50. package/docs/README.md +106 -104
  51. package/docs/architecture/README.md +26 -26
  52. package/docs/architecture/dag-execution.md +140 -140
  53. package/docs/architecture/evolution.md +54 -54
  54. package/docs/architecture/facts-and-state.md +71 -71
  55. package/docs/architecture/runtime-boundaries.md +191 -191
  56. package/docs/architecture/system-overview.md +93 -93
  57. package/docs/architecture/worker-and-feature.md +85 -85
  58. package/docs/harness-methodology-debugging.md +153 -153
  59. package/docs/harness-methodology-tdd.md +130 -130
  60. package/docs/harness-methodology-verification.md +27 -27
  61. package/docs/init-surface.manifest.json +304 -307
  62. package/docs/skills/README.md +7 -7
  63. package/docs/skills/vetted-skill-registry.md +29 -29
  64. package/docs/templates/adr.md +60 -60
  65. package/docs/templates/agent-dag-authority-surface-audit.prompt.md +94 -94
  66. package/docs/templates/agent-dag-decision-envelope.schema.json +213 -213
  67. package/docs/templates/agent-dag-decision-gate-dogfood-report.md +117 -117
  68. package/docs/templates/agent-dag-decision-gate.prompt.md +246 -246
  69. package/docs/templates/agent-dag-process-supervisor.prompt.md +98 -98
  70. package/docs/templates/agent-dag-report.schema.json +473 -473
  71. package/docs/templates/agent-dag-review-verdict.prompt.md +68 -68
  72. package/docs/templates/agent-dag.base.json +190 -190
  73. package/docs/templates/agent-dag.final-verification.json +185 -185
  74. package/docs/templates/agent-dag.schema.json +411 -411
  75. package/docs/templates/agent-dag.supervised-implementation.json +620 -620
  76. package/docs/templates/backend-test-analysis.schema.json +44 -44
  77. package/docs/templates/backend-test-case-manifest.schema.json +190 -190
  78. package/docs/templates/backend-test-dag.classify.prompt.md +75 -75
  79. package/docs/templates/backend-test-dag.generate-pytest.prompt.md +204 -204
  80. package/docs/templates/backend-test-dag.json +559 -559
  81. package/docs/templates/backend-test-dag.retrospect.prompt.md +139 -139
  82. package/docs/templates/backend-test-dag.review-cases.prompt.md +83 -83
  83. package/docs/templates/backend-test-execution.schema.json +133 -133
  84. package/docs/templates/backend-test-result.schema.json +99 -99
  85. package/docs/templates/branch-merge-report.md +0 -1
  86. package/docs/templates/exec-plan.md +64 -64
  87. package/docs/templates/feature-spec.md +53 -53
  88. package/docs/templates/frontend-design-contract.md +42 -42
  89. package/docs/templates/frontend-eval/fixtures/failures/01-type-build-error.md +17 -17
  90. package/docs/templates/frontend-eval/fixtures/failures/02-unit-component-test-fail.md +16 -16
  91. package/docs/templates/frontend-eval/fixtures/failures/03-fixture-schema-drift.md +16 -16
  92. package/docs/templates/frontend-eval/fixtures/failures/04-missing-loading-empty-error-state.md +16 -16
  93. package/docs/templates/frontend-eval/fixtures/failures/05-forbidden-write-writeset-expansion.md +16 -16
  94. package/docs/templates/frontend-eval/fixtures/failures/06-unapproved-dependency-add.md +16 -16
  95. package/docs/templates/frontend-eval/fixtures/failures/07-mock-production-on.md +21 -21
  96. package/docs/templates/frontend-eval/fixtures/functional/01-simple-component-style.md +29 -29
  97. package/docs/templates/frontend-eval/fixtures/functional/02-form-validation.md +28 -28
  98. package/docs/templates/frontend-eval/fixtures/functional/03-list-detail-page.md +28 -28
  99. package/docs/templates/frontend-eval/fixtures/functional/04-api-mock.md +29 -29
  100. package/docs/templates/frontend-eval/fixtures/functional/05-permission-auth-gated-ui.md +27 -27
  101. package/docs/templates/frontend-eval/fixtures/functional/06-ssr-server-client-boundary.md +28 -28
  102. package/docs/templates/frontend-eval/fixtures/functional/07-shared-public-component-api.md +28 -28
  103. package/docs/templates/frontend-eval/fixtures/functional/08-pure-local-no-remote.md +27 -27
  104. package/docs/templates/frontend-eval/metrics.md +138 -138
  105. package/docs/templates/frontend-eval/smoke-targets.md +53 -53
  106. package/docs/templates/frontend-implementation-contract.schema.json +27 -27
  107. package/docs/templates/frontend-task-constraints.md +35 -35
  108. package/docs/templates/frontend-task-requirement.md +70 -70
  109. package/docs/templates/frontend-test-dag.generate-cases.prompt.md +5 -5
  110. package/docs/templates/frontend-test-dag.json +23 -23
  111. package/docs/templates/frontend-test-dag.retrieve-context.prompt.md +3 -3
  112. package/docs/templates/frontend-test-dag.retrospect.prompt.md +3 -3
  113. package/docs/templates/frontend-test-dag.review-cases.prompt.md +3 -3
  114. package/docs/templates/frontend-test-dag.review-execution.prompt.md +3 -3
  115. package/docs/templates/harness.schema.json +221 -221
  116. package/docs/templates/hybrid-dag.json +188 -188
  117. package/docs/templates/init-evolution-review.md +35 -35
  118. package/docs/templates/interactive-ui-round2-experiment.md +66 -66
  119. package/docs/templates/knowledge-graph-bootstrap-dag.json +118 -118
  120. package/docs/templates/knowledge-sync-dag.json +178 -178
  121. package/docs/templates/knowledge-sync-draft.schema.json +71 -71
  122. package/docs/templates/product-line/AGENTS.md +8 -8
  123. package/docs/templates/product-line/README.md +9 -9
  124. package/docs/templates/product-line/acceptance.yaml +14 -14
  125. package/docs/templates/product-line/closeout.yaml +9 -9
  126. package/docs/templates/product-line/design.md +13 -13
  127. package/docs/templates/product-line/links.md +10 -10
  128. package/docs/templates/product-line/requirement.md +17 -17
  129. package/docs/templates/product-line/task-graph.yaml +15 -15
  130. package/docs/templates/product-line/task.yaml +64 -64
  131. package/docs/templates/product-line/test-plan.md +7 -7
  132. package/docs/templates/production-readiness-checklist.md +57 -57
  133. package/docs/templates/progress-log.md +17 -17
  134. package/docs/templates/project-start-checklist.md +9 -9
  135. package/docs/templates/qa-report.md +48 -48
  136. package/docs/templates/sprint-contract.md +29 -29
  137. package/docs/templates/worker-dogfood-evidence.md +80 -80
  138. package/docs/templates/worker-dogfood-setup.md +68 -68
  139. package/examples/decision-gate-agent-dag.json +173 -173
  140. package/examples/example-dag.json +46 -46
  141. package/examples/hybrid-loop-agent-dag.json +188 -188
  142. package/harness.json +66 -66
  143. package/package.json +78 -52
  144. package/scripts/kb-bootstrap-init-skeleton.sh +240 -240
  145. package/scripts/kb-graph-incremental-prepare.mjs +386 -386
  146. package/scripts/kb-graph-materialize.mjs +105 -105
  147. package/scripts/kb-graph-promote.mjs +164 -164
  148. package/scripts/kb-query.mjs +554 -554
  149. package/skills/agent-worker/SKILL.md +39 -39
  150. package/skills/agent-worker/references/agent-worker-operator.md +60 -60
  151. package/skills/ai-engineering-context/SKILL.md +48 -48
  152. package/skills/analyze-product-dependencies/SKILL.md +67 -67
  153. package/skills/analyze-product-dependencies/agents/openai.yaml +4 -4
  154. package/skills/analyze-product-dependencies/references/api-documentation-schema.md +30 -30
  155. package/skills/analyze-product-dependencies/references/dependency-analysis-schema.md +28 -28
  156. package/skills/analyze-product-dependencies/references/example.md +76 -76
  157. package/skills/analyze-product-dependencies/references/forward-test-cases.md +35 -35
  158. package/skills/analyze-product-dependencies/references/input-contract.md +11 -11
  159. package/skills/analyze-product-dependencies/references/scouting-rules.md +61 -61
  160. package/skills/analyze-product-dependencies/scripts/test-validators.mjs +267 -267
  161. package/skills/analyze-product-dependencies/scripts/validate-api-documentation.mjs +101 -101
  162. package/skills/analyze-product-dependencies/scripts/validate-dependency-analysis.mjs +142 -142
  163. package/skills/analyze-product-dependencies/scripts/validate-product-requirement-input.mjs +76 -76
  164. package/skills/analyze-product-dependencies/scripts/validation-helpers.mjs +146 -146
  165. package/skills/analyze-product-requirements/SKILL.md +90 -90
  166. package/skills/analyze-product-requirements/agents/openai.yaml +4 -4
  167. package/skills/analyze-product-requirements/references/acceptance-criteria.md +91 -91
  168. package/skills/analyze-product-requirements/references/clarification-and-knowledge.md +56 -56
  169. package/skills/analyze-product-requirements/references/example.md +86 -86
  170. package/skills/analyze-product-requirements/references/forward-test-cases.md +66 -66
  171. package/skills/analyze-product-requirements/references/product-analysis-schema.md +32 -32
  172. package/skills/analyze-product-requirements/references/product-requirement-schema.md +33 -33
  173. package/skills/analyze-product-requirements/references/requirement-clarification-schema.md +35 -35
  174. package/skills/analyze-product-requirements/scripts/test-validators.mjs +193 -193
  175. package/skills/analyze-product-requirements/scripts/validate-product-analysis.mjs +69 -69
  176. package/skills/analyze-product-requirements/scripts/validate-product-requirement.mjs +97 -97
  177. package/skills/analyze-product-requirements/scripts/validate-requirement-clarification.mjs +98 -98
  178. package/skills/analyze-product-requirements/scripts/validation-helpers.mjs +156 -156
  179. package/skills/browser-tools/SKILL.md +196 -196
  180. package/skills/browser-tools/browser-content.js +103 -103
  181. package/skills/browser-tools/browser-cookies.js +35 -35
  182. package/skills/browser-tools/browser-eval.js +53 -53
  183. package/skills/browser-tools/browser-hn-scraper.js +108 -108
  184. package/skills/browser-tools/browser-nav.js +44 -44
  185. package/skills/browser-tools/browser-pick.js +162 -162
  186. package/skills/browser-tools/browser-screenshot.js +34 -34
  187. package/skills/browser-tools/browser-start.js +86 -86
  188. package/skills/browser-tools/package-lock.json +2556 -2556
  189. package/skills/browser-tools/package.json +19 -19
  190. package/skills/code-review-core/SKILL.md +20 -20
  191. package/skills/codebase-scout/SKILL.md +19 -19
  192. package/skills/frontend-design-review/SKILL.md +66 -66
  193. package/skills/frontend-design-review/references/review-checklist.md +40 -58
  194. package/skills/frontend-implementation/SKILL.md +49 -49
  195. package/skills/frontend-implementation/references/code-standards.md +32 -32
  196. package/skills/frontend-implementation/references/design-spec.md +46 -46
  197. package/skills/frontend-implementation/references/node-contracts.md +27 -27
  198. package/skills/frontend-review/SKILL.md +61 -59
  199. package/skills/frontend-review/references/review-findings.md +48 -47
  200. package/skills/frontend-verification/SKILL.md +55 -53
  201. package/skills/frontend-verification/references/verification-checklist.md +59 -68
  202. package/skills/grill-me/SKILL.md +10 -10
  203. package/skills/grill-with-docs/SKILL.md +88 -88
  204. package/skills/grill-with-docs/adr-format.md +47 -47
  205. package/skills/grill-with-docs/context-format.md +60 -60
  206. package/skills/init-capability-evolution/SKILL.md +70 -70
  207. package/skills/loop-agent/SKILL.md +151 -151
  208. package/skills/loop-agent/references/README.md +67 -67
  209. package/skills/loop-agent/references/command-reference.md +527 -527
  210. package/skills/loop-agent/references/docs-converge.md +126 -126
  211. package/skills/loop-agent/references/harness-policy.md +263 -263
  212. package/skills/loop-agent/references/hybrid-dag.md +243 -243
  213. package/skills/loop-agent/references/learned/README.md +21 -21
  214. package/skills/loop-agent/references/long-running-loop.md +57 -57
  215. package/skills/loop-agent/references/model-routing.md +36 -36
  216. package/skills/loop-agent/references/multi-worktree.md +54 -54
  217. package/skills/loop-agent/references/one-shot-runs.md +85 -85
  218. package/skills/loop-agent/references/orchestrator-and-interventions.md +169 -169
  219. package/skills/loop-agent/references/pi-prompt.md +23 -23
  220. package/skills/loop-agent/references/pi-subagent-assisted-mode.md +84 -84
  221. package/skills/loop-agent/references/post-implementation-and-patterns.md +44 -44
  222. package/skills/loop-agent/references/task-workflow.md +89 -89
  223. package/skills/loop-agent/references/verification-and-failure-handling.md +141 -141
  224. package/skills/playwright-cli/SKILL.md +420 -420
  225. package/skills/playwright-cli/references/element-attributes.md +23 -23
  226. package/skills/playwright-cli/references/playwright-tests.md +39 -39
  227. package/skills/playwright-cli/references/request-mocking.md +87 -87
  228. package/skills/playwright-cli/references/running-code.md +241 -241
  229. package/skills/playwright-cli/references/session-management.md +225 -225
  230. package/skills/playwright-cli/references/storage-state.md +275 -275
  231. package/skills/playwright-cli/references/test-generation.md +433 -433
  232. package/skills/playwright-cli/references/tracing.md +139 -139
  233. package/skills/playwright-cli/references/video-recording.md +143 -143
  234. package/skills/playwright-cli-case-generator/SKILL.md +74 -74
  235. package/skills/requesting-code-review/SKILL.md +101 -101
  236. package/skills/requesting-code-review/code-reviewer.md +168 -168
  237. package/skills/systematic-debugging/CREATION-LOG.md +119 -119
  238. package/skills/systematic-debugging/SKILL.md +296 -296
  239. package/skills/systematic-debugging/condition-based-waiting-example.ts +158 -158
  240. package/skills/systematic-debugging/condition-based-waiting.md +115 -115
  241. package/skills/systematic-debugging/defense-in-depth.md +122 -122
  242. package/skills/systematic-debugging/find-polluter.sh +63 -63
  243. package/skills/systematic-debugging/root-cause-tracing.md +169 -169
  244. package/skills/systematic-debugging/test-academic.md +14 -14
  245. package/skills/systematic-debugging/test-pressure-1.md +58 -58
  246. package/skills/systematic-debugging/test-pressure-2.md +68 -68
  247. package/skills/systematic-debugging/test-pressure-3.md +69 -69
  248. package/skills/test-driven-development/SKILL.md +20 -20
  249. package/skills/using-git-worktrees/SKILL.md +215 -215
  250. package/skills/verification-before-completion/SKILL.md +154 -154
  251. package/skills/webapp-testing/SKILL.md +19 -19
  252. package/docs/agent-dag-recovery-playbook.md +0 -195
  253. package/docs/agent-dag-runner.md +0 -67
  254. package/docs/cursor-prompt-sidecar.md +0 -36
  255. package/docs/decisions/README.md +0 -18
  256. package/docs/design/README.md +0 -167
  257. package/docs/development-principles.md +0 -73
  258. package/docs/exec-plans/README.md +0 -6
  259. package/docs/exec-plans/active/README.md +0 -12
  260. package/docs/exec-plans/completed/README.md +0 -107
  261. package/docs/feature-workflow.md +0 -414
  262. package/docs/loop-agent-harness.md +0 -142
  263. package/docs/production-readiness.md +0 -96
  264. package/docs/progress/README.md +0 -80
  265. package/docs/reports/README.md +0 -159
  266. package/docs/verification-matrix.md +0 -70
  267. package/scripts/check-product-line-docs.sh +0 -29
  268. package/scripts/check-task-pool-root.sh +0 -32
  269. package/scripts/kb-graph-incremental-prepare.sh +0 -5
  270. package/scripts/kb-graph-materialize.sh +0 -4
  271. package/scripts/kb-graph-promote.sh +0 -4
  272. package/scripts/kb-query.sh +0 -5
@@ -1,85 +1,85 @@
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/**`、`.agents/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
- - 此前的顶层 Task Pool 位置不读取、不迁移、不合并、不重映射。
58
- - **Feature-scoped identity(ADR 0004)**:canonical Task 身份为复合键 `TaskPoolTaskRef = { featureId, taskId }`。`taskId` 仅 Feature 内唯一;同仓库多 Feature 可安全共用同名 Task ID。
59
- - **State schema v2**:新 state 必须 `schemaVersion: 2` 且显式携带 `featureId` / `taskId`;canonical 路径为 `.harness/task-pool/states/<featureId>/<taskId>.json`。
60
- - **Consumers**:runner Ready Queue、retry、Follow-up、Feature review、Delivery / Closeout、morning report / metrics 均按 Feature 作用域读写,不得把裸 `taskId` 当作仓库全局唯一键。
61
- - **Operator**:`pool doctor` 只读 inventory;`pool migrate-state` 默认 dry-run,apply 需 `--owner` + `--reason`;legacy v1 写入路径 fail-closed。
62
- - batch / retry / morning report 等都基于此根。
63
-
64
- ### Feature(M2 交付闭环)
65
-
66
- - review/run/approve-followup/delivery/closeout/verify-final:`src/worker/feature/{review,run}.ts` 及相关。
67
- - Follow-up:`src/worker/` 下 draft-followup + approve-followup 事务,覆盖全部失败分类(可执行/Spec/Risk/Human/EnvFailure)。
68
- - Delivery / Closeout:clean Delivery HEAD 上生成 canonical QA/最终验证证据、Delivery Package、Acceptance Coverage、PR 草稿;Closeout 默认预览,显式 `--apply --owner` 才原子写回。
69
- - 权威证据:`CHANGELOG.md [0.10.0]`、`ai_workspace/loop-agent/reports/2026-07-12-m2-completion-audit.md`。
70
-
71
- ### Observe(只读 read model)
72
-
73
- - 模块:`src/worker/observe/`、`src/worker/observability/{read-model,event-store}.ts`。
74
- - 全局快照:`buildGlobalSnapshot({ repoRoot })`(`src/worker/observability/read-model.ts`),是 **derived** 视图,消费 `.harness/` 与 Task Pool 事实,**不**改变执行成败。
75
- - Observe 是本地只读暖白控制台;snapshot 投影失败返回安全错误摘要而非全零健康状态(见 `CHANGELOG.md [0.9.0]`)。
76
-
77
- ## 版本化自举的 deterministic canary
78
-
79
- 源码仓库的 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` 不含它)。
80
-
81
- ## 不变式
82
-
83
- - Worker 不得 in-process import `src/cli/**`、`src/commands/**` 或 `src/application/**`(governance 机器校验)。
84
- - Worker 不实现 executor、scheduler、prompt 或 write guard。
85
- - `agent-worker` skill(`.agents/skills/agent-worker/`)不加入 `DEFAULT_SKILLS_BY_ROLE`;DAG leaf node 不得递归启动 `agent-worker`(`runtime-boundaries.md` §Skill layer)。
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/**`、`.agents/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
+ - 此前的顶层 Task Pool 位置不读取、不迁移、不合并、不重映射。
58
+ - **Feature-scoped identity(ADR 0004)**:canonical Task 身份为复合键 `TaskPoolTaskRef = { featureId, taskId }`。`taskId` 仅 Feature 内唯一;同仓库多 Feature 可安全共用同名 Task ID。
59
+ - **State schema v2**:新 state 必须 `schemaVersion: 2` 且显式携带 `featureId` / `taskId`;canonical 路径为 `.harness/task-pool/states/<featureId>/<taskId>.json`。
60
+ - **Consumers**:runner Ready Queue、retry、Follow-up、Feature review、Delivery / Closeout、morning report / metrics 均按 Feature 作用域读写,不得把裸 `taskId` 当作仓库全局唯一键。
61
+ - **Operator**:`pool doctor` 只读 inventory;`pool migrate-state` 默认 dry-run,apply 需 `--owner` + `--reason`;legacy v1 写入路径 fail-closed。
62
+ - batch / retry / morning report 等都基于此根。
63
+
64
+ ### Feature(M2 交付闭环)
65
+
66
+ - review/run/approve-followup/delivery/closeout/verify-final:`src/worker/feature/{review,run}.ts` 及相关。
67
+ - Follow-up:`src/worker/` 下 draft-followup + approve-followup 事务,覆盖全部失败分类(可执行/Spec/Risk/Human/EnvFailure)。
68
+ - Delivery / Closeout:clean Delivery HEAD 上生成 canonical QA/最终验证证据、Delivery Package、Acceptance Coverage、PR 草稿;Closeout 默认预览,显式 `--apply --owner` 才原子写回。
69
+ - 权威证据:`CHANGELOG.md [0.10.0]`、`ai_workspace/loop-agent/reports/2026-07-12-m2-completion-audit.md`。
70
+
71
+ ### Observe(只读 read model)
72
+
73
+ - 模块:`src/worker/observe/`、`src/worker/observability/{read-model,event-store}.ts`。
74
+ - 全局快照:`buildGlobalSnapshot({ repoRoot })`(`src/worker/observability/read-model.ts`),是 **derived** 视图,消费 `.harness/` 与 Task Pool 事实,**不**改变执行成败。
75
+ - Observe 是本地只读暖白控制台;snapshot 投影失败返回安全错误摘要而非全零健康状态(见 `CHANGELOG.md [0.9.0]`)。
76
+
77
+ ## 版本化自举的 deterministic canary
78
+
79
+ 源码仓库的 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` 不含它)。
80
+
81
+ ## 不变式
82
+
83
+ - Worker 不得 in-process import `src/cli/**`、`src/commands/**` 或 `src/application/**`(governance 机器校验)。
84
+ - Worker 不实现 executor、scheduler、prompt 或 write guard。
85
+ - `agent-worker` skill(`.agents/skills/agent-worker/`)不加入 `DEFAULT_SKILLS_BY_ROLE`;DAG leaf node 不得递归启动 `agent-worker`(`runtime-boundaries.md` §Skill layer)。
@@ -1,153 +1,153 @@
1
- # Harness Methodology: Systematic Debugging
2
-
3
- 从 Superpowers `systematic-debugging` skill 中提取的调试方法,适配本仓库 harness 工作流。
4
-
5
- ## Iron Law
6
-
7
- ```
8
- NO FIXES WITHOUT ROOT CAUSE INVESTIGATION FIRST
9
- ```
10
-
11
- 没有完成 Phase 1(根因调查),就不能提出任何修复方案。修症状 = 失败。
12
-
13
- ## 何时使用
14
-
15
- 适用于任何技术问题:
16
- - 测试失败
17
- - 生产 bug
18
- - 意外行为
19
- - 性能问题
20
- - 构建/集成失败
21
-
22
- **尤其要在以下情况使用:**
23
- - 时间压力下(紧急情况最容易让人猜)
24
- - "一个快速修复"看起来很明显
25
- - 已经试过多次修复
26
- - 上一个修复没奏效
27
- - 不完全理解问题
28
-
29
- ## 四阶段流程
30
-
31
- 每个阶段必须完成才能进入下一个。
32
-
33
- ### Phase 1:根因调查
34
-
35
- **在尝试任何修复之前:**
36
-
37
- 1. **仔细读错误信息**
38
- - 不要跳过 error 和 warning
39
- - 错误信息常常包含精确的解决方案
40
- - 完整读 stack trace
41
- - 记下文件名、行号、错误码
42
-
43
- 2. **稳定复现**
44
- - 能可靠触发吗?
45
- - 精确步骤是什么?
46
- - 每次都发生?
47
- - 如果不能复现 → 收集更多数据,不要猜
48
-
49
- 3. **检查最近变更**
50
- - 什么改动可能导致这个问题?
51
- - `git diff`、最近提交
52
- - 新依赖、配置变更
53
- - 环境差异
54
-
55
- 4. **多组件系统:收集跨层证据**
56
-
57
- 当系统涉及多个组件(CI → build → sign, API → service → DB):
58
- ```
59
- 对每个组件边界:
60
- - 记录进入组件的数据
61
- - 记录离开组件的数据
62
- - 验证环境/配置传播
63
- - 检查每层状态
64
-
65
- 跑一次收集证据 → 分析证据确定失败组件 → 针对该组件调查
66
- ```
67
-
68
- 5. **追踪数据流**
69
-
70
- 当错误在深层调用栈中:
71
- - 坏值从哪里来?
72
- - 谁用坏值调用了这里?
73
- - 持续向上追踪直到源头
74
- - 在源头修复,不在症状处修复
75
-
76
- ### Phase 2:模式分析
77
-
78
- 1. **找工作中的例子** — 在同一个代码库里定位相似的工作代码
79
- 2. **对照参考实现** — 完整阅读参考实现,不要跳读
80
- 3. **识别差异** — 列出工作和失败之间的每一项差异,再小也不假设"这不重要"
81
- 4. **理解依赖** — 需要哪些其他组件、设置、配置、假设?
82
-
83
- ### Phase 3:假设与测试
84
-
85
- 1. **形成单一假设** — "我认为 X 是根因,因为 Y"
86
- 2. **最小测试** — 做最小的改动来测试假设,一次只变一个变量
87
- 3. **验证后再继续** — 成功了?→ Phase 4。没成功?→ 形成新假设。不要在原假设上叠加更多修复
88
-
89
- ### Phase 4:实现
90
-
91
- 1. **创建失败测试用例** — 遵循 RED-GREEN-REFACTOR(见 `harness-methodology-tdd.md`)
92
- 2. **实现单一修复** — 解决已识别的根因,一次一个改动,不顺手重构
93
- 3. **验证修复** — 测试通过?其他测试没坏?问题真的解决了?
94
- 4. **如果修复无效**:
95
- - 尝试了几个修复?
96
- - < 3 个 → 回到 Phase 1 重新分析
97
- - **≥ 3 个 → 停止,质疑架构(Phase 4.5)**
98
-
99
- ### Phase 4.5:质疑架构
100
-
101
- **以下模式表明架构问题:**
102
- - 每次修复暴露新的共享状态/耦合/不同位置的问题
103
- - 修复需要"大规模重构"才能实现
104
- - 每次修复在其他地方产生新症状
105
-
106
- **停止并质疑基础:**
107
- - 这个模式从根本上正确吗?
108
- - 我们是否在"靠惯性坚持它"?
109
- - 是否应该重构架构,而不是继续修症状?
110
-
111
- 在尝试更多修复之前讨论。
112
-
113
- ## Red Flags:停止并回到 Phase 1
114
-
115
- 如果你发现自己这样想:
116
- - "先快速修一下,后面再调查"
117
- - "试试改 X 看看行不行"
118
- - "一次改多个东西然后跑测试"
119
- - "跳过测试,手工验证就行"
120
- - "大概就是 X 的问题,直接修吧"
121
- - "不太确定但可能有用"
122
- - "再试一个修复"(已经试了 2+ 次)
123
-
124
- **以上任何一种 → 停止。回到 Phase 1。**
125
-
126
- ## 和 Harness 工作流的对齐
127
-
128
- | 调试阶段 | Harness 步骤 |
129
- |---------|-------------|
130
- | Phase 1:根因调查 | Baseline:先验证当前基线,确认 bug 是可复现的 |
131
- | Phase 2:模式分析 | Orient:读相关代码、文档、测试,找参考 |
132
- | Phase 3:假设测试 | Contract:写清修复假设和验证方法 |
133
- | Phase 4:实现 | Implement → Verify(TDD:先写失败测试) |
134
- | Phase 4.5:质疑架构 | 可能需要新的 exec plan |
135
-
136
- ## 快速参考
137
-
138
- | 阶段 | 关键活动 | 成功标准 |
139
- |------|---------|---------|
140
- | 1. 根因 | 读错误、复现、查变更、收集证据 | 理解 WHAT 和 WHY |
141
- | 2. 模式 | 找工作中的例子、对比 | 识别差异 |
142
- | 3. 假设 | 形成理论、最小测试 | 确认或新假设 |
143
- | 4. 实现 | 创建测试、修复、验证 | Bug 解决、测试通过 |
144
-
145
- ## 当流程揭示"无根因"时
146
-
147
- 如果系统性调查揭示问题确实属于环境性、时序性或外部依赖:
148
- 1. 已完成流程(不是跳过)
149
- 2. 记录调查了什么
150
- 3. 实现适当处理(重试、超时、错误提示)
151
- 4. 添加监控/日志供将来调查
152
-
153
- **但是:** 95% 的"无根因"案例是不完整调查。
1
+ # Harness Methodology: Systematic Debugging
2
+
3
+ 从 Superpowers `systematic-debugging` skill 中提取的调试方法,适配本仓库 harness 工作流。
4
+
5
+ ## Iron Law
6
+
7
+ ```
8
+ NO FIXES WITHOUT ROOT CAUSE INVESTIGATION FIRST
9
+ ```
10
+
11
+ 没有完成 Phase 1(根因调查),就不能提出任何修复方案。修症状 = 失败。
12
+
13
+ ## 何时使用
14
+
15
+ 适用于任何技术问题:
16
+ - 测试失败
17
+ - 生产 bug
18
+ - 意外行为
19
+ - 性能问题
20
+ - 构建/集成失败
21
+
22
+ **尤其要在以下情况使用:**
23
+ - 时间压力下(紧急情况最容易让人猜)
24
+ - "一个快速修复"看起来很明显
25
+ - 已经试过多次修复
26
+ - 上一个修复没奏效
27
+ - 不完全理解问题
28
+
29
+ ## 四阶段流程
30
+
31
+ 每个阶段必须完成才能进入下一个。
32
+
33
+ ### Phase 1:根因调查
34
+
35
+ **在尝试任何修复之前:**
36
+
37
+ 1. **仔细读错误信息**
38
+ - 不要跳过 error 和 warning
39
+ - 错误信息常常包含精确的解决方案
40
+ - 完整读 stack trace
41
+ - 记下文件名、行号、错误码
42
+
43
+ 2. **稳定复现**
44
+ - 能可靠触发吗?
45
+ - 精确步骤是什么?
46
+ - 每次都发生?
47
+ - 如果不能复现 → 收集更多数据,不要猜
48
+
49
+ 3. **检查最近变更**
50
+ - 什么改动可能导致这个问题?
51
+ - `git diff`、最近提交
52
+ - 新依赖、配置变更
53
+ - 环境差异
54
+
55
+ 4. **多组件系统:收集跨层证据**
56
+
57
+ 当系统涉及多个组件(CI → build → sign, API → service → DB):
58
+ ```
59
+ 对每个组件边界:
60
+ - 记录进入组件的数据
61
+ - 记录离开组件的数据
62
+ - 验证环境/配置传播
63
+ - 检查每层状态
64
+
65
+ 跑一次收集证据 → 分析证据确定失败组件 → 针对该组件调查
66
+ ```
67
+
68
+ 5. **追踪数据流**
69
+
70
+ 当错误在深层调用栈中:
71
+ - 坏值从哪里来?
72
+ - 谁用坏值调用了这里?
73
+ - 持续向上追踪直到源头
74
+ - 在源头修复,不在症状处修复
75
+
76
+ ### Phase 2:模式分析
77
+
78
+ 1. **找工作中的例子** — 在同一个代码库里定位相似的工作代码
79
+ 2. **对照参考实现** — 完整阅读参考实现,不要跳读
80
+ 3. **识别差异** — 列出工作和失败之间的每一项差异,再小也不假设"这不重要"
81
+ 4. **理解依赖** — 需要哪些其他组件、设置、配置、假设?
82
+
83
+ ### Phase 3:假设与测试
84
+
85
+ 1. **形成单一假设** — "我认为 X 是根因,因为 Y"
86
+ 2. **最小测试** — 做最小的改动来测试假设,一次只变一个变量
87
+ 3. **验证后再继续** — 成功了?→ Phase 4。没成功?→ 形成新假设。不要在原假设上叠加更多修复
88
+
89
+ ### Phase 4:实现
90
+
91
+ 1. **创建失败测试用例** — 遵循 RED-GREEN-REFACTOR(见 `harness-methodology-tdd.md`)
92
+ 2. **实现单一修复** — 解决已识别的根因,一次一个改动,不顺手重构
93
+ 3. **验证修复** — 测试通过?其他测试没坏?问题真的解决了?
94
+ 4. **如果修复无效**:
95
+ - 尝试了几个修复?
96
+ - < 3 个 → 回到 Phase 1 重新分析
97
+ - **≥ 3 个 → 停止,质疑架构(Phase 4.5)**
98
+
99
+ ### Phase 4.5:质疑架构
100
+
101
+ **以下模式表明架构问题:**
102
+ - 每次修复暴露新的共享状态/耦合/不同位置的问题
103
+ - 修复需要"大规模重构"才能实现
104
+ - 每次修复在其他地方产生新症状
105
+
106
+ **停止并质疑基础:**
107
+ - 这个模式从根本上正确吗?
108
+ - 我们是否在"靠惯性坚持它"?
109
+ - 是否应该重构架构,而不是继续修症状?
110
+
111
+ 在尝试更多修复之前讨论。
112
+
113
+ ## Red Flags:停止并回到 Phase 1
114
+
115
+ 如果你发现自己这样想:
116
+ - "先快速修一下,后面再调查"
117
+ - "试试改 X 看看行不行"
118
+ - "一次改多个东西然后跑测试"
119
+ - "跳过测试,手工验证就行"
120
+ - "大概就是 X 的问题,直接修吧"
121
+ - "不太确定但可能有用"
122
+ - "再试一个修复"(已经试了 2+ 次)
123
+
124
+ **以上任何一种 → 停止。回到 Phase 1。**
125
+
126
+ ## 和 Harness 工作流的对齐
127
+
128
+ | 调试阶段 | Harness 步骤 |
129
+ |---------|-------------|
130
+ | Phase 1:根因调查 | Baseline:先验证当前基线,确认 bug 是可复现的 |
131
+ | Phase 2:模式分析 | Orient:读相关代码、文档、测试,找参考 |
132
+ | Phase 3:假设测试 | Contract:写清修复假设和验证方法 |
133
+ | Phase 4:实现 | Implement → Verify(TDD:先写失败测试) |
134
+ | Phase 4.5:质疑架构 | 可能需要新的 exec plan |
135
+
136
+ ## 快速参考
137
+
138
+ | 阶段 | 关键活动 | 成功标准 |
139
+ |------|---------|---------|
140
+ | 1. 根因 | 读错误、复现、查变更、收集证据 | 理解 WHAT 和 WHY |
141
+ | 2. 模式 | 找工作中的例子、对比 | 识别差异 |
142
+ | 3. 假设 | 形成理论、最小测试 | 确认或新假设 |
143
+ | 4. 实现 | 创建测试、修复、验证 | Bug 解决、测试通过 |
144
+
145
+ ## 当流程揭示"无根因"时
146
+
147
+ 如果系统性调查揭示问题确实属于环境性、时序性或外部依赖:
148
+ 1. 已完成流程(不是跳过)
149
+ 2. 记录调查了什么
150
+ 3. 实现适当处理(重试、超时、错误提示)
151
+ 4. 添加监控/日志供将来调查
152
+
153
+ **但是:** 95% 的"无根因"案例是不完整调查。