@joshuafolkken/kit 1.3000.0 → 1.3044.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 (691) 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/.claude/skills/workflow-commands/progress-watcher.md +10 -8
  4. package/dist/.inputs-verified.json +1 -1
  5. package/dist/commands/adopt.js +12 -12
  6. package/dist/commands/auto-ok-judge-cli.js +18 -14
  7. package/dist/commands/auto-ok-main.js +42 -40
  8. package/dist/commands/backlog-budget-main.js +3 -3
  9. package/dist/commands/backlog-drive-cli.js +276 -188
  10. package/dist/commands/backlog-next-main.js +77 -75
  11. package/dist/commands/backlog-offer-main.js +80 -78
  12. package/dist/commands/backlog-plan-cli.js +96 -97
  13. package/dist/commands/backlog-triage-cli.js +94 -92
  14. package/dist/commands/backlogrun-cli.js +212 -206
  15. package/dist/commands/behavior-cli.js +12 -13
  16. package/dist/commands/bump-version-main.js +2 -2
  17. package/dist/commands/bytes-command.js +61 -22
  18. package/dist/commands/check-related.js +61 -60
  19. package/dist/commands/{chunk-X7PN54LZ.js → chunk-22DVQCP6.js} +16 -6
  20. package/dist/commands/{chunk-UTBVTCQN.js → chunk-24OATKOF.js} +301 -168
  21. package/dist/commands/{chunk-7GHOFHUS.js → chunk-24ZDAWML.js} +3 -3
  22. package/dist/commands/{chunk-HBNB3TLG.js → chunk-2BB5ZR2F.js} +13 -7
  23. package/dist/commands/{chunk-F22G3VDB.js → chunk-2BC33QPY.js} +1 -1
  24. package/dist/commands/{chunk-72EW7AVI.js → chunk-2BJJUTZA.js} +2 -2
  25. package/dist/commands/{chunk-XDQOWUVT.js → chunk-2CXT6MBR.js} +4 -4
  26. package/dist/commands/{chunk-TVJE67O2.js → chunk-2EZTYLO4.js} +6 -6
  27. package/dist/commands/{chunk-JLYW7CP6.js → chunk-2PHOLX62.js} +1 -1
  28. package/dist/commands/{chunk-6EU5ZCDP.js → chunk-2QM72JCJ.js} +23 -87
  29. package/dist/commands/{chunk-EFHSCUFN.js → chunk-2VFPUPSG.js} +2 -2
  30. package/dist/commands/{chunk-ATRMETHT.js → chunk-2XAH3MHV.js} +1 -1
  31. package/dist/commands/{chunk-T2E724HN.js → chunk-34JJYCIY.js} +2 -2
  32. package/dist/commands/{chunk-REMKUFAC.js → chunk-34KZDKQJ.js} +1 -1
  33. package/dist/commands/{chunk-GK2KY4MO.js → chunk-352KLSFX.js} +3 -3
  34. package/dist/commands/{chunk-7S6VRZOH.js → chunk-3AEDZZNL.js} +5 -5
  35. package/dist/commands/{chunk-KVJDDECB.js → chunk-3B2HEFNO.js} +2 -2
  36. package/dist/commands/{chunk-HZBTXKT2.js → chunk-3Z425MM3.js} +2 -2
  37. package/dist/commands/{chunk-J3G2R64I.js → chunk-3ZOX4G4U.js} +3 -3
  38. package/dist/commands/{chunk-LRS2OS5J.js → chunk-452HWOJ7.js} +2 -2
  39. package/dist/commands/{chunk-HRT4KWP4.js → chunk-475EFIJV.js} +1 -1
  40. package/dist/commands/{chunk-4HBVHYNL.js → chunk-47UZB54M.js} +3 -3
  41. package/dist/commands/{chunk-H4LYG37R.js → chunk-4DN4XVPL.js} +6 -6
  42. package/dist/commands/{chunk-TMLNI3YW.js → chunk-4HERA2GY.js} +1 -1
  43. package/dist/commands/{chunk-W6V4DWC5.js → chunk-4JI35CVO.js} +1 -1
  44. package/dist/commands/{chunk-YT342DRV.js → chunk-4L4LNWZ7.js} +2 -2
  45. package/dist/commands/{chunk-ZZAH3YQP.js → chunk-4N32QKJZ.js} +6 -6
  46. package/dist/commands/{chunk-GDUK5YPO.js → chunk-4NRSFLG7.js} +12 -12
  47. package/dist/commands/{chunk-O5QZ2S6X.js → chunk-4OKRPAUT.js} +4 -4
  48. package/dist/commands/{chunk-QDFDB4CF.js → chunk-4Q64PG46.js} +13 -13
  49. package/dist/commands/{chunk-HO52D6JY.js → chunk-4UDTQVDD.js} +14 -14
  50. package/dist/commands/{chunk-HPVLI26Z.js → chunk-4WR2LEZL.js} +6 -6
  51. package/dist/commands/{chunk-DP7WIGQ4.js → chunk-4ZJOC6OK.js} +4 -4
  52. package/dist/commands/{chunk-WTRDWEUQ.js → chunk-4ZQM4I7R.js} +12 -12
  53. package/dist/commands/{chunk-OTZJXU2R.js → chunk-54X37JEJ.js} +8 -8
  54. package/dist/commands/{chunk-A5V7EWIX.js → chunk-56KW5EOK.js} +2 -2
  55. package/dist/commands/chunk-5CG3XU3O.js +74 -0
  56. package/dist/commands/{chunk-FC33R5UN.js → chunk-5ESZLHDZ.js} +13 -15
  57. package/dist/commands/{chunk-OVA7STGP.js → chunk-5FBRMARM.js} +9 -9
  58. package/dist/commands/{chunk-SK2LJBFS.js → chunk-5PCK53WP.js} +3 -3
  59. package/dist/commands/{chunk-6NV2F7QH.js → chunk-5RG4S66L.js} +1 -1
  60. package/dist/commands/{chunk-JOARHU3M.js → chunk-5UJGACVN.js} +1 -1
  61. package/dist/commands/{chunk-NKOET4FB.js → chunk-5Y7B7FDL.js} +2 -2
  62. package/dist/commands/{chunk-XMBRXCIE.js → chunk-5Z6E5ZUV.js} +4 -4
  63. package/dist/commands/{chunk-RZ4OKKPM.js → chunk-5ZNUH4LV.js} +2 -2
  64. package/dist/commands/{chunk-7CHCZBNF.js → chunk-6CFHLMKM.js} +4 -4
  65. package/dist/commands/{chunk-TXXYC7EV.js → chunk-6DDK5XWK.js} +1 -1
  66. package/dist/commands/{chunk-2TQXCH2K.js → chunk-6GQX752S.js} +3 -3
  67. package/dist/commands/{chunk-RY6ZDHKB.js → chunk-6MAZ55GF.js} +107 -84
  68. package/dist/commands/{chunk-SNFLV7VV.js → chunk-6RUWU2SB.js} +2 -2
  69. package/dist/commands/{chunk-D4SZK7H2.js → chunk-6TIVDEKG.js} +2 -2
  70. package/dist/commands/{chunk-RIQ75QWR.js → chunk-6UCWAFQY.js} +55 -43
  71. package/dist/commands/{chunk-4D5KWMFL.js → chunk-6YURRFRU.js} +19 -19
  72. package/dist/commands/{chunk-7MOZEEFJ.js → chunk-6YVURZAJ.js} +1 -1
  73. package/dist/commands/{chunk-73JOEKIC.js → chunk-6Z4YZG7P.js} +5 -5
  74. package/dist/commands/{chunk-NJ53AWJU.js → chunk-77BIN247.js} +9 -9
  75. package/dist/commands/{chunk-MZHOPRI6.js → chunk-7ABHNNY3.js} +7 -7
  76. package/dist/commands/{chunk-6WTVAL4D.js → chunk-7C7FOKJK.js} +1 -1
  77. package/dist/commands/{chunk-KVSSLDA3.js → chunk-7HAGC6SW.js} +5 -5
  78. package/dist/commands/{chunk-IG22Y5MA.js → chunk-7KKUFLH5.js} +1 -1
  79. package/dist/commands/{chunk-ZQ3CKRMP.js → chunk-7MJYLUF4.js} +2 -2
  80. package/dist/commands/{chunk-6UGFS3EU.js → chunk-7NHZCI5Y.js} +11 -11
  81. package/dist/commands/{chunk-FB3D7CX5.js → chunk-7OQ56DVW.js} +5 -7
  82. package/dist/commands/{chunk-EK327QOS.js → chunk-7VWPGTZO.js} +10 -10
  83. package/dist/commands/{chunk-WSOF74K4.js → chunk-7YZXS3AK.js} +3 -3
  84. package/dist/commands/{chunk-N6TYL3B2.js → chunk-AAUDI7WJ.js} +2 -2
  85. package/dist/commands/{chunk-3GF52L5F.js → chunk-AC26ZUG5.js} +12 -24
  86. package/dist/commands/{chunk-EK2Y6B4X.js → chunk-ACZ52JPI.js} +7 -7
  87. package/dist/commands/{chunk-VD72V5VX.js → chunk-AJ65WNJB.js} +4 -4
  88. package/dist/commands/{chunk-MYWRGF5A.js → chunk-AK7SEO4Y.js} +2 -2
  89. package/dist/commands/{chunk-IBEKFLWG.js → chunk-ALDAS2WG.js} +9 -9
  90. package/dist/commands/{chunk-W32DIQEP.js → chunk-ARFBIJFS.js} +1 -1
  91. package/dist/commands/{chunk-F3WBEEYC.js → chunk-AVVMDVGO.js} +5 -5
  92. package/dist/commands/chunk-AXXEMVRJ.js +23 -0
  93. package/dist/commands/{chunk-GIGKMIPQ.js → chunk-B3M5WSGN.js} +1 -1
  94. package/dist/commands/{chunk-4Z5723GA.js → chunk-B7ZNIEDV.js} +5 -4
  95. package/dist/commands/{chunk-B3XFOHDX.js → chunk-BCUDQWYK.js} +10 -4
  96. package/dist/commands/{chunk-PR3JCPP7.js → chunk-BMKWSWWE.js} +1 -1
  97. package/dist/commands/{chunk-RZJAUVMI.js → chunk-BMM4RHCG.js} +2 -2
  98. package/dist/commands/{chunk-LAKVPOJQ.js → chunk-BMTYUJNT.js} +2 -2
  99. package/dist/commands/{chunk-DAJCUSPG.js → chunk-BRHPRDDV.js} +3 -3
  100. package/dist/commands/{chunk-UZAU6UI6.js → chunk-BRUBX64M.js} +2 -2
  101. package/dist/commands/{chunk-BFLFPKQQ.js → chunk-BTZJDHQT.js} +4 -4
  102. package/dist/commands/{chunk-AI5K4QJO.js → chunk-BYFC6MD2.js} +1 -1
  103. package/dist/commands/{chunk-JGTLNFFE.js → chunk-BYGJ3BCJ.js} +10 -10
  104. package/dist/commands/{chunk-5HWZFL4D.js → chunk-C54QXJD6.js} +51 -18
  105. package/dist/commands/{chunk-LMS6N6GE.js → chunk-CBAKBWSZ.js} +7 -7
  106. package/dist/commands/{chunk-7EAMUVIO.js → chunk-CFHRNTE5.js} +1 -1
  107. package/dist/commands/{chunk-UIWAMLQH.js → chunk-CGYDIYHD.js} +2 -2
  108. package/dist/commands/{chunk-4QYW2IL7.js → chunk-CHKYPF5O.js} +1 -1
  109. package/dist/commands/{chunk-5HCPSV45.js → chunk-CJBW6BWG.js} +8 -8
  110. package/dist/commands/chunk-CKUKK7JG.js +252 -0
  111. package/dist/commands/{chunk-4PES3BAA.js → chunk-CMHGDCGN.js} +3 -3
  112. package/dist/commands/{chunk-F6OWP2AY.js → chunk-CNGTHSUS.js} +22 -22
  113. package/dist/commands/{chunk-B2EA2HCY.js → chunk-COGKULQH.js} +4 -4
  114. package/dist/commands/{chunk-S7XWXG4M.js → chunk-CP2J4RV2.js} +175 -81
  115. package/dist/commands/{chunk-YGDNUTTI.js → chunk-CQUZ6TNQ.js} +2 -2
  116. package/dist/commands/chunk-CQZI7RIK.js +72 -0
  117. package/dist/commands/chunk-CVJHQOI3.js +153 -0
  118. package/dist/commands/{chunk-2MJ4OCDL.js → chunk-CWCKCZS6.js} +1 -1
  119. package/dist/commands/chunk-D5OHVIPM.js +17 -0
  120. package/dist/commands/{chunk-TPKFVVJQ.js → chunk-D6D6WQR6.js} +2 -2
  121. package/dist/commands/{chunk-5PAEXYIY.js → chunk-D7JRJI44.js} +69 -6
  122. package/dist/commands/{chunk-LOSOLCCW.js → chunk-D7OAU32Z.js} +1 -1
  123. package/dist/commands/{chunk-VZHC2I3T.js → chunk-DAAX7XDS.js} +8 -8
  124. package/dist/commands/{chunk-OHVAEJSM.js → chunk-DEZF7QZZ.js} +5 -5
  125. package/dist/commands/{chunk-CA6F5OXK.js → chunk-DYZOOWVW.js} +124 -21
  126. package/dist/commands/{chunk-TKGBF75Y.js → chunk-EDKOSZ3K.js} +5 -5
  127. package/dist/commands/{chunk-YPNTORQD.js → chunk-EFDVE5P5.js} +1 -1
  128. package/dist/commands/{chunk-EH3LVYOX.js → chunk-EGIHAEMT.js} +1 -1
  129. package/dist/commands/{chunk-7P4X4TQL.js → chunk-EKLU6QR7.js} +4 -4
  130. package/dist/commands/{chunk-ILQZFUDC.js → chunk-ELY76WAR.js} +2 -2
  131. package/dist/commands/{chunk-2VLHFILE.js → chunk-EM3HAZF6.js} +2 -2
  132. package/dist/commands/{chunk-F2HFWLQR.js → chunk-EMTZAGT5.js} +20 -1
  133. package/dist/commands/{chunk-GA4VIFHD.js → chunk-ERG4QRNG.js} +2 -2
  134. package/dist/commands/{chunk-ICEMFE2V.js → chunk-EUGNQCYK.js} +1 -1
  135. package/dist/commands/{chunk-3HU3LPIF.js → chunk-EXDFKKMH.js} +2 -2
  136. package/dist/commands/{chunk-ISPBJVXM.js → chunk-EXWB34R2.js} +7 -7
  137. package/dist/commands/{chunk-FNOSSXLG.js → chunk-EYMPBHDN.js} +2 -2
  138. package/dist/commands/{chunk-7V5UVKFG.js → chunk-EZ7IPKIH.js} +2 -2
  139. package/dist/commands/{chunk-KQWSENCT.js → chunk-F6IQHZYY.js} +3 -3
  140. package/dist/commands/{chunk-7ZECP3J6.js → chunk-FDS65XOJ.js} +5 -5
  141. package/dist/commands/{chunk-KXRFGPZD.js → chunk-FGG7V473.js} +21 -5
  142. package/dist/commands/{chunk-PZ6VWHOO.js → chunk-FHFWNNUC.js} +1 -1
  143. package/dist/commands/{chunk-XBRD2BDL.js → chunk-FJX7AENO.js} +2 -2
  144. package/dist/commands/{chunk-M42SLJCD.js → chunk-FKZ5E4JD.js} +4 -4
  145. package/dist/commands/{chunk-F2J6DGDM.js → chunk-FMZWRDKH.js} +8 -8
  146. package/dist/commands/{chunk-DSBK66US.js → chunk-FOKCRIAN.js} +10 -10
  147. package/dist/commands/{chunk-OI7KM4K3.js → chunk-FQGWO2ZH.js} +2 -2
  148. package/dist/commands/{chunk-2IESYBZH.js → chunk-FURNDIT3.js} +3 -3
  149. package/dist/commands/chunk-FVDQNMP6.js +93 -0
  150. package/dist/commands/{chunk-PZU6FZO6.js → chunk-FWU3H4TX.js} +1 -1
  151. package/dist/commands/{chunk-RYZ3RQRH.js → chunk-G3HBYHFA.js} +1 -1
  152. package/dist/commands/{chunk-HCA5QG2U.js → chunk-G4E4M2P4.js} +2 -2
  153. package/dist/commands/{chunk-VJLZ3IQQ.js → chunk-G5KSL2Q2.js} +1 -1
  154. package/dist/commands/{chunk-Y5ZW3KN5.js → chunk-G6XC7V6Y.js} +2 -2
  155. package/dist/commands/{chunk-73EBNBUW.js → chunk-GCPP5XIG.js} +1 -1
  156. package/dist/commands/{chunk-Q3463XNL.js → chunk-GITT5A5A.js} +3 -3
  157. package/dist/commands/{chunk-T2IO4LEB.js → chunk-GLC47H7I.js} +10 -10
  158. package/dist/commands/{chunk-GA6E4VGO.js → chunk-GUR54ELE.js} +1 -1
  159. package/dist/commands/{chunk-7IT23HIR.js → chunk-GY4DMCKS.js} +2 -2
  160. package/dist/commands/{chunk-PZ4ITSLG.js → chunk-H6JQRHDC.js} +3 -3
  161. package/dist/commands/{chunk-ZHZSZNE2.js → chunk-HATKF6VX.js} +2 -2
  162. package/dist/commands/{chunk-ELWNRE6E.js → chunk-HH3CVIFU.js} +5 -5
  163. package/dist/commands/{chunk-7GMTJDO2.js → chunk-HHMMGDMP.js} +6 -6
  164. package/dist/commands/{chunk-VD5674LW.js → chunk-HI5WPM6C.js} +2 -2
  165. package/dist/commands/{chunk-JUUBDYFZ.js → chunk-HQSWPRUF.js} +4 -4
  166. package/dist/commands/{chunk-ZAJD6T6E.js → chunk-HVCQYZVD.js} +2 -2
  167. package/dist/commands/chunk-HWEZRNPL.js +66 -0
  168. package/dist/commands/{chunk-J6GIVMXI.js → chunk-HX3FFIO5.js} +18 -3
  169. package/dist/commands/{chunk-GU5ML3Y3.js → chunk-HXDTA5VU.js} +13 -68
  170. package/dist/commands/{chunk-BNXE3NVB.js → chunk-I2KCGKJI.js} +1 -1
  171. package/dist/commands/{chunk-LC7SBONO.js → chunk-IAD4WLLI.js} +1 -1
  172. package/dist/commands/{chunk-WWC5L3AO.js → chunk-IB5TT73I.js} +2 -2
  173. package/dist/commands/{chunk-HOSZITJM.js → chunk-IBAYXCMU.js} +2 -2
  174. package/dist/commands/chunk-IGDJNXX2.js +49 -0
  175. package/dist/commands/{chunk-OJ4LGBVD.js → chunk-ILIITIMQ.js} +3 -3
  176. package/dist/commands/{chunk-CUR2WNYB.js → chunk-IRGDMSTI.js} +3 -3
  177. package/dist/commands/{chunk-PZTWQYRI.js → chunk-IYJEBWW5.js} +3 -3
  178. package/dist/commands/{chunk-A3D2XHOJ.js → chunk-J22PSIXR.js} +40 -9
  179. package/dist/commands/{chunk-O27H6NN6.js → chunk-J66YBAAM.js} +3 -5
  180. package/dist/commands/{chunk-P6RGQXHI.js → chunk-J6WKZRV2.js} +2 -2
  181. package/dist/commands/{chunk-NFEBQED3.js → chunk-J7IO3AYH.js} +2 -2
  182. package/dist/commands/{chunk-T57W3UWK.js → chunk-JAKC2BHX.js} +1 -1
  183. package/dist/commands/{chunk-3EO2XN3A.js → chunk-JCAQ7B6J.js} +4 -4
  184. package/dist/commands/{chunk-QQZOQ7AM.js → chunk-JFLFGLE4.js} +1 -1
  185. package/dist/commands/{chunk-ZDSDPKCD.js → chunk-JIGBNCDR.js} +1 -1
  186. package/dist/commands/{chunk-Q5N2J2UF.js → chunk-JJHWTFWQ.js} +5 -7
  187. package/dist/commands/{chunk-EI6JG5DF.js → chunk-JKOGWGQM.js} +1 -1
  188. package/dist/commands/{chunk-RK4HE5NW.js → chunk-JM6EVOFN.js} +4 -4
  189. package/dist/commands/{chunk-EBNIX2TC.js → chunk-JV24VP2O.js} +1 -1
  190. package/dist/commands/{chunk-BCK5LW4F.js → chunk-JVKXJ763.js} +3 -3
  191. package/dist/commands/{chunk-D5TAR6TV.js → chunk-JZHY7D6D.js} +1 -1
  192. package/dist/commands/{chunk-CRNPPKP2.js → chunk-JZK33TA5.js} +1 -1
  193. package/dist/commands/{chunk-UOAG2XQT.js → chunk-K275REYP.js} +3 -3
  194. package/dist/commands/{chunk-HESMKHEB.js → chunk-K4G3HOKS.js} +2 -2
  195. package/dist/commands/{chunk-L6XN3EXI.js → chunk-K64EIHD2.js} +1 -1
  196. package/dist/commands/{chunk-RINVPTA2.js → chunk-KCFOP5RI.js} +28 -28
  197. package/dist/commands/{chunk-O26Y2FOJ.js → chunk-KGE4AS2Y.js} +1 -1
  198. package/dist/commands/{chunk-EWA72KO7.js → chunk-KK2SL42W.js} +2 -2
  199. package/dist/commands/{chunk-MMXZKLDU.js → chunk-KK7TEL5G.js} +10 -4
  200. package/dist/commands/{chunk-UEURNXE5.js → chunk-KKIMVXAP.js} +2 -2
  201. package/dist/commands/{chunk-MAGJFH5T.js → chunk-KODXWMBX.js} +6 -6
  202. package/dist/commands/{chunk-D4HNS43Q.js → chunk-KPSKWTOS.js} +17 -17
  203. package/dist/commands/{chunk-VFJYOAOQ.js → chunk-KTV2HNWB.js} +2 -2
  204. package/dist/commands/{chunk-OWR2TCOY.js → chunk-KWYQR5MK.js} +5 -5
  205. package/dist/commands/{chunk-FNQW6NY7.js → chunk-KXK2A2HB.js} +6 -2
  206. package/dist/commands/{chunk-O5FVBIRI.js → chunk-KZ5BBBMO.js} +5 -5
  207. package/dist/commands/{chunk-JUJFIATR.js → chunk-KZ7HD37E.js} +6 -6
  208. package/dist/commands/{chunk-2YCKPX3A.js → chunk-KZZWPUJW.js} +1 -1
  209. package/dist/commands/{chunk-MYNM3YMR.js → chunk-L7DAL54N.js} +3 -3
  210. package/dist/commands/{chunk-NOXLKIPR.js → chunk-LAR76BFA.js} +1 -1
  211. package/dist/commands/{chunk-ZA3W73PF.js → chunk-LB557AHJ.js} +3 -3
  212. package/dist/commands/{chunk-LYEKT3IN.js → chunk-LEB2VP7F.js} +1 -1
  213. package/dist/commands/{chunk-WQJ7O3C3.js → chunk-LJXKVLYI.js} +1 -1
  214. package/dist/commands/{chunk-CHX4QTP4.js → chunk-LJZERYLG.js} +1 -1
  215. package/dist/commands/{chunk-PF22VUWB.js → chunk-LOOFYHUM.js} +76 -26
  216. package/dist/commands/{chunk-HIPO6HUG.js → chunk-LPSULLNK.js} +1 -1
  217. package/dist/commands/{chunk-G47ZNQVG.js → chunk-LR22UK5W.js} +1 -1
  218. package/dist/commands/{chunk-SV4FHQE7.js → chunk-LT7QSHR4.js} +14 -14
  219. package/dist/commands/{chunk-HIB5G2X6.js → chunk-LUXWDMKI.js} +7 -7
  220. package/dist/commands/{chunk-XH6BGVVP.js → chunk-LX7TIEMI.js} +9 -36
  221. package/dist/commands/{chunk-OGNTJ5JB.js → chunk-LYO6TX5L.js} +1 -1
  222. package/dist/commands/{chunk-JLREFWJ4.js → chunk-LZ5QXE5N.js} +6 -6
  223. package/dist/commands/{chunk-WW3TX742.js → chunk-LZPPSOTP.js} +4 -4
  224. package/dist/commands/{chunk-5WIZR5SC.js → chunk-M4UV3BEV.js} +11 -11
  225. package/dist/commands/{chunk-LNBUIOK6.js → chunk-M6JDU5EK.js} +4 -4
  226. package/dist/commands/{chunk-VZSJCFRT.js → chunk-MFBNNTBM.js} +4 -4
  227. package/dist/commands/{chunk-KHWTJ4F7.js → chunk-MI2OS6TL.js} +3 -3
  228. package/dist/commands/{chunk-VZCQZFPH.js → chunk-MLW4S35K.js} +19 -8
  229. package/dist/commands/{chunk-RIUPRMLW.js → chunk-MN425CU6.js} +1 -1
  230. package/dist/commands/{chunk-7W3D3WRW.js → chunk-MOIOSCZM.js} +2 -2
  231. package/dist/commands/{chunk-3BNNMJOT.js → chunk-MRORPFSO.js} +20 -320
  232. package/dist/commands/{chunk-LA5WTOAM.js → chunk-MUGTOJUL.js} +12 -12
  233. package/dist/commands/{chunk-L6LU2633.js → chunk-MVHPRYHE.js} +1 -1
  234. package/dist/commands/{chunk-EKCKCX5S.js → chunk-MWO6FOSZ.js} +123 -21
  235. package/dist/commands/{chunk-AVUGMOHZ.js → chunk-N7QTMTST.js} +2 -2
  236. package/dist/commands/{chunk-LMSS4ARB.js → chunk-NDBX7LSS.js} +1 -1
  237. package/dist/commands/{chunk-BEE7OAQ5.js → chunk-NDWZTWXV.js} +21 -2
  238. package/dist/commands/{chunk-6TESOL3L.js → chunk-NEGJ77RV.js} +7 -7
  239. package/dist/commands/{chunk-LCEJXF7A.js → chunk-NEGRE5VW.js} +4 -4
  240. package/dist/commands/{chunk-IXX4SXIP.js → chunk-NFPD2P3V.js} +1 -1
  241. package/dist/commands/chunk-NHIW7JE6.js +335 -0
  242. package/dist/commands/{chunk-CJSFC5YI.js → chunk-NILSN7A4.js} +7 -7
  243. package/dist/commands/{chunk-W4J6YTFE.js → chunk-NOLFSPOB.js} +2 -2
  244. package/dist/commands/chunk-NT67QTZO.js +65 -0
  245. package/dist/commands/{chunk-NJT5L6IC.js → chunk-NU7W6QGT.js} +33 -4
  246. package/dist/commands/chunk-NUR4FQHM.js +21 -0
  247. package/dist/commands/{chunk-OKKQI4ZG.js → chunk-OAAVY2JK.js} +1 -1
  248. package/dist/commands/chunk-OF4BY4N7.js +32 -0
  249. package/dist/commands/{chunk-W47I2KDY.js → chunk-OGS2DK7I.js} +3 -3
  250. package/dist/commands/{chunk-MS6Q3Z7V.js → chunk-OIPV3PWW.js} +6 -6
  251. package/dist/commands/{chunk-T33QDAWD.js → chunk-OIX2363L.js} +1 -1
  252. package/dist/commands/{chunk-GPMSYXYO.js → chunk-OJ65BZBV.js} +283 -15
  253. package/dist/commands/{chunk-34LAULSC.js → chunk-OKZWEVR4.js} +3 -3
  254. package/dist/commands/{chunk-2CXAVVST.js → chunk-OL6IF4JC.js} +1 -1
  255. package/dist/commands/{chunk-6JVNRY5A.js → chunk-OMPRILFH.js} +1 -1
  256. package/dist/commands/{chunk-VGHSZLYQ.js → chunk-OOWGH2RG.js} +1 -1
  257. package/dist/commands/{chunk-ERGZPWKP.js → chunk-OP2RFVLS.js} +1 -1
  258. package/dist/commands/{chunk-UU6GCJGM.js → chunk-ORKVN2LO.js} +2 -2
  259. package/dist/commands/{chunk-RHII5XI6.js → chunk-OSBWXZJ4.js} +24 -24
  260. package/dist/commands/{chunk-D3SHCUBC.js → chunk-OVWPZDWP.js} +2 -2
  261. package/dist/commands/{chunk-Z4HYBFZD.js → chunk-OWYK2BEJ.js} +108 -46
  262. package/dist/commands/{chunk-P4O67FP5.js → chunk-OX3VQLV2.js} +6 -6
  263. package/dist/commands/{chunk-L6TU7FC2.js → chunk-OZJP77UM.js} +4 -4
  264. package/dist/commands/{chunk-SNO7CY2B.js → chunk-P3H3DKTE.js} +2 -2
  265. package/dist/commands/{chunk-2OIX4JLA.js → chunk-P5SOYWH2.js} +3 -3
  266. package/dist/commands/{chunk-M4PEC7YW.js → chunk-PHLOTUB7.js} +54 -37
  267. package/dist/commands/{chunk-73KBUQKI.js → chunk-PTNQCCIB.js} +2 -2
  268. package/dist/commands/{chunk-4P2LCVGO.js → chunk-PTZEFQUX.js} +8 -8
  269. package/dist/commands/{chunk-DJVMC3U2.js → chunk-Q426ZSZ4.js} +1 -1
  270. package/dist/commands/{chunk-US6X7JXC.js → chunk-Q7EEIOAD.js} +4 -4
  271. package/dist/commands/{chunk-LE7TFPMU.js → chunk-QABRNGQV.js} +2 -2
  272. package/dist/commands/{chunk-NGKB632X.js → chunk-QDFVVRQP.js} +3 -3
  273. package/dist/commands/{chunk-36M2UV6C.js → chunk-QGATHT4S.js} +38 -4
  274. package/dist/commands/{chunk-DIB2Z2OS.js → chunk-QJRVDE7T.js} +1 -1
  275. package/dist/commands/{chunk-KUJQWO6M.js → chunk-QKTTKAXM.js} +2 -2
  276. package/dist/commands/{chunk-DXZW4V7J.js → chunk-QMDKDQKW.js} +3 -3
  277. package/dist/commands/{chunk-VW5SGE7A.js → chunk-QOSC5RKD.js} +1 -1
  278. package/dist/commands/{chunk-ENLWXAHD.js → chunk-QV5FKMOU.js} +1 -1
  279. package/dist/commands/{chunk-32SNWQJP.js → chunk-R2THGPI3.js} +2 -2
  280. package/dist/commands/{chunk-RVHBWSIG.js → chunk-R54Z2Z3X.js} +2 -2
  281. package/dist/commands/{chunk-CJAA5GAF.js → chunk-RG53UFNW.js} +15 -15
  282. package/dist/commands/{chunk-HJKZDDDI.js → chunk-RHKCWJQX.js} +1 -1
  283. package/dist/commands/{chunk-RPDWFUQO.js → chunk-RKIAX4DZ.js} +36 -84
  284. package/dist/commands/{chunk-LE2T3FGJ.js → chunk-RLBFEHHC.js} +2 -4
  285. package/dist/commands/{chunk-5GBZ43UA.js → chunk-RMDLFLPE.js} +1 -1
  286. package/dist/commands/{chunk-U2UH4VM4.js → chunk-RN2YDNLF.js} +2 -2
  287. package/dist/commands/{chunk-GQHUFNXN.js → chunk-RRAIRS2T.js} +1 -1
  288. package/dist/commands/{chunk-DRCTDVI2.js → chunk-RUQY5TS3.js} +3 -3
  289. package/dist/commands/{chunk-WGULS5DA.js → chunk-RW64VHEB.js} +1 -0
  290. package/dist/commands/{chunk-4G7NKNAZ.js → chunk-RXYMJPJB.js} +3 -3
  291. package/dist/commands/{chunk-B33BTNB4.js → chunk-S4M6UWR2.js} +21 -5
  292. package/dist/commands/{chunk-4Q4FXBUQ.js → chunk-SASX3W2M.js} +2 -2
  293. package/dist/commands/{chunk-TIXJY22D.js → chunk-SJ2ZN575.js} +5 -5
  294. package/dist/commands/{chunk-NSZTSCBW.js → chunk-SP7DKYGU.js} +13 -13
  295. package/dist/commands/{chunk-T3FD3Q73.js → chunk-SRG6PKVS.js} +1 -1
  296. package/dist/commands/{chunk-QA22PBCJ.js → chunk-SSL6A3Y4.js} +3 -3
  297. package/dist/commands/{chunk-4BEIYKI2.js → chunk-SV4FZR24.js} +2 -0
  298. package/dist/commands/{chunk-HZSQI6TD.js → chunk-SVTS7ACS.js} +2 -2
  299. package/dist/commands/{chunk-F7XLEK55.js → chunk-SVV4U5AR.js} +1 -1
  300. package/dist/commands/{chunk-RRQFITJE.js → chunk-SXJM4DZ5.js} +1 -1
  301. package/dist/commands/{chunk-OIDMJASD.js → chunk-SYB3M632.js} +1 -1
  302. package/dist/commands/{chunk-UJOZ2MGX.js → chunk-SYOXIKB7.js} +6 -6
  303. package/dist/commands/{chunk-5SB37YDW.js → chunk-SZG5HDNP.js} +3 -3
  304. package/dist/commands/{chunk-R2CF6VZE.js → chunk-T4F33UKZ.js} +4 -4
  305. package/dist/commands/{chunk-ESQEEL4O.js → chunk-TAEGXID2.js} +2 -2
  306. package/dist/commands/chunk-TEPYEUYG.js +585 -0
  307. package/dist/commands/{chunk-LUMCYDGE.js → chunk-TFLHYC2F.js} +2 -2
  308. package/dist/commands/{chunk-V5OIPYA6.js → chunk-TJKM56WJ.js} +4 -4
  309. package/dist/commands/{chunk-CYQ3ZF7R.js → chunk-TLAB552K.js} +86 -13
  310. package/dist/commands/{chunk-ST32OGPY.js → chunk-TP6L4W3W.js} +5 -5
  311. package/dist/commands/{chunk-C26LKDBE.js → chunk-TR7WWYD5.js} +1 -1
  312. package/dist/commands/{chunk-PWYXY46Y.js → chunk-TYNH2R66.js} +15 -15
  313. package/dist/commands/{chunk-AZUE65NT.js → chunk-U5P6G3UV.js} +2 -2
  314. package/dist/commands/{chunk-REPANBLS.js → chunk-U7Y6RKLK.js} +1 -1
  315. package/dist/commands/{chunk-55I7OYHI.js → chunk-UIMMWH7U.js} +1 -1
  316. package/dist/commands/{chunk-72J2G2E7.js → chunk-UKBBWMLE.js} +20 -20
  317. package/dist/commands/{chunk-VTLL6CKO.js → chunk-UNMSZGSG.js} +14 -14
  318. package/dist/commands/chunk-UOVUUVDK.js +18 -0
  319. package/dist/commands/{chunk-JNWHX25C.js → chunk-URDT2O2K.js} +1 -1
  320. package/dist/commands/{chunk-FGZQSSGH.js → chunk-UREXZJDB.js} +1 -1
  321. package/dist/commands/{chunk-O4WBADCX.js → chunk-UTHUX7VU.js} +3 -3
  322. package/dist/commands/{chunk-PDDKRHHS.js → chunk-V5OUZFWK.js} +3 -3
  323. package/dist/commands/{chunk-N4O5I55P.js → chunk-VCPGFBMN.js} +8 -8
  324. package/dist/commands/{chunk-WN7NK3NY.js → chunk-VGPIQNDB.js} +1 -1
  325. package/dist/commands/{chunk-HOGFJHBT.js → chunk-VJS2MCLA.js} +1 -1
  326. package/dist/commands/{chunk-4YI4SLRJ.js → chunk-VK6D5CWA.js} +8 -8
  327. package/dist/commands/{chunk-4LWRCPS5.js → chunk-VOF3N4WO.js} +3 -3
  328. package/dist/commands/{chunk-AM44D7NF.js → chunk-VQRT32JB.js} +1 -1
  329. package/dist/commands/{chunk-AS3GWVAN.js → chunk-VQVPAVQ3.js} +1 -1
  330. package/dist/commands/{chunk-6VTJO5L2.js → chunk-VV4TQYGD.js} +3 -3
  331. package/dist/commands/{chunk-WIE7VUBE.js → chunk-W7DRUOF7.js} +5 -5
  332. package/dist/commands/{chunk-HH2KDLTP.js → chunk-WAEN2RTT.js} +2 -2
  333. package/dist/commands/{chunk-NKKH3PBE.js → chunk-WB4T3VY2.js} +18 -1
  334. package/dist/commands/{chunk-DNJC7X73.js → chunk-WCEUMOKK.js} +2 -2
  335. package/dist/commands/{chunk-BK6Q4VCA.js → chunk-WTH6NTXU.js} +4 -4
  336. package/dist/commands/{chunk-WG6GYBRJ.js → chunk-WWVYEHQT.js} +2 -1
  337. package/dist/commands/{chunk-P4CWLRT2.js → chunk-X3TNPALI.js} +1 -1
  338. package/dist/commands/{chunk-LZNYHWRO.js → chunk-XC6GG5JR.js} +3 -3
  339. package/dist/commands/{chunk-RI7EQYKL.js → chunk-XFWI6WHH.js} +2 -2
  340. package/dist/commands/{chunk-BY3POLIQ.js → chunk-XHGWMD3L.js} +7 -7
  341. package/dist/commands/{chunk-BPSJSHYD.js → chunk-XI2ABCRX.js} +2 -2
  342. package/dist/commands/{chunk-TS4ZK46L.js → chunk-XKSUBUIH.js} +5 -5
  343. package/dist/commands/{chunk-K7GL3BGI.js → chunk-XPBF5DG3.js} +4 -4
  344. package/dist/commands/{chunk-6SKMZGER.js → chunk-XUMYPESL.js} +20 -8
  345. package/dist/commands/{chunk-QS5USD4T.js → chunk-XXC32PVL.js} +5 -4
  346. package/dist/commands/{chunk-ORSI7Y55.js → chunk-XXN2EZBY.js} +1 -1
  347. package/dist/commands/{chunk-IZVM2TTH.js → chunk-XZQWEVR3.js} +2 -2
  348. package/dist/commands/{chunk-E3CXOVPQ.js → chunk-Y27PTXXI.js} +1 -1
  349. package/dist/commands/{chunk-337QQM4C.js → chunk-Y4EBUI6M.js} +106 -5
  350. package/dist/commands/{chunk-WRX3MINT.js → chunk-YAU3LYNF.js} +1 -1
  351. package/dist/commands/{chunk-JB7R3A4A.js → chunk-YDURQICF.js} +4 -4
  352. package/dist/commands/{chunk-RX5JSPPH.js → chunk-YGFOGA7C.js} +11 -11
  353. package/dist/commands/{chunk-S6SXMBF2.js → chunk-YHJ2AJMA.js} +2 -2
  354. package/dist/commands/{chunk-MVPUQLN5.js → chunk-YM77CF4D.js} +4 -4
  355. package/dist/commands/{chunk-ZYIMQHCB.js → chunk-YNPRJCEO.js} +6 -6
  356. package/dist/commands/{chunk-3UKJFWKS.js → chunk-YTBQAD5W.js} +3 -3
  357. package/dist/commands/{chunk-KIVOZY2J.js → chunk-ZBZ5DDCH.js} +66 -64
  358. package/dist/commands/{chunk-TAPDXK34.js → chunk-ZLRUHSOP.js} +1 -1
  359. package/dist/commands/{chunk-XYAK53TK.js → chunk-ZNR75OXP.js} +2 -1
  360. package/dist/commands/{chunk-CADFBQJJ.js → chunk-ZSOR4ISJ.js} +4 -4
  361. package/dist/commands/{chunk-6NRTLH6I.js → chunk-ZYFHYQA7.js} +1 -1
  362. package/dist/commands/{chunk-Q7TV3OV6.js → chunk-ZZFFSQF4.js} +4 -4
  363. package/dist/commands/{chunk-PDAY76AN.js → chunk-ZZULXNC2.js} +1 -1
  364. package/dist/commands/{chunk-5Y7QQYTU.js → chunk-ZZXO6TFH.js} +1 -1
  365. package/dist/commands/code-symbol-cli.js +4 -4
  366. package/dist/commands/codex-hook-adapter.js +99 -100
  367. package/dist/commands/command-derive.js +10 -10
  368. package/dist/commands/cost-audit-main.js +94 -92
  369. package/dist/commands/cspell-cached.js +24 -23
  370. package/dist/commands/defect-origin-main.js +19 -18
  371. package/dist/commands/defect-report-main.js +15 -14
  372. package/dist/commands/disposition-cli.js +67 -64
  373. package/dist/commands/doctor.js +3 -3
  374. package/dist/commands/document-read-cli.js +89 -9
  375. package/dist/commands/document-section-main.js +89 -9
  376. package/dist/commands/edit-files-cli.js +1 -1
  377. package/dist/commands/effect-audit-cli.js +20 -19
  378. package/dist/commands/epic-audit-main.js +55 -53
  379. package/dist/commands/epic-bundle-main.js +87 -85
  380. package/dist/commands/epic-check.js +16 -15
  381. package/dist/commands/epic-main.js +93 -91
  382. package/dist/commands/epic-next-main.js +51 -49
  383. package/dist/commands/format-edited-cli.js +30 -32
  384. package/dist/commands/format.js +11 -10
  385. package/dist/commands/fresh-machine-cli.js +6 -6
  386. package/dist/commands/git-followup-workflow.js +137 -122
  387. package/dist/commands/git-workflow.js +28 -27
  388. package/dist/commands/github-release-cli.js +26 -3
  389. package/dist/commands/hook-ledger-cli.js +74 -126
  390. package/dist/commands/init-main.js +20 -19
  391. package/dist/commands/inputs.json +1909 -1878
  392. package/dist/commands/issue-ack-cli.js +5 -5
  393. package/dist/commands/issue-already-done-cli.js +63 -58
  394. package/dist/commands/issue-body-cli.js +44 -42
  395. package/dist/commands/issue-cite-main.js +11 -10
  396. package/dist/commands/issue-comment-main.js +15 -11
  397. package/dist/commands/issue-consolidate-cli.js +31 -30
  398. package/dist/commands/issue-file-main.js +114 -110
  399. package/dist/commands/issue-fold-existing-cli.js +88 -86
  400. package/dist/commands/issue-fold-main.js +26 -25
  401. package/dist/commands/issue-lint-main.js +38 -37
  402. package/dist/commands/issue-measured-cli.js +66 -61
  403. package/dist/commands/issue-plan-cli.js +103 -101
  404. package/dist/commands/issue-premise-unmet-cli.js +66 -61
  405. package/dist/commands/issue-priority-cli.js +13 -12
  406. package/dist/commands/issue-read-main.js +18 -17
  407. package/dist/commands/issue-release-class-cli.js +12 -11
  408. package/dist/commands/issue-release-main.js +13 -12
  409. package/dist/commands/issue-scout-main.js +89 -87
  410. package/dist/commands/issue-spill-main.js +114 -110
  411. package/dist/commands/issue-state-main.js +16 -15
  412. package/dist/commands/issue-tick-cli.js +14 -13
  413. package/dist/commands/josh-completion.js +10 -10
  414. package/dist/commands/lane-adopt-cli.js +19 -19
  415. package/dist/commands/lane-breakdown-cli.js +154 -126
  416. package/dist/commands/lane-cli.js +131 -125
  417. package/dist/commands/lane-launch-main.js +17 -17
  418. package/dist/commands/lane-limit-cli.js +81 -79
  419. package/dist/commands/lane-measure-cli.js +246 -130
  420. package/dist/commands/lane-pause-cli.js +15 -15
  421. package/dist/commands/lane-plan-cli.js +108 -101
  422. package/dist/commands/lane-resolve-cli.js +20 -19
  423. package/dist/commands/lane-restart-cli.js +124 -118
  424. package/dist/commands/lane-why-cli.js +85 -82
  425. package/dist/commands/lane-withdraw-cli.js +49 -48
  426. package/dist/commands/latest-corepack.js +3 -3
  427. package/dist/commands/latest-if-required-cli.js +9 -9
  428. package/dist/commands/latest-scope-main.js +5 -5
  429. package/dist/commands/latest-update.js +3 -3
  430. package/dist/commands/lines-command.js +3 -3
  431. package/dist/commands/lint-parallel-main.js +32 -31
  432. package/dist/commands/lint-related.js +79 -60
  433. package/dist/commands/lint-rule.js +32 -31
  434. package/dist/commands/lockfile-policy.js +11 -11
  435. package/dist/commands/main-merge-main.js +5 -5
  436. package/dist/commands/main-sync-main.js +5 -5
  437. package/dist/commands/managed-config-scope-cli.js +3 -3
  438. package/dist/commands/measure-rerun-cli.js +10 -10
  439. package/dist/commands/metrics-command.js +91 -58
  440. package/dist/commands/observation-record-cli.js +3 -3
  441. package/dist/commands/observations-flush-cli.js +27 -25
  442. package/dist/commands/oracle-list-cli.js +2 -2
  443. package/dist/commands/overrides-check.js +4 -4
  444. package/dist/commands/package-scout-cli.js +67 -26
  445. package/dist/commands/plan-consumers-main.js +4 -4
  446. package/dist/commands/plan-scaffold-cli.js +132 -91
  447. package/dist/commands/pr-classification-main.js +3 -3
  448. package/dist/commands/pre-commit-lint.js +11 -12
  449. package/dist/commands/pre-commit-type-check.js +25 -24
  450. package/dist/commands/pre-push-unit.js +33 -33
  451. package/dist/commands/pretool-guard-cli.js +90 -91
  452. package/dist/commands/project-profile-cli.js +5 -4
  453. package/dist/commands/propagate.js +15 -15
  454. package/dist/commands/prose-stale-cli.js +20 -19
  455. package/dist/commands/publishable-range-check.js +4 -4
  456. package/dist/commands/read-files-cli.js +2 -2
  457. package/dist/commands/read-set-cli.js +61 -24
  458. package/dist/commands/refactor-scan-cli.js +6 -6
  459. package/dist/commands/release-cli.js +64 -36
  460. package/dist/commands/release-scope-main.js +19 -18
  461. package/dist/commands/rename-cli.js +27 -29
  462. package/dist/commands/reserved-run.js +3 -3
  463. package/dist/commands/retrospective-cli.js +104 -102
  464. package/dist/commands/review-attest-cli.js +6 -6
  465. package/dist/commands/review-brief-main.js +127 -109
  466. package/dist/commands/review-findings-cli.js +2 -2
  467. package/dist/commands/review-pair-cli.js +110 -84
  468. package/dist/commands/review-record-main.js +108 -83
  469. package/dist/commands/review-round2-cli.js +46 -45
  470. package/dist/commands/review-stops-cli.js +16 -16
  471. package/dist/commands/review-submit-cli.js +127 -109
  472. package/dist/commands/rule-list.js +58 -60
  473. package/dist/commands/rule-value-cli.js +226 -74
  474. package/dist/commands/run-add-cli.js +28 -27
  475. package/dist/commands/run-board-main.js +136 -132
  476. package/dist/commands/run-carry-cli.js +127 -124
  477. package/dist/commands/run-chain-cli.js +116 -93
  478. package/dist/commands/run-cut-cli.js +124 -119
  479. package/dist/commands/run-ending-cli.js +19 -22
  480. package/dist/commands/run-entry-cli.js +183 -180
  481. package/dist/commands/run-event-cli.js +5 -5
  482. package/dist/commands/run-handoff-cli.js +52 -28
  483. package/dist/commands/run-handoff-lanes-cli.js +15 -15
  484. package/dist/commands/run-hold-main.js +64 -62
  485. package/dist/commands/run-liveness-cli.js +11 -11
  486. package/dist/commands/run-merge-main.js +119 -116
  487. package/dist/commands/run-next-cli.js +87 -86
  488. package/dist/commands/run-park-cli.js +111 -92
  489. package/dist/commands/run-pause-cli.js +147 -133
  490. package/dist/commands/run-pickup-cli.js +13 -13
  491. package/dist/commands/run-prep-main.js +83 -82
  492. package/dist/commands/run-prime-cli.js +107 -87
  493. package/dist/commands/run-progress-main.js +123 -107
  494. package/dist/commands/run-report-cli.js +25 -24
  495. package/dist/commands/run-review-cli.js +168 -149
  496. package/dist/commands/run-ship-cli.js +208 -203
  497. package/dist/commands/run-ship-evidence-cli.js +38 -37
  498. package/dist/commands/run-ship-wait-main.js +40 -37
  499. package/dist/commands/run-split-cli.js +127 -125
  500. package/dist/commands/run-stale-main.js +36 -35
  501. package/dist/commands/run-status-cli.js +16 -15
  502. package/dist/commands/run-step-cli.js +173 -164
  503. package/dist/commands/run-tail-cli.js +1 -1
  504. package/dist/commands/run-tidy-main.js +30 -29
  505. package/dist/commands/run-wake-main.js +137 -119
  506. package/dist/commands/run-watcher-guard-cli.js +30 -29
  507. package/dist/commands/secretlint-scan.js +2 -2
  508. package/dist/commands/selfcheck-cli.js +27 -26
  509. package/dist/commands/session-language-main.js +48 -28
  510. package/dist/commands/sonar-hotspots-cli.js +3 -3
  511. package/dist/commands/split-assess-cli.js +24 -23
  512. package/dist/commands/split-child-recover-cli.js +13 -12
  513. package/dist/commands/start.js +37 -35
  514. package/dist/commands/stash-pop-main.js +3 -3
  515. package/dist/commands/stash-push-main.js +3 -3
  516. package/dist/commands/stop-guard.js +144 -143
  517. package/dist/commands/sync-main.js +11 -10
  518. package/dist/commands/telegram-test-main.js +5 -5
  519. package/dist/commands/test-declared.js +9 -8
  520. package/dist/commands/test-e2e-guard.js +23 -22
  521. package/dist/commands/test-pinned-main.js +26 -25
  522. package/dist/commands/test-reach-cli.js +15 -14
  523. package/dist/commands/test-red-main.js +5 -5
  524. package/dist/commands/{test-related-ZT2AO62I.js → test-related-ZCNC46MS.js} +31 -31
  525. package/dist/commands/test-related-main.js +51 -50
  526. package/dist/commands/test-unit-guard-main.js +9 -8
  527. package/dist/commands/time-cli.js +24 -27
  528. package/dist/commands/time-density-cli.js +8 -9
  529. package/dist/commands/tree-status-cli.js +4 -4
  530. package/dist/commands/type-check-command.js +8 -7
  531. package/dist/commands/ui-shot-cli.js +4 -4
  532. package/dist/commands/uninstall.js +20 -19
  533. package/dist/commands/unused-members-cli.js +9 -8
  534. package/dist/commands/upstream-interrupt-main.js +115 -111
  535. package/dist/commands/verification-gate.js +46 -46
  536. package/dist/commands/version-check.js +5 -5
  537. package/dist/hooks/{chunk-LWD43Z3C.js → chunk-5CUXGQT6.js} +1667 -107
  538. package/dist/hooks/{chunk-4YXV2REH.js → chunk-5R5YFQR5.js} +8 -8
  539. package/dist/hooks/{chunk-LKQBEKBI.js → chunk-6RLY27FT.js} +8 -8
  540. package/dist/hooks/{chunk-CICKRHTB.js → chunk-AO4TOV4V.js} +119 -2679
  541. package/dist/hooks/{chunk-NUPVO7RI.js → chunk-G5WSPYJ6.js} +4296 -1687
  542. package/dist/hooks/{chunk-UU4PTPEZ.js → chunk-HHIVWGHX.js} +250 -125
  543. package/dist/hooks/{chunk-P7BPAU26.js → chunk-IURJANNZ.js} +2 -2
  544. package/dist/hooks/{chunk-6RR6JZSB.js → chunk-OV22V63P.js} +357 -1744
  545. package/dist/hooks/{chunk-RQXECHAS.js → chunk-SXABK6UV.js} +57 -45
  546. package/dist/hooks/codex-hook-adapter.js +11 -11
  547. package/dist/hooks/daemon.js +1053 -690
  548. package/dist/hooks/format-edited.js +5 -5
  549. package/dist/hooks/inputs.json +542 -527
  550. package/dist/hooks/pretool-guard.js +7 -7
  551. package/dist/hooks/session-lang.js +293 -16
  552. package/dist/hooks/stop-guard.js +225 -48
  553. package/dist/inputs.json +65 -65
  554. package/dist/josh.js +73 -19
  555. package/dist/self-sync-guard/index.js +18 -1
  556. package/dist/version/index.js +18 -1
  557. package/package.json +3 -3
  558. package/pnpm-workspace.yaml +5 -13
  559. package/prompts/collaboration-workflow/issue-template.en.md +56 -52
  560. package/scripts/agent/agent-argv.ts +20 -6
  561. package/scripts/agent/agent-phase-profile.ts +89 -0
  562. package/scripts/agent/agent-role-profile.ts +3 -71
  563. package/scripts/agent/agent-ship-cap.ts +44 -0
  564. package/scripts/agent/agent-worker-profile.ts +154 -0
  565. package/scripts/agent/claude-agent-argv.ts +1 -1
  566. package/scripts/agent/lane-instructions.ts +29 -3
  567. package/scripts/auto-ok/auto-ok-judge-cli.ts +3 -0
  568. package/scripts/auto-ok/auto-ok-judge-write.ts +2 -1
  569. package/scripts/auto-ok/auto-ok-judge.ts +4 -2
  570. package/scripts/backlog/backlog-drive-escalate.ts +115 -0
  571. package/scripts/backlog/backlog-drive-stalled-retry.ts +48 -10
  572. package/scripts/document/document-scan.ts +35 -1
  573. package/scripts/gh/git-pr-checks-failed.ts +24 -0
  574. package/scripts/hooks/implementation-shell-deny-expansion.ts +20 -0
  575. package/scripts/hooks/implementation-shell-deny-git.ts +128 -0
  576. package/scripts/hooks/implementation-shell-deny.ts +14 -138
  577. package/scripts/hooks/implementation-shell.ts +28 -5
  578. package/scripts/hooks/step-zero-notice.ts +9 -6
  579. package/scripts/hooks/stop-actions.ts +4 -2
  580. package/scripts/init/init-logic-workspace.ts +1 -1
  581. package/scripts/issue/issue-auto-ok.ts +43 -4
  582. package/scripts/issue/issue-body-keys.ts +4 -0
  583. package/scripts/issue/issue-comment-cli.ts +15 -2
  584. package/scripts/issue/issue-evidence-exit.ts +6 -2
  585. package/scripts/issue/issue-file-cli.ts +5 -1
  586. package/scripts/issue/issue-file-pass.ts +14 -7
  587. package/scripts/issue/issue-file-worker.ts +95 -0
  588. package/scripts/issue/issue-file.ts +1 -1
  589. package/scripts/issue/issue-outcome.ts +107 -0
  590. package/scripts/issue/issue-read.ts +12 -7
  591. package/scripts/issue/issue-watch-diff.ts +2 -1
  592. package/scripts/josh/josh-commands-ai.ts +2 -2
  593. package/scripts/josh/josh-commands-development.ts +21 -5
  594. package/scripts/josh/josh-commands-issue-write.ts +3 -2
  595. package/scripts/josh/josh-commands-lint.ts +1 -1
  596. package/scripts/josh/josh-commands-project.ts +7 -2
  597. package/scripts/josh/josh-commands-run.ts +10 -2
  598. package/scripts/josh/josh-commands-workflow.ts +5 -0
  599. package/scripts/josh/session-language-cli.ts +1 -1
  600. package/scripts/lane/lane-breakdown-cli.ts +14 -4
  601. package/scripts/lane/lane-breakdown-text.ts +7 -0
  602. package/scripts/lane/lane-breakdown.ts +21 -1
  603. package/scripts/lane/lane-dispatch-prepare.ts +83 -0
  604. package/scripts/lane/lane-dispatch.ts +3 -53
  605. package/scripts/lane/lane-elapsed-time.ts +118 -0
  606. package/scripts/lane/lane-ledger-schema-ship.ts +4 -1
  607. package/scripts/lane/lane-net-time.ts +35 -7
  608. package/scripts/lane/lane-overrun.ts +1 -1
  609. package/scripts/lane/lane-plan-cli.ts +7 -3
  610. package/scripts/lane/lane-plan-estimate.ts +57 -0
  611. package/scripts/lane/lane-plan-size.ts +11 -20
  612. package/scripts/lane/lane-plan.ts +1 -0
  613. package/scripts/lane/lane-relaunch.ts +9 -4
  614. package/scripts/lane/lane-stage-budget.ts +6 -1
  615. package/scripts/lane/lane-stage-events.ts +103 -0
  616. package/scripts/lane/lane-stats-tables.ts +3 -0
  617. package/scripts/lane/lane-stop-check-stats.ts +117 -0
  618. package/scripts/lane/lane-stop-stats.ts +30 -6
  619. package/scripts/lane/lane-why-causes.ts +3 -11
  620. package/scripts/lane/openai-lane-supervisor-owner.ts +12 -0
  621. package/scripts/lane/openai-lane-supervisor.ts +36 -1
  622. package/scripts/lib/home-tilde.ts +24 -0
  623. package/scripts/lib/package-manifest.ts +27 -1
  624. package/scripts/observations/observation-ledger-archive.ts +180 -0
  625. package/scripts/observations/observation-ledger-home.ts +1 -0
  626. package/scripts/observations/observation-ledger.ts +5 -0
  627. package/scripts/observations/observations-flush-transaction.ts +358 -0
  628. package/scripts/observations/observations-flush.ts +72 -172
  629. package/scripts/plan/plan-scaffold-cli.ts +17 -6
  630. package/scripts/plan/plan-scaffold.ts +11 -0
  631. package/scripts/release/github-release-notes.ts +24 -0
  632. package/scripts/release/github-release-runs.ts +32 -6
  633. package/scripts/release/github-release.ts +10 -2
  634. package/scripts/release/release-progress.ts +22 -10
  635. package/scripts/release/release-publish-run.ts +39 -6
  636. package/scripts/repo/repository-labels.ts +23 -11
  637. package/scripts/review/review-comment-round.ts +10 -5
  638. package/scripts/rules/broad-investigation-shell.ts +2 -2
  639. package/scripts/rules/codex-prompt.ts +63 -0
  640. package/scripts/rules/direct-issue-comment.ts +62 -2
  641. package/scripts/rules/direct-issue-read.ts +55 -2
  642. package/scripts/rules/guard-remedy.ts +10 -4
  643. package/scripts/rules/issue-citation.ts +20 -9
  644. package/scripts/rules/last-prompt.ts +8 -4
  645. package/scripts/rules/rule-value-cli.ts +85 -4
  646. package/scripts/rules/rule-value-trend.ts +108 -0
  647. package/scripts/rules/shell-redirects.ts +19 -7
  648. package/scripts/rules/shell-segments.ts +145 -20
  649. package/scripts/rules/shell-tokens.ts +66 -0
  650. package/scripts/rules/standalone-gh-call.ts +63 -0
  651. package/scripts/rules/unasked-filing.ts +12 -4
  652. package/scripts/run/board/run-board-closed.ts +10 -1
  653. package/scripts/run/board/run-board-decision-read.ts +52 -12
  654. package/scripts/run/board/run-board-decision.ts +5 -0
  655. package/scripts/run/board/run-board-ending-reason.ts +21 -7
  656. package/scripts/run/board/run-board-github.ts +8 -1
  657. package/scripts/run/board/run-board-header.ts +4 -5
  658. package/scripts/run/board/run-board-layout.ts +5 -3
  659. package/scripts/run/board/run-board-link.ts +2 -0
  660. package/scripts/run/board/run-board-operation.ts +6 -2
  661. package/scripts/run/board/run-board-pause-fixture.json +12 -0
  662. package/scripts/run/board/run-board-pause.ts +87 -0
  663. package/scripts/run/board/run-board-plan-shared.ts +2 -0
  664. package/scripts/run/board/run-board-read.ts +7 -1
  665. package/scripts/run/board/run-board-render-condition.ts +10 -1
  666. package/scripts/run/board/run-board-render-title.ts +7 -0
  667. package/scripts/run/board/run-board-roots.ts +25 -2
  668. package/scripts/run/board/run-board-settle.ts +16 -2
  669. package/scripts/run/board/run-board-setup.ts +13 -7
  670. package/scripts/run/board/run-board-snapshot.ts +4 -0
  671. package/scripts/run/board/run-board-status.ts +13 -1
  672. package/scripts/run/board/run-board-tick.ts +7 -1
  673. package/scripts/run/cut/run-cut-cli.ts +2 -1
  674. package/scripts/run/park/run-park-cli.ts +13 -1
  675. package/scripts/run/park/run-park-escalate.ts +102 -0
  676. package/scripts/run/park/run-stalled.ts +29 -7
  677. package/scripts/run/review/run-review-early-push.ts +6 -6
  678. package/scripts/run/ship/run-ship-stop-cause.ts +12 -1
  679. package/scripts/split/split-assess.ts +14 -5
  680. package/scripts/test/test-related-touched.ts +21 -3
  681. package/scripts/test/test-related.ts +1 -1
  682. package/dist/commands/chunk-6WEVLIZE.js +0 -29
  683. package/dist/commands/chunk-E2ZCUKHT.js +0 -274
  684. package/dist/commands/chunk-NMLCPYBN.js +0 -134
  685. package/dist/commands/chunk-QEIO2ZNQ.js +0 -324
  686. package/dist/commands/chunk-QWX7EBC6.js +0 -112
  687. package/dist/commands/chunk-RQRLW4XK.js +0 -20
  688. package/dist/commands/chunk-UCQJDYE3.js +0 -21
  689. package/dist/commands/chunk-W4YH2DF3.js +0 -58
  690. package/dist/commands/{chunk-LRA3PXHS.js → chunk-ENKFCOVY.js} +3 -3
  691. 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
