@joshuafolkken/kit 1.1514.0 → 1.1784.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (858) hide show
  1. package/.claude/agents/investigator.md +1 -1
  2. package/.claude/settings.json +5 -5
  3. package/.claude/skills/epic-commands/SKILL.md +26 -65
  4. package/.claude/skills/epic-commands/epic-bundle.md +3 -1
  5. package/.claude/skills/workflow-commands/SKILL.md +5 -5
  6. package/.claude/skills/workflow-commands/background-commands.md +5 -5
  7. package/.claude/skills/workflow-commands/backlogrun-child.md +10 -8
  8. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
  9. package/.claude/skills/workflow-commands/backlogrun-lanes.md +17 -13
  10. package/.claude/skills/workflow-commands/backlogrun-park.md +14 -23
  11. package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -2
  12. package/.claude/skills/workflow-commands/backlogrun-recovery.md +5 -5
  13. package/.claude/skills/workflow-commands/backlogrun-steps.md +10 -10
  14. package/.claude/skills/workflow-commands/backlogrun.md +1 -1
  15. package/.claude/skills/workflow-commands/chain-rule.md +13 -7
  16. package/.claude/skills/workflow-commands/delegation.md +6 -5
  17. package/.claude/skills/workflow-commands/entry-sequence.md +9 -9
  18. package/.claude/skills/workflow-commands/followup.md +9 -31
  19. package/.claude/skills/workflow-commands/fullrun-steps.md +36 -45
  20. package/.claude/skills/workflow-commands/fullrun.md +2 -2
  21. package/.claude/skills/workflow-commands/halfrun.md +17 -25
  22. package/.claude/skills/workflow-commands/issue-comments.md +16 -12
  23. package/.claude/skills/workflow-commands/issue-scout.md +2 -2
  24. package/.claude/skills/workflow-commands/kickoff.md +24 -23
  25. package/.claude/skills/workflow-commands/latest-gate.md +7 -12
  26. package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
  27. package/.claude/skills/workflow-commands/observation-filing.md +4 -36
  28. package/.claude/skills/workflow-commands/observation-ledger.md +1 -1
  29. package/.claude/skills/workflow-commands/pre-gate-cut.md +13 -30
  30. package/.claude/skills/workflow-commands/prerequisite.md +10 -16
  31. package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
  32. package/.claude/skills/workflow-commands/prrun.md +3 -7
  33. package/.claude/skills/workflow-commands/retrospective.md +1 -1
  34. package/.claude/skills/workflow-commands/split-assessment.md +13 -1
  35. package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
  36. package/.codex/hooks.json +5 -5
  37. package/.github/actions/setup-node/action.yml +9 -0
  38. package/.github/actions/setup-pnpm/action.yml +1 -1
  39. package/.github/dependabot.yml +16 -0
  40. package/.github/release.yml +0 -2
  41. package/.github/workflows/ci.yml +120 -10
  42. package/.github/workflows/publish.yml +8 -1
  43. package/.github/workflows/sonar-qube.yml +1 -0
  44. package/.prettierignore +2 -0
  45. package/.vscode/tasks.json +1 -2
  46. package/CLAUDE.md +3 -7
  47. package/README.md +4 -2
  48. package/SECURITY.md +1 -1
  49. package/dist/CLAUDE.md +3 -7
  50. package/dist/commands/document-read-cli.js +882 -0
  51. package/dist/commands/{document-section-cli.js → document-section-main.js} +79 -37
  52. package/dist/commands/read-set-cli.js +1867 -0
  53. package/dist/commands/run-prep-main.js +21653 -0
  54. package/dist/commands/run-step-cli.js +23880 -0
  55. package/dist/config-merge/index.js +5 -1
  56. package/dist/hooks/audit-provision.js +20 -35
  57. package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
  58. package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
  59. package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
  60. package/dist/hooks/{chunk-TNUMY6NL.js → chunk-PT5R6UJD.js} +4193 -1900
  61. package/dist/hooks/chunk-TUIFS5E7.js +72 -0
  62. package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
  63. package/dist/hooks/{chunk-APUO6U4J.js → chunk-WR2KQAYZ.js} +1843 -440
  64. package/dist/hooks/{chunk-O6GDRNJB.js → chunk-XGBNSWEI.js} +248 -46
  65. package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
  66. package/dist/hooks/codex-hook-adapter.js +10 -22
  67. package/dist/hooks/format-edited.js +5 -6
  68. package/dist/hooks/inputs.json +443 -317
  69. package/dist/hooks/pretool-guard.js +7 -25
  70. package/dist/hooks/session-lang.js +44 -51
  71. package/dist/hooks/stop-guard.js +7716 -2187
  72. package/dist/josh.js +6002 -3583
  73. package/dist/self-sync-guard/index.js +74 -10
  74. package/dist/version/index.js +115 -406
  75. package/eslint/base.js +1 -1
  76. package/lefthook/base.yml +3 -1
  77. package/package.json +10 -48
  78. package/pnpm-workspace.yaml +4 -2
  79. package/prompts/coding-standards.md +1 -1
  80. package/prompts/collaboration-workflow/file-edits.md +1 -7
  81. package/prompts/collaboration-workflow/issue-citation.md +1 -1
  82. package/prompts/collaboration-workflow/issue-template.md +33 -16
  83. package/prompts/collaboration-workflow/lane-instructions.md +1 -2
  84. package/prompts/collaboration-workflow/measurement.md +37 -0
  85. package/prompts/collaboration-workflow/operating-rules.md +4 -6
  86. package/prompts/collaboration-workflow/output-bounds.md +2 -7
  87. package/prompts/collaboration-workflow/plan-comment.md +3 -42
  88. package/prompts/collaboration-workflow/principles.md +5 -0
  89. package/prompts/collaboration-workflow/report-format.md +31 -60
  90. package/prompts/collaboration-workflow/residency.md +2 -2
  91. package/prompts/collaboration-workflow/shell-body.md +6 -16
  92. package/prompts/collaboration-workflow/turn-batching.md +0 -2
  93. package/prompts/collaboration-workflow/upstream-interrupt.md +14 -4
  94. package/prompts/collaboration-workflow/wip-cap.md +1 -1
  95. package/prompts/collaboration-workflow.md +3 -7
  96. package/prompts/refactoring.md +1 -1
  97. package/prompts/review-rubric.md +1 -2
  98. package/prompts/review.md +41 -21
  99. package/prompts/testing-guide.md +8 -43
  100. package/scripts/agent/agent-event.ts +15 -15
  101. package/scripts/agent/agent-exit-record.ts +13 -1
  102. package/scripts/agent/api-auth.ts +41 -0
  103. package/scripts/agent/api-outage.ts +1 -1
  104. package/scripts/auto-ok/auto-ok-cli.ts +14 -16
  105. package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
  106. package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
  107. package/scripts/auto-ok/auto-ok-judge.ts +13 -2
  108. package/scripts/auto-ok/auto-ok-main.ts +17 -0
  109. package/scripts/backlog/backlog-arrival.ts +14 -3
  110. package/scripts/backlog/backlog-budget-cli.ts +7 -33
  111. package/scripts/backlog/backlog-budget-main.ts +16 -0
  112. package/scripts/backlog/backlog-budget.ts +2 -3
  113. package/scripts/backlog/backlog-defect-priority.ts +4 -3
  114. package/scripts/backlog/backlog-drive-adopt.ts +67 -0
  115. package/scripts/backlog/backlog-drive-args.ts +4 -5
  116. package/scripts/backlog/backlog-drive-cli.ts +113 -28
  117. package/scripts/backlog/backlog-drive-hold.ts +162 -0
  118. package/scripts/backlog/backlog-drive-idle.ts +151 -0
  119. package/scripts/backlog/backlog-drive-judge.ts +25 -0
  120. package/scripts/backlog/backlog-drive-memory.ts +126 -0
  121. package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
  122. package/scripts/backlog/backlog-drive-named.ts +53 -6
  123. package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
  124. package/scripts/backlog/backlog-drive-paused.ts +169 -0
  125. package/scripts/backlog/backlog-drive-restore.ts +30 -7
  126. package/scripts/backlog/backlog-drive-seats.ts +18 -8
  127. package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
  128. package/scripts/backlog/backlog-drive.ts +79 -75
  129. package/scripts/backlog/backlog-next-main.ts +16 -0
  130. package/scripts/backlog/backlog-next-shared.ts +73 -0
  131. package/scripts/backlog/backlog-next.ts +48 -16
  132. package/scripts/backlog/backlog-occupied.ts +52 -39
  133. package/scripts/backlog/backlog-offer-cli.ts +6 -21
  134. package/scripts/backlog/backlog-offer-exclude.ts +15 -0
  135. package/scripts/backlog/backlog-offer-main.ts +12 -0
  136. package/scripts/backlog/backlog-offer.ts +36 -3
  137. package/scripts/backlog/backlog-overlap.ts +22 -4
  138. package/scripts/backlog/backlog-plan-read.ts +6 -2
  139. package/scripts/backlog/backlog-plan.ts +18 -4
  140. package/scripts/backlog/backlog-pool.ts +10 -10
  141. package/scripts/backlog/backlog-rank.ts +10 -2
  142. package/scripts/backlog/backlog-ready.ts +112 -30
  143. package/scripts/backlog/backlog-stalled-detect.ts +109 -36
  144. package/scripts/backlog/backlog-stalled.ts +52 -16
  145. package/scripts/backlog/backlog-wait-cause.ts +86 -0
  146. package/scripts/backlog/backlog-waves.ts +39 -13
  147. package/scripts/backlog/backlogrun-args.ts +19 -7
  148. package/scripts/backlog/backlogrun-cli.ts +19 -5
  149. package/scripts/backlog/backlogrun-launch.ts +6 -0
  150. package/scripts/backlog/backlogrun-restart.ts +97 -0
  151. package/scripts/backlog/backlogrun-stop.ts +79 -7
  152. package/scripts/behavior/behavior-cli.ts +2 -2
  153. package/scripts/behavior/behavior-rules.ts +47 -24
  154. package/scripts/build/build-bin.ts +2 -16
  155. package/scripts/build/build-claude-md.ts +0 -7
  156. package/scripts/build/build-commands.ts +0 -13
  157. package/scripts/build/build-hooks.ts +49 -48
  158. package/scripts/build/hook-bundle-stamp.ts +29 -11
  159. package/scripts/build/local-bin.ts +1 -1
  160. package/scripts/cases/cases-cli.ts +25 -13
  161. package/scripts/cases/cases-interaction-scan.ts +134 -0
  162. package/scripts/cases/cases-interaction.ts +183 -0
  163. package/scripts/cases/cases-logic.ts +39 -6
  164. package/scripts/ci/pr-classification-main.ts +18 -0
  165. package/scripts/ci/pr-classification.ts +10 -17
  166. package/scripts/clone/clone-scan.ts +1 -1
  167. package/scripts/cost-runtime/cost-blocks.ts +22 -37
  168. package/scripts/cost-runtime/cost-cli.ts +31 -14
  169. package/scripts/cost-runtime/cost-main.ts +12 -0
  170. package/scripts/cost-runtime/cost-transcript.ts +1 -0
  171. package/scripts/delegation/delegation-policy.ts +17 -4
  172. package/scripts/delegation/duplicate-read-guard.ts +0 -8
  173. package/scripts/delegation/investigation-guard.ts +0 -8
  174. package/scripts/delegation/investigation-reads.ts +3 -4
  175. package/scripts/dependabot/dependabot-cooldown.ts +194 -0
  176. package/scripts/discovery/repo-discovery.ts +24 -6
  177. package/scripts/doctor/doctor-consumer.ts +2 -5
  178. package/scripts/document/document-byte-budget.ts +8 -6
  179. package/scripts/document/document-scan.ts +1 -1
  180. package/scripts/document/document-section-cli.ts +0 -8
  181. package/scripts/document/document-section-main.ts +12 -0
  182. package/scripts/epic/epic-audit-cli.ts +12 -6
  183. package/scripts/epic/epic-bundle-apply.ts +137 -0
  184. package/scripts/epic/epic-bundle-cli.ts +32 -121
  185. package/scripts/epic/epic-bundle-format.ts +116 -0
  186. package/scripts/epic/epic-bundle-main.ts +17 -0
  187. package/scripts/epic/epic-busy.ts +5 -12
  188. package/scripts/epic/epic-classify.ts +24 -15
  189. package/scripts/epic/epic-cli-argv.ts +31 -0
  190. package/scripts/epic/epic-cli-decide.ts +42 -0
  191. package/scripts/epic/epic-cli.ts +6 -38
  192. package/scripts/epic/epic-close.ts +112 -55
  193. package/scripts/epic/epic-cross-repo.ts +4 -7
  194. package/scripts/epic/epic-decide.ts +119 -0
  195. package/scripts/epic/epic-decision.ts +9 -0
  196. package/scripts/epic/epic-fetch.ts +4 -0
  197. package/scripts/epic/epic-graph.ts +2 -0
  198. package/scripts/epic/epic-issue.ts +5 -1
  199. package/scripts/epic/epic-label-age.ts +1 -1
  200. package/scripts/epic/epic-lane-offer.ts +39 -4
  201. package/scripts/epic/epic-next-main.ts +24 -0
  202. package/scripts/epic/epic-next.ts +6 -24
  203. package/scripts/epic/epic-outside-blocker.ts +6 -2
  204. package/scripts/epic/epic-parse.ts +9 -3
  205. package/scripts/epic/epic-read.ts +1 -0
  206. package/scripts/epic/epic-reconcile.ts +39 -0
  207. package/scripts/epic/epic-run.ts +10 -1
  208. package/scripts/epic/epic-solo.ts +50 -14
  209. package/scripts/epic/epic.ts +41 -7
  210. package/scripts/exports/unused-members-cli.ts +2 -2
  211. package/scripts/followup/followup-checks-event.ts +8 -3
  212. package/scripts/followup/followup-coderabbit-wait.ts +82 -0
  213. package/scripts/followup/followup-review-gates.ts +81 -0
  214. package/scripts/followup/git-followup-stages.ts +13 -3
  215. package/scripts/followup/git-followup-workflow.ts +19 -66
  216. package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
  217. package/scripts/followup/git-pr-followup.ts +36 -8
  218. package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
  219. package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
  220. package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
  221. package/scripts/gate/busy-average.ts +58 -0
  222. package/scripts/gate/check-cpu.ts +60 -0
  223. package/scripts/gate/check-inputs.ts +39 -95
  224. package/scripts/gate/check-reuse.ts +33 -54
  225. package/scripts/gate/command-memory.ts +192 -0
  226. package/scripts/gate/core-admission.ts +218 -28
  227. package/scripts/gate/core-budget-timing.ts +37 -0
  228. package/scripts/gate/core-budget.ts +80 -98
  229. package/scripts/gate/core-wait-record.ts +48 -0
  230. package/scripts/gate/core-wait.ts +37 -5
  231. package/scripts/gate/core-weights.ts +86 -0
  232. package/scripts/gate/free-cores.ts +27 -4
  233. package/scripts/gate/gate-ledger.ts +32 -4
  234. package/scripts/gate/gate-plan.ts +41 -34
  235. package/scripts/gate/gate-report.ts +14 -2
  236. package/scripts/gate/gate-run-steps.ts +53 -8
  237. package/scripts/gate/gate-skip.ts +12 -2
  238. package/scripts/gate/gate-steps.ts +12 -1
  239. package/scripts/gate/input-fingerprint.ts +42 -0
  240. package/scripts/gate/machine-capacity.ts +65 -31
  241. package/scripts/gate/moved-paths.ts +67 -0
  242. package/scripts/gate/project-checks.ts +5 -12
  243. package/scripts/gate/scoped-green.ts +12 -8
  244. package/scripts/gate/since-green.ts +62 -0
  245. package/scripts/gate/toolchain-inputs.ts +115 -0
  246. package/scripts/gate/verification-gate.ts +27 -24
  247. package/scripts/gate/verification-inputs.ts +250 -0
  248. package/scripts/gh/gh-author-association.ts +96 -9
  249. package/scripts/gh/git-ai-review-scan.ts +4 -2
  250. package/scripts/gh/git-gh-api-path.ts +15 -0
  251. package/scripts/gh/git-gh-branch-rules.ts +73 -0
  252. package/scripts/gh/git-gh-conditional.ts +5 -2
  253. package/scripts/gh/git-gh-issue-read.ts +5 -1
  254. package/scripts/gh/git-gh-issue-write.ts +67 -29
  255. package/scripts/gh/git-gh-issue.ts +7 -3
  256. package/scripts/gh/git-gh-poll-read.ts +89 -0
  257. package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
  258. package/scripts/gh/git-gh-pr-rest.ts +1 -1
  259. package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
  260. package/scripts/gh/git-gh-pr.ts +27 -15
  261. package/scripts/gh/git-pr-checks-eval.ts +39 -7
  262. package/scripts/gh/git-pr-checks-parse.ts +39 -9
  263. package/scripts/gh/git-pr-merge-checked.ts +80 -0
  264. package/scripts/git/base-tree.ts +19 -2
  265. package/scripts/git/changed-file-scope.ts +6 -4
  266. package/scripts/git/changed-paths.ts +18 -1
  267. package/scripts/git/git-diff-reads.ts +27 -2
  268. package/scripts/git/git-grep-hits.ts +85 -0
  269. package/scripts/git/git-location-environment.ts +1 -1
  270. package/scripts/git/git-merge-conflicts.ts +83 -0
  271. package/scripts/git/git-preflight.ts +37 -12
  272. package/scripts/git/git-push-transport.ts +1 -2
  273. package/scripts/git/git-schemas.ts +17 -7
  274. package/scripts/git/git-spawn.ts +1 -2
  275. package/scripts/git/git-status.ts +4 -4
  276. package/scripts/git/main-merge-main.ts +12 -0
  277. package/scripts/git/main-merge-regenerate.ts +2 -2
  278. package/scripts/git/main-merge.ts +25 -9
  279. package/scripts/git/main-sync-main.ts +12 -0
  280. package/scripts/git/main-sync.ts +0 -9
  281. package/scripts/git/stash/git-stash.ts +27 -4
  282. package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
  283. package/scripts/git/stash/stash-pop-cli.ts +6 -12
  284. package/scripts/git/stash/stash-pop-main.ts +12 -0
  285. package/scripts/git/stash/stash-push-cli.ts +76 -0
  286. package/scripts/git/stash/stash-push-main.ts +12 -0
  287. package/scripts/hooks/batch-guard.ts +0 -8
  288. package/scripts/hooks/check-commit-message-main.ts +8 -0
  289. package/scripts/hooks/check-commit-message.ts +4 -7
  290. package/scripts/hooks/format-edited-file.ts +8 -24
  291. package/scripts/hooks/pre-commit-lint.ts +30 -3
  292. package/scripts/hooks/pre-push-unit.ts +4 -2
  293. package/scripts/hooks/pretool-guard-cli.ts +1 -8
  294. package/scripts/hooks/pretool-guard.ts +32 -19
  295. package/scripts/hooks/reserved-run.ts +67 -9
  296. package/scripts/hooks/run-hook.sh +13 -4
  297. package/scripts/hooks/shell-rules-notice.ts +37 -0
  298. package/scripts/hooks/stop-actions.ts +2 -21
  299. package/scripts/hooks/stop-guard.ts +13 -9
  300. package/scripts/init/hook-command-rewrite.ts +19 -5
  301. package/scripts/init/hook-launch.ts +15 -17
  302. package/scripts/init/init-actions.ts +0 -6
  303. package/scripts/init/init-ai-copy.ts +10 -36
  304. package/scripts/init/init-bootstrap.ts +9 -8
  305. package/scripts/init/init-dry-run-report.ts +1 -1
  306. package/scripts/init/init-dry-run.ts +1 -1
  307. package/scripts/init/init-file-action.ts +7 -9
  308. package/scripts/init/init-logic-json-merge.ts +2 -2
  309. package/scripts/init/init-logic-migrate.ts +9 -82
  310. package/scripts/init/init-logic.ts +3 -2
  311. package/scripts/init/init-main.ts +12 -0
  312. package/scripts/init/init.ts +5 -12
  313. package/scripts/init/kit-development-versions.ts +3 -7
  314. package/scripts/init/kit-written-paths.ts +2 -2
  315. package/scripts/init/project-profile.ts +5 -4
  316. package/scripts/init/tsconfig-preset-migration.ts +2 -1
  317. package/scripts/init/vscode-tasks.ts +1 -1
  318. package/scripts/issue/defect-origin-cli.ts +106 -0
  319. package/scripts/issue/defect-origin-line.ts +60 -0
  320. package/scripts/issue/defect-origin-main.ts +11 -0
  321. package/scripts/issue/defect-origin.ts +114 -0
  322. package/scripts/issue/defect-rate-cli.ts +34 -78
  323. package/scripts/issue/defect-rate.ts +0 -16
  324. package/scripts/issue/defect-report-cli.ts +128 -0
  325. package/scripts/issue/defect-report-format.ts +56 -0
  326. package/scripts/issue/defect-report-main.ts +11 -0
  327. package/scripts/issue/defect-report.ts +160 -0
  328. package/scripts/issue/expected-effect-lint.ts +1 -0
  329. package/scripts/issue/issue-already-done-cli.ts +62 -0
  330. package/scripts/issue/issue-body-or-comment.ts +40 -0
  331. package/scripts/issue/issue-cite-cli.ts +0 -9
  332. package/scripts/issue/issue-cite-main.ts +12 -0
  333. package/scripts/issue/issue-classification.ts +12 -7
  334. package/scripts/issue/issue-comment-cli.ts +10 -24
  335. package/scripts/issue/issue-comment-main.ts +12 -0
  336. package/scripts/issue/issue-evidence-exit.ts +100 -0
  337. package/scripts/issue/issue-file-cli.ts +29 -7
  338. package/scripts/issue/issue-file.ts +19 -19
  339. package/scripts/issue/issue-fold-cli.ts +2 -11
  340. package/scripts/issue/issue-fold-main.ts +12 -0
  341. package/scripts/issue/issue-labels.ts +81 -90
  342. package/scripts/issue/issue-lint-cli.ts +2 -10
  343. package/scripts/issue/issue-lint-main.ts +12 -0
  344. package/scripts/issue/issue-measured-cli.ts +56 -0
  345. package/scripts/issue/issue-merged.ts +19 -2
  346. package/scripts/issue/issue-not-before-label.ts +135 -0
  347. package/scripts/issue/issue-not-before.ts +111 -0
  348. package/scripts/issue/issue-number-shape.ts +15 -1
  349. package/scripts/issue/issue-park.ts +28 -0
  350. package/scripts/issue/issue-plan-cli.ts +151 -0
  351. package/scripts/issue/issue-priority.ts +151 -0
  352. package/scripts/issue/issue-rank.ts +7 -1
  353. package/scripts/issue/issue-read-cli.ts +3 -10
  354. package/scripts/issue/issue-read-main.ts +12 -0
  355. package/scripts/issue/issue-read.ts +29 -5
  356. package/scripts/issue/issue-release-cli.ts +0 -10
  357. package/scripts/issue/issue-release-main.ts +13 -0
  358. package/scripts/issue/issue-release.ts +7 -12
  359. package/scripts/issue/issue-sample-gate.ts +192 -0
  360. package/scripts/issue/issue-sample-source.ts +76 -0
  361. package/scripts/issue/issue-scout-cli.ts +0 -11
  362. package/scripts/issue/issue-scout-main.ts +14 -0
  363. package/scripts/issue/issue-state-cli.ts +0 -10
  364. package/scripts/issue/issue-state-main.ts +12 -0
  365. package/scripts/issue/issue-watch-diff.ts +56 -15
  366. package/scripts/issue/issue-watch.ts +2 -1
  367. package/scripts/issue/issue-wip.ts +2 -7
  368. package/scripts/issue/measure-rerun-cli.ts +13 -8
  369. package/scripts/issue/plan-consumers-cli.ts +39 -0
  370. package/scripts/issue/plan-consumers-main.ts +11 -0
  371. package/scripts/issue/plan-consumers-section.ts +55 -0
  372. package/scripts/issue/plan-consumers.ts +127 -0
  373. package/scripts/josh/agent-session-environment.ts +1 -1
  374. package/scripts/josh/command-usage.ts +15 -43
  375. package/scripts/josh/file-map-stamp.ts +49 -16
  376. package/scripts/josh/hook-decision.ts +32 -20
  377. package/scripts/josh/josh-command-map.ts +4 -1
  378. package/scripts/josh/josh-command-types.ts +12 -6
  379. package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
  380. package/scripts/josh/josh-commands-ai.ts +157 -158
  381. package/scripts/josh/josh-commands-backlog.ts +82 -16
  382. package/scripts/josh/josh-commands-clone.ts +1 -0
  383. package/scripts/josh/josh-commands-development.ts +111 -71
  384. package/scripts/josh/josh-commands-document.ts +43 -1
  385. package/scripts/josh/josh-commands-epic.ts +171 -0
  386. package/scripts/josh/josh-commands-hooks.ts +25 -2
  387. package/scripts/josh/josh-commands-issue-write.ts +181 -0
  388. package/scripts/josh/josh-commands-issue.ts +124 -24
  389. package/scripts/josh/josh-commands-lane.ts +103 -2
  390. package/scripts/josh/josh-commands-lint.ts +19 -8
  391. package/scripts/josh/josh-commands-maintenance.ts +112 -4
  392. package/scripts/josh/josh-commands-pause.ts +29 -0
  393. package/scripts/josh/josh-commands-progress.ts +87 -0
  394. package/scripts/josh/josh-commands-project.ts +138 -9
  395. package/scripts/josh/josh-commands-review.ts +124 -0
  396. package/scripts/josh/josh-commands-run.ts +211 -23
  397. package/scripts/josh/josh-commands-ship.ts +169 -0
  398. package/scripts/josh/josh-commands-split.ts +9 -0
  399. package/scripts/josh/josh-commands-versioning.ts +49 -2
  400. package/scripts/josh/josh-commands-workflow.ts +144 -6
  401. package/scripts/josh/josh-logic.ts +6 -13
  402. package/scripts/josh/package-directory.ts +2 -4
  403. package/scripts/josh/process-identity.ts +13 -4
  404. package/scripts/josh/session-language-cli.ts +4 -8
  405. package/scripts/josh/session-language-main.ts +13 -0
  406. package/scripts/josh/session-language.ts +6 -1
  407. package/scripts/josh/shared-cache.ts +90 -0
  408. package/scripts/josh/stamp-file.ts +9 -15
  409. package/scripts/lane/lane-await.ts +51 -12
  410. package/scripts/lane/lane-cache.ts +5 -30
  411. package/scripts/lane/lane-capacity.ts +14 -23
  412. package/scripts/lane/lane-check-stats.ts +62 -21
  413. package/scripts/lane/lane-child-invocation.ts +8 -0
  414. package/scripts/lane/lane-cli.ts +15 -5
  415. package/scripts/lane/lane-close.ts +86 -18
  416. package/scripts/lane/lane-core-wait-stats.ts +66 -0
  417. package/scripts/lane/lane-dispatch.ts +24 -3
  418. package/scripts/lane/lane-gap-stats.ts +156 -0
  419. package/scripts/lane/lane-handoff.ts +69 -1
  420. package/scripts/lane/lane-held-stats.ts +129 -0
  421. package/scripts/lane/lane-install.ts +4 -11
  422. package/scripts/lane/lane-launch-cli.ts +0 -9
  423. package/scripts/lane/lane-launch-main.ts +12 -0
  424. package/scripts/lane/lane-ledger-schema.ts +266 -0
  425. package/scripts/lane/lane-ledger.ts +92 -123
  426. package/scripts/lane/lane-limit-cli.ts +12 -1
  427. package/scripts/lane/lane-measure-cli.ts +57 -11
  428. package/scripts/lane/lane-open.ts +9 -1
  429. package/scripts/lane/lane-parked.ts +3 -3
  430. package/scripts/lane/lane-pause-cli.ts +130 -0
  431. package/scripts/lane/lane-pause.ts +158 -0
  432. package/scripts/lane/lane-process-table.ts +166 -0
  433. package/scripts/lane/lane-reap-settle.ts +124 -0
  434. package/scripts/lane/lane-reap.ts +50 -15
  435. package/scripts/lane/lane-registry.ts +24 -3
  436. package/scripts/lane/lane-residents.ts +162 -0
  437. package/scripts/lane/lane-restart.ts +22 -2
  438. package/scripts/lane/lane-round-two-stats.ts +49 -0
  439. package/scripts/lane/lane-sampler.ts +4 -0
  440. package/scripts/lane/lane-session-action.ts +19 -5
  441. package/scripts/lane/lane-session-broker.ts +102 -21
  442. package/scripts/lane/lane-snapshot-trace.ts +84 -0
  443. package/scripts/lane/lane-spans.ts +51 -0
  444. package/scripts/lane/lane-spent.ts +6 -3
  445. package/scripts/lane/lane-stage-stats.ts +7 -2
  446. package/scripts/lane/lane-state.ts +302 -0
  447. package/scripts/lane/lane-stats.ts +58 -4
  448. package/scripts/lane/lane-stop-stats.ts +113 -37
  449. package/scripts/lane/lane-test-related-stats.ts +127 -0
  450. package/scripts/lane/lane-transcript-calls.ts +145 -0
  451. package/scripts/lane/lane-transcript-stats.ts +168 -0
  452. package/scripts/lane/lane-vacant.ts +13 -3
  453. package/scripts/lane/lane-withdraw-cli.ts +5 -4
  454. package/scripts/lane/lane-withdraw.ts +50 -49
  455. package/scripts/lane/process-directories.ts +70 -0
  456. package/scripts/lane/process-lane-marks.ts +94 -0
  457. package/scripts/lib/atomic-write.ts +62 -0
  458. package/scripts/lib/buffered-process.ts +12 -5
  459. package/scripts/lib/cli-flags.ts +53 -0
  460. package/scripts/lib/figure-format.ts +63 -0
  461. package/scripts/lib/json-value.ts +9 -1
  462. package/scripts/lib/package-manifest.ts +35 -0
  463. package/scripts/lib/read-file.ts +3 -1
  464. package/scripts/lib/stamped-memo.ts +63 -0
  465. package/scripts/lib/stdout-on-stderr.ts +24 -0
  466. package/scripts/lib/timeouts.ts +9 -0
  467. package/scripts/lib/transcript-record.ts +91 -0
  468. package/scripts/lines/effective-limit.ts +1 -1
  469. package/scripts/lint/eslint-cache-dependencies.ts +145 -0
  470. package/scripts/lint/eslint-daemon.ts +265 -0
  471. package/scripts/lint/format.ts +11 -2
  472. package/scripts/lint/import-graph.ts +279 -0
  473. package/scripts/lint/lint-gate-scope.ts +102 -0
  474. package/scripts/lint/lint-parallel-main.ts +19 -0
  475. package/scripts/lint/lint-parallel.ts +62 -30
  476. package/scripts/lint/lint-related-scope.ts +30 -24
  477. package/scripts/lint/lint-related.ts +38 -6
  478. package/scripts/notify/confirmation-options.ts +1 -2
  479. package/scripts/notify/telegram-notify.ts +20 -20
  480. package/scripts/notify/telegram-test-logic.ts +0 -1
  481. package/scripts/notify/telegram-test-main.ts +8 -0
  482. package/scripts/notify/telegram-test.ts +2 -6
  483. package/scripts/observations/observation-ledger.ts +13 -0
  484. package/scripts/observations/observations-flush-landing.ts +5 -3
  485. package/scripts/observations/observations-flush.ts +6 -1
  486. package/scripts/overrides/overrides-check.ts +2 -5
  487. package/scripts/overrides/overrides-files.ts +2 -1
  488. package/scripts/overrides/overrides-logic.ts +3 -6
  489. package/scripts/package/verify-optional-eslint-install.ts +8 -6
  490. package/scripts/propagate/propagate-publish.ts +2 -7
  491. package/scripts/propagate/propagate-targets.ts +4 -12
  492. package/scripts/refactor/import-graph.ts +9 -7
  493. package/scripts/release/github-release-runs.ts +17 -6
  494. package/scripts/release/release-approval-prune.ts +18 -0
  495. package/scripts/release/release-history.ts +1 -3
  496. package/scripts/release/release-progress.ts +42 -22
  497. package/scripts/release/release-publish-run.ts +39 -0
  498. package/scripts/release/release-publish.ts +6 -6
  499. package/scripts/release/release-scope-cli.ts +0 -10
  500. package/scripts/release/release-scope-main.ts +12 -0
  501. package/scripts/repo/repo-setting.ts +3 -6
  502. package/scripts/repo/required-checks-logic.ts +6 -15
  503. package/scripts/report/report-format-reference.ts +2 -0
  504. package/scripts/report/report-labels.ts +155 -0
  505. package/scripts/report/report-lint-cli.ts +3 -0
  506. package/scripts/report/report-lint.ts +85 -110
  507. package/scripts/report/report-template-cli.ts +59 -0
  508. package/scripts/report/report-template.ts +112 -0
  509. package/scripts/review/acceptance-map.ts +1 -0
  510. package/scripts/review/removed-tests-check.ts +86 -0
  511. package/scripts/review/removed-tests.ts +149 -0
  512. package/scripts/review/review-brief-cli.ts +81 -15
  513. package/scripts/review/review-brief-main.ts +12 -0
  514. package/scripts/review/review-brief.ts +31 -3
  515. package/scripts/review/review-code-tree.ts +10 -6
  516. package/scripts/review/review-comment-round.ts +26 -8
  517. package/scripts/review/review-finding-ledger.ts +30 -15
  518. package/scripts/review/review-interaction.ts +94 -0
  519. package/scripts/review/review-readers-scan.ts +163 -0
  520. package/scripts/review/review-record-cli.ts +69 -30
  521. package/scripts/review/review-record-main.ts +12 -0
  522. package/scripts/review/review-round-one-blobs.ts +221 -0
  523. package/scripts/review/review-round2-cli.ts +49 -12
  524. package/scripts/review/review-round2.ts +80 -12
  525. package/scripts/review/review-stamps.ts +19 -1
  526. package/scripts/review/review-stop-log.ts +96 -0
  527. package/scripts/review/review-stops-cli.ts +85 -0
  528. package/scripts/review/review-tree.ts +6 -17
  529. package/scripts/review/review-untouched-readers.ts +146 -0
  530. package/scripts/review/test-titles.ts +118 -0
  531. package/scripts/rules/agent-model.ts +8 -0
  532. package/scripts/rules/bash-triggers.ts +46 -3
  533. package/scripts/rules/decision-oracle-batch.ts +9 -1
  534. package/scripts/rules/decision-oracle.ts +2 -2
  535. package/scripts/rules/delivered-rules.ts +80 -2
  536. package/scripts/rules/destructive-command.ts +8 -1
  537. package/scripts/rules/direct-filing.ts +10 -2
  538. package/scripts/rules/direct-issue-comment.ts +117 -0
  539. package/scripts/rules/direct-pr-create.ts +69 -3
  540. package/scripts/rules/early-heartbeat.ts +2 -1
  541. package/scripts/rules/file-body.ts +7 -0
  542. package/scripts/rules/filing-cap.ts +7 -0
  543. package/scripts/rules/git-argv.ts +72 -14
  544. package/scripts/rules/git-force.ts +12 -2
  545. package/scripts/rules/guard-remedy.ts +4 -0
  546. package/scripts/rules/implementation-cut-verdict.ts +1 -1
  547. package/scripts/rules/implementation-cut.ts +11 -3
  548. package/scripts/rules/index-guard.ts +8 -1
  549. package/scripts/rules/issue-comments.ts +9 -1
  550. package/scripts/rules/josh-git-bare.ts +7 -0
  551. package/scripts/rules/lane-background.ts +67 -25
  552. package/scripts/rules/lane-carry-conflict.ts +6 -0
  553. package/scripts/rules/lane-direct-tool.ts +74 -0
  554. package/scripts/rules/lane-interactive-ask.ts +9 -2
  555. package/scripts/rules/lane-park.ts +45 -23
  556. package/scripts/rules/lane-split-park.ts +10 -2
  557. package/scripts/rules/lane-switch-main.ts +7 -0
  558. package/scripts/rules/oracle-consulted.ts +10 -0
  559. package/scripts/rules/oracle-firing.ts +1 -0
  560. package/scripts/rules/permission-guards.ts +3 -0
  561. package/scripts/rules/piped-verification.ts +1 -1
  562. package/scripts/rules/poll-loop.ts +7 -0
  563. package/scripts/rules/pr-merge.ts +123 -0
  564. package/scripts/rules/protected-files.ts +32 -5
  565. package/scripts/rules/raw-field-body.ts +6 -0
  566. package/scripts/rules/rule-body-guard.ts +8 -0
  567. package/scripts/rules/rule-list.ts +9 -28
  568. package/scripts/rules/rule-value-cache.ts +4 -9
  569. package/scripts/rules/rule-value-cli.ts +51 -32
  570. package/scripts/rules/rule-value.ts +1 -1
  571. package/scripts/rules/shell-segments.ts +35 -0
  572. package/scripts/rules/stop-rule-rows.ts +64 -0
  573. package/scripts/rules/stop-rules.ts +3 -4
  574. package/scripts/rules/test-declared-commit.ts +11 -1
  575. package/scripts/rules/third-party-write.ts +7 -0
  576. package/scripts/rules/timed-rerun.ts +69 -0
  577. package/scripts/rules/worktree-guard.ts +13 -3
  578. package/scripts/run/board/run-board-app-name.ts +23 -0
  579. package/scripts/run/board/run-board-cli.ts +65 -32
  580. package/scripts/run/board/run-board-earlier.ts +94 -0
  581. package/scripts/run/board/run-board-ending-reason.ts +67 -0
  582. package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
  583. package/scripts/run/board/run-board-estimate.ts +98 -0
  584. package/scripts/run/board/run-board-fit.ts +153 -36
  585. package/scripts/run/board/run-board-fold.ts +123 -0
  586. package/scripts/run/board/run-board-fresh.ts +2 -2
  587. package/scripts/run/board/run-board-gather-live.ts +29 -0
  588. package/scripts/run/board/run-board-gather-thread.ts +189 -0
  589. package/scripts/run/board/run-board-gather-worker.ts +29 -0
  590. package/scripts/run/board/run-board-gather.ts +187 -0
  591. package/scripts/run/board/run-board-github.ts +118 -38
  592. package/scripts/run/board/run-board-header.ts +82 -20
  593. package/scripts/run/board/run-board-keys.ts +58 -0
  594. package/scripts/run/board/run-board-kind.ts +20 -6
  595. package/scripts/run/board/run-board-labels.ts +116 -71
  596. package/scripts/run/board/run-board-lane-state.ts +109 -0
  597. package/scripts/run/board/run-board-lane-time.ts +122 -0
  598. package/scripts/run/board/run-board-layout.ts +239 -60
  599. package/scripts/run/board/run-board-length.ts +52 -0
  600. package/scripts/run/board/run-board-machine.ts +8 -4
  601. package/scripts/run/board/run-board-main.ts +12 -0
  602. package/scripts/run/board/run-board-notes.ts +52 -31
  603. package/scripts/run/board/run-board-now.ts +1 -1
  604. package/scripts/run/board/run-board-operation.ts +15 -33
  605. package/scripts/run/board/run-board-phase.ts +1 -1
  606. package/scripts/run/board/run-board-plan-shared.ts +115 -0
  607. package/scripts/run/board/run-board-plan.ts +55 -3
  608. package/scripts/run/board/run-board-planning.ts +45 -0
  609. package/scripts/run/board/run-board-priority.ts +44 -0
  610. package/scripts/run/board/run-board-process-groups.ts +195 -0
  611. package/scripts/run/board/run-board-read.ts +151 -27
  612. package/scripts/run/board/run-board-reason.ts +235 -51
  613. package/scripts/run/board/run-board-released.ts +35 -0
  614. package/scripts/run/board/run-board-render-checks.ts +39 -5
  615. package/scripts/run/board/run-board-render-condition.ts +96 -0
  616. package/scripts/run/board/run-board-render-drawn.ts +67 -0
  617. package/scripts/run/board/run-board-render-foot.ts +59 -0
  618. package/scripts/run/board/run-board-render-icon.ts +35 -0
  619. package/scripts/run/board/run-board-render-lanes.ts +145 -0
  620. package/scripts/run/board/run-board-render-lead.ts +80 -0
  621. package/scripts/run/board/run-board-render-legend.ts +117 -48
  622. package/scripts/run/board/run-board-render-notes.ts +156 -29
  623. package/scripts/run/board/run-board-render-processes.ts +196 -0
  624. package/scripts/run/board/run-board-render-section.ts +119 -0
  625. package/scripts/run/board/run-board-render-slot.ts +3 -36
  626. package/scripts/run/board/run-board-render-tail.ts +115 -48
  627. package/scripts/run/board/run-board-render-time.ts +56 -0
  628. package/scripts/run/board/run-board-render-title.ts +117 -24
  629. package/scripts/run/board/run-board-render-waits.ts +104 -20
  630. package/scripts/run/board/run-board-render.ts +207 -265
  631. package/scripts/run/board/run-board-roots.ts +54 -0
  632. package/scripts/run/board/run-board-row-yield.ts +9 -4
  633. package/scripts/run/board/run-board-setup.ts +1 -12
  634. package/scripts/run/board/run-board-snapshot.ts +111 -0
  635. package/scripts/run/board/run-board-spin.ts +2 -2
  636. package/scripts/run/board/run-board-state.ts +22 -33
  637. package/scripts/run/board/run-board-status.ts +147 -71
  638. package/scripts/run/board/run-board-thanks-read.ts +2 -2
  639. package/scripts/run/board/run-board-tick.ts +122 -107
  640. package/scripts/run/board/run-board-usage-board.ts +78 -0
  641. package/scripts/run/board/run-board-usage-lanes.ts +113 -0
  642. package/scripts/run/board/run-board-usage-listing.ts +93 -0
  643. package/scripts/run/board/run-board-usage-read.ts +120 -150
  644. package/scripts/run/board/run-board-usage-rusage.ts +19 -7
  645. package/scripts/run/board/run-board-usage-text.ts +139 -51
  646. package/scripts/run/board/run-board-usage-top.ts +102 -0
  647. package/scripts/run/board/run-board-usage.ts +89 -72
  648. package/scripts/run/board/run-board-usual.ts +20 -9
  649. package/scripts/run/carry/run-carry-args.ts +4 -7
  650. package/scripts/run/carry/run-carry-conversation.ts +1 -1
  651. package/scripts/run/carry/run-carry.ts +9 -4
  652. package/scripts/run/cut/run-cut-handoff.ts +2 -2
  653. package/scripts/run/event/run-event-cli.ts +1 -5
  654. package/scripts/run/event/run-event-filed.ts +12 -6
  655. package/scripts/run/event/run-event-follow.ts +2 -3
  656. package/scripts/run/event/run-event-render.ts +6 -10
  657. package/scripts/run/event/run-event-scope.ts +2 -2
  658. package/scripts/run/event/run-event-stream-emit.ts +82 -22
  659. package/scripts/run/event/run-event-stream.ts +34 -8
  660. package/scripts/run/hold/run-hold-adopt.ts +65 -0
  661. package/scripts/run/hold/run-hold-cli.ts +93 -22
  662. package/scripts/run/hold/run-hold-main.ts +12 -0
  663. package/scripts/run/hold/run-hold-member.ts +37 -0
  664. package/scripts/run/hold/run-stop-notify.ts +183 -0
  665. package/scripts/run/merge/run-merge-auth.ts +31 -0
  666. package/scripts/run/merge/run-merge-cli.ts +62 -48
  667. package/scripts/run/merge/run-merge-close.ts +74 -0
  668. package/scripts/run/merge/run-merge-collect.ts +6 -13
  669. package/scripts/run/merge/run-merge-driver.ts +71 -0
  670. package/scripts/run/merge/run-merge-main.ts +12 -0
  671. package/scripts/run/merge/run-merge-outcome.ts +23 -0
  672. package/scripts/run/merge/run-merge-restart.ts +39 -0
  673. package/scripts/run/merge/run-merge-ship.ts +20 -4
  674. package/scripts/run/merge/run-merge-signals.ts +33 -9
  675. package/scripts/run/merge/run-merge-steps.ts +120 -85
  676. package/scripts/run/merge/run-merge.ts +38 -37
  677. package/scripts/run/park/run-park-cli.ts +91 -0
  678. package/scripts/run/park/run-park.ts +88 -0
  679. package/scripts/run/park/run-stalled.ts +68 -0
  680. package/scripts/run/pause/run-pause-cli.ts +73 -0
  681. package/scripts/run/pause/run-pause.ts +251 -0
  682. package/scripts/run/progress/run-progress-cli.ts +4 -12
  683. package/scripts/run/progress/run-progress-clock.ts +1 -1
  684. package/scripts/run/progress/run-progress-config.ts +6 -14
  685. package/scripts/run/progress/run-progress-main.ts +12 -0
  686. package/scripts/run/progress/run-progress.ts +1 -4
  687. package/scripts/run/review/run-review.ts +2 -1
  688. package/scripts/run/run-ending.ts +1 -0
  689. package/scripts/run/run-invocation.ts +5 -6
  690. package/scripts/run/run-liveness-cli.ts +6 -8
  691. package/scripts/run/run-liveness.ts +60 -29
  692. package/scripts/run/run-next.ts +1 -1
  693. package/scripts/run/run-parent-cut-hook.ts +2 -2
  694. package/scripts/run/run-preflight.ts +18 -3
  695. package/scripts/run/run-prep-cli.ts +1 -10
  696. package/scripts/run/run-prep-locate.ts +7 -50
  697. package/scripts/run/run-prep-main.ts +12 -0
  698. package/scripts/run/run-prep.ts +6 -0
  699. package/scripts/run/run-report-cli.ts +101 -13
  700. package/scripts/run/run-report-handoff.ts +114 -0
  701. package/scripts/run/run-step.ts +1 -1
  702. package/scripts/run/run-stranded-detect.ts +13 -0
  703. package/scripts/run/run-watcher-guard-cli.ts +1 -1
  704. package/scripts/run/run-watcher-guard.ts +1 -1
  705. package/scripts/run/ship/run-ship-args.ts +121 -0
  706. package/scripts/run/ship/run-ship-body-draft.ts +110 -0
  707. package/scripts/run/ship/run-ship-cli.ts +63 -140
  708. package/scripts/run/ship/run-ship-detach.ts +19 -8
  709. package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
  710. package/scripts/run/ship/run-ship-next.ts +18 -2
  711. package/scripts/run/ship/run-ship-overlap.ts +42 -5
  712. package/scripts/run/ship/run-ship-place.ts +96 -0
  713. package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
  714. package/scripts/run/ship/run-ship-pre-detach.ts +81 -24
  715. package/scripts/run/ship/run-ship-preflight.ts +137 -32
  716. package/scripts/run/ship/run-ship-probe.ts +11 -3
  717. package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
  718. package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
  719. package/scripts/run/ship/run-ship-return.ts +107 -23
  720. package/scripts/run/ship/run-ship-review-steps.ts +105 -151
  721. package/scripts/run/ship/run-ship-review.ts +73 -6
  722. package/scripts/run/ship/run-ship-reviewer.ts +207 -0
  723. package/scripts/run/ship/run-ship-stage.ts +55 -6
  724. package/scripts/run/ship/run-ship-steps.ts +46 -15
  725. package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
  726. package/scripts/run/ship/run-ship-stop-text.ts +11 -6
  727. package/scripts/run/ship/run-ship-sync.ts +43 -6
  728. package/scripts/run/ship/run-ship.ts +30 -2
  729. package/scripts/run/tidy/run-tidy-cli.ts +0 -4
  730. package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
  731. package/scripts/run/tidy/run-tidy-main.ts +8 -0
  732. package/scripts/run/wake/run-wake-cli.ts +119 -100
  733. package/scripts/run/wake/run-wake-code.ts +83 -0
  734. package/scripts/run/wake/run-wake-driver.ts +19 -8
  735. package/scripts/run/wake/run-wake-loop.ts +34 -3
  736. package/scripts/run/wake/run-wake-main.ts +13 -0
  737. package/scripts/run/wake/run-wake-ports.ts +90 -0
  738. package/scripts/run/wake/run-wake-takeover.ts +66 -0
  739. package/scripts/run/wake/run-wake.ts +2 -1
  740. package/scripts/safe-chain/pack-hook.ts +2 -2
  741. package/scripts/safe-chain/preinstall-command.ts +2 -1
  742. package/scripts/safe-chain/project-config.ts +3 -9
  743. package/scripts/security/security-audit-main.ts +8 -0
  744. package/scripts/security/security-audit-provision-logic.ts +0 -11
  745. package/scripts/security/security-audit-provision-main.ts +12 -0
  746. package/scripts/security/security-audit-provision.ts +11 -26
  747. package/scripts/security/security-audit.ts +6 -7
  748. package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
  749. package/scripts/split/split-assess-cli.ts +2 -2
  750. package/scripts/split/split-assess.ts +15 -0
  751. package/scripts/split/split-measure.ts +65 -0
  752. package/scripts/sync/claude-settings-merge.ts +8 -15
  753. package/scripts/sync/directory-copy-guard.ts +4 -9
  754. package/scripts/sync/file-content.ts +78 -8
  755. package/scripts/sync/sync-ai-files.ts +3 -5
  756. package/scripts/sync/sync-configs.ts +11 -23
  757. package/scripts/sync/sync-hook-safety.ts +4 -10
  758. package/scripts/sync/sync-main.ts +11 -0
  759. package/scripts/sync/sync.ts +25 -37
  760. package/scripts/test/test-declared-changed.ts +2 -2
  761. package/scripts/test/test-declared.ts +1 -1
  762. package/scripts/test/test-e2e-guard.ts +25 -1
  763. package/scripts/test/test-e2e-stamp.ts +38 -0
  764. package/scripts/test/test-pinned-logic.ts +145 -0
  765. package/scripts/test/test-pinned-main.ts +78 -0
  766. package/scripts/test/test-pinned.ts +100 -0
  767. package/scripts/test/test-read-map.ts +264 -0
  768. package/scripts/test/test-read-recording.ts +91 -0
  769. package/scripts/test/test-read-trace.ts +148 -0
  770. package/scripts/test/test-red-main.ts +12 -0
  771. package/scripts/test/test-red.ts +12 -30
  772. package/scripts/test/test-related-main.ts +18 -0
  773. package/scripts/test/test-related-record.ts +119 -0
  774. package/scripts/test/test-related-scope.ts +229 -43
  775. package/scripts/test/test-related.ts +300 -22
  776. package/scripts/test/test-unit-guard-main.ts +15 -0
  777. package/scripts/test/test-unit-guard.ts +42 -24
  778. package/scripts/test/unit-count-file.ts +37 -0
  779. package/scripts/test/unit-run-marker.ts +162 -0
  780. package/scripts/test/unit-setup-files.ts +51 -0
  781. package/scripts/test/unit-worker-share.ts +61 -149
  782. package/scripts/test/whole-suite-files.ts +63 -0
  783. package/scripts/time-runtime/time-background.ts +20 -2
  784. package/scripts/time-runtime/time-bundles.ts +4 -3
  785. package/scripts/time-runtime/time-density-hook.ts +8 -6
  786. package/scripts/time-runtime/time-followup-stage.ts +1 -3
  787. package/scripts/time-runtime/time-format.ts +5 -28
  788. package/scripts/time-runtime/time-markers.ts +10 -1
  789. package/scripts/time-runtime/time-shell.ts +97 -10
  790. package/scripts/time-runtime/time-transcript-line.ts +49 -62
  791. package/scripts/uninstall/uninstall.ts +1 -1
  792. package/scripts/version/bump-version-main.ts +12 -0
  793. package/scripts/version/bump-version.ts +25 -25
  794. package/scripts/version/effective-upstream.ts +6 -12
  795. package/scripts/version/latest-corepack.ts +17 -32
  796. package/scripts/version/latest-if-required-cli.ts +93 -0
  797. package/scripts/version/latest-lane-guard-main.ts +8 -0
  798. package/scripts/version/latest-lane-guard.ts +0 -4
  799. package/scripts/version/latest-scope-cli.ts +0 -9
  800. package/scripts/version/latest-scope-main.ts +12 -0
  801. package/scripts/version/latest-update.ts +5 -5
  802. package/scripts/version/npm-registry.ts +44 -6
  803. package/scripts/version/publishable-range-check.ts +5 -16
  804. package/scripts/version/release-age.ts +1 -1
  805. package/scripts/version/release-hold.ts +1 -1
  806. package/scripts/version/release-window.ts +38 -0
  807. package/scripts/version/running-binary.ts +1 -1
  808. package/scripts/version/safe-chain-version-update.ts +3 -8
  809. package/scripts/version/version-targets.ts +6 -28
  810. package/templates/dependabot.yml +29 -0
  811. package/templates/gitignore +4 -1
  812. package/templates/pnpm-workspace.basic.yaml +1 -1
  813. package/templates/sonar-project.properties +3 -2
  814. package/templates/workflows/ci.yml +12 -4
  815. package/templates/workflows/github-release.yml +4 -0
  816. package/tsconfig.sonar.json +1 -1
  817. package/.ncurc.json +0 -3
  818. package/dist/hooks/batch-guard.js +0 -29
  819. package/dist/hooks/chunk-4KKD2UTK.js +0 -66
  820. package/dist/hooks/chunk-6TS2JD6D.js +0 -237
  821. package/dist/hooks/chunk-7DSBJVFH.js +0 -50
  822. package/dist/hooks/chunk-A65Y4YOR.js +0 -79
  823. package/dist/hooks/chunk-CDY4NFQG.js +0 -15
  824. package/dist/hooks/chunk-EFXE6C37.js +0 -81
  825. package/dist/hooks/chunk-GP4IEC4O.js +0 -20
  826. package/dist/hooks/chunk-JP45SOCJ.js +0 -56
  827. package/dist/hooks/chunk-LAOV7NLM.js +0 -45
  828. package/dist/hooks/chunk-M4HGZV7U.js +0 -83
  829. package/dist/hooks/chunk-PF2NZL2A.js +0 -131
  830. package/dist/hooks/chunk-PTICX4OL.js +0 -358
  831. package/dist/hooks/chunk-RT27QRJW.js +0 -6247
  832. package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
  833. package/dist/hooks/chunk-UPUZF3AN.js +0 -279
  834. package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
  835. package/dist/hooks/duplicate-read-guard.js +0 -30
  836. package/dist/hooks/investigation-guard.js +0 -29
  837. package/scripts/backlog/backlog-stalled-cli.ts +0 -30
  838. package/scripts/cost-runtime/cost-format.ts +0 -29
  839. package/scripts/init/basic-path-migration.ts +0 -24
  840. package/scripts/issue/issue-backlinks-cli.ts +0 -93
  841. package/scripts/josh/josh-commands-guard.ts +0 -38
  842. package/scripts/josh/josh-usage-automation.ts +0 -121
  843. package/scripts/josh/josh-usage-backlog.ts +0 -180
  844. package/scripts/josh/josh-usage-developer.ts +0 -230
  845. package/scripts/josh/josh-usage-hooks.ts +0 -38
  846. package/scripts/josh/josh-usage-issue.ts +0 -205
  847. package/scripts/josh/josh-usage-review.ts +0 -101
  848. package/scripts/josh/josh-usage-run.ts +0 -252
  849. package/scripts/josh/josh-usage-session.ts +0 -238
  850. package/scripts/josh/josh-usage-workflow.ts +0 -212
  851. package/scripts/lint/cross-file-recheck.ts +0 -155
  852. package/scripts/registry-migration/migrate-logic.ts +0 -237
  853. package/scripts/registry-migration/migrate.ts +0 -292
  854. package/scripts/registry-migration/user-npmrc.ts +0 -15
  855. package/scripts/rules/rule-guard.ts +0 -23
  856. package/scripts/rules/rule-registry-rows.ts +0 -292
  857. package/scripts/rules/rule-registry.ts +0 -112
  858. package/scripts/run/run-stranded-cli.ts +0 -27
