@joshuafolkken/kit 1.1784.0 → 1.2116.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (690) hide show
  1. package/.claude/agents/reviewer-verification.md +19 -0
  2. package/.claude/agents/reviewer.md +19 -0
  3. package/.claude/settings.json +5 -6
  4. package/.claude/skills/dependency-update/SKILL.md +9 -10
  5. package/.claude/skills/workflow-commands/SKILL.md +6 -6
  6. package/.claude/skills/workflow-commands/background-commands.md +8 -5
  7. package/.claude/skills/workflow-commands/backlogrun-child.md +3 -1
  8. package/.claude/skills/workflow-commands/backlogrun-lanes.md +1 -1
  9. package/.claude/skills/workflow-commands/backlogrun-park.md +5 -2
  10. package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -3
  11. package/.claude/skills/workflow-commands/backlogrun-recovery.md +1 -1
  12. package/.claude/skills/workflow-commands/backlogrun-steps.md +3 -2
  13. package/.claude/skills/workflow-commands/backlogrun.md +1 -1
  14. package/.claude/skills/workflow-commands/chain-rule.md +41 -32
  15. package/.claude/skills/workflow-commands/delegation.md +6 -6
  16. package/.claude/skills/workflow-commands/entry-sequence.md +2 -2
  17. package/.claude/skills/workflow-commands/followup.md +7 -5
  18. package/.claude/skills/workflow-commands/fullrun-steps.md +6 -6
  19. package/.claude/skills/workflow-commands/fullrun.md +1 -1
  20. package/.claude/skills/workflow-commands/issue-comments.md +9 -4
  21. package/.claude/skills/workflow-commands/issue-fold-existing.md +2 -1
  22. package/.claude/skills/workflow-commands/kickoff.md +2 -2
  23. package/.claude/skills/workflow-commands/observation-filing.md +1 -1
  24. package/.claude/skills/workflow-commands/observation-ledger.md +6 -4
  25. package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -7
  26. package/.claude/skills/workflow-commands/prerequisite.md +3 -2
  27. package/.claude/skills/workflow-commands/retrospective.md +2 -2
  28. package/.claude/skills/workflow-commands/split-assessment.md +7 -5
  29. package/.codex/hooks.json +5 -5
  30. package/.github/actions/setup-pnpm/action.yml +9 -16
  31. package/.github/dependabot.yml +16 -0
  32. package/.github/workflows/auto-tag.yml +45 -0
  33. package/.github/workflows/ci.yml +155 -15
  34. package/.github/workflows/dependabot-auto-merge.yml +63 -4
  35. package/.github/workflows/production.yml +8 -0
  36. package/.github/workflows/publish.yml +60 -45
  37. package/.vscode/settings.json +19 -0
  38. package/CLAUDE.md +5 -12
  39. package/SECURITY.md +2 -2
  40. package/dist/CLAUDE.md +5 -12
  41. package/dist/commands/document-read-cli.js +2 -1
  42. package/dist/commands/document-section-main.js +2 -1
  43. package/dist/commands/read-set-cli.js +194 -134
  44. package/dist/commands/run-prep-main.js +9694 -10173
  45. package/dist/commands/run-step-cli.js +22138 -18285
  46. package/dist/hooks/audit-provision.js +23 -5
  47. package/dist/hooks/chunk-3GKE653K.js +6204 -0
  48. package/dist/hooks/chunk-45CJJOO7.js +1243 -0
  49. package/dist/hooks/{chunk-CWMBGKYW.js → chunk-5PM2JRGV.js} +2153 -856
  50. package/dist/hooks/{chunk-WR2KQAYZ.js → chunk-7SIUNQXK.js} +1207 -1470
  51. package/dist/hooks/{chunk-O2YBIDSI.js → chunk-CQD4LJE6.js} +1682 -1130
  52. package/dist/hooks/{chunk-VWWCFGWK.js → chunk-OPSRGWFU.js} +1 -1
  53. package/dist/hooks/{chunk-XGBNSWEI.js → chunk-UJ3FPMMM.js} +132 -49
  54. package/dist/hooks/chunk-VVNYJWEI.js +30 -0
  55. package/dist/hooks/chunk-Z6DQJKH3.js +2806 -0
  56. package/dist/hooks/codex-hook-adapter.js +8 -8
  57. package/dist/hooks/format-edited.js +4 -5
  58. package/dist/hooks/inputs.json +386 -360
  59. package/dist/hooks/pretool-guard.js +7 -6
  60. package/dist/hooks/session-lang.js +101 -258
  61. package/dist/hooks/stop-guard.js +1744 -2576
  62. package/dist/josh.js +7133 -6368
  63. package/dist/version/index.js +161 -1
  64. package/eslint/rules/comment-why-only.js +108 -0
  65. package/package.json +16 -9
  66. package/prompts/coding-standards.md +1 -1
  67. package/prompts/collaboration-workflow/file-edits.md +14 -11
  68. package/prompts/collaboration-workflow/issue-citation.md +0 -4
  69. package/prompts/collaboration-workflow/issue-template.md +40 -21
  70. package/prompts/collaboration-workflow/lane-instructions.md +3 -1
  71. package/prompts/collaboration-workflow/measurement.md +8 -1
  72. package/prompts/collaboration-workflow/operating-rules.md +11 -2
  73. package/prompts/collaboration-workflow/output-bounds.md +6 -2
  74. package/prompts/collaboration-workflow/plan-comment.md +1 -1
  75. package/prompts/collaboration-workflow/principles.md +9 -0
  76. package/prompts/collaboration-workflow/residency.md +3 -2
  77. package/prompts/collaboration-workflow/rule-delivery.md +13 -1
  78. package/prompts/collaboration-workflow/upstream-interrupt.md +2 -2
  79. package/prompts/collaboration-workflow/wip-cap.md +3 -1
  80. package/prompts/review-rubric.md +8 -0
  81. package/prompts/review.md +31 -22
  82. package/prompts/testing-guide.md +1 -0
  83. package/scripts/agent/agent-argv.ts +14 -16
  84. package/scripts/agent/agent-provider.ts +138 -0
  85. package/scripts/agent/agent-role-profile.ts +108 -156
  86. package/scripts/agent/agent-safe-text.ts +20 -5
  87. package/scripts/agent/api-usage-limit.ts +65 -0
  88. package/scripts/agent/claude-agent-argv.ts +19 -9
  89. package/scripts/agent/codex-agent-argv.ts +118 -22
  90. package/scripts/agent/usage-limit-reset.ts +179 -0
  91. package/scripts/auth/claude-token-output.ts +2 -2
  92. package/scripts/auto-ok/auto-ok-author.ts +53 -0
  93. package/scripts/auto-ok/auto-ok-cli.ts +20 -9
  94. package/scripts/backlog/backlog-defect-priority.ts +1 -1
  95. package/scripts/backlog/backlog-drive-cli.ts +6 -1
  96. package/scripts/backlog/backlog-drive-hold.ts +3 -3
  97. package/scripts/backlog/backlog-drive-idle.ts +10 -0
  98. package/scripts/backlog/backlog-drive-launch-pass.ts +90 -0
  99. package/scripts/backlog/backlog-drive-launch.ts +8 -2
  100. package/scripts/backlog/backlog-drive-named-offer.ts +73 -30
  101. package/scripts/backlog/backlog-drive-named.ts +28 -7
  102. package/scripts/backlog/backlog-drive-paused.ts +5 -4
  103. package/scripts/backlog/backlog-drive-restore.ts +11 -3
  104. package/scripts/backlog/backlog-drive.ts +21 -60
  105. package/scripts/backlog/backlog-gate-scope.ts +61 -0
  106. package/scripts/backlog/backlog-measure-close.ts +112 -0
  107. package/scripts/backlog/backlog-next.ts +39 -49
  108. package/scripts/backlog/backlog-occupied.ts +2 -2
  109. package/scripts/backlog/backlog-overlap.ts +42 -8
  110. package/scripts/backlog/backlog-plan-cli.ts +4 -1
  111. package/scripts/backlog/backlog-plan-comment.ts +81 -0
  112. package/scripts/backlog/backlog-plan-read.ts +19 -6
  113. package/scripts/backlog/backlog-pool.ts +50 -12
  114. package/scripts/backlog/backlog-rank.ts +60 -13
  115. package/scripts/backlog/backlog-stalled-detect.ts +2 -1
  116. package/scripts/backlog/backlog-waves.ts +17 -2
  117. package/scripts/backlog/backlogrun-launch.ts +7 -4
  118. package/scripts/cost-runtime/context-cut-payback.ts +27 -25
  119. package/scripts/cost-runtime/cost-cli.ts +37 -16
  120. package/scripts/cost-runtime/cost-pricing.ts +9 -0
  121. package/scripts/cost-runtime/cost-verdict.ts +4 -1
  122. package/scripts/delegation/delegation-policy.ts +2 -2
  123. package/scripts/delegation/duplicate-read-guard.ts +1 -0
  124. package/scripts/delegation/investigation-guard.ts +14 -2
  125. package/scripts/delegation/investigation-reads.ts +45 -23
  126. package/scripts/dependabot/dependabot-cooldown.ts +3 -2
  127. package/scripts/discovery/repo-party.ts +80 -20
  128. package/scripts/discovery/session-owner-pin.ts +51 -0
  129. package/scripts/document/capped-print.ts +1 -1
  130. package/scripts/document/command-reference-line-budget.ts +42 -0
  131. package/scripts/document/document-byte-budget.ts +17 -7
  132. package/scripts/document/document-checks.ts +20 -0
  133. package/scripts/document/document-ratchet-check.ts +101 -0
  134. package/scripts/document/document-section.ts +1 -0
  135. package/scripts/document/entry-read-budget.ts +7 -3
  136. package/scripts/document/issue-citation-budget.ts +94 -0
  137. package/scripts/epic/epic-cli-argv.ts +2 -2
  138. package/scripts/epic/epic-fetch.ts +4 -2
  139. package/scripts/epic/epic-graph.ts +7 -2
  140. package/scripts/epic/epic-issue.ts +3 -1
  141. package/scripts/epic/epic-rank.ts +5 -0
  142. package/scripts/exports/unused-members-check.ts +62 -0
  143. package/scripts/exports/unused-members-cli.ts +6 -51
  144. package/scripts/followup/followup-ci-path.ts +67 -0
  145. package/scripts/followup/followup-coderabbit-retrigger.ts +261 -0
  146. package/scripts/followup/followup-coderabbit-wait.ts +13 -10
  147. package/scripts/followup/followup-failed-tests.ts +160 -0
  148. package/scripts/followup/followup-job-needs.ts +100 -0
  149. package/scripts/followup/followup-job-rerun.ts +303 -0
  150. package/scripts/followup/followup-main-move.ts +113 -0
  151. package/scripts/followup/git-followup-finish.ts +43 -11
  152. package/scripts/followup/git-followup-pending.ts +3 -3
  153. package/scripts/followup/git-followup-stages.ts +41 -11
  154. package/scripts/followup/git-pr-followup-checks.ts +55 -16
  155. package/scripts/followup/git-pr-followup-wrapup.ts +24 -5
  156. package/scripts/followup/git-pr-followup.ts +62 -27
  157. package/scripts/fresh-machine/fresh-machine-script.ts +5 -9
  158. package/scripts/fresh-machine/specs/kit-test-backlogrun-python.json +2 -2
  159. package/scripts/fresh-machine/specs/kit-test-backlogrun.json +2 -2
  160. package/scripts/gate/busy-average.ts +34 -2
  161. package/scripts/gate/check-related-pinned.ts +43 -0
  162. package/scripts/gate/check-related-reuse.ts +64 -0
  163. package/scripts/gate/check-related-section.ts +57 -0
  164. package/scripts/gate/check-related-unplanned.ts +34 -0
  165. package/scripts/gate/check-related.ts +265 -0
  166. package/scripts/gate/command-memory.ts +1 -1
  167. package/scripts/gate/core-admission.ts +24 -6
  168. package/scripts/gate/core-budget-timing.ts +20 -6
  169. package/scripts/gate/core-budget.ts +40 -11
  170. package/scripts/gate/core-wait-record.ts +3 -2
  171. package/scripts/gate/core-wait.ts +25 -2
  172. package/scripts/gate/core-weights.ts +15 -7
  173. package/scripts/gate/gate-labels.ts +46 -0
  174. package/scripts/gate/gate-ledger.ts +14 -6
  175. package/scripts/gate/gate-plan.ts +103 -58
  176. package/scripts/gate/gate-report.ts +9 -7
  177. package/scripts/gate/gate-run-steps.ts +26 -3
  178. package/scripts/gate/gate-skip.ts +45 -6
  179. package/scripts/gate/gate-static-group.ts +60 -0
  180. package/scripts/gate/gate-steps.ts +2 -1
  181. package/scripts/gate/gate-tree.ts +4 -2
  182. package/scripts/gate/hook-gate-reuse.ts +19 -2
  183. package/scripts/gate/metrics-totals.ts +59 -0
  184. package/scripts/gate/scoped-green.ts +68 -15
  185. package/scripts/gate/since-green.ts +14 -6
  186. package/scripts/gate/structural-checks.ts +96 -0
  187. package/scripts/gate/verification-gate.ts +51 -16
  188. package/scripts/gate/verification-inputs.ts +21 -6
  189. package/scripts/gate/verification-tail.ts +52 -0
  190. package/scripts/gh/gh-author-association.ts +23 -2
  191. package/scripts/gh/git-ai-review-scan.ts +1 -1
  192. package/scripts/gh/git-gh-api-path.ts +12 -3
  193. package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
  194. package/scripts/gh/git-gh-exec.ts +32 -2
  195. package/scripts/gh/git-gh-issue-read.ts +4 -2
  196. package/scripts/gh/git-gh-issue-rest.ts +1 -0
  197. package/scripts/gh/git-gh-issue-write.ts +8 -2
  198. package/scripts/gh/git-gh-issue.ts +12 -5
  199. package/scripts/gh/git-gh-pr-auto-merge.ts +13 -6
  200. package/scripts/gh/git-gh-pr-graphql-state.ts +56 -0
  201. package/scripts/gh/git-gh-pr-read.ts +74 -13
  202. package/scripts/gh/git-gh-pr-rest.ts +3 -1
  203. package/scripts/gh/git-gh-pr-snapshot.ts +22 -7
  204. package/scripts/gh/git-gh-pr-too-large.ts +20 -0
  205. package/scripts/gh/git-gh-pr.ts +21 -7
  206. package/scripts/gh/git-gh-retry.ts +141 -0
  207. package/scripts/gh/git-pr-ai-review.ts +15 -6
  208. package/scripts/gh/git-pr-checks-eval.ts +3 -0
  209. package/scripts/gh/git-pr-checks.ts +5 -5
  210. package/scripts/git/base-tree.ts +30 -0
  211. package/scripts/git/change-base.ts +4 -10
  212. package/scripts/git/changed-paths-sync.ts +63 -0
  213. package/scripts/git/changed-paths.ts +16 -1
  214. package/scripts/git/git-common-directory.ts +11 -1
  215. package/scripts/git/git-diff-reads.ts +66 -20
  216. package/scripts/git/git-error.ts +9 -2
  217. package/scripts/git/git-schemas.ts +13 -0
  218. package/scripts/git/git-worktree.ts +13 -0
  219. package/scripts/git/gone-branch.ts +4 -1
  220. package/scripts/git/main-merge-budget-conflict.ts +89 -0
  221. package/scripts/git/main-merge-guard.ts +55 -18
  222. package/scripts/git/main-merge-regenerate.ts +59 -25
  223. package/scripts/git/main-merge.ts +53 -5
  224. package/scripts/git/no-base-checkout.ts +127 -0
  225. package/scripts/git/stash/git-stash.ts +11 -2
  226. package/scripts/git/stash/stash-push-cli.ts +10 -0
  227. package/scripts/hooks/batch-guard.ts +40 -21
  228. package/scripts/hooks/edited-cspell.ts +37 -11
  229. package/scripts/hooks/format-edited-file.ts +22 -2
  230. package/scripts/hooks/lane-plan-guard.ts +50 -0
  231. package/scripts/hooks/pre-commit-lint-switch.ts +9 -0
  232. package/scripts/hooks/pre-commit-lint.ts +14 -1
  233. package/scripts/hooks/pre-push-related-switch.ts +10 -0
  234. package/scripts/hooks/pre-push-unit.ts +76 -10
  235. package/scripts/hooks/pretool-guard.ts +2 -0
  236. package/scripts/hooks/reserved-run.ts +14 -1
  237. package/scripts/hooks/run-hook.sh +23 -8
  238. package/scripts/hooks/step-zero-notice.ts +6 -1
  239. package/scripts/hooks/stop-actions.ts +3 -15
  240. package/scripts/hooks/stop-guard.ts +7 -6
  241. package/scripts/init/distributed-paths.ts +1 -0
  242. package/scripts/init/hook-command-rewrite.ts +5 -1
  243. package/scripts/init/hook-launch.ts +4 -2
  244. package/scripts/issue/aggregation-split.ts +52 -0
  245. package/scripts/issue/defect-origin-line.ts +19 -1
  246. package/scripts/issue/defect-rate-cli.ts +5 -102
  247. package/scripts/issue/defect-report.ts +4 -4
  248. package/scripts/issue/effect-audit-cli.ts +178 -0
  249. package/scripts/issue/effect-audit.ts +185 -0
  250. package/scripts/issue/expected-effect-lint.ts +64 -9
  251. package/scripts/issue/git-next-issues.ts +5 -0
  252. package/scripts/issue/issue-body-or-comment.ts +38 -4
  253. package/scripts/issue/issue-cite-cli.ts +1 -3
  254. package/scripts/issue/issue-classification.ts +1 -0
  255. package/scripts/issue/issue-closing-pr.ts +8 -1
  256. package/scripts/issue/issue-evidence-exit.ts +4 -2
  257. package/scripts/issue/issue-file-cap.ts +58 -0
  258. package/scripts/issue/issue-file-cli.ts +111 -38
  259. package/scripts/issue/issue-file-deferral.ts +52 -0
  260. package/scripts/issue/issue-file-fold.ts +29 -10
  261. package/scripts/issue/issue-file-interrupt.ts +85 -0
  262. package/scripts/issue/issue-file-lane-hint.ts +30 -0
  263. package/scripts/issue/issue-file.ts +43 -6
  264. package/scripts/issue/issue-labels.ts +19 -2
  265. package/scripts/issue/issue-lint-cli.ts +27 -2
  266. package/scripts/issue/issue-measured-cli.ts +13 -35
  267. package/scripts/issue/issue-measured-close.ts +58 -0
  268. package/scripts/issue/issue-not-before-label.ts +2 -2
  269. package/scripts/issue/issue-not-before.ts +4 -1
  270. package/scripts/issue/issue-priority-cli.ts +60 -0
  271. package/scripts/issue/issue-priority-raise.ts +55 -0
  272. package/scripts/issue/issue-priority.ts +174 -43
  273. package/scripts/issue/issue-rank.ts +21 -4
  274. package/scripts/issue/issue-read-cli.ts +32 -6
  275. package/scripts/issue/issue-read.ts +37 -12
  276. package/scripts/issue/issue-sample-gate.ts +95 -74
  277. package/scripts/issue/issue-sample-prime.ts +127 -0
  278. package/scripts/issue/issue-sample-required.ts +57 -0
  279. package/scripts/issue/issue-sample-source.ts +12 -11
  280. package/scripts/issue/issue-search.ts +124 -0
  281. package/scripts/issue/issue-state.ts +13 -1
  282. package/scripts/issue/issue-template-section.ts +43 -0
  283. package/scripts/issue/issue-watch-diff.ts +31 -1
  284. package/scripts/issue/issue-watch-hook.ts +11 -2
  285. package/scripts/issue/issue-watch.ts +55 -12
  286. package/scripts/issue/markdown-section.ts +1 -0
  287. package/scripts/issue/measure-declaration.ts +121 -0
  288. package/scripts/issue/measure-rerun-cli.ts +7 -70
  289. package/scripts/issue/plan-consumers-section.ts +22 -1
  290. package/scripts/issue/reproduction-measure.ts +3 -1
  291. package/scripts/issue/size-estimate.ts +90 -0
  292. package/scripts/issue/trusted-measure.ts +84 -0
  293. package/scripts/josh/command-usage.ts +3 -2
  294. package/scripts/josh/durable-state-migrate.ts +105 -0
  295. package/scripts/josh/durable-state.ts +112 -0
  296. package/scripts/josh/josh-aliases.ts +95 -0
  297. package/scripts/josh/josh-command-map.ts +1 -82
  298. package/scripts/josh/josh-commands-agent-hooks.ts +6 -6
  299. package/scripts/josh/josh-commands-ai.ts +5 -5
  300. package/scripts/josh/josh-commands-development.ts +59 -58
  301. package/scripts/josh/josh-commands-issue-write.ts +23 -4
  302. package/scripts/josh/josh-commands-issue.ts +32 -0
  303. package/scripts/josh/josh-commands-lane.ts +87 -4
  304. package/scripts/josh/josh-commands-lint.ts +16 -3
  305. package/scripts/josh/josh-commands-maintenance.ts +15 -0
  306. package/scripts/josh/josh-commands-review.ts +41 -6
  307. package/scripts/josh/josh-commands-ship.ts +56 -8
  308. package/scripts/josh/josh-commands-test-check.ts +80 -0
  309. package/scripts/josh/josh-commands-workflow.ts +1 -1
  310. package/scripts/josh/josh-environment-file.ts +43 -3
  311. package/scripts/josh/josh-in-process.ts +2 -2
  312. package/scripts/josh/josh-logic.ts +5 -3
  313. package/scripts/josh/josh-run.ts +19 -1
  314. package/scripts/josh/run-record-path.ts +15 -0
  315. package/scripts/josh/stamp-file.ts +11 -2
  316. package/scripts/lane/lane-adopt-cli.ts +98 -0
  317. package/scripts/lane/lane-adopt.ts +208 -0
  318. package/scripts/lane/lane-await.ts +5 -8
  319. package/scripts/lane/lane-baseline.ts +123 -0
  320. package/scripts/lane/lane-breakdown-cli.ts +64 -0
  321. package/scripts/lane/lane-breakdown-implement.ts +170 -0
  322. package/scripts/lane/lane-breakdown-laps.ts +107 -0
  323. package/scripts/lane/lane-breakdown-pinned.ts +76 -0
  324. package/scripts/lane/lane-breakdown-text.ts +145 -0
  325. package/scripts/lane/lane-breakdown.ts +239 -0
  326. package/scripts/lane/lane-check-stats.ts +29 -8
  327. package/scripts/lane/lane-child-invocation.ts +9 -2
  328. package/scripts/lane/lane-child-mark-keys.ts +12 -0
  329. package/scripts/lane/lane-child-marker.ts +20 -1
  330. package/scripts/lane/lane-ci-path-stats.ts +73 -0
  331. package/scripts/lane/lane-claim-stats.ts +84 -0
  332. package/scripts/lane/lane-close.ts +8 -3
  333. package/scripts/lane/lane-dispatch-log.ts +3 -3
  334. package/scripts/lane/lane-dispatch.ts +2 -2
  335. package/scripts/lane/lane-gap-stats.ts +7 -6
  336. package/scripts/lane/lane-guard-policy.ts +7 -1
  337. package/scripts/lane/lane-implement-stats.ts +207 -0
  338. package/scripts/lane/lane-implement-subagents.ts +90 -0
  339. package/scripts/lane/lane-investigation-switch.ts +16 -0
  340. package/scripts/lane/lane-ledger-kind.ts +31 -0
  341. package/scripts/lane/lane-ledger-schema-ship.ts +49 -0
  342. package/scripts/lane/lane-ledger-schema.ts +119 -36
  343. package/scripts/lane/lane-ledger-write.ts +257 -0
  344. package/scripts/lane/lane-ledger.ts +31 -177
  345. package/scripts/lane/lane-load.ts +1 -1
  346. package/scripts/lane/lane-measure-cli.ts +176 -59
  347. package/scripts/lane/lane-net-read.ts +44 -0
  348. package/scripts/lane/lane-net-time.ts +212 -0
  349. package/scripts/lane/lane-open.ts +16 -7
  350. package/scripts/lane/lane-output.ts +2 -4
  351. package/scripts/lane/lane-overrun-prompt.ts +147 -0
  352. package/scripts/lane/lane-overrun.ts +274 -0
  353. package/scripts/lane/lane-paths.ts +24 -1
  354. package/scripts/lane/lane-pause-cli.ts +4 -1
  355. package/scripts/lane/lane-paused-spans.ts +97 -0
  356. package/scripts/lane/lane-plan-check.ts +207 -0
  357. package/scripts/lane/lane-plan-cli.ts +41 -0
  358. package/scripts/lane/lane-plan.ts +144 -0
  359. package/scripts/lane/lane-registry.ts +14 -1
  360. package/scripts/lane/lane-relaunch.ts +1 -1
  361. package/scripts/lane/lane-round-one-stats.ts +51 -0
  362. package/scripts/lane/lane-sampler.ts +23 -4
  363. package/scripts/lane/lane-session-action.ts +93 -18
  364. package/scripts/lane/lane-session-broker.ts +49 -21
  365. package/scripts/lane/lane-session-reread-main.ts +14 -0
  366. package/scripts/lane/lane-session-reread.ts +51 -0
  367. package/scripts/lane/lane-ship-lap-stats.ts +74 -0
  368. package/scripts/lane/lane-sleep.ts +58 -0
  369. package/scripts/lane/lane-spent.ts +1 -1
  370. package/scripts/lane/lane-split-stats.ts +28 -0
  371. package/scripts/lane/lane-stage-stats.ts +13 -1
  372. package/scripts/lane/lane-state.ts +41 -9
  373. package/scripts/lane/lane-stats-tables.ts +58 -0
  374. package/scripts/lane/lane-stats.ts +21 -5
  375. package/scripts/lane/lane-stop-stats.ts +51 -19
  376. package/scripts/lane/lane-tail-stats.ts +32 -0
  377. package/scripts/lane/lane-transcript-calls.ts +67 -10
  378. package/scripts/lane/lane-transcript-stats.ts +44 -12
  379. package/scripts/lane/lane-value-cell.ts +72 -0
  380. package/scripts/lane/lane-value.ts +118 -0
  381. package/scripts/lane/lane-withdraw-closed.ts +124 -0
  382. package/scripts/lane/lane-withdraw.ts +108 -31
  383. package/scripts/lane/lane-yield.ts +85 -0
  384. package/scripts/lane/openai-lane-ship.ts +12 -11
  385. package/scripts/lane/openai-lane-supervisor-decision.ts +6 -8
  386. package/scripts/lane/openai-lane-supervisor-owner.ts +5 -8
  387. package/scripts/lane/openai-lane-supervisor.ts +5 -4
  388. package/scripts/lib/poll.ts +38 -9
  389. package/scripts/lib/settled-together.ts +10 -0
  390. package/scripts/lib/shell-quote.ts +21 -0
  391. package/scripts/lib/token-shape.ts +111 -0
  392. package/scripts/lint/eslint-daemon-sources.ts +79 -0
  393. package/scripts/lint/eslint-daemon.ts +45 -6
  394. package/scripts/lint/eslint-warm-cli.ts +7 -0
  395. package/scripts/lint/eslint-warm.ts +66 -0
  396. package/scripts/lint/import-graph.ts +141 -11
  397. package/scripts/lint/lint-gate-scope.ts +2 -2
  398. package/scripts/lint/lint-parallel.ts +54 -6
  399. package/scripts/lint/lint-related.ts +154 -33
  400. package/scripts/lint/rename-cli.ts +179 -0
  401. package/scripts/lint/rename-identifier.ts +192 -0
  402. package/scripts/lint/type-only-imports.ts +58 -0
  403. package/scripts/notify/telegram-notify.ts +12 -3
  404. package/scripts/observations/observation-record.ts +42 -16
  405. package/scripts/observations/observations-flush.ts +32 -9
  406. package/scripts/overrides/overrides-check.ts +9 -1
  407. package/scripts/release/release-approval-prune.ts +7 -1
  408. package/scripts/repo/required-checks-logic.ts +4 -1
  409. package/scripts/repo/ruleset-check.ts +4 -3
  410. package/scripts/report/markdown-shape.ts +28 -0
  411. package/scripts/report/report-format-reference.ts +15 -1
  412. package/scripts/report/report-labels.ts +12 -1
  413. package/scripts/report/report-lint-child-summary.ts +94 -0
  414. package/scripts/report/report-lint-cli.ts +26 -7
  415. package/scripts/report/report-lint.ts +2 -20
  416. package/scripts/review/prose-stale-cli.ts +88 -0
  417. package/scripts/review/prose-stale-scan.ts +152 -0
  418. package/scripts/review/review-attest.ts +73 -23
  419. package/scripts/review/review-brief-cli.ts +68 -19
  420. package/scripts/review/review-brief-paths.ts +22 -0
  421. package/scripts/review/review-brief.ts +14 -7
  422. package/scripts/review/review-comment-carry.ts +47 -0
  423. package/scripts/review/review-comment-round.ts +85 -22
  424. package/scripts/review/review-finding-ledger.ts +109 -7
  425. package/scripts/review/review-finding-text.ts +43 -0
  426. package/scripts/review/review-interaction.ts +11 -0
  427. package/scripts/review/review-lane-handover.ts +68 -0
  428. package/scripts/review/review-lint-cli.ts +57 -0
  429. package/scripts/review/review-lint-findings.ts +92 -0
  430. package/scripts/review/review-lint-sections.ts +80 -0
  431. package/scripts/review/review-lint.ts +221 -0
  432. package/scripts/review/review-prior-findings.ts +102 -0
  433. package/scripts/review/review-readers-scan.ts +4 -2
  434. package/scripts/review/review-record-cli.ts +177 -54
  435. package/scripts/review/review-record-code-round.ts +55 -0
  436. package/scripts/review/review-record-comment.ts +60 -0
  437. package/scripts/review/review-record-interaction.ts +35 -0
  438. package/scripts/review/review-record-pinned.ts +108 -0
  439. package/scripts/review/review-record.ts +25 -1
  440. package/scripts/review/review-reviewed-tree.ts +307 -0
  441. package/scripts/review/review-round-one-closure.ts +62 -0
  442. package/scripts/review/review-round-reuse.ts +106 -0
  443. package/scripts/review/review-round2-cli.ts +91 -29
  444. package/scripts/review/review-round2-skip-comment.ts +55 -0
  445. package/scripts/review/review-round2.ts +24 -8
  446. package/scripts/review/review-stamps.ts +7 -3
  447. package/scripts/review/review-stop-log.ts +20 -6
  448. package/scripts/review/review-stops-cli.ts +2 -1
  449. package/scripts/review/review-submit-cli.ts +101 -0
  450. package/scripts/rules/agent-model.ts +1 -1
  451. package/scripts/rules/bash-triggers.ts +3 -3
  452. package/scripts/rules/concise-reply.ts +88 -0
  453. package/scripts/rules/credential-body.ts +77 -0
  454. package/scripts/rules/decision-oracle.ts +1 -1
  455. package/scripts/rules/delivered-rules.ts +36 -17
  456. package/scripts/rules/destructive-command.ts +3 -11
  457. package/scripts/rules/direct-issue-comment.ts +34 -12
  458. package/scripts/rules/direct-issue-read.ts +191 -0
  459. package/scripts/rules/direct-pr-create.ts +4 -24
  460. package/scripts/rules/early-heartbeat.ts +2 -0
  461. package/scripts/rules/edit-tool.ts +27 -0
  462. package/scripts/rules/file-edit-rows.ts +17 -0
  463. package/scripts/rules/file-rewrite.ts +146 -0
  464. package/scripts/rules/firing-point.ts +3 -2
  465. package/scripts/rules/gh-api.ts +128 -7
  466. package/scripts/rules/gh-repo-selector.ts +84 -0
  467. package/scripts/rules/git-force.ts +2 -2
  468. package/scripts/rules/guard-remedy.ts +14 -5
  469. package/scripts/rules/implementation-cut.ts +61 -28
  470. package/scripts/rules/investigator-foreground.ts +231 -0
  471. package/scripts/rules/issue-citation.ts +15 -60
  472. package/scripts/rules/issue-comments.ts +9 -4
  473. package/scripts/rules/josh-git-bare.ts +1 -1
  474. package/scripts/rules/lane-background.ts +41 -13
  475. package/scripts/rules/lane-direct-tool.ts +107 -9
  476. package/scripts/rules/lane-interactive-ask.ts +4 -1
  477. package/scripts/rules/lane-park.ts +4 -2
  478. package/scripts/rules/lane-spilled-read.ts +90 -0
  479. package/scripts/rules/lane-split-park.ts +1 -1
  480. package/scripts/rules/lane-switch-main.ts +4 -4
  481. package/scripts/rules/last-prompt.ts +20 -47
  482. package/scripts/rules/oracle-consulted.ts +1 -1
  483. package/scripts/rules/permission-guards.ts +5 -1
  484. package/scripts/rules/piped-verification-shapes.ts +110 -0
  485. package/scripts/rules/piped-verification.ts +67 -17
  486. package/scripts/rules/poll-loop.ts +72 -9
  487. package/scripts/rules/pr-merge.ts +5 -5
  488. package/scripts/rules/pre-gate-cut.ts +3 -3
  489. package/scripts/rules/protected-files.ts +88 -24
  490. package/scripts/rules/reply-language.ts +3 -17
  491. package/scripts/rules/reply-prose.ts +34 -0
  492. package/scripts/rules/repo-admin.ts +132 -0
  493. package/scripts/rules/reviewer-foreground.ts +88 -0
  494. package/scripts/rules/round-one-check-related.ts +120 -0
  495. package/scripts/rules/rule-body-guard.ts +5 -15
  496. package/scripts/rules/rule-value-cache.ts +53 -5
  497. package/scripts/rules/rule-value-candidates.ts +84 -0
  498. package/scripts/rules/rule-value-cli.ts +59 -11
  499. package/scripts/rules/rule-value.ts +17 -4
  500. package/scripts/rules/run-tail-rule.ts +1 -1
  501. package/scripts/rules/sed-in-place.ts +196 -0
  502. package/scripts/rules/shell-segments.ts +10 -2
  503. package/scripts/rules/stop-rule-rows.ts +1 -13
  504. package/scripts/rules/stop-rules.ts +33 -58
  505. package/scripts/rules/test-declared-commit.ts +1 -1
  506. package/scripts/rules/third-party-write.ts +110 -23
  507. package/scripts/rules/timed-rerun.ts +1 -1
  508. package/scripts/rules/turn-filings.ts +90 -0
  509. package/scripts/rules/worktree-guard.ts +22 -7
  510. package/scripts/run/board/run-board-ending-reason.ts +6 -2
  511. package/scripts/run/board/run-board-fit.ts +24 -1
  512. package/scripts/run/board/run-board-found.ts +134 -0
  513. package/scripts/run/board/run-board-header.ts +8 -0
  514. package/scripts/run/board/run-board-labels.ts +11 -1
  515. package/scripts/run/board/run-board-lane-time.ts +1 -0
  516. package/scripts/run/board/run-board-link.ts +15 -2
  517. package/scripts/run/board/run-board-notes.ts +7 -1
  518. package/scripts/run/board/run-board-operation.ts +4 -2
  519. package/scripts/run/board/run-board-phase.ts +2 -5
  520. package/scripts/run/board/run-board-plan.ts +1 -1
  521. package/scripts/run/board/run-board-read.ts +46 -1
  522. package/scripts/run/board/run-board-reason.ts +20 -8
  523. package/scripts/run/board/run-board-render-checks.ts +3 -2
  524. package/scripts/run/board/run-board-render-drawn.ts +11 -0
  525. package/scripts/run/board/run-board-render-found.ts +157 -0
  526. package/scripts/run/board/run-board-render-lead.ts +9 -0
  527. package/scripts/run/board/run-board-render-legend.ts +19 -0
  528. package/scripts/run/board/run-board-render-tail.ts +1 -1
  529. package/scripts/run/board/run-board-render.ts +82 -18
  530. package/scripts/run/board/run-board-spin.ts +1 -3
  531. package/scripts/run/board/run-board-status.ts +2 -0
  532. package/scripts/run/board/run-board-tick.ts +39 -10
  533. package/scripts/run/carry/run-carry-ended.ts +3 -2
  534. package/scripts/run/carry/run-carry.ts +3 -2
  535. package/scripts/run/cut/run-cut-cli.ts +33 -133
  536. package/scripts/run/cut/run-cut-digest.ts +152 -0
  537. package/scripts/run/cut/run-cut-handoff.ts +52 -8
  538. package/scripts/run/cut/run-cut-report.ts +24 -3
  539. package/scripts/run/cut/run-cut-resume.ts +129 -0
  540. package/scripts/run/cut/run-cut-review.ts +105 -0
  541. package/scripts/run/cut/run-cut.ts +18 -7
  542. package/scripts/run/detached-launch.ts +1 -1
  543. package/scripts/run/entry/run-entry-cli.ts +88 -19
  544. package/scripts/run/entry/run-entry-spill.ts +83 -0
  545. package/scripts/run/entry/run-entry-stop.ts +5 -1
  546. package/scripts/run/entry/run-entry-trust.ts +91 -0
  547. package/scripts/run/event/run-event-baseline.ts +56 -0
  548. package/scripts/run/event/run-event-filed.ts +9 -3
  549. package/scripts/run/event/run-event-overrun.ts +197 -0
  550. package/scripts/run/event/run-event-render.ts +4 -0
  551. package/scripts/run/event/run-event-stream.ts +25 -3
  552. package/scripts/run/hold/run-stop-notify.ts +3 -8
  553. package/scripts/run/merge/run-merge-cap.ts +57 -0
  554. package/scripts/run/merge/run-merge-cli.ts +66 -23
  555. package/scripts/run/merge/run-merge-outcome.ts +2 -0
  556. package/scripts/run/merge/run-merge-ship.ts +13 -3
  557. package/scripts/run/merge/run-merge-signals.ts +40 -23
  558. package/scripts/run/merge/run-merge-steps.ts +56 -36
  559. package/scripts/run/merge/run-merge-usage-limit.ts +53 -0
  560. package/scripts/run/merge/run-merge-withdrawn.ts +53 -0
  561. package/scripts/run/merge/run-merge.ts +41 -14
  562. package/scripts/run/review/run-review-cli.ts +306 -20
  563. package/scripts/run/review/run-review-early-push.ts +121 -0
  564. package/scripts/run/review/run-review-join-read.ts +94 -0
  565. package/scripts/run/review/run-review-pinned-accepted.ts +126 -0
  566. package/scripts/run/review/run-review-pinned-join.ts +216 -0
  567. package/scripts/run/review/run-review-pinned-steps.ts +383 -0
  568. package/scripts/run/review/run-review-pinned-tree.ts +37 -0
  569. package/scripts/run/review/run-review-pinned.ts +53 -0
  570. package/scripts/run/review/run-review-steps.ts +70 -34
  571. package/scripts/run/review/run-review.ts +26 -6
  572. package/scripts/run/run-parent-cut-hook.ts +3 -4
  573. package/scripts/run/run-prep.ts +1 -0
  574. package/scripts/run/run-stage-read.ts +2 -6
  575. package/scripts/run/run-step-cli.ts +17 -5
  576. package/scripts/run/run-step-lane-plan.ts +27 -0
  577. package/scripts/run/run-step-section.ts +26 -7
  578. package/scripts/run/run-step.ts +5 -2
  579. package/scripts/run/ship/run-ship-args.ts +19 -0
  580. package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
  581. package/scripts/run/ship/run-ship-cli.ts +131 -39
  582. package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
  583. package/scripts/run/ship/run-ship-detach.ts +10 -4
  584. package/scripts/run/ship/run-ship-handover.ts +106 -0
  585. package/scripts/run/ship/run-ship-infra-retry.ts +16 -1
  586. package/scripts/run/ship/run-ship-lap.ts +63 -0
  587. package/scripts/run/ship/run-ship-next.ts +27 -26
  588. package/scripts/run/ship/run-ship-overlap.ts +8 -3
  589. package/scripts/run/ship/run-ship-place.ts +9 -2
  590. package/scripts/run/ship/run-ship-planned.ts +92 -0
  591. package/scripts/run/ship/run-ship-pre-detach-pinned.ts +197 -0
  592. package/scripts/run/ship/run-ship-pre-detach-timed.ts +7 -8
  593. package/scripts/run/ship/run-ship-pre-detach.ts +77 -23
  594. package/scripts/run/ship/run-ship-preflight.ts +16 -4
  595. package/scripts/run/ship/run-ship-probe.ts +23 -9
  596. package/scripts/run/ship/run-ship-relaunch-cap.ts +43 -7
  597. package/scripts/run/ship/run-ship-relaunch.ts +51 -0
  598. package/scripts/run/ship/run-ship-return.ts +103 -29
  599. package/scripts/run/ship/run-ship-review-reason.ts +24 -0
  600. package/scripts/run/ship/run-ship-review-steps.ts +230 -59
  601. package/scripts/run/ship/run-ship-review.ts +171 -51
  602. package/scripts/run/ship/run-ship-reviewer.ts +138 -42
  603. package/scripts/run/ship/run-ship-scoped.ts +39 -10
  604. package/scripts/run/ship/run-ship-stage.ts +49 -13
  605. package/scripts/run/ship/run-ship-steps.ts +24 -4
  606. package/scripts/run/ship/run-ship-stop-cause.ts +43 -2
  607. package/scripts/run/ship/run-ship-stop-context.ts +50 -13
  608. package/scripts/run/ship/run-ship-sync.ts +171 -30
  609. package/scripts/run/ship/run-ship-synced-scope.ts +178 -0
  610. package/scripts/run/ship/run-ship-wait-cli.ts +145 -0
  611. package/scripts/run/ship/run-ship-waiter.ts +114 -0
  612. package/scripts/run/ship/run-ship.ts +16 -2
  613. package/scripts/run/wake/run-wake-caffeinate.ts +48 -0
  614. package/scripts/run/wake/run-wake-cli.ts +6 -113
  615. package/scripts/run/wake/run-wake-code.ts +53 -11
  616. package/scripts/run/wake/run-wake-driver.ts +5 -3
  617. package/scripts/run/wake/run-wake-finish.ts +137 -0
  618. package/scripts/run/wake/run-wake-loop.ts +5 -3
  619. package/scripts/run/wake/run-wake-ports.ts +11 -3
  620. package/scripts/run/wake/run-wake-session.ts +2 -0
  621. package/scripts/run/wake/run-wake.ts +3 -2
  622. package/scripts/safe-chain/ci-installer-pin.ts +49 -8
  623. package/scripts/safe-chain/project-config.ts +3 -2
  624. package/scripts/security/secretlint-scan.ts +42 -9
  625. package/scripts/security/security-audit-provision-main.ts +9 -1
  626. package/scripts/security/security-audit-provision.ts +1 -1
  627. package/scripts/security/security-audit.ts +21 -1
  628. package/scripts/security/sonar-file.ts +10 -5
  629. package/scripts/split/split-assess.ts +12 -3
  630. package/scripts/split/split-early-notice.ts +116 -0
  631. package/scripts/split/split-measure.ts +20 -2
  632. package/scripts/split/split-resolution.ts +107 -0
  633. package/scripts/test/direct-importers.ts +185 -0
  634. package/scripts/test/pure-files-entries.ts +83 -0
  635. package/scripts/test/related-heavy-tests.ts +81 -0
  636. package/scripts/test/test-no-base.ts +88 -0
  637. package/scripts/test/test-pinned-cache-logic.ts +363 -0
  638. package/scripts/test/test-pinned-cache.ts +337 -0
  639. package/scripts/test/test-pinned-emit.ts +49 -0
  640. package/scripts/test/test-pinned-functions.ts +116 -0
  641. package/scripts/test/test-pinned-ledger.ts +80 -0
  642. package/scripts/test/test-pinned-logic.ts +208 -20
  643. package/scripts/test/test-pinned-main.ts +84 -18
  644. package/scripts/test/test-pinned-pool.ts +73 -0
  645. package/scripts/test/test-pinned-probe.ts +254 -0
  646. package/scripts/test/test-pinned-prune-logic.ts +118 -0
  647. package/scripts/test/test-pinned-reach.ts +194 -0
  648. package/scripts/test/test-pinned-record.ts +196 -0
  649. package/scripts/test/test-pinned-rewire.ts +148 -0
  650. package/scripts/test/test-pinned-spawn.ts +81 -0
  651. package/scripts/test/test-pinned-stage.ts +70 -0
  652. package/scripts/test/test-pinned.ts +258 -47
  653. package/scripts/test/test-reach-cli.ts +61 -0
  654. package/scripts/test/test-read-map.ts +35 -11
  655. package/scripts/test/test-read-recording.ts +17 -5
  656. package/scripts/test/test-read-trace.ts +26 -8
  657. package/scripts/test/test-red-logic.ts +46 -7
  658. package/scripts/test/test-red.ts +34 -14
  659. package/scripts/test/test-related-claim.ts +37 -0
  660. package/scripts/test/test-related-main.ts +4 -1
  661. package/scripts/test/test-related-moved.ts +91 -0
  662. package/scripts/test/test-related-record.ts +43 -23
  663. package/scripts/test/test-related-scope.ts +99 -34
  664. package/scripts/test/test-related-synced.ts +135 -0
  665. package/scripts/test/test-related-touched.ts +84 -0
  666. package/scripts/test/test-related.ts +167 -83
  667. package/scripts/test/test-unit-guard.ts +28 -5
  668. package/scripts/test/unit-durations.ts +41 -0
  669. package/scripts/test/unit-worker-share.ts +5 -4
  670. package/scripts/test/vitest-cache-directory.ts +19 -0
  671. package/scripts/test/vitest-cli-excludes.ts +14 -0
  672. package/scripts/test/vitest-failure-summary.ts +111 -0
  673. package/scripts/test/whole-suite-files.ts +12 -1
  674. package/scripts/time-runtime/time-batch-guard.ts +42 -4
  675. package/scripts/time-runtime/time-bundle-call.ts +1 -1
  676. package/scripts/time-runtime/time-bundles.ts +36 -5
  677. package/scripts/time-runtime/time-markers.ts +2 -2
  678. package/scripts/time-runtime/time-search-call.ts +38 -0
  679. package/scripts/time-runtime/time-shell.ts +1 -1
  680. package/scripts/time-runtime/time-transcript-line.ts +17 -5
  681. package/scripts/version/development-engines-verdict.ts +124 -0
  682. package/scripts/version/latest-corepack.ts +2 -0
  683. package/templates/gitignore +2 -0
  684. package/templates/workflows/ci.yml +41 -0
  685. package/dist/hooks/chunk-AZX4FGQ3.js +0 -207
  686. package/dist/hooks/chunk-PT5R6UJD.js +0 -7131
  687. package/dist/hooks/chunk-TUIFS5E7.js +0 -72
  688. package/dist/hooks/chunk-YCDOIR3I.js +0 -3456
  689. package/scripts/cost-runtime/context-cut-threshold.ts +0 -11
  690. package/scripts/rules/filing-cap.ts +0 -139
