@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,25 +1,24 @@
1
- #!/usr/bin/env tsx
2
- import { randomUUID } from 'node:crypto'
3
1
  import { fileURLToPath } from 'node:url'
4
2
  import type { AgentProfile, AgentProvider } from '#scripts/agent/agent-role-profile'
5
3
  import { backlog_budget } from '#scripts/backlog/backlog-budget'
4
+ import { lane_session_broker } from '#scripts/lane/lane-session-broker'
6
5
  import { cli_flags } from '#scripts/lib/cli-flags'
6
+ import { MS_PER_SECOND } from '#scripts/lib/timeouts'
7
7
  import { telegram_notify } from '#scripts/notify/telegram-notify'
8
8
  import { run_carry, type CarryRead } from '#scripts/run/carry/run-carry'
9
- import { run_event_setup } from '#scripts/run/event/run-event-setup'
10
9
  import { run_event_stream } from '#scripts/run/event/run-event-stream'
11
10
  import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
12
- import { run_headless } from '#scripts/run/run-headless'
13
11
  import { run_stranded_detect, type WatchedRun } from '#scripts/run/run-stranded-detect'
14
12
  import { run_wake, type WakeStopReason, type WakeTidyResult } from './run-wake'
15
13
  import { run_wake_await } from './run-wake-await'
14
+ import { run_wake_code } from './run-wake-code'
16
15
  import { run_wake_describe, type WakeContext } from './run-wake-describe'
17
- import { run_wake_driver } from './run-wake-driver'
18
- import { run_wake_handoff } from './run-wake-handoff'
19
- import { run_wake_loop, type LoopPorts, type LoopStop } from './run-wake-loop'
16
+ import { run_wake_loop, type LoopStop } from './run-wake-loop'
17
+ import { run_wake_ports } from './run-wake-ports'
20
18
  import { run_wake_session, type LaunchResult } from './run-wake-session'
21
19
  import { run_wake_stop } from './run-wake-stop'
22
20
  import { run_wake_supervise } from './run-wake-supervise'
21
+ import { run_wake_takeover, type TakeoverResult } from './run-wake-takeover'
23
22
 
24
23
  // `josh run:wake --start | --list | --stop | --loop` — the supervisor that continues a cut
25
24
  // `backlogrun` or `queue` without a person retyping the keyword. **Which invocations it may continue
@@ -29,24 +28,22 @@ import { run_wake_supervise } from './run-wake-supervise'
29
28
  // The stdout/stderr split is the contract every `run:*` command shares: exactly one verdict token on
30
29
  // stdout on every path, the reason and the advice on stderr, so a loop branches on one token.
31
30
  //
32
- // **`--start` and `--loop` are two halves of one thing.** `--start` spawns this same script detached
31
+ // **`--start` and `--loop` are two halves of one thing.** `--start` spawns the command's entry detached
33
32
  // with `--loop` and returns immediately, which is what leaves the supervisor outside the conversation;
34
33
  // `--loop` is the body, and running it in the foreground is how a person watches what it does.
35
34
 
36
35
  const SUCCESS_EXIT_CODE = 0
37
36
  const FAILURE_EXIT_CODE = 1
38
- const ARGV_OFFSET = 2
39
37
  const ONE_GROUP = 1
40
- const MS_PER_SECOND = 1000
41
- // Whole and positive. A zero interval is a busy loop against the temp directory, not a faster
42
- // supervisor.
43
- const INTERVAL_PATTERN = /^[1-9]\d*$/u
38
+ // The interval is whole and positive (`cli_flags.to_positive`): a zero interval is a busy loop against
39
+ // the temp directory, not a faster supervisor.
44
40
  // **Bounded above as well as below, and for the same reason.** `setTimeout` clamps any delay past
45
41
  // 2^31−1 ms to *one millisecond*, so a number large enough to look like "poll rarely" produces exactly
46
42
  // the busy loop the lower bound exists to prevent. An hour is far past any useful polling interval and
47
43
  // nowhere near the clamp.
48
44
  const MAX_INTERVAL_SECONDS = 3600