@@ -1,5 +1,6 @@
1
1
  import { process_identity } from '#scripts/josh/process-identity'
2
2
  import { lane_ledger, type GateCheckRecord } from '#scripts/lane/lane-ledger'
3
+ import { related_scope } from '#scripts/test/test-related-scope'
3
4
  import { core_admission } from './core-admission'
4
5
  import { core_budget } from './core-budget'
5
6
  import { gate_plan } from './gate-plan'
@@ -13,8 +14,8 @@ import { machine_capacity } from './machine-capacity'
13
14
  //
14
15
  // **The machine is read where none of the gate's own checks runs — before the first starts and after
15
16
  // the last ends.** The load average cannot tell the two apart: a solo gate started at 4 on the 11-core
16
- // machine ended at 21, its own load. The reading is the core budget's own, so "quiet" means what
17
- // admission means by it: no whole core busy beyond the baseline the gate's weights were measured beside.
17
+ // machine ended at 21, its own load. The reading is the core budget's own; "quiet" is no whole core
18
+ // busy beyond the background a developer machine always carries.
18
19
  //
19
20
  // **Between the ends, the load is read off the core budget's ledger, not the CPU**.
20
21
  // Two readings missed every lane whose lint, tests or `ship` ran only while
@@ -23,7 +24,11 @@ import { machine_capacity } from './machine-capacity'
23
24
  // is what tells the two apart: another `josh` run's admitted claim is another process's place, and its
