@joshuafolkken/kit 1.1784.0 → 1.2116.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (690) hide show
  1. package/.claude/agents/reviewer-verification.md +19 -0
  2. package/.claude/agents/reviewer.md +19 -0
  3. package/.claude/settings.json +5 -6
  4. package/.claude/skills/dependency-update/SKILL.md +9 -10
  5. package/.claude/skills/workflow-commands/SKILL.md +6 -6
  6. package/.claude/skills/workflow-commands/background-commands.md +8 -5
  7. package/.claude/skills/workflow-commands/backlogrun-child.md +3 -1
  8. package/.claude/skills/workflow-commands/backlogrun-lanes.md +1 -1
  9. package/.claude/skills/workflow-commands/backlogrun-park.md +5 -2
  10. package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -3
  11. package/.claude/skills/workflow-commands/backlogrun-recovery.md +1 -1
  12. package/.claude/skills/workflow-commands/backlogrun-steps.md +3 -2
  13. package/.claude/skills/workflow-commands/backlogrun.md +1 -1
  14. package/.claude/skills/workflow-commands/chain-rule.md +41 -32
  15. package/.claude/skills/workflow-commands/delegation.md +6 -6
  16. package/.claude/skills/workflow-commands/entry-sequence.md +2 -2
  17. package/.claude/skills/workflow-commands/followup.md +7 -5
  18. package/.claude/skills/workflow-commands/fullrun-steps.md +6 -6
  19. package/.claude/skills/workflow-commands/fullrun.md +1 -1
  20. package/.claude/skills/workflow-commands/issue-comments.md +9 -4
  21. package/.claude/skills/workflow-commands/issue-fold-existing.md +2 -1
  22. package/.claude/skills/workflow-commands/kickoff.md +2 -2
  23. package/.claude/skills/workflow-commands/observation-filing.md +1 -1
  24. package/.claude/skills/workflow-commands/observation-ledger.md +6 -4
  25. package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -7
  26. package/.claude/skills/workflow-commands/prerequisite.md +3 -2
  27. package/.claude/skills/workflow-commands/retrospective.md +2 -2
  28. package/.claude/skills/workflow-commands/split-assessment.md +7 -5
  29. package/.codex/hooks.json +5 -5
  30. package/.github/actions/setup-pnpm/action.yml +9 -16
  31. package/.github/dependabot.yml +16 -0
  32. package/.github/workflows/auto-tag.yml +45 -0
  33. package/.github/workflows/ci.yml +155 -15
  34. package/.github/workflows/dependabot-auto-merge.yml +63 -4
  35. package/.github/workflows/production.yml +8 -0
  36. package/.github/workflows/publish.yml +60 -45
  37. package/.vscode/settings.json +19 -0
  38. package/CLAUDE.md +5 -12
  39. package/SECURITY.md +2 -2
  40. package/dist/CLAUDE.md +5 -12
  41. package/dist/commands/document-read-cli.js +2 -1
  42. package/dist/commands/document-section-main.js +2 -1
  43. package/dist/commands/read-set-cli.js +194 -134
  44. package/dist/commands/run-prep-main.js +9694 -10173
  45. package/dist/commands/run-step-cli.js +22138 -18285
  46. package/dist/hooks/audit-provision.js +23 -5
  47. package/dist/hooks/chunk-3GKE653K.js +6204 -0
  48. package/dist/hooks/chunk-45CJJOO7.js +1243 -0
  49. package/dist/hooks/{chunk-CWMBGKYW.js → chunk-5PM2JRGV.js} +2153 -856
  50. package/dist/hooks/{chunk-WR2KQAYZ.js → chunk-7SIUNQXK.js} +1207 -1470
  51. package/dist/hooks/{chunk-O2YBIDSI.js → chunk-CQD4LJE6.js} +1682 -1130
  52. package/dist/hooks/{chunk-VWWCFGWK.js → chunk-OPSRGWFU.js} +1 -1
  53. package/dist/hooks/{chunk-XGBNSWEI.js → chunk-UJ3FPMMM.js} +132 -49
  54. package/dist/hooks/chunk-VVNYJWEI.js +30 -0
  55. package/dist/hooks/chunk-Z6DQJKH3.js +2806 -0
  56. package/dist/hooks/codex-hook-adapter.js +8 -8
  57. package/dist/hooks/format-edited.js +4 -5
  58. package/dist/hooks/inputs.json +386 -360
  59. package/dist/hooks/pretool-guard.js +7 -6
  60. package/dist/hooks/session-lang.js +101 -258
  61. package/dist/hooks/stop-guard.js +1744 -2576
  62. package/dist/josh.js +7133 -6368
  63. package/dist/version/index.js +161 -1
  64. package/eslint/rules/comment-why-only.js +108 -0
  65. package/package.json +16 -9
  66. package/prompts/coding-standards.md +1 -1
  67. package/prompts/collaboration-workflow/file-edits.md +14 -11
  68. package/prompts/collaboration-workflow/issue-citation.md +0 -4
  69. package/prompts/collaboration-workflow/issue-template.md +40 -21
  70. package/prompts/collaboration-workflow/lane-instructions.md +3 -1
  71. package/prompts/collaboration-workflow/measurement.md +8 -1
  72. package/prompts/collaboration-workflow/operating-rules.md +11 -2
  73. package/prompts/collaboration-workflow/output-bounds.md +6 -2
  74. package/prompts/collaboration-workflow/plan-comment.md +1 -1
  75. package/prompts/collaboration-workflow/principles.md +9 -0
  76. package/prompts/collaboration-workflow/residency.md +3 -2
  77. package/prompts/collaboration-workflow/rule-delivery.md +13 -1
  78. package/prompts/collaboration-workflow/upstream-interrupt.md +2 -2
  79. package/prompts/collaboration-workflow/wip-cap.md +3 -1
  80. package/prompts/review-rubric.md +8 -0
  81. package/prompts/review.md +31 -22
  82. package/prompts/testing-guide.md +1 -0
  83. package/scripts/agent/agent-argv.ts +14 -16
  84. package/scripts/agent/agent-provider.ts +138 -0
  85. package/scripts/agent/agent-role-profile.ts +108 -156
  86. package/scripts/agent/agent-safe-text.ts +20 -5
  87. package/scripts/agent/api-usage-limit.ts +65 -0
  88. package/scripts/agent/claude-agent-argv.ts +19 -9
  89. package/scripts/agent/codex-agent-argv.ts +118 -22
  90. package/scripts/agent/usage-limit-reset.ts +179 -0
  91. package/scripts/auth/claude-token-output.ts +2 -2
  92. package/scripts/auto-ok/auto-ok-author.ts +53 -0
  93. package/scripts/auto-ok/auto-ok-cli.ts +20 -9
  94. package/scripts/backlog/backlog-defect-priority.ts +1 -1
  95. package/scripts/backlog/backlog-drive-cli.ts +6 -1
  96. package/scripts/backlog/backlog-drive-hold.ts +3 -3
  97. package/scripts/backlog/backlog-drive-idle.ts +10 -0
  98. package/scripts/backlog/backlog-drive-launch-pass.ts +90 -0
  99. package/scripts/backlog/backlog-drive-launch.ts +8 -2
  100. package/scripts/backlog/backlog-drive-named-offer.ts +73 -30
  101. package/scripts/backlog/backlog-drive-named.ts +28 -7
  102. package/scripts/backlog/backlog-drive-paused.ts +5 -4
  103. package/scripts/backlog/backlog-drive-restore.ts +11 -3
  104. package/scripts/backlog/backlog-drive.ts +21 -60
  105. package/scripts/backlog/backlog-gate-scope.ts +61 -0
  106. package/scripts/backlog/backlog-measure-close.ts +112 -0
  107. package/scripts/backlog/backlog-next.ts +39 -49
  108. package/scripts/backlog/backlog-occupied.ts +2 -2
  109. package/scripts/backlog/backlog-overlap.ts +42 -8
  110. package/scripts/backlog/backlog-plan-cli.ts +4 -1
  111. package/scripts/backlog/backlog-plan-comment.ts +81 -0
  112. package/scripts/backlog/backlog-plan-read.ts +19 -6
  113. package/scripts/backlog/backlog-pool.ts +50 -12
  114. package/scripts/backlog/backlog-rank.ts +60 -13
  115. package/scripts/backlog/backlog-stalled-detect.ts +2 -1
  116. package/scripts/backlog/backlog-waves.ts +17 -2
  117. package/scripts/backlog/backlogrun-launch.ts +7 -4
  118. package/scripts/cost-runtime/context-cut-payback.ts +27 -25
  119. package/scripts/cost-runtime/cost-cli.ts +37 -16
  120. package/scripts/cost-runtime/cost-pricing.ts +9 -0
  121. package/scripts/cost-runtime/cost-verdict.ts +4 -1
  122. package/scripts/delegation/delegation-policy.ts +2 -2
  123. package/scripts/delegation/duplicate-read-guard.ts +1 -0
  124. package/scripts/delegation/investigation-guard.ts +14 -2
  125. package/scripts/delegation/investigation-reads.ts +45 -23
  126. package/scripts/dependabot/dependabot-cooldown.ts +3 -2
  127. package/scripts/discovery/repo-party.ts +80 -20
  128. package/scripts/discovery/session-owner-pin.ts +51 -0
  129. package/scripts/document/capped-print.ts +1 -1
  130. package/scripts/document/command-reference-line-budget.ts +42 -0
  131. package/scripts/document/document-byte-budget.ts +17 -7
  132. package/scripts/document/document-checks.ts +20 -0
  133. package/scripts/document/document-ratchet-check.ts +101 -0
  134. package/scripts/document/document-section.ts +1 -0
  135. package/scripts/document/entry-read-budget.ts +7 -3
  136. package/scripts/document/issue-citation-budget.ts +94 -0
  137. package/scripts/epic/epic-cli-argv.ts +2 -2
  138. package/scripts/epic/epic-fetch.ts +4 -2
  139. package/scripts/epic/epic-graph.ts +7 -2
  140. package/scripts/epic/epic-issue.ts +3 -1
  141. package/scripts/epic/epic-rank.ts +5 -0
  142. package/scripts/exports/unused-members-check.ts +62 -0
  143. package/scripts/exports/unused-members-cli.ts +6 -51
  144. package/scripts/followup/followup-ci-path.ts +67 -0
  145. package/scripts/followup/followup-coderabbit-retrigger.ts +261 -0
  146. package/scripts/followup/followup-coderabbit-wait.ts +13 -10
  147. package/scripts/followup/followup-failed-tests.ts +160 -0
  148. package/scripts/followup/followup-job-needs.ts +100 -0
  149. package/scripts/followup/followup-job-rerun.ts +303 -0
  150. package/scripts/followup/followup-main-move.ts +113 -0
  151. package/scripts/followup/git-followup-finish.ts +43 -11
  152. package/scripts/followup/git-followup-pending.ts +3 -3
  153. package/scripts/followup/git-followup-stages.ts +41 -11
  154. package/scripts/followup/git-pr-followup-checks.ts +55 -16
  155. package/scripts/followup/git-pr-followup-wrapup.ts +24 -5
  156. package/scripts/followup/git-pr-followup.ts +62 -27
  157. package/scripts/fresh-machine/fresh-machine-script.ts +5 -9
  158. package/scripts/fresh-machine/specs/kit-test-backlogrun-python.json +2 -2
  159. package/scripts/fresh-machine/specs/kit-test-backlogrun.json +2 -2
  160. package/scripts/gate/busy-average.ts +34 -2
  161. package/scripts/gate/check-related-pinned.ts +43 -0
  162. package/scripts/gate/check-related-reuse.ts +64 -0
  163. package/scripts/gate/check-related-section.ts +57 -0
  164. package/scripts/gate/check-related-unplanned.ts +34 -0
  165. package/scripts/gate/check-related.ts +265 -0
  166. package/scripts/gate/command-memory.ts +1 -1
  167. package/scripts/gate/core-admission.ts +24 -6
  168. package/scripts/gate/core-budget-timing.ts +20 -6
  169. package/scripts/gate/core-budget.ts +40 -11
  170. package/scripts/gate/core-wait-record.ts +3 -2
  171. package/scripts/gate/core-wait.ts +25 -2
  172. package/scripts/gate/core-weights.ts +15 -7
  173. package/scripts/gate/gate-labels.ts +46 -0
  174. package/scripts/gate/gate-ledger.ts +14 -6
  175. package/scripts/gate/gate-plan.ts +103 -58
  176. package/scripts/gate/gate-report.ts +9 -7
  177. package/scripts/gate/gate-run-steps.ts +26 -3
  178. package/scripts/gate/gate-skip.ts +45 -6
  179. package/scripts/gate/gate-static-group.ts +60 -0
  180. package/scripts/gate/gate-steps.ts +2 -1
  181. package/scripts/gate/gate-tree.ts +4 -2
  182. package/scripts/gate/hook-gate-reuse.ts +19 -2
  183. package/scripts/gate/metrics-totals.ts +59 -0
  184. package/scripts/gate/scoped-green.ts +68 -15
  185. package/scripts/gate/since-green.ts +14 -6
  186. package/scripts/gate/structural-checks.ts +96 -0
  187. package/scripts/gate/verification-gate.ts +51 -16
  188. package/scripts/gate/verification-inputs.ts +21 -6
  189. package/scripts/gate/verification-tail.ts +52 -0
  190. package/scripts/gh/gh-author-association.ts +23 -2
  191. package/scripts/gh/git-ai-review-scan.ts +1 -1
  192. package/scripts/gh/git-gh-api-path.ts +12 -3
  193. package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
  194. package/scripts/gh/git-gh-exec.ts +32 -2
  195. package/scripts/gh/git-gh-issue-read.ts +4 -2
  196. package/scripts/gh/git-gh-issue-rest.ts +1 -0
  197. package/scripts/gh/git-gh-issue-write.ts +8 -2
  198. package/scripts/gh/git-gh-issue.ts +12 -5
  199. package/scripts/gh/git-gh-pr-auto-merge.ts +13 -6
  200. package/scripts/gh/git-gh-pr-graphql-state.ts +56 -0
  201. package/scripts/gh/git-gh-pr-read.ts +74 -13
  202. package/scripts/gh/git-gh-pr-rest.ts +3 -1
  203. package/scripts/gh/git-gh-pr-snapshot.ts +22 -7
  204. package/scripts/gh/git-gh-pr-too-large.ts +20 -0
  205. package/scripts/gh/git-gh-pr.ts +21 -7
  206. package/scripts/gh/git-gh-retry.ts +141 -0
  207. package/scripts/gh/git-pr-ai-review.ts +15 -6
  208. package/scripts/gh/git-pr-checks-eval.ts +3 -0
  209. package/scripts/gh/git-pr-checks.ts +5 -5
  210. package/scripts/git/base-tree.ts +30 -0
  211. package/scripts/git/change-base.ts +4 -10
  212. package/scripts/git/changed-paths-sync.ts +63 -0
  213. package/scripts/git/changed-paths.ts +16 -1
  214. package/scripts/git/git-common-directory.ts +11 -1
  215. package/scripts/git/git-diff-reads.ts +66 -20
  216. package/scripts/git/git-error.ts +9 -2
  217. package/scripts/git/git-schemas.ts +13 -0
  218. package/scripts/git/git-worktree.ts +13 -0
  219. package/scripts/git/gone-branch.ts +4 -1
  220. package/scripts/git/main-merge-budget-conflict.ts +89 -0
  221. package/scripts/git/main-merge-guard.ts +55 -18
  222. package/scripts/git/main-merge-regenerate.ts +59 -25
  223. package/scripts/git/main-merge.ts +53 -5
  224. package/scripts/git/no-base-checkout.ts +127 -0
  225. package/scripts/git/stash/git-stash.ts +11 -2
  226. package/scripts/git/stash/stash-push-cli.ts +10 -0
  227. package/scripts/hooks/batch-guard.ts +40 -21
  228. package/scripts/hooks/edited-cspell.ts +37 -11
  229. package/scripts/hooks/format-edited-file.ts +22 -2
  230. package/scripts/hooks/lane-plan-guard.ts +50 -0
  231. package/scripts/hooks/pre-commit-lint-switch.ts +9 -0
  232. package/scripts/hooks/pre-commit-lint.ts +14 -1
  233. package/scripts/hooks/pre-push-related-switch.ts +10 -0
  234. package/scripts/hooks/pre-push-unit.ts +76 -10
  235. package/scripts/hooks/pretool-guard.ts +2 -0
  236. package/scripts/hooks/reserved-run.ts +14 -1
  237. package/scripts/hooks/run-hook.sh +23 -8
  238. package/scripts/hooks/step-zero-notice.ts +6 -1
  239. package/scripts/hooks/stop-actions.ts +3 -15
  240. package/scripts/hooks/stop-guard.ts +7 -6
  241. package/scripts/init/distributed-paths.ts +1 -0
  242. package/scripts/init/hook-command-rewrite.ts +5 -1
  243. package/scripts/init/hook-launch.ts +4 -2
  244. package/scripts/issue/aggregation-split.ts +52 -0
  245. package/scripts/issue/defect-origin-line.ts +19 -1
  246. package/scripts/issue/defect-rate-cli.ts +5 -102
  247. package/scripts/issue/defect-report.ts +4 -4
  248. package/scripts/issue/effect-audit-cli.ts +178 -0
  249. package/scripts/issue/effect-audit.ts +185 -0
  250. package/scripts/issue/expected-effect-lint.ts +64 -9
  251. package/scripts/issue/git-next-issues.ts +5 -0
  252. package/scripts/issue/issue-body-or-comment.ts +38 -4
  253. package/scripts/issue/issue-cite-cli.ts +1 -3
  254. package/scripts/issue/issue-classification.ts +1 -0
  255. package/scripts/issue/issue-closing-pr.ts +8 -1
  256. package/scripts/issue/issue-evidence-exit.ts +4 -2
  257. package/scripts/issue/issue-file-cap.ts +58 -0
  258. package/scripts/issue/issue-file-cli.ts +111 -38
  259. package/scripts/issue/issue-file-deferral.ts +52 -0
  260. package/scripts/issue/issue-file-fold.ts +29 -10
  261. package/scripts/issue/issue-file-interrupt.ts +85 -0
  262. package/scripts/issue/issue-file-lane-hint.ts +30 -0
  263. package/scripts/issue/issue-file.ts +43 -6
  264. package/scripts/issue/issue-labels.ts +19 -2
  265. package/scripts/issue/issue-lint-cli.ts +27 -2
  266. package/scripts/issue/issue-measured-cli.ts +13 -35
  267. package/scripts/issue/issue-measured-close.ts +58 -0
  268. package/scripts/issue/issue-not-before-label.ts +2 -2
  269. package/scripts/issue/issue-not-before.ts +4 -1
  270. package/scripts/issue/issue-priority-cli.ts +60 -0
  271. package/scripts/issue/issue-priority-raise.ts +55 -0
  272. package/scripts/issue/issue-priority.ts +174 -43
  273. package/scripts/issue/issue-rank.ts +21 -4
  274. package/scripts/issue/issue-read-cli.ts +32 -6
  275. package/scripts/issue/issue-read.ts +37 -12
  276. package/scripts/issue/issue-sample-gate.ts +95 -74
  277. package/scripts/issue/issue-sample-prime.ts +127 -0
  278. package/scripts/issue/issue-sample-required.ts +57 -0
  279. package/scripts/issue/issue-sample-source.ts +12 -11
  280. package/scripts/issue/issue-search.ts +124 -0
  281. package/scripts/issue/issue-state.ts +13 -1
  282. package/scripts/issue/issue-template-section.ts +43 -0
  283. package/scripts/issue/issue-watch-diff.ts +31 -1
  284. package/scripts/issue/issue-watch-hook.ts +11 -2
  285. package/scripts/issue/issue-watch.ts +55 -12
  286. package/scripts/issue/markdown-section.ts +1 -0
  287. package/scripts/issue/measure-declaration.ts +121 -0
  288. package/scripts/issue/measure-rerun-cli.ts +7 -70
  289. package/scripts/issue/plan-consumers-section.ts +22 -1
  290. package/scripts/issue/reproduction-measure.ts +3 -1
  291. package/scripts/issue/size-estimate.ts +90 -0
  292. package/scripts/issue/trusted-measure.ts +84 -0
  293. package/scripts/josh/command-usage.ts +3 -2
  294. package/scripts/josh/durable-state-migrate.ts +105 -0
  295. package/scripts/josh/durable-state.ts +112 -0
  296. package/scripts/josh/josh-aliases.ts +95 -0
  297. package/scripts/josh/josh-command-map.ts +1 -82
  298. package/scripts/josh/josh-commands-agent-hooks.ts +6 -6
  299. package/scripts/josh/josh-commands-ai.ts +5 -5
  300. package/scripts/josh/josh-commands-development.ts +59 -58
  301. package/scripts/josh/josh-commands-issue-write.ts +23 -4
  302. package/scripts/josh/josh-commands-issue.ts +32 -0
  303. package/scripts/josh/josh-commands-lane.ts +87 -4
  304. package/scripts/josh/josh-commands-lint.ts +16 -3
  305. package/scripts/josh/josh-commands-maintenance.ts +15 -0
  306. package/scripts/josh/josh-commands-review.ts +41 -6
  307. package/scripts/josh/josh-commands-ship.ts +56 -8
  308. package/scripts/josh/josh-commands-test-check.ts +80 -0
  309. package/scripts/josh/josh-commands-workflow.ts +1 -1
  310. package/scripts/josh/josh-environment-file.ts +43 -3
  311. package/scripts/josh/josh-in-process.ts +2 -2
  312. package/scripts/josh/josh-logic.ts +5 -3
  313. package/scripts/josh/josh-run.ts +19 -1
  314. package/scripts/josh/run-record-path.ts +15 -0
  315. package/scripts/josh/stamp-file.ts +11 -2
  316. package/scripts/lane/lane-adopt-cli.ts +98 -0
  317. package/scripts/lane/lane-adopt.ts +208 -0
  318. package/scripts/lane/lane-await.ts +5 -8
  319. package/scripts/lane/lane-baseline.ts +123 -0
  320. package/scripts/lane/lane-breakdown-cli.ts +64 -0
  321. package/scripts/lane/lane-breakdown-implement.ts +170 -0
  322. package/scripts/lane/lane-breakdown-laps.ts +107 -0
  323. package/scripts/lane/lane-breakdown-pinned.ts +76 -0
  324. package/scripts/lane/lane-breakdown-text.ts +145 -0
  325. package/scripts/lane/lane-breakdown.ts +239 -0
  326. package/scripts/lane/lane-check-stats.ts +29 -8
  327. package/scripts/lane/lane-child-invocation.ts +9 -2
  328. package/scripts/lane/lane-child-mark-keys.ts +12 -0
  329. package/scripts/lane/lane-child-marker.ts +20 -1
  330. package/scripts/lane/lane-ci-path-stats.ts +73 -0
  331. package/scripts/lane/lane-claim-stats.ts +84 -0
  332. package/scripts/lane/lane-close.ts +8 -3
  333. package/scripts/lane/lane-dispatch-log.ts +3 -3
  334. package/scripts/lane/lane-dispatch.ts +2 -2
  335. package/scripts/lane/lane-gap-stats.ts +7 -6
  336. package/scripts/lane/lane-guard-policy.ts +7 -1
  337. package/scripts/lane/lane-implement-stats.ts +207 -0
  338. package/scripts/lane/lane-implement-subagents.ts +90 -0
  339. package/scripts/lane/lane-investigation-switch.ts +16 -0
  340. package/scripts/lane/lane-ledger-kind.ts +31 -0
  341. package/scripts/lane/lane-ledger-schema-ship.ts +49 -0
  342. package/scripts/lane/lane-ledger-schema.ts +119 -36
  343. package/scripts/lane/lane-ledger-write.ts +257 -0
  344. package/scripts/lane/lane-ledger.ts +31 -177
  345. package/scripts/lane/lane-load.ts +1 -1
  346. package/scripts/lane/lane-measure-cli.ts +176 -59
  347. package/scripts/lane/lane-net-read.ts +44 -0
  348. package/scripts/lane/lane-net-time.ts +212 -0
  349. package/scripts/lane/lane-open.ts +16 -7
  350. package/scripts/lane/lane-output.ts +2 -4
  351. package/scripts/lane/lane-overrun-prompt.ts +147 -0
  352. package/scripts/lane/lane-overrun.ts +274 -0
  353. package/scripts/lane/lane-paths.ts +24 -1
  354. package/scripts/lane/lane-pause-cli.ts +4 -1
  355. package/scripts/lane/lane-paused-spans.ts +97 -0
  356. package/scripts/lane/lane-plan-check.ts +207 -0
  357. package/scripts/lane/lane-plan-cli.ts +41 -0
  358. package/scripts/lane/lane-plan.ts +144 -0
  359. package/scripts/lane/lane-registry.ts +14 -1
  360. package/scripts/lane/lane-relaunch.ts +1 -1
  361. package/scripts/lane/lane-round-one-stats.ts +51 -0
  362. package/scripts/lane/lane-sampler.ts +23 -4
  363. package/scripts/lane/lane-session-action.ts +93 -18
  364. package/scripts/lane/lane-session-broker.ts +49 -21
  365. package/scripts/lane/lane-session-reread-main.ts +14 -0
  366. package/scripts/lane/lane-session-reread.ts +51 -0
  367. package/scripts/lane/lane-ship-lap-stats.ts +74 -0
  368. package/scripts/lane/lane-sleep.ts +58 -0
  369. package/scripts/lane/lane-spent.ts +1 -1
  370. package/scripts/lane/lane-split-stats.ts +28 -0
  371. package/scripts/lane/lane-stage-stats.ts +13 -1
  372. package/scripts/lane/lane-state.ts +41 -9
  373. package/scripts/lane/lane-stats-tables.ts +58 -0
  374. package/scripts/lane/lane-stats.ts +21 -5
  375. package/scripts/lane/lane-stop-stats.ts +51 -19
  376. package/scripts/lane/lane-tail-stats.ts +32 -0
  377. package/scripts/lane/lane-transcript-calls.ts +67 -10
  378. package/scripts/lane/lane-transcript-stats.ts +44 -12
  379. package/scripts/lane/lane-value-cell.ts +72 -0
  380. package/scripts/lane/lane-value.ts +118 -0
  381. package/scripts/lane/lane-withdraw-closed.ts +124 -0
  382. package/scripts/lane/lane-withdraw.ts +108 -31
  383. package/scripts/lane/lane-yield.ts +85 -0
  384. package/scripts/lane/openai-lane-ship.ts +12 -11
  385. package/scripts/lane/openai-lane-supervisor-decision.ts +6 -8
  386. package/scripts/lane/openai-lane-supervisor-owner.ts +5 -8
  387. package/scripts/lane/openai-lane-supervisor.ts +5 -4
  388. package/scripts/lib/poll.ts +38 -9
  389. package/scripts/lib/settled-together.ts +10 -0
  390. package/scripts/lib/shell-quote.ts +21 -0
  391. package/scripts/lib/token-shape.ts +111 -0
  392. package/scripts/lint/eslint-daemon-sources.ts +79 -0
  393. package/scripts/lint/eslint-daemon.ts +45 -6
  394. package/scripts/lint/eslint-warm-cli.ts +7 -0
  395. package/scripts/lint/eslint-warm.ts +66 -0
  396. package/scripts/lint/import-graph.ts +141 -11
  397. package/scripts/lint/lint-gate-scope.ts +2 -2
  398. package/scripts/lint/lint-parallel.ts +54 -6
  399. package/scripts/lint/lint-related.ts +154 -33
  400. package/scripts/lint/rename-cli.ts +179 -0
  401. package/scripts/lint/rename-identifier.ts +192 -0
  402. package/scripts/lint/type-only-imports.ts +58 -0
  403. package/scripts/notify/telegram-notify.ts +12 -3
  404. package/scripts/observations/observation-record.ts +42 -16
  405. package/scripts/observations/observations-flush.ts +32 -9
  406. package/scripts/overrides/overrides-check.ts +9 -1
  407. package/scripts/release/release-approval-prune.ts +7 -1
  408. package/scripts/repo/required-checks-logic.ts +4 -1
  409. package/scripts/repo/ruleset-check.ts +4 -3
  410. package/scripts/report/markdown-shape.ts +28 -0
  411. package/scripts/report/report-format-reference.ts +15 -1
  412. package/scripts/report/report-labels.ts +12 -1
  413. package/scripts/report/report-lint-child-summary.ts +94 -0
  414. package/scripts/report/report-lint-cli.ts +26 -7
  415. package/scripts/report/report-lint.ts +2 -20
  416. package/scripts/review/prose-stale-cli.ts +88 -0
  417. package/scripts/review/prose-stale-scan.ts +152 -0
  418. package/scripts/review/review-attest.ts +73 -23
  419. package/scripts/review/review-brief-cli.ts +68 -19
  420. package/scripts/review/review-brief-paths.ts +22 -0
  421. package/scripts/review/review-brief.ts +14 -7
  422. package/scripts/review/review-comment-carry.ts +47 -0
  423. package/scripts/review/review-comment-round.ts +85 -22
  424. package/scripts/review/review-finding-ledger.ts +109 -7
  425. package/scripts/review/review-finding-text.ts +43 -0
  426. package/scripts/review/review-interaction.ts +11 -0
  427. package/scripts/review/review-lane-handover.ts +68 -0
  428. package/scripts/review/review-lint-cli.ts +57 -0
  429. package/scripts/review/review-lint-findings.ts +92 -0
  430. package/scripts/review/review-lint-sections.ts +80 -0
  431. package/scripts/review/review-lint.ts +221 -0
  432. package/scripts/review/review-prior-findings.ts +102 -0
  433. package/scripts/review/review-readers-scan.ts +4 -2
  434. package/scripts/review/review-record-cli.ts +177 -54
  435. package/scripts/review/review-record-code-round.ts +55 -0
  436. package/scripts/review/review-record-comment.ts +60 -0
  437. package/scripts/review/review-record-interaction.ts +35 -0
  438. package/scripts/review/review-record-pinned.ts +108 -0
  439. package/scripts/review/review-record.ts +25 -1
  440. package/scripts/review/review-reviewed-tree.ts +307 -0
  441. package/scripts/review/review-round-one-closure.ts +62 -0
  442. package/scripts/review/review-round-reuse.ts +106 -0
  443. package/scripts/review/review-round2-cli.ts +91 -29
  444. package/scripts/review/review-round2-skip-comment.ts +55 -0
  445. package/scripts/review/review-round2.ts +24 -8
  446. package/scripts/review/review-stamps.ts +7 -3
  447. package/scripts/review/review-stop-log.ts +20 -6
  448. package/scripts/review/review-stops-cli.ts +2 -1
  449. package/scripts/review/review-submit-cli.ts +101 -0
  450. package/scripts/rules/agent-model.ts +1 -1
  451. package/scripts/rules/bash-triggers.ts +3 -3
  452. package/scripts/rules/concise-reply.ts +88 -0
  453. package/scripts/rules/credential-body.ts +77 -0
  454. package/scripts/rules/decision-oracle.ts +1 -1
  455. package/scripts/rules/delivered-rules.ts +36 -17
  456. package/scripts/rules/destructive-command.ts +3 -11
  457. package/scripts/rules/direct-issue-comment.ts +34 -12
  458. package/scripts/rules/direct-issue-read.ts +191 -0
  459. package/scripts/rules/direct-pr-create.ts +4 -24
  460. package/scripts/rules/early-heartbeat.ts +2 -0
  461. package/scripts/rules/edit-tool.ts +27 -0
  462. package/scripts/rules/file-edit-rows.ts +17 -0
  463. package/scripts/rules/file-rewrite.ts +146 -0
  464. package/scripts/rules/firing-point.ts +3 -2
  465. package/scripts/rules/gh-api.ts +128 -7
  466. package/scripts/rules/gh-repo-selector.ts +84 -0
  467. package/scripts/rules/git-force.ts +2 -2
  468. package/scripts/rules/guard-remedy.ts +14 -5
  469. package/scripts/rules/implementation-cut.ts +61 -28
  470. package/scripts/rules/investigator-foreground.ts +231 -0
  471. package/scripts/rules/issue-citation.ts +15 -60
  472. package/scripts/rules/issue-comments.ts +9 -4
  473. package/scripts/rules/josh-git-bare.ts +1 -1
  474. package/scripts/rules/lane-background.ts +41 -13
  475. package/scripts/rules/lane-direct-tool.ts +107 -9
  476. package/scripts/rules/lane-interactive-ask.ts +4 -1
  477. package/scripts/rules/lane-park.ts +4 -2
  478. package/scripts/rules/lane-spilled-read.ts +90 -0
  479. package/scripts/rules/lane-split-park.ts +1 -1
  480. package/scripts/rules/lane-switch-main.ts +4 -4
  481. package/scripts/rules/last-prompt.ts +20 -47
  482. package/scripts/rules/oracle-consulted.ts +1 -1
  483. package/scripts/rules/permission-guards.ts +5 -1
  484. package/scripts/rules/piped-verification-shapes.ts +110 -0
  485. package/scripts/rules/piped-verification.ts +67 -17
  486. package/scripts/rules/poll-loop.ts +72 -9
  487. package/scripts/rules/pr-merge.ts +5 -5
  488. package/scripts/rules/pre-gate-cut.ts +3 -3
  489. package/scripts/rules/protected-files.ts +88 -24
  490. package/scripts/rules/reply-language.ts +3 -17
  491. package/scripts/rules/reply-prose.ts +34 -0
  492. package/scripts/rules/repo-admin.ts +132 -0
  493. package/scripts/rules/reviewer-foreground.ts +88 -0
  494. package/scripts/rules/round-one-check-related.ts +120 -0
  495. package/scripts/rules/rule-body-guard.ts +5 -15
  496. package/scripts/rules/rule-value-cache.ts +53 -5
  497. package/scripts/rules/rule-value-candidates.ts +84 -0
  498. package/scripts/rules/rule-value-cli.ts +59 -11
  499. package/scripts/rules/rule-value.ts +17 -4
  500. package/scripts/rules/run-tail-rule.ts +1 -1
  501. package/scripts/rules/sed-in-place.ts +196 -0
  502. package/scripts/rules/shell-segments.ts +10 -2
  503. package/scripts/rules/stop-rule-rows.ts +1 -13
  504. package/scripts/rules/stop-rules.ts +33 -58
  505. package/scripts/rules/test-declared-commit.ts +1 -1
  506. package/scripts/rules/third-party-write.ts +110 -23
  507. package/scripts/rules/timed-rerun.ts +1 -1
  508. package/scripts/rules/turn-filings.ts +90 -0
  509. package/scripts/rules/worktree-guard.ts +22 -7
  510. package/scripts/run/board/run-board-ending-reason.ts +6 -2
  511. package/scripts/run/board/run-board-fit.ts +24 -1
  512. package/scripts/run/board/run-board-found.ts +134 -0
  513. package/scripts/run/board/run-board-header.ts +8 -0
  514. package/scripts/run/board/run-board-labels.ts +11 -1
  515. package/scripts/run/board/run-board-lane-time.ts +1 -0
  516. package/scripts/run/board/run-board-link.ts +15 -2
  517. package/scripts/run/board/run-board-notes.ts +7 -1
  518. package/scripts/run/board/run-board-operation.ts +4 -2
  519. package/scripts/run/board/run-board-phase.ts +2 -5
  520. package/scripts/run/board/run-board-plan.ts +1 -1
  521. package/scripts/run/board/run-board-read.ts +46 -1
  522. package/scripts/run/board/run-board-reason.ts +20 -8
  523. package/scripts/run/board/run-board-render-checks.ts +3 -2
  524. package/scripts/run/board/run-board-render-drawn.ts +11 -0
  525. package/scripts/run/board/run-board-render-found.ts +157 -0
  526. package/scripts/run/board/run-board-render-lead.ts +9 -0
  527. package/scripts/run/board/run-board-render-legend.ts +19 -0
  528. package/scripts/run/board/run-board-render-tail.ts +1 -1
  529. package/scripts/run/board/run-board-render.ts +82 -18
  530. package/scripts/run/board/run-board-spin.ts +1 -3
  531. package/scripts/run/board/run-board-status.ts +2 -0
  532. package/scripts/run/board/run-board-tick.ts +39 -10
  533. package/scripts/run/carry/run-carry-ended.ts +3 -2
  534. package/scripts/run/carry/run-carry.ts +3 -2
  535. package/scripts/run/cut/run-cut-cli.ts +33 -133
  536. package/scripts/run/cut/run-cut-digest.ts +152 -0
  537. package/scripts/run/cut/run-cut-handoff.ts +52 -8
  538. package/scripts/run/cut/run-cut-report.ts +24 -3
  539. package/scripts/run/cut/run-cut-resume.ts +129 -0
  540. package/scripts/run/cut/run-cut-review.ts +105 -0
  541. package/scripts/run/cut/run-cut.ts +18 -7
  542. package/scripts/run/detached-launch.ts +1 -1
  543. package/scripts/run/entry/run-entry-cli.ts +88 -19
  544. package/scripts/run/entry/run-entry-spill.ts +83 -0
  545. package/scripts/run/entry/run-entry-stop.ts +5 -1
  546. package/scripts/run/entry/run-entry-trust.ts +91 -0
  547. package/scripts/run/event/run-event-baseline.ts +56 -0
  548. package/scripts/run/event/run-event-filed.ts +9 -3
  549. package/scripts/run/event/run-event-overrun.ts +197 -0
  550. package/scripts/run/event/run-event-render.ts +4 -0
  551. package/scripts/run/event/run-event-stream.ts +25 -3
  552. package/scripts/run/hold/run-stop-notify.ts +3 -8
  553. package/scripts/run/merge/run-merge-cap.ts +57 -0
  554. package/scripts/run/merge/run-merge-cli.ts +66 -23
  555. package/scripts/run/merge/run-merge-outcome.ts +2 -0
  556. package/scripts/run/merge/run-merge-ship.ts +13 -3
  557. package/scripts/run/merge/run-merge-signals.ts +40 -23
  558. package/scripts/run/merge/run-merge-steps.ts +56 -36
  559. package/scripts/run/merge/run-merge-usage-limit.ts +53 -0
  560. package/scripts/run/merge/run-merge-withdrawn.ts +53 -0
  561. package/scripts/run/merge/run-merge.ts +41 -14
  562. package/scripts/run/review/run-review-cli.ts +306 -20
  563. package/scripts/run/review/run-review-early-push.ts +121 -0
  564. package/scripts/run/review/run-review-join-read.ts +94 -0
  565. package/scripts/run/review/run-review-pinned-accepted.ts +126 -0
  566. package/scripts/run/review/run-review-pinned-join.ts +216 -0
  567. package/scripts/run/review/run-review-pinned-steps.ts +383 -0
  568. package/scripts/run/review/run-review-pinned-tree.ts +37 -0
  569. package/scripts/run/review/run-review-pinned.ts +53 -0
  570. package/scripts/run/review/run-review-steps.ts +70 -34
  571. package/scripts/run/review/run-review.ts +26 -6
  572. package/scripts/run/run-parent-cut-hook.ts +3 -4
  573. package/scripts/run/run-prep.ts +1 -0
  574. package/scripts/run/run-stage-read.ts +2 -6
  575. package/scripts/run/run-step-cli.ts +17 -5
  576. package/scripts/run/run-step-lane-plan.ts +27 -0
  577. package/scripts/run/run-step-section.ts +26 -7
  578. package/scripts/run/run-step.ts +5 -2
  579. package/scripts/run/ship/run-ship-args.ts +19 -0
  580. package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
  581. package/scripts/run/ship/run-ship-cli.ts +131 -39
  582. package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
  583. package/scripts/run/ship/run-ship-detach.ts +10 -4
  584. package/scripts/run/ship/run-ship-handover.ts +106 -0
  585. package/scripts/run/ship/run-ship-infra-retry.ts +16 -1
  586. package/scripts/run/ship/run-ship-lap.ts +63 -0
  587. package/scripts/run/ship/run-ship-next.ts +27 -26
  588. package/scripts/run/ship/run-ship-overlap.ts +8 -3
  589. package/scripts/run/ship/run-ship-place.ts +9 -2
  590. package/scripts/run/ship/run-ship-planned.ts +92 -0
  591. package/scripts/run/ship/run-ship-pre-detach-pinned.ts +197 -0
  592. package/scripts/run/ship/run-ship-pre-detach-timed.ts +7 -8
  593. package/scripts/run/ship/run-ship-pre-detach.ts +77 -23
  594. package/scripts/run/ship/run-ship-preflight.ts +16 -4
  595. package/scripts/run/ship/run-ship-probe.ts +23 -9
  596. package/scripts/run/ship/run-ship-relaunch-cap.ts +43 -7
  597. package/scripts/run/ship/run-ship-relaunch.ts +51 -0
  598. package/scripts/run/ship/run-ship-return.ts +103 -29
  599. package/scripts/run/ship/run-ship-review-reason.ts +24 -0
  600. package/scripts/run/ship/run-ship-review-steps.ts +230 -59
  601. package/scripts/run/ship/run-ship-review.ts +171 -51
  602. package/scripts/run/ship/run-ship-reviewer.ts +138 -42
  603. package/scripts/run/ship/run-ship-scoped.ts +39 -10
  604. package/scripts/run/ship/run-ship-stage.ts +49 -13
  605. package/scripts/run/ship/run-ship-steps.ts +24 -4
  606. package/scripts/run/ship/run-ship-stop-cause.ts +43 -2
  607. package/scripts/run/ship/run-ship-stop-context.ts +50 -13
  608. package/scripts/run/ship/run-ship-sync.ts +171 -30
  609. package/scripts/run/ship/run-ship-synced-scope.ts +178 -0
  610. package/scripts/run/ship/run-ship-wait-cli.ts +145 -0
  611. package/scripts/run/ship/run-ship-waiter.ts +114 -0
  612. package/scripts/run/ship/run-ship.ts +16 -2
  613. package/scripts/run/wake/run-wake-caffeinate.ts +48 -0
  614. package/scripts/run/wake/run-wake-cli.ts +6 -113
  615. package/scripts/run/wake/run-wake-code.ts +53 -11
  616. package/scripts/run/wake/run-wake-driver.ts +5 -3
  617. package/scripts/run/wake/run-wake-finish.ts +137 -0
  618. package/scripts/run/wake/run-wake-loop.ts +5 -3
  619. package/scripts/run/wake/run-wake-ports.ts +11 -3
  620. package/scripts/run/wake/run-wake-session.ts +2 -0
  621. package/scripts/run/wake/run-wake.ts +3 -2
  622. package/scripts/safe-chain/ci-installer-pin.ts +49 -8
  623. package/scripts/safe-chain/project-config.ts +3 -2
  624. package/scripts/security/secretlint-scan.ts +42 -9
  625. package/scripts/security/security-audit-provision-main.ts +9 -1
  626. package/scripts/security/security-audit-provision.ts +1 -1
  627. package/scripts/security/security-audit.ts +21 -1
  628. package/scripts/security/sonar-file.ts +10 -5
  629. package/scripts/split/split-assess.ts +12 -3
  630. package/scripts/split/split-early-notice.ts +116 -0
  631. package/scripts/split/split-measure.ts +20 -2
  632. package/scripts/split/split-resolution.ts +107 -0
  633. package/scripts/test/direct-importers.ts +185 -0
  634. package/scripts/test/pure-files-entries.ts +83 -0
  635. package/scripts/test/related-heavy-tests.ts +81 -0
  636. package/scripts/test/test-no-base.ts +88 -0
  637. package/scripts/test/test-pinned-cache-logic.ts +363 -0
  638. package/scripts/test/test-pinned-cache.ts +337 -0
  639. package/scripts/test/test-pinned-emit.ts +49 -0
  640. package/scripts/test/test-pinned-functions.ts +116 -0
  641. package/scripts/test/test-pinned-ledger.ts +80 -0
  642. package/scripts/test/test-pinned-logic.ts +208 -20
  643. package/scripts/test/test-pinned-main.ts +84 -18
  644. package/scripts/test/test-pinned-pool.ts +73 -0
  645. package/scripts/test/test-pinned-probe.ts +254 -0
  646. package/scripts/test/test-pinned-prune-logic.ts +118 -0
  647. package/scripts/test/test-pinned-reach.ts +194 -0
  648. package/scripts/test/test-pinned-record.ts +196 -0
  649. package/scripts/test/test-pinned-rewire.ts +148 -0
  650. package/scripts/test/test-pinned-spawn.ts +81 -0
  651. package/scripts/test/test-pinned-stage.ts +70 -0
  652. package/scripts/test/test-pinned.ts +258 -47
  653. package/scripts/test/test-reach-cli.ts +61 -0
  654. package/scripts/test/test-read-map.ts +35 -11
  655. package/scripts/test/test-read-recording.ts +17 -5
  656. package/scripts/test/test-read-trace.ts +26 -8
  657. package/scripts/test/test-red-logic.ts +46 -7
  658. package/scripts/test/test-red.ts +34 -14
  659. package/scripts/test/test-related-claim.ts +37 -0
  660. package/scripts/test/test-related-main.ts +4 -1
  661. package/scripts/test/test-related-moved.ts +91 -0
  662. package/scripts/test/test-related-record.ts +43 -23
  663. package/scripts/test/test-related-scope.ts +99 -34
  664. package/scripts/test/test-related-synced.ts +135 -0
  665. package/scripts/test/test-related-touched.ts +84 -0
  666. package/scripts/test/test-related.ts +167 -83
  667. package/scripts/test/test-unit-guard.ts +28 -5
  668. package/scripts/test/unit-durations.ts +41 -0
  669. package/scripts/test/unit-worker-share.ts +5 -4
  670. package/scripts/test/vitest-cache-directory.ts +19 -0
  671. package/scripts/test/vitest-cli-excludes.ts +14 -0
  672. package/scripts/test/vitest-failure-summary.ts +111 -0
  673. package/scripts/test/whole-suite-files.ts +12 -1
  674. package/scripts/time-runtime/time-batch-guard.ts +42 -4
  675. package/scripts/time-runtime/time-bundle-call.ts +1 -1
  676. package/scripts/time-runtime/time-bundles.ts +36 -5
  677. package/scripts/time-runtime/time-markers.ts +2 -2
  678. package/scripts/time-runtime/time-search-call.ts +38 -0
  679. package/scripts/time-runtime/time-shell.ts +1 -1
  680. package/scripts/time-runtime/time-transcript-line.ts +17 -5
  681. package/scripts/version/development-engines-verdict.ts +124 -0
  682. package/scripts/version/latest-corepack.ts +2 -0
  683. package/templates/gitignore +2 -0
  684. package/templates/workflows/ci.yml +41 -0
  685. package/dist/hooks/chunk-AZX4FGQ3.js +0 -207
  686. package/dist/hooks/chunk-PT5R6UJD.js +0 -7131
  687. package/dist/hooks/chunk-TUIFS5E7.js +0 -72
  688. package/dist/hooks/chunk-YCDOIR3I.js +0 -3456
  689. package/scripts/cost-runtime/context-cut-threshold.ts +0 -11
  690. package/scripts/rules/filing-cap.ts +0 -139
