@joshuafolkken/kit 1.1471.0 → 1.1784.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 (895) hide show
  1. package/.claude/agents/investigator.md +1 -1
  2. package/.claude/settings.json +6 -6
  3. package/.claude/skills/epic-commands/SKILL.md +26 -77
  4. package/.claude/skills/epic-commands/epic-bundle.md +12 -6
  5. package/.claude/skills/epic-commands/execution-waves.md +1 -2
  6. package/.claude/skills/verify-ui/SKILL.md +1 -2
  7. package/.claude/skills/workflow-commands/SKILL.md +12 -14
  8. package/.claude/skills/workflow-commands/background-commands.md +8 -12
  9. package/.claude/skills/workflow-commands/backlogrun-child.md +13 -18
  10. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
  11. package/.claude/skills/workflow-commands/backlogrun-lanes.md +23 -28
  12. package/.claude/skills/workflow-commands/backlogrun-park.md +16 -31
  13. package/.claude/skills/workflow-commands/backlogrun-progress.md +12 -21
  14. package/.claude/skills/workflow-commands/backlogrun-recovery.md +12 -12
  15. package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -20
  16. package/.claude/skills/workflow-commands/backlogrun.md +32 -51
  17. package/.claude/skills/workflow-commands/chain-rule.md +18 -11
  18. package/.claude/skills/workflow-commands/delegation.md +13 -8
  19. package/.claude/skills/workflow-commands/entry-sequence.md +10 -12
  20. package/.claude/skills/workflow-commands/followup.md +10 -35
  21. package/.claude/skills/workflow-commands/fullrun-steps.md +38 -49
  22. package/.claude/skills/workflow-commands/fullrun.md +6 -8
  23. package/.claude/skills/workflow-commands/halfrun.md +20 -32
  24. package/.claude/skills/workflow-commands/into-target.md +1 -2
  25. package/.claude/skills/workflow-commands/issue-comments.md +19 -15
  26. package/.claude/skills/workflow-commands/issue-scout.md +5 -4
  27. package/.claude/skills/workflow-commands/kickoff.md +24 -23
  28. package/.claude/skills/workflow-commands/latest-gate.md +9 -18
  29. package/.claude/skills/workflow-commands/needs-human-review.md +11 -19
  30. package/.claude/skills/workflow-commands/observation-filing.md +4 -50
  31. package/.claude/skills/workflow-commands/observation-ledger.md +5 -10
  32. package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -44
  33. package/.claude/skills/workflow-commands/prerequisite.md +11 -18
  34. package/.claude/skills/workflow-commands/progress-watcher.md +3 -8
  35. package/.claude/skills/workflow-commands/prrun.md +6 -12
  36. package/.claude/skills/workflow-commands/retrospective.md +5 -5
  37. package/.claude/skills/workflow-commands/split-assessment.md +14 -4
  38. package/.claude/skills/workflow-commands/target-repository.md +1 -2
  39. package/.claude/skills/workflow-commands/working-tree-hold.md +11 -13
  40. package/.codex/hooks.json +6 -6
  41. package/.github/actions/setup-node/action.yml +10 -1
  42. package/.github/actions/setup-pnpm/action.yml +1 -1
  43. package/.github/dependabot.yml +16 -0
  44. package/.github/release.yml +0 -2
  45. package/.github/workflows/ci.yml +121 -11
  46. package/.github/workflows/publish.yml +10 -3
  47. package/.github/workflows/sonar-qube.yml +1 -0
  48. package/.prettierignore +2 -0
  49. package/.vscode/tasks.json +1 -2
  50. package/CLAUDE.md +4 -8
  51. package/README.md +4 -2
  52. package/SECURITY.md +1 -1
  53. package/cspell/index.yaml +7 -0
  54. package/dist/CLAUDE.md +4 -8
  55. package/dist/commands/document-read-cli.js +882 -0
  56. package/dist/commands/{document-section-cli.js → document-section-main.js} +137 -62
  57. package/dist/commands/read-set-cli.js +1867 -0
  58. package/dist/commands/run-prep-main.js +21653 -0
  59. package/dist/commands/run-step-cli.js +23880 -0
  60. package/dist/config-merge/index.js +5 -1
  61. package/dist/hooks/audit-provision.js +20 -35
  62. package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
  63. package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
  64. package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
  65. package/dist/hooks/{chunk-AS74OU3D.js → chunk-PT5R6UJD.js} +4582 -2118
  66. package/dist/hooks/chunk-TUIFS5E7.js +72 -0
  67. package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
  68. package/dist/hooks/{chunk-E7OIKX5Z.js → chunk-WR2KQAYZ.js} +1863 -382
  69. package/dist/hooks/{chunk-KC5AK2GF.js → chunk-XGBNSWEI.js} +248 -46
  70. package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
  71. package/dist/hooks/codex-hook-adapter.js +10 -19
  72. package/dist/hooks/format-edited.js +5 -5
  73. package/dist/hooks/inputs.json +436 -257
  74. package/dist/hooks/pretool-guard.js +7 -22
  75. package/dist/hooks/session-lang.js +380 -42
  76. package/dist/hooks/stop-guard.js +8711 -782
  77. package/dist/josh.js +5263 -997
  78. package/dist/self-sync-guard/index.js +74 -10
  79. package/dist/version/index.js +115 -406
  80. package/eslint/base.js +1 -1
  81. package/lefthook/base.yml +8 -4
  82. package/package.json +17 -53
  83. package/pnpm-workspace.yaml +4 -2
  84. package/prompts/coding-standards.md +1 -1
  85. package/prompts/collaboration-workflow/file-edits.md +1 -9
  86. package/prompts/collaboration-workflow/gh-rest.md +1 -2
  87. package/prompts/collaboration-workflow/issue-citation.md +2 -4
  88. package/prompts/collaboration-workflow/issue-template.md +42 -17
  89. package/prompts/collaboration-workflow/lane-instructions.md +34 -0
  90. package/prompts/collaboration-workflow/measurement.md +37 -0
  91. package/prompts/collaboration-workflow/operating-rules.md +6 -12
  92. package/prompts/collaboration-workflow/output-bounds.md +4 -9
  93. package/prompts/collaboration-workflow/overview.md +1 -1
  94. package/prompts/collaboration-workflow/plan-comment.md +3 -42
  95. package/prompts/collaboration-workflow/principles.md +19 -8
  96. package/prompts/collaboration-workflow/report-format.md +37 -57
  97. package/prompts/collaboration-workflow/residency.md +12 -8
  98. package/prompts/collaboration-workflow/rule-delivery.md +3 -11
  99. package/prompts/collaboration-workflow/shell-body.md +8 -18
  100. package/prompts/collaboration-workflow/turn-batching.md +4 -6
  101. package/prompts/collaboration-workflow/upstream-interrupt.md +16 -6
  102. package/prompts/collaboration-workflow/wip-cap.md +7 -7
  103. package/prompts/collaboration-workflow.md +4 -7
  104. package/prompts/refactoring.md +1 -1
  105. package/prompts/review-rubric.md +1 -2
  106. package/prompts/review.md +45 -26
  107. package/prompts/testing-guide.md +10 -45
  108. package/scripts/agent/agent-argv.ts +20 -4
  109. package/scripts/agent/agent-event.ts +15 -15
  110. package/scripts/agent/agent-exit-record.ts +13 -1
  111. package/scripts/agent/agent-role-profile.ts +101 -45
  112. package/scripts/agent/agent-safe-text.ts +60 -0
  113. package/scripts/agent/api-auth.ts +41 -0
  114. package/scripts/agent/api-outage.ts +1 -1
  115. package/scripts/agent/claude-agent-argv.ts +14 -0
  116. package/scripts/agent/codex-agent-argv.ts +2 -0
  117. package/scripts/agent/lane-instructions.ts +144 -0
  118. package/scripts/auto-ok/auto-ok-cli.ts +14 -16
  119. package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
  120. package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
  121. package/scripts/auto-ok/auto-ok-judge.ts +13 -2
  122. package/scripts/auto-ok/auto-ok-main.ts +17 -0
  123. package/scripts/backlog/backlog-arrival.ts +14 -3
  124. package/scripts/backlog/backlog-budget-cli.ts +7 -33
  125. package/scripts/backlog/backlog-budget-main.ts +16 -0
  126. package/scripts/backlog/backlog-budget.ts +6 -7
  127. package/scripts/backlog/backlog-defect-priority.ts +4 -3
  128. package/scripts/backlog/backlog-drive-adopt.ts +67 -0
  129. package/scripts/backlog/backlog-drive-args.ts +4 -5
  130. package/scripts/backlog/backlog-drive-cli.ts +113 -28
  131. package/scripts/backlog/backlog-drive-hold.ts +162 -0
  132. package/scripts/backlog/backlog-drive-idle.ts +151 -0
  133. package/scripts/backlog/backlog-drive-judge.ts +25 -0
  134. package/scripts/backlog/backlog-drive-memory.ts +126 -0
  135. package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
  136. package/scripts/backlog/backlog-drive-named.ts +54 -7
  137. package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
  138. package/scripts/backlog/backlog-drive-paused.ts +169 -0
  139. package/scripts/backlog/backlog-drive-restore.ts +39 -8
  140. package/scripts/backlog/backlog-drive-seats.ts +18 -8
  141. package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
  142. package/scripts/backlog/backlog-drive.ts +79 -75
  143. package/scripts/backlog/backlog-next-main.ts +16 -0
  144. package/scripts/backlog/backlog-next-shared.ts +73 -0
  145. package/scripts/backlog/backlog-next.ts +48 -16
  146. package/scripts/backlog/backlog-occupied.ts +69 -0
  147. package/scripts/backlog/backlog-offer-cli.ts +6 -21
  148. package/scripts/backlog/backlog-offer-exclude.ts +15 -0
  149. package/scripts/backlog/backlog-offer-main.ts +12 -0
  150. package/scripts/backlog/backlog-offer.ts +36 -3
  151. package/scripts/backlog/backlog-overlap.ts +22 -4
  152. package/scripts/backlog/backlog-plan-read.ts +6 -2
  153. package/scripts/backlog/backlog-plan.ts +18 -4
  154. package/scripts/backlog/backlog-pool.ts +10 -10
  155. package/scripts/backlog/backlog-rank.ts +10 -2
  156. package/scripts/backlog/backlog-ready.ts +137 -18
  157. package/scripts/backlog/backlog-stalled-detect.ts +109 -36
  158. package/scripts/backlog/backlog-stalled.ts +52 -16
  159. package/scripts/backlog/backlog-wait-cause.ts +86 -0
  160. package/scripts/backlog/backlog-waves.ts +39 -13
  161. package/scripts/backlog/backlogrun-args.ts +19 -7
  162. package/scripts/backlog/backlogrun-cli.ts +19 -5
  163. package/scripts/backlog/backlogrun-launch.ts +6 -0
  164. package/scripts/backlog/backlogrun-restart.ts +97 -0
  165. package/scripts/backlog/backlogrun-stop.ts +79 -7
  166. package/scripts/behavior/behavior-cli.ts +2 -2
  167. package/scripts/behavior/behavior-rules.ts +47 -24
  168. package/scripts/build/build-bin.ts +2 -16
  169. package/scripts/build/build-claude-md.ts +0 -7
  170. package/scripts/build/build-commands.ts +0 -13
  171. package/scripts/build/build-hooks.ts +49 -48
  172. package/scripts/build/hook-bundle-stamp.ts +29 -11
  173. package/scripts/build/local-bin.ts +1 -1
  174. package/scripts/cases/cases-cli.ts +25 -13
  175. package/scripts/cases/cases-interaction-scan.ts +134 -0
  176. package/scripts/cases/cases-interaction.ts +183 -0
  177. package/scripts/cases/cases-logic.ts +39 -6
  178. package/scripts/ci/pr-classification-main.ts +18 -0
  179. package/scripts/ci/pr-classification.ts +10 -17
  180. package/scripts/clone/clone-scan.ts +1 -1
  181. package/scripts/cost-runtime/cost-blocks.ts +22 -37
  182. package/scripts/cost-runtime/cost-cli.ts +31 -14
  183. package/scripts/cost-runtime/cost-main.ts +12 -0
  184. package/scripts/cost-runtime/cost-transcript.ts +1 -0
  185. package/scripts/delegation/delegation-policy.ts +17 -4
  186. package/scripts/delegation/duplicate-read-guard.ts +2 -10
  187. package/scripts/delegation/investigation-guard.ts +15 -73
  188. package/scripts/delegation/investigation-reads.ts +3 -5
  189. package/scripts/dependabot/dependabot-cooldown.ts +194 -0
  190. package/scripts/discovery/repo-discovery.ts +24 -6
  191. package/scripts/doctor/doctor-consumer.ts +2 -5
  192. package/scripts/document/document-byte-budget.ts +9 -6
  193. package/scripts/document/document-scan.ts +1 -1
  194. package/scripts/document/document-section-cli.ts +17 -13
  195. package/scripts/document/document-section-main.ts +12 -0
  196. package/scripts/document/entry-read-budget.ts +2 -2
  197. package/scripts/document/read-set-cli.ts +4 -1
  198. package/scripts/epic/epic-audit-cli.ts +12 -6
  199. package/scripts/epic/epic-audit-orphans.ts +5 -8
  200. package/scripts/epic/epic-audit.ts +52 -1
  201. package/scripts/epic/epic-bundle-apply.ts +137 -0
  202. package/scripts/epic/epic-bundle-cli.ts +32 -121
  203. package/scripts/epic/epic-bundle-evidence.ts +49 -26
  204. package/scripts/epic/epic-bundle-format.ts +116 -0
  205. package/scripts/epic/epic-bundle-main.ts +17 -0
  206. package/scripts/epic/epic-bundle-referenced.ts +14 -3
  207. package/scripts/epic/epic-bundle.ts +17 -9
  208. package/scripts/epic/epic-busy.ts +5 -12
  209. package/scripts/epic/epic-classify.ts +24 -15
  210. package/scripts/epic/epic-cli-argv.ts +31 -0
  211. package/scripts/epic/epic-cli-decide.ts +42 -0
  212. package/scripts/epic/epic-cli.ts +6 -38
  213. package/scripts/epic/epic-close.ts +112 -55
  214. package/scripts/epic/epic-cross-repo.ts +4 -7
  215. package/scripts/epic/epic-decide.ts +119 -0
  216. package/scripts/epic/epic-decision.ts +9 -0
  217. package/scripts/epic/epic-fetch.ts +4 -0
  218. package/scripts/epic/epic-graph.ts +2 -0
  219. package/scripts/epic/epic-issue.ts +5 -1
  220. package/scripts/epic/epic-label-age.ts +1 -1
  221. package/scripts/epic/epic-lane-offer.ts +39 -4
  222. package/scripts/epic/epic-next-main.ts +24 -0
  223. package/scripts/epic/epic-next.ts +6 -24
  224. package/scripts/epic/epic-outside-blocker.ts +6 -2
  225. package/scripts/epic/epic-parse.ts +9 -3
  226. package/scripts/epic/epic-read.ts +1 -0
  227. package/scripts/epic/epic-reconcile.ts +39 -0
  228. package/scripts/epic/epic-run.ts +10 -1
  229. package/scripts/epic/epic-solo.ts +50 -14
  230. package/scripts/epic/epic.ts +41 -7
  231. package/scripts/exports/unused-members-cli.ts +2 -2
  232. package/scripts/followup/followup-checks-event.ts +8 -3
  233. package/scripts/followup/followup-coderabbit-wait.ts +82 -0
  234. package/scripts/followup/followup-review-gates.ts +81 -0
  235. package/scripts/followup/git-followup-stages.ts +13 -3
  236. package/scripts/followup/git-followup-workflow.ts +31 -60
  237. package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
  238. package/scripts/followup/git-pr-followup.ts +36 -8
  239. package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
  240. package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
  241. package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
  242. package/scripts/gate/busy-average.ts +58 -0
  243. package/scripts/gate/check-cpu.ts +60 -0
  244. package/scripts/gate/check-inputs.ts +73 -0
  245. package/scripts/gate/check-reuse.ts +141 -0
  246. package/scripts/gate/command-memory.ts +192 -0
  247. package/scripts/gate/core-admission.ts +218 -28
  248. package/scripts/gate/core-budget-timing.ts +37 -0
  249. package/scripts/gate/core-budget.ts +150 -119
  250. package/scripts/gate/core-wait-record.ts +48 -0
  251. package/scripts/gate/core-wait.ts +162 -0
  252. package/scripts/gate/core-weights.ts +86 -0
  253. package/scripts/gate/free-cores.ts +72 -0
  254. package/scripts/gate/gate-ledger.ts +49 -7
  255. package/scripts/gate/gate-plan.ts +44 -15
  256. package/scripts/gate/gate-report.ts +29 -4
  257. package/scripts/gate/gate-run-steps.ts +195 -0
  258. package/scripts/gate/gate-skip.ts +12 -2
  259. package/scripts/gate/gate-steps.ts +12 -1
  260. package/scripts/gate/held-mark.ts +55 -0
  261. package/scripts/gate/input-fingerprint.ts +42 -0
  262. package/scripts/gate/machine-capacity.ts +124 -31
  263. package/scripts/gate/moved-paths.ts +67 -0
  264. package/scripts/gate/pre-commit-type-check.ts +14 -1
  265. package/scripts/gate/project-checks.ts +5 -12
  266. package/scripts/gate/scoped-green.ts +12 -8
  267. package/scripts/gate/since-green.ts +62 -0
  268. package/scripts/gate/toolchain-inputs.ts +115 -0
  269. package/scripts/gate/verification-gate.ts +65 -129
  270. package/scripts/gate/verification-inputs.ts +250 -0
  271. package/scripts/gh/gh-author-association.ts +96 -9
  272. package/scripts/gh/git-ai-review-scan.ts +4 -2
  273. package/scripts/gh/git-gh-api-path.ts +15 -0
  274. package/scripts/gh/git-gh-branch-rules.ts +73 -0
  275. package/scripts/gh/git-gh-conditional.ts +5 -2
  276. package/scripts/gh/git-gh-issue-read.ts +5 -1
  277. package/scripts/gh/git-gh-issue-rest.ts +1 -0
  278. package/scripts/gh/git-gh-issue-write.ts +77 -17
  279. package/scripts/gh/git-gh-issue.ts +7 -3
  280. package/scripts/gh/git-gh-poll-read.ts +89 -0
  281. package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
  282. package/scripts/gh/git-gh-pr-rest.ts +1 -1
  283. package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
  284. package/scripts/gh/git-gh-pr.ts +27 -15
  285. package/scripts/gh/git-pr-checks-eval.ts +39 -7
  286. package/scripts/gh/git-pr-checks-parse.ts +39 -9
  287. package/scripts/gh/git-pr-merge-checked.ts +80 -0
  288. package/scripts/gh/git-pr.ts +13 -1
  289. package/scripts/git/base-tree.ts +19 -2
  290. package/scripts/git/changed-file-scope.ts +6 -4
  291. package/scripts/git/changed-paths.ts +18 -1
  292. package/scripts/git/git-diff-reads.ts +27 -2
  293. package/scripts/git/git-grep-hits.ts +85 -0
  294. package/scripts/git/git-location-environment.ts +1 -1
  295. package/scripts/git/git-merge-conflicts.ts +83 -0
  296. package/scripts/git/git-preflight.ts +37 -12
  297. package/scripts/git/git-push-transport.ts +1 -2
  298. package/scripts/git/git-schemas.ts +17 -7
  299. package/scripts/git/git-spawn.ts +1 -2
  300. package/scripts/git/git-status.ts +4 -4
  301. package/scripts/git/main-merge-main.ts +12 -0
  302. package/scripts/git/main-merge-regenerate.ts +78 -0
  303. package/scripts/git/main-merge.ts +39 -14
  304. package/scripts/git/main-sync-main.ts +12 -0
  305. package/scripts/git/main-sync.ts +0 -9
  306. package/scripts/git/stash/git-stash.ts +27 -4
  307. package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
  308. package/scripts/git/stash/stash-pop-cli.ts +6 -12
  309. package/scripts/git/stash/stash-pop-main.ts +12 -0
  310. package/scripts/git/stash/stash-push-cli.ts +76 -0
  311. package/scripts/git/stash/stash-push-main.ts +12 -0
  312. package/scripts/hooks/batch-guard.ts +5 -16
  313. package/scripts/hooks/check-commit-message-main.ts +8 -0
  314. package/scripts/hooks/check-commit-message.ts +4 -7
  315. package/scripts/hooks/format-edited-file.ts +8 -24
  316. package/scripts/hooks/pre-commit-lint.ts +118 -0
  317. package/scripts/hooks/pre-push-unit.ts +4 -2
  318. package/scripts/hooks/pretool-guard-cli.ts +1 -8
  319. package/scripts/hooks/pretool-guard.ts +57 -69
  320. package/scripts/hooks/reserved-run.ts +67 -8
  321. package/scripts/hooks/run-hook.sh +18 -11
  322. package/scripts/hooks/shell-rules-notice.ts +37 -0
  323. package/scripts/hooks/stop-actions.ts +185 -0
  324. package/scripts/hooks/stop-guard.ts +72 -27
  325. package/scripts/init/hook-command-rewrite.ts +19 -5
  326. package/scripts/init/hook-launch.ts +15 -12
  327. package/scripts/init/init-actions.ts +0 -6
  328. package/scripts/init/init-ai-copy.ts +10 -36
  329. package/scripts/init/init-bootstrap.ts +9 -8
  330. package/scripts/init/init-dry-run-report.ts +1 -1
  331. package/scripts/init/init-dry-run.ts +1 -1
  332. package/scripts/init/init-file-action.ts +7 -9
  333. package/scripts/init/init-logic-json-merge.ts +2 -2
  334. package/scripts/init/init-logic-migrate.ts +9 -82
  335. package/scripts/init/init-logic.ts +3 -2
  336. package/scripts/init/init-main.ts +12 -0
  337. package/scripts/init/init.ts +5 -12
  338. package/scripts/init/kit-development-versions.ts +3 -7
  339. package/scripts/init/kit-written-paths.ts +2 -2
  340. package/scripts/init/project-profile.ts +5 -4
  341. package/scripts/init/tsconfig-preset-migration.ts +2 -1
  342. package/scripts/init/vscode-tasks.ts +1 -1
  343. package/scripts/issue/defect-origin-cli.ts +106 -0
  344. package/scripts/issue/defect-origin-line.ts +60 -0
  345. package/scripts/issue/defect-origin-main.ts +11 -0
  346. package/scripts/issue/defect-origin.ts +114 -0
  347. package/scripts/issue/defect-rate-cli.ts +34 -78
  348. package/scripts/issue/defect-rate.ts +0 -16
  349. package/scripts/issue/defect-report-cli.ts +128 -0
  350. package/scripts/issue/defect-report-format.ts +56 -0
  351. package/scripts/issue/defect-report-main.ts +11 -0
  352. package/scripts/issue/defect-report.ts +160 -0
  353. package/scripts/issue/expected-effect-lint.ts +60 -0
  354. package/scripts/issue/issue-already-done-cli.ts +62 -0
  355. package/scripts/issue/issue-body-or-comment.ts +40 -0
  356. package/scripts/issue/issue-cite-cli.ts +33 -22
  357. package/scripts/issue/issue-cite-main.ts +12 -0
  358. package/scripts/issue/issue-classification.ts +13 -8
  359. package/scripts/issue/issue-comment-cli.ts +10 -24
  360. package/scripts/issue/issue-comment-main.ts +12 -0
  361. package/scripts/issue/issue-evidence-exit.ts +100 -0
  362. package/scripts/issue/issue-file-cli.ts +29 -7
  363. package/scripts/issue/issue-file.ts +19 -19
  364. package/scripts/issue/issue-fold-cli.ts +2 -11
  365. package/scripts/issue/issue-fold-main.ts +12 -0
  366. package/scripts/issue/issue-labels.ts +81 -90
  367. package/scripts/issue/issue-lint-cli.ts +7 -13
  368. package/scripts/issue/issue-lint-main.ts +12 -0
  369. package/scripts/issue/issue-measured-cli.ts +56 -0
  370. package/scripts/issue/issue-merged.ts +19 -2
  371. package/scripts/issue/issue-not-before-label.ts +135 -0
  372. package/scripts/issue/issue-not-before.ts +111 -0
  373. package/scripts/issue/issue-number-shape.ts +15 -1
  374. package/scripts/issue/issue-park.ts +28 -0
  375. package/scripts/issue/issue-plan-cli.ts +151 -0
  376. package/scripts/issue/issue-priority.ts +151 -0
  377. package/scripts/issue/issue-rank.ts +7 -1
  378. package/scripts/issue/issue-read-cli.ts +3 -10
  379. package/scripts/issue/issue-read-main.ts +12 -0
  380. package/scripts/issue/issue-read.ts +29 -5
  381. package/scripts/issue/issue-release-cli.ts +0 -10
  382. package/scripts/issue/issue-release-main.ts +13 -0
  383. package/scripts/issue/issue-release.ts +7 -12
  384. package/scripts/issue/issue-sample-gate.ts +192 -0
  385. package/scripts/issue/issue-sample-source.ts +76 -0
  386. package/scripts/issue/issue-scout-cli.ts +19 -25
  387. package/scripts/issue/issue-scout-main.ts +14 -0
  388. package/scripts/issue/issue-state-cli.ts +0 -10
  389. package/scripts/issue/issue-state-main.ts +12 -0
  390. package/scripts/issue/issue-watch-diff.ts +56 -15
  391. package/scripts/issue/issue-watch.ts +2 -1
  392. package/scripts/issue/issue-wip.ts +2 -7
  393. package/scripts/issue/markdown-section.ts +19 -5
  394. package/scripts/issue/measure-rerun-cli.ts +13 -8
  395. package/scripts/issue/plan-consumers-cli.ts +39 -0
  396. package/scripts/issue/plan-consumers-main.ts +11 -0
  397. package/scripts/issue/plan-consumers-section.ts +55 -0
  398. package/scripts/issue/plan-consumers.ts +127 -0
  399. package/scripts/josh/agent-session-environment.ts +1 -1
  400. package/scripts/josh/command-usage.ts +82 -0
  401. package/scripts/josh/file-map-stamp.ts +49 -16
  402. package/scripts/josh/hook-decision.ts +32 -20
  403. package/scripts/josh/josh-command-map.ts +6 -1
  404. package/scripts/josh/josh-command-types.ts +65 -13
  405. package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
  406. package/scripts/josh/josh-commands-ai.ts +169 -157
  407. package/scripts/josh/josh-commands-backlog.ts +82 -16
  408. package/scripts/josh/josh-commands-clone.ts +1 -0
  409. package/scripts/josh/josh-commands-development.ts +111 -71
  410. package/scripts/josh/josh-commands-document.ts +43 -1
  411. package/scripts/josh/josh-commands-epic.ts +171 -0
  412. package/scripts/josh/josh-commands-hooks.ts +31 -2
  413. package/scripts/josh/josh-commands-issue-write.ts +181 -0
  414. package/scripts/josh/josh-commands-issue.ts +124 -24
  415. package/scripts/josh/josh-commands-lane.ts +112 -2
  416. package/scripts/josh/josh-commands-lint.ts +19 -8
  417. package/scripts/josh/josh-commands-maintenance.ts +112 -4
  418. package/scripts/josh/josh-commands-pause.ts +29 -0
  419. package/scripts/josh/josh-commands-progress.ts +87 -0
  420. package/scripts/josh/josh-commands-project.ts +138 -9
  421. package/scripts/josh/josh-commands-review.ts +124 -0
  422. package/scripts/josh/josh-commands-run.ts +211 -23
  423. package/scripts/josh/josh-commands-ship.ts +169 -0
  424. package/scripts/josh/josh-commands-split.ts +9 -0
  425. package/scripts/josh/josh-commands-versioning.ts +49 -2
  426. package/scripts/josh/josh-commands-workflow.ts +149 -6
  427. package/scripts/josh/josh-logic.ts +11 -27
  428. package/scripts/josh/josh.ts +14 -5
  429. package/scripts/josh/package-directory.ts +18 -0
  430. package/scripts/josh/process-identity.ts +13 -4
  431. package/scripts/josh/session-language-cli.ts +4 -8
  432. package/scripts/josh/session-language-main.ts +13 -0
  433. package/scripts/josh/session-language.ts +6 -1
  434. package/scripts/josh/shared-cache.ts +90 -0
  435. package/scripts/josh/stamp-file.ts +9 -15
  436. package/scripts/lane/lane-await.ts +51 -12
  437. package/scripts/lane/lane-cache.ts +5 -30
  438. package/scripts/lane/lane-capacity.ts +19 -22
  439. package/scripts/lane/lane-check-stats.ts +97 -0
  440. package/scripts/lane/lane-child-invocation.ts +43 -4
  441. package/scripts/lane/lane-cli.ts +15 -5
  442. package/scripts/lane/lane-close.ts +86 -18
  443. package/scripts/lane/lane-core-wait-stats.ts +66 -0
  444. package/scripts/lane/lane-dispatch.ts +27 -6
  445. package/scripts/lane/lane-gap-stats.ts +156 -0
  446. package/scripts/lane/lane-guard-policy.ts +2 -2
  447. package/scripts/lane/lane-handoff.ts +76 -1
  448. package/scripts/lane/lane-held-stats.ts +129 -0
  449. package/scripts/lane/lane-install.ts +16 -15
  450. package/scripts/lane/lane-launch-cli.ts +0 -9
  451. package/scripts/lane/lane-launch-main.ts +12 -0
  452. package/scripts/lane/lane-ledger-schema.ts +266 -0
  453. package/scripts/lane/lane-ledger.ts +108 -97
  454. package/scripts/lane/lane-limit-cli.ts +19 -9
  455. package/scripts/lane/lane-measure-cli.ts +58 -10
  456. package/scripts/lane/lane-open.ts +9 -1
  457. package/scripts/lane/lane-parked.ts +3 -3
  458. package/scripts/lane/lane-pause-cli.ts +130 -0
  459. package/scripts/lane/lane-pause.ts +158 -0
  460. package/scripts/lane/lane-preserve.ts +29 -1
  461. package/scripts/lane/lane-process-table.ts +166 -0
  462. package/scripts/lane/lane-reap-settle.ts +124 -0
  463. package/scripts/lane/lane-reap.ts +50 -15
  464. package/scripts/lane/lane-registry.ts +33 -10
  465. package/scripts/lane/lane-residents.ts +162 -0
  466. package/scripts/lane/lane-restart.ts +26 -27
  467. package/scripts/lane/lane-round-two-stats.ts +49 -0
  468. package/scripts/lane/lane-sampler.ts +4 -0
  469. package/scripts/lane/lane-session-action.ts +160 -0
  470. package/scripts/lane/lane-session-broker.ts +134 -134
  471. package/scripts/lane/lane-snapshot-trace.ts +84 -0
  472. package/scripts/lane/lane-spans.ts +51 -0
  473. package/scripts/lane/lane-spent.ts +6 -3
  474. package/scripts/lane/lane-stage-stats.ts +7 -2
  475. package/scripts/lane/lane-state.ts +302 -0
  476. package/scripts/lane/lane-stats.ts +58 -4
  477. package/scripts/lane/lane-stop-stats.ts +113 -37
  478. package/scripts/lane/lane-test-related-stats.ts +127 -0
  479. package/scripts/lane/lane-transcript-calls.ts +145 -0
  480. package/scripts/lane/lane-transcript-stats.ts +168 -0
  481. package/scripts/lane/lane-vacant.ts +13 -3
  482. package/scripts/lane/lane-withdraw-cli.ts +72 -0
  483. package/scripts/lane/lane-withdraw.ts +183 -0
  484. package/scripts/lane/process-directories.ts +70 -0
  485. package/scripts/lane/process-lane-marks.ts +94 -0
  486. package/scripts/lib/atomic-write.ts +62 -0
  487. package/scripts/lib/buffered-process.ts +12 -5
  488. package/scripts/lib/cli-flags.ts +53 -0
  489. package/scripts/lib/figure-format.ts +63 -0
  490. package/scripts/lib/json-value.ts +9 -1
  491. package/scripts/lib/package-manifest.ts +35 -0
  492. package/scripts/lib/read-file.ts +3 -1
  493. package/scripts/lib/stamped-memo.ts +63 -0
  494. package/scripts/lib/stdout-on-stderr.ts +24 -0
  495. package/scripts/lib/timeouts.ts +9 -0
  496. package/scripts/lib/transcript-record.ts +91 -0
  497. package/scripts/lines/effective-limit.ts +1 -1
  498. package/scripts/lint/eslint-cache-dependencies.ts +145 -0
  499. package/scripts/lint/eslint-daemon.ts +265 -0
  500. package/scripts/lint/format.ts +14 -5
  501. package/scripts/lint/import-graph.ts +279 -0
  502. package/scripts/lint/lint-gate-scope.ts +102 -0
  503. package/scripts/lint/lint-parallel-main.ts +19 -0
  504. package/scripts/lint/lint-parallel.ts +72 -33
  505. package/scripts/lint/lint-related-scope.ts +33 -24
  506. package/scripts/lint/lint-related.ts +38 -6
  507. package/scripts/notify/confirmation-options.ts +1 -2
  508. package/scripts/notify/telegram-notify.ts +20 -20
  509. package/scripts/notify/telegram-test-logic.ts +0 -1
  510. package/scripts/notify/telegram-test-main.ts +8 -0
  511. package/scripts/notify/telegram-test.ts +12 -11
  512. package/scripts/observations/observation-ledger.ts +13 -0
  513. package/scripts/observations/observations-flush-landing.ts +5 -3
  514. package/scripts/observations/observations-flush.ts +6 -1
  515. package/scripts/overrides/overrides-check.ts +2 -5
  516. package/scripts/overrides/overrides-files.ts +2 -1
  517. package/scripts/overrides/overrides-logic.ts +3 -6
  518. package/scripts/package/verify-optional-eslint-install.ts +8 -6
  519. package/scripts/propagate/propagate-publish.ts +2 -7
  520. package/scripts/propagate/propagate-targets.ts +4 -12
  521. package/scripts/refactor/import-graph.ts +9 -7
  522. package/scripts/release/github-release-runs.ts +17 -6
  523. package/scripts/release/release-approval-prune.ts +18 -0
  524. package/scripts/release/release-history.ts +1 -3
  525. package/scripts/release/release-progress.ts +42 -22
  526. package/scripts/release/release-publish-run.ts +39 -0
  527. package/scripts/release/release-publish.ts +6 -6
  528. package/scripts/release/release-scope-cli.ts +0 -10
  529. package/scripts/release/release-scope-main.ts +12 -0
  530. package/scripts/repo/repo-setting.ts +3 -6
  531. package/scripts/repo/required-checks-logic.ts +6 -15
  532. package/scripts/report/report-format-reference.ts +4 -0
  533. package/scripts/report/report-labels.ts +155 -0
  534. package/scripts/report/report-lint-cli.ts +3 -0
  535. package/scripts/report/report-lint.ts +85 -110
  536. package/scripts/report/report-template-cli.ts +59 -0
  537. package/scripts/report/report-template.ts +112 -0
  538. package/scripts/review/acceptance-map-check.ts +61 -0
  539. package/scripts/review/acceptance-map.ts +206 -0
  540. package/scripts/review/removed-tests-check.ts +86 -0
  541. package/scripts/review/removed-tests.ts +149 -0
  542. package/scripts/review/review-brief-cli.ts +82 -16
  543. package/scripts/review/review-brief-main.ts +12 -0
  544. package/scripts/review/review-brief.ts +31 -3
  545. package/scripts/review/review-code-tree.ts +10 -6
  546. package/scripts/review/review-comment-round.ts +26 -8
  547. package/scripts/review/review-finding-ledger.ts +30 -15
  548. package/scripts/review/review-interaction.ts +94 -0
  549. package/scripts/review/review-readers-scan.ts +163 -0
  550. package/scripts/review/review-record-cli.ts +69 -30
  551. package/scripts/review/review-record-main.ts +12 -0
  552. package/scripts/review/review-round-one-blobs.ts +221 -0
  553. package/scripts/review/review-round2-cli.ts +49 -12
  554. package/scripts/review/review-round2.ts +80 -12
  555. package/scripts/review/review-stamps.ts +19 -1
  556. package/scripts/review/review-stop-log.ts +96 -0
  557. package/scripts/review/review-stops-cli.ts +85 -0
  558. package/scripts/review/review-tree.ts +6 -17
  559. package/scripts/review/review-untouched-readers.ts +146 -0
  560. package/scripts/review/test-titles.ts +118 -0
  561. package/scripts/rules/agent-model.ts +67 -0
  562. package/scripts/rules/bash-triggers.ts +46 -3
  563. package/scripts/rules/decision-oracle-batch.ts +9 -1
  564. package/scripts/rules/decision-oracle.ts +2 -2
  565. package/scripts/rules/delivered-rules.ts +90 -3
  566. package/scripts/rules/destructive-command.ts +8 -1
  567. package/scripts/rules/direct-filing.ts +10 -2
  568. package/scripts/rules/direct-issue-comment.ts +117 -0
  569. package/scripts/rules/direct-pr-create.ts +69 -3
  570. package/scripts/rules/early-heartbeat.ts +2 -1
  571. package/scripts/rules/file-body.ts +7 -0
  572. package/scripts/rules/filing-cap.ts +8 -0
  573. package/scripts/rules/firing-point.ts +6 -5
  574. package/scripts/rules/git-argv.ts +72 -14
  575. package/scripts/rules/git-force.ts +12 -2
  576. package/scripts/rules/guard-remedy.ts +121 -0
  577. package/scripts/rules/implementation-cut-verdict.ts +1 -1
  578. package/scripts/rules/implementation-cut.ts +11 -3
  579. package/scripts/rules/index-guard.ts +8 -1
  580. package/scripts/rules/issue-comments.ts +76 -7
  581. package/scripts/rules/josh-git-bare.ts +7 -0
  582. package/scripts/rules/lane-background.ts +67 -25
  583. package/scripts/rules/lane-carry-conflict.ts +6 -0
  584. package/scripts/rules/lane-direct-tool.ts +74 -0
  585. package/scripts/rules/lane-interactive-ask.ts +9 -2
  586. package/scripts/rules/lane-park.ts +45 -23
  587. package/scripts/rules/lane-split-park.ts +10 -2
  588. package/scripts/rules/lane-switch-main.ts +7 -0
  589. package/scripts/rules/last-prompt.ts +50 -5
  590. package/scripts/rules/oracle-consulted.ts +10 -0
  591. package/scripts/rules/oracle-firing.ts +1 -0
  592. package/scripts/rules/oracle-list-cli.ts +7 -0
  593. package/scripts/rules/permission-guards.ts +3 -0
  594. package/scripts/rules/piped-verification.ts +4 -2
  595. package/scripts/rules/poll-loop.ts +7 -0
  596. package/scripts/rules/pr-merge.ts +123 -0
  597. package/scripts/rules/protected-files.ts +32 -5
  598. package/scripts/rules/raw-field-body.ts +6 -0
  599. package/scripts/rules/rule-body-guard.ts +8 -0
  600. package/scripts/rules/rule-list.ts +12 -28
  601. package/scripts/rules/rule-rewrite.ts +114 -0
  602. package/scripts/rules/rule-value-cache.ts +4 -9
  603. package/scripts/rules/rule-value-cli.ts +51 -32
  604. package/scripts/rules/rule-value.ts +8 -2
  605. package/scripts/rules/shell-segments.ts +50 -0
  606. package/scripts/rules/stop-decision.ts +77 -0
  607. package/scripts/rules/stop-rule-rows.ts +64 -0
  608. package/scripts/rules/stop-rules.ts +150 -51
  609. package/scripts/rules/tail-commands.ts +15 -1
  610. package/scripts/rules/test-declared-commit.ts +11 -1
  611. package/scripts/rules/third-party-write.ts +7 -0
  612. package/scripts/rules/timed-rerun.ts +69 -0
  613. package/scripts/rules/worktree-guard.ts +13 -3
  614. package/scripts/run/board/run-board-app-name.ts +23 -0
  615. package/scripts/run/board/run-board-cli.ts +65 -30
  616. package/scripts/run/board/run-board-closed.ts +8 -2
  617. package/scripts/run/board/run-board-earlier.ts +94 -0
  618. package/scripts/run/board/run-board-ending-reason.ts +67 -0
  619. package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
  620. package/scripts/run/board/run-board-estimate.ts +98 -0
  621. package/scripts/run/board/run-board-fit.ts +153 -36
  622. package/scripts/run/board/run-board-fold.ts +123 -0
  623. package/scripts/run/board/run-board-fresh.ts +2 -2
  624. package/scripts/run/board/run-board-gather-live.ts +29 -0
  625. package/scripts/run/board/run-board-gather-thread.ts +189 -0
  626. package/scripts/run/board/run-board-gather-worker.ts +29 -0
  627. package/scripts/run/board/run-board-gather.ts +187 -0
  628. package/scripts/run/board/run-board-github.ts +119 -31
  629. package/scripts/run/board/run-board-header.ts +86 -21
  630. package/scripts/run/board/run-board-keys.ts +58 -0
  631. package/scripts/run/board/run-board-kind.ts +20 -6
  632. package/scripts/run/board/run-board-labels.ts +118 -71
  633. package/scripts/run/board/run-board-lane-state.ts +109 -0
  634. package/scripts/run/board/run-board-lane-time.ts +122 -0
  635. package/scripts/run/board/run-board-layout.ts +240 -61
  636. package/scripts/run/board/run-board-length.ts +52 -0
  637. package/scripts/run/board/run-board-machine.ts +8 -4
  638. package/scripts/run/board/run-board-main.ts +12 -0
  639. package/scripts/run/board/run-board-notes.ts +52 -31
  640. package/scripts/run/board/run-board-now.ts +1 -1
  641. package/scripts/run/board/run-board-operation.ts +15 -33
  642. package/scripts/run/board/run-board-phase.ts +1 -1
  643. package/scripts/run/board/run-board-plan-shared.ts +115 -0
  644. package/scripts/run/board/run-board-plan.ts +55 -3
  645. package/scripts/run/board/run-board-planning.ts +45 -0
  646. package/scripts/run/board/run-board-priority.ts +44 -0
  647. package/scripts/run/board/run-board-process-groups.ts +195 -0
  648. package/scripts/run/board/run-board-read.ts +153 -13
  649. package/scripts/run/board/run-board-reason.ts +238 -45
  650. package/scripts/run/board/run-board-released.ts +35 -0
  651. package/scripts/run/board/run-board-render-checks.ts +39 -5
  652. package/scripts/run/board/run-board-render-condition.ts +96 -0
  653. package/scripts/run/board/run-board-render-drawn.ts +67 -0
  654. package/scripts/run/board/run-board-render-foot.ts +59 -0
  655. package/scripts/run/board/run-board-render-icon.ts +35 -0
  656. package/scripts/run/board/run-board-render-lanes.ts +145 -0
  657. package/scripts/run/board/run-board-render-lead.ts +80 -0
  658. package/scripts/run/board/run-board-render-legend.ts +117 -47
  659. package/scripts/run/board/run-board-render-notes.ts +156 -29
  660. package/scripts/run/board/run-board-render-processes.ts +196 -0
  661. package/scripts/run/board/run-board-render-section.ts +119 -0
  662. package/scripts/run/board/run-board-render-slot.ts +3 -36
  663. package/scripts/run/board/run-board-render-tail.ts +115 -48
  664. package/scripts/run/board/run-board-render-time.ts +56 -0
  665. package/scripts/run/board/run-board-render-title.ts +117 -24
  666. package/scripts/run/board/run-board-render-waits.ts +125 -0
  667. package/scripts/run/board/run-board-render.ts +206 -259
  668. package/scripts/run/board/run-board-roots.ts +54 -0
  669. package/scripts/run/board/run-board-row-yield.ts +10 -4
  670. package/scripts/run/board/run-board-setup.ts +1 -12
  671. package/scripts/run/board/run-board-snapshot.ts +111 -0
  672. package/scripts/run/board/run-board-spin.ts +2 -2
  673. package/scripts/run/board/run-board-state.ts +23 -29
  674. package/scripts/run/board/run-board-status.ts +206 -79
  675. package/scripts/run/board/run-board-thanks-read.ts +2 -2
  676. package/scripts/run/board/run-board-tick.ts +123 -104
  677. package/scripts/run/board/run-board-usage-board.ts +78 -0
  678. package/scripts/run/board/run-board-usage-lanes.ts +113 -0
  679. package/scripts/run/board/run-board-usage-listing.ts +93 -0
  680. package/scripts/run/board/run-board-usage-read.ts +120 -150
  681. package/scripts/run/board/run-board-usage-rusage.ts +19 -7
  682. package/scripts/run/board/run-board-usage-text.ts +139 -51
  683. package/scripts/run/board/run-board-usage-top.ts +102 -0
  684. package/scripts/run/board/run-board-usage.ts +89 -72
  685. package/scripts/run/board/run-board-usual.ts +20 -9
  686. package/scripts/run/carry/run-carry-args.ts +4 -7
  687. package/scripts/run/carry/run-carry-conversation.ts +1 -1
  688. package/scripts/run/carry/run-carry.ts +9 -4
  689. package/scripts/run/cut/run-cut-cli.ts +3 -2
  690. package/scripts/run/cut/run-cut-handoff.ts +2 -2
  691. package/scripts/run/cut/run-cut-report.ts +16 -0
  692. package/scripts/run/detached-launch.ts +23 -4
  693. package/scripts/run/entry/run-entry-cli.ts +8 -1
  694. package/scripts/run/event/run-event-cli.ts +1 -5
  695. package/scripts/run/event/run-event-filed.ts +12 -6
  696. package/scripts/run/event/run-event-follow.ts +2 -3
  697. package/scripts/run/event/run-event-render.ts +7 -10
  698. package/scripts/run/event/run-event-scope.ts +20 -2
  699. package/scripts/run/event/run-event-stream-emit.ts +78 -11
  700. package/scripts/run/event/run-event-stream.ts +37 -7
  701. package/scripts/run/hold/run-hold-adopt.ts +65 -0
  702. package/scripts/run/hold/run-hold-cli.ts +93 -22
  703. package/scripts/run/hold/run-hold-main.ts +12 -0
  704. package/scripts/run/hold/run-hold-member.ts +37 -0
  705. package/scripts/run/hold/run-hold-session.ts +46 -0
  706. package/scripts/run/hold/run-hold.ts +7 -1
  707. package/scripts/run/hold/run-stop-notify.ts +183 -0
  708. package/scripts/run/launch-priority.ts +32 -0
  709. package/scripts/run/merge/run-merge-auth.ts +31 -0
  710. package/scripts/run/merge/run-merge-cli.ts +72 -107
  711. package/scripts/run/merge/run-merge-close.ts +74 -0
  712. package/scripts/run/merge/run-merge-collect.ts +6 -13
  713. package/scripts/run/merge/run-merge-driver.ts +71 -0
  714. package/scripts/run/merge/run-merge-main.ts +12 -0
  715. package/scripts/run/merge/run-merge-outcome.ts +23 -0
  716. package/scripts/run/merge/run-merge-restart.ts +39 -0
  717. package/scripts/run/merge/run-merge-ship.ts +20 -4
  718. package/scripts/run/merge/run-merge-signals.ts +123 -0
  719. package/scripts/run/merge/run-merge-steps.ts +128 -83
  720. package/scripts/run/merge/run-merge.ts +53 -40
  721. package/scripts/run/park/run-park-cli.ts +91 -0
  722. package/scripts/run/park/run-park.ts +88 -0
  723. package/scripts/run/park/run-stalled.ts +68 -0
  724. package/scripts/run/pause/run-pause-cli.ts +73 -0
  725. package/scripts/run/pause/run-pause.ts +251 -0
  726. package/scripts/run/progress/run-progress-cli.ts +4 -12
  727. package/scripts/run/progress/run-progress-clock.ts +1 -1
  728. package/scripts/run/progress/run-progress-config.ts +6 -14
  729. package/scripts/run/progress/run-progress-main.ts +12 -0
  730. package/scripts/run/progress/run-progress.ts +1 -4
  731. package/scripts/run/review/run-review.ts +2 -1
  732. package/scripts/run/run-ending.ts +1 -0
  733. package/scripts/run/run-invocation.ts +5 -6
  734. package/scripts/run/run-liveness-cli.ts +6 -8
  735. package/scripts/run/run-liveness.ts +61 -30
  736. package/scripts/run/run-next.ts +1 -1
  737. package/scripts/run/run-parent-cut-hook.ts +2 -2
  738. package/scripts/run/run-poll-hook.ts +157 -0
  739. package/scripts/run/run-preflight.ts +18 -3
  740. package/scripts/run/run-prep-cli.ts +1 -10
  741. package/scripts/run/run-prep-locate.ts +7 -50
  742. package/scripts/run/run-prep-main.ts +12 -0
  743. package/scripts/run/run-prep.ts +6 -0
  744. package/scripts/run/run-report-cli.ts +101 -13
  745. package/scripts/run/run-report-handoff.ts +114 -0
  746. package/scripts/run/run-step-cli.ts +22 -15
  747. package/scripts/run/run-step-section.ts +85 -0
  748. package/scripts/run/run-step.ts +1 -1
  749. package/scripts/run/run-stranded-detect.ts +13 -0
  750. package/scripts/run/run-watcher-guard-cli.ts +1 -1
  751. package/scripts/run/run-watcher-guard.ts +1 -1
  752. package/scripts/run/ship/run-ship-args.ts +121 -0
  753. package/scripts/run/ship/run-ship-body-draft.ts +110 -0
  754. package/scripts/run/ship/run-ship-cli.ts +67 -151
  755. package/scripts/run/ship/run-ship-detach.ts +27 -7
  756. package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
  757. package/scripts/run/ship/run-ship-next.ts +27 -3
  758. package/scripts/run/ship/run-ship-overlap.ts +232 -0
  759. package/scripts/run/ship/run-ship-place.ts +96 -0
  760. package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
  761. package/scripts/run/ship/run-ship-pre-detach.ts +102 -27
  762. package/scripts/run/ship/run-ship-preflight.ts +161 -30
  763. package/scripts/run/ship/run-ship-probe.ts +11 -3
  764. package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
  765. package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
  766. package/scripts/run/ship/run-ship-return.ts +123 -15
  767. package/scripts/run/ship/run-ship-review-steps.ts +105 -149
  768. package/scripts/run/ship/run-ship-review.ts +73 -6
  769. package/scripts/run/ship/run-ship-reviewer.ts +207 -0
  770. package/scripts/run/ship/run-ship-stage.ts +55 -6
  771. package/scripts/run/ship/run-ship-steps.ts +46 -15
  772. package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
  773. package/scripts/run/ship/run-ship-stop-context.ts +206 -0
  774. package/scripts/run/ship/run-ship-stop-text.ts +11 -6
  775. package/scripts/run/ship/run-ship-sync.ts +57 -12
  776. package/scripts/run/ship/run-ship.ts +30 -2
  777. package/scripts/run/tidy/run-tidy-cli.ts +0 -4
  778. package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
  779. package/scripts/run/tidy/run-tidy-main.ts +8 -0
  780. package/scripts/run/wake/run-wake-cli.ts +119 -100
  781. package/scripts/run/wake/run-wake-code.ts +83 -0
  782. package/scripts/run/wake/run-wake-driver.ts +19 -8
  783. package/scripts/run/wake/run-wake-loop.ts +34 -3
  784. package/scripts/run/wake/run-wake-main.ts +13 -0
  785. package/scripts/run/wake/run-wake-ports.ts +90 -0
  786. package/scripts/run/wake/run-wake-takeover.ts +66 -0
  787. package/scripts/run/wake/run-wake.ts +2 -1
  788. package/scripts/safe-chain/pack-hook.ts +2 -2
  789. package/scripts/safe-chain/preinstall-command.ts +2 -1
  790. package/scripts/safe-chain/project-config.ts +3 -9
  791. package/scripts/security/security-audit-main.ts +8 -0
  792. package/scripts/security/security-audit-provision-logic.ts +0 -11
  793. package/scripts/security/security-audit-provision-main.ts +12 -0
  794. package/scripts/security/security-audit-provision.ts +11 -26
  795. package/scripts/security/security-audit.ts +6 -7
  796. package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
  797. package/scripts/split/split-assess-cli.ts +2 -2
  798. package/scripts/split/split-assess.ts +15 -0
  799. package/scripts/split/split-measure.ts +65 -0
  800. package/scripts/sync/claude-settings-merge.ts +8 -15
  801. package/scripts/sync/directory-copy-guard.ts +4 -9
  802. package/scripts/sync/file-content.ts +78 -8
  803. package/scripts/sync/sync-ai-files.ts +3 -5
  804. package/scripts/sync/sync-configs.ts +11 -23
  805. package/scripts/sync/sync-hook-safety.ts +4 -10
  806. package/scripts/sync/sync-main.ts +11 -0
  807. package/scripts/sync/sync.ts +25 -37
  808. package/scripts/test/test-declared-changed.ts +2 -2
  809. package/scripts/test/test-declared.ts +1 -1
  810. package/scripts/test/test-e2e-guard.ts +55 -6
  811. package/scripts/test/test-e2e-stamp.ts +38 -0
  812. package/scripts/test/test-pinned-logic.ts +145 -0
  813. package/scripts/test/test-pinned-main.ts +78 -0
  814. package/scripts/test/test-pinned.ts +100 -0
  815. package/scripts/test/test-read-map.ts +264 -0
  816. package/scripts/test/test-read-recording.ts +91 -0
  817. package/scripts/test/test-read-trace.ts +148 -0
  818. package/scripts/test/test-red-main.ts +12 -0
  819. package/scripts/test/test-red.ts +12 -30
  820. package/scripts/test/test-related-main.ts +18 -0
  821. package/scripts/test/test-related-record.ts +119 -0
  822. package/scripts/test/test-related-scope.ts +229 -43
  823. package/scripts/test/test-related.ts +300 -22
  824. package/scripts/test/test-unit-guard-main.ts +15 -0
  825. package/scripts/test/test-unit-guard.ts +54 -21
  826. package/scripts/test/unit-count-file.ts +37 -0
  827. package/scripts/test/unit-run-marker.ts +162 -0
  828. package/scripts/test/unit-setup-files.ts +51 -0
  829. package/scripts/test/unit-worker-share.ts +71 -137
  830. package/scripts/test/whole-suite-files.ts +63 -0
  831. package/scripts/time-runtime/time-background.ts +20 -2
  832. package/scripts/time-runtime/time-bundles.ts +4 -3
  833. package/scripts/time-runtime/time-density-hook.ts +8 -6
  834. package/scripts/time-runtime/time-followup-stage.ts +1 -3
  835. package/scripts/time-runtime/time-format.ts +5 -28
  836. package/scripts/time-runtime/time-markers.ts +10 -1
  837. package/scripts/time-runtime/time-shell.ts +126 -14
  838. package/scripts/time-runtime/time-spans.ts +1 -0
  839. package/scripts/time-runtime/time-tool-call.ts +7 -0
  840. package/scripts/time-runtime/time-transcript-line.ts +49 -62
  841. package/scripts/uninstall/uninstall.ts +1 -1
  842. package/scripts/version/bump-version-main.ts +12 -0
  843. package/scripts/version/bump-version.ts +25 -25
  844. package/scripts/version/effective-upstream.ts +6 -12
  845. package/scripts/version/latest-corepack.ts +17 -32
  846. package/scripts/version/latest-if-required-cli.ts +93 -0
  847. package/scripts/version/latest-lane-guard-main.ts +8 -0
  848. package/scripts/version/latest-lane-guard.ts +0 -4
  849. package/scripts/version/latest-scope-cli.ts +0 -9
  850. package/scripts/version/latest-scope-main.ts +12 -0
  851. package/scripts/version/latest-update.ts +5 -5
  852. package/scripts/version/npm-registry.ts +44 -6
  853. package/scripts/version/publishable-range-check.ts +5 -16
  854. package/scripts/version/release-age.ts +1 -1
  855. package/scripts/version/release-hold.ts +1 -1
  856. package/scripts/version/release-window.ts +38 -0
  857. package/scripts/version/running-binary.ts +1 -1
  858. package/scripts/version/safe-chain-version-update.ts +3 -8
  859. package/scripts/version/version-targets.ts +6 -28
  860. package/templates/dependabot.yml +29 -0
  861. package/templates/gitignore +10 -3
  862. package/templates/pnpm-workspace.basic.yaml +1 -1
  863. package/templates/sonar-project.properties +3 -2
  864. package/templates/workflows/ci.yml +12 -4
  865. package/templates/workflows/github-release.yml +4 -0
  866. package/tsconfig.sonar.json +1 -1
  867. package/.ncurc.json +0 -3
  868. package/dist/hooks/batch-guard.js +0 -29
  869. package/dist/hooks/chunk-43ZHT22P.js +0 -3495
  870. package/dist/hooks/chunk-CDY4NFQG.js +0 -15
  871. package/dist/hooks/chunk-EUMACUK2.js +0 -2038
  872. package/dist/hooks/chunk-H5HVWYXK.js +0 -359
  873. package/dist/hooks/chunk-IIGFYXKC.js +0 -7104
  874. package/dist/hooks/chunk-IX6TTTI6.js +0 -95
  875. package/dist/hooks/chunk-J47HU5H5.js +0 -237
  876. package/dist/hooks/chunk-K4EOONYM.js +0 -45
  877. package/dist/hooks/chunk-K4LMBQC2.js +0 -68
  878. package/dist/hooks/chunk-SHGPANFB.js +0 -56
  879. package/dist/hooks/chunk-YHBZAJSV.js +0 -79
  880. package/dist/hooks/chunk-YYPI7SJZ.js +0 -131
  881. package/dist/hooks/duplicate-read-guard.js +0 -30
  882. package/dist/hooks/investigation-guard.js +0 -32
  883. package/scripts/backlog/backlog-stalled-cli.ts +0 -30
  884. package/scripts/cost-runtime/cost-format.ts +0 -29
  885. package/scripts/init/basic-path-migration.ts +0 -24
  886. package/scripts/issue/issue-backlinks-cli.ts +0 -93
  887. package/scripts/josh/josh-commands-guard.ts +0 -38
  888. package/scripts/lint/cross-file-recheck.ts +0 -155
  889. package/scripts/registry-migration/migrate-logic.ts +0 -237
  890. package/scripts/registry-migration/migrate.ts +0 -292
  891. package/scripts/registry-migration/user-npmrc.ts +0 -15
  892. package/scripts/rules/rule-guard.ts +0 -23
  893. package/scripts/rules/rule-registry-rows.ts +0 -282
  894. package/scripts/rules/rule-registry.ts +0 -109
  895. package/scripts/run/run-stranded-cli.ts +0 -27
