@joshuafolkken/kit 1.1229.0 → 1.1370.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 (939) hide show
  1. package/.claude/agents/investigator.md +1 -0
  2. package/.claude/settings.json +4 -0
  3. package/.claude/skills/dependency-update/SKILL.md +5 -3
  4. package/.claude/skills/epic-commands/SKILL.md +82 -113
  5. package/.claude/skills/epic-commands/epic-bundle.md +38 -63
  6. package/.claude/skills/epic-commands/execution-waves.md +30 -51
  7. package/.claude/skills/verify-ui/SKILL.md +13 -20
  8. package/.claude/skills/workflow-commands/SKILL.md +10 -10
  9. package/.claude/skills/workflow-commands/background-commands.md +4 -4
  10. package/.claude/skills/workflow-commands/backlogrun-child.md +30 -105
  11. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +29 -0
  12. package/.claude/skills/workflow-commands/backlogrun-lanes.md +45 -131
  13. package/.claude/skills/workflow-commands/backlogrun-park.md +36 -53
  14. package/.claude/skills/workflow-commands/backlogrun-progress.md +81 -331
  15. package/.claude/skills/workflow-commands/backlogrun-recovery.md +29 -83
  16. package/.claude/skills/workflow-commands/backlogrun-steps.md +105 -424
  17. package/.claude/skills/workflow-commands/backlogrun.md +50 -61
  18. package/.claude/skills/workflow-commands/chain-rule.md +36 -40
  19. package/.claude/skills/workflow-commands/entry-sequence.md +6 -6
  20. package/.claude/skills/workflow-commands/followup.md +24 -20
  21. package/.claude/skills/workflow-commands/fullrun-steps.md +23 -27
  22. package/.claude/skills/workflow-commands/fullrun.md +10 -10
  23. package/.claude/skills/workflow-commands/halfrun.md +9 -8
  24. package/.claude/skills/workflow-commands/into-target.md +12 -18
  25. package/.claude/skills/workflow-commands/issue-comments.md +11 -26
  26. package/.claude/skills/workflow-commands/kickoff.md +27 -16
  27. package/.claude/skills/workflow-commands/latest-gate.md +18 -29
  28. package/.claude/skills/workflow-commands/needs-human-review.md +13 -24
  29. package/.claude/skills/workflow-commands/observation-filing.md +37 -28
  30. package/.claude/skills/workflow-commands/observation-ledger.md +48 -38
  31. package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -9
  32. package/.claude/skills/workflow-commands/prerequisite.md +23 -15
  33. package/.claude/skills/workflow-commands/progress-watcher.md +17 -11
  34. package/.claude/skills/workflow-commands/prrun.md +3 -3
  35. package/.claude/skills/workflow-commands/retrospective.md +13 -18
  36. package/.claude/skills/workflow-commands/split-assessment.md +6 -4
  37. package/.claude/skills/workflow-commands/target-repository.md +25 -28
  38. package/.claude/skills/workflow-commands/working-tree-hold.md +11 -17
  39. package/.gitattributes +2 -1
  40. package/.github/workflows/ci.yml +14 -0
  41. package/.github/workflows/publish.yml +2 -0
  42. package/.vscode/tasks.json +14 -0
  43. package/CLAUDE.md +10 -61
  44. package/README.md +38 -57
  45. package/SECURITY.md +1 -1
  46. package/dist/CLAUDE.md +10 -61
  47. package/dist/commands/document-section-cli.js +42 -10
  48. package/dist/config-merge/index.js +11 -2
  49. package/dist/hooks/audit-provision.js +2 -2
  50. package/dist/hooks/batch-guard.js +7 -7
  51. package/dist/hooks/{chunk-FIVDHQGT.js → chunk-43G45XJF.js} +18 -20
  52. package/dist/hooks/{chunk-JUDKDCDP.js → chunk-4TW4MQUL.js} +284 -362
  53. package/dist/hooks/{chunk-5VMKCCC4.js → chunk-76RK6E3H.js} +13 -11
  54. package/dist/hooks/{chunk-RNWHN5BP.js → chunk-DZWZ3DKY.js} +4 -4
  55. package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
  56. package/dist/hooks/{chunk-VC3PZPZO.js → chunk-GG72ANKI.js} +1 -1
  57. package/dist/hooks/{chunk-6HJJXRBX.js → chunk-KPM4YIIX.js} +8 -44
  58. package/dist/hooks/chunk-MXVQMLDP.js +3705 -0
  59. package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
  60. package/dist/hooks/{chunk-TQNPDZNH.js → chunk-NZBHG6FW.js} +7 -5
  61. package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
  62. package/dist/hooks/{chunk-F56MFS4B.js → chunk-R6CRQEAL.js} +4 -4
  63. package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
  64. package/dist/hooks/{chunk-55HHG5PX.js → chunk-TLJYAGZK.js} +799 -903
  65. package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
  66. package/dist/hooks/codex-hook-adapter.js +26 -21
  67. package/dist/hooks/duplicate-read-guard.js +8 -8
  68. package/dist/hooks/format-edited.js +4 -4
  69. package/dist/hooks/inputs.json +213 -197
  70. package/dist/hooks/investigation-guard.js +8 -8
  71. package/dist/hooks/pretool-guard.js +15 -15
  72. package/dist/hooks/session-lang.js +406 -8
  73. package/dist/hooks/stop-guard.js +122 -201
  74. package/dist/josh.js +540 -137
  75. package/dist/version/index.js +15 -13
  76. package/eslint/base.js +43 -5
  77. package/eslint/rules/english-only-prose.js +3 -3
  78. package/eslint/rules/import.js +12 -0
  79. package/eslint/rules/namespace-object-export.js +2 -2
  80. package/package.json +16 -10
  81. package/pnpm-workspace.yaml +2 -4
  82. package/prompts/coding-standards.md +14 -48
  83. package/prompts/collaboration-workflow/file-edits.md +1 -1
  84. package/prompts/collaboration-workflow/issue-citation.md +1 -1
  85. package/prompts/collaboration-workflow/issue-template.md +4 -10
  86. package/prompts/collaboration-workflow/operating-rules.md +7 -8
  87. package/prompts/collaboration-workflow/output-bounds.md +1 -1
  88. package/prompts/collaboration-workflow/overview.md +1 -1
  89. package/prompts/collaboration-workflow/plan-comment.md +2 -1
  90. package/prompts/collaboration-workflow/principles.md +21 -3
  91. package/prompts/collaboration-workflow/report-format.md +16 -29
  92. package/prompts/collaboration-workflow/residency.md +1 -1
  93. package/prompts/collaboration-workflow/rule-delivery.md +7 -95
  94. package/prompts/collaboration-workflow/shell-body.md +3 -23
  95. package/prompts/collaboration-workflow/turn-batching.md +4 -13
  96. package/prompts/collaboration-workflow/wip-cap.md +5 -11
  97. package/prompts/refactoring.md +1 -1
  98. package/prompts/review-rubric.md +3 -22
  99. package/prompts/review.md +15 -38
  100. package/prompts/testing-guide.md +2 -4
  101. package/scripts/adopt/adopt-logic.ts +5 -5
  102. package/scripts/adopt/adopt-toolkits.ts +4 -5
  103. package/scripts/adopt/adopt.ts +2 -3
  104. package/scripts/agent/agent-argv.ts +7 -7
  105. package/scripts/agent/agent-diagnostics.ts +2 -2
  106. package/scripts/agent/agent-exit-record.ts +1 -1
  107. package/scripts/agent/agent-headless.ts +1 -1
  108. package/scripts/agent/agent-launch-environment.ts +6 -1
  109. package/scripts/agent/agent-role-profile.ts +49 -22
  110. package/scripts/agent/agent-session-role.ts +32 -0
  111. package/scripts/agent/api-outage.ts +1 -1
  112. package/scripts/agent/claude-agent-argv.ts +4 -4
  113. package/scripts/agent/claude-result-event.ts +4 -4
  114. package/scripts/agent/codex-hooks.ts +2 -2
  115. package/scripts/agent/interactive-ask.ts +3 -6
  116. package/scripts/auto-ok/auto-ok-cli.ts +46 -60
  117. package/scripts/backlog/backlog-arrival-added.ts +34 -0
  118. package/scripts/backlog/backlog-arrival.ts +54 -17
  119. package/scripts/backlog/backlog-budget-cli.ts +34 -6
  120. package/scripts/backlog/backlog-budget.ts +17 -24
  121. package/scripts/backlog/backlog-defect-priority.ts +1 -1
  122. package/scripts/backlog/backlog-drive-args.ts +5 -4
  123. package/scripts/backlog/backlog-drive-cli.ts +14 -10
  124. package/scripts/backlog/backlog-drive-epic.ts +85 -0
  125. package/scripts/backlog/backlog-drive-launch.ts +1 -1
  126. package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
  127. package/scripts/backlog/backlog-drive-named.ts +39 -9
  128. package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
  129. package/scripts/backlog/backlog-drive-restore.ts +1 -1
  130. package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
  131. package/scripts/backlog/backlog-drive.ts +43 -28
  132. package/scripts/backlog/backlog-idle.ts +88 -0
  133. package/scripts/backlog/backlog-named.ts +11 -15
  134. package/scripts/backlog/backlog-next.ts +26 -30
  135. package/scripts/backlog/backlog-offer-cli.ts +28 -23
  136. package/scripts/backlog/backlog-offer.ts +7 -7
  137. package/scripts/backlog/backlog-overlap.ts +178 -0
  138. package/scripts/backlog/backlog-plan-cli.ts +14 -90
  139. package/scripts/backlog/backlog-plan-read.ts +111 -0
  140. package/scripts/backlog/backlog-plan.ts +11 -10
  141. package/scripts/backlog/backlog-pool.ts +13 -14
  142. package/scripts/backlog/backlog-rank.ts +11 -11
  143. package/scripts/backlog/backlog-ready.ts +15 -10
  144. package/scripts/backlog/backlog-scope.ts +14 -15
  145. package/scripts/backlog/backlog-stalled-cli.ts +2 -2
  146. package/scripts/backlog/backlog-stalled-detect.ts +4 -4
  147. package/scripts/backlog/backlog-stalled.ts +5 -6
  148. package/scripts/backlog/backlog-waves.ts +4 -4
  149. package/scripts/backlog/backlogrun-args.ts +74 -0
  150. package/scripts/backlog/backlogrun-cli.ts +113 -0
  151. package/scripts/backlog/backlogrun-launch.ts +178 -0
  152. package/scripts/behavior/behavior-assertion.ts +6 -8
  153. package/scripts/behavior/behavior-cli.ts +1 -1
  154. package/scripts/behavior/behavior-rules.ts +3 -3
  155. package/scripts/build/build-claude-md.ts +4 -4
  156. package/scripts/build/build-codex-hooks.ts +2 -2
  157. package/scripts/build/build-commands.ts +1 -1
  158. package/scripts/build/build-hooks.ts +5 -5
  159. package/scripts/build/build.ts +1 -1
  160. package/scripts/build/hook-bundle-stamp.ts +109 -7
  161. package/scripts/build/local-bin.ts +2 -2
  162. package/scripts/cases/cases-cli.ts +1 -1
  163. package/scripts/cases/cases-logic.ts +2 -2
  164. package/scripts/ci/composite-actions.ts +1 -2
  165. package/scripts/ci/pr-classification.ts +2 -2
  166. package/scripts/claude/workflow-destination.ts +1 -1
  167. package/scripts/clone/clone-aggregate.ts +1 -1
  168. package/scripts/clone/clone-fingerprint.ts +1 -1
  169. package/scripts/clone/clone-scan-cli.ts +1 -1
  170. package/scripts/clone/clone-scan.ts +1 -1
  171. package/scripts/config-merge/index.ts +1 -1
  172. package/scripts/config-merge/json-format.ts +1 -3
  173. package/scripts/config-merge/patch-json-array.ts +90 -0
  174. package/scripts/config-merge/patch-json-key.ts +6 -3
  175. package/scripts/config-merge/patch-json-list.ts +1 -1
  176. package/scripts/cost-runtime/codex-usage.ts +1 -1
  177. package/scripts/cost-runtime/context-cut-payback.ts +4 -5
  178. package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
  179. package/scripts/cost-runtime/cost-attribute.ts +3 -3
  180. package/scripts/cost-runtime/cost-blocks.ts +3 -4
  181. package/scripts/cost-runtime/cost-cli.ts +14 -11
  182. package/scripts/cost-runtime/cost-corpus.ts +11 -11
  183. package/scripts/cost-runtime/cost-pricing.ts +4 -4
  184. package/scripts/cost-runtime/cost-tokens.ts +1 -2
  185. package/scripts/cost-runtime/cost-transcript.ts +29 -29
  186. package/scripts/cost-runtime/cost-usage.ts +6 -7
  187. package/scripts/cost-runtime/cost-verdict.ts +10 -11
  188. package/scripts/cost-runtime/own-session.ts +1 -1
  189. package/scripts/cost-runtime/transcript-cwd.ts +2 -2
  190. package/scripts/delegation/delegation-cli.ts +4 -4
  191. package/scripts/delegation/delegation-policy.ts +13 -15
  192. package/scripts/delegation/duplicate-read-guard.ts +9 -10
  193. package/scripts/delegation/fanout-cli.ts +1 -1
  194. package/scripts/delegation/fanout.ts +1 -1
  195. package/scripts/delegation/investigation-guard.ts +18 -22
  196. package/scripts/delegation/investigation-reads.ts +48 -238
  197. package/scripts/discovery/repo-discovery.ts +1 -1
  198. package/scripts/discovery/repo-map-logic.ts +1 -2
  199. package/scripts/discovery/repo-origin.ts +3 -3
  200. package/scripts/discovery/repo-party-cli.ts +2 -2
  201. package/scripts/discovery/repo-party.ts +2 -2
  202. package/scripts/doctor/doctor-consumer.ts +1 -1
  203. package/scripts/doctor/doctor-io.ts +6 -7
  204. package/scripts/doctor/doctor-logic.ts +1 -1
  205. package/scripts/doctor/doctor-ports.ts +1 -1
  206. package/scripts/doctor/doctor.ts +8 -9
  207. package/scripts/document/backlogrun-parent-read-set.ts +5 -6
  208. package/scripts/document/bash-output-cap.ts +5 -7
  209. package/scripts/document/capped-print-part.ts +1 -1
  210. package/scripts/document/capped-print.ts +1 -1
  211. package/scripts/document/document-byte-budget.ts +33 -64
  212. package/scripts/document/document-byte-check.ts +4 -4
  213. package/scripts/document/document-reachability.ts +7 -8
  214. package/scripts/document/document-read-cli.ts +2 -2
  215. package/scripts/document/document-scan.ts +26 -2
  216. package/scripts/document/document-section-cli.ts +6 -8
  217. package/scripts/document/document-section.ts +8 -12
  218. package/scripts/document/edit-files-cli.ts +3 -4
  219. package/scripts/document/entry-read-budget.ts +8 -70
  220. package/scripts/document/entry-read-set.ts +51 -34
  221. package/scripts/document/lane-child-read-set.ts +9 -9
  222. package/scripts/document/read-files-cli.ts +1 -2
  223. package/scripts/document/read-set-cli.ts +16 -19
  224. package/scripts/document/read-set-cost.ts +4 -4
  225. package/scripts/document/read-set-point-of-use.ts +28 -38
  226. package/scripts/document/read-set-pricing.ts +1 -1
  227. package/scripts/document/read-set-trim.ts +3 -3
  228. package/scripts/document/resident-budget.ts +8 -10
  229. package/scripts/epic/epic-add-body.ts +15 -18
  230. package/scripts/epic/epic-add-plan.ts +26 -28
  231. package/scripts/epic/epic-add.ts +32 -25
  232. package/scripts/epic/epic-audit-checks.ts +27 -37
  233. package/scripts/epic/epic-audit-cli.ts +21 -22
  234. package/scripts/epic/epic-audit-orphans.ts +16 -17
  235. package/scripts/epic/epic-audit-rationale.ts +10 -15
  236. package/scripts/epic/epic-audit-report.ts +2 -5
  237. package/scripts/epic/epic-audit.ts +18 -14
  238. package/scripts/epic/epic-body.ts +10 -10
  239. package/scripts/epic/epic-bundle-cli.ts +36 -34
  240. package/scripts/epic/epic-bundle-evidence.ts +5 -5
  241. package/scripts/epic/epic-bundle-gaps.ts +6 -9
  242. package/scripts/epic/epic-bundle-poll.ts +1 -1
  243. package/scripts/epic/epic-bundle-referenced.ts +11 -14
  244. package/scripts/epic/epic-bundle.ts +19 -20
  245. package/scripts/epic/epic-busy.ts +44 -21
  246. package/scripts/epic/epic-candidate-confirm.ts +15 -18
  247. package/scripts/epic/epic-chains.ts +18 -23
  248. package/scripts/epic/epic-classify.ts +11 -12
  249. package/scripts/epic/epic-cli-argv.ts +5 -6
  250. package/scripts/epic/epic-cli-remove.ts +9 -4
  251. package/scripts/epic/epic-cli.ts +38 -26
  252. package/scripts/epic/epic-close-comment.ts +14 -15
  253. package/scripts/epic/epic-close.ts +25 -29
  254. package/scripts/epic/epic-cross-repo.ts +18 -21
  255. package/scripts/epic/epic-decision.ts +14 -18
  256. package/scripts/epic/epic-fetch.ts +25 -31
  257. package/scripts/epic/epic-graph.ts +15 -17
  258. package/scripts/epic/epic-index.ts +14 -16
  259. package/scripts/epic/epic-issue.ts +9 -11
  260. package/scripts/epic/epic-label-age.ts +74 -0
  261. package/scripts/epic/epic-lane-offer.ts +35 -24
  262. package/scripts/epic/epic-nested.ts +1 -1
  263. package/scripts/epic/epic-next-read.ts +8 -8
  264. package/scripts/epic/epic-next-views.ts +12 -12
  265. package/scripts/epic/epic-next.ts +29 -33
  266. package/scripts/epic/epic-outside-blocker.ts +11 -10
  267. package/scripts/epic/epic-parse.ts +22 -24
  268. package/scripts/epic/epic-promote.ts +3 -2
  269. package/scripts/epic/epic-rank.ts +1 -1
  270. package/scripts/epic/epic-read.ts +10 -8
  271. package/scripts/epic/epic-reconcile.ts +8 -6
  272. package/scripts/epic/epic-reference.ts +5 -4
  273. package/scripts/epic/epic-relation-recheck.ts +10 -11
  274. package/scripts/epic/epic-relations.ts +9 -8
  275. package/scripts/epic/epic-remove-plan.ts +4 -5
  276. package/scripts/epic/epic-remove.ts +7 -5
  277. package/scripts/epic/epic-report.ts +18 -20
  278. package/scripts/epic/epic-run.ts +6 -5
  279. package/scripts/epic/epic-sections.ts +2 -2
  280. package/scripts/epic/epic-shape.ts +3 -3
  281. package/scripts/epic/epic-solo-stale.ts +3 -2
  282. package/scripts/epic/epic-solo.ts +8 -8
  283. package/scripts/epic/epic-triage.ts +5 -4
  284. package/scripts/epic/epic-validate.ts +8 -7
  285. package/scripts/epic/epic.ts +5 -5
  286. package/scripts/exports/unused-members-cli.ts +1 -1
  287. package/scripts/followup/followup-issue-number.ts +1 -2
  288. package/scripts/followup/git-followup-cleanup.ts +6 -7
  289. package/scripts/followup/git-followup-finish.ts +11 -13
  290. package/scripts/followup/git-followup-flush.ts +11 -7
  291. package/scripts/followup/git-followup-issue-close.ts +16 -13
  292. package/scripts/followup/git-followup-label.ts +9 -6
  293. package/scripts/followup/git-followup-merged.ts +1 -1
  294. package/scripts/followup/git-followup-pending.ts +7 -9
  295. package/scripts/followup/git-followup-stages.ts +28 -17
  296. package/scripts/followup/git-followup-workflow.ts +19 -21
  297. package/scripts/followup/git-pr-followup-checks.ts +13 -20
  298. package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
  299. package/scripts/followup/git-pr-followup.ts +18 -17
  300. package/scripts/gate/core-admission.ts +162 -0
  301. package/scripts/gate/core-budget.ts +134 -91
  302. package/scripts/gate/gate-ledger.ts +114 -0
  303. package/scripts/gate/gate-log.ts +7 -9
  304. package/scripts/gate/gate-plan.ts +103 -35
  305. package/scripts/gate/gate-report.ts +39 -21
  306. package/scripts/gate/gate-skip.ts +11 -13
  307. package/scripts/gate/gate-steps.ts +5 -1
  308. package/scripts/gate/gate-tree.ts +3 -4
  309. package/scripts/gate/hook-gate-reuse.ts +9 -9
  310. package/scripts/gate/machine-capacity.ts +313 -0
  311. package/scripts/gate/pre-commit-type-check.ts +4 -4
  312. package/scripts/gate/project-checks.ts +12 -4
  313. package/scripts/gate/scoped-green.ts +11 -18
  314. package/scripts/gate/type-check-command.ts +2 -2
  315. package/scripts/gate/type-check-step.ts +4 -4
  316. package/scripts/gate/verification-gate.ts +60 -53
  317. package/scripts/gh/gh-spawn.ts +2 -2
  318. package/scripts/gh/git-ai-review-scan.ts +3 -2
  319. package/scripts/gh/git-gh-api-path.ts +10 -11
  320. package/scripts/gh/git-gh-exec.ts +43 -48
  321. package/scripts/gh/git-gh-failure.ts +6 -9
  322. package/scripts/gh/git-gh-helpers.ts +1 -1
  323. package/scripts/gh/git-gh-issue-list.ts +15 -19
  324. package/scripts/gh/git-gh-issue-read.ts +43 -60
  325. package/scripts/gh/git-gh-issue-rest.ts +14 -15
  326. package/scripts/gh/git-gh-issue-write.ts +52 -40
  327. package/scripts/gh/git-gh-issue.ts +23 -24
  328. package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
  329. package/scripts/gh/git-gh-pr-read.ts +46 -50
  330. package/scripts/gh/git-gh-pr-rest.ts +23 -26
  331. package/scripts/gh/git-gh-pr-review.ts +2 -2
  332. package/scripts/gh/git-gh-pr-rollup.ts +4 -4
  333. package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
  334. package/scripts/gh/git-gh-pr.ts +16 -16
  335. package/scripts/gh/git-gh-reachability.ts +11 -12
  336. package/scripts/gh/git-gh-repo.ts +2 -3
  337. package/scripts/gh/git-gh-rest-state.ts +1 -1
  338. package/scripts/gh/git-pr-ai-review.ts +6 -5
  339. package/scripts/gh/git-pr-checks-eval.ts +28 -30
  340. package/scripts/gh/git-pr-checks-parse.ts +14 -16
  341. package/scripts/gh/git-pr-checks-watch.ts +17 -17
  342. package/scripts/gh/git-pr-checks.ts +20 -23
  343. package/scripts/gh/git-pr-coderabbit.ts +8 -6
  344. package/scripts/gh/git-pr-confirmation.ts +5 -5
  345. package/scripts/gh/git-pr-managed-config.ts +7 -9
  346. package/scripts/gh/git-pr-messages.ts +1 -1
  347. package/scripts/gh/git-pr.ts +15 -16
  348. package/scripts/gh/github-issue-url.ts +8 -9
  349. package/scripts/git/base-tree.ts +66 -0
  350. package/scripts/git/change-base.ts +42 -2
  351. package/scripts/git/changed-file-scope.ts +5 -5
  352. package/scripts/git/changed-paths.ts +1 -2
  353. package/scripts/git/constants.ts +2 -2
  354. package/scripts/git/git-branch.ts +1 -1
  355. package/scripts/git/git-closes-keyword.ts +3 -3
  356. package/scripts/git/git-command.ts +53 -41
  357. package/scripts/git/git-common-directory.ts +3 -3
  358. package/scripts/git/git-diff-reads.ts +14 -15
  359. package/scripts/git/git-error.ts +1 -1
  360. package/scripts/git/git-execa-error.ts +1 -2
  361. package/scripts/git/git-issue.ts +10 -8
  362. package/scripts/git/git-location-environment.ts +3 -4
  363. package/scripts/git/git-ls-remote.ts +6 -8
  364. package/scripts/git/git-pre-push-hook.ts +11 -10
  365. package/scripts/git/git-preflight.ts +5 -5
  366. package/scripts/git/git-push-transport.ts +2 -2
  367. package/scripts/git/git-remote-branch.ts +1 -2
  368. package/scripts/git/git-schemas.ts +16 -23
  369. package/scripts/git/git-spawn-sync.ts +1 -1
  370. package/scripts/git/git-spawn.ts +37 -14
  371. package/scripts/git/git-ssh-keepalive.ts +12 -5
  372. package/scripts/git/git-staging.ts +7 -8
  373. package/scripts/git/git-workflow.ts +1 -1
  374. package/scripts/git/git-worktree.ts +35 -27
  375. package/scripts/git/gone-branch.ts +2 -2
  376. package/scripts/git/listing-cutoff.ts +1 -2
  377. package/scripts/git/lockfile-sync.ts +65 -0
  378. package/scripts/git/main-merge-guard.ts +1 -2
  379. package/scripts/git/main-merge.ts +7 -7
  380. package/scripts/git/main-sync.ts +23 -8
  381. package/scripts/git/parse-json-array.ts +18 -23
  382. package/scripts/git/repository-lock.ts +34 -2
  383. package/scripts/git/stash/git-stash.ts +4 -5
  384. package/scripts/git/stash/stash-orphans.ts +5 -3
  385. package/scripts/git/stash/stash-pop-args.ts +1 -1
  386. package/scripts/git/stash/stash-pop-cli.ts +3 -3
  387. package/scripts/git/stash/stash-sweep-lock.ts +2 -2
  388. package/scripts/hooks/batch-guard.ts +11 -13
  389. package/scripts/hooks/check-commit-message.ts +12 -9
  390. package/scripts/hooks/codex-hook-adapter.ts +16 -10
  391. package/scripts/hooks/edited-cspell.ts +3 -4
  392. package/scripts/hooks/format-edited-cli.ts +1 -1
  393. package/scripts/hooks/format-edited-file.ts +11 -17
  394. package/scripts/hooks/format-rewrite-notice.ts +19 -17
  395. package/scripts/hooks/pre-push-unit.ts +10 -14
  396. package/scripts/hooks/pretool-guard-cli.ts +4 -4
  397. package/scripts/hooks/pretool-guard.ts +93 -18
  398. package/scripts/hooks/reserved-run.ts +2 -2
  399. package/scripts/hooks/step-zero-notice.ts +1 -1
  400. package/scripts/hooks/stop-guard.ts +21 -10
  401. package/scripts/init/basic-path-migration.ts +2 -2
  402. package/scripts/init/claude-kit-only-settings.ts +2 -2
  403. package/scripts/init/claude-plugin-config.ts +2 -2
  404. package/scripts/init/distributed-paths.ts +4 -4
  405. package/scripts/init/hook-command-rewrite.ts +3 -3
  406. package/scripts/init/hook-launch.ts +5 -5
  407. package/scripts/init/init-actions.ts +13 -0
  408. package/scripts/init/init-ai-copy.ts +11 -11
  409. package/scripts/init/init-bootstrap.ts +3 -3
  410. package/scripts/init/init-copy-content.ts +4 -4
  411. package/scripts/init/init-logic-json-merge.ts +7 -9
  412. package/scripts/init/init-logic-migrate.ts +1 -1
  413. package/scripts/init/init-logic-templates.ts +1 -1
  414. package/scripts/init/init-logic-workspace.ts +4 -4
  415. package/scripts/init/init-logic-yaml-merge.ts +2 -2
  416. package/scripts/init/init-logic.ts +19 -22
  417. package/scripts/init/init.ts +12 -8
  418. package/scripts/init/kit-base-preset.ts +1 -1
  419. package/scripts/init/kit-setup-state.ts +1 -1
  420. package/scripts/init/kit-written-paths.ts +1 -2
  421. package/scripts/init/package-manager-pin.ts +35 -0
  422. package/scripts/init/project-profile-cli.ts +1 -1
  423. package/scripts/init/project-profile.ts +3 -3
  424. package/scripts/init/session-language-environment.ts +1 -1
  425. package/scripts/init/start-exec.ts +3 -4
  426. package/scripts/init/start-plan.ts +2 -2
  427. package/scripts/init/start-setup-pr.ts +3 -2
  428. package/scripts/init/start-steps.ts +2 -2
  429. package/scripts/init/tsconfig-preset-migration.ts +1 -1
  430. package/scripts/init/vscode-tasks.ts +62 -0
  431. package/scripts/issue/baseline-measure.ts +2 -2
  432. package/scripts/issue/behavior-change-lint.ts +2 -2
  433. package/scripts/issue/defect-rate-cli.ts +6 -7
  434. package/scripts/issue/defect-rate.ts +37 -27
  435. package/scripts/issue/git-next-issues.ts +9 -8
  436. package/scripts/issue/issue-auto-ok.ts +49 -11
  437. package/scripts/issue/issue-backlinks-cli.ts +5 -5
  438. package/scripts/issue/issue-backlinks.ts +6 -6
  439. package/scripts/issue/issue-cite-cli.ts +20 -18
  440. package/scripts/issue/issue-cite.ts +18 -8
  441. package/scripts/issue/issue-closing-pr.ts +4 -4
  442. package/scripts/issue/issue-comment-cli.ts +6 -4
  443. package/scripts/issue/issue-file-cli.ts +75 -15
  444. package/scripts/issue/issue-file-fold.ts +155 -0
  445. package/scripts/issue/issue-file.ts +14 -6
  446. package/scripts/issue/issue-fold-cli.ts +14 -9
  447. package/scripts/issue/issue-fold.ts +23 -8
  448. package/scripts/issue/issue-labels.ts +46 -37
  449. package/scripts/issue/issue-lint-cli.ts +2 -2
  450. package/scripts/issue/issue-lint.ts +1 -1
  451. package/scripts/issue/issue-merged.ts +10 -4
  452. package/scripts/issue/issue-number-shape.ts +27 -0
  453. package/scripts/issue/issue-rank.ts +1 -1
  454. package/scripts/issue/issue-read-cli.ts +4 -5
  455. package/scripts/issue/issue-read.ts +4 -5
  456. package/scripts/issue/issue-reference.ts +5 -5
  457. package/scripts/issue/issue-release-cli.ts +165 -0
  458. package/scripts/issue/issue-release.ts +58 -0
  459. package/scripts/issue/issue-report-failures.ts +7 -4
  460. package/scripts/issue/issue-scout-cli.ts +11 -11
  461. package/scripts/issue/issue-scout-closed.ts +4 -4
  462. package/scripts/issue/issue-scout.ts +4 -5
  463. package/scripts/issue/issue-state-cli.ts +17 -10
  464. package/scripts/issue/issue-state.ts +12 -13
  465. package/scripts/issue/issue-wip.ts +7 -7
  466. package/scripts/issue/markdown-section.ts +3 -3
  467. package/scripts/issue/measure-rerun-cli.ts +10 -9
  468. package/scripts/issue/reproduction-measure.ts +3 -3
  469. package/scripts/issue/session-cite.ts +56 -0
  470. package/scripts/josh/agent-session-environment.ts +10 -8
  471. package/scripts/josh/cli-body.ts +2 -2
  472. package/scripts/josh/command-suggest.ts +1 -1
  473. package/scripts/josh/file-map-stamp.ts +20 -23
  474. package/scripts/josh/hook-decision.ts +24 -28
  475. package/scripts/josh/josh-command-map.ts +4 -1
  476. package/scripts/josh/josh-command-types.ts +32 -34
  477. package/scripts/josh/josh-commands-ai.ts +6 -6
  478. package/scripts/josh/josh-commands-backlog.ts +15 -3
  479. package/scripts/josh/josh-commands-clone.ts +1 -1
  480. package/scripts/josh/josh-commands-development.ts +33 -4
  481. package/scripts/josh/josh-commands-document.ts +3 -3
  482. package/scripts/josh/josh-commands-guard.ts +3 -3
  483. package/scripts/josh/josh-commands-issue.ts +11 -5
  484. package/scripts/josh/josh-commands-lane.ts +16 -5
  485. package/scripts/josh/josh-commands-lint.ts +1 -1
  486. package/scripts/josh/josh-commands-maintenance.ts +2 -2
  487. package/scripts/josh/josh-commands-run.ts +20 -6
  488. package/scripts/josh/josh-commands-split.ts +1 -2
  489. package/scripts/josh/josh-commands-versioning.ts +5 -5
  490. package/scripts/josh/josh-commands-workflow.ts +30 -22
  491. package/scripts/josh/josh-environment-file.ts +1 -1
  492. package/scripts/josh/josh-in-process.ts +3 -3
  493. package/scripts/josh/josh-logic.ts +10 -10
  494. package/scripts/josh/josh-run.ts +3 -3
  495. package/scripts/josh/josh-verdict.ts +9 -12
  496. package/scripts/josh/josh.ts +3 -3
  497. package/scripts/josh/kit-only.ts +2 -2
  498. package/scripts/josh/path-decision.ts +3 -3
  499. package/scripts/josh/platform-temporary.ts +7 -5
  500. package/scripts/josh/process-identity.ts +24 -6
  501. package/scripts/josh/process-owner.ts +4 -4
  502. package/scripts/josh/session-language-cli.ts +53 -11
  503. package/scripts/josh/session-language.ts +1 -1
  504. package/scripts/josh/stamp-file.ts +48 -29
  505. package/scripts/josh/stamp-record.ts +57 -0
  506. package/scripts/lane/lane-await.ts +35 -11
  507. package/scripts/lane/lane-cache.ts +6 -6
  508. package/scripts/lane/lane-capacity.ts +32 -17
  509. package/scripts/lane/lane-child-invocation.ts +17 -15
  510. package/scripts/lane/lane-child-marker.ts +12 -12
  511. package/scripts/lane/lane-cli.ts +20 -13
  512. package/scripts/lane/lane-close.ts +6 -6
  513. package/scripts/lane/lane-dispatch.ts +61 -72
  514. package/scripts/lane/lane-environment.ts +5 -5
  515. package/scripts/lane/lane-guard-policy.ts +7 -21
  516. package/scripts/lane/lane-handoff.ts +2 -2
  517. package/scripts/lane/lane-install.ts +9 -10
  518. package/scripts/lane/lane-launch-cli.ts +13 -8
  519. package/scripts/lane/lane-ledger.ts +73 -11
  520. package/scripts/lane/lane-leftover.ts +44 -30
  521. package/scripts/lane/lane-limit-cli.ts +160 -0
  522. package/scripts/lane/lane-limit-override.ts +74 -0
  523. package/scripts/lane/lane-load.ts +19 -68
  524. package/scripts/lane/lane-measure-cli.ts +15 -25
  525. package/scripts/lane/lane-occupancy.ts +6 -4
  526. package/scripts/lane/lane-open.ts +25 -24
  527. package/scripts/lane/lane-output.ts +4 -3
  528. package/scripts/lane/lane-paths.ts +22 -8
  529. package/scripts/lane/lane-phase.ts +33 -0
  530. package/scripts/lane/lane-reap.ts +2 -2
  531. package/scripts/lane/lane-registry.ts +27 -15
  532. package/scripts/lane/lane-relaunch.ts +9 -9
  533. package/scripts/lane/lane-report.ts +5 -4
  534. package/scripts/lane/lane-resume.ts +2 -2
  535. package/scripts/lane/lane-sampler.ts +55 -0
  536. package/scripts/lane/lane-seed.ts +7 -7
  537. package/scripts/lane/lane-stage-stats.ts +135 -0
  538. package/scripts/lane/lane-start-point.ts +8 -11
  539. package/scripts/lane/lane-stats.ts +60 -15
  540. package/scripts/lane/lane-stray.ts +140 -0
  541. package/scripts/lane/lane-vacant.ts +1 -1
  542. package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
  543. package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
  544. package/scripts/lane/openai-review-broker.ts +2 -4
  545. package/scripts/lib/ancestor-directories.ts +1 -1
  546. package/scripts/lib/bounded-pool.ts +2 -2
  547. package/scripts/lib/buffered-process.ts +4 -6
  548. package/scripts/lib/caddy-logs.sh +0 -0
  549. package/scripts/lib/cli-flags.ts +39 -6
  550. package/scripts/lib/error-message.ts +1 -1
  551. package/scripts/lib/json-value.ts +17 -3
  552. package/scripts/lib/poll.ts +1 -1
  553. package/scripts/lib/status-icons.ts +3 -3
  554. package/scripts/lib/timed-fetch.ts +1 -1
  555. package/scripts/lib/timeouts.ts +1 -1
  556. package/scripts/lines/bytes-command.ts +3 -4
  557. package/scripts/lines/effective-limit.ts +25 -12
  558. package/scripts/lines/line-budget.ts +47 -55
  559. package/scripts/lines/line-targets.ts +6 -2
  560. package/scripts/lines/lines-command.ts +3 -3
  561. package/scripts/lint/cspell-cached.ts +1 -1
  562. package/scripts/lint/cycle-recheck.ts +122 -0
  563. package/scripts/lint/format.ts +1 -2
  564. package/scripts/lint/lint-parallel.ts +34 -19
  565. package/scripts/lint/lint-related-scope.ts +25 -15
  566. package/scripts/lint/lint-related.ts +6 -7
  567. package/scripts/managed-marker/index.ts +1 -1
  568. package/scripts/managed-marker/managed-marker-logic.ts +1 -2
  569. package/scripts/notify/git-notify.ts +9 -7
  570. package/scripts/notify/telegram-notify.ts +53 -37
  571. package/scripts/notify/telegram-test-logic.ts +3 -3
  572. package/scripts/notify/telegram-test.ts +45 -30
  573. package/scripts/observations/observation-ledger-home.ts +14 -8
  574. package/scripts/observations/observation-ledger-line.ts +3 -2
  575. package/scripts/observations/observation-ledger-migrate.ts +3 -4
  576. package/scripts/observations/observation-ledger-prepare.ts +4 -4
  577. package/scripts/observations/observation-ledger.ts +14 -15
  578. package/scripts/observations/observation-record-cli.ts +83 -0
  579. package/scripts/observations/observation-record.ts +91 -0
  580. package/scripts/observations/observations-flush-cli.ts +1 -1
  581. package/scripts/observations/observations-flush-landing.ts +7 -6
  582. package/scripts/observations/observations-flush.ts +26 -27
  583. package/scripts/overrides/overrides-check.ts +18 -8
  584. package/scripts/package/package-scout-cli.ts +1 -1
  585. package/scripts/package/package-scout-format.ts +2 -2
  586. package/scripts/package/package-scout.ts +1 -1
  587. package/scripts/propagate/propagate-git-failure.ts +1 -1
  588. package/scripts/propagate/propagate-git.ts +7 -7
  589. package/scripts/propagate/propagate-plan.ts +2 -2
  590. package/scripts/propagate/propagate-publish.ts +2 -3
  591. package/scripts/propagate/propagate-run.ts +5 -7
  592. package/scripts/propagate/propagate-select.ts +1 -1
  593. package/scripts/propagate/propagate-steps.ts +19 -20
  594. package/scripts/propagate/propagate-targets.ts +6 -10
  595. package/scripts/propagate/propagate.ts +5 -5
  596. package/scripts/refactor/import-graph.ts +1 -1
  597. package/scripts/refactor/refactor-lint.ts +4 -10
  598. package/scripts/refactor/refactor-scan-cli.ts +1 -1
  599. package/scripts/refactor/refactor-scan.ts +2 -2
  600. package/scripts/refactor/refactor-targets.ts +1 -1
  601. package/scripts/release/github-release-cli.ts +25 -3
  602. package/scripts/release/github-release-environment.ts +1 -0
  603. package/scripts/release/github-release-runs.ts +115 -0
  604. package/scripts/release/github-release.ts +13 -67
  605. package/scripts/release/release-cli.ts +21 -4
  606. package/scripts/release/release-history.ts +6 -10
  607. package/scripts/release/release-plan.ts +3 -3
  608. package/scripts/release/release-progress.ts +3 -4
  609. package/scripts/release/release-publish.ts +8 -9
  610. package/scripts/release/release-scope-cli.ts +8 -10
  611. package/scripts/release/release-tag.ts +6 -8
  612. package/scripts/release/release-worktree.ts +5 -5
  613. package/scripts/repo/auto-merge-setting-logic.ts +7 -9
  614. package/scripts/repo/auto-merge-setting.ts +1 -1
  615. package/scripts/repo/repo-setting.ts +4 -4
  616. package/scripts/repo/repository-labels.ts +1 -1
  617. package/scripts/repo/required-checks-logic.ts +3 -3
  618. package/scripts/repo/required-checks-report.ts +1 -1
  619. package/scripts/repo/ruleset-check-cli.ts +1 -1
  620. package/scripts/repo/ruleset-check.ts +1 -1
  621. package/scripts/report/report-format-reference.ts +26 -0
  622. package/scripts/report/report-lint-cli.ts +2 -2
  623. package/scripts/report/report-lint.ts +16 -2
  624. package/scripts/review/disposition-cli.ts +2 -2
  625. package/scripts/review/disposition-logic.ts +1 -1
  626. package/scripts/review/live-evidence.ts +9 -6
  627. package/scripts/review/review-attest-cli.ts +1 -2
  628. package/scripts/review/review-attest.ts +3 -3
  629. package/scripts/review/review-brief-cli.ts +19 -20
  630. package/scripts/review/review-brief.ts +29 -32
  631. package/scripts/review/review-checkout.ts +2 -2
  632. package/scripts/review/review-diff-parts.ts +3 -5
  633. package/scripts/review/review-diff-write.ts +1 -1
  634. package/scripts/review/review-finding-ledger.ts +7 -4
  635. package/scripts/review/review-findings-cli.ts +2 -2
  636. package/scripts/review/review-level.ts +4 -7
  637. package/scripts/review/review-record-cli.ts +73 -16
  638. package/scripts/review/review-record.ts +5 -4
  639. package/scripts/review/review-round2-cli.ts +2 -3
  640. package/scripts/review/review-round2.ts +13 -21
  641. package/scripts/review/review-stamps.ts +9 -71
  642. package/scripts/review/review-tree.ts +4 -5
  643. package/scripts/rules/bash-triggers.ts +4 -4
  644. package/scripts/rules/decision-oracle-batch.ts +5 -6
  645. package/scripts/rules/decision-oracle-stage.ts +1 -1
  646. package/scripts/rules/decision-oracle-tokens.ts +1 -2
  647. package/scripts/rules/decision-oracle.ts +2 -2
  648. package/scripts/rules/delivered-rules.ts +61 -406
  649. package/scripts/rules/destructive-command.ts +2 -2
  650. package/scripts/rules/direct-filing.ts +4 -4
  651. package/scripts/rules/direct-pr-create.ts +2 -2
  652. package/scripts/rules/early-heartbeat.ts +15 -19
  653. package/scripts/rules/file-body.ts +5 -6
  654. package/scripts/rules/filing-cap.ts +6 -7
  655. package/scripts/rules/filing-offer.ts +1 -1
  656. package/scripts/rules/firing-point.ts +6 -6
  657. package/scripts/rules/gh-api.ts +2 -2
  658. package/scripts/rules/git-argv.ts +3 -3
  659. package/scripts/rules/git-force.ts +2 -2
  660. package/scripts/rules/hook-context-line.ts +31 -0
  661. package/scripts/rules/implementation-cut-verdict.ts +5 -8
  662. package/scripts/rules/implementation-cut.ts +35 -32
  663. package/scripts/rules/index-guard.ts +2 -2
  664. package/scripts/rules/issue-citation.ts +7 -7
  665. package/scripts/rules/issue-comments.ts +21 -13
  666. package/scripts/rules/josh-git-bare.ts +2 -2
  667. package/scripts/rules/lane-background.ts +14 -16
  668. package/scripts/rules/lane-carry-conflict.ts +41 -5
  669. package/scripts/rules/lane-interactive-ask.ts +6 -9
  670. package/scripts/rules/lane-park.ts +12 -16
  671. package/scripts/rules/lane-split-park.ts +1 -2
  672. package/scripts/rules/lane-switch-main.ts +10 -13
  673. package/scripts/rules/last-prompt.ts +1 -1
  674. package/scripts/rules/oracle-consulted.ts +5 -5
  675. package/scripts/rules/oracle-firing.ts +6 -9
  676. package/scripts/rules/oracle-list-cli.ts +2 -2
  677. package/scripts/rules/permission-guards.ts +2 -2
  678. package/scripts/rules/piped-verification.ts +79 -9
  679. package/scripts/rules/poll-loop.ts +9 -11
  680. package/scripts/rules/pre-gate-cut.ts +33 -30
  681. package/scripts/rules/prior-comment-read.ts +3 -3
  682. package/scripts/rules/protected-files.ts +25 -13
  683. package/scripts/rules/raw-field-body.ts +3 -4
  684. package/scripts/rules/reply-language.ts +1 -1
  685. package/scripts/rules/rule-body-guard.ts +10 -12
  686. package/scripts/rules/rule-guard.ts +1 -1
  687. package/scripts/rules/rule-list.ts +51 -0
  688. package/scripts/rules/rule-registry-rows.ts +282 -0
  689. package/scripts/rules/rule-registry.ts +109 -0
  690. package/scripts/rules/rule-value-cache.ts +2 -2
  691. package/scripts/rules/rule-value-cli.ts +6 -4
  692. package/scripts/rules/rule-value.ts +61 -22
  693. package/scripts/rules/run-tail-rule.ts +11 -15
  694. package/scripts/rules/shell-body-trigger.ts +7 -7
  695. package/scripts/rules/shell-segments.ts +2 -4
  696. package/scripts/rules/stop-rules.ts +54 -41
  697. package/scripts/rules/tail-commands.ts +1 -1
  698. package/scripts/rules/test-declared-commit.ts +2 -2
  699. package/scripts/rules/third-party-write.ts +3 -3
  700. package/scripts/rules/worktree-guard.ts +12 -5
  701. package/scripts/run/add/run-add-cli.ts +165 -0
  702. package/scripts/run/add/run-add.ts +124 -0
  703. package/scripts/run/board/run-board-cli.ts +207 -0
  704. package/scripts/run/board/run-board-closed.ts +95 -0
  705. package/scripts/run/board/run-board-every.ts +60 -0
  706. package/scripts/run/board/run-board-fetch.ts +38 -0
  707. package/scripts/run/board/run-board-fit.ts +219 -0
  708. package/scripts/run/board/run-board-github.ts +162 -0
  709. package/scripts/run/board/run-board-header.ts +275 -0
  710. package/scripts/run/board/run-board-kind.ts +35 -0
  711. package/scripts/run/board/run-board-labels.ts +299 -0
  712. package/scripts/run/board/run-board-layout.ts +222 -0
  713. package/scripts/run/board/run-board-link.ts +31 -0
  714. package/scripts/run/board/run-board-machine.ts +198 -0
  715. package/scripts/run/board/run-board-notes.ts +103 -0
  716. package/scripts/run/board/run-board-phase.ts +136 -0
  717. package/scripts/run/board/run-board-plan.ts +129 -0
  718. package/scripts/run/board/run-board-read.ts +62 -0
  719. package/scripts/run/board/run-board-render-legend.ts +82 -0
  720. package/scripts/run/board/run-board-render-notes.ts +77 -0
  721. package/scripts/run/board/run-board-render-slot.ts +50 -0
  722. package/scripts/run/board/run-board-render.ts +407 -0
  723. package/scripts/run/board/run-board-scope.ts +17 -0
  724. package/scripts/run/board/run-board-screen.ts +43 -0
  725. package/scripts/run/board/run-board-span.ts +66 -0
  726. package/scripts/run/board/run-board-spin.ts +115 -0
  727. package/scripts/run/board/run-board-state.ts +113 -0
  728. package/scripts/run/board/run-board-status.ts +279 -0
  729. package/scripts/run/board/run-board-tick.ts +210 -0
  730. package/scripts/run/board/run-board-track.ts +22 -0
  731. package/scripts/run/board/run-board-usage-read.ts +255 -0
  732. package/scripts/run/board/run-board-usage-rusage.ts +124 -0
  733. package/scripts/run/board/run-board-usage-text.ts +80 -0
  734. package/scripts/run/board/run-board-usage.ts +165 -0
  735. package/scripts/run/carry/run-carry-added.ts +62 -0
  736. package/scripts/run/carry/run-carry-args.ts +25 -22
  737. package/scripts/run/carry/run-carry-change.ts +1 -1
  738. package/scripts/run/carry/run-carry-cli.ts +71 -48
  739. package/scripts/run/carry/run-carry-conversation.ts +6 -7
  740. package/scripts/run/carry/run-carry-ended.ts +85 -0
  741. package/scripts/run/carry/run-carry-reclaim.ts +1 -1
  742. package/scripts/run/carry/run-carry-stash.ts +3 -2
  743. package/scripts/run/carry/run-carry-streak.ts +8 -10
  744. package/scripts/run/carry/run-carry.ts +85 -89
  745. package/scripts/run/cut/run-cut-args.ts +7 -7
  746. package/scripts/run/cut/run-cut-cli.ts +68 -37
  747. package/scripts/run/cut/run-cut-handoff.ts +15 -15
  748. package/scripts/run/cut/run-cut-report.ts +37 -16
  749. package/scripts/run/cut/run-cut.ts +63 -77
  750. package/scripts/run/detached-launch.ts +35 -50
  751. package/scripts/run/entry/run-entry-cli.ts +48 -27
  752. package/scripts/run/entry/run-entry-stop.ts +7 -9
  753. package/scripts/run/entry/run-entry.ts +5 -6
  754. package/scripts/run/event/run-event-cli.ts +5 -6
  755. package/scripts/run/event/run-event-filed.ts +69 -0
  756. package/scripts/run/event/run-event-follow.ts +3 -3
  757. package/scripts/run/event/run-event-plan.ts +38 -0
  758. package/scripts/run/event/run-event-render.ts +10 -4
  759. package/scripts/run/event/run-event-scope.ts +47 -18
  760. package/scripts/run/event/run-event-stream-emit.ts +64 -11
  761. package/scripts/run/event/run-event-stream.ts +172 -43
  762. package/scripts/run/event/run-event-watch.ts +4 -6
  763. package/scripts/run/hold/run-hold-cli.ts +65 -62
  764. package/scripts/run/hold/run-hold.ts +88 -46
  765. package/scripts/run/merge/run-merge-cli.ts +116 -77
  766. package/scripts/run/merge/run-merge-collect.ts +107 -0
  767. package/scripts/run/merge/run-merge-steps.ts +112 -65
  768. package/scripts/run/merge/run-merge-token.ts +30 -0
  769. package/scripts/run/merge/run-merge.ts +31 -22
  770. package/scripts/run/progress/run-progress-args.ts +4 -4
  771. package/scripts/run/progress/run-progress-cli.ts +39 -50
  772. package/scripts/run/progress/run-progress-clock.ts +25 -32
  773. package/scripts/run/progress/run-progress-config.ts +6 -9
  774. package/scripts/run/progress/run-progress-read.ts +9 -10
  775. package/scripts/run/progress/run-progress.ts +48 -53
  776. package/scripts/run/review/run-review-cli.ts +6 -6
  777. package/scripts/run/review/run-review-steps.ts +6 -6
  778. package/scripts/run/review/run-review.ts +9 -11
  779. package/scripts/run/run-cli-fault.ts +29 -0
  780. package/scripts/run/run-ending-cli.ts +3 -3
  781. package/scripts/run/run-ending.ts +10 -14
  782. package/scripts/run/run-halfrun-resume.ts +6 -8
  783. package/scripts/run/run-headless.ts +25 -12
  784. package/scripts/run/run-invocation.ts +17 -22
  785. package/scripts/run/run-label.ts +7 -5
  786. package/scripts/run/run-liveness-cli.ts +19 -6
  787. package/scripts/run/run-liveness.ts +27 -38
  788. package/scripts/run/run-next-cli.ts +5 -9
  789. package/scripts/run/run-next.ts +4 -5
  790. package/scripts/run/run-parent-cut-hook.ts +10 -12
  791. package/scripts/run/run-preflight.ts +25 -29
  792. package/scripts/run/run-prep-cli.ts +17 -13
  793. package/scripts/run/run-prep-locate.ts +4 -5
  794. package/scripts/run/run-prep.ts +7 -10
  795. package/scripts/run/run-prrun-resume.ts +2 -2
  796. package/scripts/run/run-report-cli.ts +4 -4
  797. package/scripts/run/run-report.ts +9 -14
  798. package/scripts/run/run-retrospective.ts +3 -3
  799. package/scripts/run/run-section.ts +42 -0
  800. package/scripts/run/run-stage-read.ts +2 -2
  801. package/scripts/run/run-stage.ts +6 -4
  802. package/scripts/run/run-status-cli.ts +7 -5
  803. package/scripts/run/run-status.ts +6 -7
  804. package/scripts/run/run-step-cli.ts +13 -15
  805. package/scripts/run/run-step.ts +62 -48
  806. package/scripts/run/run-stop-notify.ts +7 -8
  807. package/scripts/run/run-stranded-cli.ts +1 -1
  808. package/scripts/run/run-stranded-detect.ts +4 -4
  809. package/scripts/run/run-stranded.ts +11 -13
  810. package/scripts/run/run-tail-cli.ts +15 -16
  811. package/scripts/run/run-tail.ts +14 -33
  812. package/scripts/run/run-watcher-guard-cli.ts +3 -4
  813. package/scripts/run/run-watcher-guard.ts +11 -12
  814. package/scripts/run/run-watcher-hook.ts +6 -12
  815. package/scripts/run/ship/run-ship-cli.ts +67 -33
  816. package/scripts/run/ship/run-ship-detach.ts +15 -13
  817. package/scripts/run/ship/run-ship-lock.ts +1 -1
  818. package/scripts/run/ship/run-ship-next.ts +7 -8
  819. package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
  820. package/scripts/run/ship/run-ship-preflight.ts +10 -11
  821. package/scripts/run/ship/run-ship-probe.ts +4 -4
  822. package/scripts/run/ship/run-ship-return.ts +1 -1
  823. package/scripts/run/ship/run-ship-review-steps.ts +43 -24
  824. package/scripts/run/ship/run-ship-review.ts +12 -14
  825. package/scripts/run/ship/run-ship-scoped.ts +15 -6
  826. package/scripts/run/ship/run-ship-stage.ts +80 -26
  827. package/scripts/run/ship/run-ship-steps.ts +26 -16
  828. package/scripts/run/ship/run-ship-stop-text.ts +4 -2
  829. package/scripts/run/ship/run-ship-sync.ts +9 -8
  830. package/scripts/run/ship/run-ship.ts +17 -32
  831. package/scripts/run/tidy/run-tidy-cli.ts +9 -5
  832. package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
  833. package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
  834. package/scripts/run/tidy/run-tidy.ts +4 -3
  835. package/scripts/run/wake/run-wake-cli.ts +27 -33
  836. package/scripts/run/wake/run-wake-describe.ts +76 -29
  837. package/scripts/run/wake/run-wake-driver.ts +14 -14
  838. package/scripts/run/wake/run-wake-handoff.ts +6 -6
  839. package/scripts/run/wake/run-wake-loop.ts +13 -21
  840. package/scripts/run/wake/run-wake-restart.ts +4 -5
  841. package/scripts/run/wake/run-wake-session.ts +23 -27
  842. package/scripts/run/wake/run-wake.ts +57 -328
  843. package/scripts/safe-chain/ci-installer-pin.ts +3 -3
  844. package/scripts/safe-chain/pack-hook.ts +2 -2
  845. package/scripts/safe-chain/preinstall-command.ts +2 -2
  846. package/scripts/security/security-audit-logic.ts +1 -1
  847. package/scripts/security/security-audit-provision-logic.ts +1 -1
  848. package/scripts/security/security-audit-provision.ts +2 -2
  849. package/scripts/security/security-audit.ts +5 -5
  850. package/scripts/security/security-updates-logic.ts +2 -3
  851. package/scripts/security/security-updates.ts +2 -4
  852. package/scripts/self-sync-guard/index.ts +1 -1
  853. package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
  854. package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
  855. package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
  856. package/scripts/sonar/sonar-hotspots.ts +1 -1
  857. package/scripts/sonar/sonar-new-code-cli.ts +1 -1
  858. package/scripts/sonar/sonar-new-code.ts +1 -1
  859. package/scripts/sonar/sonar-project.ts +1 -1
  860. package/scripts/split/split-assess-cli.ts +1 -1
  861. package/scripts/split/split-assess.ts +3 -3
  862. package/scripts/sync/directory-copy-guard.ts +2 -3
  863. package/scripts/sync/managed-config-scope-cli.ts +1 -2
  864. package/scripts/sync/managed-config-scope.ts +4 -4
  865. package/scripts/sync/plugin-skill-directories.ts +2 -2
  866. package/scripts/sync/reconcile-templates.ts +17 -8
  867. package/scripts/sync/removed-skill-manifest.ts +2 -3
  868. package/scripts/sync/sync-ai-files.ts +7 -7
  869. package/scripts/sync/sync-configs.ts +30 -3
  870. package/scripts/sync/sync-hook-safety.ts +2 -2
  871. package/scripts/sync/sync.ts +23 -10
  872. package/scripts/sync/synced-paths.ts +2 -1
  873. package/scripts/sync/workflow-pin-logic.ts +1 -1
  874. package/scripts/test/test-declared-changed.ts +4 -4
  875. package/scripts/test/test-declared-logic.ts +2 -3
  876. package/scripts/test/test-declared-match.ts +25 -4
  877. package/scripts/test/test-declared.ts +26 -9
  878. package/scripts/test/test-red-commit.ts +3 -2
  879. package/scripts/test/test-red-logic.ts +7 -14
  880. package/scripts/test/test-red.ts +12 -47
  881. package/scripts/test/test-related-scope.ts +2 -3
  882. package/scripts/test/test-related.ts +3 -3
  883. package/scripts/test/test-type-logic.ts +1 -2
  884. package/scripts/test/test-unit-guard.ts +13 -17
  885. package/scripts/test/unit-worker-share.ts +7 -8
  886. package/scripts/time-runtime/time-agent-bundles.ts +2 -4
  887. package/scripts/time-runtime/time-background.ts +17 -21
  888. package/scripts/time-runtime/time-batch-guard.ts +67 -342
  889. package/scripts/time-runtime/time-bundle-call.ts +26 -28
  890. package/scripts/time-runtime/time-bundles.ts +11 -12
  891. package/scripts/time-runtime/time-call-identity.ts +1 -1
  892. package/scripts/time-runtime/time-command-key.ts +2 -2
  893. package/scripts/time-runtime/time-density-hook.ts +8 -11
  894. package/scripts/time-runtime/time-density.ts +5 -5
  895. package/scripts/time-runtime/time-followup-stage.ts +7 -7
  896. package/scripts/time-runtime/time-format.ts +5 -5
  897. package/scripts/time-runtime/time-hook-transcript.ts +3 -3
  898. package/scripts/time-runtime/time-instant.ts +1 -1
  899. package/scripts/time-runtime/time-markers.ts +15 -19
  900. package/scripts/time-runtime/time-phase-names.ts +3 -3
  901. package/scripts/time-runtime/time-reported-failure.ts +15 -19
  902. package/scripts/time-runtime/time-round-trips.ts +20 -23
  903. package/scripts/time-runtime/time-shell.ts +8 -8
  904. package/scripts/time-runtime/time-single-check.ts +1 -2
  905. package/scripts/time-runtime/time-spans.ts +35 -40
  906. package/scripts/time-runtime/time-tool-call.ts +15 -16
  907. package/scripts/time-runtime/time-transcript-line.ts +53 -34
  908. package/scripts/time-runtime/time-writes.ts +5 -5
  909. package/scripts/ui/ui-routes-cli.ts +1 -2
  910. package/scripts/ui/ui-routes.ts +1 -2
  911. package/scripts/version/bump-version.ts +1 -1
  912. package/scripts/version/fresh-metadata-cache.ts +2 -2
  913. package/scripts/version/latest-corepack.ts +129 -98
  914. package/scripts/version/latest-lane-guard.ts +1 -1
  915. package/scripts/version/latest-scope-cli.ts +2 -2
  916. package/scripts/version/latest-stamp.ts +1 -2
  917. package/scripts/version/latest-update.ts +2 -2
  918. package/scripts/version/npm-registry.ts +2 -2
  919. package/scripts/version/package-manager-version.ts +18 -0
  920. package/scripts/version/publishable-range-check.ts +2 -1
  921. package/scripts/version/publishable-range.ts +1 -1
  922. package/scripts/version/release-age.ts +11 -11
  923. package/scripts/version/release-hold.ts +2 -2
  924. package/scripts/version/safe-chain-version-update.ts +3 -3
  925. package/scripts/version/version-check-logic.ts +2 -3
  926. package/scripts/version/version-check.ts +1 -2
  927. package/scripts/version/version-command-config.ts +2 -2
  928. package/scripts/version/version-commands.ts +3 -3
  929. package/scripts/version/version-remote.ts +4 -4
  930. package/scripts/version/version-targets.ts +2 -2
  931. package/templates/gitignore +7 -0
  932. package/templates/workflows/github-release.yml +4 -0
  933. package/dist/hooks/chunk-NV2JRZZO.js +0 -6385
  934. package/dist/hooks/chunk-RKUAD3I6.js +0 -90
  935. package/dist/hooks/chunk-WPALEIRX.js +0 -18
  936. package/scripts/backlog/backlog-restructure.ts +0 -152
  937. package/scripts/rules/issue-fold-rule.ts +0 -72
  938. package/scripts/rules/wip-cap.ts +0 -63
  939. package/scripts/run/run-issue-number.ts +0 -19
