specrails-desktop 2.57.0 → 2.58.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (336) hide show
  1. package/README.md +1 -1
  2. package/cli/dist/args.js +10 -4
  3. package/cli/dist/help.js +1 -1
  4. package/client/dist/assets/{ActivityFeedPage-DdMNmVBk.js → ActivityFeedPage-BQGppIR0.js} +1 -1
  5. package/client/dist/assets/{AgentBrowserCapture-CeerUf--.js → AgentBrowserCapture-PI-cxyxi.js} +1 -1
  6. package/client/dist/assets/{AgentModeAnalyticsPane-BjGb-8rh.js → AgentModeAnalyticsPane-mQsOqdXx.js} +2 -2
  7. package/client/dist/assets/{AgentModeCodePane-8XRkQEo_.js → AgentModeCodePane-BL-vpmlY.js} +2 -2
  8. package/client/dist/assets/{AgentModeJobsPane-BN3dgJOA.js → AgentModeJobsPane-DR_06oqH.js} +1 -1
  9. package/client/dist/assets/AgentsPage-BKIKjm_1.js +118 -0
  10. package/client/dist/assets/{AnalyticsPage-CyfhYiBn.js → AnalyticsPage-069npRVo.js} +1 -1
  11. package/client/dist/assets/{CodePage-C2Nf-Q5W.js → CodePage-Alitorrv.js} +2 -2
  12. package/client/dist/assets/DesktopAnalyticsPage-qtWAPM47.js +1 -0
  13. package/client/dist/assets/{DocsDialog-Br3bczCp.js → DocsDialog-DwL6rgcT.js} +1 -1
  14. package/client/dist/assets/{DocsPage-BcDr2cBm.js → DocsPage-BA1hiJZ-.js} +1 -1
  15. package/client/dist/assets/{ExportDropdown-BVGKEgkd.js → ExportDropdown-BcMpvV89.js} +1 -1
  16. package/client/dist/assets/InteractiveJobComposer-B3H1YHr6.js +19 -0
  17. package/client/dist/assets/JobDetailModal-XZQ9eAAy.js +1 -0
  18. package/client/dist/assets/{JobDetailPage-vBbNeRuz.js → JobDetailPage-B-SIaq_q.js} +1 -1
  19. package/client/dist/assets/{JobsPage-CJCtPhIz.js → JobsPage-iQXAv2mx.js} +1 -1
  20. package/client/dist/assets/LoopBuilderPage-B_gbFAHn.js +1 -0
  21. package/client/dist/assets/LoopPreviewModal-je5pSCf-.js +1 -0
  22. package/client/dist/assets/LoopsPage-BZwcY5cu.js +2 -0
  23. package/client/dist/assets/{MinimizedChatsContext-D3QzgV0B.js → MinimizedChatsContext-CNx_0bZu.js} +1 -1
  24. package/client/dist/assets/{PluginsPage-DOpTV75p.js → PluginsPage-DFocnoHX.js} +2 -2
  25. package/client/dist/assets/{ProjectSettingsDialog-Dkwrn0z1.js → ProjectSettingsDialog-Bh3S6EBB.js} +1 -1
  26. package/client/dist/assets/{RepositoryDeliveries-Du2UCf1a.js → RepositoryDeliveries-BiwJuS8r.js} +1 -1
  27. package/client/dist/assets/{RepositoryScopeSelector-hPGZNRBm.js → RepositoryScopeSelector-C2mvWBQ6.js} +1 -1
  28. package/client/dist/assets/{ReviewPacketPage-DcOq-UTA.js → ReviewPacketPage-CrAf-WDy.js} +2 -2
  29. package/client/dist/assets/TemplatePreviewModal-C7DordpN.js +1 -0
  30. package/client/dist/assets/{TicketDetailModalContext-DAK-NoK6.js → TicketDetailModalContext-B-DySpKL.js} +1 -1
  31. package/client/dist/assets/{Trans-DEbgkuAY.js → Trans-D3AfDylf.js} +1 -1
  32. package/client/dist/assets/agentRuntime-BeUb3g9g.js +1 -0
  33. package/client/dist/assets/agentRuntime-Bg9tbmqm.js +1 -0
  34. package/client/dist/assets/agentRuntime-D-GJVGkj.js +1 -0
  35. package/client/dist/assets/agentRuntime-D2__CVI_.js +1 -0
  36. package/client/dist/assets/agentRuntime-D35dGVOP.js +1 -0
  37. package/client/dist/assets/agentRuntime-DGz_IqKW.js +1 -0
  38. package/client/dist/assets/agentRuntime-O1liDt6G.js +1 -0
  39. package/client/dist/assets/agentRuntime-hInH9Fzj.js +1 -0
  40. package/client/dist/assets/agentstudio-B2CTtQgZ.js +1 -0
  41. package/client/dist/assets/agentstudio-BWAKeGgB.js +1 -0
  42. package/client/dist/assets/{agentstudio-DR7doNBV.js → agentstudio-Cja8Sjcp.js} +1 -1
  43. package/client/dist/assets/agentstudio-DtfPcr99.js +1 -0
  44. package/client/dist/assets/agentstudio-QdAJIDef.js +1 -0
  45. package/client/dist/assets/agentstudio-X70BKf6u.js +1 -0
  46. package/client/dist/assets/agentstudio-fLXpRGIi.js +1 -0
  47. package/client/dist/assets/agentstudio-qXKqVnWS.js +1 -0
  48. package/client/dist/assets/{analytics-jzCkOec3.js → analytics-B1DIQd4m.js} +1 -1
  49. package/client/dist/assets/{analytics-CoEzWPx4.js → analytics-BAIZ9vE_.js} +1 -1
  50. package/client/dist/assets/{analytics-DjLlE7jS.js → analytics-BTqgmgBd.js} +1 -1
  51. package/client/dist/assets/analytics-BWynXPEm.js +1 -0
  52. package/client/dist/assets/{analytics-nZIjjtCc.js → analytics-DGcUsQ44.js} +1 -1
  53. package/client/dist/assets/{analytics-BNgZ1Nj7.js → analytics-GnSnpJ4W.js} +1 -1
  54. package/client/dist/assets/{analytics-DFh5lSOl.js → analytics-TWgYaoO0.js} +1 -1
  55. package/client/dist/assets/{analytics-DZp-DS2U.js → analytics-kJy6Tuko.js} +1 -1
  56. package/client/dist/assets/builder-C0FyvM83.js +1 -0
  57. package/client/dist/assets/builder-C1neIYGR.js +1 -0
  58. package/client/dist/assets/builder-CvnFm0im.js +1 -0
  59. package/client/dist/assets/builder-CzW5ovyI.js +1 -0
  60. package/client/dist/assets/builder-D06L7iPy.js +1 -0
  61. package/client/dist/assets/builder-DGETbtZj.js +1 -0
  62. package/client/dist/assets/builder-DXEJUlC0.js +1 -0
  63. package/client/dist/assets/builder-DyQperXU.js +1 -0
  64. package/client/dist/assets/common-BCK7c9Pv.js +1 -0
  65. package/client/dist/assets/common-C0BOdeNi.js +1 -0
  66. package/client/dist/assets/common-C4Yvvhp6.js +1 -0
  67. package/client/dist/assets/{common-BrlwEnL7.js → common-DmsclwjP.js} +1 -1
  68. package/client/dist/assets/common-DpLWwgI1.js +1 -0
  69. package/client/dist/assets/common-OCvl3c8t.js +1 -0
  70. package/client/dist/assets/common-c0aujEZC.js +1 -0
  71. package/client/dist/assets/common-od8WThlf.js +1 -0
  72. package/client/dist/assets/dashboard-B1ndRHuC.js +1 -0
  73. package/client/dist/assets/dashboard-BX7KXiqA.js +1 -0
  74. package/client/dist/assets/dashboard-B_BSNxcN.js +1 -0
  75. package/client/dist/assets/dashboard-CCeFN7-V.js +1 -0
  76. package/client/dist/assets/dashboard-CRl0WtFJ.js +1 -0
  77. package/client/dist/assets/dashboard-XGdQ5mjw.js +1 -0
  78. package/client/dist/assets/dashboard-_oltA6Jd.js +1 -0
  79. package/client/dist/assets/dashboard-bAuf5KVk.js +1 -0
  80. package/client/dist/assets/{formatDistanceToNow-Cc2u5FwQ.js → formatDistanceToNow-aBss1Nai.js} +1 -1
  81. package/client/dist/assets/{getTimezoneOffsetInMilliseconds-BHm2U-w1.js → getTimezoneOffsetInMilliseconds-DOGj1Mfz.js} +1 -1
  82. package/client/dist/assets/index-BS7KCWkV.css +2 -0
  83. package/client/dist/assets/{index-Cxb288Rj.js → index-C4Mv6tV6.js} +32 -32
  84. package/client/dist/assets/{jira-api-DrGxiD9p.js → jira-api-BYbEPlkr.js} +1 -1
  85. package/client/dist/assets/{jobs-DSp9DoD_.js → jobs-6_-r75yC.js} +1 -1
  86. package/client/dist/assets/{jobs-C6qmvUAi.js → jobs-B1yqyId5.js} +1 -1
  87. package/client/dist/assets/{jobs-DoFaEl9g.js → jobs-BFuV7ttH.js} +1 -1
  88. package/client/dist/assets/{jobs-DTQO08nJ.js → jobs-BKa8LuwA.js} +1 -1
  89. package/client/dist/assets/{jobs-DrF8Do8s.js → jobs-BKiK-ZWh.js} +1 -1
  90. package/client/dist/assets/{jobs-DLHdDkHc.js → jobs-DmKV7b7d.js} +1 -1
  91. package/client/dist/assets/{jobs-C9j2PuwW.js → jobs-KG4Sn12X.js} +1 -1
  92. package/client/dist/assets/{jobs-Dpw6AEOP.js → jobs-pPv4KWjb.js} +1 -1
  93. package/client/dist/assets/loop-layout-BF8xMiNv.js +7 -0
  94. package/client/dist/assets/loops-B4_D-nbg.js +1 -0
  95. package/client/dist/assets/loops-BJDY9FTh.js +1 -0
  96. package/client/dist/assets/loops-BO3V8244.js +1 -0
  97. package/client/dist/assets/loops-C-hZK8pf.js +1 -0
  98. package/client/dist/assets/loops-CDOWZ0ci.js +1 -0
  99. package/client/dist/assets/loops-Dv849ckF.js +1 -0
  100. package/client/dist/assets/loops-Q9LIgGkq.js +1 -0
  101. package/client/dist/assets/loops-eUnCfLjC.js +1 -0
  102. package/client/dist/assets/{project-repositories-9Wzs0coQ.js → project-repositories-CSnfzUpg.js} +1 -1
  103. package/client/dist/assets/settings-3o4Ntzi5.js +1 -0
  104. package/client/dist/assets/settings-B97jlkwD.js +1 -0
  105. package/client/dist/assets/settings-BTaT_bsS.js +1 -0
  106. package/client/dist/assets/settings-CT8w7WiC.js +1 -0
  107. package/client/dist/assets/settings-Cvr8_tvh.js +1 -0
  108. package/client/dist/assets/settings-Dn1qgAC8.js +1 -0
  109. package/client/dist/assets/settings-EShDdg4J.js +1 -0
  110. package/client/dist/assets/settings-tfLhQZRN.js +1 -0
  111. package/client/dist/assets/{setup-Dwzt5nO1.js → setup-CBMu3tqH.js} +1 -1
  112. package/client/dist/assets/{setup-B5FHuxvB.js → setup-CPh-e6J2.js} +1 -1
  113. package/client/dist/assets/{setup-DpqzaEEA.js → setup-CRKLp_ke.js} +1 -1
  114. package/client/dist/assets/{setup-CROyqD5N.js → setup-Cy302v4J.js} +1 -1
  115. package/client/dist/assets/{setup-C9Fy9PKQ.js → setup-D681vTPf.js} +1 -1
  116. package/client/dist/assets/{setup-BihzXadx.js → setup-DYK0VBkE.js} +1 -1
  117. package/client/dist/assets/{setup-BtC6Hg4K.js → setup-KAuiIiVs.js} +1 -1
  118. package/client/dist/assets/{setup-zLEDnG7N.js → setup-OGX-oCfI.js} +1 -1
  119. package/client/dist/assets/{spending-T5GM7wpn.js → spending-HBSk-6jv.js} +1 -1
  120. package/client/dist/assets/{useDesktop-QogiN0zR.js → useDesktop-0unHDBJJ.js} +1 -1
  121. package/client/dist/assets/useRuntimeRuns-BN1rhyEm.js +1 -0
  122. package/client/dist/assets/{useSharedWebSocket-Dz-HI6De.js → useSharedWebSocket-BZMrX4jr.js} +2 -2
  123. package/client/dist/index.html +25 -25
  124. package/docs/agent-live-steering.md +16 -0
  125. package/docs/cli.md +7 -7
  126. package/docs/codex.md +2 -2
  127. package/docs/customizing.md +1 -1
  128. package/docs/gemini.md +1 -1
  129. package/docs/getting-started.md +1 -1
  130. package/docs/guide/de/integrations/7-local-engines.md +1 -1
  131. package/docs/guide/de/pipeline/1-rails-and-jobs.md +8 -6
  132. package/docs/guide/de/pipeline/2-the-job-detail-view.md +11 -2
  133. package/docs/guide/de/pipeline/4-picking-an-engine-per-rail.md +2 -2
  134. package/docs/guide/de/pipeline/5-the-loop-builder.md +24 -5
  135. package/docs/guide/en/integrations/7-local-engines.md +1 -1
  136. package/docs/guide/en/pipeline/1-rails-and-jobs.md +8 -6
  137. package/docs/guide/en/pipeline/2-the-job-detail-view.md +11 -2
  138. package/docs/guide/en/pipeline/4-picking-an-engine-per-rail.md +2 -2
  139. package/docs/guide/en/pipeline/5-the-loop-builder.md +34 -5
  140. package/docs/guide/en/settings/3-pipeline-telemetry-and-diagnostics.md +1 -1
  141. package/docs/guide/es/integrations/7-local-engines.md +1 -1
  142. package/docs/guide/es/pipeline/1-rails-and-jobs.md +8 -6
  143. package/docs/guide/es/pipeline/2-the-job-detail-view.md +11 -2
  144. package/docs/guide/es/pipeline/4-picking-an-engine-per-rail.md +2 -2
  145. package/docs/guide/es/pipeline/5-the-loop-builder.md +30 -5
  146. package/docs/guide/es/settings/3-pipeline-telemetry-and-diagnostics.md +1 -2
  147. package/docs/guide/fr/integrations/7-local-engines.md +1 -1
  148. package/docs/guide/fr/pipeline/1-rails-and-jobs.md +8 -6
  149. package/docs/guide/fr/pipeline/2-the-job-detail-view.md +11 -2
  150. package/docs/guide/fr/pipeline/4-picking-an-engine-per-rail.md +2 -2
  151. package/docs/guide/fr/pipeline/5-the-loop-builder.md +24 -5
  152. package/docs/guide/it/integrations/7-local-engines.md +1 -1
  153. package/docs/guide/it/pipeline/1-rails-and-jobs.md +8 -6
  154. package/docs/guide/it/pipeline/2-the-job-detail-view.md +11 -2
  155. package/docs/guide/it/pipeline/4-picking-an-engine-per-rail.md +2 -2
  156. package/docs/guide/it/pipeline/5-the-loop-builder.md +24 -5
  157. package/docs/guide/ja/integrations/7-local-engines.md +1 -1
  158. package/docs/guide/ja/pipeline/1-rails-and-jobs.md +8 -6
  159. package/docs/guide/ja/pipeline/2-the-job-detail-view.md +11 -2
  160. package/docs/guide/ja/pipeline/4-picking-an-engine-per-rail.md +2 -2
  161. package/docs/guide/ja/pipeline/5-the-loop-builder.md +24 -5
  162. package/docs/guide/pt/integrations/7-local-engines.md +1 -1
  163. package/docs/guide/pt/pipeline/1-rails-and-jobs.md +8 -6
  164. package/docs/guide/pt/pipeline/2-the-job-detail-view.md +11 -2
  165. package/docs/guide/pt/pipeline/4-picking-an-engine-per-rail.md +2 -2
  166. package/docs/guide/pt/pipeline/5-the-loop-builder.md +24 -5
  167. package/docs/guide/zh/integrations/7-local-engines.md +1 -1
  168. package/docs/guide/zh/pipeline/1-rails-and-jobs.md +8 -6
  169. package/docs/guide/zh/pipeline/2-the-job-detail-view.md +11 -2
  170. package/docs/guide/zh/pipeline/4-picking-an-engine-per-rail.md +2 -2
  171. package/docs/guide/zh/pipeline/5-the-loop-builder.md +24 -5
  172. package/docs/internals/api-reference.md +2 -2
  173. package/docs/internals/ci-performance.md +71 -0
  174. package/docs/internals/companion-rails-as-loops-contract.md +4 -3
  175. package/docs/internals/configuration.md +3 -3
  176. package/docs/internals/core-runtime-updates.md +3 -2
  177. package/docs/internals/interactive-jobs.md +2 -2
  178. package/docs/internals/loop-step-log-explorer.md +42 -0
  179. package/docs/internals/mission-rail-cards.md +1 -1
  180. package/docs/internals/operations-runbook.md +22 -0
  181. package/docs/internals/programmatic-agent-runtime.md +130 -7
  182. package/docs/internals/project-builder.md +35 -16
  183. package/docs/internals/source-map.md +48 -2
  184. package/docs/kimi.md +2 -2
  185. package/docs/local-providers.md +1 -1
  186. package/docs/running-pipelines.md +26 -18
  187. package/docs/tracking-cost.md +10 -1
  188. package/package.json +2 -1
  189. package/server/dist/core-compat.js +8 -3
  190. package/server/dist/core-execution.js +49 -3
  191. package/server/dist/db/migrations.js +101 -0
  192. package/server/dist/desktop-db.js +28 -0
  193. package/server/dist/desktop-router.js +2 -0
  194. package/server/dist/mcp/guide.js +6 -3
  195. package/server/dist/mcp/tools/jobs.js +14 -1
  196. package/server/dist/mcp/tools/loops.js +17 -8
  197. package/server/dist/mcp/tools/rails.js +3 -3
  198. package/server/dist/modules/agent-runtime/runtime/agent-runtime-bridge.js +313 -9
  199. package/server/dist/modules/agent-runtime/runtime/agent-runtime-controls-router.js +34 -1
  200. package/server/dist/modules/agent-runtime/runtime/agent-runtime-controls.js +203 -21
  201. package/server/dist/modules/agent-runtime/runtime/agent-runtime-effective-config.js +46 -1
  202. package/server/dist/modules/agent-runtime/runtime/agent-runtime-engines.js +10 -0
  203. package/server/dist/modules/agent-runtime/runtime/agent-runtime-loader.js +68 -3
  204. package/server/dist/modules/agent-runtime/runtime/agent-runtime-metrics.js +16 -8
  205. package/server/dist/modules/agent-runtime/runtime/agent-runtime-package-gc.js +81 -0
  206. package/server/dist/modules/agent-runtime/runtime/agent-runtime-package-lock.js +37 -0
  207. package/server/dist/modules/agent-runtime/runtime/agent-runtime-package.js +30 -24
  208. package/server/dist/modules/agent-runtime/runtime/agent-runtime-retention-host.js +87 -0
  209. package/server/dist/modules/agent-runtime/runtime/agent-runtime-retention-quarantine.js +231 -0
  210. package/server/dist/modules/agent-runtime/runtime/agent-runtime-retention-records.js +32 -0
  211. package/server/dist/modules/agent-runtime/runtime/agent-runtime-retention.js +102 -0
  212. package/server/dist/modules/agent-runtime/runtime/agent-runtime-settings-router.js +12 -7
  213. package/server/dist/modules/agent-runtime/runtime/agent-runtime-settings.js +57 -13
  214. package/server/dist/modules/agents/runtime/agent-catalog.js +32 -0
  215. package/server/dist/modules/agents/runtime/agent-refine-manager.js +12 -0
  216. package/server/dist/modules/agents/runtime/agent-role-descriptor.js +64 -0
  217. package/server/dist/modules/agents/runtime/profiles-router.js +26 -34
  218. package/server/dist/modules/builder/runtime/milestone-chain.js +121 -73
  219. package/server/dist/modules/delivery/runtime/definition-fork.js +158 -0
  220. package/server/dist/modules/delivery/runtime/delivery-evidence.js +56 -10
  221. package/server/dist/modules/delivery/runtime/isolated-settlement-reconstruction.js +99 -0
  222. package/server/dist/modules/delivery/runtime/isolated-settlement-store.js +53 -0
  223. package/server/dist/modules/delivery/runtime/multi-repo-execution-store.js +3 -1
  224. package/server/dist/modules/delivery/runtime/rail-isolated-launch.js +388 -203
  225. package/server/dist/modules/delivery/runtime/rail-launch-parser.js +3 -2
  226. package/server/dist/modules/delivery/runtime/rail-pr-store.js +6 -1
  227. package/server/dist/modules/delivery/runtime/rails-router.js +66 -10
  228. package/server/dist/modules/execution/runtime/queue-manager.js +11 -2
  229. package/server/dist/modules/loops/runtime/builtin-loops.js +70 -0
  230. package/server/dist/modules/loops/runtime/definition-cancellation.js +31 -0
  231. package/server/dist/modules/loops/runtime/legacy-launch-telemetry.js +78 -0
  232. package/server/dist/modules/loops/runtime/loop-command-catalog.js +13 -12
  233. package/server/dist/modules/loops/runtime/loop-compat.js +219 -0
  234. package/server/dist/modules/loops/runtime/loop-core-factory.js +42 -0
  235. package/server/dist/modules/loops/runtime/loop-definition-controls.js +48 -0
  236. package/server/dist/modules/loops/runtime/loop-definition-events.js +145 -0
  237. package/server/dist/modules/loops/runtime/loop-definition-recovery.js +106 -0
  238. package/server/dist/modules/loops/runtime/loop-definition-run.js +36 -0
  239. package/server/dist/modules/loops/runtime/loop-definition.js +246 -0
  240. package/server/dist/modules/loops/runtime/loop-effect.js +10 -1
  241. package/server/dist/modules/loops/runtime/loop-executors.js +63 -3
  242. package/server/dist/modules/loops/runtime/loop-factory.js +35 -15
  243. package/server/dist/modules/loops/runtime/loop-graph.js +84 -8
  244. package/server/dist/modules/loops/runtime/loop-migration.js +36 -0
  245. package/server/dist/modules/loops/runtime/loop-preview.js +10 -0
  246. package/server/dist/modules/loops/runtime/loop-run-manager.js +206 -13
  247. package/server/dist/modules/loops/runtime/loop-runs-store.js +271 -7
  248. package/server/dist/modules/loops/runtime/loop-templates.js +205 -45
  249. package/server/dist/modules/loops/runtime/loops-router.js +246 -29
  250. package/server/dist/modules/loops/runtime/loops-store.js +140 -20
  251. package/server/dist/modules/missions/runtime/agent-operator-prompt.js +14 -11
  252. package/server/dist/modules/specs/runtime/spec-addenda.js +28 -0
  253. package/server/dist/project-registry.js +87 -51
  254. package/server/dist/project-router-jobs.js +17 -6
  255. package/server/dist/project-router-loop-runs.js +200 -0
  256. package/server/dist/project-router-spending.js +17 -0
  257. package/server/dist/project-router.js +8 -6
  258. package/server/dist/schemas/agent-runtime.schema.json +93 -1
  259. package/server/dist/schemas/workflow-definition.schema.json +312 -0
  260. package/server/dist/vitest-setup.js +22 -0
  261. package/server/dist/worktree-overlay.js +1 -1
  262. package/client/dist/assets/AgentsPage-DfHWgP_x.js +0 -87
  263. package/client/dist/assets/DesktopAnalyticsPage-tc0p4jJW.js +0 -1
  264. package/client/dist/assets/InteractiveJobComposer-DFPpdg2D.js +0 -19
  265. package/client/dist/assets/JobDetailModal-BdOv-l-M.js +0 -1
  266. package/client/dist/assets/LoopBuilderPage-BemvUOxy.js +0 -7
  267. package/client/dist/assets/LoopPreviewModal-C6hNAeYN.js +0 -1
  268. package/client/dist/assets/LoopsPage-BZr0quvh.js +0 -1
  269. package/client/dist/assets/TemplatePreviewModal-Cejcquah.js +0 -1
  270. package/client/dist/assets/agentRuntime-BUimiX__.js +0 -1
  271. package/client/dist/assets/agentRuntime-BcN97sAB.js +0 -1
  272. package/client/dist/assets/agentRuntime-Ckyg-ahT.js +0 -1
  273. package/client/dist/assets/agentRuntime-DJCwyX4t.js +0 -1
  274. package/client/dist/assets/agentRuntime-DVzPJOl0.js +0 -1
  275. package/client/dist/assets/agentRuntime-V9AZTG3c.js +0 -1
  276. package/client/dist/assets/agentRuntime-bAAjw1vw.js +0 -1
  277. package/client/dist/assets/agentRuntime-v4qKAYH-.js +0 -1
  278. package/client/dist/assets/agentstudio-BNUth0uj.js +0 -1
  279. package/client/dist/assets/agentstudio-BNdB5hkr.js +0 -1
  280. package/client/dist/assets/agentstudio-C7-bt8FO.js +0 -1
  281. package/client/dist/assets/agentstudio-C8uNchpV.js +0 -1
  282. package/client/dist/assets/agentstudio-CKabyMlg.js +0 -1
  283. package/client/dist/assets/agentstudio-CN2pokQu.js +0 -1
  284. package/client/dist/assets/agentstudio-y2dVDXeM.js +0 -1
  285. package/client/dist/assets/analytics-BlypLLR6.js +0 -1
  286. package/client/dist/assets/builder-765NeYTp.js +0 -1
  287. package/client/dist/assets/builder-8MG3V6ea.js +0 -1
  288. package/client/dist/assets/builder-B-1UBs5K.js +0 -1
  289. package/client/dist/assets/builder-BTiGnPT0.js +0 -1
  290. package/client/dist/assets/builder-Cx9Rz-7u.js +0 -1
  291. package/client/dist/assets/builder-DKFMELBl.js +0 -1
  292. package/client/dist/assets/builder-OcmKrC0h.js +0 -1
  293. package/client/dist/assets/builder-P9qVBXFZ.js +0 -1
  294. package/client/dist/assets/common-B5AZNYMH.js +0 -1
  295. package/client/dist/assets/common-BFZ0c_vN.js +0 -1
  296. package/client/dist/assets/common-BttQx3z4.js +0 -1
  297. package/client/dist/assets/common-CM65k_-e.js +0 -1
  298. package/client/dist/assets/common-D4mvFFlu.js +0 -1
  299. package/client/dist/assets/common-TZ9Ny96S.js +0 -1
  300. package/client/dist/assets/common-nFpSF4GC.js +0 -1
  301. package/client/dist/assets/dashboard-B9uWNGO2.js +0 -1
  302. package/client/dist/assets/dashboard-BIwmO9wc.js +0 -1
  303. package/client/dist/assets/dashboard-BV4vOZkR.js +0 -1
  304. package/client/dist/assets/dashboard-Bf6MPVsM.js +0 -1
  305. package/client/dist/assets/dashboard-C8klWVvZ.js +0 -1
  306. package/client/dist/assets/dashboard-D1ORhPF0.js +0 -1
  307. package/client/dist/assets/dashboard-DSubvs9x.js +0 -1
  308. package/client/dist/assets/dashboard-px_vlRx_.js +0 -1
  309. package/client/dist/assets/index-C51x61Bz.css +0 -2
  310. package/client/dist/assets/loops-B7YpGizO.js +0 -1
  311. package/client/dist/assets/loops-BomD2J-h.js +0 -1
  312. package/client/dist/assets/loops-BrQHSQw3.js +0 -1
  313. package/client/dist/assets/loops-BvBwvTPA.js +0 -1
  314. package/client/dist/assets/loops-CODk6Slz.js +0 -1
  315. package/client/dist/assets/loops-DC6k-Ym-.js +0 -1
  316. package/client/dist/assets/loops-DSEg8-uY.js +0 -1
  317. package/client/dist/assets/loops-DhCoXD_v.js +0 -1
  318. package/client/dist/assets/settings-BsehKpty.js +0 -1
  319. package/client/dist/assets/settings-CQWob3SB.js +0 -1
  320. package/client/dist/assets/settings-CgCl0hzy.js +0 -1
  321. package/client/dist/assets/settings-DLRLd22L.js +0 -1
  322. package/client/dist/assets/settings-Dn5prAFl.js +0 -1
  323. package/client/dist/assets/settings-HZSu-K4l.js +0 -1
  324. package/client/dist/assets/settings-p4OVIyRh.js +0 -1
  325. package/client/dist/assets/settings-rddaldUp.js +0 -1
  326. package/client/dist/assets/useRuntimeRuns-Dqmz9fS9.js +0 -1
  327. package/docs/guide/de/pipeline/3-batch-implement-and-multi-feature.md +0 -84
  328. package/docs/guide/en/pipeline/3-batch-implement-and-multi-feature.md +0 -126
  329. package/docs/guide/es/pipeline/3-batch-implement-and-multi-feature.md +0 -114
  330. package/docs/guide/fr/pipeline/3-batch-implement-and-multi-feature.md +0 -84
  331. package/docs/guide/it/pipeline/3-batch-implement-and-multi-feature.md +0 -84
  332. package/docs/guide/ja/pipeline/3-batch-implement-and-multi-feature.md +0 -84
  333. package/docs/guide/pt/pipeline/3-batch-implement-and-multi-feature.md +0 -84
  334. package/docs/guide/zh/pipeline/3-batch-implement-and-multi-feature.md +0 -84
  335. package/server/dist/modules/loops/runtime/loop-templates-ported.js +0 -675
  336. /package/client/dist/assets/{LoopBuilderPage-DtxX27Jz.css → loop-layout-DtxX27Jz.css} +0 -0