@@ -1,14 +1,13 @@
1
- import { agent_argv, type AgentArgv } from '#scripts/agent/agent-argv'
2
- import { agent_role_profile, type AgentProfile } from '#scripts/agent/agent-role-profile'
3
- import { PROJECT_ROOT } from '#scripts/init/init-paths'
4
- import { josh_command, type JoshResult } from '#scripts/josh/josh-run'
1
+ import type { JoshResult } from '#scripts/josh/josh-run'
5
2
  import { stamp_file } from '#scripts/josh/stamp-file'
6
- import { lane_child_marker } from '#scripts/lane/lane-child-marker'
7
- import { lane_session_broker } from '#scripts/lane/lane-session-broker'
3
+ import { lane_ledger } from '#scripts/lane/lane-ledger'
4
+ import { review_interaction } from '#scripts/review/review-interaction'
8
5
  import { review_record } from '#scripts/review/review-record'
9
- import { detached_launch } from '#scripts/run/detached-launch'
6
+ import { review_round2 } from '#scripts/review/review-round2'
10
7
  import { run_ship_review, type RoundOutcome, type ScoredVerdict } from './run-ship-review'
11
- import { run_ship_scoped, type Phase } from './run-ship-scoped'
8
+ import { run_ship_reviewer, type Round } from './run-ship-reviewer'
9
+ import { run_ship_scoped } from './run-ship-scoped'
10
+ import { run_ship_stop_cause } from './run-ship-stop-cause'
12
11
  import type { StepResult } from './run-ship-sync'
