@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,23 +1,18 @@
1
1
  import { randomUUID } from 'node:crypto'
2
- import { mkdirSync, readFileSync, renameSync, unlinkSync, writeFileSync } from 'node:fs'
2
+ import { mkdirSync, readFileSync, rmSync, unlinkSync } from 'node:fs'
3
3
  import path from 'node:path'
4
4
  import { setTimeout as sleep } from 'node:timers/promises'
5
- import { agent_argv } from '#scripts/agent/agent-argv'
6
- import { agent_role_profile, type AgentProvider } from '#scripts/agent/agent-role-profile'
7
5
  import { git_common_directory } from '#scripts/git/git-common-directory'
6
+ import { issue_cite } from '#scripts/issue/issue-cite'
8
7
  import { stamp_file } from '#scripts/josh/stamp-file'
9
- import { error_text } from '#scripts/lib/error-message'
8
+ import { atomic_write } from '#scripts/lib/atomic-write'
10
9
  import { json_value } from '#scripts/lib/json-value'
11
- import { detached_launch } from '#scripts/run/detached-launch'
12
- import { run_ship_review } from '#scripts/run/ship/run-ship-review'
13
- import { run_ship_stage } from '#scripts/run/ship/run-ship-stage'
10
+ import { run_event_stream } from '#scripts/run/event/run-event-stream'
11
+ import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
14
12
  import { z } from 'zod'
15
13
  import { lane_broker_server, type BrokerServer } from './lane-broker-server'
16
- import { lane_child_invocation, type ShipStop } from './lane-child-invocation'
17
- import { lane_child_marker } from './lane-child-marker'
18
- import { lane_parked } from './lane-parked'
19
14
  import type { LaneInfo } from './lane-registry'
20
- import { lane_relaunch } from './lane-relaunch'
15
+ import { lane_session_action, type BrokerAction, type BrokerAnswer } from './lane-session-action'
21
16
 
22
17
  // The sessions a lane child's detached `josh ship` cannot start itself, started for it by a process
23
18
  // that can: the round-1 and round-2 reviewer, and the fresh child a stopped ship hands back to. An
@@ -25,13 +20,11 @@ import { lane_relaunch } from './lane-relaunch'
25
20
  // Claude lane is served by the `run:wake` supervisor (`claude-lane-broker.ts`), because Claude Code removes its
26
21
  // token from what its Bash tool starts, so a token-only credential never reaches the ship the child
27
22
  // launched (joshuafolkken/kit#3817). **The request names an action, never a command**: the server
28
- // rebuilds the argv from the registered lane, so a child can ask for nothing but these two sessions.
23
+ // rebuilds the argv from the registered lane, so a child can ask for nothing but these two sessions
24
+ // (`lane-session-action.ts`).
29
25
 
30
26
  const REQUEST_PREFIX = '.josh-review-request-'
31
27
  const RESPONSE_PREFIX = '.josh-review-response-'
32
- const BRIEF_PREFIX = 'josh-ship-review-brief-'
33
- const FINDINGS_PREFIX = 'josh-ship-review-findings-'
34
- const LOG_PREFIX = 'josh-ship-review-log-'
35
28
  const CACHE_DIRECTORY = ['node_modules', '.cache']
36
29
  const POLL_MS = 100
37
30
  // The heartbeat is kept for a ship branched before the server record, and read only where a
@@ -39,25 +32,23 @@ const POLL_MS = 100
39
32
  const LEGACY_HEARTBEAT_MS = 500
40
33
  const LEGACY_HEARTBEAT_LIMIT_MS = 3000
41
34
  const MINUTE_MS = 60_000
