@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
@@ -0,0 +1,84 @@
1
+ import { execSync } from 'node:child_process'
2
+ import { gh_author_association } from '#scripts/gh/gh-author-association'
3
+ import { git_gh_issue_read } from '#scripts/gh/git-gh-issue-read'
4
+ import { parse_json_object_or_undefined } from '#scripts/git/parse-json-array'
5
+ import { error_text } from '#scripts/lib/error-message'
6
+ import { z } from 'zod'
7
+ import { session_cite } from './session-cite'
8
+
9
+ // Running a command an Issue body names — `josh measure:rerun`'s baselines and the drive's measurement
10
+ // declaration (`measure-declaration.ts`) alike.
11
+ //
12
+ // **The command is shell, and the body is written by whoever filed the Issue**.
13
+ // A baseline needs pipes and loops (`git log … | wc -l`, `for d in $(ls …)`), so an allow-list of
14
+ // commands cannot make it safe; what can is who wrote it. The input is therefore the Issue number, not
15
+ // a file, so the author's `author_association` arrives with the body from the same REST read, and only
16
+ // a body written by someone with write access to the repository is run.
17
+
18
+ const ISSUE_FIELDS = `body,${gh_author_association.AUTHOR_FIELDS}`
19
+ const UNKNOWN_ASSOCIATION = 'unknown'
20
+ // One command's budget — the same minute `josh-harness.ts` gives one command it spawns. A measurement
21
+ // is a count or a digest that answers in seconds, so a command still running after a minute is stuck,
22
+ // and without a bound it would hold the whole re-measurement open with nothing printed.
23
+ const MEASURE_TIMEOUT_MS = 60_000
24
+ const issue_schema = z.object({
25
+ body: z.string().nullish(),
26
+ ...gh_author_association.author_fields_schema,
27
+ })
28
+
29
+ type IssueFields = z.infer<typeof issue_schema>
30
+ type BodyRead = { kind: 'trusted'; body: string } | { kind: 'refused'; reason: string }
31
+ type CommandRun = { kind: 'ok'; output: string } | { kind: 'failed'; message: string }
32
+
33
+ // The command's stdout, trimmed, or the message a failing or timed-out command threw.
34
+ function run_command(command: string): CommandRun {
35
+ try {
36
+ return {
37
+ kind: 'ok',
38
+ output: execSync(command, { encoding: 'utf8', timeout: MEASURE_TIMEOUT_MS }).trim(),
39
+ }
40
+ } catch (error) {
41
+ return { kind: 'failed', message: error_text.message_of(error) }
42
+ }
43
+ }
44
+
45
+ // The run as one printable value: a failure is spelled in place of the output.
46
+ function text_of(run: CommandRun): string {
47
+ return run.kind === 'ok' ? run.output : `(command failed: ${run.message})`
48
+ }
49
+
50
+ async function read_issue(issue_number: string): Promise<IssueFields | undefined> {
51
+ const json = await git_gh_issue_read.issue_view_json(issue_number, ISSUE_FIELDS)
52
+
53
+ return json === undefined ? undefined : parse_json_object_or_undefined(json, issue_schema)
54
+ }
55
+
56
+ function untrusted(issue_number: string, issue: IssueFields): BodyRead {
57
+ const association = issue.author_association ?? UNKNOWN_ASSOCIATION
58
+
59
+ return {
60
+ kind: 'refused',
61
+ reason: `refusing to run the baseline of ${session_cite.issue(issue_number)}: its author (${association}) is not ${gh_author_association.TRUSTED_LIST}`,
62
+ }
63
+ }
64
+
65
+ // The body, only when its author can write to the repository. A read that fails is refused as well:
66
+ // an unknown author is not a trusted one.
67
+ async function read_trusted_body(issue_number: string): Promise<BodyRead> {
68
+ const issue = await read_issue(issue_number)
69
+
70
+ if (issue === undefined) {
71
+ return { kind: 'refused', reason: `could not read issue ${session_cite.issue(issue_number)}` }
72
+ }
73
+
74
+ if (!(await gh_author_association.is_trusted(gh_author_association.author_of(issue)))) {
75
+ return untrusted(issue_number, issue)
76
+ }
77
+
78
+ return { kind: 'trusted', body: issue.body ?? '' }
79
+ }
80
+
81
+ const trusted_measure = { read_trusted_body, run_command, text_of }
82
+
83
+ export type { BodyRead, CommandRun }
84
+ export { trusted_measure }
@@ -1,8 +1,9 @@
1
- import { canonical_command, COMMAND_MAP } from './josh-command-map'
1
+ import { canonical_command } from './josh-aliases'
2
+ import { COMMAND_MAP } from './josh-command-map'
2
3
  import type { CommandUsage } from './josh-command-types'