13
12
 
14
13
  // The side effects of `josh ship --review`: the round-1 review — open, launch, join, attest and
@@ -17,7 +16,8 @@ import type { StepResult } from './run-ship-sync'
17
16
  //
18
17
  // 1. `run:review` starts the gate detached and mints the brief — the nonce `review:attest` checks.
19
18
  // 2. the reviewer is launched the way `run:wake` launches a session — `agent_argv` under the reviewer
20
- // profile, `detached_launch.launch_attached` to wait for its exit — handed the brief by path.
19
+ // profile, `detached_launch.launch_attached` to wait for its exit — handed the brief by path
20
+ // (`run-ship-reviewer.ts`).
21
21
  // 3. `run:review --join` blocks a verdict over a red gate; `review:attest --check` refuses a review
22
22
  // that read another checkout; `review:record` writes the round the merge gate reads.
23
23
  //
@@ -36,19 +36,15 @@ import type { StepResult } from './run-ship-sync'
36
36
  // unreadable findings file, a High or an unfixed Medium in round 1, and anything but a clean round 2 —
37
37
  // recorded first, because the round was attested, then routed back.
38
38
 
39
- const SUCCESS_EXIT_CODE = 0
40
- const FAILURE_EXIT_CODE = 1
41
- const should_forward_stderr = true
42
39
  const RUN_REVIEW = 'run:review'
