@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,3 +1,4 @@
1
+ import { shell_quote } from '#scripts/lib/shell-quote'
1
2
  import { run_ship_stage, type Stage } from './run-ship-stage'
2
3
  import type { ShipArguments } from './run-ship-steps'
3
4
  import type { Cause } from './run-ship-stop-cause'
@@ -14,9 +15,9 @@ import type { Cause } from './run-ship-stop-cause'
14
15
  //
15
16
  // **Every route is a re-detach.** The prompt only ever reaches a lane child, and a lane child's commit
16
17
  // and push belong to the detached ship (`scripts/rules/lane-background.ts`), so a `josh git -y` here could never
17
- // run. The rounds are the supervisor's too: under `--review` it skips a round 1 already recorded for the
18
- // issue and asks `review:round2` itself after the commit (`run-ship-review-steps.ts`), so the fix delta
19
- // is verified as round 2 rather than reviewed again as round 1.
18
+ // run. The rounds are the supervisor's too: under `--review` it reuses a round 1 recorded on a tree
19
+ // unmoved or moved only where round 2 reads, reviews only the delta from that record otherwise, and asks `review:round2` itself after the
20
+ // commit (`run-ship-review-steps.ts`), so the whole change is never reviewed again as round 1.
20
21
  //
21
22
  // **The re-run carries the stopped ship's own options.** A preflight that stopped on missing live
22
23
  // evidence asks for `--body-file`, and `followup` delivers the body from it; a command naming only
@@ -30,18 +31,15 @@ const COMMAND = {
30
31
  DETACH_REVIEW: 'pnpm josh ship --detach --review',
31
32
  } as const
32
33
 
33
- // A single quote cannot appear inside single quotes, so it closes the quote, escapes one, and reopens.
34
- const ESCAPED_QUOTE = String.raw`'\''`
35
-
36
- // A token of only these characters means the same to the shell quoted or not, so it is left bare.
37
- const BARE_WORD = /^[\w%+,./:=@-]+$/u
38
-
39
34
  // What a stopped ship is re-run with: its title, every option it was started with, and whether it
40
35
  // carried `--review` — the one option a route decides rather than repeats.
