@joshuafolkken/kit 1.1229.0 → 1.1370.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 (939) hide show
  1. package/.claude/agents/investigator.md +1 -0
  2. package/.claude/settings.json +4 -0
  3. package/.claude/skills/dependency-update/SKILL.md +5 -3
  4. package/.claude/skills/epic-commands/SKILL.md +82 -113
  5. package/.claude/skills/epic-commands/epic-bundle.md +38 -63
  6. package/.claude/skills/epic-commands/execution-waves.md +30 -51
  7. package/.claude/skills/verify-ui/SKILL.md +13 -20
  8. package/.claude/skills/workflow-commands/SKILL.md +10 -10
  9. package/.claude/skills/workflow-commands/background-commands.md +4 -4
  10. package/.claude/skills/workflow-commands/backlogrun-child.md +30 -105
  11. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +29 -0
  12. package/.claude/skills/workflow-commands/backlogrun-lanes.md +45 -131
  13. package/.claude/skills/workflow-commands/backlogrun-park.md +36 -53
  14. package/.claude/skills/workflow-commands/backlogrun-progress.md +81 -331
  15. package/.claude/skills/workflow-commands/backlogrun-recovery.md +29 -83
  16. package/.claude/skills/workflow-commands/backlogrun-steps.md +105 -424
  17. package/.claude/skills/workflow-commands/backlogrun.md +50 -61
  18. package/.claude/skills/workflow-commands/chain-rule.md +36 -40
  19. package/.claude/skills/workflow-commands/entry-sequence.md +6 -6
  20. package/.claude/skills/workflow-commands/followup.md +24 -20
  21. package/.claude/skills/workflow-commands/fullrun-steps.md +23 -27
  22. package/.claude/skills/workflow-commands/fullrun.md +10 -10
  23. package/.claude/skills/workflow-commands/halfrun.md +9 -8
  24. package/.claude/skills/workflow-commands/into-target.md +12 -18
  25. package/.claude/skills/workflow-commands/issue-comments.md +11 -26
  26. package/.claude/skills/workflow-commands/kickoff.md +27 -16
  27. package/.claude/skills/workflow-commands/latest-gate.md +18 -29
  28. package/.claude/skills/workflow-commands/needs-human-review.md +13 -24
  29. package/.claude/skills/workflow-commands/observation-filing.md +37 -28
  30. package/.claude/skills/workflow-commands/observation-ledger.md +48 -38
  31. package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -9
  32. package/.claude/skills/workflow-commands/prerequisite.md +23 -15
  33. package/.claude/skills/workflow-commands/progress-watcher.md +17 -11
  34. package/.claude/skills/workflow-commands/prrun.md +3 -3
  35. package/.claude/skills/workflow-commands/retrospective.md +13 -18
  36. package/.claude/skills/workflow-commands/split-assessment.md +6 -4
  37. package/.claude/skills/workflow-commands/target-repository.md +25 -28
  38. package/.claude/skills/workflow-commands/working-tree-hold.md +11 -17
  39. package/.gitattributes +2 -1
  40. package/.github/workflows/ci.yml +14 -0
  41. package/.github/workflows/publish.yml +2 -0
  42. package/.vscode/tasks.json +14 -0
  43. package/CLAUDE.md +10 -61
  44. package/README.md +38 -57
  45. package/SECURITY.md +1 -1
  46. package/dist/CLAUDE.md +10 -61
  47. package/dist/commands/document-section-cli.js +42 -10
  48. package/dist/config-merge/index.js +11 -2
  49. package/dist/hooks/audit-provision.js +2 -2
  50. package/dist/hooks/batch-guard.js +7 -7
  51. package/dist/hooks/{chunk-FIVDHQGT.js → chunk-43G45XJF.js} +18 -20
  52. package/dist/hooks/{chunk-JUDKDCDP.js → chunk-4TW4MQUL.js} +284 -362
  53. package/dist/hooks/{chunk-5VMKCCC4.js → chunk-76RK6E3H.js} +13 -11
  54. package/dist/hooks/{chunk-RNWHN5BP.js → chunk-DZWZ3DKY.js} +4 -4
  55. package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
  56. package/dist/hooks/{chunk-VC3PZPZO.js → chunk-GG72ANKI.js} +1 -1
  57. package/dist/hooks/{chunk-6HJJXRBX.js → chunk-KPM4YIIX.js} +8 -44
  58. package/dist/hooks/chunk-MXVQMLDP.js +3705 -0
  59. package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
  60. package/dist/hooks/{chunk-TQNPDZNH.js → chunk-NZBHG6FW.js} +7 -5
  61. package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
  62. package/dist/hooks/{chunk-F56MFS4B.js → chunk-R6CRQEAL.js} +4 -4
  63. package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
  64. package/dist/hooks/{chunk-55HHG5PX.js → chunk-TLJYAGZK.js} +799 -903
  65. package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
  66. package/dist/hooks/codex-hook-adapter.js +26 -21
  67. package/dist/hooks/duplicate-read-guard.js +8 -8
  68. package/dist/hooks/format-edited.js +4 -4
  69. package/dist/hooks/inputs.json +213 -197
  70. package/dist/hooks/investigation-guard.js +8 -8
  71. package/dist/hooks/pretool-guard.js +15 -15
  72. package/dist/hooks/session-lang.js +406 -8
  73. package/dist/hooks/stop-guard.js +122 -201
  74. package/dist/josh.js +540 -137
  75. package/dist/version/index.js +15 -13
  76. package/eslint/base.js +43 -5
  77. package/eslint/rules/english-only-prose.js +3 -3
  78. package/eslint/rules/import.js +12 -0
  79. package/eslint/rules/namespace-object-export.js +2 -2
  80. package/package.json +16 -10
  81. package/pnpm-workspace.yaml +2 -4
  82. package/prompts/coding-standards.md +14 -48
  83. package/prompts/collaboration-workflow/file-edits.md +1 -1
  84. package/prompts/collaboration-workflow/issue-citation.md +1 -1
  85. package/prompts/collaboration-workflow/issue-template.md +4 -10
  86. package/prompts/collaboration-workflow/operating-rules.md +7 -8
  87. package/prompts/collaboration-workflow/output-bounds.md +1 -1
  88. package/prompts/collaboration-workflow/overview.md +1 -1
  89. package/prompts/collaboration-workflow/plan-comment.md +2 -1
  90. package/prompts/collaboration-workflow/principles.md +21 -3
  91. package/prompts/collaboration-workflow/report-format.md +16 -29
  92. package/prompts/collaboration-workflow/residency.md +1 -1
  93. package/prompts/collaboration-workflow/rule-delivery.md +7 -95
  94. package/prompts/collaboration-workflow/shell-body.md +3 -23
  95. package/prompts/collaboration-workflow/turn-batching.md +4 -13
  96. package/prompts/collaboration-workflow/wip-cap.md +5 -11
  97. package/prompts/refactoring.md +1 -1
  98. package/prompts/review-rubric.md +3 -22
  99. package/prompts/review.md +15 -38
  100. package/prompts/testing-guide.md +2 -4
  101. package/scripts/adopt/adopt-logic.ts +5 -5
  102. package/scripts/adopt/adopt-toolkits.ts +4 -5
  103. package/scripts/adopt/adopt.ts +2 -3
  104. package/scripts/agent/agent-argv.ts +7 -7
  105. package/scripts/agent/agent-diagnostics.ts +2 -2
  106. package/scripts/agent/agent-exit-record.ts +1 -1
  107. package/scripts/agent/agent-headless.ts +1 -1
  108. package/scripts/agent/agent-launch-environment.ts +6 -1
  109. package/scripts/agent/agent-role-profile.ts +49 -22
  110. package/scripts/agent/agent-session-role.ts +32 -0
  111. package/scripts/agent/api-outage.ts +1 -1
  112. package/scripts/agent/claude-agent-argv.ts +4 -4
  113. package/scripts/agent/claude-result-event.ts +4 -4
  114. package/scripts/agent/codex-hooks.ts +2 -2
  115. package/scripts/agent/interactive-ask.ts +3 -6
  116. package/scripts/auto-ok/auto-ok-cli.ts +46 -60
  117. package/scripts/backlog/backlog-arrival-added.ts +34 -0
  118. package/scripts/backlog/backlog-arrival.ts +54 -17
  119. package/scripts/backlog/backlog-budget-cli.ts +34 -6
  120. package/scripts/backlog/backlog-budget.ts +17 -24
  121. package/scripts/backlog/backlog-defect-priority.ts +1 -1
  122. package/scripts/backlog/backlog-drive-args.ts +5 -4
  123. package/scripts/backlog/backlog-drive-cli.ts +14 -10
  124. package/scripts/backlog/backlog-drive-epic.ts +85 -0
  125. package/scripts/backlog/backlog-drive-launch.ts +1 -1
  126. package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
  127. package/scripts/backlog/backlog-drive-named.ts +39 -9
  128. package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
  129. package/scripts/backlog/backlog-drive-restore.ts +1 -1
  130. package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
  131. package/scripts/backlog/backlog-drive.ts +43 -28
  132. package/scripts/backlog/backlog-idle.ts +88 -0
  133. package/scripts/backlog/backlog-named.ts +11 -15
  134. package/scripts/backlog/backlog-next.ts +26 -30
  135. package/scripts/backlog/backlog-offer-cli.ts +28 -23
  136. package/scripts/backlog/backlog-offer.ts +7 -7
  137. package/scripts/backlog/backlog-overlap.ts +178 -0
  138. package/scripts/backlog/backlog-plan-cli.ts +14 -90
  139. package/scripts/backlog/backlog-plan-read.ts +111 -0
  140. package/scripts/backlog/backlog-plan.ts +11 -10
  141. package/scripts/backlog/backlog-pool.ts +13 -14
  142. package/scripts/backlog/backlog-rank.ts +11 -11
  143. package/scripts/backlog/backlog-ready.ts +15 -10
  144. package/scripts/backlog/backlog-scope.ts +14 -15
  145. package/scripts/backlog/backlog-stalled-cli.ts +2 -2
  146. package/scripts/backlog/backlog-stalled-detect.ts +4 -4
  147. package/scripts/backlog/backlog-stalled.ts +5 -6
  148. package/scripts/backlog/backlog-waves.ts +4 -4
  149. package/scripts/backlog/backlogrun-args.ts +74 -0
  150. package/scripts/backlog/backlogrun-cli.ts +113 -0
  151. package/scripts/backlog/backlogrun-launch.ts +178 -0
  152. package/scripts/behavior/behavior-assertion.ts +6 -8
  153. package/scripts/behavior/behavior-cli.ts +1 -1
  154. package/scripts/behavior/behavior-rules.ts +3 -3
  155. package/scripts/build/build-claude-md.ts +4 -4
  156. package/scripts/build/build-codex-hooks.ts +2 -2
  157. package/scripts/build/build-commands.ts +1 -1
  158. package/scripts/build/build-hooks.ts +5 -5
  159. package/scripts/build/build.ts +1 -1
  160. package/scripts/build/hook-bundle-stamp.ts +109 -7
  161. package/scripts/build/local-bin.ts +2 -2
  162. package/scripts/cases/cases-cli.ts +1 -1
  163. package/scripts/cases/cases-logic.ts +2 -2
  164. package/scripts/ci/composite-actions.ts +1 -2
  165. package/scripts/ci/pr-classification.ts +2 -2
  166. package/scripts/claude/workflow-destination.ts +1 -1
  167. package/scripts/clone/clone-aggregate.ts +1 -1
  168. package/scripts/clone/clone-fingerprint.ts +1 -1
  169. package/scripts/clone/clone-scan-cli.ts +1 -1
  170. package/scripts/clone/clone-scan.ts +1 -1
  171. package/scripts/config-merge/index.ts +1 -1
  172. package/scripts/config-merge/json-format.ts +1 -3
  173. package/scripts/config-merge/patch-json-array.ts +90 -0
  174. package/scripts/config-merge/patch-json-key.ts +6 -3
  175. package/scripts/config-merge/patch-json-list.ts +1 -1
  176. package/scripts/cost-runtime/codex-usage.ts +1 -1
  177. package/scripts/cost-runtime/context-cut-payback.ts +4 -5
  178. package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
  179. package/scripts/cost-runtime/cost-attribute.ts +3 -3
  180. package/scripts/cost-runtime/cost-blocks.ts +3 -4
  181. package/scripts/cost-runtime/cost-cli.ts +14 -11
  182. package/scripts/cost-runtime/cost-corpus.ts +11 -11
  183. package/scripts/cost-runtime/cost-pricing.ts +4 -4
  184. package/scripts/cost-runtime/cost-tokens.ts +1 -2
  185. package/scripts/cost-runtime/cost-transcript.ts +29 -29
  186. package/scripts/cost-runtime/cost-usage.ts +6 -7
  187. package/scripts/cost-runtime/cost-verdict.ts +10 -11
  188. package/scripts/cost-runtime/own-session.ts +1 -1
  189. package/scripts/cost-runtime/transcript-cwd.ts +2 -2
  190. package/scripts/delegation/delegation-cli.ts +4 -4
  191. package/scripts/delegation/delegation-policy.ts +13 -15
  192. package/scripts/delegation/duplicate-read-guard.ts +9 -10
  193. package/scripts/delegation/fanout-cli.ts +1 -1
  194. package/scripts/delegation/fanout.ts +1 -1
  195. package/scripts/delegation/investigation-guard.ts +18 -22
  196. package/scripts/delegation/investigation-reads.ts +48 -238
  197. package/scripts/discovery/repo-discovery.ts +1 -1
  198. package/scripts/discovery/repo-map-logic.ts +1 -2
  199. package/scripts/discovery/repo-origin.ts +3 -3
  200. package/scripts/discovery/repo-party-cli.ts +2 -2
  201. package/scripts/discovery/repo-party.ts +2 -2
  202. package/scripts/doctor/doctor-consumer.ts +1 -1
  203. package/scripts/doctor/doctor-io.ts +6 -7
  204. package/scripts/doctor/doctor-logic.ts +1 -1
  205. package/scripts/doctor/doctor-ports.ts +1 -1
  206. package/scripts/doctor/doctor.ts +8 -9
  207. package/scripts/document/backlogrun-parent-read-set.ts +5 -6
  208. package/scripts/document/bash-output-cap.ts +5 -7
  209. package/scripts/document/capped-print-part.ts +1 -1
  210. package/scripts/document/capped-print.ts +1 -1
  211. package/scripts/document/document-byte-budget.ts +33 -64
  212. package/scripts/document/document-byte-check.ts +4 -4
  213. package/scripts/document/document-reachability.ts +7 -8
  214. package/scripts/document/document-read-cli.ts +2 -2
  215. package/scripts/document/document-scan.ts +26 -2
  216. package/scripts/document/document-section-cli.ts +6 -8
  217. package/scripts/document/document-section.ts +8 -12
  218. package/scripts/document/edit-files-cli.ts +3 -4
  219. package/scripts/document/entry-read-budget.ts +8 -70
  220. package/scripts/document/entry-read-set.ts +51 -34
  221. package/scripts/document/lane-child-read-set.ts +9 -9
  222. package/scripts/document/read-files-cli.ts +1 -2
  223. package/scripts/document/read-set-cli.ts +16 -19
  224. package/scripts/document/read-set-cost.ts +4 -4
  225. package/scripts/document/read-set-point-of-use.ts +28 -38
  226. package/scripts/document/read-set-pricing.ts +1 -1
  227. package/scripts/document/read-set-trim.ts +3 -3
  228. package/scripts/document/resident-budget.ts +8 -10
  229. package/scripts/epic/epic-add-body.ts +15 -18
  230. package/scripts/epic/epic-add-plan.ts +26 -28
  231. package/scripts/epic/epic-add.ts +32 -25
  232. package/scripts/epic/epic-audit-checks.ts +27 -37
  233. package/scripts/epic/epic-audit-cli.ts +21 -22
  234. package/scripts/epic/epic-audit-orphans.ts +16 -17
  235. package/scripts/epic/epic-audit-rationale.ts +10 -15
  236. package/scripts/epic/epic-audit-report.ts +2 -5
  237. package/scripts/epic/epic-audit.ts +18 -14
  238. package/scripts/epic/epic-body.ts +10 -10
  239. package/scripts/epic/epic-bundle-cli.ts +36 -34
  240. package/scripts/epic/epic-bundle-evidence.ts +5 -5
  241. package/scripts/epic/epic-bundle-gaps.ts +6 -9
  242. package/scripts/epic/epic-bundle-poll.ts +1 -1
  243. package/scripts/epic/epic-bundle-referenced.ts +11 -14
  244. package/scripts/epic/epic-bundle.ts +19 -20
  245. package/scripts/epic/epic-busy.ts +44 -21
  246. package/scripts/epic/epic-candidate-confirm.ts +15 -18
  247. package/scripts/epic/epic-chains.ts +18 -23
  248. package/scripts/epic/epic-classify.ts +11 -12
  249. package/scripts/epic/epic-cli-argv.ts +5 -6
  250. package/scripts/epic/epic-cli-remove.ts +9 -4
  251. package/scripts/epic/epic-cli.ts +38 -26
  252. package/scripts/epic/epic-close-comment.ts +14 -15
  253. package/scripts/epic/epic-close.ts +25 -29
  254. package/scripts/epic/epic-cross-repo.ts +18 -21
  255. package/scripts/epic/epic-decision.ts +14 -18
  256. package/scripts/epic/epic-fetch.ts +25 -31
  257. package/scripts/epic/epic-graph.ts +15 -17
  258. package/scripts/epic/epic-index.ts +14 -16
  259. package/scripts/epic/epic-issue.ts +9 -11
  260. package/scripts/epic/epic-label-age.ts +74 -0
  261. package/scripts/epic/epic-lane-offer.ts +35 -24
  262. package/scripts/epic/epic-nested.ts +1 -1
  263. package/scripts/epic/epic-next-read.ts +8 -8
  264. package/scripts/epic/epic-next-views.ts +12 -12
  265. package/scripts/epic/epic-next.ts +29 -33
  266. package/scripts/epic/epic-outside-blocker.ts +11 -10
  267. package/scripts/epic/epic-parse.ts +22 -24
  268. package/scripts/epic/epic-promote.ts +3 -2
  269. package/scripts/epic/epic-rank.ts +1 -1
  270. package/scripts/epic/epic-read.ts +10 -8
  271. package/scripts/epic/epic-reconcile.ts +8 -6
  272. package/scripts/epic/epic-reference.ts +5 -4
  273. package/scripts/epic/epic-relation-recheck.ts +10 -11
  274. package/scripts/epic/epic-relations.ts +9 -8
  275. package/scripts/epic/epic-remove-plan.ts +4 -5
  276. package/scripts/epic/epic-remove.ts +7 -5
  277. package/scripts/epic/epic-report.ts +18 -20
  278. package/scripts/epic/epic-run.ts +6 -5
  279. package/scripts/epic/epic-sections.ts +2 -2
  280. package/scripts/epic/epic-shape.ts +3 -3
  281. package/scripts/epic/epic-solo-stale.ts +3 -2
  282. package/scripts/epic/epic-solo.ts +8 -8
  283. package/scripts/epic/epic-triage.ts +5 -4
  284. package/scripts/epic/epic-validate.ts +8 -7
  285. package/scripts/epic/epic.ts +5 -5
  286. package/scripts/exports/unused-members-cli.ts +1 -1
  287. package/scripts/followup/followup-issue-number.ts +1 -2
  288. package/scripts/followup/git-followup-cleanup.ts +6 -7
  289. package/scripts/followup/git-followup-finish.ts +11 -13
  290. package/scripts/followup/git-followup-flush.ts +11 -7
  291. package/scripts/followup/git-followup-issue-close.ts +16 -13
  292. package/scripts/followup/git-followup-label.ts +9 -6
  293. package/scripts/followup/git-followup-merged.ts +1 -1
  294. package/scripts/followup/git-followup-pending.ts +7 -9
  295. package/scripts/followup/git-followup-stages.ts +28 -17
  296. package/scripts/followup/git-followup-workflow.ts +19 -21
  297. package/scripts/followup/git-pr-followup-checks.ts +13 -20
  298. package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
  299. package/scripts/followup/git-pr-followup.ts +18 -17
  300. package/scripts/gate/core-admission.ts +162 -0
  301. package/scripts/gate/core-budget.ts +134 -91
  302. package/scripts/gate/gate-ledger.ts +114 -0
  303. package/scripts/gate/gate-log.ts +7 -9
  304. package/scripts/gate/gate-plan.ts +103 -35
  305. package/scripts/gate/gate-report.ts +39 -21
  306. package/scripts/gate/gate-skip.ts +11 -13
  307. package/scripts/gate/gate-steps.ts +5 -1
  308. package/scripts/gate/gate-tree.ts +3 -4
  309. package/scripts/gate/hook-gate-reuse.ts +9 -9
  310. package/scripts/gate/machine-capacity.ts +313 -0
  311. package/scripts/gate/pre-commit-type-check.ts +4 -4
  312. package/scripts/gate/project-checks.ts +12 -4
  313. package/scripts/gate/scoped-green.ts +11 -18
  314. package/scripts/gate/type-check-command.ts +2 -2
  315. package/scripts/gate/type-check-step.ts +4 -4
  316. package/scripts/gate/verification-gate.ts +60 -53
  317. package/scripts/gh/gh-spawn.ts +2 -2
  318. package/scripts/gh/git-ai-review-scan.ts +3 -2
  319. package/scripts/gh/git-gh-api-path.ts +10 -11
  320. package/scripts/gh/git-gh-exec.ts +43 -48
  321. package/scripts/gh/git-gh-failure.ts +6 -9
  322. package/scripts/gh/git-gh-helpers.ts +1 -1
  323. package/scripts/gh/git-gh-issue-list.ts +15 -19
  324. package/scripts/gh/git-gh-issue-read.ts +43 -60
  325. package/scripts/gh/git-gh-issue-rest.ts +14 -15
  326. package/scripts/gh/git-gh-issue-write.ts +52 -40
  327. package/scripts/gh/git-gh-issue.ts +23 -24
  328. package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
  329. package/scripts/gh/git-gh-pr-read.ts +46 -50
  330. package/scripts/gh/git-gh-pr-rest.ts +23 -26
  331. package/scripts/gh/git-gh-pr-review.ts +2 -2
  332. package/scripts/gh/git-gh-pr-rollup.ts +4 -4
  333. package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
  334. package/scripts/gh/git-gh-pr.ts +16 -16
  335. package/scripts/gh/git-gh-reachability.ts +11 -12
  336. package/scripts/gh/git-gh-repo.ts +2 -3
  337. package/scripts/gh/git-gh-rest-state.ts +1 -1
  338. package/scripts/gh/git-pr-ai-review.ts +6 -5
  339. package/scripts/gh/git-pr-checks-eval.ts +28 -30
  340. package/scripts/gh/git-pr-checks-parse.ts +14 -16
  341. package/scripts/gh/git-pr-checks-watch.ts +17 -17
  342. package/scripts/gh/git-pr-checks.ts +20 -23
  343. package/scripts/gh/git-pr-coderabbit.ts +8 -6
  344. package/scripts/gh/git-pr-confirmation.ts +5 -5
  345. package/scripts/gh/git-pr-managed-config.ts +7 -9
  346. package/scripts/gh/git-pr-messages.ts +1 -1
  347. package/scripts/gh/git-pr.ts +15 -16
  348. package/scripts/gh/github-issue-url.ts +8 -9
  349. package/scripts/git/base-tree.ts +66 -0
  350. package/scripts/git/change-base.ts +42 -2
  351. package/scripts/git/changed-file-scope.ts +5 -5
  352. package/scripts/git/changed-paths.ts +1 -2
  353. package/scripts/git/constants.ts +2 -2
  354. package/scripts/git/git-branch.ts +1 -1
  355. package/scripts/git/git-closes-keyword.ts +3 -3
  356. package/scripts/git/git-command.ts +53 -41
  357. package/scripts/git/git-common-directory.ts +3 -3
  358. package/scripts/git/git-diff-reads.ts +14 -15
  359. package/scripts/git/git-error.ts +1 -1
  360. package/scripts/git/git-execa-error.ts +1 -2
  361. package/scripts/git/git-issue.ts +10 -8
  362. package/scripts/git/git-location-environment.ts +3 -4
  363. package/scripts/git/git-ls-remote.ts +6 -8
  364. package/scripts/git/git-pre-push-hook.ts +11 -10
  365. package/scripts/git/git-preflight.ts +5 -5
  366. package/scripts/git/git-push-transport.ts +2 -2
  367. package/scripts/git/git-remote-branch.ts +1 -2
  368. package/scripts/git/git-schemas.ts +16 -23
  369. package/scripts/git/git-spawn-sync.ts +1 -1
  370. package/scripts/git/git-spawn.ts +37 -14
  371. package/scripts/git/git-ssh-keepalive.ts +12 -5
  372. package/scripts/git/git-staging.ts +7 -8
  373. package/scripts/git/git-workflow.ts +1 -1
  374. package/scripts/git/git-worktree.ts +35 -27
  375. package/scripts/git/gone-branch.ts +2 -2
  376. package/scripts/git/listing-cutoff.ts +1 -2
  377. package/scripts/git/lockfile-sync.ts +65 -0
  378. package/scripts/git/main-merge-guard.ts +1 -2
  379. package/scripts/git/main-merge.ts +7 -7
  380. package/scripts/git/main-sync.ts +23 -8
  381. package/scripts/git/parse-json-array.ts +18 -23
  382. package/scripts/git/repository-lock.ts +34 -2
  383. package/scripts/git/stash/git-stash.ts +4 -5
  384. package/scripts/git/stash/stash-orphans.ts +5 -3
  385. package/scripts/git/stash/stash-pop-args.ts +1 -1
  386. package/scripts/git/stash/stash-pop-cli.ts +3 -3
  387. package/scripts/git/stash/stash-sweep-lock.ts +2 -2
  388. package/scripts/hooks/batch-guard.ts +11 -13
  389. package/scripts/hooks/check-commit-message.ts +12 -9
  390. package/scripts/hooks/codex-hook-adapter.ts +16 -10
  391. package/scripts/hooks/edited-cspell.ts +3 -4
  392. package/scripts/hooks/format-edited-cli.ts +1 -1
  393. package/scripts/hooks/format-edited-file.ts +11 -17
  394. package/scripts/hooks/format-rewrite-notice.ts +19 -17
  395. package/scripts/hooks/pre-push-unit.ts +10 -14
  396. package/scripts/hooks/pretool-guard-cli.ts +4 -4
  397. package/scripts/hooks/pretool-guard.ts +93 -18
  398. package/scripts/hooks/reserved-run.ts +2 -2
  399. package/scripts/hooks/step-zero-notice.ts +1 -1
  400. package/scripts/hooks/stop-guard.ts +21 -10
  401. package/scripts/init/basic-path-migration.ts +2 -2
  402. package/scripts/init/claude-kit-only-settings.ts +2 -2
  403. package/scripts/init/claude-plugin-config.ts +2 -2
  404. package/scripts/init/distributed-paths.ts +4 -4
  405. package/scripts/init/hook-command-rewrite.ts +3 -3
  406. package/scripts/init/hook-launch.ts +5 -5
  407. package/scripts/init/init-actions.ts +13 -0
  408. package/scripts/init/init-ai-copy.ts +11 -11
  409. package/scripts/init/init-bootstrap.ts +3 -3
  410. package/scripts/init/init-copy-content.ts +4 -4
  411. package/scripts/init/init-logic-json-merge.ts +7 -9
  412. package/scripts/init/init-logic-migrate.ts +1 -1
  413. package/scripts/init/init-logic-templates.ts +1 -1
  414. package/scripts/init/init-logic-workspace.ts +4 -4
  415. package/scripts/init/init-logic-yaml-merge.ts +2 -2
  416. package/scripts/init/init-logic.ts +19 -22
  417. package/scripts/init/init.ts +12 -8
  418. package/scripts/init/kit-base-preset.ts +1 -1
  419. package/scripts/init/kit-setup-state.ts +1 -1
  420. package/scripts/init/kit-written-paths.ts +1 -2
  421. package/scripts/init/package-manager-pin.ts +35 -0
  422. package/scripts/init/project-profile-cli.ts +1 -1
  423. package/scripts/init/project-profile.ts +3 -3
  424. package/scripts/init/session-language-environment.ts +1 -1
  425. package/scripts/init/start-exec.ts +3 -4
  426. package/scripts/init/start-plan.ts +2 -2
  427. package/scripts/init/start-setup-pr.ts +3 -2
  428. package/scripts/init/start-steps.ts +2 -2
  429. package/scripts/init/tsconfig-preset-migration.ts +1 -1
  430. package/scripts/init/vscode-tasks.ts +62 -0
  431. package/scripts/issue/baseline-measure.ts +2 -2
  432. package/scripts/issue/behavior-change-lint.ts +2 -2
  433. package/scripts/issue/defect-rate-cli.ts +6 -7
  434. package/scripts/issue/defect-rate.ts +37 -27
  435. package/scripts/issue/git-next-issues.ts +9 -8
  436. package/scripts/issue/issue-auto-ok.ts +49 -11
  437. package/scripts/issue/issue-backlinks-cli.ts +5 -5
  438. package/scripts/issue/issue-backlinks.ts +6 -6
  439. package/scripts/issue/issue-cite-cli.ts +20 -18
  440. package/scripts/issue/issue-cite.ts +18 -8
  441. package/scripts/issue/issue-closing-pr.ts +4 -4
  442. package/scripts/issue/issue-comment-cli.ts +6 -4
  443. package/scripts/issue/issue-file-cli.ts +75 -15
  444. package/scripts/issue/issue-file-fold.ts +155 -0
  445. package/scripts/issue/issue-file.ts +14 -6
  446. package/scripts/issue/issue-fold-cli.ts +14 -9
  447. package/scripts/issue/issue-fold.ts +23 -8
  448. package/scripts/issue/issue-labels.ts +46 -37
  449. package/scripts/issue/issue-lint-cli.ts +2 -2
  450. package/scripts/issue/issue-lint.ts +1 -1
  451. package/scripts/issue/issue-merged.ts +10 -4
  452. package/scripts/issue/issue-number-shape.ts +27 -0
  453. package/scripts/issue/issue-rank.ts +1 -1
  454. package/scripts/issue/issue-read-cli.ts +4 -5
  455. package/scripts/issue/issue-read.ts +4 -5
  456. package/scripts/issue/issue-reference.ts +5 -5
  457. package/scripts/issue/issue-release-cli.ts +165 -0
  458. package/scripts/issue/issue-release.ts +58 -0
  459. package/scripts/issue/issue-report-failures.ts +7 -4
  460. package/scripts/issue/issue-scout-cli.ts +11 -11
  461. package/scripts/issue/issue-scout-closed.ts +4 -4
  462. package/scripts/issue/issue-scout.ts +4 -5
  463. package/scripts/issue/issue-state-cli.ts +17 -10
  464. package/scripts/issue/issue-state.ts +12 -13
  465. package/scripts/issue/issue-wip.ts +7 -7
  466. package/scripts/issue/markdown-section.ts +3 -3
  467. package/scripts/issue/measure-rerun-cli.ts +10 -9
  468. package/scripts/issue/reproduction-measure.ts +3 -3
  469. package/scripts/issue/session-cite.ts +56 -0
  470. package/scripts/josh/agent-session-environment.ts +10 -8
  471. package/scripts/josh/cli-body.ts +2 -2
  472. package/scripts/josh/command-suggest.ts +1 -1
  473. package/scripts/josh/file-map-stamp.ts +20 -23
  474. package/scripts/josh/hook-decision.ts +24 -28
  475. package/scripts/josh/josh-command-map.ts +4 -1
  476. package/scripts/josh/josh-command-types.ts +32 -34
  477. package/scripts/josh/josh-commands-ai.ts +6 -6
  478. package/scripts/josh/josh-commands-backlog.ts +15 -3
  479. package/scripts/josh/josh-commands-clone.ts +1 -1
  480. package/scripts/josh/josh-commands-development.ts +33 -4
  481. package/scripts/josh/josh-commands-document.ts +3 -3
  482. package/scripts/josh/josh-commands-guard.ts +3 -3
  483. package/scripts/josh/josh-commands-issue.ts +11 -5
  484. package/scripts/josh/josh-commands-lane.ts +16 -5
  485. package/scripts/josh/josh-commands-lint.ts +1 -1
  486. package/scripts/josh/josh-commands-maintenance.ts +2 -2
  487. package/scripts/josh/josh-commands-run.ts +20 -6
  488. package/scripts/josh/josh-commands-split.ts +1 -2
  489. package/scripts/josh/josh-commands-versioning.ts +5 -5
  490. package/scripts/josh/josh-commands-workflow.ts +30 -22
  491. package/scripts/josh/josh-environment-file.ts +1 -1
  492. package/scripts/josh/josh-in-process.ts +3 -3
  493. package/scripts/josh/josh-logic.ts +10 -10
  494. package/scripts/josh/josh-run.ts +3 -3
  495. package/scripts/josh/josh-verdict.ts +9 -12
  496. package/scripts/josh/josh.ts +3 -3
  497. package/scripts/josh/kit-only.ts +2 -2
  498. package/scripts/josh/path-decision.ts +3 -3
  499. package/scripts/josh/platform-temporary.ts +7 -5
  500. package/scripts/josh/process-identity.ts +24 -6
  501. package/scripts/josh/process-owner.ts +4 -4
  502. package/scripts/josh/session-language-cli.ts +53 -11
  503. package/scripts/josh/session-language.ts +1 -1
  504. package/scripts/josh/stamp-file.ts +48 -29
  505. package/scripts/josh/stamp-record.ts +57 -0
  506. package/scripts/lane/lane-await.ts +35 -11
  507. package/scripts/lane/lane-cache.ts +6 -6
  508. package/scripts/lane/lane-capacity.ts +32 -17
  509. package/scripts/lane/lane-child-invocation.ts +17 -15
  510. package/scripts/lane/lane-child-marker.ts +12 -12
  511. package/scripts/lane/lane-cli.ts +20 -13
  512. package/scripts/lane/lane-close.ts +6 -6
  513. package/scripts/lane/lane-dispatch.ts +61 -72
  514. package/scripts/lane/lane-environment.ts +5 -5
  515. package/scripts/lane/lane-guard-policy.ts +7 -21
  516. package/scripts/lane/lane-handoff.ts +2 -2
  517. package/scripts/lane/lane-install.ts +9 -10
  518. package/scripts/lane/lane-launch-cli.ts +13 -8
  519. package/scripts/lane/lane-ledger.ts +73 -11
  520. package/scripts/lane/lane-leftover.ts +44 -30
  521. package/scripts/lane/lane-limit-cli.ts +160 -0
  522. package/scripts/lane/lane-limit-override.ts +74 -0
  523. package/scripts/lane/lane-load.ts +19 -68
  524. package/scripts/lane/lane-measure-cli.ts +15 -25
  525. package/scripts/lane/lane-occupancy.ts +6 -4
  526. package/scripts/lane/lane-open.ts +25 -24
  527. package/scripts/lane/lane-output.ts +4 -3
  528. package/scripts/lane/lane-paths.ts +22 -8
  529. package/scripts/lane/lane-phase.ts +33 -0
  530. package/scripts/lane/lane-reap.ts +2 -2
  531. package/scripts/lane/lane-registry.ts +27 -15
  532. package/scripts/lane/lane-relaunch.ts +9 -9
  533. package/scripts/lane/lane-report.ts +5 -4
  534. package/scripts/lane/lane-resume.ts +2 -2
  535. package/scripts/lane/lane-sampler.ts +55 -0
  536. package/scripts/lane/lane-seed.ts +7 -7
  537. package/scripts/lane/lane-stage-stats.ts +135 -0
  538. package/scripts/lane/lane-start-point.ts +8 -11
  539. package/scripts/lane/lane-stats.ts +60 -15
  540. package/scripts/lane/lane-stray.ts +140 -0
  541. package/scripts/lane/lane-vacant.ts +1 -1
  542. package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
  543. package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
  544. package/scripts/lane/openai-review-broker.ts +2 -4
  545. package/scripts/lib/ancestor-directories.ts +1 -1
  546. package/scripts/lib/bounded-pool.ts +2 -2
  547. package/scripts/lib/buffered-process.ts +4 -6
  548. package/scripts/lib/caddy-logs.sh +0 -0
  549. package/scripts/lib/cli-flags.ts +39 -6
  550. package/scripts/lib/error-message.ts +1 -1
  551. package/scripts/lib/json-value.ts +17 -3
  552. package/scripts/lib/poll.ts +1 -1
  553. package/scripts/lib/status-icons.ts +3 -3
  554. package/scripts/lib/timed-fetch.ts +1 -1
  555. package/scripts/lib/timeouts.ts +1 -1
  556. package/scripts/lines/bytes-command.ts +3 -4
  557. package/scripts/lines/effective-limit.ts +25 -12
  558. package/scripts/lines/line-budget.ts +47 -55
  559. package/scripts/lines/line-targets.ts +6 -2
  560. package/scripts/lines/lines-command.ts +3 -3
  561. package/scripts/lint/cspell-cached.ts +1 -1
  562. package/scripts/lint/cycle-recheck.ts +122 -0
  563. package/scripts/lint/format.ts +1 -2
  564. package/scripts/lint/lint-parallel.ts +34 -19
  565. package/scripts/lint/lint-related-scope.ts +25 -15
  566. package/scripts/lint/lint-related.ts +6 -7
  567. package/scripts/managed-marker/index.ts +1 -1
  568. package/scripts/managed-marker/managed-marker-logic.ts +1 -2
  569. package/scripts/notify/git-notify.ts +9 -7
  570. package/scripts/notify/telegram-notify.ts +53 -37
  571. package/scripts/notify/telegram-test-logic.ts +3 -3
  572. package/scripts/notify/telegram-test.ts +45 -30
  573. package/scripts/observations/observation-ledger-home.ts +14 -8
  574. package/scripts/observations/observation-ledger-line.ts +3 -2
  575. package/scripts/observations/observation-ledger-migrate.ts +3 -4
  576. package/scripts/observations/observation-ledger-prepare.ts +4 -4
  577. package/scripts/observations/observation-ledger.ts +14 -15
  578. package/scripts/observations/observation-record-cli.ts +83 -0
  579. package/scripts/observations/observation-record.ts +91 -0
  580. package/scripts/observations/observations-flush-cli.ts +1 -1
  581. package/scripts/observations/observations-flush-landing.ts +7 -6
  582. package/scripts/observations/observations-flush.ts +26 -27
  583. package/scripts/overrides/overrides-check.ts +18 -8
  584. package/scripts/package/package-scout-cli.ts +1 -1
  585. package/scripts/package/package-scout-format.ts +2 -2
  586. package/scripts/package/package-scout.ts +1 -1
  587. package/scripts/propagate/propagate-git-failure.ts +1 -1
  588. package/scripts/propagate/propagate-git.ts +7 -7
  589. package/scripts/propagate/propagate-plan.ts +2 -2
  590. package/scripts/propagate/propagate-publish.ts +2 -3
  591. package/scripts/propagate/propagate-run.ts +5 -7
  592. package/scripts/propagate/propagate-select.ts +1 -1
  593. package/scripts/propagate/propagate-steps.ts +19 -20
  594. package/scripts/propagate/propagate-targets.ts +6 -10
  595. package/scripts/propagate/propagate.ts +5 -5
  596. package/scripts/refactor/import-graph.ts +1 -1
  597. package/scripts/refactor/refactor-lint.ts +4 -10
  598. package/scripts/refactor/refactor-scan-cli.ts +1 -1
  599. package/scripts/refactor/refactor-scan.ts +2 -2
  600. package/scripts/refactor/refactor-targets.ts +1 -1
  601. package/scripts/release/github-release-cli.ts +25 -3
  602. package/scripts/release/github-release-environment.ts +1 -0
  603. package/scripts/release/github-release-runs.ts +115 -0
  604. package/scripts/release/github-release.ts +13 -67
  605. package/scripts/release/release-cli.ts +21 -4
  606. package/scripts/release/release-history.ts +6 -10
  607. package/scripts/release/release-plan.ts +3 -3
  608. package/scripts/release/release-progress.ts +3 -4
  609. package/scripts/release/release-publish.ts +8 -9
  610. package/scripts/release/release-scope-cli.ts +8 -10
  611. package/scripts/release/release-tag.ts +6 -8
  612. package/scripts/release/release-worktree.ts +5 -5
  613. package/scripts/repo/auto-merge-setting-logic.ts +7 -9
  614. package/scripts/repo/auto-merge-setting.ts +1 -1
  615. package/scripts/repo/repo-setting.ts +4 -4
  616. package/scripts/repo/repository-labels.ts +1 -1
  617. package/scripts/repo/required-checks-logic.ts +3 -3
  618. package/scripts/repo/required-checks-report.ts +1 -1
  619. package/scripts/repo/ruleset-check-cli.ts +1 -1
  620. package/scripts/repo/ruleset-check.ts +1 -1
  621. package/scripts/report/report-format-reference.ts +26 -0
  622. package/scripts/report/report-lint-cli.ts +2 -2
  623. package/scripts/report/report-lint.ts +16 -2
  624. package/scripts/review/disposition-cli.ts +2 -2
  625. package/scripts/review/disposition-logic.ts +1 -1
  626. package/scripts/review/live-evidence.ts +9 -6
  627. package/scripts/review/review-attest-cli.ts +1 -2
  628. package/scripts/review/review-attest.ts +3 -3
  629. package/scripts/review/review-brief-cli.ts +19 -20
  630. package/scripts/review/review-brief.ts +29 -32
  631. package/scripts/review/review-checkout.ts +2 -2
  632. package/scripts/review/review-diff-parts.ts +3 -5
  633. package/scripts/review/review-diff-write.ts +1 -1
  634. package/scripts/review/review-finding-ledger.ts +7 -4
  635. package/scripts/review/review-findings-cli.ts +2 -2
  636. package/scripts/review/review-level.ts +4 -7
  637. package/scripts/review/review-record-cli.ts +73 -16
  638. package/scripts/review/review-record.ts +5 -4
  639. package/scripts/review/review-round2-cli.ts +2 -3
  640. package/scripts/review/review-round2.ts +13 -21
  641. package/scripts/review/review-stamps.ts +9 -71
  642. package/scripts/review/review-tree.ts +4 -5
  643. package/scripts/rules/bash-triggers.ts +4 -4
  644. package/scripts/rules/decision-oracle-batch.ts +5 -6
  645. package/scripts/rules/decision-oracle-stage.ts +1 -1
  646. package/scripts/rules/decision-oracle-tokens.ts +1 -2
  647. package/scripts/rules/decision-oracle.ts +2 -2
  648. package/scripts/rules/delivered-rules.ts +61 -406
  649. package/scripts/rules/destructive-command.ts +2 -2
  650. package/scripts/rules/direct-filing.ts +4 -4
  651. package/scripts/rules/direct-pr-create.ts +2 -2
  652. package/scripts/rules/early-heartbeat.ts +15 -19
  653. package/scripts/rules/file-body.ts +5 -6
  654. package/scripts/rules/filing-cap.ts +6 -7
  655. package/scripts/rules/filing-offer.ts +1 -1
  656. package/scripts/rules/firing-point.ts +6 -6
  657. package/scripts/rules/gh-api.ts +2 -2
  658. package/scripts/rules/git-argv.ts +3 -3
  659. package/scripts/rules/git-force.ts +2 -2
  660. package/scripts/rules/hook-context-line.ts +31 -0
  661. package/scripts/rules/implementation-cut-verdict.ts +5 -8
  662. package/scripts/rules/implementation-cut.ts +35 -32
  663. package/scripts/rules/index-guard.ts +2 -2
  664. package/scripts/rules/issue-citation.ts +7 -7
  665. package/scripts/rules/issue-comments.ts +21 -13
  666. package/scripts/rules/josh-git-bare.ts +2 -2
  667. package/scripts/rules/lane-background.ts +14 -16
  668. package/scripts/rules/lane-carry-conflict.ts +41 -5
  669. package/scripts/rules/lane-interactive-ask.ts +6 -9
  670. package/scripts/rules/lane-park.ts +12 -16
  671. package/scripts/rules/lane-split-park.ts +1 -2
  672. package/scripts/rules/lane-switch-main.ts +10 -13
  673. package/scripts/rules/last-prompt.ts +1 -1
  674. package/scripts/rules/oracle-consulted.ts +5 -5
  675. package/scripts/rules/oracle-firing.ts +6 -9
  676. package/scripts/rules/oracle-list-cli.ts +2 -2
  677. package/scripts/rules/permission-guards.ts +2 -2
  678. package/scripts/rules/piped-verification.ts +79 -9
  679. package/scripts/rules/poll-loop.ts +9 -11
  680. package/scripts/rules/pre-gate-cut.ts +33 -30
  681. package/scripts/rules/prior-comment-read.ts +3 -3
  682. package/scripts/rules/protected-files.ts +25 -13
  683. package/scripts/rules/raw-field-body.ts +3 -4
  684. package/scripts/rules/reply-language.ts +1 -1
  685. package/scripts/rules/rule-body-guard.ts +10 -12
  686. package/scripts/rules/rule-guard.ts +1 -1
  687. package/scripts/rules/rule-list.ts +51 -0
  688. package/scripts/rules/rule-registry-rows.ts +282 -0
  689. package/scripts/rules/rule-registry.ts +109 -0
  690. package/scripts/rules/rule-value-cache.ts +2 -2
  691. package/scripts/rules/rule-value-cli.ts +6 -4
  692. package/scripts/rules/rule-value.ts +61 -22
  693. package/scripts/rules/run-tail-rule.ts +11 -15
  694. package/scripts/rules/shell-body-trigger.ts +7 -7
  695. package/scripts/rules/shell-segments.ts +2 -4
  696. package/scripts/rules/stop-rules.ts +54 -41
  697. package/scripts/rules/tail-commands.ts +1 -1
  698. package/scripts/rules/test-declared-commit.ts +2 -2
  699. package/scripts/rules/third-party-write.ts +3 -3
  700. package/scripts/rules/worktree-guard.ts +12 -5
  701. package/scripts/run/add/run-add-cli.ts +165 -0
  702. package/scripts/run/add/run-add.ts +124 -0
  703. package/scripts/run/board/run-board-cli.ts +207 -0
  704. package/scripts/run/board/run-board-closed.ts +95 -0
  705. package/scripts/run/board/run-board-every.ts +60 -0
  706. package/scripts/run/board/run-board-fetch.ts +38 -0
  707. package/scripts/run/board/run-board-fit.ts +219 -0
  708. package/scripts/run/board/run-board-github.ts +162 -0
  709. package/scripts/run/board/run-board-header.ts +275 -0
  710. package/scripts/run/board/run-board-kind.ts +35 -0
  711. package/scripts/run/board/run-board-labels.ts +299 -0
  712. package/scripts/run/board/run-board-layout.ts +222 -0
  713. package/scripts/run/board/run-board-link.ts +31 -0
  714. package/scripts/run/board/run-board-machine.ts +198 -0
  715. package/scripts/run/board/run-board-notes.ts +103 -0
  716. package/scripts/run/board/run-board-phase.ts +136 -0
  717. package/scripts/run/board/run-board-plan.ts +129 -0
  718. package/scripts/run/board/run-board-read.ts +62 -0
  719. package/scripts/run/board/run-board-render-legend.ts +82 -0
  720. package/scripts/run/board/run-board-render-notes.ts +77 -0
  721. package/scripts/run/board/run-board-render-slot.ts +50 -0
  722. package/scripts/run/board/run-board-render.ts +407 -0
  723. package/scripts/run/board/run-board-scope.ts +17 -0
  724. package/scripts/run/board/run-board-screen.ts +43 -0
  725. package/scripts/run/board/run-board-span.ts +66 -0
  726. package/scripts/run/board/run-board-spin.ts +115 -0
  727. package/scripts/run/board/run-board-state.ts +113 -0
  728. package/scripts/run/board/run-board-status.ts +279 -0
  729. package/scripts/run/board/run-board-tick.ts +210 -0
  730. package/scripts/run/board/run-board-track.ts +22 -0
  731. package/scripts/run/board/run-board-usage-read.ts +255 -0
  732. package/scripts/run/board/run-board-usage-rusage.ts +124 -0
  733. package/scripts/run/board/run-board-usage-text.ts +80 -0
  734. package/scripts/run/board/run-board-usage.ts +165 -0
  735. package/scripts/run/carry/run-carry-added.ts +62 -0
  736. package/scripts/run/carry/run-carry-args.ts +25 -22
  737. package/scripts/run/carry/run-carry-change.ts +1 -1
  738. package/scripts/run/carry/run-carry-cli.ts +71 -48
  739. package/scripts/run/carry/run-carry-conversation.ts +6 -7
  740. package/scripts/run/carry/run-carry-ended.ts +85 -0
  741. package/scripts/run/carry/run-carry-reclaim.ts +1 -1
  742. package/scripts/run/carry/run-carry-stash.ts +3 -2
  743. package/scripts/run/carry/run-carry-streak.ts +8 -10
  744. package/scripts/run/carry/run-carry.ts +85 -89
  745. package/scripts/run/cut/run-cut-args.ts +7 -7
  746. package/scripts/run/cut/run-cut-cli.ts +68 -37
  747. package/scripts/run/cut/run-cut-handoff.ts +15 -15
  748. package/scripts/run/cut/run-cut-report.ts +37 -16
  749. package/scripts/run/cut/run-cut.ts +63 -77
  750. package/scripts/run/detached-launch.ts +35 -50
  751. package/scripts/run/entry/run-entry-cli.ts +48 -27
  752. package/scripts/run/entry/run-entry-stop.ts +7 -9
  753. package/scripts/run/entry/run-entry.ts +5 -6
  754. package/scripts/run/event/run-event-cli.ts +5 -6
  755. package/scripts/run/event/run-event-filed.ts +69 -0
  756. package/scripts/run/event/run-event-follow.ts +3 -3
  757. package/scripts/run/event/run-event-plan.ts +38 -0
  758. package/scripts/run/event/run-event-render.ts +10 -4
  759. package/scripts/run/event/run-event-scope.ts +47 -18
  760. package/scripts/run/event/run-event-stream-emit.ts +64 -11
  761. package/scripts/run/event/run-event-stream.ts +172 -43
  762. package/scripts/run/event/run-event-watch.ts +4 -6
  763. package/scripts/run/hold/run-hold-cli.ts +65 -62
  764. package/scripts/run/hold/run-hold.ts +88 -46
  765. package/scripts/run/merge/run-merge-cli.ts +116 -77
  766. package/scripts/run/merge/run-merge-collect.ts +107 -0
  767. package/scripts/run/merge/run-merge-steps.ts +112 -65
  768. package/scripts/run/merge/run-merge-token.ts +30 -0
  769. package/scripts/run/merge/run-merge.ts +31 -22
  770. package/scripts/run/progress/run-progress-args.ts +4 -4
  771. package/scripts/run/progress/run-progress-cli.ts +39 -50
  772. package/scripts/run/progress/run-progress-clock.ts +25 -32
  773. package/scripts/run/progress/run-progress-config.ts +6 -9
  774. package/scripts/run/progress/run-progress-read.ts +9 -10
  775. package/scripts/run/progress/run-progress.ts +48 -53
  776. package/scripts/run/review/run-review-cli.ts +6 -6
  777. package/scripts/run/review/run-review-steps.ts +6 -6
  778. package/scripts/run/review/run-review.ts +9 -11
  779. package/scripts/run/run-cli-fault.ts +29 -0
  780. package/scripts/run/run-ending-cli.ts +3 -3
  781. package/scripts/run/run-ending.ts +10 -14
  782. package/scripts/run/run-halfrun-resume.ts +6 -8
  783. package/scripts/run/run-headless.ts +25 -12
  784. package/scripts/run/run-invocation.ts +17 -22
  785. package/scripts/run/run-label.ts +7 -5
  786. package/scripts/run/run-liveness-cli.ts +19 -6
  787. package/scripts/run/run-liveness.ts +27 -38
  788. package/scripts/run/run-next-cli.ts +5 -9
  789. package/scripts/run/run-next.ts +4 -5
  790. package/scripts/run/run-parent-cut-hook.ts +10 -12
  791. package/scripts/run/run-preflight.ts +25 -29
  792. package/scripts/run/run-prep-cli.ts +17 -13
  793. package/scripts/run/run-prep-locate.ts +4 -5
  794. package/scripts/run/run-prep.ts +7 -10
  795. package/scripts/run/run-prrun-resume.ts +2 -2
  796. package/scripts/run/run-report-cli.ts +4 -4
  797. package/scripts/run/run-report.ts +9 -14
  798. package/scripts/run/run-retrospective.ts +3 -3
  799. package/scripts/run/run-section.ts +42 -0
  800. package/scripts/run/run-stage-read.ts +2 -2
  801. package/scripts/run/run-stage.ts +6 -4
  802. package/scripts/run/run-status-cli.ts +7 -5
  803. package/scripts/run/run-status.ts +6 -7
  804. package/scripts/run/run-step-cli.ts +13 -15
  805. package/scripts/run/run-step.ts +62 -48
  806. package/scripts/run/run-stop-notify.ts +7 -8
  807. package/scripts/run/run-stranded-cli.ts +1 -1
  808. package/scripts/run/run-stranded-detect.ts +4 -4
  809. package/scripts/run/run-stranded.ts +11 -13
  810. package/scripts/run/run-tail-cli.ts +15 -16
  811. package/scripts/run/run-tail.ts +14 -33
  812. package/scripts/run/run-watcher-guard-cli.ts +3 -4
  813. package/scripts/run/run-watcher-guard.ts +11 -12
  814. package/scripts/run/run-watcher-hook.ts +6 -12
  815. package/scripts/run/ship/run-ship-cli.ts +67 -33
  816. package/scripts/run/ship/run-ship-detach.ts +15 -13
  817. package/scripts/run/ship/run-ship-lock.ts +1 -1
  818. package/scripts/run/ship/run-ship-next.ts +7 -8
  819. package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
  820. package/scripts/run/ship/run-ship-preflight.ts +10 -11
  821. package/scripts/run/ship/run-ship-probe.ts +4 -4
  822. package/scripts/run/ship/run-ship-return.ts +1 -1
  823. package/scripts/run/ship/run-ship-review-steps.ts +43 -24
  824. package/scripts/run/ship/run-ship-review.ts +12 -14
  825. package/scripts/run/ship/run-ship-scoped.ts +15 -6
  826. package/scripts/run/ship/run-ship-stage.ts +80 -26
  827. package/scripts/run/ship/run-ship-steps.ts +26 -16
  828. package/scripts/run/ship/run-ship-stop-text.ts +4 -2
  829. package/scripts/run/ship/run-ship-sync.ts +9 -8
  830. package/scripts/run/ship/run-ship.ts +17 -32
  831. package/scripts/run/tidy/run-tidy-cli.ts +9 -5
  832. package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
  833. package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
  834. package/scripts/run/tidy/run-tidy.ts +4 -3
  835. package/scripts/run/wake/run-wake-cli.ts +27 -33
  836. package/scripts/run/wake/run-wake-describe.ts +76 -29
  837. package/scripts/run/wake/run-wake-driver.ts +14 -14
  838. package/scripts/run/wake/run-wake-handoff.ts +6 -6
  839. package/scripts/run/wake/run-wake-loop.ts +13 -21
  840. package/scripts/run/wake/run-wake-restart.ts +4 -5
  841. package/scripts/run/wake/run-wake-session.ts +23 -27
  842. package/scripts/run/wake/run-wake.ts +57 -328
  843. package/scripts/safe-chain/ci-installer-pin.ts +3 -3
  844. package/scripts/safe-chain/pack-hook.ts +2 -2
  845. package/scripts/safe-chain/preinstall-command.ts +2 -2
  846. package/scripts/security/security-audit-logic.ts +1 -1
  847. package/scripts/security/security-audit-provision-logic.ts +1 -1
  848. package/scripts/security/security-audit-provision.ts +2 -2
  849. package/scripts/security/security-audit.ts +5 -5
  850. package/scripts/security/security-updates-logic.ts +2 -3
  851. package/scripts/security/security-updates.ts +2 -4
  852. package/scripts/self-sync-guard/index.ts +1 -1
  853. package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
  854. package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
  855. package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
  856. package/scripts/sonar/sonar-hotspots.ts +1 -1
  857. package/scripts/sonar/sonar-new-code-cli.ts +1 -1
  858. package/scripts/sonar/sonar-new-code.ts +1 -1
  859. package/scripts/sonar/sonar-project.ts +1 -1
  860. package/scripts/split/split-assess-cli.ts +1 -1
  861. package/scripts/split/split-assess.ts +3 -3
  862. package/scripts/sync/directory-copy-guard.ts +2 -3
  863. package/scripts/sync/managed-config-scope-cli.ts +1 -2
  864. package/scripts/sync/managed-config-scope.ts +4 -4
  865. package/scripts/sync/plugin-skill-directories.ts +2 -2
  866. package/scripts/sync/reconcile-templates.ts +17 -8
  867. package/scripts/sync/removed-skill-manifest.ts +2 -3
  868. package/scripts/sync/sync-ai-files.ts +7 -7
  869. package/scripts/sync/sync-configs.ts +30 -3
  870. package/scripts/sync/sync-hook-safety.ts +2 -2
  871. package/scripts/sync/sync.ts +23 -10
  872. package/scripts/sync/synced-paths.ts +2 -1
  873. package/scripts/sync/workflow-pin-logic.ts +1 -1
  874. package/scripts/test/test-declared-changed.ts +4 -4
  875. package/scripts/test/test-declared-logic.ts +2 -3
  876. package/scripts/test/test-declared-match.ts +25 -4
  877. package/scripts/test/test-declared.ts +26 -9
  878. package/scripts/test/test-red-commit.ts +3 -2
  879. package/scripts/test/test-red-logic.ts +7 -14
  880. package/scripts/test/test-red.ts +12 -47
  881. package/scripts/test/test-related-scope.ts +2 -3
  882. package/scripts/test/test-related.ts +3 -3
  883. package/scripts/test/test-type-logic.ts +1 -2
  884. package/scripts/test/test-unit-guard.ts +13 -17
  885. package/scripts/test/unit-worker-share.ts +7 -8
  886. package/scripts/time-runtime/time-agent-bundles.ts +2 -4
  887. package/scripts/time-runtime/time-background.ts +17 -21
  888. package/scripts/time-runtime/time-batch-guard.ts +67 -342
  889. package/scripts/time-runtime/time-bundle-call.ts +26 -28
  890. package/scripts/time-runtime/time-bundles.ts +11 -12
  891. package/scripts/time-runtime/time-call-identity.ts +1 -1
  892. package/scripts/time-runtime/time-command-key.ts +2 -2
  893. package/scripts/time-runtime/time-density-hook.ts +8 -11
  894. package/scripts/time-runtime/time-density.ts +5 -5
  895. package/scripts/time-runtime/time-followup-stage.ts +7 -7
  896. package/scripts/time-runtime/time-format.ts +5 -5
  897. package/scripts/time-runtime/time-hook-transcript.ts +3 -3
  898. package/scripts/time-runtime/time-instant.ts +1 -1
  899. package/scripts/time-runtime/time-markers.ts +15 -19
  900. package/scripts/time-runtime/time-phase-names.ts +3 -3
  901. package/scripts/time-runtime/time-reported-failure.ts +15 -19
  902. package/scripts/time-runtime/time-round-trips.ts +20 -23
  903. package/scripts/time-runtime/time-shell.ts +8 -8
  904. package/scripts/time-runtime/time-single-check.ts +1 -2
  905. package/scripts/time-runtime/time-spans.ts +35 -40
  906. package/scripts/time-runtime/time-tool-call.ts +15 -16
  907. package/scripts/time-runtime/time-transcript-line.ts +53 -34
  908. package/scripts/time-runtime/time-writes.ts +5 -5
  909. package/scripts/ui/ui-routes-cli.ts +1 -2
  910. package/scripts/ui/ui-routes.ts +1 -2
  911. package/scripts/version/bump-version.ts +1 -1
  912. package/scripts/version/fresh-metadata-cache.ts +2 -2
  913. package/scripts/version/latest-corepack.ts +129 -98
  914. package/scripts/version/latest-lane-guard.ts +1 -1
  915. package/scripts/version/latest-scope-cli.ts +2 -2
  916. package/scripts/version/latest-stamp.ts +1 -2
  917. package/scripts/version/latest-update.ts +2 -2
  918. package/scripts/version/npm-registry.ts +2 -2
  919. package/scripts/version/package-manager-version.ts +18 -0
  920. package/scripts/version/publishable-range-check.ts +2 -1
  921. package/scripts/version/publishable-range.ts +1 -1
  922. package/scripts/version/release-age.ts +11 -11
  923. package/scripts/version/release-hold.ts +2 -2
  924. package/scripts/version/safe-chain-version-update.ts +3 -3
  925. package/scripts/version/version-check-logic.ts +2 -3
  926. package/scripts/version/version-check.ts +1 -2
  927. package/scripts/version/version-command-config.ts +2 -2
  928. package/scripts/version/version-commands.ts +3 -3
  929. package/scripts/version/version-remote.ts +4 -4
  930. package/scripts/version/version-targets.ts +2 -2
  931. package/templates/gitignore +7 -0
  932. package/templates/workflows/github-release.yml +4 -0
  933. package/dist/hooks/chunk-NV2JRZZO.js +0 -6385
  934. package/dist/hooks/chunk-RKUAD3I6.js +0 -90
  935. package/dist/hooks/chunk-WPALEIRX.js +0 -18
  936. package/scripts/backlog/backlog-restructure.ts +0 -152
  937. package/scripts/rules/issue-fold-rule.ts +0 -72
  938. package/scripts/rules/wip-cap.ts +0 -63
  939. package/scripts/run/run-issue-number.ts +0 -19