43
- const ATTEST_CHECK = ['review:attest', '--check']
44
- const ROUND_TWO_DECISION = ['review:round2', '--round-1-closed']
45
- const ROUND_TWO_BRIEF = ['review:brief', '--round', '2']
46
- const ROUND_TWO_REQUIRED = 'required'
47
- const ROUND_ONE = '1'
48
- const ROUND_TWO = '2'
40
+ const ROUND_TWO_DECISION = ['review:round2', '--round-1-closed', '--json']
41
+ const REVIEW_BRIEF = 'review:brief'
42
+ const ROUND_TWO_BRIEF = [REVIEW_BRIEF, '--round', '2']
43
+ const INTERACTION_FLAG = '--interaction'
44
+ const INTERACTION_BRIEF = [REVIEW_BRIEF, INTERACTION_FLAG]
45
+ const UNREADABLE_DECISION_NOTE = 'review:round2 printed no decision josh ship can read:'
49
46
  const COMMENT_FLAG = '--comment'
50
47
 
51
- type Round = typeof ROUND_ONE | typeof ROUND_TWO
52
48
  const FIXED_JOIN_NOTE =
53
49
  'the round-1 gate read the tree before the review fixes — drained, not judged; the gate re-runs once the tree is fixed.'
54
50
  const ROUND_TWO_SKIPPED_NOTE = 'round 2 not due — nothing left to verify; shipping on.'