@@ -1,12 +1,18 @@
1
1
  import type { JoshResult } from '#scripts/josh/josh-run'
2
2
  import { stamp_file } from '#scripts/josh/stamp-file'
3
- import { lane_ledger } from '#scripts/lane/lane-ledger'
3
+ import { lane_ledger_write } from '#scripts/lane/lane-ledger-write'
4
+ import { review_attest, type ReviewSlot } from '#scripts/review/review-attest'
4
5
  import { review_interaction } from '#scripts/review/review-interaction'
5
- import { review_record } from '#scripts/review/review-record'
6
+ import { review_reviewed_tree } from '#scripts/review/review-reviewed-tree'
7
+ import { review_round_reuse, type ReuseAnswer } from '#scripts/review/review-round-reuse'
6
8
  import { review_round2 } from '#scripts/review/review-round2'
9
+ import { review_stop_log } from '#scripts/review/review-stop-log'
10
+ import { run_review } from '#scripts/run/review/run-review'
7
11
  import { run_ship_review, type RoundOutcome, type ScoredVerdict } from './run-ship-review'
12
+ import { run_ship_review_reason } from './run-ship-review-reason'
8
13
  import { run_ship_reviewer, type Round } from './run-ship-reviewer'
9
14
  import { run_ship_scoped } from './run-ship-scoped'