@@ -1,9 +1,12 @@
1
1
  import { existsSync } from 'node:fs'
2
2
  import path from 'node:path'
3
3
  import { git_followup_issue_close } from '#scripts/followup/git-followup-issue-close'
4
+ import { git_gh_command } from '#scripts/gh/git-gh-command'
4
5
  import { git_gh_issue_write } from '#scripts/gh/git-gh-issue-write'
5
6
  import { git_stash } from '#scripts/git/stash/git-stash'
6
- import { IN_PROGRESS_LABEL, NEEDS_DECISION_LABEL } from '#scripts/issue/issue-labels'
7
+ import { issue_cite } from '#scripts/issue/issue-cite'
8
+ import { NEEDS_DECISION_LABEL } from '#scripts/issue/issue-labels'
9
+ import { session_cite } from '#scripts/issue/session-cite'
7
10
  import { josh_command, type JoshResult } from '#scripts/josh/josh-run'
8
11
  import { lane_close } from '#scripts/lane/lane-close'
9
12
  import { lane_reap } from '#scripts/lane/lane-reap'
@@ -19,22 +22,22 @@ import {
19
22
  } from '#scripts/run/carry/run-carry'
20
23
  import { run_carry_conversation } from '#scripts/run/carry/run-carry-conversation'
21
24
  import { run_cut, type RunCut } from '#scripts/run/cut/run-cut'
