@joshuafolkken/kit 1.1784.0 → 1.2114.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 +59 -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 +415 -389
  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 +15 -8
  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,4 +1,11 @@
1
- import type { FrameParts, PlanLine, PlanSection, TerminalSize, YieldStage } from './run-board-fit'
1
+ import {
2
+ run_board_fit,
3
+ type FrameParts,
4
+ type PlanLine,
5
+ type PlanSection,
6
+ type TerminalSize,
7
+ type YieldStage,
8
+ } from './run-board-fit'
2
9
  import { run_board_fold, type FrameBounds } from './run-board-fold'
3
10
  import { run_board_fresh } from './run-board-fresh'
4
11
  import { run_board_header, type BoardHeader } from './run-board-header'
@@ -14,6 +21,7 @@ import { run_board_notes, type BoardNote } from './run-board-notes'
14
21
  import { run_board_priority } from './run-board-priority'
15
22
  import { run_board_render_condition } from './run-board-render-condition'
16
23
  import { run_board_render_foot } from './run-board-render-foot'
24
+ import { run_board_render_found } from './run-board-render-found'
17
25
  import { run_board_render_icon } from './run-board-render-icon'
18
26
  import { run_board_render_lanes, type LaneCells } from './run-board-render-lanes'
19
27
  import { run_board_render_lead } from './run-board-render-lead'
@@ -38,14 +46,18 @@ const { time_of, time_width } = run_board_render_time
38
46
  const { state_icon } = run_board_render_icon
39
47
  const { NOTE_LIMIT } = run_board_render_notes
40
48
  const { lane_cells_of, lanes_section, number_text } = run_board_render_lanes
41
- const { LANE_INDENT, lead_of: lane_lead_of, running_fresh } = run_board_render_lead
42
- const { ELLIPSIS, TITLE_LIMIT, WHOLE, fitted, reason_text, row_overrun, title_of } =
49
+ const { indent_of, lead_of: lane_lead_of, running_fresh } = run_board_render_lead
50
+ const { ELLIPSIS, TITLE_LIMIT, WHOLE, columns_cut, fitted, reason_text, row_overrun, title_of } =
43
51
  run_board_render_title
52
+ const { width_of } = run_board_fit
44
53
  const { padded } = run_board_fresh
45
54
  const { condition_of, waits_of } = run_board_render_condition
46
55
  const { legend_lines, resume_lines, thanks_part } = run_board_render_foot
47
56
  const { ROW_INDENT, done_section, keyed, plan_section } = run_board_render_section
48
57
  const GAP = ' '
58
+ // The fewest columns a done row's end is cut to before its title gives them up: its minutes and a cut
59
+ // start of what follows.
60
+ const FOUND_FLOOR = 8
49
61
  const FILED_LEAD = `${run_board_labels.FILED_RUN_MARK} `
50
62
  const BRANCH = `${ROW_INDENT} ├ `
51
63
  const LAST_BRANCH = `${ROW_INDENT} └ `
@@ -87,6 +99,8 @@ interface RowFrame {
87
99
  // The lanes section draws each row's lead — progress, phase and times — before its cells
88
100
  // (`run-board-render-lead.ts`).
89
101
  is_lane_row?: boolean | undefined
102
+ // A done row whose title gives up the columns draws what was filed during it whole.
103
+ is_end_kept?: boolean | undefined
90
104
  }
91
105
 
92
106
  // A row drawn before the plan is read has no title yet, and says so.
@@ -159,40 +173,90 @@ function head_text(row: BoardRow, frame: RowFrame): string {
159
173
  return joined([lead, time])
160
174
  }
161
175
 
176
+ function same(reference: string): string {
177
+ return reference
178
+ }
179
+
180
+ // A row up to what was filed during it: its head, then its tail where it draws one.
181
+ function tailed_head(row: BoardRow, frame: RowFrame): string {
182
+ return joined([head_text(row, frame), ...run_board_render_tail.tail_of(row, frame.header)])
183
+ }
184
+
185
+ // The columns the pane leaves after `head` and its gap, where the frame is kept within one and the
186
+ // row's end is not kept whole.
187
+ function room_after(indent: string, head: string, frame: RowFrame): number | undefined {
188
+ if (frame.columns === undefined || frame.is_end_kept === true) return undefined
189
+
190
+ return frame.columns - width_of(`${indent}${head}${GAP}`)
191
+ }
192
+
193
+ // What was filed during a done row, in `room`: a pane too narrow for it cuts its end on an ellipsis
194
+ // rather than the title, so the time column stays where every other row has it
195
+ // (joshuafolkken/kit#4922). The cut text's references are left unlinked, so no hyperlink escape is cut
196
+ // in two.
197
+ function found_fitted(room: number | undefined, row: BoardRow, header: BoardHeader): string {
198
+ const found = run_board_render_found.found_text(row, header)
199
+
200
+ if (found === '' || room === undefined || width_of(found) <= room) return found
201
+
202
+ const unlinked = run_board_render_found.found_text(row, { ...header, link: same })
203
+
204
+ return columns_cut(unlinked, Math.max(1, room))
205
+ }
206
+
162
207
  // Every row carries its state's icon, or the icon of what it waits on; a running row ends on its tail
