@joshuafolkken/kit 1.3000.0 → 1.3041.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (684) hide show
  1. package/.claude/skills/workflow-commands/backlogrun-steps.md +1 -1
  2. package/.claude/skills/workflow-commands/kickoff.md +6 -0
  3. package/dist/.inputs-verified.json +1 -1
  4. package/dist/commands/adopt.js +12 -12
  5. package/dist/commands/auto-ok-judge-cli.js +18 -14
  6. package/dist/commands/auto-ok-main.js +42 -40
  7. package/dist/commands/backlog-budget-main.js +3 -3
  8. package/dist/commands/backlog-drive-cli.js +276 -188
  9. package/dist/commands/backlog-next-main.js +77 -75
  10. package/dist/commands/backlog-offer-main.js +80 -78
  11. package/dist/commands/backlog-plan-cli.js +96 -97
  12. package/dist/commands/backlog-triage-cli.js +94 -92
  13. package/dist/commands/backlogrun-cli.js +212 -206
  14. package/dist/commands/behavior-cli.js +12 -13
  15. package/dist/commands/bump-version-main.js +2 -2
  16. package/dist/commands/bytes-command.js +61 -22
  17. package/dist/commands/check-related.js +61 -60
  18. package/dist/commands/{chunk-X7PN54LZ.js → chunk-22DVQCP6.js} +16 -6
  19. package/dist/commands/{chunk-7GHOFHUS.js → chunk-24ZDAWML.js} +3 -3
  20. package/dist/commands/{chunk-HBNB3TLG.js → chunk-2BB5ZR2F.js} +13 -7
  21. package/dist/commands/{chunk-F22G3VDB.js → chunk-2BC33QPY.js} +1 -1
  22. package/dist/commands/{chunk-72EW7AVI.js → chunk-2BJJUTZA.js} +2 -2
  23. package/dist/commands/{chunk-XDQOWUVT.js → chunk-2CXT6MBR.js} +4 -4
  24. package/dist/commands/{chunk-TVJE67O2.js → chunk-2EZTYLO4.js} +6 -6
  25. package/dist/commands/{chunk-JLYW7CP6.js → chunk-2PHOLX62.js} +1 -1
  26. package/dist/commands/{chunk-6EU5ZCDP.js → chunk-2QM72JCJ.js} +23 -87
  27. package/dist/commands/{chunk-EFHSCUFN.js → chunk-2VFPUPSG.js} +2 -2
  28. package/dist/commands/{chunk-ATRMETHT.js → chunk-2XAH3MHV.js} +1 -1
  29. package/dist/commands/{chunk-T2E724HN.js → chunk-34JJYCIY.js} +2 -2
  30. package/dist/commands/{chunk-REMKUFAC.js → chunk-34KZDKQJ.js} +1 -1
  31. package/dist/commands/{chunk-GK2KY4MO.js → chunk-352KLSFX.js} +3 -3
  32. package/dist/commands/{chunk-7S6VRZOH.js → chunk-3AEDZZNL.js} +5 -5
  33. package/dist/commands/{chunk-KVJDDECB.js → chunk-3B2HEFNO.js} +2 -2
  34. package/dist/commands/{chunk-HZBTXKT2.js → chunk-3Z425MM3.js} +2 -2
  35. package/dist/commands/{chunk-J3G2R64I.js → chunk-3ZOX4G4U.js} +3 -3
  36. package/dist/commands/{chunk-LRS2OS5J.js → chunk-452HWOJ7.js} +2 -2
  37. package/dist/commands/{chunk-HRT4KWP4.js → chunk-475EFIJV.js} +1 -1
  38. package/dist/commands/{chunk-4HBVHYNL.js → chunk-47UZB54M.js} +3 -3
  39. package/dist/commands/{chunk-H4LYG37R.js → chunk-4DN4XVPL.js} +6 -6
  40. package/dist/commands/{chunk-TMLNI3YW.js → chunk-4HERA2GY.js} +1 -1
  41. package/dist/commands/{chunk-W6V4DWC5.js → chunk-4JI35CVO.js} +1 -1
  42. package/dist/commands/{chunk-YT342DRV.js → chunk-4L4LNWZ7.js} +2 -2
  43. package/dist/commands/{chunk-ZZAH3YQP.js → chunk-4N32QKJZ.js} +6 -6
  44. package/dist/commands/{chunk-GDUK5YPO.js → chunk-4NRSFLG7.js} +12 -12
  45. package/dist/commands/{chunk-O5QZ2S6X.js → chunk-4OKRPAUT.js} +4 -4
  46. package/dist/commands/{chunk-QDFDB4CF.js → chunk-4Q64PG46.js} +13 -13
  47. package/dist/commands/{chunk-HO52D6JY.js → chunk-4UDTQVDD.js} +14 -14
  48. package/dist/commands/{chunk-HPVLI26Z.js → chunk-4WR2LEZL.js} +6 -6
  49. package/dist/commands/{chunk-DP7WIGQ4.js → chunk-4ZJOC6OK.js} +4 -4
  50. package/dist/commands/{chunk-WTRDWEUQ.js → chunk-4ZQM4I7R.js} +12 -12
  51. package/dist/commands/{chunk-OTZJXU2R.js → chunk-54X37JEJ.js} +8 -8
  52. package/dist/commands/{chunk-A5V7EWIX.js → chunk-56KW5EOK.js} +2 -2
  53. package/dist/commands/chunk-5CG3XU3O.js +74 -0
  54. package/dist/commands/{chunk-FC33R5UN.js → chunk-5ESZLHDZ.js} +13 -15
  55. package/dist/commands/{chunk-OVA7STGP.js → chunk-5FBRMARM.js} +9 -9
  56. package/dist/commands/{chunk-SK2LJBFS.js → chunk-5PCK53WP.js} +3 -3
  57. package/dist/commands/{chunk-6NV2F7QH.js → chunk-5RG4S66L.js} +1 -1
  58. package/dist/commands/{chunk-JOARHU3M.js → chunk-5UJGACVN.js} +1 -1
  59. package/dist/commands/{chunk-NKOET4FB.js → chunk-5Y7B7FDL.js} +2 -2
  60. package/dist/commands/{chunk-XMBRXCIE.js → chunk-5Z6E5ZUV.js} +4 -4
  61. package/dist/commands/{chunk-RZ4OKKPM.js → chunk-5ZNUH4LV.js} +2 -2
  62. package/dist/commands/{chunk-7CHCZBNF.js → chunk-6CFHLMKM.js} +4 -4
  63. package/dist/commands/{chunk-TXXYC7EV.js → chunk-6DDK5XWK.js} +1 -1
  64. package/dist/commands/{chunk-2TQXCH2K.js → chunk-6GQX752S.js} +3 -3
  65. package/dist/commands/{chunk-RY6ZDHKB.js → chunk-6MAZ55GF.js} +107 -84
  66. package/dist/commands/{chunk-SNFLV7VV.js → chunk-6RUWU2SB.js} +2 -2
  67. package/dist/commands/{chunk-D4SZK7H2.js → chunk-6TIVDEKG.js} +2 -2
  68. package/dist/commands/{chunk-RIQ75QWR.js → chunk-6UCWAFQY.js} +55 -43
  69. package/dist/commands/{chunk-4D5KWMFL.js → chunk-6YURRFRU.js} +19 -19
  70. package/dist/commands/{chunk-7MOZEEFJ.js → chunk-6YVURZAJ.js} +1 -1
  71. package/dist/commands/{chunk-73JOEKIC.js → chunk-6Z4YZG7P.js} +5 -5
  72. package/dist/commands/{chunk-NJ53AWJU.js → chunk-77BIN247.js} +9 -9
  73. package/dist/commands/{chunk-MZHOPRI6.js → chunk-7ABHNNY3.js} +7 -7
  74. package/dist/commands/{chunk-6WTVAL4D.js → chunk-7C7FOKJK.js} +1 -1
  75. package/dist/commands/{chunk-KVSSLDA3.js → chunk-7HAGC6SW.js} +5 -5
  76. package/dist/commands/{chunk-IG22Y5MA.js → chunk-7KKUFLH5.js} +1 -1
  77. package/dist/commands/{chunk-ZQ3CKRMP.js → chunk-7MJYLUF4.js} +2 -2
  78. package/dist/commands/{chunk-6UGFS3EU.js → chunk-7NHZCI5Y.js} +11 -11
  79. package/dist/commands/{chunk-FB3D7CX5.js → chunk-7OQ56DVW.js} +5 -7
  80. package/dist/commands/{chunk-EK327QOS.js → chunk-7VWPGTZO.js} +10 -10
  81. package/dist/commands/{chunk-WSOF74K4.js → chunk-7YZXS3AK.js} +3 -3
  82. package/dist/commands/{chunk-N6TYL3B2.js → chunk-AAUDI7WJ.js} +2 -2
  83. package/dist/commands/{chunk-3GF52L5F.js → chunk-AC26ZUG5.js} +12 -24
  84. package/dist/commands/{chunk-EK2Y6B4X.js → chunk-ACZ52JPI.js} +7 -7
  85. package/dist/commands/{chunk-VD72V5VX.js → chunk-AJ65WNJB.js} +4 -4
  86. package/dist/commands/{chunk-MYWRGF5A.js → chunk-AK7SEO4Y.js} +2 -2
  87. package/dist/commands/{chunk-IBEKFLWG.js → chunk-ALDAS2WG.js} +9 -9
  88. package/dist/commands/{chunk-W32DIQEP.js → chunk-ARFBIJFS.js} +1 -1
  89. package/dist/commands/{chunk-F3WBEEYC.js → chunk-AVVMDVGO.js} +5 -5
  90. package/dist/commands/chunk-AXXEMVRJ.js +23 -0
  91. package/dist/commands/{chunk-GIGKMIPQ.js → chunk-B3M5WSGN.js} +1 -1
  92. package/dist/commands/{chunk-4Z5723GA.js → chunk-B7ZNIEDV.js} +5 -4
  93. package/dist/commands/{chunk-B3XFOHDX.js → chunk-BCUDQWYK.js} +10 -4
  94. package/dist/commands/{chunk-PR3JCPP7.js → chunk-BMKWSWWE.js} +1 -1
  95. package/dist/commands/{chunk-RZJAUVMI.js → chunk-BMM4RHCG.js} +2 -2
  96. package/dist/commands/{chunk-LAKVPOJQ.js → chunk-BMTYUJNT.js} +2 -2
  97. package/dist/commands/{chunk-DAJCUSPG.js → chunk-BRHPRDDV.js} +3 -3
  98. package/dist/commands/{chunk-UZAU6UI6.js → chunk-BRUBX64M.js} +2 -2
  99. package/dist/commands/{chunk-BFLFPKQQ.js → chunk-BTZJDHQT.js} +4 -4
  100. package/dist/commands/{chunk-AI5K4QJO.js → chunk-BYFC6MD2.js} +1 -1
  101. package/dist/commands/{chunk-JGTLNFFE.js → chunk-BYGJ3BCJ.js} +10 -10
  102. package/dist/commands/{chunk-5HWZFL4D.js → chunk-C54QXJD6.js} +51 -18
  103. package/dist/commands/{chunk-LMS6N6GE.js → chunk-CBAKBWSZ.js} +7 -7
  104. package/dist/commands/{chunk-7EAMUVIO.js → chunk-CFHRNTE5.js} +1 -1
  105. package/dist/commands/{chunk-UIWAMLQH.js → chunk-CGYDIYHD.js} +2 -2
  106. package/dist/commands/{chunk-4QYW2IL7.js → chunk-CHKYPF5O.js} +1 -1
  107. package/dist/commands/{chunk-5HCPSV45.js → chunk-CJBW6BWG.js} +8 -8
  108. package/dist/commands/chunk-CKUKK7JG.js +252 -0
  109. package/dist/commands/{chunk-4PES3BAA.js → chunk-CMHGDCGN.js} +3 -3
  110. package/dist/commands/{chunk-F6OWP2AY.js → chunk-CNGTHSUS.js} +22 -22
  111. package/dist/commands/{chunk-B2EA2HCY.js → chunk-COGKULQH.js} +4 -4
  112. package/dist/commands/{chunk-S7XWXG4M.js → chunk-CP2J4RV2.js} +175 -81
  113. package/dist/commands/{chunk-YGDNUTTI.js → chunk-CQUZ6TNQ.js} +2 -2
  114. package/dist/commands/chunk-CQZI7RIK.js +72 -0
  115. package/dist/commands/chunk-CVJHQOI3.js +153 -0
  116. package/dist/commands/{chunk-2MJ4OCDL.js → chunk-CWCKCZS6.js} +1 -1
  117. package/dist/commands/chunk-D5OHVIPM.js +17 -0
  118. package/dist/commands/{chunk-TPKFVVJQ.js → chunk-D6D6WQR6.js} +2 -2
  119. package/dist/commands/{chunk-5PAEXYIY.js → chunk-D7JRJI44.js} +69 -6
  120. package/dist/commands/{chunk-LOSOLCCW.js → chunk-D7OAU32Z.js} +1 -1
  121. package/dist/commands/{chunk-VZHC2I3T.js → chunk-DAAX7XDS.js} +8 -8
  122. package/dist/commands/{chunk-OHVAEJSM.js → chunk-DEZF7QZZ.js} +5 -5
  123. package/dist/commands/{chunk-CA6F5OXK.js → chunk-DYZOOWVW.js} +124 -21
  124. package/dist/commands/{chunk-TKGBF75Y.js → chunk-EDKOSZ3K.js} +5 -5
  125. package/dist/commands/{chunk-YPNTORQD.js → chunk-EFDVE5P5.js} +1 -1
  126. package/dist/commands/{chunk-EH3LVYOX.js → chunk-EGIHAEMT.js} +1 -1
  127. package/dist/commands/{chunk-7P4X4TQL.js → chunk-EKLU6QR7.js} +4 -4
  128. package/dist/commands/{chunk-ILQZFUDC.js → chunk-ELY76WAR.js} +2 -2
  129. package/dist/commands/{chunk-2VLHFILE.js → chunk-EM3HAZF6.js} +2 -2
  130. package/dist/commands/{chunk-F2HFWLQR.js → chunk-EMTZAGT5.js} +20 -1
  131. package/dist/commands/{chunk-GA4VIFHD.js → chunk-ERG4QRNG.js} +2 -2
  132. package/dist/commands/{chunk-ICEMFE2V.js → chunk-EUGNQCYK.js} +1 -1
  133. package/dist/commands/{chunk-3HU3LPIF.js → chunk-EXDFKKMH.js} +2 -2
  134. package/dist/commands/{chunk-ISPBJVXM.js → chunk-EXWB34R2.js} +7 -7
  135. package/dist/commands/{chunk-FNOSSXLG.js → chunk-EYMPBHDN.js} +2 -2
  136. package/dist/commands/{chunk-7V5UVKFG.js → chunk-EZ7IPKIH.js} +2 -2
  137. package/dist/commands/{chunk-KQWSENCT.js → chunk-F6IQHZYY.js} +3 -3
  138. package/dist/commands/{chunk-7ZECP3J6.js → chunk-FDS65XOJ.js} +5 -5
  139. package/dist/commands/{chunk-KXRFGPZD.js → chunk-FGG7V473.js} +21 -5
  140. package/dist/commands/{chunk-PZ6VWHOO.js → chunk-FHFWNNUC.js} +1 -1
  141. package/dist/commands/{chunk-XBRD2BDL.js → chunk-FJX7AENO.js} +2 -2
  142. package/dist/commands/{chunk-M42SLJCD.js → chunk-FKZ5E4JD.js} +4 -4
  143. package/dist/commands/{chunk-F2J6DGDM.js → chunk-FMZWRDKH.js} +8 -8
  144. package/dist/commands/{chunk-DSBK66US.js → chunk-FOKCRIAN.js} +10 -10
  145. package/dist/commands/{chunk-OI7KM4K3.js → chunk-FQGWO2ZH.js} +2 -2
  146. package/dist/commands/{chunk-2IESYBZH.js → chunk-FURNDIT3.js} +3 -3
  147. package/dist/commands/chunk-FVDQNMP6.js +93 -0
  148. package/dist/commands/{chunk-PZU6FZO6.js → chunk-FWU3H4TX.js} +1 -1
  149. package/dist/commands/{chunk-RYZ3RQRH.js → chunk-G3HBYHFA.js} +1 -1
  150. package/dist/commands/{chunk-HCA5QG2U.js → chunk-G4E4M2P4.js} +2 -2
  151. package/dist/commands/{chunk-VJLZ3IQQ.js → chunk-G5KSL2Q2.js} +1 -1
  152. package/dist/commands/{chunk-Y5ZW3KN5.js → chunk-G6XC7V6Y.js} +2 -2
  153. package/dist/commands/{chunk-73EBNBUW.js → chunk-GCPP5XIG.js} +1 -1
  154. package/dist/commands/{chunk-Q3463XNL.js → chunk-GITT5A5A.js} +3 -3
  155. package/dist/commands/{chunk-T2IO4LEB.js → chunk-GLC47H7I.js} +10 -10
  156. package/dist/commands/{chunk-GA6E4VGO.js → chunk-GUR54ELE.js} +1 -1
  157. package/dist/commands/{chunk-7IT23HIR.js → chunk-GY4DMCKS.js} +2 -2
  158. package/dist/commands/{chunk-PZ4ITSLG.js → chunk-H6JQRHDC.js} +3 -3
  159. package/dist/commands/{chunk-ZHZSZNE2.js → chunk-HATKF6VX.js} +2 -2
  160. package/dist/commands/{chunk-ELWNRE6E.js → chunk-HH3CVIFU.js} +5 -5
  161. package/dist/commands/{chunk-7GMTJDO2.js → chunk-HHMMGDMP.js} +6 -6
  162. package/dist/commands/{chunk-VD5674LW.js → chunk-HI5WPM6C.js} +2 -2
  163. package/dist/commands/{chunk-JUUBDYFZ.js → chunk-HQSWPRUF.js} +4 -4
  164. package/dist/commands/{chunk-ZAJD6T6E.js → chunk-HVCQYZVD.js} +2 -2
  165. package/dist/commands/chunk-HWEZRNPL.js +66 -0
  166. package/dist/commands/{chunk-J6GIVMXI.js → chunk-HX3FFIO5.js} +18 -3
  167. package/dist/commands/{chunk-GU5ML3Y3.js → chunk-HXDTA5VU.js} +13 -68
  168. package/dist/commands/{chunk-BNXE3NVB.js → chunk-I2KCGKJI.js} +1 -1
  169. package/dist/commands/{chunk-LC7SBONO.js → chunk-IAD4WLLI.js} +1 -1
  170. package/dist/commands/{chunk-WWC5L3AO.js → chunk-IB5TT73I.js} +2 -2
  171. package/dist/commands/{chunk-HOSZITJM.js → chunk-IBAYXCMU.js} +2 -2
  172. package/dist/commands/{chunk-UTBVTCQN.js → chunk-IF3EIFK4.js} +267 -153
  173. package/dist/commands/chunk-IGDJNXX2.js +49 -0
  174. package/dist/commands/{chunk-OJ4LGBVD.js → chunk-ILIITIMQ.js} +3 -3
  175. package/dist/commands/{chunk-CUR2WNYB.js → chunk-IRGDMSTI.js} +3 -3
  176. package/dist/commands/{chunk-PZTWQYRI.js → chunk-IYJEBWW5.js} +3 -3
  177. package/dist/commands/{chunk-A3D2XHOJ.js → chunk-J22PSIXR.js} +40 -9
  178. package/dist/commands/{chunk-O27H6NN6.js → chunk-J66YBAAM.js} +3 -5
  179. package/dist/commands/{chunk-P6RGQXHI.js → chunk-J6WKZRV2.js} +2 -2
  180. package/dist/commands/{chunk-NFEBQED3.js → chunk-J7IO3AYH.js} +2 -2
  181. package/dist/commands/{chunk-T57W3UWK.js → chunk-JAKC2BHX.js} +1 -1
  182. package/dist/commands/{chunk-3EO2XN3A.js → chunk-JCAQ7B6J.js} +4 -4
  183. package/dist/commands/{chunk-QQZOQ7AM.js → chunk-JFLFGLE4.js} +1 -1
  184. package/dist/commands/{chunk-ZDSDPKCD.js → chunk-JIGBNCDR.js} +1 -1
  185. package/dist/commands/{chunk-Q5N2J2UF.js → chunk-JJHWTFWQ.js} +5 -7
  186. package/dist/commands/{chunk-EI6JG5DF.js → chunk-JKOGWGQM.js} +1 -1
  187. package/dist/commands/{chunk-RK4HE5NW.js → chunk-JM6EVOFN.js} +4 -4
  188. package/dist/commands/{chunk-EBNIX2TC.js → chunk-JV24VP2O.js} +1 -1
  189. package/dist/commands/{chunk-BCK5LW4F.js → chunk-JVKXJ763.js} +3 -3
  190. package/dist/commands/{chunk-D5TAR6TV.js → chunk-JZHY7D6D.js} +1 -1
  191. package/dist/commands/{chunk-CRNPPKP2.js → chunk-JZK33TA5.js} +1 -1
  192. package/dist/commands/{chunk-UOAG2XQT.js → chunk-K275REYP.js} +3 -3
  193. package/dist/commands/{chunk-HESMKHEB.js → chunk-K4G3HOKS.js} +2 -2
  194. package/dist/commands/{chunk-L6XN3EXI.js → chunk-K64EIHD2.js} +1 -1
  195. package/dist/commands/{chunk-RINVPTA2.js → chunk-KCFOP5RI.js} +28 -28
  196. package/dist/commands/{chunk-O26Y2FOJ.js → chunk-KGE4AS2Y.js} +1 -1
  197. package/dist/commands/{chunk-EWA72KO7.js → chunk-KK2SL42W.js} +2 -2
  198. package/dist/commands/{chunk-MMXZKLDU.js → chunk-KK7TEL5G.js} +10 -4
  199. package/dist/commands/{chunk-UEURNXE5.js → chunk-KKIMVXAP.js} +2 -2
  200. package/dist/commands/{chunk-MAGJFH5T.js → chunk-KODXWMBX.js} +6 -6
  201. package/dist/commands/{chunk-D4HNS43Q.js → chunk-KPSKWTOS.js} +17 -17
  202. package/dist/commands/{chunk-VFJYOAOQ.js → chunk-KTV2HNWB.js} +2 -2
  203. package/dist/commands/{chunk-OWR2TCOY.js → chunk-KWYQR5MK.js} +5 -5
  204. package/dist/commands/{chunk-FNQW6NY7.js → chunk-KXK2A2HB.js} +6 -2
  205. package/dist/commands/{chunk-O5FVBIRI.js → chunk-KZ5BBBMO.js} +5 -5
  206. package/dist/commands/{chunk-JUJFIATR.js → chunk-KZ7HD37E.js} +6 -6
  207. package/dist/commands/{chunk-2YCKPX3A.js → chunk-KZZWPUJW.js} +1 -1
  208. package/dist/commands/{chunk-MYNM3YMR.js → chunk-L7DAL54N.js} +3 -3
  209. package/dist/commands/{chunk-NOXLKIPR.js → chunk-LAR76BFA.js} +1 -1
  210. package/dist/commands/{chunk-ZA3W73PF.js → chunk-LB557AHJ.js} +3 -3
  211. package/dist/commands/{chunk-LYEKT3IN.js → chunk-LEB2VP7F.js} +1 -1
  212. package/dist/commands/{chunk-WQJ7O3C3.js → chunk-LJXKVLYI.js} +1 -1
  213. package/dist/commands/{chunk-CHX4QTP4.js → chunk-LJZERYLG.js} +1 -1
  214. package/dist/commands/{chunk-PF22VUWB.js → chunk-LOOFYHUM.js} +76 -26
  215. package/dist/commands/{chunk-HIPO6HUG.js → chunk-LPSULLNK.js} +1 -1
  216. package/dist/commands/{chunk-G47ZNQVG.js → chunk-LR22UK5W.js} +1 -1
  217. package/dist/commands/{chunk-SV4FHQE7.js → chunk-LT7QSHR4.js} +14 -14
  218. package/dist/commands/{chunk-HIB5G2X6.js → chunk-LUXWDMKI.js} +7 -7
  219. package/dist/commands/{chunk-XH6BGVVP.js → chunk-LX7TIEMI.js} +9 -36
  220. package/dist/commands/{chunk-OGNTJ5JB.js → chunk-LYO6TX5L.js} +1 -1
  221. package/dist/commands/{chunk-JLREFWJ4.js → chunk-LZ5QXE5N.js} +6 -6
  222. package/dist/commands/{chunk-5WIZR5SC.js → chunk-M4UV3BEV.js} +11 -11
  223. package/dist/commands/{chunk-LNBUIOK6.js → chunk-M6JDU5EK.js} +4 -4
  224. package/dist/commands/{chunk-VZSJCFRT.js → chunk-MFBNNTBM.js} +4 -4
  225. package/dist/commands/{chunk-KHWTJ4F7.js → chunk-MI2OS6TL.js} +3 -3
  226. package/dist/commands/{chunk-VZCQZFPH.js → chunk-MLW4S35K.js} +19 -8
  227. package/dist/commands/{chunk-RIUPRMLW.js → chunk-MN425CU6.js} +1 -1
  228. package/dist/commands/{chunk-7W3D3WRW.js → chunk-MOIOSCZM.js} +2 -2
  229. package/dist/commands/{chunk-3BNNMJOT.js → chunk-MRORPFSO.js} +20 -320
  230. package/dist/commands/{chunk-LA5WTOAM.js → chunk-MUGTOJUL.js} +12 -12
  231. package/dist/commands/{chunk-L6LU2633.js → chunk-MVHPRYHE.js} +1 -1
  232. package/dist/commands/{chunk-EKCKCX5S.js → chunk-MWO6FOSZ.js} +123 -21
  233. package/dist/commands/{chunk-AVUGMOHZ.js → chunk-N7QTMTST.js} +2 -2
  234. package/dist/commands/{chunk-LMSS4ARB.js → chunk-NDBX7LSS.js} +1 -1
  235. package/dist/commands/{chunk-BEE7OAQ5.js → chunk-NDWZTWXV.js} +21 -2
  236. package/dist/commands/{chunk-6TESOL3L.js → chunk-NEGJ77RV.js} +7 -7
  237. package/dist/commands/{chunk-LCEJXF7A.js → chunk-NEGRE5VW.js} +4 -4
  238. package/dist/commands/{chunk-IXX4SXIP.js → chunk-NFPD2P3V.js} +1 -1
  239. package/dist/commands/chunk-NHIW7JE6.js +335 -0
  240. package/dist/commands/{chunk-CJSFC5YI.js → chunk-NILSN7A4.js} +7 -7
  241. package/dist/commands/{chunk-W4J6YTFE.js → chunk-NOLFSPOB.js} +2 -2
  242. package/dist/commands/chunk-NT67QTZO.js +65 -0
  243. package/dist/commands/{chunk-NJT5L6IC.js → chunk-NU7W6QGT.js} +33 -4
  244. package/dist/commands/chunk-NUR4FQHM.js +21 -0
  245. package/dist/commands/{chunk-OKKQI4ZG.js → chunk-OAAVY2JK.js} +1 -1
  246. package/dist/commands/chunk-OF4BY4N7.js +32 -0
  247. package/dist/commands/{chunk-W47I2KDY.js → chunk-OGS2DK7I.js} +3 -3
  248. package/dist/commands/{chunk-MS6Q3Z7V.js → chunk-OIPV3PWW.js} +6 -6
  249. package/dist/commands/{chunk-T33QDAWD.js → chunk-OIX2363L.js} +1 -1
  250. package/dist/commands/{chunk-GPMSYXYO.js → chunk-OJ65BZBV.js} +283 -15
  251. package/dist/commands/{chunk-34LAULSC.js → chunk-OKZWEVR4.js} +3 -3
  252. package/dist/commands/{chunk-2CXAVVST.js → chunk-OL6IF4JC.js} +1 -1
  253. package/dist/commands/{chunk-6JVNRY5A.js → chunk-OMPRILFH.js} +1 -1
  254. package/dist/commands/{chunk-VGHSZLYQ.js → chunk-OOWGH2RG.js} +1 -1
  255. package/dist/commands/{chunk-ERGZPWKP.js → chunk-OP2RFVLS.js} +1 -1
  256. package/dist/commands/{chunk-UU6GCJGM.js → chunk-ORKVN2LO.js} +2 -2
  257. package/dist/commands/{chunk-RHII5XI6.js → chunk-OSBWXZJ4.js} +24 -24
  258. package/dist/commands/{chunk-D3SHCUBC.js → chunk-OVWPZDWP.js} +2 -2
  259. package/dist/commands/{chunk-Z4HYBFZD.js → chunk-OWYK2BEJ.js} +108 -46
  260. package/dist/commands/{chunk-P4O67FP5.js → chunk-OX3VQLV2.js} +6 -6
  261. package/dist/commands/{chunk-L6TU7FC2.js → chunk-OZJP77UM.js} +4 -4
  262. package/dist/commands/{chunk-SNO7CY2B.js → chunk-P3H3DKTE.js} +2 -2
  263. package/dist/commands/{chunk-2OIX4JLA.js → chunk-P5SOYWH2.js} +3 -3
  264. package/dist/commands/{chunk-M4PEC7YW.js → chunk-PHLOTUB7.js} +54 -37
  265. package/dist/commands/{chunk-73KBUQKI.js → chunk-PTNQCCIB.js} +2 -2
  266. package/dist/commands/{chunk-4P2LCVGO.js → chunk-PTZEFQUX.js} +8 -8
  267. package/dist/commands/{chunk-DJVMC3U2.js → chunk-Q426ZSZ4.js} +1 -1
  268. package/dist/commands/{chunk-US6X7JXC.js → chunk-Q7EEIOAD.js} +4 -4
  269. package/dist/commands/{chunk-LE7TFPMU.js → chunk-QABRNGQV.js} +2 -2
  270. package/dist/commands/{chunk-NGKB632X.js → chunk-QDFVVRQP.js} +3 -3
  271. package/dist/commands/{chunk-36M2UV6C.js → chunk-QGATHT4S.js} +38 -4
  272. package/dist/commands/{chunk-DIB2Z2OS.js → chunk-QJRVDE7T.js} +1 -1
  273. package/dist/commands/{chunk-KUJQWO6M.js → chunk-QKTTKAXM.js} +2 -2
  274. package/dist/commands/{chunk-DXZW4V7J.js → chunk-QMDKDQKW.js} +3 -3
  275. package/dist/commands/{chunk-VW5SGE7A.js → chunk-QOSC5RKD.js} +1 -1
  276. package/dist/commands/{chunk-ENLWXAHD.js → chunk-QV5FKMOU.js} +1 -1
  277. package/dist/commands/{chunk-32SNWQJP.js → chunk-R2THGPI3.js} +2 -2
  278. package/dist/commands/{chunk-RVHBWSIG.js → chunk-R54Z2Z3X.js} +2 -2
  279. package/dist/commands/{chunk-CJAA5GAF.js → chunk-RG53UFNW.js} +15 -15
  280. package/dist/commands/{chunk-HJKZDDDI.js → chunk-RHKCWJQX.js} +1 -1
  281. package/dist/commands/{chunk-RPDWFUQO.js → chunk-RKIAX4DZ.js} +36 -84
  282. package/dist/commands/{chunk-LE2T3FGJ.js → chunk-RLBFEHHC.js} +2 -4
  283. package/dist/commands/{chunk-5GBZ43UA.js → chunk-RMDLFLPE.js} +1 -1
  284. package/dist/commands/{chunk-U2UH4VM4.js → chunk-RN2YDNLF.js} +2 -2
  285. package/dist/commands/{chunk-GQHUFNXN.js → chunk-RRAIRS2T.js} +1 -1
  286. package/dist/commands/{chunk-DRCTDVI2.js → chunk-RUQY5TS3.js} +3 -3
  287. package/dist/commands/{chunk-WGULS5DA.js → chunk-RW64VHEB.js} +1 -0
  288. package/dist/commands/{chunk-4G7NKNAZ.js → chunk-RXYMJPJB.js} +3 -3
  289. package/dist/commands/{chunk-B33BTNB4.js → chunk-S4M6UWR2.js} +21 -5
  290. package/dist/commands/{chunk-4Q4FXBUQ.js → chunk-SASX3W2M.js} +2 -2
  291. package/dist/commands/{chunk-TIXJY22D.js → chunk-SJ2ZN575.js} +5 -5
  292. package/dist/commands/{chunk-NSZTSCBW.js → chunk-SP7DKYGU.js} +13 -13
  293. package/dist/commands/{chunk-T3FD3Q73.js → chunk-SRG6PKVS.js} +1 -1
  294. package/dist/commands/{chunk-QA22PBCJ.js → chunk-SSL6A3Y4.js} +3 -3
  295. package/dist/commands/{chunk-4BEIYKI2.js → chunk-SV4FZR24.js} +2 -0
  296. package/dist/commands/{chunk-HZSQI6TD.js → chunk-SVTS7ACS.js} +2 -2
  297. package/dist/commands/{chunk-F7XLEK55.js → chunk-SVV4U5AR.js} +1 -1
  298. package/dist/commands/{chunk-RRQFITJE.js → chunk-SXJM4DZ5.js} +1 -1
  299. package/dist/commands/{chunk-OIDMJASD.js → chunk-SYB3M632.js} +1 -1
  300. package/dist/commands/{chunk-UJOZ2MGX.js → chunk-SYOXIKB7.js} +6 -6
  301. package/dist/commands/{chunk-5SB37YDW.js → chunk-SZG5HDNP.js} +3 -3
  302. package/dist/commands/{chunk-R2CF6VZE.js → chunk-T4F33UKZ.js} +4 -4
  303. package/dist/commands/{chunk-ESQEEL4O.js → chunk-TAEGXID2.js} +2 -2
  304. package/dist/commands/chunk-TEPYEUYG.js +585 -0
  305. package/dist/commands/{chunk-LUMCYDGE.js → chunk-TFLHYC2F.js} +2 -2
  306. package/dist/commands/{chunk-V5OIPYA6.js → chunk-TJKM56WJ.js} +4 -4
  307. package/dist/commands/{chunk-CYQ3ZF7R.js → chunk-TLAB552K.js} +86 -13
  308. package/dist/commands/{chunk-ST32OGPY.js → chunk-TP6L4W3W.js} +5 -5
  309. package/dist/commands/{chunk-C26LKDBE.js → chunk-TR7WWYD5.js} +1 -1
  310. package/dist/commands/{chunk-PWYXY46Y.js → chunk-TYNH2R66.js} +15 -15
  311. package/dist/commands/{chunk-AZUE65NT.js → chunk-U5P6G3UV.js} +2 -2
  312. package/dist/commands/{chunk-REPANBLS.js → chunk-U7Y6RKLK.js} +1 -1
  313. package/dist/commands/{chunk-55I7OYHI.js → chunk-UIMMWH7U.js} +1 -1
  314. package/dist/commands/{chunk-72J2G2E7.js → chunk-UKBBWMLE.js} +20 -20
  315. package/dist/commands/{chunk-VTLL6CKO.js → chunk-UNMSZGSG.js} +14 -14
  316. package/dist/commands/chunk-UOVUUVDK.js +18 -0
  317. package/dist/commands/{chunk-JNWHX25C.js → chunk-URDT2O2K.js} +1 -1
  318. package/dist/commands/{chunk-FGZQSSGH.js → chunk-UREXZJDB.js} +1 -1
  319. package/dist/commands/{chunk-O4WBADCX.js → chunk-UTHUX7VU.js} +3 -3
  320. package/dist/commands/{chunk-PDDKRHHS.js → chunk-V5OUZFWK.js} +3 -3
  321. package/dist/commands/{chunk-N4O5I55P.js → chunk-VCPGFBMN.js} +8 -8
  322. package/dist/commands/{chunk-WN7NK3NY.js → chunk-VGPIQNDB.js} +1 -1
  323. package/dist/commands/{chunk-HOGFJHBT.js → chunk-VJS2MCLA.js} +1 -1
  324. package/dist/commands/{chunk-4YI4SLRJ.js → chunk-VK6D5CWA.js} +8 -8
  325. package/dist/commands/{chunk-4LWRCPS5.js → chunk-VOF3N4WO.js} +3 -3
  326. package/dist/commands/{chunk-AM44D7NF.js → chunk-VQRT32JB.js} +1 -1
  327. package/dist/commands/{chunk-AS3GWVAN.js → chunk-VQVPAVQ3.js} +1 -1
  328. package/dist/commands/{chunk-6VTJO5L2.js → chunk-VV4TQYGD.js} +3 -3
  329. package/dist/commands/{chunk-WIE7VUBE.js → chunk-W7DRUOF7.js} +5 -5
  330. package/dist/commands/{chunk-HH2KDLTP.js → chunk-WAEN2RTT.js} +2 -2
  331. package/dist/commands/{chunk-NKKH3PBE.js → chunk-WB4T3VY2.js} +18 -1
  332. package/dist/commands/{chunk-DNJC7X73.js → chunk-WCEUMOKK.js} +2 -2
  333. package/dist/commands/{chunk-BK6Q4VCA.js → chunk-WTH6NTXU.js} +4 -4
  334. package/dist/commands/{chunk-WG6GYBRJ.js → chunk-WWVYEHQT.js} +2 -1
  335. package/dist/commands/{chunk-P4CWLRT2.js → chunk-X3TNPALI.js} +1 -1
  336. package/dist/commands/{chunk-LZNYHWRO.js → chunk-XC6GG5JR.js} +3 -3
  337. package/dist/commands/{chunk-RI7EQYKL.js → chunk-XFWI6WHH.js} +2 -2
  338. package/dist/commands/{chunk-BY3POLIQ.js → chunk-XHGWMD3L.js} +7 -7
  339. package/dist/commands/{chunk-BPSJSHYD.js → chunk-XI2ABCRX.js} +2 -2
  340. package/dist/commands/{chunk-TS4ZK46L.js → chunk-XKSUBUIH.js} +5 -5
  341. package/dist/commands/{chunk-K7GL3BGI.js → chunk-XPBF5DG3.js} +4 -4
  342. package/dist/commands/{chunk-6SKMZGER.js → chunk-XUMYPESL.js} +20 -8
  343. package/dist/commands/{chunk-QS5USD4T.js → chunk-XXC32PVL.js} +5 -4
  344. package/dist/commands/{chunk-ORSI7Y55.js → chunk-XXN2EZBY.js} +1 -1
  345. package/dist/commands/{chunk-IZVM2TTH.js → chunk-XZQWEVR3.js} +2 -2
  346. package/dist/commands/{chunk-E3CXOVPQ.js → chunk-Y27PTXXI.js} +1 -1
  347. package/dist/commands/{chunk-337QQM4C.js → chunk-Y4EBUI6M.js} +106 -5
  348. package/dist/commands/{chunk-WRX3MINT.js → chunk-YAU3LYNF.js} +1 -1
  349. package/dist/commands/{chunk-JB7R3A4A.js → chunk-YDURQICF.js} +4 -4
  350. package/dist/commands/{chunk-RX5JSPPH.js → chunk-YGFOGA7C.js} +11 -11
  351. package/dist/commands/{chunk-S6SXMBF2.js → chunk-YHJ2AJMA.js} +2 -2
  352. package/dist/commands/{chunk-MVPUQLN5.js → chunk-YM77CF4D.js} +4 -4
  353. package/dist/commands/{chunk-ZYIMQHCB.js → chunk-YNPRJCEO.js} +6 -6
  354. package/dist/commands/{chunk-3UKJFWKS.js → chunk-YTBQAD5W.js} +3 -3
  355. package/dist/commands/{chunk-WW3TX742.js → chunk-Z3WGHIVB.js} +3 -3
  356. package/dist/commands/{chunk-KIVOZY2J.js → chunk-ZBZ5DDCH.js} +66 -64
  357. package/dist/commands/{chunk-TAPDXK34.js → chunk-ZLRUHSOP.js} +1 -1
  358. package/dist/commands/{chunk-XYAK53TK.js → chunk-ZNR75OXP.js} +2 -1
  359. package/dist/commands/{chunk-CADFBQJJ.js → chunk-ZSOR4ISJ.js} +4 -4
  360. package/dist/commands/{chunk-6NRTLH6I.js → chunk-ZYFHYQA7.js} +1 -1
  361. package/dist/commands/{chunk-Q7TV3OV6.js → chunk-ZZFFSQF4.js} +4 -4
  362. package/dist/commands/{chunk-PDAY76AN.js → chunk-ZZULXNC2.js} +1 -1
  363. package/dist/commands/{chunk-5Y7QQYTU.js → chunk-ZZXO6TFH.js} +1 -1
  364. package/dist/commands/code-symbol-cli.js +4 -4
  365. package/dist/commands/codex-hook-adapter.js +99 -100
  366. package/dist/commands/command-derive.js +10 -10
  367. package/dist/commands/cost-audit-main.js +94 -92
  368. package/dist/commands/cspell-cached.js +24 -23
  369. package/dist/commands/defect-origin-main.js +19 -18
  370. package/dist/commands/defect-report-main.js +15 -14
  371. package/dist/commands/disposition-cli.js +67 -64
  372. package/dist/commands/doctor.js +3 -3
  373. package/dist/commands/document-read-cli.js +89 -9
  374. package/dist/commands/document-section-main.js +89 -9
  375. package/dist/commands/edit-files-cli.js +1 -1
  376. package/dist/commands/effect-audit-cli.js +20 -19
  377. package/dist/commands/epic-audit-main.js +55 -53
  378. package/dist/commands/epic-bundle-main.js +87 -85
  379. package/dist/commands/epic-check.js +16 -15
  380. package/dist/commands/epic-main.js +93 -91
  381. package/dist/commands/epic-next-main.js +51 -49
  382. package/dist/commands/format-edited-cli.js +30 -32
  383. package/dist/commands/format.js +11 -10
  384. package/dist/commands/fresh-machine-cli.js +6 -6
  385. package/dist/commands/git-followup-workflow.js +137 -122
  386. package/dist/commands/git-workflow.js +28 -27
  387. package/dist/commands/github-release-cli.js +26 -3
  388. package/dist/commands/hook-ledger-cli.js +74 -126
  389. package/dist/commands/init-main.js +20 -19
  390. package/dist/commands/inputs.json +1907 -1876
  391. package/dist/commands/issue-ack-cli.js +5 -5
  392. package/dist/commands/issue-already-done-cli.js +63 -58
  393. package/dist/commands/issue-body-cli.js +44 -42
  394. package/dist/commands/issue-cite-main.js +11 -10
  395. package/dist/commands/issue-comment-main.js +15 -11
  396. package/dist/commands/issue-consolidate-cli.js +31 -30
  397. package/dist/commands/issue-file-main.js +114 -110
  398. package/dist/commands/issue-fold-existing-cli.js +88 -86
  399. package/dist/commands/issue-fold-main.js +26 -25
  400. package/dist/commands/issue-lint-main.js +38 -37
  401. package/dist/commands/issue-measured-cli.js +66 -61
  402. package/dist/commands/issue-plan-cli.js +103 -101
  403. package/dist/commands/issue-premise-unmet-cli.js +66 -61
  404. package/dist/commands/issue-priority-cli.js +13 -12
  405. package/dist/commands/issue-read-main.js +18 -17
  406. package/dist/commands/issue-release-class-cli.js +12 -11
  407. package/dist/commands/issue-release-main.js +13 -12
  408. package/dist/commands/issue-scout-main.js +89 -87
  409. package/dist/commands/issue-spill-main.js +114 -110
  410. package/dist/commands/issue-state-main.js +16 -15
  411. package/dist/commands/issue-tick-cli.js +14 -13
  412. package/dist/commands/josh-completion.js +10 -10
  413. package/dist/commands/lane-adopt-cli.js +19 -19
  414. package/dist/commands/lane-breakdown-cli.js +154 -126
  415. package/dist/commands/lane-cli.js +131 -125
  416. package/dist/commands/lane-launch-main.js +17 -17
  417. package/dist/commands/lane-limit-cli.js +81 -79
  418. package/dist/commands/lane-measure-cli.js +246 -130
  419. package/dist/commands/lane-pause-cli.js +15 -15
  420. package/dist/commands/lane-plan-cli.js +108 -101
  421. package/dist/commands/lane-resolve-cli.js +20 -19
  422. package/dist/commands/lane-restart-cli.js +124 -118
  423. package/dist/commands/lane-why-cli.js +85 -82
  424. package/dist/commands/lane-withdraw-cli.js +49 -48
  425. package/dist/commands/latest-corepack.js +3 -3
  426. package/dist/commands/latest-if-required-cli.js +9 -9
  427. package/dist/commands/latest-scope-main.js +5 -5
  428. package/dist/commands/latest-update.js +3 -3
  429. package/dist/commands/lines-command.js +3 -3
  430. package/dist/commands/lint-parallel-main.js +32 -31
  431. package/dist/commands/lint-related.js +79 -60
  432. package/dist/commands/lint-rule.js +32 -31
  433. package/dist/commands/lockfile-policy.js +11 -11
  434. package/dist/commands/main-merge-main.js +5 -5
  435. package/dist/commands/main-sync-main.js +5 -5
  436. package/dist/commands/managed-config-scope-cli.js +3 -3
  437. package/dist/commands/measure-rerun-cli.js +10 -10
  438. package/dist/commands/metrics-command.js +91 -58
  439. package/dist/commands/observation-record-cli.js +3 -3
  440. package/dist/commands/observations-flush-cli.js +27 -25
  441. package/dist/commands/oracle-list-cli.js +2 -2
  442. package/dist/commands/overrides-check.js +4 -4
  443. package/dist/commands/package-scout-cli.js +67 -26
  444. package/dist/commands/plan-consumers-main.js +4 -4
  445. package/dist/commands/plan-scaffold-cli.js +132 -91
  446. package/dist/commands/pr-classification-main.js +3 -3
  447. package/dist/commands/pre-commit-lint.js +11 -12
  448. package/dist/commands/pre-commit-type-check.js +25 -24
  449. package/dist/commands/pre-push-unit.js +33 -33
  450. package/dist/commands/pretool-guard-cli.js +90 -91
  451. package/dist/commands/project-profile-cli.js +5 -4
  452. package/dist/commands/propagate.js +15 -15
  453. package/dist/commands/prose-stale-cli.js +20 -19
  454. package/dist/commands/publishable-range-check.js +4 -4
  455. package/dist/commands/read-files-cli.js +2 -2
  456. package/dist/commands/read-set-cli.js +61 -24
  457. package/dist/commands/refactor-scan-cli.js +6 -6
  458. package/dist/commands/release-cli.js +64 -36
  459. package/dist/commands/release-scope-main.js +19 -18
  460. package/dist/commands/rename-cli.js +27 -29
  461. package/dist/commands/reserved-run.js +3 -3
  462. package/dist/commands/retrospective-cli.js +104 -102
  463. package/dist/commands/review-attest-cli.js +6 -6
  464. package/dist/commands/review-brief-main.js +127 -109
  465. package/dist/commands/review-findings-cli.js +2 -2
  466. package/dist/commands/review-pair-cli.js +110 -84
  467. package/dist/commands/review-record-main.js +108 -83
  468. package/dist/commands/review-round2-cli.js +46 -45
  469. package/dist/commands/review-stops-cli.js +16 -16
  470. package/dist/commands/review-submit-cli.js +127 -109
  471. package/dist/commands/rule-list.js +58 -60
  472. package/dist/commands/rule-value-cli.js +226 -74
  473. package/dist/commands/run-add-cli.js +28 -27
  474. package/dist/commands/run-board-main.js +136 -132
  475. package/dist/commands/run-carry-cli.js +127 -124
  476. package/dist/commands/run-chain-cli.js +116 -93
  477. package/dist/commands/run-cut-cli.js +124 -119
  478. package/dist/commands/run-ending-cli.js +19 -22
  479. package/dist/commands/run-entry-cli.js +183 -180
  480. package/dist/commands/run-event-cli.js +5 -5
  481. package/dist/commands/run-handoff-cli.js +52 -28
  482. package/dist/commands/run-handoff-lanes-cli.js +15 -15
  483. package/dist/commands/run-hold-main.js +64 -62
  484. package/dist/commands/run-liveness-cli.js +11 -11
  485. package/dist/commands/run-merge-main.js +119 -116
  486. package/dist/commands/run-next-cli.js +87 -86
  487. package/dist/commands/run-park-cli.js +111 -92
  488. package/dist/commands/run-pause-cli.js +147 -133
  489. package/dist/commands/run-pickup-cli.js +13 -13
  490. package/dist/commands/run-prep-main.js +83 -82
  491. package/dist/commands/run-prime-cli.js +107 -87
  492. package/dist/commands/run-progress-main.js +123 -107
  493. package/dist/commands/run-report-cli.js +25 -24
  494. package/dist/commands/run-review-cli.js +168 -149
  495. package/dist/commands/run-ship-cli.js +208 -203
  496. package/dist/commands/run-ship-evidence-cli.js +38 -37
  497. package/dist/commands/run-ship-wait-main.js +40 -37
  498. package/dist/commands/run-split-cli.js +127 -125
  499. package/dist/commands/run-stale-main.js +36 -35
  500. package/dist/commands/run-status-cli.js +16 -15
  501. package/dist/commands/run-step-cli.js +173 -164
  502. package/dist/commands/run-tail-cli.js +1 -1
  503. package/dist/commands/run-tidy-main.js +30 -29
  504. package/dist/commands/run-wake-main.js +137 -119
  505. package/dist/commands/run-watcher-guard-cli.js +30 -29
  506. package/dist/commands/secretlint-scan.js +2 -2
  507. package/dist/commands/selfcheck-cli.js +27 -26
  508. package/dist/commands/session-language-main.js +48 -28
  509. package/dist/commands/sonar-hotspots-cli.js +3 -3
  510. package/dist/commands/split-assess-cli.js +24 -23
  511. package/dist/commands/split-child-recover-cli.js +13 -12
  512. package/dist/commands/start.js +37 -35
  513. package/dist/commands/stash-pop-main.js +3 -3
  514. package/dist/commands/stash-push-main.js +3 -3
  515. package/dist/commands/stop-guard.js +144 -143
  516. package/dist/commands/sync-main.js +11 -10
  517. package/dist/commands/telegram-test-main.js +5 -5
  518. package/dist/commands/test-declared.js +9 -8
  519. package/dist/commands/test-e2e-guard.js +23 -22
  520. package/dist/commands/test-pinned-main.js +26 -25
  521. package/dist/commands/test-reach-cli.js +15 -14
  522. package/dist/commands/test-red-main.js +5 -5
  523. package/dist/commands/{test-related-ZT2AO62I.js → test-related-ZCNC46MS.js} +31 -31
  524. package/dist/commands/test-related-main.js +51 -50
  525. package/dist/commands/test-unit-guard-main.js +9 -8
  526. package/dist/commands/time-cli.js +24 -27
  527. package/dist/commands/time-density-cli.js +8 -9
  528. package/dist/commands/tree-status-cli.js +4 -4
  529. package/dist/commands/type-check-command.js +8 -7
  530. package/dist/commands/ui-shot-cli.js +4 -4
  531. package/dist/commands/uninstall.js +20 -19
  532. package/dist/commands/unused-members-cli.js +9 -8
  533. package/dist/commands/upstream-interrupt-main.js +115 -111
  534. package/dist/commands/verification-gate.js +46 -46
  535. package/dist/commands/version-check.js +5 -5
  536. package/dist/hooks/{chunk-LWD43Z3C.js → chunk-5CUXGQT6.js} +1667 -107
  537. package/dist/hooks/{chunk-4YXV2REH.js → chunk-5R5YFQR5.js} +8 -8
  538. package/dist/hooks/{chunk-LKQBEKBI.js → chunk-6RLY27FT.js} +8 -8
  539. package/dist/hooks/{chunk-CICKRHTB.js → chunk-AO4TOV4V.js} +119 -2679
  540. package/dist/hooks/{chunk-NUPVO7RI.js → chunk-G5WSPYJ6.js} +4296 -1687
  541. package/dist/hooks/{chunk-UU4PTPEZ.js → chunk-HHIVWGHX.js} +250 -125
  542. package/dist/hooks/{chunk-P7BPAU26.js → chunk-IURJANNZ.js} +2 -2
  543. package/dist/hooks/{chunk-6RR6JZSB.js → chunk-OV22V63P.js} +357 -1744
  544. package/dist/hooks/{chunk-RQXECHAS.js → chunk-SXABK6UV.js} +57 -45
  545. package/dist/hooks/codex-hook-adapter.js +11 -11
  546. package/dist/hooks/daemon.js +1053 -690
  547. package/dist/hooks/format-edited.js +5 -5
  548. package/dist/hooks/inputs.json +551 -536
  549. package/dist/hooks/pretool-guard.js +7 -7
  550. package/dist/hooks/session-lang.js +292 -15
  551. package/dist/hooks/stop-guard.js +225 -48
  552. package/dist/inputs.json +65 -65
  553. package/dist/josh.js +73 -19
  554. package/dist/self-sync-guard/index.js +18 -1
  555. package/dist/version/index.js +18 -1
  556. package/package.json +3 -3
  557. package/pnpm-workspace.yaml +5 -13
  558. package/prompts/collaboration-workflow/issue-template.en.md +56 -52
  559. package/scripts/agent/agent-argv.ts +20 -6
  560. package/scripts/agent/agent-phase-profile.ts +89 -0
  561. package/scripts/agent/agent-role-profile.ts +3 -71
  562. package/scripts/agent/agent-ship-cap.ts +44 -0
  563. package/scripts/agent/agent-worker-profile.ts +154 -0
  564. package/scripts/agent/claude-agent-argv.ts +1 -1
  565. package/scripts/agent/lane-instructions.ts +29 -3
  566. package/scripts/auto-ok/auto-ok-judge-cli.ts +3 -0
  567. package/scripts/auto-ok/auto-ok-judge-write.ts +2 -1
  568. package/scripts/auto-ok/auto-ok-judge.ts +4 -2
  569. package/scripts/backlog/backlog-drive-escalate.ts +115 -0
  570. package/scripts/backlog/backlog-drive-stalled-retry.ts +48 -10
  571. package/scripts/document/document-scan.ts +35 -1
  572. package/scripts/gh/git-pr-checks-failed.ts +24 -0
  573. package/scripts/hooks/implementation-shell-deny-expansion.ts +20 -0
  574. package/scripts/hooks/implementation-shell-deny-git.ts +128 -0
  575. package/scripts/hooks/implementation-shell-deny.ts +14 -138
  576. package/scripts/hooks/implementation-shell.ts +28 -5
  577. package/scripts/hooks/step-zero-notice.ts +9 -6
  578. package/scripts/hooks/stop-actions.ts +4 -2
  579. package/scripts/init/init-logic-workspace.ts +1 -1
  580. package/scripts/issue/issue-auto-ok.ts +43 -4
  581. package/scripts/issue/issue-body-keys.ts +4 -0
  582. package/scripts/issue/issue-comment-cli.ts +15 -2
  583. package/scripts/issue/issue-evidence-exit.ts +6 -2
  584. package/scripts/issue/issue-file-cli.ts +5 -1
  585. package/scripts/issue/issue-file-pass.ts +14 -7
  586. package/scripts/issue/issue-file-worker.ts +95 -0
  587. package/scripts/issue/issue-file.ts +1 -1
  588. package/scripts/issue/issue-outcome.ts +107 -0
  589. package/scripts/issue/issue-read.ts +12 -7
  590. package/scripts/issue/issue-watch-diff.ts +2 -1
  591. package/scripts/josh/josh-commands-ai.ts +2 -2
  592. package/scripts/josh/josh-commands-development.ts +21 -5
  593. package/scripts/josh/josh-commands-issue-write.ts +3 -2
  594. package/scripts/josh/josh-commands-lint.ts +1 -1
  595. package/scripts/josh/josh-commands-project.ts +7 -2
  596. package/scripts/josh/josh-commands-run.ts +10 -2
  597. package/scripts/josh/josh-commands-workflow.ts +5 -0
  598. package/scripts/lane/lane-breakdown-cli.ts +14 -4
  599. package/scripts/lane/lane-breakdown-text.ts +7 -0
  600. package/scripts/lane/lane-breakdown.ts +21 -1
  601. package/scripts/lane/lane-dispatch-prepare.ts +83 -0
  602. package/scripts/lane/lane-dispatch.ts +3 -53
  603. package/scripts/lane/lane-elapsed-time.ts +118 -0
  604. package/scripts/lane/lane-ledger-schema-ship.ts +4 -1
  605. package/scripts/lane/lane-net-time.ts +35 -7
  606. package/scripts/lane/lane-overrun.ts +1 -1
  607. package/scripts/lane/lane-plan-cli.ts +7 -3
  608. package/scripts/lane/lane-plan-estimate.ts +57 -0
  609. package/scripts/lane/lane-plan-size.ts +11 -20
  610. package/scripts/lane/lane-plan.ts +1 -0
  611. package/scripts/lane/lane-relaunch.ts +9 -4
  612. package/scripts/lane/lane-stage-budget.ts +6 -1
  613. package/scripts/lane/lane-stage-events.ts +103 -0
  614. package/scripts/lane/lane-stats-tables.ts +3 -0
  615. package/scripts/lane/lane-stop-check-stats.ts +117 -0
  616. package/scripts/lane/lane-stop-stats.ts +30 -6
  617. package/scripts/lane/lane-why-causes.ts +3 -11
  618. package/scripts/lane/openai-lane-supervisor-owner.ts +12 -0
  619. package/scripts/lane/openai-lane-supervisor.ts +36 -1
  620. package/scripts/lib/home-tilde.ts +24 -0
  621. package/scripts/lib/package-manifest.ts +27 -1
  622. package/scripts/observations/observation-ledger-archive.ts +180 -0
  623. package/scripts/observations/observation-ledger-home.ts +1 -0
  624. package/scripts/observations/observation-ledger.ts +5 -0
  625. package/scripts/observations/observations-flush-transaction.ts +358 -0
  626. package/scripts/observations/observations-flush.ts +72 -172
  627. package/scripts/plan/plan-scaffold-cli.ts +17 -6
  628. package/scripts/plan/plan-scaffold.ts +11 -0
  629. package/scripts/release/github-release-notes.ts +24 -0
  630. package/scripts/release/github-release-runs.ts +32 -6
  631. package/scripts/release/github-release.ts +10 -2
  632. package/scripts/release/release-progress.ts +22 -10
  633. package/scripts/release/release-publish-run.ts +39 -6
  634. package/scripts/repo/repository-labels.ts +23 -11
  635. package/scripts/review/review-comment-round.ts +10 -5
  636. package/scripts/rules/broad-investigation-shell.ts +2 -2
  637. package/scripts/rules/codex-prompt.ts +63 -0
  638. package/scripts/rules/direct-issue-comment.ts +62 -2
  639. package/scripts/rules/direct-issue-read.ts +55 -2
  640. package/scripts/rules/guard-remedy.ts +10 -4
  641. package/scripts/rules/issue-citation.ts +20 -9
  642. package/scripts/rules/last-prompt.ts +8 -4
  643. package/scripts/rules/rule-value-cli.ts +85 -4
  644. package/scripts/rules/rule-value-trend.ts +108 -0
  645. package/scripts/rules/shell-redirects.ts +19 -7
  646. package/scripts/rules/shell-segments.ts +145 -20
  647. package/scripts/rules/shell-tokens.ts +66 -0
  648. package/scripts/rules/standalone-gh-call.ts +63 -0
  649. package/scripts/rules/unasked-filing.ts +12 -4
  650. package/scripts/run/board/run-board-closed.ts +10 -1
  651. package/scripts/run/board/run-board-decision-read.ts +52 -12
  652. package/scripts/run/board/run-board-decision.ts +5 -0
  653. package/scripts/run/board/run-board-ending-reason.ts +21 -7
  654. package/scripts/run/board/run-board-github.ts +8 -1
  655. package/scripts/run/board/run-board-layout.ts +5 -3
  656. package/scripts/run/board/run-board-link.ts +2 -0
  657. package/scripts/run/board/run-board-operation.ts +6 -2
  658. package/scripts/run/board/run-board-pause-fixture.json +12 -0
  659. package/scripts/run/board/run-board-pause.ts +87 -0
  660. package/scripts/run/board/run-board-plan-shared.ts +2 -0
  661. package/scripts/run/board/run-board-render-condition.ts +10 -1
  662. package/scripts/run/board/run-board-render-title.ts +7 -0
  663. package/scripts/run/board/run-board-settle.ts +16 -2
  664. package/scripts/run/board/run-board-snapshot.ts +4 -0
  665. package/scripts/run/board/run-board-status.ts +11 -1
  666. package/scripts/run/cut/run-cut-cli.ts +2 -1
  667. package/scripts/run/park/run-park-cli.ts +13 -1
  668. package/scripts/run/park/run-park-escalate.ts +102 -0
  669. package/scripts/run/park/run-stalled.ts +29 -7
  670. package/scripts/run/review/run-review-early-push.ts +6 -6
  671. package/scripts/run/ship/run-ship-stop-cause.ts +12 -1
  672. package/scripts/split/split-assess.ts +14 -5
  673. package/scripts/test/test-related-touched.ts +21 -3
  674. package/scripts/test/test-related.ts +1 -1
  675. package/dist/commands/chunk-6WEVLIZE.js +0 -29
  676. package/dist/commands/chunk-E2ZCUKHT.js +0 -274
  677. package/dist/commands/chunk-NMLCPYBN.js +0 -134
  678. package/dist/commands/chunk-QEIO2ZNQ.js +0 -324
  679. package/dist/commands/chunk-QWX7EBC6.js +0 -112
  680. package/dist/commands/chunk-RQRLW4XK.js +0 -20
  681. package/dist/commands/chunk-UCQJDYE3.js +0 -21
  682. package/dist/commands/chunk-W4YH2DF3.js +0 -58
  683. package/dist/commands/{chunk-LRA3PXHS.js → chunk-ENKFCOVY.js} +3 -3
  684. package/dist/commands/{chunk-RUWV4INF.js → chunk-HQGNXR6I.js} +3 -3