49
- const SCRIPT_PATH = fileURLToPath(import.meta.url)
45
+ // The command's entry, not this module: the guard that runs `main` lives in `run-wake-main.ts`.
46
+ const SCRIPT_PATH = fileURLToPath(new URL('run-wake-main.ts', import.meta.url))
50
47
 
51
48
  const STARTED_VERDICT = 'started'
52
49
  const RUNNING_VERDICT = 'running'
@@ -57,13 +54,6 @@ const NONE_VERDICT = 'none'
57
54
  const UNKNOWN_VERDICT = 'unknown'
58
55
  const FAILED_VERDICT = 'failed'
59
56
 
60
- // **The note covers both ways `wake_argv` answers `undefined`**, because it cannot tell them apart and
61
- // a message that named only the first would accuse a legitimate invocation of carrying unsafe text.
62
- // The second is the one a person actually meets: a `queue` whose references carry a `owner/repo#`
63
- // prefix is a grammar this supervisor does not rebuild, and `queue.md` → "The session boundary" is why
64
- // such a queue begins no record in the first place.
65
- const UNSAFE_INVOCATION_NOTE =
66
- 'the carried invocation is not one this supervisor can continue — it is neither a backlogrun nor a queue it can rebuild, or it carries text that may not be passed to a command line'
67
57
  // The command rather than one entry point: the supervisor continues a `queue` as readily as a
68
58
  // `backlogrun`, and a warning that named the wrong one would send the reader looking at a run that is
69
59
  // not the one that stopped.