@@ -22,7 +22,7 @@
22
22
 
23
23
  ## パイプラインのフェーズ
24
24
 
25
- `Implement` と `Batch` のジョブでは、スラッシュコマンドが定義するフェーズに沿って実行が進みます — デフォルトでは次のとおりです。
25
+ `Implement` のジョブでは、スラッシュコマンドが定義するフェーズに沿って実行が進みます — デフォルトでは次のとおりです。
26
26
 
27
27
  ```
28
28
  Architect ──► Developer ──► Reviewer ──► Ship
@@ -113,5 +113,14 @@ Architect ──► Developer ──► Reviewer ──► Ship
113
113
  ## 次に読むもの
114
114
 
115
115
  - [レールとジョブ](rails-and-jobs) — 起動とキューイング。
116
- - [バッチ実装とマルチフィーチャー](batch-implement-and-multi-feature) — 多数のスペックと依存ウェーブ。
117
116
  - [コストの追跡](../analytics/tracking-cost) — ジョブごとのコストをプロジェクト分析へ。
117
+
118
+ ## ワークフローの再起動後
119
+
120
+ クラッシュ後は、元の設定とリポジトリを使って保存済みワークフローを再開します。書き込みが中断された場合は、ワークツリーの差分を確認してから、復旧する試行を正確に選択してください。完了したステップは保持されます。応答が失われたプロバイダー呼び出しも中断として集計され、使用量は不明のままです。無料として表示されることはありません。保存済みの記録で元の成果物の受け渡し関係を確認できない場合、復旧はエラーを表示し、ワークツリーを保持します。
121
+
122
+ 判断ステップが質問のために一時停止した場合、再開時には保存済みの判断を再利用し、人の回答を次のステップに渡します。同じ判断のためにモデルを再度呼び出すことはありません。一時停止したプロンプトでは、回答を反映するためにモデルの追加呼び出しが必要になることがあります。
123
+
124
+ ## 履歴の保持
125
+
126
+ 保存された実行は既定で無期限に保持されます。**保存された実行 → 履歴の保持** で、プロジェクトごとに 1〜3650 日の保持期間を設定できます。バックグラウンドで削除されることはありません。ポリシーを保存し、**削除対象を確認** で各実行と理由を確認してから **期限切れの履歴を削除** を選びます。実行中、回答や承認の待機中、中断された書き込みがある場合、未完了の配信やそれに依存するフォークがある場合、その実行は保護されます。削除されるのはプロジェクトの Specrails ストレージ内の実行履歴だけで、リポジトリ、worktree、ジョブログ、コスト記録は残ります。期限切れの実行は **期限切れ** と表示され、再開やフォークはできません。残っている実行が使う Core バージョンは常に保持されます。
@@ -22,14 +22,14 @@ install できます。
22
22
 
23
23
  ## それぞれのエンジンが得意なこと
24
24
 
25
- 4 つすべてが **Implement** と **Batch** を実行します。
25
+ 4 つすべてが **Implement** を実行します。
26
26
 
27
27
  | エンジン | こんなときに | 補足 |
28
28
  |--------|--------------------|-------|
29
29
  | **Claude** | native cost、persistent interaction、strict tool policy が必要。 | Profile、Freestyle、structured transform。 |
30
30
  | **Codex** | OpenAI Codex CLI を好むとき、あるいはプロバイダー間で実装を比べたいとき。 | `codex` ≥ 0.128.0。ネイティブのコスト報告なし — アプリが料金表からコストを補います。プロファイルは適用されません。 |
31
31
  | **Gemini** | Google の Gemini CLI を使いたいとき、ネイティブのテレメトリがほしいとき、あるいは日常的なスペックを安く実行したいとき。 | `gemini` ≥ 0.11.0(`GEMINI_API_KEY` を設定)。ネイティブの OTLP テレメトリ。プロファイルは適用されません。 |
32
- | **Kimi** | Implement、Batch、Freestyle、Decider のない loop に agentic Kimi を使う。 | 外部 `kimi` ≥ 0.27.0。Profile/role、effort は K3 のみ。token/cost は unavailable。 |
32
+ | **Kimi** | Implement、Freestyle、Decider のない loop に agentic Kimi を使う。 | 外部 `kimi` ≥ 0.27.0。Profile/role、effort は K3 のみ。token/cost は unavailable。 |
33
33
 
34
34
  ### Capability の違い
35
35
 
@@ -1,6 +1,16 @@
1
1
  # Loop Builder
2
2
 
3
- **レールは Loop を実行します。** 組み込みの Loop(`Implement`、`Batch`、`Freestyle`)は日常的なケースをカバーしますが、**Loop Builder** を使えば自分だけの Loop を設計できます — 目標が達成されるまで繰り返す自動化のための、n8n スタイルのビジュアルエディターです。このページでは、Loop とは何か、どう作るのか、そしてレールでどう実行するのかを説明します。
3
+ ## Core ワークフロー
4
+
5
+ 対応する Core エンジンでは、新しいキャンバスにインストール済みカタログの17種類のステップが表示されます。クリックまたはドラッグして追加し、フォームで設定します。プロバイダーとロールは現在のプロジェクトの設定を使用します。名前付きの出力を別のステップまたは終了に接続します。各出力に接続できる先は1つです。
6
+
7
+ フォームは任意項目、オブジェクト、配列、辞書を編集でき、AI、条件、検証、シェル、OpenSpec、承認、質問、一時停止、各項目の実行、結合、コンポーネント、実装に対応します。設定ではトークン数、遷移数、並列数を制限できます。コンポーネント内部の実行も遷移数に含まれます。
8
+
9
+ **コンポーネント**で再利用する処理を作成し、入力変数と出力名を宣言して、コンポーネントまたは各項目の実行ステップから選択します。ナビゲーションで編集内容を保持したままメインキャンバスに戻れます。内部の終了は `exit` で出力名を指定できます。
10
+
11
+ 公開時に Core が下書きを検証し、問題のあるステップにエラーを表示します。実行開始時にはプロジェクトの設定を再検証します。エンジンが利用できない場合は Core を更新してください。既存の Desktop ループは従来の編集・実行方式を維持し、以下の節で説明しています。
12
+
13
+ **レールは Loop を実行します。** 組み込みの Loop(`Implement`、`Freestyle`、`SDD Quick (OpenSpec)`)は日常的なケースをカバーしますが、**Loop Builder** を使えば自分だけの Loop を設計できます — 目標が達成されるまで繰り返す自動化のための、n8n スタイルのビジュアルエディターです。このページでは、Loop とは何か、どう作るのか、そしてレールでどう実行するのかを説明します。
4
14
 
5
15
  ## Loop とレール — その関係
6
16
 
@@ -10,9 +20,8 @@
10
20
  Loop Builder(左サイドバー) レール(右)
11
21
  ─────────────────────────── ─────────────
12
22
  Implement (組み込み) レール 1
13
- Batch (組み込み) ► で選ぶ Loop: Verify-until-green
14
- Freestyle (組み込み) ▶ Play
15
- Verify-until-green (あなたの作ったもの)
23
+ Freestyle (組み込み) ► で選ぶ Loop: Verify-until-green
24
+ Verify-until-green (あなたの作ったもの) ▶ Play
16
25
  ```
