@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,31 @@
1
+ // The kind each lane ledger line carries — the discriminant `lane-ledger-schema.ts` parses on, kept
2
+ // apart so a schema module of its own can name its kind without importing the union it joins.
3
+
4
+ const KIND = {
5
+ MERGE: 'merge',
6
+ GATE: 'gate',
7
+ LOAD: 'load',
8
+ DISPATCH: 'dispatch',
9
+ STAGE: 'stage',
10
+ STOP: 'stop',
11
+ OVERLAP: 'overlap',
12
+ HELD: 'held',
13
+ RELEASED: 'released',
14
+ ROUND_ONE: 'round-one',
15
+ ROUND_TWO: 'round-two',
16
+ OFFERABLE: 'offerable',
17
+ CORE_WAIT: 'core-wait',
18
+ UNIT_FILES: 'unit-files',
19
+ TEST_RELATED: 'test-related',
20
+ TEST_PINNED: 'test-pinned',
21
+ SPLIT_NOTICE: 'split-notice',
22
+ SPLIT_FILED: 'split-filed',
23
+ UNPLANNED_NOTICE: 'unplanned-notice',
24
+ LANE_STATE: 'lane-state',
25
+ PUSH_MISS: 'push-miss',
26
+ SHIP_LAP: 'ship-lap',
27
+ } as const
28
+
29
+ const lane_ledger_kind = { KIND }
30
+
31
+ export { lane_ledger_kind }
@@ -0,0 +1,49 @@
1
+ import { z } from 'zod'
2
+ import { lane_ledger_kind } from './lane-ledger-kind'
3
+
4
+ // The lane ledger lines `josh ship` writes about itself — a stop, the preflight's `unplanned` notice
5
+ // and the inner steps of a stage — joined into the entry union by `lane-ledger-schema.ts`.
6
+
7
+ const { KIND } = lane_ledger_kind
8
+
9
+ // A `josh ship` that stopped on `issue`: `reason` is the stage it stopped at, or `conflict` — the
10
+ // retrospective's stop reason — and `cause` why (`run-ship-stop-cause.ts`), absent on a stop recorded
11
+ // before it had one. `preconditions` names the kinds a preflight stop found unmet (`run-ship-preflight.ts`),
12
+ // with `pre-detach` where a lane child's fast checks went red (joshuafolkken/kit#4478) and `unpinned`
13
+ // where its `test:pinned` did (joshuafolkken/kit#5228), beside them or alone, absent on any other
14
+ // stop and on one recorded before it had them. `findings` names the `<category>:<severity>` of each
15
+ // finding that decided a review or round-2 stop — the blocking ones, else the fixed ones
16
+ // (joshuafolkken/kit#4426), absent where none decided the stop. How long it stayed stopped is derived
17
+ // from the next ship stage, not recorded, so a resumed ship never has to know the stop it ends.
18
+ const stop_schema = z.object({
19
+ kind: z.literal(KIND.STOP),
20
+ at: z.string(),
21
+ issue: z.number(),
22
+ reason: z.string(),
23
+ cause: z.string().optional(),
24
+ preconditions: z.array(z.string()).optional(),
25
+ findings: z.array(z.string()).optional(),
26
+ })
27
+ // The ship's `unplanned` answer `josh check:related` printed to the lane of `issue` ahead of the ship,
28
+ // so a preflight `unplanned` stop after it is told apart in `lane:stats` (joshuafolkken/kit#5203).
29
+ const unplanned_notice_schema = z.object({
30
+ kind: z.literal(KIND.UNPLANNED_NOTICE),
31
+ at: z.string(),
32
+ issue: z.number(),
33
+ files: z.array(z.string()),
34
+ })
35
+ // One inner step of a `josh ship` stage on `issue` — the overlap wait inside `sync`, the scoped pair
36
+ // inside `gate` — so `lane:breakdown` names what a stage spent its time on (joshuafolkken/kit#5294).
37
+ // `at` is its end and `elapsed_ms` its length, as on a stage row.
38
+ const ship_lap_schema = z.object({
39
+ kind: z.literal(KIND.SHIP_LAP),
40
+ at: z.string(),
41
+ issue: z.number(),
42
+ stage: z.string(),
43
+ step: z.string(),
44
+ elapsed_ms: z.number(),
45
+ })
46
+
47
+ const lane_ledger_schema_ship = { ship_lap_schema, stop_schema, unplanned_notice_schema }
48
+
49
+ export { lane_ledger_schema_ship }
@@ -1,23 +1,11 @@
1
1
  import { z } from 'zod'
