@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
@@ -2,16 +2,14 @@
2
2
  import { parseArgs } from 'node:util'
3
3
  import { git_branch } from '#scripts/git/git-branch'
4
4
  import { git_error } from '#scripts/git/git-error'
5
- import { issue_number_shape } from '#scripts/issue/issue-number-shape'
6
- import { issue_watch_gate } from '#scripts/issue/issue-watch-gate'
7
5
  import { cli_body } from '#scripts/josh/cli-body'
8
6
  import { josh_environment_file } from '#scripts/josh/josh-environment-file'
9
7
  import { git_notify, type GitNotifyConfig } from '#scripts/notify/git-notify'
10
8
  import { acceptance_map_check } from '#scripts/review/acceptance-map-check'
11
9
  import { live_evidence } from '#scripts/review/live-evidence'
12
- import { review_attest } from '#scripts/review/review-attest'
13
- import { review_record } from '#scripts/review/review-record'
10
+ import { removed_tests_check } from '#scripts/review/removed-tests-check'
14
11
  import { parse_issue_number_from_text } from './followup-issue-number'
12
+ import { followup_review_gates } from './followup-review-gates'
15
13
  import { git_followup_finish } from './git-followup-finish'
16
14
  import { git_followup_flush } from './git-followup-flush'
17
15
  import { git_followup_merged, type MergePlan } from './git-followup-merged'
@@ -121,66 +119,7 @@ function is_merge_resolved(values: CliArguments['values']): boolean {
121
119
  return values['no-merge'] !== true
122
120
  }
123
121
 
124
- // `/code-review` is forked by the harness and inherits the *session's* working directory, so a run
125
- // implementing in a lane can be reviewed against a different tree entirely — one holding the
126
- // previous child's already-merged code. That review finds nothing wrong and says so, and the run
127
- // would read the silence as a clean round. **This is the seam where that is caught**: a merge is
128
- // refused unless the review attested the checkout it was briefed on.
129
- //
130
- // **Absence is a refusal, not a pass.** The defect produces *no* signal, so a check that only
131
- // compared two present records would answer `ok` in exactly the state it exists to catch.
132
- //
133
- // **Scoped to a checkout that actually briefed a review.** `review_attest.check` answers
134
- // `not-required` where no `josh review:brief` was run here inside a run's lifetime, so a project or
135
- // a flow that does not use the brief merges exactly as it did before.
136
- //
137
- // The direction is deliberate: a wrongly-refused merge costs one re-run of the review, and a wrongly
138
- // allowed one ships a diff nobody read. Thrown rather than reported, so no `completion` Telegram is
139
- // sent and nothing merges — `git_pr_followup.run` is never reached.
140
- // `ok` means the guard was satisfied and `not-required` means it never applied to this checkout —
141
- // both let the merge proceed, so the two gates below read the verdict through one predicate rather
142
- // than repeating the pair of statuses.
143
- function is_merge_permitted(status: string): boolean {
144
- return status === 'ok' || status === 'not-required'
145
- }
146
-
147
- function is_valid_issue(issue_number: string | undefined): issue_number is string {
148
- return issue_number !== undefined && issue_number_shape.ISSUE_NUMBER_PATTERN.test(issue_number)
149
- }
150
-
151
- async function assert_review_attested(should_merge: boolean): Promise<void> {
152
- if (!should_merge) return
153
-
154
- const verdict = await review_attest.check_here()
155
-
156
- if (!is_merge_permitted(verdict.status)) throw new Error(review_attest.refusal_message(verdict))
157
-
158
- const refusal = await issue_watch_gate.review_refusal_here()
159
-
160
- if (refusal !== undefined) throw new Error(refusal)
161
- }
162
-
163
- // Recording a review round as a prose request leaves the recurrence ledger blind whenever it is
164
- // skipped. **This is the seam where it is a gate instead**: a merge is refused unless the round left
165
- // a `- rf:` line for its issue, a zero-finding `none` line included.
166
- //
167
- // **Absence is a refusal, `missing` exactly as `assert_review_attested`'s is** — the defect this
168
- // exists for produces *no* line, so silence must not read as success. A checkout that keeps no ledger
169
- // answers `not-required` and merges as before, and a run whose issue the followup cannot identify has
170
- // no key to check, so it carries on rather than blocking on missing information.
171
- async function assert_review_recorded(
172
- should_merge: boolean,
173
- issue_number: string | undefined,
174
- ): Promise<void> {
175
- if (!should_merge || !is_valid_issue(issue_number)) return
176
-
177
- const issue = Number(issue_number)
178
- const verdict = await review_record.check(issue)
179
-
180
- if (is_merge_permitted(verdict.status)) return
181
-
182
- throw new Error(review_record.refusal_message(issue))
183
- }
122
+ const { assert_review_attested, assert_review_recorded, is_valid_issue } = followup_review_gates
184
123
 