42
- const REQUEST_LIMIT_MINUTES = 30
43
- const REQUEST_LIMIT_MS = REQUEST_LIMIT_MINUTES * MINUTE_MS
44
- const ANTHROPIC_PROVIDER: AgentProvider = 'anthropic'
45
- const stop_schema = z
46
- .object({
47
- stage: z.enum(run_ship_stage.STAGE),
48
- title: z.string(),
49
- flags: z.array(z.string()).readonly(),
50
- is_review: z.boolean(),
51
- conflicts: z.array(z.string()).readonly().default([]),
52
- })
53
- .strict()
54
- const action_schema = z.discriminatedUnion('kind', [
55
- z.object({ kind: z.literal('review'), round: z.enum(['1', '2']) }).strict(),
56
- z.object({ kind: z.literal('relaunch'), stop: stop_schema }).strict(),
57
- ])
35
+ // **A relaunch is answered once the session has started, a review once it has finished**: waiting out a
36
+ // review's limit on a relaunch left the stopped lane idle for half an hour (joshuafolkken/kit#4344).
37
+ const REQUEST_LIMIT_MINUTES: Readonly<Record<BrokerAction['kind'], number>> = {
38
+ review: 30,
39
+ relaunch: 2,
40
+ }
58
41
  const request_schema = z
59
- .object({ session: z.uuid(), nonce: z.uuid(), action: action_schema })
42
+ .object({ session: z.uuid(), nonce: z.uuid(), action: lane_session_action.action_schema })
60
43
  .strict()
44
+ // **A request this broker cannot read is still answered**: the supervisor reloads on new code only at
45
+ // its next pass boundary (`run-wake-code.ts`), so until then a lane's ship can run a newer main than
46
+ // the broker's, and a field the ship added made the request unreadable and
47
+ // the ship waited out the whole limit on a server that had dropped it (joshuafolkken/kit#4230).
48
+ // **The reason names the fields the schema refused**: a guess at the supervisor's age hid a field the
49
+ // broker's schema had never learned even on one main (joshuafolkken/kit#4489).
50
+ const envelope_schema = z.looseObject({ session: z.uuid(), nonce: z.uuid() })
51
+ const UNREADABLE_REASON = 'the broker could not read the request'
61
52
  const response_schema = z
62
53
  .object({
63
54
  session: z.uuid(),
@@ -66,18 +57,13 @@ const response_schema = z
66
57
  heartbeat_at: z.number().int().positive(),
67
58
  })
68
59
  .strict()
69
- type BrokerRequest = z.infer<typeof request_schema>
60
+ // **A failure's reason sits beside the response, never in it**: a ship branched before the reason parses
61
+ // the response strictly, so a new field would read as no server (joshuafolkken/kit#3974).
62
+ const reason_schema = z.object({ nonce: z.string(), reason: z.string() }).strict()
63
+ type BrokerEnvelope = z.infer<typeof envelope_schema>
70
64
  type BrokerResponse = z.infer<typeof response_schema>
71
- type ReviewRound = Extract<z.infer<typeof action_schema>, { kind: 'review' }>['round']
72
- type BrokerAction = { kind: 'review'; round: ReviewRound } | { kind: 'relaunch'; stop: ShipStop }
73
-
74
- function review_paths(directory: string): { brief: string; findings: string; log: string } {
75
- return {
76
- brief: stamp_file.stamp_path(BRIEF_PREFIX, directory, '.md'),
77
- findings: stamp_file.stamp_path(FINDINGS_PREFIX, directory, '.txt'),
78
- log: stamp_file.stamp_path(LOG_PREFIX, directory, '.log'),
79
- }
80
- }
65
+
66
+ const { failure } = lane_session_action
81
67
 