2
+ import { lane_ledger_kind } from './lane-ledger-kind'
3
+ import { lane_ledger_schema_ship } from './lane-ledger-schema-ship'
2
4
 
3
5
  // The shape of each line `lane-ledger.ts` appends and reads back — one schema per entry kind.
4
6
 
5
- const KIND = {
6
- MERGE: 'merge',
7
- GATE: 'gate',
8
- LOAD: 'load',
9
- DISPATCH: 'dispatch',
10
- STAGE: 'stage',
11
- STOP: 'stop',
12
- OVERLAP: 'overlap',
13
- HELD: 'held',
14
- RELEASED: 'released',
15
- ROUND_TWO: 'round-two',
16
- OFFERABLE: 'offerable',
17
- CORE_WAIT: 'core-wait',
18
- UNIT_FILES: 'unit-files',
19
- TEST_RELATED: 'test-related',
20
- } as const
7
+ const { KIND } = lane_ledger_kind
8
+ const { ship_lap_schema, stop_schema, unplanned_notice_schema } = lane_ledger_schema_ship
21
9
 
22
10
  const merge_schema = z.object({ kind: z.literal(KIND.MERGE), at: z.string(), issue: z.number() })
23
11
  const check_schema = z.object({
@@ -55,6 +43,9 @@ const gate_schema = z.object({
55
43
  // A gate that reused a green record for this tree and base and started no check: counted, never
56
44
  // timed (joshuafolkken/kit#4397).
57
45
  is_reused: z.boolean().optional(),
46
+ // The lane the gate ran in, so `josh lane:breakdown` puts its checks under the lane's ship gate;
47
+ // absent outside a lane and on a row written before it (joshuafolkken/kit#5319).
48
+ issue: z.number().optional(),
58
49
  })
59
50
  // `available_mb`, `swapped_mb` and `lanes` are optional because each read can fail on its own — a
60
51
  // platform with no memory reading, a `git worktree` call that did not answer — and a sample is still
@@ -86,31 +77,17 @@ const dispatch_schema = z.object({
86
77
  })
87
78
  // One finished stage of a lane's run, passed or failed: `at` is its end and `elapsed_ms` its length, so
88
79
  // its start is read from the two. `issue` is absent where the writer does not hold one — `followup`'s
89
- // CI wait, which is timed on a path that fails before the issue is known.
80
+ // CI wait where the run did not know its issue. On that `ci-wait` row,
81
+ // `check_ms` is each check seen pending and then settled, by the time it settled into the wait, and
82
+ // `last_check` the one that settled last — the wait's critical path (joshuafolkken/kit#5295).
90
83
  const stage_schema = z.object({
91
84
  kind: z.literal(KIND.STAGE),
92
85
  at: z.string(),
93
86
  stage: z.string(),
94
87
  elapsed_ms: z.number(),
95
88
  issue: z.number().optional(),
96
- })
97
- // A `josh ship` that stopped on `issue`: `reason` is the stage it stopped at, or `conflict` — the
98
- // retrospective's stop reason — and `cause` why (`run-ship-stop-cause.ts`), absent on a stop recorded
99
- // before it had one. `preconditions` names the kinds a preflight stop found unmet (`run-ship-preflight.ts`),
100
- // with `pre-detach` where a lane child's fast checks went red beside them (joshuafolkken/kit#4478),
101
- // absent on any other stop and on one recorded before it had them. `findings` names the
102
- // `<category>:<severity>` of each finding that decided a review or round-2 stop — the blocking ones, else
103
- // the fixed ones (joshuafolkken/kit#4426),
104
- // absent where none decided the stop. How long it stayed stopped is derived from the next ship stage, not recorded, so a
105
- // resumed ship never has to know the stop it ends.
106
- const stop_schema = z.object({
107
- kind: z.literal(KIND.STOP),
108
- at: z.string(),
109
- issue: z.number(),
110
- reason: z.string(),
111
- cause: z.string().optional(),
112
- preconditions: z.array(z.string()).optional(),
113
- findings: z.array(z.string()).optional(),
89
+ last_check: z.string().optional(),
90
+ check_ms: z.record(z.string(), z.number()).optional(),
114
91
  })
115
92
  // A `josh ship` on `issue` whose actual change overlapped the open pull requests of `lanes` on `paths`
116
93
  // before its sync: it waited `waited_ms` for their ships to end, and `is_cleared` is false where the
@@ -137,6 +114,23 @@ const held_schema = z.object({
137
114
  // The end of a hold no dispatch ended: every lane taken — one opened outside the driver included — or
138
115
  // the run finished, so no free lane is owed a child any more.
139
116
  const released_schema = z.object({ kind: z.literal(KIND.RELEASED), at: z.string() })
117
+ // A `lane:pause` (`paused`) or `lane:resume` (`running`) of `issue`'s lane, so a measurement reads the
118
+ // time its processes stood stopped (joshuafolkken/kit#5168) — the lane state file keeps only the last.
119
+ const lane_state_schema = z.object({
120
+ kind: z.literal(KIND.LANE_STATE),
121
+ at: z.string(),
122
+ issue: z.number(),
123
+ state: z.enum(['paused', 'running']),
124
+ })
125
+ // The round 1 a `josh ship` acted on for `issue`: `verdict` is the reviewer's — `clean`, `fixed`,
126
+ // `blocking` — or `reused` where a round recorded before the ship still described the tree, so the
127
+ // period's ship-time rounds that passed with no fix are counted (joshuafolkken/kit#4620).
128
+ const round_one_schema = z.object({
129
+ kind: z.literal(KIND.ROUND_ONE),
130
+ at: z.string(),
131
+ issue: z.number(),
132
+ verdict: z.string(),
133
+ })
140
134
  // One `review:round2` decision a `josh ship` acted on for `issue`: `verdict` and the stable reason
141
135
  // `code` it fell under, so the period's skips and runs are counted by why (joshuafolkken/kit#4064).
142
136
  const round_two_schema = z.object({
@@ -190,6 +184,55 @@ const test_related_schema = z.object({
190
184
  trigger_files: z.array(z.string()).optional(),
191
185
  elapsed_ms: z.number(),
192
186
  })
187
+ // One `josh test:pinned` run that probed (joshuafolkken/kit#5078): `held` hunks the verdict cache
188
+ // answered, and each probed hunk's `file`, the test files it ran (`tests`, absent where vitest wrote no
189
+ // report) and its wall time. `issue` is the lane it ran in, absent outside a lane. `rewired` counts the
190
+ // hunks not probed as an import moved under a new name (joshuafolkken/kit#5235), absent on older rows.
191
+ // `origin` is what started the run, and `discarded` marks a `run:review` background run stopped before
192
+ // its answer, written by the stop with its wall time so far (joshuafolkken/kit#5262); both absent on
193
+ // older rows.
194
+ const pinned_origin_schema = z.enum(['run-review', 'pre-detach', 'manual'])
195
+ const test_pinned_probe_schema = z.object({
196
+ file: z.string(),
197
+ tests: z.number().optional(),
198
+ elapsed_ms: z.number(),
199
+ })
200
+ const test_pinned_schema = z.object({
201
+ kind: z.literal(KIND.TEST_PINNED),
202
+ at: z.string(),
203
+ issue: z.number().optional(),
204
+ held: z.number(),
205
+ rewired: z.number().optional(),
206
+ probes: z.array(test_pinned_probe_schema),
207
+ elapsed_ms: z.number(),
208
+ origin: pinned_origin_schema.optional(),
209
+ discarded: z.boolean().optional(),
210
+ })
211
+ // The split notice shown to the lane of `issue`, with the measured diff it fired on — written once per
212
+ // Issue, by whichever of `josh lint:related`, `test:related` or `main:merge` showed it first
213
+ // (joshuafolkken/kit#4695).
214
+ const split_notice_schema = z.object({
215
+ kind: z.literal(KIND.SPLIT_NOTICE),
216
+ at: z.string(),
217
+ issue: z.number(),
218
+ files: z.number(),
219
+ lines: z.number(),
220
+ })
221
+ // One `josh issue:file --route split` filed from the lane of `issue`; `child` is its reference.
222
+ const split_filed_schema = z.object({
223
+ kind: z.literal(KIND.SPLIT_FILED),
224
+ at: z.string(),
225
+ issue: z.number(),
226
+ child: z.string(),
227
+ })
228
+ // A pre-push hook that could not reuse the green gate record and ran the `whole` or the `related`
229
+ // suite: `reason` is the miss's kind (`hook_gate_reuse.miss_kind`), never its sentence (joshuafolkken/kit#5234).
230
+ const push_miss_schema = z.object({
231
+ kind: z.literal(KIND.PUSH_MISS),
232
+ at: z.string(),
233
+ scope: z.enum(['whole', 'related']),
234
+ reason: z.string(),
235
+ })
193
236
  const entry_schema = z.discriminatedUnion('kind', [
194
237
  merge_schema,
195
238
  gate_schema,
@@ -200,11 +243,19 @@ const entry_schema = z.discriminatedUnion('kind', [
200
243
  overlap_schema,
201
244
  held_schema,
202
245
  released_schema,
246
+ round_one_schema,
203
247
  round_two_schema,
204
248
  offerable_schema,
205
249
  core_wait_schema,
206
250
  unit_files_schema,
207
251
  test_related_schema,
252
+ test_pinned_schema,
253
+ split_notice_schema,
254
+ split_filed_schema,
255
+ unplanned_notice_schema,
256
+ lane_state_schema,
257
+ push_miss_schema,
258
+ ship_lap_schema,
208
259
  ])
209
260
 
210
261
  type LedgerEntry = z.infer<typeof entry_schema>
@@ -216,6 +267,7 @@ type StageEntry = z.infer<typeof stage_schema>
216
267
  type StopEntry = z.infer<typeof stop_schema>
217
268
  type OverlapEntry = z.infer<typeof overlap_schema>
218
269
  type HeldEntry = z.infer<typeof held_schema>
270
+ type RoundOneEntry = z.infer<typeof round_one_schema>
219
271
  type RoundTwoEntry = z.infer<typeof round_two_schema>
220
272
  type OfferableEntry = z.infer<typeof offerable_schema>
221
273
  type CoreWaitEntry = z.infer<typeof core_wait_schema>
@@ -224,6 +276,21 @@ type UnitFilesEntry = z.infer<typeof unit_files_schema>
224
276
  type UnitFileRecord = z.infer<typeof unit_file_schema>
225
277
  type TestRelatedEntry = z.infer<typeof test_related_schema>
226
278
  type TestRelatedRecord = Omit<TestRelatedEntry, 'kind' | 'at'>
279
+ type TestPinnedEntry = z.infer<typeof test_pinned_schema>
280
+ type TestPinnedRecord = Omit<TestPinnedEntry, 'kind' | 'at'>
281
+ type SplitNoticeEntry = z.infer<typeof split_notice_schema>
282
+ type SplitNoticeRecord = Omit<SplitNoticeEntry, 'kind' | 'at'>
283
+ type SplitFiledEntry = z.infer<typeof split_filed_schema>
284
+ type SplitFiledRecord = Omit<SplitFiledEntry, 'kind' | 'at'>
285
+ type UnplannedNoticeEntry = z.infer<typeof unplanned_notice_schema>
286
+ type UnplannedNoticeRecord = Omit<UnplannedNoticeEntry, 'kind' | 'at'>
287
+ type LaneStateChangeEntry = z.infer<typeof lane_state_schema>
288
+ type LaneStateChangeRecord = Omit<LaneStateChangeEntry, 'kind' | 'at'>
289
+ type PushMissEntry = z.infer<typeof push_miss_schema>
290
+ type PushMissRecord = Omit<PushMissEntry, 'kind' | 'at'>
291
+ type ShipLapEntry = z.infer<typeof ship_lap_schema>
292
+ type ShipLapRecord = Omit<ShipLapEntry, 'kind' | 'at'>
293
+ type RoundOneRecord = Omit<RoundOneEntry, 'kind' | 'at'>
227
294
  type RoundTwoRecord = Omit<RoundTwoEntry, 'kind' | 'at'>
228
295
  // What a finished gate reports; the ledger stamps the kind and the time.
229
296
  type GateRecord = Omit<GateEntry, 'kind' | 'at'>
@@ -235,7 +302,7 @@ type HeldRecord = Omit<HeldEntry, 'kind' | 'at' | 'waiting'> & {
235
302
  waiting?: ReadonlyArray<number> | undefined
236
303
  }
237
304
 
238
- const lane_ledger_schema = { KIND, entry_schema }
305
+ const lane_ledger_schema = { KIND, entry_schema, pinned_origin_schema }
239
306
 
240
307
  export type {
241
308
  CoreWaitEntry,
@@ -246,21 +313,37 @@ export type {
246
313
  GateRecord,
247
314
  HeldEntry,
248
315
  HeldRecord,
316
+ LaneStateChangeEntry,
317
+ LaneStateChangeRecord,
249
318
  LedgerEntry,
250
319
  LoadEntry,
251
320
  MergeEntry,
252
321
  OfferableEntry,
253
322
  OverlapEntry,
254
323
  OverlapRecord,
324
+ PushMissEntry,
325
+ PushMissRecord,
326
+ RoundOneEntry,
327
+ RoundOneRecord,
255
328
  RoundTwoEntry,
256
329
  RoundTwoRecord,
330
+ ShipLapEntry,
331
+ ShipLapRecord,
332
+ SplitFiledEntry,
333
+ SplitFiledRecord,
334
+ SplitNoticeEntry,
335
+ SplitNoticeRecord,
257
336
  StageEntry,
258
337
  StageRecord,
259
338
  StopEntry,
260
339
  StopRecord,
340
+ TestPinnedEntry,
341
+ TestPinnedRecord,
261
342
  TestRelatedEntry,
262
343
  TestRelatedRecord,
263
344
  UnitFileRecord,
264
345
  UnitFilesEntry,
346
+ UnplannedNoticeEntry,
347
+ UnplannedNoticeRecord,
265
348
  }
266
349
  export { lane_ledger_schema }
@@ -0,0 +1,257 @@
1
+ import { closeSync, constants, openSync, writeSync } from 'node:fs'
2
+ import { durable_state } from '#scripts/josh/durable-state'
3
+ import { stamp_file } from '#scripts/josh/stamp-file'
4
+ import { run_carry } from '#scripts/run/carry/run-carry'
5
+ import {
6
+ lane_ledger_schema,
7
+ type CoreWaitRecord,
8
+ type GateRecord,
9
+ type HeldRecord,
10
+ type LaneStateChangeRecord,
11
+ type LedgerEntry,
12
+ type OverlapRecord,
13
+ type PushMissRecord,
14
+ type RoundOneRecord,
15
+ type RoundTwoRecord,
16
+ type ShipLapRecord,
17
+ type SplitFiledRecord,
18
+ type SplitNoticeRecord,
19
+ type StageRecord,
20
+ type StopRecord,
21
+ type TestPinnedRecord,
22
+ type TestRelatedRecord,
23
+ type UnitFileRecord,
24
+ type UnplannedNoticeRecord,
25
+ } from './lane-ledger-schema'
26
+
27
+ // The measurement ledger the lane limit is tuned against: one JSON line per
28
+ // lane merge, per finished `josh gate`, per machine-load sample, per lane dispatch, per finished
29
+ // `josh ship` stage, per stopped `josh ship`, per round-2 decision, per core-budget wait and per
30
+ // `josh test:related` run, read back by `josh lane:stats` through `lane-ledger.ts`. Each line's shape
31
+ // is `lane-ledger-schema.ts`.
32
+ //
33
+ // **The writers' leaf, apart from the reader** (joshuafolkken/kit#5202). The gate, `followup`, `josh
34
+ // ship`, the dispatch and the backlog driver write here, and dozens of suites import them; the reading
35
+ // and the measurement modules built on it import `lane-ledger.ts`, so a change there no longer reaches
36
+ // every suite a writer sits under.
37
+ //
38
+ // **Its own file rather than the run's event stream.** The stream is capped at 500 events and is
39
+ // rewritten whole on every append, which is right for "where is the run" and wrong for a measurement
40
+ // that spans days of one-a-minute load samples. This file is only ever appended to, so concurrent lanes
41
+ // never lose each other's lines to a read-modify-write race.
42
+ //
43
+ // **Keyed on the common git directory, the event stream's key**, so a lane child's gate, the parent's
44
+ // merge and the sampler all land in one ledger per repository. It is a durable record
45
+ // (`durable-state.ts`), so a period runs across a reboot.
46
+
47
+ const LEDGER_PREFIX = durable_state.PREFIX.LANE_LEDGER
48
+ const LEDGER_SUFFIX = '.jsonl'
49
+ const LINE_SEPARATOR = '\n'
50
+ // `followup`'s wait for CI — a stage of a lane's run that no `josh ship` stage is the whole of.
51
+ const CI_WAIT_STAGE = 'ci-wait'
52
+ // The part of `followup`'s waits CodeRabbit spent running or rate-limited, and the rate-limited part
53
+ // alone (joshuafolkken/kit#4574).
54
+ const CODERABBIT_WAIT_STAGE = 'coderabbit-wait'
55
+ const CODERABBIT_RATE_LIMIT_STAGE = 'coderabbit-rate-limit'
56
+ // The rate-limit window `followup` waited out before posting its one `@coderabbitai review`
57
+ // (joshuafolkken/kit#5289).
58
+ const CODERABBIT_RETRIGGER_STAGE = 'coderabbit-retriggered'
59
+ // A detached `josh ship`'s fast checks in the agent's own turn — not a resumable ship stage, since the
60
+ // supervised gate runs them again (joshuafolkken/kit#4382).
61
+ const PRE_DETACH_STAGE = 'pre-detach'
62
+ // A ship's round 1 that reused a recorded review instead of running one (joshuafolkken/kit#4620).
63
+ const ROUND_ONE_REUSED = 'reused'
64
+ const LEDGER_FILE_MODE = 0o600
65
+ // The flags `detached-launch.ts` appends its log with, for the same deterministic shared-temp path.
66
+ const { O_APPEND, O_CREAT, O_NOFOLLOW, O_WRONLY } = constants
67
+ // eslint-disable-next-line no-bitwise -- POSIX open flags are a bit field; `||` here would be a bug
68
+ const APPEND_FLAGS = O_WRONLY | O_APPEND | O_CREAT | O_NOFOLLOW
69
+
70
+ const { KIND } = lane_ledger_schema
71
+
72
+ function target_of(repository: string): string {
73
+ return durable_state.path(LEDGER_PREFIX, repository, LEDGER_SUFFIX)
74
+ }
75
+
76
+ // The ledger of the repository this checkout belongs to, or `undefined` outside one. `git rev-parse`
77
+ // rejects outside a repository, and `josh gate` resolves this before it runs a check, so the rejection
78
+ // is read as "no ledger" rather than allowed to fail the gate it would only have measured.
79
+ //
80
+ // **A test run has no ledger either.** The writers sit on paths dozens of suites exercise — a ship
81
+ // stage, a dispatch, a `followup` — and one suite that forgot to mock this module would append its
82
+ // fixture durations to the real measurement; a test that writes passes its own path instead.
83
+ async function target(): Promise<string | undefined> {
84
+ if (process.env['VITEST'] !== undefined) return undefined
85
+
86
+ try {
87
+ const repository = await run_carry.repository_directory()
88
+
89
+ return repository === undefined ? undefined : target_of(repository)
90
+ } catch {
91
+ return undefined
92
+ }
93
+ }
94
+
95
+ // **Append, never rewrite** — `O_APPEND` keeps each short line whole across concurrent writers, and
96
+ // `O_NOFOLLOW` plus `stamp_file`'s ownership test keep a planted link or another account's file from
97
+ // receiving it. Any JSON-lines log takes it — the durable review stop log too (joshuafolkken/kit#4519).
98
+ function append(path: string, entry: object): void {
99
+ const descriptor = openSync(path, APPEND_FLAGS, LEDGER_FILE_MODE)
100
+
101
+ try {
102
+ if (stamp_file.is_own_regular_file(path)) {
103
+ writeSync(descriptor, `${JSON.stringify(entry)}${LINE_SEPARATOR}`)
104
+ }
105
+ } finally {
106
+ closeSync(descriptor)
107
+ }
108
+ }
109
+
110
+ // Best-effort: a measurement must never fail the gate or the merge it measures, so every error — no
111
+ // repository, an unwritable temp root — is dropped.
112
+ async function record(entry: LedgerEntry, path?: string): Promise<void> {
113
+ try {
114
+ const destination = path ?? (await target())
115
+
116
+ if (destination !== undefined) append(destination, entry)
117
+ } catch {
118
+ // Reporting is best-effort: a failed append is dropped rather than raised into the caller's work.
119
+ }
120
+ }
121
+
122
+ function now_iso(): string {
123
+ return new Date().toISOString()
124
+ }
125
+
126
+ // One finished `josh gate`, whether it passed or not — a failing gate cost the lane its time as well.
127
+ async function record_gate(path: string, gate: GateRecord): Promise<void> {
128
+ await record({ kind: KIND.GATE, at: now_iso(), ...gate }, path)
129
+ }
130
+
131
+ async function record_merge(issue: number, at: Date = new Date()): Promise<void> {
132
+ await record({ kind: KIND.MERGE, at: at.toISOString(), issue })
133
+ }
134
+
135
+ async function record_dispatch(issue: number, path?: string): Promise<void> {
136
+ await record({ kind: KIND.DISPATCH, at: now_iso(), issue }, path)
137
+ }
138
+
139
+ async function record_stage(stage: StageRecord, path?: string): Promise<void> {
140
+ await record({ kind: KIND.STAGE, at: now_iso(), ...stage }, path)
141
+ }
142
+
143
+ async function record_stop(stop: StopRecord, path?: string): Promise<void> {
144
+ await record({ kind: KIND.STOP, at: now_iso(), ...stop }, path)
145
+ }
146
+
147
+ async function record_overlap(overlap: OverlapRecord, path?: string): Promise<void> {
148
+ await record({ kind: KIND.OVERLAP, at: now_iso(), ...overlap }, path)
149
+ }
150
+
151
+ // `waiting` is written only when the offer named issues, so a hold that waited on none stays one short line.
152
+ async function record_held(held: HeldRecord, path?: string): Promise<void> {
153
+ const waiting = held.waiting ?? []
154
+ const named = waiting.length > 0 ? { waiting: [...waiting] } : {}
155
+
156
+ await record({ kind: KIND.HELD, at: now_iso(), reason: held.reason, ...named }, path)
157
+ }
158
+
159
+ async function record_released(path?: string): Promise<void> {
160
+ await record({ kind: KIND.RELEASED, at: now_iso() }, path)
161
+ }
162
+
163
+ async function record_lane_state(change: LaneStateChangeRecord, path?: string): Promise<void> {
164
+ await record({ kind: KIND.LANE_STATE, at: now_iso(), ...change }, path)
165
+ }
166
+
167
+ async function record_offerable(is_offerable: boolean, path?: string): Promise<void> {
168
+ await record({ kind: KIND.OFFERABLE, at: now_iso(), is_offerable }, path)
169
+ }
170
+
171
+ async function record_round_one(round_one: RoundOneRecord, path?: string): Promise<void> {
172
+ await record({ kind: KIND.ROUND_ONE, at: now_iso(), ...round_one }, path)
173
+ }
174
+
175
+ async function record_round_two(round_two: RoundTwoRecord, path?: string): Promise<void> {
176
+ await record({ kind: KIND.ROUND_TWO, at: now_iso(), ...round_two }, path)
177
+ }
178
+
179
+ async function record_core_wait(wait: CoreWaitRecord, path?: string): Promise<void> {
180
+ await record({ kind: KIND.CORE_WAIT, at: now_iso(), ...wait }, path)
181
+ }
182
+
183
+ async function record_unit_files(
184
+ files: ReadonlyArray<UnitFileRecord>,
185
+ path?: string,
186
+ ): Promise<void> {
187
+ await record({ kind: KIND.UNIT_FILES, at: now_iso(), files: [...files] }, path)
188
+ }
189
+
190
+ async function record_test_related(run: TestRelatedRecord, path?: string): Promise<void> {
191
+ await record({ kind: KIND.TEST_RELATED, at: now_iso(), ...run }, path)
192
+ }
193
+
194
+ async function record_test_pinned(run: TestPinnedRecord, path?: string): Promise<void> {
195
+ await record({ kind: KIND.TEST_PINNED, at: now_iso(), ...run }, path)
196
+ }
197
+
198
+ async function record_split_notice(notice: SplitNoticeRecord, path?: string): Promise<void> {
199
+ await record({ kind: KIND.SPLIT_NOTICE, at: now_iso(), ...notice }, path)
200
+ }
201
+
202
+ async function record_split_filed(filed: SplitFiledRecord, path?: string): Promise<void> {
203
+ await record({ kind: KIND.SPLIT_FILED, at: now_iso(), ...filed }, path)
204
+ }
205
+
206
+ async function record_push_miss(miss: PushMissRecord, path?: string): Promise<void> {
207
+ await record({ kind: KIND.PUSH_MISS, at: now_iso(), ...miss }, path)
208
+ }
209
+
210
+ async function record_ship_lap(lap: ShipLapRecord, path?: string): Promise<void> {
211
+ await record({ kind: KIND.SHIP_LAP, at: now_iso(), ...lap }, path)
212
+ }
213
+
214
+ async function record_unplanned_notice(
215
+ notice: UnplannedNoticeRecord,
216
+ path?: string,
217
+ ): Promise<void> {
218
+ await record({ kind: KIND.UNPLANNED_NOTICE, at: now_iso(), ...notice }, path)
219
+ }
220
+
221
+ const lane_ledger_write = {
222
+ CI_WAIT_STAGE,
223
+ CODERABBIT_RATE_LIMIT_STAGE,
224
+ CODERABBIT_RETRIGGER_STAGE,
225
+ CODERABBIT_WAIT_STAGE,
226
+ KIND,
227
+ LINE_SEPARATOR,
228
+ PRE_DETACH_STAGE,
229
+ ROUND_ONE_REUSED,
230
+ append,
231
+ record,
232
+ record_core_wait,
233
+ record_dispatch,
234
+ record_gate,
235
+ record_held,
236
+ record_lane_state,
237
+ record_released,
238
+ record_merge,
239
+ record_overlap,
240
+ record_offerable,
241
+ record_push_miss,
242
+ record_round_one,
243
+ record_round_two,
244
+ record_ship_lap,
245
+ record_split_filed,
246
+ record_split_notice,
247
+ record_stage,
248
+ record_stop,
249
+ record_test_pinned,
250
+ record_test_related,
251
+ record_unit_files,
252
+ record_unplanned_notice,
253
+ target,
254
+ target_of,
255
+ }
256
+
257
+ export { lane_ledger_write }