@joshuafolkken/kit 1.1514.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 (858) hide show
  1. package/.claude/agents/investigator.md +1 -1
  2. package/.claude/settings.json +5 -5
  3. package/.claude/skills/epic-commands/SKILL.md +26 -65
  4. package/.claude/skills/epic-commands/epic-bundle.md +3 -1
  5. package/.claude/skills/workflow-commands/SKILL.md +5 -5
  6. package/.claude/skills/workflow-commands/background-commands.md +5 -5
  7. package/.claude/skills/workflow-commands/backlogrun-child.md +10 -8
  8. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
  9. package/.claude/skills/workflow-commands/backlogrun-lanes.md +17 -13
  10. package/.claude/skills/workflow-commands/backlogrun-park.md +14 -23
  11. package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -2
  12. package/.claude/skills/workflow-commands/backlogrun-recovery.md +5 -5
  13. package/.claude/skills/workflow-commands/backlogrun-steps.md +10 -10
  14. package/.claude/skills/workflow-commands/backlogrun.md +1 -1
  15. package/.claude/skills/workflow-commands/chain-rule.md +13 -7
  16. package/.claude/skills/workflow-commands/delegation.md +6 -5
  17. package/.claude/skills/workflow-commands/entry-sequence.md +9 -9
  18. package/.claude/skills/workflow-commands/followup.md +9 -31
  19. package/.claude/skills/workflow-commands/fullrun-steps.md +36 -45
  20. package/.claude/skills/workflow-commands/fullrun.md +2 -2
  21. package/.claude/skills/workflow-commands/halfrun.md +17 -25
  22. package/.claude/skills/workflow-commands/issue-comments.md +16 -12
  23. package/.claude/skills/workflow-commands/issue-scout.md +2 -2
  24. package/.claude/skills/workflow-commands/kickoff.md +24 -23
  25. package/.claude/skills/workflow-commands/latest-gate.md +7 -12
  26. package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
  27. package/.claude/skills/workflow-commands/observation-filing.md +4 -36
  28. package/.claude/skills/workflow-commands/observation-ledger.md +1 -1
  29. package/.claude/skills/workflow-commands/pre-gate-cut.md +13 -30
  30. package/.claude/skills/workflow-commands/prerequisite.md +10 -16
  31. package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
  32. package/.claude/skills/workflow-commands/prrun.md +3 -7
  33. package/.claude/skills/workflow-commands/retrospective.md +1 -1
  34. package/.claude/skills/workflow-commands/split-assessment.md +13 -1
  35. package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
  36. package/.codex/hooks.json +5 -5
  37. package/.github/actions/setup-node/action.yml +9 -0
  38. package/.github/actions/setup-pnpm/action.yml +1 -1
  39. package/.github/dependabot.yml +16 -0
  40. package/.github/release.yml +0 -2
  41. package/.github/workflows/ci.yml +120 -10
  42. package/.github/workflows/publish.yml +8 -1
  43. package/.github/workflows/sonar-qube.yml +1 -0
  44. package/.prettierignore +2 -0
  45. package/.vscode/tasks.json +1 -2
  46. package/CLAUDE.md +3 -7
  47. package/README.md +4 -2
  48. package/SECURITY.md +1 -1
  49. package/dist/CLAUDE.md +3 -7
  50. package/dist/commands/document-read-cli.js +882 -0
  51. package/dist/commands/{document-section-cli.js → document-section-main.js} +79 -37
  52. package/dist/commands/read-set-cli.js +1867 -0
  53. package/dist/commands/run-prep-main.js +21653 -0
  54. package/dist/commands/run-step-cli.js +23880 -0
  55. package/dist/config-merge/index.js +5 -1
  56. package/dist/hooks/audit-provision.js +20 -35
  57. package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
  58. package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
  59. package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
  60. package/dist/hooks/{chunk-TNUMY6NL.js → chunk-PT5R6UJD.js} +4193 -1900
  61. package/dist/hooks/chunk-TUIFS5E7.js +72 -0
  62. package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
  63. package/dist/hooks/{chunk-APUO6U4J.js → chunk-WR2KQAYZ.js} +1843 -440
  64. package/dist/hooks/{chunk-O6GDRNJB.js → chunk-XGBNSWEI.js} +248 -46
  65. package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
  66. package/dist/hooks/codex-hook-adapter.js +10 -22
  67. package/dist/hooks/format-edited.js +5 -6
  68. package/dist/hooks/inputs.json +443 -317
  69. package/dist/hooks/pretool-guard.js +7 -25
  70. package/dist/hooks/session-lang.js +44 -51
  71. package/dist/hooks/stop-guard.js +7716 -2187
  72. package/dist/josh.js +6002 -3583
  73. package/dist/self-sync-guard/index.js +74 -10
  74. package/dist/version/index.js +115 -406
  75. package/eslint/base.js +1 -1
  76. package/lefthook/base.yml +3 -1
  77. package/package.json +10 -48
  78. package/pnpm-workspace.yaml +4 -2
  79. package/prompts/coding-standards.md +1 -1
  80. package/prompts/collaboration-workflow/file-edits.md +1 -7
  81. package/prompts/collaboration-workflow/issue-citation.md +1 -1
  82. package/prompts/collaboration-workflow/issue-template.md +33 -16
  83. package/prompts/collaboration-workflow/lane-instructions.md +1 -2
  84. package/prompts/collaboration-workflow/measurement.md +37 -0
  85. package/prompts/collaboration-workflow/operating-rules.md +4 -6
  86. package/prompts/collaboration-workflow/output-bounds.md +2 -7
  87. package/prompts/collaboration-workflow/plan-comment.md +3 -42
  88. package/prompts/collaboration-workflow/principles.md +5 -0
  89. package/prompts/collaboration-workflow/report-format.md +31 -60
  90. package/prompts/collaboration-workflow/residency.md +2 -2
  91. package/prompts/collaboration-workflow/shell-body.md +6 -16
  92. package/prompts/collaboration-workflow/turn-batching.md +0 -2
  93. package/prompts/collaboration-workflow/upstream-interrupt.md +14 -4
  94. package/prompts/collaboration-workflow/wip-cap.md +1 -1
  95. package/prompts/collaboration-workflow.md +3 -7
  96. package/prompts/refactoring.md +1 -1
  97. package/prompts/review-rubric.md +1 -2
  98. package/prompts/review.md +41 -21
  99. package/prompts/testing-guide.md +8 -43
  100. package/scripts/agent/agent-event.ts +15 -15
  101. package/scripts/agent/agent-exit-record.ts +13 -1
  102. package/scripts/agent/api-auth.ts +41 -0
  103. package/scripts/agent/api-outage.ts +1 -1
  104. package/scripts/auto-ok/auto-ok-cli.ts +14 -16
  105. package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
  106. package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
  107. package/scripts/auto-ok/auto-ok-judge.ts +13 -2
  108. package/scripts/auto-ok/auto-ok-main.ts +17 -0
  109. package/scripts/backlog/backlog-arrival.ts +14 -3
  110. package/scripts/backlog/backlog-budget-cli.ts +7 -33
  111. package/scripts/backlog/backlog-budget-main.ts +16 -0
  112. package/scripts/backlog/backlog-budget.ts +2 -3
  113. package/scripts/backlog/backlog-defect-priority.ts +4 -3
  114. package/scripts/backlog/backlog-drive-adopt.ts +67 -0
  115. package/scripts/backlog/backlog-drive-args.ts +4 -5
  116. package/scripts/backlog/backlog-drive-cli.ts +113 -28
  117. package/scripts/backlog/backlog-drive-hold.ts +162 -0
  118. package/scripts/backlog/backlog-drive-idle.ts +151 -0
  119. package/scripts/backlog/backlog-drive-judge.ts +25 -0
  120. package/scripts/backlog/backlog-drive-memory.ts +126 -0
  121. package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
  122. package/scripts/backlog/backlog-drive-named.ts +53 -6
  123. package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
  124. package/scripts/backlog/backlog-drive-paused.ts +169 -0
  125. package/scripts/backlog/backlog-drive-restore.ts +30 -7
  126. package/scripts/backlog/backlog-drive-seats.ts +18 -8
  127. package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
  128. package/scripts/backlog/backlog-drive.ts +79 -75
  129. package/scripts/backlog/backlog-next-main.ts +16 -0
  130. package/scripts/backlog/backlog-next-shared.ts +73 -0
  131. package/scripts/backlog/backlog-next.ts +48 -16
  132. package/scripts/backlog/backlog-occupied.ts +52 -39
  133. package/scripts/backlog/backlog-offer-cli.ts +6 -21
  134. package/scripts/backlog/backlog-offer-exclude.ts +15 -0
  135. package/scripts/backlog/backlog-offer-main.ts +12 -0
  136. package/scripts/backlog/backlog-offer.ts +36 -3
  137. package/scripts/backlog/backlog-overlap.ts +22 -4
  138. package/scripts/backlog/backlog-plan-read.ts +6 -2
  139. package/scripts/backlog/backlog-plan.ts +18 -4
  140. package/scripts/backlog/backlog-pool.ts +10 -10
  141. package/scripts/backlog/backlog-rank.ts +10 -2
  142. package/scripts/backlog/backlog-ready.ts +112 -30
  143. package/scripts/backlog/backlog-stalled-detect.ts +109 -36
  144. package/scripts/backlog/backlog-stalled.ts +52 -16
  145. package/scripts/backlog/backlog-wait-cause.ts +86 -0
  146. package/scripts/backlog/backlog-waves.ts +39 -13
  147. package/scripts/backlog/backlogrun-args.ts +19 -7
  148. package/scripts/backlog/backlogrun-cli.ts +19 -5
  149. package/scripts/backlog/backlogrun-launch.ts +6 -0
  150. package/scripts/backlog/backlogrun-restart.ts +97 -0
  151. package/scripts/backlog/backlogrun-stop.ts +79 -7
  152. package/scripts/behavior/behavior-cli.ts +2 -2
  153. package/scripts/behavior/behavior-rules.ts +47 -24
  154. package/scripts/build/build-bin.ts +2 -16
  155. package/scripts/build/build-claude-md.ts +0 -7
  156. package/scripts/build/build-commands.ts +0 -13
  157. package/scripts/build/build-hooks.ts +49 -48
  158. package/scripts/build/hook-bundle-stamp.ts +29 -11
  159. package/scripts/build/local-bin.ts +1 -1
  160. package/scripts/cases/cases-cli.ts +25 -13
  161. package/scripts/cases/cases-interaction-scan.ts +134 -0
  162. package/scripts/cases/cases-interaction.ts +183 -0
  163. package/scripts/cases/cases-logic.ts +39 -6
  164. package/scripts/ci/pr-classification-main.ts +18 -0
  165. package/scripts/ci/pr-classification.ts +10 -17
  166. package/scripts/clone/clone-scan.ts +1 -1
  167. package/scripts/cost-runtime/cost-blocks.ts +22 -37
  168. package/scripts/cost-runtime/cost-cli.ts +31 -14
  169. package/scripts/cost-runtime/cost-main.ts +12 -0
  170. package/scripts/cost-runtime/cost-transcript.ts +1 -0
  171. package/scripts/delegation/delegation-policy.ts +17 -4
  172. package/scripts/delegation/duplicate-read-guard.ts +0 -8
  173. package/scripts/delegation/investigation-guard.ts +0 -8
  174. package/scripts/delegation/investigation-reads.ts +3 -4
  175. package/scripts/dependabot/dependabot-cooldown.ts +194 -0
  176. package/scripts/discovery/repo-discovery.ts +24 -6
  177. package/scripts/doctor/doctor-consumer.ts +2 -5
  178. package/scripts/document/document-byte-budget.ts +8 -6
  179. package/scripts/document/document-scan.ts +1 -1
  180. package/scripts/document/document-section-cli.ts +0 -8
  181. package/scripts/document/document-section-main.ts +12 -0
  182. package/scripts/epic/epic-audit-cli.ts +12 -6
  183. package/scripts/epic/epic-bundle-apply.ts +137 -0
  184. package/scripts/epic/epic-bundle-cli.ts +32 -121
  185. package/scripts/epic/epic-bundle-format.ts +116 -0
  186. package/scripts/epic/epic-bundle-main.ts +17 -0
  187. package/scripts/epic/epic-busy.ts +5 -12
  188. package/scripts/epic/epic-classify.ts +24 -15
  189. package/scripts/epic/epic-cli-argv.ts +31 -0
  190. package/scripts/epic/epic-cli-decide.ts +42 -0
  191. package/scripts/epic/epic-cli.ts +6 -38
  192. package/scripts/epic/epic-close.ts +112 -55
  193. package/scripts/epic/epic-cross-repo.ts +4 -7
  194. package/scripts/epic/epic-decide.ts +119 -0
  195. package/scripts/epic/epic-decision.ts +9 -0
  196. package/scripts/epic/epic-fetch.ts +4 -0
  197. package/scripts/epic/epic-graph.ts +2 -0
  198. package/scripts/epic/epic-issue.ts +5 -1
  199. package/scripts/epic/epic-label-age.ts +1 -1
  200. package/scripts/epic/epic-lane-offer.ts +39 -4
  201. package/scripts/epic/epic-next-main.ts +24 -0
  202. package/scripts/epic/epic-next.ts +6 -24
  203. package/scripts/epic/epic-outside-blocker.ts +6 -2
  204. package/scripts/epic/epic-parse.ts +9 -3
  205. package/scripts/epic/epic-read.ts +1 -0
  206. package/scripts/epic/epic-reconcile.ts +39 -0
  207. package/scripts/epic/epic-run.ts +10 -1
  208. package/scripts/epic/epic-solo.ts +50 -14
  209. package/scripts/epic/epic.ts +41 -7
  210. package/scripts/exports/unused-members-cli.ts +2 -2
  211. package/scripts/followup/followup-checks-event.ts +8 -3
  212. package/scripts/followup/followup-coderabbit-wait.ts +82 -0
  213. package/scripts/followup/followup-review-gates.ts +81 -0
  214. package/scripts/followup/git-followup-stages.ts +13 -3
  215. package/scripts/followup/git-followup-workflow.ts +19 -66
  216. package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
  217. package/scripts/followup/git-pr-followup.ts +36 -8
  218. package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
  219. package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
  220. package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
  221. package/scripts/gate/busy-average.ts +58 -0
  222. package/scripts/gate/check-cpu.ts +60 -0
  223. package/scripts/gate/check-inputs.ts +39 -95
  224. package/scripts/gate/check-reuse.ts +33 -54
  225. package/scripts/gate/command-memory.ts +192 -0
  226. package/scripts/gate/core-admission.ts +218 -28
  227. package/scripts/gate/core-budget-timing.ts +37 -0
  228. package/scripts/gate/core-budget.ts +80 -98
  229. package/scripts/gate/core-wait-record.ts +48 -0
  230. package/scripts/gate/core-wait.ts +37 -5
  231. package/scripts/gate/core-weights.ts +86 -0
  232. package/scripts/gate/free-cores.ts +27 -4
  233. package/scripts/gate/gate-ledger.ts +32 -4
  234. package/scripts/gate/gate-plan.ts +41 -34
  235. package/scripts/gate/gate-report.ts +14 -2
  236. package/scripts/gate/gate-run-steps.ts +53 -8
  237. package/scripts/gate/gate-skip.ts +12 -2
  238. package/scripts/gate/gate-steps.ts +12 -1
  239. package/scripts/gate/input-fingerprint.ts +42 -0
  240. package/scripts/gate/machine-capacity.ts +65 -31
  241. package/scripts/gate/moved-paths.ts +67 -0
  242. package/scripts/gate/project-checks.ts +5 -12
  243. package/scripts/gate/scoped-green.ts +12 -8
  244. package/scripts/gate/since-green.ts +62 -0
  245. package/scripts/gate/toolchain-inputs.ts +115 -0
  246. package/scripts/gate/verification-gate.ts +27 -24
  247. package/scripts/gate/verification-inputs.ts +250 -0
  248. package/scripts/gh/gh-author-association.ts +96 -9
  249. package/scripts/gh/git-ai-review-scan.ts +4 -2
  250. package/scripts/gh/git-gh-api-path.ts +15 -0
  251. package/scripts/gh/git-gh-branch-rules.ts +73 -0
  252. package/scripts/gh/git-gh-conditional.ts +5 -2
  253. package/scripts/gh/git-gh-issue-read.ts +5 -1
  254. package/scripts/gh/git-gh-issue-write.ts +67 -29
  255. package/scripts/gh/git-gh-issue.ts +7 -3
  256. package/scripts/gh/git-gh-poll-read.ts +89 -0
  257. package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
  258. package/scripts/gh/git-gh-pr-rest.ts +1 -1
  259. package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
  260. package/scripts/gh/git-gh-pr.ts +27 -15
  261. package/scripts/gh/git-pr-checks-eval.ts +39 -7
  262. package/scripts/gh/git-pr-checks-parse.ts +39 -9
  263. package/scripts/gh/git-pr-merge-checked.ts +80 -0
  264. package/scripts/git/base-tree.ts +19 -2
  265. package/scripts/git/changed-file-scope.ts +6 -4
  266. package/scripts/git/changed-paths.ts +18 -1
  267. package/scripts/git/git-diff-reads.ts +27 -2
  268. package/scripts/git/git-grep-hits.ts +85 -0
  269. package/scripts/git/git-location-environment.ts +1 -1
  270. package/scripts/git/git-merge-conflicts.ts +83 -0
  271. package/scripts/git/git-preflight.ts +37 -12
  272. package/scripts/git/git-push-transport.ts +1 -2
  273. package/scripts/git/git-schemas.ts +17 -7
  274. package/scripts/git/git-spawn.ts +1 -2
  275. package/scripts/git/git-status.ts +4 -4
  276. package/scripts/git/main-merge-main.ts +12 -0
  277. package/scripts/git/main-merge-regenerate.ts +2 -2
  278. package/scripts/git/main-merge.ts +25 -9
  279. package/scripts/git/main-sync-main.ts +12 -0
  280. package/scripts/git/main-sync.ts +0 -9
  281. package/scripts/git/stash/git-stash.ts +27 -4
  282. package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
  283. package/scripts/git/stash/stash-pop-cli.ts +6 -12
  284. package/scripts/git/stash/stash-pop-main.ts +12 -0
  285. package/scripts/git/stash/stash-push-cli.ts +76 -0
  286. package/scripts/git/stash/stash-push-main.ts +12 -0
  287. package/scripts/hooks/batch-guard.ts +0 -8
  288. package/scripts/hooks/check-commit-message-main.ts +8 -0
  289. package/scripts/hooks/check-commit-message.ts +4 -7
  290. package/scripts/hooks/format-edited-file.ts +8 -24
  291. package/scripts/hooks/pre-commit-lint.ts +30 -3
  292. package/scripts/hooks/pre-push-unit.ts +4 -2
  293. package/scripts/hooks/pretool-guard-cli.ts +1 -8
  294. package/scripts/hooks/pretool-guard.ts +32 -19
  295. package/scripts/hooks/reserved-run.ts +67 -9
  296. package/scripts/hooks/run-hook.sh +13 -4
  297. package/scripts/hooks/shell-rules-notice.ts +37 -0
  298. package/scripts/hooks/stop-actions.ts +2 -21
  299. package/scripts/hooks/stop-guard.ts +13 -9
  300. package/scripts/init/hook-command-rewrite.ts +19 -5
  301. package/scripts/init/hook-launch.ts +15 -17
  302. package/scripts/init/init-actions.ts +0 -6
  303. package/scripts/init/init-ai-copy.ts +10 -36
  304. package/scripts/init/init-bootstrap.ts +9 -8
  305. package/scripts/init/init-dry-run-report.ts +1 -1
  306. package/scripts/init/init-dry-run.ts +1 -1
  307. package/scripts/init/init-file-action.ts +7 -9
  308. package/scripts/init/init-logic-json-merge.ts +2 -2
  309. package/scripts/init/init-logic-migrate.ts +9 -82
  310. package/scripts/init/init-logic.ts +3 -2
  311. package/scripts/init/init-main.ts +12 -0
  312. package/scripts/init/init.ts +5 -12
  313. package/scripts/init/kit-development-versions.ts +3 -7
  314. package/scripts/init/kit-written-paths.ts +2 -2
  315. package/scripts/init/project-profile.ts +5 -4
  316. package/scripts/init/tsconfig-preset-migration.ts +2 -1
  317. package/scripts/init/vscode-tasks.ts +1 -1
  318. package/scripts/issue/defect-origin-cli.ts +106 -0
  319. package/scripts/issue/defect-origin-line.ts +60 -0
  320. package/scripts/issue/defect-origin-main.ts +11 -0
  321. package/scripts/issue/defect-origin.ts +114 -0
  322. package/scripts/issue/defect-rate-cli.ts +34 -78
  323. package/scripts/issue/defect-rate.ts +0 -16
  324. package/scripts/issue/defect-report-cli.ts +128 -0
  325. package/scripts/issue/defect-report-format.ts +56 -0
  326. package/scripts/issue/defect-report-main.ts +11 -0
  327. package/scripts/issue/defect-report.ts +160 -0
  328. package/scripts/issue/expected-effect-lint.ts +1 -0
  329. package/scripts/issue/issue-already-done-cli.ts +62 -0
  330. package/scripts/issue/issue-body-or-comment.ts +40 -0
  331. package/scripts/issue/issue-cite-cli.ts +0 -9
  332. package/scripts/issue/issue-cite-main.ts +12 -0
  333. package/scripts/issue/issue-classification.ts +12 -7
  334. package/scripts/issue/issue-comment-cli.ts +10 -24
  335. package/scripts/issue/issue-comment-main.ts +12 -0
  336. package/scripts/issue/issue-evidence-exit.ts +100 -0
  337. package/scripts/issue/issue-file-cli.ts +29 -7
  338. package/scripts/issue/issue-file.ts +19 -19
  339. package/scripts/issue/issue-fold-cli.ts +2 -11
  340. package/scripts/issue/issue-fold-main.ts +12 -0
  341. package/scripts/issue/issue-labels.ts +81 -90
  342. package/scripts/issue/issue-lint-cli.ts +2 -10
  343. package/scripts/issue/issue-lint-main.ts +12 -0
  344. package/scripts/issue/issue-measured-cli.ts +56 -0
  345. package/scripts/issue/issue-merged.ts +19 -2
  346. package/scripts/issue/issue-not-before-label.ts +135 -0
  347. package/scripts/issue/issue-not-before.ts +111 -0
  348. package/scripts/issue/issue-number-shape.ts +15 -1
  349. package/scripts/issue/issue-park.ts +28 -0
  350. package/scripts/issue/issue-plan-cli.ts +151 -0
  351. package/scripts/issue/issue-priority.ts +151 -0
  352. package/scripts/issue/issue-rank.ts +7 -1
  353. package/scripts/issue/issue-read-cli.ts +3 -10
  354. package/scripts/issue/issue-read-main.ts +12 -0
  355. package/scripts/issue/issue-read.ts +29 -5
  356. package/scripts/issue/issue-release-cli.ts +0 -10
  357. package/scripts/issue/issue-release-main.ts +13 -0
  358. package/scripts/issue/issue-release.ts +7 -12
  359. package/scripts/issue/issue-sample-gate.ts +192 -0
  360. package/scripts/issue/issue-sample-source.ts +76 -0
  361. package/scripts/issue/issue-scout-cli.ts +0 -11
  362. package/scripts/issue/issue-scout-main.ts +14 -0
  363. package/scripts/issue/issue-state-cli.ts +0 -10
  364. package/scripts/issue/issue-state-main.ts +12 -0
  365. package/scripts/issue/issue-watch-diff.ts +56 -15
  366. package/scripts/issue/issue-watch.ts +2 -1
  367. package/scripts/issue/issue-wip.ts +2 -7
  368. package/scripts/issue/measure-rerun-cli.ts +13 -8
  369. package/scripts/issue/plan-consumers-cli.ts +39 -0
  370. package/scripts/issue/plan-consumers-main.ts +11 -0
  371. package/scripts/issue/plan-consumers-section.ts +55 -0
  372. package/scripts/issue/plan-consumers.ts +127 -0
  373. package/scripts/josh/agent-session-environment.ts +1 -1
  374. package/scripts/josh/command-usage.ts +15 -43
  375. package/scripts/josh/file-map-stamp.ts +49 -16
  376. package/scripts/josh/hook-decision.ts +32 -20
  377. package/scripts/josh/josh-command-map.ts +4 -1
  378. package/scripts/josh/josh-command-types.ts +12 -6
  379. package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
  380. package/scripts/josh/josh-commands-ai.ts +157 -158
  381. package/scripts/josh/josh-commands-backlog.ts +82 -16
  382. package/scripts/josh/josh-commands-clone.ts +1 -0
  383. package/scripts/josh/josh-commands-development.ts +111 -71
  384. package/scripts/josh/josh-commands-document.ts +43 -1
  385. package/scripts/josh/josh-commands-epic.ts +171 -0
  386. package/scripts/josh/josh-commands-hooks.ts +25 -2
  387. package/scripts/josh/josh-commands-issue-write.ts +181 -0
  388. package/scripts/josh/josh-commands-issue.ts +124 -24
  389. package/scripts/josh/josh-commands-lane.ts +103 -2
  390. package/scripts/josh/josh-commands-lint.ts +19 -8
  391. package/scripts/josh/josh-commands-maintenance.ts +112 -4
  392. package/scripts/josh/josh-commands-pause.ts +29 -0
  393. package/scripts/josh/josh-commands-progress.ts +87 -0
  394. package/scripts/josh/josh-commands-project.ts +138 -9
  395. package/scripts/josh/josh-commands-review.ts +124 -0
  396. package/scripts/josh/josh-commands-run.ts +211 -23
  397. package/scripts/josh/josh-commands-ship.ts +169 -0
  398. package/scripts/josh/josh-commands-split.ts +9 -0
  399. package/scripts/josh/josh-commands-versioning.ts +49 -2
  400. package/scripts/josh/josh-commands-workflow.ts +144 -6
  401. package/scripts/josh/josh-logic.ts +6 -13
  402. package/scripts/josh/package-directory.ts +2 -4
  403. package/scripts/josh/process-identity.ts +13 -4
  404. package/scripts/josh/session-language-cli.ts +4 -8
  405. package/scripts/josh/session-language-main.ts +13 -0
  406. package/scripts/josh/session-language.ts +6 -1
  407. package/scripts/josh/shared-cache.ts +90 -0
  408. package/scripts/josh/stamp-file.ts +9 -15
  409. package/scripts/lane/lane-await.ts +51 -12
  410. package/scripts/lane/lane-cache.ts +5 -30
  411. package/scripts/lane/lane-capacity.ts +14 -23
  412. package/scripts/lane/lane-check-stats.ts +62 -21
  413. package/scripts/lane/lane-child-invocation.ts +8 -0
  414. package/scripts/lane/lane-cli.ts +15 -5
  415. package/scripts/lane/lane-close.ts +86 -18
  416. package/scripts/lane/lane-core-wait-stats.ts +66 -0
  417. package/scripts/lane/lane-dispatch.ts +24 -3
  418. package/scripts/lane/lane-gap-stats.ts +156 -0
  419. package/scripts/lane/lane-handoff.ts +69 -1
  420. package/scripts/lane/lane-held-stats.ts +129 -0
  421. package/scripts/lane/lane-install.ts +4 -11
  422. package/scripts/lane/lane-launch-cli.ts +0 -9
  423. package/scripts/lane/lane-launch-main.ts +12 -0
  424. package/scripts/lane/lane-ledger-schema.ts +266 -0
  425. package/scripts/lane/lane-ledger.ts +92 -123
  426. package/scripts/lane/lane-limit-cli.ts +12 -1
  427. package/scripts/lane/lane-measure-cli.ts +57 -11
  428. package/scripts/lane/lane-open.ts +9 -1
  429. package/scripts/lane/lane-parked.ts +3 -3
  430. package/scripts/lane/lane-pause-cli.ts +130 -0
  431. package/scripts/lane/lane-pause.ts +158 -0
  432. package/scripts/lane/lane-process-table.ts +166 -0
  433. package/scripts/lane/lane-reap-settle.ts +124 -0
  434. package/scripts/lane/lane-reap.ts +50 -15
  435. package/scripts/lane/lane-registry.ts +24 -3
  436. package/scripts/lane/lane-residents.ts +162 -0
  437. package/scripts/lane/lane-restart.ts +22 -2
  438. package/scripts/lane/lane-round-two-stats.ts +49 -0
  439. package/scripts/lane/lane-sampler.ts +4 -0
  440. package/scripts/lane/lane-session-action.ts +19 -5
  441. package/scripts/lane/lane-session-broker.ts +102 -21
  442. package/scripts/lane/lane-snapshot-trace.ts +84 -0
  443. package/scripts/lane/lane-spans.ts +51 -0
  444. package/scripts/lane/lane-spent.ts +6 -3
  445. package/scripts/lane/lane-stage-stats.ts +7 -2
  446. package/scripts/lane/lane-state.ts +302 -0
  447. package/scripts/lane/lane-stats.ts +58 -4
  448. package/scripts/lane/lane-stop-stats.ts +113 -37
  449. package/scripts/lane/lane-test-related-stats.ts +127 -0
  450. package/scripts/lane/lane-transcript-calls.ts +145 -0
  451. package/scripts/lane/lane-transcript-stats.ts +168 -0
  452. package/scripts/lane/lane-vacant.ts +13 -3
  453. package/scripts/lane/lane-withdraw-cli.ts +5 -4
  454. package/scripts/lane/lane-withdraw.ts +50 -49
  455. package/scripts/lane/process-directories.ts +70 -0
  456. package/scripts/lane/process-lane-marks.ts +94 -0
  457. package/scripts/lib/atomic-write.ts +62 -0
  458. package/scripts/lib/buffered-process.ts +12 -5
  459. package/scripts/lib/cli-flags.ts +53 -0
  460. package/scripts/lib/figure-format.ts +63 -0
  461. package/scripts/lib/json-value.ts +9 -1
  462. package/scripts/lib/package-manifest.ts +35 -0
  463. package/scripts/lib/read-file.ts +3 -1
  464. package/scripts/lib/stamped-memo.ts +63 -0
  465. package/scripts/lib/stdout-on-stderr.ts +24 -0
  466. package/scripts/lib/timeouts.ts +9 -0
  467. package/scripts/lib/transcript-record.ts +91 -0
  468. package/scripts/lines/effective-limit.ts +1 -1
  469. package/scripts/lint/eslint-cache-dependencies.ts +145 -0
  470. package/scripts/lint/eslint-daemon.ts +265 -0
  471. package/scripts/lint/format.ts +11 -2
  472. package/scripts/lint/import-graph.ts +279 -0
  473. package/scripts/lint/lint-gate-scope.ts +102 -0
  474. package/scripts/lint/lint-parallel-main.ts +19 -0
  475. package/scripts/lint/lint-parallel.ts +62 -30
  476. package/scripts/lint/lint-related-scope.ts +30 -24
  477. package/scripts/lint/lint-related.ts +38 -6
  478. package/scripts/notify/confirmation-options.ts +1 -2
  479. package/scripts/notify/telegram-notify.ts +20 -20
  480. package/scripts/notify/telegram-test-logic.ts +0 -1
  481. package/scripts/notify/telegram-test-main.ts +8 -0
  482. package/scripts/notify/telegram-test.ts +2 -6
  483. package/scripts/observations/observation-ledger.ts +13 -0
  484. package/scripts/observations/observations-flush-landing.ts +5 -3
  485. package/scripts/observations/observations-flush.ts +6 -1
  486. package/scripts/overrides/overrides-check.ts +2 -5
  487. package/scripts/overrides/overrides-files.ts +2 -1
  488. package/scripts/overrides/overrides-logic.ts +3 -6
  489. package/scripts/package/verify-optional-eslint-install.ts +8 -6
  490. package/scripts/propagate/propagate-publish.ts +2 -7
  491. package/scripts/propagate/propagate-targets.ts +4 -12
  492. package/scripts/refactor/import-graph.ts +9 -7
  493. package/scripts/release/github-release-runs.ts +17 -6
  494. package/scripts/release/release-approval-prune.ts +18 -0
  495. package/scripts/release/release-history.ts +1 -3
  496. package/scripts/release/release-progress.ts +42 -22
  497. package/scripts/release/release-publish-run.ts +39 -0
  498. package/scripts/release/release-publish.ts +6 -6
  499. package/scripts/release/release-scope-cli.ts +0 -10
  500. package/scripts/release/release-scope-main.ts +12 -0
  501. package/scripts/repo/repo-setting.ts +3 -6
  502. package/scripts/repo/required-checks-logic.ts +6 -15
  503. package/scripts/report/report-format-reference.ts +2 -0
  504. package/scripts/report/report-labels.ts +155 -0
  505. package/scripts/report/report-lint-cli.ts +3 -0
  506. package/scripts/report/report-lint.ts +85 -110
  507. package/scripts/report/report-template-cli.ts +59 -0
  508. package/scripts/report/report-template.ts +112 -0
  509. package/scripts/review/acceptance-map.ts +1 -0
  510. package/scripts/review/removed-tests-check.ts +86 -0
  511. package/scripts/review/removed-tests.ts +149 -0
  512. package/scripts/review/review-brief-cli.ts +81 -15
  513. package/scripts/review/review-brief-main.ts +12 -0
  514. package/scripts/review/review-brief.ts +31 -3
  515. package/scripts/review/review-code-tree.ts +10 -6
  516. package/scripts/review/review-comment-round.ts +26 -8
  517. package/scripts/review/review-finding-ledger.ts +30 -15
  518. package/scripts/review/review-interaction.ts +94 -0
  519. package/scripts/review/review-readers-scan.ts +163 -0
  520. package/scripts/review/review-record-cli.ts +69 -30
  521. package/scripts/review/review-record-main.ts +12 -0
  522. package/scripts/review/review-round-one-blobs.ts +221 -0
  523. package/scripts/review/review-round2-cli.ts +49 -12
  524. package/scripts/review/review-round2.ts +80 -12
  525. package/scripts/review/review-stamps.ts +19 -1
  526. package/scripts/review/review-stop-log.ts +96 -0
  527. package/scripts/review/review-stops-cli.ts +85 -0
  528. package/scripts/review/review-tree.ts +6 -17
  529. package/scripts/review/review-untouched-readers.ts +146 -0
  530. package/scripts/review/test-titles.ts +118 -0
  531. package/scripts/rules/agent-model.ts +8 -0
  532. package/scripts/rules/bash-triggers.ts +46 -3
  533. package/scripts/rules/decision-oracle-batch.ts +9 -1
  534. package/scripts/rules/decision-oracle.ts +2 -2
  535. package/scripts/rules/delivered-rules.ts +80 -2
  536. package/scripts/rules/destructive-command.ts +8 -1
  537. package/scripts/rules/direct-filing.ts +10 -2
  538. package/scripts/rules/direct-issue-comment.ts +117 -0
  539. package/scripts/rules/direct-pr-create.ts +69 -3
  540. package/scripts/rules/early-heartbeat.ts +2 -1
  541. package/scripts/rules/file-body.ts +7 -0
  542. package/scripts/rules/filing-cap.ts +7 -0
  543. package/scripts/rules/git-argv.ts +72 -14
  544. package/scripts/rules/git-force.ts +12 -2
  545. package/scripts/rules/guard-remedy.ts +4 -0
  546. package/scripts/rules/implementation-cut-verdict.ts +1 -1
  547. package/scripts/rules/implementation-cut.ts +11 -3
  548. package/scripts/rules/index-guard.ts +8 -1
  549. package/scripts/rules/issue-comments.ts +9 -1
  550. package/scripts/rules/josh-git-bare.ts +7 -0
  551. package/scripts/rules/lane-background.ts +67 -25
  552. package/scripts/rules/lane-carry-conflict.ts +6 -0
  553. package/scripts/rules/lane-direct-tool.ts +74 -0
  554. package/scripts/rules/lane-interactive-ask.ts +9 -2
  555. package/scripts/rules/lane-park.ts +45 -23
  556. package/scripts/rules/lane-split-park.ts +10 -2
  557. package/scripts/rules/lane-switch-main.ts +7 -0
  558. package/scripts/rules/oracle-consulted.ts +10 -0
  559. package/scripts/rules/oracle-firing.ts +1 -0
  560. package/scripts/rules/permission-guards.ts +3 -0
  561. package/scripts/rules/piped-verification.ts +1 -1
  562. package/scripts/rules/poll-loop.ts +7 -0
  563. package/scripts/rules/pr-merge.ts +123 -0
  564. package/scripts/rules/protected-files.ts +32 -5
  565. package/scripts/rules/raw-field-body.ts +6 -0
  566. package/scripts/rules/rule-body-guard.ts +8 -0
  567. package/scripts/rules/rule-list.ts +9 -28
  568. package/scripts/rules/rule-value-cache.ts +4 -9
  569. package/scripts/rules/rule-value-cli.ts +51 -32
  570. package/scripts/rules/rule-value.ts +1 -1
  571. package/scripts/rules/shell-segments.ts +35 -0
  572. package/scripts/rules/stop-rule-rows.ts +64 -0
  573. package/scripts/rules/stop-rules.ts +3 -4
  574. package/scripts/rules/test-declared-commit.ts +11 -1
  575. package/scripts/rules/third-party-write.ts +7 -0
  576. package/scripts/rules/timed-rerun.ts +69 -0
  577. package/scripts/rules/worktree-guard.ts +13 -3
  578. package/scripts/run/board/run-board-app-name.ts +23 -0
  579. package/scripts/run/board/run-board-cli.ts +65 -32
  580. package/scripts/run/board/run-board-earlier.ts +94 -0
  581. package/scripts/run/board/run-board-ending-reason.ts +67 -0
  582. package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
  583. package/scripts/run/board/run-board-estimate.ts +98 -0
  584. package/scripts/run/board/run-board-fit.ts +153 -36
  585. package/scripts/run/board/run-board-fold.ts +123 -0
  586. package/scripts/run/board/run-board-fresh.ts +2 -2
  587. package/scripts/run/board/run-board-gather-live.ts +29 -0
  588. package/scripts/run/board/run-board-gather-thread.ts +189 -0
  589. package/scripts/run/board/run-board-gather-worker.ts +29 -0
  590. package/scripts/run/board/run-board-gather.ts +187 -0
  591. package/scripts/run/board/run-board-github.ts +118 -38
  592. package/scripts/run/board/run-board-header.ts +82 -20
  593. package/scripts/run/board/run-board-keys.ts +58 -0
  594. package/scripts/run/board/run-board-kind.ts +20 -6
  595. package/scripts/run/board/run-board-labels.ts +116 -71
  596. package/scripts/run/board/run-board-lane-state.ts +109 -0
  597. package/scripts/run/board/run-board-lane-time.ts +122 -0
  598. package/scripts/run/board/run-board-layout.ts +239 -60
  599. package/scripts/run/board/run-board-length.ts +52 -0
  600. package/scripts/run/board/run-board-machine.ts +8 -4
  601. package/scripts/run/board/run-board-main.ts +12 -0
  602. package/scripts/run/board/run-board-notes.ts +52 -31
  603. package/scripts/run/board/run-board-now.ts +1 -1
  604. package/scripts/run/board/run-board-operation.ts +15 -33
  605. package/scripts/run/board/run-board-phase.ts +1 -1
  606. package/scripts/run/board/run-board-plan-shared.ts +115 -0
  607. package/scripts/run/board/run-board-plan.ts +55 -3
  608. package/scripts/run/board/run-board-planning.ts +45 -0
  609. package/scripts/run/board/run-board-priority.ts +44 -0
  610. package/scripts/run/board/run-board-process-groups.ts +195 -0
  611. package/scripts/run/board/run-board-read.ts +151 -27
  612. package/scripts/run/board/run-board-reason.ts +235 -51
  613. package/scripts/run/board/run-board-released.ts +35 -0
  614. package/scripts/run/board/run-board-render-checks.ts +39 -5
  615. package/scripts/run/board/run-board-render-condition.ts +96 -0
  616. package/scripts/run/board/run-board-render-drawn.ts +67 -0
  617. package/scripts/run/board/run-board-render-foot.ts +59 -0
  618. package/scripts/run/board/run-board-render-icon.ts +35 -0
  619. package/scripts/run/board/run-board-render-lanes.ts +145 -0
  620. package/scripts/run/board/run-board-render-lead.ts +80 -0
  621. package/scripts/run/board/run-board-render-legend.ts +117 -48
  622. package/scripts/run/board/run-board-render-notes.ts +156 -29
  623. package/scripts/run/board/run-board-render-processes.ts +196 -0
  624. package/scripts/run/board/run-board-render-section.ts +119 -0
  625. package/scripts/run/board/run-board-render-slot.ts +3 -36
  626. package/scripts/run/board/run-board-render-tail.ts +115 -48
  627. package/scripts/run/board/run-board-render-time.ts +56 -0
  628. package/scripts/run/board/run-board-render-title.ts +117 -24
  629. package/scripts/run/board/run-board-render-waits.ts +104 -20
  630. package/scripts/run/board/run-board-render.ts +207 -265
  631. package/scripts/run/board/run-board-roots.ts +54 -0
  632. package/scripts/run/board/run-board-row-yield.ts +9 -4
  633. package/scripts/run/board/run-board-setup.ts +1 -12
  634. package/scripts/run/board/run-board-snapshot.ts +111 -0
  635. package/scripts/run/board/run-board-spin.ts +2 -2
  636. package/scripts/run/board/run-board-state.ts +22 -33
  637. package/scripts/run/board/run-board-status.ts +147 -71
  638. package/scripts/run/board/run-board-thanks-read.ts +2 -2
  639. package/scripts/run/board/run-board-tick.ts +122 -107
  640. package/scripts/run/board/run-board-usage-board.ts +78 -0
  641. package/scripts/run/board/run-board-usage-lanes.ts +113 -0
  642. package/scripts/run/board/run-board-usage-listing.ts +93 -0
  643. package/scripts/run/board/run-board-usage-read.ts +120 -150
  644. package/scripts/run/board/run-board-usage-rusage.ts +19 -7
  645. package/scripts/run/board/run-board-usage-text.ts +139 -51
  646. package/scripts/run/board/run-board-usage-top.ts +102 -0
  647. package/scripts/run/board/run-board-usage.ts +89 -72
  648. package/scripts/run/board/run-board-usual.ts +20 -9
  649. package/scripts/run/carry/run-carry-args.ts +4 -7
  650. package/scripts/run/carry/run-carry-conversation.ts +1 -1
  651. package/scripts/run/carry/run-carry.ts +9 -4
  652. package/scripts/run/cut/run-cut-handoff.ts +2 -2
  653. package/scripts/run/event/run-event-cli.ts +1 -5
  654. package/scripts/run/event/run-event-filed.ts +12 -6
  655. package/scripts/run/event/run-event-follow.ts +2 -3
  656. package/scripts/run/event/run-event-render.ts +6 -10
  657. package/scripts/run/event/run-event-scope.ts +2 -2
  658. package/scripts/run/event/run-event-stream-emit.ts +82 -22
  659. package/scripts/run/event/run-event-stream.ts +34 -8
  660. package/scripts/run/hold/run-hold-adopt.ts +65 -0
  661. package/scripts/run/hold/run-hold-cli.ts +93 -22
  662. package/scripts/run/hold/run-hold-main.ts +12 -0
  663. package/scripts/run/hold/run-hold-member.ts +37 -0
  664. package/scripts/run/hold/run-stop-notify.ts +183 -0
  665. package/scripts/run/merge/run-merge-auth.ts +31 -0
  666. package/scripts/run/merge/run-merge-cli.ts +62 -48
  667. package/scripts/run/merge/run-merge-close.ts +74 -0
  668. package/scripts/run/merge/run-merge-collect.ts +6 -13
  669. package/scripts/run/merge/run-merge-driver.ts +71 -0
  670. package/scripts/run/merge/run-merge-main.ts +12 -0
  671. package/scripts/run/merge/run-merge-outcome.ts +23 -0
  672. package/scripts/run/merge/run-merge-restart.ts +39 -0
  673. package/scripts/run/merge/run-merge-ship.ts +20 -4
  674. package/scripts/run/merge/run-merge-signals.ts +33 -9
  675. package/scripts/run/merge/run-merge-steps.ts +120 -85
  676. package/scripts/run/merge/run-merge.ts +38 -37
  677. package/scripts/run/park/run-park-cli.ts +91 -0
  678. package/scripts/run/park/run-park.ts +88 -0
  679. package/scripts/run/park/run-stalled.ts +68 -0
  680. package/scripts/run/pause/run-pause-cli.ts +73 -0
  681. package/scripts/run/pause/run-pause.ts +251 -0
  682. package/scripts/run/progress/run-progress-cli.ts +4 -12
  683. package/scripts/run/progress/run-progress-clock.ts +1 -1
  684. package/scripts/run/progress/run-progress-config.ts +6 -14
  685. package/scripts/run/progress/run-progress-main.ts +12 -0
  686. package/scripts/run/progress/run-progress.ts +1 -4
  687. package/scripts/run/review/run-review.ts +2 -1
  688. package/scripts/run/run-ending.ts +1 -0
  689. package/scripts/run/run-invocation.ts +5 -6
  690. package/scripts/run/run-liveness-cli.ts +6 -8
  691. package/scripts/run/run-liveness.ts +60 -29
  692. package/scripts/run/run-next.ts +1 -1
  693. package/scripts/run/run-parent-cut-hook.ts +2 -2
  694. package/scripts/run/run-preflight.ts +18 -3
  695. package/scripts/run/run-prep-cli.ts +1 -10
  696. package/scripts/run/run-prep-locate.ts +7 -50
  697. package/scripts/run/run-prep-main.ts +12 -0
  698. package/scripts/run/run-prep.ts +6 -0
  699. package/scripts/run/run-report-cli.ts +101 -13
  700. package/scripts/run/run-report-handoff.ts +114 -0
  701. package/scripts/run/run-step.ts +1 -1
  702. package/scripts/run/run-stranded-detect.ts +13 -0
  703. package/scripts/run/run-watcher-guard-cli.ts +1 -1
  704. package/scripts/run/run-watcher-guard.ts +1 -1
  705. package/scripts/run/ship/run-ship-args.ts +121 -0
  706. package/scripts/run/ship/run-ship-body-draft.ts +110 -0
  707. package/scripts/run/ship/run-ship-cli.ts +63 -140
  708. package/scripts/run/ship/run-ship-detach.ts +19 -8
  709. package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
  710. package/scripts/run/ship/run-ship-next.ts +18 -2
  711. package/scripts/run/ship/run-ship-overlap.ts +42 -5
  712. package/scripts/run/ship/run-ship-place.ts +96 -0
  713. package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
  714. package/scripts/run/ship/run-ship-pre-detach.ts +81 -24
  715. package/scripts/run/ship/run-ship-preflight.ts +137 -32
  716. package/scripts/run/ship/run-ship-probe.ts +11 -3
  717. package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
  718. package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
  719. package/scripts/run/ship/run-ship-return.ts +107 -23
  720. package/scripts/run/ship/run-ship-review-steps.ts +105 -151
  721. package/scripts/run/ship/run-ship-review.ts +73 -6
  722. package/scripts/run/ship/run-ship-reviewer.ts +207 -0
  723. package/scripts/run/ship/run-ship-stage.ts +55 -6
  724. package/scripts/run/ship/run-ship-steps.ts +46 -15
  725. package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
  726. package/scripts/run/ship/run-ship-stop-text.ts +11 -6
  727. package/scripts/run/ship/run-ship-sync.ts +43 -6
  728. package/scripts/run/ship/run-ship.ts +30 -2
  729. package/scripts/run/tidy/run-tidy-cli.ts +0 -4
  730. package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
  731. package/scripts/run/tidy/run-tidy-main.ts +8 -0
  732. package/scripts/run/wake/run-wake-cli.ts +119 -100
  733. package/scripts/run/wake/run-wake-code.ts +83 -0
  734. package/scripts/run/wake/run-wake-driver.ts +19 -8
  735. package/scripts/run/wake/run-wake-loop.ts +34 -3
  736. package/scripts/run/wake/run-wake-main.ts +13 -0
  737. package/scripts/run/wake/run-wake-ports.ts +90 -0
  738. package/scripts/run/wake/run-wake-takeover.ts +66 -0
  739. package/scripts/run/wake/run-wake.ts +2 -1
  740. package/scripts/safe-chain/pack-hook.ts +2 -2
  741. package/scripts/safe-chain/preinstall-command.ts +2 -1
  742. package/scripts/safe-chain/project-config.ts +3 -9
  743. package/scripts/security/security-audit-main.ts +8 -0
  744. package/scripts/security/security-audit-provision-logic.ts +0 -11
  745. package/scripts/security/security-audit-provision-main.ts +12 -0
  746. package/scripts/security/security-audit-provision.ts +11 -26
  747. package/scripts/security/security-audit.ts +6 -7
  748. package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
  749. package/scripts/split/split-assess-cli.ts +2 -2
  750. package/scripts/split/split-assess.ts +15 -0
  751. package/scripts/split/split-measure.ts +65 -0
  752. package/scripts/sync/claude-settings-merge.ts +8 -15
  753. package/scripts/sync/directory-copy-guard.ts +4 -9
  754. package/scripts/sync/file-content.ts +78 -8
  755. package/scripts/sync/sync-ai-files.ts +3 -5
  756. package/scripts/sync/sync-configs.ts +11 -23
  757. package/scripts/sync/sync-hook-safety.ts +4 -10
  758. package/scripts/sync/sync-main.ts +11 -0
  759. package/scripts/sync/sync.ts +25 -37
  760. package/scripts/test/test-declared-changed.ts +2 -2
  761. package/scripts/test/test-declared.ts +1 -1
  762. package/scripts/test/test-e2e-guard.ts +25 -1
  763. package/scripts/test/test-e2e-stamp.ts +38 -0
  764. package/scripts/test/test-pinned-logic.ts +145 -0
  765. package/scripts/test/test-pinned-main.ts +78 -0
  766. package/scripts/test/test-pinned.ts +100 -0
  767. package/scripts/test/test-read-map.ts +264 -0
  768. package/scripts/test/test-read-recording.ts +91 -0
  769. package/scripts/test/test-read-trace.ts +148 -0
  770. package/scripts/test/test-red-main.ts +12 -0
  771. package/scripts/test/test-red.ts +12 -30
  772. package/scripts/test/test-related-main.ts +18 -0
  773. package/scripts/test/test-related-record.ts +119 -0
  774. package/scripts/test/test-related-scope.ts +229 -43
  775. package/scripts/test/test-related.ts +300 -22
  776. package/scripts/test/test-unit-guard-main.ts +15 -0
  777. package/scripts/test/test-unit-guard.ts +42 -24
  778. package/scripts/test/unit-count-file.ts +37 -0
  779. package/scripts/test/unit-run-marker.ts +162 -0
  780. package/scripts/test/unit-setup-files.ts +51 -0
  781. package/scripts/test/unit-worker-share.ts +61 -149
  782. package/scripts/test/whole-suite-files.ts +63 -0
  783. package/scripts/time-runtime/time-background.ts +20 -2
  784. package/scripts/time-runtime/time-bundles.ts +4 -3
  785. package/scripts/time-runtime/time-density-hook.ts +8 -6
  786. package/scripts/time-runtime/time-followup-stage.ts +1 -3
  787. package/scripts/time-runtime/time-format.ts +5 -28
  788. package/scripts/time-runtime/time-markers.ts +10 -1
  789. package/scripts/time-runtime/time-shell.ts +97 -10
  790. package/scripts/time-runtime/time-transcript-line.ts +49 -62
  791. package/scripts/uninstall/uninstall.ts +1 -1
  792. package/scripts/version/bump-version-main.ts +12 -0
  793. package/scripts/version/bump-version.ts +25 -25
  794. package/scripts/version/effective-upstream.ts +6 -12
  795. package/scripts/version/latest-corepack.ts +17 -32
  796. package/scripts/version/latest-if-required-cli.ts +93 -0
  797. package/scripts/version/latest-lane-guard-main.ts +8 -0
  798. package/scripts/version/latest-lane-guard.ts +0 -4
  799. package/scripts/version/latest-scope-cli.ts +0 -9
  800. package/scripts/version/latest-scope-main.ts +12 -0
  801. package/scripts/version/latest-update.ts +5 -5
  802. package/scripts/version/npm-registry.ts +44 -6
  803. package/scripts/version/publishable-range-check.ts +5 -16
  804. package/scripts/version/release-age.ts +1 -1
  805. package/scripts/version/release-hold.ts +1 -1
  806. package/scripts/version/release-window.ts +38 -0
  807. package/scripts/version/running-binary.ts +1 -1
  808. package/scripts/version/safe-chain-version-update.ts +3 -8
  809. package/scripts/version/version-targets.ts +6 -28
  810. package/templates/dependabot.yml +29 -0
  811. package/templates/gitignore +4 -1
  812. package/templates/pnpm-workspace.basic.yaml +1 -1
  813. package/templates/sonar-project.properties +3 -2
  814. package/templates/workflows/ci.yml +12 -4
  815. package/templates/workflows/github-release.yml +4 -0
  816. package/tsconfig.sonar.json +1 -1
  817. package/.ncurc.json +0 -3
  818. package/dist/hooks/batch-guard.js +0 -29
  819. package/dist/hooks/chunk-4KKD2UTK.js +0 -66
  820. package/dist/hooks/chunk-6TS2JD6D.js +0 -237
  821. package/dist/hooks/chunk-7DSBJVFH.js +0 -50
  822. package/dist/hooks/chunk-A65Y4YOR.js +0 -79
  823. package/dist/hooks/chunk-CDY4NFQG.js +0 -15
  824. package/dist/hooks/chunk-EFXE6C37.js +0 -81
  825. package/dist/hooks/chunk-GP4IEC4O.js +0 -20
  826. package/dist/hooks/chunk-JP45SOCJ.js +0 -56
  827. package/dist/hooks/chunk-LAOV7NLM.js +0 -45
  828. package/dist/hooks/chunk-M4HGZV7U.js +0 -83
  829. package/dist/hooks/chunk-PF2NZL2A.js +0 -131
  830. package/dist/hooks/chunk-PTICX4OL.js +0 -358
  831. package/dist/hooks/chunk-RT27QRJW.js +0 -6247
  832. package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
  833. package/dist/hooks/chunk-UPUZF3AN.js +0 -279
  834. package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
  835. package/dist/hooks/duplicate-read-guard.js +0 -30
  836. package/dist/hooks/investigation-guard.js +0 -29
  837. package/scripts/backlog/backlog-stalled-cli.ts +0 -30
  838. package/scripts/cost-runtime/cost-format.ts +0 -29
  839. package/scripts/init/basic-path-migration.ts +0 -24
  840. package/scripts/issue/issue-backlinks-cli.ts +0 -93
  841. package/scripts/josh/josh-commands-guard.ts +0 -38
  842. package/scripts/josh/josh-usage-automation.ts +0 -121
  843. package/scripts/josh/josh-usage-backlog.ts +0 -180
  844. package/scripts/josh/josh-usage-developer.ts +0 -230
  845. package/scripts/josh/josh-usage-hooks.ts +0 -38
  846. package/scripts/josh/josh-usage-issue.ts +0 -205
  847. package/scripts/josh/josh-usage-review.ts +0 -101
  848. package/scripts/josh/josh-usage-run.ts +0 -252
  849. package/scripts/josh/josh-usage-session.ts +0 -238
  850. package/scripts/josh/josh-usage-workflow.ts +0 -212
  851. package/scripts/lint/cross-file-recheck.ts +0 -155
  852. package/scripts/registry-migration/migrate-logic.ts +0 -237
  853. package/scripts/registry-migration/migrate.ts +0 -292
  854. package/scripts/registry-migration/user-npmrc.ts +0 -15
  855. package/scripts/rules/rule-guard.ts +0 -23
  856. package/scripts/rules/rule-registry-rows.ts +0 -292
  857. package/scripts/rules/rule-registry.ts +0 -112
  858. package/scripts/run/run-stranded-cli.ts +0 -27