@@ -0,0 +1,212 @@
1
+ import { MS_PER_MINUTE } from '#scripts/lib/timeouts'
2
+ import { run_event_stream, type RunEvent } from '#scripts/run/event/run-event-stream'
3
+ import type { LedgerEntry } from './lane-ledger'
4
+ import { lane_sleep } from './lane-sleep'
5
+ import { lane_spans, type IssueAt, type Span } from './lane-spans'
6
+ import { lane_stage_stats } from './lane-stage-stats'
7
+ import { lane_stop_stats } from './lane-stop-stats'
8
+ import { lane_yield } from './lane-yield'
9
+
10
+ // A lane's net time (joshuafolkken/kit#4749): from its issue's first dispatch to its merge, less the
11
+ // waits no fix in the lane shortens — a park (the issue waits on a person's decision), an outage and a
12
+ // usage-limit stop (joshuafolkken/kit#4745), each until the issue's next ship stage, re-dispatch or
13
+ // another of the two, the wait `josh lane:stats` derives for a stop (`lane-stop-stats.ts`) — and the
14
+ // host's sleeps (joshuafolkken/kit#5032), whatever the issue (`lane-sleep.ts`), and a yield's wait for
15
+ // the issue's next dispatch (joshuafolkken/kit#5216), no lane seat held while the holder runs. A ship
16
+ // stop is not taken out: a relaunched child works through its wait. `josh lane:net` prints it, and a
17
+ // causing-lane line declares it (`issue-priority.ts`).
18
+
19
+ const { EVENT_KIND } = run_event_stream
20
+
21
+ interface LaneSpan {
22
+ from_ms: number
23
+ to_ms: number
24
+ }
25
+
26
+ function entries_of(entries: ReadonlyArray<LedgerEntry>, issue: number): Array<LedgerEntry> {
27
+ return entries.filter((entry) => 'issue' in entry && entry.issue === issue)
28
+ }
29
+
30
+ // The first dispatch of `issue` to its merge, or `undefined` while either is missing or the merge comes
31
+ // first.
32
+ function span_of(entries: ReadonlyArray<LedgerEntry>, issue: number): LaneSpan | undefined {
33
+ const of_issue = entries_of(entries, issue)
34
+ const from = of_issue.find((entry) => lane_stage_stats.is_dispatch(entry))
35
+ const to = of_issue.findLast((entry) => lane_stage_stats.is_merge(entry))
36
+
37
+ if (from === undefined || to === undefined) return undefined
38
+
39
+ const span = { from_ms: Date.parse(from.at), to_ms: Date.parse(to.at) }
40
+
41
+ return span.to_ms < span.from_ms ? undefined : span
42
+ }
43
+
44
+ function holds_of(events: ReadonlyArray<RunEvent>): Array<IssueAt> {
45
+ return [
46
+ ...lane_stop_stats.events_of(events, EVENT_KIND.PARK),
47
+ ...lane_stop_stats.events_of(events, EVENT_KIND.OUTAGE),
48
+ ...lane_stop_stats.events_of(events, EVENT_KIND.USAGE_LIMIT),
49
+ ]
50
+ }
51
+
52
+ // One hold's wait, cut at the merge: a hold nothing ended before it waited until the merge.
53
+ function held_ms(hold: IssueAt, ends: ReadonlyArray<IssueAt>, to_ms: number): number {
54
+ const left_ms = to_ms - hold.at_ms
55
+
56
+ return Math.min(lane_stop_stats.wait_ms(hold, ends) ?? left_ms, left_ms)
57
+ }
58
+
59
+ function hold_waits(
60
+ entries: ReadonlyArray<LedgerEntry>,
61
+ events: ReadonlyArray<RunEvent>,
62
+ issue: number,
63
+ span: LaneSpan,
64
+ ): Array<LaneSpan> {
65
+ const holds = holds_of(events)
66
+ const inside = holds.filter(
67
+ (hold) => hold.issue === issue && hold.at_ms >= span.from_ms && hold.at_ms < span.to_ms,
68
+ )
69
+
70
+ return inside.map((hold) => {
71
+ const ends = lane_stop_stats.ends_of(
72
+ entries,
73
+ holds.filter((other) => other.at_ms > hold.at_ms),
74
+ )
75
+
76
+ return { from_ms: hold.at_ms, to_ms: hold.at_ms + held_ms(hold, ends, span.to_ms) }
77
+ })
78
+ }
79
+
80
+ // `spans` oldest first with every overlap joined, so a park the host slept through is taken out once.
81
+ function joined(spans: ReadonlyArray<LaneSpan>): Array<LaneSpan> {
82
+ const sorted = spans.toSorted((left, right) => left.from_ms - right.from_ms)
83
+
84
+ const kept: Array<LaneSpan> = []
85
+
86
+ for (const next of sorted) {
87
+ const last = kept.at(-1)
88
+
89
+ if (last === undefined || next.from_ms > last.to_ms) kept.push({ ...next })
90
+ else last.to_ms = Math.max(last.to_ms, next.to_ms)
91
+ }
92
+
93
+ return kept
94
+ }
95
+
96
+ // The host's sleeps (joshuafolkken/kit#5032) cut to `span` and joined: a sleep stops every lane,
97
+ // whatever its issue.
98
+ function slept(events: ReadonlyArray<RunEvent>, span: LaneSpan): Array<LaneSpan> {
99
+ const cut = lane_sleep.spans(events).map((sleep) => ({
100
+ from_ms: Math.max(sleep.from_ms, span.from_ms),
101
+ to_ms: Math.min(sleep.to_ms, span.to_ms),
102
+ }))
103
+
104
+ return joined(cut.filter((sleep) => sleep.to_ms > sleep.from_ms))
105
+ }
106
+
107
+ // Each yield (`lane:plan` gave the seat back) until its issue's next dispatch, every issue's — the
108
+ // `yield → redispatch` gap `josh lane:stats` prints (`lane-gap-stats.ts`).
109
+ function yield_spans(
110
+ entries: ReadonlyArray<LedgerEntry>,
111
+ events: ReadonlyArray<RunEvent>,
112
+ ): Array<Span> {
113
+ const yields = lane_stop_stats.events_of(
114
+ events.filter((event) => lane_yield.is_yield(event)),
115
+ EVENT_KIND.WITHDRAW,
116
+ )
117
+
118
+ return lane_spans.issue_spans({
119
+ starts: yields,
120
+ bounds: yields,
121
+ ends: lane_stop_stats.dispatches_of(entries),
122
+ })
123
+ }
124
+
125
+ // `issue`'s yields inside `span`, each until its redispatch, cut at the merge.
126
+ function yielded(
127
+ entries: ReadonlyArray<LedgerEntry>,
128
+ events: ReadonlyArray<RunEvent>,
129
+ issue: number,
130
+ span: LaneSpan,
131
+ ): Array<LaneSpan> {
132
+ const of_issue = events.filter((event) => lane_stop_stats.issue_of(event) === issue)
133
+ const inside = yield_spans(entries, of_issue).filter(
134
+ (wait) => wait.from_ms >= span.from_ms && wait.from_ms < span.to_ms,
135
+ )
136
+
137
+ return inside.map((wait) => ({
138
+ from_ms: wait.from_ms,
139
+ to_ms: Math.min(wait.end_ms ?? span.to_ms, span.to_ms),
140
+ }))
141
+ }
142
+
143
+ // The waits `net_ms` takes out of `span` — each hold from itself to its end, cut at the merge, each
144
+ // yield until its redispatch, and each sleep of the host — the intervals `josh lane:breakdown` counts
145
+ // as excluded (`lane-breakdown.ts`).
146
+ function waits(
147
+ entries: ReadonlyArray<LedgerEntry>,
148
+ events: ReadonlyArray<RunEvent>,
149
+ issue: number,
150
+ span: LaneSpan,
151
+ ): Array<LaneSpan> {
152
+ return joined([
153
+ ...hold_waits(entries, events, issue, span),
154
+ ...yielded(entries, events, issue, span),
155
+ ...slept(events, span),
156
+ ])
157
+ }
158
+
159
+ /**
160
+ * The net milliseconds of `issue`'s lane, or `undefined` when the ledger holds no dispatch and merge of
161
+ * it. `events` is the run's event stream, read for the parks and outages.
162
+ */
163
+ function net_ms(
164
+ entries: ReadonlyArray<LedgerEntry>,
165
+ events: ReadonlyArray<RunEvent>,
166
+ issue: number,
167
+ ): number | undefined {
168
+ const span = span_of(entries, issue)
169
+
170
+ if (span === undefined) return undefined
171
+
172
+ return waits(entries, events, issue, span).reduce(
173
+ (left, wait) => left - (wait.to_ms - wait.from_ms),
174
+ span.to_ms - span.from_ms,
175
+ )
176
+ }
177
+
178
+ // The net time in whole minutes, rounded up — the number a causing-lane line declares.
179
+ function net_minutes(
180
+ entries: ReadonlyArray<LedgerEntry>,
181
+ events: ReadonlyArray<RunEvent>,
182
+ issue: number,
183
+ ): number | undefined {
184
+ const net = net_ms(entries, events, issue)
185
+
186
+ return net === undefined ? undefined : Math.ceil(net / MS_PER_MINUTE)
187
+ }
188
+
189
+ // Why `net_ms` has no answer for `issue` (joshuafolkken/kit#4818): the ledger lacks its dispatch or its
190
+ // merge, or holds both with the merge first.
191
+ function missing_reason(entries: ReadonlyArray<LedgerEntry>, issue: number): string {
192
+ const of_issue = entries_of(entries, issue)
193
+
194
+ if (of_issue.every((entry) => !lane_stage_stats.is_dispatch(entry))) return 'no dispatch'
195
+ if (of_issue.every((entry) => !lane_stage_stats.is_merge(entry))) return 'no merge'
196
+
197
+ return 'cause unknown'
198
+ }
199
+
200
+ const lane_net_time = {
201
+ missing_reason,
202
+ net_minutes,
203
+ net_ms,
204
+ slept,
205
+ span_of,
206
+ waits,
207
+ yield_spans,
208
+ yielded,
209
+ }
210
+
211
+ export { lane_net_time }
212
+ export type { LaneSpan }
@@ -1,9 +1,10 @@
1
- import { mkdirSync, readdirSync, rmSync, writeFileSync } from 'node:fs'
1
+ import { mkdirSync, readdirSync, rmSync } from 'node:fs'
2
2
  import path from 'node:path'
