@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
@@ -0,0 +1,51 @@
1
+ // The state guard runs on the pure project alone. isolate:false is what lets one file see the git
2
+ // branch, working tree or GIT_* variables a sibling left changed, so that is the only run where a leak
3
+ // is a correctness problem rather than a latent one — and the isolated project keeps exactly the guards
4
+ // the single-project suite had. The network guard is armed once at the root instead, since it arms
5
+ // `PATH` before any worker of either project forks.
6
+ const STATE_GUARD: ReadonlyArray<string> = ['./tools/test/test-state-guard.ts']
7
+
8
+ // Runs in every worker of both projects, before each test, and silences the real streams for the test
9
+ // body so a fixture's direct `process.stdout` write cannot leak into `pnpm josh test:unit`'s output.
10
+ // `setupFiles` rather than `globalSetup` because it must run inside the
11
+ // worker where the test's writes happen, not once in the main process.
12
+ const STDOUT_GUARD: ReadonlyArray<string> = ['./tools/test/test-stdout-guard.ts']
13
+
14
+ // Runs in every worker for the same reason: it wraps that worker's own `fetch`, refusing a real
15
+ // Telegram send and recording which test tried.
16
+ const TELEGRAM_GUARD: ReadonlyArray<string> = ['./tools/test/test-telegram-guard.ts']
17
+
18
+ // Runs in every worker too: it replaces that worker's machine reading, so a suite that drives the gate
19
+ // admits the same way on every platform and every load.
20
+ const MACHINE_GUARD: ReadonlyArray<string> = ['./tools/test/test-machine-guard.ts']
21
+
22
+ // The guards every run of the suite arms, whichever config starts it: the network guard once in the
23
+ // main process, the stdout, Telegram and machine guards in every worker. Named here so `vitest.config.ts` and
24
+ // `vitest.harness.config.ts` read one definition — the harness once ran with none of them.
25
+ const NETWORK_GUARD: ReadonlyArray<string> = ['./tools/test/test-network-guard.ts']
26
+ const WORKER_GUARDS: ReadonlyArray<string> = [...STDOUT_GUARD, ...TELEGRAM_GUARD, ...MACHINE_GUARD]
27
+
28
+ // Runs in every worker of the unit suite, idle unless a whole-suite `josh test:unit` asked it to
29
+ // record which repository paths each test reads (`test-read-recorder.ts`). Not a guard, and not
30
+ // the harness config's: only this suite's runs feed the test-read map.
31
+ const READ_RECORDER: ReadonlyArray<string> = ['./tools/test/test-read-recorder.ts']
32
+
33
+ // The unit suite's own reporter, which vitest loads by this path in its own process. Named rather
34
+ // than imported so neither it nor the ledger it writes joins the config's import graph
35
+ // (joshuafolkken/kit#4465).
36
+ const UNIT_FILE_REPORTER = './vitest.reporter.config.ts'
37
+
38
+ // Kept apart from `unit-projects.ts` so the shipped `josh test:related` can name every setup file
39
+ // without loading the kit-internal project partition.
40
+ const unit_setup_files = {
41
+ MACHINE_GUARD,
42
+ NETWORK_GUARD,
43
+ READ_RECORDER,
44
+ STATE_GUARD,
45
+ STDOUT_GUARD,
46
+ UNIT_FILE_REPORTER,
47
+ TELEGRAM_GUARD,
48
+ WORKER_GUARDS,
49
+ }
50
+
51
+ export { unit_setup_files }
@@ -1,11 +1,6 @@
1
- import { readdirSync } from 'node:fs'
2
1
  import { availableParallelism } from 'node:os'
3
- import path from 'node:path'
4
- import { PLATFORM_TEMP_ROOT } from '#scripts/josh/platform-temporary'
5
- import { process_identity } from '#scripts/josh/process-identity'
6
- import { process_owner_schema, type ProcessOwner } from '#scripts/josh/process-owner'
7
2
  import { stamp_file } from '#scripts/josh/stamp-file'
8
- import { json_value } from '#scripts/lib/json-value'
3
+ import { unit_run_marker } from './unit-run-marker'
9
4
 
10
5
  // How wide one vitest run may fan out when it is not the only one on the machine.
11
6
  //
@@ -26,131 +21,80 @@ import { json_value } from '#scripts/lib/json-value'
26
21
  // **The division activates only under concurrency.** One run in flight — every solo run, CI included
27
22
  // — gets exactly the number the gate and the hook produced before this module existed, so a quiet
28
23
  // machine behaves bit for bit as it did and only the condition that was measured broken changes.
