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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (284) hide show
  1. package/AGENTS.md +155 -153
  2. package/CHANGELOG.md +338 -265
  3. package/README.md +345 -298
  4. package/bin/agent-worker.js +22 -22
  5. package/bin/loop-agent.js +21 -21
  6. package/dist/application/dag/generate-task-dag.js +28 -28
  7. package/dist/application/evaluation/candidate-hash.js +75 -0
  8. package/dist/application/evaluation/candidate.js +52 -0
  9. package/dist/application/evaluation/replay.js +289 -0
  10. package/dist/application/evaluation/types.js +130 -0
  11. package/dist/cli/command-definitions.js +27 -7
  12. package/dist/cli/program.js +8 -4
  13. package/dist/commands/cursor-prompt.js +6 -6
  14. package/dist/commands/eval.js +235 -0
  15. package/dist/commands/init.js +544 -506
  16. package/dist/commands/knowledge.js +129 -31
  17. package/dist/commands/loop-benchmark.js +11 -11
  18. package/dist/commands/pi-reuse-benchmark.js +16 -16
  19. package/dist/executors/pi-sdk-executor.js +38 -24
  20. package/dist/executors/shell-executor.js +34 -2
  21. package/dist/executors/shell-presets.js +20 -0
  22. package/dist/executors/shell-verification.js +7 -0
  23. package/dist/governance/manifest-types.js +4 -0
  24. package/dist/infrastructure/evaluation/candidate-store.js +435 -0
  25. package/dist/infrastructure/evaluation/store.js +40 -0
  26. package/dist/sidecars/cursor-prompt/executor.js +1 -1
  27. package/dist/task/config-types.js +28 -1
  28. package/dist/task/runtime.js +27 -27
  29. package/dist/worker/cli.js +96 -1
  30. package/dist/worker/delivery/package.js +3 -3
  31. package/dist/worker/feature/decision-loader.js +37 -6
  32. package/dist/worker/feature/next-action.js +10 -2
  33. package/dist/worker/feature/ready-plan-projection.js +81 -0
  34. package/dist/worker/feature/reducer.js +2 -1
  35. package/dist/worker/feature/review.js +19 -2
  36. package/dist/worker/feature/run.js +27 -2
  37. package/dist/worker/follow-up/approve.js +5 -2
  38. package/dist/worker/follow-up/factory.js +1 -1
  39. package/dist/worker/observability/read-model.js +246 -41
  40. package/dist/worker/observe/routes.js +173 -15
  41. package/dist/worker/observe/spec-evidence.js +281 -0
  42. package/dist/worker/observe/static/api.js +46 -27
  43. package/dist/worker/observe/static/app.js +150 -150
  44. package/dist/worker/observe/static/constants.js +148 -148
  45. package/dist/worker/observe/static/copy.js +67 -67
  46. package/dist/worker/observe/static/dag-helpers.js +172 -172
  47. package/dist/worker/observe/static/dag-layout.d.ts +31 -31
  48. package/dist/worker/observe/static/dag-layout.js +83 -83
  49. package/dist/worker/observe/static/dag-model.js +72 -72
  50. package/dist/worker/observe/static/dom.js +61 -61
  51. package/dist/worker/observe/static/format-pool.js +67 -67
  52. package/dist/worker/observe/static/format.js +292 -292
  53. package/dist/worker/observe/static/index.html +308 -308
  54. package/dist/worker/observe/static/kpi.js +94 -94
  55. package/dist/worker/observe/static/relations.js +133 -128
  56. package/dist/worker/observe/static/router.js +93 -85
  57. package/dist/worker/observe/static/run-processing.js +148 -148
  58. package/dist/worker/observe/static/shell-chrome.js +68 -68
  59. package/dist/worker/observe/static/state.js +253 -253
  60. package/dist/worker/observe/static/styles.css +1902 -1890
  61. package/dist/worker/observe/static/views/batch.js +227 -226
  62. package/dist/worker/observe/static/views/dag-graph.js +172 -172
  63. package/dist/worker/observe/static/views/dag-inspector.js +607 -477
  64. package/dist/worker/observe/static/views/dag.js +362 -362
  65. package/dist/worker/observe/static/views/dashboard.js +445 -442
  66. package/dist/worker/observe/static/views/failures.js +143 -143
  67. package/dist/worker/observe/static/views/feature.js +492 -453
  68. package/dist/worker/observe/static/views/pool.js +350 -347
  69. package/dist/worker/observe/static/views/run.js +453 -453
  70. package/dist/worker/observe/static/views/session-timeline.js +205 -205
  71. package/dist/worker/observe/static/views/shell.js +7 -7
  72. package/dist/worker/observe/static/views/task.js +314 -260
  73. package/dist/worker/observe/static/views/timeline.js +163 -163
  74. package/dist/worker/pool/doctor.js +165 -0
  75. package/dist/worker/pool/migrate-state.js +303 -0
  76. package/dist/worker/pool/run-store.js +205 -17
  77. package/dist/worker/pool/types.js +17 -1
  78. package/dist/worker/pool/validation.js +100 -15
  79. package/dist/worker/report/morning-report.js +12 -2
  80. package/dist/worker/runner/run-ready.js +41 -26
  81. package/dist/worker/task-graph/ready-planner.js +136 -0
  82. package/dist/workflows/dag/backend-test-analysis-contract.js +120 -0
  83. package/dist/workflows/dag/canvas-observer.js +275 -275
  84. package/dist/workflows/dag/convergence/controller.js +16 -8
  85. package/dist/workflows/dag/dynamic-runtime/map.js +90 -2
  86. package/dist/workflows/dag/failure-routing.js +12 -1
  87. package/dist/workflows/dag/init-hybrid.js +2404 -360
  88. package/dist/workflows/dag/node-execution.js +9 -0
  89. package/dist/workflows/dag/prompt.js +9 -0
  90. package/dist/workflows/dag/report.js +35 -1
  91. package/dist/workflows/dag/runner.js +28 -2
  92. package/dist/workflows/dag/task-demand-routing.js +383 -0
  93. package/dist/workflows/dag/types.js +51 -13
  94. package/dist/workflows/dag/upstream-artifacts.js +1 -0
  95. package/dist/workflows/dag/validate.js +59 -1
  96. package/docs/README.md +106 -104
  97. package/docs/agent-dag-recovery-playbook.md +195 -184
  98. package/docs/agent-dag-runner.md +67 -67
  99. package/docs/architecture/README.md +26 -26
  100. package/docs/architecture/dag-execution.md +140 -140
  101. package/docs/architecture/evolution.md +54 -53
  102. package/docs/architecture/facts-and-state.md +71 -58
  103. package/docs/architecture/runtime-boundaries.md +191 -191
  104. package/docs/architecture/system-overview.md +93 -93
  105. package/docs/architecture/worker-and-feature.md +85 -81
  106. package/docs/cursor-prompt-sidecar.md +36 -36
  107. package/docs/decisions/README.md +18 -15
  108. package/docs/design/README.md +167 -77
  109. package/docs/development-principles.md +73 -73
  110. package/docs/exec-plans/README.md +6 -6
  111. package/docs/exec-plans/active/README.md +15 -9
  112. package/docs/exec-plans/completed/README.md +85 -73
  113. package/docs/feature-workflow.md +389 -261
  114. package/docs/harness-methodology-debugging.md +153 -153
  115. package/docs/harness-methodology-tdd.md +130 -130
  116. package/docs/harness-methodology-verification.md +27 -27
  117. package/docs/init-surface.manifest.json +289 -280
  118. package/docs/loop-agent-harness.md +142 -130
  119. package/docs/production-readiness.md +96 -96
  120. package/docs/progress/README.md +64 -54
  121. package/docs/reports/README.md +117 -94
  122. package/docs/skills/README.md +7 -7
  123. package/docs/skills/vetted-skill-registry.md +29 -27
  124. package/docs/templates/adr.md +60 -60
  125. package/docs/templates/agent-dag-authority-surface-audit.prompt.md +94 -94
  126. package/docs/templates/agent-dag-decision-envelope.schema.json +213 -213
  127. package/docs/templates/agent-dag-decision-gate-dogfood-report.md +117 -117
  128. package/docs/templates/agent-dag-decision-gate.prompt.md +246 -246
  129. package/docs/templates/agent-dag-process-supervisor.prompt.md +98 -98
  130. package/docs/templates/agent-dag-report.schema.json +473 -473
  131. package/docs/templates/agent-dag-review-verdict.prompt.md +68 -68
  132. package/docs/templates/agent-dag.base.json +190 -190
  133. package/docs/templates/agent-dag.final-verification.json +185 -185
  134. package/docs/templates/agent-dag.schema.json +411 -383
  135. package/docs/templates/agent-dag.supervised-implementation.json +501 -501
  136. package/docs/templates/backend-test-analysis.schema.json +44 -0
  137. package/docs/templates/backend-test-dag.generate-pytest.prompt.md +202 -139
  138. package/docs/templates/backend-test-dag.json +311 -276
  139. package/docs/templates/backend-test-dag.retrospect.prompt.md +125 -125
  140. package/docs/templates/backend-test-dag.review-cases.prompt.md +81 -81
  141. package/docs/templates/exec-plan.md +64 -64
  142. package/docs/templates/feature-spec.md +53 -53
  143. package/docs/templates/frontend-design-contract.md +42 -33
  144. package/docs/templates/frontend-task-constraints.md +35 -25
  145. package/docs/templates/frontend-task-requirement.md +70 -61
  146. package/docs/templates/frontend-test-dag.generate-cases.prompt.md +5 -0
  147. package/docs/templates/frontend-test-dag.json +23 -0
  148. package/docs/templates/frontend-test-dag.retrieve-context.prompt.md +3 -0
  149. package/docs/templates/frontend-test-dag.retrospect.prompt.md +3 -0
  150. package/docs/templates/frontend-test-dag.review-cases.prompt.md +3 -0
  151. package/docs/templates/frontend-test-dag.review-execution.prompt.md +3 -0
  152. package/docs/templates/harness.schema.json +221 -221
  153. package/docs/templates/hybrid-dag.json +188 -188
  154. package/docs/templates/init-evolution-review.md +35 -35
  155. package/docs/templates/interactive-ui-round2-experiment.md +66 -66
  156. package/docs/templates/knowledge-graph-bootstrap-dag.json +118 -0
  157. package/docs/templates/knowledge-sync-dag.json +178 -0
  158. package/docs/templates/knowledge-sync-draft.schema.json +71 -0
  159. package/docs/templates/product-line/AGENTS.md +8 -8
  160. package/docs/templates/product-line/README.md +9 -9
  161. package/docs/templates/product-line/acceptance.yaml +14 -14
  162. package/docs/templates/product-line/closeout.yaml +9 -9
  163. package/docs/templates/product-line/design.md +13 -13
  164. package/docs/templates/product-line/links.md +10 -10
  165. package/docs/templates/product-line/requirement.md +17 -17
  166. package/docs/templates/product-line/task-graph.yaml +15 -15
  167. package/docs/templates/product-line/task.yaml +64 -64
  168. package/docs/templates/product-line/test-plan.md +7 -7
  169. package/docs/templates/production-readiness-checklist.md +57 -57
  170. package/docs/templates/progress-log.md +17 -17
  171. package/docs/templates/project-start-checklist.md +9 -9
  172. package/docs/templates/qa-report.md +48 -48
  173. package/docs/templates/sprint-contract.md +29 -29
  174. package/docs/templates/worker-dogfood-evidence.md +80 -80
  175. package/docs/templates/worker-dogfood-setup.md +68 -68
  176. package/docs/verification-matrix.md +70 -66
  177. package/examples/decision-gate-agent-dag.json +177 -177
  178. package/examples/example-dag.json +46 -46
  179. package/examples/hybrid-loop-agent-dag.json +189 -189
  180. package/harness.json +66 -66
  181. package/package.json +88 -46
  182. package/scripts/check-product-line-docs.sh +29 -29
  183. package/scripts/check-task-pool-root.sh +32 -32
  184. package/scripts/kb-bootstrap-init-skeleton.sh +240 -0
  185. package/scripts/kb-graph-incremental-prepare.mjs +386 -0
  186. package/scripts/kb-graph-incremental-prepare.sh +5 -0
  187. package/scripts/kb-graph-materialize.mjs +105 -0
  188. package/scripts/kb-graph-materialize.sh +4 -0
  189. package/scripts/kb-graph-promote.mjs +164 -0
  190. package/scripts/kb-graph-promote.sh +4 -0
  191. package/scripts/kb-query.mjs +554 -0
  192. package/scripts/kb-query.sh +5 -0
  193. package/skills/agent-worker/SKILL.md +39 -37
  194. package/skills/agent-worker/references/agent-worker-operator.md +60 -43
  195. package/skills/ai-engineering-context/SKILL.md +48 -48
  196. package/skills/analyze-product-dependencies/SKILL.md +67 -0
  197. package/skills/analyze-product-dependencies/agents/openai.yaml +4 -0
  198. package/skills/analyze-product-dependencies/references/api-documentation-schema.md +30 -0
  199. package/skills/analyze-product-dependencies/references/dependency-analysis-schema.md +28 -0
  200. package/skills/analyze-product-dependencies/references/example.md +76 -0
  201. package/skills/analyze-product-dependencies/references/forward-test-cases.md +35 -0
  202. package/skills/analyze-product-dependencies/references/input-contract.md +11 -0
  203. package/skills/analyze-product-dependencies/references/scouting-rules.md +61 -0
  204. package/skills/analyze-product-dependencies/scripts/test-validators.mjs +267 -0
  205. package/skills/analyze-product-dependencies/scripts/validate-api-documentation.mjs +101 -0
  206. package/skills/analyze-product-dependencies/scripts/validate-dependency-analysis.mjs +142 -0
  207. package/skills/analyze-product-dependencies/scripts/validate-product-requirement-input.mjs +76 -0
  208. package/skills/analyze-product-dependencies/scripts/validation-helpers.mjs +146 -0
  209. package/skills/analyze-product-requirements/SKILL.md +90 -0
  210. package/skills/analyze-product-requirements/agents/openai.yaml +4 -0
  211. package/skills/analyze-product-requirements/references/acceptance-criteria.md +91 -0
  212. package/skills/analyze-product-requirements/references/clarification-and-knowledge.md +56 -0
  213. package/skills/analyze-product-requirements/references/example.md +86 -0
  214. package/skills/analyze-product-requirements/references/forward-test-cases.md +66 -0
  215. package/skills/analyze-product-requirements/references/product-analysis-schema.md +32 -0
  216. package/skills/analyze-product-requirements/references/product-requirement-schema.md +33 -0
  217. package/skills/analyze-product-requirements/references/requirement-clarification-schema.md +35 -0
  218. package/skills/analyze-product-requirements/scripts/test-validators.mjs +193 -0
  219. package/skills/analyze-product-requirements/scripts/validate-product-analysis.mjs +69 -0
  220. package/skills/analyze-product-requirements/scripts/validate-product-requirement.mjs +97 -0
  221. package/skills/analyze-product-requirements/scripts/validate-requirement-clarification.mjs +98 -0
  222. package/skills/analyze-product-requirements/scripts/validation-helpers.mjs +156 -0
  223. package/skills/code-review-core/SKILL.md +20 -20
  224. package/skills/codebase-scout/SKILL.md +19 -19
  225. package/skills/frontend-design-review/SKILL.md +66 -59
  226. package/skills/frontend-design-review/references/review-checklist.md +58 -37
  227. package/skills/frontend-implementation/SKILL.md +47 -51
  228. package/skills/frontend-implementation/references/code-standards.md +32 -34
  229. package/skills/frontend-implementation/references/design-spec.md +46 -46
  230. package/skills/frontend-implementation/references/node-contracts.md +76 -32
  231. package/skills/frontend-review/SKILL.md +59 -53
  232. package/skills/frontend-review/references/review-findings.md +47 -42
  233. package/skills/frontend-verification/SKILL.md +53 -40
  234. package/skills/frontend-verification/references/verification-checklist.md +68 -56
  235. package/skills/grill-me/SKILL.md +10 -10
  236. package/skills/grill-with-docs/SKILL.md +88 -88
  237. package/skills/grill-with-docs/adr-format.md +47 -47
  238. package/skills/grill-with-docs/context-format.md +60 -60
  239. package/skills/init-capability-evolution/SKILL.md +70 -70
  240. package/skills/loop-agent/SKILL.md +151 -151
  241. package/skills/loop-agent/references/README.md +67 -67
  242. package/skills/loop-agent/references/command-reference.md +505 -452
  243. package/skills/loop-agent/references/docs-converge.md +126 -126
  244. package/skills/loop-agent/references/harness-policy.md +263 -263
  245. package/skills/loop-agent/references/hybrid-dag.md +238 -233
  246. package/skills/loop-agent/references/learned/README.md +21 -21
  247. package/skills/loop-agent/references/long-running-loop.md +57 -57
  248. package/skills/loop-agent/references/model-routing.md +36 -36
  249. package/skills/loop-agent/references/multi-worktree.md +54 -54
  250. package/skills/loop-agent/references/one-shot-runs.md +85 -85
  251. package/skills/loop-agent/references/orchestrator-and-interventions.md +169 -169
  252. package/skills/loop-agent/references/pi-prompt.md +23 -23
  253. package/skills/loop-agent/references/pi-subagent-assisted-mode.md +84 -84
  254. package/skills/loop-agent/references/post-implementation-and-patterns.md +44 -44
  255. package/skills/loop-agent/references/task-workflow.md +89 -89
  256. package/skills/loop-agent/references/verification-and-failure-handling.md +139 -139
  257. package/skills/playwright-cli/SKILL.md +420 -0
  258. package/skills/playwright-cli/references/element-attributes.md +23 -0
  259. package/skills/playwright-cli/references/playwright-tests.md +39 -0
  260. package/skills/playwright-cli/references/request-mocking.md +87 -0
  261. package/skills/playwright-cli/references/running-code.md +241 -0
  262. package/skills/playwright-cli/references/session-management.md +225 -0
  263. package/skills/playwright-cli/references/storage-state.md +275 -0
  264. package/skills/playwright-cli/references/test-generation.md +433 -0
  265. package/skills/playwright-cli/references/tracing.md +139 -0
  266. package/skills/playwright-cli/references/video-recording.md +143 -0
  267. package/skills/playwright-cli-case-generator/SKILL.md +74 -0
  268. package/skills/requesting-code-review/SKILL.md +101 -101
  269. package/skills/requesting-code-review/code-reviewer.md +168 -168
  270. package/skills/systematic-debugging/CREATION-LOG.md +119 -119
  271. package/skills/systematic-debugging/SKILL.md +296 -296
  272. package/skills/systematic-debugging/condition-based-waiting-example.ts +158 -158
  273. package/skills/systematic-debugging/condition-based-waiting.md +115 -115
  274. package/skills/systematic-debugging/defense-in-depth.md +122 -122
  275. package/skills/systematic-debugging/find-polluter.sh +63 -63
  276. package/skills/systematic-debugging/root-cause-tracing.md +169 -169
  277. package/skills/systematic-debugging/test-academic.md +14 -14
  278. package/skills/systematic-debugging/test-pressure-1.md +58 -58
  279. package/skills/systematic-debugging/test-pressure-2.md +68 -68
  280. package/skills/systematic-debugging/test-pressure-3.md +69 -69
  281. package/skills/test-driven-development/SKILL.md +20 -20
  282. package/skills/using-git-worktrees/SKILL.md +215 -215
  283. package/skills/verification-before-completion/SKILL.md +154 -154
  284. package/skills/webapp-testing/SKILL.md +19 -19