@@ -58,97 +54,21 @@ const ROUND_ONE_RECORDED_NOTE =
58
54
  // The scoped pair's precondition, met by the supervisor itself rather than stopped on,
59
55
  // single-sourced with the preflight and gate stages.
60
56
  const { run_phases, scoped_pair } = run_ship_scoped
61
-
62
- type PromptOf = (brief_path: string, findings_path: string, issue: string) => string
63
-
64
- function failure(out: string): JoshResult {
65
- return { code: FAILURE_EXIT_CODE, out }
66
- }
67
-
68
- function paths(): { brief: string; findings: string; log: string } {
69
- return lane_session_broker.review_paths(PROJECT_ROOT)
70
- }
71
-
72
- async function josh(argv: ReadonlyArray<string>): Promise<JoshResult> {
73
- return await josh_command.josh_run(argv, should_forward_stderr)
74
- }
75
-
76
- function note(text: string): void {
77
- process.stderr.write(`${text}\n`)
78
- }
79
-
80
- // Under the reviewer profile — the same model and effort (`JOSH_REVIEWER_*` included) the chain's
81
- // subagent is given — and waited on, so the join below runs only once the review has finished. Each
82
- // call is its own process, so round 2 is a fresh session by construction.
83
- async function run_direct_session(
84
- argv: AgentArgv,
85
- profile: AgentProfile,
86
- log_path: string,
87
- ): Promise<JoshResult> {
88
- const request = { argv, cwd: PROJECT_ROOT, log_path, profile }
89
- const result = await detached_launch.launch_attached(request, note)
90
-
91
- if (result.kind === 'failed') return failure(`reviewer could not start: ${result.note}`)
92
- if (result.exit_code !== SUCCESS_EXIT_CODE) return failure(`reviewer failed — log: ${log_path}`)
93
-
94
- return { code: SUCCESS_EXIT_CODE, out: '' }
95
- }
96
-
97
- // A lane child's reviewer is started by the lane's broker: an OpenAI lane's always, since a nested Codex
98
- // cannot write outside its sandbox, and a Claude lane's whenever the `run:wake` supervisor serves it, since this
99
- // ship was started from the child's Bash tool and so never received a token-only credential
100
- // (joshuafolkken/kit#3817). A Claude lane nobody serves starts the reviewer itself, as before.
101
- function is_brokered(profile: AgentProfile, issue: string): boolean {
102
- if (!lane_child_marker.is_child_of(PROJECT_ROOT)) return false
103
-
104
- return profile.provider === 'openai' || lane_session_broker.is_serving(PROJECT_ROOT, issue)
105
- }
106
-
107
- async function run_session(
108
- prompt: string,
109
- log_path: string,
110
- issue: string,
111
- round: Round,
112
- ): Promise<JoshResult> {
113
- const built = agent_argv.resolve_in(prompt, agent_role_profile.REVIEWER, PROJECT_ROOT)
114
- if (built.kind === 'rejected') return failure(`reviewer profile rejected: ${built.note}`)
115
-
116
- if (!is_brokered(built.profile, issue)) {
117
- return await run_direct_session(built.argv, built.profile, log_path)
118
- }
119
-
120
- const is_success = await lane_session_broker.request(PROJECT_ROOT, issue, {
121
- kind: 'review',
122
- round,
123
- })
124
-
125
- return is_success ? { code: SUCCESS_EXIT_CODE, out: '' } : failure('isolated reviewer failed')
126
- }
127
-
128
- // The brief goes to a file and the previous round's findings are removed, so a reviewer that writes
129
- // nothing reads as unfinished rather than as the last round's verdict.
130
- async function launch_reviewer(
131
- brief: string,
132
- prompt_of: PromptOf,
133
- issue: string,
134
- round: Round,
135
- ): Promise<JoshResult> {
136
- const target = paths()
137
-
138
- stamp_file.write_text_stamp(target.brief, brief)
139
- stamp_file.remove_stamp(target.findings)
140
-
141
- return await run_session(
142
- prompt_of(target.brief, target.findings, issue),
143
- target.log,
144
- issue,
145
- round,
146
- )
147
- }
148
-
149
- function current_verdict(): ReturnType<typeof run_ship_review.read_verdict> {
150
- return run_ship_review.read_verdict(stamp_file.read_stamp_text(paths().findings))
151
- }
57
+ const { CAUSE } = run_ship_stop_cause
58
+ const {
59
+ attest_phase,
60
+ current_verdict,
61
+ failure,
62
+ josh,
63
+ note,
64
+ paths,
65
+ reviewed,
66
+ ROUND_ONE,
67
+ ROUND_TWO,
68
+ SUCCESS_EXIT_CODE,
69
+ tagged,
70
+ tagged_phase,
71
+ } = run_ship_reviewer
152
72
 
