@tea-agent/loop-agent 0.43.0-next.18 → 0.43.0-next.19

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 (161) hide show
  1. package/AGENTS.md +1 -1
  2. package/CHANGELOG.md +60 -2308
  3. package/README.md +7 -0
  4. package/dist/application/task-lifecycle/advance.js +38 -7
  5. package/dist/build-stamp.json +3 -3
  6. package/dist/commands/init.js +13 -9
  7. package/dist/commands/task-advance.js +32 -0
  8. package/dist/executors/dag-pi-executor.js +1615 -188
  9. package/dist/executors/pi-executor.js +85 -3
  10. package/dist/executors/pi-sdk-executor.js +18 -0
  11. package/dist/executors/shell-executor.js +92 -7
  12. package/dist/shared/backend-dogfood-preflight.js +47 -0
  13. package/dist/shared/dag-failure-category.js +3 -0
  14. package/dist/shared/operator/capabilities.js +180 -0
  15. package/dist/task/config-types.js +29 -0
  16. package/dist/task/contract/project.js +9 -0
  17. package/dist/task/contract/schema.js +17 -0
  18. package/dist/task/source-prepare/build-draft.js +60 -0
  19. package/dist/worker/console/chat/pi-mode-loop-isolation.js +155 -0
  20. package/dist/worker/console/chat/pi-runtime/custom-tools/operator-tools.js +24 -16
  21. package/dist/worker/console/chat/pi-runtime/custom-tools/scheduled-goal-tools.js +22 -0
  22. package/dist/worker/console/chat/pi-runtime/progressive-tools.js +195 -0
  23. package/dist/worker/console/chat/pi-runtime.js +86 -27
  24. package/dist/worker/console/chat/routes.js +19 -0
  25. package/dist/worker/console/chat/scheduled-goal-booking.js +59 -0
  26. package/dist/worker/console/chat/scheduled-goal-delivery.js +27 -0
  27. package/dist/worker/console/chat/scheduled-goal-request.js +190 -0
  28. package/dist/worker/console/chat/session-mode.js +7 -3
  29. package/dist/worker/console/chat/session-store.js +42 -9
  30. package/dist/worker/console/chat/tool-preview.js +115 -0
  31. package/dist/worker/console/chat/turn-order.js +13 -0
  32. package/dist/worker/console/chat/turn-process.js +32 -30
  33. package/dist/worker/console/operator-actions.js +50 -0
  34. package/dist/worker/console/prd-intake-bridge.js +54 -1
  35. package/dist/worker/console/scheduled-goal-host.js +98 -0
  36. package/dist/worker/console/scheduled-goal-operation-adapter.js +127 -0
  37. package/dist/worker/console/server.js +15 -0
  38. package/dist/worker/console/static/assets/{abnfDiagram-N423BO3Z-B_UDknhR.js → abnfDiagram-N423BO3Z-8-j6y-sd.js} +1 -1
  39. package/dist/worker/console/static/assets/{arc-D6hU0drN.js → arc-eoQiMvuk.js} +1 -1
  40. package/dist/worker/console/static/assets/{architectureDiagram-T3A2C74G-DmVikdRK.js → architectureDiagram-T3A2C74G-C4A3uMcI.js} +1 -1
  41. package/dist/worker/console/static/assets/{blockDiagram-VBNYF7ZC-DydABCRg.js → blockDiagram-VBNYF7ZC-D4zD2F-Q.js} +1 -1
  42. package/dist/worker/console/static/assets/{c4Diagram-5PPSVZJV-DrXKC2Jl.js → c4Diagram-5PPSVZJV-j1RkJziL.js} +1 -1
  43. package/dist/worker/console/static/assets/channel-ChE7y-cx.js +1 -0
  44. package/dist/worker/console/static/assets/{chunk-2GRJ4B5K-D2-qFxr7.js → chunk-2GRJ4B5K-YBHmhik1.js} +1 -1
  45. package/dist/worker/console/static/assets/{chunk-2Q5K7J3B-ChfeF41P.js → chunk-2Q5K7J3B-COfWyo9P.js} +1 -1
  46. package/dist/worker/console/static/assets/{chunk-5RXB4S5H-Drwrz55x.js → chunk-5RXB4S5H-I99OUkHY.js} +1 -1
  47. package/dist/worker/console/static/assets/{chunk-5VM5RSS4-CAQGErL7.js → chunk-5VM5RSS4-XKxoJNJ4.js} +1 -1
  48. package/dist/worker/console/static/assets/{chunk-6Q2QTUOP-DHO38w5U.js → chunk-6Q2QTUOP-DLT_cYx1.js} +1 -1
  49. package/dist/worker/console/static/assets/{chunk-GF5L2VYU-EYIN0EOI.js → chunk-GF5L2VYU-CxcKZ9mV.js} +1 -1
  50. package/dist/worker/console/static/assets/{chunk-JWPE2WC7-CrFLKqkT.js → chunk-JWPE2WC7-V1EqXdjY.js} +1 -1
  51. package/dist/worker/console/static/assets/{chunk-KBJHAD2P-DMchffoo.js → chunk-KBJHAD2P-DebTtdFp.js} +1 -1
  52. package/dist/worker/console/static/assets/{chunk-RYQCIY6F-DaSvtKQa.js → chunk-RYQCIY6F-B-ivNRDf.js} +1 -1
  53. package/dist/worker/console/static/assets/{chunk-XXDRQBXY-DcW8W9Qj.js → chunk-XXDRQBXY-DC_Ds11b.js} +1 -1
  54. package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-C01TCf2X.js +1 -0
  55. package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-C01TCf2X.js +1 -0
  56. package/dist/worker/console/static/assets/{cose-bilkent-JH36ORCC-BUirrMEi.js → cose-bilkent-JH36ORCC-sWEqKwIb.js} +1 -1
  57. package/dist/worker/console/static/assets/{cynefin-VYW2F7L2-BXzO8iXR.js → cynefin-VYW2F7L2-BXa_dcu4.js} +1 -1
  58. package/dist/worker/console/static/assets/{cynefinDiagram-MW4NZA55-DAtgaxIn.js → cynefinDiagram-MW4NZA55-C-Mle84F.js} +1 -1
  59. package/dist/worker/console/static/assets/{dagre-VZM6K2ZE-C1re9Noh.js → dagre-VZM6K2ZE-CXPDBITe.js} +1 -1
  60. package/dist/worker/console/static/assets/{diagram-7IWD3JNH-N8Kj08J9.js → diagram-7IWD3JNH-CC-WJQfa.js} +1 -1
  61. package/dist/worker/console/static/assets/{diagram-B4RE2ZJO-D6BpSLs3.js → diagram-B4RE2ZJO-CDAV5Vs4.js} +1 -1
  62. package/dist/worker/console/static/assets/{diagram-LBJQPF4R-C2Vlgnl4.js → diagram-LBJQPF4R-CmFiAcNz.js} +1 -1
  63. package/dist/worker/console/static/assets/{diagram-Q27KOJAE-CMbqtVLS.js → diagram-Q27KOJAE-DPBZHuyn.js} +1 -1
  64. package/dist/worker/console/static/assets/{diagram-UB23O5K3-A770Eb-0.js → diagram-UB23O5K3-jUlm_Ds3.js} +1 -1
  65. package/dist/worker/console/static/assets/{ebnfDiagram-BXEA7PRR-LV2w_2pT.js → ebnfDiagram-BXEA7PRR-DWhQ3mfY.js} +1 -1
  66. package/dist/worker/console/static/assets/{erDiagram-JOGREHBK-bwqf56ah.js → erDiagram-JOGREHBK-Tr2gMqet.js} +1 -1
  67. package/dist/worker/console/static/assets/{flowDiagram-UKHOOZJN-BnVtHhZh.js → flowDiagram-UKHOOZJN-DJjVQHPA.js} +1 -1
  68. package/dist/worker/console/static/assets/{ganttDiagram-PKOTCBZU-BGVToEqc.js → ganttDiagram-PKOTCBZU-D74dQ4u0.js} +1 -1
  69. package/dist/worker/console/static/assets/{gitGraphDiagram-DS77QQ5N-DL2l7Vne.js → gitGraphDiagram-DS77QQ5N-DwW0tZ0X.js} +1 -1
  70. package/dist/worker/console/static/assets/index-BWkIfcrK.css +1 -0
  71. package/dist/worker/console/static/assets/{index-B_V4wvXs.js → index-Cdkvw_H6.js} +97 -97
  72. package/dist/worker/console/static/assets/{infoDiagram-6WML65LV-BWIpubOx.js → infoDiagram-6WML65LV-ILCbxJyb.js} +1 -1
  73. package/dist/worker/console/static/assets/{ishikawaDiagram-WSZJBQD7-DjYBD8vv.js → ishikawaDiagram-WSZJBQD7-DeuWBQ89.js} +1 -1
  74. package/dist/worker/console/static/assets/{journeyDiagram-NVQOT4AX-C0_mBaHb.js → journeyDiagram-NVQOT4AX-CF5ih8Fk.js} +1 -1
  75. package/dist/worker/console/static/assets/{kanban-definition-27J2QSJJ-Cy71zbX6.js → kanban-definition-27J2QSJJ-C7yOSuRO.js} +1 -1
  76. package/dist/worker/console/static/assets/{linear-Dt3_w3Vn.js → linear-BDZ9riWi.js} +1 -1
  77. package/dist/worker/console/static/assets/{mermaid.core-DnNOlfEP.js → mermaid.core-7pKqYtpZ.js} +5 -5
  78. package/dist/worker/console/static/assets/{mindmap-definition-FAOFIHXS-DAbTspwq.js → mindmap-definition-FAOFIHXS-LeJDybSU.js} +1 -1
  79. package/dist/worker/console/static/assets/{pegDiagram-VL7TDLO6-NNiM141p.js → pegDiagram-VL7TDLO6-BJvT3pMD.js} +1 -1
  80. package/dist/worker/console/static/assets/{pieDiagram-7S7Q4E2Y-CN80Z1Do.js → pieDiagram-7S7Q4E2Y-_rGqpMan.js} +1 -1
  81. package/dist/worker/console/static/assets/{quadrantDiagram-CIZ2JOQS-Bxyfh0JU.js → quadrantDiagram-CIZ2JOQS-DPcSv5aA.js} +1 -1
  82. package/dist/worker/console/static/assets/{railroadDiagram-AXF67PYL-BlWnC79M.js → railroadDiagram-AXF67PYL-Drxx4hkJ.js} +1 -1
  83. package/dist/worker/console/static/assets/{requirementDiagram-LRYGKXZP-BrEu4P_e.js → requirementDiagram-LRYGKXZP-BCTUdU4z.js} +1 -1
  84. package/dist/worker/console/static/assets/{sankeyDiagram-W5VNT64P-Bt70igBr.js → sankeyDiagram-W5VNT64P-B6wzbZmB.js} +1 -1
  85. package/dist/worker/console/static/assets/{sequenceDiagram-SI44F4Z6-C8DQR-r9.js → sequenceDiagram-SI44F4Z6-BGt8d3QQ.js} +1 -1
  86. package/dist/worker/console/static/assets/{sizeCapture-X5ZJPWSS-DEMinJAT.js → sizeCapture-X5ZJPWSS-7nlhJKo7.js} +1 -1
  87. package/dist/worker/console/static/assets/{stateDiagram-OKZ733FA-DDdDBzQc.js → stateDiagram-OKZ733FA-Cv2stqMA.js} +1 -1
  88. package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-DC7V5vcq.js +1 -0
  89. package/dist/worker/console/static/assets/{swimlanes-SLNWSIFB-G2wcBs3T.js → swimlanes-SLNWSIFB-qDAo4Yc1.js} +2 -2
  90. package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-Bwy4QUTO.js +8 -0
  91. package/dist/worker/console/static/assets/{timeline-definition-Z64GVDOM-Dzn4g2gJ.js → timeline-definition-Z64GVDOM-CKbDNKTr.js} +1 -1
  92. package/dist/worker/console/static/assets/{vennDiagram-T6HMQDX7-5v2rP9oO.js → vennDiagram-T6HMQDX7-DI-9EHic.js} +1 -1
  93. package/dist/worker/console/static/assets/{wardleyDiagram-T6FBY63Y-B4EOx7ew.js → wardleyDiagram-T6FBY63Y-BrzzRDpX.js} +1 -1
  94. package/dist/worker/console/static/assets/{xychartDiagram-ELKLHX3M-CQ1v8eYP.js → xychartDiagram-ELKLHX3M-BclH5hGh.js} +1 -1
  95. package/dist/worker/console/static/index.html +2 -2
  96. package/dist/worker/console/static-src/operator-chat/chat-sse-events.js +41 -11
  97. package/dist/worker/console/static-src/operator-chat/compaction-message.js +3 -17
  98. package/dist/worker/console/static-src/operator-chat/timeline-merge.js +29 -0
  99. package/dist/worker/console/static-src/operator-chat/useChatThread.js +2 -5
  100. package/dist/worker/console/workspace-context.js +11 -0
  101. package/dist/worker/observe/static/operator-chrome.js +3 -1
  102. package/dist/worker/scheduler/scheduled-goal-dispatch.js +117 -0
  103. package/dist/worker/scheduler/scheduled-goal-evidence.js +167 -0
  104. package/dist/worker/scheduler/scheduled-goal-recovery.js +62 -0
  105. package/dist/worker/scheduler/scheduled-goal-store.js +699 -0
  106. package/dist/worker/scheduler/scheduled-goal-supervisor.js +132 -0
  107. package/dist/worker/scheduler/scheduled-goal-time.js +102 -0
  108. package/dist/worker/scheduler/scheduled-goal-types.js +95 -0
  109. package/dist/workflows/dag/backend-test-markdown-workflow.js +6 -24
  110. package/dist/workflows/dag/backend-test-plan-protocol.js +82 -5
  111. package/dist/workflows/dag/dag-retry-schema.js +11 -0
  112. package/dist/workflows/dag/frontend-closeout.js +4 -2
  113. package/dist/workflows/dag/frontend-committed-facts.js +461 -0
  114. package/dist/workflows/dag/frontend-durable-tools.js +15 -3
  115. package/dist/workflows/dag/frontend-implementation-contract.js +365 -8
  116. package/dist/workflows/dag/frontend-plan-canary.js +53 -0
  117. package/dist/workflows/dag/frontend-plan-decision-contract.js +803 -0
  118. package/dist/workflows/dag/frontend-plan-render.js +0 -2
  119. package/dist/workflows/dag/frontend-prewrite-gate.js +3 -3
  120. package/dist/workflows/dag/frontend-provider-capability-matrix.js +8 -61
  121. package/dist/workflows/dag/frontend-recovery-run.js +57 -0
  122. package/dist/workflows/dag/frontend-review-context.js +43 -70
  123. package/dist/workflows/dag/frontend-risk.js +92 -10
  124. package/dist/workflows/dag/frontend-session-budget.js +117 -3
  125. package/dist/workflows/dag/frontend-shape.js +11 -55
  126. package/dist/workflows/dag/frontend-test-execution-evidence.js +35 -10
  127. package/dist/workflows/dag/frontend-typed-event-store.js +32 -25
  128. package/dist/workflows/dag/frontend-verification-trace.js +11 -2
  129. package/dist/workflows/dag/frontend-writer-admission.js +3 -47
  130. package/dist/workflows/dag/frontend-writer-status.js +0 -23
  131. package/dist/workflows/dag/init-hybrid.js +182 -185
  132. package/dist/workflows/dag/lifecycle.js +7 -2
  133. package/dist/workflows/dag/node-execution.js +48 -13
  134. package/dist/workflows/dag/rerun-plan.js +10 -0
  135. package/dist/workflows/dag/rerun-task.js +77 -1
  136. package/dist/workflows/dag/retry-policy.js +18 -0
  137. package/dist/workflows/dag/scheduler.js +2 -4
  138. package/dist/workflows/dag/types.js +23 -0
  139. package/docs/README.md +1 -0
  140. package/docs/init-surface.manifest.json +1 -0
  141. package/docs/operations/README.md +2 -0
  142. package/docs/templates/README.md +1 -1
  143. package/docs/templates/agent-dag.schema.json +2 -2
  144. package/docs/templates/backend-test-dag.json +14 -10
  145. package/docs/templates/frontend-implementation-contract.schema.json +0 -7
  146. package/docs/templates/frontend-implementation-dag.json +8 -9
  147. package/package.json +6 -3
  148. package/skills/frontend-bounded-implement/SKILL.md +3 -4
  149. package/skills/frontend-design-review/SKILL.md +7 -12
  150. package/skills/frontend-design-review/references/review-checklist.md +7 -7
  151. package/skills/frontend-plan/SKILL.md +8 -18
  152. package/skills/frontend-plan/references/decision-contract.md +19 -26
  153. package/skills/frontend-review/SKILL.md +21 -25
  154. package/skills/frontend-review/references/review-findings.md +48 -24
  155. package/dist/worker/console/static/assets/channel-Drecd94a.js +0 -1
  156. package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-8Udu0t8-.js +0 -1
  157. package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-8Udu0t8-.js +0 -1
  158. package/dist/worker/console/static/assets/index-DcudonhZ.css +0 -1
  159. package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-CyCiS0Lt.js +0 -1
  160. package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-U0lhi6N0.js +0 -8
  161. package/dist/workflows/dag/frontend-shadow-dual-write.js +0 -975
