@joshuafolkken/kit 1.1471.0 → 1.1784.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 (895) hide show
  1. package/.claude/agents/investigator.md +1 -1
  2. package/.claude/settings.json +6 -6
  3. package/.claude/skills/epic-commands/SKILL.md +26 -77
  4. package/.claude/skills/epic-commands/epic-bundle.md +12 -6
  5. package/.claude/skills/epic-commands/execution-waves.md +1 -2
  6. package/.claude/skills/verify-ui/SKILL.md +1 -2
  7. package/.claude/skills/workflow-commands/SKILL.md +12 -14
  8. package/.claude/skills/workflow-commands/background-commands.md +8 -12
  9. package/.claude/skills/workflow-commands/backlogrun-child.md +13 -18
  10. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
  11. package/.claude/skills/workflow-commands/backlogrun-lanes.md +23 -28
  12. package/.claude/skills/workflow-commands/backlogrun-park.md +16 -31
  13. package/.claude/skills/workflow-commands/backlogrun-progress.md +12 -21
  14. package/.claude/skills/workflow-commands/backlogrun-recovery.md +12 -12
  15. package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -20
  16. package/.claude/skills/workflow-commands/backlogrun.md +32 -51
  17. package/.claude/skills/workflow-commands/chain-rule.md +18 -11
  18. package/.claude/skills/workflow-commands/delegation.md +13 -8
  19. package/.claude/skills/workflow-commands/entry-sequence.md +10 -12
  20. package/.claude/skills/workflow-commands/followup.md +10 -35
  21. package/.claude/skills/workflow-commands/fullrun-steps.md +38 -49
  22. package/.claude/skills/workflow-commands/fullrun.md +6 -8
  23. package/.claude/skills/workflow-commands/halfrun.md +20 -32
  24. package/.claude/skills/workflow-commands/into-target.md +1 -2
  25. package/.claude/skills/workflow-commands/issue-comments.md +19 -15
  26. package/.claude/skills/workflow-commands/issue-scout.md +5 -4
  27. package/.claude/skills/workflow-commands/kickoff.md +24 -23
  28. package/.claude/skills/workflow-commands/latest-gate.md +9 -18
  29. package/.claude/skills/workflow-commands/needs-human-review.md +11 -19
  30. package/.claude/skills/workflow-commands/observation-filing.md +4 -50
  31. package/.claude/skills/workflow-commands/observation-ledger.md +5 -10
  32. package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -44
  33. package/.claude/skills/workflow-commands/prerequisite.md +11 -18
  34. package/.claude/skills/workflow-commands/progress-watcher.md +3 -8
  35. package/.claude/skills/workflow-commands/prrun.md +6 -12
  36. package/.claude/skills/workflow-commands/retrospective.md +5 -5
  37. package/.claude/skills/workflow-commands/split-assessment.md +14 -4
  38. package/.claude/skills/workflow-commands/target-repository.md +1 -2
  39. package/.claude/skills/workflow-commands/working-tree-hold.md +11 -13
  40. package/.codex/hooks.json +6 -6
  41. package/.github/actions/setup-node/action.yml +10 -1
  42. package/.github/actions/setup-pnpm/action.yml +1 -1
  43. package/.github/dependabot.yml +16 -0
  44. package/.github/release.yml +0 -2
  45. package/.github/workflows/ci.yml +121 -11
  46. package/.github/workflows/publish.yml +10 -3
  47. package/.github/workflows/sonar-qube.yml +1 -0
  48. package/.prettierignore +2 -0
  49. package/.vscode/tasks.json +1 -2
  50. package/CLAUDE.md +4 -8
  51. package/README.md +4 -2
  52. package/SECURITY.md +1 -1
  53. package/cspell/index.yaml +7 -0
  54. package/dist/CLAUDE.md +4 -8
  55. package/dist/commands/document-read-cli.js +882 -0
  56. package/dist/commands/{document-section-cli.js → document-section-main.js} +137 -62
  57. package/dist/commands/read-set-cli.js +1867 -0
  58. package/dist/commands/run-prep-main.js +21653 -0
  59. package/dist/commands/run-step-cli.js +23880 -0
  60. package/dist/config-merge/index.js +5 -1
  61. package/dist/hooks/audit-provision.js +20 -35
  62. package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
  63. package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
  64. package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
  65. package/dist/hooks/{chunk-AS74OU3D.js → chunk-PT5R6UJD.js} +4582 -2118
  66. package/dist/hooks/chunk-TUIFS5E7.js +72 -0
  67. package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
  68. package/dist/hooks/{chunk-E7OIKX5Z.js → chunk-WR2KQAYZ.js} +1863 -382
  69. package/dist/hooks/{chunk-KC5AK2GF.js → chunk-XGBNSWEI.js} +248 -46
  70. package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
  71. package/dist/hooks/codex-hook-adapter.js +10 -19
  72. package/dist/hooks/format-edited.js +5 -5
  73. package/dist/hooks/inputs.json +436 -257
  74. package/dist/hooks/pretool-guard.js +7 -22
  75. package/dist/hooks/session-lang.js +380 -42
  76. package/dist/hooks/stop-guard.js +8711 -782
  77. package/dist/josh.js +5263 -997
  78. package/dist/self-sync-guard/index.js +74 -10
  79. package/dist/version/index.js +115 -406
  80. package/eslint/base.js +1 -1
  81. package/lefthook/base.yml +8 -4
  82. package/package.json +17 -53
  83. package/pnpm-workspace.yaml +4 -2
  84. package/prompts/coding-standards.md +1 -1
  85. package/prompts/collaboration-workflow/file-edits.md +1 -9
  86. package/prompts/collaboration-workflow/gh-rest.md +1 -2
  87. package/prompts/collaboration-workflow/issue-citation.md +2 -4
  88. package/prompts/collaboration-workflow/issue-template.md +42 -17
  89. package/prompts/collaboration-workflow/lane-instructions.md +34 -0
  90. package/prompts/collaboration-workflow/measurement.md +37 -0
  91. package/prompts/collaboration-workflow/operating-rules.md +6 -12
  92. package/prompts/collaboration-workflow/output-bounds.md +4 -9
  93. package/prompts/collaboration-workflow/overview.md +1 -1
  94. package/prompts/collaboration-workflow/plan-comment.md +3 -42
  95. package/prompts/collaboration-workflow/principles.md +19 -8
  96. package/prompts/collaboration-workflow/report-format.md +37 -57
  97. package/prompts/collaboration-workflow/residency.md +12 -8
  98. package/prompts/collaboration-workflow/rule-delivery.md +3 -11
  99. package/prompts/collaboration-workflow/shell-body.md +8 -18
  100. package/prompts/collaboration-workflow/turn-batching.md +4 -6
  101. package/prompts/collaboration-workflow/upstream-interrupt.md +16 -6
  102. package/prompts/collaboration-workflow/wip-cap.md +7 -7
  103. package/prompts/collaboration-workflow.md +4 -7
  104. package/prompts/refactoring.md +1 -1
  105. package/prompts/review-rubric.md +1 -2
  106. package/prompts/review.md +45 -26
  107. package/prompts/testing-guide.md +10 -45
  108. package/scripts/agent/agent-argv.ts +20 -4
  109. package/scripts/agent/agent-event.ts +15 -15
  110. package/scripts/agent/agent-exit-record.ts +13 -1
  111. package/scripts/agent/agent-role-profile.ts +101 -45
  112. package/scripts/agent/agent-safe-text.ts +60 -0
  113. package/scripts/agent/api-auth.ts +41 -0
  114. package/scripts/agent/api-outage.ts +1 -1
  115. package/scripts/agent/claude-agent-argv.ts +14 -0
  116. package/scripts/agent/codex-agent-argv.ts +2 -0
  117. package/scripts/agent/lane-instructions.ts +144 -0
  118. package/scripts/auto-ok/auto-ok-cli.ts +14 -16
  119. package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
  120. package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
  121. package/scripts/auto-ok/auto-ok-judge.ts +13 -2
  122. package/scripts/auto-ok/auto-ok-main.ts +17 -0
  123. package/scripts/backlog/backlog-arrival.ts +14 -3
  124. package/scripts/backlog/backlog-budget-cli.ts +7 -33
  125. package/scripts/backlog/backlog-budget-main.ts +16 -0
  126. package/scripts/backlog/backlog-budget.ts +6 -7
  127. package/scripts/backlog/backlog-defect-priority.ts +4 -3
  128. package/scripts/backlog/backlog-drive-adopt.ts +67 -0
  129. package/scripts/backlog/backlog-drive-args.ts +4 -5
  130. package/scripts/backlog/backlog-drive-cli.ts +113 -28
  131. package/scripts/backlog/backlog-drive-hold.ts +162 -0
  132. package/scripts/backlog/backlog-drive-idle.ts +151 -0
  133. package/scripts/backlog/backlog-drive-judge.ts +25 -0
  134. package/scripts/backlog/backlog-drive-memory.ts +126 -0
  135. package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
  136. package/scripts/backlog/backlog-drive-named.ts +54 -7
  137. package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
  138. package/scripts/backlog/backlog-drive-paused.ts +169 -0
  139. package/scripts/backlog/backlog-drive-restore.ts +39 -8
  140. package/scripts/backlog/backlog-drive-seats.ts +18 -8
  141. package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
  142. package/scripts/backlog/backlog-drive.ts +79 -75
  143. package/scripts/backlog/backlog-next-main.ts +16 -0
  144. package/scripts/backlog/backlog-next-shared.ts +73 -0
  145. package/scripts/backlog/backlog-next.ts +48 -16
  146. package/scripts/backlog/backlog-occupied.ts +69 -0
  147. package/scripts/backlog/backlog-offer-cli.ts +6 -21
  148. package/scripts/backlog/backlog-offer-exclude.ts +15 -0
  149. package/scripts/backlog/backlog-offer-main.ts +12 -0
  150. package/scripts/backlog/backlog-offer.ts +36 -3
  151. package/scripts/backlog/backlog-overlap.ts +22 -4
  152. package/scripts/backlog/backlog-plan-read.ts +6 -2
  153. package/scripts/backlog/backlog-plan.ts +18 -4
  154. package/scripts/backlog/backlog-pool.ts +10 -10
  155. package/scripts/backlog/backlog-rank.ts +10 -2
  156. package/scripts/backlog/backlog-ready.ts +137 -18
  157. package/scripts/backlog/backlog-stalled-detect.ts +109 -36
  158. package/scripts/backlog/backlog-stalled.ts +52 -16
  159. package/scripts/backlog/backlog-wait-cause.ts +86 -0
  160. package/scripts/backlog/backlog-waves.ts +39 -13
  161. package/scripts/backlog/backlogrun-args.ts +19 -7
  162. package/scripts/backlog/backlogrun-cli.ts +19 -5
  163. package/scripts/backlog/backlogrun-launch.ts +6 -0
  164. package/scripts/backlog/backlogrun-restart.ts +97 -0
  165. package/scripts/backlog/backlogrun-stop.ts +79 -7
  166. package/scripts/behavior/behavior-cli.ts +2 -2
  167. package/scripts/behavior/behavior-rules.ts +47 -24
  168. package/scripts/build/build-bin.ts +2 -16
  169. package/scripts/build/build-claude-md.ts +0 -7
  170. package/scripts/build/build-commands.ts +0 -13
  171. package/scripts/build/build-hooks.ts +49 -48
  172. package/scripts/build/hook-bundle-stamp.ts +29 -11
  173. package/scripts/build/local-bin.ts +1 -1
  174. package/scripts/cases/cases-cli.ts +25 -13
  175. package/scripts/cases/cases-interaction-scan.ts +134 -0
  176. package/scripts/cases/cases-interaction.ts +183 -0
  177. package/scripts/cases/cases-logic.ts +39 -6
  178. package/scripts/ci/pr-classification-main.ts +18 -0
  179. package/scripts/ci/pr-classification.ts +10 -17
  180. package/scripts/clone/clone-scan.ts +1 -1
  181. package/scripts/cost-runtime/cost-blocks.ts +22 -37
  182. package/scripts/cost-runtime/cost-cli.ts +31 -14
  183. package/scripts/cost-runtime/cost-main.ts +12 -0
  184. package/scripts/cost-runtime/cost-transcript.ts +1 -0
  185. package/scripts/delegation/delegation-policy.ts +17 -4
  186. package/scripts/delegation/duplicate-read-guard.ts +2 -10
  187. package/scripts/delegation/investigation-guard.ts +15 -73
  188. package/scripts/delegation/investigation-reads.ts +3 -5
  189. package/scripts/dependabot/dependabot-cooldown.ts +194 -0
  190. package/scripts/discovery/repo-discovery.ts +24 -6
  191. package/scripts/doctor/doctor-consumer.ts +2 -5
  192. package/scripts/document/document-byte-budget.ts +9 -6
  193. package/scripts/document/document-scan.ts +1 -1
  194. package/scripts/document/document-section-cli.ts +17 -13
  195. package/scripts/document/document-section-main.ts +12 -0
  196. package/scripts/document/entry-read-budget.ts +2 -2
  197. package/scripts/document/read-set-cli.ts +4 -1
  198. package/scripts/epic/epic-audit-cli.ts +12 -6
  199. package/scripts/epic/epic-audit-orphans.ts +5 -8
  200. package/scripts/epic/epic-audit.ts +52 -1
  201. package/scripts/epic/epic-bundle-apply.ts +137 -0
  202. package/scripts/epic/epic-bundle-cli.ts +32 -121
  203. package/scripts/epic/epic-bundle-evidence.ts +49 -26
  204. package/scripts/epic/epic-bundle-format.ts +116 -0
  205. package/scripts/epic/epic-bundle-main.ts +17 -0
  206. package/scripts/epic/epic-bundle-referenced.ts +14 -3
  207. package/scripts/epic/epic-bundle.ts +17 -9
  208. package/scripts/epic/epic-busy.ts +5 -12
  209. package/scripts/epic/epic-classify.ts +24 -15
  210. package/scripts/epic/epic-cli-argv.ts +31 -0
  211. package/scripts/epic/epic-cli-decide.ts +42 -0
  212. package/scripts/epic/epic-cli.ts +6 -38
  213. package/scripts/epic/epic-close.ts +112 -55
  214. package/scripts/epic/epic-cross-repo.ts +4 -7
  215. package/scripts/epic/epic-decide.ts +119 -0
  216. package/scripts/epic/epic-decision.ts +9 -0
  217. package/scripts/epic/epic-fetch.ts +4 -0
  218. package/scripts/epic/epic-graph.ts +2 -0
  219. package/scripts/epic/epic-issue.ts +5 -1
  220. package/scripts/epic/epic-label-age.ts +1 -1
  221. package/scripts/epic/epic-lane-offer.ts +39 -4
  222. package/scripts/epic/epic-next-main.ts +24 -0
  223. package/scripts/epic/epic-next.ts +6 -24
  224. package/scripts/epic/epic-outside-blocker.ts +6 -2
  225. package/scripts/epic/epic-parse.ts +9 -3
  226. package/scripts/epic/epic-read.ts +1 -0
  227. package/scripts/epic/epic-reconcile.ts +39 -0
  228. package/scripts/epic/epic-run.ts +10 -1
  229. package/scripts/epic/epic-solo.ts +50 -14
  230. package/scripts/epic/epic.ts +41 -7
  231. package/scripts/exports/unused-members-cli.ts +2 -2
  232. package/scripts/followup/followup-checks-event.ts +8 -3
  233. package/scripts/followup/followup-coderabbit-wait.ts +82 -0
  234. package/scripts/followup/followup-review-gates.ts +81 -0
  235. package/scripts/followup/git-followup-stages.ts +13 -3
  236. package/scripts/followup/git-followup-workflow.ts +31 -60
  237. package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
  238. package/scripts/followup/git-pr-followup.ts +36 -8
  239. package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
  240. package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
  241. package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
  242. package/scripts/gate/busy-average.ts +58 -0
  243. package/scripts/gate/check-cpu.ts +60 -0
  244. package/scripts/gate/check-inputs.ts +73 -0
  245. package/scripts/gate/check-reuse.ts +141 -0
  246. package/scripts/gate/command-memory.ts +192 -0
  247. package/scripts/gate/core-admission.ts +218 -28
  248. package/scripts/gate/core-budget-timing.ts +37 -0
  249. package/scripts/gate/core-budget.ts +150 -119
  250. package/scripts/gate/core-wait-record.ts +48 -0
  251. package/scripts/gate/core-wait.ts +162 -0
  252. package/scripts/gate/core-weights.ts +86 -0
  253. package/scripts/gate/free-cores.ts +72 -0
  254. package/scripts/gate/gate-ledger.ts +49 -7
  255. package/scripts/gate/gate-plan.ts +44 -15
  256. package/scripts/gate/gate-report.ts +29 -4
  257. package/scripts/gate/gate-run-steps.ts +195 -0
  258. package/scripts/gate/gate-skip.ts +12 -2
  259. package/scripts/gate/gate-steps.ts +12 -1
  260. package/scripts/gate/held-mark.ts +55 -0
  261. package/scripts/gate/input-fingerprint.ts +42 -0
  262. package/scripts/gate/machine-capacity.ts +124 -31
  263. package/scripts/gate/moved-paths.ts +67 -0
  264. package/scripts/gate/pre-commit-type-check.ts +14 -1
  265. package/scripts/gate/project-checks.ts +5 -12
  266. package/scripts/gate/scoped-green.ts +12 -8
  267. package/scripts/gate/since-green.ts +62 -0
  268. package/scripts/gate/toolchain-inputs.ts +115 -0
  269. package/scripts/gate/verification-gate.ts +65 -129
  270. package/scripts/gate/verification-inputs.ts +250 -0
  271. package/scripts/gh/gh-author-association.ts +96 -9
  272. package/scripts/gh/git-ai-review-scan.ts +4 -2
  273. package/scripts/gh/git-gh-api-path.ts +15 -0
  274. package/scripts/gh/git-gh-branch-rules.ts +73 -0
  275. package/scripts/gh/git-gh-conditional.ts +5 -2
  276. package/scripts/gh/git-gh-issue-read.ts +5 -1
  277. package/scripts/gh/git-gh-issue-rest.ts +1 -0
  278. package/scripts/gh/git-gh-issue-write.ts +77 -17
  279. package/scripts/gh/git-gh-issue.ts +7 -3
  280. package/scripts/gh/git-gh-poll-read.ts +89 -0
  281. package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
  282. package/scripts/gh/git-gh-pr-rest.ts +1 -1
  283. package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
  284. package/scripts/gh/git-gh-pr.ts +27 -15
  285. package/scripts/gh/git-pr-checks-eval.ts +39 -7
  286. package/scripts/gh/git-pr-checks-parse.ts +39 -9
  287. package/scripts/gh/git-pr-merge-checked.ts +80 -0
  288. package/scripts/gh/git-pr.ts +13 -1
  289. package/scripts/git/base-tree.ts +19 -2
  290. package/scripts/git/changed-file-scope.ts +6 -4
  291. package/scripts/git/changed-paths.ts +18 -1
  292. package/scripts/git/git-diff-reads.ts +27 -2
  293. package/scripts/git/git-grep-hits.ts +85 -0
  294. package/scripts/git/git-location-environment.ts +1 -1
  295. package/scripts/git/git-merge-conflicts.ts +83 -0
  296. package/scripts/git/git-preflight.ts +37 -12
  297. package/scripts/git/git-push-transport.ts +1 -2
  298. package/scripts/git/git-schemas.ts +17 -7
  299. package/scripts/git/git-spawn.ts +1 -2
  300. package/scripts/git/git-status.ts +4 -4
  301. package/scripts/git/main-merge-main.ts +12 -0
  302. package/scripts/git/main-merge-regenerate.ts +78 -0
  303. package/scripts/git/main-merge.ts +39 -14
  304. package/scripts/git/main-sync-main.ts +12 -0
  305. package/scripts/git/main-sync.ts +0 -9
  306. package/scripts/git/stash/git-stash.ts +27 -4
  307. package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
  308. package/scripts/git/stash/stash-pop-cli.ts +6 -12
  309. package/scripts/git/stash/stash-pop-main.ts +12 -0
  310. package/scripts/git/stash/stash-push-cli.ts +76 -0
  311. package/scripts/git/stash/stash-push-main.ts +12 -0
  312. package/scripts/hooks/batch-guard.ts +5 -16
  313. package/scripts/hooks/check-commit-message-main.ts +8 -0
  314. package/scripts/hooks/check-commit-message.ts +4 -7
  315. package/scripts/hooks/format-edited-file.ts +8 -24
  316. package/scripts/hooks/pre-commit-lint.ts +118 -0
  317. package/scripts/hooks/pre-push-unit.ts +4 -2
  318. package/scripts/hooks/pretool-guard-cli.ts +1 -8
  319. package/scripts/hooks/pretool-guard.ts +57 -69
  320. package/scripts/hooks/reserved-run.ts +67 -8
  321. package/scripts/hooks/run-hook.sh +18 -11
  322. package/scripts/hooks/shell-rules-notice.ts +37 -0
  323. package/scripts/hooks/stop-actions.ts +185 -0
  324. package/scripts/hooks/stop-guard.ts +72 -27
  325. package/scripts/init/hook-command-rewrite.ts +19 -5
  326. package/scripts/init/hook-launch.ts +15 -12
  327. package/scripts/init/init-actions.ts +0 -6
  328. package/scripts/init/init-ai-copy.ts +10 -36
  329. package/scripts/init/init-bootstrap.ts +9 -8
  330. package/scripts/init/init-dry-run-report.ts +1 -1
  331. package/scripts/init/init-dry-run.ts +1 -1
  332. package/scripts/init/init-file-action.ts +7 -9
  333. package/scripts/init/init-logic-json-merge.ts +2 -2
  334. package/scripts/init/init-logic-migrate.ts +9 -82
  335. package/scripts/init/init-logic.ts +3 -2
  336. package/scripts/init/init-main.ts +12 -0
  337. package/scripts/init/init.ts +5 -12
  338. package/scripts/init/kit-development-versions.ts +3 -7
  339. package/scripts/init/kit-written-paths.ts +2 -2
  340. package/scripts/init/project-profile.ts +5 -4
  341. package/scripts/init/tsconfig-preset-migration.ts +2 -1
  342. package/scripts/init/vscode-tasks.ts +1 -1
  343. package/scripts/issue/defect-origin-cli.ts +106 -0
  344. package/scripts/issue/defect-origin-line.ts +60 -0
  345. package/scripts/issue/defect-origin-main.ts +11 -0
  346. package/scripts/issue/defect-origin.ts +114 -0
  347. package/scripts/issue/defect-rate-cli.ts +34 -78
  348. package/scripts/issue/defect-rate.ts +0 -16
  349. package/scripts/issue/defect-report-cli.ts +128 -0
  350. package/scripts/issue/defect-report-format.ts +56 -0
  351. package/scripts/issue/defect-report-main.ts +11 -0
  352. package/scripts/issue/defect-report.ts +160 -0
  353. package/scripts/issue/expected-effect-lint.ts +60 -0
  354. package/scripts/issue/issue-already-done-cli.ts +62 -0
  355. package/scripts/issue/issue-body-or-comment.ts +40 -0
  356. package/scripts/issue/issue-cite-cli.ts +33 -22
  357. package/scripts/issue/issue-cite-main.ts +12 -0
  358. package/scripts/issue/issue-classification.ts +13 -8
  359. package/scripts/issue/issue-comment-cli.ts +10 -24
  360. package/scripts/issue/issue-comment-main.ts +12 -0
  361. package/scripts/issue/issue-evidence-exit.ts +100 -0
  362. package/scripts/issue/issue-file-cli.ts +29 -7
  363. package/scripts/issue/issue-file.ts +19 -19
  364. package/scripts/issue/issue-fold-cli.ts +2 -11
  365. package/scripts/issue/issue-fold-main.ts +12 -0
  366. package/scripts/issue/issue-labels.ts +81 -90
  367. package/scripts/issue/issue-lint-cli.ts +7 -13
  368. package/scripts/issue/issue-lint-main.ts +12 -0
  369. package/scripts/issue/issue-measured-cli.ts +56 -0
  370. package/scripts/issue/issue-merged.ts +19 -2
  371. package/scripts/issue/issue-not-before-label.ts +135 -0
  372. package/scripts/issue/issue-not-before.ts +111 -0
  373. package/scripts/issue/issue-number-shape.ts +15 -1
  374. package/scripts/issue/issue-park.ts +28 -0
  375. package/scripts/issue/issue-plan-cli.ts +151 -0
  376. package/scripts/issue/issue-priority.ts +151 -0
  377. package/scripts/issue/issue-rank.ts +7 -1
  378. package/scripts/issue/issue-read-cli.ts +3 -10
  379. package/scripts/issue/issue-read-main.ts +12 -0
  380. package/scripts/issue/issue-read.ts +29 -5
  381. package/scripts/issue/issue-release-cli.ts +0 -10
  382. package/scripts/issue/issue-release-main.ts +13 -0
  383. package/scripts/issue/issue-release.ts +7 -12
  384. package/scripts/issue/issue-sample-gate.ts +192 -0
  385. package/scripts/issue/issue-sample-source.ts +76 -0
  386. package/scripts/issue/issue-scout-cli.ts +19 -25
  387. package/scripts/issue/issue-scout-main.ts +14 -0
  388. package/scripts/issue/issue-state-cli.ts +0 -10
  389. package/scripts/issue/issue-state-main.ts +12 -0
  390. package/scripts/issue/issue-watch-diff.ts +56 -15
  391. package/scripts/issue/issue-watch.ts +2 -1
  392. package/scripts/issue/issue-wip.ts +2 -7
  393. package/scripts/issue/markdown-section.ts +19 -5
  394. package/scripts/issue/measure-rerun-cli.ts +13 -8
  395. package/scripts/issue/plan-consumers-cli.ts +39 -0
  396. package/scripts/issue/plan-consumers-main.ts +11 -0
  397. package/scripts/issue/plan-consumers-section.ts +55 -0
  398. package/scripts/issue/plan-consumers.ts +127 -0
  399. package/scripts/josh/agent-session-environment.ts +1 -1
  400. package/scripts/josh/command-usage.ts +82 -0
  401. package/scripts/josh/file-map-stamp.ts +49 -16
  402. package/scripts/josh/hook-decision.ts +32 -20
  403. package/scripts/josh/josh-command-map.ts +6 -1
  404. package/scripts/josh/josh-command-types.ts +65 -13
  405. package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
  406. package/scripts/josh/josh-commands-ai.ts +169 -157
  407. package/scripts/josh/josh-commands-backlog.ts +82 -16
  408. package/scripts/josh/josh-commands-clone.ts +1 -0
  409. package/scripts/josh/josh-commands-development.ts +111 -71
  410. package/scripts/josh/josh-commands-document.ts +43 -1
  411. package/scripts/josh/josh-commands-epic.ts +171 -0
  412. package/scripts/josh/josh-commands-hooks.ts +31 -2
  413. package/scripts/josh/josh-commands-issue-write.ts +181 -0
  414. package/scripts/josh/josh-commands-issue.ts +124 -24
  415. package/scripts/josh/josh-commands-lane.ts +112 -2
  416. package/scripts/josh/josh-commands-lint.ts +19 -8
  417. package/scripts/josh/josh-commands-maintenance.ts +112 -4
  418. package/scripts/josh/josh-commands-pause.ts +29 -0
  419. package/scripts/josh/josh-commands-progress.ts +87 -0
  420. package/scripts/josh/josh-commands-project.ts +138 -9
  421. package/scripts/josh/josh-commands-review.ts +124 -0
  422. package/scripts/josh/josh-commands-run.ts +211 -23
  423. package/scripts/josh/josh-commands-ship.ts +169 -0
  424. package/scripts/josh/josh-commands-split.ts +9 -0
  425. package/scripts/josh/josh-commands-versioning.ts +49 -2
  426. package/scripts/josh/josh-commands-workflow.ts +149 -6
  427. package/scripts/josh/josh-logic.ts +11 -27
  428. package/scripts/josh/josh.ts +14 -5
  429. package/scripts/josh/package-directory.ts +18 -0
  430. package/scripts/josh/process-identity.ts +13 -4
  431. package/scripts/josh/session-language-cli.ts +4 -8
  432. package/scripts/josh/session-language-main.ts +13 -0
  433. package/scripts/josh/session-language.ts +6 -1
  434. package/scripts/josh/shared-cache.ts +90 -0
  435. package/scripts/josh/stamp-file.ts +9 -15
  436. package/scripts/lane/lane-await.ts +51 -12
  437. package/scripts/lane/lane-cache.ts +5 -30
  438. package/scripts/lane/lane-capacity.ts +19 -22
  439. package/scripts/lane/lane-check-stats.ts +97 -0
  440. package/scripts/lane/lane-child-invocation.ts +43 -4
  441. package/scripts/lane/lane-cli.ts +15 -5
  442. package/scripts/lane/lane-close.ts +86 -18
  443. package/scripts/lane/lane-core-wait-stats.ts +66 -0
  444. package/scripts/lane/lane-dispatch.ts +27 -6
  445. package/scripts/lane/lane-gap-stats.ts +156 -0
  446. package/scripts/lane/lane-guard-policy.ts +2 -2
  447. package/scripts/lane/lane-handoff.ts +76 -1
  448. package/scripts/lane/lane-held-stats.ts +129 -0
  449. package/scripts/lane/lane-install.ts +16 -15
  450. package/scripts/lane/lane-launch-cli.ts +0 -9
  451. package/scripts/lane/lane-launch-main.ts +12 -0
  452. package/scripts/lane/lane-ledger-schema.ts +266 -0
  453. package/scripts/lane/lane-ledger.ts +108 -97
  454. package/scripts/lane/lane-limit-cli.ts +19 -9
  455. package/scripts/lane/lane-measure-cli.ts +58 -10
  456. package/scripts/lane/lane-open.ts +9 -1
  457. package/scripts/lane/lane-parked.ts +3 -3
  458. package/scripts/lane/lane-pause-cli.ts +130 -0
  459. package/scripts/lane/lane-pause.ts +158 -0
  460. package/scripts/lane/lane-preserve.ts +29 -1
  461. package/scripts/lane/lane-process-table.ts +166 -0
  462. package/scripts/lane/lane-reap-settle.ts +124 -0
  463. package/scripts/lane/lane-reap.ts +50 -15
  464. package/scripts/lane/lane-registry.ts +33 -10
  465. package/scripts/lane/lane-residents.ts +162 -0
  466. package/scripts/lane/lane-restart.ts +26 -27
  467. package/scripts/lane/lane-round-two-stats.ts +49 -0
  468. package/scripts/lane/lane-sampler.ts +4 -0
  469. package/scripts/lane/lane-session-action.ts +160 -0
  470. package/scripts/lane/lane-session-broker.ts +134 -134
  471. package/scripts/lane/lane-snapshot-trace.ts +84 -0
  472. package/scripts/lane/lane-spans.ts +51 -0
  473. package/scripts/lane/lane-spent.ts +6 -3
  474. package/scripts/lane/lane-stage-stats.ts +7 -2
  475. package/scripts/lane/lane-state.ts +302 -0
  476. package/scripts/lane/lane-stats.ts +58 -4
  477. package/scripts/lane/lane-stop-stats.ts +113 -37
  478. package/scripts/lane/lane-test-related-stats.ts +127 -0
  479. package/scripts/lane/lane-transcript-calls.ts +145 -0
  480. package/scripts/lane/lane-transcript-stats.ts +168 -0
  481. package/scripts/lane/lane-vacant.ts +13 -3
  482. package/scripts/lane/lane-withdraw-cli.ts +72 -0
  483. package/scripts/lane/lane-withdraw.ts +183 -0
  484. package/scripts/lane/process-directories.ts +70 -0
  485. package/scripts/lane/process-lane-marks.ts +94 -0
  486. package/scripts/lib/atomic-write.ts +62 -0
  487. package/scripts/lib/buffered-process.ts +12 -5
  488. package/scripts/lib/cli-flags.ts +53 -0
  489. package/scripts/lib/figure-format.ts +63 -0
  490. package/scripts/lib/json-value.ts +9 -1
  491. package/scripts/lib/package-manifest.ts +35 -0
  492. package/scripts/lib/read-file.ts +3 -1
  493. package/scripts/lib/stamped-memo.ts +63 -0
  494. package/scripts/lib/stdout-on-stderr.ts +24 -0
  495. package/scripts/lib/timeouts.ts +9 -0
  496. package/scripts/lib/transcript-record.ts +91 -0
  497. package/scripts/lines/effective-limit.ts +1 -1
  498. package/scripts/lint/eslint-cache-dependencies.ts +145 -0
  499. package/scripts/lint/eslint-daemon.ts +265 -0
  500. package/scripts/lint/format.ts +14 -5
  501. package/scripts/lint/import-graph.ts +279 -0
  502. package/scripts/lint/lint-gate-scope.ts +102 -0
  503. package/scripts/lint/lint-parallel-main.ts +19 -0
  504. package/scripts/lint/lint-parallel.ts +72 -33
  505. package/scripts/lint/lint-related-scope.ts +33 -24
  506. package/scripts/lint/lint-related.ts +38 -6
  507. package/scripts/notify/confirmation-options.ts +1 -2
  508. package/scripts/notify/telegram-notify.ts +20 -20
  509. package/scripts/notify/telegram-test-logic.ts +0 -1
  510. package/scripts/notify/telegram-test-main.ts +8 -0
  511. package/scripts/notify/telegram-test.ts +12 -11
  512. package/scripts/observations/observation-ledger.ts +13 -0
  513. package/scripts/observations/observations-flush-landing.ts +5 -3
  514. package/scripts/observations/observations-flush.ts +6 -1
  515. package/scripts/overrides/overrides-check.ts +2 -5
  516. package/scripts/overrides/overrides-files.ts +2 -1
  517. package/scripts/overrides/overrides-logic.ts +3 -6
  518. package/scripts/package/verify-optional-eslint-install.ts +8 -6
  519. package/scripts/propagate/propagate-publish.ts +2 -7
  520. package/scripts/propagate/propagate-targets.ts +4 -12
  521. package/scripts/refactor/import-graph.ts +9 -7
  522. package/scripts/release/github-release-runs.ts +17 -6
  523. package/scripts/release/release-approval-prune.ts +18 -0
  524. package/scripts/release/release-history.ts +1 -3
  525. package/scripts/release/release-progress.ts +42 -22
  526. package/scripts/release/release-publish-run.ts +39 -0
  527. package/scripts/release/release-publish.ts +6 -6
  528. package/scripts/release/release-scope-cli.ts +0 -10
  529. package/scripts/release/release-scope-main.ts +12 -0
  530. package/scripts/repo/repo-setting.ts +3 -6
  531. package/scripts/repo/required-checks-logic.ts +6 -15
  532. package/scripts/report/report-format-reference.ts +4 -0
  533. package/scripts/report/report-labels.ts +155 -0
  534. package/scripts/report/report-lint-cli.ts +3 -0
  535. package/scripts/report/report-lint.ts +85 -110
  536. package/scripts/report/report-template-cli.ts +59 -0
  537. package/scripts/report/report-template.ts +112 -0
  538. package/scripts/review/acceptance-map-check.ts +61 -0
  539. package/scripts/review/acceptance-map.ts +206 -0
  540. package/scripts/review/removed-tests-check.ts +86 -0
  541. package/scripts/review/removed-tests.ts +149 -0
  542. package/scripts/review/review-brief-cli.ts +82 -16
  543. package/scripts/review/review-brief-main.ts +12 -0
  544. package/scripts/review/review-brief.ts +31 -3
  545. package/scripts/review/review-code-tree.ts +10 -6
  546. package/scripts/review/review-comment-round.ts +26 -8
  547. package/scripts/review/review-finding-ledger.ts +30 -15
  548. package/scripts/review/review-interaction.ts +94 -0
  549. package/scripts/review/review-readers-scan.ts +163 -0
  550. package/scripts/review/review-record-cli.ts +69 -30
  551. package/scripts/review/review-record-main.ts +12 -0
  552. package/scripts/review/review-round-one-blobs.ts +221 -0
  553. package/scripts/review/review-round2-cli.ts +49 -12
  554. package/scripts/review/review-round2.ts +80 -12
  555. package/scripts/review/review-stamps.ts +19 -1
  556. package/scripts/review/review-stop-log.ts +96 -0
  557. package/scripts/review/review-stops-cli.ts +85 -0
  558. package/scripts/review/review-tree.ts +6 -17
  559. package/scripts/review/review-untouched-readers.ts +146 -0
  560. package/scripts/review/test-titles.ts +118 -0
  561. package/scripts/rules/agent-model.ts +67 -0
  562. package/scripts/rules/bash-triggers.ts +46 -3
  563. package/scripts/rules/decision-oracle-batch.ts +9 -1
  564. package/scripts/rules/decision-oracle.ts +2 -2
  565. package/scripts/rules/delivered-rules.ts +90 -3
  566. package/scripts/rules/destructive-command.ts +8 -1
  567. package/scripts/rules/direct-filing.ts +10 -2
  568. package/scripts/rules/direct-issue-comment.ts +117 -0
  569. package/scripts/rules/direct-pr-create.ts +69 -3
  570. package/scripts/rules/early-heartbeat.ts +2 -1
  571. package/scripts/rules/file-body.ts +7 -0
  572. package/scripts/rules/filing-cap.ts +8 -0
  573. package/scripts/rules/firing-point.ts +6 -5
  574. package/scripts/rules/git-argv.ts +72 -14
  575. package/scripts/rules/git-force.ts +12 -2
  576. package/scripts/rules/guard-remedy.ts +121 -0
  577. package/scripts/rules/implementation-cut-verdict.ts +1 -1
  578. package/scripts/rules/implementation-cut.ts +11 -3
  579. package/scripts/rules/index-guard.ts +8 -1
  580. package/scripts/rules/issue-comments.ts +76 -7
  581. package/scripts/rules/josh-git-bare.ts +7 -0
  582. package/scripts/rules/lane-background.ts +67 -25
  583. package/scripts/rules/lane-carry-conflict.ts +6 -0
  584. package/scripts/rules/lane-direct-tool.ts +74 -0
  585. package/scripts/rules/lane-interactive-ask.ts +9 -2
  586. package/scripts/rules/lane-park.ts +45 -23
  587. package/scripts/rules/lane-split-park.ts +10 -2
  588. package/scripts/rules/lane-switch-main.ts +7 -0
  589. package/scripts/rules/last-prompt.ts +50 -5
  590. package/scripts/rules/oracle-consulted.ts +10 -0
  591. package/scripts/rules/oracle-firing.ts +1 -0
  592. package/scripts/rules/oracle-list-cli.ts +7 -0
  593. package/scripts/rules/permission-guards.ts +3 -0
  594. package/scripts/rules/piped-verification.ts +4 -2
  595. package/scripts/rules/poll-loop.ts +7 -0
  596. package/scripts/rules/pr-merge.ts +123 -0
  597. package/scripts/rules/protected-files.ts +32 -5
  598. package/scripts/rules/raw-field-body.ts +6 -0
  599. package/scripts/rules/rule-body-guard.ts +8 -0
  600. package/scripts/rules/rule-list.ts +12 -28
  601. package/scripts/rules/rule-rewrite.ts +114 -0
  602. package/scripts/rules/rule-value-cache.ts +4 -9
  603. package/scripts/rules/rule-value-cli.ts +51 -32
  604. package/scripts/rules/rule-value.ts +8 -2
  605. package/scripts/rules/shell-segments.ts +50 -0
  606. package/scripts/rules/stop-decision.ts +77 -0
  607. package/scripts/rules/stop-rule-rows.ts +64 -0
  608. package/scripts/rules/stop-rules.ts +150 -51
  609. package/scripts/rules/tail-commands.ts +15 -1
  610. package/scripts/rules/test-declared-commit.ts +11 -1
  611. package/scripts/rules/third-party-write.ts +7 -0
  612. package/scripts/rules/timed-rerun.ts +69 -0
  613. package/scripts/rules/worktree-guard.ts +13 -3
  614. package/scripts/run/board/run-board-app-name.ts +23 -0
  615. package/scripts/run/board/run-board-cli.ts +65 -30
  616. package/scripts/run/board/run-board-closed.ts +8 -2
  617. package/scripts/run/board/run-board-earlier.ts +94 -0
  618. package/scripts/run/board/run-board-ending-reason.ts +67 -0
  619. package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
  620. package/scripts/run/board/run-board-estimate.ts +98 -0
  621. package/scripts/run/board/run-board-fit.ts +153 -36
  622. package/scripts/run/board/run-board-fold.ts +123 -0
  623. package/scripts/run/board/run-board-fresh.ts +2 -2
  624. package/scripts/run/board/run-board-gather-live.ts +29 -0
  625. package/scripts/run/board/run-board-gather-thread.ts +189 -0
  626. package/scripts/run/board/run-board-gather-worker.ts +29 -0
  627. package/scripts/run/board/run-board-gather.ts +187 -0
  628. package/scripts/run/board/run-board-github.ts +119 -31
  629. package/scripts/run/board/run-board-header.ts +86 -21
  630. package/scripts/run/board/run-board-keys.ts +58 -0
  631. package/scripts/run/board/run-board-kind.ts +20 -6
  632. package/scripts/run/board/run-board-labels.ts +118 -71
  633. package/scripts/run/board/run-board-lane-state.ts +109 -0
  634. package/scripts/run/board/run-board-lane-time.ts +122 -0
  635. package/scripts/run/board/run-board-layout.ts +240 -61
  636. package/scripts/run/board/run-board-length.ts +52 -0
  637. package/scripts/run/board/run-board-machine.ts +8 -4
  638. package/scripts/run/board/run-board-main.ts +12 -0
  639. package/scripts/run/board/run-board-notes.ts +52 -31
  640. package/scripts/run/board/run-board-now.ts +1 -1
  641. package/scripts/run/board/run-board-operation.ts +15 -33
  642. package/scripts/run/board/run-board-phase.ts +1 -1
  643. package/scripts/run/board/run-board-plan-shared.ts +115 -0
  644. package/scripts/run/board/run-board-plan.ts +55 -3
  645. package/scripts/run/board/run-board-planning.ts +45 -0
  646. package/scripts/run/board/run-board-priority.ts +44 -0
  647. package/scripts/run/board/run-board-process-groups.ts +195 -0
  648. package/scripts/run/board/run-board-read.ts +153 -13
  649. package/scripts/run/board/run-board-reason.ts +238 -45
  650. package/scripts/run/board/run-board-released.ts +35 -0
  651. package/scripts/run/board/run-board-render-checks.ts +39 -5
  652. package/scripts/run/board/run-board-render-condition.ts +96 -0
  653. package/scripts/run/board/run-board-render-drawn.ts +67 -0
  654. package/scripts/run/board/run-board-render-foot.ts +59 -0
  655. package/scripts/run/board/run-board-render-icon.ts +35 -0
  656. package/scripts/run/board/run-board-render-lanes.ts +145 -0
  657. package/scripts/run/board/run-board-render-lead.ts +80 -0
  658. package/scripts/run/board/run-board-render-legend.ts +117 -47
  659. package/scripts/run/board/run-board-render-notes.ts +156 -29
  660. package/scripts/run/board/run-board-render-processes.ts +196 -0
  661. package/scripts/run/board/run-board-render-section.ts +119 -0
  662. package/scripts/run/board/run-board-render-slot.ts +3 -36
  663. package/scripts/run/board/run-board-render-tail.ts +115 -48
  664. package/scripts/run/board/run-board-render-time.ts +56 -0
  665. package/scripts/run/board/run-board-render-title.ts +117 -24
  666. package/scripts/run/board/run-board-render-waits.ts +125 -0
  667. package/scripts/run/board/run-board-render.ts +206 -259
  668. package/scripts/run/board/run-board-roots.ts +54 -0
  669. package/scripts/run/board/run-board-row-yield.ts +10 -4
  670. package/scripts/run/board/run-board-setup.ts +1 -12
  671. package/scripts/run/board/run-board-snapshot.ts +111 -0
  672. package/scripts/run/board/run-board-spin.ts +2 -2
  673. package/scripts/run/board/run-board-state.ts +23 -29
  674. package/scripts/run/board/run-board-status.ts +206 -79
  675. package/scripts/run/board/run-board-thanks-read.ts +2 -2
  676. package/scripts/run/board/run-board-tick.ts +123 -104
  677. package/scripts/run/board/run-board-usage-board.ts +78 -0
  678. package/scripts/run/board/run-board-usage-lanes.ts +113 -0
  679. package/scripts/run/board/run-board-usage-listing.ts +93 -0
  680. package/scripts/run/board/run-board-usage-read.ts +120 -150
  681. package/scripts/run/board/run-board-usage-rusage.ts +19 -7
  682. package/scripts/run/board/run-board-usage-text.ts +139 -51
  683. package/scripts/run/board/run-board-usage-top.ts +102 -0
  684. package/scripts/run/board/run-board-usage.ts +89 -72
  685. package/scripts/run/board/run-board-usual.ts +20 -9
  686. package/scripts/run/carry/run-carry-args.ts +4 -7
  687. package/scripts/run/carry/run-carry-conversation.ts +1 -1
  688. package/scripts/run/carry/run-carry.ts +9 -4
  689. package/scripts/run/cut/run-cut-cli.ts +3 -2
  690. package/scripts/run/cut/run-cut-handoff.ts +2 -2
  691. package/scripts/run/cut/run-cut-report.ts +16 -0
  692. package/scripts/run/detached-launch.ts +23 -4
  693. package/scripts/run/entry/run-entry-cli.ts +8 -1
  694. package/scripts/run/event/run-event-cli.ts +1 -5
  695. package/scripts/run/event/run-event-filed.ts +12 -6
  696. package/scripts/run/event/run-event-follow.ts +2 -3
  697. package/scripts/run/event/run-event-render.ts +7 -10
  698. package/scripts/run/event/run-event-scope.ts +20 -2
  699. package/scripts/run/event/run-event-stream-emit.ts +78 -11
  700. package/scripts/run/event/run-event-stream.ts +37 -7
  701. package/scripts/run/hold/run-hold-adopt.ts +65 -0
  702. package/scripts/run/hold/run-hold-cli.ts +93 -22
  703. package/scripts/run/hold/run-hold-main.ts +12 -0
  704. package/scripts/run/hold/run-hold-member.ts +37 -0
  705. package/scripts/run/hold/run-hold-session.ts +46 -0
  706. package/scripts/run/hold/run-hold.ts +7 -1
  707. package/scripts/run/hold/run-stop-notify.ts +183 -0
  708. package/scripts/run/launch-priority.ts +32 -0
  709. package/scripts/run/merge/run-merge-auth.ts +31 -0
  710. package/scripts/run/merge/run-merge-cli.ts +72 -107
  711. package/scripts/run/merge/run-merge-close.ts +74 -0
  712. package/scripts/run/merge/run-merge-collect.ts +6 -13
  713. package/scripts/run/merge/run-merge-driver.ts +71 -0
  714. package/scripts/run/merge/run-merge-main.ts +12 -0
  715. package/scripts/run/merge/run-merge-outcome.ts +23 -0
  716. package/scripts/run/merge/run-merge-restart.ts +39 -0
  717. package/scripts/run/merge/run-merge-ship.ts +20 -4
  718. package/scripts/run/merge/run-merge-signals.ts +123 -0
  719. package/scripts/run/merge/run-merge-steps.ts +128 -83
  720. package/scripts/run/merge/run-merge.ts +53 -40
  721. package/scripts/run/park/run-park-cli.ts +91 -0
  722. package/scripts/run/park/run-park.ts +88 -0
  723. package/scripts/run/park/run-stalled.ts +68 -0
  724. package/scripts/run/pause/run-pause-cli.ts +73 -0
  725. package/scripts/run/pause/run-pause.ts +251 -0
  726. package/scripts/run/progress/run-progress-cli.ts +4 -12
  727. package/scripts/run/progress/run-progress-clock.ts +1 -1
  728. package/scripts/run/progress/run-progress-config.ts +6 -14
  729. package/scripts/run/progress/run-progress-main.ts +12 -0
  730. package/scripts/run/progress/run-progress.ts +1 -4
  731. package/scripts/run/review/run-review.ts +2 -1
  732. package/scripts/run/run-ending.ts +1 -0
  733. package/scripts/run/run-invocation.ts +5 -6
  734. package/scripts/run/run-liveness-cli.ts +6 -8
  735. package/scripts/run/run-liveness.ts +61 -30
  736. package/scripts/run/run-next.ts +1 -1
  737. package/scripts/run/run-parent-cut-hook.ts +2 -2
  738. package/scripts/run/run-poll-hook.ts +157 -0
  739. package/scripts/run/run-preflight.ts +18 -3
  740. package/scripts/run/run-prep-cli.ts +1 -10
  741. package/scripts/run/run-prep-locate.ts +7 -50
  742. package/scripts/run/run-prep-main.ts +12 -0
  743. package/scripts/run/run-prep.ts +6 -0
  744. package/scripts/run/run-report-cli.ts +101 -13
  745. package/scripts/run/run-report-handoff.ts +114 -0
  746. package/scripts/run/run-step-cli.ts +22 -15
  747. package/scripts/run/run-step-section.ts +85 -0
  748. package/scripts/run/run-step.ts +1 -1
  749. package/scripts/run/run-stranded-detect.ts +13 -0
  750. package/scripts/run/run-watcher-guard-cli.ts +1 -1
  751. package/scripts/run/run-watcher-guard.ts +1 -1
  752. package/scripts/run/ship/run-ship-args.ts +121 -0
  753. package/scripts/run/ship/run-ship-body-draft.ts +110 -0
  754. package/scripts/run/ship/run-ship-cli.ts +67 -151
  755. package/scripts/run/ship/run-ship-detach.ts +27 -7
  756. package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
  757. package/scripts/run/ship/run-ship-next.ts +27 -3
  758. package/scripts/run/ship/run-ship-overlap.ts +232 -0
  759. package/scripts/run/ship/run-ship-place.ts +96 -0
  760. package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
  761. package/scripts/run/ship/run-ship-pre-detach.ts +102 -27
  762. package/scripts/run/ship/run-ship-preflight.ts +161 -30
  763. package/scripts/run/ship/run-ship-probe.ts +11 -3
  764. package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
  765. package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
  766. package/scripts/run/ship/run-ship-return.ts +123 -15
  767. package/scripts/run/ship/run-ship-review-steps.ts +105 -149
  768. package/scripts/run/ship/run-ship-review.ts +73 -6
  769. package/scripts/run/ship/run-ship-reviewer.ts +207 -0
  770. package/scripts/run/ship/run-ship-stage.ts +55 -6
  771. package/scripts/run/ship/run-ship-steps.ts +46 -15
  772. package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
  773. package/scripts/run/ship/run-ship-stop-context.ts +206 -0
  774. package/scripts/run/ship/run-ship-stop-text.ts +11 -6
  775. package/scripts/run/ship/run-ship-sync.ts +57 -12
  776. package/scripts/run/ship/run-ship.ts +30 -2
  777. package/scripts/run/tidy/run-tidy-cli.ts +0 -4
  778. package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
  779. package/scripts/run/tidy/run-tidy-main.ts +8 -0
  780. package/scripts/run/wake/run-wake-cli.ts +119 -100
  781. package/scripts/run/wake/run-wake-code.ts +83 -0
  782. package/scripts/run/wake/run-wake-driver.ts +19 -8
  783. package/scripts/run/wake/run-wake-loop.ts +34 -3
  784. package/scripts/run/wake/run-wake-main.ts +13 -0
  785. package/scripts/run/wake/run-wake-ports.ts +90 -0
  786. package/scripts/run/wake/run-wake-takeover.ts +66 -0
  787. package/scripts/run/wake/run-wake.ts +2 -1
  788. package/scripts/safe-chain/pack-hook.ts +2 -2
  789. package/scripts/safe-chain/preinstall-command.ts +2 -1
  790. package/scripts/safe-chain/project-config.ts +3 -9
  791. package/scripts/security/security-audit-main.ts +8 -0
  792. package/scripts/security/security-audit-provision-logic.ts +0 -11
  793. package/scripts/security/security-audit-provision-main.ts +12 -0
  794. package/scripts/security/security-audit-provision.ts +11 -26
  795. package/scripts/security/security-audit.ts +6 -7
  796. package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
  797. package/scripts/split/split-assess-cli.ts +2 -2
  798. package/scripts/split/split-assess.ts +15 -0
  799. package/scripts/split/split-measure.ts +65 -0
  800. package/scripts/sync/claude-settings-merge.ts +8 -15
  801. package/scripts/sync/directory-copy-guard.ts +4 -9
  802. package/scripts/sync/file-content.ts +78 -8
  803. package/scripts/sync/sync-ai-files.ts +3 -5
  804. package/scripts/sync/sync-configs.ts +11 -23
  805. package/scripts/sync/sync-hook-safety.ts +4 -10
  806. package/scripts/sync/sync-main.ts +11 -0
  807. package/scripts/sync/sync.ts +25 -37
  808. package/scripts/test/test-declared-changed.ts +2 -2
  809. package/scripts/test/test-declared.ts +1 -1
  810. package/scripts/test/test-e2e-guard.ts +55 -6
  811. package/scripts/test/test-e2e-stamp.ts +38 -0
  812. package/scripts/test/test-pinned-logic.ts +145 -0
  813. package/scripts/test/test-pinned-main.ts +78 -0
  814. package/scripts/test/test-pinned.ts +100 -0
  815. package/scripts/test/test-read-map.ts +264 -0
  816. package/scripts/test/test-read-recording.ts +91 -0
  817. package/scripts/test/test-read-trace.ts +148 -0
  818. package/scripts/test/test-red-main.ts +12 -0
  819. package/scripts/test/test-red.ts +12 -30
  820. package/scripts/test/test-related-main.ts +18 -0
  821. package/scripts/test/test-related-record.ts +119 -0
  822. package/scripts/test/test-related-scope.ts +229 -43
  823. package/scripts/test/test-related.ts +300 -22
  824. package/scripts/test/test-unit-guard-main.ts +15 -0
  825. package/scripts/test/test-unit-guard.ts +54 -21
  826. package/scripts/test/unit-count-file.ts +37 -0
  827. package/scripts/test/unit-run-marker.ts +162 -0
  828. package/scripts/test/unit-setup-files.ts +51 -0
  829. package/scripts/test/unit-worker-share.ts +71 -137
  830. package/scripts/test/whole-suite-files.ts +63 -0
  831. package/scripts/time-runtime/time-background.ts +20 -2
  832. package/scripts/time-runtime/time-bundles.ts +4 -3
  833. package/scripts/time-runtime/time-density-hook.ts +8 -6
  834. package/scripts/time-runtime/time-followup-stage.ts +1 -3
  835. package/scripts/time-runtime/time-format.ts +5 -28
  836. package/scripts/time-runtime/time-markers.ts +10 -1
  837. package/scripts/time-runtime/time-shell.ts +126 -14
  838. package/scripts/time-runtime/time-spans.ts +1 -0
  839. package/scripts/time-runtime/time-tool-call.ts +7 -0
  840. package/scripts/time-runtime/time-transcript-line.ts +49 -62
  841. package/scripts/uninstall/uninstall.ts +1 -1
  842. package/scripts/version/bump-version-main.ts +12 -0
  843. package/scripts/version/bump-version.ts +25 -25
  844. package/scripts/version/effective-upstream.ts +6 -12
  845. package/scripts/version/latest-corepack.ts +17 -32
  846. package/scripts/version/latest-if-required-cli.ts +93 -0
  847. package/scripts/version/latest-lane-guard-main.ts +8 -0
  848. package/scripts/version/latest-lane-guard.ts +0 -4
  849. package/scripts/version/latest-scope-cli.ts +0 -9
  850. package/scripts/version/latest-scope-main.ts +12 -0
  851. package/scripts/version/latest-update.ts +5 -5
  852. package/scripts/version/npm-registry.ts +44 -6
  853. package/scripts/version/publishable-range-check.ts +5 -16
  854. package/scripts/version/release-age.ts +1 -1
  855. package/scripts/version/release-hold.ts +1 -1
  856. package/scripts/version/release-window.ts +38 -0
  857. package/scripts/version/running-binary.ts +1 -1
  858. package/scripts/version/safe-chain-version-update.ts +3 -8
  859. package/scripts/version/version-targets.ts +6 -28
  860. package/templates/dependabot.yml +29 -0
  861. package/templates/gitignore +10 -3
  862. package/templates/pnpm-workspace.basic.yaml +1 -1
  863. package/templates/sonar-project.properties +3 -2
  864. package/templates/workflows/ci.yml +12 -4
  865. package/templates/workflows/github-release.yml +4 -0
  866. package/tsconfig.sonar.json +1 -1
  867. package/.ncurc.json +0 -3
  868. package/dist/hooks/batch-guard.js +0 -29
  869. package/dist/hooks/chunk-43ZHT22P.js +0 -3495
  870. package/dist/hooks/chunk-CDY4NFQG.js +0 -15
  871. package/dist/hooks/chunk-EUMACUK2.js +0 -2038
  872. package/dist/hooks/chunk-H5HVWYXK.js +0 -359
  873. package/dist/hooks/chunk-IIGFYXKC.js +0 -7104
  874. package/dist/hooks/chunk-IX6TTTI6.js +0 -95
  875. package/dist/hooks/chunk-J47HU5H5.js +0 -237
  876. package/dist/hooks/chunk-K4EOONYM.js +0 -45
  877. package/dist/hooks/chunk-K4LMBQC2.js +0 -68
  878. package/dist/hooks/chunk-SHGPANFB.js +0 -56
  879. package/dist/hooks/chunk-YHBZAJSV.js +0 -79
  880. package/dist/hooks/chunk-YYPI7SJZ.js +0 -131
  881. package/dist/hooks/duplicate-read-guard.js +0 -30
  882. package/dist/hooks/investigation-guard.js +0 -32
  883. package/scripts/backlog/backlog-stalled-cli.ts +0 -30
  884. package/scripts/cost-runtime/cost-format.ts +0 -29
  885. package/scripts/init/basic-path-migration.ts +0 -24
  886. package/scripts/issue/issue-backlinks-cli.ts +0 -93
  887. package/scripts/josh/josh-commands-guard.ts +0 -38
  888. package/scripts/lint/cross-file-recheck.ts +0 -155
  889. package/scripts/registry-migration/migrate-logic.ts +0 -237
  890. package/scripts/registry-migration/migrate.ts +0 -292
  891. package/scripts/registry-migration/user-npmrc.ts +0 -15
  892. package/scripts/rules/rule-guard.ts +0 -23
  893. package/scripts/rules/rule-registry-rows.ts +0 -282
  894. package/scripts/rules/rule-registry.ts +0 -109
  895. package/scripts/run/run-stranded-cli.ts +0 -27