@@ -0,0 +1,266 @@
1
+ import { z } from 'zod'
2
+
3
+ // The shape of each line `lane-ledger.ts` appends and reads back — one schema per entry kind.
4
+
5
+ const KIND = {
6
+ MERGE: 'merge',
7
+ GATE: 'gate',
8
+ LOAD: 'load',
9
+ DISPATCH: 'dispatch',
10
+ STAGE: 'stage',
11
+ STOP: 'stop',
12
+ OVERLAP: 'overlap',
13
+ HELD: 'held',
14
+ RELEASED: 'released',
15
+ ROUND_TWO: 'round-two',
16
+ OFFERABLE: 'offerable',
17
+ CORE_WAIT: 'core-wait',
18
+ UNIT_FILES: 'unit-files',
19
+ TEST_RELATED: 'test-related',
20
+ } as const
21
+
22
+ const merge_schema = z.object({ kind: z.literal(KIND.MERGE), at: z.string(), issue: z.number() })
23
+ const check_schema = z.object({
24
+ label: z.string(),
25
+ elapsed_ms: z.number(),
26
+ is_passed: z.boolean(),
27
+ is_reused: z.boolean().optional(),
28
+ // The CPU milliseconds the check's process tree spent, so a core weight can be re-measured from
29
+ // the ledger (joshuafolkken/kit#4362). Absent where the gate could not read it (off macOS).
30
+ cpu_ms: z.number().optional(),
31
+ // Why the unit leg ran the whole suite instead of the related tests — a stable kind, never the
32
+ // file it names (joshuafolkken/kit#4397). Absent when it narrowed, and on every other check.
33
+ fallback: z.string().optional(),
34
+ // The unit leg's since-green no-op: nothing moved, so it ran no test (joshuafolkken/kit#4457).
35
+ is_unmoved: z.boolean().optional(),
36
+ // The width the check asked the core budget for, the width it ran at and how long it waited, so a
37
+ // unit claim's wait for room is read per run (joshuafolkken/kit#4451). Absent on a check that
38
+ // claimed none — a reused one, or one inside another gate's claim.
39
+ claim: z.object({ requested: z.number(), granted: z.number(), waited_ms: z.number() }).optional(),
40
+ })
41
+ const gate_schema = z.object({
42
+ kind: z.literal(KIND.GATE),
43
+ at: z.string(),
44
+ elapsed_ms: z.number(),
45
+ is_passed: z.boolean(),
46
+ // The unit suite's own duration, present when this gate ran it — the one
47
+ // record of a full vitest run `josh metrics` reads, so the suite is never timed twice.
48
+ unit_ms: z.number().optional(),
49
+ // The whole cores busy outside this gate, beyond the machine's baseline, at its start or its end —
50
+ // whichever was higher. Absent when the machine could not be read.
51
+ external_cores: z.number().optional(),
52
+ // Each check's own duration and verdict, so `josh lane:stats` can name the check a slow gate waited
53
+ // on. A reused check started no process: its row says so, and its zero is no timing.
54
+ checks: z.array(check_schema).optional(),
55
+ // A gate that reused a green record for this tree and base and started no check: counted, never
56
+ // timed (joshuafolkken/kit#4397).
57
+ is_reused: z.boolean().optional(),
58
+ })
59
+ // `available_mb`, `swapped_mb` and `lanes` are optional because each read can fail on its own — a
60
+ // platform with no memory reading, a `git worktree` call that did not answer — and a sample is still
61
+ // worth its load. `swapped_mb` is `machine_capacity`'s counter, every page swapped since boot.
62
+ // Both memory fields were renamed with their meaning (joshuafolkken/kit#3593): an older row's
63
+ // `free_mb` / `swap_mb` are stripped on read, so the two measurements never share a column.
64
+ const process_kind_schema = z.object({
65
+ kind: z.string(),
66
+ cpu_percent: z.number(),
67
+ rss_mb: z.number(),
68
+ count: z.number(),
69
+ })
70
+ const load_schema = z.object({
71
+ kind: z.literal(KIND.LOAD),
72
+ at: z.string(),
73
+ load: z.number(),
74
+ available_mb: z.number().optional(),
75
+ swapped_mb: z.number().optional(),
76
+ lanes: z.number().optional(),
77
+ // The heaviest process kinds at the instant of the sample (`lane-process-load.ts`), so the load the
78
+ // core budget's ledger does not explain can be read back by what made it (joshuafolkken/kit#3874).
79
+ processes: z.array(process_kind_schema).optional(),
80
+ })
81
+ // A lane child started on `issue` — the instant its implementation is timed from.
82
+ const dispatch_schema = z.object({
83
+ kind: z.literal(KIND.DISPATCH),
84
+ at: z.string(),
85
+ issue: z.number(),
86
+ })
87
+ // One finished stage of a lane's run, passed or failed: `at` is its end and `elapsed_ms` its length, so
88
+ // its start is read from the two. `issue` is absent where the writer does not hold one — `followup`'s
89
+ // CI wait, which is timed on a path that fails before the issue is known.
90
+ const stage_schema = z.object({
91
+ kind: z.literal(KIND.STAGE),
92
+ at: z.string(),
93
+ stage: z.string(),
94
+ elapsed_ms: z.number(),
95
+ issue: z.number().optional(),
96
+ })
97
+ // A `josh ship` that stopped on `issue`: `reason` is the stage it stopped at, or `conflict` — the
98
+ // retrospective's stop reason — and `cause` why (`run-ship-stop-cause.ts`), absent on a stop recorded
99
+ // before it had one. `preconditions` names the kinds a preflight stop found unmet (`run-ship-preflight.ts`),
100
+ // with `pre-detach` where a lane child's fast checks went red beside them (joshuafolkken/kit#4478),
101
+ // absent on any other stop and on one recorded before it had them. `findings` names the
102
+ // `<category>:<severity>` of each finding that decided a review or round-2 stop — the blocking ones, else
103
+ // the fixed ones (joshuafolkken/kit#4426),
104
+ // absent where none decided the stop. How long it stayed stopped is derived from the next ship stage, not recorded, so a
105
+ // resumed ship never has to know the stop it ends.
106
+ const stop_schema = z.object({
107
+ kind: z.literal(KIND.STOP),
108
+ at: z.string(),
109
+ issue: z.number(),
110
+ reason: z.string(),
111
+ cause: z.string().optional(),
112
+ preconditions: z.array(z.string()).optional(),
113
+ findings: z.array(z.string()).optional(),
114
+ })
115
+ // A `josh ship` on `issue` whose actual change overlapped the open pull requests of `lanes` on `paths`
116
+ // before its sync: it waited `waited_ms` for their ships to end, and `is_cleared` is false where the
117
+ // wait ran out first (joshuafolkken/kit#3901).
118
+ const overlap_schema = z.object({
119
+ kind: z.literal(KIND.OVERLAP),
120
+ at: z.string(),
121
+ issue: z.number(),
122
+ lanes: z.array(z.number()),
123
+ paths: z.array(z.string()),
124
+ waited_ms: z.number(),
125
+ is_cleared: z.boolean(),
126
+ })
127
+ // A `backlog:drive` pass that left a free lane empty: `reason` is why — the offer verdict that started
128
+ // nothing, or the hand-back that stopped the driver. How long the lane stayed empty is derived from the
129
+ // next `held`, `released` or `dispatch` entry, the way a stop's wait is (joshuafolkken/kit#3995).
130
+ // `waiting` names the issues a `chain` / `gate` hold waited on (joshuafolkken/kit#4513).
131
+ const held_schema = z.object({
132
+ kind: z.literal(KIND.HELD),
133
+ at: z.string(),
134
+ reason: z.string(),
135
+ waiting: z.array(z.number()).optional(),
136
+ })
137
+ // The end of a hold no dispatch ended: every lane taken — one opened outside the driver included — or
138
+ // the run finished, so no free lane is owed a child any more.
139
+ const released_schema = z.object({ kind: z.literal(KIND.RELEASED), at: z.string() })
140
+ // One `review:round2` decision a `josh ship` acted on for `issue`: `verdict` and the stable reason
141
+ // `code` it fell under, so the period's skips and runs are counted by why (joshuafolkken/kit#4064).
142
+ const round_two_schema = z.object({
143
+ kind: z.literal(KIND.ROUND_TWO),
144
+ at: z.string(),
145
+ issue: z.number(),
146
+ verdict: z.string(),
147
+ code: z.string(),
148
+ })
149
+ // A stall detector observation, written only when it changes: whether offerable backlog work and a free
150
+ // lane coexisted, so a stall is aged from when both first held rather than from the last launch
151
+ // (joshuafolkken/kit#4349).
152
+ const offerable_schema = z.object({
153
+ kind: z.literal(KIND.OFFERABLE),
154
+ at: z.string(),
155
+ is_offerable: z.boolean(),
156
+ })
157
+ // One claim that waited `waited_ms` for the core budget before `command` could start — written by the
158
+ // command itself, so a wait inside a gate, a scoped check or a ship lands in one record. `issue` is the
159
+ // lane the claim ran in, absent outside a lane (joshuafolkken/kit#4382).
160
+ const core_wait_schema = z.object({
161
+ kind: z.literal(KIND.CORE_WAIT),
162
+ at: z.string(),
163
+ command: z.string(),
164
+ waited_ms: z.number(),
165
+ issue: z.number().optional(),
166
+ })
167
+ // One vitest run's slowest test files, each with its wall time from environment setup to its last
168
+ // test, so a unit run whose wall time far outran its CPU names the file it stalled on
169
+ // (joshuafolkken/kit#4451). Written by the run itself (`tools/test/unit-file-reporter.ts`).
170
+ const unit_file_schema = z.object({ file: z.string(), elapsed_ms: z.number() })
171
+ const unit_files_schema = z.object({
172
+ kind: z.literal(KIND.UNIT_FILES),
173
+ at: z.string(),
174
+ files: z.array(unit_file_schema),
175
+ })
176
+ // One `josh test:related` run (joshuafolkken/kit#4465): `scope` is `related`, `none` or the full-suite
177
+ // fallback kind; the four counts are its input — the change itself, what a main sync brought into it,
178
+ // what the change since the test-read map's tree joined to it and the map's readers — and `test_files`
179
+ // how many vitest ran, absent where none reported. `trigger_files` are the changed files that sent a
180
+ // full-suite run there, absent where none did and on rows written before it (joshuafolkken/kit#4510).
181
+ const test_related_schema = z.object({
182
+ kind: z.literal(KIND.TEST_RELATED),
183
+ at: z.string(),
184
+ scope: z.string(),
185
+ changed: z.number(),
186
+ synced: z.number(),
187
+ since_map: z.number(),
188
+ readers: z.number(),
189
+ test_files: z.number().optional(),
190
+ trigger_files: z.array(z.string()).optional(),
191
+ elapsed_ms: z.number(),
192
+ })
193
+ const entry_schema = z.discriminatedUnion('kind', [
194
+ merge_schema,
195
+ gate_schema,
196
+ load_schema,
197
+ dispatch_schema,
198
+ stage_schema,
199
+ stop_schema,
200
+ overlap_schema,
201
+ held_schema,
202
+ released_schema,
203
+ round_two_schema,
204
+ offerable_schema,
205
+ core_wait_schema,
206
+ unit_files_schema,
207
+ test_related_schema,
208
+ ])
209
+
210
+ type LedgerEntry = z.infer<typeof entry_schema>
211
+ type MergeEntry = z.infer<typeof merge_schema>
212
+ type GateEntry = z.infer<typeof gate_schema>
213
+ type LoadEntry = z.infer<typeof load_schema>
214
+ type DispatchEntry = z.infer<typeof dispatch_schema>
215
+ type StageEntry = z.infer<typeof stage_schema>
216
+ type StopEntry = z.infer<typeof stop_schema>
217
+ type OverlapEntry = z.infer<typeof overlap_schema>
218
+ type HeldEntry = z.infer<typeof held_schema>
219
+ type RoundTwoEntry = z.infer<typeof round_two_schema>
220
+ type OfferableEntry = z.infer<typeof offerable_schema>
221
+ type CoreWaitEntry = z.infer<typeof core_wait_schema>
222
+ type CoreWaitRecord = Omit<CoreWaitEntry, 'kind' | 'at'>
223
+ type UnitFilesEntry = z.infer<typeof unit_files_schema>
224
+ type UnitFileRecord = z.infer<typeof unit_file_schema>
225
+ type TestRelatedEntry = z.infer<typeof test_related_schema>
226
+ type TestRelatedRecord = Omit<TestRelatedEntry, 'kind' | 'at'>
227
+ type RoundTwoRecord = Omit<RoundTwoEntry, 'kind' | 'at'>
228
+ // What a finished gate reports; the ledger stamps the kind and the time.
229
+ type GateRecord = Omit<GateEntry, 'kind' | 'at'>
230
+ type GateCheckRecord = z.infer<typeof check_schema>
231
+ type StageRecord = Omit<StageEntry, 'kind' | 'at'>
232
+ type StopRecord = Omit<StopEntry, 'kind' | 'at'>
233
+ type OverlapRecord = Omit<OverlapEntry, 'kind' | 'at'>
234
+ type HeldRecord = Omit<HeldEntry, 'kind' | 'at' | 'waiting'> & {
235
+ waiting?: ReadonlyArray<number> | undefined
236
+ }
237
+
238
+ const lane_ledger_schema = { KIND, entry_schema }
239
+
240
+ export type {
241
+ CoreWaitEntry,
242
+ CoreWaitRecord,
243
+ DispatchEntry,
244
+ GateCheckRecord,
245
+ GateEntry,
246
+ GateRecord,
247
+ HeldEntry,
248
+ HeldRecord,
249
+ LedgerEntry,
250
+ LoadEntry,
251
+ MergeEntry,
252
+ OfferableEntry,
253
+ OverlapEntry,
254
+ OverlapRecord,
255
+ RoundTwoEntry,
256
+ RoundTwoRecord,
257
+ StageEntry,
258
+ StageRecord,
259
+ StopEntry,
260
+ StopRecord,
261
+ TestRelatedEntry,
262
+ TestRelatedRecord,
263
+ UnitFileRecord,
264
+ UnitFilesEntry,
265
+ }
266
+ export { lane_ledger_schema }
@@ -1,12 +1,26 @@
1
1
  import { closeSync, constants, openSync, writeSync } from 'node:fs'