@@ -1,16 +1,14 @@
1
1
  import { PROJECT_ROOT } from '#scripts/init/init-paths'
2
2
  import { stamp_file } from '#scripts/josh/stamp-file'
3
3
 
4
- // The verification gate's full output, kept somewhere the console's size limit cannot reach
5
- // (joshuafolkken/kit#1227).
4
+ // The verification gate's full output, kept somewhere the console's size limit cannot reach.
6
5
  //
7
- // **The problem is that the only copy of a failure's detail was the console.** `josh gate` buffers
8
- // every check and prints the failing ones whole, and joshuafolkken/kit#1173 then declared
9
- // `BASH_MAX_OUTPUT_LENGTH` at 8,000 characters — a cap on what a command may carry into an agent's
10
- // context, with a measured p99 of 15,989 characters for a Bash call. The verdict is the last line and
11
- // so always survives, which is why a red gate can never read as green; what does not survive is the
12
- // middle, and the middle is where the failure says what it was. The escape hatch was to re-run one
13
- // check by hand, which is a judgement the reader has to make about output they cannot see.
6
+ // **The console cannot be the only copy of a failure's detail.** `josh gate` buffers every check and
7
+ // prints the failing ones whole, and `BASH_MAX_OUTPUT_LENGTH` caps what a command may carry into an
8
+ // agent's context. The verdict is the last line and so always survives, which is why a red gate can
9
+ // never read as green; what does not survive is the middle, and the middle is where the failure says
10
+ // what it was. Re-running one check by hand is a judgement the reader would have to make about output
11
+ // they cannot see.
14
12
  //