package/README.md CHANGED
@@ -126,6 +126,13 @@ agent-worker console doctor --repo .
126
126
 
127
127
  ```
128
128
 
129
+ Console Chat 支持直接用自然语言预约工作流,例如:“请预约3分钟后检查当前项目的Git状态,汇总修改文件,不修改业务文件,结果发回当前对话。”服务在当前项目目录准备任务,生成真实预约卡;核对时间、范围和验收后点击“确认预约”,后台执行并把结果关联回原对话。相对延时从准备完成起算,以卡片显示的准确时间为准。预约要求当前目录与已提交 HEAD 一致,确认后若基线或文件变化则停止启动;执行产生的改动留在当前目录,无需另行合并。测试类报告交付可以包含业务失败,不等同于全部用例通过。取消停止后续启动,已执行事实与报告保留。
130
+
131
+ 预约任务的完整列表与验收详情位于 **Console → 观测 → 定时任务**;Chat保留简洁确认卡和「查看执行」入口。
132
+
133
+ 预约由 Console 进程持有,关闭浏览器不停止后台工作;退出 Console、系统休眠或断电不能保证准点执行。需要夜间运行时,由当前用户的 OS 服务管理器保持 Console 可用,使用固定版本和明确的工作目录/环境,避免运行期间升级。恢复后按冻结的最晚启动、授权到期和错过时间策略处理;未知运行不会自动重发。目标项目 `init` 不安装服务,也不复制凭据。
134
+
135
+
129
136
  裸 `agent-worker console` 不在终端询问升级。操作 → 设置提供非阻塞的「更新并初始化」入口,默认选择 npm `latest` 稳定版,也可由操作者显式选择 `next` 预发布版;更新前会先检查活跃运行和全局安装来源。`console doctor`、帮助和版本命令均不触发更新检查。
130
137
 
131
138
  访问 Console <http://127.0.0.1:8790/>;**Operator Chat Official** 是 Console 内的主引导交互,默认打开「对话」工作区。构建时设置 `VITE_OPERATOR_CHAT_DEFAULT_LANDING=tasks` 可改回 Tasks;URL hash(`#/tasks`)与 localStorage 仍优先于默认值。顶部「检视」以及 `/inspect/` 提供只读 Dashboard、DAG、时间线与 artifacts;`loop-agent …` / `agent-worker …` CLI direct path 仍是受治理 fallback。当前状态为 **code ready, dogfood pending/unmet**,不宣称已替代 openCode 或其他外部主会话。