3
4
 
4
5
  // The single renderer of a command's usage. `josh help <command>` prints it and
5
- // `tools/document/generate-command-usage.ts` writes it between a reference page's usage markers,
6
+ // `josh command:derive` writes it between a reference page's usage markers,
6
7
  // so the terminal and the page are one text (#3932). The usage itself sits on each command's entry
7
8
  // (#4185); which page renders it is the page's own `<!-- usage: <command> -->` span.
8
9
 
@@ -0,0 +1,105 @@
1
+ import { constants, copyFileSync, lstatSync, readdirSync, rmSync, writeFileSync } from 'node:fs'
2
+ import path from 'node:path'
3
+ import { stamp_file } from '#scripts/josh/stamp-file'
4
+
5
+ // The two upkeep jobs of the durable run-state directory (`durable-state.ts`), each run at most once
6
+ // per process per directory rather than on every record lookup.
7
+ //
8
+ // **A legacy record is copied once per directory.** A run that is going when
9
+ // this lands wrote its records to `/tmp`, and reading only the new place would end it as a reboot
10
+ // did. Copying on every lookup instead brought back a record a run removed on purpose — an ended
11
+ // carry, a stopped launch, a failed ship's result — from the `/tmp` original. The original is left
12
+ // in place: a lane or parent still on the code before this change reads `/tmp` until it merges main.
13
+ // A copy rather than a rename because `/tmp` is often another filesystem. A record an old-code
14
+ // process writes to `/tmp` after the copy is not picked up.
15
+ //
16
+ // **A log not written for two weeks is removed.** `/tmp` used to clear them on every boot; the common
17
+ // git directory never does, and a log is the only record here that grows without an owner ending it.
18
+
19
+ const COPIED_MARKER = '.legacy-copied'
20
+ const MARKER_MODE = 0o600
21
+ const LOG_RETENTION_DAYS = 14
22
+ const DAY_MS = 86_400_000
23
+ const LOG_SUFFIX = '.log'
24
+ // What a record is. A lock or a staged write beside a record carries its prefix but means nothing
25
+ // past the process that made it.
26
+ const RECORD_SUFFIXES = ['.json', '.jsonl', LOG_SUFFIX] as const
27
+
28
+ function is_record_name(name: string, prefixes: ReadonlyArray<string>): boolean {
29
+ const has_prefix = prefixes.some((prefix) => name.startsWith(prefix))
30
+
31
+ return has_prefix && RECORD_SUFFIXES.some((suffix) => name.endsWith(suffix))
32
+ }
33
+
34
+ function list_names(directory: string): Array<string> {
35
+ try {
36
+ return readdirSync(directory)
37
+ } catch {
38
+ return []
39
+ }
40
+ }
41
+
42
+ function copy_record(from: string, to: string): void {
43
+ try {
44
+ if (!stamp_file.is_own_regular_file(from)) return
45
+
46
+ copyFileSync(from, to, constants.COPYFILE_EXCL)
47
+ } catch {
48
+ // Another process wrote it first, or the copy failed; either way nothing is overwritten.
49
+ }
50
+ }
51
+
52
+ function copy_legacy(from: string, to: string, prefixes: ReadonlyArray<string>): void {
53
+ if (from === to) return
54
+
55
+ for (const name of list_names(from)) {
56
+ if (is_record_name(name, prefixes)) copy_record(path.join(from, name), path.join(to, name))
57
+ }
58
+ }
59
+
60
+ // The marker is created exclusively, so one process wins the copy. A marker rather than whether
61
+ // `mkdirSync` made the directory: a lane on this code can create the shared directory before the run
62
+ // that owns the `/tmp` records switches over, and that run still needs its copy.
63
+ function claim_copy(directory: string): boolean {
64
+ try {
65
+ writeFileSync(path.join(directory, COPIED_MARKER), '', { flag: 'wx', mode: MARKER_MODE })
66
+
67
+ return true
68
+ } catch {
69
+ return false
70
+ }
71
+ }
72
+
73
+ function copy_once(from: string, to: string, prefixes: ReadonlyArray<string>): void {
74
+ if (claim_copy(to)) copy_legacy(from, to, prefixes)
75
+ }
76
+
77
+ function is_stale(target: string, now_ms: number): boolean {
78
+ const age_ms = now_ms - lstatSync(target).mtimeMs
79
+
80
+ return age_ms > LOG_RETENTION_DAYS * DAY_MS && stamp_file.is_own_regular_file(target)
81
+ }
82
+
83
+ function prune_log(target: string, now_ms: number): void {
84
+ try {
85
+ if (is_stale(target, now_ms)) rmSync(target, { force: true })
86
+ } catch {
87
+ // Gone already, or not ours to remove.
88
+ }
89
+ }
90
+
91
+ function prune_stale_logs(
92
+ directory: string,
93
+ prefixes: ReadonlyArray<string>,
94
+ now_ms: number,
95
+ ): void {
96
+ for (const name of list_names(directory)) {
97
+ if (name.endsWith(LOG_SUFFIX) && is_record_name(name, prefixes)) {
98
+ prune_log(path.join(directory, name), now_ms)
99
+ }
100
+ }
101
+ }
102
+
103
+ const durable_state_migrate = { LOG_RETENTION_DAYS, copy_once, is_record_name, prune_stale_logs }
104
+
105
+ export { durable_state_migrate }
@@ -0,0 +1,112 @@
1
+ import { mkdirSync } from 'node:fs'
2
+ import path from 'node:path'
3
+ import { git_common_directory } from '#scripts/git/git-common-directory'
4
+ import { durable_state_migrate } from '#scripts/josh/durable-state-migrate'
5
+ import { PLATFORM_TEMP_ROOT, platform_temporary } from '#scripts/josh/platform-temporary'
6
+ import { stamp_file } from '#scripts/josh/stamp-file'
7
+
8
+ // **Which record goes where — the one place this is decided.** A record a run has to read again after
9
+ // the machine restarts lives here, in the common git directory: the carry and ended records, the event
10
+ // stream, the lane state and ledger, the wake log, the backlogrun launch record and log, the detached
11
+ // ship's log and result, and a lane child's dispatch log. macOS empties `/tmp` on every boot, and losing them
12
+ // there left the open lanes stateless, the merge statistics empty and a parked ship's failure
13
+ // unreadable. Everything that means nothing past the process that wrote it — a lock, a pid, a socket,
14
+ // a per-process cache — stays in `PLATFORM_TEMP_ROOT`, where a reboot clearing it is the right answer.
15
+ //
16
+ // **The common git directory rather than the home directory**, because a Codex lane's sandbox reads
17
+ // `$HOME` but may write the common git directory (`codex-agent-argv.ts`), and every lane of one
18
+ // repository shares it. A repository's own clone is also where `review-stops.jsonl` already lives.
19
+ // Outside a repository there is no such directory, and the record falls back to the temp root.
20
+ //
21
+ // **Records a run left in `/tmp` are copied in once per directory, and a log not written for two
22
+ // weeks is removed** (`durable-state-migrate.ts`).
23
+ //
24
+ // **`JOSH_TEMP_ROOT` moves this root too**, into a directory of its own beneath the override, so the unit
25
+ // suite's network guard keeps every record of a test run out of the live one exactly as before.
26
+ const RUN_STATE_DIRECTORY = 'run-state'
27
+ const OVERRIDE_STATE_DIRECTORY = 'josh-state'
28
+ const STATE_DIRECTORY_MODE = 0o700
29
+
30
+ function state_root(override: string | undefined, common: string | undefined): string {
31
+ if (override !== undefined && override !== '') {
32
+ return path.join(override, OVERRIDE_STATE_DIRECTORY)
33
+ }
34
+
35
+ if (common === undefined) return PLATFORM_TEMP_ROOT
36
+
37
+ return path.join(common, git_common_directory.STATE_DIRECTORY, RUN_STATE_DIRECTORY)
38
+ }
39
+
40
+ // Read once at import, as `PLATFORM_TEMP_ROOT` is, so both roots answer for the same override.
41
+ const STATE_ROOT_OVERRIDE = process.env[platform_temporary.TEMP_ROOT_KEY]
42
+
43
+ // The root for a named common git directory — what a launcher grants a sandboxed child before it runs.
44
+ function root_for(common: string | undefined): string {
45
+ return state_root(STATE_ROOT_OVERRIDE, common)
46
+ }
47
+
48
+ function root(): string {
49
+ return root_for(git_common_directory.repository())
50
+ }
51
+
52
+ // Every record kept here, by the prefix of its file name — the list the one-time copy from `/tmp`
53
+ // walks, so a record added here is carried over with the rest.
54
+ const PREFIX = {
55
+ CARRY: 'josh-run-carry-',
56
+ ENDED: 'josh-run-ended-',
57
+ EVENTS: 'josh-run-events-',
58
+ LANE_STATE: 'josh-lane-state-',
59
+ LANE_LEDGER: 'josh-lane-ledger-',
60
+ WAKE_LOG: 'josh-run-wake-log-',
61
+ BACKLOGRUN_LAUNCH: 'josh-backlogrun-launch-',
62
+ BACKLOGRUN_LOG: 'josh-backlogrun-log-',
63
+ SHIP_LOG: 'josh-ship-log-',
64
+ SHIP_RESULT: 'josh-ship-result-',
65
+ LANE_DISPATCH: 'josh-lane-dispatch-',
66
+ LANE_PLAN: 'josh-lane-plan-',
67
+ } as const
68
+
69
+ const PREFIXES: ReadonlyArray<string> = Object.values(PREFIX)
70
+
71
+ // Directories this process has already made ready, so the upkeep runs once rather than per lookup.
72
+ const ensured = new Set<string>()
73
+
74
+ function prepare(directory: string): void {
75
+ mkdirSync(directory, { recursive: true, mode: STATE_DIRECTORY_MODE })
76
+ durable_state_migrate.copy_once(PLATFORM_TEMP_ROOT, directory, PREFIXES)
77
+ durable_state_migrate.prune_stale_logs(directory, PREFIXES, Date.now())
78
+ }
79
+
80
+ // **A directory that cannot be created answers the temp root rather than throwing** — a sandbox that
81
+ // may not write the common git directory still runs, with the records `/tmp` always held.
82
+ function ensure(directory: string): string {
83
+ if (ensured.has(directory)) return directory
84
+
85
+ try {
86
+ prepare(directory)
87
+ } catch {
88
+ return PLATFORM_TEMP_ROOT
89
+ }
90
+
91
+ ensured.add(directory)
92
+
93
+ return directory
94
+ }
95
+
96
+ // The durable counterpart of `stamp_file.stamp_path`: the same per-account, per-key file name, in the
97
+ // directory above. The directory is created on the way, private to the account.
98
+ function durable_path(prefix: string, key_root: string, suffix?: string): string {
99
+ return path.join(ensure(root()), stamp_file.stamp_name(prefix, key_root, suffix))
100
+ }
101
+
102
+ const durable_state = {
103
+ PREFIX,
104
+ STATE_DIRECTORY_MODE,
105
+ ensure,
106
+ path: durable_path,
107
+ root,
108
+ root_for,
109
+ state_root,
110
+ }
111
+
112
+ export { durable_state }
@@ -0,0 +1,95 @@
1
+ // The `josh` subcommand aliases, in a leaf of their own (joshuafolkken/kit#5128).
2
+ //
3
+ // **A reader that only expands an alias imports no command table.** The table (`josh-command-map.ts`)
4
+ // imports every command module, so a module that imported it for `canonical_command` alone — the shell
5
+ // and bundle readers of `josh time` — carried every command module into each test that reached it, and
6
+ // a one-line change to any command table re-ran hundreds of unrelated tests under `josh test:related`.
7
+
8
+ const ALIASES: Record<string, string> = {
9
+ ga: 'gate',
10
+ l: 'lint',
11
+ lr: 'lint:related',
12
+ cr: 'check:related',
13
+ ln: 'lines',
14
+ by: 'bytes',
15
+ mt: 'metrics',
16
+ f: 'format',
17
+ sd: 'cspell:dot',
18
+ bh: 'behavior',
19
+ eu: 'exports:unused',
20
+ t: 'test',
21
+ tu: 'test:unit',
22
+ tr: 'test:related',
23
+ td: 'test:declared',
24
+ trd: 'test:red',
25
+ tpn: 'test:pinned',
26
+ te: 'test:e2e',
27
+ c: 'check',
28
+ pt: 'port',
29
+ i: 'init',
30
+ pf: 'profile',
31
+ st: 'start',
32
+ sy: 'sync',
33
+ un: 'uninstall',
34
+ g: 'git',
35
+ gp: 'pr',
36
+ ms: 'main:sync',
37
+ mm: 'main:merge',
38
+ bp: 'bump',
39
+ re: 'release',
40
+ v: 'version',
41
+ r: 'ranges',
42
+ dr: 'doctor',
43
+ rc: 'ruleset:check',
44
+ pg: 'propagate',
45
+ ad: 'adopt',
46
+ ov: 'overrides',
47
+ a: 'audit',
48
+ rt: 'reconcile-templates',
49
+ cdv: 'command:derive',
50
+ u: 'latest',
51
+ lc: 'latest:corepack',
52
+ lu: 'latest:update',
53
+ tm: 'time',
54
+ tmd: 'time:density',
55
+ rtr: 'retrospective',
56
+ ca: 'cost:audit',
57
+ rvf: 'review:findings',
58
+ rvs: 'review:stops',
59
+ ruv: 'rule:value',
60
+ ev: 'eval',
61
+ fr: 'fresh:run',
62
+ as: 'auth:setup',
63
+ lsm: 'lane:sample',
64
+ lst: 'lane:stats',
65
+ lva: 'lane:value',
66
+ lnt: 'lane:net',
67
+ lbd: 'lane:breakdown',
68
+ lli: 'lane:limit',
69
+ lrs: 'lane:restart',
70
+ lwd: 'lane:withdraw',
71
+ lps: 'lane:pause',
72
+ lru: 'lane:resume',
73
+ lad: 'lane:adopt',
74
+ blr: 'backlogrun',
75
+ }
76
+
77
+ // The canonical name of a `josh` subcommand: an alias expands, and anything else passes through
78
+ // unchanged.
79
+ //
80
+ // **The expansion is one rule, so it lives beside the table it reads.** Two readers had each written
81
+ // their own `ALIASES[name] ?? name` — the layer report and the gate-run count — and a third, the run
82
+ // measurement's command key, had not, so `pnpm josh ga` and `pnpm josh gate` were measured as two
83
+ // different commands. A lookup is small enough to copy and exactly the kind of copy that drifts: the
84
+ // two that had it disagreed with the one that did not about whether a call was the gate.
85
+ //
86
+ // **`Object.hasOwn` rather than a bare lookup**, because a subcommand spelled like a member of
87
+ // `Object.prototype` — `constructor`, `toString` — would otherwise come back as that member instead
88
+ // of as itself, and the caller would key a call by something that is not a command name at all.
89
+ function canonical_command(name: string): string {
90
+ if (!Object.hasOwn(ALIASES, name)) return name
91
+
92
+ return ALIASES[name] ?? name
93
+ }
94
+
95
+ export { ALIASES, canonical_command }
@@ -31,86 +31,5 @@ const COMMAND_MAP: Record<string, CommandEntry> = {
31
31
  ...CLONE_COMMANDS,
32
32
  }