24
+ //
25
+ // **The run markers and their division of the machine are `unit-run-marker.ts`**, the part the vitest
26
+ // config imports (joshuafolkken/kit#4572); the capacity and claim bounds and the flag handling are here.
27
+ const { MIN_WORKERS, NESTED_KEY, NESTED_VALUE, SOLO_RUNS } = unit_run_marker
28
+ const { is_nested_run, live_run_count, mark_run_started, marker_path, resolve_unit_workers } =
29
+ unit_run_marker
29
30
 
30
- // A record that means something only while it exists, in the shape `stamp-file.ts` already keeps for
31
- // the in-flight gate marker. Keyed by pid rather than by checkout: `josh gate`'s unit step and a
32
- // `josh test:related` can be in flight in one checkout at once, and both of them are load.
33
- const RUN_PREFIX = 'josh-unit-running-'
34
31
  // Vitest's own flag, in both spellings its CLI accepts — it normalizes `--max-workers` to the same
35
32
  // option, so a run that recognized only one of them would replace a number the caller typed with the
36
33
  // share and contradict the promise below. The camel-case one is what gets written.
37
34
  const WORKER_FLAG = '--maxWorkers'
38
35
  const WORKER_FLAGS: ReadonlyArray<string> = [WORKER_FLAG, '--max-workers']
