@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,18 +1,21 @@
1
1
  #!/usr/bin/env tsx
2
2
  import { fileURLToPath } from 'node:url'
3
- import { issue_number_shape } from '#scripts/issue/issue-number-shape'
4
3
  import { lane_child_marker } from '#scripts/lane/lane-child-marker'
5
4
  import { lane_ledger } from '#scripts/lane/lane-ledger'
6
- import { cli_flags } from '#scripts/lib/cli-flags'
5
+ import { review_stop_log } from '#scripts/review/review-stop-log'
7
6
  import { run_event_stream } from '#scripts/run/event/run-event-stream'
8
7
  import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
9
8
  import { run_ship, type ShipSection } from './run-ship'
9
+ import { run_ship_args } from './run-ship-args'
10
+ import { run_ship_body_draft } from './run-ship-body-draft'
10
11
  import { run_ship_detach } from './run-ship-detach'
11
- import { run_ship_pre_detach } from './run-ship-pre-detach'
12
+ import { run_ship_infra_retry } from './run-ship-infra-retry'
13
+ import { run_ship_pre_detach_timed } from './run-ship-pre-detach-timed'
12
14
  import { run_ship_probe } from './run-ship-probe'
13
15
  import { run_ship_return } from './run-ship-return'
14
16
  import { run_ship_stage, type Phase, type ShipState, type Stage } from './run-ship-stage'
15
17
  import { run_ship_steps, type ShipArguments, type Step } from './run-ship-steps'
18
+ import { run_ship_stop_cause } from './run-ship-stop-cause'
16
19
 
17
20
  // `josh ship "<title> #<N>"` — one call for the fixed commit-to-report region a run ships a change on.
18
21
  // It runs `gate`, `git -y`, `followup` and `run:tail` internally, so no round trip re-bills a lane's
@@ -38,51 +41,17 @@ import { run_ship_steps, type ShipArguments, type Step } from './run-ship-steps'
38
41
  // the agent ends at the hand-off instead of relaunching itself for the gate, a supervised ship that stops
39
42
  // hands the stage back (`run-ship-return.ts`), and `--log <N>` prints the report it stopped on.
40
43
  //
41
- // The first positional is the `"<title> #<N>"` string `git -y` and `followup` already take; the issue
42
- // number is read off its tail for `run:tail`. Any further positionals are follow-up citations filed
43
- // this run (`fullrun-steps.md` routes branch-2 filing before `ship`), forwarded to `run:tail` after the
44
- // closed issue so `issue:cite` reports them too. A notify body — `--notify-message` or the
45
- // shell-body-safe `--notify-message-file` — is forwarded to `followup` alone; the completion prose is
46
- // composed before this command and passed straight through.
44
+ // The command line it takes is read in `run-ship-args.ts`.
47
45
 
48
46
  const ARGV_OFFSET = 2
49
47
  const SUCCESS_EXIT_CODE = 0
50
48
  const FAILURE_EXIT_CODE = 1
51
- const FIRST = 0
52
- const NUMBER_GROUP = 1
53
- const EXTRA_CITE_START = 1
54
- // The issue reference at the tail of the title — `git -y` and `followup` read the whole string, and
55
- // `run:tail` needs the number alone.
56
- const TRAILING_ISSUE_PATTERN = /#([1-9]\d*)\s*$/u
57
- // Both body forms `followup` documents, forwarded verbatim: the inline `--notify-message` and the
58
- // shell-body-safe `--notify-message-file` a body naming a command or path must use (`followup.md`).
59
- const NOTIFY_OPTIONS = ['notify-message', 'notify-message-file'] as const
60
- // The PR body carrying the live-execution evidence `followup` gates the merge
61
- // on, forwarded to `git -y` as a path because it holds commands and their output.
62
- const BODY_FILE_OPTION = 'body-file'
63
49
  const USAGE =
64
50
  'Usage: josh ship "<title> #<N>" [<follow-up-N> ...] [--cite <N> ...] [--review] [--detach] [--body-file <path>] [--notify-message <text> | --notify-message-file <path>] | josh ship --log <N>'
65
51
  const NO_LOG_NOTE = 'no detached ship supervisor log for this issue'