153
73
  // A red join blocks unless the reviewer fixed findings in place: the background gate then read the
154
74
  // tree before the fixes, so its verdict describes a tree that no longer exists. The join still ran to
@@ -178,57 +98,42 @@ function record_flags(round: Round, outcome: RoundOutcome): ReadonlyArray<string
178
98
  return round === ROUND_TWO && outcome.is_passing ? [COMMENT_FLAG] : []
179
99
  }
180
100
 
101
+ // `kind` is the record's own flags — `--interaction` for the interaction review's `- ri:` line.
181
102
  async function record_and_route(
182
103
  issue: string,
183
104
  round: Round,
184
105
  outcome_of: (verdict: ScoredVerdict) => RoundOutcome,
106
+ kind: ReadonlyArray<string> = [],
185
107
  ): Promise<JoshResult> {
186
108
  const verdict = current_verdict()
187
109
 
188
- if (verdict.kind === run_ship_review.VERDICT.INVALID) return failure(verdict.note)
110
+ if (verdict.kind === run_ship_review.VERDICT.INVALID) return failure(verdict.note, CAUSE.INFRA)
189
111
 
190
112
  const outcome = outcome_of(verdict)
191
- const flags = record_flags(round, outcome)
113
+ const flags = [...kind, ...record_flags(round, outcome)]
192
114
  const recorded = await josh(['review:record', '--issue', issue, ...flags, ...verdict.specs])
193
115
 
194
- if (recorded.code !== SUCCESS_EXIT_CODE) return recorded
116
+ if (recorded.code !== SUCCESS_EXIT_CODE) return tagged(CAUSE.CHECK, recorded)
195
117
 
196
118
  const out = [...verdict.report, outcome.note].join('\n')
197
119
 
198
- return outcome.is_passing ? { code: SUCCESS_EXIT_CODE, out } : failure(out)
199
- }
200
-
201
- // A brief-minting command, then a reviewer handed what it printed.
202
- function reviewed(
203
- open: ReadonlyArray<string>,
204
- prompt_of: PromptOf,
205
- issue: string,
206
- round: Round,
207
- ): ReadonlyArray<Phase> {
208
- const opened = { brief: '' }
209
-
210
- return [
211
- async () => {
212
- const result = await josh(open)
213
-
214
- opened.brief = result.out
215
-
216
- return result
217
- },
218
- async () => await launch_reviewer(opened.brief, prompt_of, issue, round),
219
- ]
120
+ return outcome.is_passing ? { code: SUCCESS_EXIT_CODE, out } : failure(out, CAUSE.FINDING)
220
121
  }