@@ -3,8 +3,10 @@ import { lane_registry } from '#scripts/lane/lane-registry'
3
3
  import { lane_relaunch } from '#scripts/lane/lane-relaunch'
4
4
  import { run_event_scope } from '#scripts/run/event/run-event-scope'
5
5
  import { run_event_stream, type RunEvent } from '#scripts/run/event/run-event-stream'
6
+ import type { StallCause } from '#scripts/run/park/run-stalled'
6
7
  import { run_ending } from '#scripts/run/run-ending'
7
8
  import { run_ship_detach } from '#scripts/run/ship/run-ship-detach'
9
+ import { run_ship_stop_text } from '#scripts/run/ship/run-ship-stop-text'
8
10
 
9
11
  // Why `run:merge` parks a child whose detached ship has already ended (joshuafolkken/kit#3808).
10
12
  //
@@ -35,7 +37,18 @@ function since_ship_launch(events: Events, child: string): Events | undefined {
35
37
  return launched_at === -1 ? undefined : own.slice(launched_at + 1)
36
38
  }
37
39
 
38
- function cause_of(ending: ShipEnding, events: Events, child: string): string | undefined {
40
+ // The stopped stage names the cause's short form (`review failed`); a stop text in no known shape is
41
+ // still a ship stop.
42
+ function stop_cause(stop: RunEvent): StallCause {
43
+ const stage = run_ship_stop_text.reason_of(stop.text)
44
+
45
+ return {
46
+ short: stage === undefined ? 'ship stopped' : `${stage} failed`,
47
+ why: `its detached ship stopped and was not fixed: ${stop.text}.`,
48
+ }
49
+ }
50
+
51
+ function cause_of(ending: ShipEnding, events: Events, child: string): StallCause | undefined {
39
52
  if (ending === undefined || !ENDED_RESULTS.has(ending.result)) return undefined
40
53
 
41
54
  const attempt = since_ship_launch(events, child)
@@ -43,14 +56,17 @@ function cause_of(ending: ShipEnding, events: Events, child: string): string | u
43
56
 
44
57
  const stop = attempt.findLast((event) => event.kind === run_event_stream.EVENT_KIND.SHIP_STOP)
45
58
 
46
- if (stop !== undefined) return `its detached ship stopped and was not fixed: ${stop.text}.`
59
+ if (stop !== undefined) return stop_cause(stop)
47
60
 
48
- return `its detached ship ended ${ending.result} before recording a stopped stage — pnpm josh ship --log ${child}.`
61
+ return {
62
+ short: `ship ${ending.result}`,
63
+ why: `its detached ship ended ${ending.result} before recording a stopped stage — pnpm josh ship --log ${child}.`,
64
+ }
49
65
  }
50
66
 
51
67
  // The ship's cause for `child`'s park, read from the record and the stream this checkout's repository
52
68
  // keys on, or `undefined` when the child handed nothing to a ship or its ship succeeded.
53
- function cause(child: string, directory: string = process.cwd()): string | undefined {
69
+ function cause(child: string, directory: string = process.cwd()): StallCause | undefined {
54
70
  const repository = git_common_directory.repository(directory)
55
71
  if (repository === undefined) return undefined
56
72
 
@@ -0,0 +1,123 @@
1
+ import { api_auth } from '#scripts/agent/api-auth'
2
+ import { api_outage } from '#scripts/agent/api-outage'
3
+ import { issue_closing_pr } from '#scripts/issue/issue-closing-pr'
4
+ import { issue_merged } from '#scripts/issue/issue-merged'
5
+ import type { issue_state_cli } from '#scripts/issue/issue-state-cli'
6
+ import { run_event_scope } from '#scripts/run/event/run-event-scope'
7
+ import { run_event_stream } from '#scripts/run/event/run-event-stream'
8
+ import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
9
+ import { run_ending } from '#scripts/run/run-ending'
10
+ import { run_merge, type ChildOutcome, type EndingSignals } from './run-merge'
11
+ import { run_merge_restart } from './run-merge-restart'
12
+ import { run_merge_ship } from './run-merge-ship'
13
+ import { run_merge_steps, type MergeContext } from './run-merge-steps'
14
+
15
+ // What `run:merge` reads beside a returned child's GitHub state before classifying it — the exit
16
+ // record, the lane's cut, a merged closing pull request and a person's withdrawal — and the
17
+ // classification those readings and the state decide (`run_merge.classify_child`).
18
+
19
+ type IssueRead = Awaited<ReturnType<typeof issue_state_cli.read_issue>>
20
+
21
+ // Whether the child's session ended through its environment — read only when `--output` named the
22
+ // transcript, off otherwise: its exit record shows it could not reach the API, or the session was
23
+ // killed inside a turn. The path is validated inside `run_ending`, so a missing output is "no".
24
+ function read_is_outage(output: string | undefined): boolean {
25
+ if (output === undefined) return false
26
+
27
+ return api_outage.is_outage(run_ending.read_exit(output)) || run_ending.ended_mid_turn(output)
28
+ }
29
+
30
+ // Whether the child's session ended because it could not authenticate — off without `--output`, as the
31
+ // outage read is. The lane's log is appended across launches, so it is read as the reviewer's is
32
+ // (`api_auth.is_auth_failed_transcript`).
33
+ function read_is_auth_failure(output: string | undefined): boolean {
34
+ if (output === undefined) return false
35
+
36
+ return api_auth.is_auth_failed_transcript(run_ending.read_transcript(output))
37
+ }
38
+
39
+ async function child_outages(child: string): Promise<number> {
40
+ const events = await run_event_stream_emit.current_events()
41
+
42
+ return events.filter(
43
+ (event) =>
44
+ event.kind === run_event_stream.EVENT_KIND.OUTAGE &&
45
+ run_event_scope.issue_named(event) === child,
46
+ ).length
47
+ }
48
+
49
+ // Why an unfinished child is re-dispatchable, or `undefined` when it is not. **Only an API outage adds
50
+ // to the run-wide streak**: a host restart is over by the time the child is read (joshuafolkken/kit#4540),
51
+ // and an unanswered ship stop reached the API (joshuafolkken/kit#3974).
52
+ async function retry_cause(
53
+ child: string,
54
+ output: string | undefined,
55
+ ): Promise<'api' | 'exempt' | undefined> {
56
+ if (await run_merge_restart.is_host_restart(child, output)) return 'exempt'
57
+
58
+ if (read_is_outage(output)) return 'api'
59
+
60
+ return (await run_merge_ship.is_unanswered(child, output)) ? 'exempt' : undefined
61
+ }
62
+
63
+ // An outage child is re-dispatched only so many times: one that ends the same way on every dispatch is
64
+ // parked, since merges in other lanes reset the run-wide outage streak and would never stop it.
65
+ async function read_retryable(
66
+ child: string,
67
+ output: string | undefined,
68
+ ): Promise<{ is_outage: boolean; is_streak_exempt: boolean }> {
69
+ const cause = await retry_cause(child, output)
70
+
71
+ if (cause === undefined) return { is_outage: false, is_streak_exempt: false }
72
+
73
+ const is_outage = (await child_outages(child)) < run_merge.CONSECUTIVE_OUTAGE_LIMIT
74
+
75
+ return { is_outage, is_streak_exempt: is_outage && cause === 'exempt' }
76
+ }
77
+
78
+ // The timeline is read only for an OPEN, unparked child — the one classification a merged closing pull
79
+ // request changes. A CLOSED child was closed by GitHub, so it must carry no `merged_pr` for
80
+ // `do_merged` to close again.
81
+ async function read_merged_pr(child: string, read: IssueRead): Promise<string | undefined> {
82
+ if (read.kind !== 'state' || run_merge.classify_child(read.state) !== 'failed') return undefined
83
+
84
+ return await issue_closing_pr.read_closing_pr(child)
85
+ }
86
+
87
+ // A child that merged before `lane:withdraw` stopped it is merged, not withdrawn: the withdrawal's
88
+ // event is already written, so only the timeline tells its merged close from the not-planned one. An
89
+ // unread timeline answers `undefined`, and `outcome_of` asks again rather than guessing.
90
+ async function read_is_withdrawn(child: string, read: IssueRead): Promise<boolean | undefined> {
91
+ const events = await run_event_stream_emit.current_events()
92
+
93
+ if (!run_event_scope.is_withdrawn(events, child)) return false
94
+ if (read.kind !== 'state' || run_merge.classify_child(read.state) !== 'merged') return true
95
+ const is_merged = await issue_merged.read_merge_state(child)
96
+
97
+ return is_merged === undefined ? undefined : !is_merged
98
+ }
99
+
100
+ async function read_signals(ctx: MergeContext, read: IssueRead): Promise<EndingSignals> {
101
+ const [is_cut, merged_pr, retryable, is_withdrawn] = await Promise.all([
102
+ run_merge_steps.has_resumable_cut(ctx.child),
103
+ read_merged_pr(ctx.child, read),
104
+ read_retryable(ctx.child, ctx.output),
105
+ read_is_withdrawn(ctx.child, read),
106
+ ])
107
+
108
+ const is_auth_failure = read_is_auth_failure(ctx.output)
109
+
110
+ return { ...retryable, is_cut, merged_pr, is_withdrawn, is_auth_failure }
111
+ }
112
+
113
+ // An unread state is `unresolved` unless a withdrawal already settled the child, which is read locally;
114
+ // a withdrawn child whose timeline could not tell its merge (`is_withdrawn` unset) is `unresolved` too.
115
+ function outcome_of(read: IssueRead, signals: EndingSignals): ChildOutcome {
116
+ if (signals.is_withdrawn === undefined) return 'unresolved'
117
+
118
+ return run_merge.classify_child(read.kind === 'state' ? read.state : undefined, signals)
119
+ }
120
+
121
+ const run_merge_signals = { outcome_of, read_merged_pr, read_signals }
122
+
123
+ export { run_merge_signals }
@@ -1,11 +1,14 @@
1
1
  import { existsSync } from 'node:fs'
2
2
  import path from 'node:path'
3
- import { git_followup_issue_close } from '#scripts/followup/git-followup-issue-close'
4
3
  import { git_gh_command } from '#scripts/gh/git-gh-command'
5
4
  import { git_gh_issue_write } from '#scripts/gh/git-gh-issue-write'
6
5
  import { git_stash } from '#scripts/git/stash/git-stash'
7
6
  import { issue_cite } from '#scripts/issue/issue-cite'
8
- import { NEEDS_DECISION_LABEL } from '#scripts/issue/issue-labels'
7
+ import { has_label_name, NOT_BEFORE_LABEL, RUN_STALLED_LABEL } from '#scripts/issue/issue-labels'
8
+ import { issue_not_before } from '#scripts/issue/issue-not-before'
9
+ import { issue_park } from '#scripts/issue/issue-park'
10
+ import { issue_sample_gate } from '#scripts/issue/issue-sample-gate'
11
+ import { issue_state_cli } from '#scripts/issue/issue-state-cli'
9
12
  import { session_cite } from '#scripts/issue/session-cite'
10
13
  import { josh_command, type JoshResult } from '#scripts/josh/josh-run'
11
14
  import { lane_close } from '#scripts/lane/lane-close'
@@ -23,8 +26,10 @@ import {
23
26
  } from '#scripts/run/carry/run-carry'
24
27
  import { run_carry_conversation } from '#scripts/run/carry/run-carry-conversation'
25
28
  import { run_cut, type RunCut } from '#scripts/run/cut/run-cut'
29
+ import { run_stalled, type StallCause } from '#scripts/run/park/run-stalled'
26
30
  import { run_label } from '#scripts/run/run-label'
27
31
  import { run_merge } from './run-merge'
32
+ import { run_merge_close } from './run-merge-close'
28
33
  import { run_merge_ship } from './run-merge-ship'
29
34
 
30
35
  // The result of attempting to apply a carry change. Distinguishing `refused` from `applied` lets
@@ -48,14 +53,8 @@ const LANES = '--lanes'
48
53
  const REPO_FLAG = '--repo'
49
54
  const LANE_CLOSE_OCCASION = 'lane close'
50
55
  const GIT_ENTRY = '.git'
51
- const MERGE_CLOSER = 'pnpm josh run:merge'
52
- const SINGLE_READ = { attempts: 1, interval_ms: 0 }
53
56
  const OPEN_STATE = 'OPEN'
54
57
  const SYNC_RETRY = { attempts: 3, interval_ms: 5000 }
55
- // What the driver judged when it parks a child, stated on the issue.
56
- const FAILED_CAUSE = 'the child’s session ended with its issue still open and unfinished.'
57
- const CUT_RELAUNCH_CAUSE =
58
- 'its lane held a declared cut, but no successor could be relaunched from it (or it already was once).'
59
58
 
60
59
  // One returned child's context, gathered from the command line by the CLI.
61
60
  interface MergeContext {
@@ -73,6 +72,9 @@ interface MergeContext {
73
72
  // The merged pull request that closes the child, when GitHub left the child OPEN after the merge —
74
73
  // the one `merged` child whose issue this command still has to close.
75
74
  merged_pr?: string | undefined
75
+ // The outage is not an API outage (`EndingSignals.is_streak_exempt`): re-dispatched, but not added
76
+ // to the streak.
77
+ is_streak_exempt?: boolean | undefined
76
78
  }
77
79
 
78
80
  interface FailedResult {
@@ -81,12 +83,16 @@ interface FailedResult {
81
83
  // Set when the carry record refused the count because this session is not its owner. The caller
82
84
  // surfaces this as a hard failure rather than continuing.
83
85
  is_refused: boolean
84
- // The open `blocked-by` blockers the child was released to wait on, cited — empty for a child that
85
- // was parked (or refused) instead.
86
- blockers: ReadonlyArray<string>
86
+ // What the child was released to wait on — its open `blocked-by` blockers, cited, and a start date
87
+ // still ahead — empty for a child that was parked (or refused) instead.
88
+ waits: ReadonlyArray<string>
89
+ // The short name of why a parked child was parked, which its park event carries.
90
+ cause?: string | undefined
87
91
  }
88
92
 
89
- const NO_BLOCKERS: ReadonlyArray<string> = []
93
+ const NO_WAITS: ReadonlyArray<string> = []
94
+ // The wait a `not-before` label alone records: the label carries no date, only that one is ahead.
95
+ const NOT_BEFORE_WAIT = 'a start date still ahead (`not-before`)'
90
96
 
91
97
  // A captured `pnpm josh` subprocess: its output is read back rather than inherited, and a non-zero
92
98
  // exit is a value to branch on rather than a throw. The step's stderr stays piped here — `run:merge`
@@ -165,8 +171,17 @@ async function sync_main(): Promise<void> {
165
171
  if (!is_synced) throw new Error(`main:sync failed: ${error_output}`)
166
172
  }
167
173
 
174
+ // `lane:close` says on stderr what it terminated — the child and whatever else ran from the checkout
175
+ // (joshuafolkken/kit#4304) — so that stderr is passed on rather than dropped with the capture. An
176
+ // `incomplete` close — a process that outlived even a SIGKILL — is logged and the run carries on: the
177
+ // merge cannot be undone, and the supervisor closes the lane again each pass until it ends
178
+ // (joshuafolkken/kit#4300).
168
179
  async function close_lane(child: string): Promise<void> {
169
- await josh(['lane:close', child])
180
+ const result = await josh(['lane:close', child])
181
+ const said = result.err?.trimEnd() ?? ''
182
+
183
+ if (said !== '') console.error(said)
184
+ if (result.code !== 0) console.error(`${session_cite.issue(child)}: lane:close is incomplete`)
170
185
  }
171
186
 
172
187
  async function stash_work(child: string, directory: string): Promise<void> {
@@ -202,22 +217,30 @@ function kept_lane_comment(directory: string): string {
202
217
  return `The split left this issue's lane open: it still holds a commit, an uncommitted change or a live process — ${directory}`
203
218
  }
204
219
 
205
- // A child promoted to an epic by a split leaves its lane holding a seat: the epic root is never
206
- // dispatched again, so nothing else would ever close it. The lane is closed only when it holds
207
- // nothing — no commit, no change, no live process (`lane_vacant`); any other lane is kept, and why is
208
- // stated on the issue.
209
- async function close_split_lane(child: string): Promise<void> {
220
+ // A child that ended without a merge closes its lane only when the lane holds nothing — no commit, no
221
+ // change, no live process (`lane_vacant`); any other lane is kept for whoever resumes the issue.
222
+ // Returns the kept lane, `undefined` where there was none or it was closed. joshuafolkken/kit#4028:
223
+ // three children that ended doing nothing left lanes that filled the limit.
224
+ async function close_vacant_lane(child: string): Promise<LaneInfo | undefined> {
210
225
  const lane = await lane_registry.find_open_lane(child)
211
226
 
212
- if (lane === undefined) return
227
+ if (lane === undefined) return undefined
213
228
 
214
- if (await lane_vacant.is_vacant(lane)) {
215
- await close_lane(child)
229
+ if (!(await lane_vacant.is_vacant(lane))) return lane
216
230
 
217
- return
218
- }
231
+ await close_lane(child)
232
+
233
+ return undefined
234
+ }
235
+
236
+ // A child promoted to an epic by a split leaves its lane holding a seat: the epic root is never
237
+ // dispatched again, so nothing else would ever close it. A lane it keeps is stated on the issue.
238
+ async function close_split_lane(child: string): Promise<void> {
239
+ const kept = await close_vacant_lane(child)
219
240
 
220
- await git_gh_issue_write.issue_try_comment(child, kept_lane_comment(lane.directory))
241
+ if (kept !== undefined) {
242
+ await git_gh_issue_write.issue_try_comment(child, kept_lane_comment(kept.directory))
243
+ }
221
244
  }
222
245
 
223
246
  // The progress comment is a human-readable mirror of the carry record, so it is best-effort and only
@@ -228,25 +251,8 @@ async function post_counters(ctx: MergeContext, carry: RunCarry | undefined): Pr
228
251
  await git_gh_issue_write.issue_try_comment(ctx.epic, run_merge.counters_comment(carry))
229
252
  }
230
253
 
231
- // A child merged while GitHub left it OPEN is closed here, through the one close `followup` uses
232
- // The state was just read OPEN, so it is read once rather than waited on. A
233
- // close that fails is reported with its recovery and does not undo the merge being counted.
234
- async function close_merged_open(ctx: MergeContext): Promise<void> {
235
- if (ctx.merged_pr === undefined) return
236
-
237
- try {
238
- await git_followup_issue_close.ensure_issue_closed(
239
- { issue_number: ctx.child, pr_url: ctx.merged_pr, closer: MERGE_CLOSER },
240
- SINGLE_READ,
241
- )
242
- } catch {
243
- console.error(
244
- `${session_cite.issue(ctx.child)}: could not be closed — ${git_followup_issue_close.CLOSE_RECOVERY}`,
245
- )
246
- }
247
- }
248
-
249
- // A merged child: count the merge (which resets the failure streak), return to the default branch,
254
+ // A merged child: close it if GitHub left it OPEN and close the epics it completed
255
+ // (`run-merge-close.ts`), count the merge (which resets the failure streak), return to the default branch,
250
256
  // 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
251
257
  // fails — the caller treats a non-undefined return as a hard refusal and must not offer a next child.
252
258
  // Returns `undefined` on success.
@@ -255,7 +261,7 @@ async function do_merged(ctx: MergeContext): Promise<RunCarry | undefined> {
255
261
 
256
262
  if (refused !== undefined) return refused
257
263
 
258
- await close_merged_open(ctx)
264
+ await run_merge_close.close_merged(ctx)
259
265
  await sync_main()
260
266
  const result = await apply_carry(ctx, {
261
267
  ...run_merge.change_of('merged'),
@@ -270,8 +276,17 @@ async function do_merged(ctx: MergeContext): Promise<RunCarry | undefined> {
270
276
  return undefined
271
277
  }
272
278
 
279
+ // A child that ended without a merge: end whatever of its process still runs, drop its stale
280
+ // `in-progress`, and close its lane if the child left nothing in it. The reap comes first, so the lane
281
+ // reads with no live process.
282
+ async function release_child(child: string): Promise<void> {
283
+ lane_reap.reap_child(await lane_registry.lane_location(child))
284
+ await run_label.unmark(child)
285
+ await close_vacant_lane(child)
286
+ }
287
+
273
288
  function refused_result(carry: RunCarry): FailedResult {
274
- return { carry, is_parked: false, is_refused: true, blockers: NO_BLOCKERS }
289
+ return { carry, is_parked: false, is_refused: true, waits: NO_WAITS }
275
290
  }
276
291
 
277
292
  // The child's open `blocked-by` blockers, cited. A read that fails answers none, so the child is
@@ -284,66 +299,89 @@ async function open_blockers(child: string): Promise<ReadonlyArray<string>> {
284
299
  .filter((blocker) => blocker.state === OPEN_STATE)
285
300
  .map((blocker) => issue_cite.plain(blocker.number, blocker.repo))
286
301
  } catch {
287
- return NO_BLOCKERS
302
+ return NO_WAITS
288
303
  }
289
304
  }
290
305
 
291
- // A child that ended unfinished while an open blocker it records still has to land first is waiting,
292
- // not failed: nothing is counted and `needs-decision` is not applied — the
293
- // order is already recorded, so there is nothing for a person to decide — and its stale `in-progress`
294
- // is dropped so the offer hands it back on its own once the blockers merge. The ownership guard is
295
- // still asked, so a session that does not own the run cannot release a child it never dispatched.
296
- async function do_waiting(
297
- ctx: MergeContext,
298
- blockers: ReadonlyArray<string>,
299
- ): Promise<FailedResult> {
306
+ // Whether the child carries `not-before` — the body's start date copied to a label. Read only where the
307
+ // body could not be: the body is the source, so a label it no longer backs is never a wait.
308
+ async function has_not_before_label(ctx: MergeContext): Promise<boolean> {
309
+ const read = await issue_state_cli.read_issue(ctx.child, ctx.repo)
310
+
311
+ return read.kind === 'state' && has_label_name(read.state.labels, NOT_BEFORE_LABEL)
312
+ }
313
+
314
+ // The child's declared start date while it is still ahead (joshuafolkken/kit#4076), or its `not-before`
315
+ // label when the body could not be read (joshuafolkken/kit#4102), or the samples it still waits on. A
316
+ // due date or none answers none, so the child is parked as before.
317
+ async function start_date_wait(ctx: MergeContext): Promise<ReadonlyArray<string>> {
318
+ const body = await git_gh_command.issue_get_body(ctx.child, ctx.repo)
319
+
320
+ if (body === undefined) return (await has_not_before_label(ctx)) ? [NOT_BEFORE_WAIT] : NO_WAITS
321
+
322
+ await issue_sample_gate.prime([body])
323
+ const reason = issue_not_before.waiting_reason(body)
324
+
325
+ return reason === undefined ? NO_WAITS : [reason]
326
+ }
327
+
328
+ // A child that ended unfinished while an open blocker it records still has to land first, or while
329
+ // its declared start date is still ahead, is waiting, not failed: nothing is counted and
330
+ // `needs-decision` is not applied — when it runs is already recorded, so there is nothing for a person
331
+ // to decide — and its stale `in-progress` is dropped so the offer hands it back on its own once the
332
+ // blockers merge and the date arrives. The ownership guard is still asked, so a session that does not
333
+ // own the run cannot release a child it never dispatched.
334
+ async function do_waiting(ctx: MergeContext, waits: ReadonlyArray<string>): Promise<FailedResult> {
300
335
  const refused = await refused_carry(ctx)
301
336
 
302
337
  if (refused !== undefined) return refused_result(refused)
303
338
 
304
- lane_reap.reap_child(ctx.child)
305
- await run_label.unmark(ctx.child)
306
- await git_gh_issue_write.issue_try_comment(ctx.child, run_merge.waiting_comment(blockers))
339
+ await release_child(ctx.child)
340
+ await git_gh_issue_write.issue_try_comment(ctx.child, run_merge.waiting_comment(waits))
307
341
 
308
- return { carry: undefined, is_parked: false, is_refused: false, blockers }
342
+ return { carry: undefined, is_parked: false, is_refused: false, waits }
309
343
  }
310
344
 
311
345
  // A failed child: count the failure, end whatever of its process is still running (a child judged
312
346
  // abandoned that hung on a wait loop would otherwise answer the pgrep liveness check `alive` for its
313
- // issue number forever), drop the stale `in-progress`, and park it with `needs-decision` so the next
314
- // offer does not hand the same child straight back. Returns the record so the caller can read the
315
- // streak against the guard. Returns `is_refused: true` without touching labels when the carry record
347
+ // issue number forever), drop the stale `in-progress`, and park it with `run:stalled` so the next
348
+ // offer does not hand the same child straight back. Not `needs-decision`: the failure is mechanical,
349
+ // and nothing is asked of a person but to fix its cause (joshuafolkken/kit#4102). Returns the record
350
+ // so the caller can read the streak against the guard. Returns `is_refused: true` without touching labels when the carry record
316
351
  // rejected the count. A park is always explained on the issue — `cause` says what was judged, and the
317
352
  // comment what was read and what a person does next.
318
- async function park_failed(ctx: MergeContext, cause: string): Promise<FailedResult> {
353
+ async function park_failed(ctx: MergeContext, cause: StallCause): Promise<FailedResult> {
319
354
  const result = await apply_carry(ctx, run_merge.change_of('failed'))
320
355
 
321
356
  if (result.kind === 'refused') return refused_result(result.carry)
322
357
 
323
358
  const carry = result.kind === 'applied' ? result.carry : undefined
324
359
 
325
- lane_reap.reap_child(ctx.child)
326
- await run_label.unmark(ctx.child)
327
- const is_parked = await git_gh_issue_write.issue_add_label(ctx.child, NEEDS_DECISION_LABEL)
328
-
329
- if (is_parked) {
330
- const reason = { child: ctx.child, cause, carry, output: ctx.output }
360
+ await release_child(ctx.child)
361
+ const reason = { child: ctx.child, cause: cause.why, carry, output: ctx.output }
362
+ const park = await issue_park.apply(ctx.child, RUN_STALLED_LABEL, run_merge.park_comment(reason))
331
363
 
332
- await git_gh_issue_write.issue_try_comment(ctx.child, run_merge.park_comment(reason))
364
+ return {
365
+ carry,
366
+ is_parked: park.is_labelled,
367
+ is_refused: false,
368
+ waits: NO_WAITS,
369
+ cause: cause.short,
333
370
  }
334
-
335
- return { carry, is_parked, is_refused: false, blockers: NO_BLOCKERS }
336
371
  }
337
372
 
338
- // A child that ended unfinished: waiting when it records an open blocker (`do_waiting`), parked
339
- // otherwise (`park_failed`) — an order already recorded is never a decision for a person. Without a
340
- // cause of the caller's, a child whose detached ship ended is parked for the ship's stop.
341
- async function do_failed(ctx: MergeContext, cause?: string): Promise<FailedResult> {
342
- const blockers = await open_blockers(ctx.child)
373
+ // A child that ended unfinished: waiting when it records an open blocker or a start date still ahead
374
+ // (`do_waiting`), parked otherwise (`park_failed`) — a recorded order or date is never a decision for a
375
+ // person. Without a cause of the caller's, a child whose detached ship ended is parked for the ship's
376
+ // stop.
377
+ async function do_failed(ctx: MergeContext, cause?: StallCause): Promise<FailedResult> {
378
+ const waits = [...(await open_blockers(ctx.child)), ...(await start_date_wait(ctx))]
379
+
380
+ if (waits.length > 0) return await do_waiting(ctx, waits)
343
381
 
344
- if (blockers.length > 0) return await do_waiting(ctx, blockers)
382
+ const judged = cause ?? run_merge_ship.cause(ctx.child) ?? run_stalled.SESSION_UNFINISHED
345
383
 
346
- return await park_failed(ctx, cause ?? run_merge_ship.cause(ctx.child) ?? FAILED_CAUSE)
384
+ return await park_failed(ctx, judged)
347
385
  }
348
386
 
349
387
  // The outcome of counting an outage: the record to read the streak against, and whether the count was
@@ -359,13 +397,20 @@ interface OutageResult {
359
397
  // the child, so it is re-dispatchable in the same run. Returns the record so the caller can read the
360
398
  // outage streak against its guard. Returns `is_refused: true` without touching labels when the carry
361
399
  // record rejected the count.
400
+ async function count_outage(ctx: MergeContext): Promise<ApplyCarryResult> {
401
+ if (ctx.is_streak_exempt !== true) return await apply_carry(ctx, run_merge.change_of('outage'))
402
+
403
+ const refused = await refused_carry(ctx)
404
+
405
+ return refused === undefined ? { kind: 'none' } : { kind: 'refused', carry: refused }
406
+ }
407
+
362
408
  async function do_outage(ctx: MergeContext): Promise<OutageResult> {
363
- const result = await apply_carry(ctx, run_merge.change_of('outage'))
409
+ const result = await count_outage(ctx)
364
410
 
365
411
  if (result.kind === 'refused') return { carry: result.carry, is_refused: true }
366
412
 
367
- lane_reap.reap_child(ctx.child)
368
- await run_label.unmark(ctx.child)
413
+ await release_child(ctx.child)
369
414
 
370
415
  return { carry: result.kind === 'applied' ? result.carry : undefined, is_refused: false }
371
416
  }
@@ -442,9 +487,9 @@ async function ask_next(ctx: MergeContext): Promise<string> {
442
487
  }
443
488
 
444
489
  const run_merge_steps = {
445
- CUT_RELAUNCH_CAUSE,
446
490
  ask_next,
447
491
  close_split_lane,
492
+ release_child,
448
493
  do_failed,
449
494
  do_merged,
450
495
  do_outage,