@joshuafolkken/kit 1.1471.0 → 1.1784.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (895) hide show
  1. package/.claude/agents/investigator.md +1 -1
  2. package/.claude/settings.json +6 -6
  3. package/.claude/skills/epic-commands/SKILL.md +26 -77
  4. package/.claude/skills/epic-commands/epic-bundle.md +12 -6
  5. package/.claude/skills/epic-commands/execution-waves.md +1 -2
  6. package/.claude/skills/verify-ui/SKILL.md +1 -2
  7. package/.claude/skills/workflow-commands/SKILL.md +12 -14
  8. package/.claude/skills/workflow-commands/background-commands.md +8 -12
  9. package/.claude/skills/workflow-commands/backlogrun-child.md +13 -18
  10. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
  11. package/.claude/skills/workflow-commands/backlogrun-lanes.md +23 -28
  12. package/.claude/skills/workflow-commands/backlogrun-park.md +16 -31
  13. package/.claude/skills/workflow-commands/backlogrun-progress.md +12 -21
  14. package/.claude/skills/workflow-commands/backlogrun-recovery.md +12 -12
  15. package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -20
  16. package/.claude/skills/workflow-commands/backlogrun.md +32 -51
  17. package/.claude/skills/workflow-commands/chain-rule.md +18 -11
  18. package/.claude/skills/workflow-commands/delegation.md +13 -8
  19. package/.claude/skills/workflow-commands/entry-sequence.md +10 -12
  20. package/.claude/skills/workflow-commands/followup.md +10 -35
  21. package/.claude/skills/workflow-commands/fullrun-steps.md +38 -49
  22. package/.claude/skills/workflow-commands/fullrun.md +6 -8
  23. package/.claude/skills/workflow-commands/halfrun.md +20 -32
  24. package/.claude/skills/workflow-commands/into-target.md +1 -2
  25. package/.claude/skills/workflow-commands/issue-comments.md +19 -15
  26. package/.claude/skills/workflow-commands/issue-scout.md +5 -4
  27. package/.claude/skills/workflow-commands/kickoff.md +24 -23
  28. package/.claude/skills/workflow-commands/latest-gate.md +9 -18
  29. package/.claude/skills/workflow-commands/needs-human-review.md +11 -19
  30. package/.claude/skills/workflow-commands/observation-filing.md +4 -50
  31. package/.claude/skills/workflow-commands/observation-ledger.md +5 -10
  32. package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -44
  33. package/.claude/skills/workflow-commands/prerequisite.md +11 -18
  34. package/.claude/skills/workflow-commands/progress-watcher.md +3 -8
  35. package/.claude/skills/workflow-commands/prrun.md +6 -12
  36. package/.claude/skills/workflow-commands/retrospective.md +5 -5
  37. package/.claude/skills/workflow-commands/split-assessment.md +14 -4
  38. package/.claude/skills/workflow-commands/target-repository.md +1 -2
  39. package/.claude/skills/workflow-commands/working-tree-hold.md +11 -13
  40. package/.codex/hooks.json +6 -6
  41. package/.github/actions/setup-node/action.yml +10 -1
  42. package/.github/actions/setup-pnpm/action.yml +1 -1
  43. package/.github/dependabot.yml +16 -0
  44. package/.github/release.yml +0 -2
  45. package/.github/workflows/ci.yml +121 -11
  46. package/.github/workflows/publish.yml +10 -3
  47. package/.github/workflows/sonar-qube.yml +1 -0
  48. package/.prettierignore +2 -0
  49. package/.vscode/tasks.json +1 -2
  50. package/CLAUDE.md +4 -8
  51. package/README.md +4 -2
  52. package/SECURITY.md +1 -1
  53. package/cspell/index.yaml +7 -0
  54. package/dist/CLAUDE.md +4 -8
  55. package/dist/commands/document-read-cli.js +882 -0
  56. package/dist/commands/{document-section-cli.js → document-section-main.js} +137 -62
  57. package/dist/commands/read-set-cli.js +1867 -0
  58. package/dist/commands/run-prep-main.js +21653 -0
  59. package/dist/commands/run-step-cli.js +23880 -0
  60. package/dist/config-merge/index.js +5 -1
  61. package/dist/hooks/audit-provision.js +20 -35
  62. package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
  63. package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
  64. package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
  65. package/dist/hooks/{chunk-AS74OU3D.js → chunk-PT5R6UJD.js} +4582 -2118
  66. package/dist/hooks/chunk-TUIFS5E7.js +72 -0
  67. package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
  68. package/dist/hooks/{chunk-E7OIKX5Z.js → chunk-WR2KQAYZ.js} +1863 -382
  69. package/dist/hooks/{chunk-KC5AK2GF.js → chunk-XGBNSWEI.js} +248 -46
  70. package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
  71. package/dist/hooks/codex-hook-adapter.js +10 -19
  72. package/dist/hooks/format-edited.js +5 -5
  73. package/dist/hooks/inputs.json +436 -257
  74. package/dist/hooks/pretool-guard.js +7 -22
  75. package/dist/hooks/session-lang.js +380 -42
  76. package/dist/hooks/stop-guard.js +8711 -782
  77. package/dist/josh.js +5263 -997
  78. package/dist/self-sync-guard/index.js +74 -10
  79. package/dist/version/index.js +115 -406
  80. package/eslint/base.js +1 -1
  81. package/lefthook/base.yml +8 -4
  82. package/package.json +17 -53
  83. package/pnpm-workspace.yaml +4 -2
  84. package/prompts/coding-standards.md +1 -1
  85. package/prompts/collaboration-workflow/file-edits.md +1 -9
  86. package/prompts/collaboration-workflow/gh-rest.md +1 -2
  87. package/prompts/collaboration-workflow/issue-citation.md +2 -4
  88. package/prompts/collaboration-workflow/issue-template.md +42 -17
  89. package/prompts/collaboration-workflow/lane-instructions.md +34 -0
  90. package/prompts/collaboration-workflow/measurement.md +37 -0
  91. package/prompts/collaboration-workflow/operating-rules.md +6 -12
  92. package/prompts/collaboration-workflow/output-bounds.md +4 -9
  93. package/prompts/collaboration-workflow/overview.md +1 -1
  94. package/prompts/collaboration-workflow/plan-comment.md +3 -42
  95. package/prompts/collaboration-workflow/principles.md +19 -8
  96. package/prompts/collaboration-workflow/report-format.md +37 -57
  97. package/prompts/collaboration-workflow/residency.md +12 -8
  98. package/prompts/collaboration-workflow/rule-delivery.md +3 -11
  99. package/prompts/collaboration-workflow/shell-body.md +8 -18
  100. package/prompts/collaboration-workflow/turn-batching.md +4 -6
  101. package/prompts/collaboration-workflow/upstream-interrupt.md +16 -6
  102. package/prompts/collaboration-workflow/wip-cap.md +7 -7
  103. package/prompts/collaboration-workflow.md +4 -7
  104. package/prompts/refactoring.md +1 -1
  105. package/prompts/review-rubric.md +1 -2
  106. package/prompts/review.md +45 -26
  107. package/prompts/testing-guide.md +10 -45
  108. package/scripts/agent/agent-argv.ts +20 -4
  109. package/scripts/agent/agent-event.ts +15 -15
  110. package/scripts/agent/agent-exit-record.ts +13 -1
  111. package/scripts/agent/agent-role-profile.ts +101 -45
  112. package/scripts/agent/agent-safe-text.ts +60 -0
  113. package/scripts/agent/api-auth.ts +41 -0
  114. package/scripts/agent/api-outage.ts +1 -1
  115. package/scripts/agent/claude-agent-argv.ts +14 -0
  116. package/scripts/agent/codex-agent-argv.ts +2 -0
  117. package/scripts/agent/lane-instructions.ts +144 -0
  118. package/scripts/auto-ok/auto-ok-cli.ts +14 -16
  119. package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
  120. package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
  121. package/scripts/auto-ok/auto-ok-judge.ts +13 -2
  122. package/scripts/auto-ok/auto-ok-main.ts +17 -0
  123. package/scripts/backlog/backlog-arrival.ts +14 -3
  124. package/scripts/backlog/backlog-budget-cli.ts +7 -33
  125. package/scripts/backlog/backlog-budget-main.ts +16 -0
  126. package/scripts/backlog/backlog-budget.ts +6 -7
  127. package/scripts/backlog/backlog-defect-priority.ts +4 -3
  128. package/scripts/backlog/backlog-drive-adopt.ts +67 -0
  129. package/scripts/backlog/backlog-drive-args.ts +4 -5
  130. package/scripts/backlog/backlog-drive-cli.ts +113 -28
  131. package/scripts/backlog/backlog-drive-hold.ts +162 -0
  132. package/scripts/backlog/backlog-drive-idle.ts +151 -0
  133. package/scripts/backlog/backlog-drive-judge.ts +25 -0
  134. package/scripts/backlog/backlog-drive-memory.ts +126 -0
  135. package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
  136. package/scripts/backlog/backlog-drive-named.ts +54 -7
  137. package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
  138. package/scripts/backlog/backlog-drive-paused.ts +169 -0
  139. package/scripts/backlog/backlog-drive-restore.ts +39 -8
  140. package/scripts/backlog/backlog-drive-seats.ts +18 -8
  141. package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
  142. package/scripts/backlog/backlog-drive.ts +79 -75
  143. package/scripts/backlog/backlog-next-main.ts +16 -0
  144. package/scripts/backlog/backlog-next-shared.ts +73 -0
  145. package/scripts/backlog/backlog-next.ts +48 -16
  146. package/scripts/backlog/backlog-occupied.ts +69 -0
  147. package/scripts/backlog/backlog-offer-cli.ts +6 -21
  148. package/scripts/backlog/backlog-offer-exclude.ts +15 -0
  149. package/scripts/backlog/backlog-offer-main.ts +12 -0
  150. package/scripts/backlog/backlog-offer.ts +36 -3
  151. package/scripts/backlog/backlog-overlap.ts +22 -4
  152. package/scripts/backlog/backlog-plan-read.ts +6 -2
  153. package/scripts/backlog/backlog-plan.ts +18 -4
  154. package/scripts/backlog/backlog-pool.ts +10 -10
  155. package/scripts/backlog/backlog-rank.ts +10 -2
  156. package/scripts/backlog/backlog-ready.ts +137 -18
  157. package/scripts/backlog/backlog-stalled-detect.ts +109 -36
  158. package/scripts/backlog/backlog-stalled.ts +52 -16
  159. package/scripts/backlog/backlog-wait-cause.ts +86 -0
  160. package/scripts/backlog/backlog-waves.ts +39 -13
  161. package/scripts/backlog/backlogrun-args.ts +19 -7
  162. package/scripts/backlog/backlogrun-cli.ts +19 -5
  163. package/scripts/backlog/backlogrun-launch.ts +6 -0
  164. package/scripts/backlog/backlogrun-restart.ts +97 -0
  165. package/scripts/backlog/backlogrun-stop.ts +79 -7
  166. package/scripts/behavior/behavior-cli.ts +2 -2
  167. package/scripts/behavior/behavior-rules.ts +47 -24
  168. package/scripts/build/build-bin.ts +2 -16
  169. package/scripts/build/build-claude-md.ts +0 -7
  170. package/scripts/build/build-commands.ts +0 -13
  171. package/scripts/build/build-hooks.ts +49 -48
  172. package/scripts/build/hook-bundle-stamp.ts +29 -11
  173. package/scripts/build/local-bin.ts +1 -1
  174. package/scripts/cases/cases-cli.ts +25 -13
  175. package/scripts/cases/cases-interaction-scan.ts +134 -0
  176. package/scripts/cases/cases-interaction.ts +183 -0
  177. package/scripts/cases/cases-logic.ts +39 -6
  178. package/scripts/ci/pr-classification-main.ts +18 -0
  179. package/scripts/ci/pr-classification.ts +10 -17
  180. package/scripts/clone/clone-scan.ts +1 -1
  181. package/scripts/cost-runtime/cost-blocks.ts +22 -37
  182. package/scripts/cost-runtime/cost-cli.ts +31 -14
  183. package/scripts/cost-runtime/cost-main.ts +12 -0
  184. package/scripts/cost-runtime/cost-transcript.ts +1 -0
  185. package/scripts/delegation/delegation-policy.ts +17 -4
  186. package/scripts/delegation/duplicate-read-guard.ts +2 -10
  187. package/scripts/delegation/investigation-guard.ts +15 -73
  188. package/scripts/delegation/investigation-reads.ts +3 -5
  189. package/scripts/dependabot/dependabot-cooldown.ts +194 -0
  190. package/scripts/discovery/repo-discovery.ts +24 -6
  191. package/scripts/doctor/doctor-consumer.ts +2 -5
  192. package/scripts/document/document-byte-budget.ts +9 -6
  193. package/scripts/document/document-scan.ts +1 -1
  194. package/scripts/document/document-section-cli.ts +17 -13
  195. package/scripts/document/document-section-main.ts +12 -0
  196. package/scripts/document/entry-read-budget.ts +2 -2
  197. package/scripts/document/read-set-cli.ts +4 -1
  198. package/scripts/epic/epic-audit-cli.ts +12 -6
  199. package/scripts/epic/epic-audit-orphans.ts +5 -8
  200. package/scripts/epic/epic-audit.ts +52 -1
  201. package/scripts/epic/epic-bundle-apply.ts +137 -0
  202. package/scripts/epic/epic-bundle-cli.ts +32 -121
  203. package/scripts/epic/epic-bundle-evidence.ts +49 -26
  204. package/scripts/epic/epic-bundle-format.ts +116 -0
  205. package/scripts/epic/epic-bundle-main.ts +17 -0
  206. package/scripts/epic/epic-bundle-referenced.ts +14 -3
  207. package/scripts/epic/epic-bundle.ts +17 -9
  208. package/scripts/epic/epic-busy.ts +5 -12
  209. package/scripts/epic/epic-classify.ts +24 -15
  210. package/scripts/epic/epic-cli-argv.ts +31 -0
  211. package/scripts/epic/epic-cli-decide.ts +42 -0
  212. package/scripts/epic/epic-cli.ts +6 -38
  213. package/scripts/epic/epic-close.ts +112 -55
  214. package/scripts/epic/epic-cross-repo.ts +4 -7
  215. package/scripts/epic/epic-decide.ts +119 -0
  216. package/scripts/epic/epic-decision.ts +9 -0
  217. package/scripts/epic/epic-fetch.ts +4 -0
  218. package/scripts/epic/epic-graph.ts +2 -0
  219. package/scripts/epic/epic-issue.ts +5 -1
  220. package/scripts/epic/epic-label-age.ts +1 -1
  221. package/scripts/epic/epic-lane-offer.ts +39 -4
  222. package/scripts/epic/epic-next-main.ts +24 -0
  223. package/scripts/epic/epic-next.ts +6 -24
  224. package/scripts/epic/epic-outside-blocker.ts +6 -2
  225. package/scripts/epic/epic-parse.ts +9 -3
  226. package/scripts/epic/epic-read.ts +1 -0
  227. package/scripts/epic/epic-reconcile.ts +39 -0
  228. package/scripts/epic/epic-run.ts +10 -1
  229. package/scripts/epic/epic-solo.ts +50 -14
  230. package/scripts/epic/epic.ts +41 -7
  231. package/scripts/exports/unused-members-cli.ts +2 -2
  232. package/scripts/followup/followup-checks-event.ts +8 -3
  233. package/scripts/followup/followup-coderabbit-wait.ts +82 -0
  234. package/scripts/followup/followup-review-gates.ts +81 -0
  235. package/scripts/followup/git-followup-stages.ts +13 -3
  236. package/scripts/followup/git-followup-workflow.ts +31 -60
  237. package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
  238. package/scripts/followup/git-pr-followup.ts +36 -8
  239. package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
  240. package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
  241. package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
  242. package/scripts/gate/busy-average.ts +58 -0
  243. package/scripts/gate/check-cpu.ts +60 -0
  244. package/scripts/gate/check-inputs.ts +73 -0
  245. package/scripts/gate/check-reuse.ts +141 -0
  246. package/scripts/gate/command-memory.ts +192 -0
  247. package/scripts/gate/core-admission.ts +218 -28
  248. package/scripts/gate/core-budget-timing.ts +37 -0
  249. package/scripts/gate/core-budget.ts +150 -119
  250. package/scripts/gate/core-wait-record.ts +48 -0
  251. package/scripts/gate/core-wait.ts +162 -0
  252. package/scripts/gate/core-weights.ts +86 -0
  253. package/scripts/gate/free-cores.ts +72 -0
  254. package/scripts/gate/gate-ledger.ts +49 -7
  255. package/scripts/gate/gate-plan.ts +44 -15
  256. package/scripts/gate/gate-report.ts +29 -4
  257. package/scripts/gate/gate-run-steps.ts +195 -0
  258. package/scripts/gate/gate-skip.ts +12 -2
  259. package/scripts/gate/gate-steps.ts +12 -1
  260. package/scripts/gate/held-mark.ts +55 -0
  261. package/scripts/gate/input-fingerprint.ts +42 -0
  262. package/scripts/gate/machine-capacity.ts +124 -31
  263. package/scripts/gate/moved-paths.ts +67 -0
  264. package/scripts/gate/pre-commit-type-check.ts +14 -1
  265. package/scripts/gate/project-checks.ts +5 -12
  266. package/scripts/gate/scoped-green.ts +12 -8
  267. package/scripts/gate/since-green.ts +62 -0
  268. package/scripts/gate/toolchain-inputs.ts +115 -0
  269. package/scripts/gate/verification-gate.ts +65 -129
  270. package/scripts/gate/verification-inputs.ts +250 -0
  271. package/scripts/gh/gh-author-association.ts +96 -9
  272. package/scripts/gh/git-ai-review-scan.ts +4 -2
  273. package/scripts/gh/git-gh-api-path.ts +15 -0
  274. package/scripts/gh/git-gh-branch-rules.ts +73 -0
  275. package/scripts/gh/git-gh-conditional.ts +5 -2
  276. package/scripts/gh/git-gh-issue-read.ts +5 -1
  277. package/scripts/gh/git-gh-issue-rest.ts +1 -0
  278. package/scripts/gh/git-gh-issue-write.ts +77 -17
  279. package/scripts/gh/git-gh-issue.ts +7 -3
  280. package/scripts/gh/git-gh-poll-read.ts +89 -0
  281. package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
  282. package/scripts/gh/git-gh-pr-rest.ts +1 -1
  283. package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
  284. package/scripts/gh/git-gh-pr.ts +27 -15
  285. package/scripts/gh/git-pr-checks-eval.ts +39 -7
  286. package/scripts/gh/git-pr-checks-parse.ts +39 -9
  287. package/scripts/gh/git-pr-merge-checked.ts +80 -0
  288. package/scripts/gh/git-pr.ts +13 -1
  289. package/scripts/git/base-tree.ts +19 -2
  290. package/scripts/git/changed-file-scope.ts +6 -4
  291. package/scripts/git/changed-paths.ts +18 -1
  292. package/scripts/git/git-diff-reads.ts +27 -2
  293. package/scripts/git/git-grep-hits.ts +85 -0
  294. package/scripts/git/git-location-environment.ts +1 -1
  295. package/scripts/git/git-merge-conflicts.ts +83 -0
  296. package/scripts/git/git-preflight.ts +37 -12
  297. package/scripts/git/git-push-transport.ts +1 -2
  298. package/scripts/git/git-schemas.ts +17 -7
  299. package/scripts/git/git-spawn.ts +1 -2
  300. package/scripts/git/git-status.ts +4 -4
  301. package/scripts/git/main-merge-main.ts +12 -0
  302. package/scripts/git/main-merge-regenerate.ts +78 -0
  303. package/scripts/git/main-merge.ts +39 -14
  304. package/scripts/git/main-sync-main.ts +12 -0
  305. package/scripts/git/main-sync.ts +0 -9
  306. package/scripts/git/stash/git-stash.ts +27 -4
  307. package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
  308. package/scripts/git/stash/stash-pop-cli.ts +6 -12
  309. package/scripts/git/stash/stash-pop-main.ts +12 -0
  310. package/scripts/git/stash/stash-push-cli.ts +76 -0
  311. package/scripts/git/stash/stash-push-main.ts +12 -0
  312. package/scripts/hooks/batch-guard.ts +5 -16
  313. package/scripts/hooks/check-commit-message-main.ts +8 -0
  314. package/scripts/hooks/check-commit-message.ts +4 -7
  315. package/scripts/hooks/format-edited-file.ts +8 -24
  316. package/scripts/hooks/pre-commit-lint.ts +118 -0
  317. package/scripts/hooks/pre-push-unit.ts +4 -2
  318. package/scripts/hooks/pretool-guard-cli.ts +1 -8
  319. package/scripts/hooks/pretool-guard.ts +57 -69
  320. package/scripts/hooks/reserved-run.ts +67 -8
  321. package/scripts/hooks/run-hook.sh +18 -11
  322. package/scripts/hooks/shell-rules-notice.ts +37 -0
  323. package/scripts/hooks/stop-actions.ts +185 -0
  324. package/scripts/hooks/stop-guard.ts +72 -27
  325. package/scripts/init/hook-command-rewrite.ts +19 -5
  326. package/scripts/init/hook-launch.ts +15 -12
  327. package/scripts/init/init-actions.ts +0 -6
  328. package/scripts/init/init-ai-copy.ts +10 -36
  329. package/scripts/init/init-bootstrap.ts +9 -8
  330. package/scripts/init/init-dry-run-report.ts +1 -1
  331. package/scripts/init/init-dry-run.ts +1 -1
  332. package/scripts/init/init-file-action.ts +7 -9
  333. package/scripts/init/init-logic-json-merge.ts +2 -2
  334. package/scripts/init/init-logic-migrate.ts +9 -82
  335. package/scripts/init/init-logic.ts +3 -2
  336. package/scripts/init/init-main.ts +12 -0
  337. package/scripts/init/init.ts +5 -12
  338. package/scripts/init/kit-development-versions.ts +3 -7
  339. package/scripts/init/kit-written-paths.ts +2 -2
  340. package/scripts/init/project-profile.ts +5 -4
  341. package/scripts/init/tsconfig-preset-migration.ts +2 -1
  342. package/scripts/init/vscode-tasks.ts +1 -1
  343. package/scripts/issue/defect-origin-cli.ts +106 -0
  344. package/scripts/issue/defect-origin-line.ts +60 -0
  345. package/scripts/issue/defect-origin-main.ts +11 -0
  346. package/scripts/issue/defect-origin.ts +114 -0
  347. package/scripts/issue/defect-rate-cli.ts +34 -78
  348. package/scripts/issue/defect-rate.ts +0 -16
  349. package/scripts/issue/defect-report-cli.ts +128 -0
  350. package/scripts/issue/defect-report-format.ts +56 -0
  351. package/scripts/issue/defect-report-main.ts +11 -0
  352. package/scripts/issue/defect-report.ts +160 -0
  353. package/scripts/issue/expected-effect-lint.ts +60 -0
  354. package/scripts/issue/issue-already-done-cli.ts +62 -0
  355. package/scripts/issue/issue-body-or-comment.ts +40 -0
  356. package/scripts/issue/issue-cite-cli.ts +33 -22
  357. package/scripts/issue/issue-cite-main.ts +12 -0
  358. package/scripts/issue/issue-classification.ts +13 -8
  359. package/scripts/issue/issue-comment-cli.ts +10 -24
  360. package/scripts/issue/issue-comment-main.ts +12 -0
  361. package/scripts/issue/issue-evidence-exit.ts +100 -0
  362. package/scripts/issue/issue-file-cli.ts +29 -7
  363. package/scripts/issue/issue-file.ts +19 -19
  364. package/scripts/issue/issue-fold-cli.ts +2 -11
  365. package/scripts/issue/issue-fold-main.ts +12 -0
  366. package/scripts/issue/issue-labels.ts +81 -90
  367. package/scripts/issue/issue-lint-cli.ts +7 -13
  368. package/scripts/issue/issue-lint-main.ts +12 -0
  369. package/scripts/issue/issue-measured-cli.ts +56 -0
  370. package/scripts/issue/issue-merged.ts +19 -2
  371. package/scripts/issue/issue-not-before-label.ts +135 -0
  372. package/scripts/issue/issue-not-before.ts +111 -0
  373. package/scripts/issue/issue-number-shape.ts +15 -1
  374. package/scripts/issue/issue-park.ts +28 -0
  375. package/scripts/issue/issue-plan-cli.ts +151 -0
  376. package/scripts/issue/issue-priority.ts +151 -0
  377. package/scripts/issue/issue-rank.ts +7 -1
  378. package/scripts/issue/issue-read-cli.ts +3 -10
  379. package/scripts/issue/issue-read-main.ts +12 -0
  380. package/scripts/issue/issue-read.ts +29 -5
  381. package/scripts/issue/issue-release-cli.ts +0 -10
  382. package/scripts/issue/issue-release-main.ts +13 -0
  383. package/scripts/issue/issue-release.ts +7 -12
  384. package/scripts/issue/issue-sample-gate.ts +192 -0
  385. package/scripts/issue/issue-sample-source.ts +76 -0
  386. package/scripts/issue/issue-scout-cli.ts +19 -25
  387. package/scripts/issue/issue-scout-main.ts +14 -0
  388. package/scripts/issue/issue-state-cli.ts +0 -10
  389. package/scripts/issue/issue-state-main.ts +12 -0
  390. package/scripts/issue/issue-watch-diff.ts +56 -15
  391. package/scripts/issue/issue-watch.ts +2 -1
  392. package/scripts/issue/issue-wip.ts +2 -7
  393. package/scripts/issue/markdown-section.ts +19 -5
  394. package/scripts/issue/measure-rerun-cli.ts +13 -8
  395. package/scripts/issue/plan-consumers-cli.ts +39 -0
  396. package/scripts/issue/plan-consumers-main.ts +11 -0
  397. package/scripts/issue/plan-consumers-section.ts +55 -0
  398. package/scripts/issue/plan-consumers.ts +127 -0
  399. package/scripts/josh/agent-session-environment.ts +1 -1
  400. package/scripts/josh/command-usage.ts +82 -0
  401. package/scripts/josh/file-map-stamp.ts +49 -16
  402. package/scripts/josh/hook-decision.ts +32 -20
  403. package/scripts/josh/josh-command-map.ts +6 -1
  404. package/scripts/josh/josh-command-types.ts +65 -13
  405. package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
  406. package/scripts/josh/josh-commands-ai.ts +169 -157
  407. package/scripts/josh/josh-commands-backlog.ts +82 -16
  408. package/scripts/josh/josh-commands-clone.ts +1 -0
  409. package/scripts/josh/josh-commands-development.ts +111 -71
  410. package/scripts/josh/josh-commands-document.ts +43 -1
  411. package/scripts/josh/josh-commands-epic.ts +171 -0
  412. package/scripts/josh/josh-commands-hooks.ts +31 -2
  413. package/scripts/josh/josh-commands-issue-write.ts +181 -0
  414. package/scripts/josh/josh-commands-issue.ts +124 -24
  415. package/scripts/josh/josh-commands-lane.ts +112 -2
  416. package/scripts/josh/josh-commands-lint.ts +19 -8
  417. package/scripts/josh/josh-commands-maintenance.ts +112 -4
  418. package/scripts/josh/josh-commands-pause.ts +29 -0
  419. package/scripts/josh/josh-commands-progress.ts +87 -0
  420. package/scripts/josh/josh-commands-project.ts +138 -9
  421. package/scripts/josh/josh-commands-review.ts +124 -0
  422. package/scripts/josh/josh-commands-run.ts +211 -23
  423. package/scripts/josh/josh-commands-ship.ts +169 -0
  424. package/scripts/josh/josh-commands-split.ts +9 -0
  425. package/scripts/josh/josh-commands-versioning.ts +49 -2
  426. package/scripts/josh/josh-commands-workflow.ts +149 -6
  427. package/scripts/josh/josh-logic.ts +11 -27
  428. package/scripts/josh/josh.ts +14 -5
  429. package/scripts/josh/package-directory.ts +18 -0
  430. package/scripts/josh/process-identity.ts +13 -4
  431. package/scripts/josh/session-language-cli.ts +4 -8
  432. package/scripts/josh/session-language-main.ts +13 -0
  433. package/scripts/josh/session-language.ts +6 -1
  434. package/scripts/josh/shared-cache.ts +90 -0
  435. package/scripts/josh/stamp-file.ts +9 -15
  436. package/scripts/lane/lane-await.ts +51 -12
  437. package/scripts/lane/lane-cache.ts +5 -30
  438. package/scripts/lane/lane-capacity.ts +19 -22
  439. package/scripts/lane/lane-check-stats.ts +97 -0
  440. package/scripts/lane/lane-child-invocation.ts +43 -4
  441. package/scripts/lane/lane-cli.ts +15 -5
  442. package/scripts/lane/lane-close.ts +86 -18
  443. package/scripts/lane/lane-core-wait-stats.ts +66 -0
  444. package/scripts/lane/lane-dispatch.ts +27 -6
  445. package/scripts/lane/lane-gap-stats.ts +156 -0
  446. package/scripts/lane/lane-guard-policy.ts +2 -2
  447. package/scripts/lane/lane-handoff.ts +76 -1
  448. package/scripts/lane/lane-held-stats.ts +129 -0
  449. package/scripts/lane/lane-install.ts +16 -15
  450. package/scripts/lane/lane-launch-cli.ts +0 -9
  451. package/scripts/lane/lane-launch-main.ts +12 -0
  452. package/scripts/lane/lane-ledger-schema.ts +266 -0
  453. package/scripts/lane/lane-ledger.ts +108 -97
  454. package/scripts/lane/lane-limit-cli.ts +19 -9
  455. package/scripts/lane/lane-measure-cli.ts +58 -10
  456. package/scripts/lane/lane-open.ts +9 -1
  457. package/scripts/lane/lane-parked.ts +3 -3
  458. package/scripts/lane/lane-pause-cli.ts +130 -0
  459. package/scripts/lane/lane-pause.ts +158 -0
  460. package/scripts/lane/lane-preserve.ts +29 -1
  461. package/scripts/lane/lane-process-table.ts +166 -0
  462. package/scripts/lane/lane-reap-settle.ts +124 -0
  463. package/scripts/lane/lane-reap.ts +50 -15
  464. package/scripts/lane/lane-registry.ts +33 -10
  465. package/scripts/lane/lane-residents.ts +162 -0
  466. package/scripts/lane/lane-restart.ts +26 -27
  467. package/scripts/lane/lane-round-two-stats.ts +49 -0
  468. package/scripts/lane/lane-sampler.ts +4 -0
  469. package/scripts/lane/lane-session-action.ts +160 -0
  470. package/scripts/lane/lane-session-broker.ts +134 -134
  471. package/scripts/lane/lane-snapshot-trace.ts +84 -0
  472. package/scripts/lane/lane-spans.ts +51 -0
  473. package/scripts/lane/lane-spent.ts +6 -3
  474. package/scripts/lane/lane-stage-stats.ts +7 -2
  475. package/scripts/lane/lane-state.ts +302 -0
  476. package/scripts/lane/lane-stats.ts +58 -4
  477. package/scripts/lane/lane-stop-stats.ts +113 -37
  478. package/scripts/lane/lane-test-related-stats.ts +127 -0
  479. package/scripts/lane/lane-transcript-calls.ts +145 -0
  480. package/scripts/lane/lane-transcript-stats.ts +168 -0
  481. package/scripts/lane/lane-vacant.ts +13 -3
  482. package/scripts/lane/lane-withdraw-cli.ts +72 -0
  483. package/scripts/lane/lane-withdraw.ts +183 -0
  484. package/scripts/lane/process-directories.ts +70 -0
  485. package/scripts/lane/process-lane-marks.ts +94 -0
  486. package/scripts/lib/atomic-write.ts +62 -0
  487. package/scripts/lib/buffered-process.ts +12 -5
  488. package/scripts/lib/cli-flags.ts +53 -0
  489. package/scripts/lib/figure-format.ts +63 -0
  490. package/scripts/lib/json-value.ts +9 -1
  491. package/scripts/lib/package-manifest.ts +35 -0
  492. package/scripts/lib/read-file.ts +3 -1
  493. package/scripts/lib/stamped-memo.ts +63 -0
  494. package/scripts/lib/stdout-on-stderr.ts +24 -0
  495. package/scripts/lib/timeouts.ts +9 -0
  496. package/scripts/lib/transcript-record.ts +91 -0
  497. package/scripts/lines/effective-limit.ts +1 -1
  498. package/scripts/lint/eslint-cache-dependencies.ts +145 -0
  499. package/scripts/lint/eslint-daemon.ts +265 -0
  500. package/scripts/lint/format.ts +14 -5
  501. package/scripts/lint/import-graph.ts +279 -0
  502. package/scripts/lint/lint-gate-scope.ts +102 -0
  503. package/scripts/lint/lint-parallel-main.ts +19 -0
  504. package/scripts/lint/lint-parallel.ts +72 -33
  505. package/scripts/lint/lint-related-scope.ts +33 -24
  506. package/scripts/lint/lint-related.ts +38 -6
  507. package/scripts/notify/confirmation-options.ts +1 -2
  508. package/scripts/notify/telegram-notify.ts +20 -20
  509. package/scripts/notify/telegram-test-logic.ts +0 -1
  510. package/scripts/notify/telegram-test-main.ts +8 -0
  511. package/scripts/notify/telegram-test.ts +12 -11
  512. package/scripts/observations/observation-ledger.ts +13 -0
  513. package/scripts/observations/observations-flush-landing.ts +5 -3
  514. package/scripts/observations/observations-flush.ts +6 -1
  515. package/scripts/overrides/overrides-check.ts +2 -5
  516. package/scripts/overrides/overrides-files.ts +2 -1
  517. package/scripts/overrides/overrides-logic.ts +3 -6
  518. package/scripts/package/verify-optional-eslint-install.ts +8 -6
  519. package/scripts/propagate/propagate-publish.ts +2 -7
  520. package/scripts/propagate/propagate-targets.ts +4 -12
  521. package/scripts/refactor/import-graph.ts +9 -7
  522. package/scripts/release/github-release-runs.ts +17 -6
  523. package/scripts/release/release-approval-prune.ts +18 -0
  524. package/scripts/release/release-history.ts +1 -3
  525. package/scripts/release/release-progress.ts +42 -22
  526. package/scripts/release/release-publish-run.ts +39 -0
  527. package/scripts/release/release-publish.ts +6 -6
  528. package/scripts/release/release-scope-cli.ts +0 -10
  529. package/scripts/release/release-scope-main.ts +12 -0
  530. package/scripts/repo/repo-setting.ts +3 -6
  531. package/scripts/repo/required-checks-logic.ts +6 -15
  532. package/scripts/report/report-format-reference.ts +4 -0
  533. package/scripts/report/report-labels.ts +155 -0
  534. package/scripts/report/report-lint-cli.ts +3 -0
  535. package/scripts/report/report-lint.ts +85 -110
  536. package/scripts/report/report-template-cli.ts +59 -0
  537. package/scripts/report/report-template.ts +112 -0
  538. package/scripts/review/acceptance-map-check.ts +61 -0
  539. package/scripts/review/acceptance-map.ts +206 -0
  540. package/scripts/review/removed-tests-check.ts +86 -0
  541. package/scripts/review/removed-tests.ts +149 -0
  542. package/scripts/review/review-brief-cli.ts +82 -16
  543. package/scripts/review/review-brief-main.ts +12 -0
  544. package/scripts/review/review-brief.ts +31 -3
  545. package/scripts/review/review-code-tree.ts +10 -6
  546. package/scripts/review/review-comment-round.ts +26 -8
  547. package/scripts/review/review-finding-ledger.ts +30 -15
  548. package/scripts/review/review-interaction.ts +94 -0
  549. package/scripts/review/review-readers-scan.ts +163 -0
  550. package/scripts/review/review-record-cli.ts +69 -30
  551. package/scripts/review/review-record-main.ts +12 -0
  552. package/scripts/review/review-round-one-blobs.ts +221 -0
  553. package/scripts/review/review-round2-cli.ts +49 -12
  554. package/scripts/review/review-round2.ts +80 -12
  555. package/scripts/review/review-stamps.ts +19 -1
  556. package/scripts/review/review-stop-log.ts +96 -0
  557. package/scripts/review/review-stops-cli.ts +85 -0
  558. package/scripts/review/review-tree.ts +6 -17
  559. package/scripts/review/review-untouched-readers.ts +146 -0
  560. package/scripts/review/test-titles.ts +118 -0
  561. package/scripts/rules/agent-model.ts +67 -0
  562. package/scripts/rules/bash-triggers.ts +46 -3
  563. package/scripts/rules/decision-oracle-batch.ts +9 -1
  564. package/scripts/rules/decision-oracle.ts +2 -2
  565. package/scripts/rules/delivered-rules.ts +90 -3
  566. package/scripts/rules/destructive-command.ts +8 -1
  567. package/scripts/rules/direct-filing.ts +10 -2
  568. package/scripts/rules/direct-issue-comment.ts +117 -0
  569. package/scripts/rules/direct-pr-create.ts +69 -3
  570. package/scripts/rules/early-heartbeat.ts +2 -1
  571. package/scripts/rules/file-body.ts +7 -0
  572. package/scripts/rules/filing-cap.ts +8 -0
  573. package/scripts/rules/firing-point.ts +6 -5
  574. package/scripts/rules/git-argv.ts +72 -14
  575. package/scripts/rules/git-force.ts +12 -2
  576. package/scripts/rules/guard-remedy.ts +121 -0
  577. package/scripts/rules/implementation-cut-verdict.ts +1 -1
  578. package/scripts/rules/implementation-cut.ts +11 -3
  579. package/scripts/rules/index-guard.ts +8 -1
  580. package/scripts/rules/issue-comments.ts +76 -7
  581. package/scripts/rules/josh-git-bare.ts +7 -0
  582. package/scripts/rules/lane-background.ts +67 -25
  583. package/scripts/rules/lane-carry-conflict.ts +6 -0
  584. package/scripts/rules/lane-direct-tool.ts +74 -0
  585. package/scripts/rules/lane-interactive-ask.ts +9 -2
  586. package/scripts/rules/lane-park.ts +45 -23
  587. package/scripts/rules/lane-split-park.ts +10 -2
  588. package/scripts/rules/lane-switch-main.ts +7 -0
  589. package/scripts/rules/last-prompt.ts +50 -5
  590. package/scripts/rules/oracle-consulted.ts +10 -0
  591. package/scripts/rules/oracle-firing.ts +1 -0
  592. package/scripts/rules/oracle-list-cli.ts +7 -0
  593. package/scripts/rules/permission-guards.ts +3 -0
  594. package/scripts/rules/piped-verification.ts +4 -2
  595. package/scripts/rules/poll-loop.ts +7 -0
  596. package/scripts/rules/pr-merge.ts +123 -0
  597. package/scripts/rules/protected-files.ts +32 -5
  598. package/scripts/rules/raw-field-body.ts +6 -0
  599. package/scripts/rules/rule-body-guard.ts +8 -0
  600. package/scripts/rules/rule-list.ts +12 -28
  601. package/scripts/rules/rule-rewrite.ts +114 -0
  602. package/scripts/rules/rule-value-cache.ts +4 -9
  603. package/scripts/rules/rule-value-cli.ts +51 -32
  604. package/scripts/rules/rule-value.ts +8 -2
  605. package/scripts/rules/shell-segments.ts +50 -0
  606. package/scripts/rules/stop-decision.ts +77 -0
  607. package/scripts/rules/stop-rule-rows.ts +64 -0
  608. package/scripts/rules/stop-rules.ts +150 -51
  609. package/scripts/rules/tail-commands.ts +15 -1
  610. package/scripts/rules/test-declared-commit.ts +11 -1
  611. package/scripts/rules/third-party-write.ts +7 -0
  612. package/scripts/rules/timed-rerun.ts +69 -0
  613. package/scripts/rules/worktree-guard.ts +13 -3
  614. package/scripts/run/board/run-board-app-name.ts +23 -0
  615. package/scripts/run/board/run-board-cli.ts +65 -30
  616. package/scripts/run/board/run-board-closed.ts +8 -2
  617. package/scripts/run/board/run-board-earlier.ts +94 -0
  618. package/scripts/run/board/run-board-ending-reason.ts +67 -0
  619. package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
  620. package/scripts/run/board/run-board-estimate.ts +98 -0
  621. package/scripts/run/board/run-board-fit.ts +153 -36
  622. package/scripts/run/board/run-board-fold.ts +123 -0
  623. package/scripts/run/board/run-board-fresh.ts +2 -2
  624. package/scripts/run/board/run-board-gather-live.ts +29 -0
  625. package/scripts/run/board/run-board-gather-thread.ts +189 -0
  626. package/scripts/run/board/run-board-gather-worker.ts +29 -0
  627. package/scripts/run/board/run-board-gather.ts +187 -0
  628. package/scripts/run/board/run-board-github.ts +119 -31
  629. package/scripts/run/board/run-board-header.ts +86 -21
  630. package/scripts/run/board/run-board-keys.ts +58 -0
  631. package/scripts/run/board/run-board-kind.ts +20 -6
  632. package/scripts/run/board/run-board-labels.ts +118 -71
  633. package/scripts/run/board/run-board-lane-state.ts +109 -0
  634. package/scripts/run/board/run-board-lane-time.ts +122 -0
  635. package/scripts/run/board/run-board-layout.ts +240 -61
  636. package/scripts/run/board/run-board-length.ts +52 -0
  637. package/scripts/run/board/run-board-machine.ts +8 -4
  638. package/scripts/run/board/run-board-main.ts +12 -0
  639. package/scripts/run/board/run-board-notes.ts +52 -31
  640. package/scripts/run/board/run-board-now.ts +1 -1
  641. package/scripts/run/board/run-board-operation.ts +15 -33
  642. package/scripts/run/board/run-board-phase.ts +1 -1
  643. package/scripts/run/board/run-board-plan-shared.ts +115 -0
  644. package/scripts/run/board/run-board-plan.ts +55 -3
  645. package/scripts/run/board/run-board-planning.ts +45 -0
  646. package/scripts/run/board/run-board-priority.ts +44 -0
  647. package/scripts/run/board/run-board-process-groups.ts +195 -0
  648. package/scripts/run/board/run-board-read.ts +153 -13
  649. package/scripts/run/board/run-board-reason.ts +238 -45
  650. package/scripts/run/board/run-board-released.ts +35 -0
  651. package/scripts/run/board/run-board-render-checks.ts +39 -5
  652. package/scripts/run/board/run-board-render-condition.ts +96 -0
  653. package/scripts/run/board/run-board-render-drawn.ts +67 -0
  654. package/scripts/run/board/run-board-render-foot.ts +59 -0
  655. package/scripts/run/board/run-board-render-icon.ts +35 -0
  656. package/scripts/run/board/run-board-render-lanes.ts +145 -0
  657. package/scripts/run/board/run-board-render-lead.ts +80 -0
  658. package/scripts/run/board/run-board-render-legend.ts +117 -47
  659. package/scripts/run/board/run-board-render-notes.ts +156 -29
  660. package/scripts/run/board/run-board-render-processes.ts +196 -0
  661. package/scripts/run/board/run-board-render-section.ts +119 -0
  662. package/scripts/run/board/run-board-render-slot.ts +3 -36
  663. package/scripts/run/board/run-board-render-tail.ts +115 -48
  664. package/scripts/run/board/run-board-render-time.ts +56 -0
  665. package/scripts/run/board/run-board-render-title.ts +117 -24
  666. package/scripts/run/board/run-board-render-waits.ts +125 -0
  667. package/scripts/run/board/run-board-render.ts +206 -259
  668. package/scripts/run/board/run-board-roots.ts +54 -0
  669. package/scripts/run/board/run-board-row-yield.ts +10 -4
  670. package/scripts/run/board/run-board-setup.ts +1 -12
  671. package/scripts/run/board/run-board-snapshot.ts +111 -0
  672. package/scripts/run/board/run-board-spin.ts +2 -2
  673. package/scripts/run/board/run-board-state.ts +23 -29
  674. package/scripts/run/board/run-board-status.ts +206 -79
  675. package/scripts/run/board/run-board-thanks-read.ts +2 -2
  676. package/scripts/run/board/run-board-tick.ts +123 -104
  677. package/scripts/run/board/run-board-usage-board.ts +78 -0
  678. package/scripts/run/board/run-board-usage-lanes.ts +113 -0
  679. package/scripts/run/board/run-board-usage-listing.ts +93 -0
  680. package/scripts/run/board/run-board-usage-read.ts +120 -150
  681. package/scripts/run/board/run-board-usage-rusage.ts +19 -7
  682. package/scripts/run/board/run-board-usage-text.ts +139 -51
  683. package/scripts/run/board/run-board-usage-top.ts +102 -0
  684. package/scripts/run/board/run-board-usage.ts +89 -72
  685. package/scripts/run/board/run-board-usual.ts +20 -9
  686. package/scripts/run/carry/run-carry-args.ts +4 -7
  687. package/scripts/run/carry/run-carry-conversation.ts +1 -1
  688. package/scripts/run/carry/run-carry.ts +9 -4
  689. package/scripts/run/cut/run-cut-cli.ts +3 -2
  690. package/scripts/run/cut/run-cut-handoff.ts +2 -2
  691. package/scripts/run/cut/run-cut-report.ts +16 -0
  692. package/scripts/run/detached-launch.ts +23 -4
  693. package/scripts/run/entry/run-entry-cli.ts +8 -1
  694. package/scripts/run/event/run-event-cli.ts +1 -5
  695. package/scripts/run/event/run-event-filed.ts +12 -6
  696. package/scripts/run/event/run-event-follow.ts +2 -3
  697. package/scripts/run/event/run-event-render.ts +7 -10
  698. package/scripts/run/event/run-event-scope.ts +20 -2
  699. package/scripts/run/event/run-event-stream-emit.ts +78 -11
  700. package/scripts/run/event/run-event-stream.ts +37 -7
  701. package/scripts/run/hold/run-hold-adopt.ts +65 -0
  702. package/scripts/run/hold/run-hold-cli.ts +93 -22
  703. package/scripts/run/hold/run-hold-main.ts +12 -0
  704. package/scripts/run/hold/run-hold-member.ts +37 -0
  705. package/scripts/run/hold/run-hold-session.ts +46 -0
  706. package/scripts/run/hold/run-hold.ts +7 -1
  707. package/scripts/run/hold/run-stop-notify.ts +183 -0
  708. package/scripts/run/launch-priority.ts +32 -0
  709. package/scripts/run/merge/run-merge-auth.ts +31 -0
  710. package/scripts/run/merge/run-merge-cli.ts +72 -107
  711. package/scripts/run/merge/run-merge-close.ts +74 -0
  712. package/scripts/run/merge/run-merge-collect.ts +6 -13
  713. package/scripts/run/merge/run-merge-driver.ts +71 -0
  714. package/scripts/run/merge/run-merge-main.ts +12 -0
  715. package/scripts/run/merge/run-merge-outcome.ts +23 -0
  716. package/scripts/run/merge/run-merge-restart.ts +39 -0
  717. package/scripts/run/merge/run-merge-ship.ts +20 -4
  718. package/scripts/run/merge/run-merge-signals.ts +123 -0
  719. package/scripts/run/merge/run-merge-steps.ts +128 -83
  720. package/scripts/run/merge/run-merge.ts +53 -40
  721. package/scripts/run/park/run-park-cli.ts +91 -0
  722. package/scripts/run/park/run-park.ts +88 -0
  723. package/scripts/run/park/run-stalled.ts +68 -0
  724. package/scripts/run/pause/run-pause-cli.ts +73 -0
  725. package/scripts/run/pause/run-pause.ts +251 -0
  726. package/scripts/run/progress/run-progress-cli.ts +4 -12
  727. package/scripts/run/progress/run-progress-clock.ts +1 -1
  728. package/scripts/run/progress/run-progress-config.ts +6 -14
  729. package/scripts/run/progress/run-progress-main.ts +12 -0
  730. package/scripts/run/progress/run-progress.ts +1 -4
  731. package/scripts/run/review/run-review.ts +2 -1
  732. package/scripts/run/run-ending.ts +1 -0
  733. package/scripts/run/run-invocation.ts +5 -6
  734. package/scripts/run/run-liveness-cli.ts +6 -8
  735. package/scripts/run/run-liveness.ts +61 -30
  736. package/scripts/run/run-next.ts +1 -1
  737. package/scripts/run/run-parent-cut-hook.ts +2 -2
  738. package/scripts/run/run-poll-hook.ts +157 -0
  739. package/scripts/run/run-preflight.ts +18 -3
  740. package/scripts/run/run-prep-cli.ts +1 -10
  741. package/scripts/run/run-prep-locate.ts +7 -50
  742. package/scripts/run/run-prep-main.ts +12 -0
  743. package/scripts/run/run-prep.ts +6 -0
  744. package/scripts/run/run-report-cli.ts +101 -13
  745. package/scripts/run/run-report-handoff.ts +114 -0
  746. package/scripts/run/run-step-cli.ts +22 -15
  747. package/scripts/run/run-step-section.ts +85 -0
  748. package/scripts/run/run-step.ts +1 -1
  749. package/scripts/run/run-stranded-detect.ts +13 -0
  750. package/scripts/run/run-watcher-guard-cli.ts +1 -1
  751. package/scripts/run/run-watcher-guard.ts +1 -1
  752. package/scripts/run/ship/run-ship-args.ts +121 -0
  753. package/scripts/run/ship/run-ship-body-draft.ts +110 -0
  754. package/scripts/run/ship/run-ship-cli.ts +67 -151
  755. package/scripts/run/ship/run-ship-detach.ts +27 -7
  756. package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
  757. package/scripts/run/ship/run-ship-next.ts +27 -3
  758. package/scripts/run/ship/run-ship-overlap.ts +232 -0
  759. package/scripts/run/ship/run-ship-place.ts +96 -0
  760. package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
  761. package/scripts/run/ship/run-ship-pre-detach.ts +102 -27
  762. package/scripts/run/ship/run-ship-preflight.ts +161 -30
  763. package/scripts/run/ship/run-ship-probe.ts +11 -3
  764. package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
  765. package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
  766. package/scripts/run/ship/run-ship-return.ts +123 -15
  767. package/scripts/run/ship/run-ship-review-steps.ts +105 -149
  768. package/scripts/run/ship/run-ship-review.ts +73 -6
  769. package/scripts/run/ship/run-ship-reviewer.ts +207 -0
  770. package/scripts/run/ship/run-ship-stage.ts +55 -6
  771. package/scripts/run/ship/run-ship-steps.ts +46 -15
  772. package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
  773. package/scripts/run/ship/run-ship-stop-context.ts +206 -0
  774. package/scripts/run/ship/run-ship-stop-text.ts +11 -6
  775. package/scripts/run/ship/run-ship-sync.ts +57 -12
  776. package/scripts/run/ship/run-ship.ts +30 -2
  777. package/scripts/run/tidy/run-tidy-cli.ts +0 -4
  778. package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
  779. package/scripts/run/tidy/run-tidy-main.ts +8 -0
  780. package/scripts/run/wake/run-wake-cli.ts +119 -100
  781. package/scripts/run/wake/run-wake-code.ts +83 -0
  782. package/scripts/run/wake/run-wake-driver.ts +19 -8
  783. package/scripts/run/wake/run-wake-loop.ts +34 -3
  784. package/scripts/run/wake/run-wake-main.ts +13 -0
  785. package/scripts/run/wake/run-wake-ports.ts +90 -0
  786. package/scripts/run/wake/run-wake-takeover.ts +66 -0
  787. package/scripts/run/wake/run-wake.ts +2 -1
  788. package/scripts/safe-chain/pack-hook.ts +2 -2
  789. package/scripts/safe-chain/preinstall-command.ts +2 -1
  790. package/scripts/safe-chain/project-config.ts +3 -9
  791. package/scripts/security/security-audit-main.ts +8 -0
  792. package/scripts/security/security-audit-provision-logic.ts +0 -11
  793. package/scripts/security/security-audit-provision-main.ts +12 -0
  794. package/scripts/security/security-audit-provision.ts +11 -26
  795. package/scripts/security/security-audit.ts +6 -7
  796. package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
  797. package/scripts/split/split-assess-cli.ts +2 -2
  798. package/scripts/split/split-assess.ts +15 -0
  799. package/scripts/split/split-measure.ts +65 -0
  800. package/scripts/sync/claude-settings-merge.ts +8 -15
  801. package/scripts/sync/directory-copy-guard.ts +4 -9
  802. package/scripts/sync/file-content.ts +78 -8
  803. package/scripts/sync/sync-ai-files.ts +3 -5
  804. package/scripts/sync/sync-configs.ts +11 -23
  805. package/scripts/sync/sync-hook-safety.ts +4 -10
  806. package/scripts/sync/sync-main.ts +11 -0
  807. package/scripts/sync/sync.ts +25 -37
  808. package/scripts/test/test-declared-changed.ts +2 -2
  809. package/scripts/test/test-declared.ts +1 -1
  810. package/scripts/test/test-e2e-guard.ts +55 -6
  811. package/scripts/test/test-e2e-stamp.ts +38 -0
  812. package/scripts/test/test-pinned-logic.ts +145 -0
  813. package/scripts/test/test-pinned-main.ts +78 -0
  814. package/scripts/test/test-pinned.ts +100 -0
  815. package/scripts/test/test-read-map.ts +264 -0
  816. package/scripts/test/test-read-recording.ts +91 -0
  817. package/scripts/test/test-read-trace.ts +148 -0
  818. package/scripts/test/test-red-main.ts +12 -0
  819. package/scripts/test/test-red.ts +12 -30
  820. package/scripts/test/test-related-main.ts +18 -0
  821. package/scripts/test/test-related-record.ts +119 -0
  822. package/scripts/test/test-related-scope.ts +229 -43
  823. package/scripts/test/test-related.ts +300 -22
  824. package/scripts/test/test-unit-guard-main.ts +15 -0
  825. package/scripts/test/test-unit-guard.ts +54 -21
  826. package/scripts/test/unit-count-file.ts +37 -0
  827. package/scripts/test/unit-run-marker.ts +162 -0
  828. package/scripts/test/unit-setup-files.ts +51 -0
  829. package/scripts/test/unit-worker-share.ts +71 -137
  830. package/scripts/test/whole-suite-files.ts +63 -0
  831. package/scripts/time-runtime/time-background.ts +20 -2
  832. package/scripts/time-runtime/time-bundles.ts +4 -3
  833. package/scripts/time-runtime/time-density-hook.ts +8 -6
  834. package/scripts/time-runtime/time-followup-stage.ts +1 -3
  835. package/scripts/time-runtime/time-format.ts +5 -28
  836. package/scripts/time-runtime/time-markers.ts +10 -1
  837. package/scripts/time-runtime/time-shell.ts +126 -14
  838. package/scripts/time-runtime/time-spans.ts +1 -0
  839. package/scripts/time-runtime/time-tool-call.ts +7 -0
  840. package/scripts/time-runtime/time-transcript-line.ts +49 -62
  841. package/scripts/uninstall/uninstall.ts +1 -1
  842. package/scripts/version/bump-version-main.ts +12 -0
  843. package/scripts/version/bump-version.ts +25 -25
  844. package/scripts/version/effective-upstream.ts +6 -12
  845. package/scripts/version/latest-corepack.ts +17 -32
  846. package/scripts/version/latest-if-required-cli.ts +93 -0
  847. package/scripts/version/latest-lane-guard-main.ts +8 -0
  848. package/scripts/version/latest-lane-guard.ts +0 -4
  849. package/scripts/version/latest-scope-cli.ts +0 -9
  850. package/scripts/version/latest-scope-main.ts +12 -0
  851. package/scripts/version/latest-update.ts +5 -5
  852. package/scripts/version/npm-registry.ts +44 -6
  853. package/scripts/version/publishable-range-check.ts +5 -16
  854. package/scripts/version/release-age.ts +1 -1
  855. package/scripts/version/release-hold.ts +1 -1
  856. package/scripts/version/release-window.ts +38 -0
  857. package/scripts/version/running-binary.ts +1 -1
  858. package/scripts/version/safe-chain-version-update.ts +3 -8
  859. package/scripts/version/version-targets.ts +6 -28
  860. package/templates/dependabot.yml +29 -0
  861. package/templates/gitignore +10 -3
  862. package/templates/pnpm-workspace.basic.yaml +1 -1
  863. package/templates/sonar-project.properties +3 -2
  864. package/templates/workflows/ci.yml +12 -4
  865. package/templates/workflows/github-release.yml +4 -0
  866. package/tsconfig.sonar.json +1 -1
  867. package/.ncurc.json +0 -3
  868. package/dist/hooks/batch-guard.js +0 -29
  869. package/dist/hooks/chunk-43ZHT22P.js +0 -3495
  870. package/dist/hooks/chunk-CDY4NFQG.js +0 -15
  871. package/dist/hooks/chunk-EUMACUK2.js +0 -2038
  872. package/dist/hooks/chunk-H5HVWYXK.js +0 -359
  873. package/dist/hooks/chunk-IIGFYXKC.js +0 -7104
  874. package/dist/hooks/chunk-IX6TTTI6.js +0 -95
  875. package/dist/hooks/chunk-J47HU5H5.js +0 -237
  876. package/dist/hooks/chunk-K4EOONYM.js +0 -45
  877. package/dist/hooks/chunk-K4LMBQC2.js +0 -68
  878. package/dist/hooks/chunk-SHGPANFB.js +0 -56
  879. package/dist/hooks/chunk-YHBZAJSV.js +0 -79
  880. package/dist/hooks/chunk-YYPI7SJZ.js +0 -131
  881. package/dist/hooks/duplicate-read-guard.js +0 -30
  882. package/dist/hooks/investigation-guard.js +0 -32
  883. package/scripts/backlog/backlog-stalled-cli.ts +0 -30
  884. package/scripts/cost-runtime/cost-format.ts +0 -29
  885. package/scripts/init/basic-path-migration.ts +0 -24
  886. package/scripts/issue/issue-backlinks-cli.ts +0 -93
  887. package/scripts/josh/josh-commands-guard.ts +0 -38
  888. package/scripts/lint/cross-file-recheck.ts +0 -155
  889. package/scripts/registry-migration/migrate-logic.ts +0 -237
  890. package/scripts/registry-migration/migrate.ts +0 -292
  891. package/scripts/registry-migration/user-npmrc.ts +0 -15
  892. package/scripts/rules/rule-guard.ts +0 -23
  893. package/scripts/rules/rule-registry-rows.ts +0 -282
  894. package/scripts/rules/rule-registry.ts +0 -109
  895. package/scripts/run/run-stranded-cli.ts +0 -27
