@joshuafolkken/kit 1.1229.0 → 1.1370.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (939) hide show
  1. package/.claude/agents/investigator.md +1 -0
  2. package/.claude/settings.json +4 -0
  3. package/.claude/skills/dependency-update/SKILL.md +5 -3
  4. package/.claude/skills/epic-commands/SKILL.md +82 -113
  5. package/.claude/skills/epic-commands/epic-bundle.md +38 -63
  6. package/.claude/skills/epic-commands/execution-waves.md +30 -51
  7. package/.claude/skills/verify-ui/SKILL.md +13 -20
  8. package/.claude/skills/workflow-commands/SKILL.md +10 -10
  9. package/.claude/skills/workflow-commands/background-commands.md +4 -4
  10. package/.claude/skills/workflow-commands/backlogrun-child.md +30 -105
  11. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +29 -0
  12. package/.claude/skills/workflow-commands/backlogrun-lanes.md +45 -131
  13. package/.claude/skills/workflow-commands/backlogrun-park.md +36 -53
  14. package/.claude/skills/workflow-commands/backlogrun-progress.md +81 -331
  15. package/.claude/skills/workflow-commands/backlogrun-recovery.md +29 -83
  16. package/.claude/skills/workflow-commands/backlogrun-steps.md +105 -424
  17. package/.claude/skills/workflow-commands/backlogrun.md +50 -61
  18. package/.claude/skills/workflow-commands/chain-rule.md +36 -40
  19. package/.claude/skills/workflow-commands/entry-sequence.md +6 -6
  20. package/.claude/skills/workflow-commands/followup.md +24 -20
  21. package/.claude/skills/workflow-commands/fullrun-steps.md +23 -27
  22. package/.claude/skills/workflow-commands/fullrun.md +10 -10
  23. package/.claude/skills/workflow-commands/halfrun.md +9 -8
  24. package/.claude/skills/workflow-commands/into-target.md +12 -18
  25. package/.claude/skills/workflow-commands/issue-comments.md +11 -26
  26. package/.claude/skills/workflow-commands/kickoff.md +27 -16
  27. package/.claude/skills/workflow-commands/latest-gate.md +18 -29
  28. package/.claude/skills/workflow-commands/needs-human-review.md +13 -24
  29. package/.claude/skills/workflow-commands/observation-filing.md +37 -28
  30. package/.claude/skills/workflow-commands/observation-ledger.md +48 -38
  31. package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -9
  32. package/.claude/skills/workflow-commands/prerequisite.md +23 -15
  33. package/.claude/skills/workflow-commands/progress-watcher.md +17 -11
  34. package/.claude/skills/workflow-commands/prrun.md +3 -3
  35. package/.claude/skills/workflow-commands/retrospective.md +13 -18
  36. package/.claude/skills/workflow-commands/split-assessment.md +6 -4
  37. package/.claude/skills/workflow-commands/target-repository.md +25 -28
  38. package/.claude/skills/workflow-commands/working-tree-hold.md +11 -17
  39. package/.gitattributes +2 -1
  40. package/.github/workflows/ci.yml +14 -0
  41. package/.github/workflows/publish.yml +2 -0
  42. package/.vscode/tasks.json +14 -0
  43. package/CLAUDE.md +10 -61
  44. package/README.md +38 -57
  45. package/SECURITY.md +1 -1
  46. package/dist/CLAUDE.md +10 -61
  47. package/dist/commands/document-section-cli.js +42 -10
  48. package/dist/config-merge/index.js +11 -2
  49. package/dist/hooks/audit-provision.js +2 -2
  50. package/dist/hooks/batch-guard.js +7 -7
  51. package/dist/hooks/{chunk-FIVDHQGT.js → chunk-43G45XJF.js} +18 -20
  52. package/dist/hooks/{chunk-JUDKDCDP.js → chunk-4TW4MQUL.js} +284 -362
  53. package/dist/hooks/{chunk-5VMKCCC4.js → chunk-76RK6E3H.js} +13 -11
  54. package/dist/hooks/{chunk-RNWHN5BP.js → chunk-DZWZ3DKY.js} +4 -4
  55. package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
  56. package/dist/hooks/{chunk-VC3PZPZO.js → chunk-GG72ANKI.js} +1 -1
  57. package/dist/hooks/{chunk-6HJJXRBX.js → chunk-KPM4YIIX.js} +8 -44
  58. package/dist/hooks/chunk-MXVQMLDP.js +3705 -0
  59. package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
  60. package/dist/hooks/{chunk-TQNPDZNH.js → chunk-NZBHG6FW.js} +7 -5
  61. package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
  62. package/dist/hooks/{chunk-F56MFS4B.js → chunk-R6CRQEAL.js} +4 -4
  63. package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
  64. package/dist/hooks/{chunk-55HHG5PX.js → chunk-TLJYAGZK.js} +799 -903
  65. package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
  66. package/dist/hooks/codex-hook-adapter.js +26 -21
  67. package/dist/hooks/duplicate-read-guard.js +8 -8
  68. package/dist/hooks/format-edited.js +4 -4
  69. package/dist/hooks/inputs.json +213 -197
  70. package/dist/hooks/investigation-guard.js +8 -8
  71. package/dist/hooks/pretool-guard.js +15 -15
  72. package/dist/hooks/session-lang.js +406 -8
  73. package/dist/hooks/stop-guard.js +122 -201
  74. package/dist/josh.js +540 -137
  75. package/dist/version/index.js +15 -13
  76. package/eslint/base.js +43 -5
  77. package/eslint/rules/english-only-prose.js +3 -3
  78. package/eslint/rules/import.js +12 -0
  79. package/eslint/rules/namespace-object-export.js +2 -2
  80. package/package.json +16 -10
  81. package/pnpm-workspace.yaml +2 -4
  82. package/prompts/coding-standards.md +14 -48
  83. package/prompts/collaboration-workflow/file-edits.md +1 -1
  84. package/prompts/collaboration-workflow/issue-citation.md +1 -1
  85. package/prompts/collaboration-workflow/issue-template.md +4 -10
  86. package/prompts/collaboration-workflow/operating-rules.md +7 -8
  87. package/prompts/collaboration-workflow/output-bounds.md +1 -1
  88. package/prompts/collaboration-workflow/overview.md +1 -1
  89. package/prompts/collaboration-workflow/plan-comment.md +2 -1
  90. package/prompts/collaboration-workflow/principles.md +21 -3
  91. package/prompts/collaboration-workflow/report-format.md +16 -29
  92. package/prompts/collaboration-workflow/residency.md +1 -1
  93. package/prompts/collaboration-workflow/rule-delivery.md +7 -95
  94. package/prompts/collaboration-workflow/shell-body.md +3 -23
  95. package/prompts/collaboration-workflow/turn-batching.md +4 -13
  96. package/prompts/collaboration-workflow/wip-cap.md +5 -11
  97. package/prompts/refactoring.md +1 -1
  98. package/prompts/review-rubric.md +3 -22
  99. package/prompts/review.md +15 -38
  100. package/prompts/testing-guide.md +2 -4
  101. package/scripts/adopt/adopt-logic.ts +5 -5
  102. package/scripts/adopt/adopt-toolkits.ts +4 -5
  103. package/scripts/adopt/adopt.ts +2 -3
  104. package/scripts/agent/agent-argv.ts +7 -7
  105. package/scripts/agent/agent-diagnostics.ts +2 -2
  106. package/scripts/agent/agent-exit-record.ts +1 -1
  107. package/scripts/agent/agent-headless.ts +1 -1
  108. package/scripts/agent/agent-launch-environment.ts +6 -1
  109. package/scripts/agent/agent-role-profile.ts +49 -22
  110. package/scripts/agent/agent-session-role.ts +32 -0
  111. package/scripts/agent/api-outage.ts +1 -1
  112. package/scripts/agent/claude-agent-argv.ts +4 -4
  113. package/scripts/agent/claude-result-event.ts +4 -4
  114. package/scripts/agent/codex-hooks.ts +2 -2
  115. package/scripts/agent/interactive-ask.ts +3 -6
  116. package/scripts/auto-ok/auto-ok-cli.ts +46 -60
  117. package/scripts/backlog/backlog-arrival-added.ts +34 -0
  118. package/scripts/backlog/backlog-arrival.ts +54 -17
  119. package/scripts/backlog/backlog-budget-cli.ts +34 -6
  120. package/scripts/backlog/backlog-budget.ts +17 -24
  121. package/scripts/backlog/backlog-defect-priority.ts +1 -1
  122. package/scripts/backlog/backlog-drive-args.ts +5 -4
  123. package/scripts/backlog/backlog-drive-cli.ts +14 -10
  124. package/scripts/backlog/backlog-drive-epic.ts +85 -0
  125. package/scripts/backlog/backlog-drive-launch.ts +1 -1
  126. package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
  127. package/scripts/backlog/backlog-drive-named.ts +39 -9
  128. package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
  129. package/scripts/backlog/backlog-drive-restore.ts +1 -1
  130. package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
  131. package/scripts/backlog/backlog-drive.ts +43 -28
  132. package/scripts/backlog/backlog-idle.ts +88 -0
  133. package/scripts/backlog/backlog-named.ts +11 -15
  134. package/scripts/backlog/backlog-next.ts +26 -30
  135. package/scripts/backlog/backlog-offer-cli.ts +28 -23
  136. package/scripts/backlog/backlog-offer.ts +7 -7
  137. package/scripts/backlog/backlog-overlap.ts +178 -0
  138. package/scripts/backlog/backlog-plan-cli.ts +14 -90
  139. package/scripts/backlog/backlog-plan-read.ts +111 -0
  140. package/scripts/backlog/backlog-plan.ts +11 -10
  141. package/scripts/backlog/backlog-pool.ts +13 -14
  142. package/scripts/backlog/backlog-rank.ts +11 -11
  143. package/scripts/backlog/backlog-ready.ts +15 -10
  144. package/scripts/backlog/backlog-scope.ts +14 -15
  145. package/scripts/backlog/backlog-stalled-cli.ts +2 -2
  146. package/scripts/backlog/backlog-stalled-detect.ts +4 -4
  147. package/scripts/backlog/backlog-stalled.ts +5 -6
  148. package/scripts/backlog/backlog-waves.ts +4 -4
  149. package/scripts/backlog/backlogrun-args.ts +74 -0
  150. package/scripts/backlog/backlogrun-cli.ts +113 -0
  151. package/scripts/backlog/backlogrun-launch.ts +178 -0
  152. package/scripts/behavior/behavior-assertion.ts +6 -8
  153. package/scripts/behavior/behavior-cli.ts +1 -1
  154. package/scripts/behavior/behavior-rules.ts +3 -3
  155. package/scripts/build/build-claude-md.ts +4 -4
  156. package/scripts/build/build-codex-hooks.ts +2 -2
  157. package/scripts/build/build-commands.ts +1 -1
  158. package/scripts/build/build-hooks.ts +5 -5
  159. package/scripts/build/build.ts +1 -1
  160. package/scripts/build/hook-bundle-stamp.ts +109 -7
  161. package/scripts/build/local-bin.ts +2 -2
  162. package/scripts/cases/cases-cli.ts +1 -1
  163. package/scripts/cases/cases-logic.ts +2 -2
  164. package/scripts/ci/composite-actions.ts +1 -2
  165. package/scripts/ci/pr-classification.ts +2 -2
  166. package/scripts/claude/workflow-destination.ts +1 -1
  167. package/scripts/clone/clone-aggregate.ts +1 -1
  168. package/scripts/clone/clone-fingerprint.ts +1 -1
  169. package/scripts/clone/clone-scan-cli.ts +1 -1
  170. package/scripts/clone/clone-scan.ts +1 -1
  171. package/scripts/config-merge/index.ts +1 -1
  172. package/scripts/config-merge/json-format.ts +1 -3
  173. package/scripts/config-merge/patch-json-array.ts +90 -0
  174. package/scripts/config-merge/patch-json-key.ts +6 -3
  175. package/scripts/config-merge/patch-json-list.ts +1 -1
  176. package/scripts/cost-runtime/codex-usage.ts +1 -1
  177. package/scripts/cost-runtime/context-cut-payback.ts +4 -5
  178. package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
  179. package/scripts/cost-runtime/cost-attribute.ts +3 -3
  180. package/scripts/cost-runtime/cost-blocks.ts +3 -4
  181. package/scripts/cost-runtime/cost-cli.ts +14 -11
  182. package/scripts/cost-runtime/cost-corpus.ts +11 -11
  183. package/scripts/cost-runtime/cost-pricing.ts +4 -4
  184. package/scripts/cost-runtime/cost-tokens.ts +1 -2
  185. package/scripts/cost-runtime/cost-transcript.ts +29 -29
  186. package/scripts/cost-runtime/cost-usage.ts +6 -7
  187. package/scripts/cost-runtime/cost-verdict.ts +10 -11
  188. package/scripts/cost-runtime/own-session.ts +1 -1
  189. package/scripts/cost-runtime/transcript-cwd.ts +2 -2
  190. package/scripts/delegation/delegation-cli.ts +4 -4
  191. package/scripts/delegation/delegation-policy.ts +13 -15
  192. package/scripts/delegation/duplicate-read-guard.ts +9 -10
  193. package/scripts/delegation/fanout-cli.ts +1 -1
  194. package/scripts/delegation/fanout.ts +1 -1
  195. package/scripts/delegation/investigation-guard.ts +18 -22
  196. package/scripts/delegation/investigation-reads.ts +48 -238
  197. package/scripts/discovery/repo-discovery.ts +1 -1
  198. package/scripts/discovery/repo-map-logic.ts +1 -2
  199. package/scripts/discovery/repo-origin.ts +3 -3
  200. package/scripts/discovery/repo-party-cli.ts +2 -2
  201. package/scripts/discovery/repo-party.ts +2 -2
  202. package/scripts/doctor/doctor-consumer.ts +1 -1
  203. package/scripts/doctor/doctor-io.ts +6 -7
  204. package/scripts/doctor/doctor-logic.ts +1 -1
  205. package/scripts/doctor/doctor-ports.ts +1 -1
  206. package/scripts/doctor/doctor.ts +8 -9
  207. package/scripts/document/backlogrun-parent-read-set.ts +5 -6
  208. package/scripts/document/bash-output-cap.ts +5 -7
  209. package/scripts/document/capped-print-part.ts +1 -1
  210. package/scripts/document/capped-print.ts +1 -1
  211. package/scripts/document/document-byte-budget.ts +33 -64
  212. package/scripts/document/document-byte-check.ts +4 -4
  213. package/scripts/document/document-reachability.ts +7 -8
  214. package/scripts/document/document-read-cli.ts +2 -2
  215. package/scripts/document/document-scan.ts +26 -2
  216. package/scripts/document/document-section-cli.ts +6 -8
  217. package/scripts/document/document-section.ts +8 -12
  218. package/scripts/document/edit-files-cli.ts +3 -4
  219. package/scripts/document/entry-read-budget.ts +8 -70
  220. package/scripts/document/entry-read-set.ts +51 -34
  221. package/scripts/document/lane-child-read-set.ts +9 -9
  222. package/scripts/document/read-files-cli.ts +1 -2
  223. package/scripts/document/read-set-cli.ts +16 -19
  224. package/scripts/document/read-set-cost.ts +4 -4
  225. package/scripts/document/read-set-point-of-use.ts +28 -38
  226. package/scripts/document/read-set-pricing.ts +1 -1
  227. package/scripts/document/read-set-trim.ts +3 -3
  228. package/scripts/document/resident-budget.ts +8 -10
  229. package/scripts/epic/epic-add-body.ts +15 -18
  230. package/scripts/epic/epic-add-plan.ts +26 -28
  231. package/scripts/epic/epic-add.ts +32 -25
  232. package/scripts/epic/epic-audit-checks.ts +27 -37
  233. package/scripts/epic/epic-audit-cli.ts +21 -22
  234. package/scripts/epic/epic-audit-orphans.ts +16 -17
  235. package/scripts/epic/epic-audit-rationale.ts +10 -15
  236. package/scripts/epic/epic-audit-report.ts +2 -5
  237. package/scripts/epic/epic-audit.ts +18 -14
  238. package/scripts/epic/epic-body.ts +10 -10
  239. package/scripts/epic/epic-bundle-cli.ts +36 -34
  240. package/scripts/epic/epic-bundle-evidence.ts +5 -5
  241. package/scripts/epic/epic-bundle-gaps.ts +6 -9
  242. package/scripts/epic/epic-bundle-poll.ts +1 -1
  243. package/scripts/epic/epic-bundle-referenced.ts +11 -14
  244. package/scripts/epic/epic-bundle.ts +19 -20
  245. package/scripts/epic/epic-busy.ts +44 -21
  246. package/scripts/epic/epic-candidate-confirm.ts +15 -18
  247. package/scripts/epic/epic-chains.ts +18 -23
  248. package/scripts/epic/epic-classify.ts +11 -12
  249. package/scripts/epic/epic-cli-argv.ts +5 -6
  250. package/scripts/epic/epic-cli-remove.ts +9 -4
  251. package/scripts/epic/epic-cli.ts +38 -26
  252. package/scripts/epic/epic-close-comment.ts +14 -15
  253. package/scripts/epic/epic-close.ts +25 -29
  254. package/scripts/epic/epic-cross-repo.ts +18 -21
  255. package/scripts/epic/epic-decision.ts +14 -18
  256. package/scripts/epic/epic-fetch.ts +25 -31
  257. package/scripts/epic/epic-graph.ts +15 -17
  258. package/scripts/epic/epic-index.ts +14 -16
  259. package/scripts/epic/epic-issue.ts +9 -11
  260. package/scripts/epic/epic-label-age.ts +74 -0
  261. package/scripts/epic/epic-lane-offer.ts +35 -24
  262. package/scripts/epic/epic-nested.ts +1 -1
  263. package/scripts/epic/epic-next-read.ts +8 -8
  264. package/scripts/epic/epic-next-views.ts +12 -12
  265. package/scripts/epic/epic-next.ts +29 -33
  266. package/scripts/epic/epic-outside-blocker.ts +11 -10
  267. package/scripts/epic/epic-parse.ts +22 -24
  268. package/scripts/epic/epic-promote.ts +3 -2
  269. package/scripts/epic/epic-rank.ts +1 -1
  270. package/scripts/epic/epic-read.ts +10 -8
  271. package/scripts/epic/epic-reconcile.ts +8 -6
  272. package/scripts/epic/epic-reference.ts +5 -4
  273. package/scripts/epic/epic-relation-recheck.ts +10 -11
  274. package/scripts/epic/epic-relations.ts +9 -8
  275. package/scripts/epic/epic-remove-plan.ts +4 -5
  276. package/scripts/epic/epic-remove.ts +7 -5
  277. package/scripts/epic/epic-report.ts +18 -20
  278. package/scripts/epic/epic-run.ts +6 -5
  279. package/scripts/epic/epic-sections.ts +2 -2
  280. package/scripts/epic/epic-shape.ts +3 -3
  281. package/scripts/epic/epic-solo-stale.ts +3 -2
  282. package/scripts/epic/epic-solo.ts +8 -8
  283. package/scripts/epic/epic-triage.ts +5 -4
  284. package/scripts/epic/epic-validate.ts +8 -7
  285. package/scripts/epic/epic.ts +5 -5
  286. package/scripts/exports/unused-members-cli.ts +1 -1
  287. package/scripts/followup/followup-issue-number.ts +1 -2
  288. package/scripts/followup/git-followup-cleanup.ts +6 -7
  289. package/scripts/followup/git-followup-finish.ts +11 -13
  290. package/scripts/followup/git-followup-flush.ts +11 -7
  291. package/scripts/followup/git-followup-issue-close.ts +16 -13
  292. package/scripts/followup/git-followup-label.ts +9 -6
  293. package/scripts/followup/git-followup-merged.ts +1 -1
  294. package/scripts/followup/git-followup-pending.ts +7 -9
  295. package/scripts/followup/git-followup-stages.ts +28 -17
  296. package/scripts/followup/git-followup-workflow.ts +19 -21
  297. package/scripts/followup/git-pr-followup-checks.ts +13 -20
  298. package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
  299. package/scripts/followup/git-pr-followup.ts +18 -17
  300. package/scripts/gate/core-admission.ts +162 -0
  301. package/scripts/gate/core-budget.ts +134 -91
  302. package/scripts/gate/gate-ledger.ts +114 -0
  303. package/scripts/gate/gate-log.ts +7 -9
  304. package/scripts/gate/gate-plan.ts +103 -35
  305. package/scripts/gate/gate-report.ts +39 -21
  306. package/scripts/gate/gate-skip.ts +11 -13
  307. package/scripts/gate/gate-steps.ts +5 -1
  308. package/scripts/gate/gate-tree.ts +3 -4
  309. package/scripts/gate/hook-gate-reuse.ts +9 -9
  310. package/scripts/gate/machine-capacity.ts +313 -0
  311. package/scripts/gate/pre-commit-type-check.ts +4 -4
  312. package/scripts/gate/project-checks.ts +12 -4
  313. package/scripts/gate/scoped-green.ts +11 -18
  314. package/scripts/gate/type-check-command.ts +2 -2
  315. package/scripts/gate/type-check-step.ts +4 -4
  316. package/scripts/gate/verification-gate.ts +60 -53
  317. package/scripts/gh/gh-spawn.ts +2 -2
  318. package/scripts/gh/git-ai-review-scan.ts +3 -2
  319. package/scripts/gh/git-gh-api-path.ts +10 -11
  320. package/scripts/gh/git-gh-exec.ts +43 -48
  321. package/scripts/gh/git-gh-failure.ts +6 -9
  322. package/scripts/gh/git-gh-helpers.ts +1 -1
  323. package/scripts/gh/git-gh-issue-list.ts +15 -19
  324. package/scripts/gh/git-gh-issue-read.ts +43 -60
  325. package/scripts/gh/git-gh-issue-rest.ts +14 -15
  326. package/scripts/gh/git-gh-issue-write.ts +52 -40
  327. package/scripts/gh/git-gh-issue.ts +23 -24
  328. package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
  329. package/scripts/gh/git-gh-pr-read.ts +46 -50
  330. package/scripts/gh/git-gh-pr-rest.ts +23 -26
  331. package/scripts/gh/git-gh-pr-review.ts +2 -2
  332. package/scripts/gh/git-gh-pr-rollup.ts +4 -4
  333. package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
  334. package/scripts/gh/git-gh-pr.ts +16 -16
  335. package/scripts/gh/git-gh-reachability.ts +11 -12
  336. package/scripts/gh/git-gh-repo.ts +2 -3
  337. package/scripts/gh/git-gh-rest-state.ts +1 -1
  338. package/scripts/gh/git-pr-ai-review.ts +6 -5
  339. package/scripts/gh/git-pr-checks-eval.ts +28 -30
  340. package/scripts/gh/git-pr-checks-parse.ts +14 -16
  341. package/scripts/gh/git-pr-checks-watch.ts +17 -17
  342. package/scripts/gh/git-pr-checks.ts +20 -23
  343. package/scripts/gh/git-pr-coderabbit.ts +8 -6
  344. package/scripts/gh/git-pr-confirmation.ts +5 -5
  345. package/scripts/gh/git-pr-managed-config.ts +7 -9
  346. package/scripts/gh/git-pr-messages.ts +1 -1
  347. package/scripts/gh/git-pr.ts +15 -16
  348. package/scripts/gh/github-issue-url.ts +8 -9
  349. package/scripts/git/base-tree.ts +66 -0
  350. package/scripts/git/change-base.ts +42 -2
  351. package/scripts/git/changed-file-scope.ts +5 -5
  352. package/scripts/git/changed-paths.ts +1 -2
  353. package/scripts/git/constants.ts +2 -2
  354. package/scripts/git/git-branch.ts +1 -1
  355. package/scripts/git/git-closes-keyword.ts +3 -3
  356. package/scripts/git/git-command.ts +53 -41
  357. package/scripts/git/git-common-directory.ts +3 -3
  358. package/scripts/git/git-diff-reads.ts +14 -15
  359. package/scripts/git/git-error.ts +1 -1
  360. package/scripts/git/git-execa-error.ts +1 -2
  361. package/scripts/git/git-issue.ts +10 -8
  362. package/scripts/git/git-location-environment.ts +3 -4
  363. package/scripts/git/git-ls-remote.ts +6 -8
  364. package/scripts/git/git-pre-push-hook.ts +11 -10
  365. package/scripts/git/git-preflight.ts +5 -5
  366. package/scripts/git/git-push-transport.ts +2 -2
  367. package/scripts/git/git-remote-branch.ts +1 -2
  368. package/scripts/git/git-schemas.ts +16 -23
  369. package/scripts/git/git-spawn-sync.ts +1 -1
  370. package/scripts/git/git-spawn.ts +37 -14
  371. package/scripts/git/git-ssh-keepalive.ts +12 -5
  372. package/scripts/git/git-staging.ts +7 -8
  373. package/scripts/git/git-workflow.ts +1 -1
  374. package/scripts/git/git-worktree.ts +35 -27
  375. package/scripts/git/gone-branch.ts +2 -2
  376. package/scripts/git/listing-cutoff.ts +1 -2
  377. package/scripts/git/lockfile-sync.ts +65 -0
  378. package/scripts/git/main-merge-guard.ts +1 -2
  379. package/scripts/git/main-merge.ts +7 -7
  380. package/scripts/git/main-sync.ts +23 -8
  381. package/scripts/git/parse-json-array.ts +18 -23
  382. package/scripts/git/repository-lock.ts +34 -2
  383. package/scripts/git/stash/git-stash.ts +4 -5
  384. package/scripts/git/stash/stash-orphans.ts +5 -3
  385. package/scripts/git/stash/stash-pop-args.ts +1 -1
  386. package/scripts/git/stash/stash-pop-cli.ts +3 -3
  387. package/scripts/git/stash/stash-sweep-lock.ts +2 -2
  388. package/scripts/hooks/batch-guard.ts +11 -13
  389. package/scripts/hooks/check-commit-message.ts +12 -9
  390. package/scripts/hooks/codex-hook-adapter.ts +16 -10
  391. package/scripts/hooks/edited-cspell.ts +3 -4
  392. package/scripts/hooks/format-edited-cli.ts +1 -1
  393. package/scripts/hooks/format-edited-file.ts +11 -17
  394. package/scripts/hooks/format-rewrite-notice.ts +19 -17
  395. package/scripts/hooks/pre-push-unit.ts +10 -14
  396. package/scripts/hooks/pretool-guard-cli.ts +4 -4
  397. package/scripts/hooks/pretool-guard.ts +93 -18
  398. package/scripts/hooks/reserved-run.ts +2 -2
  399. package/scripts/hooks/step-zero-notice.ts +1 -1
  400. package/scripts/hooks/stop-guard.ts +21 -10
  401. package/scripts/init/basic-path-migration.ts +2 -2
  402. package/scripts/init/claude-kit-only-settings.ts +2 -2
  403. package/scripts/init/claude-plugin-config.ts +2 -2
  404. package/scripts/init/distributed-paths.ts +4 -4
  405. package/scripts/init/hook-command-rewrite.ts +3 -3
  406. package/scripts/init/hook-launch.ts +5 -5
  407. package/scripts/init/init-actions.ts +13 -0
  408. package/scripts/init/init-ai-copy.ts +11 -11
  409. package/scripts/init/init-bootstrap.ts +3 -3
  410. package/scripts/init/init-copy-content.ts +4 -4
  411. package/scripts/init/init-logic-json-merge.ts +7 -9
  412. package/scripts/init/init-logic-migrate.ts +1 -1
  413. package/scripts/init/init-logic-templates.ts +1 -1
  414. package/scripts/init/init-logic-workspace.ts +4 -4
  415. package/scripts/init/init-logic-yaml-merge.ts +2 -2
  416. package/scripts/init/init-logic.ts +19 -22
  417. package/scripts/init/init.ts +12 -8
  418. package/scripts/init/kit-base-preset.ts +1 -1
  419. package/scripts/init/kit-setup-state.ts +1 -1
  420. package/scripts/init/kit-written-paths.ts +1 -2
  421. package/scripts/init/package-manager-pin.ts +35 -0
  422. package/scripts/init/project-profile-cli.ts +1 -1
  423. package/scripts/init/project-profile.ts +3 -3
  424. package/scripts/init/session-language-environment.ts +1 -1
  425. package/scripts/init/start-exec.ts +3 -4
  426. package/scripts/init/start-plan.ts +2 -2
  427. package/scripts/init/start-setup-pr.ts +3 -2
  428. package/scripts/init/start-steps.ts +2 -2
  429. package/scripts/init/tsconfig-preset-migration.ts +1 -1
  430. package/scripts/init/vscode-tasks.ts +62 -0
  431. package/scripts/issue/baseline-measure.ts +2 -2
  432. package/scripts/issue/behavior-change-lint.ts +2 -2
  433. package/scripts/issue/defect-rate-cli.ts +6 -7
  434. package/scripts/issue/defect-rate.ts +37 -27
  435. package/scripts/issue/git-next-issues.ts +9 -8
  436. package/scripts/issue/issue-auto-ok.ts +49 -11
  437. package/scripts/issue/issue-backlinks-cli.ts +5 -5
  438. package/scripts/issue/issue-backlinks.ts +6 -6
  439. package/scripts/issue/issue-cite-cli.ts +20 -18
  440. package/scripts/issue/issue-cite.ts +18 -8
  441. package/scripts/issue/issue-closing-pr.ts +4 -4
  442. package/scripts/issue/issue-comment-cli.ts +6 -4
  443. package/scripts/issue/issue-file-cli.ts +75 -15
  444. package/scripts/issue/issue-file-fold.ts +155 -0
  445. package/scripts/issue/issue-file.ts +14 -6
  446. package/scripts/issue/issue-fold-cli.ts +14 -9
  447. package/scripts/issue/issue-fold.ts +23 -8
  448. package/scripts/issue/issue-labels.ts +46 -37
  449. package/scripts/issue/issue-lint-cli.ts +2 -2
  450. package/scripts/issue/issue-lint.ts +1 -1
  451. package/scripts/issue/issue-merged.ts +10 -4
  452. package/scripts/issue/issue-number-shape.ts +27 -0
  453. package/scripts/issue/issue-rank.ts +1 -1
  454. package/scripts/issue/issue-read-cli.ts +4 -5
  455. package/scripts/issue/issue-read.ts +4 -5
  456. package/scripts/issue/issue-reference.ts +5 -5
  457. package/scripts/issue/issue-release-cli.ts +165 -0
  458. package/scripts/issue/issue-release.ts +58 -0
  459. package/scripts/issue/issue-report-failures.ts +7 -4
  460. package/scripts/issue/issue-scout-cli.ts +11 -11
  461. package/scripts/issue/issue-scout-closed.ts +4 -4
  462. package/scripts/issue/issue-scout.ts +4 -5
  463. package/scripts/issue/issue-state-cli.ts +17 -10
  464. package/scripts/issue/issue-state.ts +12 -13
  465. package/scripts/issue/issue-wip.ts +7 -7
  466. package/scripts/issue/markdown-section.ts +3 -3
  467. package/scripts/issue/measure-rerun-cli.ts +10 -9
  468. package/scripts/issue/reproduction-measure.ts +3 -3
  469. package/scripts/issue/session-cite.ts +56 -0
  470. package/scripts/josh/agent-session-environment.ts +10 -8
  471. package/scripts/josh/cli-body.ts +2 -2
  472. package/scripts/josh/command-suggest.ts +1 -1
  473. package/scripts/josh/file-map-stamp.ts +20 -23
  474. package/scripts/josh/hook-decision.ts +24 -28
  475. package/scripts/josh/josh-command-map.ts +4 -1
  476. package/scripts/josh/josh-command-types.ts +32 -34
  477. package/scripts/josh/josh-commands-ai.ts +6 -6
  478. package/scripts/josh/josh-commands-backlog.ts +15 -3
  479. package/scripts/josh/josh-commands-clone.ts +1 -1
  480. package/scripts/josh/josh-commands-development.ts +33 -4
  481. package/scripts/josh/josh-commands-document.ts +3 -3
  482. package/scripts/josh/josh-commands-guard.ts +3 -3
  483. package/scripts/josh/josh-commands-issue.ts +11 -5
  484. package/scripts/josh/josh-commands-lane.ts +16 -5
  485. package/scripts/josh/josh-commands-lint.ts +1 -1
  486. package/scripts/josh/josh-commands-maintenance.ts +2 -2
  487. package/scripts/josh/josh-commands-run.ts +20 -6
  488. package/scripts/josh/josh-commands-split.ts +1 -2
  489. package/scripts/josh/josh-commands-versioning.ts +5 -5
  490. package/scripts/josh/josh-commands-workflow.ts +30 -22
  491. package/scripts/josh/josh-environment-file.ts +1 -1
  492. package/scripts/josh/josh-in-process.ts +3 -3
  493. package/scripts/josh/josh-logic.ts +10 -10
  494. package/scripts/josh/josh-run.ts +3 -3
  495. package/scripts/josh/josh-verdict.ts +9 -12
  496. package/scripts/josh/josh.ts +3 -3
  497. package/scripts/josh/kit-only.ts +2 -2
  498. package/scripts/josh/path-decision.ts +3 -3
  499. package/scripts/josh/platform-temporary.ts +7 -5
  500. package/scripts/josh/process-identity.ts +24 -6
  501. package/scripts/josh/process-owner.ts +4 -4
  502. package/scripts/josh/session-language-cli.ts +53 -11
  503. package/scripts/josh/session-language.ts +1 -1
  504. package/scripts/josh/stamp-file.ts +48 -29
  505. package/scripts/josh/stamp-record.ts +57 -0
  506. package/scripts/lane/lane-await.ts +35 -11
  507. package/scripts/lane/lane-cache.ts +6 -6
  508. package/scripts/lane/lane-capacity.ts +32 -17
  509. package/scripts/lane/lane-child-invocation.ts +17 -15
  510. package/scripts/lane/lane-child-marker.ts +12 -12
  511. package/scripts/lane/lane-cli.ts +20 -13
  512. package/scripts/lane/lane-close.ts +6 -6
  513. package/scripts/lane/lane-dispatch.ts +61 -72
  514. package/scripts/lane/lane-environment.ts +5 -5
  515. package/scripts/lane/lane-guard-policy.ts +7 -21
  516. package/scripts/lane/lane-handoff.ts +2 -2
  517. package/scripts/lane/lane-install.ts +9 -10
  518. package/scripts/lane/lane-launch-cli.ts +13 -8
  519. package/scripts/lane/lane-ledger.ts +73 -11
  520. package/scripts/lane/lane-leftover.ts +44 -30
  521. package/scripts/lane/lane-limit-cli.ts +160 -0
  522. package/scripts/lane/lane-limit-override.ts +74 -0
  523. package/scripts/lane/lane-load.ts +19 -68
  524. package/scripts/lane/lane-measure-cli.ts +15 -25
  525. package/scripts/lane/lane-occupancy.ts +6 -4
  526. package/scripts/lane/lane-open.ts +25 -24
  527. package/scripts/lane/lane-output.ts +4 -3
  528. package/scripts/lane/lane-paths.ts +22 -8
  529. package/scripts/lane/lane-phase.ts +33 -0
  530. package/scripts/lane/lane-reap.ts +2 -2
  531. package/scripts/lane/lane-registry.ts +27 -15
  532. package/scripts/lane/lane-relaunch.ts +9 -9
  533. package/scripts/lane/lane-report.ts +5 -4
  534. package/scripts/lane/lane-resume.ts +2 -2
  535. package/scripts/lane/lane-sampler.ts +55 -0
  536. package/scripts/lane/lane-seed.ts +7 -7
  537. package/scripts/lane/lane-stage-stats.ts +135 -0
  538. package/scripts/lane/lane-start-point.ts +8 -11
  539. package/scripts/lane/lane-stats.ts +60 -15
  540. package/scripts/lane/lane-stray.ts +140 -0
  541. package/scripts/lane/lane-vacant.ts +1 -1
  542. package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
  543. package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
  544. package/scripts/lane/openai-review-broker.ts +2 -4
  545. package/scripts/lib/ancestor-directories.ts +1 -1
  546. package/scripts/lib/bounded-pool.ts +2 -2
  547. package/scripts/lib/buffered-process.ts +4 -6
  548. package/scripts/lib/caddy-logs.sh +0 -0
  549. package/scripts/lib/cli-flags.ts +39 -6
  550. package/scripts/lib/error-message.ts +1 -1
  551. package/scripts/lib/json-value.ts +17 -3
  552. package/scripts/lib/poll.ts +1 -1
  553. package/scripts/lib/status-icons.ts +3 -3
  554. package/scripts/lib/timed-fetch.ts +1 -1
  555. package/scripts/lib/timeouts.ts +1 -1
  556. package/scripts/lines/bytes-command.ts +3 -4
  557. package/scripts/lines/effective-limit.ts +25 -12
  558. package/scripts/lines/line-budget.ts +47 -55
  559. package/scripts/lines/line-targets.ts +6 -2
  560. package/scripts/lines/lines-command.ts +3 -3
  561. package/scripts/lint/cspell-cached.ts +1 -1
  562. package/scripts/lint/cycle-recheck.ts +122 -0
  563. package/scripts/lint/format.ts +1 -2
  564. package/scripts/lint/lint-parallel.ts +34 -19
  565. package/scripts/lint/lint-related-scope.ts +25 -15
  566. package/scripts/lint/lint-related.ts +6 -7
  567. package/scripts/managed-marker/index.ts +1 -1
  568. package/scripts/managed-marker/managed-marker-logic.ts +1 -2
  569. package/scripts/notify/git-notify.ts +9 -7
  570. package/scripts/notify/telegram-notify.ts +53 -37
  571. package/scripts/notify/telegram-test-logic.ts +3 -3
  572. package/scripts/notify/telegram-test.ts +45 -30
  573. package/scripts/observations/observation-ledger-home.ts +14 -8
  574. package/scripts/observations/observation-ledger-line.ts +3 -2
  575. package/scripts/observations/observation-ledger-migrate.ts +3 -4
  576. package/scripts/observations/observation-ledger-prepare.ts +4 -4
  577. package/scripts/observations/observation-ledger.ts +14 -15
  578. package/scripts/observations/observation-record-cli.ts +83 -0
  579. package/scripts/observations/observation-record.ts +91 -0
  580. package/scripts/observations/observations-flush-cli.ts +1 -1
  581. package/scripts/observations/observations-flush-landing.ts +7 -6
  582. package/scripts/observations/observations-flush.ts +26 -27
  583. package/scripts/overrides/overrides-check.ts +18 -8
  584. package/scripts/package/package-scout-cli.ts +1 -1
  585. package/scripts/package/package-scout-format.ts +2 -2
  586. package/scripts/package/package-scout.ts +1 -1
  587. package/scripts/propagate/propagate-git-failure.ts +1 -1
  588. package/scripts/propagate/propagate-git.ts +7 -7
  589. package/scripts/propagate/propagate-plan.ts +2 -2
  590. package/scripts/propagate/propagate-publish.ts +2 -3
  591. package/scripts/propagate/propagate-run.ts +5 -7
  592. package/scripts/propagate/propagate-select.ts +1 -1
  593. package/scripts/propagate/propagate-steps.ts +19 -20
  594. package/scripts/propagate/propagate-targets.ts +6 -10
  595. package/scripts/propagate/propagate.ts +5 -5
  596. package/scripts/refactor/import-graph.ts +1 -1
  597. package/scripts/refactor/refactor-lint.ts +4 -10
  598. package/scripts/refactor/refactor-scan-cli.ts +1 -1
  599. package/scripts/refactor/refactor-scan.ts +2 -2
  600. package/scripts/refactor/refactor-targets.ts +1 -1
  601. package/scripts/release/github-release-cli.ts +25 -3
  602. package/scripts/release/github-release-environment.ts +1 -0
  603. package/scripts/release/github-release-runs.ts +115 -0
  604. package/scripts/release/github-release.ts +13 -67
  605. package/scripts/release/release-cli.ts +21 -4
  606. package/scripts/release/release-history.ts +6 -10
  607. package/scripts/release/release-plan.ts +3 -3
  608. package/scripts/release/release-progress.ts +3 -4
  609. package/scripts/release/release-publish.ts +8 -9
  610. package/scripts/release/release-scope-cli.ts +8 -10
  611. package/scripts/release/release-tag.ts +6 -8
  612. package/scripts/release/release-worktree.ts +5 -5
  613. package/scripts/repo/auto-merge-setting-logic.ts +7 -9
  614. package/scripts/repo/auto-merge-setting.ts +1 -1
  615. package/scripts/repo/repo-setting.ts +4 -4
  616. package/scripts/repo/repository-labels.ts +1 -1
  617. package/scripts/repo/required-checks-logic.ts +3 -3
  618. package/scripts/repo/required-checks-report.ts +1 -1
  619. package/scripts/repo/ruleset-check-cli.ts +1 -1
  620. package/scripts/repo/ruleset-check.ts +1 -1
  621. package/scripts/report/report-format-reference.ts +26 -0
  622. package/scripts/report/report-lint-cli.ts +2 -2
  623. package/scripts/report/report-lint.ts +16 -2
  624. package/scripts/review/disposition-cli.ts +2 -2
  625. package/scripts/review/disposition-logic.ts +1 -1
  626. package/scripts/review/live-evidence.ts +9 -6
  627. package/scripts/review/review-attest-cli.ts +1 -2
  628. package/scripts/review/review-attest.ts +3 -3
  629. package/scripts/review/review-brief-cli.ts +19 -20
  630. package/scripts/review/review-brief.ts +29 -32
  631. package/scripts/review/review-checkout.ts +2 -2
  632. package/scripts/review/review-diff-parts.ts +3 -5
  633. package/scripts/review/review-diff-write.ts +1 -1
  634. package/scripts/review/review-finding-ledger.ts +7 -4
  635. package/scripts/review/review-findings-cli.ts +2 -2
  636. package/scripts/review/review-level.ts +4 -7
  637. package/scripts/review/review-record-cli.ts +73 -16
  638. package/scripts/review/review-record.ts +5 -4
  639. package/scripts/review/review-round2-cli.ts +2 -3
  640. package/scripts/review/review-round2.ts +13 -21
  641. package/scripts/review/review-stamps.ts +9 -71
  642. package/scripts/review/review-tree.ts +4 -5
  643. package/scripts/rules/bash-triggers.ts +4 -4
  644. package/scripts/rules/decision-oracle-batch.ts +5 -6
  645. package/scripts/rules/decision-oracle-stage.ts +1 -1
  646. package/scripts/rules/decision-oracle-tokens.ts +1 -2
  647. package/scripts/rules/decision-oracle.ts +2 -2
  648. package/scripts/rules/delivered-rules.ts +61 -406
  649. package/scripts/rules/destructive-command.ts +2 -2
  650. package/scripts/rules/direct-filing.ts +4 -4
  651. package/scripts/rules/direct-pr-create.ts +2 -2
  652. package/scripts/rules/early-heartbeat.ts +15 -19
  653. package/scripts/rules/file-body.ts +5 -6
  654. package/scripts/rules/filing-cap.ts +6 -7
  655. package/scripts/rules/filing-offer.ts +1 -1
  656. package/scripts/rules/firing-point.ts +6 -6
  657. package/scripts/rules/gh-api.ts +2 -2
  658. package/scripts/rules/git-argv.ts +3 -3
  659. package/scripts/rules/git-force.ts +2 -2
  660. package/scripts/rules/hook-context-line.ts +31 -0
  661. package/scripts/rules/implementation-cut-verdict.ts +5 -8
  662. package/scripts/rules/implementation-cut.ts +35 -32
  663. package/scripts/rules/index-guard.ts +2 -2
  664. package/scripts/rules/issue-citation.ts +7 -7
  665. package/scripts/rules/issue-comments.ts +21 -13
  666. package/scripts/rules/josh-git-bare.ts +2 -2
  667. package/scripts/rules/lane-background.ts +14 -16
  668. package/scripts/rules/lane-carry-conflict.ts +41 -5
  669. package/scripts/rules/lane-interactive-ask.ts +6 -9
  670. package/scripts/rules/lane-park.ts +12 -16
  671. package/scripts/rules/lane-split-park.ts +1 -2
  672. package/scripts/rules/lane-switch-main.ts +10 -13
  673. package/scripts/rules/last-prompt.ts +1 -1
  674. package/scripts/rules/oracle-consulted.ts +5 -5
  675. package/scripts/rules/oracle-firing.ts +6 -9
  676. package/scripts/rules/oracle-list-cli.ts +2 -2
  677. package/scripts/rules/permission-guards.ts +2 -2
  678. package/scripts/rules/piped-verification.ts +79 -9
  679. package/scripts/rules/poll-loop.ts +9 -11
  680. package/scripts/rules/pre-gate-cut.ts +33 -30
  681. package/scripts/rules/prior-comment-read.ts +3 -3
  682. package/scripts/rules/protected-files.ts +25 -13
  683. package/scripts/rules/raw-field-body.ts +3 -4
  684. package/scripts/rules/reply-language.ts +1 -1
  685. package/scripts/rules/rule-body-guard.ts +10 -12
  686. package/scripts/rules/rule-guard.ts +1 -1
  687. package/scripts/rules/rule-list.ts +51 -0
  688. package/scripts/rules/rule-registry-rows.ts +282 -0
  689. package/scripts/rules/rule-registry.ts +109 -0
  690. package/scripts/rules/rule-value-cache.ts +2 -2
  691. package/scripts/rules/rule-value-cli.ts +6 -4
  692. package/scripts/rules/rule-value.ts +61 -22
  693. package/scripts/rules/run-tail-rule.ts +11 -15
  694. package/scripts/rules/shell-body-trigger.ts +7 -7
  695. package/scripts/rules/shell-segments.ts +2 -4
  696. package/scripts/rules/stop-rules.ts +54 -41
  697. package/scripts/rules/tail-commands.ts +1 -1
  698. package/scripts/rules/test-declared-commit.ts +2 -2
  699. package/scripts/rules/third-party-write.ts +3 -3
  700. package/scripts/rules/worktree-guard.ts +12 -5
  701. package/scripts/run/add/run-add-cli.ts +165 -0
  702. package/scripts/run/add/run-add.ts +124 -0
  703. package/scripts/run/board/run-board-cli.ts +207 -0
  704. package/scripts/run/board/run-board-closed.ts +95 -0
  705. package/scripts/run/board/run-board-every.ts +60 -0
  706. package/scripts/run/board/run-board-fetch.ts +38 -0
  707. package/scripts/run/board/run-board-fit.ts +219 -0
  708. package/scripts/run/board/run-board-github.ts +162 -0
  709. package/scripts/run/board/run-board-header.ts +275 -0
  710. package/scripts/run/board/run-board-kind.ts +35 -0
  711. package/scripts/run/board/run-board-labels.ts +299 -0
  712. package/scripts/run/board/run-board-layout.ts +222 -0
  713. package/scripts/run/board/run-board-link.ts +31 -0
  714. package/scripts/run/board/run-board-machine.ts +198 -0
  715. package/scripts/run/board/run-board-notes.ts +103 -0
  716. package/scripts/run/board/run-board-phase.ts +136 -0
  717. package/scripts/run/board/run-board-plan.ts +129 -0
  718. package/scripts/run/board/run-board-read.ts +62 -0
  719. package/scripts/run/board/run-board-render-legend.ts +82 -0
  720. package/scripts/run/board/run-board-render-notes.ts +77 -0
  721. package/scripts/run/board/run-board-render-slot.ts +50 -0
  722. package/scripts/run/board/run-board-render.ts +407 -0
  723. package/scripts/run/board/run-board-scope.ts +17 -0
  724. package/scripts/run/board/run-board-screen.ts +43 -0
  725. package/scripts/run/board/run-board-span.ts +66 -0
  726. package/scripts/run/board/run-board-spin.ts +115 -0
  727. package/scripts/run/board/run-board-state.ts +113 -0
  728. package/scripts/run/board/run-board-status.ts +279 -0
  729. package/scripts/run/board/run-board-tick.ts +210 -0
  730. package/scripts/run/board/run-board-track.ts +22 -0
  731. package/scripts/run/board/run-board-usage-read.ts +255 -0
  732. package/scripts/run/board/run-board-usage-rusage.ts +124 -0
  733. package/scripts/run/board/run-board-usage-text.ts +80 -0
  734. package/scripts/run/board/run-board-usage.ts +165 -0
  735. package/scripts/run/carry/run-carry-added.ts +62 -0
  736. package/scripts/run/carry/run-carry-args.ts +25 -22
  737. package/scripts/run/carry/run-carry-change.ts +1 -1
  738. package/scripts/run/carry/run-carry-cli.ts +71 -48
  739. package/scripts/run/carry/run-carry-conversation.ts +6 -7
  740. package/scripts/run/carry/run-carry-ended.ts +85 -0
  741. package/scripts/run/carry/run-carry-reclaim.ts +1 -1
  742. package/scripts/run/carry/run-carry-stash.ts +3 -2
  743. package/scripts/run/carry/run-carry-streak.ts +8 -10
  744. package/scripts/run/carry/run-carry.ts +85 -89
  745. package/scripts/run/cut/run-cut-args.ts +7 -7
  746. package/scripts/run/cut/run-cut-cli.ts +68 -37
  747. package/scripts/run/cut/run-cut-handoff.ts +15 -15
  748. package/scripts/run/cut/run-cut-report.ts +37 -16
  749. package/scripts/run/cut/run-cut.ts +63 -77
  750. package/scripts/run/detached-launch.ts +35 -50
  751. package/scripts/run/entry/run-entry-cli.ts +48 -27
  752. package/scripts/run/entry/run-entry-stop.ts +7 -9
  753. package/scripts/run/entry/run-entry.ts +5 -6
  754. package/scripts/run/event/run-event-cli.ts +5 -6
  755. package/scripts/run/event/run-event-filed.ts +69 -0
  756. package/scripts/run/event/run-event-follow.ts +3 -3
  757. package/scripts/run/event/run-event-plan.ts +38 -0
  758. package/scripts/run/event/run-event-render.ts +10 -4
  759. package/scripts/run/event/run-event-scope.ts +47 -18
  760. package/scripts/run/event/run-event-stream-emit.ts +64 -11
  761. package/scripts/run/event/run-event-stream.ts +172 -43
  762. package/scripts/run/event/run-event-watch.ts +4 -6
  763. package/scripts/run/hold/run-hold-cli.ts +65 -62
  764. package/scripts/run/hold/run-hold.ts +88 -46
  765. package/scripts/run/merge/run-merge-cli.ts +116 -77
  766. package/scripts/run/merge/run-merge-collect.ts +107 -0
  767. package/scripts/run/merge/run-merge-steps.ts +112 -65
  768. package/scripts/run/merge/run-merge-token.ts +30 -0
  769. package/scripts/run/merge/run-merge.ts +31 -22
  770. package/scripts/run/progress/run-progress-args.ts +4 -4
  771. package/scripts/run/progress/run-progress-cli.ts +39 -50
  772. package/scripts/run/progress/run-progress-clock.ts +25 -32
  773. package/scripts/run/progress/run-progress-config.ts +6 -9
  774. package/scripts/run/progress/run-progress-read.ts +9 -10
  775. package/scripts/run/progress/run-progress.ts +48 -53
  776. package/scripts/run/review/run-review-cli.ts +6 -6
  777. package/scripts/run/review/run-review-steps.ts +6 -6
  778. package/scripts/run/review/run-review.ts +9 -11
  779. package/scripts/run/run-cli-fault.ts +29 -0
  780. package/scripts/run/run-ending-cli.ts +3 -3
  781. package/scripts/run/run-ending.ts +10 -14
  782. package/scripts/run/run-halfrun-resume.ts +6 -8
  783. package/scripts/run/run-headless.ts +25 -12
  784. package/scripts/run/run-invocation.ts +17 -22
  785. package/scripts/run/run-label.ts +7 -5
  786. package/scripts/run/run-liveness-cli.ts +19 -6
  787. package/scripts/run/run-liveness.ts +27 -38
  788. package/scripts/run/run-next-cli.ts +5 -9
  789. package/scripts/run/run-next.ts +4 -5
  790. package/scripts/run/run-parent-cut-hook.ts +10 -12
  791. package/scripts/run/run-preflight.ts +25 -29
  792. package/scripts/run/run-prep-cli.ts +17 -13
  793. package/scripts/run/run-prep-locate.ts +4 -5
  794. package/scripts/run/run-prep.ts +7 -10
  795. package/scripts/run/run-prrun-resume.ts +2 -2
  796. package/scripts/run/run-report-cli.ts +4 -4
  797. package/scripts/run/run-report.ts +9 -14
  798. package/scripts/run/run-retrospective.ts +3 -3
  799. package/scripts/run/run-section.ts +42 -0
  800. package/scripts/run/run-stage-read.ts +2 -2
  801. package/scripts/run/run-stage.ts +6 -4
  802. package/scripts/run/run-status-cli.ts +7 -5
  803. package/scripts/run/run-status.ts +6 -7
  804. package/scripts/run/run-step-cli.ts +13 -15
  805. package/scripts/run/run-step.ts +62 -48
  806. package/scripts/run/run-stop-notify.ts +7 -8
  807. package/scripts/run/run-stranded-cli.ts +1 -1
  808. package/scripts/run/run-stranded-detect.ts +4 -4
  809. package/scripts/run/run-stranded.ts +11 -13
  810. package/scripts/run/run-tail-cli.ts +15 -16
  811. package/scripts/run/run-tail.ts +14 -33
  812. package/scripts/run/run-watcher-guard-cli.ts +3 -4
  813. package/scripts/run/run-watcher-guard.ts +11 -12
  814. package/scripts/run/run-watcher-hook.ts +6 -12
  815. package/scripts/run/ship/run-ship-cli.ts +67 -33
  816. package/scripts/run/ship/run-ship-detach.ts +15 -13
  817. package/scripts/run/ship/run-ship-lock.ts +1 -1
  818. package/scripts/run/ship/run-ship-next.ts +7 -8
  819. package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
  820. package/scripts/run/ship/run-ship-preflight.ts +10 -11
  821. package/scripts/run/ship/run-ship-probe.ts +4 -4
  822. package/scripts/run/ship/run-ship-return.ts +1 -1
  823. package/scripts/run/ship/run-ship-review-steps.ts +43 -24
  824. package/scripts/run/ship/run-ship-review.ts +12 -14
  825. package/scripts/run/ship/run-ship-scoped.ts +15 -6
  826. package/scripts/run/ship/run-ship-stage.ts +80 -26
  827. package/scripts/run/ship/run-ship-steps.ts +26 -16
  828. package/scripts/run/ship/run-ship-stop-text.ts +4 -2
  829. package/scripts/run/ship/run-ship-sync.ts +9 -8
  830. package/scripts/run/ship/run-ship.ts +17 -32
  831. package/scripts/run/tidy/run-tidy-cli.ts +9 -5
  832. package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
  833. package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
  834. package/scripts/run/tidy/run-tidy.ts +4 -3
  835. package/scripts/run/wake/run-wake-cli.ts +27 -33
  836. package/scripts/run/wake/run-wake-describe.ts +76 -29
  837. package/scripts/run/wake/run-wake-driver.ts +14 -14
  838. package/scripts/run/wake/run-wake-handoff.ts +6 -6
  839. package/scripts/run/wake/run-wake-loop.ts +13 -21
  840. package/scripts/run/wake/run-wake-restart.ts +4 -5
  841. package/scripts/run/wake/run-wake-session.ts +23 -27
  842. package/scripts/run/wake/run-wake.ts +57 -328
  843. package/scripts/safe-chain/ci-installer-pin.ts +3 -3
  844. package/scripts/safe-chain/pack-hook.ts +2 -2
  845. package/scripts/safe-chain/preinstall-command.ts +2 -2
  846. package/scripts/security/security-audit-logic.ts +1 -1
  847. package/scripts/security/security-audit-provision-logic.ts +1 -1
  848. package/scripts/security/security-audit-provision.ts +2 -2
  849. package/scripts/security/security-audit.ts +5 -5
  850. package/scripts/security/security-updates-logic.ts +2 -3
  851. package/scripts/security/security-updates.ts +2 -4
  852. package/scripts/self-sync-guard/index.ts +1 -1
  853. package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
  854. package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
  855. package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
  856. package/scripts/sonar/sonar-hotspots.ts +1 -1
  857. package/scripts/sonar/sonar-new-code-cli.ts +1 -1
  858. package/scripts/sonar/sonar-new-code.ts +1 -1
  859. package/scripts/sonar/sonar-project.ts +1 -1
  860. package/scripts/split/split-assess-cli.ts +1 -1
  861. package/scripts/split/split-assess.ts +3 -3
  862. package/scripts/sync/directory-copy-guard.ts +2 -3
  863. package/scripts/sync/managed-config-scope-cli.ts +1 -2
  864. package/scripts/sync/managed-config-scope.ts +4 -4
  865. package/scripts/sync/plugin-skill-directories.ts +2 -2
  866. package/scripts/sync/reconcile-templates.ts +17 -8
  867. package/scripts/sync/removed-skill-manifest.ts +2 -3
  868. package/scripts/sync/sync-ai-files.ts +7 -7
  869. package/scripts/sync/sync-configs.ts +30 -3
  870. package/scripts/sync/sync-hook-safety.ts +2 -2
  871. package/scripts/sync/sync.ts +23 -10
  872. package/scripts/sync/synced-paths.ts +2 -1
  873. package/scripts/sync/workflow-pin-logic.ts +1 -1
  874. package/scripts/test/test-declared-changed.ts +4 -4
  875. package/scripts/test/test-declared-logic.ts +2 -3
  876. package/scripts/test/test-declared-match.ts +25 -4
  877. package/scripts/test/test-declared.ts +26 -9
  878. package/scripts/test/test-red-commit.ts +3 -2
  879. package/scripts/test/test-red-logic.ts +7 -14
  880. package/scripts/test/test-red.ts +12 -47
  881. package/scripts/test/test-related-scope.ts +2 -3
  882. package/scripts/test/test-related.ts +3 -3
  883. package/scripts/test/test-type-logic.ts +1 -2
  884. package/scripts/test/test-unit-guard.ts +13 -17
  885. package/scripts/test/unit-worker-share.ts +7 -8
  886. package/scripts/time-runtime/time-agent-bundles.ts +2 -4
  887. package/scripts/time-runtime/time-background.ts +17 -21
  888. package/scripts/time-runtime/time-batch-guard.ts +67 -342
  889. package/scripts/time-runtime/time-bundle-call.ts +26 -28
  890. package/scripts/time-runtime/time-bundles.ts +11 -12
  891. package/scripts/time-runtime/time-call-identity.ts +1 -1
  892. package/scripts/time-runtime/time-command-key.ts +2 -2
  893. package/scripts/time-runtime/time-density-hook.ts +8 -11
  894. package/scripts/time-runtime/time-density.ts +5 -5
  895. package/scripts/time-runtime/time-followup-stage.ts +7 -7
  896. package/scripts/time-runtime/time-format.ts +5 -5
  897. package/scripts/time-runtime/time-hook-transcript.ts +3 -3
  898. package/scripts/time-runtime/time-instant.ts +1 -1
  899. package/scripts/time-runtime/time-markers.ts +15 -19
  900. package/scripts/time-runtime/time-phase-names.ts +3 -3
  901. package/scripts/time-runtime/time-reported-failure.ts +15 -19
  902. package/scripts/time-runtime/time-round-trips.ts +20 -23
  903. package/scripts/time-runtime/time-shell.ts +8 -8
  904. package/scripts/time-runtime/time-single-check.ts +1 -2
  905. package/scripts/time-runtime/time-spans.ts +35 -40
  906. package/scripts/time-runtime/time-tool-call.ts +15 -16
  907. package/scripts/time-runtime/time-transcript-line.ts +53 -34
  908. package/scripts/time-runtime/time-writes.ts +5 -5
  909. package/scripts/ui/ui-routes-cli.ts +1 -2
  910. package/scripts/ui/ui-routes.ts +1 -2
  911. package/scripts/version/bump-version.ts +1 -1
  912. package/scripts/version/fresh-metadata-cache.ts +2 -2
  913. package/scripts/version/latest-corepack.ts +129 -98
  914. package/scripts/version/latest-lane-guard.ts +1 -1
  915. package/scripts/version/latest-scope-cli.ts +2 -2
  916. package/scripts/version/latest-stamp.ts +1 -2
  917. package/scripts/version/latest-update.ts +2 -2
  918. package/scripts/version/npm-registry.ts +2 -2
  919. package/scripts/version/package-manager-version.ts +18 -0
  920. package/scripts/version/publishable-range-check.ts +2 -1
  921. package/scripts/version/publishable-range.ts +1 -1
  922. package/scripts/version/release-age.ts +11 -11
  923. package/scripts/version/release-hold.ts +2 -2
  924. package/scripts/version/safe-chain-version-update.ts +3 -3
  925. package/scripts/version/version-check-logic.ts +2 -3
  926. package/scripts/version/version-check.ts +1 -2
  927. package/scripts/version/version-command-config.ts +2 -2
  928. package/scripts/version/version-commands.ts +3 -3
  929. package/scripts/version/version-remote.ts +4 -4
  930. package/scripts/version/version-targets.ts +2 -2
  931. package/templates/gitignore +7 -0
  932. package/templates/workflows/github-release.yml +4 -0
  933. package/dist/hooks/chunk-NV2JRZZO.js +0 -6385
  934. package/dist/hooks/chunk-RKUAD3I6.js +0 -90
  935. package/dist/hooks/chunk-WPALEIRX.js +0 -18
  936. package/scripts/backlog/backlog-restructure.ts +0 -152
  937. package/scripts/rules/issue-fold-rule.ts +0 -72
  938. package/scripts/rules/wip-cap.ts +0 -63
  939. package/scripts/run/run-issue-number.ts +0 -19