163
- // (`run-board-render-tail.ts`), and a row with nothing after its padded columns ends where its text does.
164
- function row_text(row: BoardRow, frame: RowFrame): string {
208
+ // (`run-board-render-tail.ts`), a done row on what was filed during it (`run-board-render-found.ts`),
209
+ // and a row with nothing after its padded columns ends where its text does.
210
+ function row_text(indent: string, row: BoardRow, frame: RowFrame): string {
165
211
  const { header } = frame
166
- const tail = run_board_render_tail.tail_of(row, header)
212
+ const head = tailed_head(row, frame)
213
+ const found = found_fitted(room_after(indent, head, frame), row, header)
167
214
  const notes = [waits_of(row, header, frame.is_conditioned), reason_text(row, frame.reason_cut)]
168
215
 
169
- return joined([head_text(row, frame), ...tail, ...notes]).trimEnd()
216
+ return `${indent}${joined([head, found, ...notes]).trimEnd()}`
170
217
  }
171
218
 
172
- // A row drawn whole or cut, after its indent.
173
- function row_draw(indent: string, row: BoardRow, frame: RowFrame): (cut: RowCut) => string {
174
- return (cut) => `${indent}${row_text(row, { ...frame, ...cut })}`
219
+ // A pane narrower than a done row's head leaves its end too few columns to say anything in, so there
220
+ // the title gives up the columns instead, as before joshuafolkken/kit#4922.
221
+ function is_found_squeezed(indent: string, row: BoardRow, frame: RowFrame): boolean {
222
+ if (run_board_render_found.found_text(row, frame.header) === '') return false
223
+
224
+ return (room_after(indent, tailed_head(row, frame), frame) ?? FOUND_FLOOR) < FOUND_FLOOR
225
+ }
226
+
227
+ // A row drawn whole or cut, after its indent; a row that keeps its line keeps its end whole too, its
228
+ // title giving up the columns.
229
+ function row_draw(
230
+ indent: string,
231
+ row: BoardRow,
232
+ frame: RowFrame,
233
+ fit: RowFit,
234
+ ): (cut: RowCut) => string {
235
+ const is_end_kept = fit.is_line_kept === true
236
+
237
+ return (cut) => row_text(indent, row, { ...frame, ...cut, is_end_kept })
175
238
  }
176
239
 
177
240
  // A row drawn with lane cells keeps its head on one line, its title giving up their columns where the
178
241
  // pane is narrow. A row that draws a tail keeps its whole line, giving up the columns its section's
179
- // rows give up together (joshuafolkken/kit#4226).
242
+ // rows give up together (joshuafolkken/kit#4226). A done row keeps its title's width and cuts the end of
243
+ // what was filed during it instead (`found_fitted`), unless that end is squeezed out.
180
244
  function row_fit(indent: string, row: BoardRow, frame: RowFrame): RowFit {
181
- const is_line_kept = run_board_render_tail.tail_of(row, frame.header).length > 0
245
+ const is_tailed = run_board_render_tail.tail_of(row, frame.header).length > 0
182
246
 
183
247
  return {
184
- is_line_kept,
248
+ is_line_kept: is_tailed || is_found_squeezed(indent, row, frame),
185
249
  lead: frame.filed.has(row.number) ? FILED_LEAD.length : 0,
186
250
  head: (cut) => `${indent}${head_text(row, { ...frame, ...cut })}`,
187
251
  is_head_kept: frame.cells !== undefined,
188
- shared: is_line_kept ? frame.shared : undefined,
252
+ shared: is_tailed ? frame.shared : undefined,
189
253
  }
190
254
  }
191
255
 
192
256
  // A plan line that draws one issue row, and one that draws none — a blank, a rule, an epic's own line.
193
257
  function row_line(indent: string, row: BoardRow, frame: RowFrame, stage?: YieldStage): PlanLine {
194
258
  const fit = row_fit(indent, row, frame)
195
- const text = fitted(row, frame.columns, row_draw(indent, row, frame), fit)
259
+ const text = fitted(row, frame.columns, row_draw(indent, row, frame, fit), fit)
196
260
 
197
261
  return { text, row: run_board_row_yield.yield_of(row, stage) }
198
262
  }
@@ -201,10 +265,10 @@ function row_line(indent: string, row: BoardRow, frame: RowFrame, stage?: YieldS
201
265
  // their titles end in one column and the tails after them start in one.
202
266
  function shared_overrun(rows: ReadonlyArray<BoardRow>, frame: RowFrame): number {
203
267
  const overruns = rows.map((row) => {
204
- const fit = row_fit(LANE_INDENT, row, frame)
268
+ const fit = row_fit(indent_of(row), row, frame)
205
269
 
206
270
  return fit.is_line_kept === true
207
- ? row_overrun(row, frame.columns, row_draw(LANE_INDENT, row, frame), fit)
271
+ ? row_overrun(row, frame.columns, row_draw(indent_of(row), row, frame, fit), fit)
208
272
  : 0
209
273
  })
210
274
 
@@ -290,7 +354,7 @@ function active_sections(layout: BoardLayout, frame: RowFrame): Array<PlanSectio
290
354
  const lane_frame = { ...frame, cells, is_lane_row: true }
291
355
  const shared = shared_overrun(lead, lane_frame)
292
356
  const lanes = lanes_section(
293
- lead.map((row) => row_line(LANE_INDENT, row, { ...lane_frame, shared })),
357
+ lead.map((row) => row_line(indent_of(row), row, { ...lane_frame, shared })),
294
358
  cells,
295
359
  )
296
360
 
@@ -1,6 +1,4 @@
1
- import { stripVTControlCharacters } from 'node:util'
2
1
  import { MS_PER_SECOND } from '#scripts/lib/timeouts'
3
- import string_width from 'string-width'
4
2
  import { run_board_fit, type TerminalSize } from './run-board-fit'
5
3
  import { run_board_labels } from './run-board-labels'
6
4
  import type { BoardPorts } from './run-board-state'
@@ -38,7 +36,7 @@ type SpinPorts = Pick<BoardPorts, 'now' | 'sleep' | 'write'>
38
36
  // The spot of the placeholder at `index` in a line that starts `row` rows down the screen.
39
37
  function spot_at(line: string, index: number, row: number, columns: number): Spot {
40
38
  const before = line.slice(0, index)
41
- const width = string_width(stripVTControlCharacters(before))
39
+ const width = run_board_fit.width_of(before)
42
40
  const style = (before.match(SGR) ?? []).join('')
43
41
 
44
42
  return { row: row + Math.floor(width / columns), column: (width % columns) + 1, style }
@@ -88,6 +88,8 @@ interface RunActivity extends Partial<SetupRead> {
88
88
  const KIND = run_event_stream.EVENT_KIND
89
89
  const ENDING_STATES: Readonly<Partial<Record<string, ItemState>>> = {
90
90
  [KIND.MERGE]: 'merged',
91
+ // A drive-closed measurement completes its issue as a merge does (`issue-merged.ts` → `is_measured`).
92
+ [KIND.MEASURED]: 'merged',
91
93
  [KIND.PARK]: 'parked',
92
94
  [KIND.SPLIT]: 'done',
93
95
  [KIND.STOP]: 'done',
@@ -1,3 +1,4 @@
1
+ import { lane_investigation_switch } from '#scripts/lane/lane-investigation-switch'
1
2
  import type { ClosedIssue } from './run-board-closed'
2
3
  import type { EarlierLanes } from './run-board-earlier'
3
4
  import type { FrameBounds } from './run-board-fold'
@@ -6,7 +7,7 @@ import { run_board_github } from './run-board-github'
6
7
  import { run_board_header, type BoardHeader } from './run-board-header'
7
8
  import { run_board_labels } from './run-board-labels'
8
9
  import { run_board_layout, type BoardLayout, type BoardPlan } from './run-board-layout'
9
- import { run_board_link } from './run-board-link'
10
+ import { run_board_link, type Link } from './run-board-link'
10
11
  import { run_board_notes, type Titles } from './run-board-notes'
11
12
  import type { LocalRead } from './run-board-read'
12
13
  import { run_board_reason, type ReasonRead } from './run-board-reason'
@@ -93,15 +94,17 @@ function activity_here(local: LocalRead): RunActivity {
93
94
 
94
95
  type RoomRead = Pick<
95
96
  ReasonRead,
96
- 'free_lanes' | 'occupied_count' | 'lane_limit' | 'is_memory_held' | 'gauges'
97
+ 'free_lanes' | 'occupied_count' | 'lane_limit' | 'usage_reset_ms' | 'is_memory_held' | 'gauges'
97
98
  >
98
99
 
99
- // The room a waiting row is weighed against: the lanes under the limit, and the machine's memory.
100
+ // The room a waiting row is weighed against: the lanes under the limit, the account's usage limit and
101
+ // the machine's memory.
100
102
  function room_of(state: BoardState, local: LocalRead): RoomRead {
101
103
  return {
102
104
  free_lanes: local.free_lanes,
103
105
  occupied_count: local.occupied_count,
104
106
  lane_limit: local.lane_limit,
107
+ usage_reset_ms: local.usage_reset_ms,
105
108
  is_memory_held: local.is_memory_held,
106
109
  gauges: state.gauges,
107
110
  }
@@ -131,7 +134,12 @@ function earlier_here(local: LocalRead): EarlierLanes {
131
134
  }
132
135
 
133
136
  // The plan laid under its statuses, each waiting row saying why it waits.
134
- function planned_layout(state: BoardState, plan: BoardPlan, local: LocalRead): BoardLayout {
137
+ function planned_layout(
138
+ state: BoardState,
139
+ plan: BoardPlan,
140
+ local: LocalRead,
141
+ now_ms: number,
142
+ ): BoardLayout {
135
143
  const statuses = planned_statuses(state, plan, local)
136
144
  const reason_of = run_board_reason.reader({
137
145
  plan,
@@ -140,6 +148,7 @@ function planned_layout(state: BoardState, plan: BoardPlan, local: LocalRead): B
140
148
  ...room_of(state, local),
141
149
  carry: local.carry,
142
150
  is_stopped: activity_here(local).is_stopped,
151
+ now_ms,
143
152
  })
144
153
 
145
154
  return run_board_layout.layout_of(
@@ -152,8 +161,8 @@ function planned_layout(state: BoardState, plan: BoardPlan, local: LocalRead): B
152
161
 
153
162
  // The statuses scoped to the run's plan, a running child GitHub read closed settled.
154
163
  // Before the plan is read, the run's own children alone, named and settled as the snapshot left them.
155
- function layout_for(state: BoardState, local: LocalRead): BoardLayout {
156
- if (state.plan !== undefined) return planned_layout(state, state.plan, local)
164
+ function layout_for(state: BoardState, local: LocalRead, now_ms: number): BoardLayout {
165
+ if (state.plan !== undefined) return planned_layout(state, state.plan, local, now_ms)
157
166
 
158
167
  const read = open_read_of(state, undefined)
159
168
  const statuses = run_board_status.settle_closed(statuses_for(state, local), read)
@@ -168,10 +177,18 @@ interface Redraw {
168
177
  now_ms: number
169
178
  }
170
179
 
171
- // What the header reads off the local read.
180
+ // What the header reads off the local read, and the investigation switch off this machine's
181
+ // environment, `.env` loaded as for `run:merge`.
172
182
  type LocalHeader = Pick<
173
183
  BoardHeader,
174
- 'started_ms' | 'ended_ms' | 'activity' | 'operations' | 'usual' | 'lane_limit'
184
+ | 'started_ms'
185
+ | 'ended_ms'
186
+ | 'activity'
187
+ | 'operations'
188
+ | 'usual'
189
+ | 'lane_limit'
190
+ | 'found'
191
+ | 'is_investigation_on'
175
192
  >
176
193
 
177
194
  function local_header(local: LocalRead): LocalHeader {
@@ -182,6 +199,18 @@ function local_header(local: LocalRead): LocalHeader {
182
199
  operations: local.operations,
183
200
  usual: local.usual,
184
201
  lane_limit: local.lane_limit,
202
+ found: local.found,
203
+ is_investigation_on: lane_investigation_switch.is_on(),
204
+ }
205
+ }
206
+
207
+ // The issue references and pull request numbers linked into `repo`, plain before a plan is read.
208
+ type Links = Pick<BoardHeader, 'link' | 'pull_link'>
209
+
210
+ function links_of(repo: string | undefined, link: Link): Links {
211
+ return {
212
+ link: run_board_link.linker(repo, link),
213
+ pull_link: run_board_link.pull_linker(repo, link),
185
214
  }
186
215
  }
187
216
 
@@ -207,7 +236,7 @@ function header_of(
207
236
  form: redraw.ports.form,
208
237
  repo: state.plan?.context.repo,
209
238
  spinner: redraw.ports.is_tty ? SPOT : undefined,
210
- link: run_board_link.linker(state.plan?.context.repo, redraw.ports.link),
239
+ ...links_of(state.plan?.context.repo, redraw.ports.link),
211
240
  }
212
241
  }
213
242
 
@@ -242,7 +271,7 @@ function draw(ports: BoardPorts, lines: ReadonlyArray<string>): void {
242
271
  // The first total the plan gives is the baseline every later arrival is counted against; the run's own
243
272
  // children before it are no total.
244
273
  function draw_run(state: BoardState, local: LocalRead, redraw: Redraw): BoardState {
245
- const layout = layout_for(state, local)
274
+ const layout = layout_for(state, local, redraw.now_ms)
246
275
  const first_total =
247
276
  state.plan === undefined ? undefined : run_board_header.counts_of(layout).total
248
277
  const settled = { ...state, baseline_total: state.baseline_total ?? first_total }
@@ -1,4 +1,5 @@
1
1
  import path from 'node:path'
2
+ import { durable_state } from '#scripts/josh/durable-state'
2
3
  import { stamp_file } from '#scripts/josh/stamp-file'
3
4
  import { json_value } from '#scripts/lib/json-value'
4
5
  import { z } from 'zod'
@@ -17,7 +18,7 @@ import type { CarryRead } from './run-carry'
17
18
  // **One record, overwritten by the next `--end`**: the board keeps only the run before the next one, and
18
19
  // a run that begins replaces nothing here — its carry record is what the board reads while it runs.
19
20
 
20
- const ENDED_PREFIX = 'josh-run-ended-'
21
+ const ENDED_PREFIX = durable_state.PREFIX.ENDED
21
22
  const TRANSCRIPT_SUFFIX = '.jsonl'
22
23
 
23
24
  const ended_run_schema = z.object({
@@ -32,7 +33,7 @@ type EndedRun = z.infer<typeof ended_run_schema>
32
33
 
33
34
  // Keyed on the common git directory, as the carry record is, so every lane reads the same one.
34
35
  function ended_path(git_directory: string): string {
35
- return stamp_file.stamp_path(ENDED_PREFIX, git_directory)
36
+ return durable_state.path(ENDED_PREFIX, git_directory)
36
37
  }
37
38
 
38
39
  function session_of(transcript: string | undefined): string | undefined {
@@ -1,4 +1,5 @@
1
1
  import { git_command } from '#scripts/git/git-command'
2
+ import { durable_state } from '#scripts/josh/durable-state'
2
3
  import { process_identity } from '#scripts/josh/process-identity'
3
4
  import { stamp_file } from '#scripts/josh/stamp-file'
4
5
  import { json_value } from '#scripts/lib/json-value'
@@ -35,7 +36,7 @@ import { run_carry_conversation } from './run-carry-conversation'
35
36
  // reaches, so only a cut the run itself took is carried without anyone deciding. Everything else is
36
37
  // an explicit carry-or-discard: `--resume` adopts the standing record, `--end` discards it.
37
38
 
38
- const CARRY_PREFIX = 'josh-run-carry-'
39
+ const CARRY_PREFIX = durable_state.PREFIX.CARRY
39
40
  const REPOSITORY_DIRECTORY_INDEX = 1
40
41
  const NO_INCREMENT = 0
41
42
 
@@ -212,7 +213,7 @@ const run_carry_schema = z.object({
212
213
  })
213
214
 
214
215
  function carry_path(git_directory: string): string {
215
- return stamp_file.stamp_path(CARRY_PREFIX, git_directory)
216
+ return durable_state.path(CARRY_PREFIX, git_directory)
216
217
  }
217
218
 
218
219
  // The common git directory: `.git` in the main work tree and the same `.git` from inside a lane, so
@@ -4,19 +4,22 @@ import { agent_session_role } from '#scripts/agent/agent-session-role'
4
4
  import { cost_cli } from '#scripts/cost-runtime/cost-cli'
5
5
  import { cost_verdict } from '#scripts/cost-runtime/cost-verdict'
6
6
  import { issue_cite } from '#scripts/issue/issue-cite'
7
- import { session_cite } from '#scripts/issue/session-cite'
8
7
  import { lane_registry, type LaneInfo } from '#scripts/lane/lane-registry'
9
8
  import { lane_relaunch } from '#scripts/lane/lane-relaunch'
10
9
  import { openai_lane_supervisor } from '#scripts/lane/openai-lane-supervisor'
11
10
  import { run_event_stream } from '#scripts/run/event/run-event-stream'
12
11
  import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
13
12
  import { run_cli_fault } from '#scripts/run/run-cli-fault'
14
- import { run_cut, type RunCut } from './run-cut'
13
+ import { split_resolution } from '#scripts/split/split-resolution'
14
+ import { run_cut } from './run-cut'
15
15
  import { run_cut_args, type Request } from './run-cut-args'
16
16
  import { run_cut_decline } from './run-cut-decline'
17
+ import { run_cut_digest } from './run-cut-digest'
17
18
  import { run_cut_handoff } from './run-cut-handoff'
18
19
  import { run_cut_ready } from './run-cut-ready'
19
20
  import { run_cut_report } from './run-cut-report'
21
+ import { run_cut_resume } from './run-cut-resume'
22
+ import { run_cut_review } from './run-cut-review'
20
23
 
21
24
  // `josh run:cut` — the record that lets a lane child end its process before the gate and a fresh one
22
25
  // resume from it. `run:cut <N>` writes the record and relaunches a fresh
@@ -40,15 +43,13 @@ const {
40
43
  FAILED_VERDICT,
41
44
  FAILURE_EXIT_CODE,
42
45
  FRESH_VERDICT,
43
- HANDED_OFF_VERDICT,
44
46
  HANDOFF_MISSING_NOTE,
45
47
  HANDOFF_OVERFLOW_NOTE,
46
- INCOMPLETE_VERDICT,
47
48
  NOT_A_LANE_VERDICT,
48
49
  OVER_VERDICT,
49
50
  RESUME_IMPL_VERDICT,
50
51
  RESUME_VERDICT,
51
- STALE_VERDICT,
52
+ SPLIT_UNRESOLVED_VERDICT,
52
53
  SUCCESS_EXIT_CODE,
53
54
  UNDER_THRESHOLD_VERDICT,
54
55
  UNREADY_VERDICT,
@@ -57,27 +58,33 @@ const {
57
58
  report_bad_handoff,
58
59
  report_busy,
59
60
  report_fault,
60
- report_handed_off,
61
61
  report_held_cut,
62
- report_incomplete,
63
- report_over,
62
+ report_missing_supervisor,
64
63
  report_relaunched_cut,
65
64
  report_reviewer,
66
- report_stale,
65
+ report_split_unresolved,
67
66
  report_under_threshold,
68
67
  report_unknown,
69
- report_unreadable,
70
68
  } = run_cut_report
71
69
 
72
70
  // **The pre-gate cut is conditional on the same statistic the implementation-phase cut reads**.
73
- // `cost_cli.session_verdict` prices the newest request against `CONTEXT_CUT_THRESHOLD`, so no second
71
+ // `cost_cli.session_verdict` prices the newest request against the `--cut` break-even, so no second
74
72
  // threshold is introduced — an `under` session skips the cut, and an unmeasurable one still cuts as
75
73
  // the safety net. Only the pre-gate phase is checked here; the implementation-phase caller gates its own
76
74
  // `--impl` cut on `pnpm josh cost --cut` before it is ever issued.
77
- function skips_pre_gate_cut(phase: string): boolean {
78
- if (phase !== run_cut.PRE_GATE_PHASE) return false
75
+ //
76
+ // **A noticed Issue answers the split notice first** (joshuafolkken/kit#4695): the pre-gate cut is the
77
+ // boundary the notice names, so a lane that neither split nor recorded why is refused whether or not
78
+ // the cut itself would be taken. Returns the answer given without cutting, or `undefined`.
79
+ async function pre_gate_answer(issue: string, phase: string): Promise<number | undefined> {
80
+ if (phase !== run_cut.PRE_GATE_PHASE) return undefined
81
+ const split_note = await split_resolution.ledger_refusal(Number(issue))
82
+
83
+ if (split_note !== undefined) return report_split_unresolved(split_note)
79
84
 
80
85
  return cost_cli.session_verdict() === cost_verdict.UNDER_VERDICT
86
+ ? report_under_threshold()
87
+ : undefined
81
88
  }
82
89
 
83
90
  // The exclusive create lost, so a cut is already in flight for this tree — the double-cut guard. The
@@ -103,18 +110,11 @@ function report_relaunch_failure(target: string, note: string): number {
103
110
  return report(FAILED_VERDICT, FAILURE_EXIT_CODE)
104
111
  }
105
112
 
106
- function report_missing_supervisor(issue: string): number {
107
- console.error(
108
- `The OpenAI supervisor for ${session_cite.issue(issue)} is not live, so this nested process was not cut and can continue. Re-dispatch the lane to recover the supervisor.`,
109
- )
110
-
111
- return report(FAILED_VERDICT, FAILURE_EXIT_CODE)
112
- }
113
-
114
113
  // **The relaunched child is started at the effort of the phase it is resuming into**.
115
114
  // A pre-gate resume drives the gate, commit, PR and merge — the mechanical
116
115
  // ship/bookkeeping region, lowered — while an implementation resume keeps the role default. The
117
- // phase-aware profile is `agent_argv.resume_argv`'s; a person's `JOSH_WORKER_EFFORT` still wins over it.
116
+ // phase-aware profile is `agent_argv.resume_argv`'s; a person's `JOSH_WORKER_EFFORT` still wins over it,
117
+ // and a pre-gate resume moves to `JOSH_WORKER_SHIP_MODEL` when that is set.
118
118
  function relaunch(target: string, lane: LaneInfo, phase: string): number {
119
119
  const notes: Array<string> = []
120
120
  const result = lane_relaunch.resume(lane, phase, (note) => {
@@ -177,14 +177,18 @@ async function write_cut(target: string, request: CutRequest): Promise<number |
177
177
  const loaded = run_cut_handoff.load_handoff(request.handoff_path, run_cut.MAX_HANDOFF_BYTES)
178
178
  if (loaded.kind === 'bad') return report_bad_handoff(loaded.note)
179
179
 
180
- const spec = {
180
+ const base = {
181
181
  issue: request.issue,
182
182
  branch: request.branch,
183
183
  phase: request.phase,
184
184
  handoff: loaded.handoff,
185
185
  }
186
+ // The checkout, not `target`: the record lives in the temp root, and the transcript is filed by checkout.
187
+ const checkout = await run_cut.worktree_directory()
188
+ const spec = run_cut.with_digest(base, () => run_cut_digest.own_digest(checkout))
186
189
 
187
- const spec_note = spec_refusal(spec)
190
+ const spec_note =
191
+ spec_refusal(spec) ?? (await run_cut_review.unrecorded_refusal(request, loaded.handoff))
188
192
 
189
193
  if (spec_note !== undefined) return report_bad_handoff(spec_note)
190
194
  if (run_cut.begin_cut(target, spec) === undefined) return report_cut_exists(target)
@@ -247,7 +251,9 @@ async function cut(
247
251
  return await declined({ issue, phase }, state, refuse_unready(state))
248
252
  }
249
253
 
250
- if (skips_pre_gate_cut(phase)) return report_under_threshold()
254
+ const answered = await pre_gate_answer(issue, phase)
255
+
256
+ if (answered !== undefined) return answered
251
257
 
252
258
  clear_expired(target)
253
259
  if (!has_matching_supervisor(lane, issue)) return report_missing_supervisor(issue)
@@ -255,111 +261,6 @@ async function cut(
255
261
  return await finish_cut(target, lane, { issue, branch: state.branch, phase, handoff_path })
256
262
  }
257
263
 
258
- // **The adoption is the resume-uniqueness guarantee**: it removes and creates exclusively, so of two
259
- // racing resumes only one wins the create and the loser is answered `busy`.
260
- // An implementation cut resumes back into implementation; a pre-gate one into the gate. The resuming
261
- // child is told which by the verdict rather than reconstructing it from the record.
262
- function resume_verdict_for(cut_record: RunCut): string {
263
- return run_cut.resumes_into_implementation(cut_record.phase)
264
- ? RESUME_IMPL_VERDICT
265
- : RESUME_VERDICT
266
- }
267
-
268
- // **An implementation resume removes the record; a pre-gate one marks it handed off**.
269
- // The cuts have different multiplicities sharing one record: the pre-gate cut fires once per lane, so
270
- // its record must survive to answer a second resume `handed-off`; the implementation cut is guarded by the run's
271
- // event stream rather than the cut record, so its record is cleared on resume — a lingering record
272
- // would keep the pre-gate guard, which reads `carried_cut_sync`, silent for the rest of the run. A double
273
- // cut stays impossible either way: `begin_cut`'s exclusive create is what prevents it.
274
- function take_over(target: string, cut_record: RunCut): RunCut | undefined {
275
- if (!run_cut.resumes_into_implementation(cut_record.phase)) {
276
- return run_cut.adopt_cut(target, cut_record)
277
- }
278
-
279
- run_cut.end_cut(target)
280
-
281
- return cut_record
282
- }
283
-
284
- // The carried instruction and work state, printed to standard error so the resumed session continues
285
- // on what the run was told to do rather than on the tree alone. The record is cleared
286
- // on adoption, so this is where it reaches the fresh process.
287
- function announce_handoff(cut_record: RunCut): void {
288
- if (cut_record.handoff !== undefined) {
289
- console.error(run_cut_handoff.describe_handoff(cut_record.handoff))
290
- }
291
- }
292
-
293
- // **An implementation resume appends a `resume` event**. It clears the record
294
- // the `cut` event stood for, so the stream is what moves `run:step` back to implementation; a pre-gate
295
- // resume keeps its record and appends nothing. Best-effort, as the cut's own append is.
296
- async function emit_resume_event(issue: string, verdict: string): Promise<void> {
297
- if (verdict !== RESUME_IMPL_VERDICT) return
298
-
299
- await run_event_stream_emit.emit(
300
- run_event_stream.EVENT_KIND.RESUME,
301
- `${issue_cite.plain(issue)} resumed`,
302
- )
303
- }
304
-
305
- async function adopt(target: string, cut_record: RunCut): Promise<number> {
306
- const taken = take_over(target, cut_record)
307
-
308
- if (taken === undefined) return report_busy(cut_record)
309
-
310
- announce_handoff(cut_record)
311
-
312
- const verdict = resume_verdict_for(cut_record)
313
-
314
- await emit_resume_event(cut_record.issue, verdict)
315
-
316
- return report(verdict, SUCCESS_EXIT_CODE)
317
- }
318
-
319
- // A relaunched lane child and a fresh session both measure `under`, so only the session that took an
320
- // implementation cut resumes over the threshold; unmeasurable is not refused.
321
- function is_over_threshold_resume(cut_record: RunCut): boolean {
322
- if (!run_cut.resumes_into_implementation(cut_record.phase)) return false
323
-
324
- return cost_cli.session_verdict() === cost_verdict.OVER_VERDICT
325
- }
326
-
327
- async function verify_and_adopt(
328
- target: string,
329
- cut_record: RunCut,
330
- issue: string,
331
- ): Promise<number> {
332
- const state = await run_cut.current_state()
333
- const verdict = run_cut.classify_resume(cut_record, {
334
- issue,
335
- current_branch: state.branch,
336
- is_dirty: state.is_dirty,
337
- is_held: state.is_held,
338
- })
339
-
340
- if (verdict === HANDED_OFF_VERDICT) return report_handed_off(cut_record)
341
-
342
- if (verdict === 'stale') return report_stale(cut_record)
343
-
344
- if (verdict === INCOMPLETE_VERDICT) return report_incomplete(cut_record)
345
-
346
- if (is_over_threshold_resume(cut_record)) return report_over()
347
-
348
- return await adopt(target, cut_record)
349
- }
350
-
351
- async function resume(target: string, issue: string): Promise<number> {
352
- const read = run_cut.read_cut(target)
353
-
354
- if (read.kind === 'none') return report(FRESH_VERDICT, SUCCESS_EXIT_CODE)
355
-
356
- if (read.kind === 'unreadable') return report_unreadable()
357
-
358
- if (read.kind === 'expired') return report_stale(read.cut)
359
-
360
- return await verify_and_adopt(target, read.cut, issue)
361
- }
362
-
363
264
  function read_json(target: string): number {
364
265
  const read = run_cut.read_cut(target)
365
266
  const cut_record = read.kind === 'carried' || read.kind === 'expired' ? read.cut : undefined
@@ -395,7 +296,7 @@ async function take_cut(target: string, request: CutCommand): Promise<number> {
395
296
  async function act(target: string, request: Request): Promise<number> {
396
297
  if (request.kind === 'cut') return await take_cut(target, request)
397
298
 
398
- if (request.kind === 'resume') return await resume(target, request.issue)
299
+ if (request.kind === 'resume') return await run_cut_resume.resume(target, request.issue)
399
300
 
400
301
  if (request.kind === 'read') return read_json(target)
401
302
 
@@ -447,12 +348,11 @@ const run_cut_cli = {
447
348
  ENDED_VERDICT,
448
349
  FAILED_VERDICT,
449
350
  FRESH_VERDICT,
450
- HANDED_OFF_VERDICT,
451
351
  NOT_A_LANE_VERDICT,
452
352
  OVER_VERDICT,
453
353
  RESUME_IMPL_VERDICT,
454
354
  RESUME_VERDICT,
455
- STALE_VERDICT,
355
+ SPLIT_UNRESOLVED_VERDICT,
456
356
  UNDER_THRESHOLD_VERDICT,
457
357
  UNREADY_VERDICT,
458
358
  run,