24
25
  // weight is the cores it holds. A claim still waiting holds none.
25
26
 
26
- const NO_LEDGER_CORES = 0
27
+ // **The background a quiet machine still carries.** On 2026-10-07 the 11-core machine idled at about
28
+ // 1.5 cores outside `josh` — Claude sessions 0.55, the window server 0.47, a browser 0.5. Admission
29
+ // counts it (`machine_capacity.external_cores`, joshuafolkken/kit#4238), but a gate timed beside it is
30
+ // still a solo gate for `josh metrics`, so it is no external load here.
31
+ const BACKGROUND_CORES = 2
27
32
  // Often enough to catch another lane's shortest related lint, seldom enough that reading the markers —
28
33
  // a process probe each — costs the gate nothing it could measure.
29
34
  const SAMPLE_INTERVAL_MS = 3000
@@ -48,7 +53,7 @@ async function read_external_cores(): Promise<number | undefined> {
48
53
 
49
54
  if (busy_cores === undefined) return undefined
50
55
 
51
- return machine_capacity.external_cores(busy_cores, NO_LEDGER_CORES)
56
+ return machine_capacity.external_cores(busy_cores, BACKGROUND_CORES)
52
57
  }
53
58
 
54
59
  // The cores other processes' admitted claims hold now. This gate's own claims are written by this