@@ -271,6 +271,17 @@ function nextMutationAction(actions) {
271
271
  }
272
272
  return actions[0] ?? null;
273
273
  }
274
+ /**
275
+ * True when a create-task step lost a create race: `createTask` refuses an id
276
+ * that another writer created between our lifecycle snapshot and the create
277
+ * call. That is not a failure of intent (the id exists), so the advance
278
+ * re-observes instead of aborting — Console issues `newTask` and `importPrd`
279
+ * back to back and used to lose the whole intake when newTask landed first.
280
+ */
281
+ export function isConcurrentTaskCreateError(taskId, error) {
282
+ const message = error instanceof Error ? error.message : String(error);
283
+ return message.startsWith(`task already exists: ${taskId}`);
284
+ }
274
285
  export async function advanceTaskLifecycle(input) {
275
286
  const completed = [];
276
287
  const blockers = [];
@@ -507,13 +518,24 @@ export async function advanceTaskLifecycle(input) {
507
518
  }
508
519
  if (action.type === "create-task") {
509
520
  if (!snapshot.exists) {
510
- await createTask(input.repoRoot, input.taskId, input.title, {
511
- taskKind: input.taskKind,
512
- taskKindExplicit: input.taskKindExplicit,
513
- });
514
- record = appendTransition(record, "task-created");
515
- completed.push("task-created");
516
- await saveLifecycleRecord(input.repoRoot, record);
521
+ try {
522
+ await createTask(input.repoRoot, input.taskId, input.title, {
523
+ taskKind: input.taskKind,
524
+ taskKindExplicit: input.taskKindExplicit,
525
+ });
526
+ record = appendTransition(record, "task-created");
527
+ completed.push("task-created");
528
+ await saveLifecycleRecord(input.repoRoot, record);
529
+ }
530
+ catch (error) {
531
+ // Lost create race: a concurrent writer (Console `newTask`
532
+ // issued alongside `importPrd`) created the same id between
533
+ // our snapshot and this call. The intent — this id exists and
534
+ // carries this PRD — is already satisfied, so fall through to
535
+ // the re-observe below instead of failing the advance.
536
+ if (!isConcurrentTaskCreateError(input.taskId, error))
537
+ throw error;
538
+ }
517
539
  }
518
540
  snapshot = await observeTaskLifecycle(input.repoRoot, input.taskId);
519
541
  continue;
@@ -663,6 +685,9 @@ export async function advanceTaskLifecycle(input) {
663
685
  allowedPaths: effectiveInput.allowedPaths,
664
686
  forbiddenPaths: input.forbiddenPaths,
665
687
  verifyCommands: effectiveInput.verifyCommands,
688
+ requirementOwnership: effectiveInput.requirementOwnership,
689
+ capabilityBoundary: effectiveInput.capabilityBoundary,
690
+ interactionIds: effectiveInput.interactionIds,
666
691
  backendTest: input.backendTest,
667
692
  },
668
693
  ...(sourceFidelity ? { sourceFidelity } : {}),
@@ -720,6 +745,9 @@ export async function advanceTaskLifecycle(input) {
720
745
  allowedPaths: effectiveInput.allowedPaths,
721
746
  forbiddenPaths: input.forbiddenPaths,
722
747
  verifyCommands: effectiveInput.verifyCommands,
748
+ requirementOwnership: effectiveInput.requirementOwnership,
749
+ capabilityBoundary: effectiveInput.capabilityBoundary,
750
+ interactionIds: effectiveInput.interactionIds,
723
751
  backendTest: input.backendTest,
724
752
  },
725
753
  });
