@tea-agent/loop-agent 0.13.0-alpha.0 → 0.13.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 (199) hide show
  1. package/AGENTS.md +4 -0
  2. package/CHANGELOG.md +57 -53
  3. package/README.md +12 -3
  4. package/dist/application/dag/generate-task-dag.js +28 -58
  5. package/dist/application/evaluation/candidate-hash.js +75 -0
  6. package/dist/application/evaluation/candidate.js +52 -0
  7. package/dist/application/evaluation/replay.js +289 -0
  8. package/dist/application/evaluation/types.js +130 -0
  9. package/dist/cli/command-definitions.js +17 -4
  10. package/dist/cli/program.js +8 -4
  11. package/dist/commands/eval.js +235 -0
  12. package/dist/commands/init.js +131 -24
  13. package/dist/executors/pi-sdk-executor.js +38 -24
  14. package/dist/executors/shell-executor.js +226 -15
  15. package/dist/executors/shell-presets.js +20 -0
  16. package/dist/executors/shell-verification.js +7 -0
  17. package/dist/governance/manifest-types.js +1 -0
  18. package/dist/infrastructure/evaluation/candidate-store.js +439 -0
  19. package/dist/infrastructure/evaluation/store.js +40 -0
  20. package/dist/task/config-types.js +23 -0
  21. package/dist/worker/observe/routes.js +18 -3
  22. package/dist/worker/observe/spec-evidence.js +1 -1
  23. package/dist/worker/observe/static/dom.js +160 -1
  24. package/dist/worker/observe/static/state.js +14 -0
  25. package/dist/worker/observe/static/views/dag-inspector.js +35 -4
  26. package/dist/worker/observe/static/views/dag.js +9 -0
  27. package/dist/worker/observe/static/views/dashboard.js +702 -445
  28. package/dist/worker/observe/static/views/session-timeline.js +15 -1
  29. package/dist/workflows/dag/backend-test-analysis-contract.js +120 -0
  30. package/dist/workflows/dag/backend-test-case-manifest.js +503 -0
  31. package/dist/workflows/dag/backend-test-execution-contract.js +353 -0
  32. package/dist/workflows/dag/backend-test-result-contract.js +568 -0
  33. package/dist/workflows/dag/decision-envelope.js +57 -2
  34. package/dist/workflows/dag/dynamic-runtime/map.js +90 -2
  35. package/dist/workflows/dag/frontend-implementation-contract.js +240 -0
  36. package/dist/workflows/dag/frontend-project-capability.js +309 -0
  37. package/dist/workflows/dag/frontend-repair.js +341 -0
  38. package/dist/workflows/dag/frontend-risk.js +161 -0
  39. package/dist/workflows/dag/frontend-verification-trace.js +190 -0
  40. package/dist/workflows/dag/init-hybrid.js +2407 -297
  41. package/dist/workflows/dag/node-execution.js +9 -0
  42. package/dist/workflows/dag/prompt.js +9 -0
  43. package/dist/workflows/dag/repair-artifact.js +43 -3
  44. package/dist/workflows/dag/report.js +35 -1
  45. package/dist/workflows/dag/runner.js +28 -2
  46. package/dist/workflows/dag/skill-instructions.js +4 -2
  47. package/dist/workflows/dag/task-demand-routing.js +383 -0
  48. package/dist/workflows/dag/types.js +71 -13
  49. package/dist/workflows/dag/upstream-artifacts.js +1 -0
  50. package/dist/workflows/dag/validate.js +59 -1
  51. package/docs/README.md +6 -3
  52. package/docs/agent-dag-recovery-playbook.md +5 -3
  53. package/docs/agent-dag-runner.md +3 -3
  54. package/docs/architecture/README.md +3 -3
  55. package/docs/architecture/dag-execution.md +1 -1
  56. package/docs/architecture/evolution.md +13 -13
  57. package/docs/architecture/facts-and-state.md +1 -1
  58. package/docs/architecture/runtime-boundaries.md +7 -7
  59. package/docs/architecture/system-overview.md +3 -3
  60. package/docs/architecture/worker-and-feature.md +3 -3
  61. package/docs/design/README.md +124 -42
  62. package/docs/development-principles.md +4 -4
  63. package/docs/exec-plans/active/README.md +12 -11
  64. package/docs/exec-plans/completed/README.md +33 -0
  65. package/docs/feature-workflow.md +114 -39
  66. package/docs/init-surface.manifest.json +30 -3
  67. package/docs/loop-agent-harness.md +9 -8
  68. package/docs/production-readiness.md +1 -1
  69. package/docs/progress/README.md +23 -1
  70. package/docs/reports/README.md +65 -6
  71. package/docs/skills/vetted-skill-registry.md +2 -0
  72. package/docs/templates/agent-dag.schema.json +29 -1
  73. package/docs/templates/agent-dag.supervised-implementation.json +127 -8
  74. package/docs/templates/backend-test-analysis.schema.json +44 -0
  75. package/docs/templates/backend-test-case-manifest.schema.json +190 -0
  76. package/docs/templates/backend-test-dag.classify.prompt.md +75 -0
  77. package/docs/templates/backend-test-dag.generate-pytest.prompt.md +81 -16
  78. package/docs/templates/backend-test-dag.json +311 -40
  79. package/docs/templates/backend-test-dag.retrospect.prompt.md +44 -30
  80. package/docs/templates/backend-test-dag.review-cases.prompt.md +10 -8
  81. package/docs/templates/backend-test-execution.schema.json +133 -0
  82. package/docs/templates/backend-test-result.schema.json +99 -0
  83. package/docs/templates/branch-merge-report.md +93 -0
  84. package/docs/templates/frontend-design-contract.md +9 -0
  85. package/docs/templates/frontend-eval/fixtures/failures/01-type-build-error.md +17 -0
  86. package/docs/templates/frontend-eval/fixtures/failures/02-unit-component-test-fail.md +16 -0
  87. package/docs/templates/frontend-eval/fixtures/failures/03-fixture-schema-drift.md +16 -0
  88. package/docs/templates/frontend-eval/fixtures/failures/04-missing-loading-empty-error-state.md +16 -0
  89. package/docs/templates/frontend-eval/fixtures/failures/05-forbidden-write-writeset-expansion.md +16 -0
  90. package/docs/templates/frontend-eval/fixtures/failures/06-unapproved-dependency-add.md +16 -0
  91. package/docs/templates/frontend-eval/fixtures/failures/07-mock-production-on.md +21 -0
  92. package/docs/templates/frontend-eval/fixtures/functional/01-simple-component-style.md +29 -0
  93. package/docs/templates/frontend-eval/fixtures/functional/02-form-validation.md +28 -0
  94. package/docs/templates/frontend-eval/fixtures/functional/03-list-detail-page.md +28 -0
  95. package/docs/templates/frontend-eval/fixtures/functional/04-api-mock.md +29 -0
  96. package/docs/templates/frontend-eval/fixtures/functional/05-permission-auth-gated-ui.md +27 -0
  97. package/docs/templates/frontend-eval/fixtures/functional/06-ssr-server-client-boundary.md +28 -0
  98. package/docs/templates/frontend-eval/fixtures/functional/07-shared-public-component-api.md +28 -0
  99. package/docs/templates/frontend-eval/fixtures/functional/08-pure-local-no-remote.md +27 -0
  100. package/docs/templates/frontend-eval/metrics.md +138 -0
  101. package/docs/templates/frontend-eval/smoke-targets.md +53 -0
  102. package/docs/templates/frontend-implementation-contract.schema.json +27 -0
  103. package/docs/templates/frontend-task-constraints.md +10 -0
  104. package/docs/templates/frontend-task-requirement.md +9 -0
  105. package/docs/templates/frontend-test-dag.generate-cases.prompt.md +5 -0
  106. package/docs/templates/frontend-test-dag.json +23 -0
  107. package/docs/templates/frontend-test-dag.retrieve-context.prompt.md +3 -0
  108. package/docs/templates/frontend-test-dag.retrospect.prompt.md +3 -0
  109. package/docs/templates/frontend-test-dag.review-cases.prompt.md +3 -0
  110. package/docs/templates/frontend-test-dag.review-execution.prompt.md +3 -0
  111. package/docs/templates/knowledge-graph-bootstrap-dag.json +1 -1
  112. package/docs/templates/knowledge-sync-dag.json +1 -0
  113. package/docs/verification-matrix.md +4 -1
  114. package/examples/decision-gate-agent-dag.json +4 -4
  115. package/examples/hybrid-loop-agent-dag.json +1 -1
  116. package/package.json +2 -2
  117. package/scripts/kb-bootstrap-init-skeleton.sh +2 -1
  118. package/scripts/kb-graph-incremental-prepare.mjs +19 -5
  119. package/scripts/kb-graph-promote.mjs +12 -1
  120. package/skills/ai-engineering-context/SKILL.md +2 -2
  121. package/skills/analyze-product-dependencies/SKILL.md +67 -0
  122. package/skills/analyze-product-dependencies/agents/openai.yaml +4 -0
  123. package/skills/analyze-product-dependencies/references/api-documentation-schema.md +30 -0
  124. package/skills/analyze-product-dependencies/references/dependency-analysis-schema.md +28 -0
  125. package/skills/analyze-product-dependencies/references/example.md +76 -0
  126. package/skills/analyze-product-dependencies/references/forward-test-cases.md +35 -0
  127. package/skills/analyze-product-dependencies/references/input-contract.md +11 -0
  128. package/skills/analyze-product-dependencies/references/scouting-rules.md +61 -0
  129. package/skills/analyze-product-dependencies/scripts/test-validators.mjs +267 -0
  130. package/skills/analyze-product-dependencies/scripts/validate-api-documentation.mjs +101 -0
  131. package/skills/analyze-product-dependencies/scripts/validate-dependency-analysis.mjs +142 -0
  132. package/skills/analyze-product-dependencies/scripts/validate-product-requirement-input.mjs +76 -0
  133. package/skills/analyze-product-dependencies/scripts/validation-helpers.mjs +146 -0
  134. package/skills/analyze-product-requirements/SKILL.md +90 -0
  135. package/skills/analyze-product-requirements/agents/openai.yaml +4 -0
  136. package/skills/analyze-product-requirements/references/acceptance-criteria.md +91 -0
  137. package/skills/analyze-product-requirements/references/clarification-and-knowledge.md +56 -0
  138. package/skills/analyze-product-requirements/references/example.md +86 -0
  139. package/skills/analyze-product-requirements/references/forward-test-cases.md +66 -0
  140. package/skills/analyze-product-requirements/references/product-analysis-schema.md +32 -0
  141. package/skills/analyze-product-requirements/references/product-requirement-schema.md +33 -0
  142. package/skills/analyze-product-requirements/references/requirement-clarification-schema.md +35 -0
  143. package/skills/analyze-product-requirements/scripts/test-validators.mjs +193 -0
  144. package/skills/analyze-product-requirements/scripts/validate-product-analysis.mjs +69 -0
  145. package/skills/analyze-product-requirements/scripts/validate-product-requirement.mjs +97 -0
  146. package/skills/analyze-product-requirements/scripts/validate-requirement-clarification.mjs +98 -0
  147. package/skills/analyze-product-requirements/scripts/validation-helpers.mjs +156 -0
  148. package/skills/browser-tools/SKILL.md +196 -0
  149. package/skills/browser-tools/browser-content.js +103 -0
  150. package/skills/browser-tools/browser-cookies.js +35 -0
  151. package/skills/browser-tools/browser-eval.js +53 -0
  152. package/skills/browser-tools/browser-hn-scraper.js +108 -0
  153. package/skills/browser-tools/browser-nav.js +44 -0
  154. package/skills/browser-tools/browser-pick.js +162 -0
  155. package/skills/browser-tools/browser-screenshot.js +34 -0
  156. package/skills/browser-tools/browser-start.js +86 -0
  157. package/skills/browser-tools/package-lock.json +2556 -0
  158. package/skills/browser-tools/package.json +19 -0
  159. package/skills/frontend-design-review/SKILL.md +6 -1
  160. package/skills/frontend-design-review/references/review-checklist.md +25 -4
  161. package/skills/frontend-implementation/SKILL.md +25 -30
  162. package/skills/frontend-implementation/references/code-standards.md +20 -22
  163. package/skills/frontend-implementation/references/node-contracts.md +17 -53
  164. package/skills/frontend-review/SKILL.md +10 -4
  165. package/skills/frontend-review/references/review-findings.md +8 -3
  166. package/skills/frontend-verification/SKILL.md +22 -9
  167. package/skills/frontend-verification/references/verification-checklist.md +17 -5
  168. package/skills/grill-with-docs/SKILL.md +5 -5
  169. package/skills/grill-with-docs/adr-format.md +3 -3
  170. package/skills/init-capability-evolution/SKILL.md +5 -5
  171. package/skills/loop-agent/SKILL.md +5 -5
  172. package/skills/loop-agent/references/README.md +3 -3
  173. package/skills/loop-agent/references/command-reference.md +98 -24
  174. package/skills/loop-agent/references/docs-converge.md +15 -15
  175. package/skills/loop-agent/references/harness-policy.md +2 -2
  176. package/skills/loop-agent/references/hybrid-dag.md +32 -22
  177. package/skills/loop-agent/references/multi-worktree.md +1 -1
  178. package/skills/loop-agent/references/orchestrator-and-interventions.md +8 -8
  179. package/skills/loop-agent/references/task-workflow.md +1 -1
  180. package/skills/loop-agent/references/verification-and-failure-handling.md +6 -4
  181. package/skills/playwright-cli/SKILL.md +420 -0
  182. package/skills/playwright-cli/references/element-attributes.md +23 -0
  183. package/skills/playwright-cli/references/playwright-tests.md +39 -0
  184. package/skills/playwright-cli/references/request-mocking.md +87 -0
  185. package/skills/playwright-cli/references/running-code.md +241 -0
  186. package/skills/playwright-cli/references/session-management.md +225 -0
  187. package/skills/playwright-cli/references/storage-state.md +275 -0
  188. package/skills/playwright-cli/references/test-generation.md +433 -0
  189. package/skills/playwright-cli/references/tracing.md +139 -0
  190. package/skills/playwright-cli/references/video-recording.md +143 -0
  191. package/skills/playwright-cli-case-generator/SKILL.md +74 -0
  192. package/skills/requesting-code-review/SKILL.md +1 -1
  193. package/skills/systematic-debugging/CREATION-LOG.md +3 -3
  194. package/skills/systematic-debugging/SKILL.md +1 -1
  195. package/skills/systematic-debugging/test-academic.md +1 -1
  196. package/skills/systematic-debugging/test-pressure-1.md +1 -1
  197. package/skills/systematic-debugging/test-pressure-2.md +1 -1
  198. package/skills/systematic-debugging/test-pressure-3.md +1 -1
  199. package/skills/verification-before-completion/SKILL.md +1 -1