@@ -82,12 +72,21 @@ const WARNING_RECOVERY = `Check the wake command, then restart with \`pnpm josh
82
72
  const STOP_BODIES: Record<WakeStopReason, string | undefined> = {
83
73
  ended: undefined,
84
74
  stopped: undefined,
75
+ reload: undefined,
85
76
  failed: 'The supervisor could not continue the run and has stopped.',
86
77
  unreadable:
87
78
  'The carry record could not be read, so the supervisor stopped rather than guess at it.',
88
79
  }
89
80
  const NO_PROFILE_NOTE = 'the scheduler profile could not be resolved'
81
+ const RELOAD_FAILED_NOTE =
82
+ "The supervisor's code changed, but the supervisor to replace it did not start"
83
+ const TAKEOVER_NOTES: Record<Exclude<TakeoverResult, 'taken'>, string> = {
84
+ died: 'it exited before it claimed the run',
85
+ unclaimed: 'it did not claim the run in time, so it was stopped',
86
+ }
90
87
  const SUPERSEDED_RESULT: WakeTidyResult = 'superseded'
88
+ const REMOVED_RESULT: WakeTidyResult = 'removed'
89
+ const STOPPED_STOP: LoopStop = { reason: 'stopped', note: undefined }
91
90
  const SUPERSEDED_NOTE =
92
91
  'another supervisor now holds the record, so it was left alone; this loop is the superseded one'
93
92
 
@@ -115,17 +114,15 @@ function usage(): number {
115
114
  return FAILURE_EXIT_CODE
116
115
  }
117
116
 
118
- function note_to_stderr(note: string): void {
119
- console.error(`wake: ${note}`)
120
- }
117
+ const { note_to_stderr } = run_wake_ports
121
118
 
122
119
  function to_interval_ms(value: string | boolean | undefined): number | undefined {
123
120
  if (typeof value !== 'string') return backlog_budget.OFFER_INTERVAL_MS
124
- if (!INTERVAL_PATTERN.test(value)) return undefined
125
-
126
- const seconds = Number(value)
121
+ const seconds = cli_flags.to_positive(value)
127
122
 
128
- return seconds > MAX_INTERVAL_SECONDS ? undefined : seconds * MS_PER_SECOND
123
+ return seconds === undefined || seconds > MAX_INTERVAL_SECONDS
124
+ ? undefined
125
+ : seconds * MS_PER_SECOND
129
126
  }
130
127
 
131
128
  // Exactly one verb, never a guessed order between two.
@@ -154,56 +151,6 @@ function refuse_without_carry(kind: CarryRead['kind']): number {
154
151
  return report(NONE_VERDICT, FAILURE_EXIT_CODE)
155
152
  }
156
153
 
157
- // **A session that started is said on the stream.** The driver's `waiting on judgment` is the moment it
158
- // asked; from here a session is at work on the answer, until the supervisor's next hand-off.
159
- function say_session_running(context: WakeContext): void {
160
- run_event_setup.emit_to(context.event_target, run_event_setup.STAGE.SESSION, new Date())
161
- }
162
-
163
- function wake_session(
164
- context: WakeContext,
165
- invocation: string,
166
- profile: AgentProfile,
167
- session: { id: string; material: string },
168
- ): LaunchResult {
169
- const built = run_wake_session.wake_argv(invocation, profile, context.worktree, session)
170
-
171
- if (built === undefined) return { kind: 'failed', note: UNSAFE_INVOCATION_NOTE }
172
- if (built.kind === 'rejected') return { kind: 'failed', note: built.note }
173
-
174
- // The headless mark is what lets the stop hook hold this session's turn open while its lanes run —
175
- // under `claude -p` a turn-end is the process's end (`run-headless.ts`).
176
- const environment = run_headless.environment()
177
- const target = { cwd: context.worktree, env: environment, log_path: context.log_target }
178
- const result = run_wake_session.launch({ argv: built.argv, ...target, profile }, note_to_stderr)
179
-
180
- if (result.kind === 'launched') say_session_running(context)
181
-
182
- return result
183
- }
184
-
185
- // **A record this supervisor owns itself is not a session at work.** A failed driver leaves the record
186
- // adopted for this process, so reading that owner as live would have every restarted pass wait on
187
- // itself and never drive again.
188
- function ports_for(context: WakeContext, profile: AgentProfile): LoopPorts {
189
- return {
190
- read_carry: () => run_carry.read_carry(context.carry_target),
191
- is_owner_live: (read) => read.kind === 'carried' && run_carry.is_held_by_another(read.carry),
192
- has_work: async () => true,
193
- new_session_id: () => randomUUID(),
194
- hand_off: () => {
195
- run_wake_handoff.hand_off(context.carry_target)
196
- },
197
- drive: async () => await run_wake_driver.drive(context.carry_target),
198
- wake: (invocation, session_id, material) =>
199
- wake_session(context, invocation, profile, { id: session_id, material }),
200
- sleep: async (milliseconds) => {
201
- await new Promise((resolve) => setTimeout(resolve, milliseconds))
202
- },
203
- now: () => new Date(),
204
- }
205
- }
206
-
207
154
  // The log is named in the warning rather than only in `--list`, because the person reading a warning
208
155
  // at three in the morning is the one who needs to know where to look next.
209
156
  function log_hint(context: WakeContext): string {
@@ -256,7 +203,7 @@ async function record_failure(
256
203
  }
257
204
 
258
205
  // **Only a failed wake exits non-zero; `unreadable` warns but exits zero.** The
259
- // verdict-and-exit-code table in `docs/josh-commands-automation.md` is a contract callers branch on,
206
+ // verdict-and-exit-code table in `docs/josh-commands-run.md` → `run:wake` is a contract callers branch on,
260
207
  // and what that one needs is the notification, not a different exit code.
261
208
  function exit_code_of(reason: WakeStopReason): number {
262
209
  return reason === run_wake_loop.FAILED_REASON ? FAILURE_EXIT_CODE : SUCCESS_EXIT_CODE
@@ -317,8 +264,12 @@ function start_for_launch(git_directory: string, provider: AgentProvider): Launc
317
264
  return launch_supervisor(context_of(git_directory), undefined, resolved.profile)
318
265
  }
319
266
 
320
- function spawn_supervisor(context: WakeContext, interval: string | undefined): number {
321
- const result = launch_supervisor(context, interval, run_wake_session.scheduler_profile())
267
+ function spawn_supervisor(
268
+ context: WakeContext,
269
+ interval: string | undefined,
270
+ profile: AgentProfile | undefined,
271
+ ): number {
272
+ const result = launch_supervisor(context, interval, profile)
322
273
 
323
274
  if (result.kind === 'failed') {
324
275
  console.error(`Could not start the supervisor: ${result.note}`)
@@ -346,7 +297,15 @@ function start(context: WakeContext, interval: string | undefined): number {
346
297
  return report(RUNNING_VERDICT)
347
298
  }
348
299
 
349
- return spawn_supervisor(context, interval)
300
+ return spawn_supervisor(context, interval, run_wake_session.scheduler_profile())
301
+ }
302
+
303
+ // The supervisor `josh backlogrun --restart` starts in place of the one it stopped, on that one's
304
+ // profile, so the shell the restart was typed in does not choose it; the shell's where none was running.
305
+ function restart_supervisor(git_directory: string, profile: AgentProfile | undefined): number {
306
+ const chosen = profile ?? run_wake_session.scheduler_profile()
307
+
308
+ return spawn_supervisor(context_of(git_directory), undefined, chosen)
350
309
  }
351
310
 
352
311
  // **The loop removes its record on the way out, and only its own.** A loop that ended after its record
@@ -357,8 +316,78 @@ function start(context: WakeContext, interval: string | undefined): number {
357
316
  // replaced would leave no trace of that anywhere. Which of the two happened is `tidy_own_wake`'s
358
317
  // answer rather than a second read taken here — the branch that decides it belongs beside the record,
359
318
  // where it is tested, not in a CLI that would have to re-derive it.
360
- function tidy_up(target: string): void {
361
- if (run_wake.tidy_own_wake(target) === SUPERSEDED_RESULT) note_to_stderr(SUPERSEDED_NOTE)
319
+ function tidy_up(target: string): WakeTidyResult {
320
+ const tidied = run_wake.tidy_own_wake(target)
321
+
322
+ if (tidied === SUPERSEDED_RESULT) note_to_stderr(SUPERSEDED_NOTE)
323
+
324
+ return tidied
325
+ }
326
+
327
+ // **No reload while a lane's request is being answered**: ending the broker closes every lane's server
328
+ // but waits out the slowest request, a review up to its limit, leaving the run unwatched and the other
329
+ // lanes unserved meanwhile. The check is skipped, not taken, so the moved commit is still read as
330
+ // stale at the first idle pass.
331
+ function code_check(is_stale: () => Promise<boolean>): () => Promise<boolean> {
332
+ return async () => !lane_session_broker.is_answering() && (await is_stale())
333
+ }
334
+
335
+ function reload_failed(note: string): LoopStop {
336
+ return { reason: run_wake_loop.FAILED_REASON, note: `${RELOAD_FAILED_NOTE}: ${note}` }
337
+ }
338
+
339
+ // A record removed by `--stop` or taken over while the loop ended is not this loop's to hand on.
340
+ function as_not_handed_on(stop: LoopStop): LoopStop {
341
+ return stop.reason === run_wake_loop.RELOAD_REASON ? STOPPED_STOP : stop
342
+ }
343
+
344
+ // **The successor starts only once this supervisor's broker has closed and its record is gone**
345
+ // (joshuafolkken/kit#4509): two brokers for one lane overwrite each other's response
346
+ // (`claude-lane-broker.ts`), and a record still held by a live process refuses the successor's claim.
347
+ // The lanes and the carry record are left as `backlogrun --restart` leaves them: untouched, for the
348
+ // successor to adopt. A successor that did not start leaves the run unwatched, so it fails as a warning.
349
+ async function reload(
350
+ context: WakeContext,
351
+ interval_ms: number,
352
+ profile: AgentProfile,
353
+ ): Promise<LoopStop> {
354
+ const interval = String(Math.round(interval_ms / MS_PER_SECOND))
355
+ const result = launch_supervisor(context, interval, profile)
356
+
357
+ if (result.kind === 'failed') return reload_failed(result.note)
358
+
359
+ const ports = run_wake_takeover.ports_of(context.wake_target)
360
+ const takeover = await run_wake_takeover.await_takeover(result.pid, ports)
361
+
362
+ if (takeover !== 'taken') return reload_failed(TAKEOVER_NOTES[takeover])
363
+
364
+ await run_event_stream_emit.emit(
365
+ run_event_stream.EVENT_KIND.NOTE,
366
+ `The supervisor's code changed on main, so process ${String(process.pid)} handed the run to process ${String(result.pid)} on the new code.`,
367
+ )
368
+
369
+ return { reason: run_wake_loop.RELOAD_REASON, note: undefined }
370
+ }
371
+
372
+ async function supervised(
373
+ context: WakeContext,
374
+ interval_ms: number,
375
+ profile: AgentProfile,
376
+ ): Promise<LoopStop> {
377
+ const source = run_wake_code.source_of(context.worktree, SCRIPT_PATH)
378
+ const is_stale = code_check(await run_wake_code.watch(source))
379
+ const ports = run_wake_ports.ports_for(context, profile, is_stale)
380
+ const stop = await run_wake_supervise.supervise({
381
+ context,
382
+ ports,
383
+ interval_ms,
384
+ note: note_to_stderr,
385
+ })
386
+
387
+ if (tidy_up(context.wake_target) !== REMOVED_RESULT) return as_not_handed_on(stop)
388
+ if (stop.reason !== run_wake_loop.RELOAD_REASON) return stop
389
+
390
+ return await reload(context, interval_ms, profile)
362
391
  }