@@ -1,4 +1,4 @@
1
- import { existsSync } from 'node:fs'
1
+ import { existsSync, statSync } from 'node:fs'
2
2
  import path from 'node:path'
3
3
  import { ENV_FILE_NAME } from '#ports'
4
4
  import type { AgentProfile } from '#scripts/agent/agent-role-profile'
@@ -38,6 +38,9 @@ interface LaneInfo {
38
38
  // instead of waiting for the pool to drain before it can be cut.
39
39
  output: string | undefined
40
40
  profile?: AgentProfile | undefined
41
+ // When the lane last took a child: `lane:open` writes its `.env`, and every dispatch records its
42
+ // unit there (`lane-output.ts`). `undefined` where the `.env` cannot be read.
43
+ dispatched_ms?: number | undefined
41
44
  is_stranded: boolean
42
45
  }
43
46
 
@@ -106,6 +109,10 @@ function read_environment(directory: string): string | undefined {
106
109
  return file_reader.read_if_readable(path.join(directory, ENV_FILE_NAME))
107
110
  }
108
111
 
112
+ function dispatched_at(directory: string): number | undefined {
113
+ return statSync(path.join(directory, ENV_FILE_NAME), { throwIfNoEntry: false })?.mtimeMs
114
+ }
115
+
109
116
  // A lane is identified by its branch rather than by where it sits, so nothing here compares two