82
68
  function request_path(directory: string, issue: string): string {
83
69
  return path.join(directory, ...CACHE_DIRECTORY, `${REQUEST_PREFIX}${issue}.json`)
@@ -90,6 +76,10 @@ function response_path(directory: string, issue: string): string | undefined {
90
76
  return path.join(path.dirname(common), ...CACHE_DIRECTORY, `${RESPONSE_PREFIX}${issue}.json`)
91
77
  }
92
78
 
79
+ function reason_path(response: string): string {
80
+ return `${response}.reason`
81
+ }
82
+
93
83
  function read_record<T>(target: string, schema: z.ZodType<T>): T | undefined {
94
84
  try {
95
85
  return json_value.parse_with(readFileSync(target, 'utf8'), schema)
@@ -98,102 +88,62 @@ function read_record<T>(target: string, schema: z.ZodType<T>): T | undefined {
98
88
  }
99
89
  }
100
90
 
101
- // The reviewer runs on the lane's own provider, so a Claude lane's server never starts a Codex reviewer
102
- // and an OpenAI lane's never starts a Claude one.
103
- function provider_of(lane: LaneInfo): AgentProvider {
104
- return lane.profile?.provider ?? ANTHROPIC_PROVIDER
91
+ function write_record(target: string, body: BrokerResponse | z.infer<typeof reason_schema>): void {
92
+ atomic_write.replace_file(target, JSON.stringify(body))
105
93
  }
106
94
 
107
- // **The reviewer carries the lane's mark explicitly**: the supervisor serving a Claude lane is no lane child,
108
- // so a reviewer inheriting its environment would descend from the carry record's owner unmarked and be
109
- // read as the `backlogrun` parent by every hook. **Its prompt ends with the review invocation**, so the
110
- // lane's liveness read and the park's reap find it as they find the child (joshuafolkken/kit#3878).
95
+ function refused_field(issue: z.core.$ZodIssue): ReadonlyArray<string> {
96
+ const at = issue.path.map(String)
111
97
 
112
- function review_prompt(lane: LaneInfo, round: ReviewRound): string {
113
- const target = review_paths(lane.directory)
114
- const prompt_of =
115
- round === '1' ? run_ship_review.reviewer_prompt : run_ship_review.verification_prompt
116
- const tail = lane_child_invocation.review_invocation(lane.issue)
117
-
118
- return `${prompt_of(target.brief, target.findings, lane.issue)} This is ${tail}`
119
- }
98
+ if (issue.code !== 'unrecognized_keys') return [`${at.join('.')}: ${issue.message}`]
120
99
 
121
- async function launch_review(lane: LaneInfo, round: ReviewRound): Promise<boolean> {
122
- const target = review_paths(lane.directory)
123
- const built = agent_argv.resolve_in(
124
- review_prompt(lane, round),
125
- agent_role_profile.REVIEWER,
126
- lane.directory,
127
- )
128
- if (built.kind === 'rejected' || built.profile.provider !== provider_of(lane)) return false
129
-
130
- const result = await detached_launch.launch_attached(
131
- {
132
- argv: built.argv,
133
- cwd: lane.directory,
134
- log_path: target.log,
135
- profile: built.profile,
136
- env: lane_child_marker.env_for(lane.issue),
137
- },
138
- console.error,
139
- )
140
-
141
- return result.kind === 'completed' && result.exit_code === 0
100
+ return issue.keys.map((key) => `unrecognized key: ${[...at, key].join('.')}`)
142
101
  }
143
102
 
144
- // An OpenAI lane's successor is its supervisor's to start, never a relaunch's.
145
- function relaunch(lane: LaneInfo, stop: ShipStop): boolean {
146
- if (lane_relaunch.is_openai_lane(lane)) return false
103
+ function unreadable(error: z.ZodError): BrokerAnswer {
104
+ const fields = error.issues.flatMap((issue) => refused_field(issue))
147
105
 
148
- const invocation = lane_child_invocation.ship_stop_invocation(lane.issue, stop)
149
- const phase = agent_role_profile.IMPLEMENTATION_PHASE
150
- const result = lane_relaunch.relaunch(lane, invocation, phase, console.error)
151
-
152
- return result.kind === 'launched'
106
+ return failure(`${UNREADABLE_REASON} — ${fields.join('; ')}`)
153
107
  }
154
108
 
155
- // **A parked issue gets no session**: a request can be read long after it was written, so the park is
156
- // read when the action runs, never when it was asked for (joshuafolkken/kit#3878).
157
- async function perform(lane: LaneInfo, action: BrokerAction): Promise<boolean> {
158
- if (await lane_parked.is_parked(lane.issue)) return false
159
-
160
- if (action.kind === 'relaunch') return relaunch(lane, action.stop)
109
+ async function answer_request(lane: LaneInfo, received: BrokerEnvelope): Promise<BrokerAnswer> {
110
+ const parsed = request_schema.safeParse(received)
161
111
 
162
- return await launch_review(lane, action.round)
112
+ return parsed.success
113
+ ? await lane_session_action.answer(lane, parsed.data.action)
114
+ : unreadable(parsed.error)
163
115
  }
164
116
 
165
- function write_response(target: string, body: BrokerResponse): void {
166
- const temporary = `${target}.${String(process.pid)}.tmp`
117
+ // The requests this process's servers are answering now — what the supervisor's reload waits out
118
+ // (`run-wake-cli.ts`), since closing a server mid-review fails that review.
119
+ const answering = { count: 0 }
167
120
 
168
- writeFileSync(temporary, JSON.stringify(body))
169
- renameSync(temporary, target)
121
+ function is_answering(): boolean {
122
+ return answering.count > 0
170
123
  }
171
124
 
172
- async function launched(lane: LaneInfo, action: BrokerAction): Promise<boolean> {
173
- try {
174
- return await perform(lane, action)
175
- } catch (error) {
176
- error_text.trace_swallowed('lane_session_broker.launched', error)
125
+ async function answer_counted(lane: LaneInfo, received: BrokerEnvelope): Promise<BrokerAnswer> {
126
+ answering.count += 1
177
127
 
178
- return false
128
+ try {
129
+ return await answer_request(lane, received)
130
+ } finally {
131
+ answering.count -= 1
179
132
  }
180
133
  }
181
134
 
182
135
  async function process_request(
183
136
  lane: LaneInfo,
184
137
  response: string,
185
- received: BrokerRequest,
138
+ received: BrokerEnvelope,
186
139
  state: { current: BrokerResponse },
187
140
  ): Promise<void> {
188
- const is_success = await launched(lane, received.action)
141
+ const answer = await answer_counted(lane, received)
142
+ const { session, nonce } = received
189
143
 
190
- state.current = {
191
- session: received.session,
192
- nonce: received.nonce,
193
- is_success,
194
- heartbeat_at: Date.now(),
195
- }
196
- write_response(response, state.current)
144
+ if (!answer.is_success) write_record(reason_path(response), { nonce, reason: answer.reason })
145
+ state.current = { session, nonce, is_success: answer.is_success, heartbeat_at: Date.now() }
146
+ write_record(response, state.current)
197
147
  }
198
148
 
199
149
  async function serve(
@@ -206,7 +156,7 @@ async function serve(
206
156
  const target = request_path(lane.directory, lane.issue)
207
157
 
208
158
  while (state.is_running) {
209
- const received = read_record(target, request_schema)
159
+ const received = read_record(target, envelope_schema)
210
160
 
211
161
  if (received?.session === session && received.nonce !== last_nonce) {
212
162
  last_nonce = received.nonce
@@ -236,7 +186,7 @@ function prepare(lane: LaneInfo): { response: string; current: BrokerResponse }
236
186
  heartbeat_at: Date.now(),
237
187
  }
238
188
 
239
- write_response(response, current)
189
+ write_record(response, current)
240
190
 
241
191
  return { response, current }
242
192
  }
@@ -244,7 +194,7 @@ function prepare(lane: LaneInfo): { response: string; current: BrokerResponse }
244
194
  function start_heartbeat(state: { current: BrokerResponse }, response: string): NodeJS.Timeout {
245
195
  const heartbeat = setInterval(() => {
246
196
  state.current = { ...state.current, heartbeat_at: Date.now() }
247
- write_response(response, state.current)
197
+ write_record(response, state.current)
248
198
  }, LEGACY_HEARTBEAT_MS)
249
199
 
250
200
  heartbeat.unref()
@@ -264,6 +214,7 @@ async function stop_server(
264
214
  await serving
265
215
  clearInterval(heartbeat)
266
216
  unlinkSync(response)
217
+ rmSync(reason_path(response), { force: true })
267
218
  lane_broker_server.remove(response)
268
219
  }
269
220
 
@@ -306,31 +257,49 @@ function session_response(target: string, session: string): BrokerResponse | und
306
257
  return response?.session === session ? response : undefined
307
258
  }
308
259
 
260
+ // A failure from a server that predates the reason leaves none.
261
+ function answer_of(target: string, response: BrokerResponse): BrokerAnswer {
262
+ if (response.is_success) return lane_session_action.SUCCESS
263
+
264
+ const record = read_record(reason_path(target), reason_schema)
265
+ const reason = record?.nonce === response.nonce ? record.reason : 'it gave no reason'
266
+
267
+ return failure(`the broker answered a failure: ${reason}`)
268
+ }
269
+
270
+ // The server's answer to this request, or `undefined` while it is still being served.
309
271
  function response_verdict(
310
272
  target: string,
311
273
  session: string,
312
274
  nonce: string,
313
- ): 'wait' | 'success' | 'failure' {
275
+ ): BrokerAnswer | undefined {
314
276
  const response = session_response(target, session)
315
277
 
316
- if (!is_live_response(target, response, lane_broker_server.is_running)) return 'failure'
317
- if (response.nonce !== nonce) return 'wait'
278
+ if (!is_live_response(target, response, lane_broker_server.is_running)) {
279
+ return failure('the broker stopped serving before it answered')
280
+ }
318
281
 
319
- return response.is_success ? 'success' : 'failure'
282
+ return response.nonce === nonce ? answer_of(target, response) : undefined
320
283
  }
321
284
 
322
- async function wait_response(target: string, session: string, nonce: string): Promise<boolean> {
323
- const deadline = Date.now() + REQUEST_LIMIT_MS
285
+ async function wait_response(
286
+ target: string,
287
+ session: string,
288
+ nonce: string,
289
+ kind: BrokerAction['kind'],
290
+ ): Promise<BrokerAnswer> {
291
+ const limit_minutes = REQUEST_LIMIT_MINUTES[kind]
292
+ const deadline = Date.now() + limit_minutes * MINUTE_MS
324
293
 
325
294
  while (Date.now() < deadline) {
326
295
  const verdict = response_verdict(target, session, nonce)
327
- if (verdict !== 'wait') return verdict === 'success'
296
+ if (verdict !== undefined) return verdict
328
297
 
329
298
  // eslint-disable-next-line no-await-in-loop -- polling: each read waits on the state the previous one saw
330
299
  await sleep(POLL_MS)
331
300
  }
332
301
 
333
- return false
302
+ return failure(`the broker gave no answer within ${String(limit_minutes)} minutes`)
334
303
  }
335
304
 
336
305
  function live_response(target: string): BrokerResponse | undefined {
@@ -341,12 +310,18 @@ function live_response(target: string): BrokerResponse | undefined {
341
310
  : undefined
342
311
  }
343
312
 
313
+ // The session of the server answering for this lane now, or `undefined` while none does. A new session
314
+ // means the server that held the lane before has ended.
315
+ function serving_session(directory: string, issue: string): string | undefined {
316
+ const target = response_path(directory, issue)
317
+
318
+ return target === undefined ? undefined : live_response(target)?.session
319
+ }
320
+
344
321
  // Whether a server answers for this lane now — what a Claude lane's ship asks before it hands a session
345
322
  // over rather than starting the session itself.
346
323
  function is_serving(directory: string, issue: string): boolean {
347
- const target = response_path(directory, issue)
348
-
349
- return target !== undefined && live_response(target) !== undefined
324
+ return serving_session(directory, issue) !== undefined
350
325
  }
351
326
 
352
327
  // **A request nobody waits for any more is taken back**: a server busy with an earlier request reads the
@@ -356,32 +331,57 @@ function withdraw(pending: string, nonce: string): void {
356
331
  if (read_record(pending, request_schema)?.nonce === nonce) stamp_file.remove_stamp(pending)
357
332
  }
358
333
 
359
- async function request(directory: string, issue: string, action: BrokerAction): Promise<boolean> {
334
+ // A failure is put on the run's stream as well as the ship's output, so a broker that cannot serve the
335
+ // lane is seen from `run:board` rather than only from the ship log (joshuafolkken/kit#4230).
336
+ async function record_failure(issue: string, answer: BrokerAnswer): Promise<void> {
337
+ if (answer.is_success) return
338
+
339
+ const text = `${issue_cite.plain(issue)} lane broker: ${answer.reason}`
340
+
341
+ await run_event_stream_emit.emit(run_event_stream.EVENT_KIND.NOTE, text)
342
+ }
343
+
344
+ async function send(directory: string, issue: string, action: BrokerAction): Promise<BrokerAnswer> {
360
345
  const target = response_path(directory, issue)
361
346
  const response = target === undefined ? undefined : live_response(target)
362
347
 
363
- if (target === undefined || response === undefined) return false
348
+ if (target === undefined || response === undefined) return failure('no broker serves this lane')
364
349
 
365
350
  const nonce = randomUUID()
366
351
  const body = { session: response.session, nonce, action }
367
352
  const pending = request_path(directory, issue)
368
353
 
369
354
  stamp_file.replace_stamp(pending, body)
370
- const is_success = await wait_response(target, response.session, nonce)
355
+ const answer = await wait_response(target, response.session, nonce, action.kind)
371
356
 
372
357
  withdraw(pending, nonce)
373
358
 
374
- return is_success
359
+ return answer
360
+ }
361
+
362
+ async function request(
363
+ directory: string,
364
+ issue: string,
365
+ action: BrokerAction,
366
+ ): Promise<BrokerAnswer> {
367
+ const answer = await send(directory, issue, action)
368
+
369
+ await record_failure(issue, answer)
370
+
371
+ return answer
375
372
  }
376
373
 
377
374
  const lane_session_broker = {
375
+ is_answering,
378
376
  is_serving,
379
377
  request,
380
378
  request_path,
381
379
  response_path,
382
- review_paths,
380
+ review_paths: lane_session_action.review_paths,
381
+ serving_session,
383
382
  with_server,
384
383
  }
385
384
 
386
- export type { BrokerAction, ReviewRound }
387
385
  export { lane_session_broker }
386
+
387
+ export { type ReviewRound, type BrokerAction, type BrokerAnswer } from './lane-session-action'
@@ -0,0 +1,84 @@
1
+ import {
2
+ PROCESS_ALIVE,
3
+ PROCESS_NONE,
4
+ PROCESS_UNKNOWN,
5
+ type ProcessTrace,
6
+ } from '#scripts/run/run-liveness'
7
+ import { lane_child_invocation } from './lane-child-invocation'
8
+ import { lane_handoff } from './lane-handoff'
9
+ import { lane_process_table, type ProcessTable, type TableRead } from './lane-process-table'
10
+ import type { TreeProbes } from './lane-reap'
11
+
12
+ // `lane_await.process_trace_default` answered for many lanes from one process snapshot
13
+ // (joshuafolkken/kit#4245). That probe starts a synchronous `pgrep` per lane and reads the ship record's
14
+ // start time through another `ps`, so a reader asking about every lane each few seconds — `run:board`,
15
+ // the backlogrun drive — blocked its event loop for as long as the lanes took between them.
16
+ //
17
+ // **The answers are the probe's own.** A command line matching the lane's pattern, or a detached ship
18
+ // still running for it, is `alive`; a snapshot that matched neither is `none`; a snapshot that could not
19
+ // be read is `unknown`, as an unanswered `pgrep` is. The ship record is read only for a lane no process
20
+ // matched, which is the only lane its answer can change.
21
+
22
+ type TraceRead = (issue: string) => ProcessTrace
23
+
24
+ function is_matched(probes: TreeProbes, issue: string): boolean {
25
+ return probes.matching(lane_child_invocation.process_pattern(issue)).length > 0
26
+ }
27
+
28
+ /** Each of `issues` traced from `rows`, the snapshot `undefined` where it could not be read. */
29
+ async function traces_of(
30
+ issues: ReadonlyArray<string>,
31
+ rows: ProcessTable | undefined,
32
+ ): Promise<TraceRead> {
33
+ if (rows === undefined) return () => PROCESS_UNKNOWN
34
+
35
+ const probes = lane_process_table.probes_of(rows)
36
+ const unmatched = issues.filter((issue) => !is_matched(probes, issue))
37
+ const is_shipping =
38
+ unmatched.length === 0
39
+ ? (): boolean => false
40
+ : await lane_handoff.ship_reader(lane_process_table.start_reader(rows))
41
+ const idle = new Set(unmatched.filter((issue) => !is_shipping(issue)))
42
+
43
+ return (issue) => (idle.has(issue) ? PROCESS_NONE : PROCESS_ALIVE)
44
+ }
45
+
46
+ function never_merge_waiting(): boolean {
47
+ return false
48
+ }
49
+
50
+ /**
51
+ * Whether each of `issues` has a detached ship waiting on its merge (`lane_handoff.merge_wait_reader`),
52
+ * read from `rows`. The record is read only where the snapshot shows that lane's ship supervisor, so a
53
+ * count with no ship running starts no process (joshuafolkken/kit#4466).
54
+ */
55
+ async function merge_waits_of(
56
+ issues: ReadonlyArray<string>,
57
+ rows: ProcessTable | undefined,
58
+ ): Promise<(issue: string) => boolean> {
59
+ if (rows === undefined) return never_merge_waiting
60
+
61
+ const probes = lane_process_table.probes_of(rows)
62
+ const shipping = issues.filter(
63
+ (issue) => probes.matching(lane_child_invocation.ship_pattern(issue)).length > 0,
64
+ )
65
+
66
+ if (shipping.length === 0) return never_merge_waiting
67
+
68
+ return await lane_handoff.merge_wait_reader(lane_process_table.start_reader(rows))
69
+ }
70
+
71
+ /** How many of `issues` have a detached ship in this checkout waiting on its merge, from a fresh snapshot. */
72
+ async function count_merge_waiting(
73
+ issues: ReadonlyArray<string>,
74
+ table: TableRead = lane_process_table.read_table,
75
+ ): Promise<number> {
76
+ const is_waiting = await merge_waits_of(issues, await table())
77
+
78
+ return issues.filter((issue) => is_waiting(issue)).length
79
+ }
80
+
81
+ const lane_snapshot_trace = { count_merge_waiting, merge_waits_of, traces_of }
82
+
83
+ export { lane_snapshot_trace }
84
+ export type { TraceRead }
@@ -0,0 +1,51 @@
1
+ // The spans an issue's starts open and its ends close, shared by `josh lane:stats`' gaps
2
+ // (`lane-gap-stats.ts`) and `run:board`'s in-lane time (`run-board-lane-time.ts`)
3
+ // (joshuafolkken/kit#4463).
4
+
5
+ // One instant an issue's wait can end at. `issue` is absent on a stage whose writer held none.
6
+ interface IssueAt {
7
+ issue: number | undefined
8
+ at_ms: number
9
+ }
10
+
11
+ interface IssuePair {
12
+ starts: ReadonlyArray<IssueAt>
13
+ bounds: ReadonlyArray<IssueAt>
14
+ ends: ReadonlyArray<IssueAt>
15
+ }
16
+
17
+ interface Span {
18
+ from_ms: number
19
+ end_ms: number | undefined
20
+ }
21
+
22
+ // The issue's next start of any kind closes the window: an end after it belongs to that later start,
23
+ // so a start never ended stays not ended rather than borrowing a later run's end.
24
+ function next_start_ms(
25
+ starts: ReadonlyArray<IssueAt>,
26
+ issue: number | undefined,
27
+ from_ms: number,
28
+ ): number {
29
+ const later = starts.filter((other) => other.issue === issue && other.at_ms > from_ms)
30
+
31
+ return Math.min(...later.map((other) => other.at_ms))
32
+ }
33
+
34
+ // Each start until the first end of its own issue, before that issue's next start in `bounds`.
35
+ function issue_spans(pair: IssuePair): Array<Span> {
36
+ return pair.starts.map((start) => {
37
+ const until_ms = next_start_ms(pair.bounds, start.issue, start.at_ms)
38
+
39
+ return {
40
+ from_ms: start.at_ms,
41
+ end_ms: pair.ends.find(
42
+ (end) => end.issue === start.issue && end.at_ms >= start.at_ms && end.at_ms < until_ms,
43
+ )?.at_ms,
44
+ }
45
+ })
46
+ }
47
+
48
+ const lane_spans = { issue_spans }
49
+
50
+ export { lane_spans }
51
+ export type { IssueAt, IssuePair, Span }
@@ -89,8 +89,11 @@ const LIVE_PROBES: SpentProbes = {
89
89
  unpushed_commits: read_unpushed_commits,
90
90
  }
91
91
 
92
+ // The one probe the in-use readings take, so a reader holding a process snapshot passes its own.
93
+ type TraceProbes = Pick<SpentProbes, 'process_trace'>
94
+
92
95
  // A stranded lane has no work tree for a child to be in, so it is never in use.
93
- function trace_of(lane: LaneInfo, probes: SpentProbes): ProcessTrace {
96
+ function trace_of(lane: LaneInfo, probes: TraceProbes): ProcessTrace {
94
97
  return lane.is_stranded ? PROCESS_NONE : probes.process_trace(lane.issue)
95
98
  }
96
99
 
@@ -178,7 +181,7 @@ function issues_traced(traced: ReadonlyArray<TracedLane>, trace: ProcessTrace):
178
181
  return traced.filter(([, answer]) => answer === trace).map(([issue]) => issue)
179
182
  }
180
183
 
181
- function traced_of(lanes: ReadonlyArray<LaneInfo>, probes: SpentProbes): Array<TracedLane> {
184
+ function traced_of(lanes: ReadonlyArray<LaneInfo>, probes: TraceProbes): Array<TracedLane> {
182
185
  return lanes.map((lane): TracedLane => [lane.issue, trace_of(lane, probes)])
183
186
  }
184
187
 
@@ -195,7 +198,7 @@ async function lanes_in_use(probes: SpentProbes = LIVE_PROBES): Promise<LaneUse>
195
198
  /** The lanes no child is working in, read as such — never one whose probe did not answer. */
196
199
  function idle_lanes(
197
200
  lanes: ReadonlyArray<LaneInfo>,
198
- probes: SpentProbes = LIVE_PROBES,
201
+ probes: TraceProbes = LIVE_PROBES,
199
202
  ): Array<string> {
200
203
  return issues_traced(traced_of(lanes, probes), PROCESS_NONE)
201
204
  }
@@ -1,3 +1,4 @@
1
+ import { MS_PER_MINUTE } from '#scripts/lib/timeouts'
1
2
  import { run_ship_stage } from '#scripts/run/ship/run-ship-stage'
2
3
  import { lane_ledger, type DispatchEntry, type LedgerEntry, type StageEntry } from './lane-ledger'
3
4
  import { lane_stats, type StatsWindow } from './lane-stats'
@@ -14,9 +15,10 @@ import { lane_stats, type StatsWindow } from './lane-stats'
14
15
  // dispatched, and a ship resumed after a fix cannot record the implementation twice.
15
16
  //
16
17
  // **`ci-wait` is `followup`'s own lap, inside the `followup` stage** — a row of its own so the wait for
17
- // CI reads beside `review`, the round-one review it would overlap.
18
+ // CI reads beside `review`, the round-one review it would overlap. `coderabbit-wait` and
19
+ // `coderabbit-rate-limit` follow it: how much of `followup`'s waiting CodeRabbit was still running or
20
+ // rate-limited, a row recorded only by a run that saw it.
18
21
 
19
- const MS_PER_MINUTE = 60_000
20
22
  const DECIMALS = 1
21
23
  const NOT_MEASURED = 'not measured'
22
24
  const IMPLEMENT = 'implement'
@@ -25,6 +27,7 @@ const { STAGE } = run_ship_stage
25
27
  const STAGES = [
26
28
  IMPLEMENT,
27
29
  STAGE.PREFLIGHT,
30
+ lane_ledger.PRE_DETACH_STAGE,
28
31
  STAGE.REVIEW,
29
32
  STAGE.SYNC,
30
33
  STAGE.GATE,
@@ -32,6 +35,8 @@ const STAGES = [
32
35
  STAGE.ROUND_TWO,
33
36
  STAGE.FOLLOWUP,
34
37
  lane_ledger.CI_WAIT_STAGE,
38
+ lane_ledger.CODERABBIT_WAIT_STAGE,
39
+ lane_ledger.CODERABBIT_RATE_LIMIT_STAGE,
35
40
  STAGE.REPORT,
36
41
  ] as const
37
42