@@ -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,30 @@ 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
67
+ .array(z.string().regex(/^[a-z][a-z0-9-]*$/, "fromNodeIds must be kebab-case"))
68
+ .min(1),
69
+ requiredIds: z
70
+ .array(z
71
+ .string()
72
+ .regex(/^(?:REQ|BR|AC)-[A-Z0-9]+(?:-[A-Z0-9]+)*$/, "requiredIds must use REQ-*, BR-*, or AC-* identifiers"))
73
+ .min(1),
74
+ label: z.string().min(1).optional(),
75
+ });
76
+ export const dagJsonArtifactSchemaIdSchema = z.enum([
77
+ "backend-test-analysis-v1",
78
+ "backend-test-execution-v1",
79
+ "backend-test-result-v1",
80
+ "backend-test-case-manifest-v1",
81
+ "frontend-implementation-contract-v1",
82
+ ]);
83
+ export const dagJsonArtifactGateSchema = z.object({
84
+ fromNodeId: z.string().regex(/^[a-z][a-z0-9-]*$/),
85
+ schemaId: dagJsonArtifactSchemaIdSchema,
86
+ artifactName: z.string().regex(/^[a-z0-9][a-z0-9._-]*\.json$/),
87
+ outputDir: z.string().regex(/^[a-z0-9][a-z0-9._-]*$/),
88
+ });
72
89
  export const ENV_VAR_NAME_PATTERN = /^[A-Z_][A-Z0-9_]*$/;
