@joshuafolkken/kit 1.1514.0 → 1.1784.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (858) hide show
  1. package/.claude/agents/investigator.md +1 -1
  2. package/.claude/settings.json +5 -5
  3. package/.claude/skills/epic-commands/SKILL.md +26 -65
  4. package/.claude/skills/epic-commands/epic-bundle.md +3 -1
  5. package/.claude/skills/workflow-commands/SKILL.md +5 -5
  6. package/.claude/skills/workflow-commands/background-commands.md +5 -5
  7. package/.claude/skills/workflow-commands/backlogrun-child.md +10 -8
  8. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
  9. package/.claude/skills/workflow-commands/backlogrun-lanes.md +17 -13
  10. package/.claude/skills/workflow-commands/backlogrun-park.md +14 -23
  11. package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -2
  12. package/.claude/skills/workflow-commands/backlogrun-recovery.md +5 -5
  13. package/.claude/skills/workflow-commands/backlogrun-steps.md +10 -10
  14. package/.claude/skills/workflow-commands/backlogrun.md +1 -1
  15. package/.claude/skills/workflow-commands/chain-rule.md +13 -7
  16. package/.claude/skills/workflow-commands/delegation.md +6 -5
  17. package/.claude/skills/workflow-commands/entry-sequence.md +9 -9
  18. package/.claude/skills/workflow-commands/followup.md +9 -31
  19. package/.claude/skills/workflow-commands/fullrun-steps.md +36 -45
  20. package/.claude/skills/workflow-commands/fullrun.md +2 -2
  21. package/.claude/skills/workflow-commands/halfrun.md +17 -25
  22. package/.claude/skills/workflow-commands/issue-comments.md +16 -12
  23. package/.claude/skills/workflow-commands/issue-scout.md +2 -2
  24. package/.claude/skills/workflow-commands/kickoff.md +24 -23
  25. package/.claude/skills/workflow-commands/latest-gate.md +7 -12
  26. package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
  27. package/.claude/skills/workflow-commands/observation-filing.md +4 -36
  28. package/.claude/skills/workflow-commands/observation-ledger.md +1 -1
  29. package/.claude/skills/workflow-commands/pre-gate-cut.md +13 -30
  30. package/.claude/skills/workflow-commands/prerequisite.md +10 -16
  31. package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
  32. package/.claude/skills/workflow-commands/prrun.md +3 -7
  33. package/.claude/skills/workflow-commands/retrospective.md +1 -1
  34. package/.claude/skills/workflow-commands/split-assessment.md +13 -1
  35. package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
  36. package/.codex/hooks.json +5 -5
  37. package/.github/actions/setup-node/action.yml +9 -0
  38. package/.github/actions/setup-pnpm/action.yml +1 -1
  39. package/.github/dependabot.yml +16 -0
  40. package/.github/release.yml +0 -2
  41. package/.github/workflows/ci.yml +120 -10
  42. package/.github/workflows/publish.yml +8 -1
  43. package/.github/workflows/sonar-qube.yml +1 -0
  44. package/.prettierignore +2 -0
  45. package/.vscode/tasks.json +1 -2
  46. package/CLAUDE.md +3 -7
  47. package/README.md +4 -2
  48. package/SECURITY.md +1 -1
  49. package/dist/CLAUDE.md +3 -7
  50. package/dist/commands/document-read-cli.js +882 -0
  51. package/dist/commands/{document-section-cli.js → document-section-main.js} +79 -37
  52. package/dist/commands/read-set-cli.js +1867 -0
  53. package/dist/commands/run-prep-main.js +21653 -0
  54. package/dist/commands/run-step-cli.js +23880 -0
  55. package/dist/config-merge/index.js +5 -1
  56. package/dist/hooks/audit-provision.js +20 -35
  57. package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
  58. package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
  59. package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
  60. package/dist/hooks/{chunk-TNUMY6NL.js → chunk-PT5R6UJD.js} +4193 -1900
  61. package/dist/hooks/chunk-TUIFS5E7.js +72 -0
  62. package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
  63. package/dist/hooks/{chunk-APUO6U4J.js → chunk-WR2KQAYZ.js} +1843 -440
  64. package/dist/hooks/{chunk-O6GDRNJB.js → chunk-XGBNSWEI.js} +248 -46
  65. package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
  66. package/dist/hooks/codex-hook-adapter.js +10 -22
  67. package/dist/hooks/format-edited.js +5 -6
  68. package/dist/hooks/inputs.json +443 -317
  69. package/dist/hooks/pretool-guard.js +7 -25
  70. package/dist/hooks/session-lang.js +44 -51
  71. package/dist/hooks/stop-guard.js +7716 -2187
  72. package/dist/josh.js +6002 -3583
  73. package/dist/self-sync-guard/index.js +74 -10
  74. package/dist/version/index.js +115 -406
  75. package/eslint/base.js +1 -1
  76. package/lefthook/base.yml +3 -1
  77. package/package.json +10 -48
  78. package/pnpm-workspace.yaml +4 -2
  79. package/prompts/coding-standards.md +1 -1
  80. package/prompts/collaboration-workflow/file-edits.md +1 -7
  81. package/prompts/collaboration-workflow/issue-citation.md +1 -1
  82. package/prompts/collaboration-workflow/issue-template.md +33 -16
  83. package/prompts/collaboration-workflow/lane-instructions.md +1 -2
  84. package/prompts/collaboration-workflow/measurement.md +37 -0
  85. package/prompts/collaboration-workflow/operating-rules.md +4 -6
  86. package/prompts/collaboration-workflow/output-bounds.md +2 -7
  87. package/prompts/collaboration-workflow/plan-comment.md +3 -42
  88. package/prompts/collaboration-workflow/principles.md +5 -0
  89. package/prompts/collaboration-workflow/report-format.md +31 -60
  90. package/prompts/collaboration-workflow/residency.md +2 -2
  91. package/prompts/collaboration-workflow/shell-body.md +6 -16
  92. package/prompts/collaboration-workflow/turn-batching.md +0 -2
  93. package/prompts/collaboration-workflow/upstream-interrupt.md +14 -4
  94. package/prompts/collaboration-workflow/wip-cap.md +1 -1
  95. package/prompts/collaboration-workflow.md +3 -7
  96. package/prompts/refactoring.md +1 -1
  97. package/prompts/review-rubric.md +1 -2
  98. package/prompts/review.md +41 -21
  99. package/prompts/testing-guide.md +8 -43
  100. package/scripts/agent/agent-event.ts +15 -15
  101. package/scripts/agent/agent-exit-record.ts +13 -1
  102. package/scripts/agent/api-auth.ts +41 -0
  103. package/scripts/agent/api-outage.ts +1 -1
  104. package/scripts/auto-ok/auto-ok-cli.ts +14 -16
  105. package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
  106. package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
  107. package/scripts/auto-ok/auto-ok-judge.ts +13 -2
  108. package/scripts/auto-ok/auto-ok-main.ts +17 -0
  109. package/scripts/backlog/backlog-arrival.ts +14 -3
  110. package/scripts/backlog/backlog-budget-cli.ts +7 -33
  111. package/scripts/backlog/backlog-budget-main.ts +16 -0
  112. package/scripts/backlog/backlog-budget.ts +2 -3
  113. package/scripts/backlog/backlog-defect-priority.ts +4 -3
  114. package/scripts/backlog/backlog-drive-adopt.ts +67 -0
  115. package/scripts/backlog/backlog-drive-args.ts +4 -5
  116. package/scripts/backlog/backlog-drive-cli.ts +113 -28
  117. package/scripts/backlog/backlog-drive-hold.ts +162 -0
  118. package/scripts/backlog/backlog-drive-idle.ts +151 -0
  119. package/scripts/backlog/backlog-drive-judge.ts +25 -0
  120. package/scripts/backlog/backlog-drive-memory.ts +126 -0
  121. package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
  122. package/scripts/backlog/backlog-drive-named.ts +53 -6
  123. package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
  124. package/scripts/backlog/backlog-drive-paused.ts +169 -0
  125. package/scripts/backlog/backlog-drive-restore.ts +30 -7
  126. package/scripts/backlog/backlog-drive-seats.ts +18 -8
  127. package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
  128. package/scripts/backlog/backlog-drive.ts +79 -75
  129. package/scripts/backlog/backlog-next-main.ts +16 -0
  130. package/scripts/backlog/backlog-next-shared.ts +73 -0
  131. package/scripts/backlog/backlog-next.ts +48 -16
  132. package/scripts/backlog/backlog-occupied.ts +52 -39
  133. package/scripts/backlog/backlog-offer-cli.ts +6 -21
  134. package/scripts/backlog/backlog-offer-exclude.ts +15 -0
  135. package/scripts/backlog/backlog-offer-main.ts +12 -0
  136. package/scripts/backlog/backlog-offer.ts +36 -3
  137. package/scripts/backlog/backlog-overlap.ts +22 -4
  138. package/scripts/backlog/backlog-plan-read.ts +6 -2
  139. package/scripts/backlog/backlog-plan.ts +18 -4
  140. package/scripts/backlog/backlog-pool.ts +10 -10
  141. package/scripts/backlog/backlog-rank.ts +10 -2
  142. package/scripts/backlog/backlog-ready.ts +112 -30
  143. package/scripts/backlog/backlog-stalled-detect.ts +109 -36
  144. package/scripts/backlog/backlog-stalled.ts +52 -16
  145. package/scripts/backlog/backlog-wait-cause.ts +86 -0
  146. package/scripts/backlog/backlog-waves.ts +39 -13
  147. package/scripts/backlog/backlogrun-args.ts +19 -7
  148. package/scripts/backlog/backlogrun-cli.ts +19 -5
  149. package/scripts/backlog/backlogrun-launch.ts +6 -0
  150. package/scripts/backlog/backlogrun-restart.ts +97 -0
  151. package/scripts/backlog/backlogrun-stop.ts +79 -7
  152. package/scripts/behavior/behavior-cli.ts +2 -2
  153. package/scripts/behavior/behavior-rules.ts +47 -24
  154. package/scripts/build/build-bin.ts +2 -16
  155. package/scripts/build/build-claude-md.ts +0 -7
  156. package/scripts/build/build-commands.ts +0 -13
  157. package/scripts/build/build-hooks.ts +49 -48
  158. package/scripts/build/hook-bundle-stamp.ts +29 -11
  159. package/scripts/build/local-bin.ts +1 -1
  160. package/scripts/cases/cases-cli.ts +25 -13
  161. package/scripts/cases/cases-interaction-scan.ts +134 -0
  162. package/scripts/cases/cases-interaction.ts +183 -0
  163. package/scripts/cases/cases-logic.ts +39 -6
  164. package/scripts/ci/pr-classification-main.ts +18 -0
  165. package/scripts/ci/pr-classification.ts +10 -17
  166. package/scripts/clone/clone-scan.ts +1 -1
  167. package/scripts/cost-runtime/cost-blocks.ts +22 -37
  168. package/scripts/cost-runtime/cost-cli.ts +31 -14
  169. package/scripts/cost-runtime/cost-main.ts +12 -0
  170. package/scripts/cost-runtime/cost-transcript.ts +1 -0
  171. package/scripts/delegation/delegation-policy.ts +17 -4
  172. package/scripts/delegation/duplicate-read-guard.ts +0 -8
  173. package/scripts/delegation/investigation-guard.ts +0 -8
  174. package/scripts/delegation/investigation-reads.ts +3 -4
  175. package/scripts/dependabot/dependabot-cooldown.ts +194 -0
  176. package/scripts/discovery/repo-discovery.ts +24 -6
  177. package/scripts/doctor/doctor-consumer.ts +2 -5
  178. package/scripts/document/document-byte-budget.ts +8 -6
  179. package/scripts/document/document-scan.ts +1 -1
  180. package/scripts/document/document-section-cli.ts +0 -8
  181. package/scripts/document/document-section-main.ts +12 -0
  182. package/scripts/epic/epic-audit-cli.ts +12 -6
  183. package/scripts/epic/epic-bundle-apply.ts +137 -0
  184. package/scripts/epic/epic-bundle-cli.ts +32 -121
  185. package/scripts/epic/epic-bundle-format.ts +116 -0
  186. package/scripts/epic/epic-bundle-main.ts +17 -0
  187. package/scripts/epic/epic-busy.ts +5 -12
  188. package/scripts/epic/epic-classify.ts +24 -15
  189. package/scripts/epic/epic-cli-argv.ts +31 -0
  190. package/scripts/epic/epic-cli-decide.ts +42 -0
  191. package/scripts/epic/epic-cli.ts +6 -38
  192. package/scripts/epic/epic-close.ts +112 -55
  193. package/scripts/epic/epic-cross-repo.ts +4 -7
  194. package/scripts/epic/epic-decide.ts +119 -0
  195. package/scripts/epic/epic-decision.ts +9 -0
  196. package/scripts/epic/epic-fetch.ts +4 -0
  197. package/scripts/epic/epic-graph.ts +2 -0
  198. package/scripts/epic/epic-issue.ts +5 -1
  199. package/scripts/epic/epic-label-age.ts +1 -1
  200. package/scripts/epic/epic-lane-offer.ts +39 -4
  201. package/scripts/epic/epic-next-main.ts +24 -0
  202. package/scripts/epic/epic-next.ts +6 -24
  203. package/scripts/epic/epic-outside-blocker.ts +6 -2
  204. package/scripts/epic/epic-parse.ts +9 -3
  205. package/scripts/epic/epic-read.ts +1 -0
  206. package/scripts/epic/epic-reconcile.ts +39 -0
  207. package/scripts/epic/epic-run.ts +10 -1
  208. package/scripts/epic/epic-solo.ts +50 -14
  209. package/scripts/epic/epic.ts +41 -7
  210. package/scripts/exports/unused-members-cli.ts +2 -2
  211. package/scripts/followup/followup-checks-event.ts +8 -3
  212. package/scripts/followup/followup-coderabbit-wait.ts +82 -0
  213. package/scripts/followup/followup-review-gates.ts +81 -0
  214. package/scripts/followup/git-followup-stages.ts +13 -3
  215. package/scripts/followup/git-followup-workflow.ts +19 -66
  216. package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
  217. package/scripts/followup/git-pr-followup.ts +36 -8
  218. package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
  219. package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
  220. package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
  221. package/scripts/gate/busy-average.ts +58 -0
  222. package/scripts/gate/check-cpu.ts +60 -0
  223. package/scripts/gate/check-inputs.ts +39 -95
  224. package/scripts/gate/check-reuse.ts +33 -54
  225. package/scripts/gate/command-memory.ts +192 -0
  226. package/scripts/gate/core-admission.ts +218 -28
  227. package/scripts/gate/core-budget-timing.ts +37 -0
  228. package/scripts/gate/core-budget.ts +80 -98
  229. package/scripts/gate/core-wait-record.ts +48 -0
  230. package/scripts/gate/core-wait.ts +37 -5
  231. package/scripts/gate/core-weights.ts +86 -0
  232. package/scripts/gate/free-cores.ts +27 -4
  233. package/scripts/gate/gate-ledger.ts +32 -4
  234. package/scripts/gate/gate-plan.ts +41 -34
  235. package/scripts/gate/gate-report.ts +14 -2
  236. package/scripts/gate/gate-run-steps.ts +53 -8
  237. package/scripts/gate/gate-skip.ts +12 -2
  238. package/scripts/gate/gate-steps.ts +12 -1
  239. package/scripts/gate/input-fingerprint.ts +42 -0
  240. package/scripts/gate/machine-capacity.ts +65 -31
  241. package/scripts/gate/moved-paths.ts +67 -0
  242. package/scripts/gate/project-checks.ts +5 -12
  243. package/scripts/gate/scoped-green.ts +12 -8
  244. package/scripts/gate/since-green.ts +62 -0
  245. package/scripts/gate/toolchain-inputs.ts +115 -0
  246. package/scripts/gate/verification-gate.ts +27 -24
  247. package/scripts/gate/verification-inputs.ts +250 -0
  248. package/scripts/gh/gh-author-association.ts +96 -9
  249. package/scripts/gh/git-ai-review-scan.ts +4 -2
  250. package/scripts/gh/git-gh-api-path.ts +15 -0
  251. package/scripts/gh/git-gh-branch-rules.ts +73 -0
  252. package/scripts/gh/git-gh-conditional.ts +5 -2
  253. package/scripts/gh/git-gh-issue-read.ts +5 -1
  254. package/scripts/gh/git-gh-issue-write.ts +67 -29
  255. package/scripts/gh/git-gh-issue.ts +7 -3
  256. package/scripts/gh/git-gh-poll-read.ts +89 -0
  257. package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
  258. package/scripts/gh/git-gh-pr-rest.ts +1 -1
  259. package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
  260. package/scripts/gh/git-gh-pr.ts +27 -15
  261. package/scripts/gh/git-pr-checks-eval.ts +39 -7
  262. package/scripts/gh/git-pr-checks-parse.ts +39 -9
  263. package/scripts/gh/git-pr-merge-checked.ts +80 -0
  264. package/scripts/git/base-tree.ts +19 -2
  265. package/scripts/git/changed-file-scope.ts +6 -4
  266. package/scripts/git/changed-paths.ts +18 -1
  267. package/scripts/git/git-diff-reads.ts +27 -2
  268. package/scripts/git/git-grep-hits.ts +85 -0
  269. package/scripts/git/git-location-environment.ts +1 -1
  270. package/scripts/git/git-merge-conflicts.ts +83 -0
  271. package/scripts/git/git-preflight.ts +37 -12
  272. package/scripts/git/git-push-transport.ts +1 -2
  273. package/scripts/git/git-schemas.ts +17 -7
  274. package/scripts/git/git-spawn.ts +1 -2
  275. package/scripts/git/git-status.ts +4 -4
  276. package/scripts/git/main-merge-main.ts +12 -0
  277. package/scripts/git/main-merge-regenerate.ts +2 -2
  278. package/scripts/git/main-merge.ts +25 -9
  279. package/scripts/git/main-sync-main.ts +12 -0
  280. package/scripts/git/main-sync.ts +0 -9
  281. package/scripts/git/stash/git-stash.ts +27 -4
  282. package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
  283. package/scripts/git/stash/stash-pop-cli.ts +6 -12
  284. package/scripts/git/stash/stash-pop-main.ts +12 -0
  285. package/scripts/git/stash/stash-push-cli.ts +76 -0
  286. package/scripts/git/stash/stash-push-main.ts +12 -0
  287. package/scripts/hooks/batch-guard.ts +0 -8
  288. package/scripts/hooks/check-commit-message-main.ts +8 -0
  289. package/scripts/hooks/check-commit-message.ts +4 -7
  290. package/scripts/hooks/format-edited-file.ts +8 -24
  291. package/scripts/hooks/pre-commit-lint.ts +30 -3
  292. package/scripts/hooks/pre-push-unit.ts +4 -2
  293. package/scripts/hooks/pretool-guard-cli.ts +1 -8
  294. package/scripts/hooks/pretool-guard.ts +32 -19
  295. package/scripts/hooks/reserved-run.ts +67 -9
  296. package/scripts/hooks/run-hook.sh +13 -4
  297. package/scripts/hooks/shell-rules-notice.ts +37 -0
  298. package/scripts/hooks/stop-actions.ts +2 -21
  299. package/scripts/hooks/stop-guard.ts +13 -9
  300. package/scripts/init/hook-command-rewrite.ts +19 -5
  301. package/scripts/init/hook-launch.ts +15 -17
  302. package/scripts/init/init-actions.ts +0 -6
  303. package/scripts/init/init-ai-copy.ts +10 -36
  304. package/scripts/init/init-bootstrap.ts +9 -8
  305. package/scripts/init/init-dry-run-report.ts +1 -1
  306. package/scripts/init/init-dry-run.ts +1 -1
  307. package/scripts/init/init-file-action.ts +7 -9
  308. package/scripts/init/init-logic-json-merge.ts +2 -2
  309. package/scripts/init/init-logic-migrate.ts +9 -82
  310. package/scripts/init/init-logic.ts +3 -2
  311. package/scripts/init/init-main.ts +12 -0
  312. package/scripts/init/init.ts +5 -12
  313. package/scripts/init/kit-development-versions.ts +3 -7
  314. package/scripts/init/kit-written-paths.ts +2 -2
  315. package/scripts/init/project-profile.ts +5 -4
  316. package/scripts/init/tsconfig-preset-migration.ts +2 -1
  317. package/scripts/init/vscode-tasks.ts +1 -1
  318. package/scripts/issue/defect-origin-cli.ts +106 -0
  319. package/scripts/issue/defect-origin-line.ts +60 -0
  320. package/scripts/issue/defect-origin-main.ts +11 -0
  321. package/scripts/issue/defect-origin.ts +114 -0
  322. package/scripts/issue/defect-rate-cli.ts +34 -78
  323. package/scripts/issue/defect-rate.ts +0 -16
  324. package/scripts/issue/defect-report-cli.ts +128 -0
  325. package/scripts/issue/defect-report-format.ts +56 -0
  326. package/scripts/issue/defect-report-main.ts +11 -0
  327. package/scripts/issue/defect-report.ts +160 -0
  328. package/scripts/issue/expected-effect-lint.ts +1 -0
  329. package/scripts/issue/issue-already-done-cli.ts +62 -0
  330. package/scripts/issue/issue-body-or-comment.ts +40 -0
  331. package/scripts/issue/issue-cite-cli.ts +0 -9
  332. package/scripts/issue/issue-cite-main.ts +12 -0
  333. package/scripts/issue/issue-classification.ts +12 -7
  334. package/scripts/issue/issue-comment-cli.ts +10 -24
  335. package/scripts/issue/issue-comment-main.ts +12 -0
  336. package/scripts/issue/issue-evidence-exit.ts +100 -0
  337. package/scripts/issue/issue-file-cli.ts +29 -7
  338. package/scripts/issue/issue-file.ts +19 -19
  339. package/scripts/issue/issue-fold-cli.ts +2 -11
  340. package/scripts/issue/issue-fold-main.ts +12 -0
  341. package/scripts/issue/issue-labels.ts +81 -90
  342. package/scripts/issue/issue-lint-cli.ts +2 -10
  343. package/scripts/issue/issue-lint-main.ts +12 -0
  344. package/scripts/issue/issue-measured-cli.ts +56 -0
  345. package/scripts/issue/issue-merged.ts +19 -2
  346. package/scripts/issue/issue-not-before-label.ts +135 -0
  347. package/scripts/issue/issue-not-before.ts +111 -0
  348. package/scripts/issue/issue-number-shape.ts +15 -1
  349. package/scripts/issue/issue-park.ts +28 -0
  350. package/scripts/issue/issue-plan-cli.ts +151 -0
  351. package/scripts/issue/issue-priority.ts +151 -0
  352. package/scripts/issue/issue-rank.ts +7 -1
  353. package/scripts/issue/issue-read-cli.ts +3 -10
  354. package/scripts/issue/issue-read-main.ts +12 -0
  355. package/scripts/issue/issue-read.ts +29 -5
  356. package/scripts/issue/issue-release-cli.ts +0 -10
  357. package/scripts/issue/issue-release-main.ts +13 -0
  358. package/scripts/issue/issue-release.ts +7 -12
  359. package/scripts/issue/issue-sample-gate.ts +192 -0
  360. package/scripts/issue/issue-sample-source.ts +76 -0
  361. package/scripts/issue/issue-scout-cli.ts +0 -11
  362. package/scripts/issue/issue-scout-main.ts +14 -0
  363. package/scripts/issue/issue-state-cli.ts +0 -10
  364. package/scripts/issue/issue-state-main.ts +12 -0
  365. package/scripts/issue/issue-watch-diff.ts +56 -15
  366. package/scripts/issue/issue-watch.ts +2 -1
  367. package/scripts/issue/issue-wip.ts +2 -7
  368. package/scripts/issue/measure-rerun-cli.ts +13 -8
  369. package/scripts/issue/plan-consumers-cli.ts +39 -0
  370. package/scripts/issue/plan-consumers-main.ts +11 -0
  371. package/scripts/issue/plan-consumers-section.ts +55 -0
  372. package/scripts/issue/plan-consumers.ts +127 -0
  373. package/scripts/josh/agent-session-environment.ts +1 -1
  374. package/scripts/josh/command-usage.ts +15 -43
  375. package/scripts/josh/file-map-stamp.ts +49 -16
  376. package/scripts/josh/hook-decision.ts +32 -20
  377. package/scripts/josh/josh-command-map.ts +4 -1
  378. package/scripts/josh/josh-command-types.ts +12 -6
  379. package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
  380. package/scripts/josh/josh-commands-ai.ts +157 -158
  381. package/scripts/josh/josh-commands-backlog.ts +82 -16
  382. package/scripts/josh/josh-commands-clone.ts +1 -0
  383. package/scripts/josh/josh-commands-development.ts +111 -71
  384. package/scripts/josh/josh-commands-document.ts +43 -1
  385. package/scripts/josh/josh-commands-epic.ts +171 -0
  386. package/scripts/josh/josh-commands-hooks.ts +25 -2
  387. package/scripts/josh/josh-commands-issue-write.ts +181 -0
  388. package/scripts/josh/josh-commands-issue.ts +124 -24
  389. package/scripts/josh/josh-commands-lane.ts +103 -2
  390. package/scripts/josh/josh-commands-lint.ts +19 -8
  391. package/scripts/josh/josh-commands-maintenance.ts +112 -4
  392. package/scripts/josh/josh-commands-pause.ts +29 -0
  393. package/scripts/josh/josh-commands-progress.ts +87 -0
  394. package/scripts/josh/josh-commands-project.ts +138 -9
  395. package/scripts/josh/josh-commands-review.ts +124 -0
  396. package/scripts/josh/josh-commands-run.ts +211 -23
  397. package/scripts/josh/josh-commands-ship.ts +169 -0
  398. package/scripts/josh/josh-commands-split.ts +9 -0
  399. package/scripts/josh/josh-commands-versioning.ts +49 -2
  400. package/scripts/josh/josh-commands-workflow.ts +144 -6
  401. package/scripts/josh/josh-logic.ts +6 -13
  402. package/scripts/josh/package-directory.ts +2 -4
  403. package/scripts/josh/process-identity.ts +13 -4
  404. package/scripts/josh/session-language-cli.ts +4 -8
  405. package/scripts/josh/session-language-main.ts +13 -0
  406. package/scripts/josh/session-language.ts +6 -1
  407. package/scripts/josh/shared-cache.ts +90 -0
  408. package/scripts/josh/stamp-file.ts +9 -15
  409. package/scripts/lane/lane-await.ts +51 -12
  410. package/scripts/lane/lane-cache.ts +5 -30
  411. package/scripts/lane/lane-capacity.ts +14 -23
  412. package/scripts/lane/lane-check-stats.ts +62 -21
  413. package/scripts/lane/lane-child-invocation.ts +8 -0
  414. package/scripts/lane/lane-cli.ts +15 -5
  415. package/scripts/lane/lane-close.ts +86 -18
  416. package/scripts/lane/lane-core-wait-stats.ts +66 -0
  417. package/scripts/lane/lane-dispatch.ts +24 -3
  418. package/scripts/lane/lane-gap-stats.ts +156 -0
  419. package/scripts/lane/lane-handoff.ts +69 -1
  420. package/scripts/lane/lane-held-stats.ts +129 -0
  421. package/scripts/lane/lane-install.ts +4 -11
  422. package/scripts/lane/lane-launch-cli.ts +0 -9
  423. package/scripts/lane/lane-launch-main.ts +12 -0
  424. package/scripts/lane/lane-ledger-schema.ts +266 -0
  425. package/scripts/lane/lane-ledger.ts +92 -123
  426. package/scripts/lane/lane-limit-cli.ts +12 -1
  427. package/scripts/lane/lane-measure-cli.ts +57 -11
  428. package/scripts/lane/lane-open.ts +9 -1
  429. package/scripts/lane/lane-parked.ts +3 -3
  430. package/scripts/lane/lane-pause-cli.ts +130 -0
  431. package/scripts/lane/lane-pause.ts +158 -0
  432. package/scripts/lane/lane-process-table.ts +166 -0
  433. package/scripts/lane/lane-reap-settle.ts +124 -0
  434. package/scripts/lane/lane-reap.ts +50 -15
  435. package/scripts/lane/lane-registry.ts +24 -3
  436. package/scripts/lane/lane-residents.ts +162 -0
  437. package/scripts/lane/lane-restart.ts +22 -2
  438. package/scripts/lane/lane-round-two-stats.ts +49 -0
  439. package/scripts/lane/lane-sampler.ts +4 -0
  440. package/scripts/lane/lane-session-action.ts +19 -5
  441. package/scripts/lane/lane-session-broker.ts +102 -21
  442. package/scripts/lane/lane-snapshot-trace.ts +84 -0
  443. package/scripts/lane/lane-spans.ts +51 -0
  444. package/scripts/lane/lane-spent.ts +6 -3
  445. package/scripts/lane/lane-stage-stats.ts +7 -2
  446. package/scripts/lane/lane-state.ts +302 -0
  447. package/scripts/lane/lane-stats.ts +58 -4
  448. package/scripts/lane/lane-stop-stats.ts +113 -37
  449. package/scripts/lane/lane-test-related-stats.ts +127 -0
  450. package/scripts/lane/lane-transcript-calls.ts +145 -0
  451. package/scripts/lane/lane-transcript-stats.ts +168 -0
  452. package/scripts/lane/lane-vacant.ts +13 -3
  453. package/scripts/lane/lane-withdraw-cli.ts +5 -4
  454. package/scripts/lane/lane-withdraw.ts +50 -49
  455. package/scripts/lane/process-directories.ts +70 -0
  456. package/scripts/lane/process-lane-marks.ts +94 -0
  457. package/scripts/lib/atomic-write.ts +62 -0
  458. package/scripts/lib/buffered-process.ts +12 -5
  459. package/scripts/lib/cli-flags.ts +53 -0
  460. package/scripts/lib/figure-format.ts +63 -0
  461. package/scripts/lib/json-value.ts +9 -1
  462. package/scripts/lib/package-manifest.ts +35 -0
  463. package/scripts/lib/read-file.ts +3 -1
  464. package/scripts/lib/stamped-memo.ts +63 -0
  465. package/scripts/lib/stdout-on-stderr.ts +24 -0
  466. package/scripts/lib/timeouts.ts +9 -0
  467. package/scripts/lib/transcript-record.ts +91 -0
  468. package/scripts/lines/effective-limit.ts +1 -1
  469. package/scripts/lint/eslint-cache-dependencies.ts +145 -0
  470. package/scripts/lint/eslint-daemon.ts +265 -0
  471. package/scripts/lint/format.ts +11 -2
  472. package/scripts/lint/import-graph.ts +279 -0
  473. package/scripts/lint/lint-gate-scope.ts +102 -0
  474. package/scripts/lint/lint-parallel-main.ts +19 -0
  475. package/scripts/lint/lint-parallel.ts +62 -30
  476. package/scripts/lint/lint-related-scope.ts +30 -24
  477. package/scripts/lint/lint-related.ts +38 -6
  478. package/scripts/notify/confirmation-options.ts +1 -2
  479. package/scripts/notify/telegram-notify.ts +20 -20
  480. package/scripts/notify/telegram-test-logic.ts +0 -1
  481. package/scripts/notify/telegram-test-main.ts +8 -0
  482. package/scripts/notify/telegram-test.ts +2 -6
  483. package/scripts/observations/observation-ledger.ts +13 -0
  484. package/scripts/observations/observations-flush-landing.ts +5 -3
  485. package/scripts/observations/observations-flush.ts +6 -1
  486. package/scripts/overrides/overrides-check.ts +2 -5
  487. package/scripts/overrides/overrides-files.ts +2 -1
  488. package/scripts/overrides/overrides-logic.ts +3 -6
  489. package/scripts/package/verify-optional-eslint-install.ts +8 -6
  490. package/scripts/propagate/propagate-publish.ts +2 -7
  491. package/scripts/propagate/propagate-targets.ts +4 -12
  492. package/scripts/refactor/import-graph.ts +9 -7
  493. package/scripts/release/github-release-runs.ts +17 -6
  494. package/scripts/release/release-approval-prune.ts +18 -0
  495. package/scripts/release/release-history.ts +1 -3
  496. package/scripts/release/release-progress.ts +42 -22
  497. package/scripts/release/release-publish-run.ts +39 -0
  498. package/scripts/release/release-publish.ts +6 -6
  499. package/scripts/release/release-scope-cli.ts +0 -10
  500. package/scripts/release/release-scope-main.ts +12 -0
  501. package/scripts/repo/repo-setting.ts +3 -6
  502. package/scripts/repo/required-checks-logic.ts +6 -15
  503. package/scripts/report/report-format-reference.ts +2 -0
  504. package/scripts/report/report-labels.ts +155 -0
  505. package/scripts/report/report-lint-cli.ts +3 -0
  506. package/scripts/report/report-lint.ts +85 -110
  507. package/scripts/report/report-template-cli.ts +59 -0
  508. package/scripts/report/report-template.ts +112 -0
  509. package/scripts/review/acceptance-map.ts +1 -0
  510. package/scripts/review/removed-tests-check.ts +86 -0
  511. package/scripts/review/removed-tests.ts +149 -0
  512. package/scripts/review/review-brief-cli.ts +81 -15
  513. package/scripts/review/review-brief-main.ts +12 -0
  514. package/scripts/review/review-brief.ts +31 -3
  515. package/scripts/review/review-code-tree.ts +10 -6
  516. package/scripts/review/review-comment-round.ts +26 -8
  517. package/scripts/review/review-finding-ledger.ts +30 -15
  518. package/scripts/review/review-interaction.ts +94 -0
  519. package/scripts/review/review-readers-scan.ts +163 -0
  520. package/scripts/review/review-record-cli.ts +69 -30
  521. package/scripts/review/review-record-main.ts +12 -0
  522. package/scripts/review/review-round-one-blobs.ts +221 -0
  523. package/scripts/review/review-round2-cli.ts +49 -12
  524. package/scripts/review/review-round2.ts +80 -12
  525. package/scripts/review/review-stamps.ts +19 -1
  526. package/scripts/review/review-stop-log.ts +96 -0
  527. package/scripts/review/review-stops-cli.ts +85 -0
  528. package/scripts/review/review-tree.ts +6 -17
  529. package/scripts/review/review-untouched-readers.ts +146 -0
  530. package/scripts/review/test-titles.ts +118 -0
  531. package/scripts/rules/agent-model.ts +8 -0
  532. package/scripts/rules/bash-triggers.ts +46 -3
  533. package/scripts/rules/decision-oracle-batch.ts +9 -1
  534. package/scripts/rules/decision-oracle.ts +2 -2
  535. package/scripts/rules/delivered-rules.ts +80 -2
  536. package/scripts/rules/destructive-command.ts +8 -1
  537. package/scripts/rules/direct-filing.ts +10 -2
  538. package/scripts/rules/direct-issue-comment.ts +117 -0
  539. package/scripts/rules/direct-pr-create.ts +69 -3
  540. package/scripts/rules/early-heartbeat.ts +2 -1
  541. package/scripts/rules/file-body.ts +7 -0
  542. package/scripts/rules/filing-cap.ts +7 -0
  543. package/scripts/rules/git-argv.ts +72 -14
  544. package/scripts/rules/git-force.ts +12 -2
  545. package/scripts/rules/guard-remedy.ts +4 -0
  546. package/scripts/rules/implementation-cut-verdict.ts +1 -1
  547. package/scripts/rules/implementation-cut.ts +11 -3
  548. package/scripts/rules/index-guard.ts +8 -1
  549. package/scripts/rules/issue-comments.ts +9 -1
  550. package/scripts/rules/josh-git-bare.ts +7 -0
  551. package/scripts/rules/lane-background.ts +67 -25
  552. package/scripts/rules/lane-carry-conflict.ts +6 -0
  553. package/scripts/rules/lane-direct-tool.ts +74 -0
  554. package/scripts/rules/lane-interactive-ask.ts +9 -2
  555. package/scripts/rules/lane-park.ts +45 -23
  556. package/scripts/rules/lane-split-park.ts +10 -2
  557. package/scripts/rules/lane-switch-main.ts +7 -0
  558. package/scripts/rules/oracle-consulted.ts +10 -0
  559. package/scripts/rules/oracle-firing.ts +1 -0
  560. package/scripts/rules/permission-guards.ts +3 -0
  561. package/scripts/rules/piped-verification.ts +1 -1
  562. package/scripts/rules/poll-loop.ts +7 -0
  563. package/scripts/rules/pr-merge.ts +123 -0
  564. package/scripts/rules/protected-files.ts +32 -5
  565. package/scripts/rules/raw-field-body.ts +6 -0
  566. package/scripts/rules/rule-body-guard.ts +8 -0
  567. package/scripts/rules/rule-list.ts +9 -28
  568. package/scripts/rules/rule-value-cache.ts +4 -9
  569. package/scripts/rules/rule-value-cli.ts +51 -32
  570. package/scripts/rules/rule-value.ts +1 -1
  571. package/scripts/rules/shell-segments.ts +35 -0
  572. package/scripts/rules/stop-rule-rows.ts +64 -0
  573. package/scripts/rules/stop-rules.ts +3 -4
  574. package/scripts/rules/test-declared-commit.ts +11 -1
  575. package/scripts/rules/third-party-write.ts +7 -0
  576. package/scripts/rules/timed-rerun.ts +69 -0
  577. package/scripts/rules/worktree-guard.ts +13 -3
  578. package/scripts/run/board/run-board-app-name.ts +23 -0
  579. package/scripts/run/board/run-board-cli.ts +65 -32
  580. package/scripts/run/board/run-board-earlier.ts +94 -0
  581. package/scripts/run/board/run-board-ending-reason.ts +67 -0
  582. package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
  583. package/scripts/run/board/run-board-estimate.ts +98 -0
  584. package/scripts/run/board/run-board-fit.ts +153 -36
  585. package/scripts/run/board/run-board-fold.ts +123 -0
  586. package/scripts/run/board/run-board-fresh.ts +2 -2
  587. package/scripts/run/board/run-board-gather-live.ts +29 -0
  588. package/scripts/run/board/run-board-gather-thread.ts +189 -0
  589. package/scripts/run/board/run-board-gather-worker.ts +29 -0
  590. package/scripts/run/board/run-board-gather.ts +187 -0
  591. package/scripts/run/board/run-board-github.ts +118 -38
  592. package/scripts/run/board/run-board-header.ts +82 -20
  593. package/scripts/run/board/run-board-keys.ts +58 -0
  594. package/scripts/run/board/run-board-kind.ts +20 -6
  595. package/scripts/run/board/run-board-labels.ts +116 -71
  596. package/scripts/run/board/run-board-lane-state.ts +109 -0
  597. package/scripts/run/board/run-board-lane-time.ts +122 -0
  598. package/scripts/run/board/run-board-layout.ts +239 -60
  599. package/scripts/run/board/run-board-length.ts +52 -0
  600. package/scripts/run/board/run-board-machine.ts +8 -4
  601. package/scripts/run/board/run-board-main.ts +12 -0
  602. package/scripts/run/board/run-board-notes.ts +52 -31
  603. package/scripts/run/board/run-board-now.ts +1 -1
  604. package/scripts/run/board/run-board-operation.ts +15 -33
  605. package/scripts/run/board/run-board-phase.ts +1 -1
  606. package/scripts/run/board/run-board-plan-shared.ts +115 -0
  607. package/scripts/run/board/run-board-plan.ts +55 -3
  608. package/scripts/run/board/run-board-planning.ts +45 -0
  609. package/scripts/run/board/run-board-priority.ts +44 -0
  610. package/scripts/run/board/run-board-process-groups.ts +195 -0
  611. package/scripts/run/board/run-board-read.ts +151 -27
  612. package/scripts/run/board/run-board-reason.ts +235 -51
  613. package/scripts/run/board/run-board-released.ts +35 -0
  614. package/scripts/run/board/run-board-render-checks.ts +39 -5
  615. package/scripts/run/board/run-board-render-condition.ts +96 -0
  616. package/scripts/run/board/run-board-render-drawn.ts +67 -0
  617. package/scripts/run/board/run-board-render-foot.ts +59 -0
  618. package/scripts/run/board/run-board-render-icon.ts +35 -0
  619. package/scripts/run/board/run-board-render-lanes.ts +145 -0
  620. package/scripts/run/board/run-board-render-lead.ts +80 -0
  621. package/scripts/run/board/run-board-render-legend.ts +117 -48
  622. package/scripts/run/board/run-board-render-notes.ts +156 -29
  623. package/scripts/run/board/run-board-render-processes.ts +196 -0
  624. package/scripts/run/board/run-board-render-section.ts +119 -0
  625. package/scripts/run/board/run-board-render-slot.ts +3 -36
  626. package/scripts/run/board/run-board-render-tail.ts +115 -48
  627. package/scripts/run/board/run-board-render-time.ts +56 -0
  628. package/scripts/run/board/run-board-render-title.ts +117 -24
  629. package/scripts/run/board/run-board-render-waits.ts +104 -20
  630. package/scripts/run/board/run-board-render.ts +207 -265
  631. package/scripts/run/board/run-board-roots.ts +54 -0
  632. package/scripts/run/board/run-board-row-yield.ts +9 -4
  633. package/scripts/run/board/run-board-setup.ts +1 -12
  634. package/scripts/run/board/run-board-snapshot.ts +111 -0
  635. package/scripts/run/board/run-board-spin.ts +2 -2
  636. package/scripts/run/board/run-board-state.ts +22 -33
  637. package/scripts/run/board/run-board-status.ts +147 -71
  638. package/scripts/run/board/run-board-thanks-read.ts +2 -2
  639. package/scripts/run/board/run-board-tick.ts +122 -107
  640. package/scripts/run/board/run-board-usage-board.ts +78 -0
  641. package/scripts/run/board/run-board-usage-lanes.ts +113 -0
  642. package/scripts/run/board/run-board-usage-listing.ts +93 -0
  643. package/scripts/run/board/run-board-usage-read.ts +120 -150
  644. package/scripts/run/board/run-board-usage-rusage.ts +19 -7
  645. package/scripts/run/board/run-board-usage-text.ts +139 -51
  646. package/scripts/run/board/run-board-usage-top.ts +102 -0
  647. package/scripts/run/board/run-board-usage.ts +89 -72
  648. package/scripts/run/board/run-board-usual.ts +20 -9
  649. package/scripts/run/carry/run-carry-args.ts +4 -7
  650. package/scripts/run/carry/run-carry-conversation.ts +1 -1
  651. package/scripts/run/carry/run-carry.ts +9 -4
  652. package/scripts/run/cut/run-cut-handoff.ts +2 -2
  653. package/scripts/run/event/run-event-cli.ts +1 -5
  654. package/scripts/run/event/run-event-filed.ts +12 -6
  655. package/scripts/run/event/run-event-follow.ts +2 -3
  656. package/scripts/run/event/run-event-render.ts +6 -10
  657. package/scripts/run/event/run-event-scope.ts +2 -2
  658. package/scripts/run/event/run-event-stream-emit.ts +82 -22
  659. package/scripts/run/event/run-event-stream.ts +34 -8
  660. package/scripts/run/hold/run-hold-adopt.ts +65 -0
  661. package/scripts/run/hold/run-hold-cli.ts +93 -22
  662. package/scripts/run/hold/run-hold-main.ts +12 -0
  663. package/scripts/run/hold/run-hold-member.ts +37 -0
  664. package/scripts/run/hold/run-stop-notify.ts +183 -0
  665. package/scripts/run/merge/run-merge-auth.ts +31 -0
  666. package/scripts/run/merge/run-merge-cli.ts +62 -48
  667. package/scripts/run/merge/run-merge-close.ts +74 -0
  668. package/scripts/run/merge/run-merge-collect.ts +6 -13
  669. package/scripts/run/merge/run-merge-driver.ts +71 -0
  670. package/scripts/run/merge/run-merge-main.ts +12 -0
  671. package/scripts/run/merge/run-merge-outcome.ts +23 -0
  672. package/scripts/run/merge/run-merge-restart.ts +39 -0
  673. package/scripts/run/merge/run-merge-ship.ts +20 -4
  674. package/scripts/run/merge/run-merge-signals.ts +33 -9
  675. package/scripts/run/merge/run-merge-steps.ts +120 -85
  676. package/scripts/run/merge/run-merge.ts +38 -37
  677. package/scripts/run/park/run-park-cli.ts +91 -0
  678. package/scripts/run/park/run-park.ts +88 -0
  679. package/scripts/run/park/run-stalled.ts +68 -0
  680. package/scripts/run/pause/run-pause-cli.ts +73 -0
  681. package/scripts/run/pause/run-pause.ts +251 -0
  682. package/scripts/run/progress/run-progress-cli.ts +4 -12
  683. package/scripts/run/progress/run-progress-clock.ts +1 -1
  684. package/scripts/run/progress/run-progress-config.ts +6 -14
  685. package/scripts/run/progress/run-progress-main.ts +12 -0
  686. package/scripts/run/progress/run-progress.ts +1 -4
  687. package/scripts/run/review/run-review.ts +2 -1
  688. package/scripts/run/run-ending.ts +1 -0
  689. package/scripts/run/run-invocation.ts +5 -6
  690. package/scripts/run/run-liveness-cli.ts +6 -8
  691. package/scripts/run/run-liveness.ts +60 -29
  692. package/scripts/run/run-next.ts +1 -1
  693. package/scripts/run/run-parent-cut-hook.ts +2 -2
  694. package/scripts/run/run-preflight.ts +18 -3
  695. package/scripts/run/run-prep-cli.ts +1 -10
  696. package/scripts/run/run-prep-locate.ts +7 -50
  697. package/scripts/run/run-prep-main.ts +12 -0
  698. package/scripts/run/run-prep.ts +6 -0
  699. package/scripts/run/run-report-cli.ts +101 -13
  700. package/scripts/run/run-report-handoff.ts +114 -0
  701. package/scripts/run/run-step.ts +1 -1
  702. package/scripts/run/run-stranded-detect.ts +13 -0
  703. package/scripts/run/run-watcher-guard-cli.ts +1 -1
  704. package/scripts/run/run-watcher-guard.ts +1 -1
  705. package/scripts/run/ship/run-ship-args.ts +121 -0
  706. package/scripts/run/ship/run-ship-body-draft.ts +110 -0
  707. package/scripts/run/ship/run-ship-cli.ts +63 -140
  708. package/scripts/run/ship/run-ship-detach.ts +19 -8
  709. package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
  710. package/scripts/run/ship/run-ship-next.ts +18 -2
  711. package/scripts/run/ship/run-ship-overlap.ts +42 -5
  712. package/scripts/run/ship/run-ship-place.ts +96 -0
  713. package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
  714. package/scripts/run/ship/run-ship-pre-detach.ts +81 -24
  715. package/scripts/run/ship/run-ship-preflight.ts +137 -32
  716. package/scripts/run/ship/run-ship-probe.ts +11 -3
  717. package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
  718. package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
  719. package/scripts/run/ship/run-ship-return.ts +107 -23
  720. package/scripts/run/ship/run-ship-review-steps.ts +105 -151
  721. package/scripts/run/ship/run-ship-review.ts +73 -6
  722. package/scripts/run/ship/run-ship-reviewer.ts +207 -0
  723. package/scripts/run/ship/run-ship-stage.ts +55 -6
  724. package/scripts/run/ship/run-ship-steps.ts +46 -15
  725. package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
  726. package/scripts/run/ship/run-ship-stop-text.ts +11 -6
  727. package/scripts/run/ship/run-ship-sync.ts +43 -6
  728. package/scripts/run/ship/run-ship.ts +30 -2
  729. package/scripts/run/tidy/run-tidy-cli.ts +0 -4
  730. package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
  731. package/scripts/run/tidy/run-tidy-main.ts +8 -0
  732. package/scripts/run/wake/run-wake-cli.ts +119 -100
  733. package/scripts/run/wake/run-wake-code.ts +83 -0
  734. package/scripts/run/wake/run-wake-driver.ts +19 -8
  735. package/scripts/run/wake/run-wake-loop.ts +34 -3
  736. package/scripts/run/wake/run-wake-main.ts +13 -0
  737. package/scripts/run/wake/run-wake-ports.ts +90 -0
  738. package/scripts/run/wake/run-wake-takeover.ts +66 -0
  739. package/scripts/run/wake/run-wake.ts +2 -1
  740. package/scripts/safe-chain/pack-hook.ts +2 -2
  741. package/scripts/safe-chain/preinstall-command.ts +2 -1
  742. package/scripts/safe-chain/project-config.ts +3 -9
  743. package/scripts/security/security-audit-main.ts +8 -0
  744. package/scripts/security/security-audit-provision-logic.ts +0 -11
  745. package/scripts/security/security-audit-provision-main.ts +12 -0
  746. package/scripts/security/security-audit-provision.ts +11 -26
  747. package/scripts/security/security-audit.ts +6 -7
  748. package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
  749. package/scripts/split/split-assess-cli.ts +2 -2
  750. package/scripts/split/split-assess.ts +15 -0
  751. package/scripts/split/split-measure.ts +65 -0
  752. package/scripts/sync/claude-settings-merge.ts +8 -15
  753. package/scripts/sync/directory-copy-guard.ts +4 -9
  754. package/scripts/sync/file-content.ts +78 -8
  755. package/scripts/sync/sync-ai-files.ts +3 -5
  756. package/scripts/sync/sync-configs.ts +11 -23
  757. package/scripts/sync/sync-hook-safety.ts +4 -10
  758. package/scripts/sync/sync-main.ts +11 -0
  759. package/scripts/sync/sync.ts +25 -37
  760. package/scripts/test/test-declared-changed.ts +2 -2
  761. package/scripts/test/test-declared.ts +1 -1
  762. package/scripts/test/test-e2e-guard.ts +25 -1
  763. package/scripts/test/test-e2e-stamp.ts +38 -0
  764. package/scripts/test/test-pinned-logic.ts +145 -0
  765. package/scripts/test/test-pinned-main.ts +78 -0
  766. package/scripts/test/test-pinned.ts +100 -0
  767. package/scripts/test/test-read-map.ts +264 -0
  768. package/scripts/test/test-read-recording.ts +91 -0
  769. package/scripts/test/test-read-trace.ts +148 -0
  770. package/scripts/test/test-red-main.ts +12 -0
  771. package/scripts/test/test-red.ts +12 -30
  772. package/scripts/test/test-related-main.ts +18 -0
  773. package/scripts/test/test-related-record.ts +119 -0
  774. package/scripts/test/test-related-scope.ts +229 -43
  775. package/scripts/test/test-related.ts +300 -22
  776. package/scripts/test/test-unit-guard-main.ts +15 -0
  777. package/scripts/test/test-unit-guard.ts +42 -24
  778. package/scripts/test/unit-count-file.ts +37 -0
  779. package/scripts/test/unit-run-marker.ts +162 -0
  780. package/scripts/test/unit-setup-files.ts +51 -0
  781. package/scripts/test/unit-worker-share.ts +61 -149
  782. package/scripts/test/whole-suite-files.ts +63 -0
  783. package/scripts/time-runtime/time-background.ts +20 -2
  784. package/scripts/time-runtime/time-bundles.ts +4 -3
  785. package/scripts/time-runtime/time-density-hook.ts +8 -6
  786. package/scripts/time-runtime/time-followup-stage.ts +1 -3
  787. package/scripts/time-runtime/time-format.ts +5 -28
  788. package/scripts/time-runtime/time-markers.ts +10 -1
  789. package/scripts/time-runtime/time-shell.ts +97 -10
  790. package/scripts/time-runtime/time-transcript-line.ts +49 -62
  791. package/scripts/uninstall/uninstall.ts +1 -1
  792. package/scripts/version/bump-version-main.ts +12 -0
  793. package/scripts/version/bump-version.ts +25 -25
  794. package/scripts/version/effective-upstream.ts +6 -12
  795. package/scripts/version/latest-corepack.ts +17 -32
  796. package/scripts/version/latest-if-required-cli.ts +93 -0
  797. package/scripts/version/latest-lane-guard-main.ts +8 -0
  798. package/scripts/version/latest-lane-guard.ts +0 -4
  799. package/scripts/version/latest-scope-cli.ts +0 -9
  800. package/scripts/version/latest-scope-main.ts +12 -0
  801. package/scripts/version/latest-update.ts +5 -5
  802. package/scripts/version/npm-registry.ts +44 -6
  803. package/scripts/version/publishable-range-check.ts +5 -16
  804. package/scripts/version/release-age.ts +1 -1
  805. package/scripts/version/release-hold.ts +1 -1
  806. package/scripts/version/release-window.ts +38 -0
  807. package/scripts/version/running-binary.ts +1 -1
  808. package/scripts/version/safe-chain-version-update.ts +3 -8
  809. package/scripts/version/version-targets.ts +6 -28
  810. package/templates/dependabot.yml +29 -0
  811. package/templates/gitignore +4 -1
  812. package/templates/pnpm-workspace.basic.yaml +1 -1
  813. package/templates/sonar-project.properties +3 -2
  814. package/templates/workflows/ci.yml +12 -4
  815. package/templates/workflows/github-release.yml +4 -0
  816. package/tsconfig.sonar.json +1 -1
  817. package/.ncurc.json +0 -3
  818. package/dist/hooks/batch-guard.js +0 -29
  819. package/dist/hooks/chunk-4KKD2UTK.js +0 -66
  820. package/dist/hooks/chunk-6TS2JD6D.js +0 -237
  821. package/dist/hooks/chunk-7DSBJVFH.js +0 -50
  822. package/dist/hooks/chunk-A65Y4YOR.js +0 -79
  823. package/dist/hooks/chunk-CDY4NFQG.js +0 -15
  824. package/dist/hooks/chunk-EFXE6C37.js +0 -81
  825. package/dist/hooks/chunk-GP4IEC4O.js +0 -20
  826. package/dist/hooks/chunk-JP45SOCJ.js +0 -56
  827. package/dist/hooks/chunk-LAOV7NLM.js +0 -45
  828. package/dist/hooks/chunk-M4HGZV7U.js +0 -83
  829. package/dist/hooks/chunk-PF2NZL2A.js +0 -131
  830. package/dist/hooks/chunk-PTICX4OL.js +0 -358
  831. package/dist/hooks/chunk-RT27QRJW.js +0 -6247
  832. package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
  833. package/dist/hooks/chunk-UPUZF3AN.js +0 -279
  834. package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
  835. package/dist/hooks/duplicate-read-guard.js +0 -30
  836. package/dist/hooks/investigation-guard.js +0 -29
  837. package/scripts/backlog/backlog-stalled-cli.ts +0 -30
  838. package/scripts/cost-runtime/cost-format.ts +0 -29
  839. package/scripts/init/basic-path-migration.ts +0 -24
  840. package/scripts/issue/issue-backlinks-cli.ts +0 -93
  841. package/scripts/josh/josh-commands-guard.ts +0 -38
  842. package/scripts/josh/josh-usage-automation.ts +0 -121
  843. package/scripts/josh/josh-usage-backlog.ts +0 -180
  844. package/scripts/josh/josh-usage-developer.ts +0 -230
  845. package/scripts/josh/josh-usage-hooks.ts +0 -38
  846. package/scripts/josh/josh-usage-issue.ts +0 -205
  847. package/scripts/josh/josh-usage-review.ts +0 -101
  848. package/scripts/josh/josh-usage-run.ts +0 -252
  849. package/scripts/josh/josh-usage-session.ts +0 -238
  850. package/scripts/josh/josh-usage-workflow.ts +0 -212
  851. package/scripts/lint/cross-file-recheck.ts +0 -155
  852. package/scripts/registry-migration/migrate-logic.ts +0 -237
  853. package/scripts/registry-migration/migrate.ts +0 -292
  854. package/scripts/registry-migration/user-npmrc.ts +0 -15
  855. package/scripts/rules/rule-guard.ts +0 -23
  856. package/scripts/rules/rule-registry-rows.ts +0 -292
  857. package/scripts/rules/rule-registry.ts +0 -112
  858. package/scripts/run/run-stranded-cli.ts +0 -27