110
117
  // spellings of one path — git prints the resolved one, and a lane root reached through a symlink
111
118
  // would otherwise read as no lane at all.
@@ -151,6 +158,7 @@ function build_lane(
151
158
  preview_port: held.preview_port,
152
159
  output,
153
160
  profile,
161
+ dispatched_ms: is_stranded ? undefined : dispatched_at(directory),
154
162
  is_stranded,
155
163
  }
156
164
  }
@@ -214,9 +222,28 @@ async function main_repository_root(): Promise<string> {
214
222
  return repo_discovery.main_worktree(await git_command.repository_root())
215
223
  }
216
224
 
217
- /** Every open lane of this repository, lowest issue number first. */
218
- async function list_lanes(): Promise<Array<LaneInfo>> {
219
- const root = lane_paths.lane_root(await main_repository_root())
225
+ /**
226
+ * The directory this repository's lanes live in, read from the main work tree rather than this one —
227
+ * derived from the current work tree, a command run inside a lane would look for lanes inside it.
228
+ */
229
+ async function lane_root_directory(): Promise<string> {
230
+ return lane_paths.lane_root(await main_repository_root())
231
+ }
232
+
233
+ /**
234
+ * The issue's lane by the directory its number implies, registered or not — what ending its processes
235
+ * needs (`lane_reap.reap_child`), so a lane `list_lanes` no longer reads is still reached.
236
+ */
237
+ async function lane_location(issue: string): Promise<Pick<LaneInfo, 'issue' | 'directory'>> {
238
+ return { issue, directory: lane_paths.lane_directory(await lane_root_directory(), issue) }
239
+ }
240
+
241
+ /**
242
+ * Every open lane of this repository, lowest issue number first. `main_root` is the main work tree a
243
+ * caller already resolved — `run:board` resolves it once rather than with a `git` call each read.
244
+ */
245
+ async function list_lanes(main_root?: string): Promise<Array<LaneInfo>> {
246
+ const root = lane_paths.lane_root(main_root ?? (await main_repository_root()))
220
247
  const blocks = await worktree_blocks()
221
248
  const lanes = blocks.map((block) => parse_block(block, root)).filter(is_lane)
222
249
 
@@ -241,11 +268,6 @@ async function has_lanes_in_flight(): Promise<boolean> {
241
268
  return lanes.some((lane) => !lane.is_stranded)
242
269
  }
243
270
 
244
- /** The lanes in use: the open work trees an interruption has not stranded. */
245
- function live_count(lanes: ReadonlyArray<LaneInfo>): number {
246
- return lanes.filter((lane) => !lane.is_stranded).length
247
- }
248
-
249
271
  /** The seats live lanes hold — what a new lane's seat has to avoid. */
250
272
  function used_seats(lanes: ReadonlyArray<LaneInfo>): Array<number> {
251
273
  return lanes.map((lane) => lane.seat).filter((seat): seat is number => seat !== undefined)
@@ -276,8 +298,9 @@ const lane_registry = {
276
298
  find_lane,
277
299
  find_open_lane,
278
300
  has_lanes_in_flight,
301
+ lane_location,
302
+ lane_root_directory,
279
303
  list_lanes,
280
- live_count,
281
304
  main_repository_root,
282
305
  parse_block,
283
306
  read_environment,
@@ -0,0 +1,162 @@
1
+ import { spawnSync } from 'node:child_process'
2
+ import path from 'node:path'
3
+ import { PROBE_TIMEOUT_MS } from '#scripts/lib/timeouts'
4
+ import { lane_reap } from './lane-reap'
5
+ import { process_directories } from './process-directories'
6
+ import { process_lane_marks } from './process-lane-marks'
7
+
8
+ // Ending what still runs from a lane's checkout, or carries its mark, when the lane closes
9
+ // (joshuafolkken/kit#4304, joshuafolkken/kit#4315).
10
+ //
11
+ // **The lane child's tree and its `eslint_d` are not everything a lane starts.** A diagnostic the
12
+ // child launched under `script`, or a `node` it detached, is re-parented to pid 1 and outlives the
13
+ // merge: no tree reaches it and no title names it, and `run:board` drew such processes as a leftover
14
+ // holding gigabytes while nothing ended them. Its working directory still sits under the lane, which
15
+ // is what finds it — the same reading the board's leftover is drawn from (`process-directories.ts`).
16
+ // **A process the child started from elsewhere** — a measurement run from the main checkout or `/tmp`
17
+ // — has no such directory, so the lane's mark it inherited finds it instead (`process-lane-marks.ts`):
18
+ // the issue number `lane:dispatch` put in the child's environment. A process without the mark, or with
19
+ // another issue's, is never this lane's.
20
+ //
21
+ // **Only that lane's processes, and never the caller.** Another lane's and the main checkout's
22
+ // unmarked processes are not its. A `lane:close` run from inside the lane would match itself, so its
23
+ // ancestry is spared, as `lane-reap.ts` spares it — and so is its process group: its own helpers
24
+ // (`tsx`'s `esbuild`) and the commands piped beside it share the group, while a detached process
25
+ // (`script`, a new session) has left it.
26
+
27
+ const GROUP_ARGUMENTS = ['-o', 'pid=,pgid=', '-p']
28
+ const PID_SEPARATOR = ','
29
+ // `ps`'s line: the process and its group.
30
+ const PAIR_LENGTH = 2
31
+
32
+ interface ResidentLane {
33
+ issue: string
34
+ directory: string
35
+ }
36
+
37
+ interface ResidentProbes {
38
+ // `undefined` where the working directories could not be read.
39
+ directories: () => ReadonlyMap<number, string> | undefined
40
+ // Each marked process's issue; `undefined` where the marks could not be read.
41
+ marks: () => ReadonlyMap<number, string> | undefined
42
+ own: () => ReadonlySet<number>
43
+ // Each listed process's group; a process gone by then is missing.
44
+ groups_of: (pids: ReadonlyArray<number>) => ReadonlyMap<number, number>
45
+ terminate: (pid: number) => boolean
46
+ }
47
+
48
+ function parse_groups(printed: string): Map<number, number> {
49
+ const pairs = printed
50
+ .split('\n')
51
+ .map((line) => line.trim().split(/\s+/u).map(Number))
52
+ .filter((pair) => pair.length === PAIR_LENGTH && pair.every((id) => Number.isSafeInteger(id)))
53
+
54
+ return new Map(pairs.map(([pid = 0, group = 0]) => [pid, group] as const))
55
+ }
56
+
57
+ // `ps` exits non-zero when a listed process is gone and still prints the rest, so its output is read
58
+ // whatever the exit status.
59
+ function groups_of(pids: ReadonlyArray<number>): Map<number, number> {
60
+ const result = spawnSync(lane_reap.PS_COMMAND, [...GROUP_ARGUMENTS, pids.join(PID_SEPARATOR)], {
61
+ encoding: 'utf8',
62
+ timeout: PROBE_TIMEOUT_MS,
63
+ stdio: ['ignore', 'pipe', 'ignore'],
64
+ })
65
+
66
+ return parse_groups(result.stdout)
67
+ }
68
+
69
+ const SYSTEM_PROBES: ResidentProbes = {
70
+ directories: () => process_directories.list_all(),
71
+ marks: () => process_lane_marks.list_all(),
72
+ own: () => lane_reap.own_ancestry(),
73
+ groups_of,
74
+ terminate: (pid) => lane_reap.SYSTEM_PROBES.terminate(pid),
75
+ }
76
+
77
+ // The candidates outside the caller's process group. The caller's own group unread spares nothing
78
+ // more: its ancestry is spared regardless.
79
+ function outside_own_group(candidates: Array<number>, probes: ResidentProbes): Array<number> {
80
+ if (candidates.length === 0) return candidates
81
+ const groups = probes.groups_of([process.pid, ...candidates])
82
+ const own_group = groups.get(process.pid)
83
+
84
+ return candidates.filter((pid) => own_group === undefined || groups.get(pid) !== own_group)
85
+ }
86
+
87
+ // Every process running from the lane's directory or carrying its mark, once each.
88
+ function lane_processes(
89
+ lane: ResidentLane,
90
+ directories: ReadonlyMap<number, string>,
91
+ marks: ReadonlyMap<number, string>,
92
+ ): Array<number> {
93
+ const root = path.dirname(lane.directory)
94
+ const within = [...directories]
95
+ .filter(([, cwd]) => process_directories.lane_of(cwd, root) === lane.issue)
96
+ .map(([pid]) => pid)
97
+ const marked = [...marks].filter(([, issue]) => issue === lane.issue).map(([pid]) => pid)
98
+
99
+ return [...new Set([...within, ...marked])]
100
+ }
101
+
102
+ /**
103
+ * The processes running from `lane`'s directory or carrying its mark, the caller's ancestry and process
104
+ * group left out; `undefined` where the working directories or the marks could not be read.
105
+ */
106
+ function residents(
107
+ lane: ResidentLane,
108
+ probes: ResidentProbes = SYSTEM_PROBES,
109
+ ): Array<number> | undefined {
110
+ const directories = probes.directories()
111
+ const marks = probes.marks()
112
+
113
+ if (directories === undefined || marks === undefined) return undefined
114
+ const own = probes.own()
115
+ const candidates = lane_processes(lane, directories, marks).filter((pid) => !own.has(pid))
116
+
117
+ return outside_own_group(candidates, probes)
118
+ }
119
+
120
+ /**
121
+ * Terminate the processes still running from `lane`'s directory or carrying its mark, except `spared`
122
+ * — what the close already ended. Returns the pids the signal reached, `undefined` where they could
123
+ * not be read.
124
+ */
125
+ function end_residents(
126
+ lane: ResidentLane,
127
+ spared: ReadonlyArray<number>,
128
+ probes: ResidentProbes = SYSTEM_PROBES,
129
+ ): Array<number> | undefined {
130
+ return residents(lane, probes)
131
+ ?.filter((pid) => !spared.includes(pid))
132
+ .filter((pid) => probes.terminate(pid))
133
+ }
134
+
135
+ /**
136
+ * What `end_residents` did, said for the issue `cited`; `undefined` when nothing of the lane still ran.
137
+ * A reading that failed is said, never read as none.
138
+ */
139
+ function residents_sentence(
140
+ ended: ReadonlyArray<number> | undefined,
141
+ cited: string,
142
+ ): string | undefined {
143
+ if (ended === undefined) {
144
+ return `Could not read which processes still run from the lane for ${cited} (lsof or ps failed); none of them was ended.`
145
+ }
146
+
147
+ if (ended.length === 0) return undefined
148
+
149
+ return `Terminated ${String(ended.length)} process(es) still running from the lane for ${cited}: ${ended.join(', ')}.`
150
+ }
151
+
152
+ /** Print `residents_sentence` to stderr, where a close reports what it ended. */
153
+ function report(ended: ReadonlyArray<number> | undefined, cited: string): void {
154
+ const sentence = residents_sentence(ended, cited)
155
+
156
+ if (sentence !== undefined) console.error(sentence)
157
+ }
158
+
159
+ const lane_residents = { end_residents, parse_groups, report, residents, residents_sentence }
160
+
161
+ export type { ResidentLane, ResidentProbes }
162
+ export { lane_residents }
@@ -3,21 +3,21 @@ import { issue_cite } from '#scripts/issue/issue-cite'
3
3
  import { IN_PROGRESS_LABEL } from '#scripts/issue/issue-labels'
4
4
  import { issue_number_shape } from '#scripts/issue/issue-number-shape'
5
5
  import { session_cite } from '#scripts/issue/session-cite'
6
- import { error_text } from '#scripts/lib/error-message'
7
6
  import { run_cut } from '#scripts/run/cut/run-cut'
8
7
  import { run_event_stream } from '#scripts/run/event/run-event-stream'
9
8
  import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
10
9
  import { lane_dispatch, type DispatchOutcome } from './lane-dispatch'
11
- import { lane_preserve } from './lane-preserve'
10
+ import { lane_preserve, type KeptWork } from './lane-preserve'
12
11
  import { lane_reap } from './lane-reap'
13
12
  import { lane_registry, type LaneInfo } from './lane-registry'
13
+ import { lane_residents } from './lane-residents'
14
14
 
15
15
  // `josh lane:restart <N>` — a person stops a running lane child and starts its issue over in a fresh
16
16
  // session, typically after correcting the Issue's specification mid-run.
17
17
  //
18
18
  // **The restart is a hand-off inside the parent's re-confirm window, not a recovery.** Killing the child
19
19
  // alone would let `lane:await` book it stopped and `run:merge` classify it — an `outage` resumes the old
20
- // session with the old specification in mind, anything else is parked `needs-decision` and counted as a
20
+ // session with the old specification in mind, anything else is parked `run:stalled` and counted as a
21
21
  // failure. `run:cut` already hands a lane to a new process inside `lane:await`'s re-confirm window, so a
22
22
  // child that disappears and reappears under the same `fullrun #<N>` pattern is never collected: the
23
23
  // restart stops, stashes and re-dispatches within that window, and no failure or outage is counted.
@@ -37,12 +37,9 @@ const DISPATCHED_KIND = 'dispatched'
37
37
  const NO_LANE_KIND = 'no-lane'
38
38
  const NOT_RUNNING_KIND = 'not-running'
39
39
  const UNCLAIMED_KIND = 'unclaimed'
40
+ const CONFLICTED_KIND = 'conflicted'
40
41
 
41
- interface Unsaved {
42
- kind: 'unsaved'
43
- directory: string
44
- reason: string
45
- }
42
+ type Unsaved = Extract<KeptWork, { kind: 'unsaved' }>
46
43
 
47
44
  interface Restarted {
48
45
  kind: 'restarted'
@@ -54,8 +51,8 @@ type Refused =
54
51
  | { kind: typeof NO_LANE_KIND }
55
52
  | { kind: typeof NOT_RUNNING_KIND }
56
53
  | { kind: typeof UNCLAIMED_KIND; reason: string }
54
+ | { kind: typeof CONFLICTED_KIND; directory: string }
57
55
  type RestartOutcome = Restarted | Unsaved | Refused
58
- type Saved = Unsaved | { kind: 'saved'; stash: string | undefined }
59
56
 
60
57
  // A cut the stopped child carried would hand its successor the old session's hand-off at
61
58
  // `run:cut --resume`; the fresh session has to start from the Issue instead.
@@ -65,22 +62,6 @@ function end_carried_cut(lane: LaneInfo): void {
65
62
  if (carried !== undefined) run_cut.end_cut(carried.target)
66
63
  }
67
64
 
68
- async function stash_of(lane: LaneInfo): Promise<string | undefined> {
69
- if (!(await git_stash.has_changes(lane.directory))) return undefined
70
-
71
- return await lane_preserve.push_work(lane.issue, lane.directory, RESTART_OCCASION)
72
- }
73
-
74
- // A tree that could not be read or pushed is left as it is: re-dispatching into it would hand the fresh
75
- // session the stopped one's half-done work as though it were its own.
76
- async function save_work(lane: LaneInfo): Promise<Saved> {
77
- try {
78
- return { kind: 'saved', stash: await stash_of(lane) }
79
- } catch (error) {
80
- return { kind: 'unsaved', directory: lane.directory, reason: error_text.message_of(error) }
81
- }
82
- }
83
-
84
65
  async function record_restart(issue: string): Promise<void> {
85
66
  await run_event_stream_emit.emit(
86
67
  run_event_stream.EVENT_KIND.RESTART,
@@ -88,9 +69,11 @@ async function record_restart(issue: string): Promise<void> {
88
69
  )
89
70
  }
90
71
 
72
+ // A tree that could not be read or pushed is left as it is: re-dispatching into it would hand the fresh
73
+ // session the stopped one's half-done work as though it were its own.
91
74
  async function relaunch(lane: LaneInfo): Promise<RestartOutcome> {
92
75
  end_carried_cut(lane)
93
- const saved = await save_work(lane)
76
+ const saved = await lane_preserve.keep_work(lane.issue, lane.directory, RESTART_OCCASION)
94
77
 
95
78
  if (saved.kind === 'unsaved') return saved
96
79
  const dispatch = await lane_dispatch.dispatch_child(lane.issue, 'restart')
@@ -106,12 +89,19 @@ async function relaunch(lane: LaneInfo): Promise<RestartOutcome> {
106
89
 
107
90
  // A child that ended on its own during the claim (say, right after merging its PR) is a finished child
108
91
  // for `run:merge` to collect — relaunching it would re-run a done issue inside the re-confirm window.
92
+ // What the stopped child started outside its tree goes with it, so the fresh session starts beside none
93
+ // of it (`lane-residents.ts`).
109
94
  async function stop_and_relaunch(lane: LaneInfo): Promise<RestartOutcome> {
110
- if (lane_reap.reap_child(lane.issue).length === 0) return { kind: NOT_RUNNING_KIND }
95
+ const reaped = lane_reap.reap_child(lane)
96
+
97
+ if (reaped.length === 0) return { kind: NOT_RUNNING_KIND }
98
+ lane_residents.report(lane_residents.end_residents(lane, reaped), session_cite.issue(lane.issue))
111
99
 
112
100
  return await relaunch(lane)
113
101
  }
114
102
 
103
+ // A tree with unresolved conflicts (a sync's merge stopped mid-way) cannot be stashed, so it is refused
104
+ // before the stop — stopping first would strand the lane with no child and nothing re-dispatched.
115
105
  /** Stop the running child of `#<N>`'s lane and re-dispatch the issue there in a fresh session. */
116
106
  async function restart(issue: string): Promise<RestartOutcome> {
117
107
  issue_number_shape.require_issue_number(issue)
@@ -119,6 +109,11 @@ async function restart(issue: string): Promise<RestartOutcome> {
119
109
 
120
110
  if (lane === undefined) return { kind: NO_LANE_KIND }
121
111
  if (!lane_reap.is_child_running(issue)) return { kind: NOT_RUNNING_KIND }
112
+
113
+ if (await git_stash.has_conflict(lane.directory)) {
114
+ return { kind: CONFLICTED_KIND, directory: lane.directory }
115
+ }
116
+
122
117
  const claim = await lane_dispatch.claim_marker(issue)
123
118
 
124
119
  if (!claim.is_applied) return { kind: UNCLAIMED_KIND, reason: claim.reason }
@@ -154,6 +149,10 @@ function refused_text(outcome: Refused, issue: string): string {
154
149
  return `No lane is open for ${cited}, so there is no child to restart.`
155
150
  }
156
151
 
152
+ if (outcome.kind === CONFLICTED_KIND) {
153
+ return `The lane for ${cited} has unresolved conflicts, which \`git stash\` cannot keep, so the running child was left as it is — nothing was stopped or re-dispatched. Resolve them, or run \`git -C ${outcome.directory} merge --abort\`, then run \`pnpm josh lane:restart ${issue}\` again.`
154
+ }
155
+
157
156
  if (outcome.kind === UNCLAIMED_KIND) {
158
157
  return `The \`${IN_PROGRESS_LABEL}\` label could not be confirmed on ${cited} (${outcome.reason}), so the running child was left as it is — nothing was stopped or re-dispatched.`
159
158
  }
@@ -0,0 +1,49 @@
1
+ import { lane_ledger, type LedgerEntry, type RoundTwoEntry } from './lane-ledger'
2
+ import { lane_stats, type StatsWindow } from './lane-stats'
3
+
4
+ // Why round 2 ran or was skipped: the ledger's `round-two` entries of one period reduced to one row per
5
+ // verdict and reason code, printed by `josh lane:stats` so the next change — to the procedure, or to
6
+ // what counts as an inert fix — is chosen from counts rather than impressions (joshuafolkken/kit#4064).
7
+
8
+ const COLUMNS = ['round 2', 'code', 'decisions'] as const
9
+ const KEY_SEPARATOR = ' '
10
+ // A period with no decision: the table still prints, so a reader sees zero rather than no table.
11
+ const NONE_ROW = ['none', 'none', '0']
12
+
13
+ function is_round_two(entry: LedgerEntry): entry is RoundTwoEntry {
14
+ return entry.kind === lane_ledger.KIND.ROUND_TWO
15
+ }
16
+
17
+ function counts_of(decisions: ReadonlyArray<RoundTwoEntry>): Map<string, number> {
18
+ const counts = new Map<string, number>()
19
+
20
+ for (const decision of decisions) {
21
+ const key = `${decision.verdict}${KEY_SEPARATOR}${decision.code}`
22
+
23
+ counts.set(key, (counts.get(key) ?? 0) + 1)
24
+ }
25
+
26
+ return counts
27
+ }
28
+
29
+ // The most frequent pair first, so the reason worth acting on leads.
30
+ function rows_of(counts: ReadonlyMap<string, number>): Array<string> {
31
+ return [...counts]
32
+ .toSorted(([, left], [, right]) => right - left)
33
+ .map(([key, count]) => lane_stats.to_row([...key.split(KEY_SEPARATOR), String(count)]))
34
+ }
35
+
36
+ // The period's table: `entries` is the whole ledger, filtered here to `window`.
37
+ function table(entries: ReadonlyArray<LedgerEntry>, window: StatsWindow): string {
38
+ const rows = rows_of(counts_of(lane_stats.in_window(entries, window).filter(is_round_two)))
39
+
40
+ return [
41
+ lane_stats.to_row(COLUMNS),
42
+ lane_stats.to_row(COLUMNS.map(() => '---')),
43
+ ...(rows.length === 0 ? [lane_stats.to_row(NONE_ROW)] : rows),
44
+ ].join('\n')
45
+ }
46
+
47
+ const lane_round_two_stats = { table }
48
+
49
+ export { lane_round_two_stats }
@@ -14,6 +14,10 @@ const SAMPLE_INTERVAL_MS = 60_000
14
14
  // Where the ledger is and what "now" is, overridable so a test reads a fixed ledger at a fixed instant.
15
15
  interface MeasureContext {
16
16
  ledger_path?: string
17
+ // The run's event stream `lane:stats` reads parks from; absent, the repository's own.
18
+ events_path?: string
19
+ // The lane transcript directories `lane:stats` reads tool calls from; absent, this repository's lanes'.
20
+ transcript_directories?: ReadonlyArray<string>
17
21
  now_ms?: number
18
22
  }
19
23
 
@@ -0,0 +1,160 @@
1
+ import { agent_argv } from '#scripts/agent/agent-argv'
2
+ import { agent_role_profile, type AgentProvider } from '#scripts/agent/agent-role-profile'
3
+ import { api_auth } from '#scripts/agent/api-auth'
4
+ import { stamp_file } from '#scripts/josh/stamp-file'
5
+ import { error_text } from '#scripts/lib/error-message'
6
+ import { detached_launch, type AttachedLaunchResult } from '#scripts/run/detached-launch'
7
+ import { run_ship_review } from '#scripts/run/ship/run-ship-review'
8
+ import { run_ship_stage } from '#scripts/run/ship/run-ship-stage'
9
+ import { run_ship_stop_cause } from '#scripts/run/ship/run-ship-stop-cause'
10
+ import { run_ship_stop_context } from '#scripts/run/ship/run-ship-stop-context'
11
+ import { z } from 'zod'
12
+ import { lane_child_invocation, type ShipStop } from './lane-child-invocation'
13
+ import { lane_child_marker } from './lane-child-marker'
14
+ import { lane_parked } from './lane-parked'
15
+ import type { LaneInfo } from './lane-registry'
16
+ import { lane_relaunch } from './lane-relaunch'
17
+
18
+ // The actions a lane's session broker performs for the ship that asked (`lane-session-broker.ts`):
19
+ // starting the round-1 or round-2 reviewer, or relaunching the lane's child after a stopped ship.
20
+ // **A failure names its reason**: a bare `false` left every relaunch a stale supervisor refused
21
+ // unexplained in the ship log (joshuafolkken/kit#3974).
22
+
23
+ const BRIEF_PREFIX = 'josh-ship-review-brief-'
24
+ const FINDINGS_PREFIX = 'josh-ship-review-findings-'
25
+ const LOG_PREFIX = 'josh-ship-review-log-'
26
+ const ANTHROPIC_PROVIDER: AgentProvider = 'anthropic'
27
+ const stop_schema = z
28
+ .object({
29
+ stage: z.enum(run_ship_stage.STAGE),
30
+ title: z.string(),
31
+ flags: z.array(z.string()).readonly(),
32
+ is_review: z.boolean(),
33
+ conflicts: z.array(z.string()).readonly().default([]),
34
+ cause: z.enum(run_ship_stop_cause.CAUSE).exactOptional(),
35
+ is_review_stale: z.boolean().exactOptional(),
36
+ context: run_ship_stop_context.stop_context_schema.exactOptional(),
37
+ })
38
+ .strict()
39
+ const action_schema = z.discriminatedUnion('kind', [
40
+ z.object({ kind: z.literal('review'), round: z.enum(['1', '2']) }).strict(),
41
+ z.object({ kind: z.literal('relaunch'), stop: stop_schema }).strict(),
42
+ ])
43
+ type ReviewRound = Extract<z.infer<typeof action_schema>, { kind: 'review' }>['round']
44
+ type BrokerAction = { kind: 'review'; round: ReviewRound } | { kind: 'relaunch'; stop: ShipStop }
45
+ type BrokerAnswer = { is_success: true } | { is_success: false; reason: string }
46
+
47
+ const SUCCESS: BrokerAnswer = { is_success: true }
48
+
49
+ function failure(reason: string): BrokerAnswer {
50
+ return { is_success: false, reason }
51
+ }
52
+
53
+ function review_paths(directory: string): { brief: string; findings: string; log: string } {
54
+ return {
55
+ brief: stamp_file.stamp_path(BRIEF_PREFIX, directory, '.md'),
56
+ findings: stamp_file.stamp_path(FINDINGS_PREFIX, directory, '.txt'),
57
+ log: stamp_file.stamp_path(LOG_PREFIX, directory, '.log'),
58
+ }
59
+ }
60
+
61
+ // The reviewer runs on the lane's own provider, so a Claude lane's server never starts a Codex reviewer
62
+ // and an OpenAI lane's never starts a Claude one.
63
+ function provider_of(lane: LaneInfo): AgentProvider {
64
+ return lane.profile?.provider ?? ANTHROPIC_PROVIDER
65
+ }
66
+
67
+ // **The reviewer carries the lane's mark explicitly**: the supervisor serving a Claude lane is no lane child,
68
+ // so a reviewer inheriting its environment would descend from the carry record's owner unmarked and be
69
+ // read as the `backlogrun` parent by every hook. **Its prompt ends with the review invocation**, so the
70
+ // lane's liveness read and the park's reap find it as they find the child (joshuafolkken/kit#3878).
71
+
72
+ function review_prompt(lane: LaneInfo, round: ReviewRound): string {
73
+ const target = review_paths(lane.directory)
74
+ const prompt_of =
75
+ round === '1' ? run_ship_review.reviewer_prompt : run_ship_review.verification_prompt
76
+ const tail = lane_child_invocation.review_invocation(lane.issue)
77
+
78
+ return `${prompt_of(target.brief, target.findings, lane.issue)} This is ${tail}`
79
+ }
80
+
81
+ // **A reviewer that could not authenticate names it** with `api_auth.AUTH_FAILURE_NOTE`, read off its
82
+ // log's exit record, so the ship stop is not booked as a review finding (joshuafolkken/kit#4216).
83
+ function exited_answer(exit_code: number | null, log_path: string): BrokerAnswer {
84
+ const exited = `the reviewer exited with code ${String(exit_code)}`
85
+
86
+ if (!api_auth.is_auth_failed_transcript(stamp_file.read_stamp_text(log_path))) {
87
+ return failure(exited)
88
+ }
89
+
90
+ return failure(`${api_auth.AUTH_FAILURE_NOTE}: ${exited}`)
91
+ }
92
+
93
+ function reviewer_answer(result: AttachedLaunchResult, log_path: string): BrokerAnswer {
94
+ if (result.kind === 'failed') return failure(`the reviewer could not start: ${result.note}`)
95
+
96
+ return result.exit_code === 0 ? SUCCESS : exited_answer(result.exit_code, log_path)
97
+ }
98
+
99
+ async function launch_review(lane: LaneInfo, round: ReviewRound): Promise<BrokerAnswer> {
100
+ const target = review_paths(lane.directory)
101
+ const built = agent_argv.review_in(review_prompt(lane, round), Number(round), lane.directory)
102
+ if (built.kind === 'rejected') return failure(`the reviewer profile was rejected: ${built.note}`)
103
+
104
+ if (built.profile.provider !== provider_of(lane)) {
105
+ return failure(`the reviewer resolved to ${built.profile.provider}, not the lane's provider`)
106
+ }
107
+
108
+ console.error(agent_role_profile.describe_review(Number(round), built.profile))
109
+ const result = await detached_launch.launch_attached(
110
+ {
111
+ argv: built.argv,
112
+ cwd: lane.directory,
113
+ log_path: target.log,
114
+ profile: built.profile,
115
+ env: lane_child_marker.env_for(lane.issue),
116
+ },
117
+ console.error,
118
+ )
119
+
120
+ return reviewer_answer(result, target.log)
121
+ }
122
+
123
+ // An OpenAI lane's successor is its supervisor's to start, never a relaunch's.
124
+ function relaunch(lane: LaneInfo, stop: ShipStop): BrokerAnswer {
125
+ if (lane_relaunch.is_openai_lane(lane)) {
126
+ return failure('an OpenAI lane is relaunched by its own supervisor')
127
+ }
128
+
129
+ const invocation = lane_child_invocation.ship_stop_invocation(lane.issue, stop)
130
+ const phase = agent_role_profile.IMPLEMENTATION_PHASE
131
+ const result = lane_relaunch.relaunch(lane, invocation, phase, console.error)
132
+
133
+ return result.kind === 'launched'
134
+ ? SUCCESS
135
+ : failure(`the relaunch did not start: ${result.note}`)
136
+ }
137
+
138
+ // **A parked issue gets no session**: a request can be read long after it was written, so the park is
139
+ // read when the action runs, never when it was asked for (joshuafolkken/kit#3878).
140
+ async function perform(lane: LaneInfo, action: BrokerAction): Promise<BrokerAnswer> {
141
+ if (await lane_parked.is_parked(lane.issue)) return failure('the issue is parked')
142
+
143
+ if (action.kind === 'relaunch') return relaunch(lane, action.stop)
144
+
145
+ return await launch_review(lane, action.round)
146
+ }
147
+
148
+ // What the server answers: a thrown action is a failure naming its error, never a dead server.
149
+ async function answer(lane: LaneInfo, action: BrokerAction): Promise<BrokerAnswer> {
150
+ try {
151
+ return await perform(lane, action)
152
+ } catch (error) {
153
+ return failure(`the broker failed: ${error_text.message_of(error)}`)
154
+ }
155
+ }
156
+
157
+ const lane_session_action = { SUCCESS, action_schema, answer, failure, review_paths }
158
+
159
+ export type { BrokerAction, BrokerAnswer, ReviewRound }
160
+ export { lane_session_action }