@@ -11,6 +11,7 @@ import { review_stamps } from '#scripts/review/review-stamps'
11
11
  import { review_tree } from '#scripts/review/review-tree'
12
12
  import { unit_worker_share } from '#scripts/test/unit-worker-share'
13
13
  import { core_budget } from './core-budget'
14
+ import { gate_ledger, type GateLedgerStart } from './gate-ledger'
14
15
  import { gate_plan, type GatePlan } from './gate-plan'
15
16
  import { gate_report, type GateStep, type GateStepResult } from './gate-report'
16
17
  import { gate_skip } from './gate-skip'
@@ -19,15 +20,10 @@ import { gate_tree, type GateTree } from './gate-tree'
19
20
  import { project_checks } from './project-checks'
20
21
  import { scoped_green, type ScopedSources } from './scoped-green'
21
22
 
22
- // joshuafolkken/kit#914: the completion gate's four checks are independent and share no mutable
23
- // state, yet every entry point ran them one after another — paid again on every `epicrun` child,
24
- // every `/code-review` fix and every `halfrun` stop. Worse than the seconds: a serial gate reports
25
- // one failure at a time, so a tree with a lint error and a type error costs two full round trips to
26
- // discover.
27
- //
28
- // The margin has narrowed as the checks gained caches and is re-measured rather than repeated: on
29
- // this repository today, 19.1s back to back against 15.1s together (joshuafolkken/kit#1258). How
30
- // many run at once, and how wide the unit suite fans out, are `gate-plan.ts`'s to decide.
23
+ // The completion gate's four checks are independent and share no mutable state, so they run
24
+ // together. Beyond the seconds: a serial gate reports one failure at a time, so a tree with a lint
25
+ // error and a type error would cost two full round trips to discover. How many run at once, and how
26
+ // wide the unit suite fans out, are `gate-plan.ts`'s to decide.
31
27
  //
