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