25
+ import { run_label } from '#scripts/run/run-label'
22
26
  import { run_merge } from './run-merge'
23
27
 
24
28
  // The result of attempting to apply a carry change. Distinguishing `refused` from `applied` lets
25
29
  // callers surface the refusal as a hard failure rather than silently continuing on a carry that was
26
- // not advanced (joshuafolkken/kit#2114).
30
+ // not advanced.
27
31
  type ApplyCarryResult =
28
32
  { kind: 'applied'; carry: RunCarry } | { kind: 'refused'; carry: RunCarry } | { kind: 'none' }
29
33
 
30
- // The side-effect half of `run:merge` (joshuafolkken/kit#2024). The pure decisions are `run-merge.ts`'s;
31
- // this file is what those decisions drive — the same actions the parent used to spend two turns on,
32
- // collapsed into one command.
34
+ // The side-effect half of `run:merge`. The pure decisions are `run-merge.ts`'s; this file is what
35
+ // those decisions drive, collapsed into one command.
33
36
  //
34
- // **What was a separate `pnpm josh` call stays one.** `main:sync`, `lane:close`, `cost` and
37
+ // **A separate `pnpm josh` command stays one.** `main:sync`, `lane:close`, `cost` and
35
38
  // `epic:next` / `backlog:next` are run as captured subprocesses, so their output lands in this