@@ -741,6 +769,9 @@ export async function advanceTaskLifecycle(input) {
741
769
  allowedPaths: effectiveInput.allowedPaths,
742
770
  forbiddenPaths: input.forbiddenPaths,
743
771
  verifyCommands: effectiveInput.verifyCommands,
772
+ requirementOwnership: effectiveInput.requirementOwnership,
773
+ capabilityBoundary: effectiveInput.capabilityBoundary,
774
+ interactionIds: effectiveInput.interactionIds,
744
775
  backendTest: input.backendTest,
745
776
  },
746
777
  ...(sourceFidelity ? { sourceFidelity } : {}),
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "version": "0.43.0-next.18",
4
- "gitSha": "bc11e1415f26468377416cbd2142982dcc6e1dc8",
5
- "builtAt": "2026-09-12T15:10:11.966Z"
3
+ "version": "0.43.0-next.19",
4
+ "gitSha": "7caee615c6037ecebb14ceddd8e253135844dbbb",
5
+ "builtAt": "2026-09-14T00:48:12.692Z"
6
6
  }
@@ -861,19 +861,23 @@ function mergeGitignoreManagedBlock(existing, block) {
861
861
  return `${existing.trimEnd()}\n\n${block}\n`;
862
862
  }
863
863
  /**
864
- * Shared ignore rules for loop-agent runtime facts. The four directories are
865
- * local, rebuildable runtime surface: every developer runs loop-agent init
866
- * after cloning, so nothing inside them is team-shareable by default.
867
- * `scripts/` and `ai_workspace/loop-agent/` stay on the shared commit surface.
864
+ * Shared ignore rules for loop-agent init surface: everything init regenerates
865
+ * in the target project is local and rebuildable, so none of it is
866
+ * team-shareable by default. `AGENTS.md` and `README.md` stay on the shared
867
+ * commit surface (they carry the governance handoff and are not ignored);
868
+ * `.opencode/` and `.pi/` project adapters are left to the user's discretion.
868
869
  */