363
392
 
364
393
  // A failed pass is restarted while the carry record is still resumable (`run-wake-restart.ts`), so
@@ -376,15 +405,7 @@ async function loop(context: WakeContext, interval_ms: number): Promise<number>
376
405
  if (claimed.kind === 'running') return report(RUNNING_VERDICT)
377
406
  if (claimed.kind === 'refused') return refuse_without_carry(claimed.carry_kind)
378
407
 
379
- const ports = ports_for(context, claimed.wake.profile ?? profile)
380
- const stop = await run_wake_supervise.supervise({
381
- context,
382
- ports,
383
- interval_ms,
384
- note: note_to_stderr,
385
- })
386
-
387
- tidy_up(context.wake_target)
408
+ const stop = await supervised(context, interval_ms, claimed.wake.profile ?? profile)
388
409
 
389
410
  return await finish(stop, context, claimed.carry.started_at)
390
411
  }
@@ -436,28 +457,26 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
436
457
  return await dispatch(values, context, interval_ms)
437
458
  }
438
459
 
439
- async function main(argv: ReadonlyArray<string>): Promise<void> {
440
- process.exitCode = await run(argv)
441
- }
442
-
443
460
  const run_wake_cli = {
444
461
  FAILED_VERDICT,
445
462
  NONE_VERDICT,
446
463
  RUNNING_VERDICT,
464
+ SCRIPT_PATH,
447
465
  STALE_VERDICT,
448
466
  STOPPED_VERDICT,
449
467
  SUPERVISING_VERDICT,
450
468
  UNKNOWN_VERDICT,
451
469
  USAGE,
452
470
  finish,
453
- ports_for,
471
+ RELOAD_FAILED_NOTE,
454
472
  record_failure,
473
+ reload,
474
+ restart_supervisor,
455
475
  run,
456
476
  start_for_launch,
457
477
  stop_body,
478
+ supervised,
458
479
  warning_body,
459
480
  }