32
28
  // Each step shells out to the `josh` sub-command that already defines it, rather than repeating the
33
29
  // underlying tool invocations here — one definition per check, in `josh-commands-development.ts`.
@@ -59,7 +55,7 @@ async function run_gate_step(step: GateStep): Promise<GateStepResult> {
59
55
  }
60
56
 
61
57
  // The record `josh review:brief` reads, written only on a fully green run and only with the tree it
62
- // was green on (joshuafolkken/kit#1241). `/code-review` runs in a forked process that reads none of
58
+ // was green on. `/code-review` runs in a forked process that reads none of
63
59
  // this repository's documents, so "the unit tests already passed" reaches it only if the invocation
64
60
  // carries it — and it may only carry it if something wrote down that they did, on **this** tree.
65
61
  //
@@ -68,15 +64,16 @@ async function run_gate_step(step: GateStep): Promise<GateStepResult> {
68
64
  // project has no tests — must not become "the unit tests all passed": the gate keeps that skip
69
65
  // visible on the console, and a record erasing it would have the brief tell a review agent not to
70
66
  // re-run tests that never ran. A step that passed **with a checker's warnings** is withheld for the
71
- // same reason one place further on (joshuafolkken/kit#1328): since the record is now reused instead of
72
- // the checks being re-run, a warning printed once would never be printed again on that tree, and
73
- // hiding an eslint or svelte-check finding is the same failure as hiding a skip. It is
74
- // `has_checker_warning`, not `has_warnings`, that decides this (joshuafolkken/kit#2318): the loose
67
+ // same reason one place further on: since the record is reused instead of the checks being re-run, a
68
+ // warning printed once would never be printed again on that tree, and hiding an eslint or
69
+ // svelte-check finding is the same failure as hiding a skip. It is `has_checker_warning`, not
70
+ // `has_warnings`, that decides this: the loose
75
71
  // marker match is right for the print path, where a false positive costs one printed body, but here a
76
72
  // false positive withholds the whole record and turns a green gate's `run:review --join` red — so a
77
73
  // benign line from another tool (a Vite config deprecation on `test:unit`) must not withhold it. A
78
74
  // tree that moved while
79
- // the checks were in flight (the `PostToolUse` formatter, an editor save) is not the tree they read.
75
+ // the checks were in flight (the `PostToolUse` formatter, an editor save) is not the tree they read —
76
+ // with no exception: no gate step writes to the tree.
80
77
  // And a failed write leaves no record at all, which a temp-directory problem must never turn into a
81
78
  // red gate.
82
79
  //
@@ -105,7 +102,7 @@ async function record_green_gate(
105
102
  }
106
103
  }
