@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,7 +1,7 @@
1
1
  // The pure decisions `josh run:review` makes, kept apart from the side effects the same way
2
2
  // `run-merge.ts` is kept apart from `run-merge-steps.ts`.
3
3
  //
4
- // `run:review` starts the gate in the background and prints the `/code-review` brief in one call, so a
4
+ // `run:review` starts the gate in the background and writes the `/code-review` brief in one call, so a
5
5
  // lane child launches both from a single command and the two overlap rather than running one after the
6
6
  // other. Two facts have to be decided from what the stamps say, and both are decided here so a test can
7
7
  // pin them without a gate ever running:
@@ -29,21 +29,37 @@ function adopt_verdict(is_gate_green: boolean): AdoptVerdict {
29
29
  const GATE_GREEN = 'green'
30
30
  const GATE_RUNNING = 'running'
31
31
  const GATE_RED = 'red'
32
+ const GATE_MOVED = 'moved'
32
33
 
33
- type GateState = typeof GATE_GREEN | typeof GATE_RUNNING | typeof GATE_RED
34
+ type GateState = typeof GATE_GREEN | typeof GATE_RUNNING | typeof GATE_RED | typeof GATE_MOVED
34
35
 
35
- // The three states the join waits on, decided from two readings the steps take of the stamps a real
36
- // `josh gate` writes: a green stamp covering this tree, and the in-flight marker's writer still alive.
36
+ // The four states the join waits on, decided from three readings the steps take of the stamps a real
37
+ // `josh gate` writes: a green stamp covering this tree, the in-flight marker's writer still alive, and
38
+ // a green stamp covering the tree this pair's gate started on.
37
39
  // Green wins over running, because a gate that has already recorded green is done however the marker
38
40
  // reads; a marker whose writer is gone with no green stamp is a gate that finished red or died, which
39
41
  // is the safe direction — the join reports red and the verdict is blocked.
40
- function gate_state(is_green: boolean, is_running: boolean): GateState {
42
+ //
43
+ // **A gate that finished green on a tree that has since moved is not red** (joshuafolkken/kit#4774): a
44
+ // round-1 reviewer fixing in place moves the tree after the gate recorded green, so the stamp no longer
45
+ // covers it. That is `moved` — still not adoptable, but the gate never failed, and the gate that
46
+ // follows re-runs on the moved tree.
47
+ function gate_state(is_green: boolean, is_running: boolean, is_moved = false): GateState {
41
48
  if (is_green) return GATE_GREEN
42
49
  if (is_running) return GATE_RUNNING
50
+ if (is_moved) return GATE_MOVED
43
51
 
44
52
  return GATE_RED
45
53
  }
46
54
 
55
+ // The `--join` exit code of a `moved` gate, read by `josh ship` (`run-ship-review-steps.ts`).
56
+ const MOVED_EXIT_CODE = 2
57
+ // The `--join` exit code of an unpinned change the background `test:pinned` found
58
+ // (joshuafolkken/kit#4770). `josh ship` never drains it, whatever the reviewer fixed.
59
+ const UNPINNED_EXIT_CODE = 3
60
+ // `josh ship` opens the interaction brief itself, so its `run:review` opens code's alone.
61
+ const CODE_ONLY_FLAG = '--code-only'
62
+
47
63
  function is_gate_settled(state: GateState): boolean {
48
64
  return state !== GATE_RUNNING
49
65
  }
@@ -100,9 +116,13 @@ function format_timing(timing: ReviewTiming): string {
100
116
  const run_review = {
101
117
  ADOPT,
102
118
  BLOCKED,
119
+ CODE_ONLY_FLAG,
103
120
  GATE_GREEN,
121
+ GATE_MOVED,
104
122
  GATE_RED,
105
123
  GATE_RUNNING,
124
+ MOVED_EXIT_CODE,
125
+ UNPINNED_EXIT_CODE,
106
126
  adopt_verdict,
107
127
  format_timing,
108
128
  gate_state,
@@ -115,4 +135,4 @@ export type { AdoptVerdict, GateState, ReviewTiming, TimingStart }
115
135
  // object their literal types widen to `string`, so a test passing `run_review.GATE_RED` to a
116
136
  // `GateState` parameter would not type-check — the same reason `run-liveness.ts` exports its verdicts
117
137
  // by name.
118
- export { GATE_GREEN, GATE_RED, GATE_RUNNING, run_review }
138
+ export { GATE_GREEN, GATE_MOVED, GATE_RED, GATE_RUNNING, run_review }
@@ -1,9 +1,7 @@
1
- import { CONTEXT_CUT_THRESHOLD } from '#scripts/cost-runtime/context-cut-threshold'
2
1
  import { cost_cli, type CostVerdict } from '#scripts/cost-runtime/cost-cli'
3
2
  import { cost_verdict } from '#scripts/cost-runtime/cost-verdict'
4
3
  import { hook_decision } from '#scripts/josh/hook-decision'
5
4
  import { error_text } from '#scripts/lib/error-message'
6
- import { figure_format } from '#scripts/lib/figure-format'
7
5
  import { implementation_cut_verdict } from '#scripts/rules/implementation-cut-verdict'
8
6
  import type { RunCarry } from '#scripts/run/carry/run-carry'
9
7
  import { run_headless } from './run-headless'
@@ -50,10 +48,11 @@ function current_state(): ParentCutState {
50
48
  }
51
49
  }
52
50
 
53
- const THRESHOLD_TEXT = `${figure_format.format_tokens(CONTEXT_CUT_THRESHOLD)}-token`
51
+ // Named by its command, never spelled: the threshold is priced at the session's own model.
52
+ const THRESHOLD_TEXT = '`pnpm josh cost --cut`'
54
53
 
55
54
  const PARENT_CUT_REASON =
56
- '⛔ backlogrun parent hand-off: this session drives a `backlogrun` and its recent-context cost ' +
55
+ '⛔ backlogrun parent hand-off: this session drives a `backlogrun` and its recent context ' +
57
56
  `crossed the ${THRESHOLD_TEXT} threshold between merges. Take the hand-off now: open no new lane, ` +
58
57
  'follow `backlogrun-progress.md` → "The hand-off" (`pnpm josh run:carry --cut --owner "$PPID"`, then ' +
59
58
  '`pnpm josh run:wake` unless `capped`) and end the turn. Reissue this call once done or if it ' +
@@ -109,6 +109,7 @@ const run_prep = {
109
109
  SUMMARY_PREFIX,
110
110
  format_report,
111
111
  ship_body,
112
+ summary,
112
113
  }
113
114
 
114
115
  export type { PrepParts }
@@ -1,4 +1,4 @@
1
- import { has_label_name, PLANNED_LABEL } from '#scripts/issue/issue-labels'
1
+ import { issue_state } from '#scripts/issue/issue-state'
2
2
  import { issue_state_cli, type StateRead } from '#scripts/issue/issue-state-cli'
3
3
  import { run_halfrun_resume } from './run-halfrun-resume'
4
4
  import { run_prrun_resume, type PrrunToken } from './run-prrun-resume'
@@ -23,10 +23,6 @@ function is_closed(read: StateRead): boolean {
23
23
  return read.kind === 'state' && read.state.state === CLOSED
24
24
  }
25
25
 
26
- function is_planned(read: StateRead): boolean {
27
- return read.kind === 'state' && has_label_name(read.state.labels, PLANNED_LABEL)
28
- }
29
-
30
26
  // The two stops are one hold record, so at most one is present; the `prrun` one is asked only when the
31
27
  // `halfrun` one is not, which spares its pull-request read.
32
28
  async function read_stop(
@@ -50,7 +46,7 @@ async function read_stage(issue: string): Promise<StageRead> {
50
46
  is_closed: is_closed(issue_read),
51
47
  is_prrun_stopped: stop.prrun_token !== undefined,
52
48
  is_halfrun_stopped: stop.is_halfrun_stopped,
53
- is_planned: is_planned(issue_read),
49
+ is_planned: issue_state.is_planned(issue_read),
54
50
  })
55
51
 
56
52
  return { state, prrun_token: stop.prrun_token }
@@ -14,6 +14,7 @@ import { run_prep, type PrepParts } from './run-prep'
14
14
  import { run_prep_cli } from './run-prep-cli'
15
15
  import { run_retrospective } from './run-retrospective'
16
16
  import { run_step, type ParentInput, type StepInput } from './run-step'
17
+ import { run_step_lane_plan } from './run-step-lane-plan'
17
18
  import { run_step_section } from './run-step-section'
18
19
 
19
20
  // `josh run:step [<N>]` — print the run's next single action, followed by the section that governs it
@@ -165,11 +166,22 @@ async function run_parent(): Promise<number> {
165
166
  return FAILURE_EXIT_CODE
166
167
  }
167
168
 
168
- function report({ input, ship_problems }: Gathered): number {
169
+ // The action line, then — under `implement` — the `lane:plan` a lane child runs before its first edit.
170
+ // Only `implement` reads it, so no other step pays for the plan comment's request.
171
+ async function action_lines(input: StepInput, line: string): Promise<ReadonlyArray<string>> {
172
+ if (line !== run_step.IMPLEMENT) return [line]
173
+ const next = await run_step_lane_plan.line_for(input.issue_number, input.is_lane_child)
174
+
175
+ return next === undefined ? [line] : [line, next]
176
+ }
177
+
178
+ async function report({ input, ship_problems }: Gathered): Promise<number> {
169
179
  const action = run_step.next_action(input)
170
180
 
171
- console.info(action.line)
172
- // On stderr, so stdout stays the action line and its rule: what `josh ship` would
181
+ const lines = await action_lines(input, action.line)
182
+
183
+ for (const line of lines) console.info(line)
184
+ // On stderr, so stdout stays the action lines and their rule: what `josh ship` would
173
185
  // refuse on is said at every step, while it is still cheap to meet.
174
186
  if (ship_problems.length > 0) console.error(run_prep.ship_body(ship_problems))
175
187
 
@@ -177,7 +189,7 @@ function report({ input, ship_problems }: Gathered): number {
177
189
  // same failure, so a position missing its issue state is never read as a confident next step.
178
190
  if (input.state === undefined) return FAILURE_EXIT_CODE
179
191
 
180
- return run_step_section.print_for(action)
192
+ return run_step_section.print_for(action, input.is_lane_child)
181
193
  }
182
194
 
183
195
  async function run(argv: ReadonlyArray<string>): Promise<number> {
@@ -191,7 +203,7 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
191
203
  return FAILURE_EXIT_CODE
192
204
  }
193
205
 
194
- return report(await gather(issue_number))
206
+ return await report(await gather(issue_number))
195
207
  }
196
208
 
197
209
  async function main(argv: ReadonlyArray<string>): Promise<void> {
@@ -0,0 +1,27 @@
1
+ import { backlog_plan_comment } from '#scripts/backlog/backlog-plan-comment'
2
+ import { lane_plan } from '#scripts/lane/lane-plan'
3
+ import { shell_quote } from '#scripts/lib/shell-quote'
4
+
5
+ // The `lane:plan` command a lane child runs before its first edit — `lane-plan-guard.ts` refuses that
6
+ // edit until the plan is cleared. joshuafolkken/kit#4910's child retried a refused Edit eight times
7
+ // before it ran `lane:plan`, since nothing it read named the step first (joshuafolkken/kit#4923).
8
+ // The paths are its plan comment's; with none, the child names its own.
9
+
10
+ const PATH_PLACEHOLDER = '<path>...'
11
+
12
+ // The command to print under `implement`, or `undefined` when not a lane child or its plan is cleared.
13
+ async function line_for(issue_number: string, is_lane_child: boolean): Promise<string | undefined> {
14
+ const issue = Number(issue_number)
15
+
16
+ if (!is_lane_child || !lane_plan.is_uncleared(issue, process.cwd())) return undefined
17
+
18
+ const paths = await backlog_plan_comment.plan_paths(issue)
19
+ const named =
20
+ paths.length === 0 ? PATH_PLACEHOLDER : paths.map((path) => shell_quote.word(path)).join(' ')
21
+
22
+ return `pnpm josh lane:plan ${issue_number} ${named}`
23
+ }
24
+
25
+ const run_step_lane_plan = { line_for }
26
+
27
+ export { run_step_lane_plan }
@@ -27,7 +27,8 @@ function reference(document: string, heading: string): SectionReference {
27
27
  }
28
28
 
29
29
  // The gate's chain governs both the implementation it follows and a stopped ship's report.
30
- const CHAIN = reference('chain-rule.md', 'Run the review-to-merge chain')
30
+ const CHAIN_RULE = 'chain-rule.md'
31
+ const CHAIN = reference(CHAIN_RULE, 'Run the review-to-merge chain')
31
32
  const PROGRESS = 'backlogrun-progress.md'
32
33
 
33
34
  // Keyed on a verdict token, or on the josh subcommand a command action runs. An action with no row —
@@ -47,6 +48,17 @@ const GOVERNING_SECTIONS: ReadonlyMap<string, SectionReference> = new Map([
47
48
  ['run:carry', reference(PROGRESS, 'The hand-off')],
48
49
  ])
49
50
 
51
+ // **A lane child reads its own step of the chain, never the whole of it** (joshuafolkken/kit#5016):
52
+ // the chain's step 1 opens with `josh main:merge`, which a lane child leaves to ship's sync, and a
53
+ // child handed the whole section ran it, moving the tree its scoped pair was green on. The step is
54
+ // the chain's labelled step 0, cited where it stands, so it is written once; it ends at the sibling
55
+ // item `1.`, so a blank line inside it would cut it short. A stopped ship's report reads it too.
56
+ const LANE_CHILD_STEP = reference(CHAIN_RULE, 'A lane child')
57
+ const LANE_CHILD_SECTIONS: ReadonlyMap<string, SectionReference> = new Map([
58
+ [run_step.IMPLEMENT, LANE_CHILD_STEP],
59
+ ['ship', LANE_CHILD_STEP],
60
+ ])
61
+
50
62
  function key_of(action: StepAction): string {
51
63
  if (action.kind !== 'command') return action.line
52
64
 
@@ -55,27 +67,34 @@ function key_of(action: StepAction): string {
55
67
  return subcommand
56
68
  }
57
69
 
58
- function section_for(key: string): SectionReference | undefined {
59
- return GOVERNING_SECTIONS.get(key)
70
+ function section_for(key: string, is_lane_child: boolean): SectionReference | undefined {
71
+ const lane_child_section = is_lane_child ? LANE_CHILD_SECTIONS.get(key) : undefined
72
+
73
+ return lane_child_section ?? GOVERNING_SECTIONS.get(key)
60
74
  }
61
75
 
62
76
  // Printed through `doc:section` itself, so the extent, the Bash-cap split and the refusal of an
63
77
  // unresolved heading are that command's, never a second copy of them.
64
- function print_section(key: string, root: string = process.cwd()): number {
65
- const found = section_for(key)
78
+ function print_section(key: string, root: string = process.cwd(), is_lane_child = false): number {
79
+ const found = section_for(key, is_lane_child)
66
80
 
67
81
  if (found === undefined) return SUCCESS_EXIT_CODE
68
82
 
69
83
  return document_section_cli.run([found.document, found.heading], root)
70
84
  }
71
85
 
72
- function print_for(action: StepAction, root: string = process.cwd()): number {
73
- return print_section(key_of(action), root)
86
+ function print_for(
87
+ action: StepAction,
88
+ is_lane_child = false,
89
+ root: string = process.cwd(),
90
+ ): number {
91
+ return print_section(key_of(action), root, is_lane_child)
74
92
  }
75
93
 
76
94
  const run_step_section = {
77
95
  ENTRY,
78
96
  GOVERNING_SECTIONS,
97
+ LANE_CHILD_SECTIONS,
79
98
  key_of,
80
99
  print_for,
81
100
  print_section,
@@ -156,10 +156,13 @@ const KIND = run_event_stream.EVENT_KIND
156
156
  const OFFER_BACKLOG = 'pnpm josh backlog:next'
157
157
  const EVENT_ACTIONS: Record<string, (issue_number: string) => StepAction> = {
158
158
  [KIND.PR_OPENED]: () => command('pnpm josh followup'),
159
- [KIND.REVIEW_ROUND]: () => command('pnpm josh review:round2'),
159
+ [KIND.REVIEW_ROUND]: (issue_number) =>
160
+ command(`pnpm josh review:round2 --record ${issue_number}`),
160
161
  [KIND.MERGE]: merge_command,
161
162
  [KIND.OUTAGE]: merge_command,
162
163
  [KIND.PARK]: () => command(OFFER_BACKLOG),
164
+ // The child was released; `backlog:drive` holds the next launch until the limit resets.
165
+ [KIND.USAGE_LIMIT]: () => command(OFFER_BACKLOG),
163
166
  [KIND.CUT]: (issue_number) => command(`pnpm josh run:cut --resume ${issue_number}`),
164
167
  // A stall is undispatched ready work with a free lane, so its next step is exactly a park's: offer
165
168
  // the backlog. The detector only reports the stall; reading it here as a dispatch is what turns the
@@ -177,7 +180,7 @@ const EVENT_ACTIONS: Record<string, (issue_number: string) => StepAction> = {
177
180
  // budget command — a child that ran it would read the `busy` it got back as a competing session and
178
181
  // park its Issue unimplemented. A merge or an outage is the parent's to classify, so a child at one
179
182
  // has nothing to run and stops rather than being handed `run:merge`.
180
- const PARENT_ONLY_EVENTS: ReadonlySet<string> = new Set([KIND.MERGE, KIND.OUTAGE])
183
+ const PARENT_ONLY_EVENTS: ReadonlySet<string> = new Set([KIND.MERGE, KIND.OUTAGE, KIND.USAGE_LIMIT])
181
184
 
182
185
  // A stopped run's last owed step is the end-of-run retrospective. When it is not owed the position stops
183
186
  // with no command to run.
@@ -21,6 +21,7 @@ const TRAILING_ISSUE_PATTERN = /#([1-9]\d*)\s*$/u
21
21
  // shell-body-safe `--notify-message-file` a body naming a command or path must use (`followup.md`).
22
22
  const NOTIFY_OPTIONS = ['notify-message', 'notify-message-file'] as const
23
23
  const { BODY_FILE_OPTION, body_arguments } = run_ship_body_draft
24
+ const UNPINNED_OK_OPTION = 'unpinned-ok'
24
25
 
25
26
  type NotifyValues = Partial<Record<(typeof NOTIFY_OPTIONS)[number], string>>
26
27
 
@@ -35,6 +36,8 @@ const OPTIONS = {
35
36
  detach: { type: 'boolean' },
36
37
  log: { type: 'string' },
37
38
  cite: { type: 'string', multiple: true },
39
+ // Forwarded to round 1's `run:review`, the only way past a change no test can pin under `--review`.
40
+ [UNPINNED_OK_OPTION]: { type: 'string' },
38
41
  } as const
39
42
 
40
43
  type ShipCommand = { kind: 'ship'; args: ShipArguments } | { kind: 'log'; number: string }
@@ -59,6 +62,20 @@ interface ParsedValues extends NotifyValues {
59
62
  detach?: boolean
60
63
  log?: string
61
64
  cite?: Array<string>
65
+ [UNPINNED_OK_OPTION]?: string
66
+ }
67
+
68
+ function unpinned_arguments(reason: string | undefined): ReadonlyArray<string> {
69
+ return reason === undefined ? [] : [`--${UNPINNED_OK_OPTION}`, reason]
70
+ }
71
+
72
+ // `--unpinned-ok` answers round 1's `run:review` alone, so without `--review` or with a blank reason it
73
+ // would reach nothing that reads it — refused here rather than after the earlier stages have run.
74
+ function is_stray_unpinned_ok(values: ParsedValues): boolean {
75
+ const reason = values[UNPINNED_OK_OPTION]
76
+ if (reason === undefined) return false
77
+
78
+ return values.review !== true || reason.trim() === ''
62
79
  }
63
80
 
64
81
  // A follow-up citation passed as a trailing positional is a bare issue number, so a stray flag is
@@ -84,6 +101,7 @@ function ship_args(
84
101
  cites,
85
102
  is_review: values.review === true,
86
103
  is_detach: values.detach === true,
104
+ unpinned_ok: unpinned_arguments(values[UNPINNED_OK_OPTION]),
87
105
  }
88
106
  }
89
107
 
@@ -99,6 +117,7 @@ function command_of(
99
117
  positionals: ReadonlyArray<string>,
100
118
  ): ShipCommand | undefined {
101
119
  if (values.log !== undefined) return log_command(values.log, positionals)
120
+ if (is_stray_unpinned_ok(values)) return undefined
102
121
 
103
122
  const title = positionals[FIRST]
104
123
  const args =
@@ -0,0 +1,106 @@
1
+ import { stamp_file } from '#scripts/josh/stamp-file'
2
+ import {
3
+ lane_session_action,
4
+ type BrokerAnswer,
5
+ type ReviewRound,
6
+ } from '#scripts/lane/lane-session-action'
7
+ import { lane_session_broker } from '#scripts/lane/lane-session-broker'
8
+ import { review_attest, type ReviewSlot } from '#scripts/review/review-attest'
9
+
10
+ // A lane child's reviewers started by the lane's broker (`run-ship-reviewer.ts`). `/code-review` alone
11
+ // omits `slots`, so a broker still on the code before them reads the request.
12
+ //
13
+ // **A broker that cannot read `slots` still reviews every slot**: the supervisor reloads on new code
14
+ // only at its next pass boundary (`run-wake-code.ts`), so the ship that first runs both reviews together
15
+ // meets a broker that never learned them (joshuafolkken/kit#4672). Each slot then goes in turn as a
16
+ // `/code-review` request — its brief staged at the code slot's file, its findings moved to its own — and
17
+ // the code slot goes last, with its own brief put back.
18
+
19
+ const { CODE } = review_attest.REVIEW_SLOT
20
+
21
+ function copy_stamp(source: string, target: string): void {
22
+ const text = stamp_file.read_stamp_text(source)
23
+
24
+ if (text !== undefined) stamp_file.write_text_stamp(target, text)
25
+ }
26
+
27
+ async function code_request(
28
+ directory: string,
29
+ issue: string,
30
+ round: ReviewRound,
31
+ ): Promise<BrokerAnswer> {
32
+ return await lane_session_broker.request(directory, issue, { kind: 'review', round })
33
+ }
34
+
35
+ async function staged_review(
36
+ directory: string,
37
+ issue: string,
38
+ round: ReviewRound,
39
+ slot: ReviewSlot,
40
+ ): Promise<BrokerAnswer> {
41
+ const code = lane_session_broker.review_paths(directory)
42
+ const own = lane_session_broker.review_paths(directory, slot)
43
+
44
+ copy_stamp(own.brief, code.brief)
45
+ const answer = await code_request(directory, issue, round)
46
+
47
+ copy_stamp(code.findings, own.findings)
48
+ stamp_file.remove_stamp(code.findings)
49
+
50
+ return answer
51
+ }
52
+
53
+ // One after another, since every slot shares the code slot's files.
54
+ async function staged_reviews(
55
+ directory: string,
56
+ issue: string,
57
+ round: ReviewRound,
58
+ slots: ReadonlyArray<ReviewSlot>,
59
+ ): Promise<ReadonlyArray<BrokerAnswer>> {
60
+ const [slot, ...rest] = slots
61
+ if (slot === undefined) return []
62
+
63
+ const answer = await staged_review(directory, issue, round, slot)
64
+
65
+ return [answer, ...(await staged_reviews(directory, issue, round, rest))]
66
+ }
67
+
68
+ async function in_turn(
69
+ directory: string,
70
+ issue: string,
71
+ round: ReviewRound,
72
+ slots: ReadonlyArray<ReviewSlot>,
73
+ ): Promise<BrokerAnswer> {
74
+ const code_brief = lane_session_broker.review_paths(directory).brief
75
+ const kept = stamp_file.read_stamp_text(code_brief)
76
+ const others = slots.filter((slot) => slot !== CODE)
77
+ const answers = [...(await staged_reviews(directory, issue, round, others))]
78
+
79
+ if (kept !== undefined) stamp_file.write_text_stamp(code_brief, kept)
80
+ if (slots.includes(CODE)) answers.push(await code_request(directory, issue, round))
81
+
82
+ return answers.find((answer) => !answer.is_success) ?? lane_session_action.SUCCESS
83
+ }
84
+
85
+ async function request(
86
+ directory: string,
87
+ issue: string,
88
+ round: ReviewRound,
89
+ slots: ReadonlyArray<ReviewSlot>,
90
+ ): Promise<BrokerAnswer> {
91
+ if (slots.length === 1 && slots[0] === CODE) return await code_request(directory, issue, round)
92
+
93
+ const answer = await lane_session_broker.request(directory, issue, {
94
+ kind: 'review',
95
+ round,
96
+ slots,
97
+ })
98
+
99
+ if (!lane_session_broker.is_unreadable(answer)) return answer
100
+
101
+ return await in_turn(directory, issue, round, slots)
102
+ }
103
+
104
+ const run_ship_brokered_review = { request }
105
+
106
+ export { run_ship_brokered_review }