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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/AGENTS.md +2 -0
  2. package/CHANGELOG.md +56 -305
  3. package/README.md +13 -19
  4. package/dist/commands/init.js +92 -23
  5. package/dist/executors/pi-event-serializer.js +33 -11
  6. package/dist/executors/shell-executor.js +200 -21
  7. package/dist/infrastructure/evaluation/candidate-store.js +5 -1
  8. package/dist/worker/observe/spec-evidence.js +19 -10
  9. package/dist/worker/observe/static/app.js +4 -3
  10. package/dist/worker/observe/static/constants.js +10 -2
  11. package/dist/worker/observe/static/dag-helpers.js +37 -8
  12. package/dist/worker/observe/static/dom.js +159 -0
  13. package/dist/worker/observe/static/format-pool.d.ts +71 -0
  14. package/dist/worker/observe/static/format-pool.js +67 -0
  15. package/dist/worker/observe/static/format.js +27 -2
  16. package/dist/worker/observe/static/index.html +76 -34
  17. package/dist/worker/observe/static/kpi.js +12 -6
  18. package/dist/worker/observe/static/markdown-render.js +124 -0
  19. package/dist/worker/observe/static/shell-chrome.js +8 -2
  20. package/dist/worker/observe/static/state.js +20 -0
  21. package/dist/worker/observe/static/styles.css +662 -60
  22. package/dist/worker/observe/static/views/dag-inspector.js +65 -142
  23. package/dist/worker/observe/static/views/dag.js +9 -0
  24. package/dist/worker/observe/static/views/dashboard.js +512 -269
  25. package/dist/worker/observe/static/views/pool.js +595 -237
  26. package/dist/worker/observe/static/views/session-timeline.js +577 -11
  27. package/dist/workflows/dag/backend-test-case-manifest.js +503 -0
  28. package/dist/workflows/dag/backend-test-execution-contract.js +353 -0
  29. package/dist/workflows/dag/backend-test-result-contract.js +568 -0
  30. package/dist/workflows/dag/decision-envelope.js +57 -2
  31. package/dist/workflows/dag/frontend-implementation-contract.js +240 -0
  32. package/dist/workflows/dag/frontend-project-capability.js +309 -0
  33. package/dist/workflows/dag/frontend-repair.js +341 -0
  34. package/dist/workflows/dag/frontend-risk.js +161 -0
  35. package/dist/workflows/dag/frontend-verification-trace.js +190 -0
  36. package/dist/workflows/dag/init-hybrid.js +1020 -125
  37. package/dist/workflows/dag/repair-artifact.js +43 -3
  38. package/dist/workflows/dag/skill-instructions.js +4 -2
  39. package/dist/workflows/dag/types.js +29 -8
  40. package/docs/README.md +2 -0
  41. package/docs/agent-dag-recovery-playbook.md +3 -3
  42. package/docs/agent-dag-runner.md +3 -3
  43. package/docs/architecture/README.md +3 -3
  44. package/docs/architecture/dag-execution.md +1 -1
  45. package/docs/architecture/evolution.md +13 -13
  46. package/docs/architecture/facts-and-state.md +1 -1
  47. package/docs/architecture/runtime-boundaries.md +7 -7
  48. package/docs/architecture/system-overview.md +3 -3
  49. package/docs/architecture/worker-and-feature.md +3 -3
  50. package/docs/design/README.md +7 -7
  51. package/docs/development-principles.md +4 -4
  52. package/docs/exec-plans/active/README.md +2 -4
  53. package/docs/exec-plans/completed/README.md +29 -6
  54. package/docs/feature-workflow.md +57 -32
  55. package/docs/init-surface.manifest.json +21 -3
  56. package/docs/loop-agent-harness.md +8 -8
  57. package/docs/production-readiness.md +1 -1
  58. package/docs/progress/README.md +20 -3
  59. package/docs/reports/README.md +53 -7
  60. package/docs/templates/agent-dag.supervised-implementation.json +127 -8
  61. package/docs/templates/backend-test-case-manifest.schema.json +190 -0
  62. package/docs/templates/backend-test-dag.classify.prompt.md +75 -0
  63. package/docs/templates/backend-test-dag.generate-pytest.prompt.md +6 -4
  64. package/docs/templates/backend-test-dag.json +269 -21
  65. package/docs/templates/backend-test-dag.retrospect.prompt.md +44 -30
  66. package/docs/templates/backend-test-dag.review-cases.prompt.md +6 -4
  67. package/docs/templates/backend-test-execution.schema.json +133 -0
  68. package/docs/templates/backend-test-result.schema.json +99 -0
  69. package/docs/templates/branch-merge-report.md +93 -0
  70. package/docs/templates/frontend-eval/fixtures/failures/01-type-build-error.md +17 -0
  71. package/docs/templates/frontend-eval/fixtures/failures/02-unit-component-test-fail.md +16 -0
  72. package/docs/templates/frontend-eval/fixtures/failures/03-fixture-schema-drift.md +16 -0
  73. package/docs/templates/frontend-eval/fixtures/failures/04-missing-loading-empty-error-state.md +16 -0
  74. package/docs/templates/frontend-eval/fixtures/failures/05-forbidden-write-writeset-expansion.md +16 -0
  75. package/docs/templates/frontend-eval/fixtures/failures/06-unapproved-dependency-add.md +16 -0
  76. package/docs/templates/frontend-eval/fixtures/failures/07-mock-production-on.md +21 -0
  77. package/docs/templates/frontend-eval/fixtures/functional/01-simple-component-style.md +29 -0
  78. package/docs/templates/frontend-eval/fixtures/functional/02-form-validation.md +28 -0
  79. package/docs/templates/frontend-eval/fixtures/functional/03-list-detail-page.md +28 -0
  80. package/docs/templates/frontend-eval/fixtures/functional/04-api-mock.md +29 -0
  81. package/docs/templates/frontend-eval/fixtures/functional/05-permission-auth-gated-ui.md +27 -0
  82. package/docs/templates/frontend-eval/fixtures/functional/06-ssr-server-client-boundary.md +28 -0
  83. package/docs/templates/frontend-eval/fixtures/functional/07-shared-public-component-api.md +28 -0
  84. package/docs/templates/frontend-eval/fixtures/functional/08-pure-local-no-remote.md +27 -0
  85. package/docs/templates/frontend-eval/metrics.md +138 -0
  86. package/docs/templates/frontend-eval/smoke-targets.md +53 -0
  87. package/docs/templates/frontend-implementation-contract.schema.json +27 -0
  88. package/docs/verification-matrix.md +1 -1
  89. package/examples/decision-gate-agent-dag.json +4 -4
  90. package/examples/hybrid-loop-agent-dag.json +1 -1
  91. package/package.json +2 -2
  92. package/skills/ai-engineering-context/SKILL.md +2 -2
  93. package/skills/browser-tools/SKILL.md +196 -0
  94. package/skills/browser-tools/browser-content.js +103 -0
  95. package/skills/browser-tools/browser-cookies.js +35 -0
  96. package/skills/browser-tools/browser-eval.js +53 -0
  97. package/skills/browser-tools/browser-hn-scraper.js +108 -0
  98. package/skills/browser-tools/browser-nav.js +44 -0
  99. package/skills/browser-tools/browser-pick.js +162 -0
  100. package/skills/browser-tools/browser-screenshot.js +34 -0
  101. package/skills/browser-tools/browser-start.js +86 -0
  102. package/skills/browser-tools/package-lock.json +2556 -0
  103. package/skills/browser-tools/package.json +19 -0
  104. package/skills/frontend-implementation/SKILL.md +3 -1
  105. package/skills/frontend-implementation/references/node-contracts.md +17 -66
  106. package/skills/frontend-verification/SKILL.md +1 -1
  107. package/skills/grill-with-docs/SKILL.md +5 -5
  108. package/skills/grill-with-docs/adr-format.md +3 -3
  109. package/skills/init-capability-evolution/SKILL.md +5 -5
  110. package/skills/loop-agent/SKILL.md +5 -5
  111. package/skills/loop-agent/references/README.md +3 -3
  112. package/skills/loop-agent/references/command-reference.md +39 -17
  113. package/skills/loop-agent/references/docs-converge.md +15 -15
  114. package/skills/loop-agent/references/harness-policy.md +2 -2
  115. package/skills/loop-agent/references/hybrid-dag.md +20 -15
  116. package/skills/loop-agent/references/multi-worktree.md +1 -1
  117. package/skills/loop-agent/references/orchestrator-and-interventions.md +8 -8
  118. package/skills/loop-agent/references/task-workflow.md +1 -1
  119. package/skills/loop-agent/references/verification-and-failure-handling.md +6 -4
  120. package/skills/requesting-code-review/SKILL.md +1 -1
  121. package/skills/systematic-debugging/CREATION-LOG.md +3 -3
  122. package/skills/systematic-debugging/SKILL.md +1 -1
  123. package/skills/systematic-debugging/test-academic.md +1 -1
  124. package/skills/systematic-debugging/test-pressure-1.md +1 -1
  125. package/skills/systematic-debugging/test-pressure-2.md +1 -1
  126. package/skills/systematic-debugging/test-pressure-3.md +1 -1
  127. package/skills/verification-before-completion/SKILL.md +1 -1