15
13
  // So the gate writes every check's output to a file and prints where it is. Nothing about the
16
14
  // verdict changes; what changes is that the detail behind it no longer exists only in a window that
@@ -4,7 +4,7 @@ import { unit_worker_share } from '#scripts/test/unit-worker-share'
4
4
  import { core_budget } from './core-budget'
5
5
 
6
6
  // How many of the gate's checks run at once, and how wide the one elastic check may fan out —
7
- // both derived from the machine rather than fixed at four (joshuafolkken/kit#1258).
7
+ // both derived from the machine rather than fixed at four.
8
8
  //
9
9
  // **The measurement this table is built from.** Apple M3 Pro, 11 logical cores (5 performance +
10
10
  // 6 efficiency, about 9 cores of aggregate throughput on this workload), warm caches, each check
@@ -19,10 +19,8 @@ import { core_budget } from './core-budget'
19
19
  //
20
20
  // Two things follow. **The concurrent gate is already the faster shape** — 15.1s together against
21
21
  // 19.1s back to back, the median of three interleaved runs on the same tree, and the one pair
22
- // `verification-gate.ts` and `docs/josh-commands.md` quote too — so this is a widening of an
23
- // existing win, not a repair of the regression joshuafolkken/kit#1258 was filed for: that was
24
- // real when the type check and the spell check cost 6.9s and 3.6s of CPU, and joshuafolkken/kit#1256
25
- // removed it by giving both a cache. **And the unit suite is the only check worth sizing**: it
22
+ // `docs/josh-commands.md` quotes too — so this is a widening of an existing win. **And the unit
23
+ // suite is the only check worth sizing**: it
26
24
  // alone accounts for 107 of the 122 CPU-seconds, because vitest opens one worker per core while