2
2
  import { stamp_file } from '#scripts/josh/stamp-file'
3
3
  import { json_value } from '#scripts/lib/json-value'
4
+ import { stamped_memo } from '#scripts/lib/stamped-memo'
4
5
  import { run_carry } from '#scripts/run/carry/run-carry'
5
- import { z } from 'zod'
6
+ import {
7
+ lane_ledger_schema,
8
+ type CoreWaitRecord,
9
+ type GateRecord,
10
+ type HeldRecord,
11
+ type LedgerEntry,
12
+ type OverlapRecord,
13
+ type RoundTwoRecord,
14
+ type StageRecord,
15
+ type StopRecord,
16
+ type TestRelatedRecord,
17
+ type UnitFileRecord,
18
+ } from './lane-ledger-schema'
6
19
 
7
20
  // The measurement ledger the lane limit is tuned against: one JSON line per
8
21
  // lane merge, per finished `josh gate`, per machine-load sample, per lane dispatch, per finished
9
- // `josh ship` stage and per stopped `josh ship`, read back by `josh lane:stats`.
22
+ // `josh ship` stage, per stopped `josh ship`, per round-2 decision, per core-budget wait and per
23
+ // `josh test:related` run, read back by `josh lane:stats`. Each line's shape is `lane-ledger-schema.ts`.
10
24
  //