@@ -13,12 +13,51 @@ export const repairArtifactSchema = z.object({
13
13
  schemaVersion: z.literal(1),
14
14
  verdict: z.enum(["pass", "request-revision"]),
15
15
  failureClass: repairFailureClassSchema,
16
- rootCause: z.string().min(1),
16
+ rootCause: z
17
+ .string()
18
+ .min(1, { message: 'repair artifact field "rootCause" must be a non-empty string' }),
17
19
  fixScope: z.array(z.string().min(1)).default([]),
18
20
  invariant: z.string().min(1),
19
21
  evidenceRefs: z.array(z.string().min(1)).default([]),
20
22
  rawLogFallbackAllowed: z.boolean().default(false),
21
23
  });
24
+ /**
25
+ * Canonical rootCause substituted when a `verdict: "pass"` repair artifact
26
+ * arrives with an empty or whitespace-only rootCause. Keeps the persisted
27
+ * RepairArtifact schema-valid without weakening request-revision diagnostics.
28
+ */
29
+ export const PASS_VERDICT_DEFAULT_ROOT_CAUSE = "No repair required.";
30
+ /**
31
+ * Normalize model-emitted repair artifacts deterministically at the parser
32
+ * boundary: a `verdict: "pass"` artifact with an empty/whitespace-only
33
+ * rootCause is rewritten to the canonical default so it still satisfies the
34
+ * strict schema. request-revision and other fields are left untouched so the
35
+ * strict diagnostics and write boundaries remain fail-closed.
36
+ */
37
+ function normalizePassArtifactRootCause(parsed) {
38
+ if (parsed &&
39
+ typeof parsed === "object" &&
40
+ !Array.isArray(parsed) &&
41
+ parsed.verdict === "pass") {
42
+ const record = parsed;
43
+ const rootCause = record.rootCause;
44
+ if (typeof rootCause === "string" && rootCause.trim().length === 0) {
45
+ return { ...record, rootCause: PASS_VERDICT_DEFAULT_ROOT_CAUSE };
46
+ }
47
+ }
48
+ return parsed;
49
+ }
50
+ /**
51
+ * Render a single Zod issue as a field-path-aware message so callers can locate
52
+ * invalid repair-artifact fields instead of seeing bare min-length text.
53
+ */
54
+ function describeZodIssue(issue) {
55
+ const path = issue.path && issue.path.length > 0 ? issue.path.join(".") : "(root)";
56
+ if (issue.message && !/^String must contain/.test(issue.message)) {
57
+ return `field "${path}": ${issue.message} (code ${issue.code})`;
58
+ }
59
+ return `field "${path}" is invalid (code ${issue.code})`;
60
+ }
22
61
  const REPAIR_ARTIFACT_FENCE = /```(?:REPAIR_ARTIFACT_JSON|json)\s*([\s\S]*?)```/gi;