185
124
  // A runtime change merges only with its acceptance criteria run for real and
186
125
  // recorded in the pull request body — `live_evidence` carries the why. `exempt` (no runtime path
@@ -210,6 +149,20 @@ async function assert_acceptance_mapped(
210
149
  if (refusal !== undefined) throw new Error(refusal)
211
150
  }
212
151
 
152
+ // Every test the change removes is disposed of in the pull request body — `removed_tests` carries the
153
+ // why. It reads this checkout's diff, which `assert_live_evidence` has already refused to read for a
154
+ // branch other than the one checked out.
155
+ async function assert_removed_tests_disposed(
156
+ should_merge: boolean,
157
+ branch_name: string,
158
+ ): Promise<void> {
159
+ if (!should_merge) return
160
+
161
+ const refusal = await removed_tests_check.refusal(branch_name)
162
+
163
+ if (refusal !== undefined) throw new Error(refusal)
164
+ }
165
+
213
166
  // Every pre-merge refusal, in order — each one throws, so nothing merges past the first that fails.
214
167
  async function assert_merge_gates(
215
168
  should_merge: boolean,
@@ -220,6 +173,7 @@ async function assert_merge_gates(
220
173
  await assert_review_recorded(should_merge, issue_number)
221
174
  await assert_live_evidence(should_merge, branch_name)
222
175
  await assert_acceptance_mapped(should_merge, issue_number, branch_name)
176
+ await assert_removed_tests_disposed(should_merge, branch_name)
223
177
  }
224
178
 
225
179
  // After the gates, before the CI wait: a line appended since the run's commit rides the pull request
@@ -280,8 +234,7 @@ try {
280
234
  const git_followup_workflow = {
281
235
  assert_acceptance_mapped,
282
236
  assert_live_evidence,
283
- assert_review_attested,
284
- assert_review_recorded,
237
+ assert_removed_tests_disposed,
285
238
  parse_issue_number_from_text,
286
239
  prepare_merge,
287
240
  resolve_branch_name,
@@ -1,5 +1,8 @@
1
1
  import { epic_close } from '#scripts/epic/epic-close'
2
2
  import { git_gh_command } from '#scripts/gh/git-gh-command'
3
+ import type { PrStateSnapshot } from '#scripts/gh/git-pr-checks'
4
+ import { git_pr_merge_checked, type WaitForGreen } from '#scripts/gh/git-pr-merge-checked'
5
+ import { issue_body_or_comment } from '#scripts/issue/issue-body-or-comment'
3
6
  import { issue_watch_gate } from '#scripts/issue/issue-watch-gate'
4
7
  import { git_notify, type GitNotifyConfig } from '#scripts/notify/git-notify'
5
8
  import { git_followup_cleanup } from './git-followup-cleanup'
@@ -40,6 +43,10 @@ interface WrapupInput {
40
43
  // already on the issue does not post it twice (`git-followup-merged.ts`).
41
44
  is_merged?: boolean | undefined
42
45
  is_completion_recorded?: boolean | undefined
46
+ // The snapshot the merge gate passed, whose head the merge names, and the wait to go back to when
47
+ // that head moved before the merge (`git-pr-merge-checked.ts`, #4036).
48
+ checked?: PrStateSnapshot | undefined
49
+ wait_for_green: WaitForGreen
43
50
  }
44
51
 
45
52
  function build_notify_body(input: {
@@ -57,12 +64,6 @@ function build_notify_body(input: {
57
64
  })
58
65
  }
59
66
 
60
- function is_blank_issue_body(body: string | undefined): boolean {
61
- if (body === undefined) return true
62
-
63
- return body.trim().length === 0
64
- }
65
-
66
67
  async function post_notify_issue(input: {
67
68
  issue_number: string | undefined
68
69
  body: string
@@ -71,12 +72,7 @@ async function post_notify_issue(input: {
71
72
  throw new Error('Issue number is required for issue notification.')
72
73
  }
73
74
 
74
- const current_body = await git_gh_command.issue_get_body(input.issue_number)
75
- const should_edit_body = current_body !== undefined && is_blank_issue_body(current_body)
76
-
77
- await (should_edit_body
78
- ? git_gh_command.issue_edit_body(input.issue_number, input.body)
79
- : git_gh_command.issue_comment(input.issue_number, input.body))
75
+ await issue_body_or_comment.post(input.issue_number, input.body)
80
76
  }
81
77
 
82
78
  function should_notify_pr(target: GitNotifyConfig['target']): boolean {
@@ -239,7 +235,7 @@ async function run_tail_steps(input: WrapupInput): Promise<void> {
239
235
  async function run_wrapup(input: WrapupInput, log: StageLog): Promise<void> {
240
236
  if (input.should_merge && input.is_merged !== true) {
241
237
  await issue_watch_gate.assert_read_here()
242
- await git_gh_command.pr_merge(input.branch_name)
238
+ await git_pr_merge_checked.merge_checked(input)
243
239
  lap(log, STAGE.merge)
244
240
  }
245
241
 
@@ -256,7 +252,6 @@ export {
256
252
  git_pr_followup_wrapup,
257
253
  post_notify_issue,
258
254
  post_completion_notification,
259
- is_blank_issue_body,
260
255
  build_notify_body,
261
256
  }
262
257
  export type { WrapupInput }
@@ -1,7 +1,9 @@
1
1
  import { git_gh_command } from '#scripts/gh/git-gh-command'
2
2
  import { git_pr_ai_review, type TelegramContext } from '#scripts/gh/git-pr-ai-review'
3
+ import type { PrStateSnapshot } from '#scripts/gh/git-pr-checks'
3
4
  import { git_pr_coderabbit } from '#scripts/gh/git-pr-coderabbit'
4
5
  import { git_pr_managed_config } from '#scripts/gh/git-pr-managed-config'
6
+ import type { WaitForGreen } from '#scripts/gh/git-pr-merge-checked'
5
7
  import { github_issue_url } from '#scripts/gh/github-issue-url'
6
8
  import { git_closes_keyword } from '#scripts/git/git-closes-keyword'
7
9
  import type { GitNotifyConfig } from '#scripts/notify/git-notify'
@@ -11,6 +13,7 @@ import {
11
13
  type TelegramTaskType,
12
14
  } from '#scripts/notify/telegram-notify'
13
15
  import { followup_checks_event } from './followup-checks-event'
16
+ import { followup_coderabbit_wait } from './followup-coderabbit-wait'
14
17
  import { git_followup_merged } from './git-followup-merged'
15
18
  import { git_followup_pending } from './git-followup-pending'
16
19
  import { git_followup_stages, type StageLog } from './git-followup-stages'
@@ -226,22 +229,45 @@ async function run_comment_scans(
226
229
  // different destinations: every note reaches the completion notification, and this one alone also
227
230
  // reaches the completion report posted to the Issue. Returning it twice is
228
231
  // what lets `run_stages` hand each destination what belongs to it without re-deriving the answer.
232
+ //
233
+ // **The snapshot travels on to the merge**, which names its head, and the same wait is what the merge
234
+ // goes back to when that head moved before it (#4036).
235
+ interface ReviewChecks {
236
+ notes: Array<string>
237
+ managed: Array<string>
238
+ snapshot?: PrStateSnapshot
239
+ }
240
+
241
+ function wait_for_green_of(
242
+ input: FollowupInput,
243
+ context: TelegramContext,
244
+ issue_number: string | undefined,
245
+ log: StageLog,
246
+ ): WaitForGreen {
247
+ return async function wait_for_green(): Promise<PrStateSnapshot> {
248
+ return await run_checks({
249
+ branch_name: input.branch_name,
250
+ is_skip_watch: input.is_skip_watch,
251
+ observe: followup_coderabbit_wait.both(
252
+ followup_checks_event.observer_of(issue_number, context.pr_url),
253
+ followup_coderabbit_wait.observer_of(log.coderabbit),
254
+ ),
255
+ })
256
+ }
257
+ }
258
+
229
259
  async function run_review_checks(
230
260
  input: FollowupInput,
231
261
  context: TelegramContext,
232
262
  log: StageLog,
233
263
  issue_number: string | undefined,
234
- ): Promise<{ notes: Array<string>; managed: Array<string> }> {
264
+ ): Promise<ReviewChecks> {
235
265
  if (input.is_merged === true) return { notes: [], managed: [] }
236
266
 
237
267
  const managed = await git_pr_managed_config.handle_managed_config_changes({
238
268
  should_merge: input.should_merge,
239
269
  })
240
- const snapshot = await run_checks({
241
- branch_name: input.branch_name,
242
- is_skip_watch: input.is_skip_watch,
243
- observe: followup_checks_event.observer_of(issue_number, context.pr_url),
244
- })
270
+ const snapshot = await wait_for_green_of(input, context, issue_number, log)()
245
271
 
246
272
  lap(log, STAGE.checks_wait)
247
273
  const check_notes = read_coderabbit_skip_notes(snapshot)
@@ -249,7 +275,7 @@ async function run_review_checks(
249
275
  log_skip_notes(check_notes)
250
276
  const scan_notes = await run_comment_scans(input, context, log)
251
277
 
252
- return { notes: [...managed, ...check_notes, ...scan_notes], managed }
278
+ return { notes: [...managed, ...check_notes, ...scan_notes], managed, snapshot }
253
279
  }
254
280
 
255
281
  // **A tail re-run after a merge does not report twice**: where the issue
@@ -296,6 +322,8 @@ async function run_stages(input: FollowupInput, log: StageLog): Promise<string |
296
322
  managed_notes: checks.managed,
297
323
  is_merged: input.is_merged,
298
324
  is_completion_recorded,
325
+ checked: checks.snapshot,
326
+ wait_for_green: wait_for_green_of(input, context, issue_number, log),
299
327
  },
300
328
  log,
301
329
  )
@@ -319,7 +347,7 @@ async function run(input: FollowupInput): Promise<string | undefined> {
319
347
  throw error
320
348
  } finally {
321
349
  git_followup_stages.print_stages(log)
322
- await git_followup_stages.record_ci_wait(log)
350
+ await git_followup_stages.record_waits(log)
323
351
  }
324
352
  }
325
353
 
@@ -24,7 +24,7 @@ const USAGE =
24
24
  'Usage: josh fresh:run <pattern> | --spec <file.json> [--package-version <version>] [--log-dir <dir>] [--rebuild] | --list'
25
25
  // The scratch directory kit's distributed `.gitignore` already ignores, so a log is never committed
26
26
  // from kit or from a consumer toolkit.
27
- const DEFAULT_LOG_DIRECTORY = '.claude/tmp/fresh-machine'
27
+ const DEFAULT_LOG_DIRECTORY = '.josh/tmp/fresh-machine'
28
28
  const NO_GITHUB_TOKEN =
29
29
  'This scenario uses GitHub and `gh auth token` printed no token. Run `gh auth login` on this machine first.'
30
30
  const NO_CLAUDE_TOKEN = `This scenario uses Claude Code and neither the macOS keychain nor ${claude_token.VARIABLE} holds a token. ${claude_token.SETUP_HINT}`
@@ -4,13 +4,14 @@ import {
4
4
  mkdirSync,
5
5
  mkdtempSync,
6
6
  readdirSync,
7
- readFileSync,
8
7
  rmSync,
9
8
  writeFileSync,
10
9
  } from 'node:fs'
11
10
  import os from 'node:os'
12
11
  import path from 'node:path'
13
12
  import { PROJECT_ROOT } from '#scripts/init/init-paths'
13
+ import { package_manifest } from '#scripts/lib/package-manifest'
14
+ import { npm_registry } from '#scripts/version/npm-registry'
14
15
  import { execa, type Options } from 'execa'
15
16
  import { z } from 'zod'
16
17
  import { fresh_machine_docker, type ContainerRun } from './fresh-machine-docker'
@@ -133,19 +134,18 @@ async function pack(pack_directory: string, write: Write): Promise<string> {
133
134
  }
134
135
 
135
136
  function package_name(): string {
136
- const manifest = readFileSync(path.join(PROJECT_ROOT, 'package.json'), 'utf8')
137
-
138
- return MANIFEST_SCHEMA.parse(JSON.parse(manifest)).name
137
+ return package_manifest.read_manifest(PROJECT_ROOT, MANIFEST_SCHEMA).name
139
138
  }
140
139
 
141
140
  // The published version is always written out in the log and the install command, so a run can be
142
141
  // repeated against the same release; without `--package-version` it is the registry's latest.
143
- async function published_version(requested: string | undefined): Promise<string> {
142
+ function published_version(requested: string | undefined): string {
144
143
  if (requested !== undefined) return requested
145
144
 
146
- const { stdout } = await execa(PNPM, ['view', package_name(), 'version'], { cwd: PROJECT_ROOT })
145
+ const answer = npm_registry.view(package_name(), 'version')
146
+ if (answer.exit_code !== 0) throw new Error('the registry did not answer the latest version')
147
147
 
148
- return stdout.trim()
148
+ return answer.stdout.trim()
149
149
  }
150
150
 
151
151
  async function container_run(
@@ -163,7 +163,7 @@ async function container_run(
163
163
  seed_directory: staged.seed_directory,
164
164
  pack_directory: staged.pack_directory,
165
165
  tarball: is_tarball ? await pack(staged.pack_directory, write) : undefined,
166
- package_version: is_tarball ? undefined : await published_version(request.package_version),
166
+ package_version: is_tarball ? undefined : published_version(request.package_version),
167
167
  secret_names: Object.keys(request.secrets),
168
168
  }
169
169
  }
@@ -12,7 +12,7 @@
12
12
  "printf '{ \"private\": true }\\n' > package.json",
13
13
  "cp \"$PACKAGE_TARBALL\" . && pnpm add -D --allow-build=esbuild --allow-build=unrs-resolver \"./$(basename \"$PACKAGE_TARBALL\")\"",
14
14
  "pnpm exec josh start --yes --github",
15
- "gh label list --limit 100 --json name --jq '.[].name' > \"$HOME/labels.txt\"; grep -xE 'auto-ok|needs-decision|needs-human-review|already-done|review-round2-skipped|bug' \"$HOME/labels.txt\"; test \"$(grep -cxE 'auto-ok|needs-decision|needs-human-review|already-done|review-round2-skipped|bug' \"$HOME/labels.txt\")\" -eq 6",
15
+ "gh label list --limit 100 --json name --jq '.[].name' > \"$HOME/labels.txt\"; grep -xE 'auto-ok|needs-decision|needs-human-review|already-done|bug' \"$HOME/labels.txt\"; test \"$(grep -cxE 'auto-ok|needs-decision|needs-human-review|already-done|bug' \"$HOME/labels.txt\")\" -eq 5",
16
16
  "curl -fsSL https://claude.ai/install.sh | bash && export PATH=\"$HOME/.local/bin:$PATH\" && claude --version",
17
17
  "gh issue create --title 'Add a heading to index.html' --body 'Add an h2 under the h1.' --label auto-ok --label run:lane",
18
18
  "timeout 60 pnpm josh backlogrun > \"$HOME/backlogrun.out\" 2>&1; cat \"$HOME/backlogrun.out\"; grep -q '^backlogrun: started' \"$HOME/backlogrun.out\"",
@@ -0,0 +1,58 @@
1
+ import type { MachineReading } from './machine-capacity'
2
+
3
+ // **The busy cores a waiting claim admits against are the mean of its last few seconds of readings**
4
+ // (joshuafolkken/kit#4238). One reading covers a 250 ms window, and a CPU near saturation swings across
5
+ // the threshold from one window to the next, so a claim judged on each reading alone would be admitted
6
+ // on a dip into load that is still there. A claim's readings are its own: each poll of one wait adds
7
+ // one, and its first poll judges on the one it has.
8
+ //
9
+ // **What is averaged is the load outside the ledger, each sample against the ledger of its own
10
+ // moment.** Averaging the raw busy cores and subtracting the ledger of now would count a claim released
11
+ // inside the window as external load: its cores would linger in the mean after leaving the ledger.
12
+
13
+ // Long enough to hold about ten polls of a waiting claim, short enough that a CPU freed a moment ago is
14
+ // admitted against within seconds.
15
+ const AVERAGE_WINDOW_MS = 3000
16
+
17
+ interface BusySample {
18
+ at: number
19
+ external_cores: number
20
+ }
21
+
22
+ // The samples still inside the window once `reading` taken at `now`, against a ledger holding
23
+ // `ledger_cores`, is added. An unread reading adds nothing: where the machine cannot be read, nothing
24
+ // is averaged.
25
+ function with_reading(
26
+ samples: ReadonlyArray<BusySample>,
27
+ reading: MachineReading,
28
+ ledger_cores: number,
29
+ now: number,
30
+ ): Array<BusySample> {
31
+ const kept = samples.filter((sample) => now - sample.at < AVERAGE_WINDOW_MS)
32
+ const { busy_cores } = reading
33
+
34
+ if (busy_cores === undefined) return kept
35
+
36
+ return [...kept, { at: now, external_cores: Math.max(0, busy_cores - ledger_cores) }]
37
+ }
38
+
39
+ // `reading` with its busy cores replaced by the mean load outside the ledger on top of the ledger's
40
+ // `ledger_cores` now, or unchanged when none were read.
41
+ function averaged(
42
+ reading: MachineReading,
43
+ samples: ReadonlyArray<BusySample>,
44
+ ledger_cores: number,
45
+ ): MachineReading {
46
+ if (reading.busy_cores === undefined || samples.length === 0) return reading
47
+
48
+ let total = 0
49
+
50
+ for (const sample of samples) total += sample.external_cores
51
+
52
+ return { ...reading, busy_cores: ledger_cores + total / samples.length }
53
+ }
54
+
55
+ const busy_average = { AVERAGE_WINDOW_MS, averaged, with_reading }
56
+
57
+ export type { BusySample }
58
+ export { busy_average }
@@ -0,0 +1,60 @@
1
+ import {
2
+ run_board_usage_rusage,
3
+ type RusageReader,
4
+ } from '#scripts/run/board/run-board-usage-rusage'
5
+
6
+ // **The CPU a check's process tree spent, read off the gate's own reaped-children time**
7
+ // (joshuafolkken/kit#4362). Each check is a `pnpm josh <target>` child that waits for its tool before it
8
+ // exits, so once the gate has reaped it the whole tree's CPU sits in the gate's `proc_pid_rusage`
9
+ // child times (`run-board-usage-rusage.ts`, shared rather than read twice). The reader folds the
10
+ // gate's own time in, so `process.cpuUsage()` takes it back out, and each finished check takes the
11
+ // growth since the previous one finished.
12
+ //
13
+ // **A reading is an attribution, not an isolation**: any other child the gate reaped in between — a
14
+ // `ps` sample, a git call — lands on the next check that finishes, and two checks reaped in one tick
15
+ // split their CPU unevenly. Both are small beside a check's tools. Off macOS, or without `node:ffi`,
16
+ // there is no reader and every check records none.
17
+
18
+ const US_PER_MS = 1000
19
+
20
+ // The CPU milliseconds spent by the children reaped since the previous call, `undefined` where the
21
+ // gate's own usage cannot be read.
22
+ type CheckCpu = () => number | undefined
23
+
24
+ function own_cpu_ms(): number {
25
+ const usage = process.cpuUsage()
26
+
27
+ return (usage.user + usage.system) / US_PER_MS
28
+ }
29
+
30
+ function reaped_cpu_ms(read: RusageReader | undefined, pid: number): number | undefined {
31
+ const reading = read?.(pid)
32
+
33
+ return reading === undefined ? undefined : reading.cpu_ms - own_cpu_ms()
34
+ }
35
+
36
+ // One gate's reader, its baseline taken now — before any check is reaped.
37
+ function check_cpu_reader(
38
+ read: RusageReader | undefined = run_board_usage_rusage.rusage_reader(
39
+ process.platform,
40
+ run_board_usage_rusage.load_builtin,
41
+ ),
42
+ pid: number = process.pid,
43
+ ): CheckCpu {
44
+ const previous = { reaped_ms: reaped_cpu_ms(read, pid) }
45
+
46
+ return function since_previous(): number | undefined {
47
+ const reaped_ms = reaped_cpu_ms(read, pid)
48
+ const before = previous.reaped_ms
49
+
50
+ previous.reaped_ms = reaped_ms
51
+ if (reaped_ms === undefined || before === undefined) return undefined
52
+
53
+ return Math.max(0, reaped_ms - before)
54
+ }
55
+ }
56
+
57
+ const check_cpu = { check_cpu_reader }
58
+
59
+ export type { CheckCpu }
60
+ export { check_cpu }
@@ -1,85 +1,24 @@
1
1
  import path from 'node:path'
2
- import { lint_related_scope } from '#scripts/lint/lint-related-scope'
3
- import { gate_plan } from './gate-plan'
4
-
5
- // Which paths each gate check reads, so a gate re-run reuses a check none of whose inputs moved
6
- // (`check-reuse.ts`). **A check with no scope here always runs**: `cspell` reads every
7
- // text file, the unit suite reads documents and fixtures as well as code, `behavior` reads a transcript
8
- // outside the tree and `metrics` reads whatever it measures. Naming a scope for any of them would be a
9
- // guess, and a wrong guess is a check reported green without having run.
10
- //
11
- // **The scopes over-approximate, never under**: a path in doubt is an input. `check` and `exports`
12
- // read source modules and the JSON they import. `lint` is prettier plus eslint, so its inputs are those
13
- // sources plus every file prettier formats — the extensions `lint:related` already selects, less what
14
- // prettier's own ignore files leave out (`.claude/**/*.md`). Prettier answers that itself through
15
- // `getFileInfo`, so the two ignore files stay the single source.
2
+ import { PROJECT_ROOT } from '#scripts/init/init-paths'
3
+ import { test_related } from '#scripts/test/test-related'
4
+ import {
5
+ verification_inputs,
6
+ type InputDeclaration,
7
+ type PrettierIgnored,
8
+ } from './verification-inputs'
9
+
10
+ // The file-level answer of a check's declaration (`verification-inputs.ts`): whether any of the paths
11
+ // that moved is one the check reads, so a gate re-run reuses a check none of whose inputs moved
12
+ // (`check-reuse.ts`). It lives apart from the declarations because following imports reads the
13
+ // test-read map (`test-related.ts`), whose own since-green narrowing reads the declarations.
16
14
  //
17
- // **A configuration file is an input of every scoped check**: a manifest or lock file moves the
18
- // installed toolchain, and an ignore or editor file moves what prettier reads.
19
-
20
- const SOURCE_EXTENSIONS: ReadonlySet<string> = new Set([
21
- '.ts',
22
- '.tsx',
23
- '.mts',
24
- '.cts',
25
- '.js',
26
- '.jsx',
27
- '.mjs',
28
- '.cjs',
29
- '.svelte',
30
- '.vue',
31
- '.json',
32
- '.jsonc',
33
- ])
34
-
35
- const GIT_IGNORE = '.gitignore'
36
- const PRETTIER_IGNORE = '.prettierignore'
37
- const PRETTIER_IGNORE_FILES = [GIT_IGNORE, PRETTIER_IGNORE] as const
38
-
39
- const CONFIG_FILES: ReadonlySet<string> = new Set([
40
- 'package.json',
41
- 'pnpm-lock.yaml',
42
- 'pnpm-workspace.yaml',
43
- 'package-lock.json',
44
- 'yarn.lock',
45
- 'bun.lock',
46
- 'bun.lockb',
47
- '.npmrc',
48
- '.editorconfig',
49
- ...PRETTIER_IGNORE_FILES,
50
- ])
51
-
52
- const PRETTIER_CONFIG_PREFIX = '.prettierrc'
53
-
54
- // Whether prettier would leave `relative` out; `false` when prettier cannot be asked, which keeps the
55
- // path an input.
56
- type PrettierIgnored = (relative: string) => Promise<boolean>
57
-
58
- type InputTest = (relative: string, is_ignored: PrettierIgnored) => Promise<boolean>
59
-
60
- function is_config(relative: string): boolean {
61
- const name = path.basename(relative)
62
-
63
- return CONFIG_FILES.has(name) || name.startsWith(PRETTIER_CONFIG_PREFIX)
64
- }
65
-
66
- function is_source(relative: string): boolean {
67
- return SOURCE_EXTENSIONS.has(path.extname(relative))
68
- }
69
-
70
- async function is_lint_input(relative: string, is_ignored: PrettierIgnored): Promise<boolean> {
71
- if (is_source(relative)) return true
72
- if (!lint_related_scope.is_lintable(relative)) return false
73
-
74
- return !(await is_ignored(relative))
75
- }
76
-
77
- async function is_source_input(relative: string): Promise<boolean> {
78
- return is_source(relative)
79
- }
15
+ // **The unit step's inputs are the test-read map's, not a guess** (joshuafolkken/kit#4314): it is
16
+ // reusable only when `josh test:related` would run no test for what moved — every moved file one no
17
+ // recorded test reads. No map, or one recorded on a tree git can no longer diff against, reaches every
18
+ // test, so the step runs.
80
19
 
81
20
  function prettier_ignored(root: string): PrettierIgnored {
82
- const ignore_path = PRETTIER_IGNORE_FILES.map((name) => path.join(root, name))
21
+ const ignore_path = verification_inputs.PRETTIER_IGNORE_FILES.map((name) => path.join(root, name))
83
22
 
84
23
  return async function is_ignored(relative: string): Promise<boolean> {
85
24
  try {
@@ -95,35 +34,40 @@ function prettier_ignored(root: string): PrettierIgnored {
95
34
  }
96
35
  }
97
36
 
98
- const SCOPES: ReadonlyMap<string, InputTest> = new Map([
99
- [gate_plan.LINT_LABEL, is_lint_input],
100
- [gate_plan.TYPE_CHECK_LABEL, is_source_input],
101
- [gate_plan.EXPORTS_LABEL, is_source_input],
102
- ])
37
+ async function reads_any(
38
+ declaration: InputDeclaration,
39
+ paths: ReadonlyArray<string>,
40
+ is_ignored: PrettierIgnored,
41
+ root: string,
42
+ ): Promise<boolean> {
43
+ if (declaration.reads === 'recorded') return await test_related.reaches_tests(root, paths)
44
+
45
+ const { is_input } = declaration
103
46
 
104
- function is_scoped(label: string): boolean {
105
- return SCOPES.has(label)
47
+ if (is_input === undefined) return true
48
+
49
+ const answers = await Promise.all(
50
+ paths.map(async (relative) => await is_input(relative, is_ignored)),
51
+ )
52
+
53
+ return answers.includes(true)
106
54
  }
107
55
 
108
- // Whether any of `paths` (repository-root relative) is an input of the check `label`. An unscoped
56
+ // Whether any of `paths` (repository-root relative) is an input of the check `label`. An undeclared
109
57
  // check answers `true` for every set of paths, so the only way to reuse it is never.
110
58
  async function touches_inputs(
111
59
  label: string,
112
60
  paths: ReadonlyArray<string>,
113
61
  is_ignored: PrettierIgnored,
62
+ root: string = PROJECT_ROOT,
114
63
  ): Promise<boolean> {
115
- const scope = SCOPES.get(label)
64
+ const declaration = verification_inputs.declaration_of(label)
116
65
 
117
- if (scope === undefined || paths.some((relative) => is_config(relative))) return true
66
+ if (declaration === undefined || verification_inputs.configures(label, paths)) return true
118
67
 
119
- const answers = await Promise.all(
120
- paths.map(async (relative) => await scope(relative, is_ignored)),
121
- )
122
-
123
- return answers.includes(true)
68
+ return await reads_any(declaration, paths, is_ignored, root)
124
69
  }
125
70
 
126
- const check_inputs = { is_scoped, prettier_ignored, touches_inputs }
71
+ const check_inputs = { prettier_ignored, touches_inputs }
127
72
 
128
- export type { PrettierIgnored }
129
73
  export { check_inputs }