869
- export function buildManagedGitignoreBlock() {
870
+ export function buildManagedGitignoreBlock(governanceRoot = DEFAULT_GOVERNANCE_ROOT) {
870
871
  return [
871
872
  GITIGNORE_BLOCK_START,
872
- "# loop-agent runtime: local, rebuildable facts; do not ignore scripts/ or ai_workspace/loop-agent/",
873
+ "# loop-agent init surface: rebuildable outputs; AGENTS.md and README.md stay shared",
873
874
  ".harness/",
874
875
  ".agents/",
875
876
  ".task-pool/",
876
877
  ".worktrees/",
878
+ `${governanceRoot}/`,
879
+ "scripts/",
880
+ "harness.json",
877
881
  GITIGNORE_BLOCK_END,
878
882
  ].join("\n");
879
883
  }
@@ -1312,7 +1316,7 @@ async function buildDesiredSurfaceContent(input) {
1312
1316
  };
1313
1317
  }
1314
1318
  if (manifestPath === ".gitignore") {
1315
- return { content: buildManagedGitignoreBlock() };
1319
+ return { content: buildManagedGitignoreBlock(input.governanceRoot) };
1316
1320
  }
1317
1321
  if (manifestPath === "harness.json") {
1318
1322
  const template = await readJsonIfExists(path.join(input.assetRoot, "harness.json"));
@@ -2554,7 +2558,7 @@ export function buildInitInstructions(input) {
2554
2558
  "- Enrich the root `README.md`: keep the deterministic project title and the loop-agent managed block intact, and fill the human-authored sections (项目概览, 技术栈与目录结构, 开发与验证) from the target project's actual files. The root README must serve both as a human-first project entry and as an agent work entry; replace the initialization-model supplement comments when the project files provide the information.",
2555
2559
  `- Populate \`${governanceRoot}/verification-matrix.md\` with the target project's actual quick, standard, and full verification commands derived from its real language and toolchain, keeping the governance rows intact.`,
2556
2560
  "- Project repo-local skills live in `.agents/skills/`. Do not create a root `skills/` directory in the target project; the package's bundled `skills/` remains the built-in fallback.",
2557
- "- Merge a loop-agent managed block into `.gitignore` that ignores exactly the four local, rebuildable runtime directories (`.harness/`, `.agents/`, `.task-pool/`, `.worktrees/`) while keeping `scripts/` and `ai_workspace/loop-agent/` on the shared commit surface; keep all user rules outside the block untouched.",
2561
+ "- Merge a loop-agent managed block into `.gitignore` that ignores the full rebuildable init surface (`.harness/`, `.agents/`, `.task-pool/`, `.worktrees/`, `ai_workspace/loop-agent/`, `scripts/`, `harness.json`); keep `AGENTS.md` and `README.md` on the shared commit surface and keep all user rules outside the block untouched.",
2558
2562
  "- Do not copy examples by default; examples stay bundled in the tool and are available through `loop-agent examples`.",
2559
2563
  "- Add or update a loop-agent managed block in AGENTS.md.",
2560
2564
  "- The generated AGENTS.md must include documentation convergence and structured DAG write-boundary rules so target projects keep the same working discipline as this repository.",
@@ -2676,7 +2680,7 @@ export async function initializeLoopAgentProject(options) {
2676
2680
  await writeText({
2677
2681
  repoRoot,
2678
2682
  relativePath: ".gitignore",
2679
- content: mergeGitignoreManagedBlock(existingGitignore, buildManagedGitignoreBlock()),
2683
+ content: mergeGitignoreManagedBlock(existingGitignore, buildManagedGitignoreBlock(governanceRoot)),
2680
2684
  merge: true,
2681
2685
  written,
2682
2686
  skipped,
@@ -138,6 +138,35 @@ export function parseTaskAdvanceArgs(args) {
138
138
  options.verify = pushList(options.verify, next());
139
139
  continue;
140
140
  }
141
+ if (token === "--interaction-ids") {
142
+ options.interactionIds = pushList(options.interactionIds, next());
143
+ continue;
144
+ }
145
+ if (token === "--capability-boundary") {
146
+ try {
147
+ const parsed = JSON.parse(next());
148
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
149
+ throw new Error("not an object");
150
+ }
151
+ options.capabilityBoundary = parsed;
152
+ }
153
+ catch (error) {
154
+ throw new Error(`--capability-boundary must be a JSON object {allowed?, forbidden?}: ${error.message}`);
155
+ }
156
+ continue;
157
+ }
158
+ if (token === "--requirement-ownership") {
159
+ try {
160
+ const parsed = JSON.parse(next());
161
+ if (!Array.isArray(parsed))
162
+ throw new Error("not an array");
163
+ options.requirementOwnership = parsed;
164
+ }
165
+ catch (error) {
166
+ throw new Error(`--requirement-ownership must be a JSON array of {requirementIds, implementationFiles?, verificationFiles?}: ${error.message}`);
167
+ }
168
+ continue;
169
+ }
141
170
  if (token === "--verify-timeout") {
142
171
  options.verifyTimeout = pushList(options.verifyTimeout, next());
143
172
  continue;
@@ -326,6 +355,9 @@ export function toUseCaseInput(repoRoot, taskId, options, observer) {
326
355
  allowedPaths: options.allowedPaths,
327
356
  forbiddenPaths: options.forbiddenPaths,
328
357
  verifyCommands: verifyCommands.length > 0 ? verifyCommands : undefined,
358
+ requirementOwnership: options.requirementOwnership,
359
+ capabilityBoundary: options.capabilityBoundary,
360
+ interactionIds: options.interactionIds?.length ? options.interactionIds : undefined,
329
361
  backendTest: options.backendTest,
330
362
  approveGateToken: options.approveGate,
331
363
  rejectGateToken: options.rejectGate,