460
481
 
461
- if (process.argv[1] === SCRIPT_PATH) await main(process.argv.slice(ARGV_OFFSET))
462
-
463
482
  export { run_wake_cli }
@@ -0,0 +1,83 @@
1
+ import { git_command } from '#scripts/git/git-command'
2
+ import { error_text } from '#scripts/lib/error-message'
3
+ import { import_graph } from '#scripts/lint/import-graph'
4
+
5
+ // Whether the supervisor still runs the code on disk (joshuafolkken/kit#4509). A supervisor keeps the
6
+ // code it started with for its whole life, while the lanes' ships run each new main — so a change to
7
+ // what the supervisor serves them, the broker's request format above all, stops every lane that asks.
8
+ //
9
+ // **The code is the entry's import closure, not the tree**: a merge that touched only files the
10
+ // supervisor never imports changes nothing it runs, and restarting on it would only cost a broker gap.
11
+ // The closure is hashed as the lint cache hashes it (`import-graph.ts`).
12
+ //
13
+ // **The closure is re-hashed only once the commit has moved**: hashing it reads every file it reaches,
14
+ // and on most passes nothing has merged since the last one.
15
+
16
+ interface CodeSource {
17
+ // The commit the checkout sits on; `undefined` where it cannot be read.
18
+ head: () => Promise<string | undefined>
19
+ // The hash of the entry's import closure; `undefined` where it cannot be computed.
20
+ closure: () => Promise<string | undefined>
21
+ }
22
+
23
+ interface CodeState {
24
+ head: string | undefined
25
+ loaded: string | undefined
26
+ }
27
+
28
+ // **A hash that cannot be computed is never stale**: a supervisor that cannot tell keeps running, as
29
+ // it did before this check existed, rather than restarting on every pass.
30
+ function is_changed(loaded: string | undefined, current: string | undefined): boolean {
31
+ if (loaded === undefined || current === undefined) return false
32
+
33
+ return loaded !== current
34
+ }
35
+
36
+ async function is_stale(state: CodeState, source: CodeSource): Promise<boolean> {
37
+ const head = await source.head()
38
+ if (head === state.head) return false
39
+
40
+ state.head = head
41
+
42
+ return is_changed(state.loaded, await source.closure())
43
+ }
44
+
45
+ // The baseline is read when the watch starts — at the supervisor's start, as close to the moment its
46
+ // modules were loaded as a reading can be.
47
+ async function watch(source: CodeSource): Promise<() => Promise<boolean>> {
48
+ const state: CodeState = { head: await source.head(), loaded: await source.closure() }
49
+
50
+ return async () => await is_stale(state, source)
51
+ }
52
+
53
+ async function read_head(): Promise<string | undefined> {
54
+ try {
55
+ return await git_command.head_commit()
56
+ } catch (error) {
57
+ error_text.trace_swallowed('run_wake_code.read_head', error)
58
+
59
+ return undefined
60
+ }
61
+ }
62
+
63
+ // A fresh graph each time: one graph caches the content it read, so it would answer the old hash.
64
+ async function read_closure(root: string, entry: string): Promise<string | undefined> {
65
+ try {
66
+ const graph = await import_graph.create(root)
67
+
68
+ return graph?.closure_hash(entry)
69
+ } catch (error) {
70
+ error_text.trace_swallowed('run_wake_code.read_closure', error)
71
+
72
+ return undefined
73
+ }
74
+ }
75
+
76
+ function source_of(root: string, entry: string): CodeSource {
77
+ return { head: read_head, closure: async () => await read_closure(root, entry) }
78
+ }
79
+
80
+ const run_wake_code = { source_of, watch }
81
+
82
+ export type { CodeSource }
83
+ export { run_wake_code }
@@ -11,6 +11,11 @@ const DETAILS_TAIL_LENGTH = 2048
11
11
  const TRUNCATION_MARK = '... '
