@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
@@ -4,8 +4,11 @@ import { git_worktree } from '#scripts/git/git-worktree'
4
4
  import { error_text } from '#scripts/lib/error-message'
5
5
  import { lane_paths } from './lane-paths'
6
6
  import { lane_reap } from './lane-reap'
7
+ import { lane_reap_settle } from './lane-reap-settle'
7
8
  import { lane_registry, type LaneInfo } from './lane-registry'
9
+ import { lane_residents } from './lane-residents'
8
10
  import { lane_spent, type KeptLane } from './lane-spent'
11
+ import { lane_state } from './lane-state'
9
12
 
10
13
  // Closing a lane: no work tree, no branch, no directory.
11
14
  //
@@ -13,7 +16,8 @@ import { lane_spent, type KeptLane } from './lane-spent'
13
16
  // every step here is written to run over a subject that is already gone or that still holds
14
17
  // uncommitted work. A close that refused either would leave exactly the debris it exists to remove,
15
18
  // and the next lane for that issue would then fail on a directory nobody could account for. There
16
- // is no ledger entry to remove: the lane's seat lived in the `.env` that goes with the work tree.
19
+ // is no ledger entry to remove: the lane's seat lived in the `.env` that goes with the work tree. The
20
+ // lane's state record outlives it, marked `ended`, so its last state stays readable.
17
21
 
