@tea-agent/loop-agent 0.9.0 → 0.10.0-alpha.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.
- package/AGENTS.md +8 -0
- package/CHANGELOG.md +92 -11
- package/README.md +69 -5
- package/dist/application/dag/args.js +4 -14
- package/dist/application/dag/generate-task-dag.js +32 -2
- package/dist/application/dag/run-dag.js +1 -27
- package/dist/application/dag/validate-dag.js +2 -2
- package/dist/application/loop/run-action.js +0 -4
- package/dist/cli/command-definitions.js +7 -11
- package/dist/cli/program.js +9 -21
- package/dist/commands/cursor-prompt.js +42 -82
- package/dist/commands/dag-approve.js +36 -0
- package/dist/commands/dag-reconcile-run.js +118 -0
- package/dist/commands/delegate.js +75 -77
- package/dist/commands/doctor.js +0 -18
- package/dist/commands/init.js +60 -40
- package/dist/commands/instructions.js +7 -10
- package/dist/commands/loop.js +4 -20
- package/dist/executors/config-core.js +0 -51
- package/dist/executors/dag-pi-executor.js +1 -1
- package/dist/executors/dag.js +0 -1
- package/dist/executors/index.js +0 -2
- package/dist/executors/model-routing.js +9 -9
- package/dist/executors/shell-executor.js +1 -1
- package/dist/governance/checks.js +6 -3
- package/dist/governance/manifest-types.js +33 -2
- package/dist/infrastructure/harness/loop-action-store.js +0 -3
- package/dist/records/harvest.js +2 -23
- package/dist/records/one-shot-runs.js +1 -1
- package/dist/shared/artifacts-core.js +24 -5
- package/dist/shared/output-truncation.js +37 -0
- package/dist/shared/package-metadata.js +353 -0
- package/dist/{executors/cursor-executor.js → sidecars/cursor-prompt/executor.js} +2 -42
- package/dist/sidecars/cursor-prompt/index.js +3 -0
- package/dist/sidecars/cursor-prompt/stream.js +121 -0
- package/dist/task/config-types.js +29 -12
- package/dist/task/delegate.js +9 -21
- package/dist/task/runtime.js +1 -2
- package/dist/worker/cli.js +243 -0
- package/dist/worker/closeout/apply.js +73 -0
- package/dist/worker/closeout/preview.js +30 -0
- package/dist/worker/delivery/final-verification.js +194 -0
- package/dist/worker/delivery/git-transaction.js +354 -0
- package/dist/worker/delivery/package.js +502 -0
- package/dist/worker/feature/decision-loader.js +68 -0
- package/dist/worker/feature/discover.js +14 -0
- package/dist/worker/feature/next-action.js +74 -0
- package/dist/worker/feature/reducer.js +133 -0
- package/dist/worker/feature/review.js +502 -0
- package/dist/worker/feature/run.js +365 -0
- package/dist/worker/feature/types.js +1 -0
- package/dist/worker/follow-up/approve.js +270 -0
- package/dist/worker/follow-up/factory.js +234 -0
- package/dist/worker/follow-up/paths.js +25 -0
- package/dist/worker/follow-up/policy.js +26 -0
- package/dist/worker/follow-up/schema.js +93 -0
- package/dist/worker/follow-up/store.js +96 -0
- package/dist/worker/loop-agent/loop-agent-client.js +329 -126
- package/dist/worker/metrics/projector.js +139 -0
- package/dist/worker/observability/read-model.js +282 -15
- package/dist/worker/observe/paths.js +17 -5
- package/dist/worker/observe/static/app.js +443 -61
- package/dist/worker/observe/static/index.html +3 -1
- package/dist/worker/observe/static/styles.css +85 -18
- package/dist/worker/pool/run-store.js +14 -2
- package/dist/worker/pool/validation.js +59 -0
- package/dist/worker/preflight.js +49 -1
- package/dist/worker/report/morning-report.js +41 -6
- package/dist/worker/run-task/run-task.js +23 -13
- package/dist/worker/runner/run-ready.js +89 -11
- package/dist/worker/task-spec/schema.js +0 -1
- package/dist/workflows/dag/convergence/controller.js +1 -1
- package/dist/workflows/dag/executor-registry.js +0 -2
- package/dist/workflows/dag/governance-profile.js +10 -0
- package/dist/workflows/dag/init-hybrid.js +601 -26
- package/dist/workflows/dag/lifecycle.js +146 -0
- package/dist/workflows/dag/node-execution.js +64 -7
- package/dist/workflows/dag/prompt.js +16 -0
- package/dist/workflows/dag/report.js +2 -0
- package/dist/workflows/dag/runner.js +176 -119
- package/dist/workflows/dag/scheduler.js +7 -2
- package/dist/workflows/dag/skill-snapshot.js +527 -0
- package/dist/workflows/dag/types.js +45 -9
- package/dist/workflows/dag/validate.js +5 -8
- package/dist/workflows/loop/actions/dag-action.js +0 -2
- package/dist/workflows/loop/actions/shared.js +1 -1
- package/dist/workflows/loop/actions.js +14 -31
- package/dist/workflows/loop/benchmark.js +1 -1
- package/dist/workflows/loop/index.js +1 -1
- package/dist/workflows/loop/policy/auto-policy.js +22 -14
- package/dist/workflows/loop/policy/path-patterns.js +13 -0
- package/docs/README.md +35 -16
- package/docs/agent-dag-recovery-playbook.md +1 -1
- package/docs/architecture/README.md +26 -0
- package/docs/architecture/dag-execution.md +134 -0
- package/docs/architecture/evolution.md +52 -0
- package/docs/architecture/facts-and-state.md +58 -0
- package/docs/architecture/runtime-boundaries.md +41 -15
- package/docs/architecture/system-overview.md +93 -0
- package/docs/architecture/worker-and-feature.md +81 -0
- package/docs/cursor-prompt-sidecar.md +36 -0
- package/docs/decisions/README.md +13 -1
- package/docs/design/README.md +39 -13
- package/docs/development-principles.md +1 -1
- package/docs/exec-plans/active/README.md +2 -2
- package/docs/exec-plans/completed/README.md +14 -1
- package/docs/feature-workflow.md +44 -4
- package/docs/init-surface.manifest.json +63 -1
- package/docs/loop-agent-harness.md +65 -3
- package/docs/progress/README.md +27 -0
- package/docs/reports/README.md +74 -8
- package/docs/skills/README.md +2 -1
- package/docs/skills/vetted-skill-registry.md +2 -1
- package/docs/templates/agent-dag-report.schema.json +4 -2
- package/docs/templates/agent-dag.base.json +0 -5
- package/docs/templates/agent-dag.final-verification.json +0 -5
- package/docs/templates/agent-dag.schema.json +1 -2
- package/docs/templates/agent-dag.supervised-implementation.json +1 -6
- package/docs/templates/backend-test-dag.generate-pytest.prompt.md +131 -0
- package/docs/templates/backend-test-dag.json +213 -0
- package/docs/templates/backend-test-dag.retrospect.prompt.md +128 -0
- package/docs/templates/backend-test-dag.review-cases.prompt.md +85 -0
- package/docs/templates/frontend-design-contract.md +33 -0
- package/docs/templates/frontend-task-constraints.md +25 -0
- package/docs/templates/frontend-task-requirement.md +61 -0
- package/docs/templates/harness.schema.json +8 -5
- package/docs/templates/hybrid-dag.json +1 -6
- package/docs/templates/init-evolution-review.md +4 -2
- package/docs/templates/interactive-ui-round2-experiment.md +1 -1
- package/docs/templates/product-line/task.yaml +0 -1
- package/docs/templates/worker-dogfood-evidence.md +28 -0
- package/docs/templates/worker-dogfood-setup.md +20 -0
- package/docs/verification-matrix.md +17 -0
- package/examples/decision-gate-agent-dag.json +87 -33
- package/examples/example-dag.json +0 -5
- package/examples/hybrid-loop-agent-dag.json +0 -5
- package/harness.json +6 -11
- package/package.json +22 -44
- package/scripts/check-product-line-docs.sh +10 -3
- package/skills/agent-worker/SKILL.md +37 -0
- package/skills/agent-worker/references/agent-worker-operator.md +43 -0
- package/skills/frontend-design-review/SKILL.md +59 -0
- package/skills/frontend-design-review/references/review-checklist.md +37 -0
- package/skills/frontend-implementation/SKILL.md +48 -0
- package/skills/frontend-implementation/references/code-standards.md +34 -0
- package/skills/frontend-implementation/references/design-spec.md +46 -0
- package/skills/frontend-implementation/references/node-contracts.md +32 -0
- package/skills/frontend-review/SKILL.md +53 -0
- package/skills/frontend-review/references/review-findings.md +42 -0
- package/skills/frontend-verification/SKILL.md +40 -0
- package/skills/frontend-verification/references/verification-checklist.md +56 -0
- package/skills/grill-me/SKILL.md +10 -0
- package/skills/grill-with-docs/SKILL.md +88 -0
- package/skills/grill-with-docs/adr-format.md +47 -0
- package/skills/grill-with-docs/context-format.md +60 -0
- package/skills/init-capability-evolution/SKILL.md +1 -0
- package/skills/loop-agent/SKILL.md +11 -9
- package/skills/loop-agent/references/command-reference.md +28 -15
- package/skills/loop-agent/references/docs-converge.md +126 -0
- package/skills/loop-agent/references/harness-policy.md +7 -7
- package/skills/loop-agent/references/hybrid-dag.md +13 -15
- package/skills/loop-agent/references/long-running-loop.md +4 -6
- package/skills/loop-agent/references/multi-worktree.md +6 -6
- package/skills/loop-agent/references/orchestrator-and-interventions.md +3 -3
- package/skills/loop-agent/references/pi-subagent-assisted-mode.md +14 -11
- package/skills/using-git-worktrees/SKILL.md +215 -0
- package/dist/commands/cursor-worker.js +0 -43
- package/dist/cursor-worker-entry.js +0 -8
- package/dist/executors/cursor-artifacts.js +0 -33
- package/dist/executors/cursor-execution-log.js +0 -81
- package/dist/executors/cursor-executor-artifacts.js +0 -134
- package/dist/executors/cursor-run.js +0 -115
- package/dist/executors/cursor-tool.js +0 -94
- package/dist/executors/cursor-worker-client.js +0 -223
- package/dist/executors/cursor-worker-protocol.js +0 -18
- package/dist/executors/cursor-worker-server.js +0 -54
- package/dist/executors/cursor-worker.js +0 -3
- package/dist/executors/cursor.js +0 -6
- package/dist/executors/dag-cursor-executor.js +0 -87
- package/dist/workflows/loop/actions/cursor-fix.js +0 -191
- package/dist/workflows/loop/policy/cursor-fix-policy.js +0 -31
- package/docs/cursor-executor-usage.md +0 -25
- package/docs/dynamic-workflow-dag-engine-roadmap.md +0 -1749
|
@@ -7,21 +7,17 @@ import { validateDagUseCase } from "../../application/dag/validate-dag.js";
|
|
|
7
7
|
import { formatDagReportHandoffMarkdown, formatDagReportMarkdown, } from "../dag/report.js";
|
|
8
8
|
import { loadTaskConfig } from "../../task/runtime.js";
|
|
9
9
|
import { appendLoopEvent } from "./events.js";
|
|
10
|
-
import { appendLoopRound
|
|
10
|
+
import { appendLoopRound } from "./rounds.js";
|
|
11
11
|
import { rewriteLoopContext } from "./context.js";
|
|
12
12
|
import { loadLoopState } from "./state.js";
|
|
13
13
|
import { drainLoopSignals, pendingLoopSignals, readLoopSignals, } from "./signals.js";
|
|
14
14
|
import { decideNextLoopAutoAction, } from "./policy/auto-policy.js";
|
|
15
|
-
import { validateLoopCursorFixPolicy } from "./policy/cursor-fix-policy.js";
|
|
16
15
|
import { configureLoopDagDefaultRunner, } from "./actions/dag-action.js";
|
|
17
16
|
import { readLatestPiReviewRecord } from "./actions/pi-review.js";
|
|
18
17
|
import { runLoopWorkflowGateSignalAction, } from "./actions/workflow-action.js";
|
|
19
|
-
import { hasDagRound } from "./actions/shared.js";
|
|
20
18
|
export { decideNextLoopAutoAction } from "./policy/auto-policy.js";
|
|
21
|
-
export { validateLoopCursorFixPolicy } from "./policy/cursor-fix-policy.js";
|
|
22
19
|
export { resolveLoopShellVerifyCommands, runLoopShellVerification } from "./actions/shell-verify.js";
|
|
23
20
|
export { buildLoopPiReviewPrompt, runLoopPiReview, } from "./actions/pi-review.js";
|
|
24
|
-
export { buildLoopCursorFixPrompt, runLoopCursorFix } from "./actions/cursor-fix.js";
|
|
25
21
|
export { runLoopDagAction } from "./actions/dag-action.js";
|
|
26
22
|
export { runLoopWorkflowAction, runLoopWorkflowGateSignalAction, } from "./actions/workflow-action.js";
|
|
27
23
|
async function defaultDagCommandRunner(repoRoot, command, args) {
|
|
@@ -58,6 +54,17 @@ async function defaultDagCommandRunner(repoRoot, command, args) {
|
|
|
58
54
|
configureLoopDagDefaultRunner(defaultDagCommandRunner);
|
|
59
55
|
async function defaultAutoActionRunner(input) {
|
|
60
56
|
if (isLoopActionName(input.action)) {
|
|
57
|
+
if (input.action === "dag") {
|
|
58
|
+
await runLoopAction({
|
|
59
|
+
action: "dag",
|
|
60
|
+
repoRoot: input.repoRoot,
|
|
61
|
+
taskId: input.taskId,
|
|
62
|
+
options: {
|
|
63
|
+
mode: input.dagMode ?? "review",
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
61
68
|
await runLoopAction({
|
|
62
69
|
action: input.action,
|
|
63
70
|
repoRoot: input.repoRoot,
|
|
@@ -81,7 +88,6 @@ async function defaultAutoActionRunner(input) {
|
|
|
81
88
|
function isLoopActionName(action) {
|
|
82
89
|
return (action === "shell-verify" ||
|
|
83
90
|
action === "pi-review" ||
|
|
84
|
-
action === "cursor-fix" ||
|
|
85
91
|
action === "dag" ||
|
|
86
92
|
action === "workflow");
|
|
87
93
|
}
|
|
@@ -117,33 +123,10 @@ export async function runLoopAuto(repoRoot, taskId, options = {}) {
|
|
|
117
123
|
}
|
|
118
124
|
continue;
|
|
119
125
|
}
|
|
120
|
-
const hasApprovalSignal = pendingLoopSignals(signals).some((signal) => signal.type === "approval");
|
|
121
|
-
const policyAllowsCursorFix = taskConfig.loopAutoWritePolicy === "enabled" ||
|
|
122
|
-
(taskConfig.loopAutoWritePolicy === "approval-required" &&
|
|
123
|
-
(Boolean(options.allowCursorFix) || hasApprovalSignal));
|
|
124
|
-
let cursorFixPolicyError;
|
|
125
|
-
if (policyAllowsCursorFix &&
|
|
126
|
-
state.lastAction === "pi-review" &&
|
|
127
|
-
latestPiReview?.structured.recommendedAction === "implement_fix") {
|
|
128
|
-
try {
|
|
129
|
-
const rounds = await readLoopRounds(repoRoot, taskId);
|
|
130
|
-
validateLoopCursorFixPolicy({
|
|
131
|
-
allowedPaths: taskConfig.allowedPaths,
|
|
132
|
-
forbiddenPaths: taskConfig.forbiddenPaths,
|
|
133
|
-
complexity: taskConfig.complexity,
|
|
134
|
-
dagFallbackReason: taskConfig.dagFallbackReason ?? "",
|
|
135
|
-
hasDagRound: hasDagRound(rounds),
|
|
136
|
-
});
|
|
137
|
-
}
|
|
138
|
-
catch (error) {
|
|
139
|
-
cursorFixPolicyError = error instanceof Error ? error.message : String(error);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
126
|
const next = decideNextLoopAutoAction(state, signals, {
|
|
143
|
-
|
|
144
|
-
|
|
127
|
+
loopAutoExecutionPolicy: taskConfig.loopAutoExecutionPolicy,
|
|
128
|
+
approvalGranted: options.approvalGranted,
|
|
145
129
|
latestPiReview: latestPiReview?.structured,
|
|
146
|
-
cursorFixPolicyError,
|
|
147
130
|
});
|
|
148
131
|
actions.push(next);
|
|
149
132
|
await appendLoopEvent(repoRoot, taskId, {
|
|
@@ -194,7 +194,7 @@ export const LOOP_BENCHMARK_FIXTURE_SAMPLES = [
|
|
|
194
194
|
regressionPause: false,
|
|
195
195
|
changedPaths: 1,
|
|
196
196
|
repairPasses: 1,
|
|
197
|
-
}, ["./test/loop-workflow.test.ts"], "Approval or enabled policy triggers bounded
|
|
197
|
+
}, ["./test/loop-workflow.test.ts"], "Approval or enabled policy triggers bounded DAG execute."),
|
|
198
198
|
result("3-pass-convergence+quota", {
|
|
199
199
|
pass: true,
|
|
200
200
|
fullVerifyPass: true,
|
|
@@ -5,4 +5,4 @@ export { rewriteLoopContext } from "./context.js";
|
|
|
5
5
|
export { appendLoopSignal, drainLoopSignals, parseLoopSignalType, pendingLoopSignals, readLoopSignals, } from "./signals.js";
|
|
6
6
|
export { appendLoopEvent, readLoopEvents } from "./events.js";
|
|
7
7
|
export { generateLoopCloseout } from "./closeout.js";
|
|
8
|
-
export { buildLoopPiReviewPrompt,
|
|
8
|
+
export { buildLoopPiReviewPrompt, decideNextLoopAutoAction, resolveLoopShellVerifyCommands, runLoopAuto, runLoopDagAction, runLoopPiReview, runLoopShellVerification, runLoopWorkflowGateSignalAction, runLoopWorkflowAction, } from "./actions.js";
|
|
@@ -55,28 +55,34 @@ export function decideNextLoopAutoAction(state, signals = [], options = {}) {
|
|
|
55
55
|
}
|
|
56
56
|
if (state.lastAction === "pi-review") {
|
|
57
57
|
if (options.latestPiReview?.recommendedAction === "implement_fix") {
|
|
58
|
-
const policy = options.
|
|
58
|
+
const policy = options.loopAutoExecutionPolicy ?? "off";
|
|
59
59
|
const approvalSignal = pendingSignals.find((signal) => signal.type === "approval");
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
(Boolean(options.allowCursorFix) || Boolean(approvalSignal)));
|
|
63
|
-
if (options.cursorFixPolicyError) {
|
|
60
|
+
const approved = Boolean(options.approvalGranted) || Boolean(approvalSignal);
|
|
61
|
+
if (policy === "off") {
|
|
64
62
|
return {
|
|
65
|
-
action: "
|
|
66
|
-
|
|
67
|
-
|
|
63
|
+
action: "dag",
|
|
64
|
+
dagMode: "review",
|
|
65
|
+
reason: `pi-review recommended implement_fix; loopAutoExecutionPolicy=off (DAG review only)`,
|
|
66
|
+
decision: "continue",
|
|
68
67
|
};
|
|
69
68
|
}
|
|
70
|
-
if (
|
|
69
|
+
if (policy === "approval-required" && !approved) {
|
|
71
70
|
return {
|
|
72
|
-
action: "
|
|
73
|
-
reason: `pi-review recommended implement_fix;
|
|
74
|
-
decision: "
|
|
71
|
+
action: "pause",
|
|
72
|
+
reason: `pi-review recommended implement_fix; loopAutoExecutionPolicy=approval-required without approval`,
|
|
73
|
+
decision: "pause",
|
|
75
74
|
};
|
|
76
75
|
}
|
|
76
|
+
return {
|
|
77
|
+
action: "dag",
|
|
78
|
+
dagMode: "execute",
|
|
79
|
+
reason: `pi-review recommended implement_fix; loopAutoExecutionPolicy=${policy}`,
|
|
80
|
+
decision: "continue",
|
|
81
|
+
};
|
|
77
82
|
}
|
|
78
83
|
return {
|
|
79
84
|
action: "dag",
|
|
85
|
+
dagMode: "review",
|
|
80
86
|
reason: "read-only review produced next action; generate a governed DAG review packet",
|
|
81
87
|
decision: "continue",
|
|
82
88
|
};
|
|
@@ -85,19 +91,21 @@ export function decideNextLoopAutoAction(state, signals = [], options = {}) {
|
|
|
85
91
|
if (approvalSignal) {
|
|
86
92
|
return {
|
|
87
93
|
action: "dag",
|
|
94
|
+
dagMode: "review",
|
|
88
95
|
reason: `approval signal received; generate next governed DAG packet: ${approvalSignal.message}`,
|
|
89
96
|
decision: "continue",
|
|
90
97
|
};
|
|
91
98
|
}
|
|
92
|
-
if (state.lastAction === "
|
|
99
|
+
if (state.lastAction === "dag") {
|
|
93
100
|
return {
|
|
94
101
|
action: "shell-verify",
|
|
95
|
-
reason:
|
|
102
|
+
reason: "dag round must be followed by deterministic shell verification",
|
|
96
103
|
decision: "continue",
|
|
97
104
|
};
|
|
98
105
|
}
|
|
99
106
|
return {
|
|
100
107
|
action: "dag",
|
|
108
|
+
dagMode: "review",
|
|
101
109
|
reason: "default to DAG governed review packet for the next bounded round",
|
|
102
110
|
decision: "continue",
|
|
103
111
|
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { pathMatchesPattern } from "../../../shared/git-progress.js";
|
|
2
|
+
export function normalizePattern(pattern) {
|
|
3
|
+
return pattern.replace(/\\/g, "/").replace(/^\.\//, "").replace(/\/\*\*$/, "");
|
|
4
|
+
}
|
|
5
|
+
export function patternsOverlap(allowed, forbidden) {
|
|
6
|
+
const a = normalizePattern(allowed);
|
|
7
|
+
const f = normalizePattern(forbidden);
|
|
8
|
+
return (a === f ||
|
|
9
|
+
a.startsWith(`${f}/`) ||
|
|
10
|
+
f.startsWith(`${a}/`) ||
|
|
11
|
+
pathMatchesPattern(a, forbidden) ||
|
|
12
|
+
pathMatchesPattern(f, allowed));
|
|
13
|
+
}
|
package/docs/README.md
CHANGED
|
@@ -4,19 +4,39 @@
|
|
|
4
4
|
|
|
5
5
|
顶层 `AGENTS.md` 是操作地图。长期知识应落在此处:决策、契约、计划、验证证据、调试笔记和可复用流程规则应记录在 `docs/` 下,而不是只留在聊天里。
|
|
6
6
|
|
|
7
|
+
**索引职责**:本文件只索引**核心契约、方法论、产物目录入口与模板**。单篇 progress / report / completed plan 的全量列表分别由对应子目录 `README.md` 维护,避免三处精选榜漂移。
|
|
8
|
+
|
|
9
|
+
站上用法文档在 `../website/docs/`;双树收敛见 `../skills/loop-agent/references/docs-converge.md`。
|
|
10
|
+
|
|
7
11
|
## 核心文档
|
|
8
12
|
|
|
9
13
|
- `development-principles.md` — 仓库开发原则
|
|
10
14
|
- `architecture/runtime-boundaries.md` — runtime 层边界与依赖方向
|
|
15
|
+
- `architecture/README.md` — 架构文档目录索引与阅读路径
|
|
16
|
+
- `architecture/system-overview.md` — loop-agent / agent-worker / 治理层 / 外部系统全景
|
|
17
|
+
- `architecture/dag-execution.md` — Agent DAG 主调用链、rank 调度、executor、skill snapshot、生命周期
|
|
18
|
+
- `architecture/worker-and-feature.md` — agent-worker 子进程边界、controller identity、Task Pool、Feature 与 Observe
|
|
19
|
+
- `architecture/facts-and-state.md` — harness 事实与状态、canonical/derived、可写/只读边界
|
|
20
|
+
- `architecture/evolution.md` — 当前已实现能力 vs 第 3–6 月未来方向
|
|
11
21
|
- `feature-workflow.md` — 有边界的功能工作流
|
|
12
22
|
- `verification-matrix.md` — 验证命令选择
|
|
13
23
|
- `production-readiness.md` — Production Readiness v0.1 范围、证据与 DAG hardening 标准
|
|
14
24
|
- `loop-agent-harness.md` — runtime 与 command surface 概览
|
|
15
25
|
- `agent-dag-runner.md` — Agent DAG runner 指南
|
|
16
|
-
- `
|
|
17
|
-
- `
|
|
26
|
+
- `agent-dag-recovery-playbook.md` — DAG 失败分类、recovery action 与 operator 处置手册
|
|
27
|
+
- `cursor-prompt-sidecar.md` — `cursor-prompt` one-shot sidecar 用法(非受治理 writer)
|
|
18
28
|
- `init-surface.manifest.json` — npm 包范围、目标项目初始化投影与 `init check-update` surface 分类的机器校验契约
|
|
19
29
|
|
|
30
|
+
## 近期完成合同(入口)
|
|
31
|
+
|
|
32
|
+
完整列表见 `exec-plans/completed/README.md`。近期高频入口:
|
|
33
|
+
|
|
34
|
+
- `exec-plans/completed/2026-07-14-website-docs-ia-and-converge.md` — Website IA、双树边界与 docs-converge
|
|
35
|
+
- `exec-plans/completed/2026-07-13-versioned-self-hosting-bootstrap.md` — 版本化自举与 candidate canary
|
|
36
|
+
- `exec-plans/completed/2026-07-12-pi-only-agent-runtime.md` — Pi-only 受治理 runtime
|
|
37
|
+
- `exec-plans/completed/2026-07-12-observe-warm-console-redesign.md` — Observe 暖白运行控制台
|
|
38
|
+
- `exec-plans/completed/2026-07-12-m2-08-closeout-dogfood-release.md` — 第二月 Closeout 与 dogfood 收口(M2-01~08 见 completed 索引)
|
|
39
|
+
|
|
20
40
|
## 设计思想来源
|
|
21
41
|
|
|
22
42
|
- `../website/docs/practices/` — Anthropic 长时运行 agent harness、OpenAI Codex harness engineering、腾讯端到端 Harness Engineering 与社区 agent harness 实践资料。当前仓库的“人类掌舵、智能体执行”、仓库即记录系统、小步增量、结构化 handoff 和 shell verification 纪律均受这些实践启发;权威执行规则仍以本目录治理文档、根目录 AGENTS.md、harness.json、skills 目录和脚本检查为准。
|
|
@@ -29,25 +49,19 @@
|
|
|
29
49
|
|
|
30
50
|
## 产物目录
|
|
31
51
|
|
|
32
|
-
- `design/README.md` —
|
|
52
|
+
- `design/README.md` — 设计草稿、契约映射与路线图(含 design/dynamic-workflow-dag-engine-roadmap.md)
|
|
33
53
|
- `exec-plans/active/README.md` — 进行中的执行计划
|
|
34
|
-
- `exec-plans/completed/README.md` —
|
|
35
|
-
- `progress/README.md` —
|
|
36
|
-
- `reports/README.md` —
|
|
37
|
-
- `
|
|
38
|
-
- `reports/2026-07-11-observe-dag-visualization.md` — Observe DAG edges、SVG 图形化、交互与真实 Chrome smoke 验证证据
|
|
39
|
-
- `reports/2026-07-11-0.7.5-init-evolution-review.md` — 0.7.5 package/version 变化对目标项目初始化 surface 的影响审查
|
|
40
|
-
- `reports/2026-07-11-command-performance-audit.md` — 命令并发、验证、Observe 和子进程输出的性能审计
|
|
41
|
-
- `reports/2026-07-11-command-performance-followups.md` — Observe 快照复用、输出缓冲和 reference index 遍历优化的验证记录
|
|
42
|
-
- `reports/2026-07-11-observe-terminal-dag-kpi.md` — 终态 DAG 被误计为活跃数的修复记录
|
|
43
|
-
- `reports/2026-07-12-observe-warm-console-redesign.md` — 暖白运行控制台视觉重构与桌面验证记录
|
|
44
|
-
- `decisions/README.md` — 架构决策
|
|
54
|
+
- `exec-plans/completed/README.md` — 已完成的执行计划(全量)
|
|
55
|
+
- `progress/README.md` — 进度交接日志(全量)
|
|
56
|
+
- `reports/README.md` — 验证与审计报告(全量);活能力摘要见 `reports/current-capability-summary.md`
|
|
57
|
+
- `decisions/README.md` — 架构决策(ADR 0001–0003)
|
|
45
58
|
- `skills/README.md` — repo-local skill registry and vetting notes
|
|
46
59
|
- `templates/` — 可复用的规划、报告与 DAG 模板
|
|
47
60
|
|
|
48
61
|
## 仓库 Skills
|
|
49
62
|
|
|
50
63
|
- `../skills/loop-agent/` — loop-agent 自身的 skill 指令与参考资料
|
|
64
|
+
- `../skills/agent-worker/` — Feature Packet / Task Pool / versioned self-hosting 的可选 outer-loop operator skill;不进入默认 DAG role skills
|
|
51
65
|
- 每个额外 skill 在仓库根 `../skills/` 下使用独立子目录;这些本地副本由 DAG 模板引用,维护不依赖外部 agent skill 目录
|
|
52
66
|
|
|
53
67
|
## 模板
|
|
@@ -58,8 +72,8 @@
|
|
|
58
72
|
- `templates/exec-plan.md` — 非平凡工作的执行计划
|
|
59
73
|
- `templates/progress-log.md` — 进度与交接日志
|
|
60
74
|
- `templates/qa-report.md` — 验证与 QA 证据
|
|
61
|
-
- `templates/worker-dogfood-setup.md` —
|
|
62
|
-
- `templates/worker-dogfood-evidence.md` — BE/FE/QA
|
|
75
|
+
- `templates/worker-dogfood-setup.md` — 发布 controller identity 固定、真实 Worker sample、candidate canary 与 retry 纪律
|
|
76
|
+
- `templates/worker-dogfood-evidence.md` — controller fingerprint、skill snapshot、canary、BE/FE/QA、Observe 与 failure evidence 模板
|
|
63
77
|
- `templates/harness.schema.json` — `harness.json` 的 IDE JSON Schema,随初始化投影到目标项目
|
|
64
78
|
- `templates/interactive-ui-round2-experiment.md` — interactive UI prompt/model A/B/C 对照实验与统一指标模板
|
|
65
79
|
- `templates/product-line/` — 可投影的 Feature/Task/QA/Links 产品线包;配合 `agent-worker task validate-feature` 做 docs CI
|
|
@@ -72,9 +86,14 @@
|
|
|
72
86
|
文档变更后运行:
|
|
73
87
|
|
|
74
88
|
```bash
|
|
89
|
+
node bin/loop-agent.js docs audit --repo-root .
|
|
90
|
+
bash scripts/check-doc-index.sh
|
|
91
|
+
bash scripts/check-doc-links.sh
|
|
75
92
|
bash scripts/check-repo.sh
|
|
76
93
|
```
|
|
77
94
|
|
|
95
|
+
涉及 `website/docs/` 时再跑 `npm run docs:build`,并按 `skills/loop-agent/references/docs-converge.md` 同步 `overview/roadmap.md` 等站上活页。
|
|
96
|
+
|
|
78
97
|
Windows 上通过 Git Bash 或已配置的兼容 Bash 运行脚本。实际文件操作使用平台原生路径;`/` 仅用于 repo 引用、JSON/Markdown 证据引用和 glob 约定。
|
|
79
98
|
|
|
80
99
|
完整本地门禁:
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# 架构文档索引
|
|
2
|
+
|
|
3
|
+
本目录是 loop-agent 维护者架构文档入口。每篇文档回答一个具体问题,不重复 `runtime-boundaries.md` 的依赖方向表与 governance-hook 表;遇到契约级事实请回到该文件。
|
|
4
|
+
|
|
5
|
+
## 阅读路径
|
|
6
|
+
|
|
7
|
+
建议按以下顺序阅读——先全景,再主路径,再边界/事实,最后路线:
|
|
8
|
+
|
|
9
|
+
1. `runtime-boundaries.md` — runtime 层边界、依赖方向与治理 hook 的机器校验契约(**先读,是其他文档的边界真源**)。
|
|
10
|
+
2. `system-overview.md` — loop-agent / agent-worker / 治理层 / 外部系统的全景关系。
|
|
11
|
+
3. `dag-execution.md` — Agent DAG 主调用链、rank 调度、executor、skill snapshot、生命周期。
|
|
12
|
+
4. `worker-and-feature.md` — agent-worker 子进程边界、controller identity、Task Pool、Feature 与 Observe。
|
|
13
|
+
5. `facts-and-state.md` — `.harness/` 各根目录、canonical facts、derived read models 与不可变规则。
|
|
14
|
+
6. `evolution.md` — 当前已实现能力 vs 第 3–6 月未来方向(明确标注规划/未实现)。
|
|
15
|
+
|
|
16
|
+
## 事实与规划的区分
|
|
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 段落是设计输入,**不是**已实现证明。
|
|
20
|
+
- 凡本目录文档描述未来能力,一律使用「规划 / 未实现 / 前瞻」标签。
|
|
21
|
+
|
|
22
|
+
## 与其他文档的分工
|
|
23
|
+
|
|
24
|
+
- 本目录不复制 `runtime-boundaries.md` 的 import 方向表、governance-hook 表与版本化自举边界表,只交叉引用。
|
|
25
|
+
- 用法与操作说明在 `website/docs/`(使用者双树),不在本目录重复。
|
|
26
|
+
- 本目录文档随发布包发布(npm `files` 显式条目 + `docs/init-surface.manifest.json` `packageRequired`),但 **不**投影到目标项目 init surface;目标项目 init 仍只投影语言无关的 `runtime-boundaries.md`。
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# Agent DAG 执行架构
|
|
2
|
+
|
|
3
|
+
本页说明 Agent DAG 的主调用链、rank 调度、executor、run-owned skill snapshot、decision gate 与 pause/completed 生命周期。命令面与 `test/cli-contract.test.ts` 一致;符号归属以 `src/` 为准。完整 import 边界与 governance hook 见 `runtime-boundaries.md`。
|
|
4
|
+
|
|
5
|
+
## 主调用链
|
|
6
|
+
|
|
7
|
+
### 生成 + 校验 + 执行(`dag run-task`)
|
|
8
|
+
|
|
9
|
+
```text
|
|
10
|
+
src/commands/dag-run-task.ts runDagRunTask
|
|
11
|
+
→ src/application/dag/generate-task-dag.ts generateTaskDagUseCase
|
|
12
|
+
└─ src/workflows/dag/init-hybrid.ts initHybridDagFromTask (生成 DagSpec)
|
|
13
|
+
└─ src/application/dag/validate-dag.ts validateDagUseCase (候选 + 最终校验)
|
|
14
|
+
└─ assertSafeForExecution (执行前安全检查)
|
|
15
|
+
└─ src/application/dag/run-dag.ts runDagUseCase (执行)
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
`generateTaskDagUseCase` 内部先 `initHybridDagFromTask` 生成 `DagSpec`,再调用 `validateDagUseCase` 做候选与最终两次校验,随后 `assertSafeForExecution` 确认 DAG 可安全执行,最后委托 `runDagUseCase` 执行。`runDagRunTask` 还 `export` 了 `assertSafeForExecution` 供命令层复用。
|
|
19
|
+
|
|
20
|
+
### 直接执行既有 DAG(`run-dag`)
|
|
21
|
+
|
|
22
|
+
```text
|
|
23
|
+
src/commands/run-dag.ts
|
|
24
|
+
→ src/application/dag/run-dag.ts runDagUseCase
|
|
25
|
+
→ src/workflows/dag/runner.ts runDag
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
`run-dag` 是 top-level 命令,**不**在 `dag` 子树下(与 `dag run-task` 区分)。`runDagUseCase` 是 application 层 typed use-case,`runDag` 是 workflow runtime 核心。
|
|
29
|
+
|
|
30
|
+
### 校验
|
|
31
|
+
|
|
32
|
+
```text
|
|
33
|
+
src/commands/dag-validate.ts runDagValidate
|
|
34
|
+
→ src/application/dag/validate-dag.ts validateDagUseCase
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## rank 调度
|
|
38
|
+
|
|
39
|
+
拓扑排序与按 rank 执行的符号归属(校准版,勿笼统归到 `runner.ts`):
|
|
40
|
+
|
|
41
|
+
| 职责 | 源码入口 | 说明 |
|
|
42
|
+
| --- | --- | --- |
|
|
43
|
+
| 拓扑排序 | `src/workflows/dag/topo.ts` `topoSortToRanks` | Kahn 算法,返回 `string[][]` ranks 并检测环 |
|
|
44
|
+
| 单次 rank 执行 | `src/workflows/dag/scheduler.ts` `executeDagRanksOnce` | rank 间遍历、节点执行编排 |
|
|
45
|
+
| run 主循环 | `src/workflows/dag/runner.ts` `runDag` / `executeDagCheckpoint` | 调用 scheduler + persistence + convergence |
|
|
46
|
+
|
|
47
|
+
`scheduler.ts` `executeDagRanksOnce` 内每个 rank:
|
|
48
|
+
|
|
49
|
+
1. `pauseGateRunnable`(满足 `isPauseOnHumanDecisionGate` 的节点,来自 `decision-envelope.ts`)**串行**先跑;任一节点触发 pause 即停止后续。
|
|
50
|
+
2. `regularRunnable` 经 `mapConcurrent` 并发执行,`maxConcurrent` 默认 **4**(`runner.ts` `Math.max(1, opts.maxConcurrent ?? 4)`)。
|
|
51
|
+
3. `rankWriterNodeIds`(`executor === "pi"` && `toolProfile === "write"` && `writePolicy === "exclusive"`)注入同 rank 的不相交 writeSet 上下文(`createExecuteNodeForRank`)。
|
|
52
|
+
4. 依赖未就绪的节点标 `SKIPPED`。
|
|
53
|
+
|
|
54
|
+
`mapConcurrent` 来自 `src/shared/concurrency.ts`(或等价 shared 工具)。
|
|
55
|
+
|
|
56
|
+
## executor(Pi-only 受治理 runtime)
|
|
57
|
+
|
|
58
|
+
- 注册表:`src/workflows/dag/executor-registry.ts`
|
|
59
|
+
`DEFAULT_DAG_EXECUTOR_REGISTRY = { pi, shell, static }`。
|
|
60
|
+
- schema:`src/workflows/dag/types.ts`
|
|
61
|
+
`dagNodeExecutorSchema = z.enum(["pi","shell","static"])`;DagNodeExecutor 默认 `"pi"`(`executor: dagNodeExecutorSchema.default("pi")`)。
|
|
62
|
+
- `executor: "cursor"` 在 schema refine 阶段抛 `CURSOR_DAG_EXECUTOR_REMOVED_ERROR`(Pi-only = ADR 0001)。
|
|
63
|
+
- Pi handler 先 `requireModel(input)` 校验已解析 model,再委托 `executeDagPiNode`(`src/executors/dag-pi-executor.ts`)。
|
|
64
|
+
- shell handler = `executeDagShellNode`(`src/executors/shell-executor.ts`);static handler = `executeDagStaticNode`(`src/executors/dag-static-executor.ts`)。
|
|
65
|
+
|
|
66
|
+
Executor 不得依赖 commands 或 CLI formatting;Cursor 不在受治理路径(`runtime-boundaries.md` §Executors)。
|
|
67
|
+
|
|
68
|
+
## run-owned skill snapshot
|
|
69
|
+
|
|
70
|
+
每个新 DAG run 在首个节点执行前冻结本次注入 prompt 的 skill 集合,保证 live skill 后续被修改/删除/补建不会影响当前 run:
|
|
71
|
+
|
|
72
|
+
| 步骤 | 源码入口 |
|
|
73
|
+
| --- | --- |
|
|
74
|
+
| 首节点前创建 | `runDag` 调 `createSkillSnapshot({ mode: "run-start" })`(`src/workflows/dag/skill-snapshot.ts`) |
|
|
75
|
+
| 写入产物 | `writeSkillSnapshot(runDir, snapshot)` → `<runDir>/.runtime/skill-snapshot.json`(常量 `SKILL_SNAPSHOT_REL_PATH = ".runtime/skill-snapshot.json"`) |
|
|
76
|
+
| state 只存相对引用 | `state.skillSnapshotRef` = `{ schemaVersion, path: ".runtime/skill-snapshot.json", sha256, createdAt, mode }`,**不**存绝对路径 |
|
|
77
|
+
| resume 续用 | `prepareSkillSnapshotForContinuation`(resume 路径,`src/workflows/dag/runner.ts` `resumeDagRun`) |
|
|
78
|
+
| 完整性校验 | 普通节点、dynamic child、approve/resume 都执行 integrity gate,ref/artifact/profile/binding 不一致即 fail closed,不回退实时解析 |
|
|
79
|
+
| legacy 兼容 | 旧 run 只在 ref 与 artifact 都不存在时可标 `legacy-resume-backfill` 并冻结剩余节点 |
|
|
80
|
+
|
|
81
|
+
snapshot 与 controller identity 是两个不同冻结层,详见 `runtime-boundaries.md` §版本化自举边界。
|
|
82
|
+
|
|
83
|
+
## decision gate 与 pause
|
|
84
|
+
|
|
85
|
+
- `isPauseOnHumanDecisionGate`(`src/workflows/dag/decision-envelope.ts`):`task.decisionGate?.mode === "pause-on-human"` 且 decision gate 启用时,该节点在 rank 内**串行先跑**。
|
|
86
|
+
- `shouldPauseOnHumanEscalation`(`decision-envelope.ts`,在 `src/workflows/dag/node-execution.ts` 调用):decision envelope 判定需人工升级时,写 `human-escalation.json`(与 `human-escalation.md`)并触发 pause。
|
|
87
|
+
- pause 时 `state.pausedByNodeId` + `pauseReason` + `humanDecisionNodeId` 被写入;`human-escalation.json` 落在 `<runDir>/<nodeId>/`。
|
|
88
|
+
|
|
89
|
+
decision envelope 中的 **model verdict**(`decision` / `riskLevel` 等解析自文本)是 `advisoryOnly: true` 派生视图,**不**是完成权威(`facts-and-state.md`)。
|
|
90
|
+
|
|
91
|
+
## 生命周期:active / paused / completed
|
|
92
|
+
|
|
93
|
+
`src/workflows/dag/lifecycle.ts` 定义三个目录:
|
|
94
|
+
|
|
95
|
+
| 目录 | 写入规则 |
|
|
96
|
+
| --- | --- |
|
|
97
|
+
| `.harness/dag-runs/active/<runId>/` | run 进行中 |
|
|
98
|
+
| `.harness/dag-runs/paused/<runId>/` | 触发 pause;resume 需 `human-approval.json` |
|
|
99
|
+
| `.harness/dag-runs/completed/<runId>/` | 终态;除 runner 终态写外只读(`completed-facts-guard.ts`) |
|
|
100
|
+
|
|
101
|
+
扫描顺序:`DAG_LIFECYCLE_SCAN_ORDER = ["paused", "active", "completed"]`(locate/status 等按此顺序解析 runId)。
|
|
102
|
+
|
|
103
|
+
关键规则:
|
|
104
|
+
|
|
105
|
+
- **pause → approve → resume**:`dag approve` 在 paused run 写 `human-approval.json`,将状态改回 `running` 并把目录迁回 `active/`;随后 `resumeDagRun`(`runner.ts`)要求 active lifecycle + approval artifact,并用 `prepareSkillSnapshotForContinuation` 复用 run-owned snapshot。
|
|
106
|
+
- **completed 写入**:只有 runner 在终态 `persistState({ allowCompletedFactsWrite: true })`(`runner.ts`)才能写 completed 目录;该 flag 经 `completed-facts-guard.ts` 校验。
|
|
107
|
+
- **显式 recovery mutation**:`dag reconcile-run`(`src/commands/dag-reconcile-run.ts`,命令层)默认仅检查;只有给出 `--action supersede|abandon` + reason,且 liveness 证明 runner 已停止时,才在原 lifecycle 写 reconciliation/state 并迁移到 `completed/`。它不是修改既有 completed history 的通用入口。Observe / status / doctor 始终只读。
|
|
108
|
+
- **status 枚举**:`DagRunState.status`;`TERMINAL_RUN_STATUSES` 判终态;`isTerminalDagRunStatus` 工具函数。
|
|
109
|
+
|
|
110
|
+
## convergence(可选、supervised)
|
|
111
|
+
|
|
112
|
+
- 控制器:`src/workflows/dag/convergence/controller.ts` `runConvergencePassController`,在 runner rank 间被调用。
|
|
113
|
+
- 特性默认 **off**(`task/config-types.ts` `convergence` 默认 `{ enabled: false }`)。
|
|
114
|
+
- 启用后按 `maxPasses`(默认 3)做多轮 repair,回归时可 `pauseOnRegression`。
|
|
115
|
+
- 产物落在 `<runDir>/convergence/pass-<n>/`。
|
|
116
|
+
|
|
117
|
+
## 完成权威 = shell verification
|
|
118
|
+
|
|
119
|
+
完成声明的权威是 shell command 的新鲜 exit code 与归档输出。验证命令执行在 `src/executors/shell-executor.ts`,环境与 preset helper 在 `src/executors/shell-verification.ts`;DAG authoring 写入的 `task.shell.verifyEvidence` 元数据由 `src/workflows/dag/node-execution.ts` 复制到 `node.verifyEvidence`。model verdict、Observe 或报告都不能替代这些 shell facts。
|
|
120
|
+
|
|
121
|
+
## Dynamic Workflow
|
|
122
|
+
|
|
123
|
+
Dynamic Workflow 是 DAG runtime 上方的逻辑编排/编译层,**不**重写 runner:
|
|
124
|
+
|
|
125
|
+
```text
|
|
126
|
+
WorkflowSpec (src/workflows/dynamic/spec.ts workflowSpecSchema)
|
|
127
|
+
→ validate (src/workflows/dynamic/validate.ts)
|
|
128
|
+
→ compile (src/workflows/dynamic/compile.ts compileWorkflowToDag) → DagSpec
|
|
129
|
+
→ 同一 run-dag 执行
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
- 动态语义:`map_agent` / `verify_agent` / `reduce_agent` / `condition` / `loop_until` / `human_gate` / `command` / `artifact_transform`。
|
|
133
|
+
- agent-like 节点 executor 仅 `pi` | `static`(schema 已不含 `cursor`)。
|
|
134
|
+
- 未完全兑现的 runtime limits 强执法、更广 profile、Loop 原生 `workflow` action 深度编排等仍是**设计输入**,见 `docs/design/dynamic-workflow-dag-engine-roadmap.md`(带 2026-07-14 校准条)。
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# 架构演进:当前 vs 未来
|
|
2
|
+
|
|
3
|
+
本页区分 loop-agent **当前已实现**的架构能力与**未来规划**。当前事实以代码、发布 CLI、已完成计划为准;未来能力一律标「规划 / 未实现 / 前瞻」。权威源:`CHANGELOG.md`、`docs/reports/current-capability-summary.md`、ADR 0001–0003、`docs/exec-plans/completed/`。
|
|
4
|
+
|
|
5
|
+
## 当前已实现(0.10.0 + 主干 Unreleased)
|
|
6
|
+
|
|
7
|
+
| 域 | 现状 | 权威入口 |
|
|
8
|
+
| --- | --- | --- |
|
|
9
|
+
| 受治理 Agent runtime | **Pi-only**;`cursor-prompt` 仅显式 one-shot sidecar | ADR 0001、`CHANGELOG.md [0.10.0]` |
|
|
10
|
+
| Agent DAG 主链 | `dag run-task` → generate → validate → `run-dag`;report/doctor/reconcile-run | `dag-execution.md`、`test/cli-contract.test.ts` |
|
|
11
|
+
| Dynamic Workflow | `WorkflowSpec` → validate → compile → 同一 `run-dag`;agent-like 节点仅 `pi\|static` | `src/workflows/dynamic/{spec,validate,compile}.ts`、`website/docs/guides/dynamic-workflow.md` |
|
|
12
|
+
| 版本化自举 | controller identity + run-owned skill snapshot + deterministic canary | `docs/reports/2026-07-13-versioned-self-hosting-bootstrap.md` |
|
|
13
|
+
| Feature 交付(M2) | review/run/approve-followup/delivery/closeout/verify-final | `docs/reports/2026-07-12-m2-completion-audit.md` |
|
|
14
|
+
| Task Pool | 唯一根 `.harness/task-pool/` | ADR 0002 |
|
|
15
|
+
| Observe | 本地只读暖白控制台(derived) | `website/docs/guides/observe-ui.md` |
|
|
16
|
+
| 文档双树 | `website/docs/` 用法 vs `docs/` 治理;docs-converge | ADR 0003 |
|
|
17
|
+
| 文档治理 | `docs/architecture/` 主题文档(本目录)+ package 可达 | 本目录 README |
|
|
18
|
+
|
|
19
|
+
### 受治理 runtime 的边界(已实现、不变式)
|
|
20
|
+
|
|
21
|
+
- DAG writer 固定 `implement-pi` / `repair-pi`;`executor: "cursor"`、`implement-cursor` / `repair-cursor`、Cursor worker、`cursor-fix` 已从受治理路径移除。
|
|
22
|
+
- 完成权威 = shell verification;model verdict / Observe / 报告是 derived/advisory。
|
|
23
|
+
- Worker 通过已发布 `loop-agent` 子进程执行,不 in-process import runtime kernel(governance 机器校验)。
|
|
24
|
+
|
|
25
|
+
## 未来规划(第 3–6 月,**未实现**)
|
|
26
|
+
|
|
27
|
+
以下能力来自 `docs/design/六个月规划.md` 与 `docs/design/dynamic-workflow-dag-engine-roadmap.md`(两文件均带 2026-07-14 校准条,未交付 phase 为**设计输入**,不是已实现证明)。它们**当前不存在于代码或 CLI**:
|
|
28
|
+
|
|
29
|
+
| 未来方向 | 状态 | 规划来源 |
|
|
30
|
+
| --- | --- | --- |
|
|
31
|
+
| 远程 PR / CI | 规划 / 未实现 | `docs/design/六个月规划.md`(第 3 个月起) |
|
|
32
|
+
| 线上 / 云 Worker | 规划 / 未实现 | 同上 |
|
|
33
|
+
| 云 Task Pool / SQL / Orchestrator | 规划 / 未实现 | 同上(第 2 月原始设计已调整为本地 Feature 闭环) |
|
|
34
|
+
| 多仓库平台 | 规划 / 未实现 | 同上 |
|
|
35
|
+
| 组织级服务 | 规划 / 未实现 | 同上 |
|
|
36
|
+
| Web Console(远端) | 规划 / 未实现 | 同上 |
|
|
37
|
+
| Dynamic Workflow runtime limits 强执法、更广 profile | 设计输入 | `docs/design/dynamic-workflow-dag-engine-roadmap.md`(未勾选 phase) |
|
|
38
|
+
| Loop 与 Dynamic Workflow 更深的双向集成、稳定化与自动恢复 | 设计输入 | 同上;当前已有基础 `workflow` action,不应误写为完全缺失 |
|
|
39
|
+
|
|
40
|
+
> 注意:`docs/design/dynamic-workflow-dag-engine-roadmap.md` 是 2026-07-04 历史叙述;文中凡把 Cursor 写成受治理 executor 或 `loop` 的 `cursor-fix` 动作,均为**历史叙述**,现状以 Pi-only + 显式 `cursor-prompt` sidecar 为准。
|
|
41
|
+
|
|
42
|
+
## 已收敛为 archive / 历史基线(非未来)
|
|
43
|
+
|
|
44
|
+
- 第 1–2 月规划已收敛为 archive/reports 指针,不在本文展开:`docs/design/archive/2026-07-12-第二月规划.md`。
|
|
45
|
+
- `docs/reports/2026-07-02-repository-analysis.md` 自 2026-07-14 起冻结为**历史基线快照**,不再滚动追加 Unreleased 能力。
|
|
46
|
+
- 活能力短摘要在 `docs/reports/current-capability-summary.md`。
|
|
47
|
+
|
|
48
|
+
## 文档本体的演进边界
|
|
49
|
+
|
|
50
|
+
- 本目录新增文档随发布包发布(`package.json` `files` + manifest `packageRequired` 显式条目),但 **不**投影到目标项目 init surface(AC-7);目标项目 init 仍只投影语言无关的 `runtime-boundaries.md`。
|
|
51
|
+
- `runtime-boundaries.md` 是边界真源;本目录其他文档交叉引用,不复制其 import 方向表 / governance-hook 表 / 版本化自举边界表。
|
|
52
|
+
- 未来如有能力落地,应先改 `src/`/CLI/ADR/completed plan,再回写本目录的「已实现」表。
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# 事实与状态
|
|
2
|
+
|
|
3
|
+
本页说明 `.harness/` 各根目录、canonical facts、derived read models 与不可变规则,并逐条标出 canonical|derived 与 writable|read-only。完成权威是 shell verification(ADR 0001);model verdict、Observe、报告都是 derived 或 advisory 视图。
|
|
4
|
+
|
|
5
|
+
## 六类运行态对象
|
|
6
|
+
|
|
7
|
+
| 对象 | 物理根 | 源码入口 | 性质 |
|
|
8
|
+
| --- | --- | --- | --- |
|
|
9
|
+
| Task | `.harness/tasks/<taskId>/` | `src/task/runtime.ts` `getTaskDir` | canonical,可写 |
|
|
10
|
+
| DAG run | `.harness/dag-runs/{active,paused,completed}/<runId>/` | `src/workflows/dag/lifecycle.ts` `DAG_RUNS_DIR` | canonical,active/paused 可写;completed 受 guard |
|
|
11
|
+
| one-shot run | `.harness/runs/{active,completed,failed}/<slug>/` | `src/infrastructure/harness/one-shot-run-store.ts`(逻辑封装见 `src/records/one-shot-runs.ts`) | canonical;active 可写,completed/failed 为终态事实 |
|
|
12
|
+
| Loop | `.harness/tasks/<taskId>/loop/` | `src/workflows/loop/**` | canonical,**不是独立根**,是 task 之上的多轮状态机 |
|
|
13
|
+
| Task Pool | `.harness/task-pool/`(唯一根) | `src/worker/pool/run-store.ts` `TASK_POOL_RELATIVE_ROOT`(ADR 0002) | canonical,可写(Worker 专用,可选) |
|
|
14
|
+
| Observe snapshot | Worker 内存/HTTP 派生视图 | `src/worker/observability/read-model.ts` `buildGlobalSnapshot` | **derived**,advisory |
|
|
15
|
+
|
|
16
|
+
### 区分要点
|
|
17
|
+
|
|
18
|
+
- **Task vs DAG run**:Task 是用户意图的源(`source/`、需求、执行约束、artifacts);DAG run 是一次执行实例,`<runId>/` 下落 spec、state、节点 artifacts、skill snapshot、decision envelope、convergence。
|
|
19
|
+
- **DAG run vs one-shot run**:DAG run 在 `.harness/dag-runs/`,有三态 lifecycle;one-shot run(当前主要由 `cursor-prompt` 及显式 one-shot evidence 路径产生)在 `.harness/runs/`,三态为 `active|completed|failed`。`pi-prompt` 当前不创建该目录下的 run evidence。两者是不同根、不同 schema。
|
|
20
|
+
- **Loop 不是顶层根**:Loop 状态在 `.harness/tasks/<taskId>/loop/`,是 task 之上的多轮状态机(round、signal、context、failureStreak、closeout)。
|
|
21
|
+
- **Task Pool 是 Worker 专用可选根**:只有使用 `agent-worker` 产品线时才存在;唯一根 `.harness/task-pool/`。
|
|
22
|
+
- **Observe snapshot 不是事实源**:`buildGlobalSnapshot` 投影失败返回安全错误摘要而非全零健康,不改变执行成败。
|
|
23
|
+
|
|
24
|
+
## canonical(可写)
|
|
25
|
+
|
|
26
|
+
- `.harness/tasks/<taskId>/` — `getTaskDir`。
|
|
27
|
+
- `.harness/dag-runs/{active,paused}/<runId>/` — run 进行中 / 暂停。
|
|
28
|
+
- `.harness/runs/active/<slug>/` — one-shot 运行中;完成或失败后通过 store 迁移到终态目录。
|
|
29
|
+
- `.harness/tasks/<taskId>/loop/` — Loop 状态机。
|
|
30
|
+
- `.harness/task-pool/` — Worker Task Pool(可选)。
|
|
31
|
+
|
|
32
|
+
`.harness/prompts/` 与 `.harness/init-surface.json` 属于初始化投影/控制资料,不是一次执行的 canonical run fact,需与上面的任务和 run 对象区分。
|
|
33
|
+
|
|
34
|
+
## canonical(只读 / 不可变)
|
|
35
|
+
|
|
36
|
+
- `.harness/dag-runs/completed/<runId>/` — 除 runner 终态 `persistState({ allowCompletedFactsWrite: true })` 与显式 `dag reconcile-run`(`--action supersede|abandon` + reason,runner 已证明停止)外只读。
|
|
37
|
+
- `.harness/runs/completed/<slug>/` 与 `.harness/runs/failed/<slug>/` — one-shot 终态事实;公共写接口只对 active run 开放,完成/失败通过 store 迁移。
|
|
38
|
+
- `completed-facts-guard.ts`(`src/infrastructure/harness/`)是 completed 路径 enforcement 入口:`assertHarnessWriteAllowed(targetPath, { repoRoot, allowCompletedFactsWrite? })`。
|
|
39
|
+
- promotion(completed → task artifacts 回填)由 `src/records/promotion.ts` 经 `loadCompletedDagEvidence` 读 completed state 后写 task artifacts。
|
|
40
|
+
|
|
41
|
+
## derived / advisory(不可作完成权威)
|
|
42
|
+
|
|
43
|
+
| 视图 | 来源 | 为何不可作权威 |
|
|
44
|
+
| --- | --- | --- |
|
|
45
|
+
| Observe snapshot / 首页 KPI | `buildGlobalSnapshot` 投影 `.harness/` + Task Pool | derived;投影失败安全降级 |
|
|
46
|
+
| decision envelope 的 model verdict | `decision` / `riskLevel` 解析自文本 | `advisoryOnly: true`(`decision-envelope.ts` / `decision-evidence.ts` / `lifecycle.ts`) |
|
|
47
|
+
| canvas / event observer | `notifyRunObserver` / `notifyNodeObserver` | try/catch 吞;明确派生视图,不 affect canonical 执行 |
|
|
48
|
+
| DAG report / doctor | `src/application/dag/report-dag.ts` + `src/workflows/dag/report.ts`;doctor 在 `src/workflows/dag/lifecycle.ts` | 只读总结,operator 决策辅助 |
|
|
49
|
+
| knowledge-curator proposal | `src/workflows/dag/knowledge-curator.ts` | advisory process guidance,不改 accepted learned skill |
|
|
50
|
+
| morning report / metrics | `src/worker/report/**` | derived 统计,含分母/样本量/缺失说明 |
|
|
51
|
+
|
|
52
|
+
## 完成权威
|
|
53
|
+
|
|
54
|
+
完成权威 = shell command 的 exit code 与归档 stdout/stderr。执行入口是 `src/executors/shell-executor.ts`,环境/preset helper 在 `src/executors/shell-verification.ts`;`node.verifyEvidence` 保存 DAG authoring 提供的验证阶段、命令来源与标签等元数据。model verdict、Observe、报告都不构成完成判定。
|
|
55
|
+
|
|
56
|
+
## init 投影的 `.harness` 入口
|
|
57
|
+
|
|
58
|
+
`init --profile full` 在目标项目创建 `.harness/tasks`(directory)、`.harness/dag-runs/active`(directory)、`.harness/prompts/analyze.md`(generated)、`.harness/init-surface.json`(state)。这些是 init surface,不在 `packageExcluded`/`initExcluded` 范围;详见 `docs/init-surface.manifest.json`。
|