@joshuafolkken/kit 1.1784.0 → 1.2116.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 (690) hide show
  1. package/.claude/agents/reviewer-verification.md +19 -0
  2. package/.claude/agents/reviewer.md +19 -0
  3. package/.claude/settings.json +5 -6
  4. package/.claude/skills/dependency-update/SKILL.md +9 -10
  5. package/.claude/skills/workflow-commands/SKILL.md +6 -6
  6. package/.claude/skills/workflow-commands/background-commands.md +8 -5
  7. package/.claude/skills/workflow-commands/backlogrun-child.md +3 -1
  8. package/.claude/skills/workflow-commands/backlogrun-lanes.md +1 -1
  9. package/.claude/skills/workflow-commands/backlogrun-park.md +5 -2
  10. package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -3
  11. package/.claude/skills/workflow-commands/backlogrun-recovery.md +1 -1
  12. package/.claude/skills/workflow-commands/backlogrun-steps.md +3 -2
  13. package/.claude/skills/workflow-commands/backlogrun.md +1 -1
  14. package/.claude/skills/workflow-commands/chain-rule.md +41 -32
  15. package/.claude/skills/workflow-commands/delegation.md +6 -6
  16. package/.claude/skills/workflow-commands/entry-sequence.md +2 -2
  17. package/.claude/skills/workflow-commands/followup.md +7 -5
  18. package/.claude/skills/workflow-commands/fullrun-steps.md +6 -6
  19. package/.claude/skills/workflow-commands/fullrun.md +1 -1
  20. package/.claude/skills/workflow-commands/issue-comments.md +9 -4
  21. package/.claude/skills/workflow-commands/issue-fold-existing.md +2 -1
  22. package/.claude/skills/workflow-commands/kickoff.md +2 -2
  23. package/.claude/skills/workflow-commands/observation-filing.md +1 -1
  24. package/.claude/skills/workflow-commands/observation-ledger.md +6 -4
  25. package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -7
  26. package/.claude/skills/workflow-commands/prerequisite.md +3 -2
  27. package/.claude/skills/workflow-commands/retrospective.md +2 -2
  28. package/.claude/skills/workflow-commands/split-assessment.md +7 -5
  29. package/.codex/hooks.json +5 -5
  30. package/.github/actions/setup-pnpm/action.yml +9 -16
  31. package/.github/dependabot.yml +16 -0
  32. package/.github/workflows/auto-tag.yml +45 -0
  33. package/.github/workflows/ci.yml +155 -15
  34. package/.github/workflows/dependabot-auto-merge.yml +63 -4
  35. package/.github/workflows/production.yml +8 -0
  36. package/.github/workflows/publish.yml +60 -45
  37. package/.vscode/settings.json +19 -0
  38. package/CLAUDE.md +5 -12
  39. package/SECURITY.md +2 -2
  40. package/dist/CLAUDE.md +5 -12
  41. package/dist/commands/document-read-cli.js +2 -1
  42. package/dist/commands/document-section-main.js +2 -1
  43. package/dist/commands/read-set-cli.js +194 -134
  44. package/dist/commands/run-prep-main.js +9694 -10173
  45. package/dist/commands/run-step-cli.js +22138 -18285
  46. package/dist/hooks/audit-provision.js +23 -5
  47. package/dist/hooks/chunk-3GKE653K.js +6204 -0
  48. package/dist/hooks/chunk-45CJJOO7.js +1243 -0
  49. package/dist/hooks/{chunk-CWMBGKYW.js → chunk-5PM2JRGV.js} +2153 -856
  50. package/dist/hooks/{chunk-WR2KQAYZ.js → chunk-7SIUNQXK.js} +1207 -1470
  51. package/dist/hooks/{chunk-O2YBIDSI.js → chunk-CQD4LJE6.js} +1682 -1130
  52. package/dist/hooks/{chunk-VWWCFGWK.js → chunk-OPSRGWFU.js} +1 -1
  53. package/dist/hooks/{chunk-XGBNSWEI.js → chunk-UJ3FPMMM.js} +132 -49
  54. package/dist/hooks/chunk-VVNYJWEI.js +30 -0
  55. package/dist/hooks/chunk-Z6DQJKH3.js +2806 -0
  56. package/dist/hooks/codex-hook-adapter.js +8 -8
  57. package/dist/hooks/format-edited.js +4 -5
  58. package/dist/hooks/inputs.json +386 -360
  59. package/dist/hooks/pretool-guard.js +7 -6
  60. package/dist/hooks/session-lang.js +101 -258
  61. package/dist/hooks/stop-guard.js +1744 -2576
  62. package/dist/josh.js +7133 -6368
  63. package/dist/version/index.js +161 -1
  64. package/eslint/rules/comment-why-only.js +108 -0
  65. package/package.json +16 -9
  66. package/prompts/coding-standards.md +1 -1
  67. package/prompts/collaboration-workflow/file-edits.md +14 -11
  68. package/prompts/collaboration-workflow/issue-citation.md +0 -4
  69. package/prompts/collaboration-workflow/issue-template.md +40 -21
  70. package/prompts/collaboration-workflow/lane-instructions.md +3 -1
  71. package/prompts/collaboration-workflow/measurement.md +8 -1
  72. package/prompts/collaboration-workflow/operating-rules.md +11 -2
  73. package/prompts/collaboration-workflow/output-bounds.md +6 -2
  74. package/prompts/collaboration-workflow/plan-comment.md +1 -1
  75. package/prompts/collaboration-workflow/principles.md +9 -0
  76. package/prompts/collaboration-workflow/residency.md +3 -2
  77. package/prompts/collaboration-workflow/rule-delivery.md +13 -1
  78. package/prompts/collaboration-workflow/upstream-interrupt.md +2 -2
  79. package/prompts/collaboration-workflow/wip-cap.md +3 -1
  80. package/prompts/review-rubric.md +8 -0
  81. package/prompts/review.md +31 -22
  82. package/prompts/testing-guide.md +1 -0
  83. package/scripts/agent/agent-argv.ts +14 -16
  84. package/scripts/agent/agent-provider.ts +138 -0
  85. package/scripts/agent/agent-role-profile.ts +108 -156
  86. package/scripts/agent/agent-safe-text.ts +20 -5
  87. package/scripts/agent/api-usage-limit.ts +65 -0
  88. package/scripts/agent/claude-agent-argv.ts +19 -9
  89. package/scripts/agent/codex-agent-argv.ts +118 -22
  90. package/scripts/agent/usage-limit-reset.ts +179 -0
  91. package/scripts/auth/claude-token-output.ts +2 -2
  92. package/scripts/auto-ok/auto-ok-author.ts +53 -0
  93. package/scripts/auto-ok/auto-ok-cli.ts +20 -9
  94. package/scripts/backlog/backlog-defect-priority.ts +1 -1
  95. package/scripts/backlog/backlog-drive-cli.ts +6 -1
  96. package/scripts/backlog/backlog-drive-hold.ts +3 -3
  97. package/scripts/backlog/backlog-drive-idle.ts +10 -0
  98. package/scripts/backlog/backlog-drive-launch-pass.ts +90 -0
  99. package/scripts/backlog/backlog-drive-launch.ts +8 -2
  100. package/scripts/backlog/backlog-drive-named-offer.ts +73 -30
  101. package/scripts/backlog/backlog-drive-named.ts +28 -7
  102. package/scripts/backlog/backlog-drive-paused.ts +5 -4
  103. package/scripts/backlog/backlog-drive-restore.ts +11 -3
  104. package/scripts/backlog/backlog-drive.ts +21 -60
  105. package/scripts/backlog/backlog-gate-scope.ts +61 -0
  106. package/scripts/backlog/backlog-measure-close.ts +112 -0
  107. package/scripts/backlog/backlog-next.ts +39 -49
  108. package/scripts/backlog/backlog-occupied.ts +2 -2
  109. package/scripts/backlog/backlog-overlap.ts +42 -8
  110. package/scripts/backlog/backlog-plan-cli.ts +4 -1
  111. package/scripts/backlog/backlog-plan-comment.ts +81 -0
  112. package/scripts/backlog/backlog-plan-read.ts +19 -6
  113. package/scripts/backlog/backlog-pool.ts +50 -12
  114. package/scripts/backlog/backlog-rank.ts +60 -13
  115. package/scripts/backlog/backlog-stalled-detect.ts +2 -1
  116. package/scripts/backlog/backlog-waves.ts +17 -2
  117. package/scripts/backlog/backlogrun-launch.ts +7 -4
  118. package/scripts/cost-runtime/context-cut-payback.ts +27 -25
  119. package/scripts/cost-runtime/cost-cli.ts +37 -16
  120. package/scripts/cost-runtime/cost-pricing.ts +9 -0
  121. package/scripts/cost-runtime/cost-verdict.ts +4 -1
  122. package/scripts/delegation/delegation-policy.ts +2 -2
  123. package/scripts/delegation/duplicate-read-guard.ts +1 -0
  124. package/scripts/delegation/investigation-guard.ts +14 -2
  125. package/scripts/delegation/investigation-reads.ts +45 -23
  126. package/scripts/dependabot/dependabot-cooldown.ts +3 -2
  127. package/scripts/discovery/repo-party.ts +80 -20
  128. package/scripts/discovery/session-owner-pin.ts +51 -0
  129. package/scripts/document/capped-print.ts +1 -1
  130. package/scripts/document/command-reference-line-budget.ts +42 -0
  131. package/scripts/document/document-byte-budget.ts +17 -7
  132. package/scripts/document/document-checks.ts +20 -0
  133. package/scripts/document/document-ratchet-check.ts +101 -0
  134. package/scripts/document/document-section.ts +1 -0
  135. package/scripts/document/entry-read-budget.ts +7 -3
  136. package/scripts/document/issue-citation-budget.ts +94 -0
  137. package/scripts/epic/epic-cli-argv.ts +2 -2
  138. package/scripts/epic/epic-fetch.ts +4 -2
  139. package/scripts/epic/epic-graph.ts +7 -2
  140. package/scripts/epic/epic-issue.ts +3 -1
  141. package/scripts/epic/epic-rank.ts +5 -0
  142. package/scripts/exports/unused-members-check.ts +62 -0
  143. package/scripts/exports/unused-members-cli.ts +6 -51
  144. package/scripts/followup/followup-ci-path.ts +67 -0
  145. package/scripts/followup/followup-coderabbit-retrigger.ts +261 -0
  146. package/scripts/followup/followup-coderabbit-wait.ts +13 -10
  147. package/scripts/followup/followup-failed-tests.ts +160 -0
  148. package/scripts/followup/followup-job-needs.ts +100 -0
  149. package/scripts/followup/followup-job-rerun.ts +303 -0
  150. package/scripts/followup/followup-main-move.ts +113 -0
  151. package/scripts/followup/git-followup-finish.ts +43 -11
  152. package/scripts/followup/git-followup-pending.ts +3 -3
  153. package/scripts/followup/git-followup-stages.ts +41 -11
  154. package/scripts/followup/git-pr-followup-checks.ts +55 -16
  155. package/scripts/followup/git-pr-followup-wrapup.ts +24 -5
  156. package/scripts/followup/git-pr-followup.ts +62 -27
  157. package/scripts/fresh-machine/fresh-machine-script.ts +5 -9
  158. package/scripts/fresh-machine/specs/kit-test-backlogrun-python.json +2 -2
  159. package/scripts/fresh-machine/specs/kit-test-backlogrun.json +2 -2
  160. package/scripts/gate/busy-average.ts +34 -2
  161. package/scripts/gate/check-related-pinned.ts +43 -0
  162. package/scripts/gate/check-related-reuse.ts +64 -0
  163. package/scripts/gate/check-related-section.ts +57 -0
  164. package/scripts/gate/check-related-unplanned.ts +34 -0
  165. package/scripts/gate/check-related.ts +265 -0
  166. package/scripts/gate/command-memory.ts +1 -1
  167. package/scripts/gate/core-admission.ts +24 -6
  168. package/scripts/gate/core-budget-timing.ts +20 -6
  169. package/scripts/gate/core-budget.ts +40 -11
  170. package/scripts/gate/core-wait-record.ts +3 -2
  171. package/scripts/gate/core-wait.ts +25 -2
  172. package/scripts/gate/core-weights.ts +15 -7
  173. package/scripts/gate/gate-labels.ts +46 -0
  174. package/scripts/gate/gate-ledger.ts +14 -6
  175. package/scripts/gate/gate-plan.ts +103 -58
  176. package/scripts/gate/gate-report.ts +9 -7
  177. package/scripts/gate/gate-run-steps.ts +26 -3
  178. package/scripts/gate/gate-skip.ts +45 -6
  179. package/scripts/gate/gate-static-group.ts +60 -0
  180. package/scripts/gate/gate-steps.ts +2 -1
  181. package/scripts/gate/gate-tree.ts +4 -2
  182. package/scripts/gate/hook-gate-reuse.ts +19 -2
  183. package/scripts/gate/metrics-totals.ts +59 -0
  184. package/scripts/gate/scoped-green.ts +68 -15
  185. package/scripts/gate/since-green.ts +14 -6
  186. package/scripts/gate/structural-checks.ts +96 -0
  187. package/scripts/gate/verification-gate.ts +51 -16
  188. package/scripts/gate/verification-inputs.ts +21 -6
  189. package/scripts/gate/verification-tail.ts +52 -0
  190. package/scripts/gh/gh-author-association.ts +23 -2
  191. package/scripts/gh/git-ai-review-scan.ts +1 -1
  192. package/scripts/gh/git-gh-api-path.ts +12 -3
  193. package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
  194. package/scripts/gh/git-gh-exec.ts +32 -2
  195. package/scripts/gh/git-gh-issue-read.ts +4 -2
  196. package/scripts/gh/git-gh-issue-rest.ts +1 -0
  197. package/scripts/gh/git-gh-issue-write.ts +8 -2
  198. package/scripts/gh/git-gh-issue.ts +12 -5
  199. package/scripts/gh/git-gh-pr-auto-merge.ts +13 -6
  200. package/scripts/gh/git-gh-pr-graphql-state.ts +56 -0
  201. package/scripts/gh/git-gh-pr-read.ts +74 -13
  202. package/scripts/gh/git-gh-pr-rest.ts +3 -1
  203. package/scripts/gh/git-gh-pr-snapshot.ts +22 -7
  204. package/scripts/gh/git-gh-pr-too-large.ts +20 -0
  205. package/scripts/gh/git-gh-pr.ts +21 -7
  206. package/scripts/gh/git-gh-retry.ts +141 -0
  207. package/scripts/gh/git-pr-ai-review.ts +15 -6
  208. package/scripts/gh/git-pr-checks-eval.ts +3 -0
  209. package/scripts/gh/git-pr-checks.ts +5 -5
  210. package/scripts/git/base-tree.ts +30 -0
  211. package/scripts/git/change-base.ts +4 -10
  212. package/scripts/git/changed-paths-sync.ts +63 -0
  213. package/scripts/git/changed-paths.ts +16 -1
  214. package/scripts/git/git-common-directory.ts +11 -1
  215. package/scripts/git/git-diff-reads.ts +66 -20
  216. package/scripts/git/git-error.ts +9 -2
  217. package/scripts/git/git-schemas.ts +13 -0
  218. package/scripts/git/git-worktree.ts +13 -0
  219. package/scripts/git/gone-branch.ts +4 -1
  220. package/scripts/git/main-merge-budget-conflict.ts +89 -0
  221. package/scripts/git/main-merge-guard.ts +55 -18
  222. package/scripts/git/main-merge-regenerate.ts +59 -25
  223. package/scripts/git/main-merge.ts +53 -5
  224. package/scripts/git/no-base-checkout.ts +127 -0
  225. package/scripts/git/stash/git-stash.ts +11 -2
  226. package/scripts/git/stash/stash-push-cli.ts +10 -0
  227. package/scripts/hooks/batch-guard.ts +40 -21
  228. package/scripts/hooks/edited-cspell.ts +37 -11
  229. package/scripts/hooks/format-edited-file.ts +22 -2
  230. package/scripts/hooks/lane-plan-guard.ts +50 -0
  231. package/scripts/hooks/pre-commit-lint-switch.ts +9 -0
  232. package/scripts/hooks/pre-commit-lint.ts +14 -1
  233. package/scripts/hooks/pre-push-related-switch.ts +10 -0
  234. package/scripts/hooks/pre-push-unit.ts +76 -10
  235. package/scripts/hooks/pretool-guard.ts +2 -0
  236. package/scripts/hooks/reserved-run.ts +14 -1
  237. package/scripts/hooks/run-hook.sh +23 -8
  238. package/scripts/hooks/step-zero-notice.ts +6 -1
  239. package/scripts/hooks/stop-actions.ts +3 -15
  240. package/scripts/hooks/stop-guard.ts +7 -6
  241. package/scripts/init/distributed-paths.ts +1 -0
  242. package/scripts/init/hook-command-rewrite.ts +5 -1
  243. package/scripts/init/hook-launch.ts +4 -2
  244. package/scripts/issue/aggregation-split.ts +52 -0
  245. package/scripts/issue/defect-origin-line.ts +19 -1
  246. package/scripts/issue/defect-rate-cli.ts +5 -102
  247. package/scripts/issue/defect-report.ts +4 -4
  248. package/scripts/issue/effect-audit-cli.ts +178 -0
  249. package/scripts/issue/effect-audit.ts +185 -0
  250. package/scripts/issue/expected-effect-lint.ts +64 -9
  251. package/scripts/issue/git-next-issues.ts +5 -0
  252. package/scripts/issue/issue-body-or-comment.ts +38 -4
  253. package/scripts/issue/issue-cite-cli.ts +1 -3
  254. package/scripts/issue/issue-classification.ts +1 -0
  255. package/scripts/issue/issue-closing-pr.ts +8 -1
  256. package/scripts/issue/issue-evidence-exit.ts +4 -2
  257. package/scripts/issue/issue-file-cap.ts +58 -0
  258. package/scripts/issue/issue-file-cli.ts +111 -38
  259. package/scripts/issue/issue-file-deferral.ts +52 -0
  260. package/scripts/issue/issue-file-fold.ts +29 -10
  261. package/scripts/issue/issue-file-interrupt.ts +85 -0
  262. package/scripts/issue/issue-file-lane-hint.ts +30 -0
  263. package/scripts/issue/issue-file.ts +43 -6
  264. package/scripts/issue/issue-labels.ts +19 -2
  265. package/scripts/issue/issue-lint-cli.ts +27 -2
  266. package/scripts/issue/issue-measured-cli.ts +13 -35
  267. package/scripts/issue/issue-measured-close.ts +58 -0
  268. package/scripts/issue/issue-not-before-label.ts +2 -2
  269. package/scripts/issue/issue-not-before.ts +4 -1
  270. package/scripts/issue/issue-priority-cli.ts +60 -0
  271. package/scripts/issue/issue-priority-raise.ts +55 -0
  272. package/scripts/issue/issue-priority.ts +174 -43
  273. package/scripts/issue/issue-rank.ts +21 -4
  274. package/scripts/issue/issue-read-cli.ts +32 -6
  275. package/scripts/issue/issue-read.ts +37 -12
  276. package/scripts/issue/issue-sample-gate.ts +95 -74
  277. package/scripts/issue/issue-sample-prime.ts +127 -0
  278. package/scripts/issue/issue-sample-required.ts +57 -0
  279. package/scripts/issue/issue-sample-source.ts +12 -11
  280. package/scripts/issue/issue-search.ts +124 -0
  281. package/scripts/issue/issue-state.ts +13 -1
  282. package/scripts/issue/issue-template-section.ts +43 -0
  283. package/scripts/issue/issue-watch-diff.ts +31 -1
  284. package/scripts/issue/issue-watch-hook.ts +11 -2
  285. package/scripts/issue/issue-watch.ts +55 -12
  286. package/scripts/issue/markdown-section.ts +1 -0
  287. package/scripts/issue/measure-declaration.ts +121 -0
  288. package/scripts/issue/measure-rerun-cli.ts +7 -70
  289. package/scripts/issue/plan-consumers-section.ts +22 -1
  290. package/scripts/issue/reproduction-measure.ts +3 -1
  291. package/scripts/issue/size-estimate.ts +90 -0
  292. package/scripts/issue/trusted-measure.ts +84 -0
  293. package/scripts/josh/command-usage.ts +3 -2
  294. package/scripts/josh/durable-state-migrate.ts +105 -0
  295. package/scripts/josh/durable-state.ts +112 -0
  296. package/scripts/josh/josh-aliases.ts +95 -0
  297. package/scripts/josh/josh-command-map.ts +1 -82
  298. package/scripts/josh/josh-commands-agent-hooks.ts +6 -6
  299. package/scripts/josh/josh-commands-ai.ts +5 -5
  300. package/scripts/josh/josh-commands-development.ts +59 -58
  301. package/scripts/josh/josh-commands-issue-write.ts +23 -4
  302. package/scripts/josh/josh-commands-issue.ts +32 -0
  303. package/scripts/josh/josh-commands-lane.ts +87 -4
  304. package/scripts/josh/josh-commands-lint.ts +16 -3
  305. package/scripts/josh/josh-commands-maintenance.ts +15 -0
  306. package/scripts/josh/josh-commands-review.ts +41 -6
  307. package/scripts/josh/josh-commands-ship.ts +56 -8
  308. package/scripts/josh/josh-commands-test-check.ts +80 -0
  309. package/scripts/josh/josh-commands-workflow.ts +1 -1
  310. package/scripts/josh/josh-environment-file.ts +43 -3
  311. package/scripts/josh/josh-in-process.ts +2 -2
  312. package/scripts/josh/josh-logic.ts +5 -3
  313. package/scripts/josh/josh-run.ts +19 -1
  314. package/scripts/josh/run-record-path.ts +15 -0
  315. package/scripts/josh/stamp-file.ts +11 -2
  316. package/scripts/lane/lane-adopt-cli.ts +98 -0
  317. package/scripts/lane/lane-adopt.ts +208 -0
  318. package/scripts/lane/lane-await.ts +5 -8
  319. package/scripts/lane/lane-baseline.ts +123 -0
  320. package/scripts/lane/lane-breakdown-cli.ts +64 -0
  321. package/scripts/lane/lane-breakdown-implement.ts +170 -0
  322. package/scripts/lane/lane-breakdown-laps.ts +107 -0
  323. package/scripts/lane/lane-breakdown-pinned.ts +76 -0
  324. package/scripts/lane/lane-breakdown-text.ts +145 -0
  325. package/scripts/lane/lane-breakdown.ts +239 -0
  326. package/scripts/lane/lane-check-stats.ts +29 -8
  327. package/scripts/lane/lane-child-invocation.ts +9 -2
  328. package/scripts/lane/lane-child-mark-keys.ts +12 -0
  329. package/scripts/lane/lane-child-marker.ts +20 -1
  330. package/scripts/lane/lane-ci-path-stats.ts +73 -0
  331. package/scripts/lane/lane-claim-stats.ts +84 -0
  332. package/scripts/lane/lane-close.ts +8 -3
  333. package/scripts/lane/lane-dispatch-log.ts +3 -3
  334. package/scripts/lane/lane-dispatch.ts +2 -2
  335. package/scripts/lane/lane-gap-stats.ts +7 -6
  336. package/scripts/lane/lane-guard-policy.ts +7 -1
  337. package/scripts/lane/lane-implement-stats.ts +207 -0
  338. package/scripts/lane/lane-implement-subagents.ts +90 -0
  339. package/scripts/lane/lane-investigation-switch.ts +16 -0
  340. package/scripts/lane/lane-ledger-kind.ts +31 -0
  341. package/scripts/lane/lane-ledger-schema-ship.ts +49 -0
  342. package/scripts/lane/lane-ledger-schema.ts +119 -36
  343. package/scripts/lane/lane-ledger-write.ts +257 -0
  344. package/scripts/lane/lane-ledger.ts +31 -177
  345. package/scripts/lane/lane-load.ts +1 -1
  346. package/scripts/lane/lane-measure-cli.ts +176 -59
  347. package/scripts/lane/lane-net-read.ts +44 -0
  348. package/scripts/lane/lane-net-time.ts +212 -0
  349. package/scripts/lane/lane-open.ts +16 -7
  350. package/scripts/lane/lane-output.ts +2 -4
  351. package/scripts/lane/lane-overrun-prompt.ts +147 -0
  352. package/scripts/lane/lane-overrun.ts +274 -0
  353. package/scripts/lane/lane-paths.ts +24 -1
  354. package/scripts/lane/lane-pause-cli.ts +4 -1
  355. package/scripts/lane/lane-paused-spans.ts +97 -0
  356. package/scripts/lane/lane-plan-check.ts +207 -0
  357. package/scripts/lane/lane-plan-cli.ts +41 -0
  358. package/scripts/lane/lane-plan.ts +144 -0
  359. package/scripts/lane/lane-registry.ts +14 -1
  360. package/scripts/lane/lane-relaunch.ts +1 -1
  361. package/scripts/lane/lane-round-one-stats.ts +51 -0
  362. package/scripts/lane/lane-sampler.ts +23 -4
  363. package/scripts/lane/lane-session-action.ts +93 -18
  364. package/scripts/lane/lane-session-broker.ts +49 -21
  365. package/scripts/lane/lane-session-reread-main.ts +14 -0
  366. package/scripts/lane/lane-session-reread.ts +51 -0
  367. package/scripts/lane/lane-ship-lap-stats.ts +74 -0
  368. package/scripts/lane/lane-sleep.ts +58 -0
  369. package/scripts/lane/lane-spent.ts +1 -1
  370. package/scripts/lane/lane-split-stats.ts +28 -0
  371. package/scripts/lane/lane-stage-stats.ts +13 -1
  372. package/scripts/lane/lane-state.ts +41 -9
  373. package/scripts/lane/lane-stats-tables.ts +58 -0
  374. package/scripts/lane/lane-stats.ts +21 -5
  375. package/scripts/lane/lane-stop-stats.ts +51 -19
  376. package/scripts/lane/lane-tail-stats.ts +32 -0
  377. package/scripts/lane/lane-transcript-calls.ts +67 -10
  378. package/scripts/lane/lane-transcript-stats.ts +44 -12
  379. package/scripts/lane/lane-value-cell.ts +72 -0
  380. package/scripts/lane/lane-value.ts +118 -0
  381. package/scripts/lane/lane-withdraw-closed.ts +124 -0
  382. package/scripts/lane/lane-withdraw.ts +108 -31
  383. package/scripts/lane/lane-yield.ts +85 -0
  384. package/scripts/lane/openai-lane-ship.ts +12 -11
  385. package/scripts/lane/openai-lane-supervisor-decision.ts +6 -8
  386. package/scripts/lane/openai-lane-supervisor-owner.ts +5 -8
  387. package/scripts/lane/openai-lane-supervisor.ts +5 -4
  388. package/scripts/lib/poll.ts +38 -9
  389. package/scripts/lib/settled-together.ts +10 -0
  390. package/scripts/lib/shell-quote.ts +21 -0
  391. package/scripts/lib/token-shape.ts +111 -0
  392. package/scripts/lint/eslint-daemon-sources.ts +79 -0
  393. package/scripts/lint/eslint-daemon.ts +45 -6
  394. package/scripts/lint/eslint-warm-cli.ts +7 -0
  395. package/scripts/lint/eslint-warm.ts +66 -0
  396. package/scripts/lint/import-graph.ts +141 -11
  397. package/scripts/lint/lint-gate-scope.ts +2 -2
  398. package/scripts/lint/lint-parallel.ts +54 -6
  399. package/scripts/lint/lint-related.ts +154 -33
  400. package/scripts/lint/rename-cli.ts +179 -0
  401. package/scripts/lint/rename-identifier.ts +192 -0
  402. package/scripts/lint/type-only-imports.ts +58 -0
  403. package/scripts/notify/telegram-notify.ts +12 -3
  404. package/scripts/observations/observation-record.ts +42 -16
  405. package/scripts/observations/observations-flush.ts +32 -9
  406. package/scripts/overrides/overrides-check.ts +9 -1
  407. package/scripts/release/release-approval-prune.ts +7 -1
  408. package/scripts/repo/required-checks-logic.ts +4 -1
  409. package/scripts/repo/ruleset-check.ts +4 -3
  410. package/scripts/report/markdown-shape.ts +28 -0
  411. package/scripts/report/report-format-reference.ts +15 -1
  412. package/scripts/report/report-labels.ts +12 -1
  413. package/scripts/report/report-lint-child-summary.ts +94 -0
  414. package/scripts/report/report-lint-cli.ts +26 -7
  415. package/scripts/report/report-lint.ts +2 -20
  416. package/scripts/review/prose-stale-cli.ts +88 -0
  417. package/scripts/review/prose-stale-scan.ts +152 -0
  418. package/scripts/review/review-attest.ts +73 -23
  419. package/scripts/review/review-brief-cli.ts +68 -19
  420. package/scripts/review/review-brief-paths.ts +22 -0
  421. package/scripts/review/review-brief.ts +14 -7
  422. package/scripts/review/review-comment-carry.ts +47 -0
  423. package/scripts/review/review-comment-round.ts +85 -22
  424. package/scripts/review/review-finding-ledger.ts +109 -7
  425. package/scripts/review/review-finding-text.ts +43 -0
  426. package/scripts/review/review-interaction.ts +11 -0
  427. package/scripts/review/review-lane-handover.ts +68 -0
  428. package/scripts/review/review-lint-cli.ts +57 -0
  429. package/scripts/review/review-lint-findings.ts +92 -0
  430. package/scripts/review/review-lint-sections.ts +80 -0
  431. package/scripts/review/review-lint.ts +221 -0
  432. package/scripts/review/review-prior-findings.ts +102 -0
  433. package/scripts/review/review-readers-scan.ts +4 -2
  434. package/scripts/review/review-record-cli.ts +177 -54
  435. package/scripts/review/review-record-code-round.ts +55 -0
  436. package/scripts/review/review-record-comment.ts +60 -0
  437. package/scripts/review/review-record-interaction.ts +35 -0
  438. package/scripts/review/review-record-pinned.ts +108 -0
  439. package/scripts/review/review-record.ts +25 -1
  440. package/scripts/review/review-reviewed-tree.ts +307 -0
  441. package/scripts/review/review-round-one-closure.ts +62 -0
  442. package/scripts/review/review-round-reuse.ts +106 -0
  443. package/scripts/review/review-round2-cli.ts +91 -29
  444. package/scripts/review/review-round2-skip-comment.ts +55 -0
  445. package/scripts/review/review-round2.ts +24 -8
  446. package/scripts/review/review-stamps.ts +7 -3
  447. package/scripts/review/review-stop-log.ts +20 -6
  448. package/scripts/review/review-stops-cli.ts +2 -1
  449. package/scripts/review/review-submit-cli.ts +101 -0
  450. package/scripts/rules/agent-model.ts +1 -1
  451. package/scripts/rules/bash-triggers.ts +3 -3
  452. package/scripts/rules/concise-reply.ts +88 -0
  453. package/scripts/rules/credential-body.ts +77 -0
  454. package/scripts/rules/decision-oracle.ts +1 -1
  455. package/scripts/rules/delivered-rules.ts +36 -17
  456. package/scripts/rules/destructive-command.ts +3 -11
  457. package/scripts/rules/direct-issue-comment.ts +34 -12
  458. package/scripts/rules/direct-issue-read.ts +191 -0
  459. package/scripts/rules/direct-pr-create.ts +4 -24
  460. package/scripts/rules/early-heartbeat.ts +2 -0
  461. package/scripts/rules/edit-tool.ts +27 -0
  462. package/scripts/rules/file-edit-rows.ts +17 -0
  463. package/scripts/rules/file-rewrite.ts +146 -0
  464. package/scripts/rules/firing-point.ts +3 -2
  465. package/scripts/rules/gh-api.ts +128 -7
  466. package/scripts/rules/gh-repo-selector.ts +84 -0
  467. package/scripts/rules/git-force.ts +2 -2
  468. package/scripts/rules/guard-remedy.ts +14 -5
  469. package/scripts/rules/implementation-cut.ts +61 -28
  470. package/scripts/rules/investigator-foreground.ts +231 -0
  471. package/scripts/rules/issue-citation.ts +15 -60
  472. package/scripts/rules/issue-comments.ts +9 -4
  473. package/scripts/rules/josh-git-bare.ts +1 -1
  474. package/scripts/rules/lane-background.ts +41 -13
  475. package/scripts/rules/lane-direct-tool.ts +107 -9
  476. package/scripts/rules/lane-interactive-ask.ts +4 -1
  477. package/scripts/rules/lane-park.ts +4 -2
  478. package/scripts/rules/lane-spilled-read.ts +90 -0
  479. package/scripts/rules/lane-split-park.ts +1 -1
  480. package/scripts/rules/lane-switch-main.ts +4 -4
  481. package/scripts/rules/last-prompt.ts +20 -47
  482. package/scripts/rules/oracle-consulted.ts +1 -1
  483. package/scripts/rules/permission-guards.ts +5 -1
  484. package/scripts/rules/piped-verification-shapes.ts +110 -0
  485. package/scripts/rules/piped-verification.ts +67 -17
  486. package/scripts/rules/poll-loop.ts +72 -9
  487. package/scripts/rules/pr-merge.ts +5 -5
  488. package/scripts/rules/pre-gate-cut.ts +3 -3
  489. package/scripts/rules/protected-files.ts +88 -24
  490. package/scripts/rules/reply-language.ts +3 -17
  491. package/scripts/rules/reply-prose.ts +34 -0
  492. package/scripts/rules/repo-admin.ts +132 -0
  493. package/scripts/rules/reviewer-foreground.ts +88 -0
  494. package/scripts/rules/round-one-check-related.ts +120 -0
  495. package/scripts/rules/rule-body-guard.ts +5 -15
  496. package/scripts/rules/rule-value-cache.ts +53 -5
  497. package/scripts/rules/rule-value-candidates.ts +84 -0
  498. package/scripts/rules/rule-value-cli.ts +59 -11
  499. package/scripts/rules/rule-value.ts +17 -4
  500. package/scripts/rules/run-tail-rule.ts +1 -1
  501. package/scripts/rules/sed-in-place.ts +196 -0
  502. package/scripts/rules/shell-segments.ts +10 -2
  503. package/scripts/rules/stop-rule-rows.ts +1 -13
  504. package/scripts/rules/stop-rules.ts +33 -58
  505. package/scripts/rules/test-declared-commit.ts +1 -1
  506. package/scripts/rules/third-party-write.ts +110 -23
  507. package/scripts/rules/timed-rerun.ts +1 -1
  508. package/scripts/rules/turn-filings.ts +90 -0
  509. package/scripts/rules/worktree-guard.ts +22 -7
  510. package/scripts/run/board/run-board-ending-reason.ts +6 -2
  511. package/scripts/run/board/run-board-fit.ts +24 -1
  512. package/scripts/run/board/run-board-found.ts +134 -0
  513. package/scripts/run/board/run-board-header.ts +8 -0
  514. package/scripts/run/board/run-board-labels.ts +11 -1
  515. package/scripts/run/board/run-board-lane-time.ts +1 -0
  516. package/scripts/run/board/run-board-link.ts +15 -2
  517. package/scripts/run/board/run-board-notes.ts +7 -1
  518. package/scripts/run/board/run-board-operation.ts +4 -2
  519. package/scripts/run/board/run-board-phase.ts +2 -5
  520. package/scripts/run/board/run-board-plan.ts +1 -1
  521. package/scripts/run/board/run-board-read.ts +46 -1
  522. package/scripts/run/board/run-board-reason.ts +20 -8
  523. package/scripts/run/board/run-board-render-checks.ts +3 -2
  524. package/scripts/run/board/run-board-render-drawn.ts +11 -0
  525. package/scripts/run/board/run-board-render-found.ts +157 -0
  526. package/scripts/run/board/run-board-render-lead.ts +9 -0
  527. package/scripts/run/board/run-board-render-legend.ts +19 -0
  528. package/scripts/run/board/run-board-render-tail.ts +1 -1
  529. package/scripts/run/board/run-board-render.ts +82 -18
  530. package/scripts/run/board/run-board-spin.ts +1 -3
  531. package/scripts/run/board/run-board-status.ts +2 -0
  532. package/scripts/run/board/run-board-tick.ts +39 -10
  533. package/scripts/run/carry/run-carry-ended.ts +3 -2
  534. package/scripts/run/carry/run-carry.ts +3 -2
  535. package/scripts/run/cut/run-cut-cli.ts +33 -133
  536. package/scripts/run/cut/run-cut-digest.ts +152 -0
  537. package/scripts/run/cut/run-cut-handoff.ts +52 -8
  538. package/scripts/run/cut/run-cut-report.ts +24 -3
  539. package/scripts/run/cut/run-cut-resume.ts +129 -0
  540. package/scripts/run/cut/run-cut-review.ts +105 -0
  541. package/scripts/run/cut/run-cut.ts +18 -7
  542. package/scripts/run/detached-launch.ts +1 -1
  543. package/scripts/run/entry/run-entry-cli.ts +88 -19
  544. package/scripts/run/entry/run-entry-spill.ts +83 -0
  545. package/scripts/run/entry/run-entry-stop.ts +5 -1
  546. package/scripts/run/entry/run-entry-trust.ts +91 -0
  547. package/scripts/run/event/run-event-baseline.ts +56 -0
  548. package/scripts/run/event/run-event-filed.ts +9 -3
  549. package/scripts/run/event/run-event-overrun.ts +197 -0
  550. package/scripts/run/event/run-event-render.ts +4 -0
  551. package/scripts/run/event/run-event-stream.ts +25 -3
  552. package/scripts/run/hold/run-stop-notify.ts +3 -8
  553. package/scripts/run/merge/run-merge-cap.ts +57 -0
  554. package/scripts/run/merge/run-merge-cli.ts +66 -23
  555. package/scripts/run/merge/run-merge-outcome.ts +2 -0
  556. package/scripts/run/merge/run-merge-ship.ts +13 -3
  557. package/scripts/run/merge/run-merge-signals.ts +40 -23
  558. package/scripts/run/merge/run-merge-steps.ts +56 -36
  559. package/scripts/run/merge/run-merge-usage-limit.ts +53 -0
  560. package/scripts/run/merge/run-merge-withdrawn.ts +53 -0
  561. package/scripts/run/merge/run-merge.ts +41 -14
  562. package/scripts/run/review/run-review-cli.ts +306 -20
  563. package/scripts/run/review/run-review-early-push.ts +121 -0
  564. package/scripts/run/review/run-review-join-read.ts +94 -0
  565. package/scripts/run/review/run-review-pinned-accepted.ts +126 -0
  566. package/scripts/run/review/run-review-pinned-join.ts +216 -0
  567. package/scripts/run/review/run-review-pinned-steps.ts +383 -0
  568. package/scripts/run/review/run-review-pinned-tree.ts +37 -0
  569. package/scripts/run/review/run-review-pinned.ts +53 -0
  570. package/scripts/run/review/run-review-steps.ts +70 -34
  571. package/scripts/run/review/run-review.ts +26 -6
  572. package/scripts/run/run-parent-cut-hook.ts +3 -4
  573. package/scripts/run/run-prep.ts +1 -0
  574. package/scripts/run/run-stage-read.ts +2 -6
  575. package/scripts/run/run-step-cli.ts +17 -5
  576. package/scripts/run/run-step-lane-plan.ts +27 -0
  577. package/scripts/run/run-step-section.ts +26 -7
  578. package/scripts/run/run-step.ts +5 -2
  579. package/scripts/run/ship/run-ship-args.ts +19 -0
  580. package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
  581. package/scripts/run/ship/run-ship-cli.ts +131 -39
  582. package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
  583. package/scripts/run/ship/run-ship-detach.ts +10 -4
  584. package/scripts/run/ship/run-ship-handover.ts +106 -0
  585. package/scripts/run/ship/run-ship-infra-retry.ts +16 -1
  586. package/scripts/run/ship/run-ship-lap.ts +63 -0
  587. package/scripts/run/ship/run-ship-next.ts +27 -26
  588. package/scripts/run/ship/run-ship-overlap.ts +8 -3
  589. package/scripts/run/ship/run-ship-place.ts +9 -2
  590. package/scripts/run/ship/run-ship-planned.ts +92 -0
  591. package/scripts/run/ship/run-ship-pre-detach-pinned.ts +197 -0
  592. package/scripts/run/ship/run-ship-pre-detach-timed.ts +7 -8
  593. package/scripts/run/ship/run-ship-pre-detach.ts +77 -23
  594. package/scripts/run/ship/run-ship-preflight.ts +16 -4
  595. package/scripts/run/ship/run-ship-probe.ts +23 -9
  596. package/scripts/run/ship/run-ship-relaunch-cap.ts +43 -7
  597. package/scripts/run/ship/run-ship-relaunch.ts +51 -0
  598. package/scripts/run/ship/run-ship-return.ts +103 -29
  599. package/scripts/run/ship/run-ship-review-reason.ts +24 -0
  600. package/scripts/run/ship/run-ship-review-steps.ts +230 -59
  601. package/scripts/run/ship/run-ship-review.ts +171 -51
  602. package/scripts/run/ship/run-ship-reviewer.ts +138 -42
  603. package/scripts/run/ship/run-ship-scoped.ts +39 -10
  604. package/scripts/run/ship/run-ship-stage.ts +49 -13
  605. package/scripts/run/ship/run-ship-steps.ts +24 -4
  606. package/scripts/run/ship/run-ship-stop-cause.ts +43 -2
  607. package/scripts/run/ship/run-ship-stop-context.ts +50 -13
  608. package/scripts/run/ship/run-ship-sync.ts +171 -30
  609. package/scripts/run/ship/run-ship-synced-scope.ts +178 -0
  610. package/scripts/run/ship/run-ship-wait-cli.ts +145 -0
  611. package/scripts/run/ship/run-ship-waiter.ts +114 -0
  612. package/scripts/run/ship/run-ship.ts +16 -2
  613. package/scripts/run/wake/run-wake-caffeinate.ts +48 -0
  614. package/scripts/run/wake/run-wake-cli.ts +6 -113
  615. package/scripts/run/wake/run-wake-code.ts +53 -11
  616. package/scripts/run/wake/run-wake-driver.ts +5 -3
  617. package/scripts/run/wake/run-wake-finish.ts +137 -0
  618. package/scripts/run/wake/run-wake-loop.ts +5 -3
  619. package/scripts/run/wake/run-wake-ports.ts +11 -3
  620. package/scripts/run/wake/run-wake-session.ts +2 -0
  621. package/scripts/run/wake/run-wake.ts +3 -2
  622. package/scripts/safe-chain/ci-installer-pin.ts +49 -8
  623. package/scripts/safe-chain/project-config.ts +3 -2
  624. package/scripts/security/secretlint-scan.ts +42 -9
  625. package/scripts/security/security-audit-provision-main.ts +9 -1
  626. package/scripts/security/security-audit-provision.ts +1 -1
  627. package/scripts/security/security-audit.ts +21 -1
  628. package/scripts/security/sonar-file.ts +10 -5
  629. package/scripts/split/split-assess.ts +12 -3
  630. package/scripts/split/split-early-notice.ts +116 -0
  631. package/scripts/split/split-measure.ts +20 -2
  632. package/scripts/split/split-resolution.ts +107 -0
  633. package/scripts/test/direct-importers.ts +185 -0
  634. package/scripts/test/pure-files-entries.ts +83 -0
  635. package/scripts/test/related-heavy-tests.ts +81 -0
  636. package/scripts/test/test-no-base.ts +88 -0
  637. package/scripts/test/test-pinned-cache-logic.ts +363 -0
  638. package/scripts/test/test-pinned-cache.ts +337 -0
  639. package/scripts/test/test-pinned-emit.ts +49 -0
  640. package/scripts/test/test-pinned-functions.ts +116 -0
  641. package/scripts/test/test-pinned-ledger.ts +80 -0
  642. package/scripts/test/test-pinned-logic.ts +208 -20
  643. package/scripts/test/test-pinned-main.ts +84 -18
  644. package/scripts/test/test-pinned-pool.ts +73 -0
  645. package/scripts/test/test-pinned-probe.ts +254 -0
  646. package/scripts/test/test-pinned-prune-logic.ts +118 -0
  647. package/scripts/test/test-pinned-reach.ts +194 -0
  648. package/scripts/test/test-pinned-record.ts +196 -0
  649. package/scripts/test/test-pinned-rewire.ts +148 -0
  650. package/scripts/test/test-pinned-spawn.ts +81 -0
  651. package/scripts/test/test-pinned-stage.ts +70 -0
  652. package/scripts/test/test-pinned.ts +258 -47
  653. package/scripts/test/test-reach-cli.ts +61 -0
  654. package/scripts/test/test-read-map.ts +35 -11
  655. package/scripts/test/test-read-recording.ts +17 -5
  656. package/scripts/test/test-read-trace.ts +26 -8
  657. package/scripts/test/test-red-logic.ts +46 -7
  658. package/scripts/test/test-red.ts +34 -14
  659. package/scripts/test/test-related-claim.ts +37 -0
  660. package/scripts/test/test-related-main.ts +4 -1
  661. package/scripts/test/test-related-moved.ts +91 -0
  662. package/scripts/test/test-related-record.ts +43 -23
  663. package/scripts/test/test-related-scope.ts +99 -34
  664. package/scripts/test/test-related-synced.ts +135 -0
  665. package/scripts/test/test-related-touched.ts +84 -0
  666. package/scripts/test/test-related.ts +167 -83
  667. package/scripts/test/test-unit-guard.ts +28 -5
  668. package/scripts/test/unit-durations.ts +41 -0
  669. package/scripts/test/unit-worker-share.ts +5 -4
  670. package/scripts/test/vitest-cache-directory.ts +19 -0
  671. package/scripts/test/vitest-cli-excludes.ts +14 -0
  672. package/scripts/test/vitest-failure-summary.ts +111 -0
  673. package/scripts/test/whole-suite-files.ts +12 -1
  674. package/scripts/time-runtime/time-batch-guard.ts +42 -4
  675. package/scripts/time-runtime/time-bundle-call.ts +1 -1
  676. package/scripts/time-runtime/time-bundles.ts +36 -5
  677. package/scripts/time-runtime/time-markers.ts +2 -2
  678. package/scripts/time-runtime/time-search-call.ts +38 -0
  679. package/scripts/time-runtime/time-shell.ts +1 -1
  680. package/scripts/time-runtime/time-transcript-line.ts +17 -5
  681. package/scripts/version/development-engines-verdict.ts +124 -0
  682. package/scripts/version/latest-corepack.ts +2 -0
  683. package/templates/gitignore +2 -0
  684. package/templates/workflows/ci.yml +41 -0
  685. package/dist/hooks/chunk-AZX4FGQ3.js +0 -207
  686. package/dist/hooks/chunk-PT5R6UJD.js +0 -7131
  687. package/dist/hooks/chunk-TUIFS5E7.js +0 -72
  688. package/dist/hooks/chunk-YCDOIR3I.js +0 -3456
  689. package/scripts/cost-runtime/context-cut-threshold.ts +0 -11
  690. package/scripts/rules/filing-cap.ts +0 -139