107
104
 
108
- // The marker that says a gate is running on this tree right now (joshuafolkken/kit#1242). The gate
105
+ // The marker that says a gate is running on this tree right now. The gate
109
106
  // and `/code-review` are started together — neither writes to the working tree — so by the time
110
107
  // `josh review:brief` composes the invocation the checks are usually still in flight. Without this
111
108
  // record that state reads as "no gate was ever run", and the review agent runs the unit suite the
@@ -114,8 +111,8 @@ async function record_green_gate(
114
111
  // **Both halves swallow their failure, and for the same reason `record_green_gate` does**: the
115
112
  // marker is a convenience for the next command and nothing about it may reach the gate's verdict. A
116
113
  // marker that could not be written costs a brief that says `Not verified`, which is the safe
117
- // direction; one that could not be cleared costs nothing beyond the file itself, because since
118
- // joshuafolkken/kit#1245 the record names the writing process by pid **and** start time — so a marker
114
+ // direction; one that could not be cleared costs nothing beyond the file itself, because the record
115
+ // names the writing process by pid **and** start time — so a marker
119
116
  // this gate leaves behind reads as not running from the moment the gate exits, however long it sits
120
117
  // there and whatever the operating system later does with that pid. The next gate overwrites it.
121
118
  function mark_gate_running(before: Record<string, string>, target?: string): void {
@@ -154,8 +151,8 @@ async function with_gate_marker<T>(
154
151
  }
155
152
  }
156
153
 
157
- // This gate's share of the machine, resolved once at the gate's entry and carried down as one value
158
- // (joshuafolkken/kit#2351). `available_cores` is the budget every check reserves against; `is_reserved`
154
+ // This gate's share of the machine, resolved once at the gate's entry and carried down as one value.
155
+ // `available_cores` is the budget every check reserves against; `is_reserved`
159
156
  // is false for a gate nested inside another gate's unit suite — this repository's own gate tests — so
160
157
  // the outer gate reserves and every gate beneath it does not. Captured before this gate sets
161
158
  // `JOSH_UNIT_RUN_MARKED`, which is why it is read at entry rather than re-derived here.
@@ -171,12 +168,13 @@ function default_budget(): BudgetContext {
171
168
  }
172
169
  }