@@ -88,15 +93,36 @@ async function start(ledger_path: string | undefined): Promise<GateLedgerStart>
88
93
  return { ledger_path, readings, sampler: start_sampler(readings) }
89
94
  }
90
95
 
96
+ // The unit leg's own facts: the whole-suite fallback it took, or the since-green no-op that ran no
97
+ // test (joshuafolkken/kit#4457) — the two `josh lane:stats` must not time as an ordinary run.
98
+ function unit_facts(result: GateStepResult): Pick<GateCheckRecord, 'fallback' | 'is_unmoved'> {
99
+ if (result.label !== gate_plan.UNIT_LABEL) return {}
100
+
101
+ return {
102
+ fallback: related_scope.fallback_kind(result.output),
103
+ ...(related_scope.is_unmoved(result.output) && { is_unmoved: true }),
104
+ }
105
+ }
106
+
91
107
  function check_records(results: ReadonlyArray<GateStepResult>): Array<GateCheckRecord> {
92
108
  return results.map((result) => ({
93
109
  label: result.label,
94
110
  elapsed_ms: result.elapsed_ms,
95
111
  is_passed: !gate_report.is_gate_step_failed(result),
96
112
  is_reused: result.reused_at !== undefined,
113
+ ...(result.cpu_ms !== undefined && { cpu_ms: Math.round(result.cpu_ms) }),
114
+ ...unit_facts(result),
115
+ claim: result.claim,
97
116
  }))
98
117
  }
