@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
@@ -1,18 +1,18 @@
1
1
  import { rest_comment_schema } from '#scripts/git/git-schemas'
2
2
  import {
3
3
  parse_json_array_or_undefined,
4
- parse_json_object_safe,
4
+ parse_json_object_or_undefined,
5
5
  } from '#scripts/git/parse-json-array'
6
6
  import { z } from 'zod'
7
7
  import { MERGED_STATE, to_gh_state } from './git-gh-rest-state'
8
8
 
9
9
  // The translation between one REST pull request (`repos/{owner}/{repo}/pulls/{N}`) and the JSON
10
- // shape `gh pr view --json <fields>` used to answer with.
10
+ // shape `gh pr view --json <fields>` answers with.
11
11
  //
12
12
  // `gh pr view` goes through GraphQL, which a cloud session is answered 403 for while the REST
13
- // endpoint is served normally (joshuafolkken/kit#1022). The mapping lives here rather than beside
13
+ // endpoint is served normally. The mapping lives here rather than beside
14
14
  // the requests because it is pure: given the response, it decides the answer with nothing else to
15
- // know — the same split `git-gh-issue-rest.ts` already makes (joshuafolkken/kit#1027).
15
+ // know — the same split `git-gh-issue-rest.ts` already makes.
16
16
 
17
17
  // Only the fields the mapping itself reads are named; every other key passes through untouched.
18
18
  //
@@ -24,7 +24,7 @@ import { MERGED_STATE, to_gh_state } from './git-gh-rest-state'
24
24
  // `mergeable` and `mergeable_state` are served by the single-pull endpoint only — the listing omits
25
25
  // both — which is why the branch lookup resolves a number and the reads go back for the detail.
26
26
  // `repo.full_name` is what tells a fork's head from this repository's own — `head.ref` is a bare
27
- // branch name that says nothing about which repository holds it (joshuafolkken/kit#1029). Named once
27
+ // branch name that says nothing about which repository holds it. Named once
28
28
  // because both sides of a pull request carry the same shape.
29
29
  const rest_repo_schema = z.looseObject({ full_name: z.string().optional() }).nullish()
30
30
  const rest_pull_side_schema = z.looseObject({ repo: rest_repo_schema })
@@ -42,14 +42,13 @@ const rest_pull_schema = z.looseObject({
42
42
  mergeable_state: z.string().optional(),
43
43
  // `sha` is the head commit, which is what both halves of the merge-gate rollup are keyed by —
44
44
  // REST hangs the check runs and the status contexts off the commit rather than off the pull
45
- // request (joshuafolkken/kit#1028).
45
+ // request.
46
46
  head: z
47
47
  .looseObject({ ref: z.string().optional(), sha: z.string().optional(), repo: rest_repo_schema })
48
48
  .nullish(),
49
49
  base: rest_pull_side_schema.nullish(),
50
50
  // `node_id` is what the GraphQL auto-merge mutation addresses a pull request by, and `auto_merge`
51
- // is `null` until auto-merge is enabled — both read by `git-gh-pr-auto-merge.ts`
52
- // (joshuafolkken/kit#2497).
51
+ // is `null` until auto-merge is enabled — both read by `git-gh-pr-auto-merge.ts`.
53
52
  node_id: z.string().optional(),
54
53
  auto_merge: z.looseObject({}).nullish(),
55
54
  })
@@ -64,15 +63,14 @@ const OPEN_STATE = 'open'
64
63
  const EMPTY_BODY = ''
65
64
 
66
65
  function parse_rest_pull(rest_json: string): RestPull {
67
- const parsed = parse_json_object_safe(rest_json, rest_pull_schema)
66
+ const parsed = parse_json_object_or_undefined(rest_json, rest_pull_schema)
68
67
  if (parsed === undefined) throw new Error(NOT_A_PULL_MESSAGE)
69
68
 
70
69
  return parsed
71
70
  }
72
71
 
73
72
  // A response that is not a listing must not degrade into an empty one: `pr_exists` reads an empty