12
12
  // The prefix `backlog-drive-cli.ts` gives the exception it catches.
13
13
  const ERROR_PREFIX = 'error '
14
+ // **The driver is bounded so the supervisor reaches its pass boundary between dispatches**
15
+ // (joshuafolkken/kit#4509): unbounded, `backlog:drive` dispatches, collects and merges lanes in its own
16
+ // loop until a judgment hand-off, and the code check at the pass boundary would wait for that.
17
+ const WINDOW_MINUTES = '5'
18
+ const WINDOW_VERDICT = 'window'
14
19
 
15
20
  function driver_args(invocation: string): ReadonlyArray<string> | undefined {
16
21
  const rebuilt = run_invocation.rebuild(invocation)
@@ -21,6 +26,8 @@ function driver_args(invocation: string): ReadonlyArray<string> | undefined {
21
26
  'backlog:drive',
22
27
  '--owner',
23
28
  String(process.pid),
29
+ '--window',
30
+ WINDOW_MINUTES,
24
31
  ...rebuilt.split(' ').slice(1 + named_count),
25
32
  ]
26
33
  }
@@ -141,11 +148,11 @@ function claim_record(target: string, invocation: string): boolean {
141
148
  }
142
149
 
143
150
  // **A verdict with nothing to judge is re-driven here, never handed to a session.** A woken session