39
- // Never below one: a share of zero would run no test at all and report the suite green.
40
- const MIN_WORKERS = 1
41
- // One run in flight is this run alone, which is the case that changes nothing.
42
- const SOLO_RUNS = 1
43
-
44
- // A marker is the writing process's identity and nothing else; a pid-only marker has an answer of its
45
- // own below (`is_running`) rather than being rejected here.
46
- type RunMarker = ProcessOwner
47
-
48
- function marker_path(pid: number = process.pid): string {
49
- return stamp_file.stamp_path(RUN_PREFIX, String(pid))
50
- }
51
-
52
- // **A marker is evidence, and the process behind it is the test.** A run killed outright leaves its
53
- // file behind, and a count that trusted the file alone would hold every later run down to one worker
54
- // for good — the failure mode `run-hold.ts` answers with an expiry, which cannot be sized here because
55
- // a unit suite under six-way load already takes minutes. The process that writes this marker is the
56
- // long-lived one, so unlike a `run:hold` record its identity is a liveness test rather than a note for
57
- // the reader.
58
- //
59
- // **The pid alone was not that identity**. The section below already named
60
- // what goes wrong — a reissued pid turns a leaked marker into a permanent phantom — and answered it by
61
- // sweeping, which only ever collected the markers whose pid had *not* yet been reissued. Since the
62
- // record now carries the writing process's start time beside its pid, a reissued pid is recognized as
63
- // a different process and swept like any other dead one. A pid that is not positive is caught by the
64
- // same check, inside `process_identity`: `process.kill(0, …)` addresses the caller's own process group
65
- // rather than a process, so a truncated or hand-edited marker would otherwise answer "alive" forever.
66
- //
67
- // **"Cannot tell" counts as live here, which is the opposite of what the in-flight gate marker's
68
- // readers do with it, and deliberately so.** A marker with no recorded start time — written before the
69
- // field existed, or on a platform where it cannot be read — resolves toward *more* sharing: being
70
- // wrong that way costs this run a narrower share of the machine, while being wrong the other way puts
71
- // six unit suites on eleven cores, an oversubscription measured at a load
72
- // average of 209.
73
- function is_running(marker: RunMarker): boolean {
74
- return process_identity.is_same_process(marker.pid, marker.process_start) !== false
75
- }
76
-
77
- function read_marker(source: string): RunMarker | undefined {
78
- const raw = stamp_file.read_stamp_text(source)
79
-
80
- if (raw === undefined) return undefined
81
-
82
- const parsed = process_owner_schema.safeParse(json_value.parse_or_undefined(raw))
83
-
84
- return parsed.success ? parsed.data : undefined
85
- }
36
+ // The core vitest's own process — the pool, the reporter and Vite's transforms — keeps busy beside its
37
+ // workers (joshuafolkken/kit#4362). A direct run's claim holds it above its worker count.
38
+ const MAIN_PROCESS_CORES = 1
39
+
40
+ // **The run count divides the machine; the free cores bound what that division hands out.** The
41
+ // share counts only unit runs, so load from outside the core budget's ledger — Claude sessions, other
42
+ // tools — went unseen: 22 of 38 ledger samples at a load average of 20 or more had vitest as their
43
+ // heaviest process, one at 381% over 30 processes. `free_cores` is `free-cores.ts`'s reading, the
44
+ // cores less that outside load. `undefined` — a CI runner, a CPU quota — and a reading at or above
45
+ // the ceiling both leave `workers` as it was, so an unread or quiet machine changes nothing.
46
+ function cap_to_free(
47
+ workers: number | undefined,
48
+ free_cores: number | undefined,
49
+ available_cores: number,
50
+ ): number | undefined {
51
+ if (free_cores === undefined || free_cores >= (workers ?? available_cores)) return workers
86
52
 
87
- // An unreadable temp directory answers "no other run", which is the direction that leaves behavior
88
- // as it was rather than throttling a run on a guess. Unlike the network guard, being wrong here costs
89
- // wall time and never a false result.
90
- function marker_files(directory: string = PLATFORM_TEMP_ROOT): Array<string> {
91
- try {
92
- return readdirSync(directory).filter((name) => name.startsWith(RUN_PREFIX))
93
- } catch {
94
- return []
95
- }
53
+ return Math.max(MIN_WORKERS, Math.floor(free_cores))
96
54
  }
97
55
 
98
- // **A marker whose process is gone is removed, not merely skipped.** Skipping it is correct only until
99
- // the operating system reissues that pid to something else, which on a machine left running for days
100
- // it will — and from then on the phantom is counted as a live run for good, with every solo run held
101
- // at one worker and `josh gate` announcing lanes that do not exist. `finally` in `with_run_marker`
102
- // cannot prevent the leak, because the interrupt that produces it (Ctrl-C reaching the whole foreground
103
- // group) does not unwind. Sweeping on read is what bounds it: the first later run collects it.
104
- function sweep_marker(source: string): void {
105
- try {
106
- stamp_file.remove_stamp(source)
107
- } catch {
108
- /* not ours to remove; counting it out is the whole requirement */
109
- }
56
+ // What the machine has free for this run's workers, both from `free-cores.ts`'s one reading: the free
57
+ // cores, and the workers the free memory holds. Either is `undefined` where it could not be read.
58
+ interface FreeCapacity {
59
+ cores: number | undefined
60
+ memory_workers: number | undefined
110
61
  }
111
62
 
112
- // **Only a marker that parsed to a dead pid is swept, and the unlink still cannot throw.** A marker
113
- // this account may not read — another user's file on a sticky `/tmp` — is `undefined` here, and
114
- // deleting on that answer would raise `EPERM` from a path with no `catch` between it and
115
- // `announce_gate_plan`: an unreadable file belonging to somebody else would abort the gate outright,
116
- // which is worse than the leak this sweep exists for. Unreadable therefore counts as not-live and is
117
- // left alone, exactly as it was before the sweep existed.
118
- function is_marker_live(source: string): boolean {
119
- const marker = read_marker(source)
63
+ const UNREAD_CAPACITY: FreeCapacity = { cores: undefined, memory_workers: undefined }
120
64
 
121
- if (marker === undefined) return false
122
- if (is_running(marker)) return true
123
-
124
- sweep_marker(source)
65
+ // **The free memory bounds the share as the free cores do** (joshuafolkken/kit#4528). Lanes running
66
+ // their suites at once each sized workers from the cores alone, so their workers' memory piled up
67
+ // until the batch stopped opening lanes. Both bounds go through `cap_to_free`, so an unread one leaves
68
+ // the share as it was.
69
+ function cap_to_capacity(
70
+ workers: number | undefined,
71
+ free: FreeCapacity,
72
+ available_cores: number,
73
+ ): number | undefined {
74
+ const core_capped = cap_to_free(workers, free.cores, available_cores)
125
75
 
126
- return false
76
+ return cap_to_free(core_capped, free.memory_workers, available_cores)
127
77
  }
128
78
 
129
- // Every marker in the temp directory whose process is still alive. This run's own is deliberately not
130
- // among them: both callers count *before* writing theirs, so the `+ 1` at the call site adds it.
131
- function live_run_count(directory: string = PLATFORM_TEMP_ROOT): number {
132
- return marker_files(directory).filter((name) => is_marker_live(path.join(directory, name))).length
79
+ // The core-budget claim a unit run holds: the weight it reserved, and the narrower one it was admitted
80
+ // at past the wait cap.
81
+ interface UnitClaim {
82
+ weight: number
83
+ granted?: number | undefined
133
84
  }
134
85
 
135
- // **The gate claims its place before its unit step exists, and the child must not claim a second
136
- // one.** `josh gate` counts the runs in flight and then spawns `josh test:unit`, so without this the
137
- // marker appears a second or so after the count that needed it — and two lanes launched together, the
138
- // shape `epicrun` produces, both read "nothing else is running" and both take the whole machine. The
139
- // gate therefore marks itself around the whole run and passes this down through the environment; the
140
- // guard inside the child sees it and marks nothing, because the two processes are one run.
141
- const NESTED_KEY = 'JOSH_UNIT_RUN_MARKED'
142
- const NESTED_VALUE = '1'
143
-
144
- function is_nested_run(): boolean {
145
- return process.env[NESTED_KEY] === NESTED_VALUE
146
- }
86
+ // **The share never exceeds the claim the run was admitted on** (joshuafolkken/kit#4235). The share is
87
+ // read after admission, when fewer runs may be in flight than when the weight was sized, and a share
88
+ // wider than the claim puts workers on the machine the ledger does not hold. The claim bounds a solo
89
+ // share too: vitest's own choice is one worker per core but one, wider than any weight the ledger
90
+ // reserves for a unit run, so leaving it in place would open workers no claim holds. The claim holds
91
+ // vitest's own process as well, so its workers are the claim less that core.
92
+ function cap_to_claim(share: number | undefined, claim: UnitClaim | undefined): number | undefined {
93
+ if (claim === undefined) return share
147
94
 
148
- // **`undefined` at one run means "leave the choice where it was".** The gate then applies its own
149
- // core reservation and the hook passes no flag at all, which is what both did before this existed.
150
- function resolve_unit_workers(available_cores: number, runs: number): number | undefined {
151
- if (runs <= SOLO_RUNS) return undefined
95
+ const bound = Math.max(MIN_WORKERS, (claim.granted ?? claim.weight) - MAIN_PROCESS_CORES)
152
96
 
153
- return Math.max(MIN_WORKERS, Math.floor(available_cores / runs))
97
+ return Math.min(share ?? bound, bound)
154
98
  }
155
99
 
156
100
  // The share this run may take, read from the machine. Separate from `resolve_unit_workers` so that
@@ -163,10 +107,12 @@ function resolve_unit_workers(available_cores: number, runs: number): number | u
163
107
  function current_share(
164
108
  available_cores: number = availableParallelism(),
165
109
  live_runs: number = live_run_count(),
110
+ free: FreeCapacity = UNREAD_CAPACITY,
166
111
  ): number | undefined {
167
112
  const own_run = is_nested_run() ? 0 : SOLO_RUNS
113
+ const share = resolve_unit_workers(available_cores, live_runs + own_run)
168
114
 
169
- return resolve_unit_workers(available_cores, live_runs + own_run)
115
+ return cap_to_capacity(share, free, available_cores)
170
116
  }
171
117
 
172
118
  function is_worker_flag(argument: string): boolean {
@@ -182,28 +128,19 @@ function is_worker_flag(argument: string): boolean {
182
128
  // would make this function's own answer depend on what happened to be running while it was asked, and
183
129
  // `f(args, undefined)` takes the default rather than the value — so the case that matters most, "this
184
130
  // run is alone", would be the one case no test could express.
131
+ function has_worker_flag(vitest_arguments: ReadonlyArray<string>): boolean {
132
+ return vitest_arguments.some((argument) => is_worker_flag(argument))
133
+ }
134
+
185
135
  function worker_arguments(
186
136
  vitest_arguments: ReadonlyArray<string>,
187
137
  share: number | undefined,
188
138
  ): Array<string> {
189
- if (share === undefined || vitest_arguments.some((argument) => is_worker_flag(argument))) {
190
- return []
191
- }
139
+ if (share === undefined || has_worker_flag(vitest_arguments)) return []
192
140
 
193
141
  return [`${WORKER_FLAG}=${String(share)}`]
194
142
  }
195
143
 
196
- // **The write failing is not a reason to fail the run.** A marker that could not be written costs the
197
- // next run a wider share than it should have — the behavior that was there before — while a thrown
198
- // error here would fail a unit suite over bookkeeping.
199
- function mark_run_started(target: string): void {
200
- try {
201
- stamp_file.write_stamp(target, process_identity.own_fields())
202
- } catch {
203
- /* a missing marker costs a wide share, never a wrong result */
204
- }
205
- }
206
-
207
144
  // `finally`, so a suite that threw still clears its marker — and so does the nested branch, which
208
145
  // restores nothing because it wrote nothing.
209
146
  async function with_run_marker<T>(run: () => Promise<T>): Promise<T> {
@@ -225,19 +162,16 @@ async function with_run_marker<T>(run: () => Promise<T>): Promise<T> {
225
162
  }
226
163
 
227
164
  const unit_worker_share = {
228
- MIN_WORKERS,
229
- NESTED_KEY,
230
- NESTED_VALUE,
231
- RUN_PREFIX,
232
- SOLO_RUNS,
165
+ ...unit_run_marker,
166
+ MAIN_PROCESS_CORES,
167
+ cap_to_capacity,
168
+ cap_to_claim,
169
+ cap_to_free,
233
170
  current_share,
234
- is_nested_run,
235
- live_run_count,
236
- marker_path,
237
- read_marker,
238
- resolve_unit_workers,
171
+ has_worker_flag,
239
172
  with_run_marker,
240
173
  worker_arguments,
241
174
  }
242
175
 
176
+ export type { FreeCapacity, UnitClaim }
243
177
  export { unit_worker_share }
@@ -0,0 +1,63 @@
1
+ import path from 'node:path'
2
+ import { unit_setup_files } from './unit-setup-files'
3
+
4
+ // The files every test depends on without importing or reading them: the package and its lock,
5
+ // the vitest configuration, and the setup files every worker runs before every test.
6
+ const SETUP_FILES: ReadonlyArray<string> = [
7
+ ...unit_setup_files.NETWORK_GUARD,
8
+ ...unit_setup_files.STATE_GUARD,
9
+ ...unit_setup_files.WORKER_GUARDS,
10
+ ...unit_setup_files.READ_RECORDER,
11
+ ]
12
+
13
+ const ROOT_FILES: ReadonlyArray<string> = [
14
+ 'package.json',
15
+ 'pnpm-lock.yaml',
16
+ 'pnpm-workspace.yaml',
17
+ 'tsconfig.json',
18
+ 'vitest.config.ts',
19
+ 'vitest.harness.config.ts',
20
+ // What the read recorder runs in every worker, which no test imports through the setup file.
21
+ 'tools/test/test-read-capture.ts',
22
+ 'scripts/test/test-read-trace.ts',
23
+ ]
24
+
25
+ // **What the vitest config and the worker setup files import** (joshuafolkken/kit#4465). Vitest runs
26
+ // every test when a file it is given is a config dependency — every module the config imports,
27
+ // statically or not — and the setup files are in every test's graph, so `vitest related` widens to the
28
+ // whole suite on any of these with no word of why. Named here, they print the reason instead.
29
+ // `whole-suite-files.test.ts` holds the list to both graphs, so an import added to either fails there.
30
+ const IMPORTED_BY_EVERY_TEST: ReadonlyArray<string> = [
31
+ 'scripts/git/constants.ts',
32
+ 'scripts/git/git-location-environment.ts',
33
+ 'scripts/init/init-paths.ts',
34
+ 'scripts/josh/agent-session-environment.ts',
35
+ 'scripts/josh/platform-temporary.ts',
36
+ 'scripts/josh/process-identity.ts',
37
+ 'scripts/josh/process-owner.ts',
38
+ 'scripts/josh/stamp-file.ts',
39
+ 'scripts/lib/atomic-write.ts',
40
+ 'scripts/lib/json-value.ts',
41
+ 'scripts/lib/read-file.ts',
42
+ 'scripts/lib/timeouts.ts',
43
+ 'scripts/test/unit-run-marker.ts',
44
+ 'scripts/test/unit-setup-files.ts',
45
+ 'tools/test/duration-sequencer.ts',
46
+ 'tools/test/duration-shard.ts',
47
+ 'tools/test/pure-files.ts',
48
+ 'tools/test/test-module-elapsed.ts',
49
+ 'tools/test/test-repository-guard.ts',
50
+ 'tools/test/unit-duration-record.ts',
51
+ 'tools/test/unit-guard-environment.ts',
52
+ 'tools/test/unit-projects.ts',
53
+ 'tools/test/vitest-config-workers.ts',
54
+ 'tools/test/vitest-include-globs.ts',
55
+ ]
56
+
57
+ const WHOLE_SUITE_FILES: ReadonlySet<string> = new Set(
58
+ [...ROOT_FILES, ...IMPORTED_BY_EVERY_TEST, ...SETUP_FILES].map((file) => path.normalize(file)),
59
+ )
60
+
61
+ const whole_suite_files = { WHOLE_SUITE_FILES }
62
+
63
+ export { whole_suite_files }
@@ -51,8 +51,15 @@ const NO_FINISH = 0
51
51
  // let the #3273 lane child end its turn on a running task the stop hook never saw.
52
52
  const LAUNCH_PATTERN =
53
53
  /(?:running in background with ID:|moved to the background \(ID:)\s*([\w-]+)/iu
54
- // A backgrounded subagent's launch result, which names its id on an `agentId:` line of its own.
55
- const AGENT_LAUNCH_PATTERN = /^Async agent launched[\s\S]*?\bagentId:\s*([\w-]+)/u
54
+ // A backgrounded subagent's launch result, which names its id on an `agentId:` line of its own — or
55
+ // the JSON result of a `SendMessage` that resumed one, which names it as `resumedAgentId`. A resumed
56
+ // subagent runs in the background under the same id and ends with the same notice; missing that
57
+ // spelling let the #4344 lane child's stop hook release its hold and `in-progress` while the resumed
58
+ // investigator was still running (joshuafolkken/kit#4347). It is anchored on the result's own first
59
+ // key: a command that printed a transcript line, which nests the same key under `toolUseResult`,
60
+ // would otherwise open a resume that never finishes.
61
+ const AGENT_LAUNCH_PATTERN =
62
+ /^(?:Async agent launched[\s\S]*?\bagentId:\s*|\{"success":[^\n]*?"resumedAgentId":")([\w-]+)/u
56
63
  // The notice the harness writes when a task it took into the background ends.
57
64
  // It is anchored at the start because the whole content of that line *is*
58
65
  // the notice — a body merely quoting one is text, the same hazard `read_id` unquotes for — and it
@@ -65,6 +72,11 @@ const AGENT_LAUNCH_PATTERN = /^Async agent launched[\s\S]*?\bagentId:\s*([\w-]+)
65
72
  // an enumeration of the harness's spellings, and a spelling it added later would silently start
66
73
  // reporting finished commands as never finished.
67
74
  const FINISH_PATTERN = /^<task-notification>[\s\S]*?<task-id>([\w-]+)<\/task-id>/u
75
+ // The other end of a backgrounded task: the result of a `TaskStop` call. The harness writes no
76
+ // task-notification for a task it was told to stop, so reading the notice alone left a stopped task
77
+ // open for ever, and the lane stop guard blocked every stop after it (joshuafolkken/kit#4472). It is
78
+ // anchored on the result's own first key for the reason `AGENT_LAUNCH_PATTERN` is.
79
+ const STOP_PATTERN = /^\{"message":"Successfully stopped task:\s*([\w-]+)/u
68
80
  // The output file every reader of a backgrounded command names, whichever command it uses to read
69
81
  // it — `tail`, `cat`, `sed`, `grep`, or the `Monitor` tool, all of which carry the path.
70
82
  const OUTPUT_PATTERN = /tasks\/([\w-]+)\.output/u
@@ -113,6 +125,11 @@ function finished_id(text: string): string {
113
125
  return FINISH_PATTERN.exec(text)?.[1] ?? NO_BACKGROUND
114
126
  }
115
127
 
128
+ // The background run a `TaskStop` result reports stopping, or nothing for every other tool result.
129
+ function stopped_id(text: string): string {
130
+ return STOP_PATTERN.exec(text)?.[1] ?? NO_BACKGROUND
131
+ }
132
+
116
133
  // One line, as much of it as this reading needs. Taken structurally rather than as a `TranscriptLine`
117
134
  // so the import stays one-way: `time-transcript-line.ts` already imports this module to read the two
118
135
  // ids off a body, and asking for its type back would close the cycle.
@@ -300,6 +317,7 @@ const time_background = {
300
317
  launch_id,
301
318
  agent_launch_id,
302
319
  finished_id,
320
+ stopped_id,
303
321
  finished_at,
304
322
  read_id,
305
323
  read_id_of,
@@ -1,3 +1,4 @@
1
+ import { figure_format } from '#scripts/lib/figure-format'
1
2
  import { time_agent_bundles } from './time-agent-bundles'
2
3
  import { time_format } from './time-format'
3
4
  import { time_round_trips } from './time-round-trips'
@@ -111,7 +112,7 @@ const NO_BUNDLES: BundleTotals = {
111
112
  // `scripts/time-x` inside `scripts/time-xyz`.
112
113
  //
113
114
  // **The tail position is what makes an absolute path comparable with a relative one.** A `Read` call
114
- // names `/Users/…/kit/scripts/time/x.ts` while the `grep` before it named `scripts/time`, and nothing
115
+ // names `/Users/…/kit/tools/time/x.ts` while the `grep` before it named `tools/time`, and nothing
115
116
  // here knows the working directory the second was relative to — so the search-then-read pair, which is
116
117
  // the whole reason the target test exists, would escape it on the two shapes it occurs in most.
117
118
  function contains_segments(whole: string, part: string): boolean {
@@ -124,7 +125,7 @@ function contains_segments(whole: string, part: string): boolean {
124
125
  }
125
126
 
126
127
  // Equal, or one inside the other. The containing form is what catches the search-then-read pair:
127
- // `grep -rn foo scripts` names `scripts`, and the `cat scripts/time/x.ts` that follows it names a path
128
+ // `grep -rn foo scripts` names `scripts`, and the `cat tools/time/x.ts` that follows it names a path
128
129
  // beneath — which is exactly how the second call learned the first one's answer.
129
130
  function is_related(left: string, right: string): boolean {
130
131
  if (left === right) return true
@@ -422,7 +423,7 @@ interface TripPrice {
422
423
  }
423
424
 
424
425
  function recoverable_suffix(totals: BundleTotals, round_trip_count: number): string {
425
- const share = time_format.format_share(totals.recoverable_round_trips, round_trip_count)
426
+ const share = figure_format.format_share(totals.recoverable_round_trips, round_trip_count)
426
427
 
427
428
  return `${share} of ${String(round_trip_count)} round trip(s)`
428
429
  }
@@ -66,22 +66,22 @@ const notice_schema = z.object({ notified_at_ms: z.number() })
66
66
  const call_schema = z.object({ tool_name: z.string().min(1), tool_input: z.unknown() })
67
67
 
68
68
  function parse_transcript_path(raw_payload: string): string | undefined {
69
- const parsed = payload_schema.safeParse(JSON.parse(raw_payload))
69
+ const payload = json_value.parse_with(raw_payload, payload_schema)
70
70
 
71
- if (!parsed.success || parsed.data.transcript_path === undefined) return undefined
71
+ if (payload?.transcript_path === undefined) return undefined
72
72
 
73
- return time_hook_transcript.transcript_of(parsed.data.transcript_path, parsed.data.agent_id)
73
+ return time_hook_transcript.transcript_of(payload.transcript_path, payload.agent_id)
74
74
  }
75
75
 
76
76
  // The call that has just run, as the payload names it — what the line checks
77
77
  // against the turns behind it, so a call that needed their result is never offered as one that could
78
78
  // have shared their turn. A payload without a tool name answers `undefined`, judged on those turns alone.
79
79
  function parse_call(raw_payload: string): GuardedCall | undefined {
80
- const parsed = call_schema.safeParse(JSON.parse(raw_payload))
80
+ const call = json_value.parse_with(raw_payload, call_schema)
81
81
 
82
- if (!parsed.success) return undefined
82
+ if (call === undefined) return undefined
83
83
 
84
- return { name: parsed.data.tool_name, input: parsed.data.tool_input }
84
+ return { name: call.tool_name, input: call.tool_input }
85
85
  }
86
86
 
87
87
  // The last `max_bytes` of a file, as text. The leading line is usually cut mid-way, which every
@@ -173,6 +173,8 @@ function density_notice(raw_payload: string, now_ms: number = Date.now()): strin
173
173
  const time_density_hook = {
174
174
  density_notice,
175
175
  notice_path,
176
+ parse_call,
177
+ parse_transcript_path,
176
178
  read_tail,
177
179
  }
178
180
 
@@ -1,4 +1,5 @@
1
1
  import { git_followup_stages, type FollowupStage } from '#scripts/followup/git-followup-stages'
2
+ import { MS_PER_SECOND } from '#scripts/lib/timeouts'
2
3
 
3
4
  // Reading `followup`'s own stage rows back out of what it printed.
4
5
  //
@@ -35,9 +36,6 @@ const LINE_SEPARATOR = '\n'
35
36
  // so the tail is the one part of the row whose shape the alignment cannot move.
36
37
  const SECONDS_SUFFIX = ' s'
37
38
  const DIGIT_OR_POINT = /[\d.]/u
38
- // Written here rather than imported: `time-format.ts` keeps its own copy private, and reaching for
39
- // `run-progress.ts` would pull a command module into the parse for one number.
40
- const MS_PER_SECOND = 1000
41
39
  const NO_STAGES: ReadonlyArray<FollowupStage> = []
42
40
 
43
41
  // Leading whitespace is trimmed for the same reason `time-reported-failure.ts` trims it: the printer
@@ -1,3 +1,6 @@
1
+ import { figure_format } from '#scripts/lib/figure-format'
2
+ import { MS_PER_SECOND } from '#scripts/lib/timeouts'
3
+
1
4
  // The column and number formatting every timing report is laid out through.
2
5
  //
3
6
  // It was `time-report.ts`'s until three renderers shared it: the run scope's own tables, the epic
@@ -12,13 +15,9 @@
12
15
  // imports either of them. **The words two blocks must spell identically are the exception**, and they
13
16
  // are here for the reason `NO_CALLS` is: a label printed by two renderers, one of which cannot import
14
17
  // the other, has to be written once or the two reports come to disagree about what a row is called.
18
+ // The figures themselves are `figure_format`'s, shared with the cost reports.
15
19
 
16
- const MS_PER_MINUTE = 60_000
17
- const MS_PER_SECOND = 1000
18
- const MINUTE_DECIMALS = 1
19
20
  const SECOND_DECIMALS = 1
20
- const PERCENT_SCALE = 100
21
- const PERCENT_DECIMALS = 1
22
21
  const LABEL_WIDTH = 24
23
22
  // Wide enough for a three-digit run (`335.4 min`), so a long session's rows stay in column with a
24
23
  // short one's rather than pushing the share out by a character.
@@ -53,32 +52,12 @@ function overflow_line(row_count: number): Array<string> {
53
52
  ]
54
53
  }
55
54
 
56
- function format_minutes(duration_ms: number): string {
57
- return `${(duration_ms / MS_PER_MINUTE).toFixed(MINUTE_DECIMALS)} min`
58
- }
59
-
60
55
  // Seconds rather than minutes for a per-turn figure: one turn is tens of seconds, and `0.1 min` is
61
56
  // too coarse to show the rise across a batch that this scale exists to make visible.
62
57
  function format_seconds(duration_ms: number): string {
63
58
  return `${(duration_ms / MS_PER_SECOND).toFixed(SECOND_DECIMALS)} s`
64
59
  }
65
60
 
66
- function format_share(part: number, whole: number): string {
67
- if (whole === 0) return 'n/a'
68
-
69
- return `${((part / whole) * PERCENT_SCALE).toFixed(PERCENT_DECIMALS)}%`
70
- }
71
-
72
- // A dollar figure, to the caller's own precision. Two cost blocks print money now — the phase costs
73
- // and the per-subagent context-construction costs — and each rounds to a different place (a run total
74
- // to the cent, a per-round-trip figure finer), so the decimals are the caller's and only the `$` and
75
- // the `toFixed` are shared. It sits here beside the other number formatters rather than in one block,
76
- // for the reason `format_minutes` does: a second copy beside the second renderer is how two cost rows
77
- // of one report come to punctuate a dollar amount two ways.
78
- function usd(amount: number, decimals: number): string {
79
- return `$${amount.toFixed(decimals)}`
80
- }
81
-
82
61
  // The one place the three columns are laid out, so a row carrying words instead of a duration lines
83
62
  // up with the rows that carry one rather than overrunning the numeric column.
84
63
  function format_columns(label: string, minutes: string, suffix: string): string {
@@ -86,7 +65,7 @@ function format_columns(label: string, minutes: string, suffix: string): string
86
65
  }
87
66
 
88
67
  function format_row(label: string, duration_ms: number, suffix: string): string {
89
- return format_columns(label, format_minutes(duration_ms), suffix)
68
+ return format_columns(label, figure_format.format_minutes(duration_ms), suffix)
90
69
  }
91
70
 
92
71
  // **A share nobody read says so rather than totalling zero.** The duration column is left empty
@@ -101,8 +80,6 @@ const time_format = {
101
80
  NO_CALLS,
102
81
  overflow_line,
103
82
  format_seconds,
104
- format_share,
105
- usd,
106
83
  format_columns,
107
84
  format_row,
108
85
  // `format_clock` stays private: `format_window` is its only caller, and a namespace that offers
@@ -89,6 +89,11 @@ const BODY_FIELD_PATTERN = /\bbody=/u
89
89
  const ISSUE_COMMENT_PATTERN = /\bgh\s+issue\s+comment\b/u
90
90
  const BODY_FLAG_PATTERN = /--body(?:-file)?\b/u
91
91
 
92
+ // `josh issue:plan` posts the plan under no API path of its own, so it is named outright — **as the
93
+ // command run**, at the start or after a `;` / `&&` / `|`, so a grep or a commit message that merely
94
+ // quotes it is not the call.
95
+ const ISSUE_PLAN_PATTERN = /(?:^|[;&|]\s*)pnpm\s+josh\s+issue:plan\b/u
96
+
92
97
  // **The add form, not the label's name anywhere in the command.** The prerequisite branch removes the
93
98
  // same label with `-X DELETE …/labels/in-progress`, which is a run ending its hold on an issue rather
94
99
  // than opening one — matched loosely, that call would move the run's start to somewhere near its end.
@@ -159,6 +164,10 @@ function is_issue_comment(command: string): boolean {
159
164
  return ISSUE_COMMENT_PATTERN.test(command) && BODY_FLAG_PATTERN.test(command)
160
165
  }
161
166
 
167
+ function is_plan_write(command: string): boolean {
168
+ return is_api_body_write(command) || is_issue_comment(command) || ISSUE_PLAN_PATTERN.test(command)
169
+ }
170
+
162
171
  function is_in_progress_label(command: string): boolean {
163
172
  return ISSUE_LABELS_PATTERN.test(command) && command.includes(IN_PROGRESS_FIELD)
164
173
  }
@@ -216,7 +225,7 @@ function bash_issue(command: string): number {
216
225
  function bash_marker(command: string): PhaseMarker {
217
226
  if (is_run_start(command)) return WORKFLOW_MARKER
218
227
 
219
- return is_api_body_write(command) || is_issue_comment(command) ? PLAN_MARKER : NO_MARKER
228
+ return is_plan_write(command) ? PLAN_MARKER : NO_MARKER
220
229
  }
221
230
 
222
231
  const time_markers = {