@tea-agent/loop-agent 0.9.0 → 0.10.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/CHANGELOG.md +42 -11
- package/README.md +20 -0
- package/dist/cli/command-definitions.js +7 -0
- package/dist/cli/program.js +6 -1
- package/dist/commands/dag-reconcile-run.js +118 -0
- package/dist/commands/init.js +12 -3
- package/dist/governance/manifest-types.js +4 -0
- package/dist/worker/cli.js +216 -0
- package/dist/worker/closeout/apply.js +73 -0
- package/dist/worker/closeout/preview.js +30 -0
- package/dist/worker/delivery/final-verification.js +158 -0
- package/dist/worker/delivery/git-transaction.js +354 -0
- package/dist/worker/delivery/package.js +449 -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 +313 -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/metrics/projector.js +139 -0
- package/dist/worker/observability/read-model.js +256 -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 +86 -19
- package/dist/worker/pool/run-store.js +14 -2
- package/dist/worker/pool/validation.js +59 -0
- package/dist/worker/report/morning-report.js +41 -6
- package/dist/worker/run-task/run-task.js +1 -1
- package/dist/worker/runner/run-ready.js +19 -5
- package/dist/workflows/dag/init-hybrid.js +3 -1
- package/dist/workflows/dag/lifecycle.js +146 -0
- package/dist/workflows/dag/node-execution.js +3 -0
- package/dist/workflows/dag/prompt.js +16 -0
- package/dist/workflows/dag/report.js +2 -0
- package/dist/workflows/dag/runner.js +133 -104
- package/dist/workflows/dag/types.js +3 -0
- package/docs/README.md +17 -0
- package/docs/agent-dag-recovery-playbook.md +1 -1
- package/docs/architecture/runtime-boundaries.md +3 -2
- package/docs/design/README.md +11 -5
- package/docs/exec-plans/active/README.md +1 -1
- package/docs/exec-plans/completed/README.md +8 -1
- package/docs/loop-agent-harness.md +45 -2
- package/docs/progress/README.md +2 -0
- package/docs/reports/README.md +10 -0
- package/docs/templates/agent-dag-report.schema.json +5 -3
- package/docs/templates/harness.schema.json +7 -2
- package/docs/templates/init-evolution-review.md +4 -2
- package/docs/verification-matrix.md +7 -0
- package/harness.json +4 -3
- package/package.json +4 -2
- package/scripts/check-product-line-docs.sh +7 -3
- package/skills/init-capability-evolution/SKILL.md +1 -0
- package/skills/loop-agent/references/command-reference.md +21 -0
- package/skills/loop-agent/references/hybrid-dag.md +4 -3
|
@@ -8,4 +8,4 @@
|
|
|
8
8
|
|
|
9
9
|
- `2026-07-12-observe-warm-console-redesign.md` — 以暖白、细边界和高密度信息架构重构 Observe Dashboard。
|
|
10
10
|
|
|
11
|
-
-
|
|
11
|
+
- 已归档:第二月 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,13 +4,20 @@
|
|
|
4
4
|
|
|
5
5
|
npm 包携带本 README 作为目录契约。具体 completed plan 属于目标仓库历史,不从 loop-agent 源码历史复制。
|
|
6
6
|
|
|
7
|
+
- [`2026-07-11-m2-01-feature-review-model.md`](2026-07-11-m2-01-feature-review-model.md) — 第二月首个纵向切片:严格派生 Feature 状态、AC/Delivery/Closeout 证据与只读 `feature review`
|
|
8
|
+
- [`2026-07-12-m2-02-feature-run-orchestration.md`](2026-07-12-m2-02-feature-run-orchestration.md) — Feature 级 dry-run 与复用现有 Worker pipeline 的薄编排入口
|
|
9
|
+
- [`2026-07-12-m2-03-follow-up-tracer-bullet.md`](2026-07-12-m2-03-follow-up-tracer-bullet.md) — ProductBug 失败到人工批准 FIX、依赖重连、Ready 与 verified lineage 的纵向闭环
|
|
10
|
+
- [`2026-07-12-m2-04-follow-up-hardening.md`](2026-07-12-m2-04-follow-up-hardening.md) — 全 failure-category ActionCard/TaskDraft、EnvFailure 阈值、supersede 与审批事务故障回滚
|
|
11
|
+
- [`2026-07-12-m2-05-git-transaction.md`](2026-07-12-m2-05-git-transaction.md) — Feature branch checkpoint、失败证据/恢复、ignored 隔离与事务完整性
|
|
12
|
+
- [`2026-07-12-m2-06-delivery-closeout-preview.md`](2026-07-12-m2-06-delivery-closeout-preview.md) — Delivery Package、canonical AC evidence 与只读 Closeout gates
|
|
13
|
+
- [`2026-07-12-m2-07-feature-decision-metrics.md`](2026-07-12-m2-07-feature-decision-metrics.md) — 共享 Feature Decision Summary、Observe 层级、corruption 降级与月度 metrics
|
|
14
|
+
- [`2026-07-12-m2-08-closeout-dogfood-release.md`](2026-07-12-m2-08-closeout-dogfood-release.md) — Closeout apply、第二真实 Feature、真实 Follow-up 恢复、package/init/browser 与月度收口证据
|
|
7
15
|
- [`2026-07-11-observe-dashboard-page-system.md`](2026-07-11-observe-dashboard-page-system.md) — 完成 Observe 全页面信息层级与桌面布局优化,按用户确认收口归档。
|
|
8
16
|
- [`2026-07-11-observe-dashboard-detail-refinement.md`](2026-07-11-observe-dashboard-detail-refinement.md) — 完成 DAG 详情输出、依赖图与执行过程的轮询状态保持和桌面节点布局优化,按用户确认收口归档。
|
|
9
17
|
- [`2026-07-11-observe-terminal-dag-kpi.md`](2026-07-11-observe-terminal-dag-kpi.md) — 修复终态 DAG 因遗留未执行节点被误计为活跃的问题。
|
|
10
18
|
- [`2026-07-11-observe-polling-efficiency.md`](2026-07-11-observe-polling-efficiency.md) — 完成详情页终态停轮询、非重叠调度和后台降频。
|
|
11
19
|
- [`2026-07-11-command-performance-guardrails.md`](2026-07-11-command-performance-guardrails.md) — 完成命令并发参数、串行验证与 Observe SSE 的资源峰值护栏。
|
|
12
20
|
- [`2026-07-11-command-performance-followups.md`](2026-07-11-command-performance-followups.md) — 完成 Observe 快照复用、命令输出有界缓冲和 reference index 遍历优化。
|
|
13
|
-
|
|
14
21
|
- [`2026-07-02-loop-agent-subject-restructure.md`](2026-07-02-loop-agent-subject-restructure.md) — 将原 `tools/code-agent` runtime 提升到仓库根、重命名为 `loop-agent`,移除旧 memory plugin 产品线
|
|
15
22
|
- [`2026-07-04-remove-level1-fallback.md`](2026-07-04-remove-level1-fallback.md) — 移除历史顺序 Level 1 fallback,runtime、文档与 command surface 收敛到 DAG 执行
|
|
16
23
|
- [`2026-07-04-runtime-boundary-remediation.md`](2026-07-04-runtime-boundary-remediation.md) — 整合 CLI/skill/runtime 边界,抽出 DAG/Loop runtime seam,集中 harness store/guard 策略
|
|
@@ -33,15 +33,58 @@ npm 包包含运行与说明 harness 所需的静态能力资产:`bin/`、`dis
|
|
|
33
33
|
|
|
34
34
|
`loop-agent init --profile full --merge` 会把 schema 投影到目标项目,并在生成的 `harness.json` 写入与 `governanceRoot` 匹配的 `$schema`。旧初始化项目可通过 `loop-agent init check-update` 查看缺失项,并用 `loop-agent init update --apply-safe` 安全补齐 schema 文件和 `$schema` 引用;该安全更新只允许修改 `$schema`,不会重写用户已有 harness 配置。
|
|
35
35
|
|
|
36
|
+
DAG run state 会记录 runner PID、hostname 和定期 heartbeat,并为节点记录最近活动时间。`loop-agent dag status` 和 `loop-agent dag doctor --run-id <run-id> --markdown` 会将同主机且 PID 已消失的运行识别为 `orphaned`,将进程仍在但 heartbeat 过期的运行识别为 `stale`,将 runner 存活但当前节点超过 5 分钟没有状态活动标记为 `node-quiet`;跨主机运行只标记为 `unknown-host`,不会据此判断远端进程死亡。Observe 使用同一组字段过滤活跃 DAG,并在详情中显示 lifecycle 与 liveness;`node-quiet` 仍视为活跃,只提示操作者检查 session events 和 executor logs。
|
|
37
|
+
|
|
38
|
+
Observe 和 `dag status` 还会给出 `effectiveStatus`、`stateConsistent` 与 `recoveryEligibility`。主状态以 lifecycle + canonical status + liveness 的综合判定为准,原始 `state.status` 只作为诊断事实展示。遇到历史 `paused/` 目录仍记录 `status=running`、或 active runner 已明确 `orphaned` 时,先运行只读检查:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
loop-agent dag reconcile-run --run-id <run-id>
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
确认不应继续后,必须显式选择收口含义并填写原因:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
loop-agent dag reconcile-run --run-id <run-id> --action supersede --reason "implementation completed elsewhere"
|
|
48
|
+
loop-agent dag reconcile-run --run-id <run-id> --action abandon --reason "operator cancelled obsolete work"
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
收口会保存 `reconciliation.json` 原始快照,将仍为 RUNNING 的节点标为 ERROR,并把 run 归档到 `completed/`;不会把未执行节点伪造成成功。同机 runner 仍存活、仅 `node-quiet`、heartbeat stale 但 PID 仍存在、跨主机或无法证明停止时都会拒绝收口。
|
|
52
|
+
|
|
53
|
+
DAG 节点的模型由 `executorModels[executor][complexity]` 路由。新 run 会将解析后的 Pi/Cursor 模型写入节点 state;Observe 读取历史 run 时会从 `run.json` 补算缺失模型。Shell 和 Static 节点不使用模型,因此模型列保持 `-`。
|
|
54
|
+
|
|
55
|
+
DAG agent 节点的输出语言由 `harness.json.workflowPolicy.dag.outputLanguage` 控制,支持 `zh-CN` 和 `en`。未配置时默认 `zh-CN`;`dag run-task` 会把配置写入生成的 DagSpec,手写 DagSpec 缺少该字段时 prompt envelope 同样默认中文。语言规则只约束说明、分析、报告、总结和文档正文,不翻译代码、命令、路径、标识符、JSON 字段、VERDICT 行及其他精确协议字面量。
|
|
56
|
+
|
|
36
57
|
## Command Surface
|
|
37
58
|
|
|
38
59
|
- `new-task`、`status`、`inspect`、`doctor`
|
|
39
|
-
- `dag run-task`、`dag validate`、`run-dag`、`dag report`、`dag resume`
|
|
60
|
+
- `dag run-task`、`dag validate`、`run-dag`、`dag report`、`dag resume`、`dag reconcile-run`
|
|
40
61
|
- `delegate`、`harvest`、`promote-run`、`closeout`
|
|
41
62
|
- `loop init`、`loop run`、`loop status`、`loop closeout`
|
|
42
63
|
- `pi-prompt`、`cursor-prompt`
|
|
43
64
|
- `docs audit`、`handoff check`、`spine audit`、`knowledge curate`
|
|
44
|
-
- `agent-worker task validate|explain-profile|retry`、`agent-worker batch run-ready`、`agent-worker report morning`、`agent-worker observe serve|snapshot`
|
|
65
|
+
- `agent-worker feature review|run|verify-final|delivery|closeout|approve-followup`、`agent-worker task validate|explain-profile|retry|draft-followup`、`agent-worker batch run-ready`、`agent-worker report morning|metrics`、`agent-worker observe serve|snapshot`
|
|
66
|
+
|
|
67
|
+
## Feature Review
|
|
68
|
+
|
|
69
|
+
`agent-worker feature review --feature-dir <feature-dir> --repo <target-repo>` 是只读的 Feature 级决策入口。它复用 Feature Packet validation、task graph 和 `.harness/task-pool/` 事实,派生 `Draft`、`Ready`、`Running`、`NeedsAction`、`AwaitingQA`、`Deliverable`、`Closed`,同时展示 required AC 覆盖、阻塞、证据和唯一主行动。
|
|
70
|
+
|
|
71
|
+
默认输出按结果、原因、下一步、证据组织;`--json` 输出 schemaVersion 1 JSON。缺失或损坏的 Packet、state、JSONL 或 closeout 会暴露 validation error / projection warning,不会被误判为无数据、可交付或已关闭。该命令不写 Feature Packet、Task Pool 或 Git。
|
|
72
|
+
|
|
73
|
+
`agent-worker feature run --feature-dir <feature-dir> --repo <target-repo>` 是薄编排入口:先执行 Feature validation 和一次目标仓库 preflight,再复用 `runReadyTasks()` 推进 Ready Task,最后刷新 morning report、`.harness/task-pool/observability/snapshot.json` 与 Feature review。`--dry-run` 只读取 Packet/Task Pool 并列出 Ready IDs、步骤和预期产物。默认无 Git 授权时单次最多执行一个 Ready 写任务;checkpoint 模式可按 `--limit` 串行推进,并在每个 Task 后建立 clean boundary。
|
|
74
|
+
|
|
75
|
+
`agent-worker feature verify-final` 在 clean Delivery HEAD 上以已完成的 `qa-execute` TaskSpec 运行独立最终 DAG,跳过 promotion/task closeout,避免 repo write 或 HEAD 移动,并原子生成 canonical QA aggregate 与 HEAD-bound final verification。`agent-worker feature delivery` 从同一 Git transaction 和 Task Pool facts 生成带 hash 的 manifest、Acceptance Coverage 与稳定 `PR.md`,拒绝 dirty/wrong branch、历史或 trailer 漂移、缺失 run/QA/final verification 和 required AC 缺口。`agent-worker feature closeout` 默认只读预览 gates;显式 `--apply --owner` 才原子写回 Closeout,并在 stale facts、写入或 post-validation 失败时恢复原状态。
|
|
76
|
+
|
|
77
|
+
Morning report 顶部和 Observe 首页直接消费共享 Feature read model,固定从 Status、Next Action、Why、Evidence 开始。`agent-worker report metrics --month YYYY-MM` 写入 `.harness/task-pool/artifacts/metrics/monthly-YYYY-MM.json|md`,每项指标保留分母、样本量、窗口和 missingData。
|
|
78
|
+
|
|
79
|
+
显式 `--git-mode checkpoint` 会在 clean preflight 后创建或复用受 transaction record 管理的 `agent/<feature-id>` 本地分支。成功任务只有在 changed/untracked/sensitive 与 TaskSpec allowed/forbidden audit 通过后才 commit;失败任务的 patch、inventory、untracked content 与 boundary audit 写入 `.harness/task-pool/artifacts/features/<feature-id>/git/failures/`,随后 reset/clean 到最近 checkpoint 并再次验证 clean。默认模式不触碰 Git;`--keep-failed-diff` 只保留现场并停止,不允许继续下一个写任务。任何模式都不授权 stash、push、remote PR 或 merge。
|
|
80
|
+
|
|
81
|
+
业务 Task 失败不会跳过报告与最终 review,但命令返回 `needs-action` 和非零退出码;`noReadyReason` 用于区分 Closed、Deliverable、AwaitingQA、NeedsAction、dependency blocked 与 empty。
|
|
82
|
+
|
|
83
|
+
## Follow-up 决策与批准
|
|
84
|
+
|
|
85
|
+
`agent-worker task draft-followup <task-id> --worker-run-id <id> --feature-dir <feature-dir> --repo <target-repo>` 从失败 run、TaskSpec 和 task graph 生成 `FU-<parent>-NN` 决策产物。ProductBug/TestBug/FlakyTest/DependencyFailure 生成可批准 TaskDraft;连续两次 EnvFailure 生成 `ENV-CHECK-*`,单次只建议 retry;SpecUnclear/ContractMismatch/RiskyChange/NeedsHuman/Unknown 生成人工行动卡。产物与 evidence/index 位于 `.harness/task-pool/artifacts/features/<feature-id>/follow-ups/`;生成过程受 Feature lock 和 dedupe key 保护,不写 Feature Packet、Ready state 或原失败事实。新 run 会 supersede 同 parent 的旧 unresolved 产物,但不会删除历史。
|
|
86
|
+
|
|
87
|
+
人工批准只接受 TaskDraft;行动卡不能批准或进入 Ready。批准会校验 draft/evidence hash、repo/path containment、Feature baseline 和冲突,在 staging validation 后写 TaskSpec、graph、Ready、approval/index 与 event。rename、state、approval、index、event 五个故障点均有注入回滚测试;重复批准幂等复用首次结果。`--dry-run` 零写入,`--json` 失败保持 stdout JSON、stderr 无噪声和非零退出码。
|
|
45
88
|
|
|
46
89
|
## Worker Retry
|
|
47
90
|
|
package/docs/progress/README.md
CHANGED
package/docs/reports/README.md
CHANGED
|
@@ -2,7 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
本目录存放验证、审计、benchmark 与 closeout 报告。
|
|
4
4
|
|
|
5
|
+
- [`2026-07-12-m2-completion-audit.md`](2026-07-12-m2-completion-audit.md) — 对第二月规划完成定义、P0、硬指标、非目标与最终门禁的逐项审计
|
|
6
|
+
- [`2026-07-12-m2-08-dogfood-release-evidence.md`](2026-07-12-m2-08-dogfood-release-evidence.md) — 第二个真实 Feature Closeout、真实 Follow-up 恢复、metrics、package/init 与 Observe 浏览器证据
|
|
7
|
+
- [`2026-07-12-m2-08-init-evolution-review.md`](2026-07-12-m2-08-init-evolution-review.md) — M2-08 命令/包能力与空 Feature init 脚本修复的初始化影响审查
|
|
5
8
|
- [`2026-07-12-production-readiness-hardening.md`](2026-07-12-production-readiness-hardening.md)
|
|
9
|
+
- [`2026-07-11-m2-01-init-evolution-review.md`](2026-07-11-m2-01-init-evolution-review.md) — Feature review 命令对 init/package surface 的影响审查
|
|
10
|
+
- [`2026-07-12-m2-02-init-evolution-review.md`](2026-07-12-m2-02-init-evolution-review.md) — Feature run 命令对 init/package surface 的影响审查
|
|
11
|
+
- [`2026-07-12-m2-03-init-evolution-review.md`](2026-07-12-m2-03-init-evolution-review.md) — ProductBug Follow-up 命令对 init/package surface 的影响审查
|
|
12
|
+
- [`2026-07-12-m2-04-init-evolution-review.md`](2026-07-12-m2-04-init-evolution-review.md) — Follow-up 全分类与事务 hardening 对 init/package surface 的影响审查
|
|
13
|
+
- [`2026-07-12-m2-05-init-evolution-review.md`](2026-07-12-m2-05-init-evolution-review.md) — Feature Git checkpoint runtime 对 init/package surface 的影响审查
|
|
14
|
+
- [`2026-07-12-m2-06-init-evolution-review.md`](2026-07-12-m2-06-init-evolution-review.md) — Delivery / Acceptance Coverage / Closeout preview 对 init/package surface 的影响审查
|
|
15
|
+
- [`2026-07-12-m2-07-init-evolution-review.md`](2026-07-12-m2-07-init-evolution-review.md) — Feature Decision Summary、Observe 与 metrics 对 init/package surface 的影响审查
|
|
6
16
|
- [`2026-07-10-next-stage-dogfood-runs.md`](2026-07-10-next-stage-dogfood-runs.md) — 发布控制器下的 BE/FE/QA Worker 样本、retry 与 Observe 证据
|
|
7
17
|
- [`2026-07-10-init-evolution-review.md`](2026-07-10-init-evolution-review.md) — Worker 初始化投影演进审查
|
|
8
18
|
- [`2026-07-10-session-events-dogfood.md`](2026-07-10-session-events-dogfood.md) — Pi SDK DAG 新 run 产生非空 `session-events.jsonl` 与 Observe 过程时间线 API 证据
|
|
@@ -400,9 +400,11 @@
|
|
|
400
400
|
"pending",
|
|
401
401
|
"running",
|
|
402
402
|
"finished",
|
|
403
|
-
"partial_failed",
|
|
404
|
-
"failed",
|
|
405
|
-
"paused"
|
|
403
|
+
"partial_failed",
|
|
404
|
+
"failed",
|
|
405
|
+
"paused",
|
|
406
|
+
"superseded",
|
|
407
|
+
"abandoned"
|
|
406
408
|
]
|
|
407
409
|
},
|
|
408
410
|
"runDir": { "type": "string", "minLength": 1 },
|
|
@@ -56,8 +56,13 @@
|
|
|
56
56
|
"dag": {
|
|
57
57
|
"type": "object",
|
|
58
58
|
"additionalProperties": false,
|
|
59
|
-
"properties": {
|
|
60
|
-
"
|
|
59
|
+
"properties": {
|
|
60
|
+
"outputLanguage": {
|
|
61
|
+
"enum": ["zh-CN", "en"],
|
|
62
|
+
"description": "DAG agent 节点的默认输出语言。未配置时使用简体中文;代码、命令和机器契约不翻译。",
|
|
63
|
+
"default": "zh-CN"
|
|
64
|
+
},
|
|
65
|
+
"defaultEntry": {
|
|
61
66
|
"enum": ["dag run-task", "run-dag"],
|
|
62
67
|
"description": "默认 DAG 入口,用于任务 DAG 生成或直接 DAG 执行。",
|
|
63
68
|
"default": "dag run-task"
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
# Init Evolution Review
|
|
2
2
|
|
|
3
3
|
Date:
|
|
4
|
-
Base:
|
|
5
|
-
Head:
|
|
4
|
+
Base: `<full commit SHA or resolvable --base ref>`
|
|
5
|
+
Head: `<full commit SHA for the reviewed HEAD>`
|
|
6
|
+
|
|
7
|
+
`bash scripts/check-init-evolution-needed.sh --strict --base <ref>` 接受 Base 精确匹配该 `<ref>`、Head 为当前 `HEAD` 或其可解析祖先提交的报告。历史报告、`working tree` 等不可解析文字不能为其他变更范围放行严格检查。当 Head 是祖先时,`reportHead..HEAD` 区间内出现新的 `model-review` 高影响路径会使报告失效;仅 `advisory` 或 `surface-check` 的后续变化不影响已完成的高影响审查。
|
|
6
8
|
|
|
7
9
|
## Changed Surface
|
|
8
10
|
|
|
@@ -7,6 +7,11 @@
|
|
|
7
7
|
| 仅文档或治理 | `bash scripts/check-repo.sh` | `bash scripts/ci.sh` |
|
|
8
8
|
| TypeScript runtime | `npm run typecheck` | `npm test` |
|
|
9
9
|
| CLI 行为 | `npm run typecheck` + 定向 Vitest | `npm test` + CLI smoke |
|
|
10
|
+
| Feature reducer/review | `npx vitest run test/worker/feature test/worker/agent-worker-cli.test.ts` | `npm test` + `node bin/agent-worker.js feature review --help` |
|
|
11
|
+
| Feature run orchestration | `npx vitest run test/worker/feature test/worker/runner/run-ready.test.ts test/worker/agent-worker-cli.test.ts` | `npm test` + `node bin/agent-worker.js feature run --help` |
|
|
12
|
+
| Follow-up 分类与事务 | `npx vitest run test/worker/follow-up test/worker/feature test/worker/pool test/worker/report test/worker/agent-worker-cli.test.ts` | `npm test` + `node bin/agent-worker.js task draft-followup --help` + `node bin/agent-worker.js feature approve-followup --help` |
|
|
13
|
+
| Feature Git transaction | `npx vitest run test/worker/delivery test/worker/feature test/worker/runner test/worker/agent-worker-cli.test.ts` | `npm test` + `node bin/agent-worker.js feature run --help` + temporary Git repo smoke |
|
|
14
|
+
| Final verification / Delivery / Closeout | `npx vitest run test/worker/delivery test/worker/closeout test/worker/feature test/worker/agent-worker-cli.test.ts` | `npm test` + verify-final/Delivery/Closeout CLI help + temporary Git repo evidence/hash/tamper/apply rollback smoke |
|
|
10
15
|
| DAG 工作流 | 定向 DAG 测试 | `npm test` |
|
|
11
16
|
| Production readiness hardening | `bash scripts/check-repo.sh` + 定向 DAG/CLI 测试 | `bash scripts/ci.sh` + docs build + package smoke |
|
|
12
17
|
| 脚本或 CI | 运行变更的脚本 | `bash scripts/ci.sh` |
|
|
@@ -26,6 +31,8 @@ npm run dev -- --help
|
|
|
26
31
|
npm pack --dry-run
|
|
27
32
|
```
|
|
28
33
|
|
|
34
|
+
测试资源策略:`npm test` 会先运行可并行的纯测试,再串行运行会启动 CLI、`tsx` 或 Git 子进程的集成测试。纯测试根据 `os.availableParallelism()` 自适应使用 1 至 4 个 Worker;可用 `LOOP_AGENT_FAST_TEST_WORKERS` 在 CI 或受限机器上显式覆盖。传入测试文件时,例如 `npm test -- test/worker/observe/server.test.ts`,仍按常规 Vitest 方式只运行该范围,不会启动两阶段完整测试。
|
|
35
|
+
|
|
29
36
|
产品线 Feature/Task/QA 文档或 TaskSpec 约束变更还应运行:
|
|
30
37
|
|
|
31
38
|
```bash
|
package/harness.json
CHANGED
|
@@ -5,9 +5,10 @@
|
|
|
5
5
|
"governanceRoot": "docs",
|
|
6
6
|
"workflowPolicy": {
|
|
7
7
|
"defaultImplementationWorkflow": "agent-dag",
|
|
8
|
-
"dag": {
|
|
9
|
-
"defaultEntry": "dag run-task",
|
|
10
|
-
"
|
|
8
|
+
"dag": {
|
|
9
|
+
"defaultEntry": "dag run-task",
|
|
10
|
+
"outputLanguage": "zh-CN",
|
|
11
|
+
"profileRouting": {
|
|
11
12
|
"minimal": "standard-dag",
|
|
12
13
|
"standard": "standard-dag",
|
|
13
14
|
"reviewed": "review-gated-dag",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tea-agent/loop-agent",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"bin": {
|
|
6
6
|
"loop-agent": "bin/loop-agent.js",
|
|
@@ -43,7 +43,9 @@
|
|
|
43
43
|
"prepublishOnly": "npm run typecheck && npm test && npm run build",
|
|
44
44
|
"lint": "tsc --noEmit",
|
|
45
45
|
"typecheck": "tsc --noEmit",
|
|
46
|
-
"test": "
|
|
46
|
+
"test": "node scripts/run-tests.mjs",
|
|
47
|
+
"test:fast": "vitest run --config vitest.fast.config.ts",
|
|
48
|
+
"test:integration": "vitest run --config vitest.integration.config.ts",
|
|
47
49
|
"docs:dev": "npm --prefix website start",
|
|
48
50
|
"docs:build": "npm --prefix website run build",
|
|
49
51
|
"docs:serve": "npm --prefix website run serve",
|
|
@@ -5,9 +5,13 @@ ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
|
5
5
|
cd "${ROOT_DIR}"
|
|
6
6
|
|
|
7
7
|
feature_dirs=()
|
|
8
|
-
while IFS= read -r
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
while IFS= read -r feature_dir; do
|
|
9
|
+
if [[ ! -f "${feature_dir}/acceptance.yaml" ]]; then
|
|
10
|
+
echo "product-line docs check failed: incomplete feature packet missing acceptance.yaml: ${feature_dir}" >&2
|
|
11
|
+
exit 1
|
|
12
|
+
fi
|
|
13
|
+
feature_dirs+=("${feature_dir}")
|
|
14
|
+
done < <(find dogfood/features -mindepth 1 -maxdepth 1 -type d | sort)
|
|
11
15
|
|
|
12
16
|
if [[ ${#feature_dirs[@]} -eq 0 ]]; then
|
|
13
17
|
echo "product-line docs check skipped: no feature packets found"
|
|
@@ -50,6 +50,7 @@ docs/reports/YYYY-MM-DD-init-evolution-review.md
|
|
|
50
50
|
报告保持短小,包含:
|
|
51
51
|
|
|
52
52
|
- changed surface
|
|
53
|
+
- 可由 Git 解析的 Base 和 Head commit/ref;严格检查要求 Base 精确匹配所选 `--base`,Head 可以是运行时当前 `HEAD` 或它的一个可解析祖先提交。若 Head 是祖先,则 `reportHead..HEAD` 区间内一旦出现新的 `model-review` 高影响路径就会拒绝该报告;仅有 `advisory` 或 `surface-check` 变化不会让已完成的高影响审查失效。`working tree`、不可解析文字、无关历史报告都不能为其他变更范围放行严格检查。
|
|
53
54
|
- decision: no init impact / surface check only / init update required
|
|
54
55
|
- files updated
|
|
55
56
|
- verification commands and results
|
|
@@ -47,6 +47,7 @@ loop-agent doctor
|
|
|
47
47
|
loop-agent dag doctor
|
|
48
48
|
loop-agent dag report --latest --markdown
|
|
49
49
|
loop-agent dag closeout-draft --run-id <run-id>
|
|
50
|
+
loop-agent dag reconcile-run --run-id <run-id>
|
|
50
51
|
loop-agent dag reconcile-tasks --glob '<pattern>' --markdown
|
|
51
52
|
loop-agent dag final-verification <task-id> --output <temp-dir>/<task-id>-final-verification-dag.json
|
|
52
53
|
loop-agent status <task-id> --json
|
|
@@ -246,6 +247,9 @@ loop-agent dag run-task <task-id> --dry-run --cwd <repo-root> # generate + vali
|
|
|
246
247
|
loop-agent dag status --run-id <run-id> # 单次 run JSON 摘要(approvalFlow, healthIssues)
|
|
247
248
|
loop-agent dag doctor # 扫描 active/paused/completed runs;advisoryOnly health report
|
|
248
249
|
loop-agent dag report [--run-id <run-id>] [--lifecycle active|paused|completed|all] [--json|--markdown] [--failed-only] [--latest] [--paused-latest] [--action <recovery-action>] # derived per-node 聚合(只读);JSON 锁定于 docs/templates/agent-dag-report.schema.json;--paused-latest 聚焦最新 paused run;playbook: docs/agent-dag-recovery-playbook.md
|
|
250
|
+
loop-agent dag reconcile-run --run-id <run-id> # 只读检查 effectiveStatus 与恢复/收口资格
|
|
251
|
+
loop-agent dag reconcile-run --run-id <run-id> --action supersede --reason "..." # 显式保留证据并标记为任务已另行完成
|
|
252
|
+
loop-agent dag reconcile-run --run-id <run-id> --action abandon --reason "..." # 显式保留证据并收口为已放弃
|
|
249
253
|
loop-agent dag reconcile-tasks --glob '<pattern>' # 仅报告的 task/run/artifact/verify drift audit
|
|
250
254
|
loop-agent dag final-verification <task-id> # 生成 closeout DAG,closeout artifact 后再 final verify
|
|
251
255
|
loop-agent dag decision inspect --run-id <run-id> [--node-id <node-id>] # dry-run envelope 重解析;除 run 缺失外 exit 0
|
|
@@ -267,6 +271,7 @@ loop-agent dag resume --run-id <run-id> # approve 后继续
|
|
|
267
271
|
- 需 operator 关注的 run 用 `dag report --failed-only`、`--latest`、`--action <recovery-action>` 收窄。category→action 映射见 `docs/agent-dag-recovery-playbook.md`。
|
|
268
272
|
- 只读扫描 `.harness/dag-runs/` 下所有 run 的生命周期 health issue 与建议 action 用 `dag doctor`(`advisoryOnly: true`;不 mutate facts)。
|
|
269
273
|
- approve/resume 前用 `dag status --run-id <id>` 看单次 lifecycle、`approvalFlow`、`hasHumanApproval`。
|
|
274
|
+
- lifecycle、raw status 与 liveness 冲突时先用 `dag reconcile-run --run-id <id>` 只读检查。只有 runner 已证明停止且 operator 明确给出 `supersede|abandon` 与 reason 时才允许收口;它保存原始 state,不把未执行节点标成成功。
|
|
270
275
|
- task status、source/artifacts、DAG outcome、verification 记录可能 drift 时用 `dag reconcile-tasks --glob '<pattern>'`。默认仅报告;`--patch` 显式且不能伪造 verification evidence。
|
|
271
276
|
- 大型 PRD closeout 用 `dag final-verification <task-id>` 生成确定性 DAG,final verification 在 closeout artifact 创建之后。
|
|
272
277
|
- 从 run facts dry-run envelope 解析用 `dag decision inspect|validate`;`validate` 在无效 envelope 时 exit 1;永不自动 resume/retry。
|
|
@@ -379,6 +384,14 @@ loop-agent knowledge curate --markdown --output docs/reports/<task-id>-learned-p
|
|
|
379
384
|
agent-worker task validate <task.yaml> # 三层校验 TaskSpec,输出 JSON
|
|
380
385
|
agent-worker task explain-profile <task.yaml> # 解释业务 type/risk -> DAG governance profile 映射
|
|
381
386
|
agent-worker task validate-feature <feature-dir> # 校验完整 feature packet 的验收、依赖、TaskSpec 和验证命令
|
|
387
|
+
agent-worker feature review --feature-dir <feature-dir> --repo <repo-root> [--json]
|
|
388
|
+
agent-worker feature run --feature-dir <feature-dir> --repo <repo-root> [--dry-run] [--git-mode checkpoint] [--keep-failed-diff] [--json]
|
|
389
|
+
agent-worker feature verify-final --feature-dir <feature-dir> --repo <repo-root> --task-id <qa-execute-id> [--json]
|
|
390
|
+
agent-worker feature delivery --feature-dir <feature-dir> --repo <repo-root> --qa-evidence <path> --final-verification <path> [--waivers <path>] [--dry-run] [--json]
|
|
391
|
+
agent-worker feature closeout --feature-dir <feature-dir> --repo <repo-root> [--apply --owner <owner>] [--json]
|
|
392
|
+
agent-worker report metrics --repo <repo-root> --month <YYYY-MM> [--json]
|
|
393
|
+
agent-worker task draft-followup <task-id> --worker-run-id <id> --feature-dir <feature-dir> --repo <repo-root> [--json]
|
|
394
|
+
agent-worker feature approve-followup --feature-dir <feature-dir> --followup-id <id> --repo <repo-root> --owner <owner> [--dry-run] [--json]
|
|
382
395
|
agent-worker task retry <task-id> --repo <repo-root> [--reason "<已修复的原因>"]
|
|
383
396
|
agent-worker batch run-ready \
|
|
384
397
|
--feature-dir <feature-dir> \ # 含 tasks/task-graph.yaml
|
|
@@ -401,6 +414,14 @@ agent-worker observe snapshot --repo <repo-root> # 输出 GlobalSnapshot JSON
|
|
|
401
414
|
- Worker runtime state 落在目标 repo 的 `.harness/task-pool/`(artifacts、JSONL/state、晨报、failure handoffs)。自 0.8.0 起该目录是唯一受支持的 Task Pool runtime root;旧路径不读取、不迁移、不合并、不重映射。
|
|
402
415
|
- preflight 在 `new-task` 前跑 `loop-agent --version`、`inspect`、`docs-audit`、`git status --short --branch`,可选 `--check-repo`。一次夜间批处理期间不升级控制器,记录实际 `loop-agent` 版本。
|
|
403
416
|
- `batch run-ready` 默认在 stderr 输出人类可读进度(批次起止、每个 task 的阶段与耗时、report 决策),stdout 只保留最终 JSON,便于管道取用;加 `--quiet` 可关闭进度。
|
|
417
|
+
- `feature review` 只读派生 Feature 状态、required AC 覆盖、阻塞、证据和唯一下一步。默认输出简洁的人类摘要,`--json` 输出 schemaVersion 1 JSON;损坏事实会显式降级,不会写 Feature Packet 或 Task Pool。
|
|
418
|
+
- `feature run` 薄编排 validation、preflight、现有 run-ready、morning report、Observe snapshot 和最终 review。`--dry-run` 零写入;Git checkpoint 可用前单次最多推进一个 Ready 写任务。
|
|
419
|
+
- `feature run` 遇到业务 Task 失败时仍刷新证据,但返回 `needs-action` 和非零退出码;无 Ready 是正常结果,并通过 `noReadyReason` 说明 Closed、Deliverable、AwaitingQA、NeedsAction、依赖阻塞或空 Feature。
|
|
420
|
+
- `feature run --git-mode checkpoint` 是唯一 checkpoint 授权:要求 clean repo,在本地 `agent/<feature-id>` 分支按成功 Task commit;失败先保存 patch/untracked/boundary audit 再恢复 clean。默认不 commit;从不 stash/push/merge/创建远程 PR。`--keep-failed-diff` 会停止 Feature,不继续后续 Task。
|
|
421
|
+
- `feature verify-final` 在 clean Delivery HEAD 上复用已完成的 `qa-execute` TaskSpec 运行独立 DAG,跳过 promotion/closeout,原子生成 canonical QA aggregate 和 HEAD-bound final verification;相同 HEAD 的 canonical 成功 run 可幂等复用。
|
|
422
|
+
- `feature delivery` 复用 transaction record,校验 Git history/trailers/changed files、成功 run、canonical QA/final verification 和 required AC,原子生成 manifest、coverage 与 `PR.md`;`--dry-run` 零写入。`feature closeout` 默认只读复验全部 gates,显式 `--apply --owner` 才原子写回,stale facts 或 post-validation 失败会整体回滚。
|
|
423
|
+
- `report metrics` 按 UTC 月去重投影 Feature/Failure/Follow-up/Delivery/AC/decision/recovery/boundary 指标,同时写 JSON 与 Markdown;每项保留 numerator、denominator、sampleSize 和 missingData。
|
|
424
|
+
- `task draft-followup` 会按全部 failure category 生成 TaskDraft 或人工行动卡:ProductBug/TestBug/FlakyTest/DependencyFailure 可批准;EnvFailure 连续两次后才生成 ENV-CHECK;Spec/Contract/Risk/Human/Unknown 只给行动卡。人工以 `feature approve-followup --dry-run` 预览,再带非空 `--owner` 批准 TaskDraft;行动卡不能批准。批准在 staging validation 后写 TaskSpec、graph、Ready/approval/event,原失败事实不改写,并有 rename/state/approval/index/event 回滚门禁。
|
|
404
425
|
- `task retry` 是失败 Task 的唯一重试入口。它会保留原有运行记录和 failure handoff,并让下一次 `batch run-ready` 使用新的 `workerRunId`;不要删除运行态文件或手动修改状态来重试。
|
|
405
426
|
- `observe serve` 是独立于执行过程的本地只读看板,默认监听 `127.0.0.1:8787`;`observe snapshot` 只输出同一份运行态快照 JSON。两者都不会启动、暂停或重试 Task / Worker / DAG。
|
|
406
427
|
- 当前 Worker 仍是 v0(库 + CLI + dogfood),未接入定时/CI 驱动;`report morning` 只能从已有 Task Pool runs 汇总。
|
|
@@ -7,11 +7,12 @@
|
|
|
7
7
|
`harness.json.workflowPolicy` 现声明 Agent DAG 为首选 implementation workflow:
|
|
8
8
|
|
|
9
9
|
- `defaultImplementationWorkflow=agent-dag`
|
|
10
|
-
- `dag.defaultEntry=dag run-task`
|
|
11
|
-
- `dag.
|
|
10
|
+
- `dag.defaultEntry=dag run-task`
|
|
11
|
+
- `dag.outputLanguage=zh-CN`;未配置时也默认中文,显式设为 `en` 可切换英文
|
|
12
|
+
- `dag.profileRouting`:`minimal|standard -> standard-dag`,`reviewed -> review-gated-dag`,`supervised -> supervised-implementation`
|
|
12
13
|
- `humanGatePolicy.defaultMode=record-only`;需求不清、架构/公共契约风险、凭据/费用/部署风险、重复 gate failure 或高风险决策时升级人工介入
|
|
13
14
|
|
|
14
|
-
此 policy 驱动 `dag run-task --profile auto`:CLI 仍要求显式 `dag run-task`、`dag validate`、`run-dag`,但 `--profile auto` 在确定性 candidate `governanceProfile` 推断后应用 `workflowPolicy.dag.profileRouting
|
|
15
|
+
此 policy 驱动 `dag run-task --profile auto`:CLI 仍要求显式 `dag run-task`、`dag validate`、`run-dag`,但 `--profile auto` 在确定性 candidate `governanceProfile` 推断后应用 `workflowPolicy.dag.profileRouting`。生成器还会把 `outputLanguage` 写入 DagSpec,runner 在每个 Pi/Cursor 节点 prompt 中注入语言规则;代码、命令、路径、JSON 字段与 gate token 保持原样。`humanGatePolicy` 是默认人机边界声明;真实暂停仍由 DAG 节点的 `decisionGate.mode: "pause-on-human"` 与 decision envelope 触发。无 profile 的 `dag run-task <task-id>` 仍为 standard-compatible,供 legacy/review workflow。
|
|
15
16
|
|
|
16
17
|
### DAG workflow 层级
|
|
17
18
|
|