33
33
 
34
- const ALIASES: Record<string, string> = {
35
- ga: 'gate',
36
- l: 'lint',
37
- lr: 'lint:related',
38
- ln: 'lines',
39
- by: 'bytes',
40
- mt: 'metrics',
41
- f: 'format',
42
- sd: 'cspell:dot',
43
- bh: 'behavior',
44
- eu: 'exports:unused',
45
- t: 'test',
46
- tu: 'test:unit',
47
- tr: 'test:related',
48
- td: 'test:declared',
49
- trd: 'test:red',
50
- tpn: 'test:pinned',
51
- te: 'test:e2e',
52
- c: 'check',
53
- pt: 'port',
54
- i: 'init',
55
- pf: 'profile',
56
- st: 'start',
57
- sy: 'sync',
58
- un: 'uninstall',
59
- g: 'git',
60
- gp: 'pr',
61
- ms: 'main:sync',
62
- mm: 'main:merge',
63
- bp: 'bump',
64
- re: 'release',
65
- v: 'version',
66
- r: 'ranges',
67
- dr: 'doctor',
68
- rc: 'ruleset:check',
69
- pg: 'propagate',
70
- ad: 'adopt',
71
- ov: 'overrides',
72
- a: 'audit',
73
- rt: 'reconcile-templates',
74
- u: 'latest',
75
- lc: 'latest:corepack',
76
- lu: 'latest:update',
77
- tm: 'time',
78
- tmd: 'time:density',
79
- rtr: 'retrospective',
80
- ca: 'cost:audit',
81
- rvf: 'review:findings',
82
- rvs: 'review:stops',
83
- ruv: 'rule:value',
84
- ev: 'eval',
85
- fr: 'fresh:run',
86
- as: 'auth:setup',
87
- lsm: 'lane:sample',
88
- lst: 'lane:stats',
89
- lli: 'lane:limit',
90
- lrs: 'lane:restart',
91
- lwd: 'lane:withdraw',
92
- lps: 'lane:pause',
93
- lru: 'lane:resume',
94
- blr: 'backlogrun',
95
- }
96
-
97
- // The canonical name of a `josh` subcommand: an alias expands, and anything else passes through
98
- // unchanged.
99
- //
100
- // **The expansion is one rule, so it lives beside the table it reads.** Two readers had each written
101
- // their own `ALIASES[name] ?? name` — the layer report and the gate-run count — and a third, the run
102
- // measurement's command key, had not, so `pnpm josh ga` and `pnpm josh gate` were measured as two
103
- // different commands. A lookup is small enough to copy and exactly the kind of copy that drifts: the
104
- // two that had it disagreed with the one that did not about whether a call was the gate.
105
- //
106
- // **`Object.hasOwn` rather than a bare lookup**, because a subcommand spelled like a member of
107
- // `Object.prototype` — `constructor`, `toString` — would otherwise come back as that member instead
108
- // of as itself, and the caller would key a call by something that is not a command name at all.
109
- function canonical_command(name: string): string {
110
- if (!Object.hasOwn(ALIASES, name)) return name
111
-
112
- return ALIASES[name] ?? name
113
- }
114
-
115
34
  export type { CommandCategory, CommandEntry } from './josh-command-types'