173
170
 
174
- // A gate step paired with the cores it reserves from the machine-wide budget while it runs
175
- // (joshuafolkken/kit#2351). The weight travels with the step so `run_gate_steps` never has to re-pair a
171
+ // A gate step paired with the cores it reserves from the machine-wide budget while it runs.
172
+ // The weight travels with the step so `run_gate_steps` never has to re-pair a
176
173
  // step with its check by index.
177
174
  interface ReservedStep {
178
175
  step: GateStep
179
176
  weight: number
177
+ memory_mb: number
180
178
  }
181
179
 
182
180
  async function build_reserved_steps(
@@ -188,12 +186,13 @@ async function build_reserved_steps(
188
186
  plan.checks.map(async (check) => ({
189
187
  step: await build_gate_step(check, start_directory, plan),
190
188
  weight: gate_plan.check_weight(check, plan, available_cores),
189
+ memory_mb: gate_plan.check_memory(check, plan, available_cores),
191
190
  })),
192
191
  )
193
192
  }
194
193
 
195
194
  // **A nested gate takes no reservation, and the budget is what makes that necessary rather than
196
- // merely tidy** (joshuafolkken/kit#2351). The unit step spawns the suite, which runs this repository's
195
+ // merely tidy**. The unit step spawns the suite, which runs this repository's
197
196
  // own gate tests; each of those is a gate inside the outer gate's unit reservation, and a place it