41
36
  interface ShipResume {
42
37
  title: string
43
38
  flags: ReadonlyArray<string>
44
39
  is_review: boolean
40
+ // `--unpinned-ok "<reason>"` as started; `josh ship` refuses it without `--review`, so only a
41
+ // command that carries `--review` repeats it.
42
+ unpinned_ok?: ReadonlyArray<string>
45
43
  // The paths a merge of the default branch left unmerged.
46
44
  conflicts?: ReadonlyArray<string>
47
45
  // The cause a stopped review round tagged its stop with (`run-ship-stop-cause.ts`).
@@ -50,17 +48,8 @@ interface ShipResume {
50
48
  is_review_stale?: boolean
51
49
  }
52
50
 
53
- // Single quotes, so a `$` or a backtick in a title is never expanded by the shell that runs it.
54
- function quoted(title: string): string {
55
- return `'${title.split("'").join(ESCAPED_QUOTE)}'`
56
- }
57
-
58
- function shell_word(token: string): string {
59
- return BARE_WORD.test(token) ? token : quoted(token)
60
- }
61
-
62
51
  // A supervised ship's notify tail is already file-form (`run-ship-detach.ts`), so every flag is a path
63
- // or an issue number and fits the prompt.
52
+ // or an issue number and fits the prompt; `shell_quote.word` quotes the `--unpinned-ok` reason.
64
53
  function resume_of(args: ShipArguments): ShipResume {
65
54
  const cites = args.cites.flatMap((cite) => ['--cite', cite])
66
55
 
@@ -68,28 +57,40 @@ function resume_of(args: ShipArguments): ShipResume {
68
57
  title: args.title,
69
58
  flags: [...args.notify, ...args.body, ...cites],
70
59
  is_review: args.is_review,
60
+ unpinned_ok: args.unpinned_ok,
71
61
  }
72
62
  }
73
63
 
74
64
  // The command prefix stays as written; only the stopped ship's own tokens are quoted where needed.
75
- function ship_command(command: string, resume: ShipResume): string {
76
- const words = [...resume.flags, resume.title].map((token) => shell_word(token))
65
+ function ship_command(
66
+ command: string,
67
+ resume: ShipResume,
68
+ review_flags: ReadonlyArray<string> = [],
69
+ ): string {
70
+ const words = [...review_flags, ...resume.flags, resume.title].map((token) =>
71
+ shell_quote.word(token),
72
+ )
77
73
 
78
74
  return [command, ...words].join(' ')
79
75
  }
80
76
 
77
+ function review_command(resume: ShipResume): string {
78
+ return ship_command(COMMAND.DETACH_REVIEW, resume, resume.unpinned_ok)
79
+ }
80
+
81
81
  // After the merge-side stages, or after round 2 — which is final — the re-detach reviews nothing.
82
82
  function detach_again(resume: ShipResume): string {
83
83
  return `leave the fix uncommitted and run \`${ship_command(COMMAND.DETACH, resume)}\`.`
84
84
  }
85
85
 
86
86
  // Before round 2 the re-run takes the stopped ship's own shape: `--review` only when it carried it. A
87
- // reviewing ship skips its recorded round 1 and decides round 2 after the commit; a ship started
87
+ // reviewing ship reviews only the fix delta from its recorded round 1 and decides round 2 after the
88
+ // commit; a ship started
88
89
  // without `--review` was re-detached after round 2, which is final, so it reviews nothing.
89
90
  function detach_as_started(resume: ShipResume): string {
90
- const command = resume.is_review ? COMMAND.DETACH_REVIEW : COMMAND.DETACH
91
+ const command = resume.is_review ? review_command(resume) : ship_command(COMMAND.DETACH, resume)
91
92
 
92
- return `leave the fix uncommitted and run \`${ship_command(command, resume)}\`.`
93
+ return `leave the fix uncommitted and run \`${command}\`.`
93
94
  }
94
95
 
95
96
  const AFTER_FIX: Record<Stage, (resume: ShipResume) => string> = {
@@ -107,7 +108,7 @@ const AFTER_FIX: Record<Stage, (resume: ShipResume) => string> = {
107
108
  // supervisor reviews it again even on a committed tree (`run-ship-stage.ts`), and `josh followup`
108
109
  // refuses the merge until it has (joshuafolkken/kit#4221).
109
110
  function detach_review_again(resume: ShipResume): string {
110
- return `leave the fix uncommitted and run \`${ship_command(COMMAND.DETACH_REVIEW, resume)}\` — the review read the issue before its update, so the supervisor reviews round 1 again.`
111
+ return `leave the fix uncommitted and run \`${review_command(resume)}\` — the review read the issue before its update, so the supervisor reviews round 1 again.`
111
112
  }
112
113
 
113
114
  function after_fix(stage: Stage, resume: ShipResume): string {
@@ -137,6 +138,6 @@ function next_step(issue: string, stage: Stage, resume: ShipResume, is_excerpted
137
138
  return `${fix_step(issue, stage, is_excerpted)}, then ${after_fix(stage, resume)}`
138
139
  }
139
140
 
140
- const run_ship_next = { COMMAND, next_step, quoted, resume_of }
141
+ const run_ship_next = { COMMAND, next_step, resume_of }
141
142
 
142
143
  export { run_ship_next, type ShipResume }
@@ -5,7 +5,8 @@ import { git_spawn } from '#scripts/git/git-spawn'
5
5
  import { main_merge_regenerate } from '#scripts/git/main-merge-regenerate'
6
6
  import { session_cite } from '#scripts/issue/session-cite'
7
7
  import { lane_handoff } from '#scripts/lane/lane-handoff'
8
- import { lane_ledger, type OverlapRecord } from '#scripts/lane/lane-ledger'
8
+ import type { OverlapRecord } from '#scripts/lane/lane-ledger-schema'
9
+ import { lane_ledger_write } from '#scripts/lane/lane-ledger-write'
9
10
  import { lane_registry, type LaneInfo } from '#scripts/lane/lane-registry'
10
11
  import { poll } from '#scripts/lib/poll'
11
12
 
@@ -39,8 +40,12 @@ const NAME_ONLY_ARGUMENTS = [
39
40
  '--no-relative',
40
41
  '--no-renames',
41
42
  ]
43
+ // Only the regenerated entries: a rewritten one resolves some conflicts and refuses the rest, so its
44
+ // conflict is still waited on.
42
45
  const REGENERATED_PATHS: ReadonlySet<string> = new Set(
43
- main_merge_regenerate.REGENERATED_FILES.map((entry) => entry.path),
46
+ main_merge_regenerate.RESOLVED_FILES.filter((entry) => 'command' in entry).map(
47
+ (entry) => entry.path,
48
+ ),
44
49
  )
45
50
 
46
51
  interface OverlapOptions {
@@ -211,7 +216,7 @@ async function await_overlap(
211
216
  const waited_ms = Date.now() - started
212
217
  const record = { issue: Number(issue), lanes, paths: [...overlap.paths], waited_ms, is_cleared }
213
218
 
214
- await lane_ledger.record_overlap(record, options.ledger)
219
+ await lane_ledger_write.record_overlap(record, options.ledger)
215
220
 
216
221
  return record
217
222
  }
@@ -8,10 +8,15 @@ import { run_ship_stage, type Stage } from './run-ship-stage'
8
8
 
9
9
  // **A followup stop past the lane limit waits for a place, then relaunches**: its lane held no place
10
10
  // while it waited (`backlog-occupied.ts`), so the next launch may have taken it, and a child started at
11
- // once would run past the limit (joshuafolkken/kit#4466). The stopped lane counts again while this
11
+ // once could run lanes past the limit (joshuafolkken/kit#4466). The stopped lane counts again while this
12
12
  // supervisor waits, so the driver launches nothing into the place it waits for. An unreadable limit or
13
13
  // lane count relaunches at once, and so does a place that does not free within the wait.
14
14
  //
15
+ // **One relaunch may run a lane past the limit**: a followup relaunch is a few minutes' work on a lane
16
+ // about to merge, so it does not queue behind a fresh lane's whole run (joshuafolkken/kit#5172). The
17
+ // waiter counts in the lane use, so the lanes it sees at the limit plus one include itself, and a second
18
+ // waiter sees the first one's lane over that and waits.
19
+ //
15
20
  // **Waiters queue in issue order rather than block each other**: every waiter counts in the lane use,
16
21
  // so three of them past a limit of two would each see the lanes full and wait out the hour together. A
17
22
  // waiter leaves out the waiters behind it, so the first ones that fit relaunch and the rest wait on them.
@@ -21,6 +26,8 @@ import { run_ship_stage, type Stage } from './run-ship-stage'
21
26
  // An hour of lane counts, half a minute apart: about two lanes' median run (`lane:stats`).
22
27
  const PLACE_POLL_MS = 30_000
23
28
  const PLACE_POLLS = 120
29
+ // The one relaunch allowed past the lane limit.
30
+ const RELAUNCH_OVERSHOOT = 1
24
31
 
25
32
  function is_behind(lane: LaneInfo, issue: string): boolean {
26
33
  return lane.issue.localeCompare(issue, undefined, { numeric: true }) > 0
@@ -42,7 +49,7 @@ async function is_over_limit(issue: string): Promise<boolean> {
42
49
  const use = await backlog_ready.lane_use()
43
50
  const behind = await waiters_behind(issue)
44
51
 
45
- return use.occupied - behind > lane_capacity.seated_limit(limit.limit)
52
+ return use.occupied - behind > lane_capacity.seated_limit(limit.limit) + RELAUNCH_OVERSHOOT
46
53
  }
47
54
 
48
55
  async function is_place_taken(issue: string): Promise<boolean> {
@@ -0,0 +1,92 @@
1
+ import path from 'node:path'
2
+ import { changed_paths } from '#scripts/git/changed-paths'
3
+ import { git_branch } from '#scripts/git/git-branch'
4
+ import { git_issue } from '#scripts/git/git-issue'
5
+ import { lane_plan, type LanePlan } from '#scripts/lane/lane-plan'
6
+ import { test_declared_logic } from '#scripts/test/test-declared-logic'
7
+
8
+ // `josh ship`'s `planned` precondition (joshuafolkken/kit#5152): the branch's code files that the
9
+ // lane's `lane:plan` record never listed. Nothing else compares a lane's edits with its plan, so an
10
+ // out-of-scope fix landed with no one noticing (joshuafolkken/kit#5122). Tests, documents and data
11
+ // files (a `cspell.config.yaml` term, a lock file) never count, and a branch with no plan record, or a
12
+ // yielded one — a `fullrun` a person drove — passes as before.
13
+
14
+ // The precondition's name in the preflight's answer and in a `stop` record's `preconditions`.
15
+ const PRECONDITION = 'unplanned'
16
+ const SEPARATOR = '/'
17
+ const NON_CODE_PREFIXES = ['docs/', '.josh/']
18
+ const CODE_EXTENSIONS = new Set(['.cjs', '.js', '.mjs', '.sh', '.svelte', '.ts'])
19
+
20
+ // A claim ending in `/` is a directory and holds every path under it — `backlog_overlap`'s reading.
21
+ function is_planned(claims: ReadonlyArray<string>, file: string): boolean {
22
+ return claims.some((claim) =>
23
+ claim.endsWith(SEPARATOR) ? file.startsWith(claim) : claim === file,
24
+ )
25
+ }
26
+
27
+ function is_code(file: string): boolean {
28
+ return (
29
+ CODE_EXTENSIONS.has(path.extname(file)) &&
30
+ NON_CODE_PREFIXES.every((prefix) => !file.startsWith(prefix))
31
+ )
32
+ }
33
+
34
+ // The code files of `changed` that `claims` does not hold.
35
+ function unplanned_of(
36
+ claims: ReadonlyArray<string>,
37
+ changed: ReadonlyArray<string>,
38
+ ): Array<string> {
39
+ return test_declared_logic
40
+ .runtime_files(changed)
41
+ .filter((file) => is_code(file) && !is_planned(claims, file))
42
+ }
43
+
44
+ // The two ways out, each named with its command: the re-run replaces the record, so it lists the
45
+ // planned paths as well as the new ones.
46
+ function problem_text(
47
+ issue: string,
48
+ claims: ReadonlyArray<string>,
49
+ files: ReadonlyArray<string>,
50
+ ): string {
51
+ const replan = ['pnpm josh lane:plan', issue, ...claims, ...files].join(' ')
52
+
53
+ return `unplanned: ${files.join(', ')} — the lane's lane:plan record does not list these code files. In scope: run \`${replan}\` and comment the reason on the Issue in one line, then re-detach; if it answers \`yield\`, another lane holds the file — follow what it prints instead. Out of scope: revert the change and file it with \`pnpm josh issue:file\`.`
54
+ }
55
+
56
+ // A yielded plan outlives its lane on purpose (`lane-plan.ts`) and cleared no edit, so it reads as none.
57
+ function held_claims(plan: LanePlan | undefined): ReadonlyArray<string> | undefined {
58
+ return plan?.yielded === true ? undefined : plan?.paths
59
+ }
60
+
61
+ // The branch's unplanned code files and the text naming the two ways out, `undefined` where none is —
62
+ // read by the ship's preflight and, ahead of it, by `josh check:related` (joshuafolkken/kit#5203).
63
+ interface Unplanned {
64
+ issue: number
65
+ files: ReadonlyArray<string>
66
+ text: string
67
+ }
68
+
69
+ async function unplanned(): Promise<Unplanned | undefined> {
70
+ const issue = git_issue.branch_number(await git_branch.current())
71
+
72
+ if (issue === undefined) return undefined
73
+ const claims = held_claims(lane_plan.read(Number(issue), process.cwd()))
74
+
75
+ if (claims === undefined) return undefined
76
+ const files = unplanned_of(claims, await changed_paths.read_changed_paths(false))
77
+
78
+ if (files.length === 0) return undefined
79
+
80
+ return { issue: Number(issue), files, text: problem_text(issue, claims, files) }
81
+ }
82
+
83
+ async function problems(): Promise<Array<string>> {
84
+ const found = await unplanned()
85
+
86
+ return found === undefined ? [] : [found.text]
87
+ }
88
+
89
+ const run_ship_planned = { PRECONDITION, problems, unplanned, unplanned_of }
90
+
91
+ export { run_ship_planned }
92
+ export type { Unplanned }
@@ -0,0 +1,197 @@
1
+ import { randomUUID } from 'node:crypto'
2
+ import { check_reuse } from '#scripts/gate/check-reuse'
3
+ import { PROJECT_ROOT } from '#scripts/init/init-paths'
4
+ import type { JoshResult } from '#scripts/josh/josh-run'
5
+ import { buffered_process } from '#scripts/lib/buffered-process'
6
+ import { error_text } from '#scripts/lib/error-message'
7
+ import { review_round_reuse } from '#scripts/review/review-round-reuse'
8
+ import { run_review_pinned } from '#scripts/run/review/run-review-pinned'
9
+ import { run_review_pinned_accepted } from '#scripts/run/review/run-review-pinned-accepted'
10
+ import { run_review_pinned_join } from '#scripts/run/review/run-review-pinned-join'
11
+ import { run_review_pinned_steps } from '#scripts/run/review/run-review-pinned-steps'
12
+ import { run_review_pinned_tree } from '#scripts/run/review/run-review-pinned-tree'
13
+ import { test_pinned } from '#scripts/test/test-pinned'
14
+ import { test_pinned_logic } from '#scripts/test/test-pinned-logic'
15
+ import { test_pinned_record, type PinnedSummary } from '#scripts/test/test-pinned-record'
16
+ import { run_ship_pre_detach, type PreDetachResult } from './run-ship-pre-detach'
17
+ import type { ShipArguments } from './run-ship-steps'
18
+
19
+ // `josh test:pinned` among the pre-detach checks of a `josh ship --review` (joshuafolkken/kit#4785). The
20
+ // child's `run:review` checked the tree it saw; a round-1 fix made after it reached no `test:pinned`
21
+ // until the supervisor's review stage stopped on it, after the detach. Here it stops in the
22
+ // foreground, with the text and the `--unpinned-ok` judgment `run:review --join` uses
23
+ // (`run-review-pinned.ts`).
24
+ //
25
+ // **On the tree `run:review` checked it runs no `test:pinned`**: it reads that background check's
26
+ // answer (`run-review-pinned-join.ts`). On another tree it waits that check out, so its verdicts
27
+ // reach the cache (joshuafolkken/kit#4895), then runs its own as a `josh` command, so it reserves its
28
+ // own cores (`DIRECT_UNIT_CLAIM`) beside the other checks, and it probes only the hunks whose stored
29
+ // verdict the per-checkout cache no longer holds (`test-pinned-cache-logic.ts`). Its answer comes
30
+ // back through the record `--record` leaves (`test-pinned-record.ts`). Under
31
+ // `--unpinned-ok "<reason>"` — given, or carried from this branch's record (`with_recorded_reason`) —
32
+ // it runs only when the supervisor reuses round 1 (`pinned_check`).
33
+ // Without `--review` nothing after the detach asks `test:pinned`, and `--unpinned-ok` is refused there
34
+ // (`run-ship-args.ts`), so the check is not asked.
35
+
36
+ const SUCCESS_EXIT_CODE = 0
37
+ const FAILURE_EXIT_CODE = 1
38
+ const SKIPPED_NOTE =
39
+ 'test:pinned not run before the detach; round 1 lists the unpinned places under --unpinned-ok: '
40
+ const CARRIED_NOTE = 'josh ship: --unpinned-ok carried from an earlier run on this branch: '
41
+
42
+ type CheckOptions = Pick<ShipArguments, 'number' | 'unpinned_ok'>
43
+ type PinnedOptions = CheckOptions & Pick<ShipArguments, 'is_review'>
44
+
45
+ // A check that left no answer could not run, and fails open as the one `run:review` launches does.
46
+ // Its arguments follow the reason (`test_pinned_record.launch_argv`).
47
+ async function own_summary(reason: string | undefined): Promise<PinnedSummary> {
48
+ const token = randomUUID()
49
+ const argv = ['josh', ...test_pinned_record.launch_argv(token, reason, 'pre-detach')]
50
+ const result = await buffered_process.run_buffered_process(argv)
51
+ const answer = test_pinned_record.read(token)
52
+
53
+ test_pinned_record.clear(token)
54
+
55
+ return answer ?? test_pinned_record.not_run_summary(result.output)
56
+ }
57
+
58
+ function remaining_note(remaining: number | undefined): string {
59
+ const hunks =
60
+ remaining === undefined ? 'the remaining hunks' : `${String(remaining)} remaining hunks`
61
+
62
+ return `test:pinned: probing ${hunks} in the background — the next ship's pre-detach reads their verdicts\n`
63
+ }
64
+
65
+ // **A stop at the first unpinned hunk leaves the rest probing in the background**
66
+ // (joshuafolkken/kit#5327): the ship still stops on it, and the next pre-detach joins that probe on
67
+ // this tree, or waits it out on a fixed one so its verdicts reach the cache and only the hunks the fix
68
+ // moved are probed again. A launch that failed or threw adds no note, and never fails the check.
69
+ async function is_rest_launched(): Promise<boolean> {
70
+ try {
71
+ const tree = await run_review_pinned_tree.key()
72
+
73
+ run_review_pinned_steps.clear()
74
+
75
+ return run_review_pinned_steps.launch_remaining(PROJECT_ROOT, tree).kind === 'launched'
76
+ } catch (error) {
77
+ error_text.trace_swallowed('run_ship_pre_detach_pinned.is_rest_launched', error)
78
+
79
+ return false
80
+ }
81
+ }
82
+
83
+ async function continued(answer: PinnedSummary): Promise<PinnedSummary> {
84
+ if (answer.is_cut !== true || !(await is_rest_launched())) return answer
85
+
86
+ return { ...answer, text: `${answer.text}${remaining_note(answer.remaining)}` }
87
+ }
88
+
89
+ // **The tree `run:review` checked is not checked twice** (joshuafolkken/kit#4888): its background
90
+ // check's answer is read, waited for while it still runs; only another tree, or a check that left no
91
+ // answer, runs one here. **A reason never judges a check that stopped at its first unpinned hunk**
92
+ // (joshuafolkken/kit#5153): the hunks it left are probed here before the reason accepts the list.
93
+ async function summary(reason: string | undefined): Promise<PinnedSummary> {
94
+ const answer = await run_review_pinned_join.answer_on_tree()
95
+ const is_whole = answer?.is_cut !== true || reason === undefined
96
+
97
+ return await continued(answer !== undefined && is_whole ? answer : await own_summary(reason))
98
+ }
99
+
100
+ // The verdicts an earlier probe left for this very tree, read from the cache without a probe
101
+ // (joshuafolkken/kit#5078); `undefined` when a hunk moved since, or the tree could not be read.
102
+ async function held_summary(): Promise<PinnedSummary | undefined> {
103
+ try {
104
+ const report = await test_pinned.held_report(test_pinned_logic.DEFAULT_MAX_HUNKS)
105
+
106
+ return report === undefined ? undefined : test_pinned_record.summary_of(report)
107
+ } catch (error) {
108
+ error_text.trace_swallowed('run_ship_pre_detach_pinned.held_summary', error)
109
+
110
+ return undefined
111
+ }
112
+ }
113
+
114
+ // **A re-ship with a new reason probes nothing the cache already answers** (joshuafolkken/kit#5078):
115
+ // the earlier probe's verdicts are judged under the reason, with no wait on a check elsewhere. A moved
116
+ // hunk falls to `summary`, whose run probes only the hunks the cache no longer holds.
117
+ async function summary_for(reason: string | undefined): Promise<PinnedSummary> {
118
+ const held = reason === undefined ? undefined : await held_summary()
119
+
120
+ return held ?? (await summary(reason))
121
+ }
122
+
123
+ // Whether the supervisor runs a fresh round 1, whose `run:review --join` lists and records the unpinned
124
+ // places under the reason. A reused round 1 — its delta left to round 2, or after the ship's own
125
+ // round 1 stopped, the lane's fix included — runs no `test:pinned` (`review-round-reuse.ts`). A question git could not answer probes.
126
+ async function is_listed_after_detach(number: string): Promise<boolean> {
127
+ try {
128
+ return !(await review_round_reuse.is_reusable_here(Number(number)))
129
+ } catch (error) {
130
+ error_text.trace_swallowed('run_ship_pre_detach_pinned.is_listed_after_detach', error)
131
+
132
+ return false
133
+ }
134
+ }
135
+
136
+ // **A reason accepts any answer, so no probe is waited on** (joshuafolkken/kit#4833) when a fresh
137
+ // round 1 lists the places after the detach.
138
+ async function pinned_check(options: CheckOptions): Promise<JoshResult> {
139
+ const reason = run_review_pinned.ok_reason_of(options.unpinned_ok)
140
+
141
+ if (reason !== undefined && (await is_listed_after_detach(options.number))) {
142
+ return { code: SUCCESS_EXIT_CODE, out: `${SKIPPED_NOTE}${reason}\n` }
143
+ }
144
+
145
+ const verdict = await run_review_pinned_accepted.judge(await summary_for(reason), reason)
146
+
147
+ return {
148
+ code: verdict.kind === 'stop' ? FAILURE_EXIT_CODE : SUCCESS_EXIT_CODE,
149
+ out: verdict.text,
150
+ }
151
+ }
152
+
153
+ // **A ship with no `--review` reads no background probe, so it stops the one left running**
154
+ // (joshuafolkken/kit#5327) rather than leave it holding cores unread. A clear that throws never fails
155
+ // the ship.
156
+ function cleared(): void {
157
+ try {
158
+ run_review_pinned_steps.clear()
159
+ } catch (error) {
160
+ error_text.trace_swallowed('run_ship_pre_detach_pinned.cleared', error)
161
+ }
162
+ }
163
+
164
+ // The pre-detach checks this ship runs, `test:pinned` among them under `--review`.
165
+ function checks_for(options: PinnedOptions): () => Promise<PreDetachResult> {
166
+ if (!options.is_review) {
167
+ return async () => {
168
+ cleared()
169
+
170
+ return await run_ship_pre_detach.checks()
171
+ }
172
+ }
173
+
174
+ return async () =>
175
+ await run_ship_pre_detach.checks(process.cwd(), check_reuse.DEFAULT_RECORDS, async () => {
176
+ return await pinned_check(options)
177
+ })
178
+ }
179
+
180
+ // **A reason an earlier run on this branch accepted is this ship's `--unpinned-ok`** when it gives
181
+ // none (joshuafolkken/kit#4974): the pre-detach check skips its probe under it, and the supervisor's
182
+ // round 1 and its relaunch carry it, so a place the record lacks is listed and recorded after the
183
+ // detach rather than stopping the ship there.
184
+ async function with_recorded_reason(args: ShipArguments): Promise<ShipArguments> {
185
+ if (!args.is_review || args.unpinned_ok.length > 0) return args
186
+
187
+ const reason = await run_review_pinned_accepted.recorded_reason()
188
+
189
+ if (reason === undefined) return args
190
+ console.info(`${CARRIED_NOTE}${reason}`)
191
+
192
+ return { ...args, unpinned_ok: [run_review_pinned.UNPINNED_OK_FLAG, reason] }
193
+ }
194
+
195
+ const run_ship_pre_detach_pinned = { checks_for, pinned_check, with_recorded_reason }
196
+
197
+ export { run_ship_pre_detach_pinned }
@@ -1,8 +1,7 @@
1
- import type { JoshResult } from '#scripts/josh/josh-run'
2
- import { lane_ledger } from '#scripts/lane/lane-ledger'
1
+ import { lane_ledger_write } from '#scripts/lane/lane-ledger-write'
3
2
  import { run_event_stream } from '#scripts/run/event/run-event-stream'
4
3
  import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
5
- import { run_ship_pre_detach } from './run-ship-pre-detach'
4
+ import { run_ship_pre_detach, type PreDetachResult } from './run-ship-pre-detach'
6
5
  import { run_ship_stage, type Phase } from './run-ship-stage'
7
6
 
8
7
  // The pre-detach checks, timed into the lane ledger and marked on the event stream as a ship stage
@@ -14,22 +13,22 @@ const SUCCESS_EXIT_CODE = 0
14
13
  const { PHASE } = run_ship_stage
15
14
 
16
15
  async function emit_phase(issue: string, phase: Phase): Promise<void> {
17
- const text = run_ship_stage.event_text(issue, lane_ledger.PRE_DETACH_STAGE, phase)
16
+ const text = run_ship_stage.event_text(issue, lane_ledger_write.PRE_DETACH_STAGE, phase)
18
17
 
19
18
  await run_event_stream_emit.emit(run_event_stream.EVENT_KIND.SHIP_STAGE, text)
20
19
  }
21
20
 
22
21
  async function checks(
23
22
  issue: string,
24
- run: () => Promise<JoshResult> = run_ship_pre_detach.checks,
25
- ): Promise<JoshResult> {
23
+ run: () => Promise<PreDetachResult> = run_ship_pre_detach.checks,
24
+ ): Promise<PreDetachResult> {
26
25
  await emit_phase(issue, PHASE.START)
27
26
  const started_ms = performance.now()
28
27
  const result = await run()
29
28
  const elapsed_ms = performance.now() - started_ms
30
29
 
31
- await lane_ledger.record_stage({
32
- stage: lane_ledger.PRE_DETACH_STAGE,
30
+ await lane_ledger_write.record_stage({
31
+ stage: lane_ledger_write.PRE_DETACH_STAGE,
33
32
  elapsed_ms,
34
33
  issue: Number(issue),
35
34
  })