27
25
  // the other three are one or two processes each.
28
26
 
@@ -30,63 +28,97 @@ interface GateCheck {
30
28
  label: string
31
29
  // The `josh` sub-command that defines the check, and the one an appended argument belongs to.
32
30
  target: string
31
+ // Arguments the gate always hands the target, before any appended one.
32
+ args?: ReadonlyArray<string>
33
33
  // Cores this check holds for as long as it runs — the measured ratio above, floored to whole
34
34
  // cores and never below one. Floored rather than rounded because this is the share the *other*
35
35
  // checks must give up: over-reserving costs the elastic check workers it would have used.
36
36
  // The unit suite reserves nothing: it sizes its own pool from the machine, so it is capped
37
37
  // instead of reserved, and counting it here would reserve cores against itself.
38
38
  reserved_cores: number
39
+ // The memory this check holds while it runs, `core_budget.MEMORY_MB`'s measured peak; none declared is
40
+ // none waited for. The unit suite's is per worker, so it is derived instead.
41
+ memory_mb?: number
42
+ // A check whose `josh` command is kit-only, so a consumer's gate leaves it out rather than running
43
+ // a command that is not in the published package. It restates the command
44
+ // entry's own `is_kit_only`, because the command map imports this module; `gate-plan.test.ts` pins
45
+ // that the two agree.
46
+ is_kit_only?: boolean
39
47
  }