@@ -9,9 +9,10 @@ import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
9
9
  import { time_reported_failure } from '#scripts/time-runtime/time-reported-failure'
10
10
  import { z } from 'zod'
11
11
  import { bash_triggers } from './bash-triggers'
12
+ import { codex_prompt } from './codex-prompt'
13
+ import { issue_citation } from './issue-citation'
12
14
  import { last_prompt } from './last-prompt'
13
15
  import { shell_segments } from './shell-segments'
14
- import { turn_filings } from './turn-filings'
15
16
 
16
17
  // The `unasked-filing` row of `delivered-rules.ts` (joshuafolkken/kit#7293). An interactive session
17
18
  // files only on the person's instruction; an unattended run files without asking
@@ -61,20 +62,27 @@ const UNASKED_FILING_REASON =
61
62
  '(`.claude/skills/workflow-commands/observation-filing.md`).'
62
63
 
63
64
  function is_instructed(prompt: string): boolean {
64
- const trimmed = prompt.trim()
65
+ const trimmed = issue_citation
66
+ .prose_lines(prompt)
67
+ .join('\n')
68
+ .replaceAll(/(?<!`)(`+)(?!`)[\s\S]*?(?<!`)\1(?!`)/gu, '')
69
+ .replaceAll(/「[^「」\n]*」|『[^『』\n]*』|"[^"\n]*"|'[^'\n]*'/gu, '')
70
+ .trim()
65
71
 
66
72
  return FILING_WORDS.some((pattern) => pattern.test(trimmed))
67
73
  }
68
74
 
69
75
  function reply_text(line: string): string {
70
- const parsed = ASSISTANT_LINE_SCHEMA.safeParse(json_value.parse_or_undefined(line))
76
+ const parsed = ASSISTANT_LINE_SCHEMA.safeParse(
77
+ json_value.parse_or_undefined(codex_prompt.normalize(line)),
78
+ )
71
79
 
72
80
  return parsed.success ? time_reported_failure.result_text(parsed.data.message.content) : ''
73
81
  }
74
82
 
75
83
  // A prompt line the person wrote — not a skill body or a hand-back the harness wrote on a prompt line.
76
84
  function is_person_line(line: string): boolean {
77
- return turn_filings.is_prompt_line(line) && last_prompt.person_prompt(line) !== undefined
85
+ return last_prompt.person_prompt(line) !== undefined
78
86
  }
79
87
 
80
88
  // The model's last words before the person's last prompt — where the proposal a yes confirms sits.
@@ -4,6 +4,7 @@ import { issue_label_schema } from '#scripts/git/git-schemas'
4
4
  import { parse_json_object_or_undefined } from '#scripts/git/parse-json-array'
5
5
  import { ALREADY_DONE_LABEL, has_label_name } from '#scripts/issue/issue-labels'
6
6
  import { issue_merged } from '#scripts/issue/issue-merged'
7
+ import { issue_outcome, type IssueOutcome } from '#scripts/issue/issue-outcome'
7
8
  import { bounded_pool } from '#scripts/lib/bounded-pool'
8
9
  import { z } from 'zod'
9
10
  import { run_board_closed_graphql, type ClosedSource } from './run-board-closed-graphql'
@@ -15,6 +16,7 @@ import { run_board_closed_graphql, type ClosedSource } from './run-board-closed-
15
16
  // keeps the answer for the run and asks GitHub only about children it has not read yet.
16
17
 
17
18
  interface ClosedIssue {
19
+ outcome?: IssueOutcome | undefined
18
20
  title: string
19
21
  // Its label names, so a closed row still draws its release category (joshuafolkken/kit#3577).
20
22
  labels: ReadonlyArray<string>
@@ -115,7 +117,14 @@ async function read_closed(issue: number, source?: ClosedSource): Promise<Closed
115
117
 
116
118
  const is_not_planned = view.stateReason === NOT_PLANNED_REASON
117
119
 
118
- return { title: view.title, labels, closed_ms: closed_ms_of(view), is_merged, is_not_planned }
120
+ return {
121
+ title: view.title,
122
+ labels,
123
+ closed_ms: closed_ms_of(view),
124
+ is_merged,
125
+ is_not_planned,
126
+ ...(await issue_outcome.recorded(issue, is_merged)),
127
+ }
119
128
  }
120
129
 
121
130
  async function read_all(
@@ -2,11 +2,17 @@ import { epic_graph, type EpicChild, type IssueReference } from '#scripts/epic/e
2
2
  import { epic_issue } from '#scripts/epic/epic-issue'
3
3
  import { git_gh_etag_read } from '#scripts/gh/git-gh-etag-read'
4
4
  import { git_gh_issue_read } from '#scripts/gh/git-gh-issue-read'
5
- import { has_label_name, NEEDS_DECISION_LABEL } from '#scripts/issue/issue-labels'
6
- import { issue_read } from '#scripts/issue/issue-read'
5
+ import { has_label_name, has_parked_label, NEEDS_DECISION_LABEL } from '#scripts/issue/issue-labels'
6
+ import { issue_read, type IssueComment } from '#scripts/issue/issue-read'
7
7
  import { run_board_decision } from './run-board-decision'
8
8
  import { run_board_decision_graphql, type ViewLoader } from './run-board-decision-graphql'
9
9
  import { run_board_layout, type BoardPlan } from './run-board-layout'
10
+ import { run_board_pause, type PauseRecord } from './run-board-pause'
11
+
12
+ interface CommentReasons {
13
+ question: string | undefined
14
+ pause: PauseRecord
15
+ }
10
16
 
11
17
  interface DecisionNode extends EpicChild {
12
18
  title: string
@@ -109,11 +115,11 @@ async function blocker_of(
109
115
  return blockers.find((blocker) => blocker !== undefined) ?? terminal_of(node)
110
116
  }
111
117
 
112
- async function question_of(
118
+ async function read_comments(
113
119
  number: number,
114
120
  repo: string,
115
121
  answered: ReadonlyMap<number, string>,
116
- ): Promise<readonly [number, string] | undefined> {
122
+ ): Promise<ReadonlyArray<IssueComment>> {
117
123
  const json =
118
124
  answered.get(number) ??
119
125
  (await git_gh_issue_read.issue_list_comments(
@@ -122,23 +128,57 @@ async function question_of(
122
128
  repo,
123
129
  git_gh_issue_read.read_comments_conditionally,
124
130
  ))
125
- const comments = await issue_read.parse_comments(json, repo)
126
- const question = run_board_decision.comment_question(issue_read.trusted_bodies(comments ?? []))
127
131
 
128
- return question === undefined ? undefined : [number, question]
132
+ return (await issue_read.parse_comments(json, repo)) ?? []
133
+ }
134
+
135
+ async function comments_of(
136
+ number: number,
137
+ repo: string,
138
+ answered: ReadonlyMap<number, string>,
139
+ ): Promise<ReadonlyArray<IssueComment>> {
140
+ try {
141
+ return await read_comments(number, repo, answered)
142
+ } catch {
143
+ return []
144
+ }
145
+ }
146
+
147
+ async function question_of(
148
+ number: number,
149
+ repo: string,
150
+ answered: ReadonlyMap<number, string>,
151
+ ): Promise<readonly [number, CommentReasons]> {
152
+ const comments = await comments_of(number, repo, answered)
153
+ const question = run_board_decision.comment_question(issue_read.trusted_bodies(comments))
154
+
155
+ const issue_url = `https://github.com/${repo}/issues/${String(number)}`
156
+
157
+ return [number, { question, pause: run_board_pause.from_comments(comments, issue_url) }]
158
+ }
159
+
160
+ function question_pair([number, value]: readonly [number, CommentReasons]): Array<
161
+ readonly [number, string]
162
+ > {
163
+ return value.question === undefined ? [] : [[number, value.question]]
129
164
  }
130
165
 
131
- async function questions_of(plan: BoardPlan): Promise<ReadonlyMap<number, string>> {
166
+ async function questions_of(
167
+ plan: BoardPlan,
168
+ ): Promise<Pick<BoardPlan, 'decision_questions' | 'pause_reasons'>> {
132
169
  const { repo } = plan.context
133
170
  const numbers = [...plan.labels]
134
- .filter(([, labels]) => has_label_name(labels, NEEDS_DECISION_LABEL))
171
+ .filter(([, labels]) => has_parked_label(labels))
135
172
  .map(([number]) => number)
136
173
  const answered = await run_board_decision_graphql.read_comments(numbers, repo)
137
174
  const pairs = await Promise.all(
138
175
  numbers.map(async (number) => await question_of(number, repo, answered)),
139
176
  )
140
177
 
141
- return new Map(pairs.filter((pair) => pair !== undefined))
178
+ return {
179
+ decision_questions: new Map(pairs.flatMap((pair) => question_pair(pair))),
180
+ pause_reasons: new Map(pairs.map(([number, value]) => [number, value.pause])),
181
+ }
142
182
  }
143
183
 
144
184
  async function wait_of(
@@ -178,14 +218,14 @@ async function with_decisions(plan: BoardPlan | undefined): Promise<BoardPlan |
178
218
  ...(plan.waves.running ?? []),
179
219
  ]
180
220
  const read = read_of(plan, children)
181
- const [decision_questions, waits] = await Promise.all([
221
+ const [questions, waits] = await Promise.all([
182
222
  questions_of(plan),
183
223
  Promise.all(children.map(async (child) => await wait_of(child, read))),
184
224
  ])
185
225
 
186
226
  return {
187
227
  ...plan,
188
- decision_questions,
228
+ ...questions,
189
229
  decision_waits: new Map(waits.filter((pair) => pair !== undefined)),
190
230
  }
191
231
  }
@@ -1,6 +1,8 @@
1
1
  import { markdown_section } from '#scripts/issue/markdown-section'
2
2
  import { run_park_body } from '#scripts/run/park/run-park-body'
3
3
  import type { BoardPlan, RowRead, RowReason } from './run-board-layout'
4
+ import { run_board_pause } from './run-board-pause'
5
+ import type { ItemStatus } from './run-board-status'
4
6
 
5
7
  // The park's question, then after `;` a note on why it parked that is not the question
6
8
  // (`backlog-drive-retry.ts`: `needs-decision; blocker #M closed`).
@@ -67,7 +69,10 @@ function reason_of(
67
69
  number: number,
68
70
  reason: string | undefined,
69
71
  read: RowRead,
72
+ status?: ItemStatus,
70
73
  ): RowReason | undefined {
74
+ const pause = run_board_pause.reason_of(number, read, status)
75
+ if (pause !== undefined) return pause
71
76
  const parts = parts_of(reason)
72
77
  const question = question_of(parts.question) ?? read_question(number, read)
73
78
 
@@ -3,6 +3,7 @@ import { lane_withdraw } from '#scripts/lane/lane-withdraw'
3
3
  import { run_event_stream, type RunEvent } from '#scripts/run/event/run-event-stream'
4
4
  import { run_stalled } from '#scripts/run/park/run-stalled'
5
5
  import type { BoardRow, RowRead, RowReason } from './run-board-layout'
6
+ import { run_board_pause } from './run-board-pause'
6
7
  import { run_board_render_title } from './run-board-render-title'
7
8
  import type { ItemState, ItemStatus } from './run-board-status'
8
9
 
@@ -101,10 +102,10 @@ function is_stalled(status: ItemStatus, labels: ReadonlyArray<string> = []): boo
101
102
 
102
103
  // Each finished state that did not merge: how its tail names it, and the reason it draws when none
103
104
  // was recorded.
104
- const FINISHED_ENDINGS: Partial<Record<ItemState, { word: string; fallback: string }>> = {
105
- done: { word: 'done', fallback: 'closed without a PR to merge' },
106
- withdrawn: { word: 'withdrawn', fallback: 'run withdrawn' },
107
- already_done: { word: 'already done', fallback: 'closed with verified evidence' },
105
+ const FINISHED_ENDINGS: Partial<Record<ItemState, string>> = {
106
+ done: 'Closed without a merged PR',
107
+ withdrawn: 'Run withdrawn',
108
+ already_done: 'Closed with verified evidence',
108
109
  }
109
110
 
110
111
  // Finished rows name why no action remains; merge rows keep their existing tail.
@@ -113,7 +114,7 @@ function tail_of(status: ItemStatus): string | undefined {
113
114
 
114
115
  if (ending === undefined) return status.reason
115
116
 
116
- return `nothing to do · ${ending.word}: ${status.reason ?? ending.fallback}`
117
+ return status.outcome?.summary ?? ending
117
118
  }
118
119
 
119
120
  // joshuafolkken/kit#6577: what stopped a lane, or the ship of a child still working, by the command its
@@ -133,14 +134,20 @@ function stop_row_reason(status: ItemStatus): Pick<BoardRow, 'reason'> {
133
134
  }
134
135
 
135
136
  // Raw event reasons remain cacheable; only drawing selects an action from the current live state.
136
- function row_reason(number: number, status: ItemStatus, read: RowRead): Pick<BoardRow, 'reason'> {
137
+ function ending_row_reason(
138
+ number: number,
139
+ status: ItemStatus,
140
+ read: RowRead,
141
+ ): Pick<BoardRow, 'reason'> {
137
142
  const reason = tail_of(status)
138
143
  const waits = read.waits?.get(number)
139
144
 
140
145
  if (reason !== undefined) {
141
146
  const tail = park_row_reason(number, reason, read.is_backlog_live === true, waits)
142
147
 
143
- return { reason: { tail } }
148
+ return {
149
+ reason: { tail, ...(status.outcome !== undefined && { evidence_url: status.outcome.url }) },
150
+ }
144
151
  }
145
152
 
146
153
  return is_stalled(status, read.labels.get(number))
@@ -148,6 +155,13 @@ function row_reason(number: number, status: ItemStatus, read: RowRead): Pick<Boa
148
155
  : stop_row_reason(status)
149
156
  }
150
157
 
158
+ function row_reason(number: number, status: ItemStatus, read: RowRead): Pick<BoardRow, 'reason'> {
159
+ const pause =
160
+ status.state === 'parked' ? run_board_pause.reason_of(number, read, status) : undefined
161
+
162
+ return pause === undefined ? ending_row_reason(number, status, read) : { reason: pause }
163
+ }
164
+
151
165
  const run_board_ending_reason = {
152
166
  park_reason,
153
167
  park_row_reason,
@@ -126,6 +126,13 @@ function is_unlisted(issue: number, read: OpenRead): boolean {
126
126
  return open !== undefined && !open.has(issue)
127
127
  }
128
128
 
129
+ // A late evidence note or a failed comment read is retried at the existing GitHub read interval.
130
+ function is_closed_cached(issue: number, read: OpenRead): boolean {
131
+ const closed = read.closed.get(issue)
132
+
133
+ return closed?.is_merged === true || closed?.outcome !== undefined
134
+ }
135
+
129
136
  // A child still drawn stopped or running holds no closed read of this launch — any it holds closed
130
137
  // before it relaunched — so it is asked again. A running child is asked too while the plan read fails:
131
138
  // the kept plan still lists it, and an empty listing — failed, or a repository whose last open issue
@@ -141,7 +148,7 @@ function is_closed_candidate(
141
148
  if (ALWAYS_ASKED_STATES.has(status.state)) return true
142
149
  if (status.state === RUNNING_STATE) return is_plan_failed || is_unlisted(issue, read)
143
150
 
144
- return is_unlisted(issue, read) && !read.closed.has(issue)
151
+ return is_unlisted(issue, read) && !is_closed_cached(issue, read)
145
152
  }
146
153
 
147
154
  // An ended run asks until one ask after it ended has answered whole, then holds what it has, as its
@@ -15,6 +15,7 @@ import { run_board_ending_reason } from './run-board-ending-reason'
15
15
  import { run_board_human } from './run-board-human'
16
16
  import { run_board_human_merge } from './run-board-human-merge'
17
17
  import { run_board_kind, type BoardPriority } from './run-board-kind'
18
+ import type { PauseRead } from './run-board-pause'
18
19
  import { run_board_standing_waits } from './run-board-standing-waits'
19
20
  import type { ItemState, ItemStatus } from './run-board-status'
20
21
 
@@ -29,7 +30,7 @@ import type { ItemState, ItemStatus } from './run-board-status'
29
30
  // **An epic and its children are a tree; every other dependency is not.** A child an opted-in epic
30
31
  // tracks is drawn under its epic; a `blocked_by` edge is a DAG, so it stays a waiting-on note at the end of the row.
31
32
 
32
- interface BoardPlan {
33
+ interface BoardPlan extends PauseRead {
33
34
  decision_questions?: ReadonlyMap<number, string> | undefined
34
35
  decision_waits?: ReadonlyMap<number, string> | undefined
35
36
  is_backlog_live?: boolean | undefined
@@ -55,6 +56,7 @@ interface BoardPlan {
55
56
  // (joshuafolkken/kit#4288): the icon it leads with in place of ⏳, the condition column's value, and
56
57
  // what follows its title. A parked, withdrawn or stalled row draws its tail alone.
57
58
  interface RowReason {
59
+ evidence_url?: string | undefined
58
60
  icon?: string | undefined
59
61
  // The condition column's figure — a lane count, a memory reading, a start time.
60
62
  value?: string | undefined
@@ -110,7 +112,7 @@ interface BoardLayout {
110
112
  }
111
113
 
112
114
  // What an active row is named and classified by — each issue's title and labels.
113
- interface RowRead {
115
+ interface RowRead extends PauseRead {
114
116
  decision_questions?: ReadonlyMap<number, string> | undefined
115
117
  is_backlog_live?: boolean | undefined
116
118
  titles: ReadonlyMap<number, string>
@@ -224,7 +226,7 @@ function touched_row(number: number, status: ItemStatus, read: RowRead): BoardRo
224
226
 
225
227
  return {
226
228
  ...(is_asked
227
- ? { reason: run_board_decision.reason_of(number, status.reason, read) }
229
+ ? { reason: run_board_decision.reason_of(number, status.reason, read, status) }
228
230
  : run_board_ending_reason.row_reason(number, status, read)),
229
231
  ...solo_flag(labels),
230
232
  number,
@@ -46,6 +46,7 @@ type RepoLink = (text: string, page: RepoPage) => string
46
46
 
47
47
  // The links a board draws, each plain before a plan names the repository.
48
48
  interface BoardLinks {
49
+ comment_link?: Link | undefined
49
50
  // An issue reference as the board draws it — `3450` or `owner/repo#12`.
50
51
  link: (reference: string) => string
51
52
  // A pull request's number (joshuafolkken/kit#4625).
@@ -72,6 +73,7 @@ function repo_linker(repo: string | undefined, link: Link): RepoLink {
72
73
 
73
74
  function links_of(repo: string | undefined, link: Link): BoardLinks {
74
75
  return {
76
+ comment_link: link,
75
77
  link: linker(repo, link),
76
78
  pull_link: pull_linker(repo, link),
77
79
  repo_link: repo_linker(repo, link),
@@ -1,4 +1,5 @@
1
1
  import path from 'node:path'
2
+ import { home_tilde } from '#scripts/lib/home-tilde'
2
3
  import { json_value } from '#scripts/lib/json-value'
3
4
  import { token_shape } from '#scripts/lib/token-shape'
4
5
  import { transcript_record, type TranscriptRecord } from '#scripts/lib/transcript-record'
@@ -63,12 +64,15 @@ function without_assignments(command: string): string {
63
64
 
64
65
  // The first line of what the command runs, cut to the limit. A command whose variable cannot be read
65
66
  // to its end is drawn as nothing: a part of the value would stand where the command should. A
66
- // credential later in the line is redacted before the cut, which would leave a head no shape matches.
67
+ // credential later in the line is redacted before the cut, which would leave a head no shape matches;
68
+ // the home directory is written as `~` before it too, so no part of the account name is left.
67
69
  function command_target(command: string): string {
68
70
  const [first = ''] = without_assignments(command.trim()).split(NEWLINE)
69
71
  if (UNREAD_ASSIGNMENT.test(first)) return ''
70
72
 
71
- return cut(ascii_head(token_shape.redact(first).replaceAll(SPACES, ' ')))
73
+ const masked = home_tilde.mask(token_shape.redact(first))
74
+
75
+ return cut(ascii_head(masked.replaceAll(SPACES, ' ')))
72
76
  }
73
77
 
74
78
  // The path from `root` down; a file outside it is drawn by its name alone, never by where it is.
@@ -0,0 +1,12 @@
1
+ {
2
+ "decision": {
3
+ "body": "## 停止理由\n\nfullrun #7387 の `pnpm josh run:entry 7387` が stale(exit 1)で停止した。7387-lane の pre-gate cut(2026-11-12T08:32:26.921Z)は現在のツリーと一致しない。pre-gate-cut.md の resume verdict に従い、gate は実行していない。直接の confirmation 通知は lane-park フックに拒否され、先に park するよう指示された。\n\n### 選択肢\n\n1. ブランチと未コミット変更を cut と照合し、不一致を解消して fullrun #7387 を再開する。\n- 層: A\n- 必要な権限: 親ランによる lane の再開状態の確認。\n\n2. ランが終了済みと確認できた場合に `pnpm josh run:cut --end` で cut を解除する。\n- 層: C\n- 必要な権限: ラン終了の明示確認。\n\n### 推奨\n\n1 作業内容を保持したまま、保存された cut と lane の不一致を確認する。\n\n---\n- Lane directory: `/Users/iwasakishinya/Development/.kit-lanes/7387`\n- Seat 1 stays held while the lane is kept\n- Give it back: `pnpm josh lane:close 7387`\n\n\n<!-- josh:run -->",
4
+ "createdAt": "2026-11-12T11:32:05Z",
5
+ "url": "https://github.com/joshuafolkken/kit/issues/7387#issuecomment-6822420448"
6
+ },
7
+ "parked": {
8
+ "body": "## 停止理由\n\n承認済み範囲の実装・検証を進めた結果、既存の `scripts/observations/observations-flush-landing.test.ts` の fixture 更新が必要になった。このファイルは https://github.com/joshuafolkken/kit/issues/7392#issuecomment-6820104162 の「承認するpathsは次の7件だけ」に含まれないため、編集していない。\n\n同ファイルは公開 flush を呼びながら Git だけを mock している。隔離境界の導入後は transaction も mock しないと、実 checkout の Git directory にテスト用 state(架空の HEAD c0ffee1)を作り、12件が失敗する。テストが作った state は内容を確認して除去済み。利用者の記録、stash、index は変更していない。\n\n必要な追加変更はこの1テストファイルだけ:\n\n- `observations_flush_transaction.pending` を false、`run` を prepare/publish callback を順に呼ぶ mock にする。auto-merge・中断・既存PR・merge待機の既存テストを隔離境界へ接続する。\n- archive fixture と検証を、途中エラーを飲み込まない `observation_ledger_archive.archive` に追従させる。\n- `discards an uncommitted carried file before it looks` を、元 checkout の carried file を削除しない検証へ置き換える。元作業の保護という本Issueの契約に合わせる。\n- 他の auto-merge、既存PR、checks、archive順序の検証は維持する。\n\n`lane:plan --probe` は追加pathでも clear だったが、これは承認範囲一致の証明ではない。`lane_plan_approval.allows` はテストを含む全pathを照合する一方、記録済み/dispatched lane の size超過はwarning扱いになるため。clear を範囲拡張の承認として利用しない。\n\n## 現在の実装と検証\n\n- 変更は承認済み5ファイルのみ。有限retryとsnapshotは transaction に統合し、新たな未承認テストファイルを増やさない。専用worktreeで加工・commit・landing、snapshotを先に永続化、失敗後のappendとsource index変更を保護する。\n- `pnpm josh test:related --touched scripts/observations/observations-flush-transaction.test.ts scripts/observations/observations-flush-command.test.ts`: 19件成功(実Git12件・command境界7件)。\n- `pnpm josh lint:related`: 成功。metrics の code_lines +243 の理由記録はレビュー前に必要。\n- `pnpm josh cspell:dot`: 成功。\n- `pnpm josh check`: 成功(exit 0)。\n- 全関連テスト: landing test の12件失敗が残る。gate/review/commit/PR/merge は未実施。PR下書きの消えたテスト19件の対応、全条件の最終記入、実機証跡は再開後に完了する。\n- stash `1a8584ee872a7ef7cbb204b238e466907c1896d2`: 削除元12177行、archive12213行、追加36行。origin/main `415c7066c0d71abce1fba6df95afeeeb1a2c440c` に元記録/追加記録とも不足0行、回収patch不要、stash OID保持。読取専用照合のscriptは `.josh/tmp/inspect-observation-recovery.py`。\n\n### 選択肢\n\n1. 同一Issueの承認pathsへ `scripts/observations/observations-flush-landing.test.ts` の1件だけを追加し、上記fixture・検証の追従を許可して再開する。宣言180行・予測上限450行(テスト除く)と品質gateは維持する。\n- 層: C\n- 必要な権限: 承認済み7pathsの限定範囲を変更する利用者の明示承認。同一Issueの信頼済みコメントをsourceにsize-approval JSONを更新し、lane:planを記録する。\n\n2. 限定pathsを維持し、現在の実装を保留する。\n- 層: B\n- 必要な権限: 親による保留判断。失敗中の既存テストを無効化したり、承認範囲外でfixtureを変更したりしない。\n\n### 推奨\n1 同じ公開コマンドの既存テストを新しい保全境界へ接続するための1ファイルだけの追加。runtimeの機能範囲と品質gateを広げず、すべての関連テストを再検証できる。\n\n---\n- Lane directory: `/Users/iwasakishinya/Development/.kit-lanes/7392`\n- Seat 3 stays held while the lane is kept\n- Give it back: `pnpm josh lane:close 7392`\n\n\n<!-- josh:run -->",
9
+ "createdAt": "2026-11-12T10:48:02Z",
10
+ "url": "https://github.com/joshuafolkken/kit/issues/7392#issuecomment-6821517222"
11
+ }
12
+ }
@@ -0,0 +1,87 @@
1
+ import { issue_outcome } from '#scripts/issue/issue-outcome'
2
+ import type { IssueComment } from '#scripts/issue/issue-read'
3
+ import { run_park_body } from '#scripts/run/park/run-park-body'
4
+ import { z } from 'zod'
5
+ import type { RowReason } from './run-board-layout'
6
+ import type { ItemStatus } from './run-board-status'
7
+
8
+ const record_schema = z.object({
9
+ summary: issue_outcome.summary_schema,
10
+ url: z
11
+ .string()
12
+ .regex(/^https:\/\/github\.com\/[^/]+\/[^/]+\/issues\/\d+(?:#issuecomment-\d+)?$(?![\s\S])/u)
13
+ .optional(),
14
+ at_ms: z.number(),
15
+ })
16
+ type PauseRecord = z.infer<typeof record_schema>
17
+
18
+ interface PauseRead {
19
+ pause_reasons?: ReadonlyMap<number, PauseRecord> | undefined
20
+ }
21
+
22
+ const FALLBACK = 'Reason unavailable: inspect issue'
23
+
24
+ function is_stop(comment: IssueComment): boolean {
25
+ return comment.is_trusted === true && run_park_body.summary_of(comment.body) !== undefined
26
+ }
27
+
28
+ // A backfill can describe this stop, never an older decision or a later administrative note.
29
+ function outcome_for(
30
+ comments: ReadonlyArray<IssueComment>,
31
+ latest?: IssueComment,
32
+ ): ReturnType<typeof issue_outcome.from_comments> {
33
+ if (latest === undefined) return undefined
34
+ const candidates = comments.filter((comment) => {
35
+ const outcome = issue_outcome.from_comments(comments, [comment])
36
+
37
+ return comment === latest || outcome?.url === latest.html_url
38
+ })
39
+
40
+ return issue_outcome.from_comments(comments, candidates)
41
+ }
42
+
43
+ function at_of(comment?: IssueComment): number {
44
+ const at_ms = Date.parse(comment?.created_at ?? '')
45
+
46
+ return Number.isFinite(at_ms) ? at_ms : 0
47
+ }
48
+
49
+ // Only a stop comment can supply the reason; later administrative notes cannot replace it.
50
+ function from_comments(comments: ReadonlyArray<IssueComment>, issue_url?: string): PauseRecord {
51
+ const latest = comments.findLast((comment) => is_stop(comment))
52
+ const url = issue_outcome.url_schema.safeParse(latest?.html_url).data
53
+ const outcome = outcome_for(comments, latest)
54
+
55
+ return { summary: FALLBACK, url: url ?? issue_url, ...outcome, at_ms: at_of(latest) }
56
+ }
57
+
58
+ // A new attempt cannot inherit the previous stop's evidence while the plan refreshes.
59
+ function launch_of(status?: ItemStatus): number {
60
+ return status?.launched_ms ?? status?.started_ms ?? 0
61
+ }
62
+
63
+ function is_unread(record?: PauseRecord): boolean {
64
+ return record?.at_ms === 0 && record.url === undefined
65
+ }
66
+
67
+ function record_of(number: number, read: PauseRead, status?: ItemStatus): PauseRecord | undefined {
68
+ const record = read.pause_reasons?.get(number)
69
+
70
+ return status === undefined && is_unread(record) ? undefined : record
71
+ }
72
+
73
+ function reason_of(number: number, read: PauseRead, status?: ItemStatus): RowReason | undefined {
74
+ const record = record_of(number, read, status)
75
+ if (record === undefined) return undefined
76
+
77
+ if (record.at_ms < launch_of(status)) {
78
+ return { tail: FALLBACK, evidence_url: record.url?.split('#', 1)[0] }
79
+ }
80
+
81
+ return { tail: record.summary, evidence_url: record.url }
82
+ }
83
+
84
+ const run_board_pause = { FALLBACK, from_comments, reason_of, record_schema }
85
+
86
+ export { run_board_pause }
87
+ export type { PauseRead, PauseRecord }
@@ -3,6 +3,7 @@ import type { NamedPlan } from '#scripts/backlog/backlog-plan'
3
3
  import { shared_cache, type CacheSlot } from '#scripts/josh/shared-cache'
4
4
  import { z } from 'zod'
5
5
  import type { BoardPlan } from './run-board-layout'
6
+ import { run_board_pause } from './run-board-pause'
6
7
  import { run_board_plan } from './run-board-plan'
7
8
 
8
9
  // `run:board`'s plan read, shared the way the drive's assignment and the arrival probe share
@@ -83,6 +84,7 @@ const context_schema = z.object({
83
84
  })
84
85
 
85
86
  const board_plan_schema = z.object({
87
+ pause_reasons: map_of(run_board_pause.record_schema).optional(),
86
88
  decision_questions: map_of(z.string()).optional(),
87
89
  decision_waits: map_of(z.string()).optional(),
88
90
  human_merge_prs: map_of(z.number()).optional(),
@@ -57,8 +57,17 @@ function value_of(reason: RowReason, header: BoardHeader): string {
57
57
 
58
58
  // The row's reason after its title, `cut` columns given up as `reason_text` gives them, its pull
59
59
  // request linked.
60
+ function evidence_linked(text: string, url: string, header: BoardHeader): string {
61
+ return header.comment_link?.(text, url) ?? text
62
+ }
63
+
60
64
  function tail_of(row: BoardRow, cut: number, header: BoardHeader): string {
61
- return pr_linked(run_board_render_title.reason_text(row, cut) ?? '', row.reason?.pr, header)
65
+ const text = run_board_render_title.reason_text(row, cut) ?? ''
66
+ const url = row.reason?.evidence_url
67
+
68
+ return url === undefined
69
+ ? pr_linked(text, row.reason?.pr, header)
70
+ : evidence_linked(text, url, header)
62
71
  }
63
72
 
64
73
  // A finished row's end, `MM-DD HH:MM`, emphasized while fresh (joshuafolkken/kit#4292); blank where
@@ -1,6 +1,7 @@
1
1
  import { run_board_fit } from './run-board-fit'
2
2
  import { run_board_labels } from './run-board-labels'
3
3
  import type { BoardRow } from './run-board-layout'
4
+ import { run_board_pause } from './run-board-pause'
4
5
 
5
6
  // A row's title and the reason it makes room for — pure. A title is cut to the title column; a row
6
7
  // that says why it waits, or draws a tail, keeps its line on a narrow pane, its title giving up the
@@ -22,7 +23,13 @@ interface RowCut {
22
23
  const WHOLE: RowCut = { title_limit: TITLE_LIMIT, reason_cut: 0 }
23
24
  const WHOLE_TAIL_STATES: ReadonlySet<string> = new Set(['stopped', 'parked', 'human'])
24
25
 
26
+ function has_short_reason(reason: BoardRow['reason']): boolean {
27
+ return reason?.evidence_url !== undefined || reason?.tail === run_board_pause.FALLBACK
28
+ }
29
+
25
30
  function keeps_tail(row: BoardRow): boolean {
31
+ if (has_short_reason(row.reason)) return false
32
+
26
33
  return WHOLE_TAIL_STATES.has(row.state) || row.reason?.icon === run_board_labels.STATE_ICONS.human
27
34
  }
28
35
 
@@ -1,3 +1,4 @@
1
+ import type { IssueOutcome } from '#scripts/issue/issue-outcome'
1
2
  import type { ItemState, ItemStatus } from './run-board-status'
2
3
 
3
4
  // What a child keeps of its run when it settles into a state other than running — shared by the
@@ -25,9 +26,22 @@ function kept_of(
25
26
  // The status a child settles into: its start and the track it had reached, so a settled row still
26
27
  // draws how it got there.
27
28
  function settled_as(previous: ItemStatus | undefined, state: ItemState): ItemStatus {
28
- return { state, started_ms: previous?.started_ms, ...kept_of(previous) }
29
+ return {
30
+ state,
31
+ started_ms: previous?.started_ms,
32
+ ...kept_of(previous),
33
+ ...(previous?.outcome !== undefined && { outcome: previous.outcome }),
34
+ }
35
+ }
36
+
37
+ const OUTCOME_STATES: ReadonlySet<ItemState> = new Set(['done', 'already_done', 'withdrawn'])
38
+
39
+ function with_outcome(status: ItemStatus, outcome: IssueOutcome | undefined): ItemStatus {
40
+ return outcome === undefined || !OUTCOME_STATES.has(status.state)
41
+ ? status
42
+ : { ...status, outcome }
29
43
  }
30
44
 
31
- const run_board_settle = { relaunch_of, settled_as }
45
+ const run_board_settle = { relaunch_of, settled_as, with_outcome }
32
46
 
33
47
  export { run_board_settle }
@@ -1,4 +1,5 @@
1
1
  import { PROJECT_ROOT } from '#scripts/init/init-paths'
2
+ import { issue_outcome } from '#scripts/issue/issue-outcome'
2
3
  import { stamp_file } from '#scripts/josh/stamp-file'
3
4
  import { z } from 'zod'
4
5
  import type { ClosedIssue } from './run-board-closed'
@@ -38,6 +39,9 @@ const label_names_schema = z.array(z.string())
38
39
  // A close time JSON dropped is read back as unknown.
39
40
  const closed_issue_schema = z
40
41
  .object({
42
+ outcome: z
43
+ .object({ summary: issue_outcome.summary_schema, url: issue_outcome.url_schema })
44
+ .optional(),
41
45
  title: z.string(),
42
46
  labels: label_names_schema,
43
47
  closed_ms: z.number().optional(),
@@ -1,4 +1,5 @@
1
1
  import type { AgentResult } from '#scripts/agent/agent-event'
2
+ import type { IssueOutcome } from '#scripts/issue/issue-outcome'
2
3
  import type { Span } from '#scripts/lane/lane-spans'
3
4
  import type { PrChecks } from '#scripts/run/event/run-event-checks'
4
5
  import { run_event_retry } from '#scripts/run/event/run-event-retry'
@@ -40,6 +41,7 @@ type ItemState =
40
41
  | 'unknown'
41
42
 
42
43
  interface ItemStatus {
44
+ outcome?: IssueOutcome | undefined
43
45
  state: ItemState
44
46
  // When the child first launched in this run — a re-dispatch or a restart does not move it.
45
47
  started_ms?: number | undefined
@@ -395,7 +397,15 @@ function settle_closed(
395
397
  statuses: ReadonlyMap<number, ItemStatus>,
396
398
  read: OpenRead,
397
399
  ): ReadonlyMap<number, ItemStatus> {
398
- return new Map([...statuses].map(([issue, status]) => [issue, settled(issue, status, read)]))
400
+ return new Map(
401
+ [...statuses].map(([issue, status]) => {
402
+ const closed = read.closed.get(issue)
403
+ const outcome =
404
+ closed === undefined || is_closed_before_launch(status, closed) ? undefined : closed.outcome
405
+
406
+ return [issue, run_board_settle.with_outcome(settled(issue, status, read), outcome)]
407
+ }),
408
+ )
399
409
  }
400
410
 
401
411
  function is_run_stop(event: RunEvent | undefined): boolean {
@@ -129,7 +129,8 @@ function report_relaunch_failure(target: string, note: string): number {
129
129
  // A pre-gate resume drives the gate, commit, PR and merge — the mechanical
130
130
  // ship/bookkeeping region, lowered — while an implementation resume keeps the role default. The
131
131
  // phase-aware profile is `agent_argv.resume_argv`'s; a person's `JOSH_WORKER_EFFORT` still wins over it,
132
- // and a pre-gate resume moves to the ship model — Sonnet, or `JOSH_WORKER_SHIP_MODEL` when that is set.
132
+ // and a pre-gate resume moves to the ship model — Sonnet, or `JOSH_WORKER_SHIP_MODEL` when that is set,
133
+ // never above the Issue's `josh.worker` profile (`agent-ship-cap.ts`).
133
134
  async function relaunch(target: string, lane: LaneInfo, phase: string): Promise<number> {
134
135
  const notes: Array<string> = []
135
136
  const result = await lane_relaunch.resume(lane, phase, (note) => {