@joshuafolkken/kit 1.1240.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 (934) hide show
  1. package/.claude/agents/investigator.md +1 -0
  2. package/.claude/settings.json +4 -0
  3. package/.claude/skills/dependency-update/SKILL.md +5 -3
  4. package/.claude/skills/epic-commands/SKILL.md +82 -113
  5. package/.claude/skills/epic-commands/epic-bundle.md +38 -63
  6. package/.claude/skills/epic-commands/execution-waves.md +30 -51
  7. package/.claude/skills/verify-ui/SKILL.md +13 -20
  8. package/.claude/skills/workflow-commands/SKILL.md +10 -10
  9. package/.claude/skills/workflow-commands/background-commands.md +4 -4
  10. package/.claude/skills/workflow-commands/backlogrun-child.md +30 -105
  11. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +29 -0
  12. package/.claude/skills/workflow-commands/backlogrun-lanes.md +45 -131
  13. package/.claude/skills/workflow-commands/backlogrun-park.md +36 -53
  14. package/.claude/skills/workflow-commands/backlogrun-progress.md +81 -331
  15. package/.claude/skills/workflow-commands/backlogrun-recovery.md +29 -83
  16. package/.claude/skills/workflow-commands/backlogrun-steps.md +105 -424
  17. package/.claude/skills/workflow-commands/backlogrun.md +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 +19 -20
  21. package/.claude/skills/workflow-commands/fullrun-steps.md +23 -27
  22. package/.claude/skills/workflow-commands/fullrun.md +10 -10
  23. package/.claude/skills/workflow-commands/halfrun.md +9 -8
  24. package/.claude/skills/workflow-commands/into-target.md +12 -18
  25. package/.claude/skills/workflow-commands/issue-comments.md +11 -26
  26. package/.claude/skills/workflow-commands/kickoff.md +26 -16
  27. package/.claude/skills/workflow-commands/latest-gate.md +17 -28
  28. package/.claude/skills/workflow-commands/needs-human-review.md +13 -24
  29. package/.claude/skills/workflow-commands/observation-filing.md +37 -28
  30. package/.claude/skills/workflow-commands/observation-ledger.md +48 -38
  31. package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -9
  32. package/.claude/skills/workflow-commands/prerequisite.md +23 -15
  33. package/.claude/skills/workflow-commands/progress-watcher.md +17 -11
  34. package/.claude/skills/workflow-commands/prrun.md +3 -3
  35. package/.claude/skills/workflow-commands/retrospective.md +13 -18
  36. package/.claude/skills/workflow-commands/split-assessment.md +6 -4
  37. package/.claude/skills/workflow-commands/target-repository.md +25 -28
  38. package/.claude/skills/workflow-commands/working-tree-hold.md +11 -17
  39. package/.gitattributes +2 -1
  40. package/.github/workflows/ci.yml +14 -0
  41. package/.vscode/tasks.json +14 -0
  42. package/CLAUDE.md +10 -61
  43. package/README.md +29 -47
  44. package/SECURITY.md +1 -1
  45. package/dist/CLAUDE.md +10 -61
  46. package/dist/commands/document-section-cli.js +42 -10
  47. package/dist/config-merge/index.js +11 -2
  48. package/dist/hooks/audit-provision.js +2 -2
  49. package/dist/hooks/batch-guard.js +7 -7
  50. package/dist/hooks/{chunk-KHGB5S3Y.js → chunk-43G45XJF.js} +18 -20
  51. package/dist/hooks/{chunk-4TZVB44A.js → chunk-4TW4MQUL.js} +284 -362
  52. package/dist/hooks/{chunk-XZYKEM6J.js → chunk-76RK6E3H.js} +13 -11
  53. package/dist/hooks/{chunk-F3ELQ2AF.js → chunk-DZWZ3DKY.js} +4 -4
  54. package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
  55. package/dist/hooks/{chunk-GPTFMK5E.js → chunk-GG72ANKI.js} +1 -1
  56. package/dist/hooks/{chunk-ZQGD4GBY.js → chunk-KPM4YIIX.js} +8 -44
  57. package/dist/hooks/chunk-MXVQMLDP.js +3705 -0
  58. package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
  59. package/dist/hooks/{chunk-QVSWU24O.js → chunk-NZBHG6FW.js} +7 -5
  60. package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
  61. package/dist/hooks/{chunk-KRBERBBI.js → chunk-R6CRQEAL.js} +4 -4
  62. package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
  63. package/dist/hooks/{chunk-WK2XSHSI.js → chunk-TLJYAGZK.js} +549 -874
  64. package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
  65. package/dist/hooks/codex-hook-adapter.js +26 -21
  66. package/dist/hooks/duplicate-read-guard.js +8 -8
  67. package/dist/hooks/format-edited.js +4 -4
  68. package/dist/hooks/inputs.json +216 -202
  69. package/dist/hooks/investigation-guard.js +8 -8
  70. package/dist/hooks/pretool-guard.js +15 -15
  71. package/dist/hooks/session-lang.js +406 -8
  72. package/dist/hooks/stop-guard.js +122 -187
  73. package/dist/josh.js +281 -94
  74. package/dist/version/index.js +15 -13
  75. package/eslint/base.js +43 -5
  76. package/eslint/rules/english-only-prose.js +3 -3
  77. package/eslint/rules/import.js +12 -0
  78. package/eslint/rules/namespace-object-export.js +2 -2
  79. package/package.json +16 -10
  80. package/pnpm-workspace.yaml +2 -4
  81. package/prompts/coding-standards.md +14 -48
  82. package/prompts/collaboration-workflow/file-edits.md +1 -1
  83. package/prompts/collaboration-workflow/issue-citation.md +1 -1
  84. package/prompts/collaboration-workflow/issue-template.md +3 -10
  85. package/prompts/collaboration-workflow/operating-rules.md +7 -8
  86. package/prompts/collaboration-workflow/output-bounds.md +1 -1
  87. package/prompts/collaboration-workflow/overview.md +1 -1
  88. package/prompts/collaboration-workflow/plan-comment.md +2 -1
  89. package/prompts/collaboration-workflow/principles.md +21 -3
  90. package/prompts/collaboration-workflow/report-format.md +16 -29
  91. package/prompts/collaboration-workflow/residency.md +1 -1
  92. package/prompts/collaboration-workflow/rule-delivery.md +7 -95
  93. package/prompts/collaboration-workflow/shell-body.md +3 -23
  94. package/prompts/collaboration-workflow/turn-batching.md +4 -13
  95. package/prompts/collaboration-workflow/wip-cap.md +5 -11
  96. package/prompts/refactoring.md +1 -1
  97. package/prompts/review-rubric.md +3 -22
  98. package/prompts/review.md +15 -38
  99. package/prompts/testing-guide.md +2 -4
  100. package/scripts/adopt/adopt-logic.ts +5 -5
  101. package/scripts/adopt/adopt-toolkits.ts +4 -5
  102. package/scripts/adopt/adopt.ts +2 -3
  103. package/scripts/agent/agent-argv.ts +7 -7
  104. package/scripts/agent/agent-diagnostics.ts +2 -2
  105. package/scripts/agent/agent-exit-record.ts +1 -1
  106. package/scripts/agent/agent-headless.ts +1 -1
  107. package/scripts/agent/agent-launch-environment.ts +6 -1
  108. package/scripts/agent/agent-role-profile.ts +49 -22
  109. package/scripts/agent/agent-session-role.ts +32 -0
  110. package/scripts/agent/api-outage.ts +1 -1
  111. package/scripts/agent/claude-agent-argv.ts +4 -4
  112. package/scripts/agent/claude-result-event.ts +4 -4
  113. package/scripts/agent/codex-hooks.ts +2 -2
  114. package/scripts/agent/interactive-ask.ts +3 -6
  115. package/scripts/auto-ok/auto-ok-cli.ts +46 -60
  116. package/scripts/backlog/backlog-arrival-added.ts +34 -0
  117. package/scripts/backlog/backlog-arrival.ts +54 -17
  118. package/scripts/backlog/backlog-budget-cli.ts +34 -6
  119. package/scripts/backlog/backlog-budget.ts +17 -24
  120. package/scripts/backlog/backlog-defect-priority.ts +1 -1
  121. package/scripts/backlog/backlog-drive-args.ts +5 -4
  122. package/scripts/backlog/backlog-drive-cli.ts +14 -10
  123. package/scripts/backlog/backlog-drive-epic.ts +85 -0
  124. package/scripts/backlog/backlog-drive-launch.ts +1 -1
  125. package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
  126. package/scripts/backlog/backlog-drive-named.ts +39 -9
  127. package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
  128. package/scripts/backlog/backlog-drive-restore.ts +1 -1
  129. package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
  130. package/scripts/backlog/backlog-drive.ts +43 -28
  131. package/scripts/backlog/backlog-idle.ts +88 -0
  132. package/scripts/backlog/backlog-named.ts +11 -15
  133. package/scripts/backlog/backlog-next.ts +26 -30
  134. package/scripts/backlog/backlog-offer-cli.ts +28 -23
  135. package/scripts/backlog/backlog-offer.ts +7 -7
  136. package/scripts/backlog/backlog-overlap.ts +178 -0
  137. package/scripts/backlog/backlog-plan-cli.ts +14 -90
  138. package/scripts/backlog/backlog-plan-read.ts +111 -0
  139. package/scripts/backlog/backlog-plan.ts +11 -10
  140. package/scripts/backlog/backlog-pool.ts +13 -14
  141. package/scripts/backlog/backlog-rank.ts +11 -11
  142. package/scripts/backlog/backlog-ready.ts +15 -10
  143. package/scripts/backlog/backlog-scope.ts +14 -15
  144. package/scripts/backlog/backlog-stalled-cli.ts +2 -2
  145. package/scripts/backlog/backlog-stalled-detect.ts +4 -4
  146. package/scripts/backlog/backlog-stalled.ts +5 -6
  147. package/scripts/backlog/backlog-waves.ts +4 -4
  148. package/scripts/backlog/backlogrun-args.ts +74 -0
  149. package/scripts/backlog/backlogrun-cli.ts +113 -0
  150. package/scripts/backlog/backlogrun-launch.ts +178 -0
  151. package/scripts/behavior/behavior-assertion.ts +6 -8
  152. package/scripts/behavior/behavior-cli.ts +1 -1
  153. package/scripts/behavior/behavior-rules.ts +3 -3
  154. package/scripts/build/build-claude-md.ts +4 -4
  155. package/scripts/build/build-codex-hooks.ts +2 -2
  156. package/scripts/build/build-commands.ts +1 -1
  157. package/scripts/build/build-hooks.ts +5 -5
  158. package/scripts/build/build.ts +1 -1
  159. package/scripts/build/hook-bundle-stamp.ts +109 -7
  160. package/scripts/build/local-bin.ts +2 -2
  161. package/scripts/cases/cases-cli.ts +1 -1
  162. package/scripts/cases/cases-logic.ts +2 -2
  163. package/scripts/ci/composite-actions.ts +1 -2
  164. package/scripts/ci/pr-classification.ts +2 -2
  165. package/scripts/claude/workflow-destination.ts +1 -1
  166. package/scripts/clone/clone-aggregate.ts +1 -1
  167. package/scripts/clone/clone-fingerprint.ts +1 -1
  168. package/scripts/clone/clone-scan-cli.ts +1 -1
  169. package/scripts/clone/clone-scan.ts +1 -1
  170. package/scripts/config-merge/index.ts +1 -1
  171. package/scripts/config-merge/json-format.ts +1 -3
  172. package/scripts/config-merge/patch-json-array.ts +90 -0
  173. package/scripts/config-merge/patch-json-key.ts +6 -3
  174. package/scripts/config-merge/patch-json-list.ts +1 -1
  175. package/scripts/cost-runtime/codex-usage.ts +1 -1
  176. package/scripts/cost-runtime/context-cut-payback.ts +4 -5
  177. package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
  178. package/scripts/cost-runtime/cost-attribute.ts +3 -3
  179. package/scripts/cost-runtime/cost-blocks.ts +3 -4
  180. package/scripts/cost-runtime/cost-cli.ts +14 -11
  181. package/scripts/cost-runtime/cost-corpus.ts +11 -11
  182. package/scripts/cost-runtime/cost-pricing.ts +4 -4
  183. package/scripts/cost-runtime/cost-tokens.ts +1 -2
  184. package/scripts/cost-runtime/cost-transcript.ts +29 -29
  185. package/scripts/cost-runtime/cost-usage.ts +6 -7
  186. package/scripts/cost-runtime/cost-verdict.ts +10 -11
  187. package/scripts/cost-runtime/own-session.ts +1 -1
  188. package/scripts/cost-runtime/transcript-cwd.ts +2 -2
  189. package/scripts/delegation/delegation-cli.ts +4 -4
  190. package/scripts/delegation/delegation-policy.ts +13 -15
  191. package/scripts/delegation/duplicate-read-guard.ts +9 -10
  192. package/scripts/delegation/fanout-cli.ts +1 -1
  193. package/scripts/delegation/fanout.ts +1 -1
  194. package/scripts/delegation/investigation-guard.ts +18 -22
  195. package/scripts/delegation/investigation-reads.ts +48 -238
  196. package/scripts/discovery/repo-discovery.ts +1 -1
  197. package/scripts/discovery/repo-map-logic.ts +1 -2
  198. package/scripts/discovery/repo-origin.ts +3 -3
  199. package/scripts/discovery/repo-party-cli.ts +2 -2
  200. package/scripts/discovery/repo-party.ts +2 -2
  201. package/scripts/doctor/doctor-consumer.ts +1 -1
  202. package/scripts/doctor/doctor-io.ts +6 -7
  203. package/scripts/doctor/doctor-logic.ts +1 -1
  204. package/scripts/doctor/doctor-ports.ts +1 -1
  205. package/scripts/doctor/doctor.ts +8 -9
  206. package/scripts/document/backlogrun-parent-read-set.ts +5 -6
  207. package/scripts/document/bash-output-cap.ts +5 -7
  208. package/scripts/document/capped-print-part.ts +1 -1
  209. package/scripts/document/capped-print.ts +1 -1
  210. package/scripts/document/document-byte-budget.ts +33 -64
  211. package/scripts/document/document-byte-check.ts +4 -4
  212. package/scripts/document/document-reachability.ts +7 -8
  213. package/scripts/document/document-read-cli.ts +2 -2
  214. package/scripts/document/document-scan.ts +26 -2
  215. package/scripts/document/document-section-cli.ts +6 -8
  216. package/scripts/document/document-section.ts +8 -12
  217. package/scripts/document/edit-files-cli.ts +3 -4
  218. package/scripts/document/entry-read-budget.ts +8 -70
  219. package/scripts/document/entry-read-set.ts +51 -34
  220. package/scripts/document/lane-child-read-set.ts +9 -9
  221. package/scripts/document/read-files-cli.ts +1 -2
  222. package/scripts/document/read-set-cli.ts +16 -19
  223. package/scripts/document/read-set-cost.ts +4 -4
  224. package/scripts/document/read-set-point-of-use.ts +28 -38
  225. package/scripts/document/read-set-pricing.ts +1 -1
  226. package/scripts/document/read-set-trim.ts +3 -3
  227. package/scripts/document/resident-budget.ts +8 -10
  228. package/scripts/epic/epic-add-body.ts +15 -18
  229. package/scripts/epic/epic-add-plan.ts +26 -28
  230. package/scripts/epic/epic-add.ts +32 -25
  231. package/scripts/epic/epic-audit-checks.ts +27 -37
  232. package/scripts/epic/epic-audit-cli.ts +21 -22
  233. package/scripts/epic/epic-audit-orphans.ts +16 -17
  234. package/scripts/epic/epic-audit-rationale.ts +10 -15
  235. package/scripts/epic/epic-audit-report.ts +2 -5
  236. package/scripts/epic/epic-audit.ts +18 -14
  237. package/scripts/epic/epic-body.ts +10 -10
  238. package/scripts/epic/epic-bundle-cli.ts +36 -34
  239. package/scripts/epic/epic-bundle-evidence.ts +5 -5
  240. package/scripts/epic/epic-bundle-gaps.ts +6 -9
  241. package/scripts/epic/epic-bundle-poll.ts +1 -1
  242. package/scripts/epic/epic-bundle-referenced.ts +11 -14
  243. package/scripts/epic/epic-bundle.ts +19 -20
  244. package/scripts/epic/epic-busy.ts +44 -21
  245. package/scripts/epic/epic-candidate-confirm.ts +15 -18
  246. package/scripts/epic/epic-chains.ts +18 -23
  247. package/scripts/epic/epic-classify.ts +11 -12
  248. package/scripts/epic/epic-cli-argv.ts +5 -6
  249. package/scripts/epic/epic-cli-remove.ts +9 -4
  250. package/scripts/epic/epic-cli.ts +38 -26
  251. package/scripts/epic/epic-close-comment.ts +14 -15
  252. package/scripts/epic/epic-close.ts +25 -29
  253. package/scripts/epic/epic-cross-repo.ts +18 -21
  254. package/scripts/epic/epic-decision.ts +14 -18
  255. package/scripts/epic/epic-fetch.ts +25 -31
  256. package/scripts/epic/epic-graph.ts +15 -17
  257. package/scripts/epic/epic-index.ts +14 -16
  258. package/scripts/epic/epic-issue.ts +9 -11
  259. package/scripts/epic/epic-label-age.ts +74 -0
  260. package/scripts/epic/epic-lane-offer.ts +35 -24
  261. package/scripts/epic/epic-nested.ts +1 -1
  262. package/scripts/epic/epic-next-read.ts +8 -8
  263. package/scripts/epic/epic-next-views.ts +12 -12
  264. package/scripts/epic/epic-next.ts +29 -33
  265. package/scripts/epic/epic-outside-blocker.ts +11 -10
  266. package/scripts/epic/epic-parse.ts +22 -24
  267. package/scripts/epic/epic-promote.ts +3 -2
  268. package/scripts/epic/epic-rank.ts +1 -1
  269. package/scripts/epic/epic-read.ts +10 -8
  270. package/scripts/epic/epic-reconcile.ts +8 -6
  271. package/scripts/epic/epic-reference.ts +5 -4
  272. package/scripts/epic/epic-relation-recheck.ts +10 -11
  273. package/scripts/epic/epic-relations.ts +9 -8
  274. package/scripts/epic/epic-remove-plan.ts +4 -5
  275. package/scripts/epic/epic-remove.ts +7 -5
  276. package/scripts/epic/epic-report.ts +18 -20
  277. package/scripts/epic/epic-run.ts +6 -5
  278. package/scripts/epic/epic-sections.ts +2 -2
  279. package/scripts/epic/epic-shape.ts +3 -3
  280. package/scripts/epic/epic-solo-stale.ts +3 -2
  281. package/scripts/epic/epic-solo.ts +8 -8
  282. package/scripts/epic/epic-triage.ts +5 -4
  283. package/scripts/epic/epic-validate.ts +8 -7
  284. package/scripts/epic/epic.ts +5 -5
  285. package/scripts/exports/unused-members-cli.ts +1 -1
  286. package/scripts/followup/followup-issue-number.ts +1 -2
  287. package/scripts/followup/git-followup-cleanup.ts +6 -7
  288. package/scripts/followup/git-followup-finish.ts +11 -13
  289. package/scripts/followup/git-followup-flush.ts +11 -7
  290. package/scripts/followup/git-followup-issue-close.ts +16 -13
  291. package/scripts/followup/git-followup-label.ts +9 -6
  292. package/scripts/followup/git-followup-merged.ts +1 -1
  293. package/scripts/followup/git-followup-pending.ts +7 -9
  294. package/scripts/followup/git-followup-stages.ts +28 -17
  295. package/scripts/followup/git-followup-workflow.ts +19 -21
  296. package/scripts/followup/git-pr-followup-checks.ts +13 -20
  297. package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
  298. package/scripts/followup/git-pr-followup.ts +18 -17
  299. package/scripts/gate/core-admission.ts +2 -2
  300. package/scripts/gate/core-budget.ts +15 -26
  301. package/scripts/gate/gate-ledger.ts +114 -0
  302. package/scripts/gate/gate-log.ts +7 -9
  303. package/scripts/gate/gate-plan.ts +70 -35
  304. package/scripts/gate/gate-report.ts +14 -15
  305. package/scripts/gate/gate-skip.ts +11 -13
  306. package/scripts/gate/gate-steps.ts +5 -1
  307. package/scripts/gate/gate-tree.ts +3 -4
  308. package/scripts/gate/hook-gate-reuse.ts +9 -9
  309. package/scripts/gate/machine-capacity.ts +168 -30
  310. package/scripts/gate/pre-commit-type-check.ts +4 -4
  311. package/scripts/gate/project-checks.ts +12 -4
  312. package/scripts/gate/scoped-green.ts +11 -18
  313. package/scripts/gate/type-check-command.ts +2 -2
  314. package/scripts/gate/type-check-step.ts +4 -4
  315. package/scripts/gate/verification-gate.ts +53 -51
  316. package/scripts/gh/gh-spawn.ts +2 -2
  317. package/scripts/gh/git-ai-review-scan.ts +3 -2
  318. package/scripts/gh/git-gh-api-path.ts +10 -11
  319. package/scripts/gh/git-gh-exec.ts +43 -48
  320. package/scripts/gh/git-gh-failure.ts +6 -9
  321. package/scripts/gh/git-gh-helpers.ts +1 -1
  322. package/scripts/gh/git-gh-issue-list.ts +15 -19
  323. package/scripts/gh/git-gh-issue-read.ts +43 -60
  324. package/scripts/gh/git-gh-issue-rest.ts +14 -15
  325. package/scripts/gh/git-gh-issue-write.ts +52 -40
  326. package/scripts/gh/git-gh-issue.ts +23 -24
  327. package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
  328. package/scripts/gh/git-gh-pr-read.ts +46 -50
  329. package/scripts/gh/git-gh-pr-rest.ts +23 -26
  330. package/scripts/gh/git-gh-pr-review.ts +2 -2
  331. package/scripts/gh/git-gh-pr-rollup.ts +4 -4
  332. package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
  333. package/scripts/gh/git-gh-pr.ts +16 -16
  334. package/scripts/gh/git-gh-reachability.ts +11 -12
  335. package/scripts/gh/git-gh-repo.ts +2 -3
  336. package/scripts/gh/git-gh-rest-state.ts +1 -1
  337. package/scripts/gh/git-pr-ai-review.ts +6 -5
  338. package/scripts/gh/git-pr-checks-eval.ts +28 -30
  339. package/scripts/gh/git-pr-checks-parse.ts +14 -16
  340. package/scripts/gh/git-pr-checks-watch.ts +17 -17
  341. package/scripts/gh/git-pr-checks.ts +20 -23
  342. package/scripts/gh/git-pr-coderabbit.ts +8 -6
  343. package/scripts/gh/git-pr-confirmation.ts +5 -5
  344. package/scripts/gh/git-pr-managed-config.ts +7 -9
  345. package/scripts/gh/git-pr-messages.ts +1 -1
  346. package/scripts/gh/git-pr.ts +15 -16
  347. package/scripts/gh/github-issue-url.ts +8 -9
  348. package/scripts/git/base-tree.ts +66 -0
  349. package/scripts/git/change-base.ts +42 -2
  350. package/scripts/git/changed-file-scope.ts +5 -5
  351. package/scripts/git/changed-paths.ts +1 -2
  352. package/scripts/git/constants.ts +2 -2
  353. package/scripts/git/git-branch.ts +1 -1
  354. package/scripts/git/git-closes-keyword.ts +3 -3
  355. package/scripts/git/git-command.ts +53 -41
  356. package/scripts/git/git-common-directory.ts +3 -3
  357. package/scripts/git/git-diff-reads.ts +14 -15
  358. package/scripts/git/git-error.ts +1 -1
  359. package/scripts/git/git-execa-error.ts +1 -2
  360. package/scripts/git/git-issue.ts +10 -8
  361. package/scripts/git/git-location-environment.ts +3 -4
  362. package/scripts/git/git-ls-remote.ts +6 -8
  363. package/scripts/git/git-pre-push-hook.ts +11 -10
  364. package/scripts/git/git-preflight.ts +5 -5
  365. package/scripts/git/git-push-transport.ts +2 -2
  366. package/scripts/git/git-remote-branch.ts +1 -2
  367. package/scripts/git/git-schemas.ts +16 -23
  368. package/scripts/git/git-spawn-sync.ts +1 -1
  369. package/scripts/git/git-spawn.ts +37 -14
  370. package/scripts/git/git-ssh-keepalive.ts +12 -5
  371. package/scripts/git/git-staging.ts +7 -8
  372. package/scripts/git/git-workflow.ts +1 -1
  373. package/scripts/git/git-worktree.ts +35 -27
  374. package/scripts/git/gone-branch.ts +2 -2
  375. package/scripts/git/listing-cutoff.ts +1 -2
  376. package/scripts/git/lockfile-sync.ts +65 -0
  377. package/scripts/git/main-merge-guard.ts +1 -2
  378. package/scripts/git/main-merge.ts +7 -7
  379. package/scripts/git/main-sync.ts +23 -8
  380. package/scripts/git/parse-json-array.ts +18 -23
  381. package/scripts/git/repository-lock.ts +34 -2
  382. package/scripts/git/stash/git-stash.ts +4 -5
  383. package/scripts/git/stash/stash-orphans.ts +5 -3
  384. package/scripts/git/stash/stash-pop-args.ts +1 -1
  385. package/scripts/git/stash/stash-pop-cli.ts +3 -3
  386. package/scripts/git/stash/stash-sweep-lock.ts +2 -2
  387. package/scripts/hooks/batch-guard.ts +11 -13
  388. package/scripts/hooks/check-commit-message.ts +12 -9
  389. package/scripts/hooks/codex-hook-adapter.ts +16 -10
  390. package/scripts/hooks/edited-cspell.ts +3 -4
  391. package/scripts/hooks/format-edited-cli.ts +1 -1
  392. package/scripts/hooks/format-edited-file.ts +11 -17
  393. package/scripts/hooks/format-rewrite-notice.ts +19 -17
  394. package/scripts/hooks/pre-push-unit.ts +10 -14
  395. package/scripts/hooks/pretool-guard-cli.ts +4 -4
  396. package/scripts/hooks/pretool-guard.ts +93 -18
  397. package/scripts/hooks/reserved-run.ts +2 -2
  398. package/scripts/hooks/step-zero-notice.ts +1 -1
  399. package/scripts/hooks/stop-guard.ts +21 -10
  400. package/scripts/init/basic-path-migration.ts +2 -2
  401. package/scripts/init/claude-kit-only-settings.ts +2 -2
  402. package/scripts/init/claude-plugin-config.ts +2 -2
  403. package/scripts/init/distributed-paths.ts +4 -4
  404. package/scripts/init/hook-command-rewrite.ts +3 -3
  405. package/scripts/init/hook-launch.ts +5 -5
  406. package/scripts/init/init-actions.ts +13 -0
  407. package/scripts/init/init-ai-copy.ts +11 -11
  408. package/scripts/init/init-bootstrap.ts +3 -3
  409. package/scripts/init/init-copy-content.ts +4 -4
  410. package/scripts/init/init-logic-json-merge.ts +7 -9
  411. package/scripts/init/init-logic-migrate.ts +1 -1
  412. package/scripts/init/init-logic-templates.ts +1 -1
  413. package/scripts/init/init-logic-workspace.ts +4 -4
  414. package/scripts/init/init-logic-yaml-merge.ts +2 -2
  415. package/scripts/init/init-logic.ts +19 -22
  416. package/scripts/init/init.ts +7 -7
  417. package/scripts/init/kit-base-preset.ts +1 -1
  418. package/scripts/init/kit-setup-state.ts +1 -1
  419. package/scripts/init/kit-written-paths.ts +1 -2
  420. package/scripts/init/package-manager-pin.ts +1 -1
  421. package/scripts/init/project-profile-cli.ts +1 -1
  422. package/scripts/init/project-profile.ts +3 -3
  423. package/scripts/init/session-language-environment.ts +1 -1
  424. package/scripts/init/start-exec.ts +3 -4
  425. package/scripts/init/start-plan.ts +2 -2
  426. package/scripts/init/start-setup-pr.ts +3 -2
  427. package/scripts/init/start-steps.ts +2 -2
  428. package/scripts/init/tsconfig-preset-migration.ts +1 -1
  429. package/scripts/init/vscode-tasks.ts +62 -0
  430. package/scripts/issue/baseline-measure.ts +2 -2
  431. package/scripts/issue/behavior-change-lint.ts +2 -2
  432. package/scripts/issue/defect-rate-cli.ts +6 -7
  433. package/scripts/issue/defect-rate.ts +37 -27
  434. package/scripts/issue/git-next-issues.ts +9 -8
  435. package/scripts/issue/issue-auto-ok.ts +24 -11
  436. package/scripts/issue/issue-backlinks-cli.ts +5 -5
  437. package/scripts/issue/issue-backlinks.ts +6 -6
  438. package/scripts/issue/issue-cite-cli.ts +20 -18
  439. package/scripts/issue/issue-cite.ts +18 -8
  440. package/scripts/issue/issue-closing-pr.ts +4 -4
  441. package/scripts/issue/issue-comment-cli.ts +6 -4
  442. package/scripts/issue/issue-file-cli.ts +52 -15
  443. package/scripts/issue/issue-file-fold.ts +155 -0
  444. package/scripts/issue/issue-file.ts +9 -6
  445. package/scripts/issue/issue-fold-cli.ts +14 -9
  446. package/scripts/issue/issue-fold.ts +23 -8
  447. package/scripts/issue/issue-labels.ts +34 -38
  448. package/scripts/issue/issue-lint-cli.ts +2 -2
  449. package/scripts/issue/issue-lint.ts +1 -1
  450. package/scripts/issue/issue-merged.ts +10 -4
  451. package/scripts/issue/issue-number-shape.ts +27 -0
  452. package/scripts/issue/issue-rank.ts +1 -1
  453. package/scripts/issue/issue-read-cli.ts +4 -5
  454. package/scripts/issue/issue-read.ts +4 -5
  455. package/scripts/issue/issue-reference.ts +5 -5
  456. package/scripts/issue/issue-release-cli.ts +17 -7
  457. package/scripts/issue/issue-release.ts +3 -3
  458. package/scripts/issue/issue-report-failures.ts +7 -4
  459. package/scripts/issue/issue-scout-cli.ts +11 -11
  460. package/scripts/issue/issue-scout-closed.ts +4 -4
  461. package/scripts/issue/issue-scout.ts +4 -5
  462. package/scripts/issue/issue-state-cli.ts +17 -10
  463. package/scripts/issue/issue-state.ts +12 -13
  464. package/scripts/issue/issue-wip.ts +7 -7
  465. package/scripts/issue/markdown-section.ts +3 -3
  466. package/scripts/issue/measure-rerun-cli.ts +10 -9
  467. package/scripts/issue/reproduction-measure.ts +3 -3
  468. package/scripts/issue/session-cite.ts +56 -0
  469. package/scripts/josh/agent-session-environment.ts +10 -8
  470. package/scripts/josh/cli-body.ts +2 -2
  471. package/scripts/josh/command-suggest.ts +1 -1
  472. package/scripts/josh/file-map-stamp.ts +20 -23
  473. package/scripts/josh/hook-decision.ts +24 -28
  474. package/scripts/josh/josh-command-map.ts +4 -1
  475. package/scripts/josh/josh-command-types.ts +30 -35
  476. package/scripts/josh/josh-commands-ai.ts +6 -6
  477. package/scripts/josh/josh-commands-backlog.ts +15 -3
  478. package/scripts/josh/josh-commands-clone.ts +1 -1
  479. package/scripts/josh/josh-commands-development.ts +25 -4
  480. package/scripts/josh/josh-commands-document.ts +3 -3
  481. package/scripts/josh/josh-commands-guard.ts +3 -3
  482. package/scripts/josh/josh-commands-issue.ts +4 -5
  483. package/scripts/josh/josh-commands-lane.ts +14 -4
  484. package/scripts/josh/josh-commands-lint.ts +1 -1
  485. package/scripts/josh/josh-commands-run.ts +20 -6
  486. package/scripts/josh/josh-commands-split.ts +1 -2
  487. package/scripts/josh/josh-commands-versioning.ts +5 -5
  488. package/scripts/josh/josh-commands-workflow.ts +30 -22
  489. package/scripts/josh/josh-environment-file.ts +1 -1
  490. package/scripts/josh/josh-in-process.ts +3 -3
  491. package/scripts/josh/josh-logic.ts +6 -7
  492. package/scripts/josh/josh-run.ts +3 -3
  493. package/scripts/josh/josh-verdict.ts +9 -12
  494. package/scripts/josh/josh.ts +3 -3
  495. package/scripts/josh/kit-only.ts +2 -2
  496. package/scripts/josh/path-decision.ts +3 -3
  497. package/scripts/josh/platform-temporary.ts +7 -5
  498. package/scripts/josh/process-identity.ts +24 -6
  499. package/scripts/josh/process-owner.ts +4 -4
  500. package/scripts/josh/session-language-cli.ts +53 -11
  501. package/scripts/josh/session-language.ts +1 -1
  502. package/scripts/josh/stamp-file.ts +48 -29
  503. package/scripts/josh/stamp-record.ts +57 -0
  504. package/scripts/lane/lane-await.ts +35 -11
  505. package/scripts/lane/lane-cache.ts +6 -6
  506. package/scripts/lane/lane-capacity.ts +32 -17
  507. package/scripts/lane/lane-child-invocation.ts +17 -15
  508. package/scripts/lane/lane-child-marker.ts +12 -12
  509. package/scripts/lane/lane-cli.ts +12 -13
  510. package/scripts/lane/lane-close.ts +6 -6
  511. package/scripts/lane/lane-dispatch.ts +61 -72
  512. package/scripts/lane/lane-environment.ts +5 -5
  513. package/scripts/lane/lane-guard-policy.ts +7 -21
  514. package/scripts/lane/lane-handoff.ts +2 -2
  515. package/scripts/lane/lane-install.ts +9 -10
  516. package/scripts/lane/lane-launch-cli.ts +13 -8
  517. package/scripts/lane/lane-ledger.ts +73 -11
  518. package/scripts/lane/lane-leftover.ts +2 -2
  519. package/scripts/lane/lane-limit-cli.ts +160 -0
  520. package/scripts/lane/lane-limit-override.ts +74 -0
  521. package/scripts/lane/lane-load.ts +19 -68
  522. package/scripts/lane/lane-measure-cli.ts +15 -25
  523. package/scripts/lane/lane-occupancy.ts +6 -4
  524. package/scripts/lane/lane-open.ts +20 -19
  525. package/scripts/lane/lane-output.ts +4 -3
  526. package/scripts/lane/lane-paths.ts +12 -11
  527. package/scripts/lane/lane-phase.ts +33 -0
  528. package/scripts/lane/lane-reap.ts +2 -2
  529. package/scripts/lane/lane-registry.ts +16 -15
  530. package/scripts/lane/lane-relaunch.ts +9 -9
  531. package/scripts/lane/lane-report.ts +5 -4
  532. package/scripts/lane/lane-resume.ts +2 -2
  533. package/scripts/lane/lane-sampler.ts +55 -0
  534. package/scripts/lane/lane-seed.ts +7 -7
  535. package/scripts/lane/lane-stage-stats.ts +135 -0
  536. package/scripts/lane/lane-start-point.ts +8 -11
  537. package/scripts/lane/lane-stats.ts +60 -15
  538. package/scripts/lane/lane-stray.ts +1 -1
  539. package/scripts/lane/lane-vacant.ts +1 -1
  540. package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
  541. package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
  542. package/scripts/lane/openai-review-broker.ts +2 -4
  543. package/scripts/lib/ancestor-directories.ts +1 -1
  544. package/scripts/lib/bounded-pool.ts +2 -2
  545. package/scripts/lib/buffered-process.ts +4 -6
  546. package/scripts/lib/caddy-logs.sh +0 -0
  547. package/scripts/lib/cli-flags.ts +39 -6
  548. package/scripts/lib/error-message.ts +1 -1
  549. package/scripts/lib/json-value.ts +17 -3
  550. package/scripts/lib/poll.ts +1 -1
  551. package/scripts/lib/status-icons.ts +3 -3
  552. package/scripts/lib/timed-fetch.ts +1 -1
  553. package/scripts/lib/timeouts.ts +1 -1
  554. package/scripts/lines/bytes-command.ts +3 -4
  555. package/scripts/lines/effective-limit.ts +25 -12
  556. package/scripts/lines/line-budget.ts +47 -55
  557. package/scripts/lines/line-targets.ts +6 -2
  558. package/scripts/lines/lines-command.ts +3 -3
  559. package/scripts/lint/cspell-cached.ts +1 -1
  560. package/scripts/lint/cycle-recheck.ts +122 -0
  561. package/scripts/lint/format.ts +1 -2
  562. package/scripts/lint/lint-parallel.ts +34 -19
  563. package/scripts/lint/lint-related-scope.ts +25 -15
  564. package/scripts/lint/lint-related.ts +6 -7
  565. package/scripts/managed-marker/index.ts +1 -1
  566. package/scripts/managed-marker/managed-marker-logic.ts +1 -2
  567. package/scripts/notify/git-notify.ts +9 -7
  568. package/scripts/notify/telegram-notify.ts +53 -37
  569. package/scripts/notify/telegram-test-logic.ts +3 -3
  570. package/scripts/notify/telegram-test.ts +45 -30
  571. package/scripts/observations/observation-ledger-home.ts +14 -8
  572. package/scripts/observations/observation-ledger-line.ts +3 -2
  573. package/scripts/observations/observation-ledger-migrate.ts +3 -4
  574. package/scripts/observations/observation-ledger-prepare.ts +4 -4
  575. package/scripts/observations/observation-ledger.ts +14 -15
  576. package/scripts/observations/observation-record-cli.ts +83 -0
  577. package/scripts/observations/observation-record.ts +91 -0
  578. package/scripts/observations/observations-flush-cli.ts +1 -1
  579. package/scripts/observations/observations-flush-landing.ts +7 -6
  580. package/scripts/observations/observations-flush.ts +26 -27
  581. package/scripts/overrides/overrides-check.ts +18 -8
  582. package/scripts/package/package-scout-cli.ts +1 -1
  583. package/scripts/package/package-scout-format.ts +2 -2
  584. package/scripts/package/package-scout.ts +1 -1
  585. package/scripts/propagate/propagate-git-failure.ts +1 -1
  586. package/scripts/propagate/propagate-git.ts +7 -7
  587. package/scripts/propagate/propagate-plan.ts +2 -2
  588. package/scripts/propagate/propagate-publish.ts +2 -3
  589. package/scripts/propagate/propagate-run.ts +5 -7
  590. package/scripts/propagate/propagate-select.ts +1 -1
  591. package/scripts/propagate/propagate-steps.ts +19 -20
  592. package/scripts/propagate/propagate-targets.ts +6 -10
  593. package/scripts/propagate/propagate.ts +5 -5
  594. package/scripts/refactor/import-graph.ts +1 -1
  595. package/scripts/refactor/refactor-lint.ts +4 -10
  596. package/scripts/refactor/refactor-scan-cli.ts +1 -1
  597. package/scripts/refactor/refactor-scan.ts +2 -2
  598. package/scripts/refactor/refactor-targets.ts +1 -1
  599. package/scripts/release/github-release-cli.ts +25 -3
  600. package/scripts/release/github-release-runs.ts +1 -1
  601. package/scripts/release/release-cli.ts +21 -4
  602. package/scripts/release/release-history.ts +6 -10
  603. package/scripts/release/release-plan.ts +3 -3
  604. package/scripts/release/release-progress.ts +3 -4
  605. package/scripts/release/release-publish.ts +8 -9
  606. package/scripts/release/release-scope-cli.ts +8 -10
  607. package/scripts/release/release-tag.ts +6 -8
  608. package/scripts/release/release-worktree.ts +5 -5
  609. package/scripts/repo/auto-merge-setting-logic.ts +7 -9
  610. package/scripts/repo/auto-merge-setting.ts +1 -1
  611. package/scripts/repo/repo-setting.ts +4 -4
  612. package/scripts/repo/repository-labels.ts +1 -1
  613. package/scripts/repo/required-checks-logic.ts +3 -3
  614. package/scripts/repo/required-checks-report.ts +1 -1
  615. package/scripts/repo/ruleset-check-cli.ts +1 -1
  616. package/scripts/repo/ruleset-check.ts +1 -1
  617. package/scripts/report/report-format-reference.ts +26 -0
  618. package/scripts/report/report-lint-cli.ts +2 -2
  619. package/scripts/report/report-lint.ts +16 -2
  620. package/scripts/review/disposition-cli.ts +2 -2
  621. package/scripts/review/disposition-logic.ts +1 -1
  622. package/scripts/review/live-evidence.ts +9 -6
  623. package/scripts/review/review-attest-cli.ts +1 -2
  624. package/scripts/review/review-attest.ts +3 -3
  625. package/scripts/review/review-brief-cli.ts +19 -20
  626. package/scripts/review/review-brief.ts +29 -32
  627. package/scripts/review/review-checkout.ts +2 -2
  628. package/scripts/review/review-diff-parts.ts +3 -5
  629. package/scripts/review/review-diff-write.ts +1 -1
  630. package/scripts/review/review-finding-ledger.ts +7 -4
  631. package/scripts/review/review-findings-cli.ts +2 -2
  632. package/scripts/review/review-level.ts +4 -7
  633. package/scripts/review/review-record-cli.ts +73 -16
  634. package/scripts/review/review-record.ts +5 -4
  635. package/scripts/review/review-round2-cli.ts +2 -3
  636. package/scripts/review/review-round2.ts +13 -21
  637. package/scripts/review/review-stamps.ts +9 -71
  638. package/scripts/review/review-tree.ts +4 -5
  639. package/scripts/rules/bash-triggers.ts +4 -4
  640. package/scripts/rules/decision-oracle-batch.ts +5 -6
  641. package/scripts/rules/decision-oracle-stage.ts +1 -1
  642. package/scripts/rules/decision-oracle-tokens.ts +1 -2
  643. package/scripts/rules/decision-oracle.ts +2 -2
  644. package/scripts/rules/delivered-rules.ts +61 -406
  645. package/scripts/rules/destructive-command.ts +2 -2
  646. package/scripts/rules/direct-filing.ts +4 -4
  647. package/scripts/rules/direct-pr-create.ts +2 -2
  648. package/scripts/rules/early-heartbeat.ts +15 -19
  649. package/scripts/rules/file-body.ts +5 -6
  650. package/scripts/rules/filing-cap.ts +6 -7
  651. package/scripts/rules/filing-offer.ts +1 -1
  652. package/scripts/rules/firing-point.ts +6 -6
  653. package/scripts/rules/gh-api.ts +2 -2
  654. package/scripts/rules/git-argv.ts +3 -3
  655. package/scripts/rules/git-force.ts +2 -2
  656. package/scripts/rules/hook-context-line.ts +31 -0
  657. package/scripts/rules/implementation-cut-verdict.ts +5 -8
  658. package/scripts/rules/implementation-cut.ts +35 -32
  659. package/scripts/rules/index-guard.ts +2 -2
  660. package/scripts/rules/issue-citation.ts +7 -7
  661. package/scripts/rules/issue-comments.ts +21 -13
  662. package/scripts/rules/josh-git-bare.ts +2 -2
  663. package/scripts/rules/lane-background.ts +14 -16
  664. package/scripts/rules/lane-carry-conflict.ts +41 -5
  665. package/scripts/rules/lane-interactive-ask.ts +6 -9
  666. package/scripts/rules/lane-park.ts +12 -16
  667. package/scripts/rules/lane-split-park.ts +1 -2
  668. package/scripts/rules/lane-switch-main.ts +10 -13
  669. package/scripts/rules/last-prompt.ts +1 -1
  670. package/scripts/rules/oracle-consulted.ts +5 -5
  671. package/scripts/rules/oracle-firing.ts +6 -9
  672. package/scripts/rules/oracle-list-cli.ts +2 -2
  673. package/scripts/rules/permission-guards.ts +2 -2
  674. package/scripts/rules/piped-verification.ts +79 -9
  675. package/scripts/rules/poll-loop.ts +9 -11
  676. package/scripts/rules/pre-gate-cut.ts +33 -30
  677. package/scripts/rules/prior-comment-read.ts +3 -3
  678. package/scripts/rules/protected-files.ts +25 -13
  679. package/scripts/rules/raw-field-body.ts +3 -4
  680. package/scripts/rules/reply-language.ts +1 -1
  681. package/scripts/rules/rule-body-guard.ts +10 -12
  682. package/scripts/rules/rule-guard.ts +1 -1
  683. package/scripts/rules/rule-list.ts +51 -0
  684. package/scripts/rules/rule-registry-rows.ts +282 -0
  685. package/scripts/rules/rule-registry.ts +109 -0
  686. package/scripts/rules/rule-value-cache.ts +2 -2
  687. package/scripts/rules/rule-value-cli.ts +6 -4
  688. package/scripts/rules/rule-value.ts +61 -22
  689. package/scripts/rules/run-tail-rule.ts +11 -15
  690. package/scripts/rules/shell-body-trigger.ts +7 -7
  691. package/scripts/rules/shell-segments.ts +2 -4
  692. package/scripts/rules/stop-rules.ts +54 -41
  693. package/scripts/rules/tail-commands.ts +1 -1
  694. package/scripts/rules/test-declared-commit.ts +2 -2
  695. package/scripts/rules/third-party-write.ts +3 -3
  696. package/scripts/rules/worktree-guard.ts +12 -5
  697. package/scripts/run/add/run-add-cli.ts +165 -0
  698. package/scripts/run/add/run-add.ts +124 -0
  699. package/scripts/run/board/run-board-cli.ts +207 -0
  700. package/scripts/run/board/run-board-closed.ts +95 -0
  701. package/scripts/run/board/run-board-every.ts +60 -0
  702. package/scripts/run/board/run-board-fetch.ts +38 -0
  703. package/scripts/run/board/run-board-fit.ts +219 -0
  704. package/scripts/run/board/run-board-github.ts +162 -0
  705. package/scripts/run/board/run-board-header.ts +275 -0
  706. package/scripts/run/board/run-board-kind.ts +35 -0
  707. package/scripts/run/board/run-board-labels.ts +299 -0
  708. package/scripts/run/board/run-board-layout.ts +222 -0
  709. package/scripts/run/board/run-board-link.ts +31 -0
  710. package/scripts/run/board/run-board-machine.ts +198 -0
  711. package/scripts/run/board/run-board-notes.ts +103 -0
  712. package/scripts/run/board/run-board-phase.ts +136 -0
  713. package/scripts/run/board/run-board-plan.ts +129 -0
  714. package/scripts/run/board/run-board-read.ts +62 -0
  715. package/scripts/run/board/run-board-render-legend.ts +82 -0
  716. package/scripts/run/board/run-board-render-notes.ts +77 -0
  717. package/scripts/run/board/run-board-render-slot.ts +50 -0
  718. package/scripts/run/board/run-board-render.ts +407 -0
  719. package/scripts/run/board/run-board-scope.ts +17 -0
  720. package/scripts/run/board/run-board-screen.ts +43 -0
  721. package/scripts/run/board/run-board-span.ts +66 -0
  722. package/scripts/run/board/run-board-spin.ts +115 -0
  723. package/scripts/run/board/run-board-state.ts +113 -0
  724. package/scripts/run/board/run-board-status.ts +279 -0
  725. package/scripts/run/board/run-board-tick.ts +210 -0
  726. package/scripts/run/board/run-board-track.ts +22 -0
  727. package/scripts/run/board/run-board-usage-read.ts +255 -0
  728. package/scripts/run/board/run-board-usage-rusage.ts +124 -0
  729. package/scripts/run/board/run-board-usage-text.ts +80 -0
  730. package/scripts/run/board/run-board-usage.ts +165 -0
  731. package/scripts/run/carry/run-carry-added.ts +62 -0
  732. package/scripts/run/carry/run-carry-args.ts +25 -22
  733. package/scripts/run/carry/run-carry-change.ts +1 -1
  734. package/scripts/run/carry/run-carry-cli.ts +71 -48
  735. package/scripts/run/carry/run-carry-conversation.ts +6 -7
  736. package/scripts/run/carry/run-carry-ended.ts +85 -0
  737. package/scripts/run/carry/run-carry-reclaim.ts +1 -1
  738. package/scripts/run/carry/run-carry-stash.ts +3 -2
  739. package/scripts/run/carry/run-carry-streak.ts +8 -10
  740. package/scripts/run/carry/run-carry.ts +85 -89
  741. package/scripts/run/cut/run-cut-args.ts +7 -7
  742. package/scripts/run/cut/run-cut-cli.ts +54 -36
  743. package/scripts/run/cut/run-cut-handoff.ts +15 -15
  744. package/scripts/run/cut/run-cut-report.ts +37 -16
  745. package/scripts/run/cut/run-cut.ts +63 -77
  746. package/scripts/run/detached-launch.ts +35 -50
  747. package/scripts/run/entry/run-entry-cli.ts +48 -27
  748. package/scripts/run/entry/run-entry-stop.ts +7 -9
  749. package/scripts/run/entry/run-entry.ts +5 -6
  750. package/scripts/run/event/run-event-cli.ts +5 -6
  751. package/scripts/run/event/run-event-filed.ts +69 -0
  752. package/scripts/run/event/run-event-follow.ts +3 -3
  753. package/scripts/run/event/run-event-plan.ts +38 -0
  754. package/scripts/run/event/run-event-render.ts +9 -4
  755. package/scripts/run/event/run-event-scope.ts +47 -18
  756. package/scripts/run/event/run-event-stream-emit.ts +64 -11
  757. package/scripts/run/event/run-event-stream.ts +171 -46
  758. package/scripts/run/event/run-event-watch.ts +4 -6
  759. package/scripts/run/hold/run-hold-cli.ts +65 -62
  760. package/scripts/run/hold/run-hold.ts +88 -46
  761. package/scripts/run/merge/run-merge-cli.ts +116 -77
  762. package/scripts/run/merge/run-merge-collect.ts +107 -0
  763. package/scripts/run/merge/run-merge-steps.ts +112 -65
  764. package/scripts/run/merge/run-merge-token.ts +30 -0
  765. package/scripts/run/merge/run-merge.ts +31 -22
  766. package/scripts/run/progress/run-progress-args.ts +4 -4
  767. package/scripts/run/progress/run-progress-cli.ts +39 -50
  768. package/scripts/run/progress/run-progress-clock.ts +25 -32
  769. package/scripts/run/progress/run-progress-config.ts +6 -9
  770. package/scripts/run/progress/run-progress-read.ts +9 -10
  771. package/scripts/run/progress/run-progress.ts +48 -53
  772. package/scripts/run/review/run-review-cli.ts +6 -6
  773. package/scripts/run/review/run-review-steps.ts +6 -6
  774. package/scripts/run/review/run-review.ts +9 -11
  775. package/scripts/run/run-cli-fault.ts +29 -0
  776. package/scripts/run/run-ending-cli.ts +3 -3
  777. package/scripts/run/run-ending.ts +10 -14
  778. package/scripts/run/run-halfrun-resume.ts +6 -8
  779. package/scripts/run/run-headless.ts +25 -12
  780. package/scripts/run/run-invocation.ts +17 -22
  781. package/scripts/run/run-label.ts +7 -5
  782. package/scripts/run/run-liveness-cli.ts +19 -6
  783. package/scripts/run/run-liveness.ts +27 -38
  784. package/scripts/run/run-next-cli.ts +5 -9
  785. package/scripts/run/run-next.ts +4 -5
  786. package/scripts/run/run-parent-cut-hook.ts +10 -12
  787. package/scripts/run/run-preflight.ts +25 -29
  788. package/scripts/run/run-prep-cli.ts +17 -13
  789. package/scripts/run/run-prep-locate.ts +4 -5
  790. package/scripts/run/run-prep.ts +7 -10
  791. package/scripts/run/run-prrun-resume.ts +2 -2
  792. package/scripts/run/run-report-cli.ts +4 -4
  793. package/scripts/run/run-report.ts +9 -14
  794. package/scripts/run/run-retrospective.ts +3 -3
  795. package/scripts/run/run-section.ts +42 -0
  796. package/scripts/run/run-stage-read.ts +2 -2
  797. package/scripts/run/run-stage.ts +6 -4
  798. package/scripts/run/run-status-cli.ts +7 -5
  799. package/scripts/run/run-status.ts +6 -7
  800. package/scripts/run/run-step-cli.ts +13 -15
  801. package/scripts/run/run-step.ts +58 -47
  802. package/scripts/run/run-stop-notify.ts +7 -8
  803. package/scripts/run/run-stranded-cli.ts +1 -1
  804. package/scripts/run/run-stranded-detect.ts +4 -4
  805. package/scripts/run/run-stranded.ts +11 -13
  806. package/scripts/run/run-tail-cli.ts +15 -16
  807. package/scripts/run/run-tail.ts +14 -33
  808. package/scripts/run/run-watcher-guard-cli.ts +3 -4
  809. package/scripts/run/run-watcher-guard.ts +11 -12
  810. package/scripts/run/run-watcher-hook.ts +6 -12
  811. package/scripts/run/ship/run-ship-cli.ts +67 -33
  812. package/scripts/run/ship/run-ship-detach.ts +15 -13
  813. package/scripts/run/ship/run-ship-lock.ts +1 -1
  814. package/scripts/run/ship/run-ship-next.ts +7 -8
  815. package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
  816. package/scripts/run/ship/run-ship-preflight.ts +10 -11
  817. package/scripts/run/ship/run-ship-probe.ts +4 -4
  818. package/scripts/run/ship/run-ship-return.ts +1 -1
  819. package/scripts/run/ship/run-ship-review-steps.ts +43 -24
  820. package/scripts/run/ship/run-ship-review.ts +12 -14
  821. package/scripts/run/ship/run-ship-scoped.ts +15 -6
  822. package/scripts/run/ship/run-ship-stage.ts +80 -26
  823. package/scripts/run/ship/run-ship-steps.ts +26 -16
  824. package/scripts/run/ship/run-ship-stop-text.ts +4 -2
  825. package/scripts/run/ship/run-ship-sync.ts +9 -8
  826. package/scripts/run/ship/run-ship.ts +17 -32
  827. package/scripts/run/tidy/run-tidy-cli.ts +9 -5
  828. package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
  829. package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
  830. package/scripts/run/tidy/run-tidy.ts +4 -3
  831. package/scripts/run/wake/run-wake-cli.ts +27 -32
  832. package/scripts/run/wake/run-wake-describe.ts +24 -28
  833. package/scripts/run/wake/run-wake-driver.ts +14 -14
  834. package/scripts/run/wake/run-wake-handoff.ts +6 -6
  835. package/scripts/run/wake/run-wake-loop.ts +9 -9
  836. package/scripts/run/wake/run-wake-restart.ts +4 -5
  837. package/scripts/run/wake/run-wake-session.ts +23 -27
  838. package/scripts/run/wake/run-wake.ts +57 -279
  839. package/scripts/safe-chain/ci-installer-pin.ts +3 -3
  840. package/scripts/safe-chain/pack-hook.ts +2 -2
  841. package/scripts/safe-chain/preinstall-command.ts +2 -2
  842. package/scripts/security/security-audit-logic.ts +1 -1
  843. package/scripts/security/security-audit-provision-logic.ts +1 -1
  844. package/scripts/security/security-audit-provision.ts +2 -2
  845. package/scripts/security/security-audit.ts +5 -5
  846. package/scripts/security/security-updates-logic.ts +2 -3
  847. package/scripts/security/security-updates.ts +2 -4
  848. package/scripts/self-sync-guard/index.ts +1 -1
  849. package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
  850. package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
  851. package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
  852. package/scripts/sonar/sonar-hotspots.ts +1 -1
  853. package/scripts/sonar/sonar-new-code-cli.ts +1 -1
  854. package/scripts/sonar/sonar-new-code.ts +1 -1
  855. package/scripts/sonar/sonar-project.ts +1 -1
  856. package/scripts/split/split-assess-cli.ts +1 -1
  857. package/scripts/split/split-assess.ts +3 -3
  858. package/scripts/sync/directory-copy-guard.ts +2 -3
  859. package/scripts/sync/managed-config-scope-cli.ts +1 -2
  860. package/scripts/sync/managed-config-scope.ts +4 -4
  861. package/scripts/sync/plugin-skill-directories.ts +2 -2
  862. package/scripts/sync/reconcile-templates.ts +17 -8
  863. package/scripts/sync/removed-skill-manifest.ts +2 -3
  864. package/scripts/sync/sync-ai-files.ts +7 -7
  865. package/scripts/sync/sync-configs.ts +30 -3
  866. package/scripts/sync/sync-hook-safety.ts +2 -2
  867. package/scripts/sync/sync.ts +23 -10
  868. package/scripts/sync/synced-paths.ts +2 -1
  869. package/scripts/sync/workflow-pin-logic.ts +1 -1
  870. package/scripts/test/test-declared-changed.ts +4 -4
  871. package/scripts/test/test-declared-logic.ts +2 -3
  872. package/scripts/test/test-declared-match.ts +25 -4
  873. package/scripts/test/test-declared.ts +26 -9
  874. package/scripts/test/test-red-commit.ts +3 -2
  875. package/scripts/test/test-red-logic.ts +7 -14
  876. package/scripts/test/test-red.ts +12 -47
  877. package/scripts/test/test-related-scope.ts +2 -3
  878. package/scripts/test/test-related.ts +3 -3
  879. package/scripts/test/test-type-logic.ts +1 -2
  880. package/scripts/test/test-unit-guard.ts +13 -17
  881. package/scripts/test/unit-worker-share.ts +7 -8
  882. package/scripts/time-runtime/time-agent-bundles.ts +2 -4
  883. package/scripts/time-runtime/time-background.ts +17 -21
  884. package/scripts/time-runtime/time-batch-guard.ts +67 -342
  885. package/scripts/time-runtime/time-bundle-call.ts +26 -28
  886. package/scripts/time-runtime/time-bundles.ts +11 -12
  887. package/scripts/time-runtime/time-call-identity.ts +1 -1
  888. package/scripts/time-runtime/time-command-key.ts +2 -2
  889. package/scripts/time-runtime/time-density-hook.ts +8 -11
  890. package/scripts/time-runtime/time-density.ts +5 -5
  891. package/scripts/time-runtime/time-followup-stage.ts +7 -7
  892. package/scripts/time-runtime/time-format.ts +5 -5
  893. package/scripts/time-runtime/time-hook-transcript.ts +3 -3
  894. package/scripts/time-runtime/time-instant.ts +1 -1
  895. package/scripts/time-runtime/time-markers.ts +15 -19
  896. package/scripts/time-runtime/time-phase-names.ts +3 -3
  897. package/scripts/time-runtime/time-reported-failure.ts +15 -19
  898. package/scripts/time-runtime/time-round-trips.ts +20 -23
  899. package/scripts/time-runtime/time-shell.ts +8 -8
  900. package/scripts/time-runtime/time-single-check.ts +1 -2
  901. package/scripts/time-runtime/time-spans.ts +35 -40
  902. package/scripts/time-runtime/time-tool-call.ts +15 -16
  903. package/scripts/time-runtime/time-transcript-line.ts +53 -34
  904. package/scripts/time-runtime/time-writes.ts +5 -5
  905. package/scripts/ui/ui-routes-cli.ts +1 -2
  906. package/scripts/ui/ui-routes.ts +1 -2
  907. package/scripts/version/bump-version.ts +1 -1
  908. package/scripts/version/fresh-metadata-cache.ts +2 -2
  909. package/scripts/version/latest-corepack.ts +26 -26
  910. package/scripts/version/latest-lane-guard.ts +1 -1
  911. package/scripts/version/latest-scope-cli.ts +2 -2
  912. package/scripts/version/latest-stamp.ts +1 -2
  913. package/scripts/version/latest-update.ts +2 -2
  914. package/scripts/version/npm-registry.ts +2 -2
  915. package/scripts/version/package-manager-version.ts +18 -0
  916. package/scripts/version/publishable-range-check.ts +2 -1
  917. package/scripts/version/publishable-range.ts +1 -1
  918. package/scripts/version/release-age.ts +11 -11
  919. package/scripts/version/release-hold.ts +2 -2
  920. package/scripts/version/safe-chain-version-update.ts +3 -3
  921. package/scripts/version/version-check-logic.ts +2 -3
  922. package/scripts/version/version-check.ts +1 -2
  923. package/scripts/version/version-command-config.ts +2 -2
  924. package/scripts/version/version-commands.ts +3 -3
  925. package/scripts/version/version-remote.ts +4 -4
  926. package/scripts/version/version-targets.ts +2 -2
  927. package/templates/gitignore +7 -0
  928. package/dist/hooks/chunk-KHX4U3BG.js +0 -6400
  929. package/dist/hooks/chunk-RKUAD3I6.js +0 -90
  930. package/dist/hooks/chunk-WPALEIRX.js +0 -18
  931. package/scripts/backlog/backlog-restructure.ts +0 -152
  932. package/scripts/rules/issue-fold-rule.ts +0 -72
  933. package/scripts/rules/wip-cap.ts +0 -63
  934. package/scripts/run/run-issue-number.ts +0 -19