40
48
 
41
49
  const LINT_LABEL = 'lint'
42
50
  const TYPE_CHECK_LABEL = 'check'
43
51
  const UNIT_LABEL = 'test:unit'
44
52
  const BEHAVIOR_LABEL = 'behavior'
53
+ const METRICS_LABEL = 'metrics'
45
54
 
46
55
  // The checks whose warnings must survive the green record: eslint (the `lint` step) and svelte-check
47
56
  // (the `check` step) both exit 0 while reporting per-tree warnings a developer needs to see again, so
48
- // reusing a record taken from such a run would hide them (joshuafolkken/kit#1328). Every other step's
57
+ // reusing a record taken from such a run would hide them. Every other step's
49
58
  // warning-shaped output — a Vite config deprecation printed by `test:unit`, say — is not a per-tree
50
- // finding and repeats every run, so it must not withhold the record. This is what `has_checker_warning`
51
- // narrows the withholding path down to (joshuafolkken/kit#2318).
59
+ // finding and repeats every run, so it must not withhold the record. `has_checker_warning` narrows
60
+ // the withholding path down to these.
52
61
  const WARNING_CHECKER_LABELS: ReadonlyArray<string> = [LINT_LABEL, TYPE_CHECK_LABEL]
53
62
 
54
63
  // The checks that do not fan out across every core, in the order their output is printed. They are