36
39
  // command's own return value rather than on the caller's stdout and their report logic is reused
37
- // rather than cloned. The new work — counting the outcome into the single-source carry record, parking
40
+ // rather than cloned. The rest — counting the outcome into the single-source carry record, parking
38
41
  // a failed child, and generating the progress comment from that record — is in-process, because it has
39
42
  // a reusable logic function and no stdout to keep clean.
40
43
 
@@ -45,8 +48,9 @@ const LANE_CLOSE_OCCASION = 'lane close'
45
48
  const GIT_ENTRY = '.git'
46
49
  const MERGE_CLOSER = 'pnpm josh run:merge'
47
50
  const SINGLE_READ = { attempts: 1, interval_ms: 0 }
51
+ const OPEN_STATE = 'OPEN'
48
52
  const SYNC_RETRY = { attempts: 3, interval_ms: 5000 }
49
- // What the driver judged when it parks a child, stated on the issue (joshuafolkken/kit#2769).
53
+ // What the driver judged when it parks a child, stated on the issue.
50
54
  const FAILED_CAUSE = 'the child’s session ended with its issue still open and unfinished.'
51
55
  const CUT_RELAUNCH_CAUSE =
52
56
  'its lane held a declared cut, but no successor could be relaunched from it (or it already was once).'