198
197
  // claimed would wait for cores the outer gate cannot free until the suite — this test included —
199
198
  // finishes.
@@ -205,26 +204,29 @@ async function run_reserved_step(
205
204
 
206
205
  return await core_budget.with_core_reservation(
207
206
  reserved.weight,
208
- async () => await run_gate_step(reserved.step),
209
- { budget: budget.available_cores },
207
+ async (admission) => ({
208
+ ...(await run_gate_step(reserved.step)),
209
+ budget_note: core_budget.describe_overflow(admission),
210
+ }),
211
+ { budget: budget.available_cores, memory_mb: reserved.memory_mb },
210
212
  )
211
213
  }
212
214
 
213
215
  // `bounded_pool` rather than a bare `Promise.all`, so the plan's `concurrency` is what decides how
214
- // many run at once (joshuafolkken/kit#1258). **The all-failures-in-one-pass property survives the
216
+ // many run at once. **The all-failures-in-one-pass property survives the
215
217
  // change** because no check ever rejects: `buffered_process` reports a non-zero exit as a value, so
216
218
  // the pool's first-failure abort — written for callers that spawn real Claude sessions — never
217
219
  // fires here and every queued check still runs. Results come back in input order however they
218
220
  // finished, which is what keeps the printed sections in declaration order. Each step first claims its
