@joshuafolkken/kit 1.872.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 (1108) hide show
  1. package/.claude/.claude-plugin/plugin.json +11 -0
  2. package/.claude/settings.json +110 -0
  3. package/.claude/skills/dependency-update/SKILL.md +76 -0
  4. package/.claude/skills/epic-commands/SKILL.md +463 -0
  5. package/.claude/skills/verify-ui/SKILL.md +96 -0
  6. package/.claude/skills/workflow-commands/SKILL.md +265 -0
  7. package/.claude/skills/workflow-commands/background-commands.md +130 -0
  8. package/.claude/skills/workflow-commands/backlogrun-child.md +364 -0
  9. package/.claude/skills/workflow-commands/backlogrun-lanes.md +345 -0
  10. package/.claude/skills/workflow-commands/backlogrun-park.md +179 -0
  11. package/.claude/skills/workflow-commands/backlogrun-progress.md +600 -0
  12. package/.claude/skills/workflow-commands/backlogrun-steps.md +604 -0
  13. package/.claude/skills/workflow-commands/backlogrun.md +109 -0
  14. package/.claude/skills/workflow-commands/chain-rule.md +98 -0
  15. package/.claude/skills/workflow-commands/delegation.md +52 -0
  16. package/.claude/skills/workflow-commands/followup-reference.md +118 -0
  17. package/.claude/skills/workflow-commands/followup.md +222 -0
  18. package/.claude/skills/workflow-commands/fullrun-steps.md +93 -0
  19. package/.claude/skills/workflow-commands/fullrun.md +82 -0
  20. package/.claude/skills/workflow-commands/halfrun.md +73 -0
  21. package/.claude/skills/workflow-commands/into-target.md +48 -0
  22. package/.claude/skills/workflow-commands/issue-comments.md +109 -0
  23. package/.claude/skills/workflow-commands/issue-fold-existing.md +27 -0
  24. package/.claude/skills/workflow-commands/issue-scout.md +45 -0
  25. package/.claude/skills/workflow-commands/kickoff.md +82 -0
  26. package/.claude/skills/workflow-commands/latest-gate.md +85 -0
  27. package/.claude/skills/workflow-commands/needs-human-review.md +64 -0
  28. package/.claude/skills/workflow-commands/observation-filing.md +349 -0
  29. package/.claude/skills/workflow-commands/pre-gate-cut.md +340 -0
  30. package/.claude/skills/workflow-commands/prerequisite.md +62 -0
  31. package/.claude/skills/workflow-commands/retrospective.md +81 -0
  32. package/.claude/skills/workflow-commands/rule-residency.md +267 -0
  33. package/.claude/skills/workflow-commands/split-assessment.md +130 -0
  34. package/.claude/skills/workflow-commands/target-repository.md +58 -0
  35. package/.claude/skills/workflow-commands/working-tree-hold.md +66 -0
  36. package/.claude-plugin/marketplace.json +15 -0
  37. package/.coderabbit.yaml +50 -0
  38. package/.codex/config.toml +8 -0
  39. package/.codex/hooks.json +71 -0
  40. package/.cursorrules +45 -0
  41. package/.gitattributes +7 -0
  42. package/.github/dependabot.yml +19 -0
  43. package/.github/pull_request_template.md +1 -0
  44. package/.github/release.yml +18 -0
  45. package/.github/workflows/auto-tag.yml +111 -0
  46. package/.github/workflows/ci.yml +681 -0
  47. package/.github/workflows/dependabot-auto-merge.yml +55 -0
  48. package/.github/workflows/production.yml +47 -0
  49. package/.github/workflows/publish.yml +39 -0
  50. package/.github/workflows/sonar-qube.yml +34 -0
  51. package/.mcp.json +8 -0
  52. package/.ncurc.json +3 -0
  53. package/.prettierignore +20 -0
  54. package/.vscode/extensions.json +21 -0
  55. package/.vscode/settings.json +41 -0
  56. package/AGENTS.md +29 -0
  57. package/CLAUDE.md +207 -0
  58. package/CODE_OF_CONDUCT.md +132 -0
  59. package/GEMINI.md +30 -0
  60. package/LICENSE +21 -0
  61. package/README.md +41 -0
  62. package/SECURITY.md +34 -0
  63. package/cspell/index.yaml +177 -0
  64. package/dist/CLAUDE.md +207 -0
  65. package/dist/config-merge/index.d.ts +29 -0
  66. package/dist/config-merge/index.js +459 -0
  67. package/dist/hooks/batch-guard.js +28 -0
  68. package/dist/hooks/chunk-25JL6FMS.js +4970 -0
  69. package/dist/hooks/chunk-2ANGT3XM.js +375 -0
  70. package/dist/hooks/chunk-2EI5GBSW.js +42 -0
  71. package/dist/hooks/chunk-2OT5XE2N.js +5014 -0
  72. package/dist/hooks/chunk-2RUPMGGV.js +137 -0
  73. package/dist/hooks/chunk-2XIGZQMQ.js +3299 -0
  74. package/dist/hooks/chunk-33ELOKEV.js +910 -0
  75. package/dist/hooks/chunk-33YRTKM7.js +230 -0
  76. package/dist/hooks/chunk-36JQU5NN.js +77 -0
  77. package/dist/hooks/chunk-3EJBTWVS.js +1769 -0
  78. package/dist/hooks/chunk-3FK5SFAC.js +432 -0
  79. package/dist/hooks/chunk-3PWPYDD2.js +240 -0
  80. package/dist/hooks/chunk-3TQU7TDH.js +375 -0
  81. package/dist/hooks/chunk-3TVLSFZ6.js +432 -0
  82. package/dist/hooks/chunk-3VXYCB4E.js +77 -0
  83. package/dist/hooks/chunk-44M6JXGV.js +3398 -0
  84. package/dist/hooks/chunk-46EEEHC3.js +240 -0
  85. package/dist/hooks/chunk-4A7UVP2P.js +364 -0
  86. package/dist/hooks/chunk-4LFQEZS4.js +137 -0
  87. package/dist/hooks/chunk-4OCX3V2T.js +469 -0
  88. package/dist/hooks/chunk-4OHA5DE7.js +49 -0
  89. package/dist/hooks/chunk-4PMDW3YD.js +68 -0
  90. package/dist/hooks/chunk-4QHBNAI4.js +68 -0
  91. package/dist/hooks/chunk-4SSB3FEE.js +3273 -0
  92. package/dist/hooks/chunk-5A2WQ2CQ.js +5390 -0
  93. package/dist/hooks/chunk-5EVA2JQB.js +5390 -0
  94. package/dist/hooks/chunk-5P7VF5VE.js +3230 -0
  95. package/dist/hooks/chunk-5QWJGGZP.js +49 -0
  96. package/dist/hooks/chunk-5U5EZYG6.js +77 -0
  97. package/dist/hooks/chunk-5VUUF3ZV.js +240 -0
  98. package/dist/hooks/chunk-5WA7UBT3.js +374 -0
  99. package/dist/hooks/chunk-6EBGRQ3Q.js +301 -0
  100. package/dist/hooks/chunk-6TVHWMD3.js +432 -0
  101. package/dist/hooks/chunk-6V5OPIUU.js +13 -0
  102. package/dist/hooks/chunk-6VAGLEMB.js +68 -0
  103. package/dist/hooks/chunk-75BTXKFJ.js +3424 -0
  104. package/dist/hooks/chunk-75RHN67S.js +137 -0
  105. package/dist/hooks/chunk-76KC3BDD.js +3414 -0
  106. package/dist/hooks/chunk-76SLS7CZ.js +898 -0
  107. package/dist/hooks/chunk-7DHZ4DWT.js +5015 -0
  108. package/dist/hooks/chunk-7INSJDGE.js +458 -0
  109. package/dist/hooks/chunk-7VJ4FTDX.js +268 -0
  110. package/dist/hooks/chunk-7XCYNHQK.js +77 -0
  111. package/dist/hooks/chunk-A5YJ3H7E.js +375 -0
  112. package/dist/hooks/chunk-AAEXXUUL.js +268 -0
  113. package/dist/hooks/chunk-ABVEVV2M.js +432 -0
  114. package/dist/hooks/chunk-ACN3YXFL.js +68 -0
  115. package/dist/hooks/chunk-AD3XE3QZ.js +397 -0
  116. package/dist/hooks/chunk-AENFZPZH.js +230 -0
  117. package/dist/hooks/chunk-AFKRFQ6W.js +68 -0
  118. package/dist/hooks/chunk-AHD5IPWI.js +375 -0
  119. package/dist/hooks/chunk-AMK5JGV7.js +77 -0
  120. package/dist/hooks/chunk-ARN7NCQI.js +425 -0
  121. package/dist/hooks/chunk-AUFY653N.js +3425 -0
  122. package/dist/hooks/chunk-AXQBNFEF.js +375 -0
  123. package/dist/hooks/chunk-AYC7R6U4.js +3316 -0
  124. package/dist/hooks/chunk-AYEA2FJ7.js +5015 -0
  125. package/dist/hooks/chunk-B2LIXYFL.js +77 -0
  126. package/dist/hooks/chunk-B4HPNY2I.js +375 -0
  127. package/dist/hooks/chunk-B4YNCUGB.js +469 -0
  128. package/dist/hooks/chunk-B57S3VWT.js +922 -0
  129. package/dist/hooks/chunk-BINZ3PLI.js +364 -0
  130. package/dist/hooks/chunk-BIWLABFK.js +432 -0
  131. package/dist/hooks/chunk-BODUSXKK.js +410 -0
  132. package/dist/hooks/chunk-BQBAT2YK.js +375 -0
  133. package/dist/hooks/chunk-BUJEBW75.js +391 -0
  134. package/dist/hooks/chunk-BVNWORKA.js +72 -0
  135. package/dist/hooks/chunk-BWI47LQS.js +5205 -0
  136. package/dist/hooks/chunk-C25HRMJX.js +137 -0
  137. package/dist/hooks/chunk-CBFZNC74.js +375 -0
  138. package/dist/hooks/chunk-CECYXS4Y.js +3424 -0
  139. package/dist/hooks/chunk-CELGUP5F.js +49 -0
  140. package/dist/hooks/chunk-CMHANU3F.js +3442 -0
  141. package/dist/hooks/chunk-CMN372LI.js +68 -0
  142. package/dist/hooks/chunk-CPGZLMMK.js +3299 -0
  143. package/dist/hooks/chunk-CTQKXDC7.js +268 -0
  144. package/dist/hooks/chunk-CYAT4RIT.js +68 -0
  145. package/dist/hooks/chunk-CYTWYCH2.js +5014 -0
  146. package/dist/hooks/chunk-CZSOLRBA.js +77 -0
  147. package/dist/hooks/chunk-D2PIDYJR.js +3438 -0
  148. package/dist/hooks/chunk-DE57HI6T.js +137 -0
  149. package/dist/hooks/chunk-DGXDGAPG.js +5306 -0
  150. package/dist/hooks/chunk-DNYRSYQG.js +5014 -0
  151. package/dist/hooks/chunk-DTAXH2A2.js +240 -0
  152. package/dist/hooks/chunk-E2IZUWI5.js +375 -0
  153. package/dist/hooks/chunk-E4L2K2BL.js +397 -0
  154. package/dist/hooks/chunk-E55NKX5F.js +68 -0
  155. package/dist/hooks/chunk-ECXVCCVD.js +3079 -0
  156. package/dist/hooks/chunk-EPHO443D.js +68 -0
  157. package/dist/hooks/chunk-EUFK2BI2.js +375 -0
  158. package/dist/hooks/chunk-EYCD5ZAV.js +137 -0
  159. package/dist/hooks/chunk-F2SDYJU4.js +240 -0
  160. package/dist/hooks/chunk-F4B5D5TF.js +68 -0
  161. package/dist/hooks/chunk-FGEO3NDX.js +432 -0
  162. package/dist/hooks/chunk-FJYI52RE.js +137 -0
  163. package/dist/hooks/chunk-FXAKJKTB.js +18 -0
  164. package/dist/hooks/chunk-FYTZHIY4.js +3085 -0
  165. package/dist/hooks/chunk-G7JL2A5K.js +375 -0
  166. package/dist/hooks/chunk-GA3ITDBW.js +42 -0
  167. package/dist/hooks/chunk-GDR4H4SV.js +469 -0
  168. package/dist/hooks/chunk-GFKDXPSM.js +2855 -0
  169. package/dist/hooks/chunk-GIMRTKFU.js +566 -0
  170. package/dist/hooks/chunk-GOPHRLGO.js +240 -0
  171. package/dist/hooks/chunk-GX4HO7SJ.js +230 -0
  172. package/dist/hooks/chunk-GXKKK23T.js +240 -0
  173. package/dist/hooks/chunk-GZ6FUVIK.js +566 -0
  174. package/dist/hooks/chunk-H5HPY5M5.js +2869 -0
  175. package/dist/hooks/chunk-HCF3OGEE.js +1829 -0
  176. package/dist/hooks/chunk-HDEXAOUM.js +469 -0
  177. package/dist/hooks/chunk-HM2TY3TN.js +469 -0
  178. package/dist/hooks/chunk-HOA7NXA2.js +55 -0
  179. package/dist/hooks/chunk-HOFEWH6H.js +240 -0
  180. package/dist/hooks/chunk-HUUI6S5J.js +2669 -0
  181. package/dist/hooks/chunk-I4D3NVUD.js +469 -0
  182. package/dist/hooks/chunk-I4Q6WAJE.js +68 -0
  183. package/dist/hooks/chunk-IB6N4CR2.js +432 -0
  184. package/dist/hooks/chunk-IFLDYJMD.js +469 -0
  185. package/dist/hooks/chunk-IGU466YD.js +77 -0
  186. package/dist/hooks/chunk-IJCQUHKY.js +375 -0
  187. package/dist/hooks/chunk-IKUMBDJB.js +230 -0
  188. package/dist/hooks/chunk-IM3BDIBJ.js +5005 -0
  189. package/dist/hooks/chunk-IMYMAODK.js +3431 -0
  190. package/dist/hooks/chunk-IN2ZVGXA.js +5005 -0
  191. package/dist/hooks/chunk-ITVJ2MKQ.js +18 -0
  192. package/dist/hooks/chunk-J5RIJYTM.js +2669 -0
  193. package/dist/hooks/chunk-JFLMH4K5.js +3460 -0
  194. package/dist/hooks/chunk-JR25IFML.js +77 -0
  195. package/dist/hooks/chunk-JT5AUXFI.js +432 -0
  196. package/dist/hooks/chunk-JY5YVN6N.js +3234 -0
  197. package/dist/hooks/chunk-K5Q4ETVI.js +391 -0
  198. package/dist/hooks/chunk-K67V2F24.js +137 -0
  199. package/dist/hooks/chunk-KABG6AEW.js +3460 -0
  200. package/dist/hooks/chunk-KATZESEC.js +3273 -0
  201. package/dist/hooks/chunk-KFH4H7W7.js +469 -0
  202. package/dist/hooks/chunk-KMUEI6RX.js +910 -0
  203. package/dist/hooks/chunk-KMV4OY77.js +3438 -0
  204. package/dist/hooks/chunk-KQAZNWEY.js +137 -0
  205. package/dist/hooks/chunk-KZZR6JER.js +5015 -0
  206. package/dist/hooks/chunk-LAR6DREP.js +77 -0
  207. package/dist/hooks/chunk-LNCJWEZD.js +5015 -0
  208. package/dist/hooks/chunk-LRYD2GLM.js +6 -0
  209. package/dist/hooks/chunk-LXBKYHDV.js +77 -0
  210. package/dist/hooks/chunk-LYLKIUNE.js +5024 -0
  211. package/dist/hooks/chunk-LZKCFOVC.js +432 -0
  212. package/dist/hooks/chunk-M4FCIYRI.js +77 -0
  213. package/dist/hooks/chunk-M5M7327Q.js +3425 -0
  214. package/dist/hooks/chunk-MF72MHSX.js +3455 -0
  215. package/dist/hooks/chunk-MK56LKDO.js +397 -0
  216. package/dist/hooks/chunk-N3MJADY7.js +240 -0
  217. package/dist/hooks/chunk-NFQSUDBN.js +458 -0
  218. package/dist/hooks/chunk-NHREKY45.js +137 -0
  219. package/dist/hooks/chunk-NP5TTAAW.js +375 -0
  220. package/dist/hooks/chunk-NQTLTKTJ.js +2993 -0
  221. package/dist/hooks/chunk-NVRCZPBZ.js +391 -0
  222. package/dist/hooks/chunk-O46HMMLJ.js +469 -0
  223. package/dist/hooks/chunk-OFJGH2L4.js +240 -0
  224. package/dist/hooks/chunk-OLFMCZH5.js +240 -0
  225. package/dist/hooks/chunk-OMCZS46I.js +49 -0
  226. package/dist/hooks/chunk-OQZEZW5G.js +469 -0
  227. package/dist/hooks/chunk-P2MDAT2Y.js +1897 -0
  228. package/dist/hooks/chunk-P3M2JJIF.js +68 -0
  229. package/dist/hooks/chunk-PDVHQITQ.js +3453 -0
  230. package/dist/hooks/chunk-PNT2AMDH.js +391 -0
  231. package/dist/hooks/chunk-PR2LVSY6.js +3445 -0
  232. package/dist/hooks/chunk-PRR5R4JK.js +137 -0
  233. package/dist/hooks/chunk-PXT44QVN.js +566 -0
  234. package/dist/hooks/chunk-PZLWJLAP.js +469 -0
  235. package/dist/hooks/chunk-Q2FEAZJ2.js +77 -0
  236. package/dist/hooks/chunk-Q32WETDO.js +3265 -0
  237. package/dist/hooks/chunk-Q45DUBLE.js +3600 -0
  238. package/dist/hooks/chunk-Q7NZSWQ5.js +240 -0
  239. package/dist/hooks/chunk-QH2JNAMK.js +3085 -0
  240. package/dist/hooks/chunk-QNNWYQ2R.js +375 -0
  241. package/dist/hooks/chunk-QPU5H2OS.js +68 -0
  242. package/dist/hooks/chunk-QRAHZ5TO.js +1829 -0
  243. package/dist/hooks/chunk-QUZ5HPIE.js +469 -0
  244. package/dist/hooks/chunk-QVCRG34O.js +2893 -0
  245. package/dist/hooks/chunk-R3MY4E3S.js +1675 -0
  246. package/dist/hooks/chunk-R6TXJJXP.js +77 -0
  247. package/dist/hooks/chunk-REJU6VT7.js +1829 -0
  248. package/dist/hooks/chunk-REQAQLRC.js +2993 -0
  249. package/dist/hooks/chunk-RFCXPAHH.js +391 -0
  250. package/dist/hooks/chunk-RHI6Y22X.js +137 -0
  251. package/dist/hooks/chunk-RKZVOBBS.js +469 -0
  252. package/dist/hooks/chunk-RL57TT2Y.js +566 -0
  253. package/dist/hooks/chunk-RORDOD4S.js +3321 -0
  254. package/dist/hooks/chunk-RZKYW5P2.js +77 -0
  255. package/dist/hooks/chunk-SJPJ6VSI.js +391 -0
  256. package/dist/hooks/chunk-SKSIJQQQ.js +432 -0
  257. package/dist/hooks/chunk-SSQDZKXG.js +268 -0
  258. package/dist/hooks/chunk-SSX23SJ2.js +89 -0
  259. package/dist/hooks/chunk-SYHFKE4C.js +77 -0
  260. package/dist/hooks/chunk-TCGNI2ZY.js +42 -0
  261. package/dist/hooks/chunk-TG3WXJF5.js +137 -0
  262. package/dist/hooks/chunk-TH7IJAY5.js +77 -0
  263. package/dist/hooks/chunk-TLZ27PCY.js +240 -0
  264. package/dist/hooks/chunk-U652FXTN.js +566 -0
  265. package/dist/hooks/chunk-UEK47YUF.js +268 -0
  266. package/dist/hooks/chunk-UIO45H3O.js +432 -0
  267. package/dist/hooks/chunk-UNLZEEVH.js +5005 -0
  268. package/dist/hooks/chunk-UNRVF3SZ.js +432 -0
  269. package/dist/hooks/chunk-USLFAFOI.js +3453 -0
  270. package/dist/hooks/chunk-VAEELMLL.js +442 -0
  271. package/dist/hooks/chunk-VALSWLDQ.js +3453 -0
  272. package/dist/hooks/chunk-VC5JEPNY.js +3398 -0
  273. package/dist/hooks/chunk-VEZVK6C7.js +230 -0
  274. package/dist/hooks/chunk-VK5JKFAR.js +49 -0
  275. package/dist/hooks/chunk-VNF2KP7Z.js +469 -0
  276. package/dist/hooks/chunk-VWWCUMW6.js +2669 -0
  277. package/dist/hooks/chunk-W4JARUQV.js +137 -0
  278. package/dist/hooks/chunk-WCYPBPJC.js +5014 -0
  279. package/dist/hooks/chunk-WEOBMNJG.js +2993 -0
  280. package/dist/hooks/chunk-WKJU3J5Y.js +5390 -0
  281. package/dist/hooks/chunk-WMN4TSVF.js +3299 -0
  282. package/dist/hooks/chunk-WNON54PT.js +3469 -0
  283. package/dist/hooks/chunk-WOVKBPPX.js +137 -0
  284. package/dist/hooks/chunk-WRVFORYJ.js +432 -0
  285. package/dist/hooks/chunk-WUBVYGQZ.js +240 -0
  286. package/dist/hooks/chunk-WWULTUOM.js +68 -0
  287. package/dist/hooks/chunk-WXHKKB45.js +4962 -0
  288. package/dist/hooks/chunk-XAI3YTHJ.js +469 -0
  289. package/dist/hooks/chunk-XFZH6JZJ.js +77 -0
  290. package/dist/hooks/chunk-XGPWX6IA.js +137 -0
  291. package/dist/hooks/chunk-XIXXIVGY.js +566 -0
  292. package/dist/hooks/chunk-XKDOYJGA.js +922 -0
  293. package/dist/hooks/chunk-YALTVBHM.js +432 -0
  294. package/dist/hooks/chunk-YEBEPBFK.js +5014 -0
  295. package/dist/hooks/chunk-YI2BQ3DK.js +3441 -0
  296. package/dist/hooks/chunk-YVNBCFGG.js +1829 -0
  297. package/dist/hooks/chunk-YXBN3RGG.js +432 -0
  298. package/dist/hooks/chunk-Z2OOJSW3.js +3163 -0
  299. package/dist/hooks/chunk-ZA3HVBOY.js +2644 -0
  300. package/dist/hooks/chunk-ZKID46U3.js +137 -0
  301. package/dist/hooks/chunk-ZPMU2JV6.js +49 -0
  302. package/dist/hooks/chunk-ZRKY4W7O.js +432 -0
  303. package/dist/hooks/chunk-ZTMRB7LJ.js +268 -0
  304. package/dist/hooks/chunk-ZVPPBQ3L.js +3413 -0
  305. package/dist/hooks/codex-hook-adapter.js +164 -0
  306. package/dist/hooks/duplicate-read-guard.js +29 -0
  307. package/dist/hooks/format-edited.js +37 -0
  308. package/dist/hooks/investigation-guard.js +31 -0
  309. package/dist/hooks/pretool-guard.js +21 -0
  310. package/dist/hooks/session-lang.js +34 -0
  311. package/dist/hooks/stop-guard.js +1597 -0
  312. package/dist/josh.js +1795 -0
  313. package/dist/managed-marker/index.d.ts +10 -0
  314. package/dist/managed-marker/index.js +32 -0
  315. package/dist/self-sync-guard/index.d.ts +10 -0
  316. package/dist/self-sync-guard/index.js +49 -0
  317. package/dist/version/index.d.ts +93 -0
  318. package/dist/version/index.js +1024 -0
  319. package/env/index.d.ts +7 -0
  320. package/env/index.js +62 -0
  321. package/eslint/base.js +233 -0
  322. package/eslint/checkout-rooted-parser.js +34 -0
  323. package/eslint/config-fingerprint.js +103 -0
  324. package/eslint/rules/code-quality.js +292 -0
  325. package/eslint/rules/english-only-prose.js +135 -0
  326. package/eslint/rules/formatting.js +44 -0
  327. package/eslint/rules/import.js +83 -0
  328. package/eslint/rules/namespace-object-export.js +107 -0
  329. package/eslint/rules/naming-convention.js +109 -0
  330. package/eslint/rules/promise.js +17 -0
  331. package/eslint/rules/sonarjs.js +45 -0
  332. package/eslint/rules/test-filename.js +91 -0
  333. package/eslint/rules/typescript.js +186 -0
  334. package/eslint/rules/unicorn.js +191 -0
  335. package/eslint/vanilla.js +1 -0
  336. package/evals/scenarios/consult-not-execute.json +20 -0
  337. package/evals/scenarios/no-implicit-workflow.json +26 -0
  338. package/evals/scenarios/overrides-both-locations.json +29 -0
  339. package/evals/scenarios/upstream-interrupt.json +23 -0
  340. package/evals/scenarios/workflow-skill-loaded.json +16 -0
  341. package/lefthook/base.yml +131 -0
  342. package/lefthook/vanilla.yml +7 -0
  343. package/package.json +169 -0
  344. package/playwright.config.ts +160 -0
  345. package/pnpm-workspace.yaml +41 -0
  346. package/ports/index.d.ts +17 -0
  347. package/ports/index.js +256 -0
  348. package/prettier/index.d.ts +3 -0
  349. package/prettier/index.js +31 -0
  350. package/prompts/agent-lint-protocol.json +79 -0
  351. package/prompts/agent-rules.md +63 -0
  352. package/prompts/coding-standards.md +382 -0
  353. package/prompts/collaboration-workflow/consultation-vs-execution.md +8 -0
  354. package/prompts/collaboration-workflow/cross-repo-epic.md +54 -0
  355. package/prompts/collaboration-workflow/distributed-docs.md +7 -0
  356. package/prompts/collaboration-workflow/durable-rules.md +24 -0
  357. package/prompts/collaboration-workflow/epic-audit.md +56 -0
  358. package/prompts/collaboration-workflow/epic-bundle.md +109 -0
  359. package/prompts/collaboration-workflow/file-edits.md +124 -0
  360. package/prompts/collaboration-workflow/gh-rest.md +57 -0
  361. package/prompts/collaboration-workflow/issue-citation.md +38 -0
  362. package/prompts/collaboration-workflow/issue-template.md +190 -0
  363. package/prompts/collaboration-workflow/latest-first.md +14 -0
  364. package/prompts/collaboration-workflow/no-clones.md +11 -0
  365. package/prompts/collaboration-workflow/operating-rules.md +123 -0
  366. package/prompts/collaboration-workflow/output-bounds.md +107 -0
  367. package/prompts/collaboration-workflow/overview.md +35 -0
  368. package/prompts/collaboration-workflow/plan-comment.md +85 -0
  369. package/prompts/collaboration-workflow/proposal-request.md +23 -0
  370. package/prompts/collaboration-workflow/report-format.md +206 -0
  371. package/prompts/collaboration-workflow/residency.md +94 -0
  372. package/prompts/collaboration-workflow/rule-delivery.md +146 -0
  373. package/prompts/collaboration-workflow/shell-body.md +82 -0
  374. package/prompts/collaboration-workflow/simplicity-first.md +9 -0
  375. package/prompts/collaboration-workflow/single-source-rules.md +13 -0
  376. package/prompts/collaboration-workflow/turn-batching.md +137 -0
  377. package/prompts/collaboration-workflow/upstream-interrupt.md +51 -0
  378. package/prompts/collaboration-workflow/wip-cap.md +118 -0
  379. package/prompts/collaboration-workflow.md +52 -0
  380. package/prompts/refactoring.md +103 -0
  381. package/prompts/review-rubric.md +338 -0
  382. package/prompts/review.md +217 -0
  383. package/prompts/sonar-hotspot-handling.md +77 -0
  384. package/prompts/testing-guide.md +277 -0
  385. package/scripts/adopt/adopt-logic.ts +107 -0
  386. package/scripts/adopt/adopt-toolkits.ts +181 -0
  387. package/scripts/adopt/adopt.ts +171 -0
  388. package/scripts/agent/agent-argv.ts +140 -0
  389. package/scripts/agent/agent-diagnostics.ts +120 -0
  390. package/scripts/agent/agent-event.ts +173 -0
  391. package/scripts/agent/agent-exit-record.ts +32 -0
  392. package/scripts/agent/agent-launch-environment.ts +71 -0
  393. package/scripts/agent/agent-role-profile.ts +329 -0
  394. package/scripts/agent/api-outage.ts +51 -0
  395. package/scripts/agent/claude-agent-argv.ts +151 -0
  396. package/scripts/agent/claude-result-event.ts +98 -0
  397. package/scripts/agent/codex-agent-argv.ts +94 -0
  398. package/scripts/agent/codex-home-source.ts +11 -0
  399. package/scripts/agent/interactive-ask.ts +91 -0
  400. package/scripts/auto-ok/auto-ok-cli.ts +516 -0
  401. package/scripts/backlog/backlog-arrival.ts +147 -0
  402. package/scripts/backlog/backlog-budget-cli.ts +220 -0
  403. package/scripts/backlog/backlog-budget.ts +284 -0
  404. package/scripts/backlog/backlog-defect-priority.ts +77 -0
  405. package/scripts/backlog/backlog-drive-cli.ts +377 -0
  406. package/scripts/backlog/backlog-drive-finish.ts +23 -0
  407. package/scripts/backlog/backlog-drive-named-offer.ts +81 -0
  408. package/scripts/backlog/backlog-drive-named.ts +101 -0
  409. package/scripts/backlog/backlog-drive-offer-argv.ts +29 -0
  410. package/scripts/backlog/backlog-drive-owner.ts +22 -0
  411. package/scripts/backlog/backlog-drive-restore.ts +67 -0
  412. package/scripts/backlog/backlog-drive.ts +322 -0
  413. package/scripts/backlog/backlog-named.ts +164 -0
  414. package/scripts/backlog/backlog-next.ts +376 -0
  415. package/scripts/backlog/backlog-offer-cli.ts +279 -0
  416. package/scripts/backlog/backlog-offer.ts +93 -0
  417. package/scripts/backlog/backlog-plan-cli.ts +235 -0
  418. package/scripts/backlog/backlog-plan.ts +231 -0
  419. package/scripts/backlog/backlog-pool.ts +322 -0
  420. package/scripts/backlog/backlog-ready.ts +146 -0
  421. package/scripts/backlog/backlog-scope.ts +144 -0
  422. package/scripts/backlog/backlog-stalled-cli.ts +30 -0
  423. package/scripts/backlog/backlog-stalled-detect.ts +143 -0
  424. package/scripts/backlog/backlog-stalled.ts +118 -0
  425. package/scripts/behavior/behavior-assertion.ts +87 -0
  426. package/scripts/behavior/behavior-cli.ts +88 -0
  427. package/scripts/behavior/behavior-rules.ts +128 -0
  428. package/scripts/build/build-bin.ts +36 -0
  429. package/scripts/build/build-claude-md.ts +42 -0
  430. package/scripts/build/build-config-merge.ts +26 -0
  431. package/scripts/build/build-hooks.ts +79 -0
  432. package/scripts/build/build-library.ts +83 -0
  433. package/scripts/build/build-managed-marker.ts +26 -0
  434. package/scripts/build/build-self-sync-guard.ts +26 -0
  435. package/scripts/build/build-version.ts +25 -0
  436. package/scripts/build/local-bin.ts +97 -0
  437. package/scripts/build/shim-shell.ts +25 -0
  438. package/scripts/bytes/bytes-command.ts +181 -0
  439. package/scripts/cases/cases-cli.ts +48 -0
  440. package/scripts/cases/cases-logic.ts +100 -0
  441. package/scripts/claude/skill-meta.ts +37 -0
  442. package/scripts/claude/workflow-destination.ts +13 -0
  443. package/scripts/clone/clone-aggregate.ts +76 -0
  444. package/scripts/clone/clone-fingerprint.ts +96 -0
  445. package/scripts/clone/clone-scan-cli.ts +39 -0
  446. package/scripts/clone/clone-scan.ts +158 -0
  447. package/scripts/config-merge/index.ts +19 -0
  448. package/scripts/config-merge/json-format.ts +128 -0
  449. package/scripts/config-merge/list-patch.ts +61 -0
  450. package/scripts/config-merge/parse-jsonc.ts +14 -0
  451. package/scripts/config-merge/patch-json-key.ts +439 -0
  452. package/scripts/config-merge/patch-json-list.ts +38 -0
  453. package/scripts/config-merge/patch-yaml-list.ts +107 -0
  454. package/scripts/cost-runtime/codex-usage.ts +119 -0
  455. package/scripts/cost-runtime/context-cut-payback.ts +77 -0
  456. package/scripts/cost-runtime/context-cut-threshold.ts +21 -0
  457. package/scripts/cost-runtime/cost-attribute.ts +168 -0
  458. package/scripts/cost-runtime/cost-blocks.ts +149 -0
  459. package/scripts/cost-runtime/cost-cli.ts +318 -0
  460. package/scripts/cost-runtime/cost-corpus.ts +278 -0
  461. package/scripts/cost-runtime/cost-format.ts +32 -0
  462. package/scripts/cost-runtime/cost-pricing.ts +176 -0
  463. package/scripts/cost-runtime/cost-tokens.ts +84 -0
  464. package/scripts/cost-runtime/cost-transcript.ts +531 -0
  465. package/scripts/cost-runtime/cost-usage.ts +287 -0
  466. package/scripts/cost-runtime/cost-verdict.ts +89 -0
  467. package/scripts/cost-runtime/own-session.ts +58 -0
  468. package/scripts/cost-runtime/transcript-cwd.ts +14 -0
  469. package/scripts/delegation/delegation-cli.ts +91 -0
  470. package/scripts/delegation/delegation-policy.ts +178 -0
  471. package/scripts/delegation/duplicate-read-guard.ts +244 -0
  472. package/scripts/delegation/fanout-cli.ts +61 -0
  473. package/scripts/delegation/fanout.ts +95 -0
  474. package/scripts/delegation/investigation-guard.ts +131 -0
  475. package/scripts/delegation/investigation-reads.ts +637 -0
  476. package/scripts/discovery/repo-discovery.ts +166 -0
  477. package/scripts/discovery/repo-map-logic.ts +102 -0
  478. package/scripts/discovery/repo-origin.ts +153 -0
  479. package/scripts/discovery/repo-party-cli.ts +69 -0
  480. package/scripts/discovery/repo-party.ts +46 -0
  481. package/scripts/doctor/doctor-consumer.ts +181 -0
  482. package/scripts/doctor/doctor-io.ts +210 -0
  483. package/scripts/doctor/doctor-logic.ts +122 -0
  484. package/scripts/doctor/doctor-ports.ts +117 -0
  485. package/scripts/doctor/doctor.ts +232 -0
  486. package/scripts/document/backlogrun-parent-read-set.ts +48 -0
  487. package/scripts/document/bash-output-cap.ts +45 -0
  488. package/scripts/document/document-byte-budget.ts +183 -0
  489. package/scripts/document/document-byte-check.ts +131 -0
  490. package/scripts/document/document-reachability.ts +131 -0
  491. package/scripts/document/document-read-cli.ts +82 -0
  492. package/scripts/document/document-scan.ts +108 -0
  493. package/scripts/document/document-section-cli.ts +101 -0
  494. package/scripts/document/document-section.ts +156 -0
  495. package/scripts/document/edit-files-cli.ts +280 -0
  496. package/scripts/document/entry-read-budget.ts +154 -0
  497. package/scripts/document/entry-read-set.ts +471 -0
  498. package/scripts/document/generate-catalog.ts +69 -0
  499. package/scripts/document/lane-child-read-set.ts +88 -0
  500. package/scripts/document/read-files-cli.ts +135 -0
  501. package/scripts/document/read-set-cli.ts +295 -0
  502. package/scripts/document/read-set-point-of-use.ts +89 -0
  503. package/scripts/document/read-set-pricing.ts +52 -0
  504. package/scripts/document/read-set-trim.ts +78 -0
  505. package/scripts/document/retired-phrases.ts +143 -0
  506. package/scripts/document/review-agent-type.ts +46 -0
  507. package/scripts/document/single-source.ts +73 -0
  508. package/scripts/epic/epic-audit-checks.ts +452 -0
  509. package/scripts/epic/epic-audit-cli.ts +374 -0
  510. package/scripts/epic/epic-audit-orphans.ts +142 -0
  511. package/scripts/epic/epic-audit-rationale.ts +191 -0
  512. package/scripts/epic/epic-audit-report.ts +101 -0
  513. package/scripts/epic/epic-audit.ts +240 -0
  514. package/scripts/epic/epic-bundle-cli.ts +472 -0
  515. package/scripts/epic/epic-bundle-evidence.ts +147 -0
  516. package/scripts/epic/epic-bundle-gaps.ts +86 -0
  517. package/scripts/epic/epic-bundle-referenced.ts +195 -0
  518. package/scripts/epic/epic-bundle.ts +309 -0
  519. package/scripts/epic/epic-busy.ts +204 -0
  520. package/scripts/epic/epic-candidate-confirm.ts +279 -0
  521. package/scripts/epic/epic-classify.ts +294 -0
  522. package/scripts/epic/epic-cross-repo.ts +366 -0
  523. package/scripts/epic/epic-fetch.ts +370 -0
  524. package/scripts/epic/epic-graph.ts +279 -0
  525. package/scripts/epic/epic-index.ts +209 -0
  526. package/scripts/epic/epic-issue.ts +172 -0
  527. package/scripts/epic/epic-lane-offer.ts +207 -0
  528. package/scripts/epic/epic-nested.ts +37 -0
  529. package/scripts/epic/epic-next-read.ts +141 -0
  530. package/scripts/epic/epic-next-views.ts +144 -0
  531. package/scripts/epic/epic-next.ts +477 -0
  532. package/scripts/epic/epic-outside-blocker.ts +113 -0
  533. package/scripts/epic/epic-relation-recheck.ts +108 -0
  534. package/scripts/epic/epic-report.ts +200 -0
  535. package/scripts/gate/core-budget.ts +292 -0
  536. package/scripts/gate/gate-log.ts +95 -0
  537. package/scripts/gate/gate-plan.ts +356 -0
  538. package/scripts/gate/gate-report.ts +207 -0
  539. package/scripts/gate/gate-skip.ts +123 -0
  540. package/scripts/gate/gate-tree.ts +49 -0
  541. package/scripts/gate/hook-gate-reuse.ts +130 -0
  542. package/scripts/gate/pre-commit-type-check.ts +187 -0
  543. package/scripts/gate/scoped-green.ts +260 -0
  544. package/scripts/gate/type-check-step.ts +90 -0
  545. package/scripts/gate/verification-gate.ts +531 -0
  546. package/scripts/gh/fix-gh-packages-logic.ts +232 -0
  547. package/scripts/gh/fix-gh-packages.ts +129 -0
  548. package/scripts/gh/gh-cli-token.ts +18 -0
  549. package/scripts/gh/gh-spawn.ts +44 -0
  550. package/scripts/git/animation-helpers.ts +81 -0
  551. package/scripts/git/change-base.ts +26 -0
  552. package/scripts/git/changed-file-scope.ts +209 -0
  553. package/scripts/git/changed-paths.ts +30 -0
  554. package/scripts/git/constants.ts +41 -0
  555. package/scripts/git/git-ai-review-scan.ts +154 -0
  556. package/scripts/git/git-animation.ts +41 -0
  557. package/scripts/git/git-branch.ts +127 -0
  558. package/scripts/git/git-command.ts +587 -0
  559. package/scripts/git/git-commit.ts +27 -0
  560. package/scripts/git/git-common-directory.ts +38 -0
  561. package/scripts/git/git-epic-add-body.ts +365 -0
  562. package/scripts/git/git-epic-add-plan.ts +421 -0
  563. package/scripts/git/git-epic-add.ts +249 -0
  564. package/scripts/git/git-epic-body.ts +150 -0
  565. package/scripts/git/git-epic-chains.ts +411 -0
  566. package/scripts/git/git-epic-close-comment.ts +199 -0
  567. package/scripts/git/git-epic-close.ts +393 -0
  568. package/scripts/git/git-epic-decision.ts +171 -0
  569. package/scripts/git/git-epic-parse.ts +351 -0
  570. package/scripts/git/git-epic-promote.ts +102 -0
  571. package/scripts/git/git-epic-read.ts +73 -0
  572. package/scripts/git/git-epic-reconcile.ts +246 -0
  573. package/scripts/git/git-epic-reference.ts +98 -0
  574. package/scripts/git/git-epic-relations.ts +78 -0
  575. package/scripts/git/git-epic-remove-plan.ts +152 -0
  576. package/scripts/git/git-epic-remove.ts +101 -0
  577. package/scripts/git/git-epic-run.ts +223 -0
  578. package/scripts/git/git-epic-sections.ts +98 -0
  579. package/scripts/git/git-epic-shape.ts +81 -0
  580. package/scripts/git/git-epic-validate.ts +155 -0
  581. package/scripts/git/git-error.ts +78 -0
  582. package/scripts/git/git-execa-error.ts +35 -0
  583. package/scripts/git/git-fixture-workspace.ts +88 -0
  584. package/scripts/git/git-followup-cleanup.ts +88 -0
  585. package/scripts/git/git-followup-flush.ts +63 -0
  586. package/scripts/git/git-followup-label.ts +67 -0
  587. package/scripts/git/git-followup-pending.ts +95 -0
  588. package/scripts/git/git-followup-stages.ts +149 -0
  589. package/scripts/git/git-gh-api-path.ts +118 -0
  590. package/scripts/git/git-gh-check.ts +21 -0
  591. package/scripts/git/git-gh-command.ts +17 -0
  592. package/scripts/git/git-gh-exec.ts +344 -0
  593. package/scripts/git/git-gh-failure.ts +103 -0
  594. package/scripts/git/git-gh-helpers.ts +44 -0
  595. package/scripts/git/git-gh-issue-list.ts +257 -0
  596. package/scripts/git/git-gh-issue-read.ts +457 -0
  597. package/scripts/git/git-gh-issue-rest.ts +238 -0
  598. package/scripts/git/git-gh-issue-write.ts +285 -0
  599. package/scripts/git/git-gh-issue.ts +161 -0
  600. package/scripts/git/git-gh-pr-auto-merge.ts +85 -0
  601. package/scripts/git/git-gh-pr-read.ts +322 -0
  602. package/scripts/git/git-gh-pr-rest.ts +172 -0
  603. package/scripts/git/git-gh-pr-review.ts +103 -0
  604. package/scripts/git/git-gh-pr-rollup.ts +91 -0
  605. package/scripts/git/git-gh-pr-snapshot.ts +138 -0
  606. package/scripts/git/git-gh-pr.ts +219 -0
  607. package/scripts/git/git-gh-reachability.ts +56 -0
  608. package/scripts/git/git-gh-repo.ts +37 -0
  609. package/scripts/git/git-gh-rest-state.ts +14 -0
  610. package/scripts/git/git-issue.ts +168 -0
  611. package/scripts/git/git-location-environment.ts +62 -0
  612. package/scripts/git/git-ls-remote.ts +28 -0
  613. package/scripts/git/git-next-issues.ts +98 -0
  614. package/scripts/git/git-notify.ts +104 -0
  615. package/scripts/git/git-pr-ai-review.ts +180 -0
  616. package/scripts/git/git-pr-checks-eval.ts +265 -0
  617. package/scripts/git/git-pr-checks-parse.ts +153 -0
  618. package/scripts/git/git-pr-checks-watch.ts +184 -0
  619. package/scripts/git/git-pr-checks.ts +387 -0
  620. package/scripts/git/git-pr-coderabbit.ts +129 -0
  621. package/scripts/git/git-pr-confirmation.ts +64 -0
  622. package/scripts/git/git-pr-error.ts +25 -0
  623. package/scripts/git/git-pr-followup-wrapup.ts +225 -0
  624. package/scripts/git/git-pr-followup.ts +436 -0
  625. package/scripts/git/git-pr-managed-config.ts +69 -0
  626. package/scripts/git/git-pr-messages.ts +37 -0
  627. package/scripts/git/git-pr.ts +181 -0
  628. package/scripts/git/git-prompt-display.ts +22 -0
  629. package/scripts/git/git-prompt.ts +207 -0
  630. package/scripts/git/git-push-transport.ts +173 -0
  631. package/scripts/git/git-push.ts +27 -0
  632. package/scripts/git/git-remote-branch.ts +40 -0
  633. package/scripts/git/git-spawn.ts +47 -0
  634. package/scripts/git/git-staging.ts +128 -0
  635. package/scripts/git/git-stash.ts +124 -0
  636. package/scripts/git/git-status.ts +198 -0
  637. package/scripts/git/git-worktree.ts +110 -0
  638. package/scripts/git/github-issue-url.ts +105 -0
  639. package/scripts/git/gone-branch.ts +113 -0
  640. package/scripts/git/issue-labels.ts +279 -0
  641. package/scripts/git/listing-cutoff.ts +51 -0
  642. package/scripts/git/main-merge-guard.ts +134 -0
  643. package/scripts/git/main-merge.ts +120 -0
  644. package/scripts/git/main-sync.ts +121 -0
  645. package/scripts/git/parse-json-array.ts +102 -0
  646. package/scripts/git/schemas.ts +166 -0
  647. package/scripts/git/stash-orphans.ts +91 -0
  648. package/scripts/git/stash-pop-args.ts +59 -0
  649. package/scripts/git/stash-pop-cli.ts +105 -0
  650. package/scripts/git/telegram-notify.ts +404 -0
  651. package/scripts/hooks/batch-guard.ts +144 -0
  652. package/scripts/hooks/check-commit-message.ts +134 -0
  653. package/scripts/hooks/codex-hook-adapter.ts +155 -0
  654. package/scripts/hooks/edited-cspell.ts +128 -0
  655. package/scripts/hooks/format-edited-file-fixtures.ts +109 -0
  656. package/scripts/hooks/format-edited-file.ts +510 -0
  657. package/scripts/hooks/format-rewrite-notice.ts +99 -0
  658. package/scripts/hooks/pre-push-unit.ts +146 -0
  659. package/scripts/hooks/pretool-guard.ts +96 -0
  660. package/scripts/hooks/prevent-main-commit.ts +38 -0
  661. package/scripts/hooks/prompt-hooks.ts +38 -0
  662. package/scripts/hooks/reserved-run.ts +90 -0
  663. package/scripts/hooks/stop-guard.ts +135 -0
  664. package/scripts/init/claude-plugin-config.ts +51 -0
  665. package/scripts/init/distributed-paths.ts +100 -0
  666. package/scripts/init/hook-command-rewrite.ts +85 -0
  667. package/scripts/init/hook-launch.ts +31 -0
  668. package/scripts/init/init-actions.ts +147 -0
  669. package/scripts/init/init-ai-copy.ts +235 -0
  670. package/scripts/init/init-copy-content.ts +50 -0
  671. package/scripts/init/init-logic-deploy-vps.ts +43 -0
  672. package/scripts/init/init-logic-json-merge.ts +340 -0
  673. package/scripts/init/init-logic-migrate.ts +62 -0
  674. package/scripts/init/init-logic-package-key-order.ts +50 -0
  675. package/scripts/init/init-logic-secretlint.ts +36 -0
  676. package/scripts/init/init-logic-sonar.ts +197 -0
  677. package/scripts/init/init-logic-templates.ts +142 -0
  678. package/scripts/init/init-logic-workspace.ts +59 -0
  679. package/scripts/init/init-logic-yaml-merge.ts +57 -0
  680. package/scripts/init/init-logic.ts +474 -0
  681. package/scripts/init/init-paths.ts +11 -0
  682. package/scripts/init/init-sonar.ts +32 -0
  683. package/scripts/init/init.ts +219 -0
  684. package/scripts/init/kit-base-preset.ts +60 -0
  685. package/scripts/init/plugin-install-hint.ts +47 -0
  686. package/scripts/init/tsconfig-preset-migration.ts +67 -0
  687. package/scripts/issue/baseline-measure.ts +105 -0
  688. package/scripts/issue/behavior-change-lint.ts +122 -0
  689. package/scripts/issue/defect-rate-cli.ts +167 -0
  690. package/scripts/issue/defect-rate.ts +145 -0
  691. package/scripts/issue/issue-backlinks-cli.ts +97 -0
  692. package/scripts/issue/issue-backlinks.ts +164 -0
  693. package/scripts/issue/issue-cite-cli.ts +158 -0
  694. package/scripts/issue/issue-cite.ts +102 -0
  695. package/scripts/issue/issue-comment-cli.ts +95 -0
  696. package/scripts/issue/issue-fold-cli.ts +104 -0
  697. package/scripts/issue/issue-fold-existing-cli.ts +81 -0
  698. package/scripts/issue/issue-fold-existing.ts +73 -0
  699. package/scripts/issue/issue-fold.ts +42 -0
  700. package/scripts/issue/issue-lint-cli.ts +60 -0
  701. package/scripts/issue/issue-lint.ts +26 -0
  702. package/scripts/issue/issue-logic.ts +50 -0
  703. package/scripts/issue/issue-read-cli.ts +190 -0
  704. package/scripts/issue/issue-read.ts +145 -0
  705. package/scripts/issue/issue-scout-cli.ts +482 -0
  706. package/scripts/issue/issue-scout.ts +244 -0
  707. package/scripts/issue/issue-state-cli.ts +260 -0
  708. package/scripts/issue/issue-state.ts +109 -0
  709. package/scripts/issue/markdown-section.ts +39 -0
  710. package/scripts/issue/measure-rerun-cli.ts +98 -0
  711. package/scripts/issue/reproduction-measure.ts +59 -0
  712. package/scripts/josh/__snapshots__/josh-command-map.test.ts.snap +1171 -0
  713. package/scripts/josh/agent-session-environment.ts +188 -0
  714. package/scripts/josh/cli-body.ts +96 -0
  715. package/scripts/josh/command-suggest.ts +57 -0
  716. package/scripts/josh/file-map-stamp.ts +264 -0
  717. package/scripts/josh/hook-decision.ts +479 -0
  718. package/scripts/josh/josh-command-map.ts +196 -0
  719. package/scripts/josh/josh-command-types.ts +226 -0
  720. package/scripts/josh/josh-commands-ai.ts +327 -0
  721. package/scripts/josh/josh-commands-backlog.ts +54 -0
  722. package/scripts/josh/josh-commands-clone.ts +18 -0
  723. package/scripts/josh/josh-commands-development.ts +206 -0
  724. package/scripts/josh/josh-commands-document.ts +45 -0
  725. package/scripts/josh/josh-commands-guard.ts +38 -0
  726. package/scripts/josh/josh-commands-hooks.ts +42 -0
  727. package/scripts/josh/josh-commands-issue.ts +69 -0
  728. package/scripts/josh/josh-commands-lane.ts +75 -0
  729. package/scripts/josh/josh-commands-lint.ts +37 -0
  730. package/scripts/josh/josh-commands-maintenance.ts +80 -0
  731. package/scripts/josh/josh-commands-project.ts +53 -0
  732. package/scripts/josh/josh-commands-split.ts +20 -0
  733. package/scripts/josh/josh-commands-versioning.ts +48 -0
  734. package/scripts/josh/josh-commands-workflow.ts +116 -0
  735. package/scripts/josh/josh-composite-arguments.ts +55 -0
  736. package/scripts/josh/josh-environment-file.ts +31 -0
  737. package/scripts/josh/josh-in-process.ts +80 -0
  738. package/scripts/josh/josh-logic.ts +308 -0
  739. package/scripts/josh/josh-run.ts +53 -0
  740. package/scripts/josh/josh-script-reader.ts +11 -0
  741. package/scripts/josh/josh-verdict.ts +111 -0
  742. package/scripts/josh/josh.ts +60 -0
  743. package/scripts/josh/kit-only.ts +33 -0
  744. package/scripts/josh/path-decision.ts +104 -0
  745. package/scripts/josh/platform-temporary.ts +66 -0
  746. package/scripts/josh/process-identity.ts +335 -0
  747. package/scripts/josh/session-language-cli.ts +51 -0
  748. package/scripts/josh/session-language.ts +30 -0
  749. package/scripts/josh/stamp-file.ts +194 -0
  750. package/scripts/lane/lane-await.ts +165 -0
  751. package/scripts/lane/lane-cache-run.ts +39 -0
  752. package/scripts/lane/lane-cache.ts +135 -0
  753. package/scripts/lane/lane-capacity.ts +69 -0
  754. package/scripts/lane/lane-child-invocation.ts +73 -0
  755. package/scripts/lane/lane-child-marker.ts +58 -0
  756. package/scripts/lane/lane-cli.ts +410 -0
  757. package/scripts/lane/lane-close.ts +197 -0
  758. package/scripts/lane/lane-dispatch-log.ts +13 -0
  759. package/scripts/lane/lane-dispatch.ts +458 -0
  760. package/scripts/lane/lane-environment.ts +253 -0
  761. package/scripts/lane/lane-guard-policy.ts +136 -0
  762. package/scripts/lane/lane-install.ts +94 -0
  763. package/scripts/lane/lane-launch-cli.ts +133 -0
  764. package/scripts/lane/lane-occupancy.ts +112 -0
  765. package/scripts/lane/lane-open.ts +275 -0
  766. package/scripts/lane/lane-output.ts +124 -0
  767. package/scripts/lane/lane-paths.ts +96 -0
  768. package/scripts/lane/lane-reap.ts +137 -0
  769. package/scripts/lane/lane-registry.ts +261 -0
  770. package/scripts/lane/lane-relaunch.ts +68 -0
  771. package/scripts/lane/lane-report.ts +95 -0
  772. package/scripts/lane/lane-resume.ts +61 -0
  773. package/scripts/lane/lane-seed.ts +44 -0
  774. package/scripts/lane/lane-start-point.ts +175 -0
  775. package/scripts/lane/openai-lane-supervisor-cli.ts +32 -0
  776. package/scripts/lane/openai-lane-supervisor-decision.ts +63 -0
  777. package/scripts/lane/openai-lane-supervisor.ts +337 -0
  778. package/scripts/lib/bounded-pool.ts +109 -0
  779. package/scripts/lib/buffered-process.ts +82 -0
  780. package/scripts/lib/caddy-logs.sh +45 -0
  781. package/scripts/lib/cli-flags.ts +19 -0
  782. package/scripts/lib/json-value.ts +24 -0
  783. package/scripts/lib/poll.ts +57 -0
  784. package/scripts/lib/read-file.ts +16 -0
  785. package/scripts/lib/schemas.ts +67 -0
  786. package/scripts/lib/spawn-exit.ts +45 -0
  787. package/scripts/lib/status-icons.ts +24 -0
  788. package/scripts/lines/effective-limit.ts +156 -0
  789. package/scripts/lines/line-budget.ts +404 -0
  790. package/scripts/lines/line-targets.ts +80 -0
  791. package/scripts/lines/lines-command.ts +174 -0
  792. package/scripts/lint/cspell-cached.ts +41 -0
  793. package/scripts/lint/lint-parallel.ts +72 -0
  794. package/scripts/lint/lint-related-scope.ts +128 -0
  795. package/scripts/lint/lint-related.ts +104 -0
  796. package/scripts/managed-marker/index.ts +5 -0
  797. package/scripts/managed-marker/managed-marker-logic.ts +67 -0
  798. package/scripts/observations/observation-ledger-home.ts +32 -0
  799. package/scripts/observations/observation-ledger-line.ts +93 -0
  800. package/scripts/observations/observation-ledger.ts +35 -0
  801. package/scripts/observations/observations-flush-cli.ts +42 -0
  802. package/scripts/observations/observations-flush-landing.ts +97 -0
  803. package/scripts/observations/observations-flush.ts +420 -0
  804. package/scripts/overrides/lockfile-overrides.ts +105 -0
  805. package/scripts/overrides/overrides-check.ts +84 -0
  806. package/scripts/overrides/overrides-files.ts +19 -0
  807. package/scripts/overrides/overrides-logic.ts +211 -0
  808. package/scripts/overrides/schemas.ts +49 -0
  809. package/scripts/package/package-scout-cli.ts +195 -0
  810. package/scripts/package/package-scout-format.ts +151 -0
  811. package/scripts/package/package-scout.ts +121 -0
  812. package/scripts/ports/port-command.ts +87 -0
  813. package/scripts/propagate/propagate-git-failure.ts +191 -0
  814. package/scripts/propagate/propagate-git.ts +224 -0
  815. package/scripts/propagate/propagate-publish.ts +181 -0
  816. package/scripts/propagate/propagate-run.ts +201 -0
  817. package/scripts/propagate/propagate-steps.ts +421 -0
  818. package/scripts/propagate/propagate-targets.ts +160 -0
  819. package/scripts/propagate/propagate.ts +216 -0
  820. package/scripts/refactor/import-graph.ts +187 -0
  821. package/scripts/refactor/refactor-lint.ts +250 -0
  822. package/scripts/refactor/refactor-scan-cli.ts +10 -0
  823. package/scripts/refactor/refactor-scan.ts +124 -0
  824. package/scripts/refactor/refactor-targets.ts +103 -0
  825. package/scripts/release/release-cli.ts +88 -0
  826. package/scripts/release/release-history.ts +132 -0
  827. package/scripts/release/release-plan.ts +130 -0
  828. package/scripts/release/release-publish.ts +152 -0
  829. package/scripts/release/release-scope-cli.ts +103 -0
  830. package/scripts/release/release-tag.ts +93 -0
  831. package/scripts/release/release-worktree.ts +71 -0
  832. package/scripts/repo/auto-merge-setting-logic.ts +100 -0
  833. package/scripts/repo/auto-merge-setting.ts +37 -0
  834. package/scripts/repo/repo-setting.ts +112 -0
  835. package/scripts/report/report-lint-cli.ts +49 -0
  836. package/scripts/report/report-lint.ts +250 -0
  837. package/scripts/retrospective/retrospective-cli.ts +97 -0
  838. package/scripts/retrospective/retrospective.ts +127 -0
  839. package/scripts/review/disposition-cli.ts +44 -0
  840. package/scripts/review/disposition-logic.ts +45 -0
  841. package/scripts/review/live-evidence.ts +62 -0
  842. package/scripts/review/review-attest-cli.ts +115 -0
  843. package/scripts/review/review-attest.ts +319 -0
  844. package/scripts/review/review-brief-cli.ts +290 -0
  845. package/scripts/review/review-brief.ts +440 -0
  846. package/scripts/review/review-checkout.ts +56 -0
  847. package/scripts/review/review-finding-ledger.ts +167 -0
  848. package/scripts/review/review-findings-cli.ts +57 -0
  849. package/scripts/review/review-level.ts +86 -0
  850. package/scripts/review/review-record-cli.ts +196 -0
  851. package/scripts/review/review-record.ts +74 -0
  852. package/scripts/review/review-round2-cli.ts +84 -0
  853. package/scripts/review/review-round2.ts +139 -0
  854. package/scripts/review/review-stamps.ts +113 -0
  855. package/scripts/review/review-tree.ts +58 -0
  856. package/scripts/rules/bash-triggers.ts +44 -0
  857. package/scripts/rules/decision-oracle.ts +342 -0
  858. package/scripts/rules/delivered-rules-harness.ts +72 -0
  859. package/scripts/rules/delivered-rules.ts +793 -0
  860. package/scripts/rules/early-heartbeat.ts +241 -0
  861. package/scripts/rules/file-body.ts +150 -0
  862. package/scripts/rules/filing-cap.ts +133 -0
  863. package/scripts/rules/filing-offer.ts +81 -0
  864. package/scripts/rules/firing-point.ts +63 -0
  865. package/scripts/rules/gh-api.ts +65 -0
  866. package/scripts/rules/git-argv.ts +129 -0
  867. package/scripts/rules/git-force.ts +104 -0
  868. package/scripts/rules/implementation-cut-verdict.ts +84 -0
  869. package/scripts/rules/implementation-cut.ts +202 -0
  870. package/scripts/rules/issue-citation.ts +242 -0
  871. package/scripts/rules/issue-fold.ts +73 -0
  872. package/scripts/rules/issue-scout.ts +64 -0
  873. package/scripts/rules/josh-git-bare.ts +80 -0
  874. package/scripts/rules/lane-carry-conflict.ts +96 -0
  875. package/scripts/rules/lane-interactive-ask.ts +71 -0
  876. package/scripts/rules/lane-park.ts +122 -0
  877. package/scripts/rules/lane-switch-main.ts +139 -0
  878. package/scripts/rules/oracle-consulted.ts +81 -0
  879. package/scripts/rules/oracle-firing.ts +151 -0
  880. package/scripts/rules/oracle-list-cli.ts +81 -0
  881. package/scripts/rules/piped-verification.ts +126 -0
  882. package/scripts/rules/poll-loop.ts +125 -0
  883. package/scripts/rules/pre-gate-cut.ts +207 -0
  884. package/scripts/rules/prior-comment-read.ts +106 -0
  885. package/scripts/rules/raw-field-body.ts +56 -0
  886. package/scripts/rules/reply-language.ts +116 -0
  887. package/scripts/rules/rule-body-guard.ts +206 -0
  888. package/scripts/rules/rule-guard.ts +23 -0
  889. package/scripts/rules/rule-value-cli.ts +129 -0
  890. package/scripts/rules/rule-value.ts +397 -0
  891. package/scripts/rules/run-tail.ts +178 -0
  892. package/scripts/rules/shell-body-trigger.ts +204 -0
  893. package/scripts/rules/shell-segments.ts +45 -0
  894. package/scripts/rules/stop-rules.ts +329 -0
  895. package/scripts/rules/tail-commands.ts +35 -0
  896. package/scripts/rules/test-declared-commit.ts +51 -0
  897. package/scripts/rules/third-party-write.ts +90 -0
  898. package/scripts/rules/top-level-scripts-guard.ts +47 -0
  899. package/scripts/rules/worktree-guard.ts +130 -0
  900. package/scripts/run/detached-launch.ts +360 -0
  901. package/scripts/run/run-carry-args.ts +264 -0
  902. package/scripts/run/run-carry-change.ts +69 -0
  903. package/scripts/run/run-carry-cli.ts +441 -0
  904. package/scripts/run/run-carry-flush.ts +63 -0
  905. package/scripts/run/run-carry-stash.ts +71 -0
  906. package/scripts/run/run-carry-streak.ts +113 -0
  907. package/scripts/run/run-carry.ts +550 -0
  908. package/scripts/run/run-cut-args.ts +132 -0
  909. package/scripts/run/run-cut-cli.ts +461 -0
  910. package/scripts/run/run-cut-handoff.ts +126 -0
  911. package/scripts/run/run-cut.ts +531 -0
  912. package/scripts/run/run-ending-cli.ts +111 -0
  913. package/scripts/run/run-ending.ts +239 -0
  914. package/scripts/run/run-entry-cli.ts +135 -0
  915. package/scripts/run/run-entry.ts +95 -0
  916. package/scripts/run/run-event-cli.ts +210 -0
  917. package/scripts/run/run-event-follow.ts +65 -0
  918. package/scripts/run/run-event-render.ts +75 -0
  919. package/scripts/run/run-event-scope.ts +127 -0
  920. package/scripts/run/run-event-stream-emit.ts +140 -0
  921. package/scripts/run/run-event-stream.ts +258 -0
  922. package/scripts/run/run-event-watch.ts +37 -0
  923. package/scripts/run/run-headless.ts +105 -0
  924. package/scripts/run/run-hold-cli.ts +310 -0
  925. package/scripts/run/run-hold.ts +264 -0
  926. package/scripts/run/run-invocation.ts +237 -0
  927. package/scripts/run/run-issue-number.ts +19 -0
  928. package/scripts/run/run-liveness-cli.ts +169 -0
  929. package/scripts/run/run-liveness.ts +424 -0
  930. package/scripts/run/run-merge-cli.ts +385 -0
  931. package/scripts/run/run-merge-steps.ts +326 -0
  932. package/scripts/run/run-merge.ts +158 -0
  933. package/scripts/run/run-next-cli.ts +48 -0
  934. package/scripts/run/run-next.ts +80 -0
  935. package/scripts/run/run-preflight.ts +337 -0
  936. package/scripts/run/run-prep-cli.ts +151 -0
  937. package/scripts/run/run-prep.ts +84 -0
  938. package/scripts/run/run-progress-args.ts +65 -0
  939. package/scripts/run/run-progress-cli.ts +508 -0
  940. package/scripts/run/run-progress-clock.ts +320 -0
  941. package/scripts/run/run-progress-config.ts +119 -0
  942. package/scripts/run/run-progress-read.ts +199 -0
  943. package/scripts/run/run-progress.ts +366 -0
  944. package/scripts/run/run-report-cli.ts +71 -0
  945. package/scripts/run/run-report.ts +78 -0
  946. package/scripts/run/run-review-cli.ts +130 -0
  947. package/scripts/run/run-review-steps.ts +161 -0
  948. package/scripts/run/run-review.ts +121 -0
  949. package/scripts/run/run-ship-cli.ts +431 -0
  950. package/scripts/run/run-ship-detach.ts +200 -0
  951. package/scripts/run/run-ship-probe.ts +103 -0
  952. package/scripts/run/run-ship-return.ts +75 -0
  953. package/scripts/run/run-ship-review-steps.ts +227 -0
  954. package/scripts/run/run-ship-review.ts +177 -0
  955. package/scripts/run/run-ship-stage.ts +150 -0
  956. package/scripts/run/run-ship.ts +78 -0
  957. package/scripts/run/run-status-cli.ts +175 -0
  958. package/scripts/run/run-status.ts +77 -0
  959. package/scripts/run/run-step-cli.ts +111 -0
  960. package/scripts/run/run-step.ts +292 -0
  961. package/scripts/run/run-stop-notify.ts +52 -0
  962. package/scripts/run/run-stranded-cli.ts +31 -0
  963. package/scripts/run/run-stranded-detect.ts +134 -0
  964. package/scripts/run/run-stranded.ts +120 -0
  965. package/scripts/run/run-tail-cli.ts +105 -0
  966. package/scripts/run/run-tail.ts +61 -0
  967. package/scripts/run/run-transcript.golden.txt +57 -0
  968. package/scripts/run/run-wake-cli.ts +428 -0
  969. package/scripts/run/run-wake-describe.ts +97 -0
  970. package/scripts/run/run-wake-driver.ts +80 -0
  971. package/scripts/run/run-wake-handoff.ts +29 -0
  972. package/scripts/run/run-wake-loop.ts +223 -0
  973. package/scripts/run/run-wake-session.ts +150 -0
  974. package/scripts/run/run-wake-work.ts +104 -0
  975. package/scripts/run/run-wake.ts +607 -0
  976. package/scripts/run/run-watcher-guard-cli.ts +37 -0
  977. package/scripts/run/run-watcher-guard.ts +59 -0
  978. package/scripts/run/run-watcher-hook.ts +86 -0
  979. package/scripts/security/secretlint-scan.ts +86 -0
  980. package/scripts/security/security-audit-logic.ts +51 -0
  981. package/scripts/security/security-audit-provision-logic.ts +217 -0
  982. package/scripts/security/security-audit-provision.ts +186 -0
  983. package/scripts/security/security-audit.ts +132 -0
  984. package/scripts/security/security-updates-logic.ts +131 -0
  985. package/scripts/security/security-updates.ts +38 -0
  986. package/scripts/security/sonar-file.ts +44 -0
  987. package/scripts/self-sync-guard/index.ts +5 -0
  988. package/scripts/self-sync-guard/self-sync-guard-logic.ts +98 -0
  989. package/scripts/self-sync-guard/self-sync-refusal.ts +22 -0
  990. package/scripts/sonar/sonar-hotspots-cli.ts +149 -0
  991. package/scripts/sonar/sonar-hotspots.ts +111 -0
  992. package/scripts/split/split-assess-cli.ts +52 -0
  993. package/scripts/split/split-assess.ts +124 -0
  994. package/scripts/sync/dependabot-pin-logic.ts +135 -0
  995. package/scripts/sync/directory-copy-guard.ts +187 -0
  996. package/scripts/sync/file-content.ts +49 -0
  997. package/scripts/sync/managed-config-scope-cli.ts +64 -0
  998. package/scripts/sync/managed-config-scope.ts +123 -0
  999. package/scripts/sync/plugin-skill-directories.ts +15 -0
  1000. package/scripts/sync/reconcile-templates.ts +53 -0
  1001. package/scripts/sync/removed-skill-manifest.ts +27 -0
  1002. package/scripts/sync/skill-migration.ts +192 -0
  1003. package/scripts/sync/sync-configs.ts +156 -0
  1004. package/scripts/sync/sync-hook-safety.ts +82 -0
  1005. package/scripts/sync/sync.ts +417 -0
  1006. package/scripts/sync/synced-paths.ts +52 -0
  1007. package/scripts/sync/template-source-logic.ts +122 -0
  1008. package/scripts/sync/workflow-pin-logic.ts +240 -0
  1009. package/scripts/test/classify-isolation.ts +149 -0
  1010. package/scripts/test/e2e-retry-check.ts +150 -0
  1011. package/scripts/test/http-fault-injection.ts +79 -0
  1012. package/scripts/test/josh-harness-environment.ts +260 -0
  1013. package/scripts/test/josh-harness.ts +96 -0
  1014. package/scripts/test/pilot-files.ts +457 -0
  1015. package/scripts/test/pilot-measure.ts +78 -0
  1016. package/scripts/test/test-declared-changed.ts +99 -0
  1017. package/scripts/test/test-declared-logic.ts +91 -0
  1018. package/scripts/test/test-declared-match.ts +106 -0
  1019. package/scripts/test/test-declared.ts +180 -0
  1020. package/scripts/test/test-e2e-guard.ts +86 -0
  1021. package/scripts/test/test-network-guard.ts +453 -0
  1022. package/scripts/test/test-red-commit.ts +51 -0
  1023. package/scripts/test/test-red-logic.ts +76 -0
  1024. package/scripts/test/test-red.ts +154 -0
  1025. package/scripts/test/test-related-scope.ts +115 -0
  1026. package/scripts/test/test-related.ts +73 -0
  1027. package/scripts/test/test-repository-guard.ts +317 -0
  1028. package/scripts/test/test-state-guard.ts +85 -0
  1029. package/scripts/test/test-stdout-guard.ts +54 -0
  1030. package/scripts/test/test-telegram-guard.ts +90 -0
  1031. package/scripts/test/test-type-logic.ts +31 -0
  1032. package/scripts/test/test-unit-guard.ts +185 -0
  1033. package/scripts/test/unit-guard-environment.ts +12 -0
  1034. package/scripts/test/unit-projects.ts +139 -0
  1035. package/scripts/test/unit-worker-share.ts +251 -0
  1036. package/scripts/test/vitest-include-globs.ts +12 -0
  1037. package/scripts/time-runtime/time-agent-bundles.ts +128 -0
  1038. package/scripts/time-runtime/time-background.ts +300 -0
  1039. package/scripts/time-runtime/time-batch-guard-fixtures.ts +66 -0
  1040. package/scripts/time-runtime/time-batch-guard.ts +529 -0
  1041. package/scripts/time-runtime/time-bundle-call.ts +575 -0
  1042. package/scripts/time-runtime/time-bundles.ts +536 -0
  1043. package/scripts/time-runtime/time-call-identity.ts +37 -0
  1044. package/scripts/time-runtime/time-command-key.ts +35 -0
  1045. package/scripts/time-runtime/time-density-hook.ts +166 -0
  1046. package/scripts/time-runtime/time-density.ts +147 -0
  1047. package/scripts/time-runtime/time-followup-stage.ts +107 -0
  1048. package/scripts/time-runtime/time-format.ts +186 -0
  1049. package/scripts/time-runtime/time-hook-transcript.ts +82 -0
  1050. package/scripts/time-runtime/time-instant.ts +20 -0
  1051. package/scripts/time-runtime/time-markers.ts +228 -0
  1052. package/scripts/time-runtime/time-phase-names.ts +123 -0
  1053. package/scripts/time-runtime/time-reported-failure.ts +227 -0
  1054. package/scripts/time-runtime/time-round-trips.ts +279 -0
  1055. package/scripts/time-runtime/time-shell.ts +286 -0
  1056. package/scripts/time-runtime/time-single-check.ts +65 -0
  1057. package/scripts/time-runtime/time-spans.ts +545 -0
  1058. package/scripts/time-runtime/time-transcript-line.ts +253 -0
  1059. package/scripts/time-runtime/time-writes.ts +71 -0
  1060. package/scripts/ui/ui-routes-cli.ts +122 -0
  1061. package/scripts/ui/ui-routes.ts +102 -0
  1062. package/scripts/version/bump-version.ts +71 -0
  1063. package/scripts/version/effective-upstream.ts +93 -0
  1064. package/scripts/version/index.ts +25 -0
  1065. package/scripts/version/kit-descriptor.ts +10 -0
  1066. package/scripts/version/kit-version-config.ts +30 -0
  1067. package/scripts/version/latest-corepack.ts +404 -0
  1068. package/scripts/version/latest-lane-guard.ts +49 -0
  1069. package/scripts/version/latest-regression.ts +93 -0
  1070. package/scripts/version/latest-scope-cli.ts +147 -0
  1071. package/scripts/version/latest-stamp.ts +107 -0
  1072. package/scripts/version/latest-update.ts +198 -0
  1073. package/scripts/version/package-manager-version.ts +95 -0
  1074. package/scripts/version/parse-json.ts +13 -0
  1075. package/scripts/version/preinstall-version-update.ts +84 -0
  1076. package/scripts/version/publishable-range-check.ts +74 -0
  1077. package/scripts/version/publishable-range.ts +123 -0
  1078. package/scripts/version/release-age.ts +146 -0
  1079. package/scripts/version/release-hold.ts +142 -0
  1080. package/scripts/version/running-binary.ts +42 -0
  1081. package/scripts/version/upgrade-command-guard.ts +49 -0
  1082. package/scripts/version/upgrade-shell-command.ts +30 -0
  1083. package/scripts/version/version-check-logic.ts +333 -0
  1084. package/scripts/version/version-check.ts +14 -0
  1085. package/scripts/version/version-command-config.ts +177 -0
  1086. package/scripts/version/version-commands.ts +296 -0
  1087. package/scripts/version/version-remote.ts +86 -0
  1088. package/scripts/version/version-targets.ts +81 -0
  1089. package/scripts/yaml/yaml-document.ts +46 -0
  1090. package/scripts-ai/completion-gate.ts +13 -0
  1091. package/scripts-ai/environment-loader.ts +9 -0
  1092. package/scripts-ai/epic-check.ts +34 -0
  1093. package/scripts-ai/epic-cli-argv.ts +77 -0
  1094. package/scripts-ai/epic-cli-remove.ts +71 -0
  1095. package/scripts-ai/epic-cli.ts +413 -0
  1096. package/scripts-ai/epic.ts +192 -0
  1097. package/scripts-ai/followup-issue-number.ts +31 -0
  1098. package/scripts-ai/git-followup-finish.ts +217 -0
  1099. package/scripts-ai/git-followup-workflow.ts +252 -0
  1100. package/scripts-ai/git-workflow.ts +246 -0
  1101. package/scripts-ai/telegram-test-logic.ts +88 -0
  1102. package/scripts-ai/telegram-test.ts +130 -0
  1103. package/templates/gitignore +76 -0
  1104. package/templates/sonar-project.properties +52 -0
  1105. package/templates/workflows/ci.yml +639 -0
  1106. package/templates/workflows/dependabot-auto-merge.yml +428 -0
  1107. package/tsconfig/base.json +50 -0
  1108. package/tsconfig.sonar.json +34 -0