11
25
  // **Its own file rather than the run's event stream.** The stream is capped at 500 events and is
12
26
  // rewritten whole on every append, which is right for "where is the run" and wrong for a measurement
@@ -23,127 +37,20 @@ const LEDGER_SUFFIX = '.jsonl'
23
37
  const LINE_SEPARATOR = '\n'
24
38
  // `followup`'s wait for CI — a stage of a lane's run that no `josh ship` stage is the whole of.
25
39
  const CI_WAIT_STAGE = 'ci-wait'
40
+ // The part of `followup`'s waits CodeRabbit spent running or rate-limited, and the rate-limited part
41
+ // alone (joshuafolkken/kit#4574).
42
+ const CODERABBIT_WAIT_STAGE = 'coderabbit-wait'
43
+ const CODERABBIT_RATE_LIMIT_STAGE = 'coderabbit-rate-limit'
44
+ // A detached `josh ship`'s fast checks in the agent's own turn — not a resumable ship stage, since the
45
+ // supervised gate runs them again (joshuafolkken/kit#4382).
46
+ const PRE_DETACH_STAGE = 'pre-detach'
26
47
  const LEDGER_FILE_MODE = 0o600
27
48
  // The flags `detached-launch.ts` appends its log with, for the same deterministic shared-temp path.