15
+ import { run_ship_stage } from './run-ship-stage'
10
16
  import { run_ship_stop_cause } from './run-ship-stop-cause'
11
17
  import type { StepResult } from './run-ship-sync'
12
18
 
@@ -24,7 +30,7 @@ import type { StepResult } from './run-ship-sync'
24
30
  // **Round 1's local fixes and round 2 stay inside the supervisor**. A round-1
25
31
  // reviewer that fixed its local Mediums in place changed the tree the background gate read, so that
26
32
  // join drains the gate rather than judging it — the ship's gate stage re-runs on the fixed tree. After
27
- // the commit, `round_two_stage` asks `review:round2 --round-1-closed` whether the fix delta owes a
33
+ // the commit, `round_two_stage` asks `review:round2 --record <N>` whether the fix delta owes a
28
34
  // second round, and on `required` runs it through the same commands the chain does: the scoped pair
29
35
  // `review:brief` requires, `review:brief --round 2`, a fresh reviewer session, attest and record.
30
36
  //
@@ -37,7 +43,13 @@ import type { StepResult } from './run-ship-sync'
37
43
  // recorded first, because the round was attested, then routed back.
38
44
 
39
45
  const RUN_REVIEW = 'run:review'
40
- const ROUND_TWO_DECISION = ['review:round2', '--round-1-closed', '--json']
46
+
47
+ // `--record` names the issue whose ledger dispositions decide round 1's closure, and where a skip
48
+ // is commented (joshuafolkken/kit#5286).
49
+ function round_two_decision(issue: string): ReadonlyArray<string> {
50
+ return ['review:round2', '--record', issue, '--json']
51
+ }
52
+
41
53
  const REVIEW_BRIEF = 'review:brief'