144
- // met with `window`, `merge busy` or `merge retry` could only cut and hand the loop back for the same
145
- // driver to run again — a model round trip, at a cache write each, that decides nothing. The record
146
- // is already this process's, so the rerun needs no fresh claim; the limit keeps a driver that never
147
- // settles from holding the supervisor past its own checks.
148
- const RERUN_VERDICTS: ReadonlyArray<string> = ['window', 'merge busy', 'merge retry']
151
+ // met with `merge busy` or `merge retry` could only cut and hand the loop back for the same driver to
152
+ // run again — a model round trip, at a cache write each, that decides nothing. The record is already
153
+ // this process's, so the rerun needs no fresh claim; the limit keeps a driver that never settles from
154
+ // holding the supervisor past its own checks.
155
+ const RERUN_VERDICTS: ReadonlyArray<string> = ['merge busy', 'merge retry']
149
156
  const RERUN_LIMIT = 10
150
157
  const RERUN_PAUSE_MS = 60_000
151
158
 
@@ -157,18 +164,21 @@ async function pause(ms: number): Promise<void> {
157
164
  })
158
165
  }
159
166
 
160
- function is_mechanical(result: JoshResult): boolean {
167
+ function is_verdict(result: JoshResult, entries: ReadonlyArray<string>): boolean {
161
168
  const verdict = result.out.split('\n', 1)[FIRST_LINE] ?? ''
162
169
 
163
170
  return (
164
171
  result.code === SUCCESS &&
165
- RERUN_VERDICTS.some((entry) => verdict === entry || verdict.startsWith(`${entry} `))
172
+ entries.some((entry) => verdict === entry || verdict.startsWith(`${entry} `))
166
173
  )
167
174
  }
168
175
 
169
176
  // A record that was removed during the pause answers `undefined`: its stale verdict must not reach a
170
177
  // session, so the supervisor's own next pass re-reads the record and ends the run as `ended` or
171
178
  // `stopped`; a rerun would only fail on it and report the run as `failed`.
179
+ //
180
+ // **A spent window answers `undefined` too**, so the supervisor's next pass checks its code before it
181
+ // drives again; the restarted driver adopts the lanes still in flight.
172
182
  async function run_driver(
173
183
  target: string,
174
184
  args: ReadonlyArray<string>,
@@ -176,7 +186,8 @@ async function run_driver(
176
186
  remaining: number,
177
187
  ): Promise<JoshResult | undefined> {
178
188
  const result = await josh_command.josh_run(args, true)
179
- if (remaining === 0 || !is_mechanical(result)) return result
189
+ if (is_verdict(result, [WINDOW_VERDICT])) return undefined
190
+ if (remaining === 0 || !is_verdict(result, RERUN_VERDICTS)) return result
180
191
 
181
192
  await wait(RERUN_PAUSE_MS)
182
193
  if (run_carry.read_carry(target).kind !== 'carried') return undefined
@@ -1,3 +1,4 @@
1
+ import { error_text } from '#scripts/lib/error-message'
1
2
  import type { CarryRead } from '#scripts/run/carry/run-carry'
2
3
  import {
3
4
  run_wake,
@@ -22,8 +23,10 @@ import type { LaunchResult } from './run-wake-session'
22
23
 
23
24
  const STOPPED_REASON: WakeStopReason = 'stopped'
24
25
  const FAILED_REASON: WakeStopReason = 'failed'
26
+ const RELOAD_REASON: WakeStopReason = 'reload'
25
27
  const NO_ATTEMPTS = 0
26
28
  const STOPPED_BY_PERSON: LoopStop = { reason: STOPPED_REASON, note: undefined }
29
+ const CODE_CHANGED: LoopStop = { reason: RELOAD_REASON, note: undefined }
27
30
 
28
31
  interface LoopPorts {
29
32
  // The carry record, re-read every pass rather than cached: it is written by the parent loop of a
@@ -47,10 +50,15 @@ interface LoopPorts {
47
50
  wake: (invocation: string, session_id: string, material: string) => LaunchResult
48
51
  sleep: (milliseconds: number) => Promise<void>
49
52
  now: () => Date
53
+ // Closes again a lane a process outlived, once the process is gone (`lane_close.retry_closes`).
54
+ retry_closes: () => Promise<void>
55
+ // Whether the code this process loaded differs from the code on disk now (`run-wake-code.ts`).
56
+ is_code_stale: () => Promise<boolean>
50
57
  }
51
58
 
52
- // `released`: the carry record ended while the driver paused, so there is nothing to hand on and the
53
- // next pass decides from the record how the run ends.
59
+ // `released`: the carry record ended while the driver paused, or the driver's window was spent, so
60
+ // there is nothing to hand on and the next pass decides from the record whether the run ends, reloads
61
+ // or drives on.
54
62
  type DriveResult =
55
63
  | { kind: 'finished' }
56
64
  | { kind: 'released' }
@@ -151,15 +159,37 @@ async function decide_pass(wake: RunWake, ports: LoopPorts): Promise<WakeDecisio
151
159
  return run_wake.decide({ ...input, has_work: await ports.has_work(input.read) })
152
160
  }
153
161
 
162
+ // A lane whose close a process outlived ends once the process is gone (joshuafolkken/kit#4300). A
163
+ // failed retry is the next pass's to try again, never a reason to stop the run.
164
+ async function retry_closes(ports: LoopPorts): Promise<void> {
165
+ try {
166
+ await ports.retry_closes()
167
+ } catch (error) {
168
+ error_text.trace_swallowed('run_wake_loop.retry_closes', error)
169
+ }
170
+ }
171
+
154
172
  // The record is re-read at the top of every pass rather than carried in a variable, so a `--stop` that
155
173
  // removed it ends the loop at the next interval and a `--list` reads what the loop actually wrote.
156
174
  // One pass: decide, act, write the result back. `undefined` means carry on to the next interval.
175
+ //
176
+ // **A pass boundary is where the supervisor reloads its code** (joshuafolkken/kit#4509): no driver
177
+ // is running and no session is being launched, so a successor on the new code takes over without
178
+ // stopping any lane. A record already removed ends the loop before this pass is reached, and a carry
179
+ // record that ended or became unreadable stops the run before the code is checked, so a reload never
180
+ // hands a finished run to a successor.
157
181
  async function run_pass(
158
182
  target: string,
159
183
  wake: RunWake,
160
184
  ports: LoopPorts,
161
185
  ): Promise<LoopStop | undefined> {
162
- const outcome = await step(wake, await decide_pass(wake, ports), ports)
186
+ const decision = await decide_pass(wake, ports)
187
+
188
+ if (decision.kind !== 'stop' && (await ports.is_code_stale())) return CODE_CHANGED
189
+
190
+ await retry_closes(ports)
191
+
192
+ const outcome = await step(wake, decision, ports)
163
193
 
164
194
  if (outcome.kind === 'stop') return outcome.stop
165
195
 
@@ -197,6 +227,7 @@ async function run_loop(target: string, ports: LoopPorts, interval_ms: number):
197
227
 
198
228
  const run_wake_loop = {
199
229
  FAILED_REASON,
230
+ RELOAD_REASON,
200
231
  run_loop,
201
232
  }
202
233
 
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath } from 'node:url'
3
+ import { run_wake_cli } from './run-wake-cli'
4
+
5
+ // The `josh run:wake` entry, and the script `--start` spawns with `--loop`. It is kept apart from
6
+ // `run-wake-cli.ts` because `backlogrun-cli.ts` and `backlogrun-restart.ts` import that one: a bundle
7
+ // is one file, so a main guard there would fire for every command that carries it
8
+ // (joshuafolkken/kit#4186).
9
+ if (process.argv[1] === fileURLToPath(import.meta.url)) {
10
+ const ARGV_OFFSET = 2
11
+
12
+ process.exitCode = await run_wake_cli.run(process.argv.slice(ARGV_OFFSET))
13
+ }