@@ -13,6 +13,8 @@ import {
13
13
  type TelegramTaskType,
14
14
  } from '#scripts/notify/telegram-notify'
15
15
  import { followup_checks_event } from './followup-checks-event'
16
+ import { followup_ci_path } from './followup-ci-path'
17
+ import { followup_coderabbit_retrigger, type Settled } from './followup-coderabbit-retrigger'
16
18
  import { followup_coderabbit_wait } from './followup-coderabbit-wait'
17
19
  import { git_followup_merged } from './git-followup-merged'
18
20
  import { git_followup_pending } from './git-followup-pending'
@@ -123,6 +125,13 @@ interface RunContext {
123
125
  context: TelegramContext
124
126
  }
125
127
 
128
+ type CompletionSend = () => Promise<void>
129
+
130
+ interface PreparedNotify {
131
+ is_recorded: boolean
132
+ send: CompletionSend
133
+ }
134
+
126
135
  // **The four reads in front of the check wait are issued together**. Not one
127
136
  // of them is a wait on anything: the `closes #N` check reads the pull request body, and the
128
137
  // notification needs the repository name, the issue title and the pull request URL — four requests
@@ -165,31 +174,33 @@ async function read_run_context(input: {
165
174
  // The pending count replaces the project version line: children no longer
166
175
  // bump, so the local `package.json` names the previous release rather than what this run ships.
167
176
  // A count that could not be read contributes no line at all, rather than a zero nobody measured.
168
- async function notify_completion(
177
+ //
178
+ // **The body is read here, the send is returned** (#5080): the send goes out beside the merge, but the
179
+ // pending count is read off `origin`'s default branch, and a fetch that landed after the merge would
180
+ // count this pull request under a line that says it is not counted.
181
+ async function completion_sender(
169
182
  context: TelegramContext,
170
183
  skip_notes: ReadonlyArray<string>,
171
184
  is_merge_pending: boolean,
172
- ): Promise<void> {
185
+ ): Promise<CompletionSend> {
173
186
  const pending_line = await git_followup_pending.pending_release_line({ is_merge_pending })
174
187
  const lines = pending_line === undefined ? skip_notes : [pending_line, ...skip_notes]
175
- const body = lines.join('\n')
188
+ const input = build_telegram_input({ task_type: 'completion', context, body: lines.join('\n') })
176
189
 
177
- // **The tolerant send**: this runs on the way to the merge, so a Telegram
178
- // gateway timeout must not leave a reviewed, green pull request unmerged. The failure is reported
179
- // under `❗` and the run carries on.
190
+ // **The tolerant send**: this runs beside the merge, so a Telegram gateway timeout must not leave a
191
+ // reviewed, green pull request unmerged. The failure is reported under `❗` and the run carries on.
180
192
  //
181
193
  // **No recovery line**, deliberately, in the same sense `git_followup_cleanup`'s epic-close step
182
194
  // has none: a completion notification is never re-sent by hand — `pnpm josh notify --task-type
183
195
  // completion` is prohibited because it populates no PR link — and re-running `followup` after the
184
196
  // merge is not a re-send either. Naming either would send the reader somewhere useless.
185
- await telegram_notify.send_or_report(
186
- build_telegram_input({
187
- task_type: 'completion',
188
- context,
189
- body,
190
- }),
191
- undefined,
192
- )
197
+ return async function send_completion(): Promise<void> {
198
+ await telegram_notify.send_or_report(input, undefined)
199
+ }
200
+ }
201
+
202
+ async function send_nothing(): Promise<void> {
203
+ // A completion already on record is not sent again.
193
204
  }
194
205
 
195
206
  // The two comment scans, marked separately from the check wait because they answer a different
@@ -248,14 +259,38 @@ function wait_for_green_of(
248
259
  return await run_checks({
249
260
  branch_name: input.branch_name,
250
261
  is_skip_watch: input.is_skip_watch,
251
- observe: followup_coderabbit_wait.both(
262
+ observe: followup_coderabbit_wait.all(
252
263
  followup_checks_event.observer_of(issue_number, context.pr_url),
253
264
  followup_coderabbit_wait.observer_of(log.coderabbit),
265
+ followup_ci_path.observer_of(log.ci_path),
254
266
  ),
255
267
  })
256
268
  }
257
269
  }
258
270
 
271
+ // **The `checks-wait` lap ends at the first green**, so the `ci-wait` row holds the checks alone; a
272
+ // rate-limited CodeRabbit retriggered after it is a lap of its own (joshuafolkken/kit#5289).
273
+ async function wait_for_review_green(
274
+ input: FollowupInput,
275
+ context: TelegramContext,
276
+ issue_number: string | undefined,
277
+ log: StageLog,
278
+ ): Promise<Settled<PrStateSnapshot>> {
279
+ const wait_for_green = wait_for_green_of(input, context, issue_number, log)
280
+ const checked = await wait_for_green()
281
+
282
+ lap(log, STAGE.checks_wait)
283
+ const settled = await followup_coderabbit_retrigger.settle(
284
+ checked,
285
+ wait_for_green,
286
+ input.branch_name,
287
+ log.coderabbit,
288
+ )
289
+ if (settled.is_retriggered) lap(log, STAGE.coderabbit_retrigger)
290
+
291
+ return settled
292
+ }
293
+
259
294
  async function run_review_checks(
260
295
  input: FollowupInput,
261
296
  context: TelegramContext,
@@ -264,13 +299,12 @@ async function run_review_checks(
264
299
  ): Promise<ReviewChecks> {
265
300
  if (input.is_merged === true) return { notes: [], managed: [] }
266
301
 
302
+ git_followup_stages.hold_issue(log, issue_number)
267
303
  const managed = await git_pr_managed_config.handle_managed_config_changes({
268
304
  should_merge: input.should_merge,
269
305
  })
270
- const snapshot = await wait_for_green_of(input, context, issue_number, log)()
271
-
272
- lap(log, STAGE.checks_wait)
273
- const check_notes = read_coderabbit_skip_notes(snapshot)
306
+ const { snapshot, notes } = await wait_for_review_green(input, context, issue_number, log)
307
+ const check_notes = [...notes, ...read_coderabbit_skip_notes(snapshot)]
274
308
 
275
309
  log_skip_notes(check_notes)
276
310
  const scan_notes = await run_comment_scans(input, context, log)
@@ -280,22 +314,23 @@ async function run_review_checks(
280
314
 
281
315
  // **A tail re-run after a merge does not report twice**: where the issue
282
316
  // already carries this pull request's completion report, the Telegram is skipped here and the comment
283
- // in the wrapup. Answers whether it was recorded, so the wrapup skips on the same read.
284
- async function notify_unless_recorded(
317
+ // in the wrapup. Answers whether it was recorded, so the wrapup skips on the same read, and the send
318
+ // the wrapup issues beside the merge.
319
+ async function prepare_notify(
285
320
  input: FollowupInput,
286
321
  issue_number: string | undefined,
287
322
  context: TelegramContext,
288
323
  checks: { notes: Array<string> },
289
- ): Promise<boolean> {
324
+ ): Promise<PreparedNotify> {
290
325
  const is_recorded = await git_followup_merged.is_completion_recorded({
291
326
  merged_at: input.is_merged === true ? input.merged_at : undefined,
292
327
  issue_number,
293
328
  pr_url: context.pr_url,
294
329
  })
295
330
 
296
- if (!is_recorded) await notify_completion(context, checks.notes, input.should_merge)
331
+ if (is_recorded) return { is_recorded, send: send_nothing }
297
332
 
298
- return is_recorded
333
+ return { is_recorded, send: await completion_sender(context, checks.notes, input.should_merge) }
299
334
  }
300
335
 
301
336
  // **Answers with the issue number the run actually used**, which is the one
@@ -308,9 +343,8 @@ async function run_stages(input: FollowupInput, log: StageLog): Promise<string |
308
343
 
309
344
  lap(log, STAGE.closes_and_context)
310
345
  const checks = await run_review_checks(input, context, log, issue_number)
311
- const is_completion_recorded = await notify_unless_recorded(input, issue_number, context, checks)
346
+ const notify = await prepare_notify(input, issue_number, context, checks)
312
347
 
313
- lap(log, STAGE.telegram)
314
348
  await git_pr_followup_wrapup.run_wrapup(
315
349
  {
316
350
  branch_name: input.branch_name,
@@ -321,7 +355,8 @@ async function run_stages(input: FollowupInput, log: StageLog): Promise<string |
321
355
  should_merge: input.should_merge,
322
356
  managed_notes: checks.managed,
323
357
  is_merged: input.is_merged,
324
- is_completion_recorded,
358
+ is_completion_recorded: notify.is_recorded,
359
+ send_completion: notify.send,
325
360
  checked: checks.snapshot,
326
361
  wait_for_green: wait_for_green_of(input, context, issue_number, log),
327
362
  },
@@ -1,3 +1,4 @@
1
+ import { shell_quote } from '#scripts/lib/shell-quote'
1
2
  import type { Scenario } from './fresh-machine-spec'
2
3
 
3
4
  // The script one container runs. Every command is printed before it runs and its exit status after,
@@ -8,28 +9,23 @@ const SEED_MOUNT = '/seed'
8
9
  const PACK_MOUNT = '/pack'
9
10
  const COPY_SEED = `cp -R ${SEED_MOUNT}/. .`
10
11
  const PROBES_HEADING = '# probes — recorded, never failing the run'
11
- const ESCAPED_QUOTE = String.raw`'\''`
12
12
  const PREAMBLE = [
13
13
  String.raw`step() { printf '\n$ %s\n' "$1"; eval "$1"; local code=$?; printf '[exit %s]\n' "$code"; return "$code"; }`,
14
14
  'mkdir -p "$HOME/$RUN_NAME" && cd "$HOME/$RUN_NAME" || exit 1',
15
15
  ]
16
16
 
17
- function quote(command: string): string {
18
- const escaped = command.split("'").join(ESCAPED_QUOTE)
19
-
20
- return `'${escaped}'`
21
- }
17
+ const { single_quoted } = shell_quote
22
18
 
23
19
  function required(command: string): string {
24
- return `step ${quote(command)} || exit $?`
20
+ return `step ${single_quoted(command)} || exit $?`
25
21
  }
26
22
 
27
23
  function probe_lines(probes: ReadonlyArray<string>): Array<string> {
28
24
  if (probes.length === 0) return []
29
25
 
30
26
  return [
31
- String.raw`printf '\n%s\n' ${quote(PROBES_HEADING)}`,
32
- ...probes.map((probe) => `step ${quote(probe)}`),
27
+ String.raw`printf '\n%s\n' ${single_quoted(PROBES_HEADING)}`,
28
+ ...probes.map((probe) => `step ${single_quoted(probe)}`),
33
29
  ]
34
30
  }
35
31
 
@@ -27,8 +27,8 @@
27
27
  "tail -n 40 \"$(sed -n 's/^backlogrun: started.*; log //p' \"$HOME/backlogrun.out\")\" | cut -c1-400",
28
28
  "grep -c 'requires approval' \"$(sed -n 's/^backlogrun: started.*; log //p' \"$HOME/backlogrun.out\")\"",
29
29
  "grep -c 'run:carry --begin' \"$(sed -n 's/^backlogrun: started.*; log //p' \"$HOME/backlogrun.out\")\"",
30
- "tail -n 40 /tmp/josh-lane-dispatch-*.log | cut -c1-400",
31
- "cat /tmp/josh-lane-dispatch-*.log | grep -c 'requires approval'",
30
+ "tail -n 40 \"$(git rev-parse --path-format=absolute --git-common-dir)\"/josh/run-state/josh-lane-dispatch-*.log | cut -c1-400",
31
+ "cat \"$(git rev-parse --path-format=absolute --git-common-dir)\"/josh/run-state/josh-lane-dispatch-*.log | grep -c 'requires approval'",
32
32
  "gh pr list --state all"
33
33
  ]
34
34
  }
@@ -24,8 +24,8 @@
24
24
  "probes": [
25
25
  "tail -n 40 \"$(sed -n 's/^backlogrun: started.*; log //p' \"$HOME/backlogrun.out\")\" | cut -c1-400",
26
26
  "grep -c 'requires approval' \"$(sed -n 's/^backlogrun: started.*; log //p' \"$HOME/backlogrun.out\")\"",
27
- "tail -n 40 /tmp/josh-lane-dispatch-*.log | cut -c1-400",
28
- "cat /tmp/josh-lane-dispatch-*.log | grep -c 'requires approval'",
27
+ "tail -n 40 \"$(git rev-parse --path-format=absolute --git-common-dir)\"/josh/run-state/josh-lane-dispatch-*.log | cut -c1-400",
28
+ "cat \"$(git rev-parse --path-format=absolute --git-common-dir)\"/josh/run-state/josh-lane-dispatch-*.log | grep -c 'requires approval'",
29
29
  "gh pr list --state all"
30
30
  ]
31
31
  }
@@ -52,7 +52,39 @@ function averaged(
52
52
  return { ...reading, busy_cores: ledger_cores + total / samples.length }
53
53
  }
54
54
 
55
- const busy_average = { AVERAGE_WINDOW_MS, averaged, with_reading }
55
+ // **A wait that does not ease the load gains nothing by going on** (joshuafolkken/kit#4982). On a
56
+ // saturated machine the load never falls, and a claim that waits out the cap only starts at minimum
57
+ // width two minutes late. A wait keeps the lowest mean busy count it has read and when it last fell; a
58
+ // fall under a whole core is noise, not easing.
59
+ const EASE_CORES = 1
56
60
 
57
- export type { BusySample }
61
+ interface LoadEase {
62
+ level: number
63
+ eased_at: number
64
+ }
65
+
66
+ // `ease` once the mean `busy_cores` read at `now` is added. An unread machine changes nothing, so a wait
67
+ // that cannot read the load is never judged unrelieved.
68
+ function with_ease(
69
+ ease: LoadEase | undefined,
70
+ busy_cores: number | undefined,
71
+ now: number,
72
+ ): LoadEase | undefined {
73
+ if (busy_cores === undefined) return ease
74
+
75
+ if (ease === undefined || busy_cores <= ease.level - EASE_CORES) {
76
+ return { level: busy_cores, eased_at: now }
77
+ }
78
+
79
+ return ease
80
+ }
81
+
82
+ // Whether the load has not eased for `window_ms` of the wait.
83
+ function is_unrelieved(ease: LoadEase | undefined, now: number, window_ms: number): boolean {
84
+ return ease !== undefined && now - ease.eased_at >= window_ms
85
+ }
86
+
87
+ const busy_average = { AVERAGE_WINDOW_MS, averaged, is_unrelieved, with_ease, with_reading }
88
+
89
+ export type { BusySample, LoadEase }
58
90
  export { busy_average }
@@ -0,0 +1,43 @@
1
+ import { PROJECT_ROOT } from '#scripts/init/init-paths'
2
+ import { run_review_pinned_accepted } from '#scripts/run/review/run-review-pinned-accepted'
3
+ import { run_review_pinned_join } from '#scripts/run/review/run-review-pinned-join'
4
+ import { test_pinned_logic } from '#scripts/test/test-pinned-logic'
5
+ import type { PinnedSummary } from '#scripts/test/test-pinned-record'
6
+
7
+ // **`check:related` prints the `josh test:pinned` verdict it finds already reached on this tree**
8
+ // (joshuafolkken/kit#4971): read only by the ship's pre-detach, it stopped the first `josh ship` on
9
+ // unpinned places, and the ship ran its preflight and pre-detach again once the reason was added.
10
+ // **A check this run started is waited on** (joshuafolkken/kit#4987): one still probing when the four
11
+ // checks ended printed nothing, and the ship stopped on it again. One it did not start is read as it
12
+ // stands, and one on another tree prints nothing here.
13
+
14
+ const SHIP_HINT =
15
+ 'Pin each unpinned place above with a test that turns red without it, or give the first ship its reason: `pnpm josh ship "<title> #<N>" --review … --unpinned-ok "<reason>"`.'
16
+ // The wait's bound keeps the four checks plus it under a foreground Bash call's 600-second cap, so the
17
+ // verdict line is never cut off; a check past it is left running for the ship's pre-detach.
18
+ const WAIT_MS = 240_000
19
+
20
+ async function reached(root: string, is_started: boolean): Promise<PinnedSummary | undefined> {
21
+ if (is_started) return await run_review_pinned_join.settled_on_tree(root, WAIT_MS)
22
+
23
+ return await run_review_pinned_join.finished_on_tree(root)
24
+ }
25
+
26
+ // The unpinned places the ship's pre-detach would stop on, with the `--unpinned-ok` form;
27
+ // `undefined` when no answer is reached on this tree or it stops nothing.
28
+ async function notice(
29
+ root: string = PROJECT_ROOT,
30
+ is_started = false,
31
+ ): Promise<string | undefined> {
32
+ const summary = await reached(root, is_started)
33
+ if (summary === undefined) return undefined
34
+ const verdict = await run_review_pinned_accepted.judge(summary, undefined)
35
+
36
+ if (verdict.kind !== 'stop') return undefined
37
+
38
+ return test_pinned_logic.report_text(summary, `${SHIP_HINT}\n`).trimEnd()
39
+ }
40
+
41
+ const check_related_pinned = { SHIP_HINT, WAIT_MS, notice }
42
+
43
+ export { check_related_pinned }
@@ -0,0 +1,64 @@
1
+ import type { CheckResult } from './check-related'
2
+ import { check_reuse, type CheckRecords } from './check-reuse'
3
+ import { gate_labels } from './gate-labels'
4
+ import type { GateStepResult } from './gate-report'
5
+ import { gate_tree, type GateTree } from './gate-tree'
6
+ import { scoped_green } from './scoped-green'
7
+
8
+ // **`check:related` runs only the checks whose green record no longer holds** (joshuafolkken/kit#5156):
9
+ // a re-run after fixing one failure ran the three that had passed over again, minutes of a hub-file
10
+ // `test:related` among them. No record is new here. `lint:related` and `test:related` write their own
11
+ // scoped records (`scoped-green.ts`); the type check and cspell read and write the gate's per-check
12
+ // records under the gate's labels (`check-reuse.ts`), so a green from either end serves the other. A
13
+ // failed check writes no record, so it runs again.
14
+
15
+ const GATE_LABELS: ReadonlyMap<string, string> = new Map([
16
+ [gate_labels.TYPE_CHECK_TARGET, gate_labels.TYPE_CHECK_LABEL],
17
+ [gate_labels.SPELL_CHECK_TARGET, gate_labels.SPELL_CHECK_LABEL],
18
+ ])
19
+
20
+ const UNREAD_TREE: GateTree = { files: {}, base: undefined }
21
+
22
+ function gate_label(command: string): string {
23
+ return GATE_LABELS.get(command) ?? ''
24
+ }
25
+
26
+ // The commands of `commands` whose green record still describes `tree`.
27
+ async function reusable(
28
+ commands: ReadonlyArray<string>,
29
+ tree: GateTree,
30
+ records: CheckRecords = check_reuse.DEFAULT_RECORDS,
31
+ ): Promise<ReadonlySet<string>> {
32
+ const scoped = new Set(scoped_green.green_scripts(tree.files, tree.base))
33
+ const gate = await check_reuse.reusable_checks([...GATE_LABELS.values()], tree, records)
34
+
35
+ return new Set(commands.filter((command) => scoped.has(command) || gate.has(gate_label(command))))
36
+ }
37
+
38
+ function gate_results(results: ReadonlyArray<CheckResult>): Array<GateStepResult> {
39
+ return results
40
+ .filter((result) => GATE_LABELS.has(result.command))
41
+ .map((result) => ({ ...result, label: gate_label(result.command), elapsed_ms: 0 }))
42
+ }
43
+
44
+ // Records the green type check and cspell against `tree`, the tree read before they started.
45
+ async function record(
46
+ results: ReadonlyArray<CheckResult>,
47
+ tree: GateTree,
48
+ records: CheckRecords = check_reuse.DEFAULT_RECORDS,
49
+ ): Promise<void> {
50
+ await check_reuse.record_green_checks(gate_results(results), tree, records)
51
+ }
52
+
53
+ // A tree git could not read is one with no answer, so nothing is reused and every check runs.
54
+ async function read_tree(): Promise<GateTree> {
55
+ try {
56
+ return await gate_tree.read_gate_tree()
57
+ } catch {
58
+ return UNREAD_TREE
59
+ }
60
+ }
61
+
62
+ const check_related_reuse = { UNREAD_TREE, read_tree, record, reusable }
63
+
64
+ export { check_related_reuse }
@@ -0,0 +1,57 @@
1
+ // **Each check prints only its last lines; its whole output is in the log** (joshuafolkken/kit#5204).
2
+ // A `test:related` over hundreds of files printed past 140 KB, past the tool result's size limit, and
3
+ // the run typed the same `check:related` again behind a `grep` only to read the verdict. The end of a
4
+ // section is where a check's own verdict and its failures land, so a passed check keeps its last 5
5
+ // lines and a failed one its last 40; `--full` prints the whole output as before.
6
+
7
+ const PASSED_TAIL_LINES = 5
8
+ const FAILED_TAIL_LINES = 40
9
+ const FULL_FLAG = '--full'
10
+
11
+ interface CheckResult {
12
+ command: string
13
+ exit_code: number
14
+ output: string
15
+ }
16
+
17
+ function result_status(result: CheckResult): string {
18
+ return result.exit_code === 0 ? 'passed' : `failed (${String(result.exit_code)})`
19
+ }
20
+
21
+ function tail_lines(result: CheckResult): ReadonlyArray<string> {
22
+ const lines = result.output.trimEnd().split('\n')
23
+ const count = result.exit_code === 0 ? PASSED_TAIL_LINES : FAILED_TAIL_LINES
24
+ const dropped = lines.length - count
25
+
26
+ if (dropped <= 0) return lines
27
+
28
+ return [`… ${String(dropped)} earlier line(s) in the log`, ...lines.slice(-count)]
29
+ }
30
+
31
+ function section_body(result: CheckResult, is_full: boolean): string {
32
+ if (is_full) return result.output.endsWith('\n') ? result.output : `${result.output}\n`
33
+
34
+ return `${tail_lines(result).join('\n')}\n`
35
+ }
36
+
37
+ function format_section(result: CheckResult, is_full = false): string {
38
+ const header = `\n=== ${result.command}: ${result_status(result)} ===\n`
39
+
40
+ if (result.output.length === 0) return header
41
+
42
+ return `${header}${section_body(result, is_full)}`
43
+ }
44
+
45
+ function is_full_requested(arguments_: ReadonlyArray<string>): boolean {
46
+ return arguments_.includes(FULL_FLAG)
47
+ }
48
+
49
+ const check_related_section = {
50
+ FAILED_TAIL_LINES,
51
+ format_section,
52
+ is_full_requested,
53
+ result_status,
54
+ }
55
+
56
+ export type { CheckResult }
57
+ export { check_related_section }
@@ -0,0 +1,34 @@
1
+ import { lane_ledger_write } from '#scripts/lane/lane-ledger-write'
2
+ import { error_text } from '#scripts/lib/error-message'
3
+ import { run_ship_planned, type Unplanned } from '#scripts/run/ship/run-ship-planned'
4
+
5
+ // **`check:related` prints the ship's `unplanned` answer ahead of the ship** (joshuafolkken/kit#5203):
6
+ // asked only by the ship's preflight, a lane learned of a code file its `lane:plan` record never listed
7
+ // after the review and its fixes, and spent the re-plan and a second ship on it. The judgment is the
8
+ // preflight's own (`run-ship-planned.ts`); this run never stops on it — the preflight still does. Each
9
+ // notice printed is recorded, so `lane:stats` tells a preflight `unplanned` stop that came after one apart.
10
+
11
+ // A git read that fails here prints nothing rather than the run's verdict lost — the preflight still
12
+ // asks it, and reports an unreadable read as its own precondition.
13
+ async function read_unplanned(): Promise<Unplanned | undefined> {
14
+ try {
15
+ return await run_ship_planned.unplanned()
16
+ } catch (error) {
17
+ error_text.trace_swallowed('check_related_unplanned.notice', error)
18
+
19
+ return undefined
20
+ }
21
+ }
22
+
23
+ async function notice(): Promise<string | undefined> {
24
+ const found = await read_unplanned()
25
+
26
+ if (found === undefined) return undefined
27
+ await lane_ledger_write.record_unplanned_notice({ issue: found.issue, files: [...found.files] })
28
+
29
+ return found.text
30
+ }
31
+
32
+ const check_related_unplanned = { notice }
33
+
34
+ export { check_related_unplanned }