@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
@@ -1,7 +1,10 @@
1
1
  import { gate_skip } from '#scripts/gate/gate-skip'
2
- import { gate_tree } from '#scripts/gate/gate-tree'
2
+ import { gate_tree, type GateTree } from '#scripts/gate/gate-tree'
3
+ import { metrics_totals } from '#scripts/gate/metrics-totals'
3
4
  import { scoped_green } from '#scripts/gate/scoped-green'
4
5
  import { josh_command, type JoshResult } from '#scripts/josh/josh-run'
6
+ import { run_ship_lap } from './run-ship-lap'
7
+ import { run_ship_synced_scope } from './run-ship-synced-scope'
5
8
 
6
9
  // The scoped pair `josh ship` meets itself rather than stops on, shared by every stage that needs a
7
10
  // green record for this tree: the preflight stage at the start, the review rounds, and the gate
@@ -25,13 +28,30 @@ async function run_phases(phases: ReadonlyArray<Phase>): Promise<JoshResult> {
25
28
  return last
26
29
  }
27
30
 
31
+ // The tree after the branch's metrics approval is re-recorded (`metrics-totals.ts`): every review fix
32
+ // and the gate stage meet the pair here, so a rewrite lands before any record is written for the tree.
33
+ async function rerecorded_tree(): Promise<GateTree> {
34
+ const tree = await gate_tree.read_gate_tree()
35
+ const is_rerecorded = await metrics_totals.rerecord(process.cwd(), tree.files)
36
+
37
+ return is_rerecorded ? await gate_tree.read_gate_tree() : tree
38
+ }
39
+
28
40
  // Only the checks with no green record for this tree run — the same question `review:brief` and the
29
41
  // local gate refuse on — so a fresh record costs nothing and a stale or absent one costs a scoped run
30
42
  // instead of a stop and a relaunched session. A check that genuinely fails still stops the ship, its
