@joshuafolkken/kit 1.1784.0 → 1.2114.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 +59 -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 +415 -389
  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 +15 -8
  66. package/prompts/coding-standards.md +1 -1
  67. package/prompts/collaboration-workflow/file-edits.md +14 -11
  68. package/prompts/collaboration-workflow/issue-citation.md +0 -4
  69. package/prompts/collaboration-workflow/issue-template.md +40 -21
  70. package/prompts/collaboration-workflow/lane-instructions.md +3 -1
  71. package/prompts/collaboration-workflow/measurement.md +8 -1
  72. package/prompts/collaboration-workflow/operating-rules.md +11 -2
  73. package/prompts/collaboration-workflow/output-bounds.md +6 -2
  74. package/prompts/collaboration-workflow/plan-comment.md +1 -1
  75. package/prompts/collaboration-workflow/principles.md +9 -0
  76. package/prompts/collaboration-workflow/residency.md +3 -2
  77. package/prompts/collaboration-workflow/rule-delivery.md +13 -1
  78. package/prompts/collaboration-workflow/upstream-interrupt.md +2 -2
  79. package/prompts/collaboration-workflow/wip-cap.md +3 -1
  80. package/prompts/review-rubric.md +8 -0
  81. package/prompts/review.md +31 -22
  82. package/prompts/testing-guide.md +1 -0
  83. package/scripts/agent/agent-argv.ts +14 -16
  84. package/scripts/agent/agent-provider.ts +138 -0
  85. package/scripts/agent/agent-role-profile.ts +108 -156
  86. package/scripts/agent/agent-safe-text.ts +20 -5
  87. package/scripts/agent/api-usage-limit.ts +65 -0
  88. package/scripts/agent/claude-agent-argv.ts +19 -9
  89. package/scripts/agent/codex-agent-argv.ts +118 -22
  90. package/scripts/agent/usage-limit-reset.ts +179 -0
  91. package/scripts/auth/claude-token-output.ts +2 -2
  92. package/scripts/auto-ok/auto-ok-author.ts +53 -0
  93. package/scripts/auto-ok/auto-ok-cli.ts +20 -9
  94. package/scripts/backlog/backlog-defect-priority.ts +1 -1
  95. package/scripts/backlog/backlog-drive-cli.ts +6 -1
  96. package/scripts/backlog/backlog-drive-hold.ts +3 -3
  97. package/scripts/backlog/backlog-drive-idle.ts +10 -0
  98. package/scripts/backlog/backlog-drive-launch-pass.ts +90 -0
  99. package/scripts/backlog/backlog-drive-launch.ts +8 -2
  100. package/scripts/backlog/backlog-drive-named-offer.ts +73 -30
  101. package/scripts/backlog/backlog-drive-named.ts +28 -7
  102. package/scripts/backlog/backlog-drive-paused.ts +5 -4
  103. package/scripts/backlog/backlog-drive-restore.ts +11 -3
  104. package/scripts/backlog/backlog-drive.ts +21 -60
  105. package/scripts/backlog/backlog-gate-scope.ts +61 -0
  106. package/scripts/backlog/backlog-measure-close.ts +112 -0
  107. package/scripts/backlog/backlog-next.ts +39 -49
  108. package/scripts/backlog/backlog-occupied.ts +2 -2
  109. package/scripts/backlog/backlog-overlap.ts +42 -8
  110. package/scripts/backlog/backlog-plan-cli.ts +4 -1
  111. package/scripts/backlog/backlog-plan-comment.ts +81 -0
  112. package/scripts/backlog/backlog-plan-read.ts +19 -6
  113. package/scripts/backlog/backlog-pool.ts +50 -12
  114. package/scripts/backlog/backlog-rank.ts +60 -13
  115. package/scripts/backlog/backlog-stalled-detect.ts +2 -1
  116. package/scripts/backlog/backlog-waves.ts +17 -2
  117. package/scripts/backlog/backlogrun-launch.ts +7 -4
  118. package/scripts/cost-runtime/context-cut-payback.ts +27 -25
  119. package/scripts/cost-runtime/cost-cli.ts +37 -16
  120. package/scripts/cost-runtime/cost-pricing.ts +9 -0
  121. package/scripts/cost-runtime/cost-verdict.ts +4 -1
  122. package/scripts/delegation/delegation-policy.ts +2 -2
  123. package/scripts/delegation/duplicate-read-guard.ts +1 -0
  124. package/scripts/delegation/investigation-guard.ts +14 -2
  125. package/scripts/delegation/investigation-reads.ts +45 -23
  126. package/scripts/dependabot/dependabot-cooldown.ts +3 -2
  127. package/scripts/discovery/repo-party.ts +80 -20
  128. package/scripts/discovery/session-owner-pin.ts +51 -0
  129. package/scripts/document/capped-print.ts +1 -1
  130. package/scripts/document/command-reference-line-budget.ts +42 -0
  131. package/scripts/document/document-byte-budget.ts +17 -7
  132. package/scripts/document/document-checks.ts +20 -0
  133. package/scripts/document/document-ratchet-check.ts +101 -0
  134. package/scripts/document/document-section.ts +1 -0
  135. package/scripts/document/entry-read-budget.ts +7 -3
  136. package/scripts/document/issue-citation-budget.ts +94 -0
  137. package/scripts/epic/epic-cli-argv.ts +2 -2
  138. package/scripts/epic/epic-fetch.ts +4 -2
  139. package/scripts/epic/epic-graph.ts +7 -2
  140. package/scripts/epic/epic-issue.ts +3 -1
  141. package/scripts/epic/epic-rank.ts +5 -0
  142. package/scripts/exports/unused-members-check.ts +62 -0
  143. package/scripts/exports/unused-members-cli.ts +6 -51
  144. package/scripts/followup/followup-ci-path.ts +67 -0
  145. package/scripts/followup/followup-coderabbit-retrigger.ts +261 -0
  146. package/scripts/followup/followup-coderabbit-wait.ts +13 -10
  147. package/scripts/followup/followup-failed-tests.ts +160 -0
  148. package/scripts/followup/followup-job-needs.ts +100 -0
  149. package/scripts/followup/followup-job-rerun.ts +303 -0
  150. package/scripts/followup/followup-main-move.ts +113 -0
  151. package/scripts/followup/git-followup-finish.ts +43 -11
  152. package/scripts/followup/git-followup-pending.ts +3 -3
  153. package/scripts/followup/git-followup-stages.ts +41 -11
  154. package/scripts/followup/git-pr-followup-checks.ts +55 -16
  155. package/scripts/followup/git-pr-followup-wrapup.ts +24 -5
  156. package/scripts/followup/git-pr-followup.ts +62 -27
  157. package/scripts/fresh-machine/fresh-machine-script.ts +5 -9
  158. package/scripts/fresh-machine/specs/kit-test-backlogrun-python.json +2 -2
  159. package/scripts/fresh-machine/specs/kit-test-backlogrun.json +2 -2
  160. package/scripts/gate/busy-average.ts +34 -2
  161. package/scripts/gate/check-related-pinned.ts +43 -0
  162. package/scripts/gate/check-related-reuse.ts +64 -0
  163. package/scripts/gate/check-related-section.ts +57 -0
  164. package/scripts/gate/check-related-unplanned.ts +34 -0
  165. package/scripts/gate/check-related.ts +265 -0
  166. package/scripts/gate/command-memory.ts +1 -1
  167. package/scripts/gate/core-admission.ts +24 -6
  168. package/scripts/gate/core-budget-timing.ts +20 -6
  169. package/scripts/gate/core-budget.ts +40 -11
  170. package/scripts/gate/core-wait-record.ts +3 -2
  171. package/scripts/gate/core-wait.ts +25 -2
  172. package/scripts/gate/core-weights.ts +15 -7
  173. package/scripts/gate/gate-labels.ts +46 -0
  174. package/scripts/gate/gate-ledger.ts +14 -6
  175. package/scripts/gate/gate-plan.ts +103 -58
  176. package/scripts/gate/gate-report.ts +9 -7
  177. package/scripts/gate/gate-run-steps.ts +26 -3
  178. package/scripts/gate/gate-skip.ts +45 -6
  179. package/scripts/gate/gate-static-group.ts +60 -0
  180. package/scripts/gate/gate-steps.ts +2 -1
  181. package/scripts/gate/gate-tree.ts +4 -2
  182. package/scripts/gate/hook-gate-reuse.ts +19 -2
  183. package/scripts/gate/metrics-totals.ts +59 -0
  184. package/scripts/gate/scoped-green.ts +68 -15
  185. package/scripts/gate/since-green.ts +14 -6
  186. package/scripts/gate/structural-checks.ts +96 -0
  187. package/scripts/gate/verification-gate.ts +51 -16
  188. package/scripts/gate/verification-inputs.ts +21 -6
  189. package/scripts/gate/verification-tail.ts +52 -0
  190. package/scripts/gh/gh-author-association.ts +23 -2
  191. package/scripts/gh/git-ai-review-scan.ts +1 -1
  192. package/scripts/gh/git-gh-api-path.ts +12 -3
  193. package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
  194. package/scripts/gh/git-gh-exec.ts +32 -2
  195. package/scripts/gh/git-gh-issue-read.ts +4 -2
  196. package/scripts/gh/git-gh-issue-rest.ts +1 -0
  197. package/scripts/gh/git-gh-issue-write.ts +8 -2
  198. package/scripts/gh/git-gh-issue.ts +12 -5
  199. package/scripts/gh/git-gh-pr-auto-merge.ts +13 -6
  200. package/scripts/gh/git-gh-pr-graphql-state.ts +56 -0
  201. package/scripts/gh/git-gh-pr-read.ts +74 -13
  202. package/scripts/gh/git-gh-pr-rest.ts +3 -1
  203. package/scripts/gh/git-gh-pr-snapshot.ts +22 -7
  204. package/scripts/gh/git-gh-pr-too-large.ts +20 -0
  205. package/scripts/gh/git-gh-pr.ts +21 -7
  206. package/scripts/gh/git-gh-retry.ts +141 -0
  207. package/scripts/gh/git-pr-ai-review.ts +15 -6
  208. package/scripts/gh/git-pr-checks-eval.ts +3 -0
  209. package/scripts/gh/git-pr-checks.ts +5 -5
  210. package/scripts/git/base-tree.ts +30 -0
  211. package/scripts/git/change-base.ts +4 -10
  212. package/scripts/git/changed-paths-sync.ts +63 -0
  213. package/scripts/git/changed-paths.ts +16 -1
  214. package/scripts/git/git-common-directory.ts +11 -1
  215. package/scripts/git/git-diff-reads.ts +66 -20
  216. package/scripts/git/git-error.ts +9 -2
  217. package/scripts/git/git-schemas.ts +13 -0
  218. package/scripts/git/git-worktree.ts +13 -0
  219. package/scripts/git/gone-branch.ts +4 -1
  220. package/scripts/git/main-merge-budget-conflict.ts +89 -0
  221. package/scripts/git/main-merge-guard.ts +55 -18
  222. package/scripts/git/main-merge-regenerate.ts +59 -25
  223. package/scripts/git/main-merge.ts +53 -5
  224. package/scripts/git/no-base-checkout.ts +127 -0
  225. package/scripts/git/stash/git-stash.ts +11 -2
  226. package/scripts/git/stash/stash-push-cli.ts +10 -0
  227. package/scripts/hooks/batch-guard.ts +40 -21
  228. package/scripts/hooks/edited-cspell.ts +37 -11
  229. package/scripts/hooks/format-edited-file.ts +22 -2
  230. package/scripts/hooks/lane-plan-guard.ts +50 -0
  231. package/scripts/hooks/pre-commit-lint-switch.ts +9 -0
  232. package/scripts/hooks/pre-commit-lint.ts +14 -1
  233. package/scripts/hooks/pre-push-related-switch.ts +10 -0
  234. package/scripts/hooks/pre-push-unit.ts +76 -10
  235. package/scripts/hooks/pretool-guard.ts +2 -0
  236. package/scripts/hooks/reserved-run.ts +14 -1
  237. package/scripts/hooks/run-hook.sh +23 -8
  238. package/scripts/hooks/step-zero-notice.ts +6 -1
  239. package/scripts/hooks/stop-actions.ts +3 -15
  240. package/scripts/hooks/stop-guard.ts +7 -6
  241. package/scripts/init/distributed-paths.ts +1 -0
  242. package/scripts/init/hook-command-rewrite.ts +5 -1
  243. package/scripts/init/hook-launch.ts +4 -2
  244. package/scripts/issue/aggregation-split.ts +52 -0
  245. package/scripts/issue/defect-origin-line.ts +19 -1
  246. package/scripts/issue/defect-rate-cli.ts +5 -102
  247. package/scripts/issue/defect-report.ts +4 -4
  248. package/scripts/issue/effect-audit-cli.ts +178 -0
  249. package/scripts/issue/effect-audit.ts +185 -0
  250. package/scripts/issue/expected-effect-lint.ts +64 -9
  251. package/scripts/issue/git-next-issues.ts +5 -0
  252. package/scripts/issue/issue-body-or-comment.ts +38 -4
  253. package/scripts/issue/issue-cite-cli.ts +1 -3
  254. package/scripts/issue/issue-classification.ts +1 -0
  255. package/scripts/issue/issue-closing-pr.ts +8 -1
  256. package/scripts/issue/issue-evidence-exit.ts +4 -2
  257. package/scripts/issue/issue-file-cap.ts +58 -0
  258. package/scripts/issue/issue-file-cli.ts +111 -38
  259. package/scripts/issue/issue-file-deferral.ts +52 -0
  260. package/scripts/issue/issue-file-fold.ts +29 -10
  261. package/scripts/issue/issue-file-interrupt.ts +85 -0
  262. package/scripts/issue/issue-file-lane-hint.ts +30 -0
  263. package/scripts/issue/issue-file.ts +43 -6
  264. package/scripts/issue/issue-labels.ts +19 -2
  265. package/scripts/issue/issue-lint-cli.ts +27 -2
  266. package/scripts/issue/issue-measured-cli.ts +13 -35
  267. package/scripts/issue/issue-measured-close.ts +58 -0
  268. package/scripts/issue/issue-not-before-label.ts +2 -2
  269. package/scripts/issue/issue-not-before.ts +4 -1
  270. package/scripts/issue/issue-priority-cli.ts +60 -0
  271. package/scripts/issue/issue-priority-raise.ts +55 -0
  272. package/scripts/issue/issue-priority.ts +174 -43
  273. package/scripts/issue/issue-rank.ts +21 -4
  274. package/scripts/issue/issue-read-cli.ts +32 -6
  275. package/scripts/issue/issue-read.ts +37 -12
  276. package/scripts/issue/issue-sample-gate.ts +95 -74
  277. package/scripts/issue/issue-sample-prime.ts +127 -0
  278. package/scripts/issue/issue-sample-required.ts +57 -0
  279. package/scripts/issue/issue-sample-source.ts +12 -11
  280. package/scripts/issue/issue-search.ts +124 -0
  281. package/scripts/issue/issue-state.ts +13 -1
  282. package/scripts/issue/issue-template-section.ts +43 -0
  283. package/scripts/issue/issue-watch-diff.ts +31 -1
  284. package/scripts/issue/issue-watch-hook.ts +11 -2
  285. package/scripts/issue/issue-watch.ts +55 -12
  286. package/scripts/issue/markdown-section.ts +1 -0
  287. package/scripts/issue/measure-declaration.ts +121 -0
  288. package/scripts/issue/measure-rerun-cli.ts +7 -70
  289. package/scripts/issue/plan-consumers-section.ts +22 -1
  290. package/scripts/issue/reproduction-measure.ts +3 -1
  291. package/scripts/issue/size-estimate.ts +90 -0
  292. package/scripts/issue/trusted-measure.ts +84 -0
  293. package/scripts/josh/command-usage.ts +3 -2
  294. package/scripts/josh/durable-state-migrate.ts +105 -0
  295. package/scripts/josh/durable-state.ts +112 -0
  296. package/scripts/josh/josh-aliases.ts +95 -0
  297. package/scripts/josh/josh-command-map.ts +1 -82
  298. package/scripts/josh/josh-commands-agent-hooks.ts +6 -6
  299. package/scripts/josh/josh-commands-ai.ts +5 -5
  300. package/scripts/josh/josh-commands-development.ts +59 -58
  301. package/scripts/josh/josh-commands-issue-write.ts +23 -4
  302. package/scripts/josh/josh-commands-issue.ts +32 -0
  303. package/scripts/josh/josh-commands-lane.ts +87 -4
  304. package/scripts/josh/josh-commands-lint.ts +16 -3
  305. package/scripts/josh/josh-commands-maintenance.ts +15 -0
  306. package/scripts/josh/josh-commands-review.ts +41 -6
  307. package/scripts/josh/josh-commands-ship.ts +56 -8
  308. package/scripts/josh/josh-commands-test-check.ts +80 -0
  309. package/scripts/josh/josh-commands-workflow.ts +1 -1
  310. package/scripts/josh/josh-environment-file.ts +43 -3
  311. package/scripts/josh/josh-in-process.ts +2 -2
  312. package/scripts/josh/josh-logic.ts +5 -3
  313. package/scripts/josh/josh-run.ts +19 -1
  314. package/scripts/josh/run-record-path.ts +15 -0
  315. package/scripts/josh/stamp-file.ts +11 -2
  316. package/scripts/lane/lane-adopt-cli.ts +98 -0
  317. package/scripts/lane/lane-adopt.ts +208 -0
  318. package/scripts/lane/lane-await.ts +5 -8
  319. package/scripts/lane/lane-baseline.ts +123 -0
  320. package/scripts/lane/lane-breakdown-cli.ts +64 -0
  321. package/scripts/lane/lane-breakdown-implement.ts +170 -0
  322. package/scripts/lane/lane-breakdown-laps.ts +107 -0
  323. package/scripts/lane/lane-breakdown-pinned.ts +76 -0
  324. package/scripts/lane/lane-breakdown-text.ts +145 -0
  325. package/scripts/lane/lane-breakdown.ts +239 -0
  326. package/scripts/lane/lane-check-stats.ts +29 -8
  327. package/scripts/lane/lane-child-invocation.ts +9 -2
  328. package/scripts/lane/lane-child-mark-keys.ts +12 -0
  329. package/scripts/lane/lane-child-marker.ts +20 -1
  330. package/scripts/lane/lane-ci-path-stats.ts +73 -0
  331. package/scripts/lane/lane-claim-stats.ts +84 -0
  332. package/scripts/lane/lane-close.ts +8 -3
  333. package/scripts/lane/lane-dispatch-log.ts +3 -3
  334. package/scripts/lane/lane-dispatch.ts +2 -2
  335. package/scripts/lane/lane-gap-stats.ts +7 -6
  336. package/scripts/lane/lane-guard-policy.ts +7 -1
  337. package/scripts/lane/lane-implement-stats.ts +207 -0
  338. package/scripts/lane/lane-implement-subagents.ts +90 -0
  339. package/scripts/lane/lane-investigation-switch.ts +16 -0
  340. package/scripts/lane/lane-ledger-kind.ts +31 -0
  341. package/scripts/lane/lane-ledger-schema-ship.ts +49 -0
  342. package/scripts/lane/lane-ledger-schema.ts +119 -36
  343. package/scripts/lane/lane-ledger-write.ts +257 -0
  344. package/scripts/lane/lane-ledger.ts +31 -177
  345. package/scripts/lane/lane-load.ts +1 -1
  346. package/scripts/lane/lane-measure-cli.ts +176 -59
  347. package/scripts/lane/lane-net-read.ts +44 -0
  348. package/scripts/lane/lane-net-time.ts +212 -0
  349. package/scripts/lane/lane-open.ts +16 -7
  350. package/scripts/lane/lane-output.ts +2 -4
  351. package/scripts/lane/lane-overrun-prompt.ts +147 -0
  352. package/scripts/lane/lane-overrun.ts +274 -0
  353. package/scripts/lane/lane-paths.ts +24 -1
  354. package/scripts/lane/lane-pause-cli.ts +4 -1
  355. package/scripts/lane/lane-paused-spans.ts +97 -0
  356. package/scripts/lane/lane-plan-check.ts +207 -0
  357. package/scripts/lane/lane-plan-cli.ts +41 -0
  358. package/scripts/lane/lane-plan.ts +144 -0
  359. package/scripts/lane/lane-registry.ts +14 -1
  360. package/scripts/lane/lane-relaunch.ts +1 -1
  361. package/scripts/lane/lane-round-one-stats.ts +51 -0
  362. package/scripts/lane/lane-sampler.ts +23 -4
  363. package/scripts/lane/lane-session-action.ts +93 -18
  364. package/scripts/lane/lane-session-broker.ts +49 -21
  365. package/scripts/lane/lane-session-reread-main.ts +14 -0
  366. package/scripts/lane/lane-session-reread.ts +51 -0
  367. package/scripts/lane/lane-ship-lap-stats.ts +74 -0
  368. package/scripts/lane/lane-sleep.ts +58 -0
  369. package/scripts/lane/lane-spent.ts +1 -1
  370. package/scripts/lane/lane-split-stats.ts +28 -0
  371. package/scripts/lane/lane-stage-stats.ts +13 -1
  372. package/scripts/lane/lane-state.ts +41 -9
  373. package/scripts/lane/lane-stats-tables.ts +58 -0
  374. package/scripts/lane/lane-stats.ts +21 -5
  375. package/scripts/lane/lane-stop-stats.ts +51 -19
  376. package/scripts/lane/lane-tail-stats.ts +32 -0
  377. package/scripts/lane/lane-transcript-calls.ts +67 -10
  378. package/scripts/lane/lane-transcript-stats.ts +44 -12
  379. package/scripts/lane/lane-value-cell.ts +72 -0
  380. package/scripts/lane/lane-value.ts +118 -0
  381. package/scripts/lane/lane-withdraw-closed.ts +124 -0
  382. package/scripts/lane/lane-withdraw.ts +108 -31
  383. package/scripts/lane/lane-yield.ts +85 -0
  384. package/scripts/lane/openai-lane-ship.ts +12 -11
  385. package/scripts/lane/openai-lane-supervisor-decision.ts +6 -8
  386. package/scripts/lane/openai-lane-supervisor-owner.ts +5 -8
  387. package/scripts/lane/openai-lane-supervisor.ts +5 -4
  388. package/scripts/lib/poll.ts +38 -9
  389. package/scripts/lib/settled-together.ts +10 -0
  390. package/scripts/lib/shell-quote.ts +21 -0
  391. package/scripts/lib/token-shape.ts +111 -0
  392. package/scripts/lint/eslint-daemon-sources.ts +79 -0
  393. package/scripts/lint/eslint-daemon.ts +45 -6
  394. package/scripts/lint/eslint-warm-cli.ts +7 -0
  395. package/scripts/lint/eslint-warm.ts +66 -0
  396. package/scripts/lint/import-graph.ts +141 -11
  397. package/scripts/lint/lint-gate-scope.ts +2 -2
  398. package/scripts/lint/lint-parallel.ts +54 -6
  399. package/scripts/lint/lint-related.ts +154 -33
  400. package/scripts/lint/rename-cli.ts +179 -0
  401. package/scripts/lint/rename-identifier.ts +192 -0
  402. package/scripts/lint/type-only-imports.ts +58 -0
  403. package/scripts/notify/telegram-notify.ts +12 -3
  404. package/scripts/observations/observation-record.ts +42 -16
  405. package/scripts/observations/observations-flush.ts +32 -9
  406. package/scripts/overrides/overrides-check.ts +9 -1
  407. package/scripts/release/release-approval-prune.ts +7 -1
  408. package/scripts/repo/required-checks-logic.ts +4 -1
  409. package/scripts/repo/ruleset-check.ts +4 -3
  410. package/scripts/report/markdown-shape.ts +28 -0
  411. package/scripts/report/report-format-reference.ts +15 -1
  412. package/scripts/report/report-labels.ts +12 -1
  413. package/scripts/report/report-lint-child-summary.ts +94 -0
  414. package/scripts/report/report-lint-cli.ts +26 -7
  415. package/scripts/report/report-lint.ts +2 -20
  416. package/scripts/review/prose-stale-cli.ts +88 -0
  417. package/scripts/review/prose-stale-scan.ts +152 -0
  418. package/scripts/review/review-attest.ts +73 -23
  419. package/scripts/review/review-brief-cli.ts +68 -19
  420. package/scripts/review/review-brief-paths.ts +22 -0
  421. package/scripts/review/review-brief.ts +14 -7
  422. package/scripts/review/review-comment-carry.ts +47 -0
  423. package/scripts/review/review-comment-round.ts +85 -22
  424. package/scripts/review/review-finding-ledger.ts +109 -7
  425. package/scripts/review/review-finding-text.ts +43 -0
  426. package/scripts/review/review-interaction.ts +11 -0
  427. package/scripts/review/review-lane-handover.ts +68 -0
  428. package/scripts/review/review-lint-cli.ts +57 -0
  429. package/scripts/review/review-lint-findings.ts +92 -0
  430. package/scripts/review/review-lint-sections.ts +80 -0
  431. package/scripts/review/review-lint.ts +221 -0
  432. package/scripts/review/review-prior-findings.ts +102 -0
  433. package/scripts/review/review-readers-scan.ts +4 -2
  434. package/scripts/review/review-record-cli.ts +177 -54
  435. package/scripts/review/review-record-code-round.ts +55 -0
  436. package/scripts/review/review-record-comment.ts +60 -0
  437. package/scripts/review/review-record-interaction.ts +35 -0
  438. package/scripts/review/review-record-pinned.ts +108 -0
  439. package/scripts/review/review-record.ts +25 -1
  440. package/scripts/review/review-reviewed-tree.ts +307 -0
  441. package/scripts/review/review-round-one-closure.ts +62 -0
  442. package/scripts/review/review-round-reuse.ts +106 -0
  443. package/scripts/review/review-round2-cli.ts +91 -29
  444. package/scripts/review/review-round2-skip-comment.ts +55 -0
  445. package/scripts/review/review-round2.ts +24 -8
  446. package/scripts/review/review-stamps.ts +7 -3
  447. package/scripts/review/review-stop-log.ts +20 -6
  448. package/scripts/review/review-stops-cli.ts +2 -1
  449. package/scripts/review/review-submit-cli.ts +101 -0
  450. package/scripts/rules/agent-model.ts +1 -1
  451. package/scripts/rules/bash-triggers.ts +3 -3
  452. package/scripts/rules/concise-reply.ts +88 -0
  453. package/scripts/rules/credential-body.ts +77 -0
  454. package/scripts/rules/decision-oracle.ts +1 -1
  455. package/scripts/rules/delivered-rules.ts +36 -17
  456. package/scripts/rules/destructive-command.ts +3 -11
  457. package/scripts/rules/direct-issue-comment.ts +34 -12
  458. package/scripts/rules/direct-issue-read.ts +191 -0
  459. package/scripts/rules/direct-pr-create.ts +4 -24
  460. package/scripts/rules/early-heartbeat.ts +2 -0
  461. package/scripts/rules/edit-tool.ts +27 -0
  462. package/scripts/rules/file-edit-rows.ts +17 -0
  463. package/scripts/rules/file-rewrite.ts +146 -0
  464. package/scripts/rules/firing-point.ts +3 -2
  465. package/scripts/rules/gh-api.ts +128 -7
  466. package/scripts/rules/gh-repo-selector.ts +84 -0
  467. package/scripts/rules/git-force.ts +2 -2
  468. package/scripts/rules/guard-remedy.ts +14 -5
  469. package/scripts/rules/implementation-cut.ts +61 -28
  470. package/scripts/rules/investigator-foreground.ts +231 -0
  471. package/scripts/rules/issue-citation.ts +15 -60
  472. package/scripts/rules/issue-comments.ts +9 -4
  473. package/scripts/rules/josh-git-bare.ts +1 -1
  474. package/scripts/rules/lane-background.ts +41 -13
  475. package/scripts/rules/lane-direct-tool.ts +107 -9
  476. package/scripts/rules/lane-interactive-ask.ts +4 -1
  477. package/scripts/rules/lane-park.ts +4 -2
  478. package/scripts/rules/lane-spilled-read.ts +90 -0
  479. package/scripts/rules/lane-split-park.ts +1 -1
  480. package/scripts/rules/lane-switch-main.ts +4 -4
  481. package/scripts/rules/last-prompt.ts +20 -47
  482. package/scripts/rules/oracle-consulted.ts +1 -1
  483. package/scripts/rules/permission-guards.ts +5 -1
  484. package/scripts/rules/piped-verification-shapes.ts +110 -0
  485. package/scripts/rules/piped-verification.ts +67 -17
  486. package/scripts/rules/poll-loop.ts +72 -9
  487. package/scripts/rules/pr-merge.ts +5 -5
  488. package/scripts/rules/pre-gate-cut.ts +3 -3
  489. package/scripts/rules/protected-files.ts +88 -24
  490. package/scripts/rules/reply-language.ts +3 -17
  491. package/scripts/rules/reply-prose.ts +34 -0
  492. package/scripts/rules/repo-admin.ts +132 -0
  493. package/scripts/rules/reviewer-foreground.ts +88 -0
  494. package/scripts/rules/round-one-check-related.ts +120 -0
  495. package/scripts/rules/rule-body-guard.ts +5 -15
  496. package/scripts/rules/rule-value-cache.ts +53 -5
  497. package/scripts/rules/rule-value-candidates.ts +84 -0
  498. package/scripts/rules/rule-value-cli.ts +59 -11
  499. package/scripts/rules/rule-value.ts +17 -4
  500. package/scripts/rules/run-tail-rule.ts +1 -1
  501. package/scripts/rules/sed-in-place.ts +196 -0
  502. package/scripts/rules/shell-segments.ts +10 -2
  503. package/scripts/rules/stop-rule-rows.ts +1 -13
  504. package/scripts/rules/stop-rules.ts +33 -58
  505. package/scripts/rules/test-declared-commit.ts +1 -1
  506. package/scripts/rules/third-party-write.ts +110 -23
  507. package/scripts/rules/timed-rerun.ts +1 -1
  508. package/scripts/rules/turn-filings.ts +90 -0
  509. package/scripts/rules/worktree-guard.ts +22 -7
  510. package/scripts/run/board/run-board-ending-reason.ts +6 -2
  511. package/scripts/run/board/run-board-fit.ts +24 -1
  512. package/scripts/run/board/run-board-found.ts +134 -0
  513. package/scripts/run/board/run-board-header.ts +8 -0
  514. package/scripts/run/board/run-board-labels.ts +11 -1
  515. package/scripts/run/board/run-board-lane-time.ts +1 -0
  516. package/scripts/run/board/run-board-link.ts +15 -2
  517. package/scripts/run/board/run-board-notes.ts +7 -1
  518. package/scripts/run/board/run-board-operation.ts +4 -2
  519. package/scripts/run/board/run-board-phase.ts +2 -5
  520. package/scripts/run/board/run-board-plan.ts +1 -1
  521. package/scripts/run/board/run-board-read.ts +46 -1
  522. package/scripts/run/board/run-board-reason.ts +20 -8
  523. package/scripts/run/board/run-board-render-checks.ts +3 -2
  524. package/scripts/run/board/run-board-render-drawn.ts +11 -0
  525. package/scripts/run/board/run-board-render-found.ts +157 -0
  526. package/scripts/run/board/run-board-render-lead.ts +9 -0
  527. package/scripts/run/board/run-board-render-legend.ts +19 -0
  528. package/scripts/run/board/run-board-render-tail.ts +1 -1
  529. package/scripts/run/board/run-board-render.ts +82 -18
  530. package/scripts/run/board/run-board-spin.ts +1 -3
  531. package/scripts/run/board/run-board-status.ts +2 -0
  532. package/scripts/run/board/run-board-tick.ts +39 -10
  533. package/scripts/run/carry/run-carry-ended.ts +3 -2
  534. package/scripts/run/carry/run-carry.ts +3 -2
  535. package/scripts/run/cut/run-cut-cli.ts +33 -133
  536. package/scripts/run/cut/run-cut-digest.ts +152 -0
  537. package/scripts/run/cut/run-cut-handoff.ts +52 -8
  538. package/scripts/run/cut/run-cut-report.ts +24 -3
  539. package/scripts/run/cut/run-cut-resume.ts +129 -0
  540. package/scripts/run/cut/run-cut-review.ts +105 -0
  541. package/scripts/run/cut/run-cut.ts +18 -7
  542. package/scripts/run/detached-launch.ts +1 -1
  543. package/scripts/run/entry/run-entry-cli.ts +88 -19
  544. package/scripts/run/entry/run-entry-spill.ts +83 -0
  545. package/scripts/run/entry/run-entry-stop.ts +5 -1
  546. package/scripts/run/entry/run-entry-trust.ts +91 -0
  547. package/scripts/run/event/run-event-baseline.ts +56 -0
  548. package/scripts/run/event/run-event-filed.ts +9 -3
  549. package/scripts/run/event/run-event-overrun.ts +197 -0
  550. package/scripts/run/event/run-event-render.ts +4 -0
  551. package/scripts/run/event/run-event-stream.ts +25 -3
  552. package/scripts/run/hold/run-stop-notify.ts +3 -8
  553. package/scripts/run/merge/run-merge-cap.ts +57 -0
  554. package/scripts/run/merge/run-merge-cli.ts +66 -23
  555. package/scripts/run/merge/run-merge-outcome.ts +2 -0
  556. package/scripts/run/merge/run-merge-ship.ts +13 -3
  557. package/scripts/run/merge/run-merge-signals.ts +40 -23
  558. package/scripts/run/merge/run-merge-steps.ts +56 -36
  559. package/scripts/run/merge/run-merge-usage-limit.ts +53 -0
  560. package/scripts/run/merge/run-merge-withdrawn.ts +53 -0
  561. package/scripts/run/merge/run-merge.ts +41 -14
  562. package/scripts/run/review/run-review-cli.ts +306 -20
  563. package/scripts/run/review/run-review-early-push.ts +121 -0
  564. package/scripts/run/review/run-review-join-read.ts +94 -0
  565. package/scripts/run/review/run-review-pinned-accepted.ts +126 -0
  566. package/scripts/run/review/run-review-pinned-join.ts +216 -0
  567. package/scripts/run/review/run-review-pinned-steps.ts +383 -0
  568. package/scripts/run/review/run-review-pinned-tree.ts +37 -0
  569. package/scripts/run/review/run-review-pinned.ts +53 -0
  570. package/scripts/run/review/run-review-steps.ts +70 -34
  571. package/scripts/run/review/run-review.ts +26 -6
  572. package/scripts/run/run-parent-cut-hook.ts +3 -4
  573. package/scripts/run/run-prep.ts +1 -0
  574. package/scripts/run/run-stage-read.ts +2 -6
  575. package/scripts/run/run-step-cli.ts +17 -5
  576. package/scripts/run/run-step-lane-plan.ts +27 -0
  577. package/scripts/run/run-step-section.ts +26 -7
  578. package/scripts/run/run-step.ts +5 -2
  579. package/scripts/run/ship/run-ship-args.ts +19 -0
  580. package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
  581. package/scripts/run/ship/run-ship-cli.ts +131 -39
  582. package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
  583. package/scripts/run/ship/run-ship-detach.ts +10 -4
  584. package/scripts/run/ship/run-ship-handover.ts +106 -0
  585. package/scripts/run/ship/run-ship-infra-retry.ts +16 -1
  586. package/scripts/run/ship/run-ship-lap.ts +63 -0
  587. package/scripts/run/ship/run-ship-next.ts +27 -26
  588. package/scripts/run/ship/run-ship-overlap.ts +8 -3
  589. package/scripts/run/ship/run-ship-place.ts +9 -2
  590. package/scripts/run/ship/run-ship-planned.ts +92 -0
  591. package/scripts/run/ship/run-ship-pre-detach-pinned.ts +197 -0
  592. package/scripts/run/ship/run-ship-pre-detach-timed.ts +7 -8
  593. package/scripts/run/ship/run-ship-pre-detach.ts +77 -23
  594. package/scripts/run/ship/run-ship-preflight.ts +16 -4
  595. package/scripts/run/ship/run-ship-probe.ts +23 -9
  596. package/scripts/run/ship/run-ship-relaunch-cap.ts +43 -7
  597. package/scripts/run/ship/run-ship-relaunch.ts +51 -0
  598. package/scripts/run/ship/run-ship-return.ts +103 -29
  599. package/scripts/run/ship/run-ship-review-reason.ts +24 -0
  600. package/scripts/run/ship/run-ship-review-steps.ts +230 -59
  601. package/scripts/run/ship/run-ship-review.ts +171 -51
  602. package/scripts/run/ship/run-ship-reviewer.ts +138 -42
  603. package/scripts/run/ship/run-ship-scoped.ts +39 -10
  604. package/scripts/run/ship/run-ship-stage.ts +49 -13
  605. package/scripts/run/ship/run-ship-steps.ts +24 -4
  606. package/scripts/run/ship/run-ship-stop-cause.ts +43 -2
  607. package/scripts/run/ship/run-ship-stop-context.ts +50 -13
  608. package/scripts/run/ship/run-ship-sync.ts +171 -30
  609. package/scripts/run/ship/run-ship-synced-scope.ts +178 -0
  610. package/scripts/run/ship/run-ship-wait-cli.ts +145 -0
  611. package/scripts/run/ship/run-ship-waiter.ts +114 -0
  612. package/scripts/run/ship/run-ship.ts +16 -2
  613. package/scripts/run/wake/run-wake-caffeinate.ts +48 -0
  614. package/scripts/run/wake/run-wake-cli.ts +6 -113
  615. package/scripts/run/wake/run-wake-code.ts +53 -11
  616. package/scripts/run/wake/run-wake-driver.ts +5 -3
  617. package/scripts/run/wake/run-wake-finish.ts +137 -0
  618. package/scripts/run/wake/run-wake-loop.ts +5 -3
  619. package/scripts/run/wake/run-wake-ports.ts +11 -3
  620. package/scripts/run/wake/run-wake-session.ts +2 -0
  621. package/scripts/run/wake/run-wake.ts +3 -2
  622. package/scripts/safe-chain/ci-installer-pin.ts +49 -8
  623. package/scripts/safe-chain/project-config.ts +3 -2
  624. package/scripts/security/secretlint-scan.ts +42 -9
  625. package/scripts/security/security-audit-provision-main.ts +9 -1
  626. package/scripts/security/security-audit-provision.ts +1 -1
  627. package/scripts/security/security-audit.ts +21 -1
  628. package/scripts/security/sonar-file.ts +10 -5
  629. package/scripts/split/split-assess.ts +12 -3
  630. package/scripts/split/split-early-notice.ts +116 -0
  631. package/scripts/split/split-measure.ts +20 -2
  632. package/scripts/split/split-resolution.ts +107 -0
  633. package/scripts/test/direct-importers.ts +185 -0
  634. package/scripts/test/pure-files-entries.ts +83 -0
  635. package/scripts/test/related-heavy-tests.ts +81 -0
  636. package/scripts/test/test-no-base.ts +88 -0
  637. package/scripts/test/test-pinned-cache-logic.ts +363 -0
  638. package/scripts/test/test-pinned-cache.ts +337 -0
  639. package/scripts/test/test-pinned-emit.ts +49 -0
  640. package/scripts/test/test-pinned-functions.ts +116 -0
  641. package/scripts/test/test-pinned-ledger.ts +80 -0
  642. package/scripts/test/test-pinned-logic.ts +208 -20
  643. package/scripts/test/test-pinned-main.ts +84 -18
  644. package/scripts/test/test-pinned-pool.ts +73 -0
  645. package/scripts/test/test-pinned-probe.ts +254 -0
  646. package/scripts/test/test-pinned-prune-logic.ts +118 -0
  647. package/scripts/test/test-pinned-reach.ts +194 -0
  648. package/scripts/test/test-pinned-record.ts +196 -0
  649. package/scripts/test/test-pinned-rewire.ts +148 -0
  650. package/scripts/test/test-pinned-spawn.ts +81 -0
  651. package/scripts/test/test-pinned-stage.ts +70 -0
  652. package/scripts/test/test-pinned.ts +258 -47
  653. package/scripts/test/test-reach-cli.ts +61 -0
  654. package/scripts/test/test-read-map.ts +35 -11
  655. package/scripts/test/test-read-recording.ts +17 -5
  656. package/scripts/test/test-read-trace.ts +26 -8
  657. package/scripts/test/test-red-logic.ts +46 -7
  658. package/scripts/test/test-red.ts +34 -14
  659. package/scripts/test/test-related-claim.ts +37 -0
  660. package/scripts/test/test-related-main.ts +4 -1
  661. package/scripts/test/test-related-moved.ts +91 -0
  662. package/scripts/test/test-related-record.ts +43 -23
  663. package/scripts/test/test-related-scope.ts +99 -34
  664. package/scripts/test/test-related-synced.ts +135 -0
  665. package/scripts/test/test-related-touched.ts +84 -0
  666. package/scripts/test/test-related.ts +167 -83
  667. package/scripts/test/test-unit-guard.ts +28 -5
  668. package/scripts/test/unit-durations.ts +41 -0
  669. package/scripts/test/unit-worker-share.ts +5 -4
  670. package/scripts/test/vitest-cache-directory.ts +19 -0
  671. package/scripts/test/vitest-cli-excludes.ts +14 -0
  672. package/scripts/test/vitest-failure-summary.ts +111 -0
  673. package/scripts/test/whole-suite-files.ts +12 -1
  674. package/scripts/time-runtime/time-batch-guard.ts +42 -4
  675. package/scripts/time-runtime/time-bundle-call.ts +1 -1
  676. package/scripts/time-runtime/time-bundles.ts +36 -5
  677. package/scripts/time-runtime/time-markers.ts +2 -2
  678. package/scripts/time-runtime/time-search-call.ts +38 -0
  679. package/scripts/time-runtime/time-shell.ts +1 -1
  680. package/scripts/time-runtime/time-transcript-line.ts +17 -5
  681. package/scripts/version/development-engines-verdict.ts +124 -0
  682. package/scripts/version/latest-corepack.ts +2 -0
  683. package/templates/gitignore +2 -0
  684. package/templates/workflows/ci.yml +41 -0
  685. package/dist/hooks/chunk-AZX4FGQ3.js +0 -207
  686. package/dist/hooks/chunk-PT5R6UJD.js +0 -7131
  687. package/dist/hooks/chunk-TUIFS5E7.js +0 -72
  688. package/dist/hooks/chunk-YCDOIR3I.js +0 -3456
  689. package/scripts/cost-runtime/context-cut-threshold.ts +0 -11
  690. package/scripts/rules/filing-cap.ts +0 -139