219
- // place in the machine-wide budget and waits while the budget is full (joshuafolkken/kit#2351).
221
+ // place in the machine-wide budget and waits while the budget is full.
220
222
  async function run_gate_steps(
221
223
  plan: GatePlan,
222
224
  budget: BudgetContext = default_budget(),
223
225
  ): Promise<ReadonlyArray<GateStepResult>> {
224
226
  const reserved = await build_reserved_steps(process.cwd(), plan, budget.available_cores)
225
227
 
226
- // **The checks run under the held mark, so a check's own dispatch claims nothing**
227
- // (joshuafolkken/kit#3345). Each check is a `pnpm josh <target>` child, and a target that declares
228
+ // **The checks run under the held mark, so a check's own dispatch claims nothing**.
229
+ // Each check is a `pnpm josh <target>` child, and a target that declares
228
230
  // a weight would otherwise claim a second place for the cores reserved for it here. A nested gate
229
231
  // sets the mark too, since its checks are covered by the outer gate's reservation.
230
232
  return await core_budget.with_held_mark(
@@ -237,15 +239,15 @@ async function run_gate_steps(
237
239
  )
238
240
  }
239
241
 
240
- // **Both markers are claims about the unit suite, so a gate that is not running it makes neither**
241
- // (joshuafolkken/kit#1226). The in-flight marker tells the next `josh review:brief` that a gate is
242
+ // **Both markers are claims about the unit suite, so a gate that is not running it makes neither**.
243
+ // The in-flight marker tells the next `josh review:brief` that a gate is
242
244
  // covering this tree right now, which is what stops a review agent re-running the suite; the
243
245
  // unit-run marker tells a sibling lane a vitest run is on the machine, which is what makes that
244
246
  // lane divide its own workers. A `--no-unit` gate that wrote either would be answering for a check
245
247
  // it never started — the first by telling a review the tests are covered when they are running in a
246
248
  // different CI job, the second by throttling a lane on its behalf.
247
249
  //
248
- // **The work the markers cover ends at the green record, not at the last check** (joshuafolkken/kit#2434).
250
+ // **The work the markers cover ends at the green record, not at the last check**.
249
251
  // Cleared before `record_green_gate` wrote, the in-flight marker left a gap of tens of milliseconds in
250
252
  // which `run:review --join` read neither a running gate nor a green one — and answered RED for a gate
251
253
  // that was about to record green. Cleared after it, a reader that sees no marker is reading a gate
@@ -271,11 +273,16 @@ async function run_marked_gate<T>(
271
273
  // a core count the plan was not derived from — the one misreading this line exists to prevent.
272
274
  // The concurrent-run count is read here rather than inside `gate-plan.ts` for the reason the core
273
275
  // count already is: that module stays a pure function of its inputs, and the machine is asked once and
274
- // handed to both calls. Counted *before* the unit step writes its own marker, so `+ 1` is this gate
275
- // (joshuafolkken/kit#1515).
276
+ // handed to both calls. Counted *before* the unit step writes its own marker, so `+ 1` is this gate.
276
277
  function announce_gate_plan(is_unit_included: boolean, available_cores: number): GatePlan {
277
278
  const concurrent_runs = unit_worker_share.live_run_count() + unit_worker_share.SOLO_RUNS
278
- const plan = gate_plan.resolve_gate_plan(available_cores, concurrent_runs, is_unit_included)
279
+ const is_kit_repository = project_checks.is_kit_repository(process.cwd())
280
+ const plan = gate_plan.resolve_gate_plan(
281
+ available_cores,
282
+ concurrent_runs,
283
+ is_unit_included,
284
+ is_kit_repository,
285
+ )
279
286
 
280
287
  process.stdout.write(`${gate_plan.format_gate_plan(plan, available_cores, concurrent_runs)}\n`)
281
288
 
@@ -300,20 +307,20 @@ interface GateOptions {
300
307
  // inside `pnpm josh gate`, so a test writing to the shared path would overwrite the live gate's
301
308
  // own log with the output of four checks that never ran.
302
309
  log_path?: string
303
- // **The scoped pre-check the CLI entry turns on** (joshuafolkken/kit#2296). Off everywhere else so
310
+ // **The scoped pre-check the CLI entry turns on**. Off everywhere else so
304
311
  // that a direct `run_verification_gate` call — the whole of `verification-gate.test.ts` — is never
305
312
  // refused by a real checkout's missing scoped record; `run_gate_command` sets it true.
306
313
  is_scoped_enforced?: boolean
307
314
  // The scoped records' paths, overridable so a test can plant a green pair rather than depend on the
308
315
  // surrounding checkout's — the reason `scoped-green.ts` takes a `source` per stamp.
309
316
  scoped_sources?: ScopedSources
310
- // The lane ledger a finished gate's duration is appended to (joshuafolkken/kit#3355). Only the CLI
317
+ // The lane ledger a finished gate's duration is appended to. Only the CLI
311
318
  // entry resolves it, so a suite driving the gate never writes a measurement of checks that never ran.
312
319
  ledger_path?: string | undefined
313
320
  }
314
321
 
315
322
  // **The gate refuses to start when the scoped pair has not been green on this tree**
316
- // (joshuafolkken/kit#2296) — the same record `josh review:brief` reads, applied one step earlier so the
323
+ // — the same record `josh review:brief` reads, applied one step earlier so the
317
324
  // first gate is the only gate. It is the CLI entry's check alone (`is_scoped_enforced`), and it never
318
325
  // fires for CI's `--no-unit` gate or a `--force` run: CI has no scoped record in front of it, and
319
326
  // `--force` is the caller saying to run regardless. `scoped_green` owns the record and the `JOSH_SCOPED_GREEN`
@@ -325,12 +332,12 @@ function scoped_precheck_refusal(tree: GateTree, options: GateOptions): string |
325
332
  return scoped_green.refusal_for(tree.files, tree.base, options.scoped_sources)
326
333
  }
327
334
 
328
- // **A partial gate records nothing green, and this is the same rule as the skip one layer out**
329
- // (joshuafolkken/kit#1226). The record's whole meaning to `josh review:brief` and to `gate_skip` is
335
+ // **A partial gate records nothing green, and this is the same rule as the skip one layer out**.
336
+ // The record's whole meaning to `josh review:brief` and to `gate_skip` is
330
337
  // "every check this repository gates on passed on exactly this tree"; a `--no-unit` run proves three
331
338
  // of the four, so writing it would let the next full `josh gate` be skipped on a tree whose unit
332
- // suite nobody ran here — a check reporting success without having run, which is the state
333
- // joshuafolkken/kit#1224 exists to refuse.
339
+ // suite nobody ran here — a check reporting success without having run, which is the state the
340
+ // skip rule exists to refuse.
334
341
  async function record_whole_gate(
335
342
  plan: GatePlan,
336
343
  results: ReadonlyArray<GateStepResult>,
@@ -343,12 +350,12 @@ async function record_whole_gate(
343
350
  }
344
351
 
345
352
  // Reports the checks and records a green result — inside the markers, so the in-flight one outlives
346
- // the record it announces (joshuafolkken/kit#2434).
353
+ // the record it announces.
347
354
  async function settle_gate(
348
355
  plan: GatePlan,
349
356
  results: ReadonlyArray<GateStepResult>,
350
357
  tree: GateTree,
351
- options: GateOptions & { started_at: number },
358
+ options: GateOptions & { started_at: number; ledger: GateLedgerStart },
352
359
  ): Promise<number> {
353
360
  const elapsed_ms = performance.now() - options.started_at
354
361
  const failed_labels = gate_report.report_gate_steps(results, {
@@ -359,9 +366,7 @@ async function settle_gate(
359
366
  })
360
367
  const is_passed = failed_labels.length === 0
361
368
 
362
- if (options.ledger_path !== undefined) {
363
- await lane_ledger.record_gate(options.ledger_path, elapsed_ms, is_passed)
364
- }
369
+ await gate_ledger.record(options.ledger, results, { elapsed_ms, is_passed })
365
370
 
366
371
  if (!is_passed) return FAIL_EXIT_CODE
367
372
 
@@ -373,15 +378,18 @@ async function settle_gate(
373
378
  // The plan line is printed by the checked path alone. A run that announced a four-way fan-out and
374
379
  // then skipped would be describing something that never happened, and the skip's own line already
375
380
  // says everything there is to say about a gate that started no process. The reporting itself is
376
- // `gate-report.ts`'s (joshuafolkken/kit#2296).
381
+ // `gate-report.ts`'s.
377
382
  async function run_checked_gate(
378
383
  tree: GateTree,
379
384
  options: GateOptions,
380
385
  started_at: number,
381
386
  ): Promise<number> {
382
387
  const is_unit_included = options.is_unit_included ?? true
388
+ // Read before the concurrent-run count, never between it and the marker below: the reading waits out
389
+ // a sample window, and a lane counting inside that window would miss this gate.
390
+ const ledger = await gate_ledger.start(options.ledger_path)
383
391
  // Resolved at the gate's entry, before this gate sets `JOSH_UNIT_RUN_MARKED`, so a gate nested in the
384
- // unit suite reads the flag as set and reserves nothing (joshuafolkken/kit#2351).
392
+ // unit suite reads the flag as set and reserves nothing.
385
393
  const budget = default_budget()
386
394
  const plan = announce_gate_plan(is_unit_included, budget.available_cores)
387
395
 
@@ -390,11 +398,11 @@ async function run_checked_gate(
390
398
  // together — the shape `epicrun` produces — would both read "nothing else is running" and both take
391
399
  // the whole machine. Claimed here, after the count and before any check, it is already there when
392
400
  // the next lane asks; the guard inside the spawned `josh test:unit` sees the handoff and adds no
393
- // second marker for the same run (joshuafolkken/kit#1515).
401
+ // second marker for the same run.
394
402
  async function run_and_settle(): Promise<number> {
395
403
  const results = await run_gate_steps(plan, budget)
396
404
 
397
- return await settle_gate(plan, results, tree, { ...options, started_at })
405
+ return await settle_gate(plan, results, tree, { ...options, started_at, ledger })
398
406
  }
399
407
 
400
408
  return await run_marked_gate(tree.files, plan, run_and_settle, options.marker_path)
@@ -410,8 +418,7 @@ function reusable_stamp(tree: GateTree, options: GateOptions): FileMapStamp | un
410
418
 
411
419
  // The two ways a gate ends before it runs a check: a green record it can reuse (exit 0), and the
412
420
  // scoped pre-check refusing a tree the pair has not been green on (exit 1). `undefined` means neither
413
- // fired and the checks run. **Nothing else stands between the skip and the checks** (joshuafolkken/kit#1486):
414
- // joshuafolkken/kit#1437's `package.json` refusal was removed once children stopped bumping.
421
+ // fired and the checks run. **Nothing else stands between the skip and the checks.**
415
422
  function short_circuit_gate(tree: GateTree, options: GateOptions): number | undefined {
416
423
  const reusable = reusable_stamp(tree, options)
417
424
 
@@ -6,7 +6,7 @@ import { git_gh_exec } from './git-gh-exec'
6
6
  // synchronously because `josh init` / `josh sync` / `josh doctor` decide before they can await.
7
7
  // It asks REST for the same reason — `gh repo view` goes through GraphQL, which a cloud session is
8
8
  // refused (403), and a repository that reads as unresolved makes `init` / `sync` skip
9
- // `sonar-project.properties` outright (joshuafolkken/kit#1023). The path comes from the shared
9
+ // `sonar-project.properties` outright. The path comes from the shared
10
10
  // builder rather than being spelled out again here.
11
11
  //
12
12
  // An unbounded lookup asks for `NO_BUDGET`, execa's own "no timeout": the shared layer otherwise
@@ -29,7 +29,7 @@ function fetch_repo_name(timeout_ms: number | undefined): string | undefined {
29
29
  // The unbounded lookup, for callers whose *writes* depend on the answer. A timeout would surface as
30
30
  // an unresolved repository, and `josh init` / `josh sync` react to that by skipping
31
31
  // `sonar-project.properties` entirely — so a latency spike would silently leave a consumer's Sonar
32
- // config stale. Waiting is the safer failure mode there (joshuafolkken/kit#805).
32
+ // config stale. Waiting is the safer failure mode there.
33
33
  function get_repo_name_with_owner(): string | undefined {
34
34
  return fetch_repo_name(undefined)
35
35
  }
@@ -111,8 +111,9 @@ function classify_claude_comment(comment: ReviewComment): ClassifiedFinding {
111
111
  }
112
112
  }
113
113
 
114
- // Temporary (kit#753): CodeRabbit actionable comments are informational, never blockers, so a
115
- // slow CodeRabbit review cannot stall the merge gate. Revert together with kit#752.
114
+ // Temporary: CodeRabbit actionable comments are informational, never blockers, so a
115
+ // slow CodeRabbit review cannot stall the merge gate. Revert together with the rest of the
116
+ // temporary CodeRabbit non-blocking policy.
116
117
  function build_coderabbit_info(comment: ReviewComment, count: number): ClassifiedFinding {
117
118
  return {
118
119
  author_login: comment.author_login,
@@ -4,11 +4,11 @@
4
4
  // decision was already being spelled out per call site — in `git-gh-issue-read.ts`, and as a bare
5
5
  // string concatenation in `git-gh-pr.ts` and `epic-cross-repo.ts`. All three now build their paths
6
6
  // from here. Converting kit's GitHub calls to REST multiplies those call sites, so the decision is
7
- // made once rather than at each one (joshuafolkken/kit#1023).
7
+ // made once rather than at each one.
8
8
 
9
9
  // One full page of a listing. REST answers 30 rows by default, and every listing this tooling reads
10
10
  // is paged through with `--paginate`, so asking for the largest page turns a long listing into fewer
11
- // round trips. Named once because three readers append it (joshuafolkken/kit#1028).
11
+ // round trips. Named once because three readers append it.
12
12
  const FULL_PAGE_QUERY = '?per_page=100'
13
13
 
14
14
  // `gh api` expands `{owner}` and `{repo}` from the current repository, so the unqualified form needs
@@ -19,7 +19,7 @@ function repo_api_path(repo = '{owner}/{repo}'): string {
19
19
  }
20
20
 
21
21
  // The issue collection — what a listing pages through and what a creation posts to. One segment,
22
- // named once: the reads, the listing and the writes all build on it (joshuafolkken/kit#1026).
22
+ // named once: the reads, the listing and the writes all build on it.
23
23
  function issues_api_path(repo?: string): string {
24
24
  return `${repo_api_path(repo)}/issues`
25
25
  }
@@ -30,15 +30,14 @@ function issue_api_path(issue_number: string, repo?: string): string {
30
30
 
31
31
  // The dependency relations, which REST serves from their own endpoint rather than inside the issue.
32
32
  // Named here because three call sites address it — the read in `git-gh-issue-read.ts` and both
33
- // writes in `git-gh-issue-write.ts` (joshuafolkken/kit#1026).
33
+ // writes in `git-gh-issue-write.ts`.
34
34
  function blocked_by_api_path(issue_number: string, repo?: string): string {
35
35
  return `${issue_api_path(issue_number, repo)}/dependencies/blocked_by`
36
36
  }
37
37
 
38
38
  // A pull request's *conversation* comments. REST serves them from the issue endpoint rather than the
39
39
  // pull one — `pulls/{N}/comments` is the review thread, which is a different listing with a
40
- // different shape, and reading one where the other was meant is a silent mistake rather than a 404
41
- // (joshuafolkken/kit#1027).
40
+ // different shape, and reading one where the other was meant is a silent mistake rather than a 404.
42
41
  function issue_comments_api_path(issue_number: string, repo?: string): string {
43
42
  return `${issue_api_path(issue_number, repo)}/comments`
44
43
  }
@@ -49,14 +48,14 @@ function pulls_api_path(repo?: string): string {
49
48
  }
50
49
 
51
50
  // One pull request, addressed by number. `gh pr view` accepted a branch name and REST does not, so
52
- // every read below the branch lookup names the number instead (joshuafolkken/kit#1027).
51
+ // every read below the branch lookup names the number instead.
53
52
  function pull_api_path(pr_number: string, repo?: string): string {
54
53
  return `${pulls_api_path(repo)}/${pr_number}`
55
54
  }
56
55
 
57
56
  // The merge of one pull request. `gh pr merge <branch> --merge` is the GraphQL call this replaces,
58
57
  // and the method it named is sent as the `merge_method` field of the request body rather than being
59
- // left to the endpoint's default (joshuafolkken/kit#1029).
58
+ // left to the endpoint's default.
60
59
  function pull_merge_api_path(pr_number: string, repo?: string): string {
61
60
  return `${pull_api_path(pr_number, repo)}/merge`
62
61
  }
@@ -68,7 +67,7 @@ function pull_comments_api_path(pr_number: string, repo?: string): string {
68
67
  }
69
68
 
70
69
  // The review history of one pull request. There is no REST counterpart to GraphQL's
71
- // `reviewDecision`, so the merge gate folds this listing into one instead (joshuafolkken/kit#1028).
70
+ // `reviewDecision`, so the merge gate folds this listing into one instead.
72
71
  function pull_reviews_api_path(pr_number: string, repo?: string): string {
73
72
  return `${pull_api_path(pr_number, repo)}/reviews`
74
73
  }
@@ -92,13 +91,13 @@ function commit_status_api_path(commit_sha: string, repo?: string): string {
92
91
  }
93
92
 
94
93
  // A single tag reference. REST answers 404 when the tag does not exist, which is the whole of the
95
- // question the release command's tag watch asks (joshuafolkken/kit#1169).
94
+ // question the release command's tag watch asks.
96
95
  function tag_reference_api_path(tag: string, repo?: string): string {
97
96
  return `${repo_api_path(repo)}/git/ref/tags/${tag}`
98
97
  }
99
98
 
100
99
  // The GitHub Release published for one tag. REST answers 404 until `publish.yml`'s `create-release`
101
- // job has run, which is what the release command's progress watch asks (joshuafolkken/kit#3193).
100
+ // job has run, which is what the release command's progress watch asks.
102
101
  function release_by_tag_api_path(tag: string, repo?: string): string {
103
102
  return `${repo_api_path(repo)}/releases/tags/${tag}`
104
103
  }
@@ -7,10 +7,10 @@ import { gh_failure } from './git-gh-failure'
7
7
 
8
8
  const BODY_FROM_STDIN = '-'
9
9
 
10
- // The budget for **one** request through this layer, and the reason nothing here waits forever
11
- // (joshuafolkken/kit#1065). Every GitHub access kit makes funnels through the four entries below, so
12
- // until this existed a single hung `gh` held the caller open with no upper bound — most visibly in
13
- // `josh propagate`, whose runner is single-threaded and processed no further consumer at all.
10
+ // The budget for **one** request through this layer, and the reason nothing here waits forever.
11
+ // Every GitHub access kit makes funnels through the four entries below, so without it a single hung
12
+ // `gh` would hold the caller open with no upper bound — most visibly in `josh propagate`, whose
13
+ // runner is single-threaded and would process no further consumer at all.
14
14
  //
15
15
  // **It is a request's budget, not a step's.** `STEP_TIMEOUT_MS` (30 minutes, `propagate-steps.ts`)
16
16
  // covers a consumer's whole unit suite and a `pnpm add`; one REST call has no business borrowing
@@ -33,7 +33,7 @@ const BODY_FROM_STDIN = '-'
33
33
  //
34
34
  // **What a timed-out read costs its caller is decided by that caller, and two are worth naming.**
35
35
  // In the merge gate's poll loop (`wait_for_pr_success`) it is one unreadable poll: the loop retries
36
- // on its next interval and gives up on the third consecutive failure (joshuafolkken/kit#1077), so a
36
+ // on its next interval and gives up on the third consecutive failure, so a
37
37
  // timeout, a 403, a rate limit and a dropped connection all end the wait loudly rather than hanging
38
38
  // or reading as a verdict, and re-running `followup` resumes it. In `followup`'s look-ahead it costs
39
39
  // a log line: `handle_watch_failure` absorbs the error and falls through to the polling.
@@ -59,22 +59,22 @@ function to_timeout_option(timeout_ms?: number): { timeout: number } {
59
59
  return { timeout: timeout_ms ?? GH_REQUEST_TIMEOUT_MS }
60
60
  }
61
61
 
62
- // **`gh` dials GitHub directly, never through a proxy this machine stood up on loopback**
63
- // (joshuafolkken/kit#2436). A package-manager wrapper writes one into the environment of everything
62
+ // **`gh` dials GitHub directly, never through a proxy this machine stood up on loopback**.
63
+ // A package-manager wrapper writes one into the environment of everything
64
64
  // its invocation spawns, and it exists to inspect package downloads — api.github.com crosses it
65
- // without inspection, so the hop buys nothing and can fail on its own: measured on
66
- // joshuafolkken/kit#2422, one 30-second stall made the wrapper refuse every later GitHub connection
67
- // of that `followup`, and the retries in the poll loop could only ever fail. The loopback test and
68
- // the list of spellings are the agent-session launcher's (joshuafolkken/kit#1760), shared rather than
65
+ // without inspection, so the hop buys nothing and can fail on its own: one 30-second stall makes the
66
+ // wrapper refuse every later GitHub connection of that `followup`, and the retries in the poll loop
67
+ // can then only ever fail. The loopback test and
68
+ // the list of spellings are the agent-session launcher's, shared rather than
69
69
  // restated. Only the scanner's proxy goes — recognized by its CA — because any other loopback proxy
70
70
  // may be this machine's only route out; a proxy naming a real host is somebody's network and stays.
71
71
  // Nothing is spread when there is nothing to remove, so a spawn outside such a wrapper keeps its
72
72
  // options exactly as they were.
73
73
  //
74
74
  // **It is exported for the one spawn that is not a REST request** — `josh start`'s `gh repo create`
75
- // step (`start-exec.ts`). Every `gh api` request goes through the entries below since
76
- // joshuafolkken/kit#2901, which `gh-subcommand-guard.test.ts` enforces, and
77
- // `git-gh-exec-proxy.test.ts` still refuses a `gh api` spawn that does not spread it.
75
+ // step (`start-exec.ts`). Every `gh api` request goes through the entries below, which
76
+ // `gh-subcommand-guard.test.ts` enforces, and `git-gh-exec-proxy.test.ts` still refuses a `gh api`
77
+ // spawn that does not spread it.
78
78
  interface DirectEnvironment {
79
79
  env?: Record<string, undefined>
80
80
  }
@@ -92,7 +92,7 @@ interface SpawnOptions extends DirectEnvironment {
92
92
 
93
93
  // `cwd` is spread in only when given: `{owner}/{repo}` in a path is resolved from the checkout gh
94
94
  // runs in, so a caller pinned to the project root says so, and every other caller keeps inheriting
95
- // the process's own directory exactly as before.
95
+ // the process's own directory.
96
96
  function to_spawn_options(timeout_ms?: number, cwd?: string): SpawnOptions {
97
97
  return {
98
98
  ...to_timeout_option(timeout_ms),
@@ -103,10 +103,10 @@ function to_spawn_options(timeout_ms?: number, cwd?: string): SpawnOptions {
103
103
 
104
104
  // What a request that ran out of time is labelled with, ahead of whatever gh managed to write.
105
105
  //
106
- // The distinction is joshuafolkken/kit#1048's, on a new failure: "the server said no" and "nobody
107
- // ever got an answer" are different diagnoses, and a timeout is the second. execa names it on the
108
- // error it throws, and without the prefix a hang that had written a line to stderr first would
109
- // arrive as that line — reported as whatever it happened to say instead of as a timeout.
106
+ // "The server said no" and "nobody ever got an answer" are different diagnoses, and a timeout is
107
+ // the second. execa names it on the error it throws, and without the prefix a hang that had written
108
+ // a line to stderr first would arrive as that line — reported as whatever it happened to say
109
+ // instead of as a timeout.
110
110
  const GH_REQUEST_TIMEOUT_MESSAGE = 'gh request timed out'
111
111
 
112
112
  function has_stderr_field(error: unknown): error is Error & { stderr: string } {
@@ -120,26 +120,24 @@ function has_stdout_field(error: unknown): error is Error & { stdout: string } {
120
120
  }
121
121
 
122
122
  // `has_timed_out` is shared with the push transport rather than restated here: execa marks a spawn
123
- // it killed the same way whichever binary was spawned, and `git push` gained a budget of its own in
124
- // joshuafolkken/kit#1251.
123
+ // it killed the same way whichever binary was spawned, and `git push` has a budget of its own.
125
124
  function to_timeout_prefix(error: unknown): string {
126
125
  return has_timed_out(error) ? `${GH_REQUEST_TIMEOUT_MESSAGE}: ` : ''
127
126
  }
128
127
 
129
- // Surface the gh CLI's stderr as the thrown message when present (matching the previous spawn
130
- // behavior), otherwise fall back to execa's own message — **and append what gh wrote to stdout**.
128
+ // Surface the gh CLI's stderr as the thrown message when present, otherwise fall back to execa's
129
+ // own message — **and append what gh wrote to stdout**.
131
130
  //
132
131
  // The append is not cosmetic. `gh api` splits a failed request across both streams: stderr carries
133
132
  // one summary line (`gh: Validation Failed (HTTP 422)`) and **stdout carries the JSON error body**,
134
- // which is the only place the reason is written. Every caller here is now a REST request, so
135
- // dropping stdout dropped the diagnosis from every REST failure — and `handle_pr_create_error`
136
- // reads the reason: a duplicate pull request is `A pull request already exists for <owner>:<branch>.`
137
- // inside that body, and matching it against stderr alone answers no (measured on
138
- // joshuafolkken/kit#1029).
133
+ // which is the only place the reason is written. Every caller here is a REST request, so dropping
134
+ // stdout would drop the diagnosis from every REST failure — and `handle_pr_create_error` reads the
135
+ // reason: a duplicate pull request is `A pull request already exists for <owner>:<branch>.` inside
136
+ // that body, and matching it against stderr alone answers no.
139
137
  //
140
138
  // The same stdout is what carries the request's own failure nature, so the classification is
141
139
  // attached here rather than reconstructed by a later probe: GitHub's error document names its status
142
- // and a request that never arrived wrote no document at all (joshuafolkken/kit#1690).
140
+ // and a request that never arrived wrote no document at all.
143
141
  function to_gh_error(error: unknown): Error {
144
142
  const stderr = has_stderr_field(error) ? error.stderr.trim() : ''
145
143
  const stdout = has_stdout_field(error) ? error.stdout.trim() : ''
@@ -210,24 +208,22 @@ function status_of_failure(error: unknown): number | undefined {
210
208
  // The HTTP status of one `gh api` request, read from the status line rather than from `gh`'s error
211
209
  // text. A message is prose that can be reworded between releases; the status code is the protocol,
212
210
  // so a caller distinguishing "there is nothing at that number" (404) from "the read failed" (403,
213
- // 429, 5xx) is matching a contract instead of a string (joshuafolkken/kit#957).
211
+ // 429, 5xx) is matching a contract instead of a string.
214
212
  //
215
213
  // `--silent` drops the response body, so only the headers are parsed; `--include` keeps them even
216
214
  // when the request failed, and execa carries that output on the error it throws. `undefined` means
217
215
  // no status was reached at all — gh missing, a dropped connection — which is itself a failed read.
218
216
  //
219
- // **The fifth spawn in this file, and guarded like the other four** (joshuafolkken/kit#1065). It is
220
- // not one of the entries joshuafolkken/kit#1065 enumerated, and that is exactly why it is included:
221
- // leaving one unbounded `gh` spawn beside four bounded ones is the inconsistency that Issue argues
222
- // against, in the same file. Its contract is unchanged — a timeout reaches the `catch` and answers
223
- // `undefined`, which already means "no status was reached", which its one caller already reads as a
224
- // failed read rather than as a 404.
217
+ // **The fifth spawn in this file, and guarded like the other four**: leaving one unbounded `gh`
218
+ // spawn beside four bounded ones would be an inconsistency in the same file. A timeout reaches the
219
+ // `catch` and answers `undefined`, which already means "no status was reached", which its one
220
+ // caller already reads as a failed read rather than as a 404.
225
221
  async function exec_gh_api_status(path: string, timeout_ms?: number): Promise<number | undefined> {
226
222
  // Hoisted so the spawn below fits on one line, which `// NOSONAR` requires — it suppresses only
227
223
  // the line it sits on. The **argument list** stays an inline literal for the opposite reason:
228
224
  // `gh-subcommand-guard.ts` resolves the subcommand from it, and hoisting that into a `const`
229
225
  // makes the scan report `<dynamic>` instead of `api`, leaving a future edit to
230
- // `['issue', 'view', …]` uncaught (joshuafolkken/kit#1063).
226
+ // `['issue', 'view', …]` uncaught.
231
227
  const options = to_spawn_options(timeout_ms)
232
228
 
233
229
  try {
@@ -241,7 +237,7 @@ async function exec_gh_api_status(path: string, timeout_ms?: number): Promise<nu
241
237
  }
242
238
 
243
239
  // The synchronous twin of `exec_gh_api_status`, for `epic-cross-repo.ts`, whose resolver is
244
- // synchronous all the way up to `epic_classify` (joshuafolkken/kit#2901). Same request, same
240
+ // synchronous all the way up to `epic_classify`. Same request, same
245
241
  // answer: the status line, or `undefined` when no status was reached. It cannot run
246
242
  // `check_gh_installed`, which awaits — a missing gh is a spawn that throws without stdout, so it
247
243
  // answers `undefined`, which is what that check would have led to anyway.
@@ -280,7 +276,7 @@ const JQ_FLAG = '--jq'
280
276
  // this field exists for: `--paginate` alone emits one document per page, so a two-page response
281
277
  // arrives as `{…}{…}`, which `JSON.parse` rejects, and `--slurp` wraps those pages in one outer
282
278
  // array instead. It is a separate field rather than implied by `should_paginate` for that reason,
283
- // and because gh refuses it alongside `--jq` (joshuafolkken/kit#1027).
279
+ // and because gh refuses it alongside `--jq`.
284
280
  interface GhApiRequest {
285
281
  path: string
286
282
  method?: string
@@ -289,9 +285,9 @@ interface GhApiRequest {
289
285
  should_slurp?: boolean
290
286
  jq_filter?: string
291
287
  // The budget for this one request, overriding `GH_REQUEST_TIMEOUT_MS`. A field rather than a
292
- // second argument for the reason recorded beside that constant (joshuafolkken/kit#1065). `0` is
288
+ // second argument for the reason recorded beside that constant. `0` is
293
289
  // execa's own "no budget", kept for the one reader whose caller's writes depend on the answer
294
- // (`gh-spawn.ts`, joshuafolkken/kit#805).
290
+ // (`gh-spawn.ts`).
295
291
  timeout_ms?: number
296
292
  // The checkout gh runs in, which is what `{owner}/{repo}` in `path` resolves against. Absent means
297
293
  // the process's own directory.
@@ -319,8 +315,8 @@ function to_gh_api_args(request: GhApiRequest): Array<string> {
319
315
  }
320
316
 
321
317
  // The response body of one `gh api` request, as text. Every REST caller that can await one goes
322
- // through it, so the verb, the body and the paging stop being spelled out per call site
323
- // (joshuafolkken/kit#1023). A caller that cannot await uses `exec_gh_api_sync` or
318
+ // through it, so the verb, the body and the paging stop being spelled out per call site.
319
+ // A caller that cannot await uses `exec_gh_api_sync` or
324
320
  // `read_gh_api_sync` below.
325
321
  //
326
322
  // Failure handling funnels through `to_gh_error` on both paths below, so a failed request throws
@@ -344,12 +340,11 @@ async function exec_gh_api(request: GhApiRequest): Promise<string> {
344
340
  // consumer's steps as a sequential chain of `execaSync` spawns with inherited stdio, and that shape
345
341
  // reaches from `open_issue` up through `RunStep`, `run_target` and `run_targets` — so the issue it
346
342
  // opens in the consumer is created here rather than by turning the whole runner asynchronous for
347
- // one request (joshuafolkken/kit#1042).
343
+ // one request.
348
344
  //
349
- // It began as the write side's synchronous entry; since joshuafolkken/kit#2901 the synchronous
350
- // readers — `gh-spawn.ts`, `epic-cross-repo.ts`, `repo-setting.ts`, `propagate-publish.ts`,
351
- // `version-remote.ts` — go through it too, rather than each spelling its own `execaSync('gh', …)`
352
- // with its own error handling, timeout and proxy handling.
345
+ // It serves the write side and the synchronous readers alike — `gh-spawn.ts`, `epic-cross-repo.ts`,
346
+ // `repo-setting.ts`, `propagate-publish.ts`, `version-remote.ts` go through it rather than each
347
+ // spelling its own `execaSync('gh', …)` with its own error handling, timeout and proxy handling.
353
348
  //
354
349
  // **It is the same layer, not a second one.** The argument builder and the error translation are
355
350
  // shared with the asynchronous path above, so `--input -` for the body, `--jq` for the unwrap, and