31
- // output forwarded to the ship log.
32
- async function scoped_pair(): Promise<JoshResult> {
33
- const tree = await gate_tree.read_gate_tree()
43
+ // output forwarded to the ship log. A pair stale only because a merge with the default branch moved the
44
+ // base runs nothing when the merge shares nothing with the branch (`run-ship-synced-scope.ts`).
45
+ async function settled_pair(): Promise<JoshResult> {
46
+ const tree = await rerecorded_tree()
34
47
  const scripts = scoped_green.missing_scripts(tree.files, tree.base)
48
+ const settled = await run_ship_synced_scope.settle(tree, scripts)
49
+
50
+ if (settled !== undefined) {
51
+ process.stdout.write(`${settled}\n`)
52
+
53
+ return { code: SUCCESS_EXIT_CODE, out: settled }
54
+ }
35
55
 
36
56
  return await run_phases(
37
57
  scripts.map(
@@ -40,13 +60,22 @@ async function scoped_pair(): Promise<JoshResult> {
40
60
  )
41
61
  }
42
62
 
43
- // The scoped pair and then `josh gate` — the gate stage, and the followup's gate over a merged tree
44
- // before its push, so both leave the record the pre-push hook reuses.
45
- async function scoped_gate(): Promise<JoshResult> {
46
- return await run_phases([
47
- scoped_pair,
63
+ // Timed as one lap in whichever ship stage asked for it (`run-ship-lap.ts`).
64
+ async function scoped_pair(): Promise<JoshResult> {
65
+ return await run_ship_lap.timed(run_ship_lap.STEP.SCOPED_PAIR, settled_pair)
66
+ }
67
+
68
+ async function gate(): Promise<JoshResult> {
69
+ return await run_ship_lap.timed(
70
+ run_ship_lap.STEP.GATE,
48
71
  async () => await josh_command.josh_run(['gate'], should_forward_stderr),
49
- ])
72
+ )
73
+ }
74
+
75
+ // The scoped pair and then `josh gate` — the gate stage, and the commit stage's and the followup's gate
76
+ // over a merged tree before their push, so each leaves the record the pre-push hook reuses.
77
+ async function scoped_gate(): Promise<JoshResult> {
78
+ return await run_phases([scoped_pair, gate])
50
79
  }
51
80
 
52
81
  // Whether `josh gate` would only reuse this tree's green record: the gate's own reuse test rather than
@@ -14,7 +14,7 @@ import { z } from 'zod'
14
14
  // the state, and a stale one is overruled by it. Neither can produce a second commit, push or merge.
15
15
  //
16
16
  // **The gate is never skipped on the record's word.** It is passed over only once its output — a
17
- // commit — exists; otherwise it runs, and `josh gate`'s own tree-keyed green record is what makes a
17
+ // pushed commit — exists; otherwise it runs, and `josh gate`'s own tree-keyed green record is what makes a
18
18
  // re-run on an unchanged tree a reuse rather than a second execution. No quality gate is folded away.
19
19
 
20
20
  const STAGE = {
@@ -47,6 +47,8 @@ interface ShipState {
47
47
  // The issue changed after the recorded review's brief (`issue-watch-gate.ts`), so the review re-runs
48
48
  // even on a committed tree (joshuafolkken/kit#4221).
49
49
  is_review_stale?: boolean
50
+ // The tree holds uncommitted work, which the sync stage commits locally before it merges.
51
+ is_dirty?: boolean
50
52
  }
51
53
 
52
54
  const RECORD_PREFIX = 'josh-ship-stages-'
@@ -57,6 +59,9 @@ const WORD_SEPARATOR = ' '
57
59
  const STARTED_SEPARATOR = ','
58
60
  const STARTED_INDEX = 3
59
61
  const WORD_COUNT = STARTED_INDEX + 1
62
+ // The reason a stage ran or was skipped follows the words, behind a separator no word holds, so the
63
+ // word readers below read the line as before.
64
+ const REASON_SEPARATOR = ' | '
60
65
 
61
66
  // `started` lists the stages the current attempt started, kept across a supervisor that ended without a
62
67
  // stop so its successor's lines still carry them. `is_merge_waiting` is set only while `josh followup`
@@ -164,19 +169,23 @@ function is_shipped(state: ShipState): boolean {
164
169
  return state.is_committed && state.is_pushed
165
170
  }
166
171
 
172
+ // A lane child's `run:review` commits and pushes before the ship runs (joshuafolkken/kit#4907), so a
173
+ // commit or a push is a stage's output only beside the ship's own record of that stage.
167
174
  const DONE_BY: Record<Stage, (done: ReadonlySet<string>, state: ShipState) => boolean> = {
168
175
  // The preflight asks what the commit stage would refuse on, so a commit is
169
- // its output as it is the gate's; a resumed commit stage still asks `git -y`'s own preflight.
170
- [STAGE.PREFLIGHT]: (_done, state) => state.is_merged || state.is_committed,
171
- // The `--review` round precedes the commit, so a commit is its output as it
172
- // is the gate's. A record alone is not honored: before a commit the tree may have been edited since
173
- // the recorded round, and only a commit pins the tree that round read — unless the issue changed since.
174
- [STAGE.REVIEW]: (_done, state) =>
175
- state.is_merged || (state.is_committed && state.is_review_stale !== true),
176
- [STAGE.GATE]: (_done, state) => state.is_merged || state.is_committed,
177
- // The merge of the default branch before the commit: once committed, a
178
- // conflicting pull request is the followup's to merge again.
179
- [STAGE.SYNC]: (_done, state) => state.is_merged || state.is_committed,
176
+ // its output; a resumed commit stage still asks `git -y`'s own preflight.
177
+ [STAGE.PREFLIGHT]: (done, state) =>
178
+ state.is_merged || (done.has(STAGE.PREFLIGHT) && state.is_committed),
179
+ // The sync stage commits locally before the review round and the gate, without pushing
180
+ // (`run-ship-sync.ts`), so a commit is neither's output: a pushed one on a clean tree is, as only the
181
+ // commit stage after the gate pushes — unless the issue changed since.
182
+ [STAGE.REVIEW]: (done, state) =>
183
+ state.is_merged ||
184
+ (done.has(STAGE.REVIEW) && is_shipped(state) && state.is_review_stale !== true),
185
+ [STAGE.GATE]: (done, state) => state.is_merged || (done.has(STAGE.GATE) && is_shipped(state)),
186
+ // The merge of the default branch before the gate: once pushed, a default branch that
187
+ // moved is the followup's to merge again.
188
+ [STAGE.SYNC]: (done, state) => state.is_merged || (done.has(STAGE.SYNC) && is_shipped(state)),
180
189
  [STAGE.COMMIT]: (done, state) => state.is_merged || (done.has(STAGE.COMMIT) && is_shipped(state)),
181
190
  // The round-2 pass reads the pushed fix delta, so its record is honored only
182
191
  // while that push still stands — new work pushed on top reruns it.
@@ -231,9 +240,32 @@ function event_text(
231
240
  return full.join(WORD_SEPARATOR)
232
241
  }
233
242
 
243
+ // A line `event_text` wrote, with why its stage ran or was skipped after it (joshuafolkken/kit#5296).
244
+ function with_reason(text: string, reason: string | undefined): string {
245
+ return reason === undefined ? text : `${text}${REASON_SEPARATOR}${reason}`
246
+ }
247
+
248
+ function words_part(text: string): string {
249
+ return text.split(REASON_SEPARATOR, 1)[0] ?? ''
250
+ }
251
+
234
252
  // The stages a line says its attempt has started, `undefined` for a three-word line.
235
253
  function started_of(text: string): ReadonlyArray<string> | undefined {
236
- return text.split(WORD_SEPARATOR, WORD_COUNT)[STARTED_INDEX]?.split(STARTED_SEPARATOR)
254
+ return words_part(text).split(WORD_SEPARATOR, WORD_COUNT)[STARTED_INDEX]?.split(STARTED_SEPARATOR)
255
+ }
256
+
257
+ // The stage word and the phase word of a line `event_text` wrote, `''` where the line has none.
258
+ function words_of(text: string): { stage: string; phase: string } {
259
+ const [, stage = '', phase = ''] = words_part(text).split(WORD_SEPARATOR, WORD_COUNT)
260
+
261
+ return { stage, phase }
262
+ }
263
+
264
+ // Why the stage ran or was skipped, `undefined` for a line that carries no reason.
265
+ function reason_of(text: string): string | undefined {
266
+ const at = text.indexOf(REASON_SEPARATOR)
267
+
268
+ return at === -1 ? undefined : text.slice(at + REASON_SEPARATOR.length)
237
269
  }
238
270
 
239
271
  // A stop on a merge git could not finish is named `conflict` rather than by the stage it happened in,
@@ -254,6 +286,7 @@ const run_ship_stage = {
254
286
  end_attempt,
255
287
  event_text,
256
288
  is_done,
289
+ is_shipped,
257
290
  mark_done,
258
291
  mark_merge_waiting,
259
292
  mark_place_waiting,
@@ -262,8 +295,11 @@ const run_ship_stage = {
262
295
  read_merge_waiting,
263
296
  read_place_waiting,
264
297
  read_started,
298
+ reason_of,
265
299
  record_path,
266
300
  started_of,
301
+ with_reason,
302
+ words_of,
267
303
  stop_reason,
268
304
  }
269
305
 
@@ -1,6 +1,7 @@
1
1
  import { josh_command, type JoshResult } from '#scripts/josh/josh-run'
2
2
  import { run_ship } from './run-ship'
3
3
  import { run_ship_body_draft } from './run-ship-body-draft'
4
+ import { run_ship_lap } from './run-ship-lap'
4
5
  import { run_ship_preflight } from './run-ship-preflight'
5
6
  import { run_ship_probe } from './run-ship-probe'
6
7
  import { run_ship_review_steps } from './run-ship-review-steps'
@@ -23,6 +24,8 @@ interface ShipArguments {
23
24
  cites: ReadonlyArray<string>
24
25
  is_review: boolean
25
26
  is_detach: boolean
27
+ // `--unpinned-ok "<reason>"` as given, forwarded to round 1's `run:review` alone; empty when absent.
28
+ unpinned_ok: ReadonlyArray<string>
26
29
  }
27
30
 
28
31
  interface Step {
@@ -65,7 +68,21 @@ async function gate_stage(): Promise<StepResult> {
65
68
  const SYNC_STEP: Step = {
66
69
  stage: STAGE.SYNC,
67
70
  header: run_ship.SYNC_HEADER,
68
- run: async (args) => await run_ship_sync.sync_stage(args.number),
71
+ run: async (args, state) =>
72
+ await run_ship_sync.sync_stage(args.number, args.title, state.is_dirty === true),
73
+ }
74
+
75
+ // A default branch that moved since the sync stage is merged and gated again before the push
76
+ // (`run_ship_sync.catch_up`, joshuafolkken/kit#4825). A resumed ship with nothing left to push leaves
77
+ // that to the followup, which pushes what it merges; a pushed branch with new work still catches up.
78
+ async function commit_stage(args: ShipArguments, state: ShipState): Promise<StepResult> {
79
+ const stop = run_ship_stage.is_shipped(state) ? undefined : await run_ship_sync.catch_up()
80
+
81
+ if (stop !== undefined) return stop
82
+
83
+ const argv = ['git', '-y', ...run_ship_stage.commit_flags(state), ...args.body, args.title]
84
+
85
+ return await run_ship_lap.timed(run_ship_lap.STEP.COMMIT, async () => await josh(argv))
69
86
  }
70
87
 
71
88
  // The gate before the commit, the commit/push/PR before the merge. The gate meets the scoped pair
@@ -81,8 +98,7 @@ const COMMIT_STEPS: ReadonlyArray<Step> = [
81
98
  {
82
99
  stage: STAGE.COMMIT,
83
100
  header: run_ship.COMMIT_HEADER,
84
- run: async (args, state) =>
85
- await josh(['git', '-y', ...run_ship_stage.commit_flags(state), ...args.body, args.title]),
101
+ run: async (args, state) => await commit_stage(args, state),
86
102
  },
87
103
  ]
88
104
 
@@ -133,7 +149,11 @@ const REVIEW_STEP: Step = {
133
149
  stage: STAGE.REVIEW,
134
150
  header: run_ship.REVIEW_HEADER,
135
151
  run: async (args, state) =>
136
- await run_ship_review_steps.review_stage(args.number, state.is_review_stale === true),
152
+ await run_ship_review_steps.review_stage(
153
+ args.number,
154
+ state.is_review_stale === true,
155
+ args.unpinned_ok,
156
+ ),
137
157
  }
138
158
  const ROUND_TWO_STEP: Step = {
139
159
  stage: STAGE.ROUND_TWO,
@@ -1,6 +1,9 @@
1
1
  import { api_auth } from '#scripts/agent/api-auth'
2
+ import { UNREADABLE_COMMENTS_STOP } from '#scripts/gh/git-gh-comments-unreadable'
3
+ import { gh_retry } from '#scripts/gh/git-gh-retry'
2
4
  import { NO_CHECKS_MESSAGE } from '#scripts/gh/git-pr-checks-watch'
3
- import type { StopRecord } from '#scripts/lane/lane-ledger'
5
+ import { git_error } from '#scripts/git/git-error'
6
+ import type { StopRecord } from '#scripts/lane/lane-ledger-schema'
4
7
  import { run_ship_review, type StopFinding } from './run-ship-review'
5
8
  import { run_ship_stage, type Stage } from './run-ship-stage'
6
9
 
@@ -39,6 +42,7 @@ const INFRA_STAGES: ReadonlySet<Stage> = new Set([
39
42
  const INFRA_PATTERNS: ReadonlyArray<RegExp> = [
40
43
  /rate limit/iu,
41
44
  new RegExp(NO_CHECKS_MESSAGE, 'u'),
45
+ new RegExp(UNREADABLE_COMMENTS_STOP, 'u'),
42
46
  /\b(?:ECONNRESET|ECONNREFUSED|ETIMEDOUT|EAI_AGAIN|ENOTFOUND)\b/u,
43
47
  /socket hang up/iu,
44
48
  /could not resolve host/iu,
@@ -84,6 +88,43 @@ function infra_text({ body, out = body }: StoppedOutput): string {
84
88
  return out
85
89
  }
86
90
 
91
+ const FAILURE_LINE = new RegExp(`^${git_error.FAILURE_PREFIX} `, 'gmu')
92
+ const REPORTED_LINE = new RegExp(
93
+ `^(?:${git_error.FAILURE_PREFIX}|${git_error.DETAILS_PREFIX}) (?<message>.*)$`,
94
+ 'gmu',
95
+ )
96
+
97
+ // The failure the stage ended on — the last `❌ Error:` line — and the cause logged under it: a caller
98
+ // that wraps a spent request (a merge whose read-back failed too, a timed-out exec) ends on its own
99
+ // message, with the request's beneath.
100
+ function final_failures(body: string): ReadonlyArray<string> {
101
+ const last = [...body.matchAll(FAILURE_LINE)].at(-1)
102
+ if (last === undefined) return []
103
+
104
+ return [...body.slice(last.index).matchAll(REPORTED_LINE)].map(
105
+ ({ groups }) => groups?.['message'] ?? '',
106
+ )
107
+ }
108
+
109
+ // A gh request transient to its last attempt notes so on stderr — gh's own transient verdict, never a
110
+ // second list of its errors (joshuafolkken/kit#5052). A caller may catch it and stop later on a red
111
+ // check, so the note counts only when it names the failure the stage ended on, or that failure's cause.
112
+ function is_spent_stop(body: string): boolean {
113
+ return final_failures(body).some((message) => body.includes(gh_retry.spent_note(message)))
114
+ }
115
+
116
+ function is_infra_stop(failed: StoppedOutput): boolean {
117
+ return is_infra(infra_text(failed)) || is_spent_stop(failed.body)
118
+ }
119
+
120
+ // A gate an infrastructure stage ran itself tags its red as a check: its output is test output, where
121
+ // a title naming a rate limit is no outage (joshuafolkken/kit#4825).
122
+ function stage_cause(stage: Stage, failed: StoppedOutput): Cause {
123
+ if (failed.cause === CAUSE.CHECK || !INFRA_STAGES.has(stage)) return CAUSE.CHECK
124
+
125
+ return is_infra_stop(failed) ? CAUSE.INFRA : CAUSE.CHECK
126
+ }
127
+
87
128
  function cause_of(stage: Stage, failed: StoppedOutput): Cause {
88
129
  const { body, conflicts, cause } = failed
89
130
  const reason = run_ship_stage.stop_reason(stage, conflicts)
@@ -91,7 +132,7 @@ function cause_of(stage: Stage, failed: StoppedOutput): Cause {
91
132
  if (reason === run_ship_stage.CONFLICT) return CAUSE.CONFLICT
92
133
  if (is_review(stage)) return review_cause(body, cause)
93
134
 
94
- return INFRA_STAGES.has(stage) && is_infra(infra_text(failed)) ? CAUSE.INFRA : CAUSE.CHECK
135
+ return stage_cause(stage, failed)
95
136
  }
96
137
 
97
138
  // Whether a finding decided the stop — false on any other stop, and on a review stop no finding decided
@@ -2,9 +2,11 @@ import { stripVTControlCharacters } from 'node:util'
2
2
  import { agent_role_profile } from '#scripts/agent/agent-role-profile'
3
3
  import { changed_paths } from '#scripts/git/changed-paths'
4
4
  import { stamp_file } from '#scripts/josh/stamp-file'
5
+ import { review_prior_findings } from '#scripts/review/review-prior-findings'
5
6
  import { z } from 'zod'
6
7
  import { run_ship_next } from './run-ship-next'
7
8
  import { run_ship_probe } from './run-ship-probe'
9
+ import type { StopFinding } from './run-ship-review'
8
10
 
9
11
  // What a relaunched lane child needs in front of it to fix a stopped ship: the tail of the failed
10
12
  // stage's output — a red check, or the High/Medium findings a review stage reports — and the branch's
@@ -14,6 +16,9 @@ import { run_ship_probe } from './run-ship-probe'
14
16
  // **Both are bounded**, so a long gate log never becomes the whole prompt. The tail is kept because a
15
17
  // check reports its verdict last; the lines left out go to a file whose path and line range the prompt
16
18
  // names, so nothing is lost and the session reads only the range it needs.
19
+ //
20
+ // **A review stop also carries the lane's earlier findings on the files it cites** (joshuafolkken/kit#4780),
21
+ // so the fix meets the constraint an earlier round set on the same line rather than breaking it.
17
22
 
18
23
  const EXCERPT_LINE_LIMIT = 40
19
24
  const EXCERPT_LINE_WIDTH = 240
@@ -33,6 +38,7 @@ const stop_context_schema = z
33
38
  omitted: omitted_schema.optional(),
34
39
  changed: z.array(z.string()).readonly().optional(),
35
40
  more_changed: z.number().int(),
41
+ prior: z.array(z.string()).readonly().optional(),
36
42
  })
37
43
  .strict()
38
44
 
@@ -121,8 +127,18 @@ async function changed_of(): Promise<Pick<StopContext, 'changed' | 'more_changed
121
127
  }
122
128
  }
123
129
 
124
- async function build(issue: string, output: string): Promise<StopContext> {
125
- return { ...(await excerpt_of(issue, output)), ...(await changed_of()) }
130
+ async function build(
131
+ issue: string,
132
+ output: string,
133
+ findings: ReadonlyArray<StopFinding> = [],
134
+ ): Promise<StopContext> {
135
+ const prior = review_prior_findings.on_files(issue, findings)
136
+
137
+ return {
138
+ ...(await excerpt_of(issue, output)),
139
+ ...(await changed_of()),
140
+ ...(prior.length > 0 && { prior }),
141
+ }
126
142
  }
127
143
 
128
144
  function has_excerpt(context: StopContext | undefined): boolean {
@@ -168,17 +184,12 @@ function changed_text(context: StopContext): string {
168
184
  return `Changed files on the branch: ${context.changed.join(', ')}${more}.`
169
185
  }
170
186
 
171
- // The block the ship-stop prompt carries between the next command and the closing invocation.
172
- //
173
- // **It fits the `budget` the prompt leaves it** — the prompt is one argv element, refused past
174
- // `MAX_VALUE_LENGTH` (joshuafolkken/kit#3964) — by dropping the excerpt's head first, since a check
175
- // reports its verdict last; the tail line always stays.
176
- function describe(
177
- issue: string,
178
- context: StopContext,
179
- budget: number = agent_role_profile.MAX_VALUE_LENGTH,
180
- ): string {
181
- const changed = changed_text(context)
187
+ function trailer_text(context: StopContext): string {
188
+ return [changed_text(context), ...review_prior_findings.fix_lines(context.prior)].join(LINE_BREAK)
189
+ }
190
+
191
+ function fitted_block(issue: string, context: StopContext, budget: number): string {
192
+ const changed = trailer_text(context)
182
193
 
183
194
  if (!has_excerpt(context)) return changed
184
195
 
@@ -193,6 +204,32 @@ function describe(
193
204
  return block
194
205
  }
195
206
 
207
+ function has_prior(context: StopContext): boolean {
208
+ return context.prior !== undefined && context.prior.length > 0
209
+ }
210
+
211
+ // The block the ship-stop prompt carries between the next command and the closing invocation.
212
+ //
213
+ // **It fits the `budget` the prompt leaves it** — the prompt is one argv element, kept within
214
+ // `MAX_VALUE_LENGTH` (joshuafolkken/kit#3964), well under the launch gate's prompt cap — by dropping
215
+ // the excerpt's head first, since a check
216
+ // reports its verdict last; the tail line always stays. Past that, the earlier findings go oldest first.
217
+ function describe(
218
+ issue: string,
219
+ context: StopContext,
220
+ budget: number = agent_role_profile.MAX_VALUE_LENGTH,
221
+ ): string {
222
+ let fitted = context
223
+ let block = fitted_block(issue, fitted, budget)
224
+
225
+ while (block.length > budget && has_prior(fitted)) {
226
+ fitted = { ...fitted, prior: fitted.prior?.slice(1) }
227
+ block = fitted_block(issue, fitted, budget)
228
+ }
229
+
230
+ return block
231
+ }
232
+
196
233
  const run_ship_stop_context = {
197
234
  CHANGED_PATH_LIMIT,
198
235
  EXCERPT_LINE_LIMIT,