221
122
 
222
123
  // Fixes made in place are counted only once the scoped pair is green on the fixed tree. The reviewer is
223
124
  // asked to leave it green; this is the check that it did, and a fix it could not get green is routed as
224
125
  // the finding it still is — recorded, then stopped before the gate and the commit take it in.
225
- async function round_one_record(issue: string): Promise<JoshResult> {
126
+ async function round_one_record(issue: string, kind?: ReadonlyArray<string>): Promise<JoshResult> {
226
127
  const is_fixed = current_verdict().kind === run_ship_review.VERDICT.FIXED
227
128
  const checked = is_fixed ? await scoped_pair() : undefined
228
129
  const is_verified = checked === undefined || checked.code === SUCCESS_EXIT_CODE
229
130
 
230
- return await record_and_route(issue, ROUND_ONE, (verdict) =>
231
- is_verified ? run_ship_review.round_one_outcome(verdict) : run_ship_review.UNVERIFIED_OUTCOME,
131
+ return await record_and_route(
132
+ issue,
133
+ ROUND_ONE,
134
+ (verdict) =>
135
+ is_verified ? run_ship_review.round_one_outcome(verdict) : run_ship_review.UNVERIFIED_OUTCOME,
136
+ kind,
232
137
  )
233
138
  }
234
139
 
@@ -243,35 +148,86 @@ function skipped(out: string): StepResult {
243
148
  // **A recorded round 1 is not run again**. A ship relaunched with `--review`
244
149
  // after a round-1 stop would otherwise review the whole change a second time as round 1 — a new Medium
245
150
  // there stops it again, and round 2 after the commit makes a third. The fix delta is round 2's to
246
- // verify, and `round_two_stage` asks whether it is due after the commit.
247
- async function review_stage(issue: string): Promise<StepResult> {
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> {
248
155
  const recorded = await review_record.check(Number(issue))
249
156
 
250
- if (recorded.status === 'ok') return skipped(ROUND_ONE_RECORDED_NOTE)
157
+ if (!is_stale && recorded.status === 'ok') return skipped(ROUND_ONE_RECORDED_NOTE)
251
158
 
252
159
  return await run_phases([
253
- scoped_pair,
160
+ tagged_phase(CAUSE.CHECK, scoped_pair),
254
161
  ...reviewed([RUN_REVIEW], run_ship_review.reviewer_prompt, issue, ROUND_ONE),
255
- join_gate,
256
- async () => await josh(ATTEST_CHECK),
162
+ tagged_phase(CAUSE.CHECK, join_gate),
163
+ attest_phase,
257
164
  async () => await round_one_record(issue),
258
165
  ])
259
166
  }
260
167
 
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.
171
+ async function interaction_stage(issue: string): Promise<StepResult> {
172
+ return await run_phases([
173
+ tagged_phase(CAUSE.CHECK, scoped_pair),
174
+ ...reviewed(INTERACTION_BRIEF, run_ship_review.reviewer_prompt, issue, ROUND_ONE),
175
+ attest_phase,
176
+ async () => await round_one_record(issue, [INTERACTION_FLAG]),
177
+ ])
178
+ }
179
+
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)
184
+
185
+ if (
186
+ first.code !== SUCCESS_EXIT_CODE ||
187
+ (await review_interaction.status(Number(issue))) !== 'missing'
188
+ ) {
189
+ return first
190
+ }
191
+
192
+ const second = await interaction_stage(issue)
193
+
194
+ if (second.code !== SUCCESS_EXIT_CODE) return second
195
+
196
+ return { code: SUCCESS_EXIT_CODE, out: [first.out, second.out].join('\n') }
197
+ }
198
+
261
199
  // The round-2 verification pass, after the commit so it runs beside CI: due only when the round-1 fix
262
200
  // delta says so, then scoped pair → brief → fresh reviewer → attest → record.
201
+ //
202
+ // **The decision is read as JSON and recorded in the lane ledger before it is acted on**, so
203
+ // `josh lane:stats` can count the period's round-2 runs and skips by their reason code
204
+ // (joshuafolkken/kit#4064). Output it cannot parse stops the ship rather than guessing a verdict.
263
205
  async function round_two_stage(issue: string): Promise<StepResult> {
264
206
  const decision = await josh(ROUND_TWO_DECISION)
265
- const answer = decision.out.trim()
266
207
 
267
- if (decision.code !== SUCCESS_EXIT_CODE) return decision
208
+ if (decision.code !== SUCCESS_EXIT_CODE) return tagged(CAUSE.CHECK, decision)
209
+
210
+ const answer = review_round2.parse_json(decision.out)
211
+
212
+ if (answer === undefined) {
213
+ return failure(`${UNREADABLE_DECISION_NOTE}\n${decision.out}`, CAUSE.CHECK)
214
+ }
215
+
216
+ note(answer.reason)
217
+ await lane_ledger.record_round_two({
218
+ issue: Number(issue),
219
+ verdict: answer.verdict,
220
+ code: answer.code,
221
+ })
268
222
 
269
- if (answer !== ROUND_TWO_REQUIRED) return skipped(`${answer}\n${ROUND_TWO_SKIPPED_NOTE}`)
223
+ if (answer.verdict !== review_round2.REQUIRED_VERDICT) {
224
+ return skipped(`${answer.verdict}\n${ROUND_TWO_SKIPPED_NOTE}`)
225
+ }
270
226
 
271
227
  return await run_phases([
272
- scoped_pair,
228
+ tagged_phase(CAUSE.CHECK, scoped_pair),
273
229
  ...reviewed(ROUND_TWO_BRIEF, run_ship_review.verification_prompt, issue, ROUND_TWO),
274
- async () => await josh(ATTEST_CHECK),
230
+ attest_phase,
275
231
  async () => await record_and_route(issue, ROUND_TWO, run_ship_review.round_two_outcome),
276
232
  ])
277
233
  }
@@ -23,12 +23,18 @@ const LINE_SEPARATOR = /\r?\n/u
23
23
  const HIGH = 'high'
24
24
  const MEDIUM = 'medium'
25
25
  const FIXED_PREFIX = 'fixed '
26
+ const KIND_FIELDS = 2
26
27
  // What a finding line carries after its spec: one sentence saying what is wrong, so a stopped ship's
27
28
  // log tells the resumed lane child the defect rather than only its location.
28
29
  const DESCRIPTION_SEPARATOR = ' — '
29
30
  // Where the spec ends on read: a reviewer that types the dash as `-`, `--` or `–` still ends it there,
30
31
  // so its sentence never lands in the ledger's file field.
31
32
  const DESCRIPTION_BOUNDARY = / [—–-]{1,2} /u
33
+ // Where a description's first sentence ends, and the cap that keeps a run-on one a line. Japanese
34
+ // sets no space after `。`, so it ends a sentence on its own.
35
+ const SENTENCE_END = /(?<=[.!?])\s|(?<=。)/u
36
+ const SENTENCE_LIMIT = 200
37
+ const ELLIPSIS = '…'
32
38
 
33
39
  const VERDICT = {
34
40
  CLEAN: 'clean',
@@ -57,6 +63,15 @@ interface Finding {
57
63
  spec: string
58
64
  is_fixed: boolean
59
65
  line: string
66
+ description: string
67
+ }
68
+
69
+ // One finding that decided a stopped review, as the durable stop log keeps it: its kind, the
70
+ // `<file>[:<line>]` it cites and the first sentence of what it said (joshuafolkken/kit#4519).
71
+ interface StopFinding {
72
+ kind: string
73
+ location: string
74
+ sentence: string
60
75
  }
61
76
 
62
77
  const MISSING_NOTE = 'the reviewer wrote no findings file — the review did not complete'
@@ -120,17 +135,30 @@ function verification_prompt(brief_path: string, findings_path: string, issue: s
120
135
  ].join(' ')
121
136
  }
122
137
 
123
- // The spec is what `review:record` reads; the description after it travels only in the stage output.
124
- function spec_of(unmarked: string): string {
125
- const end = unmarked.search(DESCRIPTION_BOUNDARY)
138
+ // The spec is what `review:record` reads; the description after it travels in the stage output and,
139
+ // for a finding that stopped the ship, its first sentence in the durable stop log.
140
+ function split_description(unmarked: string): { spec: string; description: string } {
141
+ const boundary = DESCRIPTION_BOUNDARY.exec(unmarked)
142
+
143
+ if (boundary === null) return { spec: unmarked.trim(), description: '' }
126
144
 
127
- return (end === -1 ? unmarked : unmarked.slice(0, end)).trim()
145
+ const rest = unmarked.slice(boundary.index + boundary[0].length)
146
+
147
+ return { spec: unmarked.slice(0, boundary.index).trim(), description: rest.trim() }
128
148
  }
129
149
 
130
150
  function finding_of(line: string): Finding {
131
151
  const is_fixed = line.startsWith(FIXED_PREFIX)
132
152
 
133
- return { spec: spec_of(is_fixed ? line.slice(FIXED_PREFIX.length) : line), is_fixed, line }
153
+ return { ...split_description(is_fixed ? line.slice(FIXED_PREFIX.length) : line), is_fixed, line }
154
+ }
155
+
156
+ function first_sentence(description: string): string {
157
+ const [sentence = ''] = description.split(SENTENCE_END, 1)
158
+
159
+ if (sentence.length <= SENTENCE_LIMIT) return sentence
160
+
161
+ return `${sentence.slice(0, SENTENCE_LIMIT - ELLIPSIS.length)}${ELLIPSIS}`
134
162
  }
135
163
 
136
164
  function spec_findings(text: string): ReadonlyArray<Finding> {
@@ -153,6 +181,43 @@ function is_blocking(finding: Finding): boolean {
153
181
  return severity === HIGH || (severity === MEDIUM && !finding.is_fixed)
154
182
  }
155
183
 
184
+ function kind_of(finding: Finding): string {
185
+ return finding.spec.split(':', KIND_FIELDS).join(':')
186
+ }
187
+
188
+ function kinds_of(findings: ReadonlyArray<Finding>): ReadonlyArray<string> {
189
+ return [...new Set(findings.map((finding) => kind_of(finding)))]
190
+ }
191
+
192
+ function stop_finding_of(finding: Finding): StopFinding {
193
+ const location = review_record_cli.parse_finding(finding.spec)?.file ?? ''
194
+
195
+ return { kind: kind_of(finding), location, sentence: first_sentence(finding.description) }
196
+ }
197
+
198
+ // `bug-risks:medium` — each kind of finding that decided a stopped stage, once per kind (the stop
199
+ // counts once under each in `lane:stats`), so the lane ledger records which kinds of finding stop a
200
+ // lane rather than only that one did (joshuafolkken/kit#4426). The blocking findings decide it where
201
+ // there are any; otherwise the stop was decided by the fixes — round-1 fixes red on the scoped pair, or
202
+ // a round 2 that edited the tree — so the fixed findings do. A line outside the grammar is the stage's
203
+ // own prose and never counts.
204
+ function deciding_findings(text: string): ReadonlyArray<Finding> {
205
+ const findings = spec_findings(text).filter((finding) => is_recordable(finding))
206
+ const blocking = findings.filter((finding) => is_blocking(finding))
207
+
208
+ return blocking.length > 0 ? blocking : findings.filter((finding) => finding.is_fixed)
209
+ }
210
+
211
+ function blocking_kinds(text: string): ReadonlyArray<string> {
212
+ return kinds_of(deciding_findings(text))
213
+ }
214
+
215
+ // The same findings `blocking_kinds` counts, each one whole — every finding, not once per kind — so a
216
+ // stop can be classified by what was found where, not only by its kind (joshuafolkken/kit#4519).
217
+ function blocking_details(text: string): ReadonlyArray<StopFinding> {
218
+ return deciding_findings(text).map((finding) => stop_finding_of(finding))
219
+ }
220
+
156
221
  function scored_kind(findings: ReadonlyArray<Finding>): ScoredVerdict['kind'] {
157
222
  if (findings.some((finding) => is_blocking(finding))) return VERDICT.BLOCKING
158
223
 
@@ -216,6 +281,8 @@ const run_ship_review = {
216
281
  FIXED_PREFIX,
217
282
  UNVERIFIED_OUTCOME,
218
283
  VERDICT,
284
+ blocking_details,
285
+ blocking_kinds,
219
286
  has_fixes,
220
287
  is_clean_round_one,
221
288
  read_verdict,
@@ -225,5 +292,5 @@ const run_ship_review = {
225
292
  verification_prompt,
226
293
  }
227
294
 
228
- export type { ReviewVerdict, RoundOutcome, ScoredVerdict }
295
+ export type { ReviewVerdict, RoundOutcome, ScoredVerdict, StopFinding }
229
296
  export { run_ship_review }
@@ -0,0 +1,207 @@
1
+ import { agent_argv, type AgentArgv } from '#scripts/agent/agent-argv'
2
+ import { agent_role_profile, type AgentProfile } from '#scripts/agent/agent-role-profile'
3
+ import { api_auth } from '#scripts/agent/api-auth'
4
+ import { PROJECT_ROOT } from '#scripts/init/init-paths'
5
+ import { josh_command, type JoshResult } from '#scripts/josh/josh-run'
6
+ import { stamp_file } from '#scripts/josh/stamp-file'
7
+ import { lane_child_marker } from '#scripts/lane/lane-child-marker'
8
+ import { lane_session_broker } from '#scripts/lane/lane-session-broker'
9
+ import { detached_launch } from '#scripts/run/detached-launch'
10
+ import { run_ship_review } from './run-ship-review'
11
+ import type { Phase } from './run-ship-scoped'
12
+ import { run_ship_stop_cause, type Cause } from './run-ship-stop-cause'
13
+ import type { StepResult } from './run-ship-sync'
14
+
15
+ // The reviewer half of `josh ship --review` (`run-ship-review-steps.ts`): a brief-minting command, a
16
+ // reviewer session handed what it printed, and the attestation that the session read this checkout.
17
+ // Every review round the ship runs — round 1, the interaction review, round 2 — launches through here.
18
+
19
+ const SUCCESS_EXIT_CODE = 0
20
+ const FAILURE_EXIT_CODE = 1
21
+ const should_forward_stderr = true
22
+ const ATTEST_CHECK = ['review:attest', '--check']
23
+ const KEPT_REVIEW_NOTE =
24
+ 'the reviewer wrote its findings before it failed — its review is kept; attest and record judge it.'
25
+ type Round = '1' | '2'
26
+
27
+ const ROUND_ONE: Round = '1'
28
+ const ROUND_TWO: Round = '2'
29
+ type PromptOf = (brief_path: string, findings_path: string, issue: string) => string
30
+
31
+ const { CAUSE } = run_ship_stop_cause
32
+
33
+ // **Every stop is tagged with the step's own cause**, so a round that stopped on a red join, a reviewer
34
+ // that did not finish or a refused attestation is not booked as a finding (joshuafolkken/kit#4431).
35
+ function failure(out: string, cause: Cause): StepResult {
36
+ return { code: FAILURE_EXIT_CODE, out, cause }
37
+ }
38
+
39
+ function tagged(cause: Cause, result: JoshResult): StepResult {
40
+ return result.code === SUCCESS_EXIT_CODE ? result : { ...result, cause }
41
+ }
42
+
43
+ function tagged_phase(cause: Cause, phase: Phase): Phase {
44
+ return async () => tagged(cause, await phase())
45
+ }
46
+
47
+ function paths(): { brief: string; findings: string; log: string } {
48
+ return lane_session_broker.review_paths(PROJECT_ROOT)
49
+ }
50
+
51
+ async function josh(argv: ReadonlyArray<string>): Promise<JoshResult> {
52
+ return await josh_command.josh_run(argv, should_forward_stderr)
53
+ }
54
+
55
+ function note(text: string): void {
56
+ process.stderr.write(`${text}\n`)
57
+ }
58
+
59
+ // A reviewer that could not authenticate is named as such (`api-auth.ts`), so the stop is not booked as
60
+ // a review finding (joshuafolkken/kit#4216).
61
+ function exited_note(log_path: string): string {
62
+ const exited = `reviewer failed — log: ${log_path}`
63
+
64
+ if (!api_auth.is_auth_failed_transcript(stamp_file.read_stamp_text(log_path))) return exited
65
+
66
+ return `${api_auth.AUTH_FAILURE_NOTE}: ${exited}`
67
+ }
68
+
69
+ function current_verdict(): ReturnType<typeof run_ship_review.read_verdict> {
70
+ return run_ship_review.read_verdict(stamp_file.read_stamp_text(paths().findings))
71
+ }
72
+
73
+ // **A session that ran and then failed keeps the review it wrote** (joshuafolkken/kit#4562). The
74
+ // findings file is removed before the launch and written as the reviewer's last step, so a readable one
75
+ // is this session's finished review — a late auth failure or a lost broker reply then costs nothing,
76
+ // where a relaunch would review the whole change again. The attest and record phases still judge it.
77
+ function ended_session(failed_note: string): JoshResult {
78
+ if (current_verdict().kind === run_ship_review.VERDICT.INVALID) {
79
+ return failure(failed_note, CAUSE.INFRA)
80
+ }
81
+
82
+ note(`${failed_note}\n${KEPT_REVIEW_NOTE}`)
83
+
84
+ return { code: SUCCESS_EXIT_CODE, out: '' }
85
+ }
86
+
87
+ // Under the round's reviewer profile — the same model and effort (`JOSH_REVIEWER_*` included) the
88
+ // chain's subagent is given — and waited on, so the join below runs only once the review has finished.
89
+ // Each call is its own process, so round 2 is a fresh session by construction.
90
+ async function run_direct_session(
91
+ argv: AgentArgv,
92
+ profile: AgentProfile,
93
+ log_path: string,
94
+ round: Round,
95
+ ): Promise<JoshResult> {
96
+ const request = { argv, cwd: PROJECT_ROOT, log_path, profile }
97
+
98
+ note(agent_role_profile.describe_review(Number(round), profile))
99
+ const result = await detached_launch.launch_attached(request, note)
100
+
101
+ if (result.kind === 'failed') {
102
+ return failure(`reviewer could not start: ${result.note}`, CAUSE.INFRA)
103
+ }
104
+
105
+ if (result.exit_code !== SUCCESS_EXIT_CODE) return ended_session(exited_note(log_path))
106
+
107
+ return { code: SUCCESS_EXIT_CODE, out: '' }
108
+ }
109
+
110
+ // A lane child's reviewer is started by the lane's broker: an OpenAI lane's always, since a nested Codex
111
+ // cannot write outside its sandbox, and a Claude lane's whenever the `run:wake` supervisor serves it, since this
112
+ // ship was started from the child's Bash tool and so never received a token-only credential
113
+ // (joshuafolkken/kit#3817). A Claude lane nobody serves starts the reviewer itself, as before.
114
+ function is_brokered(profile: AgentProfile, issue: string): boolean {
115
+ if (!lane_child_marker.is_child_of(PROJECT_ROOT)) return false
116
+
117
+ return profile.provider === 'openai' || lane_session_broker.is_serving(PROJECT_ROOT, issue)
118
+ }
119
+
120
+ async function run_session(
121
+ prompt: string,
122
+ log_path: string,
123
+ issue: string,
124
+ round: Round,
125
+ ): Promise<JoshResult> {
126
+ const built = agent_argv.review_in(prompt, Number(round), PROJECT_ROOT)
127
+
128
+ if (built.kind === 'rejected') {
129
+ return failure(`reviewer profile rejected: ${built.note}`, CAUSE.INFRA)
130
+ }
131
+
132
+ if (!is_brokered(built.profile, issue)) {
133
+ return await run_direct_session(built.argv, built.profile, log_path, round)
134
+ }
135
+
136
+ const answer = await lane_session_broker.request(PROJECT_ROOT, issue, { kind: 'review', round })
137
+
138
+ return answer.is_success
139
+ ? { code: SUCCESS_EXIT_CODE, out: '' }
140
+ : ended_session(`isolated reviewer failed: ${answer.reason}`)
141
+ }
142
+
143
+ // The brief goes to a file and the previous round's findings are removed, so a reviewer that writes
144
+ // nothing reads as unfinished rather than as the last round's verdict.
145
+ async function launch_reviewer(
146
+ brief: string,
147
+ prompt_of: PromptOf,
148
+ issue: string,
149
+ round: Round,
150
+ ): Promise<JoshResult> {
151
+ const target = paths()
152
+
153
+ stamp_file.write_text_stamp(target.brief, brief)
154
+ stamp_file.remove_stamp(target.findings)
155
+
156
+ return await run_session(
157
+ prompt_of(target.brief, target.findings, issue),
158
+ target.log,
159
+ issue,
160
+ round,
161
+ )
162
+ }
163
+
164
+ // A refused attestation — the issue changed after the brief, an update left unread, no attestation —
165
+ // is no finding: the round read what it was briefed on.
166
+ async function attest_phase(): Promise<StepResult> {
167
+ return tagged(CAUSE.ATTEST, await josh(ATTEST_CHECK))
168
+ }
169
+
170
+ // A brief-minting command, then a reviewer handed what it printed.
171
+ function reviewed(
172
+ open: ReadonlyArray<string>,
173
+ prompt_of: PromptOf,
174
+ issue: string,
175
+ round: Round,
176
+ ): ReadonlyArray<Phase> {
177
+ const opened = { brief: '' }
178
+
179
+ return [
180
+ async () => {
181
+ const result = await josh(open)
182
+
183
+ opened.brief = result.out
184
+
185
+ return tagged(CAUSE.CHECK, result)
186
+ },
187
+ async () => await launch_reviewer(opened.brief, prompt_of, issue, round),
188
+ ]
189
+ }
190
+
191
+ const run_ship_reviewer = {
192
+ attest_phase,
193
+ current_verdict,
194
+ failure,
195
+ josh,
196
+ note,
197
+ paths,
198
+ reviewed,
199
+ ROUND_ONE,
200
+ ROUND_TWO,
201
+ SUCCESS_EXIT_CODE,
202
+ tagged,
203
+ tagged_phase,
204
+ }
205
+
206
+ export type { Round }
207
+ export { run_ship_reviewer }