@@ -0,0 +1,600 @@
1
+ # `backlogrun` — progress, the hand-off, resume and waiting
2
+
3
+ **Read this file in full before the progress watcher starts** (`pnpm josh run:progress --wait`) and
4
+ before the hand-off check at a child's merge (`pnpm josh cost --cut`). It is a point-of-use
5
+ document, never an entry read: the entry procedure is `backlogrun.md`, which points here at those
6
+ steps (joshuafolkken/kit#2010). This file is the single source of the heartbeat, the session hand-off
7
+ and cut/resume, waiting without waiting forever, and the end-of-run summary and propagate.
8
+
9
+ After a carry hand-off, the detached `run:wake` supervisor runs the deterministic `backlog:drive`
10
+ loop. References below to a parent's mechanical polling and lane collection describe work now done
11
+ by that supervisor; an AI parent is started only for a driver branch that requires judgment.
12
+
13
+ ## Progress while the run is quiet
14
+
15
+ **Start the progress step before step 1 of the loop, and do it without being asked.**
16
+
17
+ ```bash
18
+ pnpm josh run:progress --wait --output <the transcript path of each delegated unit> # in the background
19
+ ```
20
+
21
+ **`--wait` waits one silence interval out, prints one line and exits — and the exit is what makes the
22
+ line arrive.** A harness that delivers a background command's output *when that command exits* — Claude
23
+ Code is one — relays nothing from a watcher that never exits; the long-running form (no `--wait`) is
24
+ right only where output is streamed. The parent changes no value on the line. **Every interval is three
25
+ moves and no fourth:**
26
+
27
+ 1. Start `pnpm josh run:progress --wait --output <transcript paths>` **in the background**.
28
+ 2. When it exits, **present what it printed as-is** — the command prints the five labelled lines and the
29
+ next report time itself.
30
+ 3. **In that same turn, start the next one.** The interval is measured from the last report.
31
+
32
+ **`pnpm josh run:watcher:guard` detects a missed restart** (joshuafolkken/kit#2113): it refuses when
33
+ lane children are in-flight but the watcher's life record has gone stale. **It is wired into
34
+ `pretool-guard`, the one `PreToolUse` hook** (joshuafolkken/kit#2353), so the next tool call is refused
35
+ until the watcher is restarted — once per run, so the `pnpm josh run:progress --wait` that fixes it is
36
+ not blocked.
37
+
38
+ **`run:progress` prints the five labelled lines itself now (joshuafolkken/kit#2026); present them
39
+ as-is.** It emits the observation instant (`at`, local first and UTC beside it), the elapsed figures
40
+ (`quiet` and `unchanged`), the children in flight, the run state (`lanes`, `load`, `record`), and the
41
+ scheduled `next`, each behind its own label and on its own line — so relay the output verbatim and
42
+ round, rephrase or re-label nothing. How each field reads when it has nothing to report (`record
43
+ unread`, `no in-progress child yet`, `lanes none`, an absent `next`) is fixed by the command's own unit
44
+ tests. **A value said that way is still an observation, never a state**: `record unread` means no
45
+ `--output` path was given, not *not stalled*; `lanes none` is *no lane is open*, not *nothing is
46
+ running*; and the `next` line is a schedule — the time *if the silence continues*, superseded when a
47
+ real report resets the clock through `--mark`.
48
+
49
+ **It exits only when it has a line to hand over**, or when `--hours` runs out having never gone quiet
50
+ for a whole interval (that exit says so on standard error). **Nothing in flight keeps it waiting**, or
51
+ step 3 would make it a poll.
52
+
53
+ **`--mark` at every real report.** Whenever this loop reports something of its own — a child merged,
54
+ parked, a stop — run `pnpm josh run:progress --mark` in the same turn to restart the silence clock, so a
55
+ heartbeat does not land immediately behind a real report. The clock is silence, never a timer
56
+ (`docs/josh-commands.md` → "`josh run:progress`").
57
+
58
+ **Do not keep a progress clock of your own** — the hook refuses the arm rather than asking. A `Bash`
59
+ call that only sleeps adds a second clock nobody reconciles, so `scripts/rules/early-heartbeat.ts` →
60
+ `decide` refuses a sleep-only `Bash` call on three tests — a timer it already allowed is still live, the
61
+ report it would produce would land before the interval is up, or the wait runs longer than the interval
62
+ — so **a single correctly-spaced arm is allowed**. It is still not the way to report; the step above
63
+ prints without arming anything, and `--wait` is not a wait timer.
64
+
65
+ **The default interval is twenty minutes, overridable — by the person, not the run.**
66
+ `JOSH_PROGRESS_INTERVAL_MINUTES` moves both sides (the guard reads it through the watcher's reader);
67
+ `josh` → `progress_interval_minutes` in `package.json` sits one step below the variable, so a cadence
68
+ set once holds on every machine and cloud session. **`--interval` moves the watcher alone** — a hook
69
+ has no command line — so it makes the watcher quieter than the floor, never the guard stricter. Twenty
70
+ rather than ten because a child measures 20–46 minutes.
71
+
72
+ **An explicit ask is not a heartbeat, and it is exempt by construction** — what is refused is arming a
73
+ *timer*, and a person asking "how is it going" arrives with no timer in front of it.
74
+ **Every unscheduled progress statement is answered by `pnpm josh run:progress --once`** — presented in
75
+ the same five field lines, the reply to an explicit ask and the note just after a run starts alike.
76
+ **Never write a clock time the command did not print** (not an approximation, not a placeholder — where
77
+ a field is missing, say so). **`--once` records the report**, so no `--mark` beside it. **A live timer
78
+ is counted from the record the guard writes when it allows one**, never from the machine's `sleep`
79
+ processes.
80
+
81
+ **Every report opens with the time the observation was taken** — not only how long it has been quiet: an
82
+ absolute instant, `at YYYY-MM-DD HH:MM±HH:MM / YYYY-MM-DDTHH:MMZ`. A relative figure means something
83
+ only while the reports keep coming, and unattended execution is made of the events that break that — a
84
+ suspend, a rate limit, a restart. **The date is part of it**, and **the local clock leads with UTC
85
+ beside it and the offset that ties them** (the line is relayed to other machines and read in cloud
86
+ sessions). **It is added, never substituted for the elapsed figure**, and **the presented line needs no
87
+ stamp computed for it** — the command prints the `at` stamp and the `next` field.
88
+
89
+ **The line carries observations, never "still running", and nothing in it is a verification result** —
90
+ no gate, CI or check rollup, because the command reads none of them.
91
+
92
+ **The invariant is a tier, not a mechanism** (joshuafolkken/kit#2156, joshuafolkken/kit#2207). Three
93
+ tiers say how much of a person's attention a signal takes: **interrupt** reaches for it now (a Telegram),
94
+ **ambient** is seen without being asked for, and **requested** is read only when a person types for it.
95
+ **The heartbeat sits at the ambient tier, and stays there across a `backlogrun` session cut — never
96
+ promoted to interrupt, never demoted to requested.**
97
+
98
+ **The report surface belongs to the run, not to the session** (joshuafolkken/kit#2207). The run's
99
+ session-facing events — a plan posted, a child launched, a PR opened, a review round, a park, a cut, a
100
+ stop, a merge — are appended to one ordered stream keyed to the run's identity (`pnpm josh run:event`),
101
+ which survives the cut because it is the run's and not any one session's. **Every session is a writer;
102
+ the reader is a script in a pane of the person's own, never a conversation** (#2492):
103
+ `pnpm josh run:event --watch` prints each event the moment it lands, in the session language, and the
104
+ `heartbeat` events say the run is alive when quiet. A relaying session re-read its whole history per
105
+ event, so **no session relays the stream** — name the watch command once, at the first cut or when
106
+ asked. **It is the same reader before and after the cut**: a cut moves who executes, never where the
107
+ stream lives.
108
+
109
+ **Interrupt is withheld on purpose**: no Telegram, because `confirmation` and `completion` are what
110
+ interrupt a person, and a line every fifteen minutes is the fatigue that stops them being
111
+ read. **`pnpm josh run:wake --list` is the requested tier** — the last-event read of the stream the
112
+ watch pane reads, for a person who types for one line rather than watching. **`tail -F` on the
113
+ raw stream file is a recovery path, not the ambient surface** — the watch pane is how progress is seen
114
+ without asking, and the raw `tail` is the fallback when the pane has stopped, named for that role in
115
+ `--list`'s own output.
116
+
117
+ **A stop is an interrupt, and only a stop** (joshuafolkken/kit#2136). The heartbeat says a run is still
118
+ going; a run that has _stopped_ — every remaining child blocked behind a parked one, the backlog drained
119
+ of anything runnable, the failure streak tripped — is the event the ambient tier was hiding, because
120
+ after a cut "quiet" and "stopped" look identical until a person reads for it. So the terminal stop is
121
+ pushed to the interrupt tier: `pnpm josh run:carry --end --stopped "<reason>"` sends one ⏸️ confirmation
122
+ as it ends the record, and because the record is gone by the second `--end` the same stop never notifies
123
+ twice. A parked child is pushed by the child itself, which records the park and sends its own
124
+ `confirmation` before it stops (`backlogrun-park.md`). **Nothing new carries either one** — both ride the
125
+ existing notification types and the record the watcher already keeps.
126
+
127
+ **A heartbeat is emitted from the moment a run has started, even before any child carries
128
+ `in-progress`** — "a run has started" is read from a mechanical record (a registered lane, a held work
129
+ tree, or a carried budget), and the line names that stage as an observed fact (`no in-progress child
130
+ yet`). **Only a checkout with no run recorded at all stays silent**, which keeps an ordinary
131
+ conversational session outside the heartbeat.
132
+
133
+ **The scope is every implementing run, not this command alone.** `fullrun`, `halfrun` and `backlogrun`
134
+ start the same watcher under the same rules, and this section is the single source for all four; `kickoff`
135
+ starts none. **`halfrun` is included** because the trigger is silence rather than command identity — it
136
+ still implements, runs the whole gate, both review rounds and `pnpm josh test:e2e`, most of the 20–46
137
+ minutes.
138
+
139
+ **One watcher per run, and the outermost invocation is the one that starts it.** A `fullrun` running as
140
+ a `backlogrun` named issue or an `backlogrun` child starts none: the brief names the invocation it descends
141
+ from. `backlogrun` starts one for the whole batch. **A dispatched lane child is refused a watcher by its
142
+ `JOSH_LANE_CHILD` mark** — it still runs `--mark` for the parent's clock, but every reporting form
143
+ (`--wait`, `--once`, the default watch) exits at once with a notice, so a child that misreads the prose
144
+ is harmless.
145
+
146
+ **In a single-issue run it starts immediately after `pnpm josh run:hold` succeeds** — the hold is itself
147
+ the record that says the run has started. **It is started in the target repository's checkout, and
148
+ `--mark` is run there too** — a cross-repository run is implemented in that repository's checkout, and a
149
+ watcher started in the session's own tree would read the wrong `in-progress` listing.
150
+
151
+ **What counts as a real report when the run has one issue.** A `fullrun` has exactly one child, so the
152
+ unit is **any turn that puts a progress statement in front of the person** — four of them, `--mark` run
153
+ in the same turn as each: **the Step 0 work summary, the pull request opening, each review round's
154
+ verdict, and any `confirmation` / `failure` / `completion` notification or stop.** **A tool result only
155
+ you read is not one** — a gate run, a `gh` read, an edit — and marking on those would hide the silence
156
+ the interval measures.
157
+
158
+ **On a quiet tick the turn is the relayed line plus at most two lines of the run's own prose**, saying
159
+ only what changed stage and what is being waited on. **A tick is quiet when none of the real reports
160
+ happened since the last one**; a gate that went green, a review round, a file edited, a poll answering
161
+ `wait` are the run working, not a report. **No table, no re-listing of children, no restating of the
162
+ plan** — `epic:next`, the epic body and the progress comment hold all three. **A real report is not
163
+ bounded by that**: `--mark` restarts the clock, so a merge, a park or a stop is where the run may be
164
+ long.
165
+
166
+ **`--output` is omitted in a single-issue run, and `record` reads `unread`** — there is no delegated
167
+ unit to name (a batch's unit changes every issue), so a fixed path would age a finished unit's file;
168
+ `unread` is the command's defined answer for "no path was given".
169
+
170
+ **A run that merges needs no teardown; a run that stops has to end the reporting itself.** The issue
171
+ leaves the `in-progress` listing at the merge, so whatever is waiting prints nothing and `--hours` ends
172
+ it. **A stop keeps that label on purpose** — so **no further `--wait` is started** after the stop
173
+ notification, and any long-running watcher still in the background is stopped in the same turn. That
174
+ covers `halfrun`'s stop before commit, a `needs-human-review` stop, a split or prerequisite stop, and
175
+ a `backlogrun` named issue's failure stop.
176
+
177
+ ### Running a named epic's children
178
+
179
+ `josh epic:next <E> --repo <this repository> --lanes` prints **one issue number per line** on standard
180
+ output — as many as that repository has free lanes — or, when there is no child to run, the verdict as a
181
+ single token. Everything else goes to standard error. Without `--lanes` the answer is a single token
182
+ either way.
183
+
184
+ ```bash
185
+ answers=$(pnpm josh epic:next 858 --repo joshuafolkken/kit --lanes)
186
+ # one issue number per line, up to the number of free lanes; a verdict token when there is none
187
+ answers=$(pnpm josh epic:next 858 909 --repo joshuafolkken/kit --lanes)
188
+ # every named epic, merged into the same pool — "Several epics in one run" above
189
+ ```
190
+
191
+ **`--lanes` is the form to use.** A lane's branch is `<N>-lane`, which `pnpm josh git` commits from, so
192
+ a child handed a lane runs the whole `fullrun` procedure inside it. Read a line per child, and treat a
193
+ single non-numeric line as the verdict.
194
+
195
+ 1. Run the command above.
196
+ 2. **One or more numbers** — where the child runs in this session's own checkout, its `fullrun` claim
197
+ `pnpm josh run:hold <N>` **now runs the preflight check itself** and is obeyed: `reclaim` is
198
+ recovered and `run:hold` asked again, `park` parks this child and returns to step 1, `unknown` stops
199
+ the session, `resume` starts the child on the branch that is there with the whole verification gate
200
+ re-run, and `hold` starts it. **In a lane the check is skipped**, and `lane:open`'s own answer
201
+ replaces it. **Everything from here on is per child**:
202
+ with several in flight each is confirmed, counted and closed on its own, and step 1 is asked again
203
+ once a lane comes free rather than once the last child returns. Either way the child runs as
204
+ `fullrun #<N>` does, **in a delegated unit where one is available** (`pnpm josh delegate epic-child`
205
+ → `delegate`) and **in this session's own context where none is**, **except that `josh latest` is
206
+ not run** and **no progress watcher is started**. `git switch main && git pull` runs per child in
207
+ whichever context implements it, **and again in this session afterwards** when the child was
208
+ delegated. **In a lane the child cannot run it at all**, so it is the parent's, immediately before
209
+ that lane's `lane:open`.
210
+
211
+ **Start the unit without blocking on it — `pnpm josh lane:dispatch <N>` when the child runs in a
212
+ lane — and in the same turn start `pnpm josh lane:await <N...>` in the background** (joshuafolkken/kit#2113).
213
+ `lane:await` watches local process presence and exits when any named child confirms-complete,
214
+ waking the parent at the actual completion rather than at the next heartbeat interval. **The
215
+ re-confirm delay and poll interval are the command's, not the agent's** — pass only the issue
216
+ numbers.
217
+
218
+ **A `lane:await` wake is a confirmed-gone process, so classify the ending at once — do not wait out
219
+ the silent-unit window** (joshuafolkken/kit#2277). `lane:await` exits only after the child's process
220
+ has disappeared and stayed gone across its re-confirm delay, which is the definitive end signal; a
221
+ child that died reaching the API wrote its last line — an `API Error` — just before it went, so a
222
+ `run:liveness` poll would read that fresh output as `alive` and sit for the whole 30-minute silent-unit
223
+ window before it ever said `stopped` (the measured 402-/52-minute waits). So on a `lane:await` wake go
224
+ straight to `pnpm josh run:merge <N> --output <path>` — the composite reads the child's **exit
225
+ record**, decisive whether the child merged, died on an outage, or abandoned mid-implementation
226
+ ("Running a named epic's children" reads its tokens). An outage child is re-dispatched in the same run
227
+ and a run of them trips the environment guard; nothing waits for a person.
228
+
229
+ **`run:liveness` stays the fallback for a lane no `lane:await` is watching** — a handed-over lane a
230
+ resumed session polls ("Picking the lanes up in the fresh session"). Ask
231
+ `pnpm josh run:liveness <N> --output <path> --process <what `pgrep -laf "(fullrun|run-ship-cli\.ts .*) #<N>$"` found>` where
232
+ that file has been unchanged for the silent-unit window; on `stopped` its own advice routes the child
233
+ through the same `run:merge --output` classification. **The flag is what you saw, never what kind of
234
+ child it is.**
235
+
236
+ When the unit reports back, **confirm the child from GitHub before believing it**:
237
+
238
+ ```bash
239
+ pnpm josh issue:state <N> # a child in this repository
240
+ pnpm josh issue:state <N> --repo <owner/repo> # a child in another one
241
+ # state: CLOSED
242
+ # labels: (none)
243
+ # human_review: no
244
+ ```
245
+
246
+ **`--repo` is not optional for a cross-repository child.** Without it the read resolves `<N>` against
247
+ the repository this session runs in.
248
+
249
+ `state: CLOSED` is the only answer that means the child finished. **Read the `human_review:` and
250
+ `labels:` lines before calling anything else a failure** — three outcomes look alike from here, which
251
+ is why one command prints all of them. **A non-zero exit is not `OPEN`**: the command exits non-zero
252
+ without a state when the number resolves to nothing (`does not resolve`) or the read failed (`could
253
+ not read`, a rate limit or expired auth). Re-read before deciding.
254
+
255
+ - **Open, carrying `needs-decision`** — the unit **parked** it. Not a failure: leave the label on, do
256
+ **not** count it against the consecutive-failure guard, and go back to step 1.
257
+ - **Open, and `human_review: yes`** — the child **stopped before its commit**, the run's own ending
258
+ (§2z). **`Open` is part of the test** — a CLOSED child carrying the label finished and merged.
259
+ **Read that line, not the `labels:` one**: GitHub keeps the spelling a label was created with, so
260
+ matching the lowercase string by eye drops the child into the failure branch below. Leave
261
+ `in-progress` **on**, do not park it, do not count it, and do **not** go back to step 1. Finish the
262
+ session and report. **Do not send a second `confirmation` Telegram** — the unit already sent one.
263
+ Where the child ran in this session's own context, that first notification is yours to send.
264
+ - **Open, without `needs-decision`** — it failed. Remove the stale `in-progress` here (Tier A), count
265
+ it against the consecutive-failure guard, and **park it**. Parking is what stops the next
266
+ `epic:next` from handing the same child straight back.
267
+
268
+ **Never ask `epic:next` in place of this read.** A child that did not finish still carries
269
+ `in-progress`, which `epic:next` classifies as waiting on time — the loop would poll to the 90-minute
270
+ stale window and learn nothing.
271
+
272
+ **A merge is one event, and one call of the parent's — `pnpm josh run:merge <N>`**
273
+ (joshuafolkken/kit#2024). What was a reading turn and an acting turn is one composite command: it
274
+ confirms the child from GitHub, does the post-merge steps, folds in the hand-off check, and prints
275
+ the next child number — or a control verdict — for the parent to read. Pass the merged child's
276
+ number and the offer's source — `--epic <E> --repo <owner/repo>` for a named epic,
277
+ nothing for the opted-in backlog — with `--owner "$PPID"` so it counts into the carry record under
278
+ the ownership guard.
279
+
280
+ ```bash
281
+ next=$(pnpm josh run:merge <N> --epic <E> --repo <owner/repo> --owner "$PPID" --output <path>)
282
+ # a child number (or several, one per free lane) to run next, or a verdict token
283
+ ```
284
+
285
+ **Pass `--output <path>` — the child's transcript** (joshuafolkken/kit#2240). It is what lets the
286
+ composite tell an API-outage ending apart from a genuine child failure: without it an OPEN, unparked
287
+ child is a plain failure as before, so the flag is how the outage split is turned on.
288
+
289
+ **What the one call does is decided by what the child turned out to be** — read from its GitHub state
290
+ (and, for the failed case alone, its exit record), never from a log: a **merged** child (CLOSED) is
291
+ counted into the carry record (which resets the failure streak), then `pnpm josh ms`,
292
+ `pnpm josh lane:close <N>`, and the counters mirrored onto the epic comment; a **parked** child (OPEN,
293
+ `needs-decision` or `already-done`) is left alone and not counted; an **outage** child (OPEN, neither
294
+ label, but the exit record shows it could not reach the API) has its stale `in-progress` dropped, is
295
+ **not** parked and **not** counted against the consecutive-failure guard, and stays re-dispatchable
296
+ (joshuafolkken/kit#2240); a **failed** child (OPEN, neither label, not an outage) has its stale
297
+ `in-progress` dropped, is parked with `needs-decision`, and is counted against the consecutive-failure
298
+ guard. **A turn whose whole content is one read, or one two-line progress report, is the shape this
299
+ collapses.**
300
+
301
+ **Beyond the offer `epic:next` prints** (`run` becomes numbers; `wait` / `stop` / `complete` /
302
+ `error` pass through), the composite adds six verdict tokens: `over` — the merge crossed the budget,
303
+ so hand the lanes over and take the cut ("The hand-off" below); `human-review` — the child stopped
304
+ before its commit, the run's own ending (SKILL.md → §2z), so stop; `stop` — the consecutive-failure
305
+ guard tripped; `environment` — the consecutive-**outage** guard tripped, so the API is down and the
306
+ run stops as an environment failure rather than the children's (joshuafolkken/kit#2240); `resumed` —
307
+ an unadopted cut was relaunched; `lane:await <N>` it again (joshuafolkken/kit#2484); and `retry` — the child's state could not be read, so re-read it.
308
+
309
+ **The counters are the carry record's, and the epic progress comment is generated from it** (see "The
310
+ counters live in the record" below). **The hand-off check is folded into the merge branch of the one
311
+ call** — `pnpm josh cost --cut`, run after `pnpm josh ms`; `under` offers the next child,
312
+ `over` prints `over` so the parent hands its lanes over and takes the cut ("The hand-off" below), and
313
+ a session that cannot measure is read as `over`. **Never read the condition off `pnpm josh delegate
314
+ epic-child`** — a static policy lookup that answers `delegate` everywhere, so a gate built on it never
315
+ fires.
316
+ 3. **`wait`** — go back to step 1. **With something of this run's own in flight, that happens on the
317
+ wake the progress watcher's exit delivers** and the parent starts no sleep of its own; the 60 s
318
+ figure bounds how soon the ask may be repeated. **With nothing in flight the watcher declines and
319
+ never exits, so the parent keeps the interval** — the case for "another repository has work but this
320
+ one does not", and for a cross-repository publish wait. The table in "The wake exists only while
321
+ something is in flight" below decides which.
322
+ 4. **`stop`** — report the parked children and finish.
323
+ 5. **`complete`** — post the epic summary and finish.
324
+ 6. **Exit code 1** — `epic:next` refused a cyclic or contradictory graph, or could not read a child.
325
+ Report and finish.
326
+
327
+ ## After a named epic completes
328
+
329
+ **When a named epic's children are all processed — merged or parked — the run advances to the next
330
+ named item, and then drains the opted-in backlog** (unless `--only`, which stops after the named
331
+ list). A completed epic is one step of the invocation, never its end: `backlogrun` owns the whole
332
+ opted-in pool, so it goes on to whatever the plan and `backlog:next` offer next. A named item that is
333
+ a bare, non-epic Issue reaches the same point when it merges without a prerequisite or a split turning
334
+ up ("Nothing found means no epic"). The epic's own completion summary is sent by the session standing
335
+ in the repository that owns it ("Who sends the summary, and who propagates" below).
336
+
337
+ ## The hand-off — one session does not have to run the whole batch
338
+
339
+ **A session pays for every child it has already run, on every later turn**, because every turn re-reads
340
+ the accumulated preamble. **So the run reads the marginal cost off a line rather than feeling for it** —
341
+ at **every** child's merge, and crossing it **hands the session off to a fresh one, carrying the budget
342
+ with it** (`backlogrun-steps.md` → "The session cut is inside the invocation"). The cut is where a `backlogrun` spans several
343
+ sessions; it is not a stop.
344
+
345
+ ```bash
346
+ pnpm josh cost --cut
347
+ ```
348
+
349
+ It prints `over` or `under` on standard output and the measured figure on standard error. `over` means
350
+ the next turn of this session costs more than the threshold in billed input, and the number is passed
351
+ explicitly so a run cannot drift it by remembering it wrong.
352
+
353
+ **135,000 is shared by the scheduler entry, scheduler hand-off and lane worker implementation cut.**
354
+ The value is `CONTEXT_CUT_THRESHOLD` in `scripts/cost-runtime/context-cut-threshold.ts`; `cost --cut`,
355
+ `run:merge` and `run_cut.IMPLEMENTATION_CONTEXT_THRESHOLD` all read it rather than carrying separate
356
+ numbers. The output ceiling and the entry-read figure are a separate 150,000, not this threshold.
357
+
358
+ ### The check is asked at every merge, and delegation does not excuse it
359
+
360
+ **A delegating parent reaches the threshold too**, because most of its billed input is conversation
361
+ history rather than resident preamble, and the cost is not linear — n requests bill about n²/2, so a
362
+ condition that delays the first cut multiplies a cost rather than deferring it. **So there is no
363
+ condition: `pnpm josh cost --cut` is asked after every child's merge**, delegated or not.
364
+ **Never wire the question to `pnpm josh delegate epic-child`** — a static policy lookup answering
365
+ `delegate` on every machine forever, so a gate built on it never fires.
366
+
367
+ `over` and `under` are not the only answers: the command **exits 1 with empty standard output** when
368
+ there is no transcript, or no request in it. **Neither is `under`.** Reading "could not measure" as
369
+ "still cheap" is the same mistake as reading an unreadable comment listing as "no findings" — report that
370
+ the check could not answer, and take `over`'s branch at that child.
371
+
372
+ ### When to ask, and what to do
373
+
374
+ **Ask once per child, immediately after its merge and `pnpm josh ms`** — never mid-child. That is the
375
+ only moment where **this** child's work is all written down: the PR is merged, the working tree is clean
376
+ on the default branch, and the epic's state on GitHub is complete.
377
+
378
+ ### The lane child reuses this measurement mid-implementation
379
+
380
+ **The same `pnpm josh cost --over` measurement bounds a lane child's context _during_ implementation, not
381
+ only the parent's between children** — the pre-gate cut fires only once implementation is done, so it
382
+ never caps the thinking a child accumulates while implementing. The child measures its own per-request
383
+ context with **this command** at the shared `CONTEXT_CUT_THRESHOLD`, 135_000, and cuts with
384
+ `pnpm josh run:cut --impl <N> --handoff <path>`. **The measurement and threshold are single-sourced**:
385
+ `cost_verdict.per_request_cost` is what both seams compare, and `cost --cut` selects the same constant
386
+ for both. The boundary and the resume: `pre-gate-cut.md` → "The implementation-phase cut".
387
+
388
+ **A merge is not by itself a safe seam, because another lane may still be running.** The reference to
389
+ where each unit writes lives in the lane, so a session that never dispatched the child can poll it and
390
+ the pool is handed over instead of drained. **Read the lanes rather than judging them:**
391
+
392
+ ```bash
393
+ pnpm josh lane:list # `none`, or one line per lane with its state and its recorded output path
394
+ ```
395
+
396
+ **Every lane in flight is handed over, and the last column is what makes that possible.**
397
+ `pnpm josh lane:output <N>` prints the same path on its own, so the next session polls a lane it never
398
+ opened with two:
399
+
400
+ ```bash
401
+ unit_output=$(pnpm josh lane:output <N>) &&
402
+ pnpm josh run:liveness <N> --output "$unit_output" --process alive
403
+ ```
404
+
405
+ **`--process` carries what `pgrep` found, and with a dispatched child that is the whole answer.** Run
406
+ `pgrep -laf "(fullrun|run-ship-cli\.ts .*) #<N>$"` first and pass `alive` where it found the child and `none` where it did not
407
+ — **never `alive` because the child was dispatched.** The child's command line holds no path, so a
408
+ `pgrep` on the lane's directory never matches a live child; the trace is the deciding input, because a
409
+ log that has stopped moving is a session thinking rather than one that died.
410
+
411
+ **The `&&` is load-bearing.** A lane that records nothing prints `none` and exits non-zero; substituted
412
+ straight into `--output`, that `none` is a relative path and `run:liveness` answers `undetermined` for
413
+ ever.
414
+
415
+ - **`under`** — go back to step 1 of the loop and run the next child.
416
+ - **`over`** — **the run hands its lanes over and takes the cut at once.** Open no new lane and take no
417
+ new child. Confirm every lane still in flight records an output path — one missing is filled in with
418
+ `pnpm josh lane:output <N> <path>` — then take one of the next two bullets in the same turn. **There
419
+ is no waiting here at all**: nothing has to finish, because nothing is being abandoned. The child is
420
+ an operating-system process of its own (`pnpm josh lane:dispatch`), so the lanes keep running.
421
+ - **A lane nobody could poll** — `unreadable`, or `open` with no recorded path and none that can be
422
+ supplied — **and the cut does not happen.** Name that lane in the progress comment and go back to
423
+ step 1 of the loop; the reading is asked again at the next merge.
424
+ - **Every in-flight lane records a path** — **record the cut and hand the session off.** `backlogrun`
425
+ declares a budget — `--max`, `--idle` and the 8-hour bound — so the cut is an execution detail: count
426
+ everything the session has, then run `pnpm josh run:carry --cut --owner "$PPID"`. **Unless it answers
427
+ `capped`** (below), `pnpm josh run:wake` then starts the next session, which polls the still-running
428
+ lanes from `lane:list`. Post the progress comment naming **every lane in flight and the path each
429
+ records**, name `pnpm josh run:event --watch` for a pane, and end the turn — nothing is relayed (#2492).
430
+ `backlogrun-steps.md` → "The session cut is inside the invocation" is the single source of the
431
+ carry; this reading is only where the cut is *taken*.
432
+ - **`capped`** — the invocation has taken its `MAX_CUTS` cuts (joshuafolkken/kit#2346), so `--cut`
433
+ refused and left the record un-handed-off. **Do not `run:wake` or hand off**: a wake over it recovers
434
+ as a crashed owner into a fresh cold session — the churn the cap prevents. Carry **this** session on
435
+ uncut and re-ask at the next merge.
436
+
437
+ **The hand-over is what makes the cut reachable, and the drain it replaced cost the pool.** `epic:next
438
+ --lanes` keeps the seats full, so a cut gated on an idle pool that merely happened would read `over` at
439
+ every merge and cut at none. Recording the path removes that cost.
440
+
441
+ **A lane is handed over only where the next session can actually poll it.** A lane whose state is
442
+ `open` **and** whose recorded path is not `-` is handed over. A **`stranded`** lane has no work tree and
443
+ so no running child — `pnpm josh lane:prune` closes it. An **`unreadable`** one cannot be told apart
444
+ from a running child, and an `open` lane recording **no path** is the same: **the cut does not happen**,
445
+ the lane is named in the epic progress comment, and the run goes back to step 1. **Never assume idle** —
446
+ a wrong cut abandons a child, a missed cut only costs tokens.
447
+
448
+ **The hand-off report belongs to the stop, not to the reading.** For the one reading that does not stop —
449
+ an `unreadable` lane, or an `open` one recording no path — the run goes back to step 1 and writes no
450
+ hand-off report; the epic progress comment is the record. `report-format.md` → "区切りの報告" states it
451
+ from the format's side.
452
+
453
+ **This is not a failure and not a park.** No child needs a decision; the run is either handing its lanes
454
+ on or standing at the seam. `needs-decision` is not applied, nothing is stashed, and no Issue is filed.
455
+
456
+ ### Picking the lanes up in the fresh session
457
+
458
+ **The resumed session does not start a child again, and does not open a lane that is already open.** Its
459
+ first reading is `pnpm josh lane:list`: every line with a recorded path is a child that was handed over,
460
+ polled exactly as the session that dispatched it polled it (the two-line form above, same answer table
461
+ and same two-`undetermined`-in-a-row rule). **The `--process` argument is the one thing that changes** —
462
+ a fresh session did not start those processes, so it reports `none` unless it has looked itself.
463
+ **`pnpm josh lane:open <N>` re-attaches to a lane whose branch is already pushed**, which a handed-over
464
+ lane needs when its child has to be finished by hand.
465
+
466
+ **Restart the progress watcher by name** — `pnpm josh run:progress --wait --output <handed-over paths>`
467
+ in the background, in the same turn as that first `lane:list`. The cut session's watcher exited with it,
468
+ and the wired `run:watcher:guard` stops a resume that skips this (joshuafolkken/kit#2353).
469
+
470
+ ### A carried-over merge does not stand in front of the next lane
471
+
472
+ **A carried-over child finishes in its own detached unit, and the resumed parent does not stand in front
473
+ of its merge.** A lane handed over at the cut is still running its own `fullrun` — the foreground
474
+ `pnpm josh followup` and the CI wait included — in a process of its own (background-commands.md →
475
+ "`pnpm josh followup` — foreground": foreground is *within the unit*, the background from the parent).
476
+ **So the parent never runs a carried-over child's `followup` itself**: it polls the handed-over lane and
477
+ opens new work beside it, rather than finishing carried-over merges one after another before a single
478
+ new lane opens. **The reads and the dispatches go out together, in one turn** — `pnpm josh lane:list`,
479
+ `pnpm josh run:liveness`, `epic:next --lanes`, and opening a lane for a child it offers take none of each
480
+ other's results (the turn-batching rule this file states for a merge event, applied at the resume).
481
+ **Independence is the offer command's answer**: a new child `blocked-by` a carried-over Issue is
482
+ withheld, one that is not is dispatched into a free lane beside it. **A carried-over child that did not
483
+ survive the cut is re-dispatched, never adopted** — `pnpm josh lane:open <N>` then
484
+ `pnpm josh lane:dispatch <N>`, never picked up into the parent's own context.
485
+
486
+ ### The counters live in the record
487
+
488
+ **The single source of the run's counters is the carry record (`pnpm josh run:carry`), and the epic
489
+ progress comment is generated from it** (joshuafolkken/kit#2024) — children run, Issues filed,
490
+ **consecutive failures**, and the time the run started, held in one place rather than counted twice.
491
+ `pnpm josh run:merge` writes the merge into the record and mirrors the counters onto the epic comment at
492
+ every child's merge, so the human-readable comment and the guard the run reads can never disagree. **The
493
+ consecutive-failure count is the one that matters** — it is what the stopped-unit section leans on to
494
+ notice the environment is at fault, and a merge resets it; lost, a run keeps feeding children into a
495
+ broken environment and never reaches three. **The record survives a session cut and a compaction
496
+ alike** — that is what it is for — so the counters a run's own guards rest on are never taken by the
497
+ moment the context is dropped. **This is not what "Nothing is carried in the conversation" denies**:
498
+ that is about the state a *next session* needs, all of it on GitHub, while the record is about *this*
499
+ run's own guards.
500
+
501
+ ### What carries over, and where it lives
502
+
503
+ **Nothing is carried in the conversation.** Everything the next session needs it reads back:
504
+
505
+ | What the next session needs | Where it reads it |
506
+ | --- | --- |
507
+ | Which children remain, and which is runnable | `pnpm josh epic:next <E>` |
508
+ | The order and the dependencies | the epic body |
509
+ | What each remaining child is | the child Issue body |
510
+ | What already merged | the epic's task list, and the closed children |
511
+
512
+ That is the same state a resumed run has always used, which is why the hand-off needs no new mechanism.
513
+ **A planned hand-off is strictly more certain than an interruption**: an interruption can land mid-child
514
+ with a dirty tree and a stale `in-progress` label, and this cannot, because it is only taken when a child
515
+ has just closed.
516
+
517
+ **A resumed session is a new session**, so it asks `pnpm josh latest:scope` once before its first child.
518
+
519
+ ## Waiting, and never waiting forever
520
+
521
+ | Setting | Value | Why |
522
+ | --- | --- | --- |
523
+ | Polling interval | 60 s | **A floor between two asks, never a clock the parent sets.** It bounds a re-ask made while the parent is *already awake*; what wakes it is "The parent keeps no clock of its own" below. |
524
+ | `backlogrun` idle-watch poll | 5 min | Not the interval above, and a floor in the same sense. What a watch waits on happens on human timescales, and every ask bills the parent session's whole history. |
525
+ | Silent delegated unit | 30 min | Not the child's duration — the time its output has gone **unchanged**. A working unit rewrites its transcript continuously. Past it, run the traces above and book a stopped unit as a failure. |
526
+ | Stale `in-progress` | 90 min | Longer than any single child has taken; past it, the other session is gone. |
527
+ | Publish wait | 10 min | `josh propagate`'s own budget. A failed publish never appears. |
528
+ | Whole run | 8 h | An unattended run that has not finished overnight needs a person, not more waiting. |
529
+
530
+ Each timeout **ends the wait and reports** — none is retried indefinitely. A stale child's label is
531
+ removed first, so the next poll can offer it. **A graph that has deadlocked on a cycle is not this loop's
532
+ to untangle**: `epic:next` detects it and exits with an error.
533
+
534
+ ### The parent keeps no clock of its own — the watcher's exit is the wake
535
+
536
+ **After hand-off, the supervisor's driver owns the mechanical clock.** `backlog:drive` polls lane
537
+ completion and the backlog inside the detached process, without waking an AI parent. The historical
538
+ parent-turn instructions below apply only while an AI session is handling a returned judgment branch;
539
+ they do not schedule the supervisor's normal loop. `run:progress --wait` remains the source of human
540
+ heartbeat lines, and `run:report` remains the final report source.
541
+
542
+ **The numbers above are floors between asks, not a timer the parent sets.** A parent that sets one spends
543
+ a turn per tick at the point its context is largest — the exact cost `run:progress` was built to remove.
544
+ The watcher took the *reporting* out of the parent; the parent must not go on keeping the clock anyway,
545
+ or the two run side by side and the run pays for both.
546
+
547
+ The driver checks lane completion every five seconds and makes a new backlog offer no sooner than one
548
+ minute after the previous offer, except after collecting a child. These waits cost no AI turns.
549
+ The progress watcher keeps reporting on its own interval; a judgment session may still receive its
550
+ exit as a prompt to act. The bounds above continue to apply to both processes.
551
+
552
+ #### The wake exists only while something is in flight
553
+
554
+ `run:progress --wait` prints only when it has a human-facing line. With no child in flight it may
555
+ decline; the driver still polls for new work and enforces the idle and whole-run bounds. A GitHub
556
+ listing failure stays a retry or unreadable answer from the offer command, never an empty backlog.
557
+
558
+ `epic:next` does not report when a label was applied, so read that from the issue's timeline:
559
+
560
+ ```bash
561
+ gh api "repos/{owner}/{repo}/issues/<N>/timeline" \
562
+ --jq '[.[] | select(.event == "labeled" and .label.name == "in-progress") | .created_at] | last'
563
+ ```
564
+
565
+ An empty answer means the label predates what the timeline returns, which is itself past the window —
566
+ treat it as stale.
567
+
568
+ Waiting is decided by `epic:next`'s classification, never by reading labels:
569
+
570
+ | `epic:next` says | `backlogrun` does |
571
+ | --- | --- |
572
+ | Something is runnable | Run it |
573
+ | Nothing runnable, something resolves on its own | **Wait** |
574
+ | Nothing runnable, nothing resolves on its own, children remain | **Stop and report the parked children** |
575
+ | No open child | Post the epic summary and finish |
576
+
577
+ The distinction is not academic. When kit's child has closed and app-kit's child is waiting for the
578
+ release to publish, there is no runnable child, nothing carries `in-progress` and nothing carries
579
+ `needs-decision` — a label-based reading calls that "done" and stops, in the one moment it must wait.
580
+
581
+ ## Who sends the summary, and who propagates
582
+
583
+ With several sessions on one epic, **exactly one does the end-of-epic work: the session standing in the
584
+ repository that owns the epic.** It sends the epic completion summary and runs `josh propagate`, which
585
+ itself refuses to run outside the supplier repository. Every other session finishes quietly once its own
586
+ repository has no children left.
587
+
588
+ Per-child completion notifications are unchanged: `pnpm josh followup` sends one each. Send an epic
589
+ **start** notification when the run begins, and an epic **completion** summary at the end. **Do not
590
+ compose that summary by hand — `pnpm josh run:report` generates it from this invocation's events**
591
+ (joshuafolkken/kit#2249, scoped in #2393): it renders what merged, what parked and why, and what was cut,
592
+ reusing `format_event`, closing with the release tail below. Its output is the Telegram body too — pass it to
593
+ `pnpm josh notify --body-file` so the summary a session shows and the message off-screen are one text
594
+ from one generator.
595
+
596
+ **That same session asks `pnpm josh release:scope` once, after the last child has merged** — in the
597
+ primary checkout, after the last lane is closed, and never once per child. `followup-reference.md` →
598
+ "When `pnpm josh release` runs" is the single source for the position and the three answers. `run:report`
599
+ appends that answer as the summary's closing line: on `required` the request and the exact command, on
600
+ `unknown` the word `unknown`, never rounded to `skip`.