@@ -57,27 +61,31 @@ interface MergeContext {
57
61
  epic: string | undefined
58
62
  repo: string | undefined
59
63
  // The hand-off threshold, or `undefined` where no AI session owns the loop — the supervisor's
60
- // `backlog:drive` has no context to cut, so a merge there is never handed back as `over`
61
- // (joshuafolkken/kit#3156).
64
+ // `backlog:drive` has no context to cut, so a merge there is never handed back as `over`.
62
65
  over: number | undefined
63
66
  owner: CarryOwner
64
67
  // The child's transcript output path, when the caller passed `--output`. Read to tell an API-outage
65
- // ending apart from a genuine child failure (joshuafolkken/kit#2240); absent leaves outage detection
66
- // off, so the child is classified from its GitHub state alone as before.
68
+ // ending apart from a genuine child failure; absent leaves outage detection off, so the child is
69
+ // classified from its GitHub state alone.
67
70
  output?: string | undefined
68
71
  // The merged pull request that closes the child, when GitHub left the child OPEN after the merge —
69
- // the one `merged` child whose issue this command still has to close (joshuafolkken/kit#2769).
72
+ // the one `merged` child whose issue this command still has to close.
70
73
  merged_pr?: string | undefined
71
74
  }
72
75
 
73
76
  interface FailedResult {
74
77
  carry: RunCarry | undefined
75
78
  is_parked: boolean
76
- // Set when the carry record refused the count because this session is not its owner
77
- // (joshuafolkken/kit#2114). The caller surfaces this as a hard failure rather than continuing.
79
+ // Set when the carry record refused the count because this session is not its owner. The caller
80
+ // surfaces this as a hard failure rather than continuing.
78
81
  is_refused: boolean
82
+ // The open `blocked-by` blockers the child was released to wait on, cited — empty for a child that
83
+ // was parked (or refused) instead.
84
+ blockers: ReadonlyArray<string>
79
85
  }