@@ -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 }
@@ -10,6 +10,7 @@ import { telegram_notify } from '#scripts/notify/telegram-notify'
10
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.
@@ -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
  }
@@ -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 }
@@ -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,62 @@ 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
+
27
87
  // When the detached ship for `issue` that is still live was launched, or `undefined` where none is.
28
88
  function ship_running_since(issue: string, directory: string): number | undefined {
29
89
  const repository = git_common_directory.repository(directory)
@@ -40,6 +100,14 @@ function is_handed_off(directory: string, source: MarkerSource = process.env): b
40
100
  return is_ship_running(issue, directory)
41
101
  }
42
102
 
43
- const lane_handoff = { is_handed_off, is_ship_running, ship_running_since }
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
+ }
44
112
 
45
113
  export { lane_handoff }
@@ -0,0 +1,129 @@
1
+ import { lane_ledger, type HeldEntry, 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 a free lane stayed empty, and why: the ledger's `held` entries of one period reduced to one
6
+ // row per reason, printed by `josh lane:stats` so the idle capacity a backlog stall episode reported
7
+ // is split by cause — an offer that started nothing apart from a driver waiting on its session
8
+ // (joshuafolkken/kit#3995).
9
+ //
10
+ // **A hold lasts until the next `held`, `released` or `dispatch` entry**: the driver writes one on every
11
+ // offered pass that started nothing, so consecutive entries tile the wait and the last one ends at the
12
+ // dispatch — or at the release a full pool or a finished run writes.
13
+ // A hold nothing followed is counted under `not ended`, kept out of the minutes, whose time has no end;
14
+ // one past `MAX_HOLD_MS` is a driver nobody restarted, read as ended at the cap.
15
+
16
+ const COLUMNS = [
17
+ 'held by',
18
+ 'total (min)',
19
+ 'median (min)',
20
+ 'max (min)',
21
+ 'holds',
22
+ 'not ended',
23
+ ] as const
24
+ const MS_PER_HOUR = 3_600_000
25
+ const MAX_HOLD_MS = MS_PER_HOUR
26
+ const { NOT_MEASURED } = lane_stage_stats
27
+ // A period with no hold: the table still prints, so a reader sees zero holds rather than no table.
28
+ const NONE_ROW = ['none', NOT_MEASURED, NOT_MEASURED, NOT_MEASURED, '0', '0']
29
+ const { is_dispatch, is_number } = lane_stage_stats
30
+
31
+ interface Hold {
32
+ reason: string
33
+ wait_ms: number | undefined
34
+ }
35
+
36
+ function is_held(entry: LedgerEntry): entry is HeldEntry {
37
+ return entry.kind === lane_ledger.KIND.HELD
38
+ }
39
+
40
+ function is_hold_end(entry: LedgerEntry): boolean {
41
+ return is_held(entry) || is_dispatch(entry) || entry.kind === lane_ledger.KIND.RELEASED
42
+ }
43
+
44
+ // Every instant a hold can end at, parsed and sorted once: holds come once a minute, so re-reading the
45
+ // whole ledger per hold made a week's `lane:stats` take seconds.
46
+ function end_times(entries: ReadonlyArray<LedgerEntry>): Array<number> {
47
+ return entries
48
+ .filter((entry) => is_hold_end(entry))
49
+ .map((entry) => Date.parse(entry.at))
50
+ .filter((at) => Number.isFinite(at))
51
+ .toSorted((left, right) => left - right)
52
+ }
53
+
54
+ function wait_ms(held: HeldEntry, ends: ReadonlyArray<number>): number | undefined {
55
+ const from_ms = Date.parse(held.at)
56
+ const end_ms = ends.find((at) => at > from_ms)
57
+
58
+ return end_ms === undefined ? undefined : Math.min(end_ms - from_ms, MAX_HOLD_MS)
59
+ }
60
+
61
+ function holds_of(entries: ReadonlyArray<LedgerEntry>): Array<Hold> {
62
+ const ends = end_times(entries)
63
+
64
+ return entries
65
+ .filter(is_held)
66
+ .map((held) => ({ reason: held.reason, wait_ms: wait_ms(held, ends) }))
67
+ }
68
+
69
+ function total(values: ReadonlyArray<number>): number {
70
+ return values.reduce((sum, value) => sum + value, 0)
71
+ }
72
+
73
+ function ended_of(holds: ReadonlyArray<Hold>, reason: string): Array<number> {
74
+ return holds
75
+ .filter((hold) => hold.reason === reason)
76
+ .map((hold) => hold.wait_ms)
77
+ .filter((value) => is_number(value))
78
+ }
79
+
80
+ function reason_row(reason: string, holds: ReadonlyArray<Hold>): string {
81
+ const ended = ended_of(holds, reason)
82
+ const count = holds.filter((hold) => hold.reason === reason).length
83
+
84
+ return lane_stats.to_row([
85
+ reason,
86
+ lane_stage_stats.cell(ended.length === 0 ? undefined : total(ended)),
87
+ lane_stage_stats.cell(lane_stats.median(ended)),
88
+ lane_stage_stats.cell(lane_stats.peak(ended)),
89
+ String(count),
90
+ String(count - ended.length),
91
+ ])
92
+ }
93
+
94
+ // The reasons the period saw, the longest total first, so the cause worth removing next leads.
95
+ function reasons_of(holds: ReadonlyArray<Hold>): Array<string> {
96
+ const reasons = [...new Set(holds.map((hold) => hold.reason))]
97
+
98
+ return reasons.toSorted(
99
+ (left, right) => total(ended_of(holds, right)) - total(ended_of(holds, left)),
100
+ )
101
+ }
102
+
103
+ // The period's table: `entries` is the whole ledger, filtered here to `window`.
104
+ function table(entries: ReadonlyArray<LedgerEntry>, window: StatsWindow): string {
105
+ const holds = holds_of(lane_stats.in_window(entries, window))
106
+ const rows = reasons_of(holds).map((reason) => reason_row(reason, holds))
107
+
108
+ return [
109
+ lane_stats.to_row(COLUMNS),
110
+ lane_stats.to_row(COLUMNS.map(() => '---')),
111
+ ...(rows.length === 0 ? [lane_stats.to_row(NONE_ROW)] : rows),
112
+ ].join('\n')
113
+ }
114
+
115
+ function is_open_at(held: HeldEntry, now_ms: number): boolean {
116
+ return now_ms - Date.parse(held.at) < MAX_HOLD_MS
117
+ }
118
+
119
+ // The reason of the hold still open at the ledger's end, or `undefined` where the last one has ended —
120
+ // or is past `MAX_HOLD_MS`, a driver killed while held that wrote no hand-back.
121
+ function open_reason(entries: ReadonlyArray<LedgerEntry>, now_ms: number): string | undefined {
122
+ const last = entries.findLast((entry) => is_hold_end(entry))
123
+
124
+ return last !== undefined && is_held(last) && is_open_at(last, now_ms) ? last.reason : undefined
125
+ }
126
+
127
+ const lane_held_stats = { open_reason, table }
128
+
129
+ export { lane_held_stats }
@@ -1,7 +1,7 @@
1
1
  import { existsSync } from 'node:fs'
2
- import path from 'node:path'
3
2
  import { core_budget } from '#scripts/gate/core-budget'
4
3
  import { buffered_process } from '#scripts/lib/buffered-process'
4
+ import { PACKAGE_JSON, package_manifest } from '#scripts/lib/package-manifest'
5
5
  import { INSTALL_TIMEOUT_MS } from '#scripts/lib/timeouts'
6
6
 
7
7
  // Filling the lane, which is the other half of opening one.
@@ -26,16 +26,9 @@ import { INSTALL_TIMEOUT_MS } from '#scripts/lib/timeouts'
26
26
  // exactly the lock committed there. A lock the install would rather rewrite is a finding, not
27
27
  // something to absorb silently into six parallel lanes.
28
28
  const INSTALL_ARGUMENTS = ['install', '--frozen-lockfile']
29
- // The manifest whose absence is the whole skip condition. A lane cut from a repository that has no
30
- // `package.json` has nothing to install, so running `pnpm install` there could only fail on a
31
- // manifest that was never there — which is exactly the fixture a cross-process lane test needs.
32
- // The condition is strictly "the file does not exist": a manifest that is
33
- // present but unreadable or broken still runs the install and still fails as before, so a genuinely
34
- // broken repository is never passed silently.
35
- const MANIFEST_FILE_NAME = 'package.json'
36
29
  // The lane opens with no dependencies installed, and that is the reported state rather than a
37
30
  // failure — there was nothing to install, so nothing failed.
38
- const NO_MANIFEST_OUTPUT = `No ${MANIFEST_FILE_NAME} in the lane, so the dependency install was skipped.`
31
+ const NO_MANIFEST_OUTPUT = `No ${PACKAGE_JSON} in the lane, so the dependency install was skipped.`
39
32
 
40
33
  interface InstallResult {
41
34
  is_installed: boolean
@@ -51,7 +44,7 @@ interface InstallResult {
51
44
  // `existsSync` answers only whether the path is there, never whether its contents parse, so a
52
45
  // present-but-broken manifest falls through to the real install and fails there.
53
46
  function has_manifest(directory: string): boolean {
54
- return existsSync(path.join(directory, MANIFEST_FILE_NAME))
47
+ return existsSync(package_manifest.manifest_path(directory))
55
48
  }
56
49
 
57
50
  /**
@@ -87,4 +80,4 @@ async function install_dependencies(directory: string): Promise<InstallResult> {
87
80
  const lane_install = { install_dependencies }
88
81
 
89
82
  export type { InstallResult }
90
- export { lane_install, INSTALL_ARGUMENTS, MANIFEST_FILE_NAME, NO_MANIFEST_OUTPUT }
83
+ export { lane_install, INSTALL_ARGUMENTS, NO_MANIFEST_OUTPUT }
@@ -1,5 +1,3 @@
1
- #!/usr/bin/env tsx
2
- import { fileURLToPath } from 'node:url'
3
1
  import { issue_number_shape } from '#scripts/issue/issue-number-shape'
4
2
  import { josh_command } from '#scripts/josh/josh-run'
5
3
  import { lane_registry, type LaneInfo } from '#scripts/lane/lane-registry'
@@ -21,7 +19,6 @@ import { execa } from 'execa'
21
19
  // warning. Their explanations stream through to stderr; the child's pid is the one thing on stdout.
22
20
  // A lane a park kept is the one `already-open` it steps past — `lane_directory` below.
23
21
 
24
- const ARGV_OFFSET = 2
25
22
  const SUCCESS_EXIT_CODE = 0
26
23
  const FAILURE_EXIT_CODE = 1
27
24
  const should_forward_stderr = true
@@ -171,13 +168,7 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
171
168
  return await launch(context)
172
169
  }
173
170
 
174
- async function main(argv: ReadonlyArray<string>): Promise<void> {
175
- process.exitCode = await run(argv)
176
- }
177
-
178
171
  const lane_launch_cli = { launch_lane, read_context, run }
179
172
 
180
- if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
181
-
182
173
  export type { LaunchContext, LaunchOutcome }
183
174
  export { lane_launch_cli }
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath } from 'node:url'
3
+ import { lane_launch_cli } from './lane-launch-cli'
4
+
5
+ // The `josh lane:launch` entry, kept apart from `lane-launch-cli.ts` because other modules import that
6
+ // one: a bundle is one file, so a main guard there would fire for every command that carries it
7
+ // (joshuafolkken/kit#4186).
8
+ if (process.argv[1] === fileURLToPath(import.meta.url)) {
9
+ const ARGV_OFFSET = 2
10
+
11
+ process.exitCode = await lane_launch_cli.run(process.argv.slice(ARGV_OFFSET))
12
+ }