73
90
  export const dagVersionSchema = z
74
91
  .union([z.literal(1), z.literal(2), z.literal(3)])
@@ -109,8 +126,12 @@ export const dagShellConfigSchema = z.object({
109
126
  commands: z.array(z.string()).default([]),
110
127
  preset: dagShellPresetSchema.optional(),
111
128
  verdictGate: dagVerdictGateSchema.optional(),
129
+ requirementCoverageGate: dagRequirementCoverageGateSchema.optional(),
130
+ jsonArtifactGate: dagJsonArtifactGateSchema.optional(),
112
131
  verifyEvidence: dagShellVerifyEvidenceSchema.optional(),
113
132
  repairArtifactGate: dagRepairArtifactGateSchema.optional(),
133
+ /** fail (default): any nonzero command fails the node. record: finish node FINISHED with failure facts for downstream assess/repair. */
134
+ nonZeroExitPolicy: z.enum(["fail", "record"]).optional(),
114
135
  envAllowlist: z.array(z.string()).optional(),
115
136
  timeoutMs: z.number().optional(),
116
137
  cwd: z.string().optional(),
@@ -147,6 +168,12 @@ export const dagDynamicExpansionSchema = z.object({
147
168
  .string()
148
169
  .regex(/^[a-z][a-z0-9-]*$/, "childIdPrefix must be kebab-case"),
149
170
  childTask: dagDynamicExpansionChildTaskSchema,
171
+ tokenBudget: z
172
+ .object({
173
+ maxTokensPerCase: z.number().int().positive().optional(),
174
+ maxTotalTokens: z.number().int().positive().optional(),
175
+ })
176
+ .optional(),
150
177
  });
151
178
  export const dagDynamicReductionSchema = z.object({
152
179
  type: z.literal("verified_findings_report"),
@@ -176,9 +203,7 @@ export const dagDynamicConditionSchema = z.object({
176
203
  .optional(),
177
204
  });
178
205
  export const dagDynamicLoopBodyTaskSchema = z.object({
179
- id: z
180
- .string()
181
- .regex(/^[a-z][a-z0-9-]*$/, "body task id must be kebab-case"),
206
+ id: z.string().regex(/^[a-z][a-z0-9-]*$/, "body task id must be kebab-case"),
182
207
  dependsOn: z.array(z.string()).default([]),
183
208
  executor: dagNodeExecutorSchema.default("pi"),
184
209
  role: dagRoleSchema.optional(),
@@ -265,11 +290,37 @@ export const dagExecutorModelsSchema = z
265
290
  .strict();
266
291
  export const dagOutputLanguageSchema = z.enum(["zh-CN", "en"]);
267
292
  export const DEFAULT_DAG_OUTPUT_LANGUAGE = "zh-CN";
293
+ export const dagEvaluationBindingSchema = z
294
+ .object({
295
+ campaignId: z.string().min(1),
296
+ candidateId: z.string().regex(/^[A-Za-z0-9][A-Za-z0-9._-]*$/),
297
+ bundleHash: z.string().regex(/^sha256:[a-f0-9]{64}$/),
298
+ seed: z.number().int().nonnegative(),
299
+ split: z.enum(["public", "private", "held_out"]).optional(),
300
+ taskRef: z.string().min(1).optional(),
301
+ })
302
+ .strict();
303
+ export const dagSourceBindingSchema = z.object({
304
+ schemaVersion: z.literal(1),
305
+ taskId: z.string().min(1),
306
+ sources: z
307
+ .array(z.object({
308
+ kind: z.enum(["requirement", "constraint", "reference"]),
309
+ path: z.string().min(1),
310
+ sha256: z
311
+ .string()
312
+ .regex(/^[a-f0-9]{64}$/, "sha256 must be lowercase hex"),
313
+ }))
314
+ .min(1),
315
+ requirementIds: z.array(z.string().regex(/^(?:REQ|BR|AC)-[A-Z0-9]+(?:-[A-Z0-9]+)*$/)),
316
+ });
268
317
  export const dagSpecSchema = z
269
318
  .object({
270
319
  version: dagVersionSchema,
271
320
  title: z.string().min(1),
272
321
  runtimeContract: dagRuntimeContractSchema.optional(),
322
+ evaluation: dagEvaluationBindingSchema.optional(),
323
+ sourceBinding: dagSourceBindingSchema.optional(),
273
324
  outputLanguage: dagOutputLanguageSchema.optional(),
274
325
  objective: z.string().optional(),
275
326
  successCriteria: z.array(z.string()).optional(),
@@ -282,6 +333,13 @@ export const dagSpecSchema = z
282
333
  tasks: z.array(dagTaskSchema).min(1),
283
334
  })
284
335
  .superRefine((spec, ctx) => {
336
+ if (spec.evaluation && spec.version !== 3) {
337
+ ctx.addIssue({
338
+ code: z.ZodIssueCode.custom,
339
+ message: "evaluation requires DagSpec version 3",
340
+ path: ["evaluation"],
341
+ });
342
+ }
285
343
  if (spec.runtimeContract && spec.version !== 3) {
286
344
  ctx.addIssue({
287
345
  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
@@ -10,7 +10,7 @@
10
10
 
11
11
  ## 核心文档
12
12
 
13
- - `design/2026-07-14-loop-agent-self-update-notifier.md` — loop-agent CLI 自更新提醒设计与实现依据
13
+ - `design/archive/2026-07-14-loop-agent-self-update-notifier.md` — loop-agent CLI 自更新提醒设计(已实现;历史设计说明)
14
14
  - `development-principles.md` — 仓库开发原则
15
15
  - `architecture/runtime-boundaries.md` — runtime 层边界与依赖方向
16
16
  - `architecture/README.md` — 架构文档目录索引与阅读路径
@@ -25,6 +25,8 @@
25
25
  - `loop-agent-harness.md` — runtime 与 command surface 概览
26
26
  - `agent-dag-runner.md` — Agent DAG runner 指南
27
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 的权威任务源绑定、前端需求编号覆盖门禁与中断恢复规则
28
30
  - `cursor-prompt-sidecar.md` — `cursor-prompt` one-shot sidecar 用法(非受治理 writer)
29
31
  - `init-surface.manifest.json` — npm 包范围、目标项目初始化投影与 `init check-update` surface 分类的机器校验契约
30
32
 
@@ -79,8 +81,9 @@
79
81
  - `templates/interactive-ui-round2-experiment.md` — interactive UI prompt/model A/B/C 对照实验与统一指标模板
80
82
  - `templates/product-line/` — 可投影的 Feature/Task/QA/Links 产品线包;配合 `agent-worker task validate-feature` 做 docs CI
81
83
  - `templates/production-readiness-checklist.md` — 低/中风险单仓库 DAG readiness 检查清单
82
- - `templates/init-evolution-review.md` — 初始化能力演化审查报告模板
83
- - `templates/adr.md` — 架构决策记录(ADR)
84
+ - `templates/init-evolution-review.md` — 初始化能力演化审查报告模板
85
+ - `templates/branch-merge-report.md` — 跨分支合并的功能保留、冲突解析、init/update 与 package surface 审计模板
86
+ - `templates/adr.md` — 架构决策记录(ADR)
84
87
 
85
88
  ## 维护
86
89
 
@@ -6,6 +6,8 @@
6
6
 
7
7
  Agent DAG **recovery planning 是只读、派生、advisory** 的。`dag report` 与 `buildDagDecisionGateEvidence()` 从 `.harness/dag-runs/` 的 canonical facts 聚合 `normalizedFailureCategory` → `recoveryRecommendation`,供人工或 Decision Gate prompt 消费。
8
8
 
9
+ 中断后不要从上游摘要手工生成 impl-only DAG。先修复 `.harness/tasks/<task-id>/source/` 或计划,再对同一 task 重新执行 `dag run-task`、严格 `dag validate` 和新的 `run-dag`。新生成的完整 DAG 会重新冻结 `sourceBinding` 并经过 contract/scout/plan/gate;v3 孤立 writer 如果既无来源绑定、也无只读 planner 上游,会被 strict governance 拒绝。完整规则见 [`design/dag-source-binding-and-recovery.md`](design/dag-source-binding-and-recovery.md)。
10
+
9
11
  Production Readiness v0.1 在 normalized DAG category 之上增加 product-line routing。Report 与 doctor 输出应保留 raw DAG fact 并派生,不重写已完成 facts:
10
12
 
11
13
  ```text
@@ -15,7 +17,7 @@ product_line_failure_category
15
17
  recommended_follow_up
16
18
  ```
17
19
 
18
- Product-line taxonomy 定义见 `docs/design/state-and-failure-taxonomy.md`。
20
+ Product-line taxonomy 定义见 `ai_workspace/loop-agent/design/state-and-failure-taxonomy.md`。
19
21
 
20
22
  ### 前端设计门禁专用恢复路径
21
23
 
@@ -80,7 +82,7 @@ Decision Gate prompt 侧:`buildDagDecisionGateEvidence()`(`./src/core/dag-de
80
82
 
81
83
  ## `dag report --json` schema 锁定
82
84
 
83
- - **Schema 文件**:`docs/templates/agent-dag-report.schema.json`
85
+ - **Schema 文件**:`ai_workspace/loop-agent/templates/agent-dag-report.schema.json`
84
86
  - **Envelope**:`{ schemaVersion: 1, runs: DagRunReportEntry[] }`
85
87
  - **稳定消费字段**(Decision Gate / tooling 应依赖):`primaryFailure`、`primaryRecovery`、`downstreamSkippedNodes`、`recoveryRecommendation`、`normalizedFailureCategory`;node 级 `decisionEnvelope`、`artifacts`;paused 级 `pausedByNodeId`、`pauseReason`
86
88
  - **测试**:`./test/dag-report.test.ts` §`dag report JSON schema contract` 对 fixture run 做 schema 校验
@@ -144,7 +146,7 @@ Decision Gate prompt 侧:`buildDagDecisionGateEvidence()`(`./src/core/dag-de
144
146
  3. **Blocked Downstream / Skipped Nodes** — `downstreamSkippedNodes`
145
147
  4. **Recommended Operator Action** — 面向 operator 的步骤摘要
146
148
 
147
- 保存 handoff 时重定向到平台临时目录或 `docs/reports/`,不要写入 `.harness/dag-runs/`。
149
+ 保存 handoff 时重定向到平台临时目录或 `ai_workspace/loop-agent/reports/`,不要写入 `.harness/dag-runs/`。
148
150
 
149
151
  ## Decision Gate 消费约定
150
152
 
@@ -46,11 +46,11 @@ planner/scout/reviewer/verifier/closeout 角色的只读 Pi 节点可声明 opt-
46
46
 
47
47
  ## Skills
48
48
 
49
- DAG spec 可声明 `defaults.skills`、`skillsByRole` 与节点级 `skills`。Runner 优先从目标项目 `.agents/skills/<skill-name>/SKILL.md` 解析本地指令,再回退到包内 `skills/`,并在各节点 `skills.json` artifact 中记录解析元数据。
49
+ DAG spec 可声明 `defaults.skills`、`skillsByRole` 与节点级 `skills`。Runner 优先从目标项目 `.agents/skills/<skill-name>/SKILL.md` 解析本地指令,再回退到包内 `.agents/skills/`,并在各节点 `skills.json` artifact 中记录解析元数据。
50
50
 
51
- 执行前可用 `dag validate --strict-skills` 做 opt-in skill audit;该门禁会在 missing/error/truncated skill 或 unresolved reference 出现时失败。默认 role skill 应来自 `docs/skills/vetted-skill-registry.md` 中记录的 repo-local wrapper。
51
+ 执行前可用 `dag validate --strict-skills` 做 opt-in skill audit;该门禁会在 missing/error/truncated skill 或 unresolved reference 出现时失败。默认 role skill 应来自 `ai_workspace/loop-agent/.agents/skills/vetted-skill-registry.md` 中记录的 repo-local wrapper。
52
52
 
53
- 目标项目的 `loop-agent` skill 位于 `.agents/skills/loop-agent/SKILL.md`。loop-agent 源仓库和 npm 包内置版本仍位于 `skills/loop-agent/SKILL.md`;遗留根路径 `skill/SKILL.md` 仅为旧 worktree 保留兼容 fallback。
53
+ 目标项目的 `loop-agent` skill 位于 `.agents/skills/loop-agent/SKILL.md`。loop-agent 源仓库和 npm 包内置版本仍位于 `.agents/skills/loop-agent/SKILL.md`;遗留根路径 `skill/SKILL.md` 仅为旧 worktree 保留兼容 fallback。
54
54
 
55
55
  ## Artifacts
56
56
 
@@ -15,12 +15,12 @@
15
15
 
16
16
  ## 事实与规划的区分
17
17
 
18
- - **当前事实源**:`src/` 源码、发布 CLI、`docs/exec-plans/completed/`、`docs/reports/current-capability-summary.md`、ADR 0001–0003。
19
- - **规划/设计输入**:`docs/design/`(含 `dynamic-workflow-dag-engine-roadmap.md`、`六个月规划.md`)。这些文件已带 2026-07-14 校准条;凡未兑现的 phase 段落是设计输入,**不是**已实现证明。
18
+ - **当前事实源**:`src/` 源码、发布 CLI、`ai_workspace/loop-agent/exec-plans/completed/`、`ai_workspace/loop-agent/reports/current-capability-summary.md`、ADR 0001–0003。
19
+ - **规划/设计输入**:`ai_workspace/loop-agent/design/`(含 `dynamic-workflow-dag-engine-roadmap.md`、`六个月规划.md`)。这些文件已带 2026-07-14 校准条;凡未兑现的 phase 段落是设计输入,**不是**已实现证明。
20
20
  - 凡本目录文档描述未来能力,一律使用「规划 / 未实现 / 前瞻」标签。
21
21
 
22
22
  ## 与其他文档的分工
23
23
 
24
24
  - 本目录不复制 `runtime-boundaries.md` 的 import 方向表、governance-hook 表与版本化自举边界表,只交叉引用。
25
25
  - 用法与操作说明在 `website/docs/`(使用者双树),不在本目录重复。
26
- - 本目录文档随发布包发布(npm `files` 显式条目 + `docs/init-surface.manifest.json` `packageRequired`),但 **不**投影到目标项目 init surface;目标项目 init 仍只投影语言无关的 `runtime-boundaries.md`。
26
+ - 本目录文档随发布包发布(npm `files` 显式条目 + `ai_workspace/loop-agent/init-surface.manifest.json` `packageRequired`),但 **不**投影到目标项目 init surface;目标项目 init 仍只投影语言无关的 `runtime-boundaries.md`。
@@ -137,4 +137,4 @@ WorkflowSpec (src/workflows/dynamic/spec.ts workflowSpecSchema)
137
137
 
138
138
  - 动态语义:`map_agent` / `verify_agent` / `reduce_agent` / `condition` / `loop_until` / `human_gate` / `command` / `artifact_transform`。
139
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 校准条)。
140
+ - 未完全兑现的 runtime limits 强执法、更广 profile、Loop 原生 `workflow` action 深度编排等仍是**设计输入**,见 `ai_workspace/loop-agent/design/dynamic-workflow-dag-engine-roadmap.md`(带 2026-07-14 校准条)。
@@ -1,6 +1,6 @@
1
1
  # 架构演进:当前 vs 未来
2
2
 
3
- 本页区分 loop-agent **当前已实现**的架构能力与**未来规划**。当前事实以代码、发布 CLI、已完成计划为准;未来能力一律标「规划 / 未实现 / 前瞻」。权威源:`CHANGELOG.md`、`docs/reports/current-capability-summary.md`、ADR 0001–0004、`docs/exec-plans/completed/` 与 active identity plan 的 progress。
3
+ 本页区分 loop-agent **当前已实现**的架构能力与**未来规划**。当前事实以代码、发布 CLI、已完成计划为准;未来能力一律标「规划 / 未实现 / 前瞻」。权威源:`CHANGELOG.md`、`ai_workspace/loop-agent/reports/current-capability-summary.md`、ADR 0001–0004、`ai_workspace/loop-agent/exec-plans/completed/` 与 active identity plan 的 progress。
4
4
 
5
5
  ## 当前已实现(0.11.0)
6
6
 
@@ -9,14 +9,14 @@
9
9
  | 受治理 Agent runtime | **Pi-only**;`cursor-prompt` 仅显式 one-shot sidecar | ADR 0001、`CHANGELOG.md [0.10.0]` |
10
10
  | Agent DAG 主链 | `dag run-task` → generate → validate → `run-dag`;report/doctor/reconcile-run | `dag-execution.md`、`test/cli-contract.test.ts` |
11
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` |
12
+ | 版本化自举 | controller identity + run-owned skill snapshot + deterministic canary | `ai_workspace/loop-agent/reports/2026-07-13-versioned-self-hosting-bootstrap.md` |
13
+ | Feature 交付(M2) | review/run/approve-followup/delivery/closeout/verify-final | `ai_workspace/loop-agent/reports/2026-07-12-m2-completion-audit.md` |
14
14
  | Task Pool | 唯一根 `.harness/task-pool/`;**feature-scoped** state v2(`TaskPoolTaskRef`) | ADR 0002、ADR 0004 |
15
- | 本地多 Feature 运营 | 同仓库多 Feature 可共用 Task ID;Ready / retry / Delivery / Observe 按 Feature 隔离 | ADR 0004、`docs/progress/2026-07-15-task-pool-v2-feature-scoped-task-identity.md` |
15
+ | 本地多 Feature 运营 | 同仓库多 Feature 可共用 Task ID;Ready / retry / Delivery / Observe 按 Feature 隔离 | ADR 0004、`ai_workspace/loop-agent/progress/2026-07-15-task-pool-v2-feature-scoped-task-identity.md` |
16
16
  | Observe | 本地只读暖白运营控制台 R1–R5(derived);canonical Task route 为 feature-scoped | `website/docs/guides/observe-ui.md`、`CHANGELOG.md [0.11.0]`、ADR 0004 |
17
17
  | DagSpec / repair | v3 + `runtimeContract`;显式 `repairNodeId` | `CHANGELOG.md [0.11.0]`、`dag-execution.md` |
18
- | 文档双树 | `website/docs/` 用法 vs `docs/` 治理;docs-converge | ADR 0003 |
19
- | 文档治理 | `docs/architecture/` 主题文档(本目录)+ package 可达 | 本目录 README |
18
+ | 文档双树 | `website/docs/` 用法 vs `ai_workspace/loop-agent/` 治理;docs-converge | ADR 0003 |
19
+ | 文档治理 | `ai_workspace/loop-agent/architecture/` 主题文档(本目录)+ package 可达 | 本目录 README |
20
20
 
21
21
  ### 受治理 runtime 的边界(已实现、不变式)
22
22
 
@@ -26,26 +26,26 @@
26
26
 
27
27
  ## 未来规划(第 3–6 月,**未实现**)
28
28
 
29
- 以下能力来自 `docs/design/六个月规划.md` 与 `docs/design/dynamic-workflow-dag-engine-roadmap.md`(六个月规划页首 2026-07-15 / 0.11.0 校准;未交付 phase 为**设计输入**,不是已实现证明)。它们**当前不存在于代码或 CLI**:
29
+ 以下能力来自 `ai_workspace/loop-agent/design/六个月规划.md` 与 `ai_workspace/loop-agent/design/dynamic-workflow-dag-engine-roadmap.md`(六个月规划页首 2026-07-15 / 0.11.0 校准;未交付 phase 为**设计输入**,不是已实现证明)。它们**当前不存在于代码或 CLI**:
30
30
 
31
31
  | 未来方向 | 状态 | 规划来源 |
32
32
  | --- | --- | --- |
33
- | 远程 PR / CI | 规划 / 未实现 | `docs/design/六个月规划.md`(第 3 个月起) |
33
+ | 远程 PR / CI | 规划 / 未实现 | `ai_workspace/loop-agent/design/六个月规划.md`(第 3 个月起) |
34
34
  | 线上 / 云 Worker | 规划 / 未实现 | 同上 |
35
35
  | 云 Task Pool / SQL / Orchestrator | 规划 / 未实现 | 同上(第 2 月原始设计已调整为本地 Feature 闭环) |
36
36
  | 多仓库平台 | 规划 / 未实现 | 同上 |
37
37
  | 组织级服务 | 规划 / 未实现 | 同上 |
38
38
  | Web Console(远端) | 规划 / 未实现 | 同上 |
39
- | Dynamic Workflow runtime limits 强执法、更广 profile | 设计输入 | `docs/design/dynamic-workflow-dag-engine-roadmap.md`(未勾选 phase) |
39
+ | Dynamic Workflow runtime limits 强执法、更广 profile | 设计输入 | `ai_workspace/loop-agent/design/dynamic-workflow-dag-engine-roadmap.md`(未勾选 phase) |
40
40
  | Loop 与 Dynamic Workflow 更深的双向集成、稳定化与自动恢复 | 设计输入 | 同上;当前已有基础 `workflow` action,不应误写为完全缺失 |
41
41
 
42
- > 注意:`docs/design/dynamic-workflow-dag-engine-roadmap.md` 是 2026-07-04 历史叙述;文中凡把 Cursor 写成受治理 executor 或 `loop` 的 `cursor-fix` 动作,均为**历史叙述**,现状以 Pi-only + 显式 `cursor-prompt` sidecar 为准。
42
+ > 注意:`ai_workspace/loop-agent/design/dynamic-workflow-dag-engine-roadmap.md` 是 2026-07-04 历史叙述;文中凡把 Cursor 写成受治理 executor 或 `loop` 的 `cursor-fix` 动作,均为**历史叙述**,现状以 Pi-only + 显式 `cursor-prompt` sidecar 为准。
43
43
 
44
44
  ## 已收敛为 archive / 历史基线(非未来)
45
45
 
46
- - 第 1–2 月规划已收敛为 archive/reports 指针,不在本文展开:`docs/design/archive/2026-07-12-第二月规划.md`。
47
- - `docs/reports/2026-07-02-repository-analysis.md` 自 2026-07-14 起冻结为**历史基线快照**,不再滚动追加 Unreleased 能力。
48
- - 活能力短摘要在 `docs/reports/current-capability-summary.md`。
46
+ - 第 1–2 月规划已收敛为 archive/reports 指针,不在本文展开:`ai_workspace/loop-agent/design/archive/2026-07-12-第二月规划.md`。
47
+ - `ai_workspace/loop-agent/reports/2026-07-02-repository-analysis.md` 自 2026-07-14 起冻结为**历史基线快照**,不再滚动追加 Unreleased 能力。
48
+ - 活能力短摘要在 `ai_workspace/loop-agent/reports/current-capability-summary.md`。
49
49
 
50
50
  ## 文档本体的演进边界
51
51
 
@@ -68,4 +68,4 @@
68
68
 
69
69
  ## init 投影的 `.harness` 入口
70
70
 
71
- `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`。
71
+ `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` 范围;详见 `ai_workspace/loop-agent/init-surface.manifest.json`。
@@ -6,8 +6,8 @@
6
6
 
7
7
  ```text
8
8
  Skill layer
9
- ├─ DAG/runtime 入口策略(skills/loop-agent/)
10
- └─ Feature/Task Pool 外层 operator 路由(skills/agent-worker/)
9
+ ├─ DAG/runtime 入口策略(.agents/skills/loop-agent/)
10
+ └─ Feature/Task Pool 外层 operator 路由(.agents/skills/agent-worker/)
11
11
 
12
12
  CLI layer (src/cli/)
13
13
  └─ argv 解析、adapter 解析、调用 application / command handler、格式化输出
@@ -39,7 +39,7 @@ Governance (scripts/check-*.sh, src/governance/)
39
39
 
40
40
  ### Skill layer
41
41
 
42
- - **位置**:`skills/loop-agent/**` 与 `skills/agent-worker/**`
42
+ - **位置**:`.agents/skills/loop-agent/**` 与 `.agents/skills/agent-worker/**`
43
43
  - **职责**:`loop-agent` skill 定义单个 DAG/runtime 工作的入口、硬规则与 reference 路由;`agent-worker` skill 只定义 Feature Packet、TaskSpec、Task Pool、controller pinning、自举 release train 与失败恢复的外层 operator 路由。
44
44
  - **路由边界**:DAG leaf node 不得递归启动 `agent-worker`;`agent-worker` 不得加入 `DEFAULT_SKILLS_BY_ROLE`,也不实现 executor、scheduler、prompt 或 write guard。
45
45
  - **禁止**:在入口 skill 中重复维护 CLI command 列表或与 `src/cli/catalog.ts` 冲突的事实源。
@@ -83,7 +83,7 @@ Governance (scripts/check-*.sh, src/governance/)
83
83
 
84
84
  - **位置**:`src/worker/**`,独立 `agent-worker` CLI 为 `src/worker/cli.ts`。
85
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。
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/**`、`.agents/skills/**` 的 portable fingerprint。expected version/fingerprint 不匹配时 fail-fast;后续 spawn 不重新查询 PATH。
87
87
  - **证据传播**:canonical Worker record、Task Pool run、batch/Feature、QA/final evidence 可选携带同一 identity;只有所有相关层都省略 identity 时才按 legacy evidence 接受,部分缺失或锚点不一致会拒绝。
88
88
  - **允许依赖**:TaskSpec、Task Pool、observability、Node filesystem/path 与明确的 shared/task contract;它不是第二套 executor 或 DAG kernel。
89
89
  - **禁止**:in-process import `src/cli/**`、`src/commands/**` 或 `src/application/**`。
@@ -145,7 +145,7 @@ Runner / Loop ──(迁移中)──> 逐步改为仅经 Store / Appli
145
145
  | `src/executors/**` | shared, 外部 SDK | `src/commands/**`, `src/cli/**` |
146
146
  | `src/worker/**` | worker-local modules, task contracts, shared, Node APIs | `src/commands/**`, `src/cli/**`, `src/application/**` |
147
147
  | `src/cli/**` | commands, adapters, shared, application(目标) | — |
148
- | `skills/**` | (Markdown 引用,非 TS import) | 运行时 TS 模块 |
148
+ | `.agents/skills/**` | (Markdown 引用,非 TS import) | 运行时 TS 模块 |
149
149
 
150
150
  ## 已知过渡耦合
151
151
 
@@ -161,10 +161,10 @@ Runner / Loop ──(迁移中)──> 逐步改为仅经 Store / Appli
161
161
  |--------|----------|----------|
162
162
  | `scripts/check-architecture-boundaries.sh` | workflow/executor forbidden import,及 Worker → CLI/commands/application import | 新的未 allowlist violation |
163
163
  | `scripts/check-command-registry-drift.sh` | `command-reference.md` 中的 top-level command vs `src/cli/catalog.ts` | 文档引用未注册 command |
164
- | `scripts/check-exec-plan-index-sync.sh` | `docs/exec-plans/{active,completed}` 目录文件 vs 对应 `README.md` 索引 | 任一 plan 文件未在索引登记 |
164
+ | `scripts/check-exec-plan-index-sync.sh` | `ai_workspace/loop-agent/exec-plans/{active,completed}` 目录文件 vs 对应 `README.md` 索引 | 任一 plan 文件未在索引登记 |
165
165
  | `scripts/check-skill-entry.sh` | `loop-agent` / `agent-worker` 的 frontmatter、required references、入口行数与 operator trigger vocabulary | 任一公共 skill 缺失、reference/trigger 漂移或入口超过 hard limit |
166
166
 
167
- 版本化自举相关 exec plan:`docs/exec-plans/active/2026-07-13-versioned-self-hosting-bootstrap.md`。
167
+ 版本化自举相关 exec plan:`ai_workspace/loop-agent/exec-plans/active/2026-07-13-versioned-self-hosting-bootstrap.md`。
168
168
 
169
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 并存;两者均不删除或弱化。
170
170
 
@@ -18,7 +18,7 @@
18
18
  完整分层图、各层职责、允许/禁止的 import 方向见 `runtime-boundaries.md` §分层概览 与 §各层职责。一句话摘要:
19
19
 
20
20
  ```text
21
- Skill layer skills/loop-agentskills/agent-worker(Markdown,非 TS import)
21
+ Skill layer .agents/skills/loop-agent、.agents/skills/agent-worker(Markdown,非 TS import)
22
22
  CLI layer src/cli/ — argv 解析、调用 application/handler、格式化输出
23
23
  Application src/application/ — typed use-case(validate/run/generate DAG 等)
24
24
  Workflow runtime src/workflows/ — DAG / Dynamic / Loop 核心执行规则
@@ -86,8 +86,8 @@ workflow runtime(调度 Pi / shell / static 节点)
86
86
  | 位置 | 内容 | 权威性质 |
87
87
  | --- | --- | --- |
88
88
  | `.harness/` | 任务、DAG run、one-shot run、Task Pool、live state | 运行态事实(canonical + derived) |
89
- | 根目录 `docs/` | 原则、边界、计划、报告、模板 | 治理权威 |
89
+ | 根目录 `ai_workspace/loop-agent/` | 原则、边界、计划、报告、模板 | 治理权威 |
90
90
  | `website/docs/` | 使用者/贡献者导读与操作说明 | 用法双树 |
91
- | `skills/` | agent 可加载的入口与 reference | 运行时可加载 |
91
+ | `.agents/skills/` | agent 可加载的入口与 reference | 运行时可加载 |
92
92
 
93
93
  `.harness/` 内部哪些可写、哪些只读、哪些是 derived,详见 `facts-and-state.md`。
@@ -27,7 +27,7 @@
27
27
  | `launch.command` / `launch.argsPrefix` | 直接可执行的绝对 launch spec |
28
28
  | `binarySha256` | `actualEntry` 二进制 hash |
29
29
  | `packageVersion` | `package.json` version |
30
- | `packageFingerprint` | 覆盖 `package.json`、`bin/**`、`dist/**`、`skills/**` 的 portable fingerprint(`computePackageFingerprint`) |
30
+ | `packageFingerprint` | 覆盖 `package.json`、`bin/**`、`dist/**`、`.agents/skills/**` 的 portable fingerprint(`computePackageFingerprint`) |
31
31
 
32
32
  关键方法:
33
33
 
@@ -66,7 +66,7 @@ controller identity 与 DAG skill snapshot 是两个不同冻结层(前者跨
66
66
  - review/run/approve-followup/delivery/closeout/verify-final:`src/worker/feature/{review,run}.ts` 及相关。
67
67
  - Follow-up:`src/worker/` 下 draft-followup + approve-followup 事务,覆盖全部失败分类(可执行/Spec/Risk/Human/EnvFailure)。
68
68
  - Delivery / Closeout:clean Delivery HEAD 上生成 canonical QA/最终验证证据、Delivery Package、Acceptance Coverage、PR 草稿;Closeout 默认预览,显式 `--apply --owner` 才原子写回。
69
- - 权威证据:`CHANGELOG.md [0.10.0]`、`docs/reports/2026-07-12-m2-completion-audit.md`。
69
+ - 权威证据:`CHANGELOG.md [0.10.0]`、`ai_workspace/loop-agent/reports/2026-07-12-m2-completion-audit.md`。
70
70
 
71
71
  ### Observe(只读 read model)
72
72
 
@@ -82,4 +82,4 @@ controller identity 与 DAG skill snapshot 是两个不同冻结层(前者跨
82
82
 
83
83
  - Worker 不得 in-process import `src/cli/**`、`src/commands/**` 或 `src/application/**`(governance 机器校验)。
84
84
  - Worker 不实现 executor、scheduler、prompt 或 write guard。
85
- - `agent-worker` skill(`skills/agent-worker/`)不加入 `DEFAULT_SKILLS_BY_ROLE`;DAG leaf node 不得递归启动 `agent-worker`(`runtime-boundaries.md` §Skill layer)。
85
+ - `agent-worker` skill(`.agents/skills/agent-worker/`)不加入 `DEFAULT_SKILLS_BY_ROLE`;DAG leaf node 不得递归启动 `agent-worker`(`runtime-boundaries.md` §Skill layer)。