@@ -2,10 +2,10 @@ import { find_local_bin_upwards } from '#scripts/build/local-bin'
2
2
  import { COMMAND_TIMEOUT_MS } from '#scripts/lib/timeouts'
3
3
  import { execa } from 'execa'
4
4
 
5
- // joshuafolkken/kit#934: `josh gate`'s type-check step used to be `tsc --noEmit` for every project.
6
- // A SvelteKit project type-checks with `svelte-check` behind `svelte-kit sync`, so the fixed step
7
- // both missed every `.svelte` type error and failed outright on a clean checkout, where `./$types`
8
- // has not been generated yet.
5
+ // `josh gate`'s type-check step cannot be `tsc --noEmit` for every project. A SvelteKit project
6
+ // type-checks with `svelte-check` behind `svelte-kit sync`, so a fixed `tsc` step would both miss
7
+ // every `.svelte` type error and fail outright on a clean checkout, where `./$types` has not been
8
+ // generated yet.
9
9
  //
10
10
  // The step is therefore asked of the application layer rather than assumed. Two rules decide it:
11
11
  //
@@ -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,8 +168,8 @@ 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
@@ -195,7 +192,7 @@ async function build_reserved_steps(
195
192
  }
196
193
 
197
194
  // **A nested gate takes no reservation, and the budget is what makes that necessary rather than
