@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,604 @@
1
+ # `backlogrun` — the detailed procedure behind the manifest
2
+
3
+ **This is the detailed procedure behind `backlogrun.md`'s manifest, relocated here so the entry read
4
+ carries the manifest, not the prose** (joshuafolkken/kit#2190). `backlogrun.md` is the resident
5
+ manifest; it routes here for the fine print of each step, read on demand rather than at the entry.
6
+ This file is **reference-only** and is read at its point of use — it is classified point-of-use in
7
+ `entry-read-set.ts`, exactly as the four `backlogrun-*.md` phase documents are, so a `backlogrun`
8
+ entry never opens it whole up front. Each section below is the single source of the rule it carries;
9
+ `backlogrun.md` points here rather than restating any of it.
10
+
11
+ ## What one invocation approves
12
+
13
+ **One `backlogrun` approves every merge of every issue `pnpm josh backlog:next` offers** — the issues
14
+ carrying `auto-ok`, every child of an epic whose root carries it, **and an issue this run filed, once
15
+ it has become such a child**. A filing is placed into an epic by `pnpm josh epic:bundle`, which
16
+ `prompts/review.md` → "Review round cap" and `SKILL.md` → §2i both make **Tier A rather than
17
+ optional**; where that epic's root carries `auto-ok`, the child is offered from the next ask onwards
18
+ without anybody having labelled it.
19
+
20
+ **Two repairs that would bound this the other way are prohibited** (joshuafolkken/kit#1675): dropping
21
+ a run's own filings from the pool, and requiring a person's `auto-ok` on a child as well. What
22
+ replaces them is "The brake that replaces the promise" below.
23
+
24
+ That declaration is the authorization: **`backlogrun` declares "everything opted in", and a named
25
+ epic declares "the children of that epic".** The declaration *is* the statement of what may be
26
+ executed unattended, and that is the one thing a run must not leave ambiguous — which is why what runs
27
+ is stated by the keyword and its arguments, never inferred from the shape of a request.
28
+
29
+ **Which issues may be opted in stays a person's decision.** `auto-ok` is applied only by a person —
30
+ this file is that rule's single source, now that `backlogrun` owns the opted-in pool
31
+ (joshuafolkken/kit#1965) — and a run that labelled its own inputs would be widening its own
32
+ authorization. The split is: **which ones carry the label, a person; in what order and how many at
33
+ once, the run.** **What a run does move is the pool's contents**: an issue it files and bundles into an
34
+ already opted-in epic is offered from the next ask onwards, and the brake below bounds that quantity
35
+ rather than the membership.
36
+
37
+ **The end-of-run retrospective is the one carve-out, revised here rather than worked around**
38
+ (joshuafolkken/kit#2328). When a run drains its backlog, the retrospective files the improvements worth
39
+ carrying into the next run and applies `auto-ok` to them, so the next run can pick them up without
40
+ waiting for a person — the single path on which a run labels its own input. This is not the
41
+ self-widening the rule guards against, because the brakes in "The brake that replaces the promise"
42
+ below bound it with no exception: a retrospective's filings are counted against the ten-per-invocation
43
+ ceiling, the WIP cap of 30, `--max`, the 150,000-token session budget and the 8-hour whole-run bound
44
+ exactly as any other filing is. And a retrospective that judges nothing worth carrying files nothing,
45
+ so the "file → drain → file again" loop converges the moment improvements run out. Every other filing
46
+ route is unchanged: `auto-ok` stays a person's to apply.
47
+
48
+ A Tier C action inside a child still stops that child, exactly as it does for any batch child.
49
+
50
+ **A named issue is approved by the keyword and its number, not by `auto-ok`** (joshuafolkken/kit#1984).
51
+ `backlogrun #N1 #N2 …` runs those issues whether or not they carry the label — typing them is the
52
+ authorization, exactly as `queue` was explicit authorization to merge each of its issues. The pool
53
+ that follows is unchanged: still `auto-ok`, still a person's to opt in. "Named issues run first, in
54
+ order" below is the procedure.
55
+
56
+ ### The brake that replaces the promise
57
+
58
+ **The promise was an authorization boundary rather than a convenience**, so withdrawing it without
59
+ putting something in its place would leave "file → run → file again" with no ceiling at all — the
60
+ self-widening `split-assessment.md` refuses when it forbids a `fullrun` promoting itself to a batch.
61
+ **What bounds it now is the invocation's own budget, and every part of that is counted in the carry
62
+ record rather than in the conversation** ("The session cut is inside the invocation" below):
63
+
64
+ | The bound | What it limits | Where it is counted |
65
+ | --- | --- | --- |
66
+ | `--max` | how many issues one invocation may merge — a run's own filing competes for that number rather than extending it | `run:carry --merged` |
67
+ | `--idle`, and the 8-hour whole-run bound | how long one invocation may go on looking for more | the record's `started_at` |
68
+ | **Ten filings per invocation** | how much one invocation may add to the pool at all, on **every** filing route (`SKILL.md` → §2d) | `run:carry --filed` |
69
+ | The WIP cap of 30 open issues | how large the pool may become, across invocations | `prompts/collaboration-workflow/wip-cap.md` |
70
+
71
+ **The last two are what actually replace the promise, and the first of them is why the loop
72
+ terminates**: one invocation may add at most ten issues to the pool and merge at most `--max` of
73
+ them, after which the run ends and the next one waits for a person to type the keyword. The old
74
+ promise bounded the *kind* of work that could run; these bound the *amount*, which is the only thing
75
+ left to bound once a run's own filings are admitted deliberately.
76
+
77
+ **Two filing routes are exempt from the depth test (`SKILL.md` → §2i), and the ten-filings ceiling
78
+ still covers them:**
79
+
80
+ - **`route:tier-a` and `route:interrupt` stay exempt** — a filing the run cannot proceed without is
81
+ citing its own blockage by construction. **Their number is still capped**: §2d's ten-filings
82
+ ceiling is stated "at every entry point", and `run:carry --filed` counts it across session cuts.
83
+ - **A review branch-2 filing stays exempt** because it has already cleared a bar the discretionary
84
+ route has not — a confirmed defect reaching a runtime path, with a written failure scenario — and
85
+ gating it on a citation as well would drop the one kind of finding both documents agree is never
86
+ dropped.
87
+
88
+ **This section is the single source of how the `epic:bundle` obligation and this authorization
89
+ boundary meet.** `SKILL.md` → §2i points here rather than restating it.
90
+
91
+ ## Named issues run first, in order
92
+
93
+ **`backlogrun #N1 #N2 …` runs the named issues before it touches the pool** (joshuafolkken/kit#1984,
94
+ folding in the old `queue` keyword). They run in the order they were typed, **one at a time — no
95
+ lanes**, because the order is the point of naming them. Only once the named list is exhausted does the
96
+ loop below drain the opted-in backlog. A bare `backlogrun` names none and starts straight on the loop,
97
+ exactly as it always did.
98
+
99
+ **`pnpm josh backlog:plan #N1 #N2 …` reports the whole plan** — the named prefix first, in order, then
100
+ the pool — so the person sees the shape of the run before anything starts. `scripts/backlog/backlog-named.ts`
101
+ is the single source of that order and of the failure branch below; the plan renders it rather than
102
+ restating it.
103
+
104
+ **Each named issue is a full `fullrun` in a delegated unit**, exactly as a backlog child is
105
+ (`backlogrun-child.md` → "Each child runs in a delegated unit"), and the once-per-session steps — `josh latest`
106
+ on `required`, the progress watcher — run once for the whole invocation, never per issue
107
+ ("What runs once per session, not once per issue" below). Between issues, `pnpm josh ms`
108
+ brings the previous merge into the checkout the next one implements in. The parent reads each issue's
109
+ state back from GitHub — `pnpm josh issue:state <N>` — never the unit's summary.
110
+
111
+ **A named issue that cannot finish parks, and the rest of the named list is skipped** — starting the
112
+ issues after it would break the order they were named in. **The run does not stop there**: it goes on
113
+ to drain the opted-in backlog, and the completion report lists the named issues it did not start.
114
+ `backlog_named.after_failure` is the single source.
115
+
116
+ - A named issue read back `CLOSED` — merged, or already `already-done` — is finished; continue with the
117
+ next.
118
+ - A **`needs-human-review`** named issue stops the whole run before its commit (`SKILL.md` → §2z),
119
+ exactly as any child does — the named issues after it are not started and neither is the pool.
120
+ - Everything else about running one — the verification gate, the hand-off, the guards — is
121
+ this file's and is not restated here.
122
+
123
+ **`--only` runs the named list and stops there, draining no pool** (joshuafolkken/kit#1984) — the old
124
+ `queue`'s scope kept under one keyword. `backlogrun #N1 #N2 … --only` runs the named issues in order and
125
+ ends, and the completion report says in one line that `--only` held it back from the opted-in backlog.
126
+ A named issue that fails **under `--only` ends the run** rather than falling through to a pool, and the
127
+ issues after it are skipped as ever. **`--only` with no named issues has nothing to run and is refused
128
+ before anything starts.** `backlog_named.startup` is the single source of both, and
129
+ `pnpm josh backlog:plan #N1 #N2 … --only` renders the named-only plan the run will take.
130
+
131
+ ## The session cut is inside the invocation
132
+
133
+ **This section is the single source of the mechanism.** The record, the two commands, the answer table
134
+ and what each one means are all here. **A named-issue `backlogrun #N1 #N2 …` pins its list across the
135
+ cut**: the record keeps the **opening** list at every cut, and the issues it has finished live in the
136
+ record's `done` field rather than shrinking the string — a resumed session reads `remaining` from
137
+ `pnpm josh run:carry --json` and runs those, then drains the pool as ever. **`--only` rides in that
138
+ invocation string like every other token**, so a resumed session runs the remaining named issues and
139
+ **stops** rather than draining the pool the person excluded.
140
+
141
+ **Typing `backlogrun` once authorizes the declared budget, and a session cut is an execution detail of
142
+ spending it** (joshuafolkken/kit#1714). `backlogrun-progress.md` → "The hand-off" stops the _session_ at the seam;
143
+ under `backlogrun` that seam does not stop the _run_. The next session picks the same invocation up
144
+ and carries on with the budget already partly spent.
145
+
146
+ **A resumed session's carried-over lanes are polled beside new work, never waited out** —
147
+ `backlogrun-progress.md` → "A carried-over merge does not stand in front of the next lane" is the
148
+ single source.
149
+
150
+ **This is not an exception to the explicit-invocation rule above.** What §0 forbids is **inferring** a
151
+ workflow from the shape of a request; it never required the keystroke to land in every session's
152
+ transcript. A resumed session is a machine continuing an authorization a person gave, exactly as a
153
+ delegated child runs `fullrun` in a unit where nobody typed the keyword.
154
+
155
+ **The authorization boundary is carried by the budget, not by the keystroke.** So the budget has to
156
+ survive the cut, and the conversation is the one place it cannot live:
157
+
158
+ ```bash
159
+ pnpm josh run:carry --begin "backlogrun --max 5 --idle 30" --owner "$PPID" # alias: josh rc
160
+ pnpm josh run:carry --json # read it back in a resumed session
161
+ ```
162
+
163
+ **`--owner "$PPID"` is not decoration.** It names the parent loop's own long-lived process, which is
164
+ what lets the command answer `busy` instead of letting a second parent count into a budget that is
165
+ still being spent. Left off, the record declares no owner and every standing record reads as not
166
+ provably live — refused rather than resumed, so nothing is lost silently, but the useful half of the
167
+ answer is gone. When the sandbox cannot read a process-start token, a live PID is conservatively held
168
+ as `busy`: stopping on a reused PID costs a decision, while replacing a genuinely live owner creates
169
+ two parents on one budget.
170
+
171
+ **Ask it before the plan, in the same turn as the first `git switch main && git pull`.** The contract
172
+ is `docs/josh-commands.md` → "`josh run:carry`"; what this loop does with each answer is here:
173
+
174
+ | It answers | What the run does |
175
+ | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
176
+ | `began` | Nothing was carried. This is the invocation's first session: report the plan and run the decision pass as written below |
177
+ | `resumed` | **This session is continuing a run that was cut** — a `--cut` handed the record off, or a `--resume` adopted it. Read the record with `--json` and take the budget figures from it, never from this session's own zero. Report the plan again — the pool has moved — and skip nothing else |
178
+ | `busy` | The record's **owner process is still running and no cut handed it off**: another parent is spending this budget right now. **Stop; do not open a lane.** Counting into it would put two parents on one record. (A record a `--cut` _did_ hand off answers `resumed` here even with its owner still alive — joshuafolkken/kit#1935.) Nothing here is yours to end — either that run finishes and ends its own record, or a person decides it is over |
179
+ | `standing` | A record is here that **no cut or supervisor handed off** — an unwatched crash, and the same command retyped over it. **Stop; do not open a lane**, and do not guess: the choice is the person's. Report the two commands the answer names — `pnpm josh run:carry --resume "<invocation>" --owner "$PPID"` to carry that budget on, or `pnpm josh run:carry --end` and begin again to discard it. The `--owner` belongs to the resume as much as to the begin: adopt without it and the record declares no owner, so `busy` degrades to `standing` for every parent after |
180
+ | `mismatch` | A record is here for a **different** invocation — a run that never reached `--end`. **Stop; do not open a lane.** Resuming into it would spend that run's `--max` and its hours. End it deliberately, with `pnpm josh run:carry --end`, once you know that run is over |
181
+ | `expired` | The 8-hour whole-run bound is spent. **Where a `--cut` handed the record off it is this run's own bound**, so this is the verdict on standard output and the run ends: report it and stop, and clear the record with `pnpm josh run:carry --end` once it is genuinely over. Where nothing handed it off it is printed on standard error ahead of a `began` instead — a person typing the keyword again over a spent record is starting a new run, and the record is replaced. A `--resume` over a spent record answers `expired` and adopts nothing |
182
+ | `unreadable` | Report what it printed and **stop before opening a lane**. A budget that cannot be carried is a run that restarts it at the next cut, which is the whole defect |
183
+ | `unknown` | The same — the repository's git directory could not be read, so nothing was established |
184
+
185
+ **The record is the parent loop's, and a lane never touches it.** The parent is what reads GitHub to
186
+ verify a child merged (`backlogrun-child.md` → "Each child runs in a delegated unit"), so it is also what
187
+ counts that merge — one sequential loop writing one record, with no two lanes writing it at once. A
188
+ delegated unit is briefed with its child and nothing about the invocation's budget. **`--begin` claims
189
+ the record exclusively and names the owning process, so a second parent is answered `busy`** rather
190
+ than counting into a budget somebody else is spending.
191
+
192
+ **Count into the record rather than into your head** — `--merged 1 --owner "$PPID"` at every child's
193
+ merge, `--filed 1 --owner "$PPID"` at every Issue this run files, and `--cut --owner "$PPID"`
194
+ immediately before the cut. Every counter is an increment and the command owns the sum, because a run
195
+ sending a total would be sending arithmetic done in its head. **`--owner "$PPID"` is not optional on a
196
+ count**: a count that does not name the record's owning process is refused, so a session whose record a
197
+ successor took over cannot advance a budget that is no longer its own.
198
+
199
+ **`--cut` hands the record off, and so does `run:wake` for a dead owner** (joshuafolkken/kit#2437): the
200
+ next `--begin` naming the same invocation answers `resumed` — **even while the cutting process is still
201
+ running**, so a cut is handed to exactly one successor rather than stalling every resume with `busy`.
202
+
203
+ **So `--cut` is the session's last write to the record**: count everything the session has, then cut.
204
+ A `--merged` or `--filed` issued after the `--cut` is **refused**, so the hand-off is protected rather
205
+ than silently spent.
206
+
207
+ **`backlog:budget` is then fed from the record, never from a count kept in the conversation:**
208
+ `--started` takes the record's `started_at` and `--merged` its `merged`. That one substitution is what
209
+ makes `--max` and the 8-hour whole-run bound count **across** cuts, as one invocation's worth. **The
210
+ 10-filings-per-run ceiling is counted the same way**, from `filed`. **`--idle` is the one budget that
211
+ is not carried**, and a cut can only reach a watch that opened while this run's own children were
212
+ still merging — the one shape where the two overlap. A resumed session then states its resume moment
213
+ as `--active` and the watch begins again at its full budget, bounded by the 8 hours as everything
214
+ else is: "The cost check is not asked during a watch" below.
215
+
216
+ **How many cuts the run crossed is named in the completion report**, read from the record's `cuts`. A
217
+ run reporting only what it merged would hide that it spanned four sessions.
218
+
219
+ **End the record when the run ends** — `pnpm josh run:carry --end`, **after the final report and never
220
+ batched with it**: `run:report` scopes by the record `--end` removes (joshuafolkken/kit#2393). The next
221
+ `backlogrun` then begins its own budget rather than resuming a spent one. **Where the run ends by _stopping_ rather than finishing** — `backlog:budget` or `epic:next`
222
+ answered `stop` (a parked backlog, an unreadable listing, the maximum, the whole-run bound), or the
223
+ consecutive-failure
224
+ guard tripped — **end it with `pnpm josh run:carry --end --stopped "<one-line reason>"` instead**. That
225
+ pushes one ⏸️ confirmation as it clears the record, so a person learns the run halted even when the
226
+ session was cut and this parent headless (joshuafolkken/kit#2136); the reason is the stop verdict's, in
227
+ the session language. A clean completion takes the bare `--end` and stays silent, having its own report;
228
+ a parked _child_ is pushed by the child that parked it (`backlogrun-park.md`). Because `--end` removes
229
+ the record, a re-run's second `--end` finds nothing and never re-sends that confirmation —
230
+ `backlogrun-progress.md` →
231
+ "Progress while the run is quiet" is the single source of the pull-versus-push split.
232
+
233
+ **The record widens nothing.** It carries a budget and nothing else: `auto-ok` is still applied only
234
+ by a person, so a cut adds no rule about which issues may be offered. **The pool itself may have
235
+ grown across the cut** — an issue the first session filed, and `epic:bundle` placed under an already
236
+ opted-in epic, is offered to the resumed one — and that is "What one invocation approves" rather than
237
+ anything the record did. The ceiling on it is counted across cuts too, from the record's `filed`.
238
+
239
+ **Nothing waits for a person any more — `pnpm josh run:wake` supervises the driver**. After a cut or
240
+ dead-owner recovery, it adopts the carry record and runs `backlog:drive` itself. The driver dispatches,
241
+ collects, watches and reports without starting a parent AI session. Only a returned branch that needs
242
+ judgment starts an AI session, with the branch result and resume flags in its prompt.
243
+
244
+ **Start it in the same turn as `--begin`, and stop it in the same turn as `--end`:**
245
+
246
+ ```bash
247
+ pnpm josh run:wake --start # alias: josh rw ; right after `run:carry --begin`
248
+ pnpm josh run:wake --stop # in the same turn as `run:carry --end`
249
+ ```
250
+
251
+ **It reads the same record this section already keeps.** A handed-off carry record, or one whose owner
252
+ died, starts the driver. The supervisor adopts that record before the driver counts a merge; a live
253
+ owner prevents a second driver from taking it over. On `none`, `expired` or `unreadable` it stops. The
254
+ 8-hour whole-run bound therefore still comes from the carry record. **A new authorization is still a
255
+ person's**: the supervisor spends the declared budget and never declares another.
256
+
257
+ **What may be run is untouched.** The driver takes named issues from the invocation and pool issues
258
+ from the existing offer command. The supervisor writes no `auto-ok` label. A judgment session receives
259
+ the original invocation plus the driver's reason and resume state.
260
+ For a named epic, the driver hands off `epic #N` with the original invocation. The judgment session
261
+ follows the named epic procedure and dispatches its children; the epic root is never launched as a
262
+ standalone `fullrun` child. Once every child has merged or parked, record the root with
263
+ `pnpm josh run:carry --done <E> --owner "$PPID"` before continuing the invocation. This removes it
264
+ from the carry record's remaining named list, so the next driver pass can advance. The named prefix
265
+ also consults the carried maximum and whole-run bound
266
+ before each launch, and a failed named issue skips the remaining named prefix.
267
+
268
+ **A failure is visible rather than silent.** A judgment wake that never claims the carry record is retried, and
269
+ once the retries are spent the supervisor stops and sends a `warning` Telegram; a carry record that
270
+ expired or cannot be read ends it the same way. `none` — the run having finished — and a person's own
271
+ `--stop` stay silent. Everything the supervisor starts writes to one log file per repository, named by
272
+ `--list` and by every warning, so a silent exit stays diagnosable.
273
+
274
+ **A person keeps control of it.** `pnpm josh run:wake --list` names the running supervisor and
275
+ `--stop` ends it; the full contract, what it launches and why that is a constant rather than a
276
+ setting are `docs/josh-commands.md` → "`josh run:wake`".
277
+
278
+ **Every unattended role runs with the provider selected from the invoking CLI and its own profile.**
279
+ Codex sessions use OpenAI; Claude Code sessions use Anthropic. Anthropic uses scheduler
280
+ `claude-opus-5-5`, worker `claude-opus-5-5` and reviewer `claude-opus-5-5`; OpenAI uses `gpt-6-sol`,
281
+ with role efforts `medium`/`medium`/`high` (scheduler / worker / reviewer) for both. Role overrides
282
+ resolve before launch; model overrides apply only to Claude Code, effort overrides to either provider,
283
+ and legacy `JOSH_LANE_*` values to the worker only. Invalid configuration, a missing or conflicting
284
+ session marker, or a missing, outdated or unauthenticated CLI refuses without fallback, promotion or
285
+ worker retry. `run:wake --list`, `lane:list`, the review brief and each launch
286
+ log expose the resolved provider, role, model and effort.
287
+ `docs/josh-commands.md` → "`josh lane:dispatch`" and `backlogrun-child.md` → "Each child runs in a
288
+ delegated unit" are the single sources.
289
+
290
+ **It relays progress from the existing report record.** The driver keeps the same `run:merge` event
291
+ stream and `run:report` finish path; `pnpm josh run:wake --list` relays the latest line from that
292
+ record. Telegram notifications retain their existing generation points (→ "It goes to the session only").
293
+
294
+ **The completion report names how many sessions were woken beside the record's `cuts`** — one wake per
295
+ cut is the invariant, and what counts is a carry record actually claimed, never a process started.
296
+
297
+ **The reading is scoped to `backlogrun`.** A `fullrun` cut still waits for a person's keystroke,
298
+ because it declares no budget of the kind this section leans on — it ends at one issue and has
299
+ nothing to carry.
300
+
301
+ ## The plan, before the first child starts
302
+
303
+ **A `backlogrun` reports its plan before it starts anything.** Nothing is dispatched, no lane is
304
+ opened and no issue is picked up until the plan has been reported and the decision pass below has
305
+ run (joshuafolkken/kit#1652).
306
+
307
+ **The plan is one command's output, not an assembly of several:**
308
+
309
+ ```bash
310
+ pnpm josh backlog:plan # alias: josh blp
311
+ ```
312
+
313
+ **It renders the same classified pool `backlog:next` answers from**, so **the plan cannot promise an
314
+ order the run does not take**. It is a separate command rather than a flag because `backlog:next`'s
315
+ standard output is one bare token per line and a plan printed there would break the loop below. Its
316
+ four sections are:
317
+
318
+ - **Ready now** — the runnable children, grouped by repository. **The grouping is the parallelism**,
319
+ not a presentational choice: a lane is per repository, so the bundles are how wide this run can go.
320
+ - **Waiting** — every withheld child, each naming **what it is waiting on**: the blocking issue
321
+ numbers, a run that already has it, or that it is ready but past the offer this ask could make.
322
+ - **Waiting on a person** — the `needs-decision` children, which is the next subsection's input.
323
+ - **Out of scope** — every open issue the backlog will **not** run, with the reason, so "not opted in"
324
+ is distinguished from "not reached yet".
325
+
326
+ **Report all four to the person, in the session language, before the first child starts.** Epic
327
+ children are enumerated individually rather than summarized under their root. A `⚠` about a truncated
328
+ listing is reported with them: the plan is then partial, and saying so is what keeps it from reading as
329
+ complete.
330
+
331
+ ### Resolve what the plan can resolve, before starting
332
+
333
+ **Every `needs-decision` issue the plan listed is settled in one pass at the start, rather than one
334
+ stop at a time.** The point is to spend a person's attention once, up front, instead of interrupting
335
+ an unattended run over and over.
336
+
337
+ - **Decide everything decidable from the issue itself.** Read the issue's body **and its comments**
338
+ (`SKILL.md` → §2g), and where the answer is already there, record it as an Issue comment and
339
+ **remove the label** — `CLAUDE.md` → "Decision autonomy" already makes that Tier A, and a child
340
+ whose decision is recorded while its label still stands is parked for no reason. **Read every one
341
+ of them in one call** — `pnpm josh issue:read <N> <N> …`, the numbers the plan just listed under
342
+ "Waiting on a person" — rather than a `gh api` pair per issue. This pass is where a parent reads the
343
+ most issues in a row, and a parent's cost grows as n²/2 in its own request count
344
+ (joshuafolkken/kit#1567), so a turn removed here is worth more than a turn removed inside a child.
345
+ - **Never measure in order to decide.** A question needing a benchmark, a profile, or a run of the
346
+ thing itself is not settled here: it stays labelled and the plan says so. This pass is a cheap
347
+ read, not a research task, and turning it into one would put the whole backlog behind it.
348
+ - **Label what you find.** An issue that turns out to need a person's judgement has `needs-decision`
349
+ applied — the same label a parked child gets, applied the way `backlogrun-park.md` → "park and continue"
350
+ applies it. **The next plan then classifies it by reading the label alone**, never by reading the
351
+ body again, so the cost of this pass falls on every subsequent ask instead of repeating.
352
+ - **Then start the loop.** Whatever is still labelled is reported as parked and left standing; the
353
+ run does not wait on it.
354
+
355
+ **`needs-decision` is the one workflow label a run may apply, and it is neither `auto-ok` nor
356
+ `needs-human-review`.** Those two widen or withhold what may be *executed* and stay a person's alone
357
+ (this file, `SKILL.md` → §2z). This one records only that a person's answer is needed, which is a
358
+ finding rather than an authorization — which is why a run parks with it and a person clears it.
359
+
360
+ ## The loop
361
+
362
+ **The detached `run:wake` supervisor runs `backlog:drive`** after the carry record is handed off.
363
+ Its driver keeps the loop below running without a parent AI turn. A returned judgment branch includes
364
+ the first-line verdict, affected issue and `resume:` flags in the AI prompt; `stop` reports and ends
365
+ inside the driver. This uses the same command and decisions as the former parent-launched wait.
366
+
367
+ **The loop's head is one command — `pnpm josh backlog:offer`** (joshuafolkken/kit#2162). It runs
368
+ `backlog:next`, maps its answer to the budget word the table below fixes, runs `backlog:budget`, and
369
+ returns the verdict with the issues to start. It stays both halves' contract source: what an answer
370
+ *means* changes here.
371
+
372
+ ```bash
373
+ offer=$(pnpm josh backlog:offer --started "$started" --active "$active") # alias: josh blo
374
+ offer=$(pnpm josh backlog:offer --started "$started" --active "$active" --exclude 1630,1631) # after #1630, #1631 merged
375
+ ```
376
+
377
+ **The first line of standard output is the budget verdict; on `run`, the issue numbers to start
378
+ follow, one per line.** `backlog:offer` forwards `--exclude` and `--repo` to `backlog:next` and
379
+ `--started` / `--active` / `--merged` / `--running` / `--max` / `--idle` to `backlog:budget`, computes
380
+ `--answer` itself, and carries the consecutive-retry count on the last stderr line (`retries: <n>`) and
381
+ in `--json`. **The verdict table is "The two budgets" below; the answer-to-word mapping it applies is
382
+ this section's table.**
383
+
384
+ **`backlog:next`'s output contract is `docs/josh-commands.md` → "`josh backlog:next`", and four parts
385
+ of it decide how the mapping is written:**
386
+
387
+ 1. **Standard output is one token per line, and everything else is standard error** — so `answers`
388
+ holds something a loop can branch on.
389
+ 2. **The tokens are bare issue numbers, scoped to the repository the command runs in.** A runnable
390
+ child in *another* repository is reported on standard error with its repository and checkout, and
391
+ is never a token; this repository having no candidate of its own is answered `wait`. **So
392
+ `backlogrun` takes no `owner/repo#N` token.** A qualified token was implemented and withdrawn,
393
+ because `--exclude` parses bare integers and feeding one back produces a usage error rather than
394
+ an exclusion (joshuafolkken/kit#1630). Report the other repository's candidates in the run summary
395
+ and leave them to a session running there (`backlogrun-lanes.md` → "Concurrency").
396
+ 3. **The verdict words are `wait`, `stop`, `retry`, `error` and `none`** — `none` is `epic:next`'s
397
+ `complete` under this command's spelling, and there is no `complete` here. **`retry` is the one
398
+ with no `epic:next` counterpart**: it says GitHub did not answer, which is a statement about the
399
+ connection and not about the graph (joshuafolkken/kit#1663).
400
+ 4. **Exit code 0 covers all five verdicts, and 1 means the listing could not be read** — no answer at
401
+ all. **`error` cannot be told apart by exit code, so read the token rather than the status.**
402
+
403
+ **What the answer means is this table's; whether the run may act on it is `pnpm josh backlog:budget`'s**
404
+ (joshuafolkken/kit#1632). The right-hand column ends in the word each answer is handed to that command
405
+ as. Nothing here decides an ending on its own — the two budgets and every termination live in the next
406
+ subsection.
407
+
408
+ | Answer | What to do | Budget answer |
409
+ | --- | --- | --- |
410
+ | One or more issue numbers | Start each one as a child, up to the free lanes — `backlogrun-lanes.md` → "Lanes" and "Each child runs in a delegated unit", unchanged. Then **ask the command again**, with the merged numbers added to `--exclude` | `candidates` |
411
+ | `wait`, with something of this run's own still in flight | Everything opted in is blocked or already running, so waiting can still change the answer. **Ask the command again on the wake the progress watcher's exit delivers** — the parent starts no sleep of its own, and the interval is a floor on the re-ask rather than a clock (`backlogrun-progress.md` → "Waiting, and never waiting forever" and "The parent keeps no clock of its own") | `blocked` |
412
+ | `wait` this checkout can never resolve — the only candidates the command reported on standard error are in other repositories, and this run has nothing of its own in flight | Report those candidates with their checkouts. **Waiting cannot resolve them, but a person opting a new issue in here still can**, so the ending is the idle watch's rather than this row's | `exhausted` |
413
+ | `stop` | Nothing can proceed without a person. Report the parked issues and finish | `parked` |
414
+ | `retry`, on fewer than three consecutive asks | GitHub did not answer, so the graph was never read. Sleep the polling interval and **ask the command again** — **this is one of the states with no watcher-delivered wake**, because the outage that produced `retry` stops the watcher reading too and a declined watcher does not exit (`backlogrun-progress.md` → "The wake exists only while something is in flight"). This is the one answer re-asking is allowed on, and the count is consecutive: any other answer resets it to zero | `blocked` |
415
+ | `retry` for a third consecutive time | The outage is not a hiccup. Report what the command printed on standard error and finish | `unreadable` |
416
+ | `error` | The graph could not be resolved — report what the command printed on standard error and finish. **Never re-ask hoping for a different answer**, and never fall back to picking an issue by hand: that would be the run choosing its own membership | `unreadable` |
417
+ | `none` | Nothing opted in is left | `exhausted` |
418
+ | Exit 1, empty standard output | The listing could not be read. Report it and finish — **it is not `none`**, and reading it as one would report an empty backlog that was never seen | `unreadable` |
419
+
420
+ **Re-asking on `retry` is not the exception to the `error` rule** (joshuafolkken/kit#1663): `error`
421
+ forbids a run answering its own question, while `retry` means the command never got an answer to read,
422
+ so asking again is the same question rather than a second opinion. **Three consecutive `retry` answers
423
+ end the run**, and any other answer resets the count to zero, so `backlog:budget` is told `blocked`
424
+ while retries remain and `unreadable` on the third.
425
+
426
+ **Feed every issue this run has merged back through `--exclude`.** GitHub applies `closes #N`
427
+ asynchronously, so a just-merged issue can still read as open on the next ask and be offered a second
428
+ time. The flag takes a comma-separated list and may be repeated; it drops the issue from every bucket
429
+ rather than only from the offer.
430
+
431
+ **A short offer is not proof the backlog is empty.** The standalone half of the pool is capped at the
432
+ same five rows the `🗒 Next issues` display shows, so a sixth opted-in issue simply appears on the
433
+ next ask. An epic's children are not capped that way — they come through the epic's own graph.
434
+
435
+ **The epic side is found server-side by the `epic` label.** An epic that never received the label is
436
+ invisible to the listing, so nothing knows it tracks anything at all (joshuafolkken/kit#1633). This is
437
+ a known limit of the listing, recorded rather than worked around; do not assert the opposite anywhere.
438
+
439
+ **A child is offered on its own `auto-ok` unless the epic tracking it is opted in**
440
+ (joshuafolkken/kit#1668). An epic that **is** opted in owns its children entirely — it sequences them,
441
+ so offering one beside it would hand the same issue over twice; ordering survives the standalone route
442
+ on the children's own `blocked-by` relations, which `--ordered` records.
443
+
444
+ **An order between two epics holds too** (joshuafolkken/kit#1943). A `blocked-by` relation whose
445
+ blocker sits in another opted-in epic — or is an opted-in standalone issue — makes the child wait on
446
+ time, so one `backlogrun` runs both epics in that order without the person sequencing the commands. A
447
+ blocker outside the opted-in backlog, or one inside it that itself waits on a person, makes the child
448
+ wait on a person instead, and a cycle across epics
449
+ answers `error`. The table is `docs/josh-commands.md` → "`josh epic:next`".
450
+
451
+ **New work is picked up without restarting anything.** The command re-derives its pool from GitHub
452
+ labels on every ask, so an issue filed and opted in while the run is going is offered on the next
453
+ iteration.
454
+
455
+ ### The two budgets
456
+
457
+ **A `backlogrun` may declare how long it will watch an empty backlog and how many issues it may
458
+ take** (joshuafolkken/kit#1632). Both are written on the keyword, and **the idle watch is on by
459
+ default while the maximum is not** (joshuafolkken/kit#1676):
460
+
461
+ ```
462
+ backlogrun # watches for 30 minutes after the backlog empties
463
+ backlogrun --idle 0 # finishes the moment the backlog empties
464
+ backlogrun --idle 0 --max 5
465
+ ```
466
+
467
+ | Budget | Written | Default | What it does |
468
+ | --- | --- | --- | --- |
469
+ | Idle watch | `--idle <minutes>` | **30 minutes** | After the candidates run out, keep polling this long for a new one. A candidate that appears restarts the watch from that moment |
470
+ | Maximum issues | `--max <count>` | unlimited | How many issues this invocation may take. On reaching it the run reports and finishes |
471
+
472
+ **`--idle 0` is how the watch is turned off, and it is the only way** (joshuafolkken/kit#1676):
473
+ `backlogrun --idle 0` finishes at the first empty backlog, exactly as a bare `backlogrun` did before.
474
+
475
+ **Why 30 minutes** (single source `scripts/backlog/backlog-budget.ts` → `DEFAULT_IDLE_MINUTES`): it is
476
+ about the length of one child (12–28 minutes), so a run that has emptied its backlog waits roughly as
477
+ long as one more issue would have taken. **A watch is polled every 5 minutes, not at the loop's
478
+ 60-second interval** — it is waiting on a person, on human timescales, and the reason `backlog:budget`
479
+ prints names the interval so the loop reads it rather than remembering it.
480
+
481
+ **Why an idle watch is safe.** To become a candidate an issue needs `auto-ok`, which only a person
482
+ applies — except an issue this run filed and bundled under an already opted-in epic, which is admitted
483
+ ("What one invocation approves") and bounded by the brake there, never the watch. No issue nobody
484
+ opted in is ever picked up during a watch.
485
+
486
+ **`backlog:offer` asks `backlog:budget` for you on every iteration** — it maps `backlog:next`'s answer
487
+ to the word the table above fixes and hands it over, so the loop makes the one call and reads back the
488
+ verdict:
489
+
490
+ ```bash
491
+ offer=$(pnpm josh backlog:offer --started "$started" --active "$active" \
492
+ --merged <count> --running <count> --retries <count> [--idle <minutes>] [--max <count>])
493
+ ```
494
+
495
+ **`--active` is required of every ask, because the watch is on unless it was turned off** — an
496
+ invocation whose watch is on and that carries no `--active` is **refused** by `backlog:budget`, so an
497
+ emptiness nobody watched cannot be reported as an ordinary `stop`. Only `--idle 0` excuses it.
498
+ **`--running` also decides `wait` and `--retries` decides `retry`** — the two context branches the
499
+ table above carries, now applied inside the command from the counts the loop already tracks.
500
+
501
+ | Verdict | What the loop does |
502
+ | --- | --- |
503
+ | `run` | Start what `backlog:next` offered, up to the free lanes. The reason names how many more the maximum still allows; start no more than that |
504
+ | `watch` | Ask both commands again — at the 5-minute idle poll while the backlog is empty **and** nothing of this run's is in flight, and at the 60-second polling interval in every other case (a blocked backlog, a drain, or a watch that opened while children were still merging). *Whether the parent keeps that interval as a clock of its own* is the in-flight test: with nothing in flight the watcher declines for the whole watch and never exits, so the parent sleeps the interval itself; with something in flight the wake is the watcher's exit and the interval is only a floor on the re-ask (`backlogrun-progress.md` → "The wake exists only while something is in flight"). **Nothing is held while watching** — the working tree's hold and each drained lane were released at the last child's merge, so a watching run blocks no other run |
505
+ | `stop` | Report and finish. The reason it printed **is** the termination reason the completion report carries |
506
+
507
+ **At the drain the retrospective fires before this watch, not after it** (joshuafolkken/kit#2335):
508
+ `backlog:offer` marks the drain on the event stream and `run:step` fires the retrospective there, so the
509
+ watch that follows picks up its `auto-ok` filings. `retrospective.md` → "When it fires" is the single
510
+ source, read when `run:step` prints the step.
511
+
512
+ `--started` is when the invocation began; `--active` is when it last had work — the most recent ask
513
+ that was **not** `exhausted`, and in a resumed session the moment it picked the run up. **Refreshing
514
+ `--active` restarts the idle watch**, so an issue opted in mid-watch is picked up and the watch begins
515
+ again at its full budget. Both are ISO-8601 timestamps (`date -u +%FT%TZ`), and `--idle` without
516
+ `--active` is refused. `--merged` is what has merged and `--running` what is still in a lane; **both
517
+ count against the maximum**. **No ending abandons a lane**: whatever would have ended the run answers
518
+ `watch` while `--running` is above zero, so the lanes drain and their merges reach the report. The full
519
+ contract is `docs/josh-commands.md` → "`josh backlog:budget`".
520
+
521
+ **The completion report names three things the budgets make meaningful**: how many issues this run
522
+ took, how many of them were picked up during an idle watch, and the termination reason — quoted from
523
+ what `backlog:budget` printed rather than paraphrased.
524
+
525
+ ### The cost check is not asked during a watch
526
+
527
+ **A watch does not count towards the session cut** (joshuafolkken/kit#1676). The hand-off check —
528
+ `pnpm josh cost --cut`, `backlogrun-progress.md` → "The hand-off" — is asked **at a child's merge**, and a
529
+ watch has no merges, so a run that is only watching never reaches one. That is a decision rather than
530
+ an omission: a watch holds nothing (the working tree's hold and every lane were released at the last
531
+ child's merge), its cost is bounded before it starts (`--idle N` is at most `N / 5` asks), and when the
532
+ watch picks something up the run has work again and the check is asked at that child's merge in the
533
+ ordinary way.
534
+
535
+ **So every cut is taken at a merge, which is what lets a resumed session state its own `--active`**: a
536
+ woken session picks the run up seconds after the merge the cut was taken at. The one shape that puts a
537
+ cut inside a watch — the backlog answering `exhausted` while this run's own children are still
538
+ merging — is the same, because the woken session has just merged a child.
539
+
540
+ **The 8-hour whole-run bound is untouched and still outranks all of this** — it is measured from the
541
+ record's `started_at` across every cut, so a run cannot watch its way past it in 30-minute pieces.
542
+
543
+ ### Where the run stops
544
+
545
+ Termination is decided by what the loop is told, never by a judgement that enough has been done:
546
+
547
+ - **`--only` ends the run once the named list is done** — there is no pool and no idle watch to fall
548
+ through to, so the run reports and finishes; it never enters the pool loop at all.
549
+ - **`pnpm josh backlog:budget` answering `stop`** — the single decision, covering an idle watch
550
+ running out, the backlog emptying with the watch turned off, the maximum being reached, a parked
551
+ backlog, an unreadable listing, and the whole-run bound.
552
+ - **The whole-run 8-hour bound is unchanged and outranks both budgets**, and the idle watch lives
553
+ inside it: `backlogrun-progress.md` → "Waiting, and never waiting forever" is still where the figure is stated,
554
+ and `backlog:budget` is what applies it, so a run at the bound stops with candidates in hand and a
555
+ watch still open.
556
+ - **Every one of those budgets is counted across this run's own session cuts**, from the record
557
+ `pnpm josh run:carry` keeps rather than from a count held in the current session — "The session cut
558
+ is inside the invocation" above. A resumed run that started its budget over would stop 8 hours after
559
+ the _last_ cut instead of after the invocation, which is no bound at all.
560
+ - **The guards in `backlogrun.md` → "Guards"** apply unchanged, counted over the whole `backlogrun`
561
+ rather than per epic: children per run, Issues filed per run, and consecutive child failures. The
562
+ maximum above is a person's declaration of scale and does not replace any of them — whichever binds
563
+ first ends the run.
564
+ - **A `needs-human-review` child stops the whole run** before its commit — `SKILL.md` → §2z, which is
565
+ the single source, and `backlogrun-park.md` → "`needs-human-review` — the one stop that is not a park" for
566
+ what happens to its lane.
567
+ - **The hand-off check** — `pnpm josh cost --cut` at every child's merge, and the lane
568
+ hand-over that follows an `over` — is `backlogrun-progress.md` → "The hand-off", unchanged. It is
569
+ **not** asked during an idle watch: "The cost check is not asked during a watch" above is why.
570
+ - **Parking is not stopping.** A child that needs a decision, and a delegated unit that stopped
571
+ without reporting, are **parked** and the run continues (`backlogrun-park.md` → "park and
572
+ continue"); only the consecutive-failure guard above can turn repeated parks into a stop.
573
+
574
+ ## What runs once per session, not once per issue
575
+
576
+ All of these are this file's, and are reached here in the same order and for the same reasons:
577
+
578
+ | Step | Where it is defined |
579
+ | --- | --- |
580
+ | `git switch main && git pull`, then `pnpm josh latest:scope`, then `pnpm josh lane:prune` — in the primary checkout, before the first lane opens | `backlogrun-lanes.md` → "Once per repository, before the first lane opens" |
581
+ | `josh latest` on `required` only, asked once at the first child and never in a lane | `backlogrun-child.md` → "`josh latest` runs once per session, not once per child" |
582
+ | `pnpm josh run:hold <N>`'s preflight check, before each child that is not in a lane | `backlogrun-child.md` → "Preflight" |
583
+ | `pnpm josh run:progress --wait` in the background, `--mark` at every real report | `backlogrun-progress.md` → "Progress while the run is quiet" |
584
+ | `pnpm josh release:scope` once, after the last issue has merged and the last lane is closed | `followup-reference.md` → "When `pnpm josh release` runs" |
585
+
586
+ **Two more run once per session and are this file's own, not this file's**:
587
+ `pnpm josh run:carry --begin "<the invocation, single-spaced>" --owner "$PPID"` before the plan and
588
+ `pnpm josh run:carry --end` when the run finishes, and beside each of them
589
+ `pnpm josh run:wake --start` and `pnpm josh run:wake --stop` — the supervisor that continues the run
590
+ across a cut. Both pairs are "The session cut is inside the invocation" above.
591
+
592
+ **Record the invocation in the form the supervisor can rebuild: one space between tokens, and a plain
593
+ integer for each budget value** — `backlogrun --max 3`, never `backlogrun --max 03`. What the
594
+ supervisor hands the next session is composed from constants and the validated integers rather than
595
+ copied out of the record, and it refuses to wake on a record its own rebuild would rewrite, because the
596
+ woken session hands that text straight back to `run:carry --begin` to be compared character for
597
+ character. A record written some other way is not lost quietly — the first cut ends the run with a
598
+ `warning` Telegram — but it ends the run, so write the canonical form rather than the keystrokes
599
+ (joshuafolkken/kit#1719).
600
+
601
+ **`pnpm josh epic:audit` is not run.** There is no epic to audit — the run began from the backlog, the
602
+ same reason this file skips it when it began from a bare Issue. The dependency graph the loop acts
603
+ on is still audited in effect, because `backlog:next` reuses `epic:next`'s own read and classify and
604
+ answers `error` rather than guessing when it cannot resolve one.