23
62
  function extractCandidateJsonBlocks(text) {
24
63
  const blocks = [];
@@ -42,11 +81,12 @@ export function parseRepairArtifactFromText(text) {
42
81
  for (const candidate of candidates) {
43
82
  try {
44
83
  const parsed = JSON.parse(candidate);
45
- const result = repairArtifactSchema.safeParse(parsed);
84
+ const normalized = normalizePassArtifactRootCause(parsed);
85
+ const result = repairArtifactSchema.safeParse(normalized);
46
86
  if (result.success) {
47
87
  return { ok: true, artifact: result.data };
48
88
  }
49
- errors.push(result.error.issues.map((issue) => issue.message).join(", "));
89
+ errors.push(result.error.issues.map((issue) => describeZodIssue(issue)).join(", "));
50
90
  }
51
91
  catch (error) {
52
92
  errors.push(error instanceof Error ? error.message : String(error));
@@ -3,8 +3,8 @@ import { access, readFile } from "node:fs/promises";
3
3
  import os from "node:os";
4
4
  import path from "node:path";
5
5
  import { fileURLToPath } from "node:url";
6
- export const DEFAULT_SKILL_INSTRUCTION_MAX_CHARS = 2_500;
7
- export const DEFAULT_SKILL_INSTRUCTION_TOTAL_MAX_CHARS = 10_000;
6
+ export const DEFAULT_SKILL_INSTRUCTION_MAX_CHARS = 3_000;
7
+ export const DEFAULT_SKILL_INSTRUCTION_TOTAL_MAX_CHARS = 12_000;
8
8
  const SKILL_NAME_PATTERN = /^[A-Za-z0-9][A-Za-z0-9_-]*$/;
9
9
  async function fileExists(filePath) {
10
10
  try {
@@ -413,7 +413,9 @@ async function findFirstExistingFile(candidates) {
413
413
  async function resolveLearnedPatternInstructions(input) {
414
414
  const repoSlug = path.basename(input.cwd).replace(/[^A-Za-z0-9_-]+/g, "-");
415
415
  const candidates = [
416
+ normalizeCandidate(path.join(input.cwd, ".agents", "skills", "loop-agent", "references", "learned", `${repoSlug}.md`)),
416
417
  normalizeCandidate(path.join(input.cwd, "skills", "loop-agent", "references", "learned", `${repoSlug}.md`)),
418
+ normalizeCandidate(path.join(input.cwd, ".agents", "skills", "loop-agent", "references", "learned", "default.md")),
417
419
  normalizeCandidate(path.join(input.cwd, "skills", "loop-agent", "references", "learned", "default.md")),
418
420
  normalizeCandidate(path.join(input.cwd, "tools", "loop-agent", "skill", "references", "learned", `${repoSlug}.md`)),
419
421
  normalizeCandidate(path.join(input.cwd, "tools", "loop-agent", "skill", "references", "learned", "default.md")),
@@ -63,13 +63,26 @@ export const dagVerdictGateSchema = z.object({
63
63
  label: z.string().min(1).optional(),
64
64
  });
65
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),
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),
68
74
  label: z.string().min(1).optional(),
69
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
+ ]);
70
83
  export const dagJsonArtifactGateSchema = z.object({
71
84
  fromNodeId: z.string().regex(/^[a-z][a-z0-9-]*$/),
72
- schemaId: z.literal("backend-test-analysis-v1"),
85
+ schemaId: dagJsonArtifactSchemaIdSchema,
73
86
  artifactName: z.string().regex(/^[a-z0-9][a-z0-9._-]*\.json$/),
74
87
  outputDir: z.string().regex(/^[a-z0-9][a-z0-9._-]*$/),
75
88
  });
@@ -117,6 +130,8 @@ export const dagShellConfigSchema = z.object({
117
130
  jsonArtifactGate: dagJsonArtifactGateSchema.optional(),
118
131
  verifyEvidence: dagShellVerifyEvidenceSchema.optional(),
119
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(),
120
135
  envAllowlist: z.array(z.string()).optional(),
121
136
  timeoutMs: z.number().optional(),
122
137
  cwd: z.string().optional(),
@@ -153,10 +168,12 @@ export const dagDynamicExpansionSchema = z.object({
153
168
  .string()
154
169
  .regex(/^[a-z][a-z0-9-]*$/, "childIdPrefix must be kebab-case"),
155
170
  childTask: dagDynamicExpansionChildTaskSchema,
156
- tokenBudget: z.object({
171
+ tokenBudget: z
172
+ .object({
157
173
  maxTokensPerCase: z.number().int().positive().optional(),
158
174
  maxTotalTokens: z.number().int().positive().optional(),
159
- }).optional(),
175
+ })
176
+ .optional(),
160
177
  });
161
178
  export const dagDynamicReductionSchema = z.object({
162
179
  type: z.literal("verified_findings_report"),
@@ -286,11 +303,15 @@ export const dagEvaluationBindingSchema = z
286
303
  export const dagSourceBindingSchema = z.object({
287
304
  schemaVersion: z.literal(1),
288
305
  taskId: z.string().min(1),
289
- sources: z.array(z.object({
306
+ sources: z
307
+ .array(z.object({
290
308
  kind: z.enum(["requirement", "constraint", "reference"]),
291
309
  path: z.string().min(1),
292
- sha256: z.string().regex(/^[a-f0-9]{64}$/, "sha256 must be lowercase hex"),
293
- })).min(1),
310
+ sha256: z
311
+ .string()
312
+ .regex(/^[a-f0-9]{64}$/, "sha256 must be lowercase hex"),
313
+ }))
314
+ .min(1),
294
315
  requirementIds: z.array(z.string().regex(/^(?:REQ|BR|AC)-[A-Z0-9]+(?:-[A-Z0-9]+)*$/)),
295
316
  });
296
317
  export const dagSpecSchema = z
package/docs/README.md CHANGED
@@ -34,6 +34,7 @@
34
34
 
35
35
  完整列表见 `exec-plans/completed/README.md`。近期高频入口:
36
36
 
37
+ - `exec-plans/completed/2026-07-18-observe-ops-surface-and-rich-timeline.md` — Observe 运营面/执行面重排、检查器半屏与富执行过程
37
38
  - `exec-plans/completed/2026-07-14-website-docs-ia-and-converge.md` — Website IA、双树边界与 docs-converge
38
39
  - `exec-plans/completed/2026-07-13-versioned-self-hosting-bootstrap.md` — 版本化自举与 candidate canary
39
40
  - `exec-plans/completed/2026-07-12-pi-only-agent-runtime.md` — Pi-only 受治理 runtime
@@ -82,6 +83,7 @@
82
83
  - `templates/product-line/` — 可投影的 Feature/Task/QA/Links 产品线包;配合 `agent-worker task validate-feature` 做 docs CI
83
84
  - `templates/production-readiness-checklist.md` — 低/中风险单仓库 DAG readiness 检查清单
84
85
  - `templates/init-evolution-review.md` — 初始化能力演化审查报告模板
86
+ - `templates/branch-merge-report.md` — 跨分支合并的功能保留、冲突解析、init/update 与 package surface 审计模板
85
87
  - `templates/adr.md` — 架构决策记录(ADR)
86
88
 
87
89
  ## 维护
@@ -17,7 +17,7 @@ product_line_failure_category
17
17
  recommended_follow_up
18
18
  ```
19
19
 
20
- Product-line taxonomy 定义见 `docs/design/state-and-failure-taxonomy.md`。
20
+ Product-line taxonomy 定义见 `ai_workspace/loop-agent/design/state-and-failure-taxonomy.md`。
21
21
 
22
22
  ### 前端设计门禁专用恢复路径
23
23
 
@@ -82,7 +82,7 @@ Decision Gate prompt 侧:`buildDagDecisionGateEvidence()`(`./src/core/dag-de
82
82
 
83
83
  ## `dag report --json` schema 锁定
84
84
 
85
- - **Schema 文件**:`docs/templates/agent-dag-report.schema.json`
85
+ - **Schema 文件**:`ai_workspace/loop-agent/templates/agent-dag-report.schema.json`
86
86
  - **Envelope**:`{ schemaVersion: 1, runs: DagRunReportEntry[] }`
87
87
  - **稳定消费字段**(Decision Gate / tooling 应依赖):`primaryFailure`、`primaryRecovery`、`downstreamSkippedNodes`、`recoveryRecommendation`、`normalizedFailureCategory`;node 级 `decisionEnvelope`、`artifacts`;paused 级 `pausedByNodeId`、`pauseReason`
88
88
  - **测试**:`./test/dag-report.test.ts` §`dag report JSON schema contract` 对 fixture run 做 schema 校验
@@ -146,7 +146,7 @@ Decision Gate prompt 侧:`buildDagDecisionGateEvidence()`(`./src/core/dag-de
146
146
  3. **Blocked Downstream / Skipped Nodes** — `downstreamSkippedNodes`
147
147
  4. **Recommended Operator Action** — 面向 operator 的步骤摘要
148
148
 
149
- 保存 handoff 时重定向到平台临时目录或 `docs/reports/`,不要写入 `.harness/dag-runs/`。
149
+ 保存 handoff 时重定向到平台临时目录或 `ai_workspace/loop-agent/reports/`,不要写入 `.harness/dag-runs/`。
150
150
 
151
151
  ## Decision Gate 消费约定
152
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)。
@@ -158,10 +158,10 @@
158
158
 
159
159
  ## 维护规则
160
160
 
161
- 1. 保持 TaskSpec 字段、status、failure category、命令示例与契约文档一致。
162
- 2. 未来平台组件标为目标架构,除非已存在于 `src/` 或 `scripts/`。
163
- 3. 命令示例只用 `agent-worker` / `loop-agent`。
164
- 4. `config-types` / profile routing 变更时更新 mapping 文档。
165
- 5. failure / Task Pool state 变更时更新 taxonomy。
166
- 6. **过期月规划 / 已关闭实现合同**迁入 `archive/`,并更新本 README。
167
- 7. 运行 `bash scripts/check-repo.sh`(或至少 check-doc-index / check-doc-links)。
161
+ 1. 保持 TaskSpec 字段、status、failure category、命令示例与契约文档一致。
162
+ 2. 未来平台组件标为目标架构,除非已存在于 `src/` 或 `scripts/`。
163
+ 3. 命令示例只用 `agent-worker` / `loop-agent`。
164
+ 4. `config-types` / profile routing 变更时更新 mapping 文档。
165
+ 5. failure / Task Pool state 变更时更新 taxonomy。
166
+ 6. **过期月规划 / 已关闭实现合同**迁入 `archive/`,并更新本 README。
167
+ 7. 运行 `bash scripts/check-repo.sh`(或至少 check-doc-index / check-doc-links)。
@@ -9,7 +9,7 @@ loop-agent 是面向 agentic coding 的工作流 runtime。仓库应保持小而
9
9
  这个模型吸收了 Anthropic 长时运行 agent harness、OpenAI Codex harness engineering、腾讯端到端 Harness Engineering 和社区 agent harness 实践中的共同经验:用短入口文档导航长期知识,用结构化任务状态和 handoff artifact 跨 session 传递事实,用独立验证和评审回路约束 agent 输出,并把人类注意力集中在意图、边界、架构和反馈系统上。面向使用者的背景资料收录在 `website/docs/practices/`。
10
10
 
11
11
  - 仓库是记录系统。决策、契约、计划、测试、报告与交接属于 tracked files。
12
- - `AGENTS.md` 是操作地图,不是知识 dump。长期方法论与决策属于 `docs/`。
12
+ - `AGENTS.md` 是操作地图,不是知识 dump。长期方法论与决策属于 `ai_workspace/loop-agent/`。
13
13
  - 工作以小步、可逆、可验证的增量推进。
14
14
  - 状态不确定时,先跑基线验证再开新工。
15
15
  - 完成由新鲜证据定义,而非意图或信心。
@@ -19,7 +19,7 @@ loop-agent 是面向 agentic coding 的工作流 runtime。仓库应保持小而
19
19
  1. 一次任务只推进一个有边界的工作块。
20
20
  2. 设计新行为前先搜索现有代码、文档、脚本与测试。
21
21
  3. Shell 验证是完成权威。
22
- 4. Runtime 状态在 `.harness/`;持久决策在 `docs/`。
22
+ 4. Runtime 状态在 `.harness/`;持久决策在 `ai_workspace/loop-agent/`。
23
23
  5. Pi writer 节点必须由显式 allowed/forbidden paths 与 writeSet 约束;Cursor 仅可作为 `cursor-prompt` one-shot sidecar,不进入受治理 DAG/Loop 写入路径。
24
24
  6. Pi review/planning 路径是 advisory,除非后跟确定性验证。
25
25
  7. 反复出现的约束应固化为文档、测试、脚本、检查或模板。
@@ -31,9 +31,9 @@ loop-agent 是面向 agentic coding 的工作流 runtime。仓库应保持小而
31
31
 
32
32
  - 源码:`src/`
33
33
  - 测试:`test/`
34
- - Skill 指令:源码仓库和 npm 包内置在 `skills/`,目标项目 repo-local skills 在 `.agents/skills/`
34
+ - Skill 指令:源码仓库和 npm 包内置在 `.agents/skills/`,目标项目 repo-local skills 在 `.agents/skills/`
35
35
  - 验证与维护脚本:`scripts/`
36
- - 治理与交接产物:`docs/`
36
+ - 治理与交接产物:`ai_workspace/loop-agent/`
37
37
 
38
38
  ## 变更纪律
39
39
 
@@ -6,10 +6,8 @@
6
6
 
7
7
  当前 active execution plan:
8
8
 
9
- - [`2026-07-17-frontend-implementation-capability-deepening.md`](2026-07-17-frontend-implementation-capability-deepening.md) — frontend-implementation 结构化合同、修复闭环与项目适配深化
10
- - [`2026-07-17-backend-test-capability-deepening.md`](2026-07-17-backend-test-capability-deepening.md) — backend-test 执行合同、结果分类与可验证追踪深化
9
+ - [`2026-07-18-nightly-auto-release.md`](2026-07-18-nightly-auto-release.md) — 夜间自动发布:距上次 tag ≥3 commits → GitHub Release + npm(内部测试阶段复用人工发布规则;全自动执行、次日上午人工核对;**active**)
11
10
  - [`2026-07-16-recursive-self-improvement-eval-lab.md`](2026-07-16-recursive-self-improvement-eval-lab.md) — Eval Lab:**M0+M1+M2(W2.1–W2.3) done**;W2.4 alias/promotion 与 M3+ live campaign 仍 todo(设计真源 `docs/design/recursive-self-improvement-eval-lab.md`;CHANGELOG `[Unreleased]`)
12
11
  - [`2026-07-16-frontend-mock-node.md`](2026-07-16-frontend-mock-node.md) — 前端 DAG Mock 策略节点与安全验证
13
- - [`2026-07-16-fe-test-dag.md`](2026-07-16-fe-test-dag.md) — FE-test RAG:功能用例、Playwright CLI 浏览器执行与证据复盘链路
14
12
 
15
- - 已归档:`../completed/2026-07-17-frontend-beta-publish-guard.md`、`../completed/2026-07-16-backend-test-remediation.md`、`../completed/2026-07-16-frontend-demand-auto-routing.md`、`../completed/2026-07-16-frontend-mock-data-workflow.md`、`../completed/2026-07-14-knowledge-sync-and-graph.md`、`../completed/2026-07-15-repair-artifact-gate-runtime-contract.md`、`../completed/2026-07-14-observe-ui-r5.md`、`../completed/2026-07-14-observe-ui-r4.md`、`../completed/2026-07-14-observe-ui-r3.md`、`../completed/2026-07-14-observe-ui-r2.md`、`../completed/2026-07-14-observe-ui-r1.md`、`../completed/2026-07-14-init-canonical-layout.md`、`../completed/2026-07-12-observe-warm-console-redesign.md`、`../completed/2026-07-14-website-docs-ia-and-converge.md`、`../completed/2026-07-13-versioned-self-hosting-bootstrap.md`、`../completed/2026-07-12-pi-only-agent-runtime.md`、第二月 M2-01~M2-08、`../completed/2026-07-11-observe-dashboard-page-system.md`、`../completed/2026-07-11-observe-dashboard-detail-refinement.md`、`../completed/2026-07-11-observe-terminal-dag-kpi.md`、`../completed/2026-07-11-observe-polling-efficiency.md`、`../completed/2026-07-11-command-performance-guardrails.md` 及更早计划。
13
+ - 已归档:`../completed/2026-07-18-observe-ops-surface-and-rich-timeline.md`、`../completed/2026-07-16-fe-test-dag.md`、`../completed/2026-07-17-frontend-implementation-capability-deepening.md`、`../completed/2026-07-17-backend-test-capability-deepening.md`、`../completed/2026-07-16-backend-test-remediation.md`、`../completed/2026-07-16-frontend-demand-auto-routing.md`、`../completed/2026-07-16-frontend-mock-data-workflow.md`、`../completed/2026-07-14-knowledge-sync-and-graph.md`、`../completed/2026-07-15-repair-artifact-gate-runtime-contract.md`、`../completed/2026-07-14-observe-ui-r5.md`、`../completed/2026-07-14-observe-ui-r4.md`、`../completed/2026-07-14-observe-ui-r3.md`、`../completed/2026-07-14-observe-ui-r2.md`、`../completed/2026-07-14-observe-ui-r1.md`、`../completed/2026-07-14-init-canonical-layout.md`、`../completed/2026-07-12-observe-warm-console-redesign.md`、`../completed/2026-07-14-website-docs-ia-and-converge.md`、`../completed/2026-07-13-versioned-self-hosting-bootstrap.md`、`../completed/2026-07-12-pi-only-agent-runtime.md`、第二月 M2-01~M2-08、`../completed/2026-07-11-observe-dashboard-page-system.md`、`../completed/2026-07-11-observe-dashboard-detail-refinement.md`、`../completed/2026-07-11-observe-terminal-dag-kpi.md`、`../completed/2026-07-11-observe-polling-efficiency.md`、`../completed/2026-07-11-command-performance-guardrails.md` 及更早计划。
@@ -4,10 +4,18 @@
4
4
 
5
5
  npm 包携带本 README 作为目录契约。具体 completed plan 属于目标仓库历史,不从 loop-agent 源码历史复制。
6
6
 
7
- - [`2026-07-17-frontend-beta-publish-guard.md`](2026-07-17-frontend-beta-publish-guard.md) — `frontend` 分支本地 npm 发布门禁,只允许 beta SemVer 与 beta dist-tag,避免预发布包误推 `latest`
8
- - [`2026-07-16-backend-test-remediation.md`](2026-07-16-backend-test-remediation.md) — 修正 backend-test taskKind/profile 漂移、虚假 convergence、pytest write-guard/报告契约、pytest writer 边界、prompt 安全与 Observe events 失败可见性;analyze 结构化落盘拆为独立后续计划
9
- - [`2026-07-16-dag-source-binding-recovery.md`](2026-07-16-dag-source-binding-recovery.md) — 新生成 DAG 冻结任务源与需求编号,前端计划缺号在 writer 前阻断,v3 孤立 writer 严格拒绝二手摘要恢复
10
- - [`2026-07-14-knowledge-sync-and-graph.md`](2026-07-14-knowledge-sync-and-graph.md) — 知识库同步 DAG(featureId 硬化)+ 业务知识图谱开荒 / Phase A 查询 / 增量 prepare / `knowledge` CLI;随 0.12.0 发布并归档
7
+ - [`2026-07-18-observe-ops-surface-and-rich-timeline.md`](2026-07-18-observe-ops-surface-and-rich-timeline.md) — Observe 资源池运营面、总览执行面重排、检查器半屏宽度与富执行过程时间线(含 `recordedAt`)
8
+ - [`2026-07-16-fe-test-dag.md`](2026-07-16-fe-test-dag.md) — FE-test RAG:`taskKind: "frontend-test"` 串行浏览器用例/证据 DAG(MVP + PR #25;prompt 深度 / 真实 browser smoke 等 residual 另开)
9
+ - [`2026-07-17-frontend-implementation-capability-deepening.md`](2026-07-17-frontend-implementation-capability-deepening.md) — frontend-implementation Contract/trace/repair、风险裁剪、React/Next/Vue capability、a11y/openSpec seed(M0–M6 核心完成;W2.7/W3.8/W6.8 residual)
10
+ - [`2026-07-17-backend-test-capability-deepening.md`](2026-07-17-backend-test-capability-deepening.md) — backend-test 执行合同、结果分类、Case Manifest/Traceability M4 docs/init/tmpdir smoke 收敛(M0–M4 全完成)
11
+ - [`2026-07-17-review-findings-remediation.md`](2026-07-17-review-findings-remediation.md) — 收敛主干 review findings
12
+ - [`2026-07-16-frontend-mock-data-workflow.md`](2026-07-16-frontend-mock-data-workflow.md) — 前端 Mock 数据治理链
13
+ - [`2026-07-16-frontend-demand-auto-routing.md`](2026-07-16-frontend-demand-auto-routing.md) — 前端需求确定性自动路由
14
+ - [`2026-07-16-dag-source-binding-recovery.md`](2026-07-16-dag-source-binding-recovery.md) — DAG 任务源绑定与恢复门禁
15
+ - [`2026-07-16-backend-test-remediation.md`](2026-07-16-backend-test-remediation.md) — backend-test 报告、writeSet 与 prompt 修复
16
+ - [`2026-07-14-knowledge-sync-and-graph.md`](2026-07-14-knowledge-sync-and-graph.md) — knowledge-sync 与知识图谱 MVP 完成归档
17
+ - [`2026-07-16-target-agents-routing-observe.md`](2026-07-16-target-agents-routing-observe.md) — 让根与初始化目标 AGENTS 正确路由后端测试,并提供本地只读看板入口和安全更新回归
18
+ - [`2026-07-16-init-upgrade-continuity.md`](2026-07-16-init-upgrade-continuity.md) — 修复 apply-safe 降级 recorded state、补齐 knowledge taskKind/公共 CLI 指引,并将 kb runtime scripts 纳入 packageRequired
11
19
  - [`2026-07-15-repair-artifact-gate-runtime-contract.md`](2026-07-15-repair-artifact-gate-runtime-contract.md) — 显式 `repairNodeId` + 严格 repair writer 契约、DagSpec `runtimeContract` capability preflight,以及 run-owned controller identity(resume 漂移 fail-closed)
12
20
  - [`2026-07-14-backend-test-dag-template.md`](2026-07-14-backend-test-dag-template.md) — 通过 `taskKind: "backend-test"` 生成需求分析、功能用例、pytest 自动化、执行与复盘的 Pi-only 专用 DAG
13
21
  - [`2026-07-14-observe-ui-r5.md`](2026-07-14-observe-ui-r5.md) — Observe 原生 ES module 拆分、四态 helper、Pool hash 筛选与入口 re-export
@@ -77,9 +85,24 @@ npm 包携带本 README 作为目录契约。具体 completed plan 属于目标
77
85
  - [`2026-07-15-init-update-surface-coverage.md`](2026-07-15-init-update-surface-coverage.md)
78
86
  - [`2026-07-15-readonly-node-retry.md`](2026-07-15-readonly-node-retry.md)
79
87
 
80
- - [`2026-07-16-frontend-demand-auto-routing.md`](2026-07-16-frontend-demand-auto-routing.md)
81
- - [`2026-07-16-frontend-mock-data-workflow.md`](2026-07-16-frontend-mock-data-workflow.md)
88
+ - [`2026-07-16-init-natural-language-routing.md`](2026-07-16-init-natural-language-routing.md)
89
+
90
+ - [`2026-07-16-observe-inspector-node-consistency.md`](2026-07-16-observe-inspector-node-consistency.md)
91
+
92
+ - [`2026-07-16-repair-artifact-pass-normalization.md`](2026-07-16-repair-artifact-pass-normalization.md)
93
+
94
+ - [`2026-07-16-decision-envelope-fence-tolerance.md`](2026-07-16-decision-envelope-fence-tolerance.md)
95
+
96
+ - [`2026-07-16-decision-envelope-prompt-contract.md`](2026-07-16-decision-envelope-prompt-contract.md)
97
+
98
+ - [`2026-07-17-source-target-structure-alignment.md`](2026-07-17-source-target-structure-alignment.md)
82
99
 
83
100
  - [`2026-07-17-review-findings-remediation.md`](2026-07-17-review-findings-remediation.md)
84
101
 
85
102
  - [`2026-07-16-backend-test-analysis-contract-artifact.md`](2026-07-16-backend-test-analysis-contract-artifact.md)
103
+
104
+ - [`2026-07-17-release-0130-reconcile.md`](2026-07-17-release-0130-reconcile.md)
105
+
106
+ - [`2026-07-17-observe-dashboard-incremental-polling.md`](2026-07-17-observe-dashboard-incremental-polling.md)
107
+
108
+ - [`2026-07-18-origin-main-merge-43e86ad.md`](2026-07-18-origin-main-merge-43e86ad.md)