99
118
 
119
+ // A gate that reused a green record started no check: its line is counted as reused, never timed.
120
+ async function record_reused(ledger_path: string | undefined, elapsed_ms: number): Promise<void> {
121
+ if (ledger_path === undefined) return
122
+
123
+ await lane_ledger.record_gate(ledger_path, { elapsed_ms, is_passed: true, is_reused: true })
124
+ }
125
+
100
126
  // The caller measures the elapsed time before this, so the end's reading is never part of it.
101
127
  async function record(
102
128
  begun: GateLedgerStart,
@@ -119,8 +145,10 @@ async function record(
119
145
  }
120
146
 
121
147
  const gate_ledger = {
148
+ BACKGROUND_CORES,
122
149
  SAMPLE_INTERVAL_MS,
123
150
  record,
151
+ record_reused,
124
152
  start,
125
153
  }
126
154
 
@@ -49,6 +49,7 @@ interface GateCheck {
49
49
  const LINT_LABEL = 'lint'
50
50
  const TYPE_CHECK_LABEL = 'check'
51
51
  const UNIT_LABEL = 'test:unit'
52
+ const UNIT_TARGET = 'test:related'
52
53
  const BEHAVIOR_LABEL = 'behavior'
53
54
  const METRICS_LABEL = 'metrics'
54
55
  const EXPORTS_LABEL = 'exports'
@@ -78,15 +79,18 @@ const WARNING_CHECKER_LABELS: ReadonlyArray<string> = [LINT_LABEL, TYPE_CHECK_LA
78
79
  //
79
80
  // **The two zero weights are measured, and they stay zero.** These are warm runs on the 11-core
80
81
  // machine. `behavior` took 0.6s of wall for 0.7s of CPU, which
81
- // is node starting up. `exports:unused` took 5.5s of wall for 9.0s of CPU, about 1.6 cores. Floored,
82
- // that would be one core, but a reservation lasts the whole gate's plan, not the check's five seconds.
83
- // It would lower `RESERVED_CORES` from 4 to 5 and cut the solo unit cap from 7 workers to 6 for the
84
- // full length of the unit suite, to cover a burst that ends before lint does. Nothing has measured
82
+ // is node starting up. `exports:unused` took 5.5s of wall for 9.0s of CPU, about 1.6 cores. Rounded
83
+ // up, that would be two cores, but a reservation lasts the whole gate's plan, not the check's five
84
+ // seconds. It would raise `RESERVED_CORES` from 6 to 8 and cut the solo unit cap from 5 workers to 3
85
+ // for the full length of the unit suite, to cover a burst that ends before lint does. Nothing has measured
85
86
  // that trade, so the measured shape stays.
86
87
  const STATIC_CHECKS: ReadonlyArray<GateCheck> = [
88
+ // **The lint reads the branch's changed files, not the whole tree** (joshuafolkken/kit#4085), and
89
+ // falls back to the whole tree in CI and on a changed configuration (`lint-gate-scope.ts`).
87
90
  {
88
91
  label: LINT_LABEL,
89
92
  target: 'lint',
93
+ args: ['--changed'],
90
94
  reserved_cores: core_budget.CORE_WEIGHTS.lint,
91
95
  memory_mb: core_budget.MEMORY_MB.lint,
92
96
  },
@@ -120,13 +124,23 @@ const STATIC_CHECKS: ReadonlyArray<GateCheck> = [
120
124
  memory_mb: core_budget.MEMORY_MB.eslint_scan,
121
125
  is_kit_only: true,
122
126
  },
127
+ // The lockfile policy check is network-bound and usually instant: it verifies only when the
128
+ // lockfile or `pnpm-workspace.yaml` moved from the merge-base (joshuafolkken/kit#4090), so it
129
+ // reserves no core. Kit's own until a consumer's private-registry entries are known to verify.
130
+ { label: 'lockfile', target: 'lockfile:policy', reserved_cores: 0, is_kit_only: true },
123
131
  ]
124
132
 
125
133
  // The checks, in the order their output is printed — the static set, then the unit suite last (the
126
134
  // one check that fans out across every core, and the one the `--no-unit` split drops).
135
+ //
136
+ // **The unit check runs the tests the change can reach, not the whole suite**
137
+ // (joshuafolkken/kit#4065): `josh test:related` narrows through the module graph and the test-read
138
+ // map, and runs the whole suite — refreshing that map — whenever it cannot tell. The label stays
139
+ // `test:unit`, the name every ledger, reservation and record knows the check by. CI runs the whole
140
+ // sharded suite regardless.
127
141
  const GATE_CHECKS: ReadonlyArray<GateCheck> = [
128
142
  ...STATIC_CHECKS,
129
- { label: UNIT_LABEL, target: UNIT_LABEL, reserved_cores: 0 },
143
+ { label: UNIT_LABEL, target: UNIT_TARGET, reserved_cores: 0 },
130
144
  ]
131
145
 
132
146
  // **Selecting is not skipping, and the difference is where the unit suite runs rather than whether
@@ -152,7 +166,7 @@ function has_unit_check(checks: ReadonlyArray<GateCheck>): boolean {
152
166
  return checks.some((check) => check.label === UNIT_LABEL)
153
167
  }
154
168
 
155
- // What the non-elastic checks hold between them: 2 + 1 + 1. Reduced over `STATIC_CHECKS`
169
+ // What the non-elastic checks hold between them: 2 + 2 + 2. Reduced over `STATIC_CHECKS`
156
170
  // rather than over every check, because that is the set the sentence above names: `resolve_unit_worker_cap`
157
171
  // spends this as the cores the unit suite must leave to its siblings, so summing the unit check into
158
172
  // it would have the suite subtract its own reservation from its own budget the day that reservation
@@ -219,7 +233,7 @@ function shared_cores(available_cores: number, concurrent_runs: number): number
219
233
 
220
234
  // Admit checks in declaration order while the running set's reserved cores still fit **this run's
221
235
  // share** of the machine. On a machine running one gate that share is the machine, so this bites
222
- // only below four cores — the three reserving checks want four between them — and there it is the
236
+ // only below six cores — the three reserving checks want six between them — and there it is the
223
237
  // difference between two checks sharing a core and four fighting over it.
224
238
  //
225
239
  // **Under concurrency it is the only lever there is, and that is a measurement rather than a
@@ -309,8 +323,9 @@ function solo_unit_weight(available_cores: number): number {
309
323
  // once**: no second set of weights is introduced, so a change to the measured reservation moves the
310
324
  // admission with it.
311
325
  //
312
- // **A solo gate's four weights sum to exactly the core count** — `reserved(2 + 1 + 1) +
313
- // unit_cap(cores - 4)` is `cores` — which is what lets every check of a lone gate be admitted at once,
326
+ // **A solo gate's four weights sum to exactly the core count** — `reserved(2 + 2 + 2) +
327
+ // unit_cap(cores - 6)` is `cores` — which is what lets every check of a lone gate on a machine with room
328
+ // (its busy cores within what the ledger holds, `core-budget.ts`) be admitted at once,
314
329
  // its concurrency unchanged. A machine below the measured one leaves the unit suite uncapped and reads
315
330
  // its weight from the same identity, `cores - RESERVED_CORES` clamped at zero, so the sum is the core
316
331
  // count there too.
@@ -339,22 +354,33 @@ function check_memory(check: GateCheck, plan: GatePlan, available_cores: number)
339
354
  // and hold every later claim behind it. One weight for the suite however it is started. **Floored at one
340
355
  // worker**: on a machine the static checks fill, a four-core CI runner among them, the gate's solo
341
356
  // weight is zero because its siblings hold every core — a direct run has no siblings, and vitest still
342
- // occupies a core.
357
+ // occupies a core. **Plus vitest's own process** (joshuafolkken/kit#4362): the workers are the share,
358
+ // and the claim holds the process that drives them on top (`unit_worker_share.cap_to_claim` takes it
359
+ // back off).
343
360
  function direct_unit_weight(
344
361
  available_cores: number = availableParallelism(),
345
362
  live_runs: number = unit_worker_share.live_run_count(),
346
363
  ): number {
347
- const weight =
364
+ const workers =
348
365
  unit_worker_share.current_share(available_cores, live_runs) ?? solo_unit_weight(available_cores)
349
366
 
350
- return Math.max(unit_worker_share.MIN_WORKERS, weight)
367
+ return Math.max(unit_worker_share.MIN_WORKERS, workers) + unit_worker_share.MAIN_PROCESS_CORES
351
368
  }
352
369
 
353
- // What a unit run started directly holds: one worker's peak for each worker `direct_unit_weight` gives it.
370
+ // What a unit run started directly holds: one worker's peak for each core `direct_unit_weight` gives
371
+ // it, vitest's own process counted as one more.
354
372
  function direct_unit_memory(): number {
355
373
  return unit_memory(direct_unit_weight())
356
374
  }
357
375
 
376
+ // The claim every unit run started directly declares — `josh test:unit`, `josh test:related` and the
377
+ // pre-push hook — declared once so the three cannot drift apart.
378
+ const DIRECT_UNIT_CLAIM = {
379
+ core_weight: direct_unit_weight,
380
+ memory_mb: direct_unit_memory,
381
+ is_unit_claim: true,
382
+ } as const
383
+
358
384
  function unit_cap_for(
359
385
  checks: ReadonlyArray<GateCheck>,
360
386
  available_cores: number,
@@ -398,25 +424,6 @@ function resolve_gate_plan(
398
424
  }
399
425
  }
400
426
 
401
- // The unit cap bounded by the cores free of load from outside the core budget's ledger
402
- // (`free-cores.ts`), so the run count's share is never wider than what is free. A plan with no unit
403
- // step carries no cap, and an unread machine leaves the cap as resolved (`unit_worker_share.cap_to_free`).
404
- function bound_by_free(
405
- plan: GatePlan,
406
- available_cores: number,
407
- free_cores: number | undefined,
408
- ): GatePlan {
409
- if (!has_unit_check(plan.checks)) return plan
410
-
411
- const unit_worker_cap = unit_worker_share.cap_to_free(
412
- plan.unit_worker_cap,
413
- free_cores,
414
- available_cores,
415
- )
416
-
417
- return { ...plan, unit_worker_cap }
418
- }
419
-
420
427
  // Printed once per run, so a gate that was slow on someone else's machine can be read without
421
428
  // re-deriving the plan from their core count.
422
429
  //
@@ -460,6 +467,7 @@ function format_gate_plan(
460
467
  }
461
468
 
462
469
  const gate_plan = {
470
+ DIRECT_UNIT_CLAIM,
463
471
  EXPORTS_LABEL,
464
472
  GATE_CHECKS,
465
473
  LINT_LABEL,
@@ -469,11 +477,10 @@ const gate_plan = {
469
477
  STATIC_CHECKS,
470
478
  TYPE_CHECK_LABEL,
471
479
  UNIT_LABEL,
480
+ UNIT_TARGET,
472
481
  WARNING_CHECKER_LABELS,
473
- bound_by_free,
474
482
  check_memory,
475
483
  check_weight,
476
- direct_unit_memory,
477
484
  direct_unit_weight,
478
485
  format_gate_plan,
479
486
  format_machine,
@@ -2,6 +2,7 @@ import { GATE_COMMAND } from '#scripts/josh/josh-command-types'
2
2
  import { josh_verdict } from '#scripts/josh/josh-verdict'
3
3
  import { buffered_process, type BufferedProcessResult } from '#scripts/lib/buffered-process'
4
4
  import { status_icons } from '#scripts/lib/status-icons'
5
+ import { MS_PER_SECOND } from '#scripts/lib/timeouts'
5
6
  import { NOT_USED_MARKER, NOTHING_TO_CHECK_MARKER } from '#scripts/test/skip-marker'
6
7
  import { test_unit_guard } from '#scripts/test/test-unit-guard'
7
8
  import { gate_log } from './gate-log'
@@ -31,6 +32,18 @@ interface GateStepResult extends BufferedProcessResult {
31
32
  // Set when the check was not started because its inputs match the record taken at this time
32
33
  // (`check-reuse.ts`).
33
34
  reused_at?: string | undefined
35
+ // The CPU milliseconds the check's process tree spent, where the gate could read it (`check-cpu.ts`).
36
+ cpu_ms?: number | undefined
37
+ // The check's place in the core budget, absent on a check that claimed none (`gate-run-steps.ts`).
38
+ claim?: CheckClaim | undefined
39
+ }
40
+
41
+ // The width a check asked the core budget for, the width it ran at and how long it waited for it, so
42
+ // whether a unit claim's wait for room paid off is read per run (joshuafolkken/kit#4451).
43
+ interface CheckClaim {
44
+ requested: number
45
+ granted: number
46
+ waited_ms: number
34
47
  }
35
48
 
36
49
  function is_gate_step_failed(result: GateStepResult): boolean {
@@ -147,7 +160,6 @@ function should_print_body(result: GateStepResult, is_verbose: boolean): boolean
147
160
  // Seconds to one decimal, which is the resolution the answer is read at: the question a gate's
148
161
  // timing answers is "which of the four is the long pole", and no check is ever separated from
149
162
  // another by less than a tenth of a second.
150
- const MS_PER_SECOND = 1000
151
163
  const SECONDS_DECIMALS = 1
152
164
 
153
165
  function format_seconds(elapsed_ms: number): string {
@@ -285,5 +297,5 @@ const gate_report = {
285
297
  report_gate_steps,
286
298
  }
287
299
 
288
- export type { GateReport, GateStep, GateStepResult }
300
+ export type { CheckClaim, GateReport, GateStep, GateStepResult }
289
301
  export { gate_report }
@@ -2,17 +2,24 @@ import { availableParallelism } from 'node:os'
2
2
  import { bounded_pool } from '#scripts/lib/bounded-pool'
3
3
  import { buffered_process } from '#scripts/lib/buffered-process'
4
4
  import { unit_worker_share } from '#scripts/test/unit-worker-share'
5
- import { core_budget } from './core-budget'
5
+ import { check_cpu, type CheckCpu } from './check-cpu'
6
+ import { core_budget, type Admission } from './core-budget'
7
+ import { free_cores } from './free-cores'
6
8
  import { gate_plan, type GatePlan } from './gate-plan'
7
- import type { GateStep, GateStepResult } from './gate-report'
8
- import { build_gate_step } from './gate-steps'
9
+ import type { CheckClaim, GateStep, GateStepResult } from './gate-report'
10
+ import { build_gate_step, with_granted_workers } from './gate-steps'
9
11
  import { project_checks } from './project-checks'
10
12
 
11
13
  // Running the gate's checks: each one under its place in the machine-wide budget, a reused one
12
14
  // (`check-reuse.ts`) without starting it. `verification-gate.ts` decides what runs and records the
13
15
  // outcome; this module only runs it.
14
16
 
15
- async function run_gate_step(step: GateStep): Promise<GateStepResult> {
17
+ // `cpu` is the gate's shared reader, so concurrent checks each take their own growth; a lone call
18
+ // reads its child alone from a baseline of its own.
19
+ async function run_gate_step(
20
+ step: GateStep,
21
+ cpu: CheckCpu = check_cpu.check_cpu_reader(),
22
+ ): Promise<GateStepResult> {
16
23
  if (step.skip_reason !== undefined) {
17
24
  return {
18
25
  label: step.label,
@@ -28,7 +35,7 @@ async function run_gate_step(step: GateStep): Promise<GateStepResult> {
28
35
  step.cwd === undefined ? {} : { cwd: step.cwd },
29
36
  )
30
37
 
31
- return { label: step.label, command: step.command_args.join(' '), ...result }
38
+ return { label: step.label, command: step.command_args.join(' '), ...result, cpu_ms: cpu() }
32
39
  }
33
40
 
34
41
  // This gate's share of the machine, resolved once at the gate's entry and carried down as one value.
@@ -55,6 +62,8 @@ interface ReservedStep {
55
62
  step: GateStep
56
63
  weight: number
57
64
  memory_mb: number
65
+ // The plan's `--maxWorkers` for the unit suite, the width the free memory bounds once it is admitted.
66
+ worker_cap: number | undefined
58
67
  // When the check's own green record was taken, for a check `check-reuse.ts` found reusable.
59
68
  reused_at: string | undefined
60
69
  }
@@ -72,6 +81,7 @@ async function build_reserved_steps(
72
81
  step: await build_gate_step(check, process.cwd(), plan),
73
82
  weight: gate_plan.check_weight(check, plan, available_cores),
74
83
  memory_mb: gate_plan.check_memory(check, plan, available_cores),
84
+ worker_cap: plan.unit_worker_cap,
75
85
  reused_at: reused.get(check.label),
76
86
  })),
77
87
  )
@@ -90,6 +100,34 @@ function reused_result(step: GateStep, reused_at: string): GateStepResult {
90
100
  }
91
101
  }
92
102
 
103
+ // What the check asked the budget for and what it ran at, for its ledger row (`gate-ledger.ts`).
104
+ function claim_of(requested: number, admission: Admission): CheckClaim {
105
+ return {
106
+ requested,
107
+ granted: admission.granted ?? requested,
108
+ waited_ms: admission.waited_ms ?? 0,
109
+ }
110
+ }
111
+
112
+ // **The unit step's width is bounded by the free memory too** (joshuafolkken/kit#4528). The plan's cap
113
+ // and the granted width are sized from the cores alone, and the `--maxWorkers` they become skips the
114
+ // guard's own reading (`test-unit-guard.ts`), so the memory is read here, once the claim is admitted
115
+ // and the suite is about to start. The free cores are not applied: the admission has already narrowed
116
+ // the claim to them (joshuafolkken/kit#4167).
117
+ async function admitted_step(
118
+ reserved: ReservedStep,
119
+ admission: Admission,
120
+ available_cores: number,
121
+ ): Promise<GateStep> {
122
+ if (reserved.step.label !== gate_plan.UNIT_LABEL) return reserved.step
123
+
124
+ const { memory_workers } = await free_cores.read({ available_cores })
125
+ const asked = admission.granted ?? reserved.worker_cap
126
+ const workers = unit_worker_share.cap_to_free(asked, memory_workers, available_cores)
127
+
128
+ return with_granted_workers(reserved.step, workers)
129
+ }
130
+
93
131
  // **A nested gate takes no reservation, and the budget is what makes that necessary rather than
94
132
  // merely tidy**. The unit step spawns the suite, which runs this repository's
95
133
  // own gate tests; each of those is a gate inside the outer gate's unit reservation, and a place it
@@ -98,20 +136,26 @@ function reused_result(step: GateStep, reused_at: string): GateStepResult {
98
136
  async function run_reserved_step(
99
137
  reserved: ReservedStep,
100
138
  budget: BudgetContext,
139
+ cpu: CheckCpu,
101
140
  ): Promise<GateStepResult> {
102
141
  if (reserved.reused_at !== undefined) return reused_result(reserved.step, reserved.reused_at)
103
- if (!budget.is_reserved) return await run_gate_step(reserved.step)
142
+ if (!budget.is_reserved) return await run_gate_step(reserved.step, cpu)
104
143
 
105
144
  return await core_budget.with_core_reservation(
106
145
  reserved.weight,
107
146
  async (admission) => ({
108
- ...(await run_gate_step(reserved.step)),
147
+ ...(await run_gate_step(
148
+ await admitted_step(reserved, admission, budget.available_cores),
149
+ cpu,
150
+ )),
109
151
  budget_note: core_budget.describe_overflow(admission),
152
+ claim: claim_of(reserved.weight, admission),
110
153
  }),
111
154
  {
112
155
  budget: budget.available_cores,
113
156
  memory_mb: reserved.memory_mb,
114
157
  command: `gate ${reserved.step.label}`,
158
+ is_unit: reserved.step.label === gate_plan.UNIT_LABEL,
115
159
  },
116
160
  )
117
161
  }
@@ -129,6 +173,7 @@ async function run_gate_steps(
129
173
  reused: ReusedChecks = new Map(),
130
174
  ): Promise<ReadonlyArray<GateStepResult>> {
131
175
  const reserved = await build_reserved_steps(plan, budget.available_cores, reused)
176
+ const cpu = check_cpu.check_cpu_reader()
132
177
 
133
178
  // **The checks run under the held mark, so a check's own dispatch claims nothing**.
134
179
  // Each check is a `pnpm josh <target>` child, and a target that declares
@@ -139,7 +184,7 @@ async function run_gate_steps(
139
184
  await bounded_pool.bounded_map(
140
185
  reserved,
141
186
  plan.concurrency,
142
- async (entry) => await run_reserved_step(entry, budget),
187
+ async (entry) => await run_reserved_step(entry, budget, cpu),
143
188
  ),
144
189
  )
145
190
  }
@@ -64,10 +64,19 @@ const FORCE_FLAG = '--force'
64
64
  // rewritten by the hook's own install each cost minutes before anyone could tell them apart.
65
65
  type GateReuse = { stamp: FileMapStamp } | { miss: string }
66
66
 
67
+ // The fingerprint of every declared check's tools and environment (`verification-inputs.ts`).
68
+ const INPUTS_MOVED = 'a checked tool or environment variable changed since the green gate'
69
+
67
70
  function base_moved(recorded: string | undefined, base: string): string {
68
71
  return `the merge base moved since the green gate (${recorded ?? 'none'} → ${base})`
69
72
  }
70
73
 
74
+ function stamp_miss(stamp: FileMapStamp, base: string): string | undefined {
75
+ if (stamp.base !== base) return base_moved(stamp.base, base)
76
+
77
+ return review_stamps.gate_stamp.describes_inputs(stamp) ? undefined : INPUTS_MOVED
78
+ }
79
+
71
80
  function gate_reuse(
72
81
  tree: Record<string, string>,
73
82
  base: string | undefined,
@@ -79,9 +88,10 @@ function gate_reuse(
79
88
  const stamp = review_brief.matching_stamp(review_stamps.gate_stamp.read(source), tree)
80
89
 
81
90
  if (stamp === undefined) return { miss: 'no green gate record matches the changed files' }
82
- if (stamp.base !== base) return { miss: base_moved(stamp.base, base) }
83
91
 
84
- return { stamp }
92
+ const miss = stamp_miss(stamp, base)
93
+
94
+ return miss === undefined ? { stamp } : { miss }
85
95
  }
86
96
 
87
97
  function stamp_of(reuse: GateReuse): FileMapStamp | undefined {
@@ -42,6 +42,17 @@ async function build_gate_step(
42
42
  return { label: check.label, command_args, cwd, skip_reason }
43
43
  }
44
44
 
45
+ // The unit step at a narrower worker count: the one its claim was admitted at past the wait cap
46
+ // (`core_admission.narrowed_weight`), or the one the free memory holds (`gate-run-steps.ts`). Any
47
+ // other step, or one left as asked, is returned unchanged.
48
+ function with_granted_workers(step: GateStep, granted: number | undefined): GateStep {
49
+ if (granted === undefined || step.label !== UNIT_LABEL) return step
50
+
51
+ const kept = step.command_args.filter((argument) => !argument.startsWith(`${UNIT_WORKER_FLAG}=`))
52
+
53
+ return { ...step, command_args: [...kept, `${UNIT_WORKER_FLAG}=${String(granted)}`] }
54
+ }
55
+
45
56
  async function build_gate_steps(
46
57
  start_directory: string,
47
58
  plan: GatePlan = gate_plan.resolve_gate_plan(),
@@ -51,4 +62,4 @@ async function build_gate_steps(
51
62
  )
52
63
  }
53
64
 
54
- export { build_gate_step, build_gate_steps, UNIT_WORKER_FLAG }
65
+ export { build_gate_step, build_gate_steps, UNIT_WORKER_FLAG, with_granted_workers }
@@ -0,0 +1,42 @@
1
+ import { readFileSync } from 'node:fs'
2
+ import path from 'node:path'
3
+ import { stamp_file } from '#scripts/josh/stamp-file'
4
+
5
+ // **The one fingerprint every kept result is computed with** (joshuafolkken/kit#4497). A reuse of a
6
+ // verdict holds only while what it read holds, and each reader of a verdict once computed that on its
7
+ // own — the ESLint cache's import closure, the test-read map's dirty files, the gate's tool versions —
8
+ // so a miss in one (joshuafolkken/kit#4407, #4415, #4423, #4425) was a miss nowhere else. Every one now
9
+ // digests a file, a set of files and a set of named entries here.
10
+
11
+ // The digest of a path that does not exist, or cannot be read, so it still differs from any content.
12
+ const ABSENT = 'absent'
13
+
14
+ function of_content(content: Buffer | string): string {
15
+ return stamp_file.digest(content)
16
+ }
17
+
18
+ // One digest over `entries`, independent of their order.
19
+ function of_entries(entries: Iterable<string>): string {
20
+ return of_content([...entries].toSorted((left, right) => left.localeCompare(right)).join('\n'))
21
+ }
22
+
23
+ function of_file(file_path: string): string {
24
+ try {
25
+ return of_content(readFileSync(file_path))
26
+ } catch {
27
+ return ABSENT
28
+ }
29
+ }
30
+
31
+ // Each of `relatives` (relative to `root`) keyed to the digest of its content, in path order.
32
+ function of_files(root: string, relatives: Iterable<string>): Record<string, string> {
33
+ const sorted = [...new Set(relatives)].toSorted((left, right) => left.localeCompare(right))
34
+
35
+ return Object.fromEntries(
36
+ sorted.map((relative) => [relative, of_file(path.join(root, relative))]),
37
+ )
38
+ }
39
+
40
+ const input_fingerprint = { ABSENT, of_entries, of_file, of_files }
41
+
42
+ export { input_fingerprint }