116
- export { ALIASES, CATEGORY_ORDER, COMMAND_MAP, canonical_command }
35
+ export { CATEGORY_ORDER, COMMAND_MAP }
@@ -26,17 +26,17 @@ const AGENT_HOOK_COMMANDS: Record<string, CommandEntry> = {
26
26
  category: 'Development',
27
27
  reference: ['', 'automation', ['none']],
28
28
  usage: { examples: [{ arguments: '', note: PRE_TOOL_USE }] },
29
- // **No `tsx_arguments`, deliberately.** `JOSH_BATCH_GUARD` and the other guard switches are
30
- // per-machine preferences kept in `.env`, which every other command reads through
31
- // `OPTIONAL_ENV_FILE_FLAGS` — but declaring any `tsx_arguments` disqualifies a command from
32
- // in-process dispatch (`josh-in-process.ts`), and this is the one PreToolUse hook consumers run
29
+ // **No `tsx_arguments`, deliberately.** The guards read `.env` for their other values, as other
30
+ // commands do through `OPTIONAL_ENV_FILE_FLAGS`; the guard switches themselves come from the
31
+ // launch environment alone (`josh-environment-file.ts`). But declaring any `tsx_arguments`
32
+ // disqualifies a command from in-process dispatch (`josh-in-process.ts`), and this is the one PreToolUse hook consumers run
33
33
  // before every guarded call, where a second ~0.16 s tsx start is not affordable. Each guard it
34
34
  // composes loads `.env` through the shared loader instead.
35
35
  },