28
49
  const { O_APPEND, O_CREAT, O_NOFOLLOW, O_WRONLY } = constants
29
50
  // eslint-disable-next-line no-bitwise -- POSIX open flags are a bit field; `||` here would be a bug
30
51
  const APPEND_FLAGS = O_WRONLY | O_APPEND | O_CREAT | O_NOFOLLOW
31
52
 
32
- const KIND = {
33
- MERGE: 'merge',
34
- GATE: 'gate',
35
- LOAD: 'load',
36
- DISPATCH: 'dispatch',
37
- STAGE: 'stage',
38
- STOP: 'stop',
39
- OVERLAP: 'overlap',
40
- } as const
41
-
42
- const merge_schema = z.object({ kind: z.literal(KIND.MERGE), at: z.string(), issue: z.number() })
43
- const check_schema = z.object({
44
- label: z.string(),
45
- elapsed_ms: z.number(),
46
- is_passed: z.boolean(),
47
- is_reused: z.boolean().optional(),
48
- })
49
- const gate_schema = z.object({
50
- kind: z.literal(KIND.GATE),
51
- at: z.string(),
52
- elapsed_ms: z.number(),
53
- is_passed: z.boolean(),
54
- // The unit suite's own duration, present when this gate ran it — the one
55
- // record of a full vitest run `josh metrics` reads, so the suite is never timed twice.
56
- unit_ms: z.number().optional(),
57
- // The whole cores busy outside this gate, beyond the machine's baseline, at its start or its end —
58
- // whichever was higher. Absent when the machine could not be read.
59
- external_cores: z.number().optional(),
60
- // Each check's own duration and verdict, so `josh lane:stats` can name the check a slow gate waited
61
- // on. A reused check started no process: its row says so, and its zero is no timing.
62
- checks: z.array(check_schema).optional(),
63
- })
64
- // `available_mb`, `swapped_mb` and `lanes` are optional because each read can fail on its own — a
65
- // platform with no memory reading, a `git worktree` call that did not answer — and a sample is still
66
- // worth its load. `swapped_mb` is `machine_capacity`'s counter, every page swapped since boot.
67
- // Both memory fields were renamed with their meaning (joshuafolkken/kit#3593): an older row's
68
- // `free_mb` / `swap_mb` are stripped on read, so the two measurements never share a column.
69
- const process_kind_schema = z.object({
70
- kind: z.string(),
71
- cpu_percent: z.number(),
72
- rss_mb: z.number(),
73
- count: z.number(),
74
- })
75
- const load_schema = z.object({
76
- kind: z.literal(KIND.LOAD),
77
- at: z.string(),
78
- load: z.number(),
79
- available_mb: z.number().optional(),
80
- swapped_mb: z.number().optional(),
81
- lanes: z.number().optional(),
82
- // The heaviest process kinds at the instant of the sample (`lane-process-load.ts`), so the load the
83
- // core budget's ledger does not explain can be read back by what made it (joshuafolkken/kit#3874).
84
- processes: z.array(process_kind_schema).optional(),
85
- })
86
- // A lane child started on `issue` — the instant its implementation is timed from.
87
- const dispatch_schema = z.object({
88
- kind: z.literal(KIND.DISPATCH),
89
- at: z.string(),
90
- issue: z.number(),
91
- })
92
- // One finished stage of a lane's run, passed or failed: `at` is its end and `elapsed_ms` its length, so
93
- // its start is read from the two. `issue` is absent where the writer does not hold one — `followup`'s
94
- // CI wait, which is timed on a path that fails before the issue is known.
95
- const stage_schema = z.object({
96
- kind: z.literal(KIND.STAGE),
97
- at: z.string(),
98
- stage: z.string(),
99
- elapsed_ms: z.number(),
100
- issue: z.number().optional(),
101
- })
102
- // A `josh ship` that stopped on `issue`: `reason` is the stage it stopped at, or `conflict` — the
103
- // retrospective's stop reason. How long it stayed stopped is derived from the next ship stage, not
104
- // recorded, so a resumed ship never has to know the stop it ends.
105
- const stop_schema = z.object({
106
- kind: z.literal(KIND.STOP),
107
- at: z.string(),
108
- issue: z.number(),
109
- reason: z.string(),
110
- })
111
- // A `josh ship` on `issue` whose actual change overlapped the open pull requests of `lanes` on `paths`
112
- // before its sync: it waited `waited_ms` for their ships to end, and `is_cleared` is false where the
113
- // wait ran out first (joshuafolkken/kit#3901).
114
- const overlap_schema = z.object({
115
- kind: z.literal(KIND.OVERLAP),
116
- at: z.string(),
117
- issue: z.number(),
118
- lanes: z.array(z.number()),
119
- paths: z.array(z.string()),
120
- waited_ms: z.number(),
121
- is_cleared: z.boolean(),
122
- })
123
- const entry_schema = z.discriminatedUnion('kind', [
124
- merge_schema,
125
- gate_schema,
126
- load_schema,
127
- dispatch_schema,
128
- stage_schema,
129
- stop_schema,
130
- overlap_schema,
131
- ])
132
-
133
- type LedgerEntry = z.infer<typeof entry_schema>
134
- type MergeEntry = z.infer<typeof merge_schema>
135
- type GateEntry = z.infer<typeof gate_schema>
136
- type LoadEntry = z.infer<typeof load_schema>
137
- type DispatchEntry = z.infer<typeof dispatch_schema>
138
- type StageEntry = z.infer<typeof stage_schema>
139
- type StopEntry = z.infer<typeof stop_schema>
140
- type OverlapEntry = z.infer<typeof overlap_schema>
141
- // What a finished gate reports; the ledger stamps the kind and the time.
142
- type GateRecord = Omit<GateEntry, 'kind' | 'at'>
143
- type GateCheckRecord = z.infer<typeof check_schema>
144
- type StageRecord = Omit<StageEntry, 'kind' | 'at'>
145
- type StopRecord = Omit<StopEntry, 'kind' | 'at'>
146
- type OverlapRecord = Omit<OverlapEntry, 'kind' | 'at'>
53
+ const { KIND, entry_schema } = lane_ledger_schema
147
54
 