198
- // 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
199
196
  // own gate tests; each of those is a gate inside the outer gate's unit reservation, and a place it
200
197
  // claimed would wait for cores the outer gate cannot free until the suite — this test included —
201
198
  // finishes.
@@ -216,20 +213,20 @@ async function run_reserved_step(
216
213
  }
217
214
 
218
215
  // `bounded_pool` rather than a bare `Promise.all`, so the plan's `concurrency` is what decides how
219
- // 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
220
217
  // change** because no check ever rejects: `buffered_process` reports a non-zero exit as a value, so
221
218
  // the pool's first-failure abort — written for callers that spawn real Claude sessions — never
222
219
  // fires here and every queued check still runs. Results come back in input order however they
223
220
  // finished, which is what keeps the printed sections in declaration order. Each step first claims its
224
- // 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.
225
222
  async function run_gate_steps(
226
223
  plan: GatePlan,
227
224
  budget: BudgetContext = default_budget(),
228
225
  ): Promise<ReadonlyArray<GateStepResult>> {
229
226
  const reserved = await build_reserved_steps(process.cwd(), plan, budget.available_cores)
230
227
 
231
- // **The checks run under the held mark, so a check's own dispatch claims nothing**
232
- // (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
233
230
  // a weight would otherwise claim a second place for the cores reserved for it here. A nested gate
234
231
  // sets the mark too, since its checks are covered by the outer gate's reservation.
235
232
  return await core_budget.with_held_mark(
@@ -242,15 +239,15 @@ async function run_gate_steps(
242
239
  )
243
240
  }
244
241
 
245
- // **Both markers are claims about the unit suite, so a gate that is not running it makes neither**
246
- // (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
247
244
  // covering this tree right now, which is what stops a review agent re-running the suite; the
248
245
  // unit-run marker tells a sibling lane a vitest run is on the machine, which is what makes that
249
246
  // lane divide its own workers. A `--no-unit` gate that wrote either would be answering for a check
250
247
  // it never started — the first by telling a review the tests are covered when they are running in a
251
248
  // different CI job, the second by throttling a lane on its behalf.
252
249
  //
253
- // **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**.
254
251
  // Cleared before `record_green_gate` wrote, the in-flight marker left a gap of tens of milliseconds in
255
252
  // which `run:review --join` read neither a running gate nor a green one — and answered RED for a gate
256
253
  // that was about to record green. Cleared after it, a reader that sees no marker is reading a gate
@@ -276,11 +273,16 @@ async function run_marked_gate<T>(
276
273
  // a core count the plan was not derived from — the one misreading this line exists to prevent.
277
274
  // The concurrent-run count is read here rather than inside `gate-plan.ts` for the reason the core
278
275
  // count already is: that module stays a pure function of its inputs, and the machine is asked once and
279
- // handed to both calls. Counted *before* the unit step writes its own marker, so `+ 1` is this gate
280
- // (joshuafolkken/kit#1515).
276
+ // handed to both calls. Counted *before* the unit step writes its own marker, so `+ 1` is this gate.
281
277
  function announce_gate_plan(is_unit_included: boolean, available_cores: number): GatePlan {
282
278
  const concurrent_runs = unit_worker_share.live_run_count() + unit_worker_share.SOLO_RUNS
283
- 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
+ )
284
286
 
285
287
  process.stdout.write(`${gate_plan.format_gate_plan(plan, available_cores, concurrent_runs)}\n`)
286
288
 
@@ -305,20 +307,20 @@ interface GateOptions {
305
307
  // inside `pnpm josh gate`, so a test writing to the shared path would overwrite the live gate's
306
308
  // own log with the output of four checks that never ran.
307
309
  log_path?: string
308
- // **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
309
311
  // that a direct `run_verification_gate` call — the whole of `verification-gate.test.ts` — is never
310
312
  // refused by a real checkout's missing scoped record; `run_gate_command` sets it true.
311
313
  is_scoped_enforced?: boolean
312
314
  // The scoped records' paths, overridable so a test can plant a green pair rather than depend on the
313
315
  // surrounding checkout's — the reason `scoped-green.ts` takes a `source` per stamp.
314
316
  scoped_sources?: ScopedSources
315
- // 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
316
318
  // entry resolves it, so a suite driving the gate never writes a measurement of checks that never ran.
317
319
  ledger_path?: string | undefined
318
320
  }
319
321
 
320
322
  // **The gate refuses to start when the scoped pair has not been green on this tree**
321
- // (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
322
324
  // first gate is the only gate. It is the CLI entry's check alone (`is_scoped_enforced`), and it never
323
325
  // fires for CI's `--no-unit` gate or a `--force` run: CI has no scoped record in front of it, and
324
326
  // `--force` is the caller saying to run regardless. `scoped_green` owns the record and the `JOSH_SCOPED_GREEN`
@@ -330,12 +332,12 @@ function scoped_precheck_refusal(tree: GateTree, options: GateOptions): string |
330
332
  return scoped_green.refusal_for(tree.files, tree.base, options.scoped_sources)
331
333
  }
332
334
 
333
- // **A partial gate records nothing green, and this is the same rule as the skip one layer out**
334
- // (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
335
337
  // "every check this repository gates on passed on exactly this tree"; a `--no-unit` run proves three
336
338
  // of the four, so writing it would let the next full `josh gate` be skipped on a tree whose unit
337
- // suite nobody ran here — a check reporting success without having run, which is the state
338
- // 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.
339
341
  async function record_whole_gate(
340
342
  plan: GatePlan,
341
343
  results: ReadonlyArray<GateStepResult>,
@@ -348,12 +350,12 @@ async function record_whole_gate(
348
350
  }
349
351
 
350
352
  // Reports the checks and records a green result — inside the markers, so the in-flight one outlives
351
- // the record it announces (joshuafolkken/kit#2434).
353
+ // the record it announces.
352
354
  async function settle_gate(
353
355
  plan: GatePlan,
354
356
  results: ReadonlyArray<GateStepResult>,
355
357
  tree: GateTree,
356
- options: GateOptions & { started_at: number },
358
+ options: GateOptions & { started_at: number; ledger: GateLedgerStart },
357
359
  ): Promise<number> {
358
360
  const elapsed_ms = performance.now() - options.started_at
359
361
  const failed_labels = gate_report.report_gate_steps(results, {
@@ -364,9 +366,7 @@ async function settle_gate(
364
366
  })
365
367
  const is_passed = failed_labels.length === 0
366
368
 
367
- if (options.ledger_path !== undefined) {
368
- await lane_ledger.record_gate(options.ledger_path, elapsed_ms, is_passed)
369
- }
369
+ await gate_ledger.record(options.ledger, results, { elapsed_ms, is_passed })
370
370
 
371
371
  if (!is_passed) return FAIL_EXIT_CODE
372
372
 
@@ -378,15 +378,18 @@ async function settle_gate(
378
378
  // The plan line is printed by the checked path alone. A run that announced a four-way fan-out and
379
379
  // then skipped would be describing something that never happened, and the skip's own line already
380
380
  // says everything there is to say about a gate that started no process. The reporting itself is
381
- // `gate-report.ts`'s (joshuafolkken/kit#2296).
381
+ // `gate-report.ts`'s.
382
382
  async function run_checked_gate(
383
383
  tree: GateTree,
384
384
  options: GateOptions,
385
385
  started_at: number,
386
386
  ): Promise<number> {
387
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)
388
391
  // Resolved at the gate's entry, before this gate sets `JOSH_UNIT_RUN_MARKED`, so a gate nested in the
389
- // unit suite reads the flag as set and reserves nothing (joshuafolkken/kit#2351).
392
+ // unit suite reads the flag as set and reserves nothing.
390
393
  const budget = default_budget()
391
394
  const plan = announce_gate_plan(is_unit_included, budget.available_cores)
392
395
 
@@ -395,11 +398,11 @@ async function run_checked_gate(
395
398
  // together — the shape `epicrun` produces — would both read "nothing else is running" and both take
396
399
  // the whole machine. Claimed here, after the count and before any check, it is already there when
397
400
  // the next lane asks; the guard inside the spawned `josh test:unit` sees the handoff and adds no
398
- // second marker for the same run (joshuafolkken/kit#1515).
401
+ // second marker for the same run.
399
402
  async function run_and_settle(): Promise<number> {
400
403
  const results = await run_gate_steps(plan, budget)
401
404
 
402
- return await settle_gate(plan, results, tree, { ...options, started_at })
405
+ return await settle_gate(plan, results, tree, { ...options, started_at, ledger })
403
406
  }
404
407
 
405
408
  return await run_marked_gate(tree.files, plan, run_and_settle, options.marker_path)
@@ -415,8 +418,7 @@ function reusable_stamp(tree: GateTree, options: GateOptions): FileMapStamp | un
415
418
 
416
419
  // The two ways a gate ends before it runs a check: a green record it can reuse (exit 0), and the
417
420
  // scoped pre-check refusing a tree the pair has not been green on (exit 1). `undefined` means neither
418
- // fired and the checks run. **Nothing else stands between the skip and the checks** (joshuafolkken/kit#1486):
419
- // 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.**
420
422
  function short_circuit_gate(tree: GateTree, options: GateOptions): number | undefined {
421
423
  const reusable = reusable_stamp(tree, options)
422
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