55
- // named apart from the unit suite because CI runs them on their own runner (joshuafolkken/kit#1226):
64
+ // named apart from the unit suite because CI runs them on their own runner:
56
65
  // the unit suite is the only check that fans out across every core, so on a 4-core GitHub runner it
57
66
  // and the others spent the whole job taking cores off each other.
58
67
  //
59
- // **The behavior check belongs here, and it reserves no core** (joshuafolkken/kit#2365). It reads one
68
+ // **The behavior check belongs here, and it reserves no core**. It reads one
60
69
  // recorded transcript rather than the tree, so it is I/O-bound and a zero reservation leaves
61
70
  // `RESERVED_CORES` and the unit worker cap exactly where the other three were measured. Being a static
62
71
  // check rather than one appended after the unit suite is what keeps the plan's shape intact: the
63
72
  // `--no-unit` set stays "the whole gate minus the unit suite", and a CI runner — which has no recorded
64
73
  // transcripts — runs it as a trivial green rather than skipping it.
65
74
  //
66
- // **The three reserving weights are `core_budget.CORE_WEIGHTS`** (joshuafolkken/kit#3345), the same
75
+ // **The three reserving weights are `core_budget.CORE_WEIGHTS`**, the same
67
76
  // numbers the `josh lint`, `josh check` and `josh cspell:dot` commands claim when run directly.
68
77
  //
69
- // **The two zero weights were measured again for joshuafolkken/kit#3345, and they stay zero.** These are
70
- // warm runs on the 11-core machine on 2026-10-06. `behavior` took 0.6s of wall for 0.7s of CPU, which
78
+ // **The two zero weights are measured, and they stay zero.** These are warm runs on the 11-core
79
+ // machine. `behavior` took 0.6s of wall for 0.7s of CPU, which
71
80
  // is node starting up. `exports:unused` took 5.5s of wall for 9.0s of CPU, about 1.6 cores. Floored,
72
81
  // that would be one core, but a reservation lasts the whole gate's plan, not the check's five seconds.
73
82
  // It would lower `RESERVED_CORES` from 4 to 5 and cut the solo unit cap from 7 workers to 6 for the
74
83
  // full length of the unit suite, to cover a burst that ends before lint does. Nothing has measured
75
84
  // that trade, so the measured shape stays.
76
85
  const STATIC_CHECKS: ReadonlyArray<GateCheck> = [
77
- { label: LINT_LABEL, target: 'lint', reserved_cores: core_budget.CORE_WEIGHTS.lint },
86
+ {
87
+ label: LINT_LABEL,
88
+ target: 'lint',
89
+ reserved_cores: core_budget.CORE_WEIGHTS.lint,
90
+ memory_mb: core_budget.MEMORY_MB.lint,
91
+ },
78
92
  {
79
93
  label: TYPE_CHECK_LABEL,
80
94
  target: 'check',
81
95
  reserved_cores: core_budget.CORE_WEIGHTS.type_check,
96
+ memory_mb: core_budget.MEMORY_MB.type_check,
97
+ },
98
+ {
99
+ label: 'cspell',
100
+ target: 'cspell:dot',
101
+ reserved_cores: core_budget.CORE_WEIGHTS.spell_check,
102
+ memory_mb: core_budget.MEMORY_MB.spell_check,
82
103
  },
83
- { label: 'cspell', target: 'cspell:dot', reserved_cores: core_budget.CORE_WEIGHTS.spell_check },
84
104
  { label: BEHAVIOR_LABEL, target: BEHAVIOR_LABEL, reserved_cores: 0 },
85
- // **The unused-member check reserves no core** (joshuafolkken/kit#2987): it builds one TypeScript
105
+ // **The unused-member check reserves no core**: it builds one TypeScript
86
106
  // program and walks it for about 5s, and it is over well before lint and the type check. A
87
107
  // reservation would only take a place from the four-core CI runner's fan-out and a worker from the
88
108
  // unit suite for the whole gate.
89
109
  { label: 'exports', target: 'exports:unused', reserved_cores: 0 },
110
+ // **The metrics ratchet is kit's own**: it holds kit's repository-wide
111
+ // totals to the merge-base's. It is one in-process eslint pass with only `max-lines` enabled, over
112
+ // in a few seconds, so it reserves no core for the reason the unused-member check above does not.
113
+ // It times no startup here: beside the unit suite that reads the load, not josh.
114
+ {
115
+ label: METRICS_LABEL,
116
+ target: METRICS_LABEL,
117
+ args: ['--no-startup'],
118
+ reserved_cores: 0,
119
+ memory_mb: core_budget.MEMORY_MB.eslint_scan,
120
+ is_kit_only: true,
121
+ },
90
122
  ]
91
123
 
92
124
  // The checks, in the order their output is printed — the static set, then the unit suite last (the