@@ -2,13 +2,9 @@ import { z } from "zod";
2
2
  import { assertDagPromptSourceRule } from "./prompt-source.js";
3
3
  import { dagRetryPolicySchema } from "./retry-policy.js";
4
4
  export const dagComplexitySchema = z.enum(["HIGH", "MED", "LOW"]);
5
- export const dagNodeExecutorSchema = z.enum([
6
- "pi",
7
- "shell",
8
- "static",
9
- ]);
5
+ export const dagNodeExecutorSchema = z.enum(["pi", "shell", "static"]);
10
6
  export const CURSOR_DAG_EXECUTOR_REMOVED_ERROR = 'executor "cursor" is no longer supported; regenerate the DAG with Pi-only writers (implement-pi / repair-pi)';
11
- export const CURSOR_EXECUTOR_MODELS_REMOVED_ERROR = 'executorModels.cursor is no longer supported; use executorModels.pi only';
7
+ export const CURSOR_EXECUTOR_MODELS_REMOVED_ERROR = "executorModels.cursor is no longer supported; use executorModels.pi only";
12
8
  export const dagToolProfileSchema = z.enum(["read-only", "write"]);
13
9
  export const dagShellPresetSchema = z.enum(["loop-agent-standard-verify"]);
14
10
  export const dagVerifyQuotaSchema = z.enum(["1", "3", "full"]);