148
55
  function target_of(repository: string): string {
149
56
  return stamp_file.stamp_path(LEDGER_PREFIX, repository, LEDGER_SUFFIX)
@@ -170,8 +77,8 @@ async function target(): Promise<string | undefined> {
170
77
 
171
78
  // **Append, never rewrite** — `O_APPEND` keeps each short line whole across concurrent writers, and
172
79
  // `O_NOFOLLOW` plus `stamp_file`'s ownership test keep a planted link or another account's file from
173
- // receiving it.
174
- function append(path: string, entry: LedgerEntry): void {
80
+ // receiving it. Any JSON-lines log takes it — the durable review stop log too (joshuafolkken/kit#4519).
81
+ function append(path: string, entry: object): void {
175
82
  const descriptor = openSync(path, APPEND_FLAGS, LEDGER_FILE_MODE)
176
83
 
177
84
  try {
@@ -224,6 +131,41 @@ async function record_overlap(overlap: OverlapRecord, path?: string): Promise<vo
224
131
  await record({ kind: KIND.OVERLAP, at: now_iso(), ...overlap }, path)
225
132
  }
226
133
 
134
+ // `waiting` is written only when the offer named issues, so a hold that waited on none stays one short line.
135
+ async function record_held(held: HeldRecord, path?: string): Promise<void> {
136
+ const waiting = held.waiting ?? []
137
+ const named = waiting.length > 0 ? { waiting: [...waiting] } : {}
138
+
139
+ await record({ kind: KIND.HELD, at: now_iso(), reason: held.reason, ...named }, path)
140
+ }
141
+
142
+ async function record_released(path?: string): Promise<void> {
143
+ await record({ kind: KIND.RELEASED, at: now_iso() }, path)
144
+ }
145
+
146
+ async function record_offerable(is_offerable: boolean, path?: string): Promise<void> {
147
+ await record({ kind: KIND.OFFERABLE, at: now_iso(), is_offerable }, path)
148
+ }
149
+
150
+ async function record_round_two(round_two: RoundTwoRecord, path?: string): Promise<void> {
151
+ await record({ kind: KIND.ROUND_TWO, at: now_iso(), ...round_two }, path)
152
+ }
153
+
154
+ async function record_core_wait(wait: CoreWaitRecord, path?: string): Promise<void> {
155
+ await record({ kind: KIND.CORE_WAIT, at: now_iso(), ...wait }, path)
156
+ }
157
+
158
+ async function record_unit_files(
159
+ files: ReadonlyArray<UnitFileRecord>,
160
+ path?: string,
161
+ ): Promise<void> {
162
+ await record({ kind: KIND.UNIT_FILES, at: now_iso(), files: [...files] }, path)
163
+ }
164
+
165
+ async function record_test_related(run: TestRelatedRecord, path?: string): Promise<void> {
166
+ await record({ kind: KIND.TEST_RELATED, at: now_iso(), ...run }, path)
167
+ }
168
+
227
169
  function parse_line(line: string): LedgerEntry | undefined {
228
170
  return entry_schema.safeParse(json_value.parse_or_undefined(line)).data
229
171
  }
@@ -232,9 +174,7 @@ function is_present(entry: LedgerEntry | undefined): entry is LedgerEntry {
232
174
  return entry !== undefined
233
175
  }
234
176
 
235
- // Every entry, oldest first. A malformed line — a write cut short — is skipped rather than making the
236
- // whole ledger unreadable, and an absent or unowned file is an empty ledger.
237
- function read_entries(path: string): ReadonlyArray<LedgerEntry> {
177
+ function parse_entries(path: string): ReadonlyArray<LedgerEntry> {
238
178
  const raw = stamp_file.read_stamp_text(path)
239
179
 
240
180
  if (raw === undefined) return []
@@ -245,32 +185,61 @@ function read_entries(path: string): ReadonlyArray<LedgerEntry> {
245
185
  .filter(is_present)
246
186
  }
247
187
 
188
+ // Each ledger's entries, parsed again only once the file itself has changed (joshuafolkken/kit#4263).
189
+ const parsed_ledgers = stamped_memo.create<ReadonlyArray<LedgerEntry>>()
190
+
191
+ // Every entry, oldest first. A malformed line — a write cut short — is skipped rather than making the
192
+ // whole ledger unreadable, and an absent or unowned file is an empty ledger.
193
+ function read_entries(path: string): ReadonlyArray<LedgerEntry> {
194
+ return parsed_ledgers.of(path, stamped_memo.file_stamp(path), () => parse_entries(path))
195
+ }
196
+
248
197
  const lane_ledger = {
249
198
  CI_WAIT_STAGE,
199
+ CODERABBIT_RATE_LIMIT_STAGE,
200
+ CODERABBIT_WAIT_STAGE,
250
201
  KIND,
202
+ PRE_DETACH_STAGE,
251
203
  append,
252
204
  read_entries,
253
205
  record,
206
+ record_core_wait,
254
207
  record_dispatch,
255
208
  record_gate,
209
+ record_held,
210
+ record_released,
256
211
  record_merge,
257
212
  record_overlap,
213
+ record_offerable,
214
+ record_round_two,
258
215
  record_stage,
259
216
  record_stop,
217
+ record_test_related,
218
+ record_unit_files,
260
219
  target,
261
220
  target_of,
262
221
  }
263
222
 
264
223
  export type {
224
+ CoreWaitEntry,
225
+ CoreWaitRecord,
265
226
  DispatchEntry,
266
227
  GateCheckRecord,
267
228
  GateEntry,
229
+ HeldEntry,
268
230
  LedgerEntry,
269
231
  LoadEntry,
270
232
  MergeEntry,
233
+ OfferableEntry,
271
234
  OverlapEntry,
272
235
  OverlapRecord,
236
+ RoundTwoEntry,
273
237
  StageEntry,
274
238
  StopEntry,
275
- }
239
+ StopRecord,
240
+ TestRelatedEntry,
241
+ TestRelatedRecord,
242
+ UnitFileRecord,
243
+ UnitFilesEntry,
244
+ } from './lane-ledger-schema'
276
245
  export { lane_ledger }
@@ -1,9 +1,11 @@
1
1
  #!/usr/bin/env tsx
2
2
  import { fileURLToPath } from 'node:url'
3
3
  import { backlog_ready, type LaneUse } from '#scripts/backlog/backlog-ready'
4
+ import { session_cite } from '#scripts/issue/session-cite'
4
5
  import { cli_flags } from '#scripts/lib/cli-flags'
5
6
  import { lane_capacity, type LimitChoice } from './lane-capacity'
6
7
  import { lane_limit_override } from './lane-limit-override'
8
+ import { lane_state } from './lane-state'
7
9
 
8
10
  // `josh lane:limit [<limit>] [--reset]` — change a live `backlogrun`'s lane limit without stopping it.
9
11
  // A running parent keeps the environment it started with, so `JOSH_LANE_LIMIT`
@@ -96,12 +98,21 @@ function limit_text(limit: number): string {
96
98
  : `${String(seated)} (${String(limit)} capped at the seats)`
97
99
  }
98
100
 
101
+ // The lanes with no state record, counted in use since their state is unknown.
102
+ function unknown_text(unknown: ReadonlyArray<string>): string {
103
+ if (unknown.length === 0) return ''
104
+
105
+ const issues = unknown.map((issue) => session_cite.issue(issue)).join(' ')
106
+
107
+ return ` · ${issues}: ${lane_state.NO_STATE_HINT}`
108
+ }
109
+
99
110
  function status_line(status: LimitStatus): string {
100
111
  const source = status.override === undefined ? lane_capacity.LANE_LIMIT_KEY : OVERRIDE_SOURCE
101
112
  const { occupied, seated } = status.use
102
113
  const free = lane_capacity.free_lanes(status.limit, occupied, seated)
103
114
 
104
- return `lane limit ${limit_text(status.limit)} (${source}) · in use ${String(occupied)} · free ${String(free)}`
115
+ return `lane limit ${limit_text(status.limit)} (${source}) · in use ${String(occupied)} · free ${String(free)}${unknown_text(status.use.unknown)}`
105
116
  }
106
117
 
107
118
  async function show(ports: LimitPorts): Promise<number> {