@@ -102,8 +134,15 @@ const GATE_CHECKS: ReadonlyArray<GateCheck> = [
102
134
  // set safe is that nothing downstream may mistake it for the full gate: `verification-gate.ts`
103
135
  // withholds both the green-gate record and the in-flight marker on a partial run, so a `--no-unit`
104
136
  // gate can never tell `josh review:brief` that the unit suite passed on this tree.
105
- function select_gate_checks(is_unit_included: boolean): ReadonlyArray<GateCheck> {
106
- return is_unit_included ? GATE_CHECKS : STATIC_CHECKS
137
+ //
138
+ // A consumer's gate also drops the kit-only checks, whose commands its installed kit does not have.
139
+ function select_gate_checks(
140
+ is_unit_included: boolean,
141
+ is_kit_repository = true,
142
+ ): ReadonlyArray<GateCheck> {
143
+ const checks = is_unit_included ? GATE_CHECKS : STATIC_CHECKS
144
+
145
+ return is_kit_repository ? checks : checks.filter((check) => check.is_kit_only !== true)
107
146
  }
108
147
 
109
148
  // Asked of the plan rather than of the flag, so the one question "did this gate run the unit suite"
@@ -155,7 +194,7 @@ interface GatePlan {
155
194
  }
156
195
 
157
196
  // This gate's share of the machine — the cores it may plan against once the other gates in flight
158
- // have theirs (joshuafolkken/kit#1547).
197
+ // have theirs.
159
198
  //
160
199
  // **At one run this is the identity, and that is the whole argument that solo behavior is
161
200
  // unchanged.** `Math.floor(cores / 1)` is `cores`, so a solo gate and a CI runner hand the admission
@@ -183,8 +222,8 @@ function shared_cores(available_cores: number, concurrent_runs: number): number
183
222
  // difference between two checks sharing a core and four fighting over it.
184
223
  //
185
224
  // **Under concurrency it is the only lever there is, and that is a measurement rather than a
186
- // preference** (joshuafolkken/kit#1547). `josh gate` starts four checks at once and joshuafolkken/kit#1515
187
- // sized only the fourth, so six lanes put 18 unbounded checks on 11 cores: measured on that machine,
225
+ // preference**. `josh gate` starts four checks at once and sizing only the unit suite let six lanes
226
+ // put 18 unbounded checks on 11 cores: measured on that machine,
188
227
  // one gate took 254.1s with lint alone at 252.9s against the 5.2s the table above records for it
189
228
  // solo. The obvious repair — hand each of the other three a worker count the way the unit suite gets
190
229
  // one — **does not exist to be applied**: eslint 10's `--concurrency` defaults to `off` and is
@@ -221,7 +260,7 @@ function resolve_concurrency(
221
260
  // 107s). A machine smaller than the measured one is left uncapped; see `MEASURED_CORES`.
222
261
  //
223
262
  // **The table above is a measurement of one gate on an idle machine, and `concurrent_runs` is what
224
- // says whether that is the situation** (joshuafolkken/kit#1515). Six lanes each reading "11 cores,
263
+ // says whether that is the situation**. Six lanes each reading "11 cores,
225
264
  // take 7" put 42 workers on 11 cores, at a load average of 14.97, and the gate had no way to know the
226
265
  // other five existed. Where more than one unit run is in flight the machine is divided between them
227
266
  // instead, by `unit-worker-share.ts`, which is the same answer `test-unit-guard.ts` gives the pre-push
@@ -237,11 +276,11 @@ function resolve_concurrency(
237
276
  // oversubscription for an unmeasured starvation is not an improvement anyone can defend. What *is*
238
277
  // measured is the unit half — six concurrent suites went from ten timeouts to none at this share.
239
278
  //
240
- // **joshuafolkken/kit#1547 narrowed `resolve_concurrency` and deliberately left this number alone.**
241
- // A narrowed gate no longer runs its three siblings *beside* its unit step, so the paragraph above
242
- // now over-states what the share is competing with — which is an argument for widening it, and
243
- // widening it is exactly the unmeasured move that paragraph refuses. The number #1515 measured stays
244
- // until something measures a better one on this machine.
279
+ // **`resolve_concurrency` narrows the gate and leaves this number alone.** A narrowed gate no longer
280
+ // runs its three siblings *beside* its unit step, so the paragraph above over-states what the share
281
+ // is competing with — which is an argument for widening it, and widening it is exactly the
282
+ // unmeasured move that paragraph refuses. The measured number stays until something measures a
283
+ // better one on this machine.
245
284
  //
246
285
  // **The count is a parameter rather than a read.** This module stays a pure function of its inputs, so
247
286
  // its own assertions are about arithmetic and not about what happened to be running while they ran;
@@ -263,7 +302,7 @@ function solo_unit_weight(available_cores: number): number {
263
302
  return Math.max(0, available_cores - RESERVED_CORES)
264
303
  }
265
304
 
266
- // The cores a check reserves from the machine-wide budget while it runs (joshuafolkken/kit#2351). The
305
+ // The cores a check reserves from the machine-wide budget while it runs. The
267
306
  // static checks declare their measured reservation; the unit suite declares the pool it will open,
268
307
  // which `unit_worker_cap` has already sized against the runs in flight. **This is the same table, read
269
308
  // once**: no second set of weights is introduced, so a change to the measured reservation moves the
@@ -280,7 +319,19 @@ function check_weight(check: GateCheck, plan: GatePlan, available_cores: number)
280
319
  return plan.unit_worker_cap ?? solo_unit_weight(available_cores)
281
320
  }
282
321
 
283
- // The cores a unit run started directly reserves (joshuafolkken/kit#3345): the share it will pass to
322
+ function unit_memory(workers: number): number {
323
+ return workers * core_budget.MEMORY_MB.unit_worker
324
+ }
325
+
326
+ // The memory a check holds: its declared figure, or for the unit suite one
327
+ // worker's peak for each core it reserves — its weight is its worker count.
328
+ function check_memory(check: GateCheck, plan: GatePlan, available_cores: number): number {
329
+ if (check.label !== UNIT_LABEL) return check.memory_mb ?? 0
330
+
331
+ return unit_memory(check_weight(check, plan, available_cores))
332
+ }
333
+
334
+ // The cores a unit run started directly reserves: the share it will pass to
284
335
  // vitest while other runs are live, and otherwise the gate's own solo unit weight. **Not the whole
285
336
  // machine**, though a lone vitest sizes its own pool: FIFO admission lets a claim of every core in only
286
337
  // once the ledger is empty, so a one-file `josh test:related` would wait out every other lane's gate
@@ -298,6 +349,21 @@ function direct_unit_weight(
298
349
  return Math.max(unit_worker_share.MIN_WORKERS, weight)
299
350
  }
300
351
 
352
+ // What a unit run started directly holds: one worker's peak for each worker `direct_unit_weight` gives it.
353
+ function direct_unit_memory(): number {
354
+ return unit_memory(direct_unit_weight())
355
+ }
356
+
357
+ function unit_cap_for(
358
+ checks: ReadonlyArray<GateCheck>,
359
+ available_cores: number,
360
+ concurrent_runs: number,
361
+ ): number | undefined {
362
+ if (!has_unit_check(checks)) return undefined
363
+
364
+ return resolve_unit_worker_cap(available_cores, concurrent_runs)
365
+ }
366
+
301
367
  // `availableParallelism()` rather than `cpus().length`: it reports what this process may actually
302
368
  // use, so a container with a CPU quota is sized by the quota rather than by the host.
303
369
  // The three fields together, for a caller that has already decided the numbers. The gate's own
@@ -320,29 +386,28 @@ function resolve_gate_plan(
320
386
  available_cores: number = availableParallelism(),
321
387
  concurrent_runs: number = unit_worker_share.SOLO_RUNS,
322
388
  is_unit_included = true,
389
+ is_kit_repository = true,
323
390
  ): GatePlan {
324
- const checks = select_gate_checks(is_unit_included)
391
+ const checks = select_gate_checks(is_unit_included, is_kit_repository)
325
392
 
326
393
  return {
327
394
  checks,
328
395
  concurrency: resolve_concurrency(available_cores, concurrent_runs, checks),
329
- unit_worker_cap: is_unit_included
330
- ? resolve_unit_worker_cap(available_cores, concurrent_runs)
331
- : undefined,
396
+ unit_worker_cap: unit_cap_for(checks, available_cores, concurrent_runs),
332
397
  }
333
398
  }
334
399
 
335
400
  // Printed once per run, so a gate that was slow on someone else's machine can be read without
336
401
  // re-deriving the plan from their core count.
337
402
  //
338
- // **The two fragments come from `josh-verdict.ts` since joshuafolkken/kit#1379.** `josh time` matches
403
+ // **The two fragments come from `josh-verdict.ts`.** `josh time` matches
339
404
  // this line to tell where a gate run's output begins — it is the one line the gate prints before any
340
405
  // check body exists — so the printer and the detector build it from the same strings, exactly as they
341
406
  // already do for the verdict.
342
407
  // **The machine is described as shared only when it is.** A solo gate prints exactly the line it
343
408
  // always printed — which is what keeps `josh time`'s detector, and every reader used to the old
344
409
  // output, unaffected — while a narrowed one says why it is narrow, so a lane owner reading a slow
345
- // gate is not left deriving the reason from a worker count that looks wrong (joshuafolkken/kit#1515).
410
+ // gate is not left deriving the reason from a worker count that looks wrong.
346
411
  function format_machine(available_cores: number, concurrent_runs: number): string {
347
412
  const cores = `${String(available_cores)} cores`
348
413
 
@@ -378,12 +443,15 @@ const gate_plan = {
378
443
  GATE_CHECKS,
379
444
  LINT_LABEL,
380
445
  MEASURED_CORES,
446
+ METRICS_LABEL,
381
447
  RESERVED_CORES,
382
448
  STATIC_CHECKS,
383
449
  TYPE_CHECK_LABEL,
384
450
  UNIT_LABEL,
385
451
  WARNING_CHECKER_LABELS,
452
+ check_memory,
386
453
  check_weight,
454
+ direct_unit_memory,
387
455
  direct_unit_weight,
388
456
  format_gate_plan,
389
457
  format_machine,
@@ -7,7 +7,7 @@ import { gate_log } from './gate-log'
7
7
  import { gate_plan } from './gate-plan'
8
8
 
9
9
  // The gate's console reporting, split out of `verification-gate.ts` so that file stays under its line
10
- // ceiling while it grows the scoped pre-check and the failure summary (joshuafolkken/kit#2296). Nothing
10
+ // ceiling while it grows the scoped pre-check and the failure summary. Nothing
11
11
  // about what is printed changes in the move: the four blocks, the log notice and the verdict come out
12
12
  // exactly as before, with one addition — the per-failure action lines below.
13
13
 
@@ -25,6 +25,8 @@ interface GateStepResult extends BufferedProcessResult {
25
25
  // What was actually run. The type check's command is resolved per project, so a failure on the
26
26
  // `check` step is only reproducible if the header names the command rather than the label.
27
27
  command: string
28
+ // Set when the check started past the machine-wide budget at the wait cap.
29
+ budget_note?: string | undefined
28
30
  }
29
31
 
30
32
  function is_gate_step_failed(result: GateStepResult): boolean {
@@ -34,8 +36,7 @@ function is_gate_step_failed(result: GateStepResult): boolean {
34
36
  // A passing check's output is not read. What a green gate has to say is "all four passed", and
35
37
  // `print_gate_summary` already says it in one line — while the four bodies, vitest's per-file
36
38
  // listing among them, run to tens of kilobytes that then sit in the conversation and are re-read on
37
- // every later turn. The gate runs more than once per Issue, so the cost is per run, not per Issue
38
- // (joshuafolkken/kit#967).
39
+ // every later turn. The gate runs more than once per Issue, so the cost is per run, not per Issue.
39
40
  //
40
41
  // A failing check keeps its whole output: that is the one time the body is the answer. So does a
41
42
  // check that **passed without running** — `test-unit-guard` exits 0 with a notice when vitest is
@@ -59,8 +60,8 @@ function has_warnings(result: GateStepResult): boolean {
59
60
  return WARNING_MARKERS.some((marker) => result.output.includes(marker))
60
61
  }
61
62
 
62
- // The withholding path's counterpart to `has_warnings`, and deliberately narrower than it
63
- // (joshuafolkken/kit#2318). `has_warnings` is read by `should_print_body`, where a false positive
63
+ // The withholding path's counterpart to `has_warnings`, and deliberately narrower than it.
64
+ // `has_warnings` is read by `should_print_body`, where a false positive
64
65
  // costs one printed body — the loose match above is right there. `record_green_gate` reads *this*
65
66
  // one, where a false positive is not one printed line but the whole green record withheld, which
66
67
  // turns a green gate's `run:review --join` red. So the record is withheld only for a warning from a
@@ -68,7 +69,7 @@ function has_warnings(result: GateStepResult): boolean {
68
69
  // from another tool that happens to contain the word — a Vite config deprecation on `test:unit` was
69
70
  // the line that stopped a green gate's commit chain.
70
71
  //
71
- // **The safe-chain shim's banner is not the checker's either** (joshuafolkken/kit#2447). Where
72
+ // **The safe-chain shim's banner is not the checker's either**. Where
72
73
  // `setup-ci` installed the shims but the binary cannot be reached, every `pnpm` a check spawns prints
73
74
  // "Warning: safe-chain is not available …" into that check's output, so a green lint withheld the
74
75
  // record on every CI run. The banner's lines are dropped before the match; a real warning on any
@@ -95,7 +96,7 @@ function should_print_body(result: GateStepResult, is_verbose: boolean): boolean
95
96
 
96
97
  // Seconds to one decimal, which is the resolution the answer is read at: the question a gate's
97
98
  // timing answers is "which of the four is the long pole", and no check is ever separated from
98
- // another by less than a tenth of a second (joshuafolkken/kit#1248).
99
+ // another by less than a tenth of a second.
99
100
  const MS_PER_SECOND = 1000
100
101
  const SECONDS_DECIMALS = 1
101
102
 
@@ -107,8 +108,8 @@ function format_seconds(elapsed_ms: number): string {
107
108
  // naming the one command to re-run while fixing (`docs/josh-commands.md` → `josh gate`), and a
108
109
  // number spliced in front of it would push that name out of the place a reader scans for it.
109
110
  //
110
- // Built rather than inlined because the log file names each section with the same string
111
- // (joshuafolkken/kit#1227): a header written twice is a header the two copies can disagree about,
111
+ // Built rather than inlined because the log file names each section with the same string:
112
+ // a header written twice is a header the two copies can disagree about,
112
113
  // and the log exists precisely to be read when the console's copy has been elided.
113
114
  function gate_step_header(result: GateStepResult): string {
114
115
  const icon = is_gate_step_failed(result) ? FAIL_ICON : PASS_ICON
@@ -125,7 +126,7 @@ function print_gate_step(result: GateStepResult, is_verbose: boolean): void {
125
126
  }
126
127
 
127
128
  // **One line per failed check, naming the command that reproduces it, printed at the tail just above
128
- // the verdict** (joshuafolkken/kit#2296). A red gate used to report every failing check only in its
129
+ // the verdict**. A red gate used to report every failing check only in its
129
130
  // bodies, which is where truncation lands: the run picked one failure at a time across separate gate
130
131
  // runs because it could not read the rest. The verdict names *which* checks failed; this names *what
131
132
  // to run* for each, and it sits in the same tail window the verdict and the log notice already
@@ -141,25 +142,42 @@ function format_failure_actions(failed: ReadonlyArray<GateStepResult>): string {
141
142
  return `${GATE_COMMAND} — next:\n${lines.join('\n')}\n`
142
143
  }
143
144
 
145
+ // **A check that started past the core budget is said in the summary, not only in the log**.
146
+ // The wait cap admits a check that waited two minutes whatever the budget says,
147
+ // so a gate that ran over-subscribed would otherwise look exactly like one that fitted. The icon is
148
+ // local rather than in `status-icons.ts` because nothing reads this line back.
149
+ const WARN_ICON = '⚠'
150
+
151
+ function format_budget_notes(results: ReadonlyArray<GateStepResult>): string {
152
+ const lines = results.flatMap((result) =>
153
+ result.budget_note === undefined
154
+ ? []
155
+ : ` ${WARN_ICON} ${result.label} — ${result.budget_note}`,
156
+ )
157
+
158
+ return lines.length === 0 ? '' : `${lines.join('\n')}\n`
159
+ }
160
+
144
161
  // The total is wall-clock for the whole command, not the sum of the four — they run concurrently,
145
162
  // so a sum would report about three times what the caller waited.
146
163
  //
147
164
  // The failure actions and the log path are printed with the summary and immediately **above** the
148
- // verdict line, which stays last for the reason `josh-verdict.ts` gives (joshuafolkken/kit#1227).
165
+ // verdict line, which stays last for the reason `josh-verdict.ts` gives.
149
166
  function print_gate_summary(
150
- failed: ReadonlyArray<GateStepResult>,
151
- elapsed_ms: number,
152
- step_count: string,
167
+ results: ReadonlyArray<GateStepResult>,
168
+ report: GateReport,
153
169
  log_path?: string,
154
170
  ): void {
155
- const total = format_seconds(elapsed_ms)
171
+ const failed = results.filter((result) => is_gate_step_failed(result))
172
+ const total = format_seconds(report.elapsed_ms)
156
173
  const verdict =
157
174
  failed.length === 0
158
- ? josh_verdict.format_gate_passed(step_count, total)
175
+ ? josh_verdict.format_gate_passed(report.step_count, total)
159
176
  : josh_verdict.format_gate_failed(failed.map((result) => result.label).join(', '), total)
177
+ const notes = format_budget_notes(results)
160
178
 
161
179
  process.stdout.write(
162
- `\n${format_failure_actions(failed)}${gate_log.format_log_notice(log_path)}${verdict}\n`,
180
+ `\n${notes}${format_failure_actions(failed)}${gate_log.format_log_notice(log_path)}${verdict}\n`,
163
181
  )
164
182
  }
165
183
 
@@ -172,7 +190,7 @@ interface GateReport {
172
190
 
173
191
  // Everything a finished run says, in the order a reader meets it: the four blocks, then the log the
174
192
  // blocks may have been elided out of, then the failure actions and the verdict. **Every check's whole
175
- // output goes into the log, the ones the console dropped included** (joshuafolkken/kit#967).
193
+ // output goes into the log, the ones the console dropped included**.
176
194
  function report_gate_steps(
177
195
  results: ReadonlyArray<GateStepResult>,
178
196
  report: GateReport,
@@ -183,15 +201,15 @@ function report_gate_steps(
183
201
  header: gate_step_header(result),
184
202
  output: result.output,
185
203
  }))
186
- const failed = results.filter((result) => is_gate_step_failed(result))
187
204
  const written_log = gate_log.write_gate_log(entries, report.log_path)
188
205
 
189
- print_gate_summary(failed, report.elapsed_ms, report.step_count, written_log)
206
+ print_gate_summary(results, report, written_log)
190
207
 
191
- return failed.map((result) => result.label)
208
+ return results.filter((result) => is_gate_step_failed(result)).map((result) => result.label)
192
209
  }
193
210
 
194
211
  const gate_report = {
212
+ format_budget_notes,
195
213
  format_failure_actions,
196
214
  has_checker_warning,
197
215
  is_gate_step_failed,
@@ -2,13 +2,12 @@ import type { FileMapStamp } from '#scripts/josh/file-map-stamp'
2
2
  import { review_brief } from '#scripts/review/review-brief'
3
3
  import { review_stamps } from '#scripts/review/review-stamps'
4
4
 
5
- // Whether `josh gate` already has the answer it is about to spend 47–50 seconds computing again
6
- // (joshuafolkken/kit#1328).
5
+ // Whether `josh gate` already has the answer it is about to spend 47–50 seconds computing again.
7
6
  //
8
- // The record has existed since joshuafolkken/kit#1241: `record_green_gate` writes the digest of every
9
- // changed file the four checks were green on, and `josh review:brief` reads it back to print
10
- // `Already verified`. The gate itself never read it, so a second run over an unedited tree started
11
- // four processes to reach a conclusion already on disk. **This is reuse of a result, not a check
7
+ // `record_green_gate` writes the digest of every changed file the four checks were green on, and
8
+ // `josh review:brief` reads it back to print `Already verified`. The gate reads it too, so a second
9
+ // run over an unedited tree does not start four processes to reach a conclusion already on disk.
10
+ // **This is reuse of a result, not a check
12
11
  // dropped**: the bytes the skip answers for are the bytes the record was written from, compared one
13
12
  // by one.
14
13
  //
@@ -17,8 +16,7 @@ import { review_stamps } from '#scripts/review/review-stamps'
17
16
  // differently from the brief printed beside it would be two commands disagreeing about the same tree.
18
17
  //
19
18
  // **A file map does not describe a tree on its own, because it is a diff.** It lists what differs
20
- // from the commit the branch was cut from — its merge base with the default branch since
21
- // joshuafolkken/kit#1527 — so everything the record says stays true while that base moves underneath
19
+ // from the commit the branch was cut from — its merge base with the default branch — so everything the record says stays true while that base moves underneath
22
20
  // it. Two shapes of that, one obvious and one not:
23
21
  //
24
22
  // - Straight after `git switch main && git pull` the map is **empty**, and an empty map compares
@@ -29,8 +27,8 @@ import { review_stamps } from '#scripts/review/review-stamps'
29
27
  // every other file has been replaced by code no check has read. The rebase moves `HEAD`, so it
30
28
  // moves the merge base with it, and the base check still catches this.
31
29
  //
32
- // **What no longer refuses a reuse is another lane merging into the shared default branch**
33
- // (joshuafolkken/kit#1527). In a linked work tree the default branch's ref is shared, but the merge
30
+ // **What no longer refuses a reuse is another lane merging into the shared default branch**.
31
+ // In a linked work tree the default branch's ref is shared, but the merge
34
32
  // base is a commit: an advance this branch is an ancestor of does not move it, and nothing this
35
33
  // checkout's four checks read has changed — so refusing there would have discarded a record that
36
34
  // still describes the tree exactly.
@@ -40,7 +38,7 @@ import { review_stamps } from '#scripts/review/review-stamps'
40
38
  // worth the argument: a tree with no changed file is not where a run spends its gate time.
41
39
  //
42
40
  // Two refusals need no code here. A gate that went red writes no record at all, so the re-verification
43
- // after a fix finds nothing to reuse; and joshuafolkken/kit#1261's join before the commit follows a
41
+ // after a fix finds nothing to reuse; and the join before the commit follows a
44
42
  // `josh bump`, which edits `package.json` into the map.
45
43
  //
46
44
  // **What is reused is a silent green run.** `record_green_gate` withholds the record from a run that
@@ -61,7 +59,7 @@ const FORCE_FLAG = '--force'
61
59
  // A `base` that could not be read is `undefined`, and an older record carries none: both compare
62
60
  // unequal to anything, so the gate runs its checks. No base means no reuse, never reuse without one.
63
61
  //
64
- // **A refusal carries its reason** (joshuafolkken/kit#3307): a pre-push hook that fell back to the
62
+ // **A refusal carries its reason**: a pre-push hook that fell back to the
65
63
  // whole unit suite said nothing about why, so a merge base moved by ship's main sync and a lock file
66
64
  // rewritten by the hook's own install each cost minutes before anyone could tell them apart.
67
65
  type GateReuse = { stamp: FileMapStamp } | { miss: string }
@@ -103,7 +101,7 @@ function reusable_green_gate(
103
101
  // goes on to a commit on the strength of it. So the line says what passed, on which tree and when,
104
102
  // and names the flag or the variable that runs the checks anyway.
105
103
  //
106
- // **One sentence, every reader of the record** (joshuafolkken/kit#1381). The gate says it, the
104
+ // **One sentence, every reader of the record**. The gate says it, the
107
105
  // pre-push hook says it and the pre-commit hook says it, and three copies of a claim this load-bearing
108
106
  // would not have stayed the same sentence — the clone `CLAUDE.md` prohibits. What differs between them
109
107
  // is four fragments and nothing else, so those are the parameters and the shape is not.
@@ -13,6 +13,10 @@ function unit_worker_args(check: GateCheck, plan: GatePlan): ReadonlyArray<strin
13
13
  return [`${UNIT_WORKER_FLAG}=${String(plan.unit_worker_cap)}`]
14
14
  }
15
15
 
16
+ function check_args(check: GateCheck, plan: GatePlan): ReadonlyArray<string> {
17
+ return [...(check.args ?? []), ...unit_worker_args(check, plan)]
18
+ }
19
+
16
20
  // Resolve the type checker per project and run every static check from its package root.
17
21
  async function build_gate_step(
18
22
  check: GateCheck,
@@ -26,7 +30,7 @@ async function build_gate_step(
26
30
  if (check.label !== TYPE_CHECK_LABEL) {
27
31
  return {
28
32
  label: check.label,
29
- command_args: [JOSH, check.target, ...unit_worker_args(check, plan)],
33
+ command_args: [JOSH, check.target, ...check_args(check, plan)],
30
34
  cwd,
31
35
  }
32
36
  }
@@ -2,12 +2,11 @@ import { change_base } from '#scripts/git/change-base'
2
2
  import { review_tree } from '#scripts/review/review-tree'
3
3
 
4
4
  // The two readings a green-gate record is written from and compared against: the digest of every
5
- // changed file, and the commit that map is a diff against (joshuafolkken/kit#1241,
6
- // joshuafolkken/kit#1328).
5
+ // changed file, and the commit that map is a diff against.
7
6
  //
8
7
  // They live here rather than inside `verification-gate.ts` because there are now two readers — the
9
8
  // gate, which reuses a green record instead of re-running its four checks, and the pre-push hook,
10
- // which reuses the same record instead of re-running the unit suite (joshuafolkken/kit#1334). A
9
+ // which reuses the same record instead of re-running the unit suite. A
11
10
  // second copy of the pair would be the clone `CLAUDE.md` prohibits, and it would not have stayed
12
11
  // identical: what these functions really encode is which failure direction is safe, and a copy is
13
12
  // where that decision gets made twice.
@@ -30,7 +29,7 @@ async function read_changed_files(): Promise<Record<string, string>> {
30
29
  }
31
30
  }
32
31
 
33
- // The resolver lives in `git/change-base.ts` since joshuafolkken/kit#1537, because the review brief
32
+ // The resolver lives in `git/change-base.ts`, because the review brief
34
33
  // needs exactly this reading and a second copy of it is the clone `CLAUDE.md` prohibits.
35
34
  async function read_base(): Promise<string | undefined> {
36
35
  return await change_base.resolved()