specrails-desktop 2.64.2 → 2.65.1

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 (1116) hide show
  1. package/README.md +1 -1
  2. package/cli/dist/status.js +3 -0
  3. package/client/dist/assets/ActivityFeedPage-ByVKYII-.js +1 -0
  4. package/client/dist/assets/AgentBrowserCapture-BGUTjhUr.js +1 -0
  5. package/client/dist/assets/AgentModeAnalyticsPane-CtOLDDjB.js +2 -0
  6. package/client/dist/assets/AgentModeCodePane-CDhUKarT.js +2 -0
  7. package/client/dist/assets/AgentModeJobsPane-BAa_oEHJ.js +1 -0
  8. package/client/dist/assets/AgentsPage-D32hG4Ve.js +120 -0
  9. package/client/dist/assets/AnalyticsPage-BU50zeG6.js +5 -0
  10. package/client/dist/assets/BudgetCard-DP_jxwaD.js +55 -0
  11. package/client/dist/assets/CodePage-jiYnKGpp.js +3 -0
  12. package/client/dist/assets/CostValue-Bvn8674q.js +1 -0
  13. package/client/dist/assets/DesktopAnalyticsPage-CF__H4e3.js +1 -0
  14. package/client/dist/assets/DocView-RrAp70zp.js +11 -0
  15. package/client/dist/assets/DocsDialog-DkqHU-JF.js +1 -0
  16. package/client/dist/assets/DocsPage-C6X089zC.js +1 -0
  17. package/client/dist/assets/ExportDropdown-C5-o8y3K.js +1 -0
  18. package/client/dist/assets/HelpHint-Crf9_uoR.js +1 -0
  19. package/client/dist/assets/IntegrationsPage-aflU3KHK.js +1 -0
  20. package/client/dist/assets/InteractiveJobComposer-CEMMhyyJ.js +19 -0
  21. package/client/dist/assets/JobDetailModal-BVJ6hyRs.js +1 -0
  22. package/client/dist/assets/JobDetailPage-DHzBUmox.js +1 -0
  23. package/client/dist/assets/JobsPage-o-LAqkwC.js +1 -0
  24. package/client/dist/assets/LoopBuilderPage-DbSVmXBM.js +1 -0
  25. package/client/dist/assets/LoopPreviewModal-DbJcVyN1.js +1 -0
  26. package/client/dist/assets/{LoopWindowSurface-DE0v2K1p.js → LoopWindowSurface-Co1ZK26V.js} +1 -1
  27. package/client/dist/assets/LoopsPage-C4lgkPXB.js +2 -0
  28. package/client/dist/assets/MinimizedChatsContext-742ypO8n.js +1 -0
  29. package/client/dist/assets/PluginsPage-Acks9ges.js +2 -0
  30. package/client/dist/assets/RailTrack-BfLmBzBh.js +1 -0
  31. package/client/dist/assets/{RepositoryScopeSelector-2eSqR9WK.js → RepositoryScopeSelector-DcxbKI9w.js} +1 -1
  32. package/client/dist/assets/ReviewPacketPage-CAVSIOAJ.js +7 -0
  33. package/client/dist/assets/TemplatePreviewModal-C23SYCTm.js +1 -0
  34. package/client/dist/assets/TicketDetailModalContext-B-Gtm6Ob.js +23 -0
  35. package/client/dist/assets/Trans-C6J0cLyh.js +1 -0
  36. package/client/dist/assets/a11y-prefs-BqoP5goK.js +1 -0
  37. package/client/dist/assets/activity-BBWfoUOG.js +1 -0
  38. package/client/dist/assets/activity-BM_skann.js +1 -0
  39. package/client/dist/assets/activity-Cevl82ke.js +1 -0
  40. package/client/dist/assets/activity-CmACk5W5.js +1 -0
  41. package/client/dist/assets/activity-D9LBw3PQ.js +1 -0
  42. package/client/dist/assets/activity-Dspbb9lz.js +1 -0
  43. package/client/dist/assets/activity-FPjYIjv9.js +1 -0
  44. package/client/dist/assets/activity-nLCKMUKt.js +1 -0
  45. package/client/dist/assets/addspec-BI4jDMhA.js +1 -0
  46. package/client/dist/assets/addspec-BldTv7Tl.js +1 -0
  47. package/client/dist/assets/addspec-Cdq-2EcC.js +1 -0
  48. package/client/dist/assets/addspec-DH5M16BQ.js +1 -0
  49. package/client/dist/assets/addspec-DOFo9pD5.js +1 -0
  50. package/client/dist/assets/addspec-DPkwhdmL.js +1 -0
  51. package/client/dist/assets/addspec-Dzy12Pv3.js +1 -0
  52. package/client/dist/assets/addspec-skTs6EEW.js +1 -0
  53. package/client/dist/assets/agent-B_UEUy7Y.js +1 -0
  54. package/client/dist/assets/agent-BarjlhTA.js +1 -0
  55. package/client/dist/assets/agent-BfqIITo5.js +1 -0
  56. package/client/dist/assets/agent-Bt9a7Kyj.js +1 -0
  57. package/client/dist/assets/agent-C3689RwP.js +1 -0
  58. package/client/dist/assets/agent-CrmboTAi.js +1 -0
  59. package/client/dist/assets/agent-DcsoTnuE.js +1 -0
  60. package/client/dist/assets/agent-GDZoYwd4.js +1 -0
  61. package/client/dist/assets/{agentRuntime-es2ymSl-.js → agentRuntime-BYH70bKY.js} +1 -1
  62. package/client/dist/assets/agentRuntime-BijLh8I9.js +1 -0
  63. package/client/dist/assets/{agentRuntime-BzuwQQgn.js → agentRuntime-BvyuETPe.js} +1 -1
  64. package/client/dist/assets/{agentRuntime-BDvbJMmS.js → agentRuntime-C2WI6HQh.js} +1 -1
  65. package/client/dist/assets/{agentRuntime-BKJfv5YD.js → agentRuntime-CZPIlQsr.js} +1 -1
  66. package/client/dist/assets/{agentRuntime-DiCldqGG.js → agentRuntime-D2dDvCyJ.js} +1 -1
  67. package/client/dist/assets/agentRuntime-DWZedEbn.js +1 -0
  68. package/client/dist/assets/agentRuntime-DkIruUNw.js +1 -0
  69. package/client/dist/assets/agents-35_PDKx9.js +1 -0
  70. package/client/dist/assets/agents-8fZnHhEQ.js +1 -0
  71. package/client/dist/assets/agents-Bgimtw8z.js +1 -0
  72. package/client/dist/assets/agents-C4P160Us.js +1 -0
  73. package/client/dist/assets/agents-Clg67zbp.js +1 -0
  74. package/client/dist/assets/agents-DJfF4o6G.js +1 -0
  75. package/client/dist/assets/agents-Dc9-Y5cw.js +1 -0
  76. package/client/dist/assets/agents-EN1Zl4YZ.js +1 -0
  77. package/client/dist/assets/agentstudio-Bm4-NYaG.js +1 -0
  78. package/client/dist/assets/agentstudio-CD1fuj2o.js +1 -0
  79. package/client/dist/assets/agentstudio-CQGWFSst.js +1 -0
  80. package/client/dist/assets/agentstudio-CqVSb65S.js +1 -0
  81. package/client/dist/assets/agentstudio-DIE_HjsX.js +1 -0
  82. package/client/dist/assets/agentstudio-D_OmQK-k.js +1 -0
  83. package/client/dist/assets/agentstudio-Djz9aUfb.js +1 -0
  84. package/client/dist/assets/agentstudio-Qa3v9o5J.js +1 -0
  85. package/client/dist/assets/{aiedit-DNXxq_Dr.js → aiedit-1VzLs37W.js} +1 -1
  86. package/client/dist/assets/{aiedit-DCjA7jLJ.js → aiedit-BNp6GSik.js} +1 -1
  87. package/client/dist/assets/{aiedit-BoG24nlg.js → aiedit-BOY5xRPi.js} +1 -1
  88. package/client/dist/assets/{aiedit-iIjz2_Qk.js → aiedit-BrqMZvbc.js} +1 -1
  89. package/client/dist/assets/{aiedit-CjlSRQVP.js → aiedit-CVgtl7hm.js} +1 -1
  90. package/client/dist/assets/{aiedit-DQ-0_pvE.js → aiedit-CrFW9Jd2.js} +1 -1
  91. package/client/dist/assets/{aiedit-olnv3QSt.js → aiedit-YE2lILp7.js} +1 -1
  92. package/client/dist/assets/{aiedit-B0KUbpB6.js → aiedit-iA_R1AVQ.js} +1 -1
  93. package/client/dist/assets/analytics-3w0t-4ic.js +1 -0
  94. package/client/dist/assets/analytics-BRi4KQD6.js +1 -0
  95. package/client/dist/assets/analytics-BtjAqzke.js +1 -0
  96. package/client/dist/assets/analytics-COSQ1h47.js +1 -0
  97. package/client/dist/assets/analytics-CP2HjESk.js +1 -0
  98. package/client/dist/assets/analytics-DY65TC62.js +1 -0
  99. package/client/dist/assets/analytics-Den_vvxn.js +1 -0
  100. package/client/dist/assets/analytics-LmBS96O8.js +1 -0
  101. package/client/dist/assets/api-DOGbyfTO.js +2 -0
  102. package/client/dist/assets/builder-BMVvSr4v.js +1 -0
  103. package/client/dist/assets/builder-BN-MuLZt.js +1 -0
  104. package/client/dist/assets/builder-BQOZi4CF.js +1 -0
  105. package/client/dist/assets/builder-BjUPjsyu.js +1 -0
  106. package/client/dist/assets/builder-BoBtN18T.js +1 -0
  107. package/client/dist/assets/builder-C5g5NhxL.js +1 -0
  108. package/client/dist/assets/builder-RUHXw3yx.js +1 -0
  109. package/client/dist/assets/builder-fyS_AiyC.js +1 -0
  110. package/client/dist/assets/button-CHPkroew.js +1 -0
  111. package/client/dist/assets/chat-C9L5T7KI.js +1 -0
  112. package/client/dist/assets/chevron-right-CwMAj0w_.js +1 -0
  113. package/client/dist/assets/chevron-up-BAMuP0XD.js +1 -0
  114. package/client/dist/assets/chunk-OB3PAWPO-BBaq6pUk.js +3 -0
  115. package/client/dist/assets/code-4le5IIbf.js +1 -0
  116. package/client/dist/assets/code-B-jCVIbm.js +1 -0
  117. package/client/dist/assets/code-BRfrn5ix.js +1 -0
  118. package/client/dist/assets/code-CC9NCrDM.js +1 -0
  119. package/client/dist/assets/code-CK6pm8wY.js +1 -0
  120. package/client/dist/assets/code-DDiOzd6c.js +1 -0
  121. package/client/dist/assets/code-tGifiyf5.js +1 -0
  122. package/client/dist/assets/code-xkn8kQTg.js +1 -0
  123. package/client/dist/assets/commands-Bv1QshHR.js +1 -0
  124. package/client/dist/assets/commands-BvxTxboW.js +1 -0
  125. package/client/dist/assets/commands-C5ORR0fO.js +1 -0
  126. package/client/dist/assets/commands-CBKMFSTV.js +1 -0
  127. package/client/dist/assets/commands-CFJIRsJv.js +1 -0
  128. package/client/dist/assets/commands-D9o3ZcXl.js +1 -0
  129. package/client/dist/assets/commands-DNox0Edk.js +1 -0
  130. package/client/dist/assets/commands-DmIUMLdV.js +1 -0
  131. package/client/dist/assets/common-5H4TkaoI.js +1 -0
  132. package/client/dist/assets/common-9S3OdPjx.js +1 -0
  133. package/client/dist/assets/common-BqnwIcjs.js +1 -0
  134. package/client/dist/assets/common-CQP3VafS.js +1 -0
  135. package/client/dist/assets/common-CZnAfkB2.js +1 -0
  136. package/client/dist/assets/common-D5sNttV4.js +1 -0
  137. package/client/dist/assets/common-k_qX9nlv.js +1 -0
  138. package/client/dist/assets/common-s4HIi9XI.js +1 -0
  139. package/client/dist/assets/compass-B7guwBlY.js +1 -0
  140. package/client/dist/assets/confirm-dialog-ChZdHL3Q.js +1 -0
  141. package/client/dist/assets/copy-DOPlLymH.js +1 -0
  142. package/client/dist/assets/core-BozBzB6Y.js +1 -0
  143. package/client/dist/assets/dashboard-6zGLGcEz.js +1 -0
  144. package/client/dist/assets/dashboard-8Gi0FBDq.js +1 -0
  145. package/client/dist/assets/dashboard-B7E5YrSy.js +1 -0
  146. package/client/dist/assets/dashboard-BhdKV8xK.js +1 -0
  147. package/client/dist/assets/dashboard-Bu3zzH_s.js +1 -0
  148. package/client/dist/assets/dashboard-Ce_6rELA.js +1 -0
  149. package/client/dist/assets/dashboard-DWY-oz8P.js +1 -0
  150. package/client/dist/assets/dashboard-gUzlWk0o.js +1 -0
  151. package/client/dist/assets/date-input-Cdlr8kHz.js +1 -0
  152. package/client/dist/assets/dialog-C23lB2iP.js +5 -0
  153. package/client/dist/assets/dist-Di-oOFkX.js +1 -0
  154. package/client/dist/assets/dist-js-CBmS6MsJ.js +1 -0
  155. package/client/dist/assets/{dist-js-Rlh4FLH5.js → dist-js-DaJmKapi.js} +1 -1
  156. package/client/dist/assets/dropdown-menu-Bfp2CK6H.js +1 -0
  157. package/client/dist/assets/empty-state-D5w9OWj-.js +1 -0
  158. package/client/dist/assets/es2015-DfnECntk.js +41 -0
  159. package/client/dist/assets/esm-BKF6CE7v.js +1 -0
  160. package/client/dist/assets/event-BEnMLqAi.js +1 -0
  161. package/client/dist/assets/explore--NOz9LCN.js +1 -0
  162. package/client/dist/assets/explore-B2ulH6dO.js +1 -0
  163. package/client/dist/assets/explore-BD-QiLdg.js +1 -0
  164. package/client/dist/assets/explore-BOqd4_1j.js +1 -0
  165. package/client/dist/assets/explore-Be_Zh5zu.js +1 -0
  166. package/client/dist/assets/explore-CLjzPSKo.js +1 -0
  167. package/client/dist/assets/explore-D_-vHm29.js +1 -0
  168. package/client/dist/assets/explore-yEQTF6ro.js +1 -0
  169. package/client/dist/assets/file-text-CNXzL3wj.js +1 -0
  170. package/client/dist/assets/format-BODoFIw6.js +1 -0
  171. package/client/dist/assets/formatDistanceToNow-DLMIOS0N.js +1 -0
  172. package/client/dist/assets/getTimezoneOffsetInMilliseconds-O61feXch.js +1 -0
  173. package/client/dist/assets/git-compare-arrows-Cu6tICCq.js +1 -0
  174. package/client/dist/assets/humanise-command-CB4ybLwq.js +1 -0
  175. package/client/dist/assets/inbox-BLZ8cm6_.js +1 -0
  176. package/client/dist/assets/inbox-BQ3VmNYY.js +1 -0
  177. package/client/dist/assets/inbox-BdcXWCuT.js +1 -0
  178. package/client/dist/assets/inbox-CF1PHjns.js +1 -0
  179. package/client/dist/assets/inbox-CFNPDhso.js +1 -0
  180. package/client/dist/assets/inbox-DIttK_NW.js +1 -0
  181. package/client/dist/assets/inbox-Dfdv1Ykl.js +1 -0
  182. package/client/dist/assets/inbox-JS1inmeO.js +1 -0
  183. package/client/dist/assets/index-4UWY7Xyz.css +2 -0
  184. package/client/dist/assets/index-DHzB0T26.js +120 -0
  185. package/client/dist/assets/integrations-BcKgzgPD.js +1 -0
  186. package/client/dist/assets/integrations-BmX_XyJq.js +1 -0
  187. package/client/dist/assets/integrations-CHpwMjlY.js +1 -0
  188. package/client/dist/assets/integrations-CT3kr8e-.js +1 -0
  189. package/client/dist/assets/integrations-C_5XAkgz.js +1 -0
  190. package/client/dist/assets/integrations-Ct9zLX7N.js +1 -0
  191. package/client/dist/assets/integrations-DEYemxUv.js +1 -0
  192. package/client/dist/assets/integrations-DWvsB_WB.js +1 -0
  193. package/client/dist/assets/{jira-Cq6yvN4q.js → jira-B_ERkFRv.js} +1 -1
  194. package/client/dist/assets/jira-Bn-A5lwD.js +1 -0
  195. package/client/dist/assets/jira-C71Ybnhp.js +1 -0
  196. package/client/dist/assets/jira-CkwjeJz6.js +1 -0
  197. package/client/dist/assets/jira-D9pSLXjI.js +1 -0
  198. package/client/dist/assets/jira-DBRS_lcp.js +1 -0
  199. package/client/dist/assets/jira-DHS6CsKh.js +1 -0
  200. package/client/dist/assets/jira-MInHRUb1.js +1 -0
  201. package/client/dist/assets/jira-api-DHme7Upx.js +1 -0
  202. package/client/dist/assets/jobs-BMLTDo63.js +1 -0
  203. package/client/dist/assets/jobs-BO8q4Mi1.js +1 -0
  204. package/client/dist/assets/jobs-Ck8uOWMM.js +1 -0
  205. package/client/dist/assets/jobs-CyFfPCpg.js +1 -0
  206. package/client/dist/assets/jobs-DT5s4fZ6.js +1 -0
  207. package/client/dist/assets/jobs-DZAgVPcD.js +1 -0
  208. package/client/dist/assets/jobs-b5gPYaKr.js +1 -0
  209. package/client/dist/assets/jobs-xsZK1440.js +1 -0
  210. package/client/dist/assets/launch-forecast-BTa-p3RP.js +1 -0
  211. package/client/dist/assets/{loop-layout-DtxX27Jz.css → loop-layout-DLioOiRN.css} +1 -1
  212. package/client/dist/assets/loop-layout-Sl9cfTvs.js +7 -0
  213. package/client/dist/assets/loops-BEEOVJDR.js +1 -0
  214. package/client/dist/assets/loops-BcrQ2vk7.js +1 -0
  215. package/client/dist/assets/loops-BjWxzJIZ.js +1 -0
  216. package/client/dist/assets/loops-BogV595N.js +1 -0
  217. package/client/dist/assets/loops-CU0BLZiz.js +1 -0
  218. package/client/dist/assets/loops-CrNBgi1G.js +1 -0
  219. package/client/dist/assets/loops-CwalwS_i.js +1 -0
  220. package/client/dist/assets/loops-_TDVN-fX.js +1 -0
  221. package/client/dist/assets/mcp-BNs8gxoL.js +1 -0
  222. package/client/dist/assets/mcp-BvRh_xO5.js +1 -0
  223. package/client/dist/assets/mcp-C2F1pghi.js +1 -0
  224. package/client/dist/assets/mcp-D9RLKAs2.js +1 -0
  225. package/client/dist/assets/mcp-DAghcsR0.js +1 -0
  226. package/client/dist/assets/mcp-DWWAPi1G.js +1 -0
  227. package/client/dist/assets/mcp-DbGSFC3f.js +1 -0
  228. package/client/dist/assets/mcp-FelCicrv.js +1 -0
  229. package/client/dist/assets/narration-C3NBkAR4.js +1 -0
  230. package/client/dist/assets/narration-CkoJq-Lf.js +1 -0
  231. package/client/dist/assets/narration-Cr0NeW9K.js +1 -0
  232. package/client/dist/assets/narration-DJUXOs-W.js +1 -0
  233. package/client/dist/assets/narration-DgL8TMvN.js +1 -0
  234. package/client/dist/assets/narration-DjBafgv0.js +1 -0
  235. package/client/dist/assets/narration-Dle6Iv0c.js +1 -0
  236. package/client/dist/assets/narration-MYlfktga.js +1 -0
  237. package/client/dist/assets/nav-BSQ8KW1c.js +1 -0
  238. package/client/dist/assets/nav-BauVof8Z.js +1 -0
  239. package/client/dist/assets/nav-BfOAH1se.js +1 -0
  240. package/client/dist/assets/nav-D3bOsipX.js +1 -0
  241. package/client/dist/assets/nav-DOMMhlLx.js +1 -0
  242. package/client/dist/assets/nav-DPzVlgZU.js +1 -0
  243. package/client/dist/assets/nav-DZJbFbah.js +1 -0
  244. package/client/dist/assets/nav-D_5aojd2.js +1 -0
  245. package/client/dist/assets/notify-error-BsWANx1T.js +1 -0
  246. package/client/dist/assets/onboarding-BdZQnNm3.js +1 -0
  247. package/client/dist/assets/onboarding-CJQEv1vp.js +1 -0
  248. package/client/dist/assets/onboarding-CWJGYUW3.js +1 -0
  249. package/client/dist/assets/onboarding-ChfYN7dA.js +1 -0
  250. package/client/dist/assets/onboarding-CjvDUR3V.js +1 -0
  251. package/client/dist/assets/onboarding-I6vS-zTB.js +1 -0
  252. package/client/dist/assets/onboarding-dgC_9dTB.js +1 -0
  253. package/client/dist/assets/onboarding-mlXSyKzX.js +1 -0
  254. package/client/dist/assets/origin-03nTuaOb.js +1 -0
  255. package/client/dist/assets/packet-BjpyRnZr.js +1 -0
  256. package/client/dist/assets/packet-BwgG5mBt.js +1 -0
  257. package/client/dist/assets/packet-C3eAUFkV.js +1 -0
  258. package/client/dist/assets/packet-C8wZuSld.js +1 -0
  259. package/client/dist/assets/packet-CNXEy_85.js +1 -0
  260. package/client/dist/assets/packet-DsV5Aa_8.js +1 -0
  261. package/client/dist/assets/packet-aasskOE7.js +1 -0
  262. package/client/dist/assets/packet-phxCc2gJ.js +1 -0
  263. package/client/dist/assets/page-header-BStSHkP8.js +1 -0
  264. package/client/dist/assets/project-repositories-DJPeAVBK.js +1 -0
  265. package/client/dist/assets/{provider-capabilities-lePfeT_Y.js → provider-capabilities-DtwcTme4.js} +1 -1
  266. package/client/dist/assets/recovery-BPDOsC92.js +1 -0
  267. package/client/dist/assets/recovery-BluNHoXM.js +1 -0
  268. package/client/dist/assets/recovery-CRvEmB0C.js +1 -0
  269. package/client/dist/assets/recovery-CeIoRnkR.js +1 -0
  270. package/client/dist/assets/recovery-DHCo8KGi.js +1 -0
  271. package/client/dist/assets/recovery-OxAIpbBF.js +1 -0
  272. package/client/dist/assets/recovery-XXexYGOJ.js +1 -0
  273. package/client/dist/assets/recovery-pITlc--v.js +1 -0
  274. package/client/dist/assets/refresh-cw-DfyTkbsf.js +1 -0
  275. package/client/dist/assets/select-xA3pSmqE.js +1 -0
  276. package/client/dist/assets/settings--yzDbX9r.js +1 -0
  277. package/client/dist/assets/settings-5_heTv8s.js +1 -0
  278. package/client/dist/assets/settings-BSf27MDg.js +1 -0
  279. package/client/dist/assets/settings-BSj6FakR.js +1 -0
  280. package/client/dist/assets/settings-BZDo_8Nn.js +1 -0
  281. package/client/dist/assets/settings-BdWgmNc0.js +1 -0
  282. package/client/dist/assets/settings-DRouxKqb.js +1 -0
  283. package/client/dist/assets/settings-DnWFoY-F.js +1 -0
  284. package/client/dist/assets/setup-BJWy62ri.js +1 -0
  285. package/client/dist/assets/setup-BgKOIuzc.js +1 -0
  286. package/client/dist/assets/setup-BvVIyUlz.js +1 -0
  287. package/client/dist/assets/setup-BxCk2pe1.js +1 -0
  288. package/client/dist/assets/setup-C-xQTL7R.js +1 -0
  289. package/client/dist/assets/setup-CbaVoiwV.js +1 -0
  290. package/client/dist/assets/setup-DxTBkX3P.js +1 -0
  291. package/client/dist/assets/setup-oGoVAzOD.js +1 -0
  292. package/client/dist/assets/specs-7tAb4IKr.js +1 -0
  293. package/client/dist/assets/specs-BUcY4s5v.js +1 -0
  294. package/client/dist/assets/specs-Bk5LeBAA.js +1 -0
  295. package/client/dist/assets/specs-CAA4Lrlg.js +1 -0
  296. package/client/dist/assets/specs-CS091AnA.js +1 -0
  297. package/client/dist/assets/specs-DJ6gmFcK.js +1 -0
  298. package/client/dist/assets/specs-GfCcrBSC.js +1 -0
  299. package/client/dist/assets/specs-xQgyc7WL.js +1 -0
  300. package/client/dist/assets/spending-CVH8VREb.js +1 -0
  301. package/client/dist/assets/square-Co6h5vZg.js +1 -0
  302. package/client/dist/assets/tauri-shell-43ixPGfa.js +2 -0
  303. package/client/dist/assets/terminal-0v9sBylD.js +1 -0
  304. package/client/dist/assets/terminal-AbUAmCxE.js +1 -0
  305. package/client/dist/assets/terminal-BJayIbIP.js +1 -0
  306. package/client/dist/assets/terminal-C2RUlXyi.js +1 -0
  307. package/client/dist/assets/terminal-CMmSb_Nj.js +1 -0
  308. package/client/dist/assets/terminal-DKWjj7HJ.js +1 -0
  309. package/client/dist/assets/terminal-KlFu7_pV.js +1 -0
  310. package/client/dist/assets/terminal-i99yqFvm.js +1 -0
  311. package/client/dist/assets/tickets-846Oq3i3.js +1 -0
  312. package/client/dist/assets/tickets-B5LJTe_b.js +1 -0
  313. package/client/dist/assets/tickets-Bfo2GGmH.js +1 -0
  314. package/client/dist/assets/tickets-BhdZ1yY2.js +1 -0
  315. package/client/dist/assets/tickets-CgjWJHAW.js +1 -0
  316. package/client/dist/assets/tickets-Ct9DbDUR.js +1 -0
  317. package/client/dist/assets/tickets-rptLEJB1.js +1 -0
  318. package/client/dist/assets/tickets-xQ6DpYdu.js +1 -0
  319. package/client/dist/assets/trending-up-BGvb4zZt.js +1 -0
  320. package/client/dist/assets/undo-6zuS4-sL.js +1 -0
  321. package/client/dist/assets/undo-BeM4gDOP.js +1 -0
  322. package/client/dist/assets/undo-BeppX8xS.js +1 -0
  323. package/client/dist/assets/undo-BqvNZ5MG.js +1 -0
  324. package/client/dist/assets/undo-BzwEPf_k.js +1 -0
  325. package/client/dist/assets/undo-CJ9Cu1NN.js +1 -0
  326. package/client/dist/assets/undo-ds8nMFbX.js +1 -0
  327. package/client/dist/assets/undo-x_gA-knG.js +1 -0
  328. package/client/dist/assets/useDesktop-BuOp2-MR.js +1 -0
  329. package/client/dist/assets/useRuntimeRuns-BRS6ncnO.js +1 -0
  330. package/client/dist/assets/utils-ELimjS2Y.js +1 -0
  331. package/client/dist/assets/wrench-Br2n1Lxd.js +1 -0
  332. package/client/dist/index.html +75 -60
  333. package/docs/ci-cd.md +29 -1
  334. package/docs/cli.md +10 -31
  335. package/docs/codex.md +1 -1
  336. package/docs/creating-specs.md +15 -12
  337. package/docs/customizing.md +16 -13
  338. package/docs/getting-started.md +12 -11
  339. package/docs/guide/de/agents/1-meet-the-agents.md +1 -1
  340. package/docs/guide/de/getting-started/2-installing-and-first-run.md +2 -0
  341. package/docs/guide/de/getting-started/3-try-the-sample-project.md +35 -0
  342. package/docs/guide/de/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
  343. package/docs/guide/de/getting-started/6-universal-search.md +34 -0
  344. package/docs/guide/de/insights/1-analytics-and-cost-tracking.md +20 -6
  345. package/docs/guide/de/insights/2-the-integrated-terminal.md +1 -1
  346. package/docs/guide/de/insights/3-code-explorer.md +1 -1
  347. package/docs/guide/de/integrations/1-ai-providers.md +1 -1
  348. package/docs/guide/de/integrations/2-plugins.md +1 -1
  349. package/docs/guide/de/integrations/3-jira-integration.md +3 -3
  350. package/docs/guide/de/integrations/4-mobile-companion.md +1 -1
  351. package/docs/guide/de/integrations/5-mcp-server.md +1 -1
  352. package/docs/guide/de/integrations/6-agent-chat.md +12 -5
  353. package/docs/guide/de/integrations/8-flow-mode.md +69 -0
  354. package/docs/guide/de/pipeline/1-rails-and-jobs.md +21 -1
  355. package/docs/guide/de/pipeline/2-the-job-detail-view.md +12 -0
  356. package/docs/guide/de/pipeline/3-reviewing-a-delivery.md +43 -0
  357. package/docs/guide/de/pipeline/4-picking-an-engine-per-rail.md +2 -2
  358. package/docs/guide/de/pipeline/5-the-loop-builder.md +1 -1
  359. package/docs/guide/de/settings/1-themes.md +1 -1
  360. package/docs/guide/de/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
  361. package/docs/guide/de/settings/5-project-environment.md +1 -1
  362. package/docs/guide/de/settings/6-updates.md +24 -0
  363. package/docs/guide/de/settings/7-existing-projects.md +33 -0
  364. package/docs/guide/de/settings/8-accessibility.md +23 -0
  365. package/docs/guide/de/specs/1-specs-and-the-backlog.md +41 -3
  366. package/docs/guide/de/specs/2-add-spec-quick-mode.md +1 -1
  367. package/docs/guide/de/specs/3-add-spec-explore-mode.md +1 -1
  368. package/docs/guide/en/agents/1-meet-the-agents.md +1 -1
  369. package/docs/guide/en/getting-started/1-what-is-specrails.md +1 -1
  370. package/docs/guide/en/getting-started/2-installing-and-first-run.md +2 -0
  371. package/docs/guide/en/getting-started/3-try-the-sample-project.md +35 -0
  372. package/docs/guide/en/getting-started/5-the-dashboard-tour.md +52 -0
  373. package/docs/guide/en/getting-started/6-universal-search.md +34 -0
  374. package/docs/guide/en/insights/1-analytics-and-cost-tracking.md +24 -10
  375. package/docs/guide/en/insights/2-the-integrated-terminal.md +1 -1
  376. package/docs/guide/en/insights/3-code-explorer.md +5 -5
  377. package/docs/guide/en/integrations/1-ai-providers.md +1 -1
  378. package/docs/guide/en/integrations/2-plugins.md +1 -1
  379. package/docs/guide/en/integrations/3-jira-integration.md +4 -4
  380. package/docs/guide/en/integrations/4-mobile-companion.md +1 -1
  381. package/docs/guide/en/integrations/5-mcp-server.md +4 -4
  382. package/docs/guide/en/integrations/6-agent-chat.md +12 -5
  383. package/docs/guide/en/integrations/8-flow-mode.md +69 -0
  384. package/docs/guide/en/pipeline/1-rails-and-jobs.md +22 -3
  385. package/docs/guide/en/pipeline/2-the-job-detail-view.md +19 -7
  386. package/docs/guide/en/pipeline/3-reviewing-a-delivery.md +43 -0
  387. package/docs/guide/en/pipeline/4-picking-an-engine-per-rail.md +2 -2
  388. package/docs/guide/en/pipeline/5-the-loop-builder.md +2 -2
  389. package/docs/guide/en/settings/1-themes.md +1 -1
  390. package/docs/guide/en/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
  391. package/docs/guide/en/settings/5-project-environment.md +1 -1
  392. package/docs/guide/en/settings/6-updates.md +24 -0
  393. package/docs/guide/en/settings/7-existing-projects.md +33 -0
  394. package/docs/guide/en/settings/8-accessibility.md +23 -0
  395. package/docs/guide/en/specs/1-specs-and-the-backlog.md +42 -6
  396. package/docs/guide/en/specs/2-add-spec-quick-mode.md +1 -1
  397. package/docs/guide/en/specs/3-add-spec-explore-mode.md +2 -2
  398. package/docs/guide/es/agents/1-meet-the-agents.md +1 -1
  399. package/docs/guide/es/agents/2-profiles-and-the-balanced-default.md +1 -1
  400. package/docs/guide/es/agents/3-customizing-models-per-agent.md +2 -2
  401. package/docs/guide/es/agents/4-custom-agents-catalog.md +1 -1
  402. package/docs/guide/es/getting-started/1-what-is-specrails.md +3 -3
  403. package/docs/guide/es/getting-started/2-installing-and-first-run.md +2 -0
  404. package/docs/guide/es/getting-started/3-try-the-sample-project.md +35 -0
  405. package/docs/guide/es/getting-started/5-the-dashboard-tour.md +52 -0
  406. package/docs/guide/es/getting-started/6-universal-search.md +34 -0
  407. package/docs/guide/es/insights/1-analytics-and-cost-tracking.md +26 -12
  408. package/docs/guide/es/insights/2-the-integrated-terminal.md +1 -1
  409. package/docs/guide/es/insights/3-code-explorer.md +5 -5
  410. package/docs/guide/es/integrations/1-ai-providers.md +1 -1
  411. package/docs/guide/es/integrations/2-plugins.md +1 -1
  412. package/docs/guide/es/integrations/3-jira-integration.md +4 -4
  413. package/docs/guide/es/integrations/4-mobile-companion.md +1 -1
  414. package/docs/guide/es/integrations/5-mcp-server.md +4 -4
  415. package/docs/guide/es/integrations/6-agent-chat.md +14 -7
  416. package/docs/guide/es/integrations/7-local-engines.md +1 -1
  417. package/docs/guide/es/integrations/8-flow-mode.md +69 -0
  418. package/docs/guide/es/pipeline/1-rails-and-jobs.md +33 -13
  419. package/docs/guide/es/pipeline/2-the-job-detail-view.md +38 -26
  420. package/docs/guide/es/pipeline/3-reviewing-a-delivery.md +43 -0
  421. package/docs/guide/es/pipeline/4-picking-an-engine-per-rail.md +2 -2
  422. package/docs/guide/es/pipeline/5-the-loop-builder.md +4 -4
  423. package/docs/guide/es/settings/1-themes.md +1 -1
  424. package/docs/guide/es/settings/3-pipeline-telemetry-and-diagnostics.md +10 -10
  425. package/docs/guide/es/settings/5-project-environment.md +1 -1
  426. package/docs/guide/es/settings/6-updates.md +24 -0
  427. package/docs/guide/es/settings/7-existing-projects.md +33 -0
  428. package/docs/guide/es/settings/8-accessibility.md +23 -0
  429. package/docs/guide/es/specs/1-specs-and-the-backlog.md +43 -7
  430. package/docs/guide/es/specs/2-add-spec-quick-mode.md +1 -1
  431. package/docs/guide/es/specs/3-add-spec-explore-mode.md +3 -3
  432. package/docs/guide/fr/agents/1-meet-the-agents.md +1 -1
  433. package/docs/guide/fr/getting-started/2-installing-and-first-run.md +2 -0
  434. package/docs/guide/fr/getting-started/3-try-the-sample-project.md +35 -0
  435. package/docs/guide/fr/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
  436. package/docs/guide/fr/getting-started/6-universal-search.md +34 -0
  437. package/docs/guide/fr/insights/1-analytics-and-cost-tracking.md +18 -4
  438. package/docs/guide/fr/insights/2-the-integrated-terminal.md +1 -1
  439. package/docs/guide/fr/insights/3-code-explorer.md +1 -1
  440. package/docs/guide/fr/integrations/1-ai-providers.md +1 -1
  441. package/docs/guide/fr/integrations/2-plugins.md +1 -1
  442. package/docs/guide/fr/integrations/3-jira-integration.md +3 -3
  443. package/docs/guide/fr/integrations/4-mobile-companion.md +1 -1
  444. package/docs/guide/fr/integrations/5-mcp-server.md +1 -1
  445. package/docs/guide/fr/integrations/6-agent-chat.md +11 -4
  446. package/docs/guide/fr/integrations/8-flow-mode.md +69 -0
  447. package/docs/guide/fr/pipeline/1-rails-and-jobs.md +21 -1
  448. package/docs/guide/fr/pipeline/2-the-job-detail-view.md +12 -0
  449. package/docs/guide/fr/pipeline/3-reviewing-a-delivery.md +43 -0
  450. package/docs/guide/fr/pipeline/4-picking-an-engine-per-rail.md +2 -2
  451. package/docs/guide/fr/pipeline/5-the-loop-builder.md +1 -1
  452. package/docs/guide/fr/settings/1-themes.md +1 -1
  453. package/docs/guide/fr/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
  454. package/docs/guide/fr/settings/5-project-environment.md +1 -1
  455. package/docs/guide/fr/settings/6-updates.md +24 -0
  456. package/docs/guide/fr/settings/7-existing-projects.md +33 -0
  457. package/docs/guide/fr/settings/8-accessibility.md +23 -0
  458. package/docs/guide/fr/specs/1-specs-and-the-backlog.md +41 -3
  459. package/docs/guide/fr/specs/2-add-spec-quick-mode.md +1 -1
  460. package/docs/guide/fr/specs/3-add-spec-explore-mode.md +1 -1
  461. package/docs/guide/it/agents/1-meet-the-agents.md +1 -1
  462. package/docs/guide/it/getting-started/2-installing-and-first-run.md +2 -0
  463. package/docs/guide/it/getting-started/3-try-the-sample-project.md +35 -0
  464. package/docs/guide/it/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
  465. package/docs/guide/it/getting-started/6-universal-search.md +34 -0
  466. package/docs/guide/it/insights/1-analytics-and-cost-tracking.md +18 -4
  467. package/docs/guide/it/insights/2-the-integrated-terminal.md +1 -1
  468. package/docs/guide/it/insights/3-code-explorer.md +1 -1
  469. package/docs/guide/it/integrations/1-ai-providers.md +1 -1
  470. package/docs/guide/it/integrations/2-plugins.md +1 -1
  471. package/docs/guide/it/integrations/3-jira-integration.md +3 -3
  472. package/docs/guide/it/integrations/4-mobile-companion.md +1 -1
  473. package/docs/guide/it/integrations/5-mcp-server.md +1 -1
  474. package/docs/guide/it/integrations/6-agent-chat.md +11 -4
  475. package/docs/guide/it/integrations/8-flow-mode.md +69 -0
  476. package/docs/guide/it/pipeline/1-rails-and-jobs.md +21 -1
  477. package/docs/guide/it/pipeline/2-the-job-detail-view.md +12 -0
  478. package/docs/guide/it/pipeline/3-reviewing-a-delivery.md +43 -0
  479. package/docs/guide/it/pipeline/4-picking-an-engine-per-rail.md +2 -2
  480. package/docs/guide/it/pipeline/5-the-loop-builder.md +1 -1
  481. package/docs/guide/it/settings/1-themes.md +1 -1
  482. package/docs/guide/it/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
  483. package/docs/guide/it/settings/5-project-environment.md +1 -1
  484. package/docs/guide/it/settings/6-updates.md +24 -0
  485. package/docs/guide/it/settings/7-existing-projects.md +33 -0
  486. package/docs/guide/it/settings/8-accessibility.md +23 -0
  487. package/docs/guide/it/specs/1-specs-and-the-backlog.md +41 -3
  488. package/docs/guide/it/specs/2-add-spec-quick-mode.md +1 -1
  489. package/docs/guide/it/specs/3-add-spec-explore-mode.md +1 -1
  490. package/docs/guide/ja/agents/1-meet-the-agents.md +1 -1
  491. package/docs/guide/ja/getting-started/2-installing-and-first-run.md +2 -0
  492. package/docs/guide/ja/getting-started/3-try-the-sample-project.md +35 -0
  493. package/docs/guide/ja/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
  494. package/docs/guide/ja/getting-started/6-universal-search.md +34 -0
  495. package/docs/guide/ja/insights/1-analytics-and-cost-tracking.md +18 -4
  496. package/docs/guide/ja/insights/2-the-integrated-terminal.md +1 -1
  497. package/docs/guide/ja/insights/3-code-explorer.md +1 -1
  498. package/docs/guide/ja/integrations/1-ai-providers.md +1 -1
  499. package/docs/guide/ja/integrations/2-plugins.md +1 -1
  500. package/docs/guide/ja/integrations/3-jira-integration.md +3 -3
  501. package/docs/guide/ja/integrations/4-mobile-companion.md +1 -1
  502. package/docs/guide/ja/integrations/5-mcp-server.md +1 -1
  503. package/docs/guide/ja/integrations/6-agent-chat.md +11 -4
  504. package/docs/guide/ja/integrations/8-flow-mode.md +69 -0
  505. package/docs/guide/ja/pipeline/1-rails-and-jobs.md +21 -1
  506. package/docs/guide/ja/pipeline/2-the-job-detail-view.md +12 -0
  507. package/docs/guide/ja/pipeline/3-reviewing-a-delivery.md +43 -0
  508. package/docs/guide/ja/pipeline/4-picking-an-engine-per-rail.md +2 -2
  509. package/docs/guide/ja/pipeline/5-the-loop-builder.md +1 -1
  510. package/docs/guide/ja/settings/1-themes.md +1 -1
  511. package/docs/guide/ja/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
  512. package/docs/guide/ja/settings/5-project-environment.md +1 -1
  513. package/docs/guide/ja/settings/6-updates.md +24 -0
  514. package/docs/guide/ja/settings/7-existing-projects.md +33 -0
  515. package/docs/guide/ja/settings/8-accessibility.md +23 -0
  516. package/docs/guide/ja/specs/1-specs-and-the-backlog.md +41 -3
  517. package/docs/guide/ja/specs/2-add-spec-quick-mode.md +1 -1
  518. package/docs/guide/ja/specs/3-add-spec-explore-mode.md +1 -1
  519. package/docs/guide/pt/agents/1-meet-the-agents.md +1 -1
  520. package/docs/guide/pt/getting-started/2-installing-and-first-run.md +2 -0
  521. package/docs/guide/pt/getting-started/3-try-the-sample-project.md +35 -0
  522. package/docs/guide/pt/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
  523. package/docs/guide/pt/getting-started/6-universal-search.md +34 -0
  524. package/docs/guide/pt/insights/1-analytics-and-cost-tracking.md +18 -4
  525. package/docs/guide/pt/insights/2-the-integrated-terminal.md +1 -1
  526. package/docs/guide/pt/insights/3-code-explorer.md +1 -1
  527. package/docs/guide/pt/integrations/1-ai-providers.md +1 -1
  528. package/docs/guide/pt/integrations/2-plugins.md +1 -1
  529. package/docs/guide/pt/integrations/3-jira-integration.md +3 -3
  530. package/docs/guide/pt/integrations/4-mobile-companion.md +1 -1
  531. package/docs/guide/pt/integrations/5-mcp-server.md +1 -1
  532. package/docs/guide/pt/integrations/6-agent-chat.md +12 -5
  533. package/docs/guide/pt/integrations/8-flow-mode.md +69 -0
  534. package/docs/guide/pt/pipeline/1-rails-and-jobs.md +21 -1
  535. package/docs/guide/pt/pipeline/2-the-job-detail-view.md +12 -0
  536. package/docs/guide/pt/pipeline/3-reviewing-a-delivery.md +43 -0
  537. package/docs/guide/pt/pipeline/4-picking-an-engine-per-rail.md +2 -2
  538. package/docs/guide/pt/pipeline/5-the-loop-builder.md +1 -1
  539. package/docs/guide/pt/settings/1-themes.md +1 -1
  540. package/docs/guide/pt/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
  541. package/docs/guide/pt/settings/5-project-environment.md +1 -1
  542. package/docs/guide/pt/settings/6-updates.md +24 -0
  543. package/docs/guide/pt/settings/7-existing-projects.md +33 -0
  544. package/docs/guide/pt/settings/8-accessibility.md +23 -0
  545. package/docs/guide/pt/specs/1-specs-and-the-backlog.md +41 -3
  546. package/docs/guide/pt/specs/2-add-spec-quick-mode.md +1 -1
  547. package/docs/guide/pt/specs/3-add-spec-explore-mode.md +1 -1
  548. package/docs/guide/zh/agents/1-meet-the-agents.md +1 -1
  549. package/docs/guide/zh/getting-started/2-installing-and-first-run.md +2 -0
  550. package/docs/guide/zh/getting-started/3-try-the-sample-project.md +35 -0
  551. package/docs/guide/zh/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
  552. package/docs/guide/zh/getting-started/6-universal-search.md +34 -0
  553. package/docs/guide/zh/insights/1-analytics-and-cost-tracking.md +18 -4
  554. package/docs/guide/zh/insights/2-the-integrated-terminal.md +1 -1
  555. package/docs/guide/zh/insights/3-code-explorer.md +1 -1
  556. package/docs/guide/zh/integrations/1-ai-providers.md +1 -1
  557. package/docs/guide/zh/integrations/2-plugins.md +1 -1
  558. package/docs/guide/zh/integrations/3-jira-integration.md +3 -3
  559. package/docs/guide/zh/integrations/4-mobile-companion.md +1 -1
  560. package/docs/guide/zh/integrations/5-mcp-server.md +1 -1
  561. package/docs/guide/zh/integrations/6-agent-chat.md +11 -4
  562. package/docs/guide/zh/integrations/8-flow-mode.md +69 -0
  563. package/docs/guide/zh/pipeline/1-rails-and-jobs.md +21 -1
  564. package/docs/guide/zh/pipeline/2-the-job-detail-view.md +12 -0
  565. package/docs/guide/zh/pipeline/3-reviewing-a-delivery.md +43 -0
  566. package/docs/guide/zh/pipeline/4-picking-an-engine-per-rail.md +2 -2
  567. package/docs/guide/zh/pipeline/5-the-loop-builder.md +1 -1
  568. package/docs/guide/zh/settings/1-themes.md +1 -1
  569. package/docs/guide/zh/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
  570. package/docs/guide/zh/settings/5-project-environment.md +1 -1
  571. package/docs/guide/zh/settings/6-updates.md +24 -0
  572. package/docs/guide/zh/settings/7-existing-projects.md +33 -0
  573. package/docs/guide/zh/settings/8-accessibility.md +23 -0
  574. package/docs/guide/zh/specs/1-specs-and-the-backlog.md +41 -3
  575. package/docs/guide/zh/specs/2-add-spec-quick-mode.md +1 -1
  576. package/docs/guide/zh/specs/3-add-spec-explore-mode.md +1 -1
  577. package/docs/internals/README.md +8 -0
  578. package/docs/internals/adding-a-provider.md +19 -2
  579. package/docs/internals/agent-actions-audit.md +101 -0
  580. package/docs/internals/agent-sessions.md +36 -1
  581. package/docs/internals/api-reference.md +190 -45
  582. package/docs/internals/architecture.md +53 -47
  583. package/docs/internals/companion-inbox-decisions.md +42 -0
  584. package/docs/internals/companion-rails-as-loops-contract.md +17 -6
  585. package/docs/internals/configuration.md +140 -9
  586. package/docs/internals/core-runtime-updates.md +4 -4
  587. package/docs/internals/existing-project-anchoring.md +168 -0
  588. package/docs/internals/flow-mode.md +668 -0
  589. package/docs/internals/legacy-implementation-notes.md +13 -0
  590. package/docs/internals/local-testing-feedback-2026-10.md +210 -0
  591. package/docs/internals/mcp-mission-audit.md +4 -0
  592. package/docs/internals/mission-rail-cards.md +10 -5
  593. package/docs/internals/mission-read-only-policy.md +152 -0
  594. package/docs/internals/modal-standard.md +181 -0
  595. package/docs/internals/openspec-workflow.md +32 -0
  596. package/docs/internals/operations-runbook.md +30 -0
  597. package/docs/internals/profiles.md +6 -3
  598. package/docs/internals/programmatic-agent-runtime.md +8 -0
  599. package/docs/internals/project-builder.md +1 -1
  600. package/docs/internals/review-packet.md +161 -9
  601. package/docs/internals/safe-pr-review-flow.md +135 -6
  602. package/docs/internals/source-map.md +413 -18
  603. package/docs/internals/spec-addenda.md +10 -0
  604. package/docs/internals/spec-triage.md +140 -0
  605. package/docs/internals/visual-design-audit.md +15 -2
  606. package/docs/local-providers.md +3 -0
  607. package/docs/mcp.md +21 -3
  608. package/docs/platforms/macos.md +1 -1
  609. package/docs/platforms/windows.md +2 -2
  610. package/docs/running-pipelines.md +22 -6
  611. package/docs/tracking-cost.md +54 -10
  612. package/local-runner/dist/specrails-local-runner.js +3851 -1178
  613. package/mcp-bridge/dist/specrails-mcp.js +3864 -1143
  614. package/package.json +10 -9
  615. package/server/dist/agent-mcp-config.js +37 -1
  616. package/server/dist/api-version.js +19 -0
  617. package/server/dist/command-resolver.js +4 -2
  618. package/server/dist/core-compat.js +1 -1
  619. package/server/dist/core-execution.js +2 -1
  620. package/server/dist/core-update-manager.js +71 -13
  621. package/server/dist/db/job-search.js +248 -0
  622. package/server/dist/db/jobs.js +6 -0
  623. package/server/dist/db/migrations.js +239 -0
  624. package/server/dist/db.js +9 -2
  625. package/server/dist/desktop-db.js +99 -5
  626. package/server/dist/desktop-router.js +126 -13
  627. package/server/dist/docs-router.js +67 -1
  628. package/server/dist/feature-flags.js +22 -0
  629. package/server/dist/index.js +30 -15
  630. package/server/dist/jira/jira-adf.js +13 -1
  631. package/server/dist/jira/jira-clarifications.js +146 -0
  632. package/server/dist/jira/jira-client.js +8 -1
  633. package/server/dist/jira/jira-db.js +41 -0
  634. package/server/dist/jira/jira-sync-manager.js +328 -25
  635. package/server/dist/mcp/guide.js +17 -7
  636. package/server/dist/mcp/tools/agents.js +1 -1
  637. package/server/dist/mcp/tools/analytics.js +15 -3
  638. package/server/dist/mcp/tools/app-settings.js +14 -1
  639. package/server/dist/mcp/tools/chat.js +1 -1
  640. package/server/dist/mcp/tools/env.js +4 -2
  641. package/server/dist/mcp/tools/jobs.js +96 -7
  642. package/server/dist/mcp/tools/loops.js +1 -1
  643. package/server/dist/mcp/tools/meta.js +10 -13
  644. package/server/dist/mcp/tools/rails.js +15 -1
  645. package/server/dist/mcp/tools/setup.js +1 -1
  646. package/server/dist/mcp/tools/specs.js +8 -5
  647. package/server/dist/mcp/tools/support.js +6 -3
  648. package/server/dist/mcp/tools/types.js +38 -1
  649. package/server/dist/mobile/mobile-admin-router.js +0 -16
  650. package/server/dist/mobile/mobile-gateway.js +0 -18
  651. package/server/dist/mobile/mobile-inbox.js +240 -0
  652. package/server/dist/mobile/mobile-missions.js +6 -8
  653. package/server/dist/mobile/mobile-router.js +9 -9
  654. package/server/dist/mobile/mobile-webrtc-peer.js +4 -54
  655. package/server/dist/mobile/mobile-ws.js +27 -4
  656. package/server/dist/modules/accounting/runtime/ai-invocations.js +4 -0
  657. package/server/dist/modules/accounting/runtime/decision-times.js +102 -0
  658. package/server/dist/modules/accounting/runtime/loop-economics.js +284 -0
  659. package/server/dist/modules/accounting/runtime/spending.js +7 -2
  660. package/server/dist/modules/accounting/runtime/what-if.js +87 -0
  661. package/server/dist/modules/agent-runtime/runtime/agent-runtime-bridge.js +86 -5
  662. package/server/dist/modules/agent-runtime/runtime/agent-runtime-controls.js +28 -2
  663. package/server/dist/modules/agent-runtime/runtime/agent-runtime-metrics.js +15 -2
  664. package/server/dist/modules/agent-runtime/runtime/agent-runtime-settings-router.js +21 -2
  665. package/server/dist/modules/agent-runtime/runtime/core-capabilities.js +55 -0
  666. package/server/dist/modules/agent-sessions/adapters/host-process.js +1 -1
  667. package/server/dist/modules/agent-sessions/domain/availability.js +16 -0
  668. package/server/dist/modules/agent-sessions/domain/protocol.js +8 -1
  669. package/server/dist/modules/agent-sessions/index.js +3 -1
  670. package/server/dist/modules/agent-sessions/runtime/core-sessions-availability.js +16 -0
  671. package/server/dist/modules/agents/runtime/agent-refine-manager.js +3 -1
  672. package/server/dist/modules/agents/runtime/agent-store.js +60 -73
  673. package/server/dist/modules/audit/adapters/http.js +66 -0
  674. package/server/dist/modules/audit/adapters/runtime.js +60 -0
  675. package/server/dist/modules/audit/adapters/sqlite.js +73 -0
  676. package/server/dist/modules/audit/application.js +190 -0
  677. package/server/dist/modules/audit/domain.js +434 -0
  678. package/server/dist/modules/audit/index.js +27 -0
  679. package/server/dist/modules/audit/ports.js +2 -0
  680. package/server/dist/modules/browser/runtime/browser-capture-manager.js +18 -141
  681. package/server/dist/modules/browser/runtime/browser-capture-types.js +1 -10
  682. package/server/dist/modules/browser/runtime/browser-playwright.js +0 -19
  683. package/server/dist/modules/code/runtime/file-provenance.js +23 -0
  684. package/server/dist/modules/conversations/runtime/chat-manager.js +5 -2
  685. package/server/dist/modules/delivery/adapters/decisions/chains.js +1 -0
  686. package/server/dist/modules/delivery/adapters/decisions/create.js +19 -1
  687. package/server/dist/modules/delivery/adapters/decisions/discard.js +2 -0
  688. package/server/dist/modules/delivery/adapters/decisions/local-changes.js +427 -0
  689. package/server/dist/modules/delivery/adapters/decisions/merge-local.js +80 -6
  690. package/server/dist/modules/delivery/adapters/decisions/observations.js +5 -0
  691. package/server/dist/modules/delivery/adapters/decisions/ownership.js +2 -1
  692. package/server/dist/modules/delivery/adapters/decisions/transitions.js +9 -0
  693. package/server/dist/modules/delivery/adapters/review-wip-store.js +37 -0
  694. package/server/dist/modules/delivery/domain/review-wip.js +71 -0
  695. package/server/dist/modules/delivery/index.js +9 -1
  696. package/server/dist/modules/delivery/runtime/delivery-changes.js +355 -0
  697. package/server/dist/modules/delivery/runtime/delivery-evidence.js +249 -8
  698. package/server/dist/modules/delivery/runtime/flow-review-legacy.js +99 -0
  699. package/server/dist/modules/delivery/runtime/flow-review-outcome.js +107 -0
  700. package/server/dist/modules/delivery/runtime/flow-worktree-handoff.js +32 -0
  701. package/server/dist/modules/delivery/runtime/flow-worktree-return.js +87 -0
  702. package/server/dist/modules/delivery/runtime/isolated-worktree.js +380 -0
  703. package/server/dist/modules/delivery/runtime/local-restore-branch.js +325 -0
  704. package/server/dist/modules/delivery/runtime/local-restore-resolver.js +48 -0
  705. package/server/dist/modules/delivery/runtime/local-stash.js +423 -0
  706. package/server/dist/modules/delivery/runtime/multi-repo-execution.js +27 -1
  707. package/server/dist/modules/delivery/runtime/phase3-harvest.js +40 -0
  708. package/server/dist/modules/delivery/runtime/pr-body.js +50 -0
  709. package/server/dist/modules/delivery/runtime/rail-isolated-launch.js +169 -166
  710. package/server/dist/modules/delivery/runtime/rail-launch-parser.js +5 -2
  711. package/server/dist/modules/delivery/runtime/rail-pr-decision.js +7 -1
  712. package/server/dist/modules/delivery/runtime/rail-pr-store.js +193 -12
  713. package/server/dist/modules/delivery/runtime/rails-router.js +267 -5
  714. package/server/dist/modules/delivery/runtime/review-brief.js +208 -0
  715. package/server/dist/modules/delivery/runtime/review-packet.js +41 -2
  716. package/server/dist/modules/delivery/runtime/review-wip-gate.js +67 -0
  717. package/server/dist/modules/delivery/runtime/run-records.js +267 -0
  718. package/server/dist/modules/delivery/runtime/run-review-diagnosis.js +102 -0
  719. package/server/dist/modules/execution/adapters/budget-storage.js +76 -0
  720. package/server/dist/modules/execution/application/enforce-budget.js +17 -2
  721. package/server/dist/modules/execution/domain/agent-env.js +98 -0
  722. package/server/dist/modules/execution/domain/daily-budget.js +36 -0
  723. package/server/dist/modules/execution/domain/spend-caps.js +166 -0
  724. package/server/dist/modules/execution/index.js +34 -1
  725. package/server/dist/modules/execution/runtime/budget-overview.js +76 -0
  726. package/server/dist/modules/execution/runtime/daily-budget-gate.js +86 -0
  727. package/server/dist/modules/execution/runtime/interactive-job-session.js +8 -0
  728. package/server/dist/modules/execution/runtime/launch-forecast.js +33 -0
  729. package/server/dist/modules/execution/runtime/queue-manager.js +54 -15
  730. package/server/dist/modules/execution/runtime/run-duration-stats.js +31 -13
  731. package/server/dist/modules/flow/adapters/bindings.js +1089 -0
  732. package/server/dist/modules/flow/adapters/http.js +147 -0
  733. package/server/dist/modules/flow/adapters/sqlite.js +121 -0
  734. package/server/dist/modules/flow/application.js +805 -0
  735. package/server/dist/modules/flow/domain.js +790 -0
  736. package/server/dist/modules/flow/index.js +34 -0
  737. package/server/dist/modules/flow/ports.js +2 -0
  738. package/server/dist/modules/inbox/adapters/http.js +21 -0
  739. package/server/dist/modules/inbox/adapters/project-source.js +233 -0
  740. package/server/dist/modules/inbox/application.js +28 -0
  741. package/server/dist/modules/inbox/domain.js +43 -0
  742. package/server/dist/modules/inbox/index.js +10 -0
  743. package/server/dist/modules/inbox/ports.js +2 -0
  744. package/server/dist/modules/loops/runtime/loop-definition-run.js +9 -0
  745. package/server/dist/modules/loops/runtime/loop-definition.js +5 -2
  746. package/server/dist/modules/loops/runtime/loop-executors.js +90 -9
  747. package/server/dist/modules/loops/runtime/loop-factory.js +30 -2
  748. package/server/dist/modules/loops/runtime/loop-flow-spec-recipe.js +166 -0
  749. package/server/dist/modules/loops/runtime/loop-graph.js +1 -1
  750. package/server/dist/modules/loops/runtime/loop-role-engines.js +4 -1
  751. package/server/dist/modules/loops/runtime/loop-run-manager.js +267 -10
  752. package/server/dist/modules/loops/runtime/loop-runs-store.js +21 -5
  753. package/server/dist/modules/loops/runtime/loop-templates.js +55 -12
  754. package/server/dist/modules/missions/runtime/agent-chat-manager.js +283 -20
  755. package/server/dist/modules/missions/runtime/agent-chat-router.js +96 -21
  756. package/server/dist/modules/missions/runtime/agent-failure-briefing.js +11 -3
  757. package/server/dist/modules/missions/runtime/agent-fence-promotion.js +9 -1
  758. package/server/dist/modules/missions/runtime/agent-flow-prompt.js +64 -0
  759. package/server/dist/modules/missions/runtime/agent-input-store.js +9 -4
  760. package/server/dist/modules/missions/runtime/agent-operator-prompt.js +100 -14
  761. package/server/dist/modules/missions/runtime/agent-session-store.js +88 -27
  762. package/server/dist/modules/missions/runtime/core-session-runner.js +89 -9
  763. package/server/dist/modules/missions/runtime/flow-turn-context.js +17 -0
  764. package/server/dist/modules/missions/runtime/mission-core-sessions.js +295 -55
  765. package/server/dist/modules/missions/runtime/mission-run-notify.js +2 -0
  766. package/server/dist/modules/missions/runtime/mission-session-projector.js +56 -19
  767. package/server/dist/modules/missions/runtime/mission-tool-policy.js +47 -0
  768. package/server/dist/modules/onboarding/adapters/http.js +78 -0
  769. package/server/dist/modules/onboarding/adapters/providers.js +41 -0
  770. package/server/dist/modules/onboarding/adapters/runtime.js +130 -0
  771. package/server/dist/modules/onboarding/application.js +133 -0
  772. package/server/dist/modules/onboarding/catalog.js +217 -0
  773. package/server/dist/modules/onboarding/domain.js +102 -0
  774. package/server/dist/modules/onboarding/index.js +20 -0
  775. package/server/dist/modules/onboarding/ports.js +2 -0
  776. package/server/dist/modules/project-rules/adapters/http.js +91 -0
  777. package/server/dist/modules/project-rules/domain.js +122 -0
  778. package/server/dist/modules/project-rules/runtime/rules-inventory-runs.js +97 -0
  779. package/server/dist/modules/project-rules/runtime/rules-store.js +109 -0
  780. package/server/dist/modules/project-settings/adapters/http.js +13 -0
  781. package/server/dist/modules/project-settings/adapters/sqlite.js +78 -8
  782. package/server/dist/modules/project-settings/domain.js +47 -1
  783. package/server/dist/modules/project-settings/index.js +7 -1
  784. package/server/dist/modules/recovery/adapters/sqlite.js +28 -0
  785. package/server/dist/modules/recovery/domain.js +162 -0
  786. package/server/dist/modules/recovery/index.js +16 -0
  787. package/server/dist/modules/specs/adapters/timeline-http.js +101 -0
  788. package/server/dist/modules/specs/domain/handoff-labels.js +371 -0
  789. package/server/dist/modules/specs/domain/handoff.js +260 -0
  790. package/server/dist/modules/specs/domain/non-goals.js +101 -0
  791. package/server/dist/modules/specs/domain/timeline.js +164 -0
  792. package/server/dist/modules/specs/domain/triage.js +320 -0
  793. package/server/dist/modules/specs/runtime/contract-refine-runner.js +3 -2
  794. package/server/dist/modules/specs/runtime/generated-spec-parser.js +75 -0
  795. package/server/dist/modules/specs/runtime/proposal-manager.js +4 -3
  796. package/server/dist/modules/specs/runtime/smash-runner.js +2 -1
  797. package/server/dist/modules/specs/runtime/spec-addenda.js +31 -0
  798. package/server/dist/modules/specs/runtime/spec-draft-parser.js +6 -1
  799. package/server/dist/modules/specs/runtime/spec-generation.js +431 -0
  800. package/server/dist/modules/specs/runtime/spec-handoff.js +103 -0
  801. package/server/dist/modules/specs/runtime/spec-history.js +376 -0
  802. package/server/dist/modules/specs/runtime/spec-launcher-manager.js +4 -3
  803. package/server/dist/modules/specs/runtime/spec-search.js +117 -0
  804. package/server/dist/modules/specs/runtime/ticket-store.js +47 -2
  805. package/server/dist/modules/specs/runtime/ticket-trash-service.js +62 -0
  806. package/server/dist/modules/specs/runtime/ticket-trash.js +193 -0
  807. package/server/dist/modules/specs/runtime/triage-runner.js +171 -0
  808. package/server/dist/modules/specs/runtime/triage.js +365 -0
  809. package/server/dist/modules/terminals/domain/app-urls.js +96 -0
  810. package/server/dist/modules/terminals/runtime/app-urls.js +77 -0
  811. package/server/dist/modules/terminals/runtime/background-process-service.js +25 -28
  812. package/server/dist/project-env.js +60 -0
  813. package/server/dist/project-git.js +65 -0
  814. package/server/dist/project-registry.js +264 -27
  815. package/server/dist/project-router-background-processes.js +27 -3
  816. package/server/dist/project-router-git.js +30 -0
  817. package/server/dist/project-router-helpers.js +5 -30
  818. package/server/dist/project-router-jobs.js +49 -1
  819. package/server/dist/project-router-loop-runs.js +72 -2
  820. package/server/dist/project-router-rules.js +54 -0
  821. package/server/dist/project-router-search.js +52 -0
  822. package/server/dist/project-router-settings.js +6 -0
  823. package/server/dist/project-router-setup.js +1 -1
  824. package/server/dist/project-router-spending.js +138 -0
  825. package/server/dist/project-router-tickets.js +246 -427
  826. package/server/dist/project-router.js +7 -0
  827. package/server/dist/providers/claude-adapter.js +25 -3
  828. package/server/dist/providers/codex-adapter.js +9 -1
  829. package/server/dist/providers/gemini-adapter.js +6 -1
  830. package/server/dist/providers/kimi-adapter.js +2 -0
  831. package/server/dist/providers/local-adapter.js +2 -0
  832. package/server/dist/providers/runtime.js +8 -0
  833. package/server/dist/schemas/agent-runtime.schema.json +3 -1
  834. package/server/dist/schemas/workflow-definition.schema.json +1 -0
  835. package/server/dist/setup-manager.js +19 -1
  836. package/server/dist/transient-children.js +25 -8
  837. package/server/dist/update-channel.js +21 -0
  838. package/server/dist/util/search-snippet.js +74 -0
  839. package/server/dist/worktree-manager.js +19 -8
  840. package/client/dist/assets/ActivityFeedPage-Dtp7EyHc.js +0 -1
  841. package/client/dist/assets/AgentBrowserCapture-CLqlEFw8.js +0 -1
  842. package/client/dist/assets/AgentModeAnalyticsPane-B8_hM3Tw.js +0 -2
  843. package/client/dist/assets/AgentModeCodePane-CNF8ZNjE.js +0 -2
  844. package/client/dist/assets/AgentModeJobsPane-CJpJbO9m.js +0 -1
  845. package/client/dist/assets/AgentsPage-BC8XSR79.js +0 -120
  846. package/client/dist/assets/AnalyticsPage-Cdv4jLtW.js +0 -1
  847. package/client/dist/assets/BarChart-BDMqVFJy.js +0 -55
  848. package/client/dist/assets/CodePage-DI1kegAr.js +0 -3
  849. package/client/dist/assets/DesktopAnalyticsPage-Bdp8E8U6.js +0 -1
  850. package/client/dist/assets/DocsDialog-Bm4RS7FX.js +0 -11
  851. package/client/dist/assets/DocsPage-DihYcU8r.js +0 -11
  852. package/client/dist/assets/ExportDropdown-Bb1lHx3r.js +0 -1
  853. package/client/dist/assets/IntegrationsPage-EAipiDWm.js +0 -1
  854. package/client/dist/assets/InteractiveJobComposer-BO6ASN-2.js +0 -19
  855. package/client/dist/assets/JobDetailModal-CuPYq7tP.js +0 -1
  856. package/client/dist/assets/JobDetailPage-BusMjJi9.js +0 -1
  857. package/client/dist/assets/JobsPage-C0QbsF2d.js +0 -1
  858. package/client/dist/assets/LoopBuilderPage-B7TlU4iS.js +0 -1
  859. package/client/dist/assets/LoopPreviewModal-BRWtXOD2.js +0 -1
  860. package/client/dist/assets/LoopsPage-C4q1DmCE.js +0 -2
  861. package/client/dist/assets/MinimizedChatsContext-DHfigjHS.js +0 -1
  862. package/client/dist/assets/PluginsPage-Z1JHSMdR.js +0 -2
  863. package/client/dist/assets/ProjectSettingsDialog-BUNj0tvN.js +0 -1
  864. package/client/dist/assets/RepositoryDeliveries-B4ybHOyB.js +0 -5
  865. package/client/dist/assets/ReviewPacketPage-hwfPNjyy.js +0 -4
  866. package/client/dist/assets/TemplatePreviewModal-V7FpMWuw.js +0 -1
  867. package/client/dist/assets/TicketDetailModalContext-Dkwo2cDs.js +0 -16
  868. package/client/dist/assets/Trans-BbFxRFtR.js +0 -1
  869. package/client/dist/assets/activity-B-rp4h_v.js +0 -1
  870. package/client/dist/assets/activity-C6kJpm9q.js +0 -1
  871. package/client/dist/assets/activity-CGx4kb_j.js +0 -1
  872. package/client/dist/assets/activity-CnoX2bH7.js +0 -1
  873. package/client/dist/assets/activity-DAyekdlt.js +0 -1
  874. package/client/dist/assets/activity-DCxtpT7j.js +0 -1
  875. package/client/dist/assets/activity-DiyjsgQV.js +0 -1
  876. package/client/dist/assets/activity-JzwRaWPD.js +0 -1
  877. package/client/dist/assets/addspec-BOvgmcgk.js +0 -1
  878. package/client/dist/assets/addspec-Clmyfn_R.js +0 -1
  879. package/client/dist/assets/addspec-CsNaBpHp.js +0 -1
  880. package/client/dist/assets/addspec-D2tvWmmV.js +0 -1
  881. package/client/dist/assets/addspec-D3nFwvD0.js +0 -1
  882. package/client/dist/assets/addspec-DVLEhK3w.js +0 -1
  883. package/client/dist/assets/addspec-DXbK-tb0.js +0 -1
  884. package/client/dist/assets/addspec-OHG8DFEn.js +0 -1
  885. package/client/dist/assets/agent-5bSixVzz.js +0 -1
  886. package/client/dist/assets/agent-BR4EHfhq.js +0 -1
  887. package/client/dist/assets/agent-C0IKkJP8.js +0 -1
  888. package/client/dist/assets/agent-C7li9ayC.js +0 -1
  889. package/client/dist/assets/agent-D0dRmEen.js +0 -1
  890. package/client/dist/assets/agent-DZVGHm7H.js +0 -1
  891. package/client/dist/assets/agent-Dip4h2YE.js +0 -1
  892. package/client/dist/assets/agent-Pp-P-n1p.js +0 -1
  893. package/client/dist/assets/agentRuntime-BxF81z52.js +0 -1
  894. package/client/dist/assets/agentRuntime-BxYS5V7u.js +0 -1
  895. package/client/dist/assets/agentRuntime-Dc9HG3BA.js +0 -1
  896. package/client/dist/assets/agents-B6ZsnARo.js +0 -1
  897. package/client/dist/assets/agents-BORdhe0K.js +0 -1
  898. package/client/dist/assets/agents-C6aq9Oqs.js +0 -1
  899. package/client/dist/assets/agents-Cbsc4bcX.js +0 -1
  900. package/client/dist/assets/agents-D0uYR6hq.js +0 -1
  901. package/client/dist/assets/agents-Doe1sHY5.js +0 -1
  902. package/client/dist/assets/agents-DyNi_I9m.js +0 -1
  903. package/client/dist/assets/agents-StKxiTg0.js +0 -1
  904. package/client/dist/assets/agentstudio-7cYCXn-L.js +0 -1
  905. package/client/dist/assets/agentstudio-BHWQh8G3.js +0 -1
  906. package/client/dist/assets/agentstudio-BjnWHyRs.js +0 -1
  907. package/client/dist/assets/agentstudio-BkV8vcK4.js +0 -1
  908. package/client/dist/assets/agentstudio-BzugqB_N.js +0 -1
  909. package/client/dist/assets/agentstudio-CWbp7KvH.js +0 -1
  910. package/client/dist/assets/agentstudio-DG6plf5o.js +0 -1
  911. package/client/dist/assets/agentstudio-DkZVF-Cc.js +0 -1
  912. package/client/dist/assets/analytics-B1DIQd4m.js +0 -1
  913. package/client/dist/assets/analytics-BAIZ9vE_.js +0 -1
  914. package/client/dist/assets/analytics-BTqgmgBd.js +0 -1
  915. package/client/dist/assets/analytics-BWynXPEm.js +0 -1
  916. package/client/dist/assets/analytics-DGcUsQ44.js +0 -1
  917. package/client/dist/assets/analytics-GnSnpJ4W.js +0 -1
  918. package/client/dist/assets/analytics-TWgYaoO0.js +0 -1
  919. package/client/dist/assets/analytics-kJy6Tuko.js +0 -1
  920. package/client/dist/assets/atom-one-dark-qiGhVQxg.js +0 -1
  921. package/client/dist/assets/builder-B9gorTnT.js +0 -1
  922. package/client/dist/assets/builder-Bvw5s3Mi.js +0 -1
  923. package/client/dist/assets/builder-CL5l4dU3.js +0 -1
  924. package/client/dist/assets/builder-CVDTVrQX.js +0 -1
  925. package/client/dist/assets/builder-CpS9liE9.js +0 -1
  926. package/client/dist/assets/builder-DNctIL9Q.js +0 -1
  927. package/client/dist/assets/builder-De2NxX6o.js +0 -1
  928. package/client/dist/assets/builder-DeYT7Y-m.js +0 -1
  929. package/client/dist/assets/button-4FS1ZDTp.js +0 -1
  930. package/client/dist/assets/chat-D_I7nU5K.js +0 -1
  931. package/client/dist/assets/chevron-up-6EFqEHBj.js +0 -1
  932. package/client/dist/assets/chunk-OB3PAWPO-B1EMk45A.js +0 -3
  933. package/client/dist/assets/clsx-CjueKrWZ.js +0 -1
  934. package/client/dist/assets/code-B37GRg9C.js +0 -1
  935. package/client/dist/assets/code-BBOEZbf9.js +0 -1
  936. package/client/dist/assets/code-BRm-jcyx.js +0 -1
  937. package/client/dist/assets/code-CF7w62CR.js +0 -1
  938. package/client/dist/assets/code-CLuvJt2r.js +0 -1
  939. package/client/dist/assets/code-D0RCm59f.js +0 -1
  940. package/client/dist/assets/code-DaZ-ZwCT.js +0 -1
  941. package/client/dist/assets/code-iIHkGaCL.js +0 -1
  942. package/client/dist/assets/commands-0XjAftla.js +0 -1
  943. package/client/dist/assets/commands-BAWSYHjQ.js +0 -1
  944. package/client/dist/assets/commands-BBwowgiE.js +0 -1
  945. package/client/dist/assets/commands-BacjIZLN.js +0 -1
  946. package/client/dist/assets/commands-Bs62IAZ3.js +0 -1
  947. package/client/dist/assets/commands-CLPdh-Hh.js +0 -1
  948. package/client/dist/assets/commands-DlbFzgrp.js +0 -1
  949. package/client/dist/assets/commands-LjPSsi5F.js +0 -1
  950. package/client/dist/assets/common-Bdi0qN4S.js +0 -1
  951. package/client/dist/assets/common-Bhb9zN1P.js +0 -1
  952. package/client/dist/assets/common-BykKlZg1.js +0 -1
  953. package/client/dist/assets/common-CvnNNSJA.js +0 -1
  954. package/client/dist/assets/common-D5zk_mqq.js +0 -1
  955. package/client/dist/assets/common-DQNO_al5.js +0 -1
  956. package/client/dist/assets/common-Dax30Vmp.js +0 -1
  957. package/client/dist/assets/common-DkllpVSb.js +0 -1
  958. package/client/dist/assets/core-B3mKBIh5.js +0 -1
  959. package/client/dist/assets/dashboard-B1ndRHuC.js +0 -1
  960. package/client/dist/assets/dashboard-BX7KXiqA.js +0 -1
  961. package/client/dist/assets/dashboard-B_BSNxcN.js +0 -1
  962. package/client/dist/assets/dashboard-CCeFN7-V.js +0 -1
  963. package/client/dist/assets/dashboard-CRl0WtFJ.js +0 -1
  964. package/client/dist/assets/dashboard-XGdQ5mjw.js +0 -1
  965. package/client/dist/assets/dashboard-_oltA6Jd.js +0 -1
  966. package/client/dist/assets/dashboard-bAuf5KVk.js +0 -1
  967. package/client/dist/assets/dialog-DtdR05v1.js +0 -45
  968. package/client/dist/assets/dist-js-CJ_2XX1Y.js +0 -1
  969. package/client/dist/assets/event-Bt7f3wXe.js +0 -1
  970. package/client/dist/assets/explore-BG99VGpL.js +0 -1
  971. package/client/dist/assets/explore-C0TjprJW.js +0 -1
  972. package/client/dist/assets/explore-C2dgEo7q.js +0 -1
  973. package/client/dist/assets/explore-C8NDHbob.js +0 -1
  974. package/client/dist/assets/explore-CWWgzQGR.js +0 -1
  975. package/client/dist/assets/explore-CcQXpdtS.js +0 -1
  976. package/client/dist/assets/explore-DgBACn39.js +0 -1
  977. package/client/dist/assets/explore-DsXAgnmJ.js +0 -1
  978. package/client/dist/assets/file-text-C0blZHLh.js +0 -1
  979. package/client/dist/assets/formatDistanceToNow-NjPHBLfB.js +0 -1
  980. package/client/dist/assets/getTimezoneOffsetInMilliseconds-vJ7qUoqN.js +0 -1
  981. package/client/dist/assets/git-branch-yf6LE1Bw.js +0 -1
  982. package/client/dist/assets/index-BgbCbIua.css +0 -2
  983. package/client/dist/assets/index-Ce4yZtKf.js +0 -83
  984. package/client/dist/assets/integrations-BkpRUbvp.js +0 -1
  985. package/client/dist/assets/integrations-Bo8qbJf4.js +0 -1
  986. package/client/dist/assets/integrations-CmSrKzZb.js +0 -1
  987. package/client/dist/assets/integrations-DGtq26Rr.js +0 -1
  988. package/client/dist/assets/integrations-De38GFnQ.js +0 -1
  989. package/client/dist/assets/integrations-Dw6zdtb-.js +0 -1
  990. package/client/dist/assets/integrations-Dwl9KQp0.js +0 -1
  991. package/client/dist/assets/integrations-Refg_d2I.js +0 -1
  992. package/client/dist/assets/jira-B6OYw4CJ.js +0 -1
  993. package/client/dist/assets/jira-BTF6RaOe.js +0 -1
  994. package/client/dist/assets/jira-CEetIB2q.js +0 -1
  995. package/client/dist/assets/jira-CIzsZLw5.js +0 -1
  996. package/client/dist/assets/jira-Daw9tmpI.js +0 -1
  997. package/client/dist/assets/jira-FXr7u2lh.js +0 -1
  998. package/client/dist/assets/jira-LaNQn7yl.js +0 -1
  999. package/client/dist/assets/jira-api-Cabj-H0J.js +0 -1
  1000. package/client/dist/assets/job-time-BCL7wee9.js +0 -1
  1001. package/client/dist/assets/jobs-ARwD85B9.js +0 -1
  1002. package/client/dist/assets/jobs-BMF1w4WT.js +0 -1
  1003. package/client/dist/assets/jobs-CBfzGLwm.js +0 -1
  1004. package/client/dist/assets/jobs-CPjiluBY.js +0 -1
  1005. package/client/dist/assets/jobs-CQQd58pY.js +0 -1
  1006. package/client/dist/assets/jobs-De3EqaO0.js +0 -1
  1007. package/client/dist/assets/jobs-Du9-Ei9a.js +0 -1
  1008. package/client/dist/assets/jobs-qMHbnxwC.js +0 -1
  1009. package/client/dist/assets/layers-BCLTgHXO.js +0 -1
  1010. package/client/dist/assets/loader-circle-BqV9xYGf.js +0 -1
  1011. package/client/dist/assets/loop-layout-CyXj9223.js +0 -7
  1012. package/client/dist/assets/loops-B2PhQLKR.js +0 -1
  1013. package/client/dist/assets/loops-BqbF46st.js +0 -1
  1014. package/client/dist/assets/loops-CINnHbfI.js +0 -1
  1015. package/client/dist/assets/loops-D-3XhH04.js +0 -1
  1016. package/client/dist/assets/loops-DKkEEjZ_.js +0 -1
  1017. package/client/dist/assets/loops-DzWR5-v6.js +0 -1
  1018. package/client/dist/assets/loops-WyWDkhok.js +0 -1
  1019. package/client/dist/assets/loops-scD5fIBf.js +0 -1
  1020. package/client/dist/assets/mcp-6rMoZfEO.js +0 -1
  1021. package/client/dist/assets/mcp-BD8sL5mP.js +0 -1
  1022. package/client/dist/assets/mcp-BkcA3I5s.js +0 -1
  1023. package/client/dist/assets/mcp-CCpSelOh.js +0 -1
  1024. package/client/dist/assets/mcp-CUAN6ORK.js +0 -1
  1025. package/client/dist/assets/mcp-CqbRxRTE.js +0 -1
  1026. package/client/dist/assets/mcp-DP2YfVhO.js +0 -1
  1027. package/client/dist/assets/mcp-DUVQamDz.js +0 -1
  1028. package/client/dist/assets/narration-BEKMVxGm.js +0 -1
  1029. package/client/dist/assets/narration-CjLwGKap.js +0 -1
  1030. package/client/dist/assets/narration-DANWuGsW.js +0 -1
  1031. package/client/dist/assets/narration-DGeEDWiT.js +0 -1
  1032. package/client/dist/assets/narration-DJgpGwIP.js +0 -1
  1033. package/client/dist/assets/narration-DbHnz0qV.js +0 -1
  1034. package/client/dist/assets/narration-bZSsTZG8.js +0 -1
  1035. package/client/dist/assets/narration-i6aKJKEc.js +0 -1
  1036. package/client/dist/assets/nav--u7iPYlS.js +0 -1
  1037. package/client/dist/assets/nav-C5Jgfaby.js +0 -1
  1038. package/client/dist/assets/nav-CAna_Wpt.js +0 -1
  1039. package/client/dist/assets/nav-CCLqeyHo.js +0 -1
  1040. package/client/dist/assets/nav-Cf3c90Jk.js +0 -1
  1041. package/client/dist/assets/nav-DMYQaQjR.js +0 -1
  1042. package/client/dist/assets/nav-Df_PkZ9F.js +0 -1
  1043. package/client/dist/assets/nav-VyNGBJwj.js +0 -1
  1044. package/client/dist/assets/packet-8nn9RsU7.js +0 -1
  1045. package/client/dist/assets/packet-B0H15elv.js +0 -1
  1046. package/client/dist/assets/packet-BQvBgrwh.js +0 -1
  1047. package/client/dist/assets/packet-BR7mO0-a.js +0 -1
  1048. package/client/dist/assets/packet-BgcQ6q_K.js +0 -1
  1049. package/client/dist/assets/packet-D2s92Jnn.js +0 -1
  1050. package/client/dist/assets/packet-YbtcD1HS.js +0 -1
  1051. package/client/dist/assets/packet-c0Qj_9eX.js +0 -1
  1052. package/client/dist/assets/project-repositories-Cnnuj9Ia.js +0 -1
  1053. package/client/dist/assets/rotate-ccw-DalJAQQX.js +0 -1
  1054. package/client/dist/assets/settings-B1NV8Ow9.js +0 -1
  1055. package/client/dist/assets/settings-BQ8XFZeE.js +0 -1
  1056. package/client/dist/assets/settings-BRkxfBbO.js +0 -1
  1057. package/client/dist/assets/settings-C_CcU1dP.js +0 -1
  1058. package/client/dist/assets/settings-Cto9n0eL.js +0 -1
  1059. package/client/dist/assets/settings-Pyw8uYtL.js +0 -1
  1060. package/client/dist/assets/settings-b3HVCNNd.js +0 -1
  1061. package/client/dist/assets/settings-hdive4u6.js +0 -1
  1062. package/client/dist/assets/setup-Be485n2u.js +0 -1
  1063. package/client/dist/assets/setup-CKGUxKr-.js +0 -1
  1064. package/client/dist/assets/setup-Ck1Uwd7_.js +0 -1
  1065. package/client/dist/assets/setup-Cm774a6v.js +0 -1
  1066. package/client/dist/assets/setup-DIqMQpxt.js +0 -1
  1067. package/client/dist/assets/setup-DfCsoNFL.js +0 -1
  1068. package/client/dist/assets/setup-DkeE8mP0.js +0 -1
  1069. package/client/dist/assets/setup-xVntVaz1.js +0 -1
  1070. package/client/dist/assets/specs-Bqvtz2kz.js +0 -1
  1071. package/client/dist/assets/specs-CKes-kz6.js +0 -1
  1072. package/client/dist/assets/specs-CfXxPDNB.js +0 -1
  1073. package/client/dist/assets/specs-CyF9HuTI.js +0 -1
  1074. package/client/dist/assets/specs-DMj035Mt.js +0 -1
  1075. package/client/dist/assets/specs-DfIdoU5L.js +0 -1
  1076. package/client/dist/assets/specs-j5pGLQeU.js +0 -1
  1077. package/client/dist/assets/specs-xW5pkkB7.js +0 -1
  1078. package/client/dist/assets/spending-CQnrWiR3.js +0 -1
  1079. package/client/dist/assets/square-D0JTbRSR.js +0 -1
  1080. package/client/dist/assets/tauri-shell-DE6LfGPw.js +0 -2
  1081. package/client/dist/assets/terminal-BAzpHtpY.js +0 -1
  1082. package/client/dist/assets/terminal-C7dHeR3x.js +0 -1
  1083. package/client/dist/assets/terminal-CMla5Qsz.js +0 -1
  1084. package/client/dist/assets/terminal-CdNXH-n9.js +0 -1
  1085. package/client/dist/assets/terminal-Cw5bZsmV.js +0 -1
  1086. package/client/dist/assets/terminal-DFUP4eNv.js +0 -1
  1087. package/client/dist/assets/terminal-DGqljeK_.js +0 -1
  1088. package/client/dist/assets/terminal-cU70NodO.js +0 -1
  1089. package/client/dist/assets/tickets--tiSOCcn.js +0 -1
  1090. package/client/dist/assets/tickets-BUJ3DMWU.js +0 -1
  1091. package/client/dist/assets/tickets-C1WNPODq.js +0 -1
  1092. package/client/dist/assets/tickets-CDjhWmiE.js +0 -1
  1093. package/client/dist/assets/tickets-CLgPC3uO.js +0 -1
  1094. package/client/dist/assets/tickets-D41ZMQpf.js +0 -1
  1095. package/client/dist/assets/tickets-DEaQC06P.js +0 -1
  1096. package/client/dist/assets/tickets-kcMzbLCp.js +0 -1
  1097. package/client/dist/assets/trash-D8zYUmTg.js +0 -1
  1098. package/client/dist/assets/useDesktop-BjLT0_EE.js +0 -1
  1099. package/client/dist/assets/useRuntimeRuns-C97qEqMg.js +0 -1
  1100. package/client/dist/assets/useSharedWebSocket-Bj4LMp7b.js +0 -2
  1101. package/client/dist/assets/utils-BC4DHlz2.js +0 -1
  1102. package/docs/guide/en/getting-started/4-the-dashboard-tour.md +0 -48
  1103. package/docs/guide/es/getting-started/4-the-dashboard-tour.md +0 -48
  1104. package/server/dist/mobile/mobile-preview-channel.js +0 -179
  1105. package/server/dist/mobile/mobile-preview.js +0 -366
  1106. package/server/dist/modules/browser/domain/preview-origins.js +0 -117
  1107. package/server/dist/modules/browser/runtime/preview-targets.js +0 -80
  1108. /package/client/dist/assets/{atom-one-dark-B-oHczHB.css → DocView-B-oHczHB.css} +0 -0
  1109. /package/docs/guide/de/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
  1110. /package/docs/guide/en/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
  1111. /package/docs/guide/es/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
  1112. /package/docs/guide/fr/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
  1113. /package/docs/guide/it/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
  1114. /package/docs/guide/ja/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
  1115. /package/docs/guide/pt/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
  1116. /package/docs/guide/zh/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