3
3
  import { ENV_FILE_NAME } from '#ports'
4
4
  import { git_worktree } from '#scripts/git/git-worktree'
5
5
  import { session_cite } from '#scripts/issue/session-cite'
6
6
  import { file_reader } from '#scripts/lib/read-file'
7
+ import { eslint_warm } from '#scripts/lint/eslint-warm'
7
8
  import { run_event_setup } from '#scripts/run/event/run-event-setup'
8
9
  import { lane_cache } from './lane-cache'
9
10
  import { lane_environment } from './lane-environment'
@@ -176,9 +177,12 @@ function guard_install(lane: LaneInfo, result: InstallResult): void {
176
177
 
177
178
  // **The install is said on the run's stream as it starts**: it is the long part of opening a lane, and
178
179
  // `run:board` draws it apart from the work tree being made. Best-effort, as every stage is.
180
+ // **The eslint daemon is warmed once the install lands, unawaited**, so the child's first edit hook
181
+ // lints warm rather than paying the daemon's start (joshuafolkken/kit#4720).
179
182
  async function fill(lane: LaneInfo): Promise<void> {
180
183
  await run_event_setup.emit(run_event_setup.installing(lane.issue))
181
184
  guard_install(lane, await lane_install.install_dependencies(lane.directory))
185
+ eslint_warm.start(lane.directory)
182
186
  }
183
187
 
184
188
  function build_plan(
@@ -202,6 +206,15 @@ function build_plan(
202
206
  }
203
207
  }
204
208
 
209
+ async function add_worktree(lane: LaneInfo): Promise<void> {
210
+ mkdirSync(path.dirname(lane.directory), { recursive: true })
211
+
212
+ const start_point = await lane_start_point.resolve_for_branch(lane.branch)
213
+
214
+ await git_worktree.worktree_add(lane.directory, lane.branch, start_point)
215
+ await git_worktree.set_upstream(lane.branch)
216
+ }
217
+
205
218
  // The `.env` is written straight after the work tree exists, because the seed is the reason the
206
219
  // lane is being opened. Nothing else is recorded anywhere: that file *is* the record.
207
220
  //
@@ -231,12 +244,8 @@ async function materialize(plan: LanePlan, source_root: string): Promise<void> {
231
244
  // genuinely broken lane. The `finally` covers a failure before the `.env`
232
245
  // is written, where nothing was created that should hold it.
233
246
  try {
234
- mkdirSync(path.dirname(plan.lane.directory), { recursive: true })
235
-
236
- const start_point = await lane_start_point.resolve_for_branch(plan.lane.branch)
237
-
238
- await git_worktree.worktree_add(plan.lane.directory, plan.lane.branch, start_point)
239
- writeFileSync(path.join(plan.lane.directory, ENV_FILE_NAME), plan.environment_content)
247
+ await add_worktree(plan.lane)
248
+ lane_registry.write_environment(plan.lane.directory, plan.environment_content)
240
249
  release_seat_lock(plan.seat_lock)
241
250
  lane_cache.seed_caches(source_root, plan.lane.directory)
242
251
  lane_cache.seed_hook_bundles(source_root, plan.lane.directory)
@@ -1,5 +1,3 @@
1
- import { writeFileSync } from 'node:fs'
2
- import path from 'node:path'
3
1
  import { ENV_FILE_NAME } from '#ports'
4
2
  import type { AgentProfile } from '#scripts/agent/agent-role-profile'
5
3
  import { session_cite } from '#scripts/issue/session-cite'
@@ -75,8 +73,8 @@ async function record_output(
75
73
 
76
74
  if (content === undefined) return { kind: 'unreadable', lane }
77
75
 
78
- writeFileSync(
79
- path.join(lane.directory, ENV_FILE_NAME),
76
+ lane_registry.write_environment(
77
+ lane.directory,
80
78
  lane_environment.with_lane_output(content, output, profile),
81
79
  )
82
80
 
@@ -0,0 +1,147 @@
1
+ import { issue_cite } from '#scripts/issue/issue-cite'
2
+ import { issue_priority } from '#scripts/issue/issue-priority'
3
+ import { run_event_overrun } from '#scripts/run/event/run-event-overrun'
4
+
5
+ // What an overrun investigation's session does with the causes it found (joshuafolkken/kit#4751) —
6
+ // pick, group, fold or file each, and record the result — the part of its prompt that reads no record.
7
+ // `lane-overrun.ts` puts what the session reads ahead of it.
8
+
9
+ // The most causes one investigation files, and the fewest minutes one must cut to be filed
10
+ // (joshuafolkken/kit#4928).
11
+ const MAX_FILINGS = 5
12
+ const MIN_MINUTES = 1
13
+ const PRIORITY_COMMAND = 'pnpm josh issue:priority <N>'
14
+
15
+ // What a duplicate refusal leads to. A recurrence appends its own cause-loss line to the open issue's
16
+ // body, because the backlog ranking reads them only there and sums them (joshuafolkken/kit#4859,
17
+ // joshuafolkken/kit#4928); the sum can then reach the high floor, which a body edit does not label
18
+ // (joshuafolkken/kit#4960).
19
+ function duplicate_lines(loss_lines: string): ReadonlyArray<string> {
20
+ return [
21
+ 'On a duplicate refusal, read each candidate with `pnpm josh issue:read <N>`: one that only fixes',
22
+ 'another mechanism, or is only cited, is distinct — reissue with `--distinct <N,…>`; an open one that',
23
+ 'fixes the same mechanism is not filed again but gets a comment recording the recurrence with those four',
24
+ `and ${loss_lines}, and gets those lines added under its background heading too, the cause-loss line`,
25
+ `appended beside the ones already there, since ranking sums every \`${issue_priority.CAUSE_PREFIX}\` line`,
26
+ 'and reads only the body (`gh api -X PATCH repos/{owner}/{repo}/issues/<N> -F body=@<file>`). Then',
27
+ `run \`${PRIORITY_COMMAND}\`, which labels it once the sum reaches the high floor. One`,
28
+ 'closed before this lane yet recurring here is filed anew as a recurrence, its number in `--distinct`.',
29
+ 'A cap refusal is final: stop filing.',
30
+ ]
31
+ }
32
+
33
+ // The filing command: an overrun's filings name the lane they were found during; the baseline's name none.
34
+ function file_command(origin: number | undefined): string {
35
+ if (origin === undefined) return 'pnpm josh issue:file'
36
+
37
+ return `pnpm josh issue:file --found-during ${String(origin)}`
38
+ }
39
+
40
+ // Each lane pays a fixed review-to-merge cost, so causes one fix place shares are one issue. A fold
41
+ // skips `issue:file`, so it carries the ranked lines; the lane's minutes give it no label, and the
42
+ // fold applies the cause-loss floor with `issue:priority` (`issue-fold-existing.md`).
43
+ function grouping(origin: number | undefined, loss_lines: string): string {
44
+ return [
45
+ 'Causes whose fixes touch the same file or mechanism are one issue, an acceptance criterion per',
46
+ 'cause; causes fixed in different places are separate issues. Before filing one, look for an open',
47
+ 'issue that touches the same files (`pnpm josh issue:scout "<title>" --body-file <draft.md>`, each',
48
+ 'candidate read with `pnpm josh issue:read <N>`): when one does, fold its causes into it by',
49
+ '`.claude/skills/workflow-commands/issue-fold-existing.md` instead of filing, the appended part',
50
+ `carrying ${loss_lines}; on a verdict other than \`fold\`, file as below.`,
51
+ 'File each other issue with',
52
+ `\`${file_command(origin)}\`, its body carrying those four per cause, and`,
53
+ `${loss_lines} under its background heading, the cause-loss minutes being what that issue's own`,
54
+ "causes would cut — backlog ranking orders one priority by them, else by the lane's minutes, which every",
55
+ 'cause of the lane shares, so a filing without either falls behind every declared one.',
56
+ ].join(' ')
57
+ }
58
+
59
+ // A share over every merge thins a new mechanism's cost below any line (joshuafolkken/kit#4928), so the
60
+ // causes are picked by the minutes a fix would cut from what was read, largest first. `scope` names
61
+ // that span: one lane, or the baseline's merge.
62
+ function selection_lines(scope: string): ReadonlyArray<string> {
63
+ const limit = `${String(MAX_FILINGS)} causes`
64
+
65
+ return [
66
+ `Estimate each cause's reducible minutes: what its fix would cut from ${scope}. Time the work`,
67
+ 'inherently takes (a CI wait the pipeline requires, a review) counts only for the part a fix removes,',
68
+ 'and not at all when no fix removes any.',
69
+ `Take at most the ${limit} with the most reducible minutes, largest first, each cutting`,
70
+ `${String(MIN_MINUTES)} minute or more, and drop the rest: file or fold only those.`,
71
+ 'File a defect — a tool did something unneeded or wrong (a rerun on an unchanged tree, a lost scope)',
72
+ '— as `- 種別: 不具合`, any other cause as `- 目的: 時間短縮`.',
73
+ ]
74
+ }
75
+
76
+ // A reach count measured by a hand-written probe, and a before / after criterion beside the fix, cost
77
+ // #5202's lane its implement time (joshuafolkken/kit#5238).
78
+ const MEASUREMENT_LINES = [
79
+ 'Measure a reach test count — the test files `pnpm josh test:related` runs for a changed file — with',
80
+ '`pnpm josh test:reach <file…>`.',
81
+ 'Put a measurement criterion (a before / after recorded as an Issue comment) in a prior `--route split`',
82
+ 'issue, never in the issue that carries the fix.',
83
+ ]
84
+
85
+ // The result's vocabulary, recorded as the note `template` names with `<result>` in it.
86
+ function result_lines(template: string): ReadonlyArray<string> {
87
+ return [
88
+ `Then record the result: \`pnpm josh run:event --append note "${template}"\`,`,
89
+ `the result being \`${run_event_overrun.folded_result(['<A>', '<B>'])}\` naming every issue you folded into`,
90
+ `when you folded any, else \`${run_event_overrun.FILED_RESULT}\` when you filed any, \`${run_event_overrun.recurred_result('<N>')}\``,
91
+ `when you only commented a recurrence on #<N>, else \`${run_event_overrun.none_result('<why, in about 15 characters>')}\`.`,
92
+ ]
93
+ }
94
+
95
+ // How an investigation's causes are handled: the lane its filings were found during, if any, the ranked
96
+ // lines each filing carries, the note its result is recorded as, and the span a cause's reducible
97
+ // minutes are cut from.
98
+ interface CauseHandling {
99
+ origin: number | undefined
100
+ loss_lines: string
101
+ template: string
102
+ scope: string
103
+ }
104
+
105
+ // The filing rules an investigation's causes follow, shared by the overrun and the baseline
106
+ // investigation (joshuafolkken/kit#4887).
107
+ function cause_handling(rules: CauseHandling): string {
108
+ return [
109
+ ...selection_lines(rules.scope),
110
+ grouping(rules.origin, rules.loss_lines),
111
+ ...MEASUREMENT_LINES,
112
+ ...duplicate_lines(rules.loss_lines),
113
+ ...result_lines(rules.template),
114
+ ].join(' ')
115
+ }
116
+
117
+ // The lines backlog ranking reads (joshuafolkken/kit#4861): the cause's own minutes, else the lane's
118
+ // `minutes`, cited to lane `issue`.
119
+ function loss_lines_of(issue: number, minutes: string): string {
120
+ const cite = issue_cite.plain(issue)
121
+
122
+ return `\`- 原因のレーン: ${minutes} 分(${cite})\` and \`${issue_priority.CAUSE_PREFIX} <分> 分\``
123
+ }
124
+
125
+ // The breakdown the overrun's prompt leads with orders the search (joshuafolkken/kit#4995); a stage no
126
+ // fix shortens is named in the result, so the time no filing covers is still accounted for. Only the
127
+ // overrun has a breakdown: the baseline shares `cause_handling`, not this.
128
+ const STAGE_ORDER = [
129
+ 'Search for causes stage by stage, in the order of the net time by stage above, longest first.',
130
+ `For each stage you judge not reducible, end the result with \`${run_event_overrun.NOT_REDUCIBLE_LEAD}<stage> (<why>)\`.`,
131
+ ].join(' ')
132
+
133
+ // The handling of lane `issue`'s causes, its `minutes` of net time on each filing's ranked lines.
134
+ function handling(issue: number, minutes: number): string {
135
+ const rules = cause_handling({
136
+ origin: issue,
137
+ loss_lines: loss_lines_of(issue, String(minutes)),
138
+ template: run_event_overrun.ended_text(issue, '<result>'),
139
+ scope: 'this lane alone, judged from its own record',
140
+ })
141
+
142
+ return `${STAGE_ORDER} ${rules}`
143
+ }
144
+
145
+ const lane_overrun_prompt = { cause_handling, handling, loss_lines_of }
146
+
147
+ export { lane_overrun_prompt }