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