@@ -16,10 +12,7 @@ export const dagVerifyStrategySchema = z
16
12
  .object({
17
13
  intermediateQuota: dagVerifyQuotaSchema.optional(),
18
14
  finalQuota: z.literal("full").optional().default("full"),
19
- focusedCommandSource: z
20
- .literal("adapter")
21
- .optional()
22
- .default("adapter"),
15
+ focusedCommandSource: z.literal("adapter").optional().default("adapter"),
23
16
  })
24
17
  .optional();
25
18
  export const dagShellVerifyEvidenceSchema = z.object({
@@ -69,6 +62,17 @@ export const dagVerdictGateSchema = z.object({
69
62
  lineMode: z.enum(["first-non-empty", "first-verdict-line"]).optional(),
70
63
  label: z.string().min(1).optional(),
71
64
  });
65
+ export const dagRequirementCoverageGateSchema = z.object({
66
+ fromNodeIds: z.array(z.string().regex(/^[a-z][a-z0-9-]*$/, "fromNodeIds must be kebab-case")).min(1),
67
+ requiredIds: z.array(z.string().regex(/^(?:REQ|BR|AC)-[A-Z0-9]+(?:-[A-Z0-9]+)*$/, "requiredIds must use REQ-*, BR-*, or AC-* identifiers")).min(1),
68
+ label: z.string().min(1).optional(),
69
+ });
70
+ export const dagJsonArtifactGateSchema = z.object({
71
+ fromNodeId: z.string().regex(/^[a-z][a-z0-9-]*$/),
72
+ schemaId: z.literal("backend-test-analysis-v1"),
73
+ artifactName: z.string().regex(/^[a-z0-9][a-z0-9._-]*\.json$/),
74
+ outputDir: z.string().regex(/^[a-z0-9][a-z0-9._-]*$/),
75
+ });
72
76
  export const ENV_VAR_NAME_PATTERN = /^[A-Z_][A-Z0-9_]*$/;
73
77
  export const dagVersionSchema = z
74
78
  .union([z.literal(1), z.literal(2), z.literal(3)])
@@ -109,6 +113,8 @@ export const dagShellConfigSchema = z.object({
109
113
  commands: z.array(z.string()).default([]),
110
114
  preset: dagShellPresetSchema.optional(),
111
115
  verdictGate: dagVerdictGateSchema.optional(),
116
+ requirementCoverageGate: dagRequirementCoverageGateSchema.optional(),
117
+ jsonArtifactGate: dagJsonArtifactGateSchema.optional(),
112
118
  verifyEvidence: dagShellVerifyEvidenceSchema.optional(),
113
119
  repairArtifactGate: dagRepairArtifactGateSchema.optional(),
114
120
  envAllowlist: z.array(z.string()).optional(),
@@ -147,6 +153,10 @@ export const dagDynamicExpansionSchema = z.object({
147
153
  .string()
148
154
  .regex(/^[a-z][a-z0-9-]*$/, "childIdPrefix must be kebab-case"),
149
155
  childTask: dagDynamicExpansionChildTaskSchema,
156
+ tokenBudget: z.object({
157
+ maxTokensPerCase: z.number().int().positive().optional(),
158
+ maxTotalTokens: z.number().int().positive().optional(),
159
+ }).optional(),
150
160
  });
151
161
  export const dagDynamicReductionSchema = z.object({
152
162
  type: z.literal("verified_findings_report"),
@@ -176,9 +186,7 @@ export const dagDynamicConditionSchema = z.object({
176
186
  .optional(),
177
187
  });
178
188
  export const dagDynamicLoopBodyTaskSchema = z.object({
179
- id: z
180
- .string()
181
- .regex(/^[a-z][a-z0-9-]*$/, "body task id must be kebab-case"),
189
+ id: z.string().regex(/^[a-z][a-z0-9-]*$/, "body task id must be kebab-case"),
182
190
  dependsOn: z.array(z.string()).default([]),
183
191
  executor: dagNodeExecutorSchema.default("pi"),
184
192
  role: dagRoleSchema.optional(),
@@ -217,6 +225,7 @@ export const dagConvergenceSpecSchema = z
217
225
  stopOnVerdictPass: z.boolean().optional().default(true),
218
226
  stopOnHardVerifyPass: z.boolean().optional().default(true),
219
227
  pauseOnRegression: z.boolean().optional().default(true),
228
+ chainNodeIds: z.array(z.string()).optional(),
220
229
  })
221
230
  .optional();
222
231
  export const dagTaskSchema = z.object({
@@ -264,11 +273,33 @@ export const dagExecutorModelsSchema = z
264
273
  .strict();
265
274
  export const dagOutputLanguageSchema = z.enum(["zh-CN", "en"]);
266
275
  export const DEFAULT_DAG_OUTPUT_LANGUAGE = "zh-CN";
276
+ export const dagEvaluationBindingSchema = z
277
+ .object({
278
+ campaignId: z.string().min(1),
279
+ candidateId: z.string().regex(/^[A-Za-z0-9][A-Za-z0-9._-]*$/),
280
+ bundleHash: z.string().regex(/^sha256:[a-f0-9]{64}$/),
281
+ seed: z.number().int().nonnegative(),
282
+ split: z.enum(["public", "private", "held_out"]).optional(),
283
+ taskRef: z.string().min(1).optional(),
284
+ })
285
+ .strict();
286
+ export const dagSourceBindingSchema = z.object({
287
+ schemaVersion: z.literal(1),
288
+ taskId: z.string().min(1),
289
+ sources: z.array(z.object({
290
+ kind: z.enum(["requirement", "constraint", "reference"]),
291
+ path: z.string().min(1),
292
+ sha256: z.string().regex(/^[a-f0-9]{64}$/, "sha256 must be lowercase hex"),
293
+ })).min(1),
294
+ requirementIds: z.array(z.string().regex(/^(?:REQ|BR|AC)-[A-Z0-9]+(?:-[A-Z0-9]+)*$/)),
295
+ });
267
296
  export const dagSpecSchema = z
268
297
  .object({
269
298
  version: dagVersionSchema,
270
299
  title: z.string().min(1),
271
300
  runtimeContract: dagRuntimeContractSchema.optional(),
301
+ evaluation: dagEvaluationBindingSchema.optional(),
302
+ sourceBinding: dagSourceBindingSchema.optional(),
272
303
  outputLanguage: dagOutputLanguageSchema.optional(),
273
304
  objective: z.string().optional(),
274
305
  successCriteria: z.array(z.string()).optional(),
@@ -281,6 +312,13 @@ export const dagSpecSchema = z
281
312
  tasks: z.array(dagTaskSchema).min(1),
282
313
  })
283
314
  .superRefine((spec, ctx) => {
315
+ if (spec.evaluation && spec.version !== 3) {
316
+ ctx.addIssue({
317
+ code: z.ZodIssueCode.custom,
318
+ message: "evaluation requires DagSpec version 3",
319
+ path: ["evaluation"],
320
+ });
321
+ }
284
322
  if (spec.runtimeContract && spec.version !== 3) {
285
323
  ctx.addIssue({
286
324
  code: z.ZodIssueCode.custom,
@@ -37,6 +37,7 @@ export function relocateNodeArtifactPaths(node, oldRunDir, newRunDir) {
37
37
  };
38
38
  node.stdoutArtifactPath = rewrite(node.stdoutArtifactPath);
39
39
  node.assistantArtifactPath = rewrite(node.assistantArtifactPath);
40
+ node.structuredArtifactPath = rewrite(node.structuredArtifactPath);
40
41
  node.nodeRecordPath = rewrite(node.nodeRecordPath);
41
42
  }
42
43
  export function relocateConvergenceArtifactPaths(convergence, oldRunDir, newRunDir) {
@@ -12,6 +12,7 @@ const GOVERNANCE_WARNING_TYPES = new Set([
12
12
  "shell-verdict-gate-grep-pattern",
13
13
  "shell-verdict-gate-multi-command-state",
14
14
  "shell-verdict-gate-handwritten-inline",
15
+ "orphan-writer-source-binding",
15
16
  ]);
16
17
  const ROOT_ARTIFACT_PATH_PROBES = [
17
18
  "artifacts/修改记录.md",
@@ -238,6 +239,25 @@ function validateRepairArtifactGateConfig(task, spec, issues) {
238
239
  });
239
240
  }
240
241
  }
242
+ function validateRequirementCoverageGateConfig(task, spec, issues) {
243
+ const gate = task.shell?.requirementCoverageGate;
244
+ if (!gate)
245
+ return;
246
+ if (task.executor !== "shell") {
247
+ issues.push({ type: "invalid-requirement-coverage-gate-config", message: `task ${task.id} shell.requirementCoverageGate requires executor=shell` });
248
+ return;
249
+ }
250
+ const dependencyIds = new Set(task.depends_on);
251
+ for (const fromNodeId of gate.fromNodeIds) {
252
+ if (!dependencyIds.has(fromNodeId)) {
253
+ issues.push({ type: "invalid-requirement-coverage-gate-config", message: `task ${task.id} shell.requirementCoverageGate.fromNodeIds entry "${fromNodeId}" must appear in depends_on` });
254
+ }
255
+ const upstream = spec.tasks.find((candidate) => candidate.id === fromNodeId);
256
+ if (upstream?.executor === "shell") {
257
+ issues.push({ type: "invalid-requirement-coverage-gate-config", message: `task ${task.id} shell.requirementCoverageGate source "${fromNodeId}" must be a non-shell node` });
258
+ }
259
+ }
260
+ }
241
261
  function validateShellVerdictGateGovernance(task, commands, issues) {
242
262
  if (task.executor !== "shell") {
243
263
  return;
@@ -406,7 +426,7 @@ function validateShellTaskConfig(task, spec, issues) {
406
426
  return;
407
427
  }
408
428
  const commands = resolveShellCommands(shell);
409
- if (commands.length === 0) {
429
+ if (commands.length === 0 && !shell.jsonArtifactGate) {
410
430
  issues.push({
411
431
  type: "missing-shell-commands",
412
432
  message: `shell task ${task.id} requires shell.preset, shell.verdictGate, and/or non-empty shell.commands`,
@@ -452,9 +472,46 @@ function validateShellTaskConfig(task, spec, issues) {
452
472
  });
453
473
  }
454
474
  validateVerdictGateConfig(task, spec, issues);
475
+ validateRequirementCoverageGateConfig(task, spec, issues);
476
+ if (shell.jsonArtifactGate && !task.depends_on.includes(shell.jsonArtifactGate.fromNodeId)) {
477
+ issues.push({
478
+ type: "missing-dependency",
479
+ message: `shell task ${task.id} jsonArtifactGate source ${shell.jsonArtifactGate.fromNodeId} must be a direct dependency`,
480
+ });
481
+ }
455
482
  validateRepairArtifactGateConfig(task, spec, issues);
456
483
  validateShellVerdictGateGovernance(task, commands, issues);
457
484
  }
485
+ function hasReadOnlyPlannerAncestor(spec, writer) {
486
+ const taskById = new Map(spec.tasks.map((task) => [task.id, task]));
487
+ const pending = [...writer.depends_on];
488
+ const visited = new Set();
489
+ while (pending.length > 0) {
490
+ const id = pending.shift();
491
+ if (visited.has(id))
492
+ continue;
493
+ visited.add(id);
494
+ const task = taskById.get(id);
495
+ if (!task)
496
+ continue;
497
+ if (task.executor === "pi" && task.role === "planner" && resolveWritePolicy(task, spec) === "read-only")
498
+ return true;
499
+ pending.push(...task.depends_on);
500
+ }
501
+ return false;
502
+ }
503
+ function validateWriterSourceBinding(spec, issues) {
504
+ if (spec.version < 3 || spec.sourceBinding)
505
+ return;
506
+ for (const task of spec.tasks) {
507
+ if (resolveWritePolicy(task, spec) !== "exclusive" || hasReadOnlyPlannerAncestor(spec, task))
508
+ continue;
509
+ issues.push({
510
+ type: "orphan-writer-source-binding",
511
+ message: `task ${task.id} is an exclusive writer without source binding or a read-only planner ancestor; recovery/partial writer DAGs must bind authoritative task sources`,
512
+ });
513
+ }
514
+ }
458
515
  function validateStaticTaskConfig(task, issues) {
459
516
  if (task.executor !== "static") {
460
517
  return;
@@ -579,6 +636,7 @@ export function validateDagSpec(spec) {
579
636
  }
580
637
  validateSameRankWriteSetConflicts(spec, ranks, issues);
581
638
  validateSameRankAgentAttributionRisks(spec, ranks, issues);
639
+ validateWriterSourceBinding(spec, issues);
582
640
  return issues;
583
641
  }
584
642
  export function assertValidDagSpec(spec, options = {}) {
package/docs/README.md CHANGED
@@ -1,104 +1,106 @@
1
- # 文档索引
2
-
3
- `docs/` 是 loop-agent 的治理根目录,包含工作流规则、方法论、验证规则、执行计划、报告、进度日志、决策记录和可复用模板。
4
-
5
- 顶层 `AGENTS.md` 是操作地图。长期知识应落在此处:决策、契约、计划、验证证据、调试笔记和可复用流程规则应记录在 `docs/` 下,而不是只留在聊天里。
6
-
7
- **索引职责**:本文件只索引**核心契约、方法论、产物目录入口与模板**。单篇 progress / report / completed plan 的全量列表分别由对应子目录 `README.md` 维护,避免三处精选榜漂移。
8
-
9
- 站上用法文档在 `../website/docs/`;双树收敛见 `../skills/loop-agent/references/docs-converge.md`。
10
-
11
- ## 核心文档
12
-
13
- - `design/2026-07-14-loop-agent-self-update-notifier.md` — loop-agent CLI 自更新提醒设计与实现依据
14
- - `development-principles.md` — 仓库开发原则
15
- - `architecture/runtime-boundaries.md` — runtime 层边界与依赖方向
16
- - `architecture/README.md` — 架构文档目录索引与阅读路径
17
- - `architecture/system-overview.md` — loop-agent / agent-worker / 治理层 / 外部系统全景
18
- - `architecture/dag-execution.md` — Agent DAG 主调用链、rank 调度、executor、skill snapshot、生命周期
19
- - `architecture/worker-and-feature.md` — agent-worker 子进程边界、controller identity、Task Pool、Feature 与 Observe
20
- - `architecture/facts-and-state.md` — harness 事实与状态、canonical/derived、可写/只读边界
21
- - `architecture/evolution.md` — 当前已实现能力 vs 第 3–6 月未来方向
22
- - `feature-workflow.md` — 有边界的功能工作流
23
- - `verification-matrix.md` — 验证命令选择
24
- - `production-readiness.md` — Production Readiness v0.1 范围、证据与 DAG hardening 标准
25
- - `loop-agent-harness.md` — runtime 与 command surface 概览
26
- - `agent-dag-runner.md` — Agent DAG runner 指南
27
- - `agent-dag-recovery-playbook.md` — DAG 失败分类、recovery action 与 operator 处置手册
28
- - `cursor-prompt-sidecar.md` — `cursor-prompt` one-shot sidecar 用法(非受治理 writer)
29
- - `init-surface.manifest.json` — npm 包范围、目标项目初始化投影与 `init check-update` surface 分类的机器校验契约
30
-
31
- ## 近期完成合同(入口)
32
-
33
- 完整列表见 `exec-plans/completed/README.md`。近期高频入口:
34
-
35
- - `exec-plans/completed/2026-07-14-website-docs-ia-and-converge.md` — Website IA、双树边界与 docs-converge
36
- - `exec-plans/completed/2026-07-13-versioned-self-hosting-bootstrap.md` — 版本化自举与 candidate canary
37
- - `exec-plans/completed/2026-07-12-pi-only-agent-runtime.md` — Pi-only 受治理 runtime
38
- - `exec-plans/completed/2026-07-12-observe-warm-console-redesign.md` — Observe 暖白运行控制台
39
- - `exec-plans/completed/2026-07-12-m2-08-closeout-dogfood-release.md` — 第二月 Closeout 与 dogfood 收口(M2-01~08 completed 索引)
40
-
41
- ## 设计思想来源
42
-
43
- - `../website/docs/practices/` — Anthropic 长时运行 agent harness、OpenAI Codex harness engineering、腾讯端到端 Harness Engineering 与社区 agent harness 实践资料。当前仓库的“人类掌舵、智能体执行”、仓库即记录系统、小步增量、结构化 handoff 和 shell verification 纪律均受这些实践启发;权威执行规则仍以本目录治理文档、根目录 AGENTS.md、harness.json、skills 目录和脚本检查为准。
44
-
45
- ## 方法论
46
-
47
- - `harness-methodology-tdd.md` — 行为变更与 bug 修复的 TDD 纪律
48
- - `harness-methodology-verification.md` — 完成声明前的验证纪律
49
- - `harness-methodology-debugging.md` — 修复前的系统化调试工作流
50
-
51
- ## 产物目录
52
-
53
- - `design/README.md` — 设计草稿、契约映射与路线图(含 design/dynamic-workflow-dag-engine-roadmap.md)
54
- - `exec-plans/active/README.md` — 进行中的执行计划
55
- - `exec-plans/completed/README.md` — 已完成的执行计划(全量)
56
- - `progress/README.md` — 进度交接日志(全量)
57
- - `reports/README.md` — 验证与审计报告(全量);活能力摘要见 `reports/current-capability-summary.md`
58
- - `decisions/README.md` — 架构决策(ADR 0001–0003)
59
- - `skills/README.md` — repo-local skill registry and vetting notes
60
- - `templates/`可复用的规划、报告与 DAG 模板
61
-
62
- ## 仓库 Skills
63
-
64
- - `../skills/loop-agent/` — loop-agent 自身的 skill 指令与参考资料
65
- - `../skills/agent-worker/` — Feature Packet / Task Pool / versioned self-hosting 的可选 outer-loop operator skill;不进入默认 DAG role skills
66
- - 每个额外 skill 在仓库根 `../skills/` 下使用独立子目录;这些本地副本由 DAG 模板引用,维护不依赖外部 agent skill 目录
67
-
68
- ## 模板
69
-
70
- - `templates/project-start-checklist.md` — 开工前检查清单
71
- - `templates/feature-spec.md` — 有边界的功能规格
72
- - `templates/sprint-contract.md` — 实现契约与验收标准
73
- - `templates/exec-plan.md` — 非平凡工作的执行计划
74
- - `templates/progress-log.md` — 进度与交接日志
75
- - `templates/qa-report.md` — 验证与 QA 证据
76
- - `templates/worker-dogfood-setup.md` — 发布 controller identity 固定、真实 Worker sample、candidate canary 与 retry 纪律
77
- - `templates/worker-dogfood-evidence.md` — controller fingerprint、skill snapshot、canary、BE/FE/QA、Observe 与 failure evidence 模板
78
- - `templates/harness.schema.json` — `harness.json` IDE JSON Schema,随初始化投影到目标项目
79
- - `templates/interactive-ui-round2-experiment.md` — interactive UI prompt/model A/B/C 对照实验与统一指标模板
80
- - `templates/product-line/`可投影的 Feature/Task/QA/Links 产品线包;配合 `agent-worker task validate-feature` docs CI
81
- - `templates/production-readiness-checklist.md` — 低/中风险单仓库 DAG readiness 检查清单
82
- - `templates/init-evolution-review.md` 初始化能力演化审查报告模板
83
- - `templates/adr.md` — 架构决策记录(ADR)
84
-
85
- ## 维护
86
-
87
- 文档变更后运行:
88
-
89
- ```bash
90
- node bin/loop-agent.js docs audit --repo-root .
91
- bash scripts/check-doc-index.sh
92
- bash scripts/check-doc-links.sh
93
- bash scripts/check-repo.sh
94
- ```
95
-
96
- 涉及 `website/docs/` 时再跑 `npm run docs:build`,并按 `skills/loop-agent/references/docs-converge.md` 同步 `overview/roadmap.md` 等站上活页。
97
-
98
- Windows 上通过 Git Bash 或已配置的兼容 Bash 运行脚本。实际文件操作使用平台原生路径;`/` 仅用于 repo 引用、JSON/Markdown 证据引用和 glob 约定。
99
-
100
- 完整本地门禁:
101
-
102
- ```bash
103
- bash scripts/ci.sh
104
- ```
1
+ # 文档索引
2
+
3
+ `docs/` 是 loop-agent 的治理根目录,包含工作流规则、方法论、验证规则、执行计划、报告、进度日志、决策记录和可复用模板。
4
+
5
+ 顶层 `AGENTS.md` 是操作地图。长期知识应落在此处:决策、契约、计划、验证证据、调试笔记和可复用流程规则应记录在 `docs/` 下,而不是只留在聊天里。
6
+
7
+ **索引职责**:本文件只索引**核心契约、方法论、产物目录入口与模板**。单篇 progress / report / completed plan 的全量列表分别由对应子目录 `README.md` 维护,避免三处精选榜漂移。
8
+
9
+ 站上用法文档在 `../website/docs/`;双树收敛见 `../skills/loop-agent/references/docs-converge.md`。
10
+
11
+ ## 核心文档
12
+
13
+ - `design/archive/2026-07-14-loop-agent-self-update-notifier.md` — loop-agent CLI 自更新提醒设计(已实现;历史设计说明)
14
+ - `development-principles.md` — 仓库开发原则
15
+ - `architecture/runtime-boundaries.md` — runtime 层边界与依赖方向
16
+ - `architecture/README.md` — 架构文档目录索引与阅读路径
17
+ - `architecture/system-overview.md` — loop-agent / agent-worker / 治理层 / 外部系统全景
18
+ - `architecture/dag-execution.md` — Agent DAG 主调用链、rank 调度、executor、skill snapshot、生命周期
19
+ - `architecture/worker-and-feature.md` — agent-worker 子进程边界、controller identity、Task Pool、Feature 与 Observe
20
+ - `architecture/facts-and-state.md` — harness 事实与状态、canonical/derived、可写/只读边界
21
+ - `architecture/evolution.md` — 当前已实现能力 vs 第 3–6 月未来方向
22
+ - `feature-workflow.md` — 有边界的功能工作流
23
+ - `verification-matrix.md` — 验证命令选择
24
+ - `production-readiness.md` — Production Readiness v0.1 范围、证据与 DAG hardening 标准
25
+ - `loop-agent-harness.md` — runtime 与 command surface 概览
26
+ - `agent-dag-runner.md` — Agent DAG runner 指南
27
+ - `agent-dag-recovery-playbook.md` — DAG 失败分类、recovery action 与 operator 处置手册
28
+ - `design/frontend-mock-data-workflow.md` — 已实现的前端 Mock 数据节点、触发条件、规范证据、验证与失败路由
29
+ - `design/dag-source-binding-and-recovery.md` — 新生成 DAG 的权威任务源绑定、前端需求编号覆盖门禁与中断恢复规则
30
+ - `cursor-prompt-sidecar.md` — `cursor-prompt` one-shot sidecar 用法(非受治理 writer)
31
+ - `init-surface.manifest.json` — npm 包范围、目标项目初始化投影与 `init check-update` surface 分类的机器校验契约
32
+
33
+ ## 近期完成合同(入口)
34
+
35
+ 完整列表见 `exec-plans/completed/README.md`。近期高频入口:
36
+
37
+ - `exec-plans/completed/2026-07-14-website-docs-ia-and-converge.md` — Website IA、双树边界与 docs-converge
38
+ - `exec-plans/completed/2026-07-13-versioned-self-hosting-bootstrap.md` — 版本化自举与 candidate canary
39
+ - `exec-plans/completed/2026-07-12-pi-only-agent-runtime.md` — Pi-only 受治理 runtime
40
+ - `exec-plans/completed/2026-07-12-observe-warm-console-redesign.md` — Observe 暖白运行控制台
41
+ - `exec-plans/completed/2026-07-12-m2-08-closeout-dogfood-release.md` — 第二月 Closeout 与 dogfood 收口(M2-01~08 见 completed 索引)
42
+
43
+ ## 设计思想来源
44
+
45
+ - `../website/docs/practices/` — Anthropic 长时运行 agent harness、OpenAI Codex harness engineering、腾讯端到端 Harness Engineering 与社区 agent harness 实践资料。当前仓库的“人类掌舵、智能体执行”、仓库即记录系统、小步增量、结构化 handoff 和 shell verification 纪律均受这些实践启发;权威执行规则仍以本目录治理文档、根目录 AGENTS.md、harness.json、skills 目录和脚本检查为准。
46
+
47
+ ## 方法论
48
+
49
+ - `harness-methodology-tdd.md` — 行为变更与 bug 修复的 TDD 纪律
50
+ - `harness-methodology-verification.md` — 完成声明前的验证纪律
51
+ - `harness-methodology-debugging.md` — 修复前的系统化调试工作流
52
+
53
+ ## 产物目录
54
+
55
+ - `design/README.md` — 设计草稿、契约映射与路线图(含 design/dynamic-workflow-dag-engine-roadmap.md)
56
+ - `exec-plans/active/README.md` — 进行中的执行计划
57
+ - `exec-plans/completed/README.md` — 已完成的执行计划(全量)
58
+ - `progress/README.md` — 进度交接日志(全量)
59
+ - `reports/README.md` — 验证与审计报告(全量);活能力摘要见 `reports/current-capability-summary.md`
60
+ - `decisions/README.md`架构决策(ADR 0001–0004;0004 = Task Pool feature-scoped identity)
61
+ - `skills/README.md` — repo-local skill registry and vetting notes
62
+ - `templates/` — 可复用的规划、报告与 DAG 模板
63
+
64
+ ## 仓库 Skills
65
+
66
+ - `../skills/loop-agent/` loop-agent 自身的 skill 指令与参考资料
67
+ - `../skills/agent-worker/` — Feature Packet / Task Pool / versioned self-hosting 的可选 outer-loop operator skill;不进入默认 DAG role skills
68
+ - 每个额外 skill 在仓库根 `../skills/` 下使用独立子目录;这些本地副本由 DAG 模板引用,维护不依赖外部 agent skill 目录
69
+
70
+ ## 模板
71
+
72
+ - `templates/project-start-checklist.md` — 开工前检查清单
73
+ - `templates/feature-spec.md` — 有边界的功能规格
74
+ - `templates/sprint-contract.md` — 实现契约与验收标准
75
+ - `templates/exec-plan.md` — 非平凡工作的执行计划
76
+ - `templates/progress-log.md` — 进度与交接日志
77
+ - `templates/qa-report.md` — 验证与 QA 证据
78
+ - `templates/worker-dogfood-setup.md` — 发布 controller identity 固定、真实 Worker sample、candidate canary 与 retry 纪律
79
+ - `templates/worker-dogfood-evidence.md` — controller fingerprint、skill snapshot、canary、BE/FE/QA、Observe 与 failure evidence 模板
80
+ - `templates/harness.schema.json` — `harness.json` IDE JSON Schema,随初始化投影到目标项目
81
+ - `templates/interactive-ui-round2-experiment.md` — interactive UI prompt/model A/B/C 对照实验与统一指标模板
82
+ - `templates/product-line/` — 可投影的 Feature/Task/QA/Links 产品线包;配合 `agent-worker task validate-feature` docs CI
83
+ - `templates/production-readiness-checklist.md` — 低/中风险单仓库 DAG readiness 检查清单
84
+ - `templates/init-evolution-review.md` — 初始化能力演化审查报告模板
85
+ - `templates/adr.md` — 架构决策记录(ADR)
86
+
87
+ ## 维护
88
+
89
+ 文档变更后运行:
90
+
91
+ ```bash
92
+ node bin/loop-agent.js docs audit --repo-root .
93
+ bash scripts/check-doc-index.sh
94
+ bash scripts/check-doc-links.sh
95
+ bash scripts/check-repo.sh
96
+ ```
97
+
98
+ 涉及 `website/docs/` 时再跑 `npm run docs:build`,并按 `skills/loop-agent/references/docs-converge.md` 同步 `overview/roadmap.md` 等站上活页。
99
+
100
+ Windows 上通过 Git Bash 或已配置的兼容 Bash 运行脚本。实际文件操作使用平台原生路径;`/` 仅用于 repo 引用、JSON/Markdown 证据引用和 glob 约定。
101
+
102
+ 完整本地门禁:
103
+
104
+ ```bash
105
+ bash scripts/ci.sh
106
+ ```