17
26
 
18
27
  - Loop は **Loops** セクション(左サイドバー、プロジェクトの隣)にあります — これらは **グローバル** で、すべてのプロジェクトで共有されます。
@@ -25,7 +34,7 @@
25
34
 
26
35
  左サイドバーの **Loops** をクリックすると、ライブラリが表示されます。3 つの組み込み Loop に加えて、あなた自身の Loop が並びます。どれかを開いて中身を見るか、**New loop** をクリックして真っ白なキャンバスから始めます。
27
36
 
28
- 組み込みの Loop を直接編集するのは簡単ではありません — 代わりに **Fork** します。そうすると、ちゃんと動くグラフの編集可能なコピーが手に入るので、そこから始められます。これが一番手っ取り早い学び方です。
37
+ 組み込み Loop は、実際に編集できる本物の Loop です。**Edit** で開いて、ほかの Loop と同じように変更できます。保存すると下書きになり、**Publish** すると、その組み込み Loop を使う**すべてのレール、エージェントチャットからの起動、Companion からの起動**にあなたのバージョンが適用されます。編集が下書きのあいだ、レールは最後に公開されたバージョンを実行し続けるので、編集途中で壊れることはありません。**元に戻す**(カードまたはビルダー)で組み込み Loop を既定に戻せます。組み込み Loop は削除できません。別のコピーがほしいときは **Duplicate** を使います。組み込み Loop はそのままで、通常の Loop が作成されます。
29
38
 