18
22
  interface LaneTargets {
19
23
  directory: string
@@ -36,6 +40,9 @@ interface CloseOutcome {
36
40
  left_behind: Array<string>
37
41
  // The lane child's processes this close terminated — empty for a child that ended by itself.
38
42
  reaped: Array<number>
43
+ // What else still ran from the lane's checkout or carried its mark and this close terminated
44
+ // (`lane-residents.ts`); `undefined` where the processes could not be read.
45
+ residents: Array<number> | undefined
39
46
  }
40
47
 
41
48
  interface SweepOutcome {
@@ -112,39 +119,72 @@ function close_kind(did_exist: boolean, left_behind: ReadonlyArray<string>): Clo
112
119
  return did_exist ? 'closed' : 'none'
113
120
  }
114
121
 
115
- // The main work tree's root, not this one's — the same reading `list_lanes` uses, so the fallback
116
- // directory an unregistered lane is closed by is the one `lane:open` would have created.
117
- // Derived here from the current work tree, a close run inside a lane
118
- // reports `none` over a directory that is still on disk.
119
- async function lane_root_directory(): Promise<string> {
120
- return lane_paths.lane_root(await lane_registry.main_repository_root())
121
- }
122
-
122
+ // The lane root is the main work tree's (`lane_root_directory`), so the fallback directory an
123
+ // unregistered lane is closed by is the one `lane:open` would have created.
123
124
  /**
124
125
  * Close the lane for `issue`. `none` means there was nothing there, which is not a failure: a caller
125
126
  * cleaning up after an interruption cannot know whether the lane was ever opened. `incomplete` means
126
127
  * something survived the removal, and `left_behind` names it.
127
128
  */
128
129
  async function resolve_lane(issue: string): Promise<ResolvedLane> {
129
- const root = await lane_root_directory()
130
+ const root = await lane_registry.lane_root_directory()
130
131
  const existing = lane_registry.find_lane(await lane_registry.list_lanes(), issue)
131
132
 
132
133
  return { existing, targets: lane_targets(root, issue, existing) }
133
134
  }
134
135
 
136
+ // A lane closed before is `none` on a retry, and ends there once its record says it is not over —
137
+ // an issue never opened is not given a record.
138
+ async function is_ending(issue: string, kind: CloseKind): Promise<boolean> {
139
+ if (kind !== 'none') return kind === 'closed'
140
+
141
+ const record = await lane_state.read_state(issue)
142
+
143
+ return record !== undefined && record.state !== 'ended'
144
+ }
145
+
146
+ // The lane's processes, settled after the removal so the processes have had the work tree's deletion
147
+ // to exit in too; what outlived the SIGKILL replaces what the lane's record noted for `run:board`.
148
+ async function survivors_of(issue: string, directory: string): Promise<Array<string>> {
149
+ const survivors = await lane_reap_settle.settle({ issue, directory })
150
+
151
+ if (survivors !== undefined) await lane_state.record_stuck(issue, survivors)
152
+
153
+ return lane_reap_settle.survivor_texts(survivors)
154
+ }
155
+
156
+ // Whatever the removal left: the checkout's residue, then the processes that outlived it.
157
+ async function left_behind_of(issue: string, targets: LaneTargets): Promise<Array<string>> {
158
+ const survivors = await survivors_of(issue, targets.directory)
159
+
160
+ return [...(await residue(targets)), ...survivors]
161
+ }
162
+
135
163
  async function close_lane(issue: string): Promise<CloseOutcome> {
136
164
  const { existing, targets } = await resolve_lane(issue)
137
165
  const did_exist = existing !== undefined || existsSync(targets.directory)
138
166
  // Before the removal, not after: a child still running in the tree would keep writing into a
139
167
  // directory being deleted, and a process outliving its lane is a half-discarded state — the work
140
- // tree gone, the child still answering `alive`.
141
- const reaped = lane_reap.reap_child(issue)
168
+ // tree gone, the child still answering `alive`. What else still runs from the checkout goes too.
169
+ const reaped = lane_reap.reap_child({ issue, directory: targets.directory })
170
+ const residents = lane_residents.end_residents({ issue, directory: targets.directory }, reaped)
142
171
 
143
172
  await remove_lane(targets)
144
173
 
145
- const left_behind = await residue(targets)
174
+ const left_behind = await left_behind_of(issue, targets)
175
+ const kind = close_kind(did_exist, left_behind)
176
+
177
+ if (await is_ending(issue, kind)) {
178
+ await lane_state.record_change({ issue, state: 'ended', command: 'lane:close' })
179
+ }
180
+
181
+ return { issue, kind, left_behind, reaped, residents }
182
+ }
183
+
184
+ type DuePredicate = (issue: string) => Promise<boolean>
146
185
 
147
- return { issue, kind: close_kind(did_exist, left_behind), left_behind, reaped }
186
+ async function always_due(): Promise<boolean> {
187
+ return true
148
188
  }
149
189
 
150
190
  // A lane that could not be closed is recorded rather than thrown: a sweep has to attempt every lane,
@@ -163,14 +203,24 @@ async function try_close(issue: string): Promise<boolean> {
163
203
 
164
204
  // Sequential on purpose: two `git worktree` writes at once contend for the same registration
165
205
  // directory, and the whole point of the command is that nothing is left half-removed.
166
- async function close_each(issues: ReadonlyArray<string>): Promise<SweepOutcome> {
206
+ async function close_into(sweep: SweepOutcome, issue: string, is_due: DuePredicate): Promise<void> {
207
+ if (!(await is_due(issue))) return
208
+ const bucket = (await try_close(issue)) ? sweep.closed : sweep.failed
209
+
210
+ bucket.push(issue)
211
+ }
212
+
213
+ // `is_due` is asked right before each close, not for every issue up front: a close can wait out the
214
+ // grace window, and a lane opened again meanwhile is no longer one to close.
215
+ async function close_each(
216
+ issues: ReadonlyArray<string>,
217
+ is_due: DuePredicate = always_due,
218
+ ): Promise<SweepOutcome> {
167
219
  const sweep: SweepOutcome = { closed: [], failed: [] }
168
220
 
169
221
  for (const issue of issues) {
170
222
  // eslint-disable-next-line no-await-in-loop -- worktree writes contend for the same registration directory
171
- const bucket = (await try_close(issue)) ? sweep.closed : sweep.failed
172
-
173
- bucket.push(issue)
223
+ await close_into(sweep, issue, is_due)
174
224
  }
175
225
 
176
226
  return sweep
@@ -196,11 +246,29 @@ async function close_all_lanes(): Promise<SweepOutcome> {
196
246
  return await close_each(lanes.map((lane) => lane.issue))
197
247
  }
198
248
 
249
+ async function is_unfinished(issue: string): Promise<boolean> {
250
+ const { targets } = await resolve_lane(issue)
251
+
252
+ return !existsSync(targets.directory)
253
+ }
254
+
255
+ /**
256
+ * Close again every lane whose work tree is gone but whose record is not `ended` — a close a process
257
+ * outlived. The supervisor runs it each pass, so a lane ends once its last process does.
258
+ */
259
+ async function retry_closes(): Promise<SweepOutcome> {
260
+ const records = await lane_state.read_records()
261
+ const issues = records.filter((record) => record.state !== 'ended').map(({ issue }) => issue)
262
+
263
+ return await close_each(issues, is_unfinished)
264
+ }
265
+
199
266
  const lane_close = {
200
267
  close_all_lanes,
201
268
  close_lane,
202
269
  prune_lanes,
203
270
  resolve_lane,
271
+ retry_closes,
204
272
  }
205
273
 
206
274
  export type { CloseKind, CloseOutcome, PruneOutcome, ResolvedLane, SweepOutcome }
@@ -0,0 +1,66 @@
1
+ import { lane_ledger, type CoreWaitEntry, type LedgerEntry } from './lane-ledger'
2
+ import { lane_stage_stats } from './lane-stage-stats'
3
+ import { lane_stats, type StatsWindow } from './lane-stats'
4
+
5
+ // How long each lane's commands waited for the core budget: the ledger's `core-wait` entries of one
6
+ // period reduced to one row per lane, printed by `josh lane:stats` so a lane's time splits into work
7
+ // and waiting (joshuafolkken/kit#4382). A lane is named by its issue number, a wait outside a lane — the
8
+ // main checkout's — by its own row.
9
+
10
+ const COLUMNS = ['lane', 'total (min)', 'median (min)', 'waits'] as const
11
+ const OUTSIDE_A_LANE = 'outside a lane'
12
+ const { NOT_MEASURED } = lane_stage_stats
13
+ // A period with no wait: the table still prints, so a reader sees zero waits rather than no table.
14
+ const NONE_ROW = ['none', NOT_MEASURED, NOT_MEASURED, '0']
15
+
16
+ function is_core_wait(entry: LedgerEntry): entry is CoreWaitEntry {
17
+ return entry.kind === lane_ledger.KIND.CORE_WAIT
18
+ }
19
+
20
+ function lane_of(wait: CoreWaitEntry): string {
21
+ return wait.issue === undefined ? OUTSIDE_A_LANE : String(wait.issue)
22
+ }
23
+
24
+ function total(values: ReadonlyArray<number>): number {
25
+ return values.reduce((sum, value) => sum + value, 0)
26
+ }
27
+
28
+ function waits_of(waits: ReadonlyArray<CoreWaitEntry>, lane: string): Array<number> {
29
+ return waits.filter((wait) => lane_of(wait) === lane).map((wait) => wait.waited_ms)
30
+ }
31
+
32
+ function lane_row(lane: string, waits: ReadonlyArray<CoreWaitEntry>): string {
33
+ const waited = waits_of(waits, lane)
34
+
35
+ return lane_stats.to_row([
36
+ lane,
37
+ lane_stage_stats.cell(total(waited)),
38
+ lane_stage_stats.cell(lane_stats.median(waited)),
39
+ String(waited.length),
40
+ ])
41
+ }
42
+
43
+ // The lanes the period saw, the longest total first, so the lane the budget held back most leads.
44
+ function lanes_of(waits: ReadonlyArray<CoreWaitEntry>): Array<string> {
45
+ const lanes = [...new Set(waits.map((wait) => lane_of(wait)))]
46
+
47
+ return lanes.toSorted(
48
+ (left, right) => total(waits_of(waits, right)) - total(waits_of(waits, left)),
49
+ )
50
+ }
51
+
52
+ // The period's table: `entries` is the whole ledger, filtered here to `window`.
53
+ function table(entries: ReadonlyArray<LedgerEntry>, window: StatsWindow): string {
54
+ const waits = lane_stats.in_window(entries, window).filter((entry) => is_core_wait(entry))
55
+ const rows = lanes_of(waits).map((lane) => lane_row(lane, waits))
56
+
57
+ return [
58
+ lane_stats.to_row(COLUMNS),
59
+ lane_stats.to_row(COLUMNS.map(() => '---')),
60
+ ...(rows.length === 0 ? [lane_stats.to_row(NONE_ROW)] : rows),
61
+ ].join('\n')
62
+ }
63
+
64
+ const lane_core_wait_stats = { table }
65
+
66
+ export { lane_core_wait_stats }
@@ -7,9 +7,10 @@ import { IN_PROGRESS_LABEL } from '#scripts/issue/issue-labels'
7
7
  import { issue_number_shape } from '#scripts/issue/issue-number-shape'
8
8
  import { session_cite } from '#scripts/issue/session-cite'
9
9
  import { telegram_notify } from '#scripts/notify/telegram-notify'
10
- import { detached_launch } from '#scripts/run/detached-launch'
10
+ import { detached_launch, type LaunchArgv } from '#scripts/run/detached-launch'
11
11
  import { run_event_stream } from '#scripts/run/event/run-event-stream'
12
12
  import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
13
+ import { run_park } from '#scripts/run/park/run-park'
13
14
  import { run_ending } from '#scripts/run/run-ending'
14
15
  import { run_label } from '#scripts/run/run-label'
15
16
  import { lane_child_invocation } from './lane-child-invocation'
@@ -19,6 +20,7 @@ import { lane_ledger } from './lane-ledger'
19
20
  import { lane_output } from './lane-output'
20
21
  import { lane_registry, type LaneInfo } from './lane-registry'
21
22
  import { lane_resume, type ResumePlan } from './lane-resume'
23
+ import { lane_state } from './lane-state'
22
24
  import { openai_lane_supervisor } from './openai-lane-supervisor'
23
25
 
24
26
  // `josh lane:dispatch <issue-number>` — start a lane's child as an operating-system process of its own.
@@ -197,7 +199,7 @@ function existing_dispatch(request: StartRequest): DispatchOutcome | undefined {
197
199
  return dispatched_of(request, active.pid, [])
198
200
  }
199
201
 
200
- function launch_argv(request: StartRequest, nonce: string | undefined): AgentArgv {
202
+ function launch_argv(request: StartRequest, nonce: string | undefined): LaunchArgv {
201
203
  if (request.profile.provider !== 'openai') return request.argv
202
204
  if (nonce === undefined) throw new Error('OpenAI supervisor nonce is missing')
203
205
 
@@ -244,10 +246,15 @@ async function dispatched_start(
244
246
  : dispatched_of(request, pid, notes)
245
247
  }
246
248
 
249
+ // **A dispatch takes back any park the issue's earlier child recorded**: the issue is offered
250
+ // again only once `needs-decision` is off, so a record still on disk is one a person cleared by hand on
251
+ // GitHub, and left in place it would silence `lane-park` on this child's own stop
252
+ // (joshuafolkken/kit#4132).
247
253
  async function started(request: StartRequest): Promise<DispatchOutcome> {
248
254
  const notes: Array<string> = []
249
255
  const existing = existing_dispatch(request)
250
256
  if (existing !== undefined) return existing
257
+ run_park.clear(request.lane.issue, request.lane.directory)
251
258
  const nonce =
252
259
  request.profile.provider === 'openai' ? openai_lane_supervisor.new_nonce() : undefined
253
260
  const result = detached_launch.launch(
@@ -327,13 +334,27 @@ async function mark_in_progress(issue: string): Promise<LabelWrite> {
327
334
  // removal warns and never throws, so it cannot turn a launch failure into a thrown error.
328
335
  //
329
336
  // The lane ledger takes the same instant: `lane:stats` times a lane's implementation from it, and the
330
- // stream is capped, so a period's earlier dispatches would be gone from there.
331
- async function record_started(issue: string): Promise<void> {
337
+ // stream is capped, so a period's earlier dispatches would be gone from there. The lane's state record
338
+ // takes the stream's launch instant as its own, so `run:board`, which reads the lane's events from
339
+ // the record's launch on, keeps the launch event that opens them (joshuafolkken/kit#4269).
340
+ async function record_started(issue: string, start: DispatchStart): Promise<void> {
341
+ const now = new Date()
342
+
332
343
  await run_event_stream_emit.emit(
333
344
  run_event_stream.EVENT_KIND.CHILD_LAUNCH,
334
345
  `${issue_cite.plain(issue)} dispatched`,
346
+ now,
335
347
  )
336
348
  await lane_ledger.record_dispatch(Number(issue))
349
+ await lane_state.record_change(
350
+ {
351
+ issue,
352
+ state: 'running',
353
+ command: start === RESTART_START ? 'lane:restart' : 'lane:dispatch',
354
+ is_launch: true,
355
+ },
356
+ { now },
357
+ )
337
358
  }
338
359
 
339
360
  // How a dispatch begins. A `resumable` one claims the marker itself and resumes an `outage` session; a
@@ -359,7 +380,7 @@ async function finish_dispatch(
359
380
 
360
381
  const is_failed = outcome.kind === 'failed'
361
382
 
362
- await (is_failed ? run_label.unmark(issue) : record_started(issue))
383
+ await (is_failed ? run_label.unmark(issue) : record_started(issue, start))
363
384
 
364
385
  return outcome
365
386
  }
@@ -404,7 +425,7 @@ function log_sentence(outcome: Dispatched, issue: string): string {
404
425
  return ` Its output is NOT being kept — ${outcome.notes.join(NOTE_SEPARATOR)} — so ${outcome.log_path} will not grow and the process trace is the only answer: ${poll}.`
405
426
  }
406
427
 
407
- return ` It writes to ${outcome.log_path}. To poll it, ${poll}.`
428
+ return ` It writes to ${outcome.log_path}. Wait on it with \`pnpm josh lane:await ${issue} --owner "$PPID"\` in the background and end the turn; once that output falls silent, ${poll}.`
408
429
  }
409
430
 
410
431
  // Whether this dispatch resumed the disconnected child's session or started fresh — the report the
@@ -0,0 +1,156 @@
1
+ import { agent_role_profile } from '#scripts/agent/agent-role-profile'
2
+ import { MS_PER_SECOND } from '#scripts/lib/timeouts'
3
+ import { run_event_stream, type RunEvent } from '#scripts/run/event/run-event-stream'
4
+ import { lane_ledger, type LedgerEntry, type MergeEntry } from './lane-ledger'
5
+ import { lane_spans, type Span } from './lane-spans'
6
+ import { lane_stage_stats } from './lane-stage-stats'
7
+ import { lane_stats, type StatsWindow } from './lane-stats'
8
+ import { lane_stop_stats } from './lane-stop-stats'
9
+
10
+ // How long a lane slot waited on the lane machinery rather than on work, printed by `josh lane:stats`
11
+ // (joshuafolkken/kit#4395). Three hand-offs, each timed from the moment the slot's next step could run:
12
+ //
13
+ // - `cut → resume`: a child's session cut until the relaunched session resumed the lane.
14
+ // - `outage → relaunch`: a child that ended with no result, collected as an `outage`, until its next
15
+ // `child-launch` (joshuafolkken/kit#4410).
16
+ // - `park → offer`: a park until the driver's next offer answered — a `held`, `released` or `dispatch`
17
+ // entry. A pool that stays full writes no line after its one `released`, and a driver handed back
18
+ // writes none, so a gap over the offer interval is a full pool or no driver, never the hand-over
19
+ // (joshuafolkken/kit#4410). The ship's cap park and the driver's collection of it are each timed.
20
+ // - `followup → merge`: the ship's last `followup` stage before the merge until the parent wrote the
21
+ // `merge` line, the step that releases the slot. A merge with no `followup` stage has no start.
22
+ //
23
+ // A start nothing ended is counted under `not ended`, kept out of the seconds.
24
+
25
+ const COLUMNS = ['gap', 'count', 'median (s)', 'max (s)', 'not ended'] as const
26
+ const RELAUNCH = 'cut → resume'
27
+ const OUTAGE = 'outage → relaunch'
28
+ const PARK = 'park → offer'
29
+ const MERGE = 'followup → merge'
30
+ const FOLLOWUP_STAGE = 'followup'
31
+ const IMPLEMENTATION_CUT = `cut (${agent_role_profile.IMPLEMENTATION_PHASE})`
32
+ const { NOT_MEASURED, is_dispatch, is_number, is_stage } = lane_stage_stats
33
+ const { EVENT_KIND } = run_event_stream
34
+ // The offer answers that are not a dispatch: a free lane held, or the pool found full.
35
+ const OFFER_ANSWERS: ReadonlySet<string> = new Set([
36
+ lane_ledger.KIND.HELD,
37
+ lane_ledger.KIND.RELEASED,
38
+ ])
39
+
40
+ // Only an implementation cut appends a `resume` when it is adopted; a pre-gate resume appends nothing,
41
+ // so its cut would read as never ended (`run-cut-cli.ts` → `emit_resume_event`).
42
+ function implementation_cuts(events: ReadonlyArray<RunEvent>): Array<RunEvent> {
43
+ return events.filter((event) => event.text.endsWith(IMPLEMENTATION_CUT))
44
+ }
45
+
46
+ function relaunch_spans(events: ReadonlyArray<RunEvent>): Array<Span> {
47
+ return lane_spans.issue_spans({
48
+ starts: lane_stop_stats.events_of(implementation_cuts(events), EVENT_KIND.CUT),
49
+ bounds: lane_stop_stats.events_of(events, EVENT_KIND.CUT),
50
+ ends: lane_stop_stats.events_of(events, EVENT_KIND.RESUME),
51
+ })
52
+ }
53
+
54
+ // A child that ended with no result is collected as an `outage`, re-dispatchable; its next launch is
55
+ // the relaunch.
56
+ function outage_spans(events: ReadonlyArray<RunEvent>): Array<Span> {
57
+ const outages = lane_stop_stats.events_of(events, EVENT_KIND.OUTAGE)
58
+
59
+ return lane_spans.issue_spans({
60
+ starts: outages,
61
+ bounds: outages,
62
+ ends: lane_stop_stats.events_of(events, EVENT_KIND.CHILD_LAUNCH),
63
+ })
64
+ }
65
+
66
+ function offer_times(entries: ReadonlyArray<LedgerEntry>): Array<number> {
67
+ return entries
68
+ .filter((entry) => is_dispatch(entry) || OFFER_ANSWERS.has(entry.kind))
69
+ .map((entry) => Date.parse(entry.at))
70
+ .toSorted((left, right) => left - right)
71
+ }
72
+
73
+ function park_spans(
74
+ entries: ReadonlyArray<LedgerEntry>,
75
+ events: ReadonlyArray<RunEvent>,
76
+ ): Array<Span> {
77
+ const offers = offer_times(entries)
78
+
79
+ return lane_stop_stats
80
+ .events_of(events, EVENT_KIND.PARK)
81
+ .map((park) => ({ from_ms: park.at_ms, end_ms: offers.find((at) => at > park.at_ms) }))
82
+ }
83
+
84
+ function is_merge(entry: LedgerEntry): entry is MergeEntry {
85
+ return entry.kind === lane_ledger.KIND.MERGE
86
+ }
87
+
88
+ function is_followup_of(entry: LedgerEntry, merge: MergeEntry): boolean {
89
+ return (
90
+ is_stage(entry) &&
91
+ entry.stage === FOLLOWUP_STAGE &&
92
+ entry.issue === merge.issue &&
93
+ entry.at <= merge.at
94
+ )
95
+ }
96
+
97
+ function merge_span(entries: ReadonlyArray<LedgerEntry>, merge: MergeEntry): Span | undefined {
98
+ const followup = entries.findLast((entry) => is_followup_of(entry, merge))
99
+
100
+ return followup === undefined
101
+ ? undefined
102
+ : { from_ms: Date.parse(followup.at), end_ms: Date.parse(merge.at) }
103
+ }
104
+
105
+ function merge_spans(entries: ReadonlyArray<LedgerEntry>): Array<Span> {
106
+ return entries
107
+ .filter((entry) => is_merge(entry))
108
+ .map((merge) => merge_span(entries, merge))
109
+ .filter((span) => span !== undefined)
110
+ }
111
+
112
+ function seconds(milliseconds: number | undefined): string {
113
+ return milliseconds === undefined
114
+ ? NOT_MEASURED
115
+ : String(Math.round(milliseconds / MS_PER_SECOND))
116
+ }
117
+
118
+ function is_in(span: Span, window: StatsWindow): boolean {
119
+ return span.from_ms >= window.since_ms && span.from_ms <= window.until_ms
120
+ }
121
+
122
+ function gap_row(name: string, spans: ReadonlyArray<Span>, window: StatsWindow): string {
123
+ const started = spans.filter((span) => is_in(span, window))
124
+ const ended = started
125
+ .map((span) => (span.end_ms === undefined ? undefined : span.end_ms - span.from_ms))
126
+ .filter((value) => is_number(value))
127
+
128
+ return lane_stats.to_row([
129
+ name,
130
+ String(started.length),
131
+ seconds(lane_stats.median(ended)),
132
+ seconds(lane_stats.peak(ended)),
133
+ String(started.length - ended.length),
134
+ ])
135
+ }
136
+
137
+ // The period's table: `entries` is the whole ledger and `events` the whole run-event stream, both
138
+ // reduced here to the spans that started in `window`.
139
+ function table(
140
+ entries: ReadonlyArray<LedgerEntry>,
141
+ window: StatsWindow,
142
+ events: ReadonlyArray<RunEvent> = [],
143
+ ): string {
144
+ return [
145
+ lane_stats.to_row(COLUMNS),
146
+ lane_stats.to_row(COLUMNS.map(() => '---')),
147
+ gap_row(RELAUNCH, relaunch_spans(events), window),
148
+ gap_row(OUTAGE, outage_spans(events), window),
149
+ gap_row(PARK, park_spans(entries, events), window),
150
+ gap_row(MERGE, merge_spans(entries), window),
151
+ ].join('\n')
152
+ }
153
+
154
+ const lane_gap_stats = { table }
155
+
156
+ export { lane_gap_stats }
@@ -45,9 +45,9 @@ interface LaneGuardEntry {
45
45
  const LANE_GUARD_POLICY: ReadonlyArray<LaneGuardEntry> = [
46
46
  {
47
47
  id: 'investigation',
48
- mode_in_lane_child: 'notice',
48
+ mode_in_lane_child: 'refuse',
49
49
  because:
50
- 'a refusal ends a child turn, yet lane children were measured reading files they never edited, so the child is nudged to delegate by a notice rather than killed',
50
+ 'the notice was measured not to move the reading — 52% of lane cost stayed in main-line exploration — and the refusal fires once per accumulation, a round trip the child survives as it survives the rule row, so the child is refused like the main line',
51
51
  },
52
52
  {
53
53
  id: 'batching',
@@ -1,7 +1,11 @@
1
1
  import { git_common_directory } from '#scripts/git/git-common-directory'
2
+ import { run_carry } from '#scripts/run/carry/run-carry'
2
3
  import { run_ship_detach } from '#scripts/run/ship/run-ship-detach'
4
+ import { run_ship_stage } from '#scripts/run/ship/run-ship-stage'
3
5
  import { lane_child_marker, type MarkerSource } from './lane-child-marker'
4
6
 
7
+ type StartRead = (pid: number) => string | undefined
8
+
5
9
  // Whether a lane has handed its post-implementation region to the detached ship.
6
10
  //
7
11
  // **A child that ran `pnpm josh ship --detach` waits on nobody when it ends.** The supervisor drives the
@@ -24,6 +28,69 @@ function is_ship_running(issue: string, directory: string): boolean {
24
28
  )
25
29
  }
26
30
 
31
+ // A detached ship for `issue` launched at or after `since_ms` ended in success — it merged, so no cut
32
+ // hand-off follows it. The record outlives its run until the next `ship --detach` replaces it, so a
33
+ // success launched earlier belongs to a past dispatch of the issue and never counts.
34
+ function is_ship_succeeded(issue: string, directory: string, since_ms: number): boolean {
35
+ const repository = git_common_directory.repository(directory)
36
+ const reading =
37
+ repository === undefined ? undefined : run_ship_detach.read_result(repository, issue)
38
+
39
+ return reading?.result === 'success' && (reading.launched_at ?? since_ms - 1) >= since_ms
40
+ }
41
+
42
+ async function read_repository(): Promise<string | undefined> {
43
+ try {
44
+ return await run_carry.repository_directory()
45
+ } catch {
46
+ return undefined
47
+ }
48
+ }
49
+
50
+ // `is_ship_running` for this checkout, for a reader that must not block its event loop
51
+ // (joshuafolkken/kit#4245): the repository is read asynchronously once and every recorded start time
52
+ // through `read`, so no answer starts a synchronous process.
53
+ async function ship_reader(read: StartRead): Promise<(issue: string) => boolean> {
54
+ const repository = await read_repository()
55
+
56
+ return (issue) =>
57
+ repository !== undefined &&
58
+ run_ship_detach.read_result(repository, issue, read)?.result === 'running'
59
+ }
60
+
61
+ // The live ship for `issue` is inside `josh followup`: it waits on CI, CodeRabbit and the merge alone
62
+ // (joshuafolkken/kit#4466). The mark is down while the followup stage merges and gates again, after a
63
+ // stop, and once a successor supervisor opens the record (`run_ship_stage.read_merge_waiting`).
64
+ function is_merge_waiting(repository: string, issue: string, read: StartRead): boolean {
65
+ if (run_ship_detach.read_result(repository, issue, read)?.result !== 'running') return false
66
+
67
+ return run_ship_stage.read_merge_waiting(run_ship_stage.record_path(repository, issue))
68
+ }
69
+
70
+ // `is_merge_waiting` for this checkout, read the way `ship_reader` reads.
71
+ async function merge_wait_reader(read: StartRead): Promise<(issue: string) => boolean> {
72
+ const repository = await read_repository()
73
+
74
+ return (issue) => repository !== undefined && is_merge_waiting(repository, issue, read)
75
+ }
76
+
77
+ // The live ship for `issue` in the repository `directory` belongs to waits for a lane place before it
78
+ // relaunches its child (`run-ship-place.ts`); a dead supervisor's mark reads as no wait.
79
+ function is_place_waiting(issue: string, directory: string): boolean {
80
+ const repository = git_common_directory.repository(directory)
81
+
82
+ if (repository === undefined || !is_ship_running(issue, directory)) return false
83
+
84
+ return run_ship_stage.read_place_waiting(run_ship_stage.record_path(repository, issue))
85
+ }
86
+
87
+ // When the detached ship for `issue` that is still live was launched, or `undefined` where none is.
88
+ function ship_running_since(issue: string, directory: string): number | undefined {
89
+ const repository = git_common_directory.repository(directory)
90
+
91
+ return repository === undefined ? undefined : run_ship_detach.running_since(repository, issue)
92
+ }
93
+
27
94
  // This session is the dispatched lane child for `directory` and its own ship is running.
28
95
  function is_handed_off(directory: string, source: MarkerSource = process.env): boolean {
29
96
  const issue = lane_child_marker.marked_issue(source)
@@ -33,6 +100,14 @@ function is_handed_off(directory: string, source: MarkerSource = process.env): b
33
100
  return is_ship_running(issue, directory)
34
101
  }
35
102
 
36
- const lane_handoff = { is_handed_off, is_ship_running }
103
+ const lane_handoff = {
104
+ is_handed_off,
105
+ is_place_waiting,
106
+ is_ship_running,
107
+ is_ship_succeeded,
108
+ merge_wait_reader,
109
+ ship_reader,
110
+ ship_running_since,
111
+ }
37
112
 
38
113
  export { lane_handoff }