@@ -1,170 +1,15 @@
1
- import { closeSync, constants, openSync, writeSync } from 'node:fs'
2
1
  import { stamp_file } from '#scripts/josh/stamp-file'
3
2
  import { json_value } from '#scripts/lib/json-value'
4
3
  import { stamped_memo } from '#scripts/lib/stamped-memo'
5
- import { run_carry } from '#scripts/run/carry/run-carry'
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'
19
-
20
- // The measurement ledger the lane limit is tuned against: one JSON line per
21
- // lane merge, per finished `josh gate`, per machine-load sample, per lane dispatch, per finished
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`.
24
- //
25
- // **Its own file rather than the run's event stream.** The stream is capped at 500 events and is
26
- // rewritten whole on every append, which is right for "where is the run" and wrong for a measurement
27
- // that spans days of one-a-minute load samples. This file is only ever appended to, so concurrent lanes
28
- // never lose each other's lines to a read-modify-write race.
29
- //
30
- // **Keyed on the common git directory, the event stream's key**, so a lane child's gate, the parent's
31
- // merge and the sampler all land in one ledger per repository. It sits in the temp root beside every
32
- // other josh record; a reboot clears it, which is why `docs/maintainers/lane-limit-measurement.md`
33
- // closes a period with `josh lane:stats` before one.
34
-
35
- const LEDGER_PREFIX = 'josh-lane-ledger-'
36
- const LEDGER_SUFFIX = '.jsonl'
37
- const LINE_SEPARATOR = '\n'
38
- // `followup`'s wait for CI — a stage of a lane's run that no `josh ship` stage is the whole of.
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'
47
- const LEDGER_FILE_MODE = 0o600
48
- // The flags `detached-launch.ts` appends its log with, for the same deterministic shared-temp path.
49
- const { O_APPEND, O_CREAT, O_NOFOLLOW, O_WRONLY } = constants
50
- // eslint-disable-next-line no-bitwise -- POSIX open flags are a bit field; `||` here would be a bug
51
- const APPEND_FLAGS = O_WRONLY | O_APPEND | O_CREAT | O_NOFOLLOW
52
-
53
- const { KIND, entry_schema } = lane_ledger_schema
54
-
55
- function target_of(repository: string): string {
56
- return stamp_file.stamp_path(LEDGER_PREFIX, repository, LEDGER_SUFFIX)
57
- }
58
-
59
- // The ledger of the repository this checkout belongs to, or `undefined` outside one. `git rev-parse`
60
- // rejects outside a repository, and `josh gate` resolves this before it runs a check, so the rejection
61
- // is read as "no ledger" rather than allowed to fail the gate it would only have measured.
62
- //
63
- // **A test run has no ledger either.** The writers sit on paths dozens of suites exercise — a ship
64
- // stage, a dispatch, a `followup` — and one suite that forgot to mock this module would append its
65
- // fixture durations to the real measurement; a test that writes passes its own path instead.
66
- async function target(): Promise<string | undefined> {
67
- if (process.env['VITEST'] !== undefined) return undefined
68
-
69
- try {
70
- const repository = await run_carry.repository_directory()
71
-
72
- return repository === undefined ? undefined : target_of(repository)
73
- } catch {
74
- return undefined
75
- }
76
- }
77
-
78
- // **Append, never rewrite** — `O_APPEND` keeps each short line whole across concurrent writers, and
79
- // `O_NOFOLLOW` plus `stamp_file`'s ownership test keep a planted link or another account's file from
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 {
82
- const descriptor = openSync(path, APPEND_FLAGS, LEDGER_FILE_MODE)
83
-
84
- try {
85
- if (stamp_file.is_own_regular_file(path)) {
86
- writeSync(descriptor, `${JSON.stringify(entry)}${LINE_SEPARATOR}`)
87
- }
88
- } finally {
89
- closeSync(descriptor)
90
- }
91
- }
4
+ import { lane_ledger_schema, type LedgerEntry } from './lane-ledger-schema'
5
+ import { lane_ledger_write } from './lane-ledger-write'
92
6
 
93
- // Best-effort: a measurement must never fail the gate or the merge it measures, so every error — no
94
- // repository, an unwritable temp root — is dropped.
95
- async function record(entry: LedgerEntry, path?: string): Promise<void> {
96
- try {
97
- const destination = path ?? (await target())
7
+ // The measurement ledger read back: every line `lane-ledger-write.ts` appended, for `josh lane:stats`,
8
+ // `lane:breakdown`, `run:board` and the other measurements. The writers import that leaf, never this
9
+ // module, so a change to the reading reaches only the suites that read (joshuafolkken/kit#5202).
98
10
 
99
- if (destination !== undefined) append(destination, entry)
100
- } catch {
101
- // Reporting is best-effort: a failed append is dropped rather than raised into the caller's work.
102
- }
103
- }
104
-
105
- function now_iso(): string {
106
- return new Date().toISOString()
107
- }
108
-
109
- // One finished `josh gate`, whether it passed or not — a failing gate cost the lane its time as well.
110
- async function record_gate(path: string, gate: GateRecord): Promise<void> {
111
- await record({ kind: KIND.GATE, at: now_iso(), ...gate }, path)
112
- }
113
-
114
- async function record_merge(issue: number): Promise<void> {
115
- await record({ kind: KIND.MERGE, at: now_iso(), issue })
116
- }
117
-
118
- async function record_dispatch(issue: number, path?: string): Promise<void> {
119
- await record({ kind: KIND.DISPATCH, at: now_iso(), issue }, path)
120
- }
121
-
122
- async function record_stage(stage: StageRecord, path?: string): Promise<void> {
123
- await record({ kind: KIND.STAGE, at: now_iso(), ...stage }, path)
124
- }
125
-
126
- async function record_stop(stop: StopRecord, path?: string): Promise<void> {
127
- await record({ kind: KIND.STOP, at: now_iso(), ...stop }, path)
128
- }
129
-
130
- async function record_overlap(overlap: OverlapRecord, path?: string): Promise<void> {
131
- await record({ kind: KIND.OVERLAP, at: now_iso(), ...overlap }, path)
132
- }
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
- }
11
+ const { entry_schema } = lane_ledger_schema
12
+ const { LINE_SEPARATOR } = lane_ledger_write
168
13
 
169
14
  function parse_line(line: string): LedgerEntry | undefined {
170
15
  return entry_schema.safeParse(json_value.parse_or_undefined(line)).data
@@ -194,28 +39,28 @@ function read_entries(path: string): ReadonlyArray<LedgerEntry> {
194
39
  return parsed_ledgers.of(path, stamped_memo.file_stamp(path), () => parse_entries(path))
195
40
  }
196
41
 
42
+ // The names a reader looks entries up by and the ledger it reads, the writer's own.
43
+ const {
44
+ CI_WAIT_STAGE,
45
+ CODERABBIT_RATE_LIMIT_STAGE,
46
+ CODERABBIT_RETRIGGER_STAGE,
47
+ CODERABBIT_WAIT_STAGE,
48
+ KIND,
49
+ PRE_DETACH_STAGE,
50
+ ROUND_ONE_REUSED,
51
+ target,
52
+ target_of,
53
+ } = lane_ledger_write
54
+
197
55
  const lane_ledger = {
198
56
  CI_WAIT_STAGE,
199
57
  CODERABBIT_RATE_LIMIT_STAGE,
58
+ CODERABBIT_RETRIGGER_STAGE,
200
59
  CODERABBIT_WAIT_STAGE,
201
60
  KIND,
202
61
  PRE_DETACH_STAGE,
203
- append,
62
+ ROUND_ONE_REUSED,
204
63
  read_entries,
205
- record,
206
- record_core_wait,
207
- record_dispatch,
208
- record_gate,
209
- record_held,
210
- record_released,
211
- record_merge,
212
- record_overlap,
213
- record_offerable,
214
- record_round_two,
215
- record_stage,
216
- record_stop,
217
- record_test_related,
218
- record_unit_files,
219
64
  target,
220
65
  target_of,
221
66
  }
@@ -227,19 +72,28 @@ export type {
227
72
  GateCheckRecord,
228
73
  GateEntry,
229
74
  HeldEntry,
75
+ LaneStateChangeEntry,
230
76
  LedgerEntry,
231
77
  LoadEntry,
232
78
  MergeEntry,
233
79
  OfferableEntry,
234
80
  OverlapEntry,
235
81
  OverlapRecord,
82
+ PushMissEntry,
83
+ RoundOneEntry,
236
84
  RoundTwoEntry,
85
+ ShipLapEntry,
86
+ SplitFiledEntry,
87
+ SplitNoticeEntry,
237
88
  StageEntry,
238
89
  StopEntry,
239
90
  StopRecord,
91
+ TestPinnedEntry,
92
+ TestPinnedRecord,
240
93
  TestRelatedEntry,
241
94
  TestRelatedRecord,
242
95
  UnitFileRecord,
243
96
  UnitFilesEntry,
97
+ UnplannedNoticeEntry,
244
98
  } from './lane-ledger-schema'
245
99
  export { lane_ledger }
@@ -1,7 +1,7 @@
1
1
  import { loadavg } from 'node:os'
2
2
  import { machine_capacity } from '#scripts/gate/machine-capacity'
3
3
  import { lane_await } from './lane-await'
4
- import type { LoadEntry } from './lane-ledger'
4
+ import type { LoadEntry } from './lane-ledger-schema'
5
5
  import { lane_process_load } from './lane-process-load'
6
6
  import { lane_registry, type LaneInfo } from './lane-registry'
7
7
 
@@ -2,27 +2,21 @@
2
2
  import { setInterval as every } from 'node:timers/promises'
3
3
  import { fileURLToPath } from 'node:url'
4
4
  import { cost_transcript } from '#scripts/cost-runtime/cost-transcript'
5
+ import { issue_number_shape } from '#scripts/issue/issue-number-shape'
6
+ import { session_cite } from '#scripts/issue/session-cite'
5
7
  import { cli_flags } from '#scripts/lib/cli-flags'
6
8
  import { MS_PER_SECOND } from '#scripts/lib/timeouts'
7
- import { run_event_stream, type RunEvent } from '#scripts/run/event/run-event-stream'
8
- import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
9
9
  import { lane_capacity } from './lane-capacity'
10
- import { lane_check_stats } from './lane-check-stats'
11
- import { lane_core_wait_stats } from './lane-core-wait-stats'
12
- import { lane_gap_stats } from './lane-gap-stats'
13
- import { lane_held_stats } from './lane-held-stats'
14
- import { lane_ledger } from './lane-ledger'
15
- import { lane_process_stats } from './lane-process-stats'
16
- import { lane_round_two_stats } from './lane-round-two-stats'
10
+ import { lane_net_read } from './lane-net-read'
17
11
  import { lane_sampler, type MeasureContext } from './lane-sampler'
18
- import { lane_stage_stats } from './lane-stage-stats'
19
12
  import { lane_stats, type StatsWindow } from './lane-stats'
20
- import { lane_stop_stats } from './lane-stop-stats'
21
- import { lane_test_related_stats } from './lane-test-related-stats'
22
- import type { ToolCall } from './lane-transcript-calls'
13
+ import { lane_stats_tables, type PeriodRecords } from './lane-stats-tables'
23
14
  import { lane_transcript_stats } from './lane-transcript-stats'
15
+ import { lane_value } from './lane-value'
16
+ import { lane_value_cell, type CellAddress } from './lane-value-cell'
24
17
 
25
- // `josh lane:sample` / `josh lane:stats` — the lane-limit measurement.
18
+ // `josh lane:sample` / `josh lane:stats` — the lane-limit measurement; `josh lane:value` and
19
+ // `josh lane:net` print one measurement each.
26
20
  //
27
21
  // `lane:sample` appends one machine-load sample to the ledger, or one every `--every <seconds>` until it
28
22
  // is stopped; `lane:stats` reduces a period of the ledger to the one table row #3347 records per lane
@@ -36,13 +30,28 @@ const ARGV_OFFSET = 2
36
30
  const FAILURE_EXIT_CODE = 1
37
31
  const SAMPLE_VERB = 'sample'
38
32
  const STATS_VERB = 'stats'
33
+ const VALUE_VERB = 'value'
34
+ const NET_VERB = 'net'
35
+ // `lane:value cell` reads one `lane:stats` table cell rather than a named metric (joshuafolkken/kit#5144).
36
+ const CELL_METRIC = 'cell'
37
+ // A value keeps two decimals: seconds, minutes and per-lane counts read at that grain.
38
+ const VALUE_DIGITS = 2
39
39
  const USAGE = [
40
40
  'Usage: josh lane:sample [--every <seconds>]',
41
41
  ' josh lane:stats --period <days> [--limit <lane-limit>]',
42
+ ` josh lane:value <${lane_value.NAMES.join('|')}> --since <instant>`,
43
+ ` josh lane:value ${CELL_METRIC} --table <title> --row <label> --column <header> --since <instant>`,
44
+ ' josh lane:net <issue>',
42
45
  ].join('\n')
43
46
 
44
47
  const SAMPLE_OPTIONS = { every: { type: 'string' } } as const
45
48
  const STATS_OPTIONS = { period: { type: 'string' }, limit: { type: 'string' } } as const
49
+ const VALUE_OPTIONS = {
50
+ since: { type: 'string' },
51
+ table: { type: 'string' },
52
+ row: { type: 'string' },
53
+ column: { type: 'string' },
54
+ } as const
46
55
 
47
56
  function refuse(): number {
48
57
  console.error(USAGE)
@@ -104,21 +113,6 @@ async function limit_label(given: string | undefined): Promise<string> {
104
113
  return choice.kind === 'limit' ? String(choice.limit) : lane_stats.MISSING
105
114
  }
106
115
 
107
- async function read_ledger(
108
- context: MeasureContext,
109
- ): Promise<ReturnType<typeof lane_ledger.read_entries>> {
110
- const path = context.ledger_path ?? (await lane_ledger.target())
111
-
112
- return path === undefined ? [] : lane_ledger.read_entries(path)
113
- }
114
-
115
- // The run's event stream, read for the parks that end a stop's wait.
116
- async function read_events(context: MeasureContext): Promise<ReadonlyArray<RunEvent>> {
117
- if (context.events_path !== undefined) return run_event_stream.read_events(context.events_path)
118
-
119
- return await run_event_stream_emit.all_events()
120
- }
121
-
122
116
  // Every lane's transcript directory under this checkout's lane root, read from a lane or the main checkout.
123
117
  function transcript_directories(context: MeasureContext): ReadonlyArray<string> {
124
118
  if (context.transcript_directories !== undefined) return context.transcript_directories
@@ -128,27 +122,16 @@ function transcript_directories(context: MeasureContext): ReadonlyArray<string>
128
122
  return cost_transcript.lane_transcript_directories(main_cwd, cost_transcript.home_directory())
129
123
  }
130
124
 
131
- interface PeriodRecords {
132
- entries: ReturnType<typeof lane_ledger.read_entries>
133
- events: ReadonlyArray<RunEvent>
134
- calls: ReadonlyArray<ToolCall>
135
- }
136
-
137
- // The tables under the period's row, in the order `lane:stats` prints them.
138
- function tables_of({ entries, events, calls }: PeriodRecords, window: StatsWindow): Array<string> {
139
- return [
140
- lane_stage_stats.table(entries, window),
141
- lane_stop_stats.table(entries, window, events),
142
- lane_gap_stats.table(entries, window, events),
143
- lane_round_two_stats.table(entries, window),
144
- lane_held_stats.table(entries, window),
145
- lane_core_wait_stats.table(entries, window),
146
- lane_process_stats.table(entries, window),
147
- lane_check_stats.table(entries, window),
148
- lane_test_related_stats.table(entries, window),
149
- lane_test_related_stats.trigger_table(entries, window),
150
- lane_transcript_stats.table(calls, window),
151
- ]
125
+ // The whole ledger, every run event and the window's lane calls — what the `lane:stats` tables read.
126
+ async function period_records(
127
+ context: MeasureContext,
128
+ window: StatsWindow,
129
+ ): Promise<PeriodRecords> {
130
+ return {
131
+ entries: await lane_net_read.read_ledger(context),
132
+ events: await lane_net_read.read_events(context),
133
+ calls: lane_transcript_stats.read_calls(transcript_directories(context), window),
134
+ }
152
135
  }
153
136
 
154
137
  async function stats_command(
@@ -162,25 +145,159 @@ async function stats_command(
162
145
 
163
146
  const window = lane_stats.window_of(period_days, context.now_ms ?? Date.now())
164
147
  const label = { limit: await limit_label(values.limit), period_days }
165
- const entries = await read_ledger(context)
166
- const row = lane_stats.row(entries, window, label)
148
+ const records = await period_records(context, window)
149
+ const row = lane_stats.row(records.entries, window, label)
150
+ const tables = lane_stats_tables.tables_of(records, window)
151
+
152
+ console.info([`${lane_stats.header()}\n${row}`, ...tables].join('\n\n'))
153
+
154
+ return 0
155
+ }
156
+
157
+ interface ValueRequest {
158
+ metric: string
159
+ since_ms: number
160
+ address?: CellAddress
161
+ }
162
+
163
+ interface AddressFlags {
164
+ table?: string | undefined
165
+ row?: string | undefined
166
+ column?: string | undefined
167
+ }
168
+
169
+ function since_of(text = ''): number | undefined {
170
+ const since_ms = Date.parse(text)
171
+
172
+ return Number.isNaN(since_ms) ? undefined : since_ms
173
+ }
174
+
175
+ function is_known(name: string): boolean {
176
+ return name === CELL_METRIC || lane_value.is_metric(name)
177
+ }
178
+
179
+ function metric_of(positionals: ReadonlyArray<string>): string | undefined {
180
+ const [name] = positionals
181
+
182
+ return name !== undefined && positionals.length === 1 && is_known(name) ? name : undefined
183
+ }
184
+
185
+ function address_of({ table, row, column }: AddressFlags): CellAddress | undefined {
186
+ return table === undefined || row === undefined || column === undefined
187
+ ? undefined
188
+ : { table, row, column }
189
+ }
190
+
191
+ function request_of(
192
+ metric: string | undefined,
193
+ since_ms: number | undefined,
194
+ ): ValueRequest | undefined {
195
+ return metric === undefined || since_ms === undefined ? undefined : { metric, since_ms }
196
+ }
197
+
198
+ // One known metric and a readable `--since` instant — `cell` with its whole address — or `undefined`
199
+ // for a refusal.
200
+ function value_request(rest: ReadonlyArray<string>): ValueRequest | undefined {
201
+ const parsed = cli_flags.arguments_of(rest, VALUE_OPTIONS)
202
+
203
+ if (parsed === undefined) return undefined
204
+
205
+ const request = request_of(metric_of(parsed.positionals), since_of(parsed.values.since))
206
+
207
+ if (request?.metric !== CELL_METRIC) return request
208
+
209
+ const address = address_of(parsed.values)
210
+
211
+ return address === undefined ? undefined : { ...request, address }
212
+ }
213
+
214
+ // The value alone on its line, so a measurement declaration reads it as the output's last line; a
215
+ // period with no sample prints nothing there and fails, which the drive reads as unreadable.
216
+ function print_value(request: ValueRequest, measured: number | undefined): number {
217
+ if (measured === undefined) {
218
+ const since = new Date(request.since_ms).toISOString()
219
+
220
+ const missing = request.address === undefined ? 'no sample' : 'no single numeric cell'
221
+
222
+ console.error(`josh lane:value ${request.metric}: ${missing} since ${since}`)
223
+
224
+ return FAILURE_EXIT_CODE
225
+ }
226
+
227
+ console.info(measured.toFixed(VALUE_DIGITS))
228
+
229
+ return 0
230
+ }
231
+
232
+ // The addressed cell of the tables `lane:stats` would print for `window`.
233
+ async function cell_value(
234
+ address: CellAddress,
235
+ window: StatsWindow,
236
+ context: MeasureContext,
237
+ ): Promise<number | undefined> {
238
+ const tables = lane_stats_tables.tables_of(await period_records(context, window), window)
239
+
240
+ return lane_value_cell.value(tables, address)
241
+ }
242
+
243
+ async function value_command(
244
+ rest: ReadonlyArray<string>,
245
+ context: MeasureContext,
246
+ ): Promise<number> {
247
+ const request = value_request(rest)
248
+
249
+ if (request === undefined) return refuse()
250
+
251
+ const window = { since_ms: request.since_ms, until_ms: context.now_ms ?? Date.now() }
252
+
253
+ if (request.address !== undefined) {
254
+ return print_value(request, await cell_value(request.address, window, context))
255
+ }
256
+
167
257
  const records = {
168
- entries,
169
- events: await read_events(context),
258
+ entries: await lane_net_read.read_ledger(context),
170
259
  calls: lane_transcript_stats.read_calls(transcript_directories(context), window),
171
260
  }
172
261
 
173
- console.info([`${lane_stats.header()}\n${row}`, ...tables_of(records, window)].join('\n\n'))
262
+ return print_value(request, lane_value.value(request.metric, records, window))
263
+ }
264
+
265
+ // The lane's net minutes, whole, alone on the line a causing-lane declaration copies
266
+ // (`lane-net-time.ts`); a lane the ledger holds no dispatch and merge of fails.
267
+ async function net_command(rest: ReadonlyArray<string>, context: MeasureContext): Promise<number> {
268
+ const [issue = ''] = rest
269
+
270
+ if (rest.length !== 1 || !issue_number_shape.is_issue_number(issue)) return refuse()
271
+
272
+ const net = await lane_net_read.net_minutes_of(Number(issue), context)
273
+
274
+ if (net === undefined) {
275
+ console.error(
276
+ `josh lane:net ${issue}: the ledger holds no dispatch and merge of ${session_cite.issue(issue)}`,
277
+ )
278
+
279
+ return FAILURE_EXIT_CODE
280
+ }
281
+
282
+ console.info(String(net))
174
283
 
175
284
  return 0
176
285
  }
177
286
 
178
- async function run(argv: ReadonlyArray<string>, context: MeasureContext = {}): Promise<number> {
179
- const [verb, ...rest] = argv
287
+ type VerbCommand = (rest: ReadonlyArray<string>, context: MeasureContext) => Promise<number>
288
+
289
+ const VERBS: Readonly<Record<string, VerbCommand>> = {
290
+ [SAMPLE_VERB]: sample_command,
291
+ [STATS_VERB]: stats_command,
292
+ [VALUE_VERB]: value_command,
293
+ [NET_VERB]: net_command,
294
+ }
180
295
 
181
- if (verb === SAMPLE_VERB) return await sample_command(rest, context)
296
+ async function run(argv: ReadonlyArray<string>, context: MeasureContext = {}): Promise<number> {
297
+ const [verb = '', ...rest] = argv
298
+ const command = Object.hasOwn(VERBS, verb) ? VERBS[verb] : undefined
182
299
 
183
- return verb === STATS_VERB ? await stats_command(rest, context) : refuse()
300
+ return command === undefined ? refuse() : await command(rest, context)
184
301
  }
185
302
 
186
303
  async function main(argv: ReadonlyArray<string>): Promise<void> {
@@ -0,0 +1,44 @@
1
+ import { run_event_stream, type RunEvent } from '#scripts/run/event/run-event-stream'
2
+ import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
3
+ import { lane_ledger } from './lane-ledger'
4
+ import { lane_net_time } from './lane-net-time'
5
+ import type { MeasureContext } from './lane-sampler'
6
+
7
+ // The ledger and the event stream the lane measurements read, and the one lane's net minutes read from
8
+ // them — `josh lane:net` and the causing-lane line `josh issue:file --found-during` prints
9
+ // (joshuafolkken/kit#5225) share it.
10
+
11
+ type ReadContext = Pick<MeasureContext, 'ledger_path' | 'events_path'>
12
+
13
+ async function read_ledger(
14
+ context: ReadContext,
15
+ ): Promise<ReturnType<typeof lane_ledger.read_entries>> {
16
+ const path = context.ledger_path ?? (await lane_ledger.target())
17
+
18
+ return path === undefined ? [] : lane_ledger.read_entries(path)
19
+ }
20
+
21
+ // The run's event stream, read for the parks that end a stop's wait.
22
+ async function read_events(context: ReadContext): Promise<ReadonlyArray<RunEvent>> {
23
+ if (context.events_path !== undefined) return run_event_stream.read_events(context.events_path)
24
+
25
+ return await run_event_stream_emit.all_events()
26
+ }
27
+
28
+ // The lane's net minutes, whole; `undefined` when the ledger holds no dispatch and merge of it.
29
+ async function net_minutes_of(
30
+ issue: number,
31
+ context: ReadContext = {},
32
+ ): Promise<number | undefined> {
33
+ const events = await read_events(context)
34
+
35
+ return lane_net_time.net_minutes(await read_ledger(context), events, issue)
36
+ }
37
+
38
+ const lane_net_read = {
39
+ net_minutes_of,
40
+ read_events,
41
+ read_ledger,
42
+ }
43
+
44
+ export { lane_net_read }