@@ -0,0 +1,668 @@
1
+ # Flow mode
2
+
3
+ Flow is a mode complementary to Implement: the user builds working code with
4
+ an agent in an isolated worktree, by conversation and without a spec. When
5
+ the user decides the result is right, a rail adopts the worktree and derives
6
+ the spec (the Flow → Spec loop). Implement is for delegating; Flow is for
7
+ discovering.
8
+
9
+ This guide covers the server and the client: the Flow lifecycle, the
10
+ `factory:flow-spec` loop, the delivery settlement (spec rewrite, Jira create
11
+ and review transition) and the client (Flow strip, cards, composer, board
12
+ label). User guide: [Flow](../guide/en/integrations/8-flow-mode.md).
13
+ OpenSpec change: [`flow-mode`](../../openspec/changes/flow-mode/).
14
+
15
+ ## Where each responsibility lives
16
+
17
+ | Concern | Owner |
18
+ | --- | --- |
19
+ | Lifecycle, sagas, reconciliation, routes | [Flow module](../../server/modules/flow/README.md) (hexagonal, like project settings) |
20
+ | Worktree machinery | delivery: `prepareIsolatedWorktree` (reservation), `launchIsolatedRail` with `requiredFlowWorktree` (adoption) |
21
+ | Flow turn (cwd, persona, permissions, interrupt) | missions, through the injected `FlowTurnContext` port |
22
+ | Interrupting a running turn | Core sessions (`session.send { delivery: 'interrupt' }`) |
23
+ | Placeholder spec | specs ticket store (`source: 'flow'`, schema 1.5) |
24
+ | Accounting | `agent_invocations.surface = 'flow'` |
25
+
26
+ Core is the engine and Desktop the product: Desktop never branches by
27
+ provider for Flow. Flow turns run only on Core agent sessions; there is no
28
+ legacy transport.
29
+
30
+ ## Capability gating
31
+
32
+ `GET /api/projects/:id/flow/availability` is the client's switch. Flow is
33
+ available only when Core sessions are usable and the selected Core runtime
34
+ advertises `flowSessions` (interrupt delivery, Core PR #435) and
35
+ `deriveChange` (the derive-change node). Starting also requires a session
36
+ host whose `initialize.capabilities.flowSessions` is 1 and a Core session
37
+ driver for the mission's provider. Otherwise the routes answer
38
+ `409 feature_unavailable` with the missing capabilities and nothing changes
39
+ for missions. The anti-corruption layer (`agent-sessions/domain/protocol.ts`)
40
+ reads the new `deliveries`/`capabilities` contract fields additively;
41
+ `checkSessionContract` stays compatible with older Cores.
42
+
43
+ ## Lifecycle
44
+
45
+ ```
46
+ start pause hand-off delivered
47
+ (none) ─────────► active ◄─────► paused ───────────► handed_off ─────────► delivered
48
+ │ resume ▲ │
49
+ │ discard │ returned │ launch failed
50
+ ▼ │ (Back to Flow) ▼
51
+ discarded └────────────── paused
52
+ ```
53
+
54
+ `needs-review` is set only by startup reconciliation, when the Flow's
55
+ worktree disappeared (or a compensation could not remove it). It cannot be
56
+ discarded (nothing there is provably Flow's to delete); **Close this Flow**
57
+ (`close`, `POST /flow/:flowId/close`) ends it in the terminal `closed` state
58
+ (migration 81; Flows closed before it read `discarded`) WITHOUT releasing
59
+ anything: the branch and any surviving worktree stay, the spec's Flow label
60
+ becomes `closed` (hidden) and the history says "Left Flow · closed, branch
61
+ kept". The state machine (`flow/domain.ts`) is pure; it returns
62
+ effects that the use cases execute through ports.
63
+
64
+ ### Start (saga)
65
+
66
+ 1. Insert the `flow_sessions` row (`active`, step `start:ticket`). The partial
67
+ unique index allows one active/paused Flow per conversation.
68
+ 2. Create the placeholder spec through the non-promoting path:
69
+ `status: in_progress`, `source: 'flow'`, title and description from the
70
+ idea, `metadata.flow = { conversationId, flowId, worktreeId, startedAt,
71
+ state: 'active', chosenMode: 'flow' }`.
72
+ 3. Reserve the worktree with `prepareIsolatedWorktree` (branch from the
73
+ ticket; mount `~/.specrails/projects/<slug>/worktrees/<flowId>/ticket-<id>`).
74
+ `flow_sessions` owns it; `rail_worktrees` does not see it.
75
+ 4. Record the Core session id `flow:<flowId>`. The Core session opens lazily
76
+ on the first Flow turn, with the worktree as cwd.
77
+
78
+ A failure compensates in reverse order (release the worktree, delete the
79
+ spec) and marks the Flow `discarded`; when compensation itself fails the row
80
+ stays `needs-review`.
81
+
82
+ ### Start from an existing spec
83
+
84
+ `POST /flow { conversationId, ticketId }` starts a Flow on a spec the person
85
+ already has (Flow and Implement are offered with equal weight for any spec):
86
+
87
+ - **Doors.** The board's spec context menu and the spec detail header
88
+ (**Start in Flow**, next to drag-to-rail / **Move to Rail**,
89
+ [`StartInFlow`](../../client/src/features/flow/components/StartInFlow.tsx),
90
+ provided by App.tsx through the specs seam `SpecExtensionsContext`: specs
91
+ never import Flow),
92
+ the mission's `flow-offer` card when the block carries `ticketId` (the agent
93
+ emits it when the person asks to implement an existing spec without naming a
94
+ rail; the card shows "Spec #N · title" and spec-specific hints; Implement
95
+ replies "Let's implement spec #N on a rail." so the agent continues with the
96
+ rail-launch card) and the rail-launch card of ONE spec (missions'
97
+ `RailLaunchAlternative` slot; starting the Flow dismisses the card). From
98
+ the board the Flow opens in the spec's `origin_conversation_id` mission when
99
+ it can take it (else `flow_already_open` / `conversation_not_pinned` /
100
+ `conversation_not_found` ⇒ a new mission pinned to the project, titled after
101
+ the spec) and the mission panel opens on it. In a project with several Git
102
+ repositories (`flowRepositoryChoice` shows a choice and lists two or more Git
103
+ members) a spec that does not name exactly one Git member first asks where
104
+ the Flow runs (`chooseSpecRepository` →
105
+ [`FlowRepositoryPrompt`](../../client/src/features/flow/components/FlowRepositoryPrompt.tsx),
106
+ a dialog mounted once by `FlowMissionsBridge` so it survives the board menu
107
+ closing). It uses the entry card's
108
+ [`FlowRepositoryPicker`](../../client/src/features/flow/components/FlowRepositoryPicker.tsx)
109
+ (Git members of `GET /repositories`, arrow-key radio group), preselects the
110
+ spec's first Git member, else the Git primary (a folder primary preselects
111
+ nothing), and sends the pick as `repositoryId`; Cancel starts nothing.
112
+ Otherwise (one repository, a spec naming exactly one Git member, the list
113
+ failing to load) no dialog shows and the server triages as below.
114
+ The rail-launch card's door asks the same way: the card passes its spec's
115
+ `ticketTitle` / `ticketRepositoryIds` through `RailLaunchAlternative`.
116
+ - **Eligibility** (before any write; `FlowTickets.inspectExisting`, re-checked
117
+ atomically by `adoptExisting`): the spec exists, is not done/cancelled, is
118
+ not held by another Flow and is on no rail (`spec_on_rail`, or
119
+ `spec_running` when that rail has a live delivery). The client mirrors it
120
+ (`startInFlowBlock`) and disables the action with the reason as tooltip;
121
+ it also needs Flow availability.
122
+ - **Saga.** `start` carries `ticketId`: `specOrigin = 'existing'`
123
+ (`flow_sessions.spec_origin`, migration 82) and the first effect is
124
+ `adoptTicket` instead of `createPlaceholderTicket`. The spec keeps its
125
+ `source` and gets `metadata.flow = { …, origin: 'existing', previousStatus }`
126
+ and status `in_progress` (the same "In Flow" label). A spec that targets
127
+ exactly one repository runs there.
128
+ - **First turn.** `ticket-created` carries `buildSpecSeedBriefing` (title,
129
+ body with acceptance criteria and Contract Layer, non-goals, open addenda;
130
+ ≤ 24 KB) in the pending briefing, delivered once on the user turn like a
131
+ Back to Flow briefing.
132
+ - **Discard / failed start / restart compensation** emit `restoreTicket`
133
+ instead of `deletePlaceholderTicket`: the label goes and `previousStatus`
134
+ comes back (unless the spec moved on). An existing spec is never deleted;
135
+ `deletePlaceholder` also refuses any spec with `origin: 'existing'`.
136
+ - **Settlement.** `rewrite-spec` first keeps the spec's current content as
137
+ ONE comment "Original spec before Flow" (`preserveOriginal`, idempotent via
138
+ `metadata.flow.originalCommentId`), then rewrites the spec ENTIRELY from what
139
+ was built (current format + awaited Contract Layer), quoting the original as
140
+ context only. After a successful rewrite the spec's live addenda (open — the
141
+ ones the first turn showed, or added since — or in flight on the hand-off
142
+ run) become `applied` like a completed rail run's (`applyAddenda` →
143
+ `applyFlowSpecAddenda`; an open one records the Flow's delivery id as
144
+ `run_id`). A failed rewrite leaves them untouched; a replay is a no-op. `jira-create` of a spec already linked to an issue enqueues an
145
+ idempotent outbox `update` of THAT issue (`flow:<flowId>:update`,
146
+ `JiraSyncManager.enqueueSpecUpdate`: summary, description, labels,
147
+ priority; note `updated`), never a create; `jira-review` then moves it to the
148
+ status mapped for `on_review`. An unlinked spec keeps create-at-settlement.
149
+
150
+ ### Workspaces and multi-repository projects
151
+
152
+ A project can be a workspace (a plain folder primary holding several Git
153
+ repositories) or list several Git repositories. Flow then runs in ONE Git
154
+ member, chosen before any effect (`resolveFlowRepository`, pure domain):
155
+
156
+ | Request | Result |
157
+ | --- | --- |
158
+ | Single-repository project | Never triaged; the Flow runs at the project root exactly as before. |
159
+ | Explicit `repositoryId` | Must be a listed, available `kind: 'git'` member, else `400 flow_repository_not_git` / `flow_repository_unknown`. Choosing the primary keeps the pre-workspace behaviour. |
160
+ | No `repositoryId` | The primary when it is Git, else the only Git member; several candidates ⇒ `400 flow_repository_required`, none ⇒ `flow_repository_not_git`. |
161
+
162
+ The mission agent triages it: the `flow-offer` block carries `repositoryId`
163
+ (required when `project.repositories` lists more than one Git repository or the
164
+ primary is a folder; never a folder, never invented). `FlowEntryCard` shows the
165
+ target with a picker of the Git members (`GET /repositories`), preselected from
166
+ the offer, only for such projects. "Start in Flow" from the board or the spec detail uses the same picker
167
+ in a dialog (see [Start from an existing spec](#start-from-an-existing-spec)).
168
+
169
+ A non-primary choice is persisted on `flow_sessions.repository_id`
170
+ (migration 80; NULL ⇒ primary) and on the placeholder spec
171
+ (`repositoryIds: [id]`). Reserve, freeze, diff and release use that member's
172
+ checkout, its own integration branch and the per-repository mount root
173
+ `~/.specrails/projects/<slug>/worktrees/<repositoryId>/<flowId>/…`
174
+ (`isolatedRepositoryTarget`, shared with `prepareIsolatedWorktree`); the
175
+ overlay comes from the project's framework surface, as for a multi-repository
176
+ rail child. A dev server started inside such a Flow (MCP `background_start`, or
177
+ `POST /background-processes` without `repositoryId`) runs in the Flow worktree,
178
+ tagged with the Flow and its repository.
179
+
180
+ ### Turns
181
+
182
+ While the Flow is `active`, `FlowTurnContext.forConversation` returns
183
+ `{ cwd, coreSessionId, systemPrompt, policy }` and the mission turn becomes a
184
+ Flow turn:
185
+
186
+ - its own Core session `flow:<flowId>` (cwd is fixed at open, so the
187
+ mission's session stays intact and resumes after the Flow);
188
+ - `permissions: 'bypass'`, `tools: { mode: 'default' }` (see
189
+ [Permissions](#permissions)), the same Specrails MCP the mission presents;
190
+ - sub-agents follow the mission's project policy: "Allow sub-agents" off (the
191
+ default) keeps them disabled; on, the session runs them natively or, with
192
+ "Run sub-agents with" another provider, Core-delegated
193
+ (`resolveSubagentRuntime`). Native sub-agents run inside the provider
194
+ process (the worktree cwd); Core opens delegated children with the parent
195
+ session's cwd and permissions (`DelegationCoordinator.delegate`), so they
196
+ also write only in the worktree. The sub-agent tools of `specrails_mission`
197
+ act on the Flow session while a Flow turn ran last. When enabled, the static
198
+ `FLOW_SUBAGENTS_ADDENDUM` (plus the delegation guidance when delegated) is
199
+ appended to the persona: split truly independent work, then integrate and
200
+ verify it. The Flow session has its own projection and bills `flow` (see
201
+ [agent sessions](agent-sessions.md));
202
+ - the static Flow persona ([agent-flow-prompt.ts](../../server/modules/missions/runtime/agent-flow-prompt.ts))
203
+ as the session `systemPrompt`, never a file in the worktree; per-turn facts
204
+ (worktree path, branch) ride the user turn. Its **Choices** rule ends every
205
+ reply that offers a choice with the mission's fenced `options` block (2-6
206
+ short, actionable labels; never otherwise), rendered as chips;
207
+ - the conversation history is sent once, on the first turn of the Flow
208
+ session; Core's journal keeps the rest;
209
+ - every mid-turn input is delivered as `delivery: 'interrupt'` (the send
210
+ route accepts `deliveryMode: 'interrupt'` only in an active Flow). Desktop
211
+ never calls `session.interrupt` first. The runner follows the correction's
212
+ turn and records ONE invocation with the usage of both turns;
213
+ - the provider session reference never overwrites the mission's
214
+ `session_id`; usage is recorded with `surface: 'flow'`.
215
+
216
+ When the Flow is paused or ended the port returns null and turns are normal
217
+ read-only mission turns again.
218
+
219
+ ### Permissions
220
+
221
+ A Flow session runs with the same permission level as a rail's write roles:
222
+ `FLOW_SESSION_BOUNDARY` is `permissions: 'bypass'`, which Core's drivers map
223
+ to Claude `--dangerously-skip-permissions` and Codex
224
+ `--sandbox danger-full-access`. Rails pick the same level for every provider
225
+ (Core's CLI executor); no adapter declares a narrower write-role mapping.
226
+
227
+ The previous `workspace-write` boundary mapped Claude to
228
+ `--permission-mode acceptEdits`: every shell command then waited for an
229
+ interactive approval that a headless Core session cannot get, so the agent
230
+ could not run the typecheck, the tests, an install or the app. That was the
231
+ "you can't run or preview the app while in Flow" report.
232
+
233
+ Containment is the same as a rail's, not an operating-system sandbox:
234
+
235
+ - the session cwd is the Flow worktree (fixed when the Core session opens;
236
+ delegated sub-agents inherit it);
237
+ - the static persona forbids editing, creating or deleting anything outside
238
+ the worktree, switching branches, rewriting history and pushing;
239
+ - the worktree has its own branch, and Flow commits and delivers only that
240
+ worktree (hand-off freeze), so the main checkout is not involved;
241
+ - long-lived processes go through Specrails background processes (below),
242
+ which are confined to the worktree and stopped with the Flow.
243
+
244
+ A command the agent runs can technically reach outside the worktree, as in
245
+ a rail. Normal (non-Flow) mission turns keep their read-only boundary
246
+ ([read-only missions](mission-read-only-policy.md)).
247
+
248
+ ### Running the app
249
+
250
+ The persona tells the agent to verify its work with its own shell
251
+ (typecheck, tests) and to run every long-lived process (dev server, watcher)
252
+ through `specrails_jobs background_start`, never from its shell. It offers it
253
+ first with the option chips **Start the app** / **Start and expose on the
254
+ local network** / **Not now**. LAN exposure follows the operator rule: the
255
+ framework's own host flag and a warning that anyone on that network can reach
256
+ the app. Once the app is listening it gives the `appUrls` (local, then
257
+ network) as links.
258
+
259
+ `background_start` resolves the conversation's ACTIVE Flow through the
260
+ project's Flow use cases (`ProjectContext.flow.getByConversation`, bound at
261
+ composition; the authenticated capability supplies the conversation). Inside
262
+ an active Flow:
263
+
264
+ - the process runs in the Flow worktree (`cwd` may only name a folder inside
265
+ it; `repositoryId` is ignored) and carries `flowId`;
266
+ - the project's busy guard (a running job or loop) does not apply: the
267
+ worktree is isolated from the checkout those runs use;
268
+ - the call is admitted below the Autonomous level when the user confirmed it
269
+ (`confirmed: true` after picking a start chip). Entering Flow already
270
+ granted write and execution in that worktree, so asking for Autonomous
271
+ would only push the agent back to a raw shell. `background_kill` is admitted
272
+ the same way for a process tagged with that Flow. The exception is the
273
+ tool's `tierException` (`server/mcp/tools/types.ts`), consulted only for
274
+ in-app agent turns; external MCP clients keep the Settings ▸ MCP tiers.
275
+ Outside an active Flow, or without confirmation, the ladder applies as before.
276
+
277
+ The `stopProcesses` effect runs first on pause, discard and hand-off
278
+ (`FlowProcesses.stop` → `stopBackgroundProcessesForFlow`, which requests stop
279
+ and waits up to 4 s for exit) because the worktree is about to be frozen,
280
+ removed or handed to a rail. It is best effort: a failure is logged and never
281
+ blocks the user's decision. Processes never survive a restart (their history
282
+ is marked `interrupted`), so startup reconciliation needs no extra step.
283
+
284
+ ### Pause, resume, discard
285
+
286
+ Pause stops the Flow's apps, closes the Core session (stopping a running
287
+ Flow turn) and labels the spec `paused`. A closed Core session never takes
288
+ another turn, so resume (also after Back to Flow and after a restart) opens a
289
+ NEW session `flow:<flowId>:<generation>` lazily; its first turn carries the
290
+ conversation history (and any pending return briefing), so the agent keeps the
291
+ context. A turn also renews the session when the conversation switched provider
292
+ (a Core session is bound to the driver it was opened with) and, if Core still
293
+ answers "session … is closed", reopens and retries once instead of failing
294
+ (`FlowService.renewSession`, `MissionCoreSessions.flowSessionUsable`).
295
+ Projection and accounting follow each session id. Discard stops the apps, closes the
296
+ session, removes the Flow-owned worktree and branch and deletes the
297
+ placeholder spec. Discard after a hand-off is illegal.
298
+
299
+ ### Hand-off
300
+
301
+ `POST /flow/:flowId/hand-off { railIndex, loopId?… }`:
302
+
303
+ 1. Stop the Flow's apps and close the session; step `handoff:freeze`.
304
+ 2. Commit the worktree (overlay and warm `node_modules` excluded) and record
305
+ the frozen HEAD; step `handoff:launch`.
306
+ 3. Assign the spec to the free rail and call the rails launch route over
307
+ loopback with `flowId` (the single launch authority keeps every guard).
308
+ 4. The launch passes `requiredFlowWorktree` to `launchIsolatedRail`, which
309
+ reuses the exact mount (`reuseBranchWorktree: true`, `fresh: false`) and
310
+ verifies path, branch and `HEAD == headSha` (else
311
+ `FlowWorktreeMismatchError`, 409). Ownership becomes `adopted` (released
312
+ like `created` once the rail owns it, never removed by an allocation
313
+ rollback). The `rail_worktrees` row and `flow_sessions.state = handed_off`
314
+ commit in one transaction; a rollback after adoption returns ownership.
315
+ 5. Any failure before that commit reverts the Flow to `paused`.
316
+
317
+ A Flow in a non-primary repository launches with `repositoryIds: [id]`
318
+ (`RequiredFlowWorktree.repositoryId`). The rails route accepts it only when the
319
+ scope is exactly that repository; `launchIsolatedRail` diverts to the
320
+ multi-repository launcher, which accepts the Flow contract only for that single
321
+ selected repository (`FlowWorktreeMismatchError` otherwise) and seeds the
322
+ manifest base with the Flow reservation commit. The repository leg adopts the
323
+ worktree and reports the **parent** (group) delivery to the Flow, because only
324
+ the parent's `rail.pr_state` is broadcast and settles the Flow. A
325
+ one-repository Flow → Spec group copies its child's `review_changes_requested`
326
+ status and settle evidence onto the parent, so the card offers Back to Flow /
327
+ Relaunch and `stoppedDelivery` reads the findings; Back to Flow closes parent
328
+ and child in the same transaction. The settlement reads the derived change
329
+ from the Flow repository.
330
+
331
+ See [Flow → Spec loop](#flow--spec-loop) and [Settlement](#settlement) for
332
+ what happens after the hand-off, and [Back to Flow](#back-to-flow-and-relaunch)
333
+ for a run that stopped with requested changes.
334
+
335
+ ### Mode boundaries
336
+
337
+ The service posts one `flow-boundary` system row through the optional
338
+ `FlowConversation.postBoundary` port when the conversation enters Flow (start
339
+ completed: `entered/started`; Back to Flow: `entered/returned`) or leaves it
340
+ (hand-off adopted: `left/handed_off`; discard of an open Flow:
341
+ `left/discarded`; close of a needs-review Flow: `left/closed`), with the branch. Idempotent repeats (the same hand-off
342
+ again) post nothing; a failed start or hand-off posts nothing; a throwing port
343
+ never fails the transition. The client renders the lines and marks the agent
344
+ turns in between as Flow turns.
345
+
346
+ ### Restart
347
+
348
+ At project startup, after rail worktree reconciliation and before admission
349
+ opens: `active` Flows become `paused` (sessions never survive a restart);
350
+ `start:ticket`/`start:worktree` are compensated; `start:session` and
351
+ `handoff:*` complete as `paused`; a missing worktree becomes `needs-review`
352
+ (nothing is deleted). Handed-off and terminal Flows are untouched.
353
+
354
+ ## Flow → Spec loop
355
+
356
+ `factory:flow-spec` ([recipe](../../server/modules/loops/runtime/loop-flow-spec-recipe.ts))
357
+ is a built-in `mode: 'loop'` factory that exists only when Core advertises
358
+ `engineV2`, `workflowDefinitions` and `deriveChange: 1`. It is listed by
359
+ `GET /api/loops/factory` with `launchable: false`, is not an editable built-in
360
+ (not in `EDITABLE_BUILTIN_LOOP_IDS`, never seeded into the loop library) and
361
+ runs only from a Flow hand-off: the rails route answers `400 flow_id_required`
362
+ without `flowId` and `409 engine_unsupported` when the selected Core lacks
363
+ `deriveChange` (the run itself re-checks in `assertDefinitionSupport`).
364
+
365
+ The graph mirrors Core's reference definition (`flow-spec.json`); a parity
366
+ test compares node kinds, routing and the closed params:
367
+
368
+ ```
369
+ init → derive (derive-change) ─pass→ check (verify) ─pass→ review → review-policy ─true→ archive → verify → done
370
+ │fail │fail │false
371
+ └→ repair-guard (1 repair) └──→ check-findings review-findings ←┘
372
+ └──→ correction-budget ─exhausted→ changes-requested
373
+ │ (2 rounds)
374
+ begin-correction → fix (developer, fixer stance, WRITE)
375
+ → fix-progress ─no change→ changes-requested
376
+ └→ derive (the change is updated in place)
377
+ ```
378
+
379
+ - Strict `openspec validate` and the archive preflight run inside the
380
+ `derive-change` piece; its `fail` outcome is the one-visit repair loop, so
381
+ there is no separate `openspec-validate` node. Each correction round resets
382
+ that repair budget.
383
+ - A rejected review or a failing `check` is not a dead end. Their findings
384
+ (`{{outputs.review.structured}}`, or the failing host verification) become
385
+ `$vars.latestFindings` and a bounded correction round runs: `fix` is a
386
+ `role-turn` of the built-in `developer` role with `stance: 'fixer'` (Core's
387
+ fixer instructions, the configured fixer engine when there is one, WRITE
388
+ access in the worktree). It fixes the named defects, adds the tests the
389
+ review asks for (tagged `[spec:<capability>/<slug>]` for the ADDED/MODIFIED
390
+ requirement they prove) and never expands scope or edits `openspec/`.
391
+ `derive` then runs again with `feedback: {{run.latestFindings}}`: the
392
+ deriver updates the existing change in place so the artifacts describe the
393
+ code (including behaviour the review said the spec omitted). A round that
394
+ changes nothing (`fix-progress`) or an exhausted budget
395
+ (`FLOW_CORRECTION_ROUNDS = 2`) ends at `changes-requested`, a `failure` end
396
+ whose reason carries the latest findings.
397
+ - Roles: `deriver` (always added for a `derive-change` node), `developer`
398
+ (the fixer) and `reviewer`. The reviewer receives
399
+ `{{outputs.derive.derivation}}` and treats every unexplained file as an
400
+ issue; the policy gate is `approved == true`.
401
+ - Config: `change: 'new'`, `journal: 'ledger-only'`, `reviewerStepId: 'review'`.
402
+
403
+ Before the run, Desktop prepares the derivation inputs:
404
+
405
+ - **Change id.** Named after the spec title, never after addenda or the run:
406
+ kebab-case, diacritics folded, at most 64 characters cut at a word
407
+ (`flowChangeId`). A name another change holds (present at the Flow base, or
408
+ archived) gets `-2`, `-3`…; an active change that is absent at the base is
409
+ this Flow's own earlier derivation and is reused, so a relaunch re-derives
410
+ it in place. No addenda "delta" briefing applies to Flow.
411
+ - **Base.** `requiredFlowWorktree.baseSha` (the Flow reservation commit)
412
+ travels as `LoopRunRequest.flowDerivation.baseSha` and becomes
413
+ `repositories[].baseSha` in the frozen Core context, so Core measures the
414
+ change from the reservation, not from the frozen hand-off commit (which
415
+ would be an empty change set).
416
+ - **Summary.** The hand-off authority builds a bounded summary of the Flow
417
+ conversation (`buildFlowSummary`): the idea, every message the person typed
418
+ since the Flow started (automatic briefings excluded), the first line of
419
+ the agent's final reply to each (`↳ Agent: …`) and the persona's
420
+ `Decision:` lines; ≤ 32 KB of UTF-8, the oldest messages (with their reply)
421
+ dropped first, then the oldest decisions; front matter
422
+ `transcriptTurns: <n>` counts the messages kept. Message times are SQLite
423
+ `datetime('now')` stamps and the Flow start is ISO 8601: the window compares
424
+ them as instants (`inFlowWindow`, the start floored to its second). Comparing
425
+ the strings once put every message of the Flow's own day before its start
426
+ and produced an empty summary. The executor writes the summary once,
427
+ `0600`, to `.specrails/pipeline/<runId>/flow-summary.md`, which the node
428
+ reads as `summaryPath`. A summary failure never blocks the hand-off: Core
429
+ then derives from the diff alone.
430
+
431
+ ## Back to Flow and Relaunch
432
+
433
+ When the run ends at `changes-requested` (or the latest review rejected, or
434
+ the latest checks fail), settlement reads the settle evidence
435
+ (`flowReviewOutcome`, delivery) and records `status_code =
436
+ review_changes_requested` with the reviewer's first issue as `statusDetail`
437
+ instead of the generic "Programmatic workflow stopped" failure. The
438
+ snapshot, the `rail.pr_state` message and the mission card envelope carry
439
+ `flowReview` (`reason` review|check, summary, ≤ 20 issues, score, failing
440
+ host checks). The mission card shows "The reviewer requested changes" with
441
+ those issues and two actions (the Flow extension's `RunCardActions` slot);
442
+ the rail strip shows a "Changes requested" pill and never offers Discard
443
+ (the Flow worktree must survive). The run-failure briefing offers the same
444
+ two actions.
445
+
446
+ - **Back to Flow** — `POST /flow/by-delivery/:deliveryId/return`. Delivery
447
+ owns ONE transaction (`returnFlowWorktree`): it deletes the adopted
448
+ `rail_worktrees` row, closes the delivery as `discarded` /
449
+ `returned_to_flow` (the rail is free again) and, inside it, the Flow saves
450
+ `handed_off → paused` (`returned`: `deliveryId` kept for idempotency,
451
+ `railIndex` cleared). Any failure rolls both back. The worktree, its branch
452
+ and the run's changes (the derived change included) are never touched. The
453
+ spec goes back to in progress, "In Flow" (`reopenTicket`), the agent
454
+ session reopens (a session that cannot open leaves the Flow paused; the
455
+ Flow strip resumes it) and `flow_sessions.return_briefing` (migration 78)
456
+ holds the review: the next Flow turn carries it on the USER turn (never
457
+ the system prompt) and the Flow clears it once that turn completes
458
+ (`briefingDelivered`); a new hand-off drops an undelivered one. The return
459
+ is also announced (`FlowConversation` port, idempotent by delivery): a
460
+ visible system card "What the reviewer asked for" (`flow-return-briefing`
461
+ row: issues, score, failing checks, spec coverage with unexplained files)
462
+ and, when the session opened, ONE automatic Flow turn (durable queue id
463
+ `flow-return:<deliveryId>`, rendered as an automatic briefing) through the
464
+ normal Flow turn path — accounted, interruptible — in which the agent says
465
+ in two lines what it will fix and starts, offering an `options` block first
466
+ when a finding leaves a genuine decision. A paused return only shows the
467
+ card; the briefing waits for the person's next turn.
468
+ - **Relaunch** — `POST /flow/by-delivery/:deliveryId/relaunch`: the same
469
+ return, then the ordinary hand-off (freeze, launch) on the same rail with
470
+ the stopped launch's engine choices. The new run re-derives the existing
471
+ change in place.
472
+
473
+ ### A run that failed outright: automatic return
474
+
475
+ A Flow → Spec run can also fail for a technical reason — no review verdict:
476
+ the derivation, a check, the archive or the tooling broke (for example an
477
+ OpenSpec version mismatch). The delivery settles `implementation_failed`
478
+ without `review_changes_requested`. Then the work goes back to its Flow on its
479
+ own (user decision "Volver a Flow solo"):
480
+
481
+ - **Detection** — the `rail.pr_state` observer (`observeDelivery`) asks the
482
+ publication port for `deliveryState(deliveryId).crashed`: a Flow → Spec
483
+ delivery, `implementation_failed`, no `flowReview`, not
484
+ `review_changes_requested`/`returned_to_flow`, no operation in flight. Only
485
+ a Flow still `handed_off` to THAT delivery reacts, so a returned,
486
+ relaunched, delivered or discarded Flow never does and repeated broadcasts
487
+ are no-ops. Startup replay (`replaySettlement`) returns a Flow whose run
488
+ failed while the app was down.
489
+ - **Return** — exactly Back to Flow (`returnToFlow`: delivery's one
490
+ transaction, idempotent by delivery, the session reopens). Before the
491
+ delivery closes, the Flow reads the failure (`FlowRunFailure`): the
492
+ delivery codes (`stoppedDelivery.failure`: status code, first unit failure
493
+ code, status detail) and the runtime's own record (`rails.runFailure`: the
494
+ step it stopped at and the first line of its error, from the run's runtime
495
+ summary). The return briefing names the step, quotes the error, lists the
496
+ codes and sets the conduct: say what failed in two lines; fix it in the
497
+ worktree, or — when the cause is outside (a tool version, the environment,
498
+ credentials) — tell the person exactly what to change instead of working
499
+ around it.
500
+ - **Announcement** — the `flow-return-briefing` row carries `failure` (no
501
+ review fields) and the automatic Flow turn uses the failure text
502
+ (`FLOW_FAILURE_RETURN_TURN_TEXT`, same durable key `flow-return:<deliveryId>`).
503
+ The mission's own run-failure trace row and briefing turn are skipped for
504
+ such runs (`notifyMissionRunFailure({ cardOnly: true })`): the Flow owns the
505
+ explanation. The card update re-reads the delivery after its runtime
506
+ summary, so it never regresses a returned card to the failure.
507
+ - **Failure of the return** — a refusal (worktree gone, delivery busy) only
508
+ logs; the card still offers Back to Flow and Relaunch by hand.
509
+ - **Card** — the mission card renders the Flow extension's
510
+ `RunFailureOutcome` (`FlowRunFailure`): one localized headline per failing
511
+ step group (derive, verify, review, fix, archive, settle, unknown), the
512
+ runtime's error as the cause, "Your work is intact. Back in Flow, the agent
513
+ has the error.", Back to Flow (first) and Relaunch — or "Returned to Flow"
514
+ once returned — and the codes and English detail only under a collapsed
515
+ **Technical details** (with the repository of a multi-repository run). The
516
+ generic failure block, note, status label and failed unit chip are hidden.
517
+ A returned card keeps the `runtime` failure snapshot it stopped with
518
+ (`updatePrDecisionCard` carries it over for `returned_to_flow`).
519
+
520
+ ## Settlement
521
+
522
+ When the Flow's delivery reaches review, the Flow settles. Triggers:
523
+
524
+ - a `rail.pr_state` broadcast for the Flow's `deliveryId` whose decision is
525
+ `on_review`, `pr_draft`, `pr_ready`, `completed` or `merged` with a
526
+ succeeded implementation (`observeDelivery`);
527
+ - without a PR delivery row (PR delivery disabled), the completed run itself
528
+ (`onRailRunCompleted`, keyed by the run id);
529
+ - at startup, `replaySettlement` settles handed-off Flows whose delivery
530
+ reached review while the app was down and resumes pending effects; a 30 s
531
+ scheduler retries due effects.
532
+
533
+ `onFlowDelivered` records `delivered`, labels the spec `delivered` and
534
+ enqueues three durable effects in `flow_effects` (migration 75, project
535
+ database) with keys `flow:<flowId>:rewrite-spec`, `:jira-create`,
536
+ `:jira-review`. They run in `seq` order with attempts and exponential backoff
537
+ (15 s doubling, capped at 5 min); a pending effect that is not due blocks the
538
+ ones after it, and a failure never reverts the delivery.
539
+
540
+ | Effect | Does | Gives up |
541
+ | --- | --- | --- |
542
+ | `rewrite-spec` | (Flow from an existing spec: first keeps the original as an "Original spec before Flow" comment.) Reads the derived change from the delivered commit (`proposal.md`, `design.md` of the archived change, diffstat), sets `metadata.flow.state = 'delivered'`, `metadata.openspecChangeName` and status `on_review`, then rewrites the spec in place with `generateSpecFromText({ ticketId })` (current format, surface `flow`) and an awaited Contract Layer; once rewritten, the spec's open/in-flight addenda become `applied` | 3 attempts → `failed`: the spec keeps its Flow draft and the packet says so |
543
+ | `jira-create` | Projects with an active Jira connection only: `enqueuePromote(ticketId, 'flow:<flowId>:create')` (durable outbox create with marker recovery); a Flow from an existing spec already linked to an issue enqueues `enqueueSpecUpdate(ticketId, 'flow:<flowId>:update')` instead (note `updated`) | 8 attempts; `skipped` when not connected |
544
+ | `jira-review` | Once the issue link exists: `onRailReview([ticketId], deliveryId)` → the status mapped for `on_review` | 60 polls while the outbox creates the issue; `skipped` when no issue was created |
545
+
546
+ Why a dedicated table instead of the Jira outbox or `rail_pr_ticket_effects`:
547
+ the spec rewrite is not a Jira operation, the three effects are ordered across
548
+ two systems (specs, then Jira) and keyed by the Flow rather than the delivery
549
+ decision. The Jira writes still go through the Jira outbox, so retry, marker
550
+ recovery and dead-lettering stay where they are.
551
+
552
+ Nothing reaches Jira during Flow or on discard: `isFlowHeldTicket` blocks every
553
+ create while the Flow is `active`/`paused`, and the run settlement in
554
+ `project-registry` excludes Flow-held specs from its own `onRailReview`, so a
555
+ Flow spec is never transitioned before its issue exists nor transitioned twice.
556
+
557
+ Once the spec rewrite and the Jira create settled, the conversation gets the
558
+ Flow's closing summary (`flow-delivered` row, once per Flow; see
559
+ [Client](#client)).
560
+
561
+ ## Jira
562
+
563
+ `isFlowHeldTicket` (metadata.flow state `active` or `paused`) blocks every
564
+ Jira create: promote returns an error and a durable `create` outbox op is
565
+ retried until the Flow settles (dead-lettered after the normal attempt
566
+ limit). Unlinked tickets never receive outbound writes otherwise.
567
+
568
+ ## Events and cost
569
+
570
+ `flow.state { projectId, conversationId, flowId, flow, timestamp }` is
571
+ broadcast on every committed change (and when a settlement effect finishes).
572
+ `GET /flow/:flowId/cost` sums only provider-billed Flow turns in the Flow's
573
+ lifetime (user turns, continuation turns after sub-agents and delegated
574
+ sub-agents' own spend, all recorded with surface `flow`) and reports
575
+ `unpricedTurns` separately; project spending exposes
576
+ `flowCostUsd` and `flowTurns` inside the agent-mission summary. The spec
577
+ rewrite is recorded with surface `flow`.
578
+
579
+ ## Review packet
580
+
581
+ A Flow → Spec delivery adds a **Derivation** section before "What to watch
582
+ out for": coverage (`explained/files`, Core's measurement from git), the
583
+ unexplained files, requirements added/modified and the deriver's confidence
584
+ (AI-reported). It comes from the derive-change scope in `runtime status`
585
+ (`output.derivation`, or `derivation.json` at `output.derivationPath`),
586
+ harvested into the settle evidence. A missing report renders as unavailable,
587
+ never silently. The draft PR body gets one derivation line. See
588
+ [review packet](review-packet.md).
589
+
590
+ ## Client
591
+
592
+ Feature [`client/src/features/flow`](../../client/src/features/flow/README.md).
593
+ Missions never import it: the composition root mounts `FlowMissionsBridge`
594
+ around the mission chat and fills the missions extension seam
595
+ ([MissionExtensionsContext](../../client/src/features/missions/context/MissionExtensionsContext.tsx)):
596
+ a `flow-offer` fence card, a conversation mode (while a Flow is open: the
597
+ composer's **Flow** chip and placeholder, "In Flow" next to the
598
+ mission title, `hideGitStrip` — the run strip shows and copies the worktree
599
+ branch; only an active Flow adds `data-flow="active"` and interrupting sends),
600
+ its runs in the mission's run strip (`useLiveRuns`) with the words for the
601
+ steps of Flow → Spec (`describeRun`), the mission list's "In Flow" mark
602
+ (`useConversationMarks`), its state announcements (`ConversationDock`, mounted by the run strip and speaking through the strip's ONE polite live region via `announce`), the
603
+ run card's Back to Flow / Relaunch and the `RunFailureOutcome` of a failed
604
+ Flow → Spec run.
605
+
606
+ | Piece | Behaviour |
607
+ | --- | --- |
608
+ | Offer | The operator classifies pre-launch work as Freestyle / SDD Quick / Implement / Flow. The user turn carries `Flow: offerable` only when `FlowTurnContext.offerable` says so (Flow available, conversation pinned, no open Flow), so the static prompts stay byte-stable. The `flow-offer` block ({idea, reason, repositoryId?}) renders `FlowOfferCard`: Flow and spec + Implement with equal weight, always in that order, and the reason as neutral context ("Why the agent asked"). Flow and Implement never compete: the prompt forbids recommending or ranking either; a legacy `recommended` still parses (and still drives fence promotion) but the card ignores it. Fence promotion re-tags {idea, reason} (or a legacy {idea, recommended}) from generic JSON on both sides. While a reply streams the choices are disabled with a visible hint. |
609
+ | Entry | `FlowEntryCard` explains the isolated worktree and starts `POST /flow`. In a workspace or a project with several Git repositories it shows the target repository (radio list of Git members, the agent's triage marked "Suggested by the agent") and sends `repositoryId`; `flow_repository_*` refusals read in plain words. Unavailable ⇒ disabled with the missing capabilities in plain words. A `409 repository_has_no_commits` shows a localized message and **Create initial commit** (`POST /git/initial-commit`, an empty commit); on success Start is retried. |
610
+ | Decision record | `agent_messages.intent` kinds `flow-offer` (`accepted`/`dismissed`, `chosenMode`, `config.flowId`; a legacy `recommendedMode` is still accepted and stored, never sent by the client) and `flow-hand-off`; unique per (kind, proposalIndex). Flow kinds are accepted even with mission rail cards off. |
611
+ | Mode signals | Recognition over recall, never color alone, no screen tint. Flow has its OWN color token, `--color-accent-flow` (globals.css, every theme, ≥4.5:1 on cards and backgrounds; `FLOW_ACCENT` in `lib/flow-accent.ts`), passed through the seam as `MissionModeBadge.accent` — running stays `accent-info`, browsing the composer history uses a dashed neutral border. The composer is the main signal (a **Flow** chip with its icon next to the tier chip — no accent line along the composer: the chip names the mode — the placeholder "Tell the agent what to change in this Flow…"; the switch fades in/out in 200 ms, instant under reduced motion), "In Flow" (the board's wording) next to the mission title, and the same icon + "In Flow" on the mission list row (`GET /flow/open` per project, kept current by `flow.state`). The same app-wide watch feeds the mission list's attention dot for Flow runs (`useRunAttention` → `useFlowRunAttention`), so it is live and clears whether or not the mission is open; the strip no longer reports Flow runs itself. One rule (`lib/flow-run-tone.ts`) gives the strip tone and the dot: active is running, paused is paused, needs-review is `info`, so no open Flow state waits for the person on its own; a Flow → Spec run that fails or waits for review is a delivery and feeds the dot through its envelope. The history marks the boundaries with one line each — "Entered Flow · <branch>" and "Left Flow · handed off to a rail / discarded" — from server `flow-boundary` rows (`FlowConversation.postBoundary`, posted on start, hand-off, return and discard; the return is told by the Back to Flow line, so its boundary only marks turns); the agent turns between an entered and the next left boundary carry a discreet "Flow" mark next to their time (icon, color and words from the seam's `useTurnMark`; missions never hard-codes the Flow icon). While the Flow runs, the strip mark is the Flow icon in the Flow color (`MissionLiveRun.mode`). |
612
+ | Active | The Flow is ONE entry of the mission's run strip (`useFlowLiveRuns`, key `flow:<id>` so the strip morphs in place). Its row stays short: the status mark and "Flow · 7 files" (`flowStripHeadline`, inside the expand toggle), then `FlowStripControls` — Pause Flow (Resume Flow when paused) and the primary **Hand off**; a disabled control carries its reason (tooltip + `aria-describedby`: saving, another action, no spec yet). The chevron opens `FlowPanel`, the same expand pattern as any run: the copyable Flow branch, the files ± (a button that opens the changes dialog), the provider-billed cost so far or `—` (a `*` plus a visible note with the number of unpriced turns), Preview while the Flow's app runs and **Discard** set apart at the end. The diff and cost are measured ONCE per Flow (`useFlowLiveStats` in `useFlowLiveRuns`, shared by row and panel), refreshed on state changes and when a turn settles, and polled every 8 s only while the agent works and the page is visible; the returned runs are memoized. The discard confirmation lists what is lost (changed files with +/−, branch, placeholder spec). The Flow's state changes are announced through the strip's one polite live region; the strip's state word gives the mark a text equivalent and the dot pulses only while the agent works. Keyboard: Pause/Resume claims **P** and Hand off **H** (`FlowBarControl.shortcut` → `data-strip-key`, shown as "Pause Flow (P)" and `aria-keyshortcuts`); they act ONLY while the mission's run strip has focus (reach it with ⌥R), never globally, so nothing fires from the composer or another mission. The strip-level keys (⌥R, ⌥[ / ⌥], Esc) are missions' (`run-strip-keys.ts`, see [mission rail cards](mission-rail-cards.md)). Busy sends use `deliveryMode: 'interrupt'`; a 409 `interrupt_requires_flow` is resent normally. Option chips on the newest settled reply stay clickable while the agent is busy; a pick then interrupts (idle picks send normally). |
613
+ | Preview | In the Flow's panel, while an app the agent started for this Flow (a background process tagged `flowId`, from the mission's `BackgroundProcessesContext`) announces `appUrls`, `FlowAppPreview` shows **Preview** with a live dot: it opens the local address in the system browser, like the mission's app chips (Desktop has no embedded preview for mission apps). Its menu has the network address (or says the app only listens on this computer) and **Stop app**. Hidden when nothing runs and on a paused Flow. |
614
+ | Paused / needs-review | Paused: the same row with the paused mark and Resume Flow as the primary; the panel adds "Paused. Your changes and the spec are kept…". Needs review (the Flow's copy of the project is missing) is INFORMATIONAL (`info` tone: an info mark, no decision bell, no primary, not urgent); its panel keeps the copyable branch, the cost so far and the changes (only when a surviving worktree still holds some), explains the state and offers only the non-destructive **Close this Flow**: `FlowCloseDialog` names what is KEPT (the branch, the spec without its label) and confirms with "Close Flow, keep branch". |
615
+ | Hand off | Color decision (deliberate): **Hand off** ("Pasar a un rail") and **Launch** keep the shared `accent-primary` primary recipe (`RUN_STRIP_PRIMARY`), NOT the Flow color. They are the controls that LEAVE Flow for a rail, so they speak the app's launch color; the Flow color marks being in Flow (mark, chip, badges, Back to Flow). Client-only: the strip morphs into "Ready to turn into a PR" (a calm `info` tone: no bell, no attention dot) and its panel opens on its own with `FlowHandOffCard` — the rail launch card in hand-off mode reduced to ONE confirmation line ("Rail 2 will turn your 7 changed files into a reviewed PR. If it fails, your work is safe.", the rail's words follow the chosen rail, "A new rail" when none is free) with **Launch** and **Not yet**. The rail, engine, model and effort (a free empty rail and the conversation's selection, prefilled) sit collapsed under **Change how**, with the files ± and cost so far (the cost so far also ends the main line; a partial cost's `*` is said in words for screen readers and explained by a short visible note under the line); only when the conversation's provider cannot run the loop here, the engine fallback note shows right under the line (it changes what launches); the loop is fixed to `factory:flow-spec` (no selector). The region is named "Turn this Flow into a reviewed PR". **Launch** (the card's Play) calls `POST /flow/:id/hand-off`; it is declared as an outward primary; while the request runs and until the run's own entry shows, the strip is a launching skeleton (`FlowContext.launching`, then the hand-off receipt; the entry `yieldsTo` its delivery), so there is no gap. After 45 s (`HAND_OFF_SHOW_TIMEOUT_MS`) without the run the skeleton stops: "Still handing off to Rail N…" with **Refresh**, which only re-reads (the run cards and the Flow, `FlowContext.refreshFlow`): the entry stays until the delivery shows or the Flow state moves on. Refusals render inline in the panel; "Not yet" returns to the Flow, and so does Esc (`onPanelClose('escape')` of `MissionLiveRun`). A click in the conversation, the toggle or another run only folds the panel (`collapse`): the strip keeps "Ready to turn into a PR" with **Launch** as its primary (`wantsPrimary`, outward: it opens the card focused on Launch). The choices under **Change how** (rail, engine, model, effort) are kept per Flow id in `FlowContext.handOffDrafts` (`RailLaunchHandOff.draft` / `onDraftChange`) and restored when the hand-off reopens; a successful launch clears them. The offer's "Flow handed off to Rail N" record has **View run**, which opens the run in the strip through the shared focus bus. |
616
+ | Flow → Spec run | The run strip names its steps in the person's words ("Writing the spec from your changes", "Verifying your changes", "Reviewing the change", …) and a failure by its step (`flow.failure.step.*`); Back to Flow is the primary of a failed run. The building card drops the generic PR hint. Once settled, the history keeps one outcome line ("Delivered: PR #812", "… went back to Flow") that expands the card; "Back to Flow" with what the reviewer asked for is one expandable line too. |
617
+ | Closing summary | Once a delivered Flow's spec rewrite and Jira create settled (done, skipped or failed for good — the Jira review transition may still wait for the issue link), `runSettlement` posts ONE `flow-delivered` system row (`FlowConversation.postDeliveredSummary`, dedupe `flow-delivered:<flowId>`): the PR link, the spec-rewrite outcome, the archived OpenSpec change and the Jira key when linked. Missions renders it as `AgentFlowDeliveredCard`. |
618
+ | Board | `metadata.flow.state` `active`/`paused` ⇒ "In Flow" label linking to the conversation; the spec cannot be dragged to a rail; inside a rail (handed off) or `delivered` ⇒ no label. |
619
+ | Analytics | `flow` surface label; agent missions show the Flow share (`flowCostUsd`, `flowTurns`). |
620
+
621
+ `flow.state` events are applied only for projects a mounted view watches; a
622
+ reconnect refetches the watched Flows.
623
+
624
+ **Copy layer.** Flow surfaces never show raw English server text outside a
625
+ collapsed **Technical details**: failures map by step and code
626
+ (`flow-failure.ts`: `flowFailureStep`, `flowErrorMessage`), Flow API refusals
627
+ read by `flow.errors.<code>` (the server detail is at most a secondary line,
628
+ e.g. a toast description), and the mission chat maps Core's known turn
629
+ failures — "No provider activity before the inactivity limit" and "A tool
630
+ call produced no provider activity before the tool inactivity limit" — to
631
+ `agent:turnErrors.*` (`describeAgentError`). The hand-off button reads "Hand
632
+ off" (es "Pasar a un rail", de "Übergeben", fr "Remettre", it "Affida", ja "引き渡す",
633
+ pt "Passar a um rail", zh "交给 Rail"); the hand-off region is named "Turn this Flow into a
634
+ reviewed PR" and the strip headline before launch reads "Ready to turn into a
635
+ PR". Glossary for user copy: never "worktree" in headlines or primary copy
636
+ (say "Flow branch" / es "rama de Flow", or "the Flow's copy" of the project);
637
+ "rail" only as the board's noun ("Rail 2"), never as a verb; "spec change"
638
+ instead of "OpenSpec change"; the loop reads "Flow hand-off" in user copy
639
+ (`common:loopChip.flowSpec`, `flow.handOff.loop`), while "Flow → Spec" and the
640
+ exact OpenSpec names stay in **Technical details** and internal docs. Every
641
+ locale uses ONE verb family for the hand-off across button, progress, state
642
+ and failure, kept apart from the PR-delivered state: es "Pasar a un rail" /
643
+ "Pasando a un rail…" / "Pasado a un rail" / "El paso a un rail se detuvo"
644
+ (delivered "Entregado"); fr "Remettre"/"remis" (delivered "Livré"); it
645
+ "Affida"/"affidamento" (delivered "Consegnato"); pt "Passar a um rail"/
646
+ "passagem" (delivered "entregue"/"Concluído"); zh "交给 Rail"/"移交" (delivered
647
+ "已交付"/"已完成"); de "Übergeben"/"Übergabe" (delivered "Ausgeliefert"); ja
648
+ "引き渡す" (delivered "完了"). Copy never names the "Flow bar" (it no longer
649
+ exists): say the Flow strip, or the Hand off action.
650
+ New strings avoid em-dash constructions ("Paused. Waiting for you").
651
+
652
+ ## Known limitations
653
+
654
+ - A conversation re-pinned to another project while a Flow is open stops
655
+ resolving the Flow (turns become normal mission turns).
656
+ - Flow's containment is the cwd, the persona and the worktree's own branch,
657
+ as for rails; it is not an operating-system sandbox.
658
+ - The Preview control follows the mission whose processes the app tracks:
659
+ in a split view it shows the Flow apps of the active conversation.
660
+ - Without PR delivery, the derived change is read from the run's branch,
661
+ which the legacy merge-back may already have removed; the rewrite then
662
+ fails and the spec keeps its draft.
663
+ - End-to-end coverage uses unit and integration tests with fakes; the paired
664
+ Core harness does not exercise `derive-change` until Core ships it.
665
+ - The diff dialog lists files and line counts; the server does not return
666
+ patch bodies yet.
667
+ - "Hand off" is session-local: after a reload an open Flow shows its strip
668
+ row again (nothing was sent to the server).