80
86
 
87
+ const NO_BLOCKERS: ReadonlyArray<string> = []
88
+
81
89
  // A captured `pnpm josh` subprocess: its output is read back rather than inherited, and a non-zero
82
90
  // exit is a value to branch on rather than a throw. The step's stderr stays piped here — `run:merge`
83
91
  // composes its own report from the captured values — so this passes `josh_command.josh_run`'s default.
@@ -102,7 +110,7 @@ async function read_record(): Promise<{ target: string; carry: RunCarry } | unde
102
110
  // Count the outcome into the carry record, respecting the ownership guard so a session whose record
103
111
  // was handed off cannot advance a budget that is no longer its own. Returns `refused` when the
104
112
  // ownership check fails — callers treat this as a hard failure so the operation is not silently
105
- // skipped (joshuafolkken/kit#2114).
113
+ // skipped.
106
114
  async function apply_carry(
107
115
  ctx: MergeContext,
108
116
  change: CarryChange | undefined,
@@ -124,7 +132,7 @@ async function apply_carry(
124
132
 
125
133
  // The carry record when this session may not act on it — the same ownership guard `apply_carry` asks —
126
134
  // or `undefined`. Asked before an action that counts nothing, like the cut fallback's relaunch, so a
127
- // stray session is refused rather than relaunching a lane it does not own (joshuafolkken/kit#2484).
135
+ // stray session is refused rather than relaunching a lane it does not own.
128
136
  async function refused_carry(ctx: MergeContext): Promise<RunCarry | undefined> {
129
137
  const record = await read_record()
130
138
 
@@ -133,11 +141,10 @@ async function refused_carry(ctx: MergeContext): Promise<RunCarry | undefined> {
133
141
  return record.carry
134
142
  }
135
143
 
136
- // **A failed `main:sync` is retried before it ends the run** (joshuafolkken/kit#3323): one failure
137
- // right after a merge — measured while several lanes merged at once — stopped the whole drive, and a
138
- // hand-run `main:sync` minutes later succeeded. **The error carries the step's stderr, not its
144
+ // **A failed `main:sync` is retried before it ends the run**: a sync right after a merge can fail
145
+ // transiently while several lanes merge at once. **The error carries the step's stderr, not its
139
146
  // stdout**: `main:sync` reports git's refusal on stderr, while stdout carries the wrapper's guard
140
- // statistics, which is all the old message showed.
147
+ // statistics.
141
148
  async function sync_main(): Promise<void> {
142
149
  // `poll_until` answers only whether it succeeded, so the last attempt's stderr is kept here.
143
150
  let error_output = ''
@@ -174,12 +181,12 @@ async function stash_work(child: string, directory: string): Promise<void> {
174
181
  await git_gh_issue_write.issue_try_comment(child, preserved_comment(message))
175
182
  }
176
183
 
177
- // Stash whatever the lane still holds uncommitted before its tree is removed (joshuafolkken/kit#2476):
178
- // `lane:close` deletes by force, and a merged child that had popped its parked work and then read
179
- // `already-done` left that work nowhere else. The stash stack outlives the tree, so the push is the copy.
180
- // Returns whether closing is safe — `false` when the tree could not be read or pushed, so it is left
181
- // rather than lost. A directory with no `.git` is no work tree — the remnant of an interrupted close —
182
- // and holds nothing git could keep, so it is closed rather than stranded behind a status that fails.
184
+ // Stash whatever the lane still holds uncommitted before its tree is removed: `lane:close` deletes by
185
+ // force, and a merged child's uncommitted work may exist nowhere else. The stash stack outlives the
186
+ // tree, so the push is the copy. Returns whether closing is safe — `false` when the tree could not be
187
+ // read or pushed, so it is left rather than lost. A directory with no `.git` is no work tree — the
188
+ // remnant of an interrupted close — and holds nothing git could keep, so it is closed rather than
189
+ // stranded behind a status that fails.
183
190
  async function preserve_uncommitted(child: string): Promise<boolean> {
184
191
  const lane = await lane_close.resolve_lane(child)
185
192
  const { directory } = lane.targets
@@ -191,7 +198,9 @@ async function preserve_uncommitted(child: string): Promise<boolean> {
191
198
 
192
199
  return true
193
200
  } catch {
194
- console.error(`#${child}: uncommitted work could not be stashed — lane left at ${directory}`)
201
+ console.error(
202
+ `${session_cite.issue(child)}: uncommitted work could not be stashed — lane left at ${directory}`,
203
+ )
195
204
 
196
205
  return false
197
206
  }
@@ -201,10 +210,10 @@ function kept_lane_comment(directory: string): string {
201
210
  return `The split left this issue's lane open: it still holds a commit, an uncommitted change or a live process — ${directory}`
202
211
  }
203
212
 
204
- // A child promoted to an epic by a split leaves its lane holding a seat (joshuafolkken/kit#3334): the
205
- // epic root is never dispatched again, so nothing else would ever close it. The lane is closed only
206
- // when it holds nothing — no commit, no change, no live process (`lane_vacant`); any other lane is
207
- // kept, and why is stated on the issue.
213
+ // A child promoted to an epic by a split leaves its lane holding a seat: the epic root is never
214
+ // dispatched again, so nothing else would ever close it. The lane is closed only when it holds
215
+ // nothing — no commit, no change, no live process (`lane_vacant`); any other lane is kept, and why is
216
+ // stated on the issue.
208
217
  async function close_split_lane(child: string): Promise<void> {
209
218
  const lane = await lane_registry.find_open_lane(child)
210
219
 
@@ -228,7 +237,7 @@ async function post_counters(ctx: MergeContext, carry: RunCarry | undefined): Pr
228
237
  }
229
238
 
230
239
  // A child merged while GitHub left it OPEN is closed here, through the one close `followup` uses
231
- // (joshuafolkken/kit#2769). The state was just read OPEN, so it is read once rather than waited on. A
240
+ // The state was just read OPEN, so it is read once rather than waited on. A
232
241
  // close that fails is reported with its recovery and does not undo the merge being counted.
233
242
  async function close_merged_open(ctx: MergeContext): Promise<void> {
234
243
  if (ctx.merged_pr === undefined) return
@@ -239,14 +248,16 @@ async function close_merged_open(ctx: MergeContext): Promise<void> {
239
248
  SINGLE_READ,
240
249
  )
241
250
  } catch {
242
- console.error(`#${ctx.child}: could not be closed — ${git_followup_issue_close.CLOSE_RECOVERY}`)
251
+ console.error(
252
+ `${session_cite.issue(ctx.child)}: could not be closed — ${git_followup_issue_close.CLOSE_RECOVERY}`,
253
+ )
243
254
  }
244
255
  }
245
256
 
246
257
  // A merged child: count the merge (which resets the failure streak), return to the default branch,
247
258
  // stash any uncommitted work the lane still holds and close it, and mirror the counters onto the epic. Returns the carry when the ownership check
248
- // fails — the caller treats a non-undefined return as a hard refusal and must not offer a next child
249
- // (joshuafolkken/kit#2114). Returns `undefined` on success.
259
+ // fails — the caller treats a non-undefined return as a hard refusal and must not offer a next child.
260
+ // Returns `undefined` on success.
250
261
  async function do_merged(ctx: MergeContext): Promise<RunCarry | undefined> {
251
262
  const refused = await refused_carry(ctx)
252
263
 
@@ -267,33 +278,60 @@ async function do_merged(ctx: MergeContext): Promise<RunCarry | undefined> {
267
278
  return undefined
268
279
  }
269
280
 
270
- // A stale label removal must not fail the run, so a failed removal is swallowed exactly as the
271
- // `|| true` in the hand-written procedure did.
272
- async function remove_in_progress(child: string): Promise<void> {
281
+ function refused_result(carry: RunCarry): FailedResult {
282
+ return { carry, is_parked: false, is_refused: true, blockers: NO_BLOCKERS }
283
+ }
284
+
285
+ // The child's open `blocked-by` blockers, cited. A read that fails answers none, so the child is
286
+ // parked — a relation nobody could read is never taken as a dependency.
287
+ async function open_blockers(child: string): Promise<ReadonlyArray<string>> {
273
288
  try {
274
- await git_gh_issue_write.issue_remove_label(child, IN_PROGRESS_LABEL)
289
+ const references = await git_gh_command.issue_blocked_by_references(child, '')
290
+
291
+ return references
292
+ .filter((blocker) => blocker.state === OPEN_STATE)
293
+ .map((blocker) => issue_cite.plain(blocker.number, blocker.repo))
275
294
  } catch {
276
- // A stale label may already be gone; a failed removal must not fail the run.
295
+ return NO_BLOCKERS
277
296
  }
278
297
  }
279
298
 
299
+ // A child that ended unfinished while an open blocker it records still has to land first is waiting,
300
+ // not failed: nothing is counted and `needs-decision` is not applied — the
301
+ // order is already recorded, so there is nothing for a person to decide — and its stale `in-progress`
302
+ // is dropped so the offer hands it back on its own once the blockers merge. The ownership guard is
303
+ // still asked, so a session that does not own the run cannot release a child it never dispatched.
304
+ async function do_waiting(
305
+ ctx: MergeContext,
306
+ blockers: ReadonlyArray<string>,
307
+ ): Promise<FailedResult> {
308
+ const refused = await refused_carry(ctx)
309
+
310
+ if (refused !== undefined) return refused_result(refused)
311
+
312
+ lane_reap.reap_child(ctx.child)
313
+ await run_label.unmark(ctx.child)
314
+ await git_gh_issue_write.issue_try_comment(ctx.child, run_merge.waiting_comment(blockers))
315
+
316
+ return { carry: undefined, is_parked: false, is_refused: false, blockers }
317
+ }
318
+
280
319
  // A failed child: count the failure, end whatever of its process is still running (a child judged
281
320
  // abandoned that hung on a wait loop would otherwise answer the pgrep liveness check `alive` for its
282
- // issue number forever, joshuafolkken/kit#2421), drop the stale `in-progress`, and park it with
283
- // `needs-decision` so the next offer does not hand the same child straight back. Returns the record
284
- // so the caller can read the streak against the guard. Returns `is_refused: true` without touching labels when the
285
- // carry record rejected the count (joshuafolkken/kit#2114). A park is always explained on the issue —
286
- // `cause` says what was judged, and the comment what was read and what a person does next
287
- // (joshuafolkken/kit#2769).
288
- async function do_failed(ctx: MergeContext, cause: string = FAILED_CAUSE): Promise<FailedResult> {
321
+ // issue number forever), drop the stale `in-progress`, and park it with `needs-decision` so the next
322
+ // offer does not hand the same child straight back. Returns the record so the caller can read the
323
+ // streak against the guard. Returns `is_refused: true` without touching labels when the carry record
324
+ // rejected the count. A park is always explained on the issue — `cause` says what was judged, and the
325
+ // comment what was read and what a person does next.
326
+ async function park_failed(ctx: MergeContext, cause: string): Promise<FailedResult> {
289
327
  const result = await apply_carry(ctx, run_merge.change_of('failed'))
290
328
 
291
- if (result.kind === 'refused') return { carry: result.carry, is_parked: false, is_refused: true }
329
+ if (result.kind === 'refused') return refused_result(result.carry)
292
330
 
293
331
  const carry = result.kind === 'applied' ? result.carry : undefined
294
332
 
295
333
  lane_reap.reap_child(ctx.child)
296
- await remove_in_progress(ctx.child)
334
+ await run_label.unmark(ctx.child)
297
335
  const is_parked = await git_gh_issue_write.issue_add_label(ctx.child, NEEDS_DECISION_LABEL)
298
336
 
299
337
  if (is_parked) {
@@ -302,29 +340,39 @@ async function do_failed(ctx: MergeContext, cause: string = FAILED_CAUSE): Promi
302
340
  await git_gh_issue_write.issue_try_comment(ctx.child, run_merge.park_comment(reason))
303
341
  }
304
342
 
305
- return { carry, is_parked, is_refused: false }
343
+ return { carry, is_parked, is_refused: false, blockers: NO_BLOCKERS }
344
+ }
345
+
346
+ // A child that ended unfinished: waiting when it records an open blocker (`do_waiting`), parked
347
+ // otherwise (`park_failed`) — an order already recorded is never a decision for a person.
348
+ async function do_failed(ctx: MergeContext, cause: string = FAILED_CAUSE): Promise<FailedResult> {
349
+ const blockers = await open_blockers(ctx.child)
350
+
351
+ if (blockers.length > 0) return await do_waiting(ctx, blockers)
352
+
353
+ return await park_failed(ctx, cause)
306
354
  }
307
355
 
308
356
  // The outcome of counting an outage: the record to read the streak against, and whether the count was
309
- // refused because this session does not own the budget (joshuafolkken/kit#2240).
357
+ // refused because this session does not own the budget.
310
358
  interface OutageResult {
311
359
  carry: RunCarry | undefined
312
360
  is_refused: boolean
313
361
  }
314
362
 
315
363
  // An API-outage child: count the outage into its own streak, end any process it left — before the
316
- // re-dispatch launches a second one matching the same pattern (joshuafolkken/kit#2421) — and drop the
317
- // stale `in-progress` so the child is offerable again, but **do not** park it with `needs-decision` — the environment failed, not
318
- // the child, so it is re-dispatchable in the same run (joshuafolkken/kit#2240). Returns the record so
319
- // the caller can read the outage streak against its guard. Returns `is_refused: true` without touching
320
- // labels when the carry record rejected the count (joshuafolkken/kit#2114).
364
+ // re-dispatch launches a second one matching the same pattern — and drop the stale `in-progress` so the
365
+ // child is offerable again, but **do not** park it with `needs-decision` — the environment failed, not
366
+ // the child, so it is re-dispatchable in the same run. Returns the record so the caller can read the
367
+ // outage streak against its guard. Returns `is_refused: true` without touching labels when the carry
368
+ // record rejected the count.
321
369
  async function do_outage(ctx: MergeContext): Promise<OutageResult> {
322
370
  const result = await apply_carry(ctx, run_merge.change_of('outage'))
323
371
 
324
372
  if (result.kind === 'refused') return { carry: result.carry, is_refused: true }
325
373
 
326
374
  lane_reap.reap_child(ctx.child)
327
- await remove_in_progress(ctx.child)
375
+ await run_label.unmark(ctx.child)
328
376
 
329
377
  return { carry: result.kind === 'applied' ? result.carry : undefined, is_refused: false }
330
378
  }
@@ -335,8 +383,8 @@ interface RelaunchableCut {
335
383
  cut: RunCut
336
384
  }
337
385
 
338
- // The lane's cut the fallback may relaunch, or `undefined` (joshuafolkken/kit#2484). An OpenAI lane is
339
- // left out: its supervisor, not this command, starts the process after a standing cut.
386
+ // The lane's cut the fallback may relaunch, or `undefined`. An OpenAI lane is left out: its
387
+ // supervisor, not this command, starts the process after a standing cut.
340
388
  async function relaunchable_lane(child: string): Promise<LaneInfo | undefined> {
341
389
  const lane = await lane_registry.find_open_lane(child)
342
390
 
@@ -359,7 +407,7 @@ async function has_resumable_cut(child: string): Promise<boolean> {
359
407
  return (await relaunchable_cut(child)) !== undefined
360
408
  }
361
409
 
362
- // **The cutting child launches its own successor; this is only the fallback** (joshuafolkken/kit#2484).
410
+ // **The cutting child launches its own successor; this is only the fallback**.
363
411
  // `lane:await` wakes the parent once every process of the lane has gone, so a cut still unadopted then
364
412
  // means the successor never took it over. It is relaunched through the same `lane_relaunch` the cut uses,
365
413
  // once per cut — the record is marked first, so a second unadopted return is parked instead. Returns
@@ -386,8 +434,8 @@ async function is_over_budget(over: number | undefined): Promise<boolean> {
386
434
  return result.code !== 0 || result.out === OVER
387
435
  }
388
436
 
389
- // The next offer: one issue number per line up to the free lanes, or a verdict token, exactly as the
390
- // parent read it. `--lanes` needs `--repo`, so the epic form is used only where both are present.
437
+ // The next offer: one issue number per line up to the free lanes, or a verdict token. `--lanes` needs
438
+ // `--repo`, so the epic form is used only where both are present.
391
439
  async function ask_next(ctx: MergeContext): Promise<string> {
392
440
  if (ctx.epic === undefined || ctx.repo === undefined) {
393
441
  const backlog = await josh(['backlog:next'])
@@ -410,9 +458,8 @@ const run_merge_steps = {
410
458
  has_resumable_cut,
411
459
  is_over_budget,
412
460
  refused_carry,
413
- remove_in_progress,
414
461
  resume_cut,
415
462
  }
416
463
 
417
- export type { MergeContext, OutageResult }
464
+ export type { FailedResult, MergeContext, OutageResult }
418
465
  export { run_merge_steps }
@@ -0,0 +1,30 @@
1
+ // The control verdicts `josh run:merge` prints as its first stdout token — the protocol between it and
2
+ // `backlog:drive`, declared once here so a renamed or added token is a type error on both sides rather
3
+ // than a hand-off the loop silently stops reading.
4
+
5
+ const MERGE_TOKEN = {
6
+ // The hand-off check after a merge: the parent's context is over its threshold.
7
+ OVER: 'over',
8
+ // The child's own ending: it stopped before its commit for a person to look at.
9
+ HUMAN_REVIEW: 'human-review',
10
+ // Matches the `busy` verdict `run:carry` emits for a refused count, so callers see one vocabulary.
11
+ BUSY: 'busy',
12
+ // The consecutive-failure guard tripped, or a failed child could not be parked.
13
+ STOP: 'stop',
14
+ // The consecutive-outage guard tripped: the environment is down, so the run stops rather than
15
+ // re-dispatching into a dead API. Distinct from `stop` so the parent's report can say the environment
16
+ // failed rather than the children.
17
+ ENVIRONMENT: 'environment',
18
+ // The child's state could not be read; re-read before deciding.
19
+ RETRY: 'retry',
20
+ // The child's cut was resumed in its own lane: the parent awaits that lane again, and offers no child
21
+ // in its place.
22
+ RESUMED: 'resumed',
23
+ } as const
24
+
25
+ type MergeToken = (typeof MERGE_TOKEN)[keyof typeof MERGE_TOKEN]
26
+
27
+ const run_merge_token = { MERGE_TOKEN }
28
+
29
+ export type { MergeToken }
30
+ export { run_merge_token }
@@ -1,3 +1,4 @@
1
+ import { issue_cite } from '#scripts/issue/issue-cite'
1
2
  import {
2
3
  ALREADY_DONE_LABEL,
3
4
  EPIC_LABEL,
@@ -7,10 +8,9 @@ import {
7
8
  import type { IssueState } from '#scripts/issue/issue-state'
8
9
  import type { CarryChange, RunCarry } from '#scripts/run/carry/run-carry'
9
10
 
10
- // joshuafolkken/kit#2024: a `backlogrun` merge event was two parent turns — a reading turn and an
11
- // acting turn — spent at the session whose context is largest and whose per-turn cost is highest.
12
- // This is the pure core of the one composite command that collapses it: the parent calls
13
- // `run:merge <N>` once at a child's return and reads back the next child number, or a control verdict.
11
+ // The pure core of `run:merge`, the one composite command for a `backlogrun` merge event: the parent —
12
+ // the session whose context is largest and per-turn cost highest — calls `run:merge <N>` once at a
13
+ // child's return and reads back the next child number, or a control verdict.
14
14
  //
15
15
  // Everything here is pure — the classification of the returned child, the counter change that outcome
16
16
  // implies, the consecutive-failure guard, and the progress-comment text generated from the
@@ -23,7 +23,7 @@ const CLOSED_STATE = 'CLOSED'
23
23
  // resets the streak (`run-carry.ts` → `next_failures`), so the guard trips only on an environment
24
24
  // failing every child it is handed rather than on failures scattered across a long run.
25
25
  const CONSECUTIVE_FAILURE_LIMIT = 3
26
- // Three API outages in a row stop the run too (joshuafolkken/kit#2240) — the same shape as the failure
26
+ // Three API outages in a row stop the run too — the same shape as the failure
27
27
  // guard, over its own streak. An outage is a child that could not reach the API, so a run of them is
28
28
  // the environment being down; stopping is what keeps the run from re-dispatching into a dead API
29
29
  // forever. A merge or a genuine child failure resets it (`run-carry.ts` → `next_outages`).
@@ -34,16 +34,15 @@ const ONE = 1
34
34
  // alone — the exit record.
35
35
  // - `merged` — CLOSED; the child finished and its pull request merged. Also an OPEN, unparked
36
36
  // child a merged pull request's `closes #N` names — GitHub merged it without closing
37
- // the issue (joshuafolkken/kit#2769).
37
+ // the issue.
38
38
  // - `human-review` — OPEN and carrying `needs-human-review`; the run's own ending (needs-human-review.md).
39
39
  // - `parked` — OPEN and carrying `needs-decision` or `already-done`; a person still owns it.
40
40
  // - `split` — OPEN and carrying `epic`; its work was divided into new children.
41
41
  // - `outage` — OPEN and carrying neither, but the exit record shows it could not reach the API; not
42
- // the child's failure, so it is re-dispatchable and uncounted against the failure guard
43
- // (joshuafolkken/kit#2240).
42
+ // the child's failure, so it is re-dispatchable and uncounted against the failure guard.
44
43
  // - `cut` — OPEN and carrying neither, but its lane holds a declared cut no successor adopted;
45
44
  // the child ended its session on purpose, so it is resumed rather than parked and
46
- // counts nothing (joshuafolkken/kit#2484).
45
+ // counts nothing.
47
46
  // - `failed` — OPEN and carrying neither, and not an outage; the child did not finish.
48
47
  // - `unresolved` — the state could not be read; re-read before deciding.
49
48
  type ChildOutcome =
@@ -63,7 +62,7 @@ interface EndingSignals {
63
62
  is_outage: boolean
64
63
  is_cut: boolean
65
64
  // The merged pull request whose `closes #N` names the child, when GitHub left the child OPEN after
66
- // merging it (joshuafolkken/kit#2769).
65
+ // merging it.
67
66
  merged_pr?: string | undefined
68
67
  }
69
68
 
@@ -84,12 +83,11 @@ function is_parked(state: IssueState): boolean {
84
83
  // **CLOSED means merged, whatever labels it carries** — a child that finished and merged keeps the
85
84
  // `needs-human-review` a person put on it, so that label is read only on an OPEN child
86
85
  // (`backlogrun-progress.md` → "Running a named epic's children").
87
- // An OPEN, unparked child that is not waiting on a person: a declared cut is resumed
88
- // (joshuafolkken/kit#2484), and it is read before the outage so a cut whose process then lost the API is
89
- // still resumed from its record; an OPEN, unparked child that could not reach the API is an `outage`,
90
- // not a `failed` (joshuafolkken/kit#2240). **A merged pull request that closes it is read first**: the
91
- // work landed and only GitHub's close did not, so it is `merged` — never a failure counted against the
92
- // guard (joshuafolkken/kit#2769).
86
+ // An OPEN, unparked child that is not waiting on a person: a declared cut is resumed, and it is read
87
+ // before the outage so a cut whose process then lost the API is still resumed from its record; an
88
+ // OPEN, unparked child that could not reach the API is an `outage`, not a `failed`. **A merged pull
89
+ // request that closes it is read first**: the work landed and only GitHub's close did not, so it is
90
+ // `merged` — never a failure counted against the guard.
93
91
  function unfinished_outcome(signals: EndingSignals): ChildOutcome {
94
92
  if (signals.merged_pr !== undefined) return 'merged'
95
93
 
@@ -139,14 +137,14 @@ function is_guard_tripped(failures: number): boolean {
139
137
  return failures >= CONSECUTIVE_FAILURE_LIMIT
140
138
  }
141
139
 
142
- // The outage guard, over its own streak (joshuafolkken/kit#2240). Same shape as the failure guard: a
140
+ // The outage guard, over its own streak. Same shape as the failure guard: a
143
141
  // run of consecutive outages is the environment being down, so the run stops rather than re-dispatching.
144
142
  function is_outage_guard_tripped(outages: number): boolean {
145
143
  return outages >= CONSECUTIVE_OUTAGE_LIMIT
146
144
  }
147
145
 
148
146
  // The progress comment, generated from the single-source carry record so the counters live in one
149
- // place and this text is derived rather than a second copy kept alongside it (joshuafolkken/kit#2024).
147
+ // place and this text is derived rather than a second copy kept alongside it.
150
148
  // It is script-emitted, so it stays English while the run's session-facing prose follows
151
149
  // `JOSH_SESSION_LANG`.
152
150
  function counters_comment(carry: RunCarry): string {
@@ -161,9 +159,9 @@ function counters_comment(carry: RunCarry): string {
161
159
  ].join('\n')
162
160
  }
163
161
 
164
- // Why the run parked a child it judged failed (joshuafolkken/kit#2769). A child that stops itself
165
- // leaves its own comment; one the driver stops left nothing, so a person opening the issue could not
166
- // tell why it carried `needs-decision`. Script-emitted, so English.
162
+ // Why the run parked a child it judged failed. A child that stops itself leaves its own comment; one
163
+ // the driver stops leaves none, so this tells a person why it carries `needs-decision`.
164
+ // Script-emitted, so English.
167
165
  interface ParkReason {
168
166
  child: string
169
167
  cause: string
@@ -185,7 +183,17 @@ function park_comment(reason: ParkReason): string {
185
183
  `- Why: ${reason.cause}`,
186
184
  '- Read: the issue is OPEN, carries none of `needs-decision`, `already-done`, `needs-human-review` or `epic`, and no merged pull request’s `closes #N` names it.',
187
185
  streak_line(reason.carry),
188
- `- Next: read the child’s transcript${transcript}, then either resume it with \`fullrun #${reason.child}\`, or record the decision here and remove \`needs-decision\`.`,
186
+ `- Next: read the child’s transcript${transcript}, then either resume it with \`fullrun ${issue_cite.plain(reason.child)}\`, or record the decision here and remove \`needs-decision\`.`,
187
+ ].join('\n')
188
+ }
189
+
190
+ // Why the run released a child it would otherwise have parked: the child records open blockers, so
191
+ // its order is already decided and it waits rather than asking a person. Script-emitted, so English.
192
+ function waiting_comment(blockers: ReadonlyArray<string>): string {
193
+ return [
194
+ 'Released to wait by `pnpm josh run:merge`, the `backlogrun` driver — not parked, and not counted as a failure.',
195
+ `- Why: the child’s session ended unfinished while it records open blockers: ${blockers.join(', ')}.`,
196
+ '- Next: its order is already recorded — it becomes runnable again once its blockers merge; a blocker outside the backlog still needs a person to land it.',
189
197
  ].join('\n')
190
198
  }
191
199
 
@@ -196,6 +204,7 @@ const run_merge = {
196
204
  classify_child,
197
205
  counters_comment,
198
206
  park_comment,
207
+ waiting_comment,
199
208
  is_guard_tripped,
200
209
  is_outage_guard_tripped,
201
210
  }
@@ -2,18 +2,18 @@ import { cli_flags } from '#scripts/lib/cli-flags'
2
2
  import { run_progress_config } from './run-progress-config'
3
3
 
4
4
  // The argument half of `josh run:progress`, kept apart from the watcher so the CLI stays inside the file
5
- // limit (joshuafolkken/kit#2503). Everything here is pure: argv in, values out.
5
+ // limit. Everything here is pure: argv in, values out.
6
6
 
7
7
  // A watcher outlives the turn that started it, so something has to end it. One hour is three of the
8
8
  // default twenty-minute intervals: long enough that the bound never truncates a report, short enough
9
9
  // that a watcher left waiting on a run that has already merged is gone within the hour. It is
10
10
  // deliberately **not** `run:hold`'s eight-hour expiry — that holds an uncommitted working tree across
11
- // a person's latency and is trampled by being short (joshuafolkken/kit#1091), while a watcher holds
11
+ // a person's latency and is trampled by being short, while a watcher holds
12
12
  // only a heartbeat the caller restarts on the next interval, so the two guard different things and
13
13
  // only one has anything to lose by being short.
14
14
  const DEFAULT_MAX_HOURS = 1
15
- // **`--wait` is bounded by a run, not by three intervals** (joshuafolkken/kit#3102). It no longer exits
16
- // at its first report — the reports go to the event stream — so its one-hour bound would be the last
15
+ // **`--wait` is bounded by a run, not by three intervals.** It does not exit at
16
+ // its first report — the reports go to the event stream — so its one-hour bound would be the last
17
17
  // wake that asks the parent for no judgement, a restart an hour. Eight hours is `run:hold`'s expiry;
18
18
  // what ends a finished run's watcher sooner is `josh followup` removing its life record, and a stop
19
19
  // tearing it down in the same turn.