42
54
  const ROUND_TWO_BRIEF = [REVIEW_BRIEF, '--round', '2']
43
55
  const INTERACTION_FLAG = '--interaction'
@@ -49,12 +61,22 @@ const FIXED_JOIN_NOTE =
49
61
  'the round-1 gate read the tree before the review fixes — drained, not judged; the gate re-runs once the tree is fixed.'
50
62
  const ROUND_TWO_SKIPPED_NOTE = 'round 2 not due — nothing left to verify; shipping on.'
51
63
  const ROUND_ONE_RECORDED_NOTE =
52
- 'round 1 already recorded for this issue — not reviewed again; the gate reads the fixed tree and round 2 decides after the commit.'
64
+ 'round 1 already recorded — reused, not reviewed again; round 2 decides on the fix delta after the commit.'
53
65
 
54
66
  // The scoped pair's precondition, met by the supervisor itself rather than stopped on,
55
67
  // single-sourced with the preflight and gate stages.
56
68
  const { run_phases, scoped_pair } = run_ship_scoped
57
69
  const { CAUSE } = run_ship_stop_cause
70
+ const { CODE, INTERACTION } = review_attest.REVIEW_SLOT
71
+ // `run:review` opens code's brief alone here: the interaction slot's is the ship's own open beside it.
72
+ const ROUND_ONE_OPENS: Readonly<Record<ReviewSlot, ReadonlyArray<string>>> = {
73
+ code: [RUN_REVIEW, run_review.CODE_ONLY_FLAG],
74
+ interaction: INTERACTION_BRIEF,
75
+ }
76
+ const SLOT_RECORD_FLAGS: Readonly<Record<ReviewSlot, ReadonlyArray<string>>> = {
77
+ code: [],
78
+ interaction: [INTERACTION_FLAG],
79
+ }
58
80
  const {
59
81
  attest_phase,
60
82
  current_verdict,
@@ -63,6 +85,7 @@ const {
63
85
  note,
64
86
  paths,
65
87
  reviewed,
88
+ reviewed_together,
66
89
  ROUND_ONE,
67
90
  ROUND_TWO,
68
91
  SUCCESS_EXIT_CODE,
@@ -75,15 +98,27 @@ const {
75
98
  // its end, so the gate stage that follows never races it. Any fix drains it, not only a round whose
76
99
  // every finding was fixed — a partial fix moved the tree just the same, and the round then stops on its
77
100
  // unfixed finding at the record rather than on a `Gate RED` the gate never earned.
78
- async function join_gate(): Promise<JoshResult> {
101
+ // Either slot's reviewer fixing in place moved the tree.
102
+ function has_fixes(slots: ReadonlyArray<ReviewSlot>): boolean {
103
+ return slots.some((slot) =>
104
+ run_ship_review.has_fixes(stamp_file.read_stamp_text(paths(slot).findings)),
105
+ )
106
+ }
107
+
108
+ // **The tree is asked first, the findings file second** (joshuafolkken/kit#4774): a gate that passed on
109
+ // a tree that has since moved exits the join with its own code, which drains it whatever the reviewer
110
+ // wrote, or failed to write, at its findings path. An unpinned change is never drained
111
+ // (joshuafolkken/kit#4770): a reviewer's fix moved the tree, not the probe's answer.
112
+ function is_drained(code: number, slots: ReadonlyArray<ReviewSlot>): boolean {
113
+ if (code === run_review.UNPINNED_EXIT_CODE) return false
114
+
115
+ return code === run_review.MOVED_EXIT_CODE || has_fixes(slots)
116
+ }
117
+
118
+ async function join_gate(slots: ReadonlyArray<ReviewSlot>): Promise<JoshResult> {
79
119
  const joined = await josh([RUN_REVIEW, '--join'])
80
120
 
81
- if (
82
- joined.code === SUCCESS_EXIT_CODE ||
83
- !run_ship_review.has_fixes(stamp_file.read_stamp_text(paths().findings))
84
- ) {
85
- return joined
86
- }
121
+ if (joined.code === SUCCESS_EXIT_CODE || !is_drained(joined.code, slots)) return joined
87
122
 
88
123
  note(FIXED_JOIN_NOTE)
89
124
 
@@ -93,28 +128,36 @@ async function join_gate(): Promise<JoshResult> {
93
128
  // **A passing round 2 is recorded on the issue, not in the tree**: it ran after the commit and reads
94
129
  // only, so no commit of the run's follows it, and a line appended now would be pushed onto the open
95
130
  // pull request by `pnpm josh followup` — restarting the CI the round ran beside. A blocking round 2
96
- // keeps the tree: the fix it stops for is pushed anyway, and carries the lines.
131
+ // on a pushed, clean tree goes to the issue as well (`review-record-comment.ts`).
97
132
  function record_flags(round: Round, outcome: RoundOutcome): ReadonlyArray<string> {
98
133
  return round === ROUND_TWO && outcome.is_passing ? [COMMENT_FLAG] : []
99
134
  }
100
135
 
101
- // `kind` is the record's own flags — `--interaction` for the interaction review's `- ri:` line.
136
+ // The interaction slot records with `--interaction`, its `- ri:` line.
102
137
  async function record_and_route(
103
138
  issue: string,
104
139
  round: Round,
105
140
  outcome_of: (verdict: ScoredVerdict) => RoundOutcome,
106
- kind: ReadonlyArray<string> = [],
107
- ): Promise<JoshResult> {
108
- const verdict = current_verdict()
141
+ slot: ReviewSlot = CODE,
142
+ ): Promise<StepResult> {
143
+ const verdict = current_verdict(slot)
109
144
 
110
145
  if (verdict.kind === run_ship_review.VERDICT.INVALID) return failure(verdict.note, CAUSE.INFRA)
111
146
 
112
147
  const outcome = outcome_of(verdict)
113
- const flags = [...kind, ...record_flags(round, outcome)]
114
- const recorded = await josh(['review:record', '--issue', issue, ...flags, ...verdict.specs])
148
+ const flags = [...SLOT_RECORD_FLAGS[slot], ...record_flags(round, outcome)]
149
+ const specs = run_ship_review.recorded_specs(verdict, outcome)
150
+ const recorded = await josh(['review:record', '--issue', issue, ...flags, ...specs])
115
151
 
116
152
  if (recorded.code !== SUCCESS_EXIT_CODE) return tagged(CAUSE.CHECK, recorded)
117
153
 
154
+ review_stop_log.record({
155
+ issue: Number(issue),
156
+ stage: run_ship_stage.STAGE.REVIEW,
157
+ findings: run_ship_review.passing_fixes(verdict, outcome),
158
+ is_fixed: true,
159
+ })
160
+
118
161
  const out = [...verdict.report, outcome.note].join('\n')
119
162
 
120
163
  return outcome.is_passing ? { code: SUCCESS_EXIT_CODE, out } : failure(out, CAUSE.FINDING)
@@ -122,78 +165,206 @@ async function record_and_route(
122
165
 
123
166
  // Fixes made in place are counted only once the scoped pair is green on the fixed tree. The reviewer is
124
167
  // asked to leave it green; this is the check that it did, and a fix it could not get green is routed as
125
- // the finding it still is — recorded, then stopped before the gate and the commit take it in.
126
- async function round_one_record(issue: string, kind?: ReadonlyArray<string>): Promise<JoshResult> {
127
- const is_fixed = current_verdict().kind === run_ship_review.VERDICT.FIXED
128
- const checked = is_fixed ? await scoped_pair() : undefined
129
- const is_verified = checked === undefined || checked.code === SUCCESS_EXIT_CODE
168
+ // the finding it still is — recorded, then stopped before the gate and the commit take it in. One
169
+ // scoped pair answers for every slot's fixes: they share the tree.
170
+ async function is_fix_verified(slots: ReadonlyArray<ReviewSlot>): Promise<boolean> {
171
+ const is_fixed = slots.some(
172
+ (slot) => current_verdict(slot).kind === run_ship_review.VERDICT.FIXED,
173
+ )
130
174
 
175
+ if (!is_fixed) return true
176
+
177
+ const checked = await scoped_pair()
178
+
179
+ return checked.code === SUCCESS_EXIT_CODE
180
+ }
181
+
182
+ async function round_one_record(
183
+ issue: string,
184
+ slot: ReviewSlot,
185
+ is_verified: boolean,
186
+ ): Promise<StepResult> {
131
187
  return await record_and_route(
132
188
  issue,
133
189
  ROUND_ONE,
134
190
  (verdict) =>
135
191
  is_verified ? run_ship_review.round_one_outcome(verdict) : run_ship_review.UNVERIFIED_OUTCOME,
136
- kind,
192
+ slot,
137
193
  )
138
194
  }
139
195
 
196
+ // Both reviews' reports in one result, stopped on the first slot that stopped — so a fix answers
197
+ // every finding at once (joshuafolkken/kit#4672).
198
+ function merged(results: ReadonlyArray<StepResult>): StepResult {
199
+ const out = results.map((result) => result.out).join('\n')
200
+ const stopped = results.find((result) => result.code !== SUCCESS_EXIT_CODE)
201
+
202
+ return stopped === undefined ? { code: SUCCESS_EXIT_CODE, out } : { ...stopped, out }
203
+ }
204
+
205
+ async function record_slots(issue: string, slots: ReadonlyArray<ReviewSlot>): Promise<StepResult> {
206
+ const is_verified = await is_fix_verified(slots)
207
+ const results: Array<StepResult> = []
208
+
209
+ for (const slot of slots) {
210
+ // eslint-disable-next-line no-await-in-loop -- one `review:record` at a time: each appends to the issue's ledger
211
+ const result = await round_one_record(issue, slot, is_verified)
212
+
213
+ results.push(result)
214
+ }
215
+
216
+ return merged(results)
217
+ }
218
+
140
219
  // A round that had nothing to review: it passes, and the ship does not time it as a review that ran.
141
220
  function skipped(out: string): StepResult {
142
221
  return { code: SUCCESS_EXIT_CODE, out, is_skipped: true }
143
222
  }
144
223
 
145
- // The round-1 review, beside the gate: scoped pair → open → review → join → attest → record, stopping
146
- // at the first that did not pass.
147
- //
148
- // **A recorded round 1 is not run again**. A ship relaunched with `--review`
149
- // after a round-1 stop would otherwise review the whole change a second time as round 1 — a new Medium
150
- // there stops it again, and round 2 after the commit makes a third. The fix delta is round 2's to
151
- // verify, and `round_two_stage` asks whether it is due after the commit — unless the issue changed after
152
- // that round's brief: the recorded round then never read it, and `josh followup` refuses the merge on it
153
- // (joshuafolkken/kit#4221).
154
- async function round_one_stage(issue: string, is_stale: boolean): Promise<StepResult> {
155
- const recorded = await review_record.check(Number(issue))
224
+ // How the ship's round 1 ended, for `josh lane:stats` to count the rounds that passed with no fix
225
+ // (joshuafolkken/kit#4620). An unreadable verdict is no outcome; the round stops on it as infra. A
226
+ // round whose `review:record` failed is not counted either: the relaunch re-runs it, and that run is
227
+ // the one that ended.
228
+ async function record_outcome(issue: string, verdict: string, cause?: string): Promise<void> {
229
+ if (verdict === run_ship_review.VERDICT.INVALID || cause === CAUSE.CHECK) return
156
230
 
157
- if (!is_stale && recorded.status === 'ok') return skipped(ROUND_ONE_RECORDED_NOTE)
231
+ await lane_ledger_write.record_round_one({ issue: Number(issue), verdict })
232
+ }
158
233
 
159
- return await run_phases([
234
+ // Over every slot: either slot's fix moved the tree round 1 is gated on, so the round is `fixed`, and
235
+ // an unreadable slot leaves it uncounted.
236
+ function round_one_kind(slots: ReadonlyArray<ReviewSlot>): string {
237
+ const kinds = new Set(slots.map((slot) => current_verdict(slot).kind))
238
+ const { FIXED, INVALID } = run_ship_review.VERDICT
239
+
240
+ if (kinds.has(INVALID)) return INVALID
241
+
242
+ return kinds.has(FIXED) ? FIXED : current_verdict().kind
243
+ }
244
+
245
+ // A round that stops on a finding — a fix the scoped pair did not get green included — is counted as
246
+ // `blocking`, and marks its round reusable however the fix then moves the tree. Written once, over
247
+ // every slot's result.
248
+ async function code_round_one_record(
249
+ issue: string,
250
+ slots: ReadonlyArray<ReviewSlot>,
251
+ ): Promise<StepResult> {
252
+ const kind = round_one_kind(slots)
253
+ const recorded = await record_slots(issue, slots)
254
+ const is_stopped = recorded.cause === CAUSE.FINDING
255
+
256
+ review_reviewed_tree.mark_stopped(Number(issue), is_stopped)
257
+ await record_outcome(issue, is_stopped ? run_ship_review.VERDICT.BLOCKING : kind, recorded.cause)
258
+
259
+ return recorded
260
+ }
261
+
262
+ // `run:review` alone takes the implementer's `--unpinned-ok "<reason>"`; the interaction brief runs no
263
+ // `test:pinned` check for it to carry past.
264
+ function round_one_opens(
265
+ slots: ReadonlyArray<ReviewSlot>,
266
+ unpinned_ok: ReadonlyArray<string>,
267
+ ): Array<{ open: ReadonlyArray<string>; slot: ReviewSlot }> {
268
+ return slots.map((slot) => ({
269
+ open: slot === CODE ? [...ROUND_ONE_OPENS[slot], ...unpinned_ok] : ROUND_ONE_OPENS[slot],
270
+ slot,
271
+ }))
272
+ }
273
+
274
+ // A recorded round 1 attested on this branch, its tree held or moved only where round 2 reads: the
275
+ // stage is skipped, and the event stream says why (joshuafolkken/kit#5296).
276
+ async function reused_round(issue: string, reused: ReuseAnswer): Promise<StepResult> {
277
+ await record_outcome(issue, lane_ledger_write.ROUND_ONE_REUSED)
278
+
279
+ return { ...skipped(ROUND_ONE_RECORDED_NOTE), reason: run_ship_review_reason.reused(reused) }
280
+ }
281
+
282
+ // The round-1 review, beside the gate: scoped pair → open each slot's brief → their reviewers side by
283
+ // side → join → attest → record, stopping at the first that did not pass.
284
+ async function round_one_stage(
285
+ issue: string,
286
+ is_stale: boolean,
287
+ slots: ReadonlyArray<ReviewSlot>,
288
+ unpinned_ok: ReadonlyArray<string>,
289
+ ): Promise<StepResult> {
290
+ // The reuse question `review:record --check` answers too (`review-round-reuse.ts`).
291
+ const reused = await review_round_reuse.answer(Number(issue), is_stale)
292
+
293
+ if (reused.reuse !== review_round_reuse.REUSE.AGAIN) return await reused_round(issue, reused)
294
+
295
+ // A stale record narrows nothing: the next round reads the whole change under the new specification.
296
+ if (is_stale) review_reviewed_tree.discard()
297
+ const opens = round_one_opens(slots, unpinned_ok)
298
+ const ran = await run_phases([
160
299
  tagged_phase(CAUSE.CHECK, scoped_pair),
161
- ...reviewed([RUN_REVIEW], run_ship_review.reviewer_prompt, issue, ROUND_ONE),
162
- tagged_phase(CAUSE.CHECK, join_gate),
300
+ ...reviewed_together(opens, run_ship_review.reviewer_prompt, issue, ROUND_ONE),
301
+ tagged_phase(CAUSE.CHECK, async () => await join_gate(slots)),
163
302
  attest_phase,
164
- async () => await round_one_record(issue),
303
+ async () => await code_round_one_record(issue, slots),
165
304
  ])
305
+
306
+ return { ...ran, reason: run_ship_review_reason.ran(reused) }
166
307
  }
167
308
 
168
- // The interaction review (joshuafolkken/kit#4276): after round 1, over a change to the run tooling,
169
- // scoped pair → `review:brief --interaction` → reviewer → attest → `review:record --interaction`. Its
170
- // fixes are verified as round 1's are; no join, since round 1 already drained the gate.
309
+ // The interaction review alone (joshuafolkken/kit#4276), after a reused round 1: scoped pair →
310
+ // `review:brief --interaction` → reviewer → attest → `review:record --interaction`. Its fixes are
311
+ // verified as round 1's are; no join, since round 1 already drained the gate.
171
312
  async function interaction_stage(issue: string): Promise<StepResult> {
313
+ const opens = [{ open: INTERACTION_BRIEF, slot: INTERACTION }]
314
+
172
315
  return await run_phases([
173
316
  tagged_phase(CAUSE.CHECK, scoped_pair),
174
- ...reviewed(INTERACTION_BRIEF, run_ship_review.reviewer_prompt, issue, ROUND_ONE),
317
+ ...reviewed_together(opens, run_ship_review.reviewer_prompt, issue, ROUND_ONE),
175
318
  attest_phase,
176
- async () => await round_one_record(issue, [INTERACTION_FLAG]),
319
+ async () => await record_slots(issue, [INTERACTION]),
177
320
  ])
178
321
  }
179
322
 
180
- // Round 1, then the interaction review where it is due and not yet recorded — so a relaunched ship
181
- // whose round 1 is recorded still owes it. The first stop is returned as it is.
182
- async function review_stage(issue: string, is_stale = false): Promise<StepResult> {
183
- const first = await round_one_stage(issue, is_stale)
323
+ async function due_slots(issue: string): Promise<ReadonlyArray<ReviewSlot>> {
324
+ return review_interaction.round_one_slots(await review_interaction.status(Number(issue)))
325
+ }
184
326
 
185
- if (
186
- first.code !== SUCCESS_EXIT_CODE ||
187
- (await review_interaction.status(Number(issue))) !== 'missing'
188
- ) {
189
- return first
190
- }
327
+ async function is_interaction_due(issue: string): Promise<boolean> {
328
+ const slots = await due_slots(issue)
329
+
330
+ return slots.includes(INTERACTION)
331
+ }
332
+
333
+ // Owed after a round 1 that passed and is still not recorded — so a relaunched ship whose round 1 is
334
+ // recorded still owes it.
335
+ async function is_interaction_owed(issue: string, first: StepResult): Promise<boolean> {
336
+ if (first.code !== SUCCESS_EXIT_CODE) return false
337
+
338
+ return await is_interaction_due(issue)
339
+ }
340
+
341
+ // Both passes' output under round 1's reason: the interaction pass ran, so the stage is never skipped.
342
+ function after_interaction(first: StepResult, second: StepResult): StepResult {
343
+ const out = [first.out, second.out].join('\n')
344
+ const { reason } = first
345
+
346
+ return { code: SUCCESS_EXIT_CODE, out, ...(reason !== undefined && { reason }) }
347
+ }
348
+
349
+ // **The interaction review runs beside round 1 where it is due and not yet recorded**
350
+ // (joshuafolkken/kit#4672), so the two take one wait and one stop. **It is asked again after a round 1
351
+ // that passed**: a reused round 1 still owes it, and a round-1 fix may be the first to touch the run
352
+ // tooling — either way it then runs alone. The first stop is returned as it is.
353
+ async function review_stage(
354
+ issue: string,
355
+ is_stale = false,
356
+ unpinned_ok: ReadonlyArray<string> = [],
357
+ ): Promise<StepResult> {
358
+ const slots = await due_slots(issue)
359
+ const first = await round_one_stage(issue, is_stale, slots, unpinned_ok)
360
+
361
+ if (!(await is_interaction_owed(issue, first))) return first
191
362
 
192
363
  const second = await interaction_stage(issue)
193
364
 
194
365
  if (second.code !== SUCCESS_EXIT_CODE) return second
195
366
 
196
- return { code: SUCCESS_EXIT_CODE, out: [first.out, second.out].join('\n') }
367
+ return after_interaction(first, second)
197
368
  }
198
369
 
199
370
  // The round-2 verification pass, after the commit so it runs beside CI: due only when the round-1 fix
@@ -203,7 +374,7 @@ async function review_stage(issue: string, is_stale = false): Promise<StepResult
203
374
  // `josh lane:stats` can count the period's round-2 runs and skips by their reason code
204
375
  // (joshuafolkken/kit#4064). Output it cannot parse stops the ship rather than guessing a verdict.
205
376
  async function round_two_stage(issue: string): Promise<StepResult> {
206
- const decision = await josh(ROUND_TWO_DECISION)
377
+ const decision = await josh(round_two_decision(issue))
207
378
 
208
379
  if (decision.code !== SUCCESS_EXIT_CODE) return tagged(CAUSE.CHECK, decision)
209
380
 
@@ -214,7 +385,7 @@ async function round_two_stage(issue: string): Promise<StepResult> {
214
385
  }
215
386
 
216
387
  note(answer.reason)
217
- await lane_ledger.record_round_two({
388
+ await lane_ledger_write.record_round_two({
218
389
  issue: Number(issue),
219
390
  verdict: answer.verdict,
220
391
  code: answer.code,