36
36
  'stop:guard': {
37
37
  script: 'scripts/hooks/stop-guard.ts',
38
38
  description:
39
- 'Claude Code Stop hook: send the hold notify, release the hold and print the issue citations itself; block on the rules that need the model (reads the Stop payload on stdin)',
39
+ 'Claude Code Stop hook: send the hold notify and release the hold itself; block on the rules that need the model (reads the Stop payload on stdin)',
40
40
  category: 'Development',
41
41
  reference: ['', 'automation', ['none']],
42
42
  usage: {
@@ -59,7 +59,7 @@ const AGENT_HOOK_COMMANDS: Record<string, CommandEntry> = {
59
59
  },
60
60
  // **No `tsx_arguments`, deliberately**, the same as `pretool:guard` above: this runs on every
61
61
  // `UserPromptSubmit`, so it must stay eligible for in-process dispatch rather than pay a second
62
- // tsx start each turn. It calls `process.loadEnvFile` itself through the shared loader.
62
+ // tsx start each turn. It loads `.env` itself through the shared loader.
63
63
  },
64
64
  'codex:hook-adapter': {
65
65
  script: 'scripts/hooks/codex-hook-adapter.ts',
@@ -1,4 +1,4 @@
1
- import { core_budget } from '#scripts/gate/core-budget'
1
+ import { core_weights } from '#scripts/gate/core-weights'
2
2
  import type { CommandEntry } from './josh-command-types'
3
3
  import { BACKLOG_COMMANDS } from './josh-commands-backlog'
4
4
  import { DOCUMENT_COMMANDS } from './josh-commands-document'
@@ -82,7 +82,7 @@ const AI_COMMANDS: Record<string, CommandEntry> = {
82
82
  examples: [
83
83
  {
84
84
  arguments: '--cut',
85
- note: 'compare billed input per request with the shared 135,000 context-cut threshold',
85
+ note: 'compare billed input per request with the context-cut threshold priced at the session model',
86
86
  },
87
87
  { arguments: '--over <tokens>', note: 'compare with an explicit limit' },
88
88
  { arguments: `--cut ${PATH_DIR}`, note: 'Anthropic project or current OpenAI worktree' },
@@ -179,7 +179,7 @@ const AI_COMMANDS: Record<string, CommandEntry> = {
179
179
  {
180
180
  names: [PATH_DIR],
181
181
  description:
182
- "read another project's lane transcripts, as `josh time` does. Run it from the main checkout — a lane reads only its own transcript.",
182
+ "read another project's lane transcripts, as `josh time` does. Run from a lane, it reads its main checkout's lanes.",
183
183
  },
184
184
  ],
185
185
  },
@@ -190,8 +190,8 @@ const AI_COMMANDS: Record<string, CommandEntry> = {
190
190
  "Aggregate a finished run's cost, review findings, observation ledger and events into one digest",
191
191
  category: 'AI tools',
192
192
  reference: ['', 'maintainer', ['none']],
193
- core_weight: core_budget.CORE_WEIGHTS.retrospective,
194
- memory_mb: core_budget.MEMORY_MB.retrospective,
193
+ core_weight: core_weights.CORE_WEIGHTS.retrospective,
194
+ memory_mb: core_weights.MEMORY_MB.retrospective,
195
195
  // Kit-only: it reads kit's own development run — the transcript store, the review ledger and the
196
196
  // run event stream — so it means nothing in a consumer project and is dropped from a consumer's
197
197
  // help, through the same declaration `josh time` uses for the same reason.