@@ -19,6 +19,7 @@ import type { QuotaHold, QuotaView } from './run-board-render-quota'
19
19
  import { run_board_render_slot } from './run-board-render-slot'
20
20
  import { run_board_render_title } from './run-board-render-title'
21
21
  import type { SeatRead } from './run-board-seat'
22
+ import { run_board_setup } from './run-board-setup'
22
23
  import type { RunActivity } from './run-board-status'
23
24
  import type { LaneUsages, UsageScale } from './run-board-usage'
24
25
  import type { UsualTimes } from './run-board-usual'
@@ -46,7 +47,6 @@ const { padded } = run_board_fresh
46
47
  const aged_fresh = run_board_fresh.aged
47
48
  const UNKNOWN = '-'
48
49
  const BLANK = ' '
49
- const REPO_SEPARATOR = '/'
50
50
  const { GAP, PERCENT_WIDTH } = run_board_machine
51
51
  // A running run whose newest event is older than this is drawn as stale, so a hang stands out; past
52
52
  // twice that it is drawn as alarming.
@@ -165,9 +165,8 @@ const WORKING_MARKS: ReadonlySet<RunMark> = new Set<RunMark>(['running', 'setup'
165
165
  // Nothing running: the run is at work on a stage of its own; else it is waiting on a person when all
166
166
  // the plan has left is what `needs-decision` holds, or idle.
167
167
  function quiet_mark(header: BoardHeader): RunMark {
168
- const { layout } = header
169
-
170
- if (header.activity.setup !== undefined) return 'setup'
168
+ const { activity, layout } = header
169
+ if (run_board_setup.is_working(activity.setup, activity.is_setup_working)) return 'setup'
171
170
 
172
171
  return layout?.queued.length === 0 && run_board_layout.people_of(layout).length > 0
173
172
  ? 'human'
@@ -191,7 +190,7 @@ function run_part(mark: RunMark, name = RUN_NAME): string {
191
190
  // The repository's own name — `kit` of `owner/kit` — under the run's, past the mark's columns, so a
192
191
  // board open beside another repository's is told apart. Blank before a plan names one.
193
192
  function repo_part(header: BoardHeader, mark: RunMark): string {
194
- const name = header.repo?.split(REPO_SEPARATOR).at(-1) ?? ''
193
+ const name = header.repo?.split('/').at(-1) ?? ''
195
194
  const indent = run_board_fit.width_of(RUN_MARKS[mark].glyph) + BLANK.length
196
195
 
197
196
  return `${BLANK.repeat(indent)}${header.repo_link(name, 'home')}`
@@ -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(),
@@ -59,6 +59,8 @@ interface LocalRead {
59
59
  is_stranded: boolean
60
60
  // The newest operation of each session of the run, read off the end of its log.
61
61
  operations?: SessionOperations | undefined
62
+ // The carry's session owner is still running, apart from the supervisor's own driver.
63
+ is_session_active?: boolean | undefined
62
64
  // The open lanes no child is working in at this read (`lane-spent.ts`); one is drawn stopped once it
63
65
  // has stayed so (`run-board-idle.ts`).
64
66
  idle_lanes?: ReadonlyArray<string> | undefined
@@ -108,6 +110,7 @@ const NO_SPAN: SpanHere = {
108
110
  roots: {},
109
111
  carry: undefined,
110
112
  is_stranded: false,
113
+ is_session_active: false,
111
114
  }
112
115
 
113
116
  interface SpanHere {
@@ -118,6 +121,7 @@ interface SpanHere {
118
121
  roots: ProcessRoots
119
122
  carry: RunCarry | undefined
120
123
  is_stranded: boolean
124
+ is_session_active: boolean
121
125
  }
122
126
 
123
127
  // The main work tree, resolved once: it does not move while the board is open, and resolving it runs a
@@ -159,6 +163,7 @@ async function recorded_span_here(
159
163
  resume: run_board_span.resume_of(read, ended, launch),
160
164
  transcript: read.kind === 'carried' ? read.carry.owner_transcript : undefined,
161
165
  roots: run_board_roots.roots_of(repository, read, same_process),
166
+ is_session_active: run_board_roots.session_is_active(repository, read, same_process),
162
167
  carry: read.kind === 'carried' ? read.carry : undefined,
163
168
  is_stranded: run_stranded_detect.is_stranded_at(repository, stranded_ports),
164
169
  }
@@ -341,7 +346,7 @@ function span_fields(
341
346
  // snapshot, so it agrees with the usage columns.
342
347
  async function read_local(table?: TableRead): Promise<LocalRead | undefined> {
343
348
  const repository = await run_carry.repository_directory()
344
- const { span, resume, transcript, roots, carry, is_stranded } =
349
+ const { span, resume, transcript, roots, carry, is_stranded, is_session_active } =
345
350
  repository === undefined ? NO_SPAN : await span_here(repository, table)
346
351
 
347
352
  if (repository === undefined || span === undefined) return undefined
@@ -361,6 +366,7 @@ async function read_local(table?: TableRead): Promise<LocalRead | undefined> {
361
366
  roots,
362
367
  carry,
363
368
  is_stranded,
369
+ is_session_active,
364
370
  operations: run_board_operation_read.read(sources_of(repository, lanes, transcript)),
365
371
  ...(await lane_room_of(lanes, lane_read.lane_states, table)),
366
372
  ...ledger_here(repository),
@@ -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