74
- // listing as "this branch has no pull request", and `git-pr.ts` answers that by opening a second one
75
- // (joshuafolkken/kit#950 is the same misread on the issue side).
73
+ // listing as "this branch has no pull request", and `git-pr.ts` answers that by opening another.
76
74
  function parse_rest_pulls(rest_json: string): Array<RestPull> {
77
75
  const parsed = parse_json_array_or_undefined(rest_json, rest_pull_schema)
78
76
  if (parsed === undefined) throw new Error(NOT_A_PULL_LISTING_MESSAGE)
@@ -80,7 +78,7 @@ function parse_rest_pulls(rest_json: string): Array<RestPull> {
80
78
  return parsed
81
79
  }
82
80
 
83
- // Which pull request a branch name means. `gh pr view <branch>` preferred the open one and fell back
81
+ // Which pull request a branch name means. `gh pr view <branch>` prefers the open one and falls back
84
82
  // to the most recent, and the difference is reachable in this repository's own flow: `git-pr.ts`
85
83
  // opens a *second* pull request on a branch whose first one merged, so a lookup that answered
86
84
  // "newest first, whatever its state" would still be right there while "the first row" alone would
@@ -93,7 +91,7 @@ function select_pull(pulls: ReadonlyArray<RestPull>): RestPull | undefined {
93
91
  // REST reports a merge as a field beside the state rather than as a state, and both spellings of it
94
92
  // are accepted: the single-pull endpoint carries `merged`, the listing carries only `merged_at`.
95
93
  //
96
- // Exported since joshuafolkken/kit#1077, because `pr_merge` asks the same question directly: a merge
94
+ // Exported because `pr_merge` asks the same question directly: a merge
97
95
  // request that failed after the merge landed is settled by reading the pull request back, and the
98
96
  // merge-or-not verdict must be the one `to_pr_state` already uses rather than a second spelling of it.
99
97
  function is_merged(pull: RestPull): boolean {
@@ -112,7 +110,7 @@ function to_pr_state(pull: RestPull): string | undefined {
112
110
  // `gh pr checkout` reached a fork's head through `refs/pull/<N>/head`, which a plain
113
111
  // `git fetch origin <branch>` cannot: the fetch either fails outright, or — where `origin` happens to
114
112
  // carry a branch of the same name — succeeds on an unrelated branch. Both halves are read out of the
115
- // one response, so the test costs no second request (joshuafolkken/kit#1029).
113
+ // one response, so the test costs no second request.
116
114
  function to_repo_name(side: RestPullSide | null | undefined): string | undefined {
117
115
  return side?.repo?.full_name
118
116
  }
@@ -125,19 +123,18 @@ function is_same_repository_head(pull: RestPull): boolean {
125
123
 
126
124
  // The three fields `gh pr view --json mergeable,mergeStateStatus,state` answered with.
127
125
  //
128
- // `mergeable` was a GraphQL enum (`MERGEABLE` / `CONFLICTING` / `UNKNOWN`) and is a nullable boolean
129
- // in REST; `pr_info_schema` accepts both, so the boolean passes through as it arrives — including
130
- // the JSON null GitHub sends while it is still computing.
126
+ // `mergeable` is a GraphQL enum (`MERGEABLE` / `CONFLICTING` / `UNKNOWN`) and a nullable boolean in
127
+ // REST; `pr_info_schema` accepts both, so the boolean passes through as it arrives — including the
128
+ // JSON null GitHub sends while it is still computing.
131
129
  //
132
- // **Nothing reads `mergeable` any more** (joshuafolkken/kit#1232 removed `git-conflict.ts`, its only
133
- // reader, and the conflict verdict comes off `mergeStateStatus` in `git-pr-checks-eval.ts` now). It
134
- // stays because this function's contract is *the shape `gh pr view --json …` answered with*, not
135
- // the subset today's callers happen to read — trimming a wire shape to its current readers is what
136
- // makes the next one look for a field the mapping silently dropped.
130
+ // **Nothing reads `mergeable`** — the conflict verdict comes off `mergeStateStatus` in
131
+ // `git-pr-checks-eval.ts`. It stays because this function's contract is *the shape
132
+ // `gh pr view --json …` answers with*, not the subset today's callers happen to read — trimming a
133
+ // wire shape to its current readers is what makes the next one look for a field the mapping
134
+ // silently dropped.
137
135
  //
138
- // `mergeStateStatus` is upper-cased because that is how `gh` spelled it, and because the merge-gate
139
- // snapshot in `git-pr-checks-eval.ts` compares strictly against that spelling
140
- // (joshuafolkken/kit#1028 converts the snapshot itself).
136
+ // `mergeStateStatus` is upper-cased because that is how `gh` spells it, and because the merge-gate
137
+ // snapshot in `git-pr-checks-eval.ts` compares strictly against that spelling.
141
138
  function to_pr_info(pull: RestPull): Record<string, unknown> {
142
139
  return {
143
140
  mergeable: pull.mergeable,
@@ -148,7 +145,7 @@ function to_pr_info(pull: RestPull): Record<string, unknown> {
148
145
 
149
146
  // The conversation comments in the shape `gh pr view --json comments` answered with. A listing that
150
147
  // will not parse throws rather than answering an empty one — `git-pr-ai-review.ts` reads an empty
151
- // listing as "no reviewer left a finding" and merges (joshuafolkken/kit#973).
148
+ // listing as "no reviewer left a finding" and merges.
152
149
  function to_pr_comments(rest_json: string): Array<Record<string, unknown>> {
153
150
  const parsed = parse_json_array_or_undefined(rest_json, rest_comment_schema)
154
151
  if (parsed === undefined) throw new Error(NOT_A_COMMENT_LISTING_MESSAGE)
@@ -5,7 +5,7 @@ import { z } from 'zod'
5
5
  //
6
6
  // **REST has no field for it.** `repos/{owner}/{repo}/pulls/{N}/reviews` answers every review ever
7
7
  // submitted, so the one value `gh pr view --json reviewDecision` gave has to be folded out of that
8
- // listing (joshuafolkken/kit#1028).
8
+ // listing.
9
9
  //
10
10
  // The only consumer is `is_review_blocked` in `git-pr-checks-eval.ts`, which asks one question: is
11
11
  // `CHANGES_REQUESTED` standing? `APPROVED` and the empty string are therefore interchangeable to the
@@ -41,7 +41,7 @@ type RestReview = z.infer<typeof rest_review_schema>
41
41
  const NOT_A_REVIEW_LISTING = 'gh api answered something other than a review listing'
42
42
 
43
43
  // A listing that will not parse throws rather than answering "nobody requested changes" — the
44
- // merge-gate direction of joshuafolkken/kit#973 again.
44
+ // an unread answer must never let the merge gate pass.
45
45
  function parse_rest_reviews(reviews_json: string): Array<RestReview> {
46
46
  const parsed = parse_json_array_or_undefined(reviews_json, rest_review_schema)
47
47
  if (parsed === undefined) throw new Error(NOT_A_REVIEW_LISTING)
@@ -7,7 +7,7 @@ import { z } from 'zod'
7
7
  // `gh` answered a single `statusCheckRollup` whose elements were of two kinds; REST splits them
8
8
  // across `commits/{sha}/check-runs` (`status` / `conclusion` / `name`) and `commits/{sha}/status`
9
9
  // (`state` / `context`). The merge is pure — given the two responses it decides the answer with
10
- // nothing else to know — so it lives here rather than beside the requests (joshuafolkken/kit#1028).
10
+ // nothing else to know — so it lives here rather than beside the requests.
11
11
 
12
12
  // `__typename` is what `git-pr-checks-parse.ts` distinguishes the two kinds by, and only the status
13
13
  // contexts carry it: the parser's default branch is the check run, so a check run needs no marker
@@ -45,7 +45,7 @@ const NOT_A_STATUS_LISTING = 'gh api answered something other than a commit stat
45
45
  // A response that will not parse throws rather than degrading to an empty rollup. The direction is
46
46
  // what makes it worth the throw: an empty rollup reads as "this pull request has no checks", and
47
47
  // `git-pr-followup.ts` treats that as a reason to stop watching rather than as a failure — so a rate
48
- // limit would arrive as a pull request nothing was ever required to pass (joshuafolkken/kit#973).
48
+ // limit would arrive as a pull request nothing was ever required to pass.
49
49
  function read_pages<T>(raw_json: string, schema: z.ZodType<T>, message: string): Array<T> {
50
50
  const pages = parse_json_array_or_undefined(raw_json, schema)
51
51
  if (pages === undefined) throw new Error(message)
@@ -85,9 +85,9 @@ function read_rank(run: RollupElement): RunRank | undefined {
85
85
  // *within* a suite (a re-run job lands in the suite it re-runs), so what is left is one run per
86
86
  // suite. Across suites GitHub takes the one from the newer suite: PR #2717's cancelled suite was the
87
87
  // older one and GitHub read the pull request `CLEAN`, while PR #2698's cancelled suite was the newer
88
- // one and GitHub held it `BLOCKED`. Ranking by run id alone (joshuafolkken/kit#2644) picked #2698's
88
+ // one and GitHub held it `BLOCKED`. Ranking by run id alone picked #2698's
89
89
  // older, successful suite — its jobs had queued later — so `followup` read green beside a `BLOCKED`
90
- // pull request and waited out its whole budget (joshuafolkken/kit#2700).
90
+ // pull request and waited out its whole budget.
91
91
  function is_ranked_above(candidate: RunRank, current: RunRank): boolean {
92
92
  if (candidate.suite !== current.suite) return candidate.suite > current.suite
93
93
 
@@ -9,11 +9,10 @@ import { to_gh_state } from './git-gh-rest-state'
9
9
  // The merge gate's pull request state snapshot, rebuilt from REST.
10
10
  //
11
11
  // `gh pr view --json mergeStateStatus,reviewDecision,statusCheckRollup` is answered 403 in a cloud
12
- // session (joshuafolkken/kit#1022), and all three fields are GraphQL-only: one has no REST
12
+ // session, and all three fields are GraphQL-only: one has no REST
13
13
  // counterpart at all, one is spelled differently, and one is two endpoints that `gh` merged.
14
14
  // `pnpm josh followup` decides a pull request is green from this value, so a mistake here
15
- // ships as a merge no gate ever cleared rather than as a command that stops working
16
- // (joshuafolkken/kit#1028).
15
+ // ships as a merge no gate ever cleared rather than as a command that stops working.
17
16
  //
18
17
  // The answer stays the JSON string `parse_pr_state_snapshot` already parses. Nothing downstream —
19
18
  // `git-pr-checks-parse.ts`, `git-pr-checks-eval.ts`, `git-pr-followup.ts` — changes.
@@ -59,18 +58,17 @@ async function read_status_check_rollup(commit_sha: string): Promise<Array<objec
59
58
  }
60
59
 
61
60
  // The review history, folded into GraphQL's `reviewDecision`. One request, and the only one of the
62
- // four the merge gate does not need on every poll — see `is_review_decision_decisive`
63
- // (joshuafolkken/kit#1043).
61
+ // four the merge gate does not need on every poll — see `is_review_decision_decisive`.
64
62
  async function pr_get_review_decision(pr_number: number): Promise<string> {
65
63
  const path = git_gh_api_path.pull_reviews_api_path(String(pr_number))
66
64
 
67
65
  return git_gh_pr_review.to_review_decision(await read_array_pages(path))
68
66
  }
69
67
 
70
- // `mergeStateStatus` is upper-cased because that is the spelling `gh` used and the spelling
68
+ // `mergeStateStatus` is upper-cased because that is the spelling `gh` uses and the spelling
71
69
  // `git-pr-checks-eval.ts` compares strictly against: `MERGE_STATE_CLEAN` never matches a lower-case
72
- // `clean`, which would also take every pull request out of the kit#753 escape hatch keyed on
73
- // `UNSTABLE`. The rule is shared with `to_pr_info` rather than written twice.
70
+ // `clean`, which would also take every pull request out of the CodeRabbit non-blocking exemption
71
+ // keyed on `UNSTABLE`. The rule is shared with `to_pr_info` rather than written twice.
74
72
  async function build_checks_fields(pull: RestPull): Promise<Record<string, unknown>> {
75
73
  return {
76
74
  statusCheckRollup: await read_status_check_rollup(read_head_sha(pull)),
@@ -93,7 +91,7 @@ async function resolve_pull(branch_name: string): Promise<ResolvedPull> {
93
91
 
94
92
  // Everything the snapshot carries except the review decision: three requests rather than four.
95
93
  // `pr_number` travels with it so a caller that then *does* want the review decision needs no second
96
- // resolution (joshuafolkken/kit#1043).
94
+ // resolution.
97
95
  interface PrChecksSnapshot {
98
96
  pr_number: number
99
97
  snapshot_json: string
@@ -112,7 +110,7 @@ async function pr_get_checks_snapshot(branch_name: string): Promise<PrChecksSnap
112
110
  // **This is the definition the two halves above must compose to.** The merge gate reads them
113
111
  // separately so it can skip the review listing on a poll that cannot conclude anything, but the
114
112
  // three-field value `gh pr view --json …` answered with is still one thing, and it is asserted here
115
- // rather than reassembled inside a test (joshuafolkken/kit#1043).
113
+ // rather than reassembled inside a test.
116
114
  async function pr_get_state_snapshot(branch_name: string): Promise<string> {
117
115
  const { pr_number, pull } = await resolve_pull(branch_name)
118
116
  const [fields, review_decision] = await Promise.all([
@@ -13,16 +13,16 @@ import { git_gh_pr_snapshot } from './git-gh-pr-snapshot'
13
13
  // The pull-request writes, through REST.
14
14
  //
15
15
  // `gh pr create` / `comment` / `merge` / `checkout` all go through GraphQL, which a cloud session is
16
- // answered 403 for while the REST endpoints are served normally (joshuafolkken/kit#1022). The reads
17
- // converted first — the ones `gh pr view` served in `git-gh-pr-read.ts` (joshuafolkken/kit#1027) and
18
- // the merge gate's snapshot in `git-gh-pr-snapshot.ts` (joshuafolkken/kit#1028) — and these are the
16
+ // answered 403 for while the REST endpoints are served normally. The reads
17
+ // converted first — the ones `gh pr view` served in `git-gh-pr-read.ts` and
18
+ // the merge gate's snapshot in `git-gh-pr-snapshot.ts` — and these are the
19
19
  // last four calls, plus the one whose API use the epic left unconfirmed.
20
20
  //
21
21
  // **Every path here was measured against the live API before it was written**, on a throwaway pull
22
22
  // request opened between two throwaway branches so that neither `main` nor any real pull request was
23
23
  // touched. Two of the four did not behave as reading the documentation would suggest: see
24
24
  // `pr_create` for the duplicate-head response. The other, `pr_checkout`, is gone with its one caller,
25
- // `sync-dependabot-pins` (joshuafolkken/kit#2887).
25
+ // `sync-dependabot-pins`.
26
26
  //
27
27
  // `pr_checks` — a `gh pr checks <branch>` wrapper — is gone rather than converted. Nothing called it:
28
28
  // the merge gate reads the rollup out of the snapshot and `git-pr-checks-watch.ts` runs the watching
@@ -41,7 +41,7 @@ const MERGE_COMMIT_METHOD = 'merge'
41
41
  // least idempotent request the layer makes, so the failure the shared 60-second budget produces is
42
42
  // the expensive one: a merge that landed while the request was already being abandoned. Three
43
43
  // minutes lowers how often that happens without leaving the request unbounded — the recovery below
44
- // is what actually removes the failure mode, and this only makes it rarer (joshuafolkken/kit#1077).
44
+ // is what actually removes the failure mode, and this only makes it rarer.
45
45
  const MERGE_REQUEST_TIMEOUT_MS = 180_000
46
46
  // What a failed merge whose outcome could not be read back is reported as. Deliberately neither
47
47
  // "merged" nor "not merged": nobody read it.
@@ -102,7 +102,7 @@ async function pr_ensure_classification(
102
102
  // `{"message":"Validation Failed","errors":[{"resource":"PullRequest","code":"custom","message":"A
103
103
  // pull request already exists for <owner>:<branch>."}]}` — which `gh` writes to **stdout**, putting
104
104
  // only `gh: Validation Failed (HTTP 422)` on stderr. The body reaches the thrown Error because
105
- // `to_gh_error` appends stdout (joshuafolkken/kit#1029); the `already exists` match itself is
105
+ // `to_gh_error` appends stdout; the `already exists` match itself is
106
106
  // unchanged, because both wordings contain it and the 422 carries no machine-readable code for the
107
107
  // case (`"code":"custom"`).
108
108
  async function post_pull_request(title: string, body: string): Promise<string> {
@@ -152,8 +152,8 @@ async function pr_comment(branch_name: string, body: string): Promise<string> {
152
152
 
153
153
  // Replaces the body of the branch's open pull request. `git -y` opens a pull request once, so a
154
154
  // body supplied on a later run — the live-execution evidence `followup` gates the merge on
155
- // (joshuafolkken/kit#2446) — reaches an already-open one only through this write. The remembered
156
- // detail read holds the old body, so it is cleared first (joshuafolkken/kit#3263).
155
+ // — reaches an already-open one only through this write. The remembered
156
+ // detail read holds the old body, so it is cleared first.
157
157
  async function pr_update_body(branch_name: string, body: string): Promise<void> {
158
158
  const pr_number = await require_pr_number(branch_name)
159
159
 
@@ -165,7 +165,7 @@ async function pr_update_body(branch_name: string, body: string): Promise<void>
165
165
  })
166
166
  }
167
167
 
168
- // A merge moves the remembered detail read's state, so it is cleared first (joshuafolkken/kit#3263).
168
+ // A merge moves the remembered detail read's state, so it is cleared first.
169
169
  async function put_merge(pr_number: number): Promise<void> {
170
170
  forget_pr_numbers()
171
171
  await git_gh_exec.exec_gh_api({
@@ -177,7 +177,7 @@ async function put_merge(pr_number: number): Promise<void> {
177
177
  }
178
178
 
179
179
  // `undefined` is "nobody read it", kept apart from the `false` that means "the pull request is not
180
- // merged". Folding the two is the misread joshuafolkken/kit#925 / #950 / #973 / #1048 all refuse.
180
+ // merged". Folding the two would report an unread state as a settled answer.
181
181
  async function read_merge_state(pr_number: number): Promise<boolean | undefined> {
182
182
  try {
183
183
  return git_gh_pr_rest.is_merged(await read_pull(pr_number))
@@ -222,13 +222,13 @@ async function has_merge_landed(pr_number: number, merge_error: unknown): Promis
222
222
  throw new Error(MERGE_UNCONFIRMED_MESSAGE, { cause: merge_error })
223
223
  }
224
224
 
225
- // **The least idempotent write in this layer, made re-entrant** (joshuafolkken/kit#1077).
225
+ // **The least idempotent write in this layer, made re-entrant**.
226
226
  //
227
- // The request carries a budget like everything else since joshuafolkken/kit#1065, and a merge that
228
- // lands server-side but overruns it used to throw: `followup` then skipped its completion
229
- // notification and the epic auto-close, and a re-run answered 405 on a pull request that was already
230
- // merged. The budget did not create that — before it the same request hung forever, with no
231
- // notification either and no end to the run — it only turned a silent hang into a loud failure.
227
+ // The request carries a budget like everything else, and a merge that lands server-side but overruns
228
+ // it throws: on its own that would make `followup` skip its completion notification and the epic
229
+ // auto-close, and a re-run answer 405 on a pull request that is already merged. The budget does not
230
+ // create that — without it the same request hangs forever, with no notification either and no end to
231
+ // the run — it only turns a silent hang into a loud failure.
232
232
  //
233
233
  // **A failed merge request is not proof the merge did not happen**, so the pull request's own state
234
234
  // settles it: merged, and this returns as if the request had succeeded, which is what lets
@@ -1,20 +1,19 @@
1
1
  // Whether GitHub answered at all — the question a failed read has to ask before it calls itself a
2
- // structural failure (joshuafolkken/kit#1663).
2
+ // structural failure.
3
3
  //
4
- // **The question is now asked of the failed request itself, not of a later one**
5
- // (joshuafolkken/kit#1690). `probe()` used to fire one request at `rate_limit` after the reads were
6
- // over and the answer otherwise final; a connection that dropped for a few hundred milliseconds
7
- // failed a read at t=0 and answered that probe `reachable`, so the run kept the verdict the probe
8
- // gave it rather than the one the read had. What remains here is the classification — status to
9
- // retryable-or-not — which `git-gh-issue-read.ts` applies to the status the failed request carried
10
- // on its own error document.
4
+ // **The question is asked of the failed request itself, not of a later one.** A probe fired at
5
+ // `rate_limit` after the reads are over would misread a connection that dropped for a few hundred
6
+ // milliseconds: it fails a read at t=0 and answers the probe `reachable`, so the run would keep the
7
+ // verdict the probe gave it rather than the one the read had. What lives here is the
8
+ // classification — status to retryable-or-not — which `git-gh-issue-read.ts` applies to the status
9
+ // the failed request carried on its own error document.
11
10
  //
12
11
  // A dropped connection, a name that would not resolve, a rate limit and a 5xx are **retryable**: the
13
12
  // same request a moment later can succeed, and nothing about the repository has to change first. A
14
13
  // 404 or a 401 is not — the issue is absent or the credentials are wrong, and asking again answers
15
- // the same. Callers that cannot tell the two apart have to choose one meaning for both, and
16
- // joshuafolkken/kit#1663 measured what that costs: an unattended run reported thirteen runnable
17
- // issues as an unresolvable dependency graph because DNS hiccuped once.
14
+ // the same. Callers that cannot tell the two apart have to choose one meaning for both, and the
15
+ // cost is concrete: an unattended run can report thirteen runnable issues as an unresolvable
16
+ // dependency graph because DNS hiccuped once.
18
17
  //
19
18
  // **It classifies by status code and not by gh's wording**, which is the same argument
20
19
  // `issue_view_json_classified` records for separating 404 from the rest: a message is prose that can
@@ -25,7 +24,7 @@
25
24
  // **403 is deliberately not retryable.** GitHub does spell some secondary rate limits that way, but
26
25
  // it is equally how a SAML-SSO-unauthorized token, an IP allowlist and an org policy each answer —
27
26
  // all permanent, and all diagnosed correctly by the `gh auth status` advice the unusable-graph
28
- // report already carries. Reading one of those as a connection problem would be this Issue's own
27
+ // report already carries. Reading one of those as a connection problem would be the same
29
28
  // misdirection pointed the other way, so the ambiguous status is left with the permanent meaning and
30
29
  // only the unambiguous ones — 429, 5xx, and no answer at all — are treated as worth asking again.
31
30
  const RATE_LIMITED_STATUS = 429
@@ -6,13 +6,12 @@ import { git_gh_helpers } from './git-gh-helpers'
6
6
  //
7
7
  // Read through REST rather than `gh repo view --json nameWithOwner`: the `gh <noun> <verb>` form
8
8
  // goes through GraphQL, which a cloud session is refused outright (403), so this read answered
9
- // `undefined` there and every caller needing the name inherited that answer
10
- // (joshuafolkken/kit#1023).
9
+ // `undefined` there and every caller needing the name inherited that answer.
11
10
  //
12
11
  // The pull-request reads no longer go through it at all: they address `repos/{owner}/{repo}` and
13
12
  // name the head filter's owner as `{owner}` too, which `gh api` expands inside a query string as
14
13
  // readily as inside a path. That keeps six branch-keyed reads from gaining a second way to fail, and
15
- // it is what makes `pr_get_review_comments` REST end to end (joshuafolkken/kit#1027). The remaining
14
+ // it is what makes `pr_get_review_comments` REST end to end. The remaining
16
15
  // caller is the completion notification, which puts the name in its Telegram body.
17
16
  //
18
17
  // The failure contract is unchanged: `undefined` when the read fails, for a caller that has nothing
@@ -4,7 +4,7 @@
4
4
  // answered `OPEN` / `CLOSED` / `MERGED` and every reader downstream compares against that spelling.
5
5
  // Two endpoints have to recompose the third value from different fields — the issue endpoint from
6
6
  // `pull_request.merged_at`, the pulls endpoint from `merged` — so the rule they share is named here
7
- // rather than in either of them (joshuafolkken/kit#1027).
7
+ // rather than in either of them.
8
8
  const MERGED_STATE = 'MERGED'
9
9
 
10
10
  function to_gh_state(state: string | undefined): string | undefined {
@@ -16,7 +16,7 @@ interface AiReviewPullComment {
16
16
  }
17
17
 
18
18
  // `undefined` when the answer was not a listing at all. `parse_json_array_safe` returned `[]` for
19
- // that, which this gate reads as "no reviewer left a finding" (joshuafolkken/kit#973).
19
+ // that, which this gate reads as "no reviewer left a finding".
20
20
  function parse_ai_review_comments(
21
21
  raw_json: string | undefined,
22
22
  ): Array<AiReviewPullComment> | undefined {
@@ -39,8 +39,9 @@ function format_ai_review_finding(finding: ClassifiedFinding): string {
39
39
  return `- ${finding.author_login}: ${finding.summary}${suffix}`
40
40
  }
41
41
 
42
- // Temporary (kit#753): CodeRabbit findings are surfaced as console info and audit notes for the
43
- // completion notification instead of blocking the merge. Revert together with kit#752.
42
+ // Temporary: CodeRabbit findings are surfaced as console info and audit notes for the
43
+ // completion notification instead of blocking the merge. Revert together with the rest of the
44
+ // temporary CodeRabbit non-blocking policy.
44
45
  function log_info_findings(infos: ReadonlyArray<ClassifiedFinding>): Array<string> {
45
46
  if (infos.length === 0) return []
46
47
 
@@ -111,8 +112,8 @@ async function handle_blockers(input: {
111
112
 
112
113
  // A gate that could not be read is not a gate that passed. An unreadable listing is handled exactly
113
114
  // like an unresolved finding — the same `confirmation` Telegram, the same non-zero exit — because
114
- // what it means is the same: nobody has confirmed the reviewers had nothing to say
115
- // (joshuafolkken/kit#973). An ignore reason still gets past it, for the same reason it gets past a
115
+ // what it means is the same: nobody has confirmed the reviewers had nothing to say.
116
+ // An ignore reason still gets past it, for the same reason it gets past a
116
117
  // real finding: the person has looked.
117
118
  const UNREADABLE_COMMENTS_BODY =
118
119
  'The AI reviewer comments could not be read, so no finding could be ruled out.\n' +
@@ -7,14 +7,14 @@ import {
7
7
  } from './git-pr-checks-parse'
8
8
 
9
9
  // cspell:words coderabbit
10
- // Temporary (kit#753): CodeRabbit is excluded from the default required checks so slow or
10
+ // Temporary: CodeRabbit is excluded from the default required checks so slow or
11
11
  // rate-limited CodeRabbit reviews never block the merge gate. Re-add it via JOSH_REQUIRED_CHECKS
12
- // to restore the old behavior. Revert once the fresh-context review subagent (kit#752) replaces it.
12
+ // to restore the old behavior. Revert once the fresh-context review subagent replaces it.
13
13
  const DEFAULT_REQUIRED_CHECKS = ['SonarQube']
14
14
  // The single source of the check name every CodeRabbit exemption is keyed on — the merge gate's
15
15
  // `is_unstable_only_from_coderabbit`, the look-ahead's `is_awaited_check`, and the fixtures the two
16
16
  // are tested from. A second literal spelling of it anywhere is how one of them silently stops
17
- // matching after CodeRabbit renames its context (joshuafolkken/kit#1217).
17
+ // matching after CodeRabbit renames its context.
18
18
  const CODERABBIT_CHECK_NAME = 'CodeRabbit'
19
19
  const REQUIRED_CHECKS_ENV_VAR = 'JOSH_REQUIRED_CHECKS'
20
20
 
@@ -73,19 +73,17 @@ function is_review_blocked(review_decision: string | undefined): boolean {
73
73
  return review_decision === REVIEW_CHANGES_REQUESTED
74
74
  }
75
75
 
76
- // **A conflicting pull request ends the wait instead of polling through it**
77
- // (joshuafolkken/kit#1232). `DIRTY` is not CLEAN, so it used to answer `pending` and run the whole
78
- // 32-minute budget out on a state that resolves only when a person rebases — ending in a timeout
79
- // that named no cause. This is also where the conflict diagnosis `pnpm josh git` used to carry
80
- // landed: that command read `mergeStateStatus` after its own two-minute watch, and now returns as
81
- // soon as the pull request is open, so the first poll here is what reports a conflict — about ten
82
- // seconds against that two minutes.
76
+ // **A conflicting pull request ends the wait instead of polling through it**.
77
+ // `DIRTY` is not CLEAN, so it would otherwise answer `pending` and run the whole 32-minute budget
78
+ // out on a state that resolves only when a person rebases — ending in a timeout that names no cause.
79
+ // `pnpm josh git` returns as soon as the pull request is open, so the first poll here is what
80
+ // reports a conflict.
83
81
  //
84
82
  // **`BLOCKED` is deliberately not here.** GitHub reports it while a required check is merely queued,
85
- // which is every healthy pull request for its first seconds. The old reader treated it as a conflict
86
- // safely only because it ran after the checks had settled; there is no equivalent moment on this
87
- // path, and a green-but-`BLOCKED` pull request (branch protection requiring a review, which this
88
- // repository does not set) therefore reaches the timeout rather than a named failure.
83
+ // which is every healthy pull request for its first seconds. Treating it as a conflict is safe only
84
+ // after the checks have settled; there is no such moment on this path, and a green-but-`BLOCKED`
85
+ // pull request (branch protection requiring a review, which this repository does not set)
86
+ // therefore reaches the timeout rather than a named failure.
89
87
  function is_merge_conflict(merge_state_status: string | undefined): boolean {
90
88
  return merge_state_status === MERGE_STATE_DIRTY
91
89
  }
@@ -121,8 +119,8 @@ function is_coderabbit_check(check_name: string): boolean {
121
119
  return is_required_match(check_name, CODERABBIT_CHECK_NAME)
122
120
  }
123
121
 
124
- // Temporary (kit#753): a pending or failing CodeRabbit check makes GitHub report UNSTABLE even
125
- // though CodeRabbit is no longer required. Accept that state only when CodeRabbit checks are the
122
+ // Temporary: a pending or failing CodeRabbit check makes GitHub report UNSTABLE even
123
+ // though CodeRabbit is not required. Accept that state only when CodeRabbit checks are the
126
124
  // sole non-passing ones — any other non-passing check keeps the gate strict.
127
125
  function is_unstable_only_from_coderabbit(snapshot: PrStateSnapshot): boolean {
128
126
  if (snapshot.merge_state_status !== MERGE_STATE_UNSTABLE) return false
@@ -136,16 +134,16 @@ function is_required_check(check_name: string): boolean {
136
134
  return REQUIRED_CHECKS.some((required) => is_required_match(check_name, required))
137
135
  }
138
136
 
139
- // A failing job outside the required list used to decide nothing: GitHub reports the pull request as
140
- // UNSTABLE rather than failed, so `evaluate_pr_state` answered `pending` and the wait ran out its
141
- // whole 32-minute budget before ending in a timeout that never named the cause
142
- // (joshuafolkken/kit#990). Any failed check therefore ends the wait now — except CodeRabbit's, which
143
- // kit#753 keeps non-blocking end to end, unless a project has put it back on the required list via
137
+ // A failing job outside the required list does not fail the pull request on GitHub: it reports
138
+ // UNSTABLE, so `evaluate_pr_state` alone would answer `pending` and the wait would run out its whole
139
+ // 32-minute budget before ending in a timeout that never names the cause. Any failed check
140
+ // therefore ends the wait — except CodeRabbit's, which the temporary CodeRabbit non-blocking policy
141
+ // keeps non-blocking end to end, unless a project has put it back on the required list via
144
142
  // `JOSH_REQUIRED_CHECKS`. This only makes the gate report sooner: nothing here can produce
145
143
  // `success`, so no failing check gains a path to a merge. What counts as failed is whatever the
146
144
  // parser records as `fail` — `cancelled` and `timed_out` among them — which is the rule the required
147
- // list has always followed; the cost is that a job cancelled and re-run by hand is no longer picked
148
- // up by a wait already in progress, and `followup` has to be run again.
145
+ // list follows; the cost is that a job cancelled and re-run by hand is not picked up by a wait
146
+ // already in progress, and `followup` has to be run again.
149
147
  function is_blocking_failure(check: RollupCheck): boolean {
150
148
  if (check.status !== CHECK_STATUS_FAIL) return false
151
149
 
@@ -163,7 +161,7 @@ function is_mergeable_state(snapshot: PrStateSnapshot): boolean {
163
161
  }
164
162
 
165
163
  // The wait's own error text: naming the checks that failed is what turns a red `followup` into
166
- // something actionable without opening the pull request (joshuafolkken/kit#990).
164
+ // something actionable without opening the pull request.
167
165
  function collect_failure_reasons(snapshot: PrStateSnapshot): Array<string> {
168
166
  const reasons: Array<string> = []
169
167
  if (is_merge_conflict(snapshot.merge_state_status)) reasons.push(FAILURE_REASON_CONFLICT)
@@ -204,7 +202,7 @@ function evaluate_pr_state(snapshot: PrStateSnapshot): PrEvaluation {
204
202
  // `failure` without one is a poll that ends the wait, and both need it — `success` because a standing
205
203
  // change request must demote it, `failure` because `describe_pr_failure` names the reasons and
206
204
  // dropping "review requested changes" from a message that also lists failed checks loses half the
207
- // diagnosis (joshuafolkken/kit#1043).
205
+ // diagnosis.
208
206
  //
209
207
  // **This is a freshness rule, not a cache.** Nothing is remembered between polls, which is the one
210
208
  // shape that would be wrong here — a stale non-blocking decision is exactly the direction that ships
@@ -212,7 +210,7 @@ function evaluate_pr_state(snapshot: PrStateSnapshot): PrEvaluation {
212
210
  // read in that same poll.
213
211
  //
214
212
  // **What it costs, stated rather than glossed.** A change request standing on a pull request whose
215
- // checks never settle used to end the wait on the first poll with `review requested changes`; it now
213
+ // checks never settle does not end the wait on the first poll with `review requested changes`; it
216
214
  // runs the budget out and ends with the wait's own timeout, which names no cause. That run was red
217
215
  // either way — the trade only ever moves a red result later, never a green one earlier — but the
218
216
  // diagnosis is genuinely worse in that one case.
@@ -220,9 +218,9 @@ function is_review_decision_decisive(snapshot: PrStateSnapshot): boolean {
220
218
  return evaluate_pr_state(snapshot) !== 'pending'
221
219
  }
222
220
 
223
- // **Whether GitHub's auto-merge can never fire on this pull request** (joshuafolkken/kit#2497). This is
224
- // narrower than the merge gate's `failure`: the gate also fails a red check outside the required list
225
- // (joshuafolkken/kit#990), but auto-merge waits only on the required ones, so such a pull request still
221
+ // **Whether GitHub's auto-merge can never fire on this pull request**. This is
222
+ // narrower than the merge gate's `failure`: the gate also fails a red check outside the required list,
223
+ // but auto-merge waits only on the required ones, so such a pull request still
226
224
  // lands — reading it as blocked would call a landing flush stuck.
227
225
  function is_auto_merge_blocked(snapshot: PrStateSnapshot): boolean {
228
226
  const failed_required = snapshot.rollup.filter(
@@ -238,7 +236,7 @@ function is_auto_merge_blocked(snapshot: PrStateSnapshot): boolean {
238
236
  )
239
237
  }
240
238
 
241
- // A failed wait whose cause is a merge conflict (joshuafolkken/kit#3221), so `followup` names its last
239
+ // A failed wait whose cause is a merge conflict, so `followup` names its last
242
240
  // lap `conflict` rather than `interrupted` and the cause is read from the stage block, not looked up.
243
241
  class PrConflictError extends Error {
244
242
  override name = 'PrConflictError'
@@ -7,20 +7,19 @@ const CHECK_STATUS_FAIL = 'fail'
7
7
  const CHECK_STATUS_MISSING = 'missing'
8
8
 
9
9
  // GitHub reports a job whose `if:` condition was false as COMPLETED with conclusion `skipped`, and
10
- // counts it as satisfied for branch protection — PR #792 reached CLEAN while three such jobs sat in
11
- // its rollup. Recording them as `fail` therefore disagreed with GitHub itself, and it disabled the
12
- // kit#753 escape hatch: `is_unstable_only_from_coderabbit` opens the gate only when every
13
- // non-passing check is CodeRabbit's, so kit's own conditional jobs (`auto-merge`, `E2E`,
14
- // `Notify Auto Tag`) kept a slow review blocking the merge until the wait loop timed out. The bug
15
- // was invisible on fast reviews, where CLEAN short-circuits the predicate — it could only surface on
16
- // the exact path kit#753 exists to protect.
10
+ // counts it as satisfied for branch protection — a pull request reaches CLEAN with such jobs in its
11
+ // rollup. Recording them as `fail` would disagree with GitHub itself, and it would disable the
12
+ // CodeRabbit non-blocking exemption: `is_unstable_only_from_coderabbit` opens the gate only when
13
+ // every non-passing check is CodeRabbit's, so kit's own conditional jobs (`auto-merge`, `E2E`,
14
+ // `Notify Auto Tag`) would keep a slow review blocking the merge until the wait loop timed out. That
15
+ // is invisible on fast reviews, where CLEAN short-circuits the predicate — it surfaces only on the
16
+ // exact path the exemption exists to protect.
17
17
  //
18
- // `neutral` is here for the same reason `skipped` is, and joshuafolkken/kit#990 is what made leaving
19
- // it out untenable. GitHub's own rollup counts a neutral conclusion as satisfied, so such a pull
20
- // request reports CLEAN and merges in the UI — reading it as `fail` disagreed with GitHub exactly as
21
- // `skipped` did. Until kit#990 that disagreement was survivable, because a non-required failure only
22
- // left the state pending; now it ends the wait outright, so a bot that emits `neutral` to say it has
23
- // nothing to report would kill a `followup` on a pull request GitHub considers mergeable.
18
+ // `neutral` is here for the same reason `skipped` is. GitHub's own rollup counts a neutral
19
+ // conclusion as satisfied, so such a pull request reports CLEAN and merges in the UI — reading it as
20
+ // `fail` would disagree with GitHub exactly as `skipped` would. Because a non-required failure ends
21
+ // the wait outright, a bot that emits `neutral` to say it has nothing to report would kill a
22
+ // `followup` on a pull request GitHub considers mergeable.
24
23
  // `action_required` and `stale` stay out on purpose: GitHub does not count either as satisfied, and
25
24
  // a wrongly-blocked run costs one re-run of `followup` while a wrongly-passed one ships code no gate
26
25
  // ever cleared.
@@ -53,9 +52,8 @@ function read_string(value: unknown): string | undefined {
53
52
  }
54
53
 
55
54
  // `EXPECTED` is GitHub's state for a required status context that has not been posted yet, so it is
56
- // a check still to come rather than one that failed. Reading it as `fail` only delayed the merge
57
- // until joshuafolkken/kit#990; it would now end the wait on the first poll of a run that is still
58
- // legitimately progressing — the premature red exit kit#851 was filed to remove.
55
+ // a check still to come rather than one that failed. Reading it as `fail` would end the wait on the
56
+ // first poll of a run that is still legitimately progressing — a premature red exit.
59
57
  const PENDING_STATUS_STATES = new Set(['pending', 'expected'])
60
58
 
61
59
  function parse_status_context(item: RollupItemData): string {