30
39
  ## Loop を構成するもの
31
40
 
@@ -93,3 +102,13 @@ Loop は最初は **Draft** です。グラフが有効になったら **Publish
93
102
  - [レールとジョブ](rails-and-jobs) — レールの起動とジョブのキュー。
94
103
  - [ジョブ詳細ビュー](the-job-detail-view) — 実行をライブで見守る。
95
104
  - [レールごとのエンジン選択](picking-an-engine-per-rail) — プロバイダーを選ぶのは(Loop ではなく)レール。
105
+
106
+ 選択した Core が呼び出しごとの制限に対応している場合、prompt、role、decider の各ピースで `timeoutMs` と `idleTimeoutMs` を設定できます。`0` を指定すると、そのステップの該当タイマーが無効になります。フィールドを削除すると、既定値を継承します。ワークフロー全体の予算とキャンセルは引き続き有効です。検証ステップが判断を必要とする質問をした場合、回答を待ってから成功結果を受け入れます。
107
+
108
+ 保存済みの従来のグラフを初めて Core のピースに置き換えると、元のグラフが保持されます。ライブラリには **元のグラフをエクスポート** が表示されます。エクスポートには別の名前が付くため、現在のワークフローを置き換えずに、独立した下書きとしてインポートできます。変換やその後の編集でループが自動公開されることはありません。
109
+
110
+ **変数を設定**では、一時停止後も保持する状態を定義できます。型付きのJSON値を設定するか、既存の整数カウンターを増減します。このピースはAIを呼び出しません。更新はまとめて保存され、カウンターが無効な場合はすべての変数が変更されません。マップされたコンポーネントの変数は、そのコンポーネント内に限定されます。
111
+
112
+ Deciderの**この条件が成立する間は続行**は、未完了の必須作業を保護します。例えば `$vars.failedPass == true` は、ワークフローがフラグを解除するまで停止提案を続行に変更します。判断処理は実行され、変更のない繰り返しには進捗なしの上限が適用されます。人への質問では引き続き回答を待ちます。
113
+
114
+ 以前のエンジンで保存したループを移行するには、ライブラリで **Core に変換**を選びます。シェルステップに明示的な対象がない場合は元のリポジトリを選択してください。変換はグラフを検証し、エクスポート可能な元のコピーとともに下書きを保存します。接続を確認して明示的に公開してください。実行中のループは変換できず、同時編集は保持されます。書き込みステップには実際の検証コマンドが必要です。Quick SDD は Core 同梱の OpenSpec を使用します。変換できない場合は Core を更新してください。
@@ -15,7 +15,7 @@ Cada conexão também tem a configuração **Loop do agente**. **Compacto** (pad
15
15
 
16
16
  ## O que você ganha
17
17
 
18
- - Rails (implement, batch, freestyle, loops personalizados), Explore e specs Quick, chat e missões rodam no modelo local.
18
+ - Rails (implement, freestyle, loops personalizados), Explore e specs Quick, chat e missões rodam no modelo local.
19
19
  - As missões mantêm suas ferramentas Specrails e seus servidores MCP externos.
20
20
  - As sessões são retomadas entre turnos; jobs interativos funcionam.
21
21
  - O custo é honesto: os tokens são registrados, o custo fica *desconhecido* a menos que você informe tarifas (então é marcado como *estimado*).
@@ -18,12 +18,12 @@ SpecsBoard (esquerda) Rails (direita)
18
18
 
19
19
  Um rail é uma **pista de execução**. Você arrasta um cartão de spec do SpecsBoard para um rail e depois aperta **▶ Play**. Em repositórios git, o rail dispara o pipeline num git worktree isolado para que a IA possa editar arquivos e rodar testes sem tocar na sua árvore de trabalho ativa. Se o projeto ainda não é um repo git, o Specrails degrada claramente para execução na pasta compartilhada e avisa que não haverá branch nem cartão de PR.
20
20
 
21
- Você pode ter vários rails para organizar o trabalho em pistas nomeadas (uma para a feature em que está focado, outra na fila atrás dela). Os rails são **dinâmicos**: o botão **+ Adicionar** no cabeçalho de Rails cria uma nova pista (até 12 por projeto) e pistas vazias e ociosas podem ser removidas. Cada rail é respaldado pelo servidor, então seu conjunto de pistas sobrevive a recargas e fica visível para o companion móvel e para o agente integrado — o agente pode até criar um rail sozinho quando todas as pistas estão ocupadas. Mais sobre multi-rail e batching em [Batch implement e multi-feature](batch-implement-and-multi-feature).
21
+ Você pode ter vários rails para organizar o trabalho em pistas nomeadas (uma para a feature em que está focado, outra na fila atrás dela). Os rails são **dinâmicos**: o botão **+ Adicionar** no cabeçalho de Rails cria uma nova pista (até 12 por projeto) e pistas vazias e ociosas podem ser removidas. Cada rail é respaldado pelo servidor, então seu conjunto de pistas sobrevive a recargas e fica visível para o companion móvel e para o agente integrado — o agente pode até criar um rail sozinho quando todas as pistas estão ocupadas.
22
22
 
23
23
  ## Lançando um rail sobre uma spec
24
24
 
25
25
  1. **Arraste um cartão de spec** do SpecsBoard para um rail. O ID da spec aparece na lista de specs do rail. (Prefere não arrastar? Use o popover **Mover para o rail** no cartão da spec — ele mostra um indicador de status por rail, para você não soltar trabalho numa pista ocupada.)
26
- 2. **Escolha um Loop** no cabeçalho do rail. Um rail roda um **Loop** — é o trabalho que ele realiza. O padrão é o Loop `Implement` embutido; você também pode escolher `Batch`, `Freestyle` ou um loop personalizado que você mesmo construiu. Veja [O Loop Builder](the-loop-builder).
26
+ 2. **Escolha um Loop** no cabeçalho do rail. Um rail roda um **Loop** — é o trabalho que ele realiza. O padrão é o Loop `Implement` embutido; você também pode escolher `Freestyle` ou um loop personalizado que você mesmo construiu. Veja [O Loop Builder](the-loop-builder).
27
27
  3. **Aperte ▶ Play.**
28
28
 
29
29
  É isso. O rail sobe um processo de CLI de IA no contexto de execução certo e começa o pipeline.
@@ -34,25 +34,28 @@ Você pode ter vários rails para organizar o trabalho em pistas nomeadas (uma p
34
34
  |---------|--------------|
35
35
  | **Pílula de status** | `idle`, `running` ou `failed`. Não há um "completed" separado — um rail volta para `idle` quando seu job termina sem erros. |
36
36
  | **Lista de specs** | Os IDs atribuídos a este rail. Arraste mais para dentro, arraste para fora para desanexar. |
37
- | **Seletor de Loop** | O Loop que este rail roda — um embutido (`Implement` / `Batch` / `Freestyle`) ou um loop personalizado. Veja a tabela abaixo. Persistido por rail. |
37
+ | **Seletor de Loop** | O Loop que este rail roda — um embutido (`Implement` / `Freestyle` / `SDD Quick (OpenSpec)`) ou um loop personalizado. Veja a tabela abaixo. Persistido por rail. |
38
38
  | **Seletor de perfil** | Qual perfil do provider corre (rails Claude e Kimi). |
39
39
  | **Seletor de motor** | Qual provider corre o rail — Claude, Codex, Gemini ou Kimi. |
40
40
  | **▶ Play / ■ Stop** | Iniciar ou cancelar. |
41
41
 
42
42
  ### O que um rail roda: Loops
43
43
 
44
- Um rail roda um **Loop** — a receita do trabalho. Três loops são **embutidos** e cobrem os casos comuns:
44
+ Um rail roda um **Loop** — a receita do trabalho. Dois loops são **embutidos** e cobrem os casos comuns:
45
45
 
46
46
  | Loop embutido | Comando | O que faz |
47
47
  |------|---------|--------------|
48
48
  | **Implement** | `/specrails:implement` | Um job cobrindo todas as specs do rail. Roda o pipeline completo Architect → Developer → Reviewer → Ship. O padrão do dia a dia. |
49
- | **Batch** | `/specrails:batch-implement` | Um job que percorre as specs do rail sequencialmente, em ondas que respeitam as dependências. Melhor para várias specs relacionadas. |
50
49
  | **Freestyle** | Freestyle | Claude ou Kimi implementa cada spec de forma autónoma, **ignorando** o pipeline. |
51
50
 
51
+ Para rodar várias specs, coloque as relacionadas (até 3) num único rail — o `Implement` executa-as como um só job agregado — ou distribua specs independentes por vários rails: cada rail com git roda em paralelo na sua própria worktree isolada.
52
+
52
53
  Freestyle usa ferramentas e modelos nativos do provider. Claude tem transport
53
54
  interativo persistente; Kimi usa um processo agentic `kimi -p` sem stdin
54
55
  persistente.
55
56
 
57
+ Os embutidos também são editáveis: edite um no Loop Builder e publique-o, e todos os rails que o escolhem rodam a sua versão (use **Restaurar original** para voltar atrás).
58
+
56
59
  Além dos embutidos, você pode **construir seus próprios loops** — repetir um ciclo verify → fix → verify até atingir uma meta, encadear comandos de shell entre AI Steps e muito mais. Esses loops personalizados aparecem no mesmo seletor de Loop. Essa é a próxima grande ideia: [O Loop Builder](the-loop-builder).
57
60
 
58
61
  ## A fila de jobs
@@ -98,5 +101,4 @@ Se algo parecer errado:
98
101
 
99
102
  - [O Loop Builder](the-loop-builder) — o que um rail roda, e como construir seus próprios loops.
100
103
  - [A vista de detalhe do job](the-job-detail-view) — fases, métricas ao vivo, cartões de ticket.
101
- - [Batch implement e multi-feature](batch-implement-and-multi-feature) — rode várias specs de uma vez.
102
104
  - [Escolhendo um motor por rail](picking-an-engine-per-rail) — Claude, Codex, Gemini ou Kimi.
@@ -22,7 +22,7 @@ Dois painéis ficam por cima do log completo em streaming; num job Claude em exe
22
22
 
23
23
  ## Fases do pipeline
24
24
 
25
- Para os jobs `Implement` e `Batch`, a execução percorre as fases definidas pelo slash command — por default:
25
+ Para os jobs `Implement`, a execução percorre as fases definidas pelo slash command — por default:
26
26
 
27
27
  ```
28
28
  Architect ──► Developer ──► Reviewer ──► Ship
@@ -112,5 +112,14 @@ Se a [telemetria](../settings/customizing) estava ativada para o job, aparece um
112
112
  ## Para onde ir a seguir
113
113
 
114
114
  - [Rails e jobs](rails-and-jobs) — lançar e enfileirar.
115
- - [Batch implement e multi-feature](batch-implement-and-multi-feature) — muitas specs, ondas de dependências.
116
115
  - [Acompanhar o custo](../analytics/tracking-cost) — transformar os custos por job em analytics do projeto.
116
+
117
+ ## Após reiniciar um workflow
118
+
119
+ Após uma falha, retome o workflow salvo com a configuração e os repositórios originais. Uma escrita interrompida exige selecionar a tentativa exata depois de revisar o diff do worktree. As etapas concluídas são preservadas. Uma chamada ao provedor cuja resposta foi perdida continua contabilizada como interrompida, com consumo desconhecido; nunca é apresentada como gratuita. Se os registros salvos não comprovarem a entrega original, a recuperação mostra um erro e preserva o worktree.
120
+
121
+ Quando uma etapa de decisão pausa para fazer uma pergunta, a retomada reutiliza a decisão salva e transmite a resposta humana à próxima etapa. O modelo não é chamado novamente para essa mesma decisão. Um prompt pausado pode precisar de outro turno do modelo para aplicar sua resposta.
122
+
123
+ ## Retenção do histórico
124
+
125
+ As execuções guardadas são mantidas indefinidamente por omissão. Em **Execuções guardadas → Retenção do histórico**, um projeto pode mantê-las entre 1 e 3650 dias. Nada é eliminado em segundo plano: guarde a política, escolha **Pré-visualizar limpeza** e reveja cada execução e o seu motivo antes de **Eliminar histórico expirado**. Uma execução continua protegida enquanto está ativa, aguarda a sua resposta ou aprovação, tem uma escrita interrompida, uma entrega aberta ou um fork que ainda depende dela. Só é removido o histórico de execução no armazenamento Specrails do projeto; o repositório, os worktrees, o log do job e os registos de custo mantêm-se. Uma execução expirada aparece como **Expirado** e já não pode ser retomada nem bifurcada. As versões do Core ainda usadas por uma execução mantida são sempre preservadas.
@@ -22,14 +22,14 @@ O motor selecionado corre todas as fases do pipeline desse rail. Se a CLI do mot
22
22
 
23
23
  ## Em que cada motor é bom
24
24
 
25
- Os quatro correm os pipelines standard **Implement** e **Batch**:
25
+ Os quatro correm o pipeline standard **Implement**:
26
26
 
27
27
  | Motor | Recorra a ele quando… | Notas |
28
28
  |--------|--------------------|-------|
29
29
  | **Claude** | Precisa de custo nativo, interação persistente ou tool policy rigorosa. | Perfis, Freestyle e transformações estruturadas. |
30
30
  | **Codex** | Prefere o Codex CLI da OpenAI ou quer comparar implementações entre fornecedores. | `codex` ≥ 0.128.0. Sem reporte de custo nativo — a app preenche o custo a partir da sua tabela de preços. Os perfis não se aplicam. |
31
31
  | **Gemini** | Quer o Gemini CLI da Google, telemetria nativa ou uma execução mais barata para specs de rotina. | `gemini` ≥ 0.11.0 (defina `GEMINI_API_KEY`). Telemetria OTLP nativa. Os perfis não se aplicam. |
32
- | **Kimi** | Quer Kimi agentic para Implement, Batch, Freestyle ou loops sem Decider. | `kimi` ≥ 0.27.0 externo; perfis/roles, effort só K3; tokens/custo indisponíveis. |
32
+ | **Kimi** | Quer Kimi agentic para Implement, Freestyle ou loops sem Decider. | `kimi` ≥ 0.27.0 externo; perfis/roles, effort só K3; tokens/custo indisponíveis. |
33
33
 
34
34
  ### Diferenças de capability
35
35
 
@@ -1,6 +1,16 @@
1
1
  # O Loop Builder
2
2
 
3
- Um **rail roda um Loop**. Os loops embutidos (`Implement`, `Batch`, `Freestyle`) cobrem os casos do dia a dia, mas o **Loop Builder** deixa você desenhar os seus próprios — um editor visual, no estilo n8n, para automação que se repete até atingir uma meta. Esta página explica o que é um loop, como construir um e como rodá-lo em um rail.
3
+ ## Workflows Core
4
+
5
+ Com um motor Core compatível, um novo canvas apresenta as dezassete etapas do catálogo instalado. Clique ou arraste uma etapa e preencha o formulário. Os fornecedores e papéis pertencem ao projeto ativo. Ligue cada saída identificada a outra etapa ou a Fim; cada saída permite uma ligação.
6
+
7
+ Os formulários cobrem campos opcionais, objetos, listas e dicionários para IA, condições, verificação, shell, OpenSpec, aprovações, perguntas, pausas, mapas, uniões, componentes e implementação. As opções incluem limites de tokens e transições e concorrência. As visitas dentro de componentes também contam para o limite.
8
+
9
+ Crie um corpo reutilizável em **Componentes**, declare entradas e saídas e selecione-o numa etapa Componente ou Mapear. A navegação regressa ao canvas principal sem perder alterações. Um Fim local pode selecionar uma saída através de `exit`.
10
+
11
+ A publicação envia o rascunho ao Core e apresenta os erros nas etapas. O lançamento valida novamente a configuração do projeto. Atualize o Core se o motor estiver indisponível. Os loops antigos mantêm o editor e a execução anteriores; as secções seguintes descrevem-nos.
12
+
13
+ Um **rail roda um Loop**. Os loops embutidos (`Implement`, `Freestyle`, `SDD Quick (OpenSpec)`) cobrem os casos do dia a dia, mas o **Loop Builder** deixa você desenhar os seus próprios — um editor visual, no estilo n8n, para automação que se repete até atingir uma meta. Esta página explica o que é um loop, como construir um e como rodá-lo em um rail.
4
14
 
5
15
  ## Loops e rails — a relação
6
16
 
@@ -10,9 +20,8 @@ Um **loop** é a *receita* do trabalho; um **rail** é a *pista* que o roda cont
10
20
  Loop Builder (barra lateral esq.) Rails (direita)
11
21
  ─────────────────────────── ─────────────
12
22
  Implement (embutido) Rail 1
13
- Batch (embutido) escolha ► Loop: Verify-until-green
14
- Freestyle (embutido) ▶ Play
15
- Verify-until-green (seu)
23
+ Freestyle (embutido) escolha ► Loop: Verify-until-green
24
+ Verify-until-green (seu) ▶ Play
16
25
  ```
17
26
 
18
27
  - Os loops vivem na seção **Loops** (barra lateral esquerda, ao lado dos seus projetos) — eles são **globais**, compartilhados por todos os projetos.
@@ -25,7 +34,7 @@ Ou seja: construa um loop uma vez e depois escolha-o em qualquer rail, em qualqu
25
34
 
26
35
  Clique em **Loops** na barra lateral esquerda para ver a biblioteca: os três loops embutidos mais os seus próprios. Abra um para vê-lo, ou clique em **New loop** para começar de uma tela em branco.
27
36
 
28
- Você não consegue editar um embutido diretamente com facilidade — em vez disso, faça **Fork** dele. Isso te dá uma cópia editável de um grafo que funciona como ponto de partida, que é a forma mais fácil de aprender.
37
+ Os loops embutidos são loops reais e editáveis. Abra um com **Edit** e altere-o como qualquer outro loop: ao salvar ele vira rascunho, e **Publish** aplica a sua versão em **todos os rails, lançamentos pelo chat do agente e lançamentos pelo Companion que usam esse embutido**. Enquanto a sua edição for um rascunho, os rails continuam executando a última versão publicada, então nada quebra no meio da edição. **Restaurar original** (no cartão ou no builder) volta o embutido à versão padrão; embutidos não podem ser excluídos. Prefere uma cópia separada? Use **Duplicate** — isso cria um loop comum e deixa o embutido intacto.
29
38
 
30
39
  ## Do que um loop é feito
31
40
 
@@ -93,3 +102,13 @@ A execução transmite ao vivo na vista **Jobs** com as mesmas métricas e o mes
93
102
  - [Rails e jobs](rails-and-jobs) — lançando rails e a fila de jobs.
94
103
  - [A vista de detalhe do job](the-job-detail-view) — acompanhando uma execução ao vivo.
95
104
  - [Escolhendo um motor por rail](picking-an-engine-per-rail) — o rail (não o loop) escolhe o provedor.
105
+
106
+ Quando a versão de Core selecionada disponibiliza limites por invocação, os blocos de prompt, função e decider oferecem `timeoutMs` e `idleTimeoutMs`. Use `0` para desativar esse temporizador da etapa ou remova o campo para herdar o valor padrão. Os orçamentos do workflow completo e o cancelamento continuam ativos. Uma etapa de verificação que faz uma pergunta bloqueante espera sua resposta antes de aceitar um resultado bem-sucedido.
107
+
108
+ Quando um grafo antigo salvo é substituído pela primeira vez por blocos Core, o grafo original é preservado. A biblioteca passa a oferecer **Exportar grafo original**. A exportação tem um nome diferente para permitir a importação como rascunho separado, sem substituir o workflow atual. A conversão e as edições posteriores nunca publicam um loop automaticamente.
109
+
110
+ Use **Definir variáveis** para preservar o estado durante uma pausa: defina valores JSON tipados ou ajuste um contador inteiro existente. Esta peça não faz chamadas à IA. Todas as alterações são guardadas em conjunto; um contador inválido deixa todas as variáveis intactas. As variáveis de um componente mapeado permanecem locais a esse componente.
111
+
112
+ No Decider, **Continuar enquanto esta condição se verificar** protege o trabalho obrigatório pendente. Por exemplo, `$vars.failedPass == true` transforma uma proposta de paragem em continuação até o workflow limpar esse indicador. A decisão continua a ser executada e as repetições sem alterações continuam sujeitas ao limite de falta de progresso. As perguntas humanas continuam a aguardar uma resposta.
113
+
114
+ Para migrar um loop guardado do motor anterior, escolha **Converter para Core** na biblioteca. Selecione o repositório original quando um passo shell não tiver um âmbito explícito. A conversão valida o grafo e guarda um rascunho com uma cópia exportável do original. Reveja as ligações e publique explicitamente. Loops em execução não podem ser convertidos; alterações concorrentes são preservadas. Os passos de escrita exigem comandos reais de verificação e Quick SDD utiliza o OpenSpec incluído no Core. Atualize o Core se a conversão não estiver disponível.
@@ -15,7 +15,7 @@
15
15
 
16
16
  ## 你将获得
17
17
 
18
- - Rails(implement、batch、freestyle、自定义 loop)、Explore 与 Quick spec、聊天和任务都在本地模型上运行。
18
+ - Rails(implement、freestyle、自定义 loop)、Explore 与 Quick spec、聊天和任务都在本地模型上运行。
19
19
  - 任务保留 Specrails 工具和你的外部 MCP 服务器。
20
20
  - 会话可跨轮次恢复;交互式 job 可用。
21
21
  - 成本诚实:记录 token,除非你填写费率,否则成本显示为*未知*(填写后标记为*估算*)。
@@ -18,12 +18,12 @@ SpecsBoard (左) Rails (右)
18
18
 
19
19
  rail 是一条**执行通道**。你从 SpecsBoard 上拖一张 spec 卡片放到某条 rail 上,然后按下 **▶ Play**。对于 git 仓库,这条 rail 会在隔离的 git worktree 中启动流水线,让 AI 可以改文件、跑测试,而不会碰你当前活跃的工作树。如果项目还不是 git 仓库,Specrails 会明确降级到共享文件夹执行,并告诉你不会出现分支或 PR 卡片。
20
20
 
21
- 你可以同时拥有好几条 rail,把工作组织成一条条命名的通道(一条放你眼下专注的功能,另一条排在它后面候着)。rail 是**动态的**:Rails 头部的 **+ 添加** 按钮可以新建一条通道(每个项目最多 12 条),空闲且为空的通道可以删除。每条 rail 都由服务器托管,所以你的通道集合在刷新后依然保留,移动端 companion 和内置代理都能看到——当所有通道都在忙时,代理甚至能自己创建一条 rail。关于多 rail 和批量运行的更多内容,请看 [批量实现与多功能](batch-implement-and-multi-feature)。
21
+ 你可以同时拥有好几条 rail,把工作组织成一条条命名的通道(一条放你眼下专注的功能,另一条排在它后面候着)。rail 是**动态的**:Rails 头部的 **+ 添加** 按钮可以新建一条通道(每个项目最多 12 条),空闲且为空的通道可以删除。每条 rail 都由服务器托管,所以你的通道集合在刷新后依然保留,移动端 companion 和内置代理都能看到——当所有通道都在忙时,代理甚至能自己创建一条 rail。
22
22
 
23
23
  ## 在某个 spec 上启动一条 rail
24
24
 
25
25
  1. **把一张 spec 卡片拖**到某条 rail 上。该 spec 的 ID 会出现在这条 rail 的 spec 列表里。(不想拖?用 spec 卡片上的 **放入 Rail** 弹窗——它会为每条 rail 显示一个状态圆点,避免你把活儿丢进一条正忙的通道。)
26
- 2. **在 rail 头部挑一个 Loop。** 一条 rail 运行的是一个 **Loop**——也就是它要做的活儿。默认是内置的 `Implement` loop;你也可以挑 `Batch`、`Freestyle`,或者你自己搭的某个自定义 loop。见 [Loop Builder](the-loop-builder)。
26
+ 2. **在 rail 头部挑一个 Loop。** 一条 rail 运行的是一个 **Loop**——也就是它要做的活儿。默认是内置的 `Implement` loop;你也可以挑 `Freestyle`,或者你自己搭的某个自定义 loop。见 [Loop Builder](the-loop-builder)。
27
27
  3. **按下 ▶ Play。**
28
28
 
29
29
  就这么简单。rail 会在正确的执行上下文里启动一个 AI CLI 进程,开始跑流水线。
@@ -34,25 +34,28 @@ rail 是一条**执行通道**。你从 SpecsBoard 上拖一张 spec 卡片放
34
34
  |---------|--------------|
35
35
  | **状态标签** | `idle`、`running` 或 `failed`。这里没有单独的"completed"——任务干净地跑完后,rail 会回到 `idle`。 |
36
36
  | **spec 列表** | 分配给这条 rail 的 ID。可以再拖进来,也可以拖出去解除关联。 |
37
- | **Loop 选择器** | 这条 rail 运行的 Loop——内置的(`Implement` / `Batch` / `Freestyle`)或某个自定义 loop。见下表。按 rail 单独记忆。 |
37
+ | **Loop 选择器** | 这条 rail 运行的 Loop——内置的(`Implement` / `Freestyle` / `SDD Quick (OpenSpec)`)或某个自定义 loop。见下表。按 rail 单独记忆。 |
38
38
  | **Profile 选择器** | 使用哪个 provider profile(Claude/Kimi rail)。 |
39
39
  | **引擎选择器** | 哪个 provider 运行 rail——Claude、Codex、Gemini 或 Kimi。 |
40
40
  | **▶ Play / ■ Stop** | 启动或取消。 |
41
41
 
42
42
  ### rail 运行的是什么:Loop
43
43
 
44
- 一条 rail 运行的是一个 **Loop**——干活的配方。有三个 loop 是**内置**的,覆盖了常见情况:
44
+ 一条 rail 运行的是一个 **Loop**——干活的配方。有两个 loop 是**内置**的,覆盖了常见情况:
45
45
 
46
46
  | 内置 loop | 命令 | 作用 |
47
47
  |------|---------|--------------|
48
48
  | **Implement** | `/specrails:implement` | 一个任务覆盖这条 rail 上的所有 spec。跑完整的 Architect → Developer → Reviewer → Ship 流水线。日常默认选项。 |
49
- | **Batch** | `/specrails:batch-implement` | 一个任务,按依赖感知的批次(wave)依次处理 rail 上的各个 spec。最适合一组相关的 spec。 |
50
49
  | **Freestyle** | Freestyle | Claude 或 Kimi 自主实现每个 spec,**绕过**流水线。 |
51
50
 
51
+ 要运行多个 spec,可以把相关的(最多 3 个)放到同一条 rail 上——`Implement` 会把它们作为一个整体任务运行——或者把彼此独立的 spec 分到多条 rail:每条基于 git 的 rail 都在自己隔离的 worktree 中并行运行。
52
+
52
53
  Freestyle 使用 provider 的 native tool/model。Claude 有 persistent
53
54
  interactive transport;Kimi 使用没有 persistent stdin 的 agentic
54
55
  `kimi -p` process。
55
56
 
57
+ 内置 loop 也可以编辑:在 Loop Builder 里编辑并发布后,所有选用它的 rail 都会运行你的版本(用 **恢复原始版本** 可以改回去)。
58
+
56
59
  除了这些内置 loop,你还可以**搭建自己的 loop**——重复一个 verify → fix → verify 的循环直到目标达成、在 AI 步骤之间串联 shell 命令,等等。这些自定义 loop 会出现在同一个 Loop 选择器里。这就是下一个大点子:[Loop Builder](the-loop-builder)。
57
60
 
58
61
  ## 任务队列
@@ -98,5 +101,4 @@ interactive transport;Kimi 使用没有 persistent stdin 的 agentic
98
101
 
99
102
  - [Loop Builder](the-loop-builder)——rail 运行的是什么,以及如何搭建你自己的 loop。
100
103
  - [任务详情视图](the-job-detail-view)——阶段、实时指标、工单卡片。
101
- - [批量实现与多功能](batch-implement-and-multi-feature)——一次跑多个 spec。
102
104
  - [为每条 rail 选择引擎](picking-an-engine-per-rail)——Claude、Codex、Gemini 或 Kimi。
@@ -22,7 +22,7 @@
22
22
 
23
23
  ## 流水线阶段
24
24
 
25
- 对于 `Implement` 和 `Batch` 任务,整个运行会走过 slash 命令所定义的各个阶段——默认是:
25
+ 对于 `Implement` 任务,整个运行会走过 slash 命令所定义的各个阶段——默认是:
26
26
 
27
27
  ```
28
28
  Architect ──► Developer ──► Reviewer ──► Ship
@@ -112,5 +112,14 @@ Architect ──► Developer ──► Reviewer ──► Ship
112
112
  ## 接下来去哪儿
113
113
 
114
114
  - [Rail 与任务](rails-and-jobs)——启动与排队。
115
- - [批量实现与多功能](batch-implement-and-multi-feature)——多个 spec、依赖批次。
116
115
  - [追踪成本](../analytics/tracking-cost)——把单任务成本汇成项目级分析。
116
+
117
+ ## 工作流重启后
118
+
119
+ 发生崩溃后,请使用原始配置和仓库恢复已保存的工作流。对于中断的写入,先检查工作树差异,再选择要恢复的具体尝试。已完成的步骤会保留。响应丢失的提供商调用仍计为中断,用量保持未知,绝不会显示为免费。如果已保存的记录无法证明原始交付关系,恢复会显示错误并保留工作树。
120
+
121
+ 决策步骤因提问而暂停时,恢复执行会复用已保存的决策,并将人工回答传递给下一步骤,不会为同一次决策再次调用模型。暂停的提示步骤可能需要再次调用模型,才能根据你的回答继续处理。
122
+
123
+ ## 历史保留
124
+
125
+ 已保存的执行默认永久保留。在 **已保存的执行 → 历史保留** 中,项目可以改为保留 1 到 3650 天。后台不会自动删除任何内容:先保存策略,选择 **预览清理**,逐一查看每次执行及其原因,然后再选择 **删除过期历史**。只要执行仍在运行、正在等待你的回答或批准、有中断的写入、有未完成的交付或仍依赖它的分叉,它就会受到保护。只会删除项目 Specrails 存储中的运行历史;你的仓库、worktree、任务日志和成本记录都会保留。过期的执行显示为 **已过期**,不能再恢复或分叉。仍被保留执行使用的 Core 版本始终会保留。
@@ -21,14 +21,14 @@ Specrails desktop 把 **Claude Code**、**Codex CLI**、**Gemini CLI** 和
21
21
 
22
22
  ## 每个引擎擅长什么
23
23
 
24
- 三者都能跑标准的 **Implement** 和 **Batch** 流水线。下面是一份实用的选择指南:
24
+ 三者都能跑标准的 **Implement** 流水线。下面是一份实用的选择指南:
25
25
 
26
26
  | 引擎 | 在什么情况下选它…… | 说明 |
27
27
  |--------|--------------------|-------|
28
28
  | **Claude** | 需要原生成本、持久交互或严格 tool policy。 | Profile、Freestyle 和 structured transform。 |
29
29
  | **Codex** | 你更喜欢 OpenAI Codex CLI,或想跨提供方对比实现。 | `codex` ≥ 0.128.0。无原生成本上报——应用会用自己的价格表来补上成本。Profile 不适用。 |
30
30
  | **Gemini** | 你想用 Google 的 Gemini CLI、原生遥测,或为常规 spec 跑得更省钱。 | `gemini` ≥ 0.11.0(需设置 `GEMINI_API_KEY`)。原生 OTLP 遥测。Profile 不适用。 |
31
- | **Kimi** | 用 agentic Kimi 跑 Implement、Batch、Freestyle 或无 Decider 的 loop。 | 外部 `kimi` ≥ 0.27.0;profile/role,effort 仅 K3;token/cost unavailable。 |
31
+ | **Kimi** | 用 agentic Kimi 跑 Implement、Freestyle 或无 Decider 的 loop。 | 外部 `kimi` ≥ 0.27.0;profile/role,effort 仅 K3;token/cost unavailable。 |
32
32
 
33
33
  ### Capability 差异
34
34
 
@@ -1,6 +1,16 @@
1
1
  # Loop Builder
2
2
 
3
- **一条 rail 运行的是一个 Loop。** 内置的那些 loop(`Implement`、`Batch`、`Freestyle`)覆盖了日常场景,但 **Loop Builder** 让你能设计自己的——一个可视化的、n8n 风格的编辑器,用来做那种"重复执行直到目标达成"的自动化。本页会讲清楚什么是 loop、怎么搭一个,以及怎么在 rail 上运行它。
3
+ ## Core 工作流
4
+
5
+ 使用兼容的 Core 引擎时,新画布会显示已安装目录中的十七种步骤。单击或拖入步骤,再填写参数表单。提供商和角色来自当前项目。将每个命名输出连接到其他步骤或结束节点;每个输出只能有一条连接。
6
+
7
+ 表单支持可选字段、对象、列表和字典,覆盖 AI、条件、验证、Shell、OpenSpec、审批、提问、暂停、遍历、合并、组件及实现等步骤。工作流选项可设置 token、转换次数及并发限制。组件内部和分支中的执行也计入转换次数。
8
+
9
+ 在**组件**中创建可复用流程,声明输入变量和输出名称,再从组件或遍历步骤选择它。导航可以保留修改并返回主画布。组件内部的结束节点可通过 `exit` 指定输出名称。
10
+
11
+ 发布时,Core 会验证草稿并在相关步骤上显示错误。启动时会再次验证项目配置。引擎不可用时请更新 Core。现有 Desktop 循环保留原来的编辑器和执行方式,下面的章节介绍这些旧版流程。
12
+
13
+ **一条 rail 运行的是一个 Loop。** 内置的那些 loop(`Implement`、`Freestyle`、`SDD Quick (OpenSpec)`)覆盖了日常场景,但 **Loop Builder** 让你能设计自己的——一个可视化的、n8n 风格的编辑器,用来做那种"重复执行直到目标达成"的自动化。本页会讲清楚什么是 loop、怎么搭一个,以及怎么在 rail 上运行它。
4
14
 
5
15
  ## Loop 与 rail——它们的关系
6
16
 
@@ -10,9 +20,8 @@
10
20
  Loop Builder (左侧栏) Rails (右)
11
21
  ─────────────────────────── ─────────────
12
22
  Implement (内置) Rail 1
13
- Batch (内置) 在此挑选 ► Loop: Verify-until-green
14
- Freestyle (内置) ▶ Play
15
- Verify-until-green (你的)
23
+ Freestyle (内置) 在此挑选 ► Loop: Verify-until-green
24
+ Verify-until-green (你的) ▶ Play
16
25
  ```
17
26
 
18
27
  - loop 住在 **Loops** 区里(左侧栏,和你的项目并列)——它们是**全局**的,跨所有项目共享。
@@ -25,7 +34,7 @@
25
34
 
26
35
  点左侧栏的 **Loops**,就能看到这个库:三个内置 loop,再加上你自己的所有 loop。打开一个来查看,或者点 **New loop** 从一张空白画布开始。
27
36
 
28
- 你没法轻易地直接编辑内置 loop——而是要 **Fork** 它。这会给你一份可编辑的副本,从一个能跑通的图出发,这也是最容易上手的学习方式。
37
+ 内置 loop 是真正可编辑的 loop。用 **Edit** 打开它,像编辑其他 loop 一样修改:保存后它会变成草稿,**Publish** 后你的版本会应用到**所有使用这个内置 loop 的轨道、代理聊天启动和 Companion 启动**。在你的修改还是草稿时,轨道会继续运行最后发布的版本,所以编辑中途不会出问题。**恢复原始版本**(在卡片上或构建器中)可以把内置 loop 重置为默认版本;内置 loop 不能删除。想要一份独立的副本?用 **Duplicate**——它会创建一个普通 loop,内置 loop 保持不变。
29
38
 
30
39
  ## 一个 loop 由什么组成
31
40
 
@@ -93,3 +102,13 @@ builder 会帮你在 loop 真正跑起来之前就把它弄对:
93
102
  - [Rail 与任务](rails-and-jobs)——启动 rail 以及任务队列。
94
103
  - [任务详情视图](the-job-detail-view)——实时观看一次运行。
95
104
  - [为每条 rail 选择引擎](picking-an-engine-per-rail)——是 rail(而不是 loop)来选提供方。
105
+
106
+ 如果所选 Core 支持单次调用限制,prompt、role 和 decider 节点会提供 `timeoutMs` 和 `idleTimeoutMs`。设为 `0` 可禁用该步骤的相应计时器;删除字段则继承默认值。整个工作流的预算和取消功能仍然有效。如果验证步骤提出需要人工决定的问题,它会等待你的回答,然后才能接受成功结果。
107
+
108
+ 首次将已保存的旧版图替换为 Core 节点时,系统会保留原始图。此后,库中会显示 **导出原始图**。导出文件使用不同的名称,方便你将其导入为独立草稿,而不替换当前工作流。转换和后续编辑都不会自动发布循环。
109
+
110
+ 使用**设置变量**保存暂停后仍需保留的状态:设置带类型的 JSON 值,或调整已有的整数计数器。此组件不会调用 AI。所有更新一起提交;计数器无效时,所有变量都保持不变。映射组件中的变量仅在该组件内部有效。
111
+
112
+ Decider 的**满足此条件时继续**可保护尚未完成的必需工作。例如,`$vars.failedPass == true` 会将停止建议改为继续,直到工作流清除该标记。决策仍会执行,内容不变的重复运行仍受无进展次数上限约束。需要人工回答的问题仍会暂停执行。
113
+
114
+ 要迁移旧引擎中保存的循环,请在循环库中选择 **转换为 Core**。如果 Shell 步骤没有明确的作用范围,请选择原始仓库。转换会验证图并保存草稿,同时保留可导出的原始副本。请检查连接后明确发布。正在运行的循环不能转换;并发编辑会被保留。写入步骤需要实际的验证命令,Quick SDD 使用 Core 自带的 OpenSpec。如果转换不可用,请更新 Core。
@@ -440,11 +440,11 @@ A non-developer-friendly file tree + Monaco viewer with plain-language AI summar
440
440
  | Method | Path | Notes |
441
441
  |--------|------|-------|
442
442
  | `GET` | `/` | List rails |
443
- | `PUT` | `/:railIndex/tickets` | Assign tickets to a rail. Body `{ ticketIds: number[] }` |
443
+ | `PUT` | `/:railIndex/tickets` | Assign tickets to a rail. Body `{ ticketIds: number[], mode?, profileName?, aiEngine? }`. An omitted `mode` keeps the rail's stored mode; `mode` must be `implement` / `freestyle` / `loop` (400 otherwise), with `batch-implement` / `batch` normalized to `implement`. |
444
444
  | `PUT` | `/:railIndex/profile` | Set the rail's default profile |
445
445
  | `PUT` | `/:railIndex/engine` | Set the rail's AI engine override. Body `{ aiEngine }` (string — one of the project's providers — or `null` to clear) |
446
446
  | `PUT` | `/:railIndex/name` | Set the rail's display name. Body `{ name }` (string or `null` to clear back to the default label); 400 if longer than 60 characters |
447
- | `POST` | `/:railIndex/launch` | Launch the rail. Body `{ mode?, loopId?, profileName?, aiEngine?, model?, reasoning_effort?, originConversationId?, originSurface?, interactive? }`. `mode` is `implement` / `batch-implement` / `freestyle` / `loop`; a factory `loopId` maps to its canonical rail mode. `model` and `reasoning_effort` are validated against the effective adapter/model (Kimi effort is K3-only). Kimi + a loop containing a Decider returns a capability error before the first step. Claude alone advertises persistent in-job stdin; `interactive` remains wire-compatible. Returns `202 { jobId, railIndex, mode }`; a missing provider CLI fails before a job starts. |
447
+ | `POST` | `/:railIndex/launch` | Launch the rail. Body `{ mode?, loopId?, profileName?, aiEngine?, model?, reasoning_effort?, originConversationId?, originSurface?, interactive? }`. `mode` is `implement` / `freestyle` / `loop` (the removed Batch mode's `batch-implement` / `batch` are accepted as input aliases and normalized to `implement`); a factory `loopId` maps to its canonical rail mode (`factory:batch` resolves to `factory:implement`). `model` and `reasoning_effort` are validated against the effective adapter/model (Kimi effort is K3-only). Kimi + a loop containing a Decider returns a capability error before the first step. Claude alone advertises persistent in-job stdin; `interactive` remains wire-compatible. Returns `202 { jobId, railIndex, mode }`; a missing provider CLI fails before a job starts. |
448
448
  | `POST` | `/:railIndex/stop` | Stop the rail's running job (cancels every job the rail registered) |
449
449
 
450
450
  ---
@@ -0,0 +1,71 @@
1
+ # CI and release execution
2
+
3
+ The required `test` check waits for quality, both complete coverage reports,
4
+ workflow and secret checks, bundled Core, provider portability and native macOS
5
+ fixtures. Failed, cancelled or skipped prerequisites cannot authorize a release.
6
+ Main/branch push CI remains available for exact-source release admission; pull
7
+ request checks do not substitute for trusted push evidence.
8
+
9
+ ## Coverage partitions
10
+
11
+ Server coverage runs on three workers, each using one Vitest process as before.
12
+ Client coverage runs on four workers. Every worker uses the locked Vitest version
13
+ and its public `--shard` option; no test filters or coverage exclusions are added.
14
+ `vitest.shard.config.ts` collects partial coverage without evaluating global
15
+ thresholds. The mandatory merge jobs use the ordinary configuration and enforce
16
+ all original thresholds on the combined coverage, including uncovered files.
17
+
18
+ `scripts/coverage-shards.mjs` records the actually executed files, complete test
19
+ inventory, commit, dependency/configuration digest, Vitest version and SHA-256 of
20
+ each blob. Before merging, it rejects missing shards, overlapping or omitted
21
+ files, unsuccessful reports, mixed identities and changed bytes. A real two-shard
22
+ fixture proves complete coverage passes and an uncovered function fails the
23
+ aggregate. A list-only command is not used to infer shard assignment: Vitest's
24
+ file listing includes the complete corpus even when a shard is requested.
25
+
26
+ To reproduce a server shard and merge downloaded artifacts:
27
+
28
+ ```sh
29
+ node scripts/coverage-shards.mjs run server 1/3 /tmp/server-shard-1
30
+ node scripts/coverage-shards.mjs merge server 3 /tmp/downloaded-server-shards
31
+ ```
32
+
33
+ Merge input must contain all three `.manifest.json` and `.blob.json` pairs from
34
+ one commit. Use `client 1/4` and `client 4` for the client. Normal local
35
+ `test:coverage` commands retain their existing behavior.
36
+
37
+ ## Verified frontend reuse
38
+
39
+ The quality job builds and package-checks the application, then uploads
40
+ `verified-desktop-client`. It contains the platform-independent production
41
+ frontend plus its commit, client lock digest and complete asset inventory with
42
+ individual checksums. Production Vite URLs are relative and contain no runner or
43
+ platform-specific endpoint.
44
+
45
+ Release admission selects the latest successful trusted push CI attempt for the
46
+ exact source SHA. A shared release job verifies and republishes that run's frontend.
47
+ If the artifact expired or predates receipts, it rebuilds the exact admitted source
48
+ once. API, identity and checksum failures remain failures; they never trigger a
49
+ rebuild fallback. Each native job checks the shared bytes before restoring them,
50
+ then builds its own platform-specific server, sidecars
51
+ and Rust shell. The three native jobs reuse the same frontend; each still signs,
52
+ notarizes where configured, and performs installed-application smoke checks.
53
+ `build:desktop` continues to build from source for local development.
54
+
55
+ ## Measuring improvements
56
+
57
+ The previous completed run `36228425753` took 15m50s including queue time; client
58
+ coverage ran for 10m53s and server coverage for 7m07s. The final check waited almost
59
+ five minutes for a runner. Compare critical-path execution and queue time
60
+ separately; more partitions reduce work per runner but cannot eliminate host
61
+ queueing. Blob manifests retain start/end and test counts for subsequent tuning.
62
+ Updated run `36230773446` passed every check. Server shards took 2m12s–2m56s
63
+ and client shards 2m52s–3m24s; each aggregate took 37s. Including queueing,
64
+ the run took 22m52s, so this loaded-run comparison does not demonstrate a total
65
+ wall-time reduction. Preserve both measures when adjusting worker counts.
66
+
67
+ The subsequent exact-head run `36233342790` passed all 18 checks in **4m05s**
68
+ including queueing (09:37:32–09:41:37 UTC). Server shards took 1m43s–2m42s,
69
+ client shards 2m18s–3m10s, and aggregation took 35s/43s. This observed run is
70
+ 74% shorter than the 15m50s baseline; the preceding queued run demonstrates why
71
+ this is an observed result, not a guaranteed hosted-runner latency.
@@ -45,9 +45,10 @@ The companion is a **light-control mirror**. It has no typed `Rail` model: rails
45
45
 
46
46
  ## 2. What rails-as-loops changed — the divergence list
47
47
 
48
- - **`loopId` is the new primary launch verb.** `POST /rails/:i/launch` now accepts `{mode='implement', profileName, aiEngine, model, interactive, loopId, reasoning_effort}` (`rails-router.ts:214-215`). `VALID_MODES` is now `{implement, batch-implement, freestyle, loop}` (`rails-router.ts:25`).
48
+ - **`loopId` is the new primary launch verb.** `POST /rails/:i/launch` now accepts `{mode='implement', profileName, aiEngine, model, interactive, loopId, reasoning_effort}` (`rails-router.ts:214-215`). `VALID_MODES` is now `{implement, freestyle, loop}`; the removed Batch mode's `batch-implement` / `batch` are input aliases normalized to `implement` (`normalizeRailMode` in `rails-router.ts`).
49
49
  - **The mode segmented-control was removed** from the desktop UI and replaced by `RailLoopSelector` (`RailControls.tsx:51-53` comment; `RailRow.tsx:414-421, 597-604`). `RailMode` still exists but is now **derived** from the loop via `deriveRailMode()` (`rail-loops.ts:34-39`), not user-picked.
50
- - **Factory→mode mapping (the compat layer).** Client factory ids `factory:implement|factory:batch|factory:freestyle` (`rail-loops.ts:8-25`); server mirror `loop-factory.ts:33-55`. `factoryLoopMode()` maps `factory:implement→implement`, `factory:batch→batch-implement`, `factory:freestyle→freestyle` (`rails-router.ts:220-224`); any custom loop → `mode='loop'`.
50
+ - **Factory→mode mapping (the compat layer).** Client factory ids `factory:implement|factory:freestyle` (`rail-loops.ts`); server mirror `loop-factory.ts`. `factoryLoopMode()` maps `factory:implement→implement`, `factory:freestyle→freestyle`, and the removed `factory:batch` alias → `implement` (`rails-router.ts:220-224`); any custom loop → `mode='loop'`.
51
+ - **Built-ins are editable rows (editable-builtin-loops).** Desktop seeds one app-global `loops` row per built-in whose id IS the factory id (`factory:implement`, `factory:freestyle`, `factory:sdd-quick-openspec`; `builtinId` set). A launch with a factory id — from the dashboard, agent chat, MCP or the phone — resolves through `resolveBuiltinLoop` (`server/modules/loops/runtime/builtin-loops.ts`): an edited Published row runs its graph, an edited Draft runs its last Published snapshot, an unedited or missing row runs the code default. The ids, the factory→mode mapping and bare-`mode` launches are unchanged, so companion launches need no change. `GET /loops/factory` still lists the built-ins (now with the row's name/description, the graph a launch would run, and `editable`/`status`/`modified`); `POST /loops/factory/:id/fork` is kept as an alias of duplicate.
51
52
  - **Loop runs are NOT job-queue jobs.** When `isLoopsEnabled()` (default ON, `feature-flags.ts:51-52`, `!== 'false'`) AND a `loopId` is present (factory OR custom), the launch routes through **`LoopRunManager`**, not `QueueManager` (`rails-router.ts:301-381`). It returns `202 {loopRunIds, railIndex, mode}` with **no `jobId`** (`rails-router.ts:379`), and rows live in a **separate `loop_runs` table** (`loop-runs-store.ts:12-32`) keyed by `loopRunId`. QueueManager fallback freestyle/implement paths still return `{jobId, ...}` (`rails-router.ts:428, 453`).
52
53
  - **New WS lifecycle family.** `loop.run_started`/`loop.run_progress`/`loop.run_stopped`/`loop.run_completed` (`types.ts:756-790`), emitted by `LoopRunManager` (`loop-run-manager.ts:469`), NOT by the `project-registry.ts:543` `onJobFinished` path that emits `rail.job_completed`. Keying: `loop.run_started`/`loop.run_stopped`/`loop.run_completed` carry `railIndex` + `loopRunId`; **`loop.run_progress` carries only `loopRunId`/`iteration`/`activeNode`/`reasoning` — NO `railIndex`** (`types.ts:756-790`). `loop.run_completed.status ∈ {success, max-iterations, stopped, failed, blocked, stalled}` — `max-iterations` is a **successful** terminal state, not a failure; **`blocked`** (the Loop Decider flagged the run needs a human decision it can't make) and **`stalled`** (the non-convergence guard aborted after consecutive iterations left the working tree unchanged) are controlled HALTS: NOT in the success set, and the settle maps them to job status `canceled` (tickets revert to todo, no PR delivery). A naive `ok = status=='success'` already treats them as non-success — correct.
53
54
  - **`GET /rails` gained `activeLoopRuns`** → `{rails, activeJobs:{[idx]:{jobId,mode}}, activeLoopRuns:{[idx]:{loopRunId}}}` (`rails-router.ts:78-82`).
@@ -73,7 +74,7 @@ The list fetch never crashes (untyped maps, tolerant parsers). But a rail runnin
73
74
  Loop runs have a `loopRunId`, never a `jobId`, and are **not in the jobs/queue tables** (`loop-runs-store.ts:12-32`). The companion's "View running job log" routes by `jobId` (`rails_zone.dart:271-281`); `watch_job`/`log_batch`/`job_event` key on `jobId` (`mobile-ws.ts:196-243`). With no `jobId`, the job-tail surface never populates and the run is absent from Execution History (`JobHistoryScreen` reads queue jobs only). **Critically, a loop run produces NO tailable log at all** — its sole live heartbeat is `loop.run_progress` (`iteration`/`activeNode`), which is dropped at `topicFor()`. So even discounting the job-log routing, there is **no live-progress channel** for a running loop rail today: the running surface is a binary running/idle black box. For legacy non-loop launches the job-tail still WORKS.
74
75
 
75
76
  **(c) LAUNCH a rail — WORKS (factory/legacy only) / BROKEN (custom loops).**
76
- The companion sends bare `{mode}` (`rails_zone.dart:317` picker = `implement|batch-implement|freestyle`; `desktop_repository.dart:116-123`). This still validates server-side (`VALID_MODES` includes the three; default `mode='implement'` at `rails-router.ts:214`). Crucially, the gateway narrowing **strips `loopId`** (`mobile-router.ts:191-196`), so even a future companion that sent `loopId` would be silently ignored. Custom loops are unreachable (`mode='loop'` without `loopId` → 400, `rails-router.ts:385-386`). **Caveat:** the *running-state feedback* after launch is broken per (a)/(b) when the launch resolves to a `LoopRunManager` run (default-ON factory loops emit `loop.run_*`, no `rail.job_started`) — so the launch HTTP call succeeds (202) but the phone sees no live activity, no progress, and no completion notification.
77
+ The companion sends bare `{mode}` (`rails_zone.dart:317` picker = `implement|batch-implement|freestyle`; `desktop_repository.dart:116-123`). This still validates server-side (`batch-implement` is normalized to `implement`; default `mode='implement'` at `rails-router.ts:214`). Crucially, the gateway narrowing **strips `loopId`** (`mobile-router.ts:191-196`), so even a future companion that sent `loopId` would be silently ignored. Custom loops are unreachable (`mode='loop'` without `loopId` → 400, `rails-router.ts:385-386`). **Caveat:** the *running-state feedback* after launch is broken per (a)/(b) when the launch resolves to a `LoopRunManager` run (default-ON factory loops emit `loop.run_*`, no `rail.job_started`) — so the launch HTTP call succeeds (202) but the phone sees no live activity, no progress, and no completion notification.
77
78
 
78
79
  **(d) Stop / assign tickets / engine — DEGRADED (stop) / WORKS (tickets) / WORKS-with-display-drift (engine).**
79
80
  - **Engine:** `PUT /rails/:i/engine {aiEngine}` WORKS end-to-end for *setting* the override (`desktop_repository.dart:127`; `mobile-router.ts:199-206`); `rail.updated` carries `aiEngine` (`types.ts:749`). The mutation needs no change. **But** the *displayed* engine drifts for loop-backed runs as noted in (a): the rail config `aiEngine` may be null while the actual run used the resolved provider/model from `loop_runs`, which is never forwarded.
@@ -114,14 +114,14 @@ specrails-desktop remove <project-id> # Unregister a project by ID
114
114
 
115
115
  ```bash
116
116
  specrails-desktop implement "#42" # Queue /specrails:implement for spec #42
117
- specrails-desktop batch-implement "#40" "#41" "#43" # Queue one batch job over several specs
117
+ specrails-desktop implement "#40" "#41" "#43" # One aggregate implement run over several specs
118
118
  specrails-desktop "any raw prompt" # Pass a raw prompt straight to the AI CLI
119
119
  specrails-desktop /specrails:health-check # Pass any slash command directly
120
120
  ```
121
121
 
122
- > **Always quote issue refs.** An unquoted `#` starts a shell comment, so `batch-implement #40 #41` silently drops the refs. Quote each one: `"#40" "#41"`.
122
+ > **Always quote issue refs.** An unquoted `#` starts a shell comment, so `implement #40 #41` silently drops the refs. Quote each one: `"#40" "#41"`.
123
123
 
124
- **Known verbs** (automatically prefixed with `/specrails:`): `implement`, `batch-implement`, `why`, `get-backlog-specs`, `auto-propose-backlog-specs`, `propose-spec`, `refactor-recommender`, `health-check`, `compat-check`, `enrich`. Any other first argument is passed as a raw prompt.
124
+ **Known verbs** (automatically prefixed with `/specrails:`): `implement`, `why`, `get-backlog-specs`, `auto-propose-backlog-specs`, `propose-spec`, `refactor-recommender`, `health-check`, `compat-check`, `enrich`. The removed `batch-implement` verb is mapped to `implement`. Any other first argument is passed as a raw prompt.
125
125
 
126
126
  ### Port override example
127
127
 
@@ -13,10 +13,11 @@ framework is rejected rather than silently replacing an update.
13
13
 
14
14
  ## Persistence and publication
15
15
 
16
- The release bundle pins Core 6.0.0 in `desktop-release.yml` and
16
+ The release bundle pins Core 6.1.0 in `desktop-release.yml` and
17
17
  `scripts/assemble-bundled-core.lock.json`. Core 6 is the Desktop-only engine: it
18
18
  publishes integration contract 5.0 (no standalone `update`) and ships only the
19
- implement, batch-implement and retry workflows. Update both pins together and check compatibility against
19
+ implement and retry workflows (Batch was folded into implement; Desktop no
20
+ longer requires `batch-implement` but stays compatible with Cores that still ship it). Update both pins together and check compatibility against
20
21
  the staged published package; retained runs still use their original runtime.
21
22
 
22
23
  Desktop updates retain the complete npm installation, including dependencies,