66
52
  const LANE_CHILD_DETACH_NOTE =
67
53
  'lane child: shipping through the detached supervisor (--detach implied), so the end of this turn cannot kill it'
68
54
 
69
- type NotifyValues = Partial<Record<(typeof NOTIFY_OPTIONS)[number], string>>
70
-
71
- const OPTIONS = {
72
- [NOTIFY_OPTIONS[0]]: { type: 'string' },
73
- [NOTIFY_OPTIONS[1]]: { type: 'string' },
74
- [BODY_FILE_OPTION]: { type: 'string' },
75
- review: { type: 'boolean' },
76
- // Hand the region to a detached supervisor (`run-ship-detach.ts`), print the
77
- // report a stopped supervisor left, and carry follow-up citations as options so the supervisor's
78
- // command line still ends with its title.
79
- detach: { type: 'boolean' },
80
- log: { type: 'string' },
81
- cite: { type: 'string', multiple: true },
82
- } as const
83
-
84
- type ShipCommand = { kind: 'ship'; args: ShipArguments } | { kind: 'log'; number: string }
85
-
86
55
  // What a resumed ship knows before its first stage: the record's path (absent outside a repository),
87
56
  // the stages it says completed, and the repository's actual state (`run-ship-stage.ts` decides from it).
88
57
  // `started` opens with the stages the record says this attempt started — a supervisor that ended
@@ -94,87 +63,7 @@ interface ShipContext {
94
63
  started: Array<string>
95
64
  }
96
65
 
97
- // The notify tail `followup` takes — whichever body form the caller composed, forwarded unchanged so a
98
- // path-based body reaches `followup` exactly as passed.
99
- function notify_arguments(values: NotifyValues): ReadonlyArray<string> {
100
- return NOTIFY_OPTIONS.flatMap((option) => {
101
- const value = values[option]
102
-
103
- return value === undefined ? [] : [`--${option}`, value]
104
- })
105
- }
106
-
107
- function body_arguments(path: string | undefined): ReadonlyArray<string> {
108
- return path === undefined ? [] : [`--${BODY_FILE_OPTION}`, path]
109
- }
110
-
111
- const { PHASE } = run_ship_stage
112
-
113
- function issue_number(title: string): string | undefined {
114
- return TRAILING_ISSUE_PATTERN.exec(title)?.[NUMBER_GROUP]
115
- }
116
-
117
- interface ParsedValues extends NotifyValues {
118
- [BODY_FILE_OPTION]?: string
119
- review?: boolean
120
- detach?: boolean
121
- log?: string
122
- cite?: Array<string>
123
- }
124
-
125
- // A follow-up citation passed as a trailing positional is a bare issue number, so a stray flag is
126
- // refused rather than forwarded to the wrong step.
127
- function ship_args(
128
- title: string,
129
- rest: ReadonlyArray<string>,
130
- values: ParsedValues,
131
- ): ShipArguments | undefined {
132
- const number = issue_number(title)
133
- const cites = [...rest, ...(values.cite ?? [])]
134
-
135
- if (number === undefined || cites.some((token) => !issue_number_shape.is_issue_number(token))) {
136
- return undefined
137
- }
138
-
139
- return {
140
- title,
141
- number,
142
- notify: notify_arguments(values),
143
- body: body_arguments(values[BODY_FILE_OPTION]),
144
- body_path: values[BODY_FILE_OPTION],
145
- cites,
146
- is_review: values.review === true,
147
- is_detach: values.detach === true,
148
- }
149
- }
150
-
151
- // `--log <N>` stands alone: a bare issue number and nothing to ship.
152
- function log_command(number: string, positionals: ReadonlyArray<string>): ShipCommand | undefined {
153
- return issue_number_shape.ISSUE_NUMBER_PATTERN.test(number) && positionals.length === 0
154
- ? { kind: 'log', number }
155
- : undefined
156
- }
157
-
158
- function command_of(
159
- values: ParsedValues,
160
- positionals: ReadonlyArray<string>,
161
- ): ShipCommand | undefined {
162
- if (values.log !== undefined) return log_command(values.log, positionals)
163
-
164
- const title = positionals[FIRST]
165
- const args =
166
- title === undefined ? undefined : ship_args(title, positionals.slice(EXTRA_CITE_START), values)
167
-
168
- return args === undefined ? undefined : { kind: 'ship', args }
169
- }
170
-
171
- // Numbers-only tail and a strict parse, so a title with no `#<N>` or a stray flag is refused rather
172
- // than shipped past the wrong step.
173
- function parse(argv: ReadonlyArray<string>): ShipCommand | undefined {
174
- const parsed = cli_flags.arguments_of(argv, OPTIONS)
175
-
176
- return parsed === undefined ? undefined : command_of(parsed.values, parsed.positionals)
177
- }
66
+ const { PHASE, STAGE } = run_ship_stage
178
67
 
179
68
  // Every stage that ran is timed into the lane ledger, failed ones included — a stage that stopped the
180
69
  // ship cost the lane its time as well. The append is local and best-effort, so it adds no wait.
@@ -186,15 +75,26 @@ async function record_timed(step: Step, issue: string, elapsed_ms: number): Prom
186
75
  await lane_ledger.record_stage({ stage: step.stage, elapsed_ms, issue: Number(issue) })
187
76
  }
188
77
 
189
- async function run_step(step: Step, args: ShipArguments, state: ShipState): Promise<ShipSection> {
78
+ async function run_once(step: Step, args: ShipArguments, state: ShipState): Promise<ShipSection> {
190
79
  const started_ms = performance.now()
191
80
  const result = await step.run(args, state)
192
81
  const elapsed_ms = performance.now() - started_ms
193
82
 
194
83
  if (result.is_skipped !== true) await record_timed(step, args.number, elapsed_ms)
195
- const section = { header: step.header, body: result.out, code: result.code }
196
84
 
197
- return result.conflicts === undefined ? section : { ...section, conflicts: result.conflicts }
85
+ return run_ship.section_of(step.header, result)
86
+ }
87
+
88
+ // A stage that stopped on the infrastructure runs again in place before it stops the ship. A retry
89
+ // re-reads the state, as a resumed ship does: a commit whose push failed is not made a second time.
90
+ async function run_step(step: Step, args: ShipArguments, state: ShipState): Promise<ShipSection> {
91
+ const first = [state]
92
+
93
+ return await run_ship_infra_retry.retried(step.stage, async () => {
94
+ const current = first.pop() ?? (await run_ship_probe.read_state())
95
+
96
+ return await run_once(step, args, current)
97
+ })
198
98
  }
199
99
 
200
100
  async function emit_phase(
@@ -237,6 +137,12 @@ async function settle(
237
137
  })
238
138
  }
239
139
 
140
+ // A function of its own so the write does not sit after an `await`, where `require-atomic-updates`
141
+ // reads it as a possible race — the reason `held-mark.ts` gives `set_held_mark`.
142
+ function set_state(context: ShipContext, state: ShipState): void {
143
+ context.state = state
144
+ }
145
+
240
146
  // One stage: passed over when the record and the state say it is done, run and recorded otherwise.
241
147
  async function run_stage(
242
148
  step: Step,
@@ -257,6 +163,8 @@ async function run_stage(
257
163
  const section = await run_step(step, args, context.state)
258
164
 
259
165
  await settle(step, args, context, section.code)
166
+ // A review may fix the tree and refreshes the brief, so the stages after it read the state anew.
167
+ if (step.stage === STAGE.REVIEW) set_state(context, await run_ship_probe.read_state())
260
168
 
261
169
  return section
262
170
  }
@@ -270,19 +178,22 @@ async function open_context(args: ShipArguments): Promise<ShipContext> {
270
178
  const done = target === undefined ? new Set<string>() : run_ship_stage.read_done(target)
271
179
  const started = target === undefined ? [] : [...run_ship_stage.read_started(target)]
272
180
 
181
+ // A supervisor that died mid-followup left its wait marked; this one waits on nothing yet.
182
+ record(target, (path) => {
183
+ run_ship_stage.clear_waits(path)
184
+ })
185
+
273
186
  return { target, done, state, started }
274
187
  }
275
188
 
276
189
  // Every stop goes to the lane ledger — supervised, in an agent's own turn, or a lane child's preflight
277
- // before the hand-off — so `lane:stats` can say how long a ship stayed stopped for each reason.
278
- async function record_stop(
279
- args: ShipArguments,
280
- stage: Stage,
281
- conflicts?: ReadonlyArray<string>,
282
- ): Promise<void> {
283
- const reason = run_ship_stage.stop_reason(stage, conflicts)
190
+ // before the hand-off — so `lane:stats` can say how long a ship stayed stopped for each reason. A review
191
+ // stop's deciding findings also go, whole, to the durable stop log `review:stops` reads.
192
+ async function record_stop(args: ShipArguments, stage: Stage, failed?: ShipSection): Promise<void> {
193
+ const issue = Number(args.number)
284
194
 
285
- await lane_ledger.record_stop({ issue: Number(args.number), reason })
195
+ await lane_ledger.record_stop(run_ship_stop_cause.record_of(issue, stage, failed))
196
+ review_stop_log.record({ issue, stage, findings: run_ship_stop_cause.details_of(stage, failed) })
286
197
  }
287
198
 
288
199
  // A detached supervisor hands the stopped stage back (`run-ship-return.ts`); a
@@ -296,7 +207,7 @@ async function stopped(
296
207
  ): Promise<ReadonlyArray<ShipSection>> {
297
208
  const failed = sections.at(-1)
298
209
 
299
- await record_stop(args, step.stage, failed?.conflicts)
210
+ await record_stop(args, step.stage, failed)
300
211
 
301
212
  if (run_ship_detach.is_supervised()) {
302
213
  record(context.target, run_ship_stage.end_attempt)
@@ -372,23 +283,35 @@ function should_detach(args: ShipArguments): boolean {
372
283
  return !run_ship_detach.is_supervised() && lane_child_marker.is_child_of(process.cwd())
373
284
  }
374
285
 
286
+ // The preflight stop's unmet kinds, with `pre-detach` added when those checks went red beside it.
287
+ function with_checks(stop: ShipSection, checks: ShipSection): ShipSection {
288
+ if (checks.code === SUCCESS_EXIT_CODE) return stop
289
+
290
+ return { ...stop, preconditions: [...(stop.preconditions ?? []), lane_ledger.PRE_DETACH_STAGE] }
291
+ }
292
+
375
293
  // The preflight is deterministic and fast, so it runs here, in the agent's own turn, before the
376
294
  // hand-off — a stop it finds is fixed by the same session instead of relaunching one from the
377
295
  // supervisor. Only the slow stages go to the supervisor, which re-asks the preflight itself. The fast
378
296
  // checks (`run-ship-pre-detach.ts`) follow it here for the same reason; they are not a stage, so the
379
- // supervisor's gate runs them again rather than passing over them.
297
+ // supervisor's gate runs them again rather than passing over them. They run even when the preflight
298
+ // refused, so one ship reports every failure there is to fix (joshuafolkken/kit#4305); the preflight's
299
+ // refusal still comes before its own scoped pair, the one heavy check here.
300
+ //
301
+ // **The refusal is printed last**: a lane child reading the report through `tail` saw only the red
302
+ // metrics or type check after it, fixed those, and shipped into the same refusal again — every repeated
303
+ // preflight stop of joshuafolkken/kit#4478. The stop records the pre-detach checks' red beside the
304
+ // unmet kinds, so the ledger shows which refusals came with one.
380
305
  async function pre_detach_sections(args: ShipArguments): Promise<ReadonlyArray<ShipSection>> {
381
306
  const preflight = await run_stage(run_ship_steps.PREFLIGHT_STEP, args, await open_context(args))
307
+ const result = await run_ship_pre_detach_timed.checks(args.number)
308
+ const checks = { header: run_ship.PRE_DETACH_HEADER, body: result.out, code: result.code }
382
309
 
383
310
  if (preflight.code !== SUCCESS_EXIT_CODE) {
384
- await record_stop(args, run_ship_steps.PREFLIGHT_STEP.stage)
385
-
386
- return [preflight]
311
+ await record_stop(args, run_ship_steps.PREFLIGHT_STEP.stage, with_checks(preflight, checks))
387
312
  }
388
313
 
389
- const result = await run_ship_pre_detach.checks()
390
-
391
- return [preflight, { header: run_ship.PRE_DETACH_HEADER, body: result.out, code: result.code }]
314
+ return [checks, preflight]
392
315
  }
393
316
 
394
317
  async function detach_after_preflight(args: ShipArguments): Promise<number> {
@@ -437,7 +360,7 @@ async function run_ship_command(args: ShipArguments): Promise<number> {
437
360
  }
438
361
 
439
362
  async function run(argv: ReadonlyArray<string>): Promise<number> {
440
- const command = parse(argv)
363
+ const command = run_ship_args.parse(argv)
441
364
 
442
365
  if (command === undefined) {
443
366
  console.error(USAGE)
@@ -447,7 +370,7 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
447
370
 
448
371
  return command.kind === 'log'
449
372
  ? await print_log(command.number)
450
- : await run_ship_command(command.args)
373
+ : await run_ship_command(await run_ship_body_draft.with_draft(command.args))
451
374
  }
452
375
 
453
376
  async function main(argv: ReadonlyArray<string>): Promise<void> {
@@ -58,6 +58,7 @@ const RECORD_WAIT_ATTEMPTS = 200
58
58
  // a `pnpm josh ship` start-up, far below the lifetime a reused pid could otherwise be believed for.
59
59
  const CLAIM_WINDOW_MS = 120_000
60
60
  type ShipResult = 'running' | 'success' | 'failed' | 'abnormal'
61
+ type StartRead = (pid: number) => string | undefined
61
62
 
62
63
  interface ShipRecord {
63
64
  pid?: number | undefined
@@ -146,35 +147,43 @@ function is_within_claim_window(record: ShipRecord): boolean {
146
147
  return record.launched_at !== undefined && Date.now() - record.launched_at < CLAIM_WINDOW_MS
147
148
  }
148
149
 
149
- function has_live_identity(pid: number, record: ShipRecord): boolean {
150
+ function has_live_identity(pid: number, record: ShipRecord, read: StartRead): boolean {
150
151
  if (record.process_start === undefined) {
151
152
  return is_within_claim_window(record) && process_identity.is_live_pid(pid)
152
153
  }
153
154
 
154
- return process_identity.is_same_process(pid, record.process_start) !== false
155
+ return process_identity.is_same_process(pid, record.process_start, read) !== false
155
156
  }
156
157
 
157
- function result_of(record: ShipRecord): ShipResult {
158
+ function result_of(record: ShipRecord, read: StartRead): ShipResult {
158
159
  if (record.pid === undefined) {
159
- const is_launcher = process_identity.is_same_process(record.launcher_pid, record.launcher_start)
160
+ const { launcher_pid, launcher_start } = record
161
+ const is_launcher = process_identity.is_same_process(launcher_pid, launcher_start, read)
160
162
 
161
163
  return is_launcher === false ? 'abnormal' : 'running'
162
164
  }
163
165
 
164
- if (has_live_identity(record.pid, record)) return 'running'
166
+ if (has_live_identity(record.pid, record, read)) return 'running'
165
167
 
166
168
  return record.result ?? 'abnormal'
167
169
  }
168
170
 
171
+ // `read` answers each recorded process's start time: a reader holding one process snapshot passes its
172
+ // own, so the reading starts no `ps` (joshuafolkken/kit#4245).
169
173
  function read_result(
170
174
  repository: string,
171
175
  number: string,
172
- ): { launch_id: string; result: ShipResult } | undefined {
176
+ read: StartRead = process_identity.read_start,
177
+ ): { launch_id: string; launched_at?: number | undefined; result: ShipResult } | undefined {
173
178
  const record = read_record(repository, number)
174
179
 
175
180
  return record === undefined
176
181
  ? undefined
177
- : { launch_id: record.launch_id, result: result_of(record) }
182
+ : {
183
+ launch_id: record.launch_id,
184
+ launched_at: record.launched_at,
185
+ result: result_of(record, read),
186
+ }
178
187
  }
179
188
 
180
189
  function current_record(repository: string, number: string): ShipRecord | undefined {
@@ -188,7 +197,9 @@ function current_record(repository: string, number: string): ShipRecord | undefi
188
197
  function running_since(repository: string, number: string): number | undefined {
189
198
  const record = read_record(repository, number)
190
199
 
191
- return record !== undefined && result_of(record) === 'running' ? record.launched_at : undefined
200
+ return record !== undefined && result_of(record, process_identity.read_start) === 'running'
201
+ ? record.launched_at
202
+ : undefined
192
203
  }
193
204
 
194
205
  function is_pending(record: ShipRecord | undefined): boolean {
@@ -0,0 +1,59 @@
1
+ import { setTimeout as delay } from 'node:timers/promises'
2
+ import type { ShipSection } from './run-ship'
3
+ import type { Stage } from './run-ship-stage'
4
+ import { run_ship_stop_cause } from './run-ship-stop-cause'
5
+
6
+ // A stage that stopped on the infrastructure is run again in place, a bounded number of times, before
7
+ // the ship stops (joshuafolkken/kit#3998). Re-running a stage is what a resumed ship does already, so
8
+ // a retry repeats nothing a relaunched lane would not; it only skips the stop, the relaunch and the
9
+ // wait in between. Any other stop — a finding, a red check, a conflict — returns at once, and so does a
10
+ // review round's, a reviewer that did not finish included: a review is never re-run in place.
11
+
12
+ const MAX_INFRA_RETRIES = 2
13
+ const RETRY_DELAY_MS = 60_000
14
+ const RETRY_CAP = String(MAX_INFRA_RETRIES)
15
+
16
+ type Attempt = () => Promise<ShipSection>
17
+
18
+ interface RetryHooks {
19
+ wait: (milliseconds: number) => Promise<void>
20
+ note: (text: string) => void
21
+ }
22
+
23
+ const DEFAULT_HOOKS: RetryHooks = {
24
+ wait: async (milliseconds) => {
25
+ await delay(milliseconds)
26
+ },
27
+ note: (text) => {
28
+ process.stderr.write(`${text}\n`)
29
+ },
30
+ }
31
+
32
+ function is_retryable(stage: Stage, section: ShipSection): boolean {
33
+ if (section.code === 0 || run_ship_stop_cause.is_review(stage)) return false
34
+
35
+ return run_ship_stop_cause.cause_of(stage, section) === run_ship_stop_cause.CAUSE.INFRA
36
+ }
37
+
38
+ async function retried(
39
+ stage: Stage,
40
+ attempt: Attempt,
41
+ hooks: RetryHooks = DEFAULT_HOOKS,
42
+ retries_left = MAX_INFRA_RETRIES,
43
+ ): Promise<ShipSection> {
44
+ const section = await attempt()
45
+
46
+ if (retries_left === 0 || !is_retryable(stage, section)) return section
47
+
48
+ const ordinal = String(MAX_INFRA_RETRIES - retries_left + 1)
49
+
50
+ hooks.note(`josh ship: ${stage} stopped on the infrastructure — retry ${ordinal}/${RETRY_CAP}`)
51
+ await hooks.wait(RETRY_DELAY_MS)
52
+
53
+ return await retried(stage, attempt, hooks, retries_left - 1)
54
+ }
55
+
56
+ const run_ship_infra_retry = { MAX_INFRA_RETRIES, RETRY_DELAY_MS, retried }
57
+
58
+ export type { RetryHooks }
59
+ export { run_ship_infra_retry }
@@ -1,5 +1,6 @@
1
1
  import { run_ship_stage, type Stage } from './run-ship-stage'
2
2
  import type { ShipArguments } from './run-ship-steps'
3
+ import type { Cause } from './run-ship-stop-cause'
3
4
 
4
5
  // The command a relaunched lane child runs once it has fixed what stopped its detached ship.
5
6
  // The stopped stage decides the command mechanically, so it is decided here, once, and the prompt
@@ -43,6 +44,10 @@ interface ShipResume {
43
44
  is_review: boolean
44
45
  // The paths a merge of the default branch left unmerged.
45
46
  conflicts?: ReadonlyArray<string>
47
+ // The cause a stopped review round tagged its stop with (`run-ship-stop-cause.ts`).
48
+ cause?: Cause
49
+ // The issue changed after the recorded review's brief (`run-ship-probe.ts`).
50
+ is_review_stale?: boolean
46
51
  }
47
52
 
48
53
  // Single quotes, so a `$` or a backtick in a title is never expanded by the shell that runs it.
@@ -98,6 +103,17 @@ const AFTER_FIX: Record<Stage, (resume: ShipResume) => string> = {
98
103
  [STAGE.REPORT]: detach_again,
99
104
  }
100
105
 
106
+ // Whatever stage stopped, a review that read the issue before its update is round 1's to redo: the
107
+ // supervisor reviews it again even on a committed tree (`run-ship-stage.ts`), and `josh followup`
108
+ // refuses the merge until it has (joshuafolkken/kit#4221).
109
+ function detach_review_again(resume: ShipResume): string {
110
+ return `leave the fix uncommitted and run \`${ship_command(COMMAND.DETACH_REVIEW, resume)}\` — the review read the issue before its update, so the supervisor reviews round 1 again.`
111
+ }
112
+
113
+ function after_fix(stage: Stage, resume: ShipResume): string {
114
+ return resume.is_review_stale === true ? detach_review_again(resume) : AFTER_FIX[stage](resume)
115
+ }
116
+
101
117
  // A conflict names its paths, so the resumed session resolves them without
102
118
  // reading the report or asking git which files are unmerged.
103
119
  function conflict_step(conflicts: ReadonlyArray<string>): string {
@@ -116,9 +132,9 @@ function fix_step(issue: string, stage: Stage, is_excerpted: boolean): string {
116
132
  function next_step(issue: string, stage: Stage, resume: ShipResume, is_excerpted = false): string {
117
133
  const conflicts = resume.conflicts ?? []
118
134
 
119
- if (conflicts.length > 0) return `${conflict_step(conflicts)} ${AFTER_FIX[stage](resume)}`
135
+ if (conflicts.length > 0) return `${conflict_step(conflicts)} ${after_fix(stage, resume)}`
120
136
 
121
- return `${fix_step(issue, stage, is_excerpted)}, then ${AFTER_FIX[stage](resume)}`
137
+ return `${fix_step(issue, stage, is_excerpted)}, then ${after_fix(stage, resume)}`
122
138
  }
123
139
 
124
140
  const run_ship_next = { COMMAND, next_step, quoted, resume_of }
@@ -1,6 +1,8 @@
1
1
  import { changed_paths } from '#scripts/git/changed-paths'
2
2
  import { git_diff_reads } from '#scripts/git/git-diff-reads'
3
+ import { git_merge_conflicts } from '#scripts/git/git-merge-conflicts'
3
4
  import { git_spawn } from '#scripts/git/git-spawn'
5
+ import { main_merge_regenerate } from '#scripts/git/main-merge-regenerate'
4
6
  import { session_cite } from '#scripts/issue/session-cite'
5
7
  import { lane_handoff } from '#scripts/lane/lane-handoff'
6
8
  import { lane_ledger, type OverlapRecord } from '#scripts/lane/lane-ledger'
@@ -13,7 +15,7 @@ import { poll } from '#scripts/lib/poll'
13
15
  // often as a `conflict` stop its child no longer had the context for.
14
16
  //
15
17
  // **The later ship waits for the earlier one rather than anything being pushed into a lane.** A lane
16
- // whose actual change overlaps this one's and whose pull request is already open (its branch pushed,
18
+ // whose actual change conflicts with this one's and whose pull request is already open (its branch pushed,
17
19
  // its detached ship still running) is waited on until that ship ends, merged or stopped; the sync that
18
20
  // follows then merges a default branch that already holds it, so a conflict surfaces before this
19
21
  // lane's gate rather than after its CI. Merging into the other lane's tree instead could not work: a
@@ -37,6 +39,9 @@ const NAME_ONLY_ARGUMENTS = [
37
39
  '--no-relative',
38
40
  '--no-renames',
39
41
  ]
42
+ const REGENERATED_PATHS: ReadonlySet<string> = new Set(
43
+ main_merge_regenerate.REGENERATED_FILES.map((entry) => entry.path),
44
+ )
40
45
 
41
46
  interface OverlapOptions {
42
47
  sleeper?: (duration_ms: number) => Promise<void>
@@ -102,6 +107,35 @@ async function is_open_ship(lane: LaneInfo, own: Launch): Promise<boolean> {
102
107
  return await has_upstream(lane.directory)
103
108
  }
104
109
 
110
+ async function lane_head(directory: string): Promise<string | undefined> {
111
+ try {
112
+ return await git_spawn.read(['-C', directory, 'rev-parse', 'HEAD'])
113
+ } catch {
114
+ return undefined
115
+ }
116
+ }
117
+
118
+ // Of the paths both lanes change, the ones merging the other lane's head into this lane's working
119
+ // tree would actually stop on (joshuafolkken/kit#4348) — the working tree, since this lane's change is
120
+ // not committed until after the sync: an identical addition merges cleanly, so only a real conflict
121
+ // is waited on. Only a shared path is tried: a lane forked from an older default branch also
122
+ // conflicts on files the default branch changed since, which this lane's sync takes from the default
123
+ // branch, not from that lane. A file `main:merge` regenerates is resolved by the sync either way, so
124
+ // it never counts. A merge that could not be tried falls back to every shared path, as the wait was
125
+ // decided before.
126
+ async function conflicting_paths(
127
+ lane: LaneInfo,
128
+ shared: ReadonlyArray<string>,
129
+ ): Promise<Array<string>> {
130
+ const theirs = await lane_head(lane.directory)
131
+ const conflicted =
132
+ theirs === undefined
133
+ ? undefined
134
+ : git_merge_conflicts.working_tree_conflicts(theirs, shared, process.cwd())
135
+
136
+ return (conflicted ?? shared).filter((file_path) => !REGENERATED_PATHS.has(file_path))
137
+ }
138
+
105
139
  async function shared_paths(
106
140
  lane: LaneInfo,
107
141
  launch: Launch,
@@ -110,8 +144,11 @@ async function shared_paths(
110
144
  if (!(await is_open_ship(lane, launch))) return []
111
145
 
112
146
  const paths = await lane_paths(lane.directory)
147
+ const shared = paths.filter((file_path) => own.has(file_path))
148
+
149
+ if (shared.length === 0) return []
113
150
 
114
- return paths.filter((file_path) => own.has(file_path))
151
+ return await conflicting_paths(lane, shared)
115
152
  }
116
153
 
117
154
  async function other_lanes(issue: string): Promise<ReadonlyArray<LaneInfo>> {
@@ -120,8 +157,8 @@ async function other_lanes(issue: string): Promise<ReadonlyArray<LaneInfo>> {
120
157
  return lanes.filter((lane) => lane.issue !== issue && !lane.is_stranded)
121
158
  }
122
159
 
123
- // Every other lane whose open pull request, shipped before this one, touches a path this lane changed,
124
- // with the shared paths.
160
+ // Every other lane whose open pull request, shipped before this one, conflicts with this lane's change,
161
+ // with the conflicting paths.
125
162
  async function find_overlap(issue: string): Promise<Overlap> {
126
163
  const own = new Set(await changed_paths.read_changed_paths(false))
127
164
  const launch = own_launch(issue)
@@ -186,7 +223,7 @@ function note(record: OverlapRecord | undefined): string {
186
223
  const lanes = record.lanes.map((lane) => session_cite.issue(lane)).join(', ')
187
224
  const outcome = record.is_cleared ? 'waited for' : 'gave up waiting for'
188
225
 
189
- return `${outcome} ${lanes}, whose open pull requests also change: ${record.paths.join(', ')}`
226
+ return `${outcome} ${lanes}, whose open pull requests conflict on: ${record.paths.join(', ')}`
190
227
  }
191
228
 
192
229
  const run_ship_overlap = { MAX_WAIT_ATTEMPTS, await_overlap, note }