@joshuafolkken/kit 1.1229.0 → 1.1370.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 (939) hide show
  1. package/.claude/agents/investigator.md +1 -0
  2. package/.claude/settings.json +4 -0
  3. package/.claude/skills/dependency-update/SKILL.md +5 -3
  4. package/.claude/skills/epic-commands/SKILL.md +82 -113
  5. package/.claude/skills/epic-commands/epic-bundle.md +38 -63
  6. package/.claude/skills/epic-commands/execution-waves.md +30 -51
  7. package/.claude/skills/verify-ui/SKILL.md +13 -20
  8. package/.claude/skills/workflow-commands/SKILL.md +10 -10
  9. package/.claude/skills/workflow-commands/background-commands.md +4 -4
  10. package/.claude/skills/workflow-commands/backlogrun-child.md +30 -105
  11. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +29 -0
  12. package/.claude/skills/workflow-commands/backlogrun-lanes.md +45 -131
  13. package/.claude/skills/workflow-commands/backlogrun-park.md +36 -53
  14. package/.claude/skills/workflow-commands/backlogrun-progress.md +81 -331
  15. package/.claude/skills/workflow-commands/backlogrun-recovery.md +29 -83
  16. package/.claude/skills/workflow-commands/backlogrun-steps.md +105 -424
  17. package/.claude/skills/workflow-commands/backlogrun.md +50 -61
  18. package/.claude/skills/workflow-commands/chain-rule.md +36 -40
  19. package/.claude/skills/workflow-commands/entry-sequence.md +6 -6
  20. package/.claude/skills/workflow-commands/followup.md +24 -20
  21. package/.claude/skills/workflow-commands/fullrun-steps.md +23 -27
  22. package/.claude/skills/workflow-commands/fullrun.md +10 -10
  23. package/.claude/skills/workflow-commands/halfrun.md +9 -8
  24. package/.claude/skills/workflow-commands/into-target.md +12 -18
  25. package/.claude/skills/workflow-commands/issue-comments.md +11 -26
  26. package/.claude/skills/workflow-commands/kickoff.md +27 -16
  27. package/.claude/skills/workflow-commands/latest-gate.md +18 -29
  28. package/.claude/skills/workflow-commands/needs-human-review.md +13 -24
  29. package/.claude/skills/workflow-commands/observation-filing.md +37 -28
  30. package/.claude/skills/workflow-commands/observation-ledger.md +48 -38
  31. package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -9
  32. package/.claude/skills/workflow-commands/prerequisite.md +23 -15
  33. package/.claude/skills/workflow-commands/progress-watcher.md +17 -11
  34. package/.claude/skills/workflow-commands/prrun.md +3 -3
  35. package/.claude/skills/workflow-commands/retrospective.md +13 -18
  36. package/.claude/skills/workflow-commands/split-assessment.md +6 -4
  37. package/.claude/skills/workflow-commands/target-repository.md +25 -28
  38. package/.claude/skills/workflow-commands/working-tree-hold.md +11 -17
  39. package/.gitattributes +2 -1
  40. package/.github/workflows/ci.yml +14 -0
  41. package/.github/workflows/publish.yml +2 -0
  42. package/.vscode/tasks.json +14 -0
  43. package/CLAUDE.md +10 -61
  44. package/README.md +38 -57
  45. package/SECURITY.md +1 -1
  46. package/dist/CLAUDE.md +10 -61
  47. package/dist/commands/document-section-cli.js +42 -10
  48. package/dist/config-merge/index.js +11 -2
  49. package/dist/hooks/audit-provision.js +2 -2
  50. package/dist/hooks/batch-guard.js +7 -7
  51. package/dist/hooks/{chunk-FIVDHQGT.js → chunk-43G45XJF.js} +18 -20
  52. package/dist/hooks/{chunk-JUDKDCDP.js → chunk-4TW4MQUL.js} +284 -362
  53. package/dist/hooks/{chunk-5VMKCCC4.js → chunk-76RK6E3H.js} +13 -11
  54. package/dist/hooks/{chunk-RNWHN5BP.js → chunk-DZWZ3DKY.js} +4 -4
  55. package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
  56. package/dist/hooks/{chunk-VC3PZPZO.js → chunk-GG72ANKI.js} +1 -1
  57. package/dist/hooks/{chunk-6HJJXRBX.js → chunk-KPM4YIIX.js} +8 -44
  58. package/dist/hooks/chunk-MXVQMLDP.js +3705 -0
  59. package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
  60. package/dist/hooks/{chunk-TQNPDZNH.js → chunk-NZBHG6FW.js} +7 -5
  61. package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
  62. package/dist/hooks/{chunk-F56MFS4B.js → chunk-R6CRQEAL.js} +4 -4
  63. package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
  64. package/dist/hooks/{chunk-55HHG5PX.js → chunk-TLJYAGZK.js} +799 -903
  65. package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
  66. package/dist/hooks/codex-hook-adapter.js +26 -21
  67. package/dist/hooks/duplicate-read-guard.js +8 -8
  68. package/dist/hooks/format-edited.js +4 -4
  69. package/dist/hooks/inputs.json +213 -197
  70. package/dist/hooks/investigation-guard.js +8 -8
  71. package/dist/hooks/pretool-guard.js +15 -15
  72. package/dist/hooks/session-lang.js +406 -8
  73. package/dist/hooks/stop-guard.js +122 -201
  74. package/dist/josh.js +540 -137
  75. package/dist/version/index.js +15 -13
  76. package/eslint/base.js +43 -5
  77. package/eslint/rules/english-only-prose.js +3 -3
  78. package/eslint/rules/import.js +12 -0
  79. package/eslint/rules/namespace-object-export.js +2 -2
  80. package/package.json +16 -10
  81. package/pnpm-workspace.yaml +2 -4
  82. package/prompts/coding-standards.md +14 -48
  83. package/prompts/collaboration-workflow/file-edits.md +1 -1
  84. package/prompts/collaboration-workflow/issue-citation.md +1 -1
  85. package/prompts/collaboration-workflow/issue-template.md +4 -10
  86. package/prompts/collaboration-workflow/operating-rules.md +7 -8
  87. package/prompts/collaboration-workflow/output-bounds.md +1 -1
  88. package/prompts/collaboration-workflow/overview.md +1 -1
  89. package/prompts/collaboration-workflow/plan-comment.md +2 -1
  90. package/prompts/collaboration-workflow/principles.md +21 -3
  91. package/prompts/collaboration-workflow/report-format.md +16 -29
  92. package/prompts/collaboration-workflow/residency.md +1 -1
  93. package/prompts/collaboration-workflow/rule-delivery.md +7 -95
  94. package/prompts/collaboration-workflow/shell-body.md +3 -23
  95. package/prompts/collaboration-workflow/turn-batching.md +4 -13
  96. package/prompts/collaboration-workflow/wip-cap.md +5 -11
  97. package/prompts/refactoring.md +1 -1
  98. package/prompts/review-rubric.md +3 -22
  99. package/prompts/review.md +15 -38
  100. package/prompts/testing-guide.md +2 -4
  101. package/scripts/adopt/adopt-logic.ts +5 -5
  102. package/scripts/adopt/adopt-toolkits.ts +4 -5
  103. package/scripts/adopt/adopt.ts +2 -3
  104. package/scripts/agent/agent-argv.ts +7 -7
  105. package/scripts/agent/agent-diagnostics.ts +2 -2
  106. package/scripts/agent/agent-exit-record.ts +1 -1
  107. package/scripts/agent/agent-headless.ts +1 -1
  108. package/scripts/agent/agent-launch-environment.ts +6 -1
  109. package/scripts/agent/agent-role-profile.ts +49 -22
  110. package/scripts/agent/agent-session-role.ts +32 -0
  111. package/scripts/agent/api-outage.ts +1 -1
  112. package/scripts/agent/claude-agent-argv.ts +4 -4
  113. package/scripts/agent/claude-result-event.ts +4 -4
  114. package/scripts/agent/codex-hooks.ts +2 -2
  115. package/scripts/agent/interactive-ask.ts +3 -6
  116. package/scripts/auto-ok/auto-ok-cli.ts +46 -60
  117. package/scripts/backlog/backlog-arrival-added.ts +34 -0
  118. package/scripts/backlog/backlog-arrival.ts +54 -17
  119. package/scripts/backlog/backlog-budget-cli.ts +34 -6
  120. package/scripts/backlog/backlog-budget.ts +17 -24
  121. package/scripts/backlog/backlog-defect-priority.ts +1 -1
  122. package/scripts/backlog/backlog-drive-args.ts +5 -4
  123. package/scripts/backlog/backlog-drive-cli.ts +14 -10
  124. package/scripts/backlog/backlog-drive-epic.ts +85 -0
  125. package/scripts/backlog/backlog-drive-launch.ts +1 -1
  126. package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
  127. package/scripts/backlog/backlog-drive-named.ts +39 -9
  128. package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
  129. package/scripts/backlog/backlog-drive-restore.ts +1 -1
  130. package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
  131. package/scripts/backlog/backlog-drive.ts +43 -28
  132. package/scripts/backlog/backlog-idle.ts +88 -0
  133. package/scripts/backlog/backlog-named.ts +11 -15
  134. package/scripts/backlog/backlog-next.ts +26 -30
  135. package/scripts/backlog/backlog-offer-cli.ts +28 -23
  136. package/scripts/backlog/backlog-offer.ts +7 -7
  137. package/scripts/backlog/backlog-overlap.ts +178 -0
  138. package/scripts/backlog/backlog-plan-cli.ts +14 -90
  139. package/scripts/backlog/backlog-plan-read.ts +111 -0
  140. package/scripts/backlog/backlog-plan.ts +11 -10
  141. package/scripts/backlog/backlog-pool.ts +13 -14
  142. package/scripts/backlog/backlog-rank.ts +11 -11
  143. package/scripts/backlog/backlog-ready.ts +15 -10
  144. package/scripts/backlog/backlog-scope.ts +14 -15
  145. package/scripts/backlog/backlog-stalled-cli.ts +2 -2
  146. package/scripts/backlog/backlog-stalled-detect.ts +4 -4
  147. package/scripts/backlog/backlog-stalled.ts +5 -6
  148. package/scripts/backlog/backlog-waves.ts +4 -4
  149. package/scripts/backlog/backlogrun-args.ts +74 -0
  150. package/scripts/backlog/backlogrun-cli.ts +113 -0
  151. package/scripts/backlog/backlogrun-launch.ts +178 -0
  152. package/scripts/behavior/behavior-assertion.ts +6 -8
  153. package/scripts/behavior/behavior-cli.ts +1 -1
  154. package/scripts/behavior/behavior-rules.ts +3 -3
  155. package/scripts/build/build-claude-md.ts +4 -4
  156. package/scripts/build/build-codex-hooks.ts +2 -2
  157. package/scripts/build/build-commands.ts +1 -1
  158. package/scripts/build/build-hooks.ts +5 -5
  159. package/scripts/build/build.ts +1 -1
  160. package/scripts/build/hook-bundle-stamp.ts +109 -7
  161. package/scripts/build/local-bin.ts +2 -2
  162. package/scripts/cases/cases-cli.ts +1 -1
  163. package/scripts/cases/cases-logic.ts +2 -2
  164. package/scripts/ci/composite-actions.ts +1 -2
  165. package/scripts/ci/pr-classification.ts +2 -2
  166. package/scripts/claude/workflow-destination.ts +1 -1
  167. package/scripts/clone/clone-aggregate.ts +1 -1
  168. package/scripts/clone/clone-fingerprint.ts +1 -1
  169. package/scripts/clone/clone-scan-cli.ts +1 -1
  170. package/scripts/clone/clone-scan.ts +1 -1
  171. package/scripts/config-merge/index.ts +1 -1
  172. package/scripts/config-merge/json-format.ts +1 -3
  173. package/scripts/config-merge/patch-json-array.ts +90 -0
  174. package/scripts/config-merge/patch-json-key.ts +6 -3
  175. package/scripts/config-merge/patch-json-list.ts +1 -1
  176. package/scripts/cost-runtime/codex-usage.ts +1 -1
  177. package/scripts/cost-runtime/context-cut-payback.ts +4 -5
  178. package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
  179. package/scripts/cost-runtime/cost-attribute.ts +3 -3
  180. package/scripts/cost-runtime/cost-blocks.ts +3 -4
  181. package/scripts/cost-runtime/cost-cli.ts +14 -11
  182. package/scripts/cost-runtime/cost-corpus.ts +11 -11
  183. package/scripts/cost-runtime/cost-pricing.ts +4 -4
  184. package/scripts/cost-runtime/cost-tokens.ts +1 -2
  185. package/scripts/cost-runtime/cost-transcript.ts +29 -29
  186. package/scripts/cost-runtime/cost-usage.ts +6 -7
  187. package/scripts/cost-runtime/cost-verdict.ts +10 -11
  188. package/scripts/cost-runtime/own-session.ts +1 -1
  189. package/scripts/cost-runtime/transcript-cwd.ts +2 -2
  190. package/scripts/delegation/delegation-cli.ts +4 -4
  191. package/scripts/delegation/delegation-policy.ts +13 -15
  192. package/scripts/delegation/duplicate-read-guard.ts +9 -10
  193. package/scripts/delegation/fanout-cli.ts +1 -1
  194. package/scripts/delegation/fanout.ts +1 -1
  195. package/scripts/delegation/investigation-guard.ts +18 -22
  196. package/scripts/delegation/investigation-reads.ts +48 -238
  197. package/scripts/discovery/repo-discovery.ts +1 -1
  198. package/scripts/discovery/repo-map-logic.ts +1 -2
  199. package/scripts/discovery/repo-origin.ts +3 -3
  200. package/scripts/discovery/repo-party-cli.ts +2 -2
  201. package/scripts/discovery/repo-party.ts +2 -2
  202. package/scripts/doctor/doctor-consumer.ts +1 -1
  203. package/scripts/doctor/doctor-io.ts +6 -7
  204. package/scripts/doctor/doctor-logic.ts +1 -1
  205. package/scripts/doctor/doctor-ports.ts +1 -1
  206. package/scripts/doctor/doctor.ts +8 -9
  207. package/scripts/document/backlogrun-parent-read-set.ts +5 -6
  208. package/scripts/document/bash-output-cap.ts +5 -7
  209. package/scripts/document/capped-print-part.ts +1 -1
  210. package/scripts/document/capped-print.ts +1 -1
  211. package/scripts/document/document-byte-budget.ts +33 -64
  212. package/scripts/document/document-byte-check.ts +4 -4
  213. package/scripts/document/document-reachability.ts +7 -8
  214. package/scripts/document/document-read-cli.ts +2 -2
  215. package/scripts/document/document-scan.ts +26 -2
  216. package/scripts/document/document-section-cli.ts +6 -8
  217. package/scripts/document/document-section.ts +8 -12
  218. package/scripts/document/edit-files-cli.ts +3 -4
  219. package/scripts/document/entry-read-budget.ts +8 -70
  220. package/scripts/document/entry-read-set.ts +51 -34
  221. package/scripts/document/lane-child-read-set.ts +9 -9
  222. package/scripts/document/read-files-cli.ts +1 -2
  223. package/scripts/document/read-set-cli.ts +16 -19
  224. package/scripts/document/read-set-cost.ts +4 -4
  225. package/scripts/document/read-set-point-of-use.ts +28 -38
  226. package/scripts/document/read-set-pricing.ts +1 -1
  227. package/scripts/document/read-set-trim.ts +3 -3
  228. package/scripts/document/resident-budget.ts +8 -10
  229. package/scripts/epic/epic-add-body.ts +15 -18
  230. package/scripts/epic/epic-add-plan.ts +26 -28
  231. package/scripts/epic/epic-add.ts +32 -25
  232. package/scripts/epic/epic-audit-checks.ts +27 -37
  233. package/scripts/epic/epic-audit-cli.ts +21 -22
  234. package/scripts/epic/epic-audit-orphans.ts +16 -17
  235. package/scripts/epic/epic-audit-rationale.ts +10 -15
  236. package/scripts/epic/epic-audit-report.ts +2 -5
  237. package/scripts/epic/epic-audit.ts +18 -14
  238. package/scripts/epic/epic-body.ts +10 -10
  239. package/scripts/epic/epic-bundle-cli.ts +36 -34
  240. package/scripts/epic/epic-bundle-evidence.ts +5 -5
  241. package/scripts/epic/epic-bundle-gaps.ts +6 -9
  242. package/scripts/epic/epic-bundle-poll.ts +1 -1
  243. package/scripts/epic/epic-bundle-referenced.ts +11 -14
  244. package/scripts/epic/epic-bundle.ts +19 -20
  245. package/scripts/epic/epic-busy.ts +44 -21
  246. package/scripts/epic/epic-candidate-confirm.ts +15 -18
  247. package/scripts/epic/epic-chains.ts +18 -23
  248. package/scripts/epic/epic-classify.ts +11 -12
  249. package/scripts/epic/epic-cli-argv.ts +5 -6
  250. package/scripts/epic/epic-cli-remove.ts +9 -4
  251. package/scripts/epic/epic-cli.ts +38 -26
  252. package/scripts/epic/epic-close-comment.ts +14 -15
  253. package/scripts/epic/epic-close.ts +25 -29
  254. package/scripts/epic/epic-cross-repo.ts +18 -21
  255. package/scripts/epic/epic-decision.ts +14 -18
  256. package/scripts/epic/epic-fetch.ts +25 -31
  257. package/scripts/epic/epic-graph.ts +15 -17
  258. package/scripts/epic/epic-index.ts +14 -16
  259. package/scripts/epic/epic-issue.ts +9 -11
  260. package/scripts/epic/epic-label-age.ts +74 -0
  261. package/scripts/epic/epic-lane-offer.ts +35 -24
  262. package/scripts/epic/epic-nested.ts +1 -1
  263. package/scripts/epic/epic-next-read.ts +8 -8
  264. package/scripts/epic/epic-next-views.ts +12 -12
  265. package/scripts/epic/epic-next.ts +29 -33
  266. package/scripts/epic/epic-outside-blocker.ts +11 -10
  267. package/scripts/epic/epic-parse.ts +22 -24
  268. package/scripts/epic/epic-promote.ts +3 -2
  269. package/scripts/epic/epic-rank.ts +1 -1
  270. package/scripts/epic/epic-read.ts +10 -8
  271. package/scripts/epic/epic-reconcile.ts +8 -6
  272. package/scripts/epic/epic-reference.ts +5 -4
  273. package/scripts/epic/epic-relation-recheck.ts +10 -11
  274. package/scripts/epic/epic-relations.ts +9 -8
  275. package/scripts/epic/epic-remove-plan.ts +4 -5
  276. package/scripts/epic/epic-remove.ts +7 -5
  277. package/scripts/epic/epic-report.ts +18 -20
  278. package/scripts/epic/epic-run.ts +6 -5
  279. package/scripts/epic/epic-sections.ts +2 -2
  280. package/scripts/epic/epic-shape.ts +3 -3
  281. package/scripts/epic/epic-solo-stale.ts +3 -2
  282. package/scripts/epic/epic-solo.ts +8 -8
  283. package/scripts/epic/epic-triage.ts +5 -4
  284. package/scripts/epic/epic-validate.ts +8 -7
  285. package/scripts/epic/epic.ts +5 -5
  286. package/scripts/exports/unused-members-cli.ts +1 -1
  287. package/scripts/followup/followup-issue-number.ts +1 -2
  288. package/scripts/followup/git-followup-cleanup.ts +6 -7
  289. package/scripts/followup/git-followup-finish.ts +11 -13
  290. package/scripts/followup/git-followup-flush.ts +11 -7
  291. package/scripts/followup/git-followup-issue-close.ts +16 -13
  292. package/scripts/followup/git-followup-label.ts +9 -6
  293. package/scripts/followup/git-followup-merged.ts +1 -1
  294. package/scripts/followup/git-followup-pending.ts +7 -9
  295. package/scripts/followup/git-followup-stages.ts +28 -17
  296. package/scripts/followup/git-followup-workflow.ts +19 -21
  297. package/scripts/followup/git-pr-followup-checks.ts +13 -20
  298. package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
  299. package/scripts/followup/git-pr-followup.ts +18 -17
  300. package/scripts/gate/core-admission.ts +162 -0
  301. package/scripts/gate/core-budget.ts +134 -91
  302. package/scripts/gate/gate-ledger.ts +114 -0
  303. package/scripts/gate/gate-log.ts +7 -9
  304. package/scripts/gate/gate-plan.ts +103 -35
  305. package/scripts/gate/gate-report.ts +39 -21
  306. package/scripts/gate/gate-skip.ts +11 -13
  307. package/scripts/gate/gate-steps.ts +5 -1
  308. package/scripts/gate/gate-tree.ts +3 -4
  309. package/scripts/gate/hook-gate-reuse.ts +9 -9
  310. package/scripts/gate/machine-capacity.ts +313 -0
  311. package/scripts/gate/pre-commit-type-check.ts +4 -4
  312. package/scripts/gate/project-checks.ts +12 -4
  313. package/scripts/gate/scoped-green.ts +11 -18
  314. package/scripts/gate/type-check-command.ts +2 -2
  315. package/scripts/gate/type-check-step.ts +4 -4
  316. package/scripts/gate/verification-gate.ts +60 -53
  317. package/scripts/gh/gh-spawn.ts +2 -2
  318. package/scripts/gh/git-ai-review-scan.ts +3 -2
  319. package/scripts/gh/git-gh-api-path.ts +10 -11
  320. package/scripts/gh/git-gh-exec.ts +43 -48
  321. package/scripts/gh/git-gh-failure.ts +6 -9
  322. package/scripts/gh/git-gh-helpers.ts +1 -1
  323. package/scripts/gh/git-gh-issue-list.ts +15 -19
  324. package/scripts/gh/git-gh-issue-read.ts +43 -60
  325. package/scripts/gh/git-gh-issue-rest.ts +14 -15
  326. package/scripts/gh/git-gh-issue-write.ts +52 -40
  327. package/scripts/gh/git-gh-issue.ts +23 -24
  328. package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
  329. package/scripts/gh/git-gh-pr-read.ts +46 -50
  330. package/scripts/gh/git-gh-pr-rest.ts +23 -26
  331. package/scripts/gh/git-gh-pr-review.ts +2 -2
  332. package/scripts/gh/git-gh-pr-rollup.ts +4 -4
  333. package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
  334. package/scripts/gh/git-gh-pr.ts +16 -16
  335. package/scripts/gh/git-gh-reachability.ts +11 -12
  336. package/scripts/gh/git-gh-repo.ts +2 -3
  337. package/scripts/gh/git-gh-rest-state.ts +1 -1
  338. package/scripts/gh/git-pr-ai-review.ts +6 -5
  339. package/scripts/gh/git-pr-checks-eval.ts +28 -30
  340. package/scripts/gh/git-pr-checks-parse.ts +14 -16
  341. package/scripts/gh/git-pr-checks-watch.ts +17 -17
  342. package/scripts/gh/git-pr-checks.ts +20 -23
  343. package/scripts/gh/git-pr-coderabbit.ts +8 -6
  344. package/scripts/gh/git-pr-confirmation.ts +5 -5
  345. package/scripts/gh/git-pr-managed-config.ts +7 -9
  346. package/scripts/gh/git-pr-messages.ts +1 -1
  347. package/scripts/gh/git-pr.ts +15 -16
  348. package/scripts/gh/github-issue-url.ts +8 -9
  349. package/scripts/git/base-tree.ts +66 -0
  350. package/scripts/git/change-base.ts +42 -2
  351. package/scripts/git/changed-file-scope.ts +5 -5
  352. package/scripts/git/changed-paths.ts +1 -2
  353. package/scripts/git/constants.ts +2 -2
  354. package/scripts/git/git-branch.ts +1 -1
  355. package/scripts/git/git-closes-keyword.ts +3 -3
  356. package/scripts/git/git-command.ts +53 -41
  357. package/scripts/git/git-common-directory.ts +3 -3
  358. package/scripts/git/git-diff-reads.ts +14 -15
  359. package/scripts/git/git-error.ts +1 -1
  360. package/scripts/git/git-execa-error.ts +1 -2
  361. package/scripts/git/git-issue.ts +10 -8
  362. package/scripts/git/git-location-environment.ts +3 -4
  363. package/scripts/git/git-ls-remote.ts +6 -8
  364. package/scripts/git/git-pre-push-hook.ts +11 -10
  365. package/scripts/git/git-preflight.ts +5 -5
  366. package/scripts/git/git-push-transport.ts +2 -2
  367. package/scripts/git/git-remote-branch.ts +1 -2
  368. package/scripts/git/git-schemas.ts +16 -23
  369. package/scripts/git/git-spawn-sync.ts +1 -1
  370. package/scripts/git/git-spawn.ts +37 -14
  371. package/scripts/git/git-ssh-keepalive.ts +12 -5
  372. package/scripts/git/git-staging.ts +7 -8
  373. package/scripts/git/git-workflow.ts +1 -1
  374. package/scripts/git/git-worktree.ts +35 -27
  375. package/scripts/git/gone-branch.ts +2 -2
  376. package/scripts/git/listing-cutoff.ts +1 -2
  377. package/scripts/git/lockfile-sync.ts +65 -0
  378. package/scripts/git/main-merge-guard.ts +1 -2
  379. package/scripts/git/main-merge.ts +7 -7
  380. package/scripts/git/main-sync.ts +23 -8
  381. package/scripts/git/parse-json-array.ts +18 -23
  382. package/scripts/git/repository-lock.ts +34 -2
  383. package/scripts/git/stash/git-stash.ts +4 -5
  384. package/scripts/git/stash/stash-orphans.ts +5 -3
  385. package/scripts/git/stash/stash-pop-args.ts +1 -1
  386. package/scripts/git/stash/stash-pop-cli.ts +3 -3
  387. package/scripts/git/stash/stash-sweep-lock.ts +2 -2
  388. package/scripts/hooks/batch-guard.ts +11 -13
  389. package/scripts/hooks/check-commit-message.ts +12 -9
  390. package/scripts/hooks/codex-hook-adapter.ts +16 -10
  391. package/scripts/hooks/edited-cspell.ts +3 -4
  392. package/scripts/hooks/format-edited-cli.ts +1 -1
  393. package/scripts/hooks/format-edited-file.ts +11 -17
  394. package/scripts/hooks/format-rewrite-notice.ts +19 -17
  395. package/scripts/hooks/pre-push-unit.ts +10 -14
  396. package/scripts/hooks/pretool-guard-cli.ts +4 -4
  397. package/scripts/hooks/pretool-guard.ts +93 -18
  398. package/scripts/hooks/reserved-run.ts +2 -2
  399. package/scripts/hooks/step-zero-notice.ts +1 -1
  400. package/scripts/hooks/stop-guard.ts +21 -10
  401. package/scripts/init/basic-path-migration.ts +2 -2
  402. package/scripts/init/claude-kit-only-settings.ts +2 -2
  403. package/scripts/init/claude-plugin-config.ts +2 -2
  404. package/scripts/init/distributed-paths.ts +4 -4
  405. package/scripts/init/hook-command-rewrite.ts +3 -3
  406. package/scripts/init/hook-launch.ts +5 -5
  407. package/scripts/init/init-actions.ts +13 -0
  408. package/scripts/init/init-ai-copy.ts +11 -11
  409. package/scripts/init/init-bootstrap.ts +3 -3
  410. package/scripts/init/init-copy-content.ts +4 -4
  411. package/scripts/init/init-logic-json-merge.ts +7 -9
  412. package/scripts/init/init-logic-migrate.ts +1 -1
  413. package/scripts/init/init-logic-templates.ts +1 -1
  414. package/scripts/init/init-logic-workspace.ts +4 -4
  415. package/scripts/init/init-logic-yaml-merge.ts +2 -2
  416. package/scripts/init/init-logic.ts +19 -22
  417. package/scripts/init/init.ts +12 -8
  418. package/scripts/init/kit-base-preset.ts +1 -1
  419. package/scripts/init/kit-setup-state.ts +1 -1
  420. package/scripts/init/kit-written-paths.ts +1 -2
  421. package/scripts/init/package-manager-pin.ts +35 -0
  422. package/scripts/init/project-profile-cli.ts +1 -1
  423. package/scripts/init/project-profile.ts +3 -3
  424. package/scripts/init/session-language-environment.ts +1 -1
  425. package/scripts/init/start-exec.ts +3 -4
  426. package/scripts/init/start-plan.ts +2 -2
  427. package/scripts/init/start-setup-pr.ts +3 -2
  428. package/scripts/init/start-steps.ts +2 -2
  429. package/scripts/init/tsconfig-preset-migration.ts +1 -1
  430. package/scripts/init/vscode-tasks.ts +62 -0
  431. package/scripts/issue/baseline-measure.ts +2 -2
  432. package/scripts/issue/behavior-change-lint.ts +2 -2
  433. package/scripts/issue/defect-rate-cli.ts +6 -7
  434. package/scripts/issue/defect-rate.ts +37 -27
  435. package/scripts/issue/git-next-issues.ts +9 -8
  436. package/scripts/issue/issue-auto-ok.ts +49 -11
  437. package/scripts/issue/issue-backlinks-cli.ts +5 -5
  438. package/scripts/issue/issue-backlinks.ts +6 -6
  439. package/scripts/issue/issue-cite-cli.ts +20 -18
  440. package/scripts/issue/issue-cite.ts +18 -8
  441. package/scripts/issue/issue-closing-pr.ts +4 -4
  442. package/scripts/issue/issue-comment-cli.ts +6 -4
  443. package/scripts/issue/issue-file-cli.ts +75 -15
  444. package/scripts/issue/issue-file-fold.ts +155 -0
  445. package/scripts/issue/issue-file.ts +14 -6
  446. package/scripts/issue/issue-fold-cli.ts +14 -9
  447. package/scripts/issue/issue-fold.ts +23 -8
  448. package/scripts/issue/issue-labels.ts +46 -37
  449. package/scripts/issue/issue-lint-cli.ts +2 -2
  450. package/scripts/issue/issue-lint.ts +1 -1
  451. package/scripts/issue/issue-merged.ts +10 -4
  452. package/scripts/issue/issue-number-shape.ts +27 -0
  453. package/scripts/issue/issue-rank.ts +1 -1
  454. package/scripts/issue/issue-read-cli.ts +4 -5
  455. package/scripts/issue/issue-read.ts +4 -5
  456. package/scripts/issue/issue-reference.ts +5 -5
  457. package/scripts/issue/issue-release-cli.ts +165 -0
  458. package/scripts/issue/issue-release.ts +58 -0
  459. package/scripts/issue/issue-report-failures.ts +7 -4
  460. package/scripts/issue/issue-scout-cli.ts +11 -11
  461. package/scripts/issue/issue-scout-closed.ts +4 -4
  462. package/scripts/issue/issue-scout.ts +4 -5
  463. package/scripts/issue/issue-state-cli.ts +17 -10
  464. package/scripts/issue/issue-state.ts +12 -13
  465. package/scripts/issue/issue-wip.ts +7 -7
  466. package/scripts/issue/markdown-section.ts +3 -3
  467. package/scripts/issue/measure-rerun-cli.ts +10 -9
  468. package/scripts/issue/reproduction-measure.ts +3 -3
  469. package/scripts/issue/session-cite.ts +56 -0
  470. package/scripts/josh/agent-session-environment.ts +10 -8
  471. package/scripts/josh/cli-body.ts +2 -2
  472. package/scripts/josh/command-suggest.ts +1 -1
  473. package/scripts/josh/file-map-stamp.ts +20 -23
  474. package/scripts/josh/hook-decision.ts +24 -28
  475. package/scripts/josh/josh-command-map.ts +4 -1
  476. package/scripts/josh/josh-command-types.ts +32 -34
  477. package/scripts/josh/josh-commands-ai.ts +6 -6
  478. package/scripts/josh/josh-commands-backlog.ts +15 -3
  479. package/scripts/josh/josh-commands-clone.ts +1 -1
  480. package/scripts/josh/josh-commands-development.ts +33 -4
  481. package/scripts/josh/josh-commands-document.ts +3 -3
  482. package/scripts/josh/josh-commands-guard.ts +3 -3
  483. package/scripts/josh/josh-commands-issue.ts +11 -5
  484. package/scripts/josh/josh-commands-lane.ts +16 -5
  485. package/scripts/josh/josh-commands-lint.ts +1 -1
  486. package/scripts/josh/josh-commands-maintenance.ts +2 -2
  487. package/scripts/josh/josh-commands-run.ts +20 -6
  488. package/scripts/josh/josh-commands-split.ts +1 -2
  489. package/scripts/josh/josh-commands-versioning.ts +5 -5
  490. package/scripts/josh/josh-commands-workflow.ts +30 -22
  491. package/scripts/josh/josh-environment-file.ts +1 -1
  492. package/scripts/josh/josh-in-process.ts +3 -3
  493. package/scripts/josh/josh-logic.ts +10 -10
  494. package/scripts/josh/josh-run.ts +3 -3
  495. package/scripts/josh/josh-verdict.ts +9 -12
  496. package/scripts/josh/josh.ts +3 -3
  497. package/scripts/josh/kit-only.ts +2 -2
  498. package/scripts/josh/path-decision.ts +3 -3
  499. package/scripts/josh/platform-temporary.ts +7 -5
  500. package/scripts/josh/process-identity.ts +24 -6
  501. package/scripts/josh/process-owner.ts +4 -4
  502. package/scripts/josh/session-language-cli.ts +53 -11
  503. package/scripts/josh/session-language.ts +1 -1
  504. package/scripts/josh/stamp-file.ts +48 -29
  505. package/scripts/josh/stamp-record.ts +57 -0
  506. package/scripts/lane/lane-await.ts +35 -11
  507. package/scripts/lane/lane-cache.ts +6 -6
  508. package/scripts/lane/lane-capacity.ts +32 -17
  509. package/scripts/lane/lane-child-invocation.ts +17 -15
  510. package/scripts/lane/lane-child-marker.ts +12 -12
  511. package/scripts/lane/lane-cli.ts +20 -13
  512. package/scripts/lane/lane-close.ts +6 -6
  513. package/scripts/lane/lane-dispatch.ts +61 -72
  514. package/scripts/lane/lane-environment.ts +5 -5
  515. package/scripts/lane/lane-guard-policy.ts +7 -21
  516. package/scripts/lane/lane-handoff.ts +2 -2
  517. package/scripts/lane/lane-install.ts +9 -10
  518. package/scripts/lane/lane-launch-cli.ts +13 -8
  519. package/scripts/lane/lane-ledger.ts +73 -11
  520. package/scripts/lane/lane-leftover.ts +44 -30
  521. package/scripts/lane/lane-limit-cli.ts +160 -0
  522. package/scripts/lane/lane-limit-override.ts +74 -0
  523. package/scripts/lane/lane-load.ts +19 -68
  524. package/scripts/lane/lane-measure-cli.ts +15 -25
  525. package/scripts/lane/lane-occupancy.ts +6 -4
  526. package/scripts/lane/lane-open.ts +25 -24
  527. package/scripts/lane/lane-output.ts +4 -3
  528. package/scripts/lane/lane-paths.ts +22 -8
  529. package/scripts/lane/lane-phase.ts +33 -0
  530. package/scripts/lane/lane-reap.ts +2 -2
  531. package/scripts/lane/lane-registry.ts +27 -15
  532. package/scripts/lane/lane-relaunch.ts +9 -9
  533. package/scripts/lane/lane-report.ts +5 -4
  534. package/scripts/lane/lane-resume.ts +2 -2
  535. package/scripts/lane/lane-sampler.ts +55 -0
  536. package/scripts/lane/lane-seed.ts +7 -7
  537. package/scripts/lane/lane-stage-stats.ts +135 -0
  538. package/scripts/lane/lane-start-point.ts +8 -11
  539. package/scripts/lane/lane-stats.ts +60 -15
  540. package/scripts/lane/lane-stray.ts +140 -0
  541. package/scripts/lane/lane-vacant.ts +1 -1
  542. package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
  543. package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
  544. package/scripts/lane/openai-review-broker.ts +2 -4
  545. package/scripts/lib/ancestor-directories.ts +1 -1
  546. package/scripts/lib/bounded-pool.ts +2 -2
  547. package/scripts/lib/buffered-process.ts +4 -6
  548. package/scripts/lib/caddy-logs.sh +0 -0
  549. package/scripts/lib/cli-flags.ts +39 -6
  550. package/scripts/lib/error-message.ts +1 -1
  551. package/scripts/lib/json-value.ts +17 -3
  552. package/scripts/lib/poll.ts +1 -1
  553. package/scripts/lib/status-icons.ts +3 -3
  554. package/scripts/lib/timed-fetch.ts +1 -1
  555. package/scripts/lib/timeouts.ts +1 -1
  556. package/scripts/lines/bytes-command.ts +3 -4
  557. package/scripts/lines/effective-limit.ts +25 -12
  558. package/scripts/lines/line-budget.ts +47 -55
  559. package/scripts/lines/line-targets.ts +6 -2
  560. package/scripts/lines/lines-command.ts +3 -3
  561. package/scripts/lint/cspell-cached.ts +1 -1
  562. package/scripts/lint/cycle-recheck.ts +122 -0
  563. package/scripts/lint/format.ts +1 -2
  564. package/scripts/lint/lint-parallel.ts +34 -19
  565. package/scripts/lint/lint-related-scope.ts +25 -15
  566. package/scripts/lint/lint-related.ts +6 -7
  567. package/scripts/managed-marker/index.ts +1 -1
  568. package/scripts/managed-marker/managed-marker-logic.ts +1 -2
  569. package/scripts/notify/git-notify.ts +9 -7
  570. package/scripts/notify/telegram-notify.ts +53 -37
  571. package/scripts/notify/telegram-test-logic.ts +3 -3
  572. package/scripts/notify/telegram-test.ts +45 -30
  573. package/scripts/observations/observation-ledger-home.ts +14 -8
  574. package/scripts/observations/observation-ledger-line.ts +3 -2
  575. package/scripts/observations/observation-ledger-migrate.ts +3 -4
  576. package/scripts/observations/observation-ledger-prepare.ts +4 -4
  577. package/scripts/observations/observation-ledger.ts +14 -15
  578. package/scripts/observations/observation-record-cli.ts +83 -0
  579. package/scripts/observations/observation-record.ts +91 -0
  580. package/scripts/observations/observations-flush-cli.ts +1 -1
  581. package/scripts/observations/observations-flush-landing.ts +7 -6
  582. package/scripts/observations/observations-flush.ts +26 -27
  583. package/scripts/overrides/overrides-check.ts +18 -8
  584. package/scripts/package/package-scout-cli.ts +1 -1
  585. package/scripts/package/package-scout-format.ts +2 -2
  586. package/scripts/package/package-scout.ts +1 -1
  587. package/scripts/propagate/propagate-git-failure.ts +1 -1
  588. package/scripts/propagate/propagate-git.ts +7 -7
  589. package/scripts/propagate/propagate-plan.ts +2 -2
  590. package/scripts/propagate/propagate-publish.ts +2 -3
  591. package/scripts/propagate/propagate-run.ts +5 -7
  592. package/scripts/propagate/propagate-select.ts +1 -1
  593. package/scripts/propagate/propagate-steps.ts +19 -20
  594. package/scripts/propagate/propagate-targets.ts +6 -10
  595. package/scripts/propagate/propagate.ts +5 -5
  596. package/scripts/refactor/import-graph.ts +1 -1
  597. package/scripts/refactor/refactor-lint.ts +4 -10
  598. package/scripts/refactor/refactor-scan-cli.ts +1 -1
  599. package/scripts/refactor/refactor-scan.ts +2 -2
  600. package/scripts/refactor/refactor-targets.ts +1 -1
  601. package/scripts/release/github-release-cli.ts +25 -3
  602. package/scripts/release/github-release-environment.ts +1 -0
  603. package/scripts/release/github-release-runs.ts +115 -0
  604. package/scripts/release/github-release.ts +13 -67
  605. package/scripts/release/release-cli.ts +21 -4
  606. package/scripts/release/release-history.ts +6 -10
  607. package/scripts/release/release-plan.ts +3 -3
  608. package/scripts/release/release-progress.ts +3 -4
  609. package/scripts/release/release-publish.ts +8 -9
  610. package/scripts/release/release-scope-cli.ts +8 -10
  611. package/scripts/release/release-tag.ts +6 -8
  612. package/scripts/release/release-worktree.ts +5 -5
  613. package/scripts/repo/auto-merge-setting-logic.ts +7 -9
  614. package/scripts/repo/auto-merge-setting.ts +1 -1
  615. package/scripts/repo/repo-setting.ts +4 -4
  616. package/scripts/repo/repository-labels.ts +1 -1
  617. package/scripts/repo/required-checks-logic.ts +3 -3
  618. package/scripts/repo/required-checks-report.ts +1 -1
  619. package/scripts/repo/ruleset-check-cli.ts +1 -1
  620. package/scripts/repo/ruleset-check.ts +1 -1
  621. package/scripts/report/report-format-reference.ts +26 -0
  622. package/scripts/report/report-lint-cli.ts +2 -2
  623. package/scripts/report/report-lint.ts +16 -2
  624. package/scripts/review/disposition-cli.ts +2 -2
  625. package/scripts/review/disposition-logic.ts +1 -1
  626. package/scripts/review/live-evidence.ts +9 -6
  627. package/scripts/review/review-attest-cli.ts +1 -2
  628. package/scripts/review/review-attest.ts +3 -3
  629. package/scripts/review/review-brief-cli.ts +19 -20
  630. package/scripts/review/review-brief.ts +29 -32
  631. package/scripts/review/review-checkout.ts +2 -2
  632. package/scripts/review/review-diff-parts.ts +3 -5
  633. package/scripts/review/review-diff-write.ts +1 -1
  634. package/scripts/review/review-finding-ledger.ts +7 -4
  635. package/scripts/review/review-findings-cli.ts +2 -2
  636. package/scripts/review/review-level.ts +4 -7
  637. package/scripts/review/review-record-cli.ts +73 -16
  638. package/scripts/review/review-record.ts +5 -4
  639. package/scripts/review/review-round2-cli.ts +2 -3
  640. package/scripts/review/review-round2.ts +13 -21
  641. package/scripts/review/review-stamps.ts +9 -71
  642. package/scripts/review/review-tree.ts +4 -5
  643. package/scripts/rules/bash-triggers.ts +4 -4
  644. package/scripts/rules/decision-oracle-batch.ts +5 -6
  645. package/scripts/rules/decision-oracle-stage.ts +1 -1
  646. package/scripts/rules/decision-oracle-tokens.ts +1 -2
  647. package/scripts/rules/decision-oracle.ts +2 -2
  648. package/scripts/rules/delivered-rules.ts +61 -406
  649. package/scripts/rules/destructive-command.ts +2 -2
  650. package/scripts/rules/direct-filing.ts +4 -4
  651. package/scripts/rules/direct-pr-create.ts +2 -2
  652. package/scripts/rules/early-heartbeat.ts +15 -19
  653. package/scripts/rules/file-body.ts +5 -6
  654. package/scripts/rules/filing-cap.ts +6 -7
  655. package/scripts/rules/filing-offer.ts +1 -1
  656. package/scripts/rules/firing-point.ts +6 -6
  657. package/scripts/rules/gh-api.ts +2 -2
  658. package/scripts/rules/git-argv.ts +3 -3
  659. package/scripts/rules/git-force.ts +2 -2
  660. package/scripts/rules/hook-context-line.ts +31 -0
  661. package/scripts/rules/implementation-cut-verdict.ts +5 -8
  662. package/scripts/rules/implementation-cut.ts +35 -32
  663. package/scripts/rules/index-guard.ts +2 -2
  664. package/scripts/rules/issue-citation.ts +7 -7
  665. package/scripts/rules/issue-comments.ts +21 -13
  666. package/scripts/rules/josh-git-bare.ts +2 -2
  667. package/scripts/rules/lane-background.ts +14 -16
  668. package/scripts/rules/lane-carry-conflict.ts +41 -5
  669. package/scripts/rules/lane-interactive-ask.ts +6 -9
  670. package/scripts/rules/lane-park.ts +12 -16
  671. package/scripts/rules/lane-split-park.ts +1 -2
  672. package/scripts/rules/lane-switch-main.ts +10 -13
  673. package/scripts/rules/last-prompt.ts +1 -1
  674. package/scripts/rules/oracle-consulted.ts +5 -5
  675. package/scripts/rules/oracle-firing.ts +6 -9
  676. package/scripts/rules/oracle-list-cli.ts +2 -2
  677. package/scripts/rules/permission-guards.ts +2 -2
  678. package/scripts/rules/piped-verification.ts +79 -9
  679. package/scripts/rules/poll-loop.ts +9 -11
  680. package/scripts/rules/pre-gate-cut.ts +33 -30
  681. package/scripts/rules/prior-comment-read.ts +3 -3
  682. package/scripts/rules/protected-files.ts +25 -13
  683. package/scripts/rules/raw-field-body.ts +3 -4
  684. package/scripts/rules/reply-language.ts +1 -1
  685. package/scripts/rules/rule-body-guard.ts +10 -12
  686. package/scripts/rules/rule-guard.ts +1 -1
  687. package/scripts/rules/rule-list.ts +51 -0
  688. package/scripts/rules/rule-registry-rows.ts +282 -0
  689. package/scripts/rules/rule-registry.ts +109 -0
  690. package/scripts/rules/rule-value-cache.ts +2 -2
  691. package/scripts/rules/rule-value-cli.ts +6 -4
  692. package/scripts/rules/rule-value.ts +61 -22
  693. package/scripts/rules/run-tail-rule.ts +11 -15
  694. package/scripts/rules/shell-body-trigger.ts +7 -7
  695. package/scripts/rules/shell-segments.ts +2 -4
  696. package/scripts/rules/stop-rules.ts +54 -41
  697. package/scripts/rules/tail-commands.ts +1 -1
  698. package/scripts/rules/test-declared-commit.ts +2 -2
  699. package/scripts/rules/third-party-write.ts +3 -3
  700. package/scripts/rules/worktree-guard.ts +12 -5
  701. package/scripts/run/add/run-add-cli.ts +165 -0
  702. package/scripts/run/add/run-add.ts +124 -0
  703. package/scripts/run/board/run-board-cli.ts +207 -0
  704. package/scripts/run/board/run-board-closed.ts +95 -0
  705. package/scripts/run/board/run-board-every.ts +60 -0
  706. package/scripts/run/board/run-board-fetch.ts +38 -0
  707. package/scripts/run/board/run-board-fit.ts +219 -0
  708. package/scripts/run/board/run-board-github.ts +162 -0
  709. package/scripts/run/board/run-board-header.ts +275 -0
  710. package/scripts/run/board/run-board-kind.ts +35 -0
  711. package/scripts/run/board/run-board-labels.ts +299 -0
  712. package/scripts/run/board/run-board-layout.ts +222 -0
  713. package/scripts/run/board/run-board-link.ts +31 -0
  714. package/scripts/run/board/run-board-machine.ts +198 -0
  715. package/scripts/run/board/run-board-notes.ts +103 -0
  716. package/scripts/run/board/run-board-phase.ts +136 -0
  717. package/scripts/run/board/run-board-plan.ts +129 -0
  718. package/scripts/run/board/run-board-read.ts +62 -0
  719. package/scripts/run/board/run-board-render-legend.ts +82 -0
  720. package/scripts/run/board/run-board-render-notes.ts +77 -0
  721. package/scripts/run/board/run-board-render-slot.ts +50 -0
  722. package/scripts/run/board/run-board-render.ts +407 -0
  723. package/scripts/run/board/run-board-scope.ts +17 -0
  724. package/scripts/run/board/run-board-screen.ts +43 -0
  725. package/scripts/run/board/run-board-span.ts +66 -0
  726. package/scripts/run/board/run-board-spin.ts +115 -0
  727. package/scripts/run/board/run-board-state.ts +113 -0
  728. package/scripts/run/board/run-board-status.ts +279 -0
  729. package/scripts/run/board/run-board-tick.ts +210 -0
  730. package/scripts/run/board/run-board-track.ts +22 -0
  731. package/scripts/run/board/run-board-usage-read.ts +255 -0
  732. package/scripts/run/board/run-board-usage-rusage.ts +124 -0
  733. package/scripts/run/board/run-board-usage-text.ts +80 -0
  734. package/scripts/run/board/run-board-usage.ts +165 -0
  735. package/scripts/run/carry/run-carry-added.ts +62 -0
  736. package/scripts/run/carry/run-carry-args.ts +25 -22
  737. package/scripts/run/carry/run-carry-change.ts +1 -1
  738. package/scripts/run/carry/run-carry-cli.ts +71 -48
  739. package/scripts/run/carry/run-carry-conversation.ts +6 -7
  740. package/scripts/run/carry/run-carry-ended.ts +85 -0
  741. package/scripts/run/carry/run-carry-reclaim.ts +1 -1
  742. package/scripts/run/carry/run-carry-stash.ts +3 -2
  743. package/scripts/run/carry/run-carry-streak.ts +8 -10
  744. package/scripts/run/carry/run-carry.ts +85 -89
  745. package/scripts/run/cut/run-cut-args.ts +7 -7
  746. package/scripts/run/cut/run-cut-cli.ts +68 -37
  747. package/scripts/run/cut/run-cut-handoff.ts +15 -15
  748. package/scripts/run/cut/run-cut-report.ts +37 -16
  749. package/scripts/run/cut/run-cut.ts +63 -77
  750. package/scripts/run/detached-launch.ts +35 -50
  751. package/scripts/run/entry/run-entry-cli.ts +48 -27
  752. package/scripts/run/entry/run-entry-stop.ts +7 -9
  753. package/scripts/run/entry/run-entry.ts +5 -6
  754. package/scripts/run/event/run-event-cli.ts +5 -6
  755. package/scripts/run/event/run-event-filed.ts +69 -0
  756. package/scripts/run/event/run-event-follow.ts +3 -3
  757. package/scripts/run/event/run-event-plan.ts +38 -0
  758. package/scripts/run/event/run-event-render.ts +10 -4
  759. package/scripts/run/event/run-event-scope.ts +47 -18
  760. package/scripts/run/event/run-event-stream-emit.ts +64 -11
  761. package/scripts/run/event/run-event-stream.ts +172 -43
  762. package/scripts/run/event/run-event-watch.ts +4 -6
  763. package/scripts/run/hold/run-hold-cli.ts +65 -62
  764. package/scripts/run/hold/run-hold.ts +88 -46
  765. package/scripts/run/merge/run-merge-cli.ts +116 -77
  766. package/scripts/run/merge/run-merge-collect.ts +107 -0
  767. package/scripts/run/merge/run-merge-steps.ts +112 -65
  768. package/scripts/run/merge/run-merge-token.ts +30 -0
  769. package/scripts/run/merge/run-merge.ts +31 -22
  770. package/scripts/run/progress/run-progress-args.ts +4 -4
  771. package/scripts/run/progress/run-progress-cli.ts +39 -50
  772. package/scripts/run/progress/run-progress-clock.ts +25 -32
  773. package/scripts/run/progress/run-progress-config.ts +6 -9
  774. package/scripts/run/progress/run-progress-read.ts +9 -10
  775. package/scripts/run/progress/run-progress.ts +48 -53
  776. package/scripts/run/review/run-review-cli.ts +6 -6
  777. package/scripts/run/review/run-review-steps.ts +6 -6
  778. package/scripts/run/review/run-review.ts +9 -11
  779. package/scripts/run/run-cli-fault.ts +29 -0
  780. package/scripts/run/run-ending-cli.ts +3 -3
  781. package/scripts/run/run-ending.ts +10 -14
  782. package/scripts/run/run-halfrun-resume.ts +6 -8
  783. package/scripts/run/run-headless.ts +25 -12
  784. package/scripts/run/run-invocation.ts +17 -22
  785. package/scripts/run/run-label.ts +7 -5
  786. package/scripts/run/run-liveness-cli.ts +19 -6
  787. package/scripts/run/run-liveness.ts +27 -38
  788. package/scripts/run/run-next-cli.ts +5 -9
  789. package/scripts/run/run-next.ts +4 -5
  790. package/scripts/run/run-parent-cut-hook.ts +10 -12
  791. package/scripts/run/run-preflight.ts +25 -29
  792. package/scripts/run/run-prep-cli.ts +17 -13
  793. package/scripts/run/run-prep-locate.ts +4 -5
  794. package/scripts/run/run-prep.ts +7 -10
  795. package/scripts/run/run-prrun-resume.ts +2 -2
  796. package/scripts/run/run-report-cli.ts +4 -4
  797. package/scripts/run/run-report.ts +9 -14
  798. package/scripts/run/run-retrospective.ts +3 -3
  799. package/scripts/run/run-section.ts +42 -0
  800. package/scripts/run/run-stage-read.ts +2 -2
  801. package/scripts/run/run-stage.ts +6 -4
  802. package/scripts/run/run-status-cli.ts +7 -5
  803. package/scripts/run/run-status.ts +6 -7
  804. package/scripts/run/run-step-cli.ts +13 -15
  805. package/scripts/run/run-step.ts +62 -48
  806. package/scripts/run/run-stop-notify.ts +7 -8
  807. package/scripts/run/run-stranded-cli.ts +1 -1
  808. package/scripts/run/run-stranded-detect.ts +4 -4
  809. package/scripts/run/run-stranded.ts +11 -13
  810. package/scripts/run/run-tail-cli.ts +15 -16
  811. package/scripts/run/run-tail.ts +14 -33
  812. package/scripts/run/run-watcher-guard-cli.ts +3 -4
  813. package/scripts/run/run-watcher-guard.ts +11 -12
  814. package/scripts/run/run-watcher-hook.ts +6 -12
  815. package/scripts/run/ship/run-ship-cli.ts +67 -33
  816. package/scripts/run/ship/run-ship-detach.ts +15 -13
  817. package/scripts/run/ship/run-ship-lock.ts +1 -1
  818. package/scripts/run/ship/run-ship-next.ts +7 -8
  819. package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
  820. package/scripts/run/ship/run-ship-preflight.ts +10 -11
  821. package/scripts/run/ship/run-ship-probe.ts +4 -4
  822. package/scripts/run/ship/run-ship-return.ts +1 -1
  823. package/scripts/run/ship/run-ship-review-steps.ts +43 -24
  824. package/scripts/run/ship/run-ship-review.ts +12 -14
  825. package/scripts/run/ship/run-ship-scoped.ts +15 -6
  826. package/scripts/run/ship/run-ship-stage.ts +80 -26
  827. package/scripts/run/ship/run-ship-steps.ts +26 -16
  828. package/scripts/run/ship/run-ship-stop-text.ts +4 -2
  829. package/scripts/run/ship/run-ship-sync.ts +9 -8
  830. package/scripts/run/ship/run-ship.ts +17 -32
  831. package/scripts/run/tidy/run-tidy-cli.ts +9 -5
  832. package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
  833. package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
  834. package/scripts/run/tidy/run-tidy.ts +4 -3
  835. package/scripts/run/wake/run-wake-cli.ts +27 -33
  836. package/scripts/run/wake/run-wake-describe.ts +76 -29
  837. package/scripts/run/wake/run-wake-driver.ts +14 -14
  838. package/scripts/run/wake/run-wake-handoff.ts +6 -6
  839. package/scripts/run/wake/run-wake-loop.ts +13 -21
  840. package/scripts/run/wake/run-wake-restart.ts +4 -5
  841. package/scripts/run/wake/run-wake-session.ts +23 -27
  842. package/scripts/run/wake/run-wake.ts +57 -328
  843. package/scripts/safe-chain/ci-installer-pin.ts +3 -3
  844. package/scripts/safe-chain/pack-hook.ts +2 -2
  845. package/scripts/safe-chain/preinstall-command.ts +2 -2
  846. package/scripts/security/security-audit-logic.ts +1 -1
  847. package/scripts/security/security-audit-provision-logic.ts +1 -1
  848. package/scripts/security/security-audit-provision.ts +2 -2
  849. package/scripts/security/security-audit.ts +5 -5
  850. package/scripts/security/security-updates-logic.ts +2 -3
  851. package/scripts/security/security-updates.ts +2 -4
  852. package/scripts/self-sync-guard/index.ts +1 -1
  853. package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
  854. package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
  855. package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
  856. package/scripts/sonar/sonar-hotspots.ts +1 -1
  857. package/scripts/sonar/sonar-new-code-cli.ts +1 -1
  858. package/scripts/sonar/sonar-new-code.ts +1 -1
  859. package/scripts/sonar/sonar-project.ts +1 -1
  860. package/scripts/split/split-assess-cli.ts +1 -1
  861. package/scripts/split/split-assess.ts +3 -3
  862. package/scripts/sync/directory-copy-guard.ts +2 -3
  863. package/scripts/sync/managed-config-scope-cli.ts +1 -2
  864. package/scripts/sync/managed-config-scope.ts +4 -4
  865. package/scripts/sync/plugin-skill-directories.ts +2 -2
  866. package/scripts/sync/reconcile-templates.ts +17 -8
  867. package/scripts/sync/removed-skill-manifest.ts +2 -3
  868. package/scripts/sync/sync-ai-files.ts +7 -7
  869. package/scripts/sync/sync-configs.ts +30 -3
  870. package/scripts/sync/sync-hook-safety.ts +2 -2
  871. package/scripts/sync/sync.ts +23 -10
  872. package/scripts/sync/synced-paths.ts +2 -1
  873. package/scripts/sync/workflow-pin-logic.ts +1 -1
  874. package/scripts/test/test-declared-changed.ts +4 -4
  875. package/scripts/test/test-declared-logic.ts +2 -3
  876. package/scripts/test/test-declared-match.ts +25 -4
  877. package/scripts/test/test-declared.ts +26 -9
  878. package/scripts/test/test-red-commit.ts +3 -2
  879. package/scripts/test/test-red-logic.ts +7 -14
  880. package/scripts/test/test-red.ts +12 -47
  881. package/scripts/test/test-related-scope.ts +2 -3
  882. package/scripts/test/test-related.ts +3 -3
  883. package/scripts/test/test-type-logic.ts +1 -2
  884. package/scripts/test/test-unit-guard.ts +13 -17
  885. package/scripts/test/unit-worker-share.ts +7 -8
  886. package/scripts/time-runtime/time-agent-bundles.ts +2 -4
  887. package/scripts/time-runtime/time-background.ts +17 -21
  888. package/scripts/time-runtime/time-batch-guard.ts +67 -342
  889. package/scripts/time-runtime/time-bundle-call.ts +26 -28
  890. package/scripts/time-runtime/time-bundles.ts +11 -12
  891. package/scripts/time-runtime/time-call-identity.ts +1 -1
  892. package/scripts/time-runtime/time-command-key.ts +2 -2
  893. package/scripts/time-runtime/time-density-hook.ts +8 -11
  894. package/scripts/time-runtime/time-density.ts +5 -5
  895. package/scripts/time-runtime/time-followup-stage.ts +7 -7
  896. package/scripts/time-runtime/time-format.ts +5 -5
  897. package/scripts/time-runtime/time-hook-transcript.ts +3 -3
  898. package/scripts/time-runtime/time-instant.ts +1 -1
  899. package/scripts/time-runtime/time-markers.ts +15 -19
  900. package/scripts/time-runtime/time-phase-names.ts +3 -3
  901. package/scripts/time-runtime/time-reported-failure.ts +15 -19
  902. package/scripts/time-runtime/time-round-trips.ts +20 -23
  903. package/scripts/time-runtime/time-shell.ts +8 -8
  904. package/scripts/time-runtime/time-single-check.ts +1 -2
  905. package/scripts/time-runtime/time-spans.ts +35 -40
  906. package/scripts/time-runtime/time-tool-call.ts +15 -16
  907. package/scripts/time-runtime/time-transcript-line.ts +53 -34
  908. package/scripts/time-runtime/time-writes.ts +5 -5
  909. package/scripts/ui/ui-routes-cli.ts +1 -2
  910. package/scripts/ui/ui-routes.ts +1 -2
  911. package/scripts/version/bump-version.ts +1 -1
  912. package/scripts/version/fresh-metadata-cache.ts +2 -2
  913. package/scripts/version/latest-corepack.ts +129 -98
  914. package/scripts/version/latest-lane-guard.ts +1 -1
  915. package/scripts/version/latest-scope-cli.ts +2 -2
  916. package/scripts/version/latest-stamp.ts +1 -2
  917. package/scripts/version/latest-update.ts +2 -2
  918. package/scripts/version/npm-registry.ts +2 -2
  919. package/scripts/version/package-manager-version.ts +18 -0
  920. package/scripts/version/publishable-range-check.ts +2 -1
  921. package/scripts/version/publishable-range.ts +1 -1
  922. package/scripts/version/release-age.ts +11 -11
  923. package/scripts/version/release-hold.ts +2 -2
  924. package/scripts/version/safe-chain-version-update.ts +3 -3
  925. package/scripts/version/version-check-logic.ts +2 -3
  926. package/scripts/version/version-check.ts +1 -2
  927. package/scripts/version/version-command-config.ts +2 -2
  928. package/scripts/version/version-commands.ts +3 -3
  929. package/scripts/version/version-remote.ts +4 -4
  930. package/scripts/version/version-targets.ts +2 -2
  931. package/templates/gitignore +7 -0
  932. package/templates/workflows/github-release.yml +4 -0
  933. package/dist/hooks/chunk-NV2JRZZO.js +0 -6385
  934. package/dist/hooks/chunk-RKUAD3I6.js +0 -90
  935. package/dist/hooks/chunk-WPALEIRX.js +0 -18
  936. package/scripts/backlog/backlog-restructure.ts +0 -152
  937. package/scripts/rules/issue-fold-rule.ts +0 -72
  938. package/scripts/rules/wip-cap.ts +0 -63
  939. package/scripts/run/run-issue-number.ts +0 -19
package/dist/josh.js CHANGED
@@ -82,10 +82,16 @@ function parse_or_undefined(text) {
82
82
  return void 0;
83
83
  }
84
84
  }
85
+ function parse_with(text, schema) {
86
+ const value = parse_or_undefined(text);
87
+ if (value === void 0) return void 0;
88
+ const parsed = schema.safeParse(value);
89
+ return parsed.success ? parsed.data : void 0;
90
+ }
85
91
  function is_record(value) {
86
92
  return typeof value === "object" && value !== null && !Array.isArray(value);
87
93
  }
88
- var json_value = { parse_or_undefined, is_record };
94
+ var json_value = { parse_or_undefined, parse_with, is_record };
89
95
 
90
96
  // scripts/lib/read-file.ts
91
97
  import { readFileSync } from "node:fs";
@@ -319,7 +325,7 @@ function resolve_package_bin(base_directory, package_name, bin_name) {
319
325
  // scripts/gate/core-budget.ts
320
326
  import { randomUUID as randomUUID3 } from "node:crypto";
321
327
  import { readdirSync as readdirSync2 } from "node:fs";
322
- import { availableParallelism as availableParallelism2 } from "node:os";
328
+ import { availableParallelism as availableParallelism3 } from "node:os";
323
329
  import path8 from "node:path";
324
330
 
325
331
  // scripts/josh/platform-temporary.ts
@@ -365,7 +371,10 @@ var BEACON_PREFIX = `josh-process-identity-${String(process.getuid?.() ?? "")}-`
365
371
  var BEACON_ID_LENGTH = 36;
366
372
  var BEACON_ID_PATTERN = /^[\da-f-]+$/u;
367
373
  var WINDOWS_PLATFORM3 = "win32";
368
- var SOCKET_PROBE_SOURCE = "const net=require('node:net');const socket=net.createConnection(process.argv[1]);socket.once('connect',()=>process.exit(0));socket.once('error',()=>process.exit(1));socket.setTimeout(1000,()=>process.exit(1));";
374
+ var BEACON_LIVE_STATUS = 0;
375
+ var BEACON_UNKNOWN_STATUS = 1;
376
+ var BEACON_GONE_STATUS = 2;
377
+ var SOCKET_PROBE_SOURCE = `const net=require('node:net');const socket=net.createConnection(process.argv[1]);socket.once('connect',()=>process.exit(${String(BEACON_LIVE_STATUS)}));socket.once('error',(error)=>process.exit(['ECONNREFUSED','ENOENT'].includes(error.code)?${String(BEACON_GONE_STATUS)}:${String(BEACON_UNKNOWN_STATUS)}));socket.setTimeout(1000,()=>process.exit(${String(BEACON_UNKNOWN_STATUS)}));`;
369
378
  var beacons = /* @__PURE__ */ new Map();
370
379
  var exit_cleanup = { is_registered: false };
371
380
  function is_live_pid(pid) {
@@ -469,11 +478,16 @@ function beacon_target(token) {
469
478
  if (path4.dirname(target) !== PLATFORM_TEMP_ROOT) return void 0;
470
479
  return is_valid_beacon_name(path4.basename(target)) ? target : void 0;
471
480
  }
472
- function is_live_beacon(target) {
481
+ function run_socket_probe(target) {
473
482
  return spawnSync(process.execPath, ["-e", SOCKET_PROBE_SOURCE, target], {
474
483
  stdio: "ignore",
475
484
  timeout: PROBE_TIMEOUT_MS
476
- }).status === 0;
485
+ }).status ?? void 0;
486
+ }
487
+ function is_live_beacon(target, probe = run_socket_probe) {
488
+ const status = probe(target);
489
+ if (status === BEACON_LIVE_STATUS) return true;
490
+ return status === BEACON_GONE_STATUS ? false : void 0;
477
491
  }
478
492
  function has_matching_start(pid, recorded_start, read2) {
479
493
  const observed = read2(pid);
@@ -502,6 +516,7 @@ function is_own_process(pid, recorded_start) {
502
516
  }
503
517
  var process_identity = {
504
518
  close_beacon,
519
+ is_live_beacon,
505
520
  is_live_pid,
506
521
  is_own_process,
507
522
  is_same_process,
@@ -554,19 +569,35 @@ function write_exclusively(target, content) {
554
569
  function write_stamp(target, payload) {
555
570
  return write_exclusively(target, JSON.stringify(payload));
556
571
  }
557
- function replace_stamp(target, payload) {
572
+ function is_own_regular_file(source) {
573
+ const stats = lstatSync(source);
574
+ if (!stats.isFile()) return false;
575
+ const uid = process.getuid?.();
576
+ return uid === void 0 || stats.uid === uid;
577
+ }
578
+ function is_foreign_file(target) {
579
+ try {
580
+ return lstatSync(target).isFile() && !is_own_regular_file(target);
581
+ } catch {
582
+ return false;
583
+ }
584
+ }
585
+ function replace_text_stamp(target, text) {
586
+ if (is_foreign_file(target)) {
587
+ throw new Error(`refusing to replace another account's file: ${target}`);
588
+ }
558
589
  const temporary = `${target}.${String(process.pid)}.${randomUUID2()}`;
559
590
  try {
560
- writeFileSync(temporary, JSON.stringify(payload), {
561
- flag: STAMP_CREATE_FLAG,
562
- mode: STAMP_FILE_MODE
563
- });
591
+ writeFileSync(temporary, text, { flag: STAMP_CREATE_FLAG, mode: STAMP_FILE_MODE });
564
592
  renameSync(temporary, target);
565
593
  return target;
566
594
  } finally {
567
595
  rmSync2(temporary, { force: true });
568
596
  }
569
597
  }
598
+ function replace_stamp(target, payload) {
599
+ return replace_text_stamp(target, JSON.stringify(payload));
600
+ }
570
601
  function write_text_stamp(target, text) {
571
602
  return write_exclusively(target, text);
572
603
  }
@@ -585,12 +616,6 @@ function create_stamp(target, payload) {
585
616
  function remove_stamp(target) {
586
617
  rmSync2(target, { force: true });
587
618
  }
588
- function is_own_regular_file(source) {
589
- const stats = lstatSync(source);
590
- if (!stats.isFile()) return false;
591
- const uid = process.getuid?.();
592
- return uid === void 0 || stats.uid === uid;
593
- }
594
619
  function read_stamp_text(source) {
595
620
  try {
596
621
  if (!is_own_regular_file(source)) return void 0;
@@ -605,6 +630,7 @@ var stamp_file = {
605
630
  is_own_regular_file,
606
631
  read_stamp_text,
607
632
  replace_stamp,
633
+ replace_text_stamp,
608
634
  remove_stamp,
609
635
  stamp_path,
610
636
  write_stamp,
@@ -712,6 +738,242 @@ var unit_worker_share = {
712
738
 
713
739
  // scripts/gate/core-budget.ts
714
740
  import { z as z4 } from "zod";
741
+
742
+ // scripts/gate/core-admission.ts
743
+ var MS_PER_SECOND = 1e3;
744
+ var RAMP_UP_MS = 3e4;
745
+ function compare_claim(left, right) {
746
+ const by_time = left.reservation.claimed_at - right.reservation.claimed_at;
747
+ return by_time === 0 ? left.key.localeCompare(right.key) : by_time;
748
+ }
749
+ function add_load(totals, reservation) {
750
+ totals.cores += reservation.weight;
751
+ totals.memory_mb += reservation.memory_mb ?? 0;
752
+ }
753
+ function exceeds(totals, budget) {
754
+ return totals.cores > budget.cores || totals.memory_mb > budget.memory_mb;
755
+ }
756
+ function admitted_keys(reservations, budget, memory_budget = Infinity) {
757
+ const limit = { cores: budget, memory_mb: memory_budget };
758
+ const totals = { cores: 0, memory_mb: 0 };
759
+ const admitted = /* @__PURE__ */ new Set();
760
+ for (const [index, entry] of reservations.toSorted(compare_claim).entries()) {
761
+ add_load(totals, entry.reservation);
762
+ if (index !== 0 && exceeds(totals, limit)) break;
763
+ admitted.add(entry.key);
764
+ }
765
+ return admitted;
766
+ }
767
+ function is_admitted(key, reservations, budget) {
768
+ return admitted_keys(reservations, budget.cores, budget.memory_mb).has(key);
769
+ }
770
+ function sum_load(reservations) {
771
+ const load = { cores: 0, memory_mb: 0 };
772
+ for (const entry of reservations) add_load(load, entry.reservation);
773
+ return load;
774
+ }
775
+ function is_ramped(reservation, now) {
776
+ const { admitted_at } = reservation;
777
+ return admitted_at !== void 0 && now - admitted_at >= RAMP_UP_MS;
778
+ }
779
+ function ledger_load(reservations, now) {
780
+ const admitted = reservations.filter((entry) => entry.reservation.admitted_at !== void 0);
781
+ const ramped = admitted.filter((entry) => is_ramped(entry.reservation, now));
782
+ return { cores: sum_load(admitted).cores, memory_mb: sum_load(ramped).memory_mb };
783
+ }
784
+ function total_weight(reservations) {
785
+ return sum_load(reservations).cores;
786
+ }
787
+ function admitted_load(reservations, budget) {
788
+ const admitted = admitted_keys(reservations, budget);
789
+ return total_weight(reservations.filter((entry) => admitted.has(entry.key)));
790
+ }
791
+ function describe_memory(ledger, budget) {
792
+ if (!Number.isFinite(budget.memory_mb)) return "";
793
+ return ` and ${String(Math.round(ledger.memory_mb))} MB of memory against ${String(Math.round(budget.memory_mb))} MB`;
794
+ }
795
+ function describe_overflow(admission) {
796
+ const { overflow } = admission;
797
+ if (overflow === void 0) return void 0;
798
+ const { ledger, budget } = overflow;
799
+ const waited = String(Math.round(overflow.waited_ms / MS_PER_SECOND));
800
+ const cores = `the ledger held ${String(ledger.cores)} cores against a budget of ${String(budget.cores)}`;
801
+ return `started past the core budget after ${waited}s \u2014 ${cores}${describe_memory(ledger, budget)}`;
802
+ }
803
+ var core_admission = {
804
+ RAMP_UP_MS,
805
+ admitted_keys,
806
+ admitted_load,
807
+ describe_overflow,
808
+ is_admitted,
809
+ ledger_load,
810
+ sum_load
811
+ };
812
+
813
+ // scripts/gate/machine-capacity.ts
814
+ import { readFile } from "node:fs/promises";
815
+ import { availableParallelism as availableParallelism2, cpus, totalmem } from "node:os";
816
+ import { execa } from "execa";
817
+ var SAMPLE_WINDOW_MS = 250;
818
+ var BASELINE_CORES = 2;
819
+ var BYTES_PER_MB = 1048576;
820
+ var KB_PER_MB = 1024;
821
+ var PERCENT = 100;
822
+ var MEMINFO_PATH = "/proc/meminfo";
823
+ var VMSTAT_PATH = "/proc/vmstat";
824
+ var LINUX_AVAILABLE = /^MemAvailable:\s+(?<kb>\d+) kB/mu;
825
+ var LINUX_SWAP_IN = /^pswpin (?<pages>\d+)$/mu;
826
+ var LINUX_SWAP_OUT = /^pswpout (?<pages>\d+)$/mu;
827
+ var PAGE_SIZE_ARGUMENTS = ["PAGESIZE"];
828
+ var LEVEL_NAME = "kern.memorystatus_level";
829
+ var SWAP_IN_NAME = "vm.compressor.swapper.swapins_total";
830
+ var SWAP_OUT_NAME = "vm.compressor.swapper.swapouts_total";
831
+ var PAGE_SIZE_NAME = "hw.pagesize";
832
+ var PRESSURE_NAME = "kern.memorystatus_vm_pressure_level";
833
+ var SYSCTL_ARGUMENTS = [LEVEL_NAME, SWAP_IN_NAME, SWAP_OUT_NAME, PAGE_SIZE_NAME, PRESSURE_NAME];
834
+ var SYSCTL_LINE = /^(?<name>[\w.]+): (?<value>\d+)$/gmu;
835
+ function cpu_times() {
836
+ let busy = 0;
837
+ let idle = 0;
838
+ for (const { times } of cpus()) {
839
+ busy += times.user + times.nice + times.sys + times.irq;
840
+ idle += times.idle;
841
+ }
842
+ return { busy, total: busy + idle };
843
+ }
844
+ function busy_share_between(before, after) {
845
+ const total = after.total - before.total;
846
+ if (total <= 0) return void 0;
847
+ return (after.busy - before.busy) / total;
848
+ }
849
+ function busy_cores_between(before, after, cores) {
850
+ const share = busy_share_between(before, after);
851
+ return share === void 0 ? void 0 : share * cores;
852
+ }
853
+ function sysctl_values(output) {
854
+ const values = [...output.matchAll(SYSCTL_LINE)].map(
855
+ (match) => [match.groups?.["name"] ?? "", Number(match.groups?.["value"])]
856
+ );
857
+ return new Map(values);
858
+ }
859
+ function swapped_pages(pages_in, pages_out) {
860
+ return pages_in === void 0 || pages_out === void 0 ? void 0 : pages_in + pages_out;
861
+ }
862
+ function swapped_mb(pages, page_bytes) {
863
+ if (pages === void 0 || page_bytes === void 0) return void 0;
864
+ return pages * page_bytes / BYTES_PER_MB;
865
+ }
866
+ function swapped_between(from, to) {
867
+ if (from === void 0 || to === void 0) return void 0;
868
+ return Math.max(0, to - from);
869
+ }
870
+ function parse_darwin_memory(output, total_bytes) {
871
+ const values = sysctl_values(output);
872
+ const level = values.get(LEVEL_NAME);
873
+ return {
874
+ available_mb: level === void 0 ? void 0 : level / PERCENT * (total_bytes / BYTES_PER_MB),
875
+ swapped_mb: swapped_mb(
876
+ swapped_pages(values.get(SWAP_IN_NAME), values.get(SWAP_OUT_NAME)),
877
+ values.get(PAGE_SIZE_NAME)
878
+ ),
879
+ pressure_level: values.get(PRESSURE_NAME)
880
+ };
881
+ }
882
+ function parse_linux_available(meminfo) {
883
+ const kb = LINUX_AVAILABLE.exec(meminfo)?.groups?.["kb"];
884
+ return kb === void 0 ? void 0 : Number(kb) / KB_PER_MB;
885
+ }
886
+ function pages_of(pattern, vmstat) {
887
+ const pages = pattern.exec(vmstat)?.groups?.["pages"];
888
+ return pages === void 0 ? void 0 : Number(pages);
889
+ }
890
+ function parse_linux_swapped(vmstat, page_bytes) {
891
+ const pages = swapped_pages(pages_of(LINUX_SWAP_IN, vmstat), pages_of(LINUX_SWAP_OUT, vmstat));
892
+ return swapped_mb(pages, page_bytes);
893
+ }
894
+ async function settled(read2) {
895
+ try {
896
+ return await read2();
897
+ } catch {
898
+ return void 0;
899
+ }
900
+ }
901
+ async function read_darwin_memory() {
902
+ const { stdout } = await execa("sysctl", SYSCTL_ARGUMENTS, {
903
+ reject: false,
904
+ timeout: PROBE_TIMEOUT_MS
905
+ });
906
+ return parse_darwin_memory(stdout, totalmem());
907
+ }
908
+ async function read_page_size() {
909
+ const { stdout } = await execa("getconf", PAGE_SIZE_ARGUMENTS, { timeout: PROBE_TIMEOUT_MS });
910
+ return stdout;
911
+ }
912
+ async function read_linux_memory() {
913
+ const [meminfo, vmstat, page_size] = await Promise.all([
914
+ settled(async () => await readFile(MEMINFO_PATH, "utf8")),
915
+ settled(async () => await readFile(VMSTAT_PATH, "utf8")),
916
+ settled(read_page_size)
917
+ ]);
918
+ const page_bytes = page_size === void 0 ? void 0 : Number(page_size);
919
+ return {
920
+ available_mb: meminfo === void 0 ? void 0 : parse_linux_available(meminfo),
921
+ swapped_mb: vmstat === void 0 || page_bytes === void 0 ? void 0 : parse_linux_swapped(vmstat, page_bytes),
922
+ pressure_level: void 0
923
+ };
924
+ }
925
+ var UNREAD_MEMORY = {
926
+ available_mb: void 0,
927
+ swapped_mb: void 0,
928
+ pressure_level: void 0
929
+ };
930
+ async function read_memory() {
931
+ if (process.platform === "darwin") return await settled(read_darwin_memory) ?? UNREAD_MEMORY;
932
+ return process.platform === "linux" ? await read_linux_memory() : UNREAD_MEMORY;
933
+ }
934
+ function is_unquoted() {
935
+ return cpus().length > 0 && cpus().length === availableParallelism2();
936
+ }
937
+ async function default_sleep(ms) {
938
+ await new Promise((resolve) => {
939
+ setTimeout(resolve, ms);
940
+ });
941
+ }
942
+ async function read_machine(sleep = default_sleep) {
943
+ const before = cpu_times();
944
+ const [memory] = await Promise.all([read_memory(), sleep(SAMPLE_WINDOW_MS)]);
945
+ const busy_cores = is_unquoted() ? busy_cores_between(before, cpu_times(), cpus().length) : void 0;
946
+ return { busy_cores, available_mb: memory.available_mb };
947
+ }
948
+ async function read_sample() {
949
+ return { cpu: cpu_times(), memory: await read_memory(), total_mb: totalmem() / BYTES_PER_MB };
950
+ }
951
+ function external_cores(busy_cores, ledger_cores) {
952
+ if (busy_cores === void 0) return 0;
953
+ return Math.floor(Math.max(0, busy_cores - ledger_cores - BASELINE_CORES));
954
+ }
955
+ function machine_budget(cores, reading, ledger) {
956
+ return {
957
+ cores: cores - external_cores(reading.busy_cores, ledger.cores),
958
+ memory_mb: reading.available_mb === void 0 ? Infinity : reading.available_mb + ledger.memory_mb
959
+ };
960
+ }
961
+ var machine_capacity = {
962
+ BASELINE_CORES,
963
+ busy_cores_between,
964
+ busy_share_between,
965
+ external_cores,
966
+ machine_budget,
967
+ parse_darwin_memory,
968
+ parse_linux_available,
969
+ parse_linux_swapped,
970
+ read_machine,
971
+ read_memory,
972
+ read_sample,
973
+ swapped_between
974
+ };
975
+
976
+ // scripts/gate/core-budget.ts
715
977
  var RESERVED_PREFIX = "josh-core-reserved-";
716
978
  var RESERVED_SUFFIX = ".json";
717
979
  var POLL_INTERVAL_MS = 50;
@@ -723,11 +985,20 @@ var CORE_WEIGHTS = {
723
985
  spell_check: 1,
724
986
  eslint_scan: 1
725
987
  };
988
+ var MEMORY_MB = {
989
+ lint: 2400,
990
+ type_check: 1300,
991
+ spell_check: 350,
992
+ eslint_scan: 2400,
993
+ unit_worker: 350
994
+ };
726
995
  var HELD_KEY = "JOSH_CORE_RESERVED";
727
996
  var HELD_VALUE = "1";
728
997
  var reservation_schema = process_owner_schema.extend({
729
998
  weight: z4.number(),
730
- claimed_at: z4.number()
999
+ claimed_at: z4.number(),
1000
+ memory_mb: z4.number().optional(),
1001
+ admitted_at: z4.number().optional()
731
1002
  });
732
1003
  function marker_name(key) {
733
1004
  return `${RESERVED_PREFIX}${key}${RESERVED_SUFFIX}`;
@@ -738,12 +1009,7 @@ function is_running2(reservation) {
738
1009
  function read_reservation(source) {
739
1010
  const raw = stamp_file.read_stamp_text(source);
740
1011
  if (raw === void 0) return void 0;
741
- try {
742
- const parsed = reservation_schema.safeParse(JSON.parse(raw));
743
- return parsed.success ? parsed.data : void 0;
744
- } catch {
745
- return void 0;
746
- }
1012
+ return json_value.parse_with(raw, reservation_schema);
747
1013
  }
748
1014
  function sweep_marker2(source) {
749
1015
  try {
@@ -760,7 +1026,9 @@ function live_reservation(source) {
760
1026
  }
761
1027
  function marker_files2(directory) {
762
1028
  try {
763
- return readdirSync2(directory).filter((name) => name.startsWith(RESERVED_PREFIX));
1029
+ return readdirSync2(directory).filter(
1030
+ (name) => name.startsWith(RESERVED_PREFIX) && name.endsWith(RESERVED_SUFFIX)
1031
+ );
764
1032
  } catch {
765
1033
  return [];
766
1034
  }
@@ -771,67 +1039,79 @@ function live_reservations(directory = PLATFORM_TEMP_ROOT) {
771
1039
  return reservation === void 0 ? [] : { key: name, reservation };
772
1040
  });
773
1041
  }
774
- function compare_claim(left, right) {
775
- const by_time = left.reservation.claimed_at - right.reservation.claimed_at;
776
- return by_time === 0 ? left.key.localeCompare(right.key) : by_time;
777
- }
778
- function admitted_keys(reservations, budget) {
779
- const admitted = /* @__PURE__ */ new Set();
780
- let cumulative = 0;
781
- for (const [index, entry] of reservations.toSorted(compare_claim).entries()) {
782
- cumulative += entry.reservation.weight;
783
- if (index !== 0 && cumulative > budget) break;
784
- admitted.add(entry.key);
785
- }
786
- return admitted;
787
- }
788
- function is_admitted(key, reservations, budget) {
789
- return admitted_keys(reservations, budget).has(key);
790
- }
791
- function admitted_load(reservations, budget) {
792
- const admitted = admitted_keys(reservations, budget);
793
- return reservations.filter((entry) => admitted.has(entry.key)).reduce((total, entry) => total + entry.reservation.weight, 0);
794
- }
795
1042
  function normalize_budget(budget) {
796
1043
  return Number.isFinite(budget) ? Math.max(MIN_BUDGET, Math.floor(budget)) : MIN_BUDGET;
797
1044
  }
798
- async function default_sleep(ms) {
1045
+ async function default_sleep2(ms) {
799
1046
  await new Promise((resolve) => {
800
1047
  setTimeout(resolve, ms);
801
1048
  });
802
1049
  }
803
- function write_reservation(target, weight, claimed_at) {
804
- stamp_file.write_stamp(target, { ...process_identity.own_fields(), weight, claimed_at });
1050
+ function write_reservation(target, fields) {
1051
+ stamp_file.replace_stamp(target, { ...process_identity.own_fields(), ...fields });
805
1052
  }
806
1053
  function resolve_timing(options) {
807
1054
  return {
808
1055
  now: options.now ?? Date.now,
809
- sleep: options.sleep ?? default_sleep,
810
- poll_interval_ms: options.poll_interval_ms ?? POLL_INTERVAL_MS
1056
+ sleep: options.sleep ?? default_sleep2,
1057
+ poll_interval_ms: options.poll_interval_ms ?? POLL_INTERVAL_MS,
1058
+ wait_cap_ms: options.wait_cap_ms ?? WAIT_CAP_MS
1059
+ };
1060
+ }
1061
+ async function current_budget(context, reservations) {
1062
+ if (reservations.length <= 1) return { cores: context.budget, memory_mb: Infinity };
1063
+ const reading = await context.read_machine();
1064
+ const ledger = core_admission.ledger_load(reservations, context.now());
1065
+ const budget = machine_capacity.machine_budget(context.budget, reading, ledger);
1066
+ return { ...budget, cores: normalize_budget(budget.cores) };
1067
+ }
1068
+ function admit(context, overflow) {
1069
+ write_reservation(context.target, { ...context.fields, admitted_at: context.now() });
1070
+ return { overflow };
1071
+ }
1072
+ function overflow_of(context, reservations, budget) {
1073
+ return {
1074
+ waited_ms: context.now() - context.fields.claimed_at,
1075
+ ledger: core_admission.sum_load(reservations),
1076
+ budget
811
1077
  };
812
1078
  }
1079
+ async function poll_admission(context) {
1080
+ const reservations = live_reservations(context.directory);
1081
+ const budget = await current_budget(context, reservations);
1082
+ if (core_admission.is_admitted(context.key, reservations, budget)) return admit(context);
1083
+ if (context.now() >= context.deadline) {
1084
+ return admit(context, overflow_of(context, reservations, budget));
1085
+ }
1086
+ return void 0;
1087
+ }
813
1088
  async function await_admission(context) {
814
- while (!is_admitted(context.key, live_reservations(context.directory), context.budget)) {
815
- if (context.now() >= context.deadline) return;
1089
+ let admission = await poll_admission(context);
1090
+ while (admission === void 0) {
816
1091
  await context.sleep(context.poll_interval_ms);
1092
+ admission = await poll_admission(context);
817
1093
  }
1094
+ return admission;
818
1095
  }
819
1096
  async function reserve(weight, options = {}) {
820
1097
  const timing = resolve_timing(options);
821
1098
  const directory = options.directory ?? PLATFORM_TEMP_ROOT;
822
- const budget = normalize_budget(options.budget ?? availableParallelism2());
823
1099
  const claimed_at = timing.now();
824
1100
  const name = marker_name(randomUUID3());
825
1101
  const target = path8.join(directory, name);
826
- write_reservation(target, weight, claimed_at);
827
- await await_admission({
1102
+ const fields = { weight, claimed_at, memory_mb: options.memory_mb };
1103
+ write_reservation(target, fields);
1104
+ const admission = await await_admission({
828
1105
  ...timing,
829
1106
  key: name,
1107
+ target,
830
1108
  directory,
831
- budget,
832
- deadline: claimed_at + (options.wait_cap_ms ?? WAIT_CAP_MS)
1109
+ budget: normalize_budget(options.budget ?? availableParallelism3()),
1110
+ deadline: claimed_at + timing.wait_cap_ms,
1111
+ fields,
1112
+ read_machine: options.read_machine ?? machine_capacity.read_machine
833
1113
  });
834
- return { target };
1114
+ return { target, admission };
835
1115
  }
836
1116
  function release(handle) {
837
1117
  sweep_marker2(handle.target);
@@ -839,7 +1119,7 @@ function release(handle) {
839
1119
  async function with_core_reservation(weight, run2, options = {}) {
840
1120
  const handle = await reserve(weight, options);
841
1121
  try {
842
- return await run2();
1122
+ return await run2(handle.admission);
843
1123
  } finally {
844
1124
  release(handle);
845
1125
  }
@@ -867,9 +1147,11 @@ var core_budget = {
867
1147
  CORE_WEIGHTS,
868
1148
  HELD_KEY,
869
1149
  HELD_VALUE,
1150
+ MEMORY_MB,
870
1151
  RESERVED_PREFIX,
871
- admitted_keys,
872
- admitted_load,
1152
+ admitted_keys: core_admission.admitted_keys,
1153
+ admitted_load: core_admission.admitted_load,
1154
+ describe_overflow: core_admission.describe_overflow,
873
1155
  is_held,
874
1156
  live_reservations,
875
1157
  release,
@@ -958,6 +1240,17 @@ var CSPELL_CACHE_FLAGS = content_cache_flags(CSPELL_CACHE_FILE);
958
1240
 
959
1241
  // scripts/josh/josh-commands-backlog.ts
960
1242
  var BACKLOG_COMMANDS = {
1243
+ // Started from a terminal: the `backlogrun` keyword's launcher, and the board.
1244
+ backlogrun: {
1245
+ script: "scripts/backlog/backlogrun-cli.ts",
1246
+ description: "Start a backlogrun in the background and show its board; with one already running, only show the board",
1247
+ category: "AI tools",
1248
+ reference: [
1249
+ "[#<n>...] [--only] [--max <n>] [--idle <minutes>] [--agent claude|codex]",
1250
+ "developer",
1251
+ ["files", "network", "processes"]
1252
+ ]
1253
+ },
961
1254
  "backlog:next": {
962
1255
  script: "scripts/backlog/backlog-next.ts",
963
1256
  description: "Order the whole opted-in backlog: auto-ok issues and the descendants of auto-ok epics, transitively through nested epics",
@@ -988,7 +1281,7 @@ var BACKLOG_COMMANDS = {
988
1281
  },
989
1282
  "backlog:stalled": {
990
1283
  script: "scripts/backlog/backlog-stalled-cli.ts",
991
- // A stall sends one Telegram warning (joshuafolkken/kit#3357). The `Stop` hook calls the detector
1284
+ // A stall sends one Telegram warning. The `Stop` hook calls the detector
992
1285
  // directly, so this flag costs only the manual command its in-process dispatch.
993
1286
  tsx_arguments: OPTIONAL_ENV_FILE_FLAGS,
994
1287
  description: "Report whether ready backlog work is sitting undispatched with a free lane and no recent dispatch",
@@ -1083,7 +1376,7 @@ var ISSUE_COMMANDS = {
1083
1376
  },
1084
1377
  "defect:rate": {
1085
1378
  script: "scripts/issue/defect-rate-cli.ts",
1086
- description: "Print the defect rate of merged work: defects filed per behavior change completed",
1379
+ description: "Print the defect rate of merged work: defects filed per enhancement completed",
1087
1380
  category: "AI tools",
1088
1381
  reference: ["[--days <n>]", "automation", ["network"]]
1089
1382
  },
@@ -1113,13 +1406,19 @@ var ISSUE_COMMANDS = {
1113
1406
  },
1114
1407
  "issue:file": {
1115
1408
  script: "scripts/issue/issue-file-cli.ts",
1116
- description: "File an Issue with every filing step: lint, Origin, WIP cap, duplicate scout, labels, then epic:bundle",
1409
+ description: "File an Issue with every filing step: lint, Origin, fold, WIP cap, duplicate scout, labels, then epic:bundle",
1117
1410
  category: "AI tools",
1118
1411
  reference: [
1119
- "<title> --body-file <path> --depth <0|1|2> [--route <route>] [--label <name>] [--repo <owner/repo>] [--distinct <N,\u2026>] [--over-cap] [--no-auto-ok]",
1412
+ "<title> --body-file <path> --depth <0|1|2> [--route <route>] [--label <name>] [--repo <owner/repo>] [--distinct <N,\u2026>] [--over-cap] [--no-auto-ok] [--requested] [--release]",
1120
1413
  "automation",
1121
1414
  ["network"]
1122
1415
  ]
1416
+ },
1417
+ "issue:release": {
1418
+ script: "scripts/issue/issue-release-cli.ts",
1419
+ description: "Link an Issue to the repository's open release Issue as its blocker, filing one when none is open",
1420
+ category: "AI tools",
1421
+ reference: ["<issue>", "automation", ["network"]]
1123
1422
  }
1124
1423
  };
1125
1424
 
@@ -1155,7 +1454,7 @@ var LANE_COMMANDS = {
1155
1454
  },
1156
1455
  "lane:prune": {
1157
1456
  ...LANE_ARGUMENTS,
1158
- description: "Close every lane an interruption left without its work tree",
1457
+ description: "Close every lane an interruption left without its work tree, then sweep unregistered leftovers under the lanes root",
1159
1458
  category: "AI tools",
1160
1459
  reference: ["", "automation", ["files", "git"]],
1161
1460
  default_script_arguments: ["prune"]
@@ -1187,18 +1486,27 @@ var LANE_COMMANDS = {
1187
1486
  category: "AI tools",
1188
1487
  reference: ["<issue> [--stash <message>]", "automation", ["files", "git", "processes"]]
1189
1488
  },
1190
- // The lane-limit measurement (joshuafolkken/kit#3355): `.env` is read so `lane:stats` labels the row
1489
+ // A live run's lane limit: `.env` is read so the bare form reports the
1490
+ // `JOSH_LANE_LIMIT` a person set there when no override stands.
1491
+ "lane:limit": {
1492
+ script: "scripts/lane/lane-limit-cli.ts",
1493
+ tsx_arguments: OPTIONAL_ENV_FILE_FLAGS,
1494
+ description: "Change a live backlogrun\u2019s lane limit without stopping it, or print the limit, lanes in use and free lanes",
1495
+ category: "AI tools",
1496
+ reference: ["[<limit>] [--reset]", "developer", ["files"]]
1497
+ },
1498
+ // The lane-limit measurement: `.env` is read so `lane:stats` labels the row
1191
1499
  // with the `JOSH_LANE_LIMIT` a person set there.
1192
1500
  "lane:sample": {
1193
1501
  ...MEASURE_ARGUMENTS,
1194
- description: "Record the machine load (load average, swap, free memory, working lanes) to the lane ledger",
1502
+ description: "Record the machine load (load average, swap, free memory, working lanes) to the lane ledger \u2014 a backlogrun samples itself, this is for a reading outside one",
1195
1503
  category: "AI tools",
1196
1504
  reference: ["[--every <seconds>]", "maintainer", ["files"]],
1197
1505
  default_script_arguments: ["sample"]
1198
1506
  },
1199
1507
  "lane:stats": {
1200
1508
  ...MEASURE_ARGUMENTS,
1201
- description: "Print one table row of lane throughput, gate duration and machine load over a period",
1509
+ description: "Print one table row of lane throughput, gate duration and machine load over a period, and the per-stage durations of a lane under it",
1202
1510
  category: "AI tools",
1203
1511
  reference: ["--period <days> [--limit <lane-limit>]", "maintainer", ["none"]],
1204
1512
  default_script_arguments: ["stats"]
@@ -1230,12 +1538,18 @@ var RUN_COMMANDS = {
1230
1538
  "run:carry": {
1231
1539
  script: "scripts/run/carry/run-carry-cli.ts",
1232
1540
  // `--stopped` sends the stop confirmation, so the Telegram credentials come from `.env` as for
1233
- // `run:wake` below (joshuafolkken/kit#3357).
1541
+ // `run:wake` below.
1234
1542
  tsx_arguments: OPTIONAL_ENV_FILE_FLAGS,
1235
1543
  description: "Carry one invocation\u2019s budget across its own session cuts",
1236
1544
  category: "AI tools",
1237
1545
  reference: ["<operation> [arguments...]", "automation", ["files"]]
1238
1546
  },
1547
+ "run:add": {
1548
+ script: "scripts/run/add/run-add-cli.ts",
1549
+ description: "Add issues to a live backlogrun, ahead of the queue unless --no-priority",
1550
+ category: "AI tools",
1551
+ reference: ["<issue...> [--no-priority]", "automation", ["network", "files"]]
1552
+ },
1239
1553
  "run:wake": {
1240
1554
  script: "scripts/run/wake/run-wake-cli.ts",
1241
1555
  // `.env` rather than the ambient environment:
@@ -1274,18 +1588,26 @@ var RUN_COMMANDS = {
1274
1588
  ["files"]
1275
1589
  ]
1276
1590
  },
1591
+ "run:board": {
1592
+ script: "scripts/run/board/run-board-cli.ts",
1593
+ // `--every` pushes its frame as a Telegram, so the credentials come from `.env` as for `run:carry`.
1594
+ tsx_arguments: OPTIONAL_ENV_FILE_FLAGS,
1595
+ description: "Draw a live board of the running backlogrun, redrawn every second",
1596
+ category: "AI tools",
1597
+ reference: ["[--once | --chat | --every <minutes>]", "automation", ["files", "network"]]
1598
+ },
1277
1599
  "run:prep": {
1278
1600
  script: "scripts/run/run-prep-cli.ts",
1279
1601
  description: "Bundle a run\u2019s pre-edit reads: body, comments, state, dependency scope",
1280
1602
  category: "AI tools",
1281
1603
  reference: ["<issue>", "automation", ["network"]]
1282
1604
  },
1283
- // The entry sequence a lane opened on, folded into one call (joshuafolkken/kit#2372): claim the tree,
1605
+ // The entry sequence a lane opened on, folded into one call: claim the tree,
1284
1606
  // read the budget, gather the issue reads and decide the pre-implementation step. `run:hold`,
1285
1607
  // `cost --cut`, `run:prep` and `run:step` were four round trips re-billing a lane's full context each.
1286
1608
  "run:entry": {
1287
1609
  script: "scripts/run/entry/run-entry-cli.ts",
1288
- // A `busy` hold or an `over` budget sends the stop confirmation (joshuafolkken/kit#3357).
1610
+ // A `busy` hold or an `over` budget sends the stop confirmation.
1289
1611
  tsx_arguments: OPTIONAL_ENV_FILE_FLAGS,
1290
1612
  description: "Open a run in one call: claim the tree, read the budget, bundle the reads, decide the pre-implementation step",
1291
1613
  category: "AI tools",
@@ -1388,12 +1710,12 @@ var AI_COMMANDS = {
1388
1710
  reference: ["[options]", "maintainer", ["none"]],
1389
1711
  // Kit-only: it measures kit's own development runs and its report modules live under the
1390
1712
  // undistributed `scripts/time/`, so it means nothing in a consumer project and is dropped from a
1391
- // consumer's help (joshuafolkken/kit#1997). The runtime analysis hooks and guards rely on stays
1713
+ // consumer's help. The runtime analysis hooks and guards rely on stays
1392
1714
  // distributed under `scripts/time-runtime/`.
1393
1715
  is_kit_only: true
1394
1716
  },
1395
1717
  // The tool-calls-per-round-trip density the batching guard is measured on, aggregated across the
1396
- // recent lane sessions (joshuafolkken/kit#2405). Kit-only for the same reason `time` is: it reads
1718
+ // recent lane sessions. Kit-only for the same reason `time` is: it reads
1397
1719
  // kit's own lane transcripts and means nothing in a consumer project.
1398
1720
  "time:density": {
1399
1721
  script: "scripts/time/time-density-cli.ts",
@@ -1409,7 +1731,7 @@ var AI_COMMANDS = {
1409
1731
  reference: ["", "maintainer", ["none"]],
1410
1732
  // Kit-only: it reads kit's own development run — the transcript store, the review ledger and the
1411
1733
  // run event stream — so it means nothing in a consumer project and is dropped from a consumer's
1412
- // help (joshuafolkken/kit#2328), through the same declaration `josh time` uses for the same reason.
1734
+ // help, through the same declaration `josh time` uses for the same reason.
1413
1735
  is_kit_only: true
1414
1736
  },
1415
1737
  "review:brief": {
@@ -1461,7 +1783,7 @@ var AI_COMMANDS = {
1461
1783
  category: "AI tools",
1462
1784
  reference: ["[--join]", "automation", ["processes", "files"]]
1463
1785
  },
1464
- // The post-merge sequence a run closed on, folded into one call (joshuafolkken/kit#2372): commit the
1786
+ // The post-merge sequence a run closed on, folded into one call: commit the
1465
1787
  // observation ledger, read the completion citations and decide the release scope. `observations:flush`,
1466
1788
  // `issue:cite` and `release:scope` were three round trips re-billing the run's full context each.
1467
1789
  "run:tail": {
@@ -1470,7 +1792,7 @@ var AI_COMMANDS = {
1470
1792
  category: "AI tools",
1471
1793
  reference: ["[<issue> ...]", "automation", ["git", "network"]]
1472
1794
  },
1473
- // The commit-to-report region a run ships a change on, folded into one call (joshuafolkken/kit#2398):
1795
+ // The commit-to-report region a run ships a change on, folded into one call:
1474
1796
  // the gate, the commit/push/PR (`git -y`), the CI-wait merge (`followup`) and the report bookkeeping
1475
1797
  // (`run:tail`) were four round trips re-billing the run's full context each. It stops at the first
1476
1798
  // failed step and names it, so the run reads only the step to fix.
@@ -1530,7 +1852,7 @@ var AI_COMMANDS = {
1530
1852
  category: "AI tools",
1531
1853
  reference: ["[scenario...]", "maintainer", ["processes", "network"]],
1532
1854
  // Kit-only: it replays kit's own distributed rules against real Claude sessions, so it means
1533
- // nothing in a consumer project and is dropped from a consumer's help (joshuafolkken/kit#1988).
1855
+ // nothing in a consumer project and is dropped from a consumer's help.
1534
1856
  is_kit_only: true
1535
1857
  }
1536
1858
  };
@@ -1546,7 +1868,7 @@ var CLONE_COMMANDS = {
1546
1868
  };
1547
1869
 
1548
1870
  // scripts/gate/gate-plan.ts
1549
- import { availableParallelism as availableParallelism3 } from "node:os";
1871
+ import { availableParallelism as availableParallelism4 } from "node:os";
1550
1872
 
1551
1873
  // scripts/lib/status-icons.ts
1552
1874
  var FAIL_ICON = "\u2717";
@@ -1594,28 +1916,53 @@ var LINT_LABEL = "lint";
1594
1916
  var TYPE_CHECK_LABEL = "check";
1595
1917
  var UNIT_LABEL = "test:unit";
1596
1918
  var BEHAVIOR_LABEL = "behavior";
1919
+ var METRICS_LABEL = "metrics";
1597
1920
  var WARNING_CHECKER_LABELS = [LINT_LABEL, TYPE_CHECK_LABEL];
1598
1921
  var STATIC_CHECKS = [
1599
- { label: LINT_LABEL, target: "lint", reserved_cores: core_budget.CORE_WEIGHTS.lint },
1922
+ {
1923
+ label: LINT_LABEL,
1924
+ target: "lint",
1925
+ reserved_cores: core_budget.CORE_WEIGHTS.lint,
1926
+ memory_mb: core_budget.MEMORY_MB.lint
1927
+ },
1600
1928
  {
1601
1929
  label: TYPE_CHECK_LABEL,
1602
1930
  target: "check",
1603
- reserved_cores: core_budget.CORE_WEIGHTS.type_check
1931
+ reserved_cores: core_budget.CORE_WEIGHTS.type_check,
1932
+ memory_mb: core_budget.MEMORY_MB.type_check
1933
+ },
1934
+ {
1935
+ label: "cspell",
1936
+ target: "cspell:dot",
1937
+ reserved_cores: core_budget.CORE_WEIGHTS.spell_check,
1938
+ memory_mb: core_budget.MEMORY_MB.spell_check
1604
1939
  },
1605
- { label: "cspell", target: "cspell:dot", reserved_cores: core_budget.CORE_WEIGHTS.spell_check },
1606
1940
  { label: BEHAVIOR_LABEL, target: BEHAVIOR_LABEL, reserved_cores: 0 },
1607
- // **The unused-member check reserves no core** (joshuafolkken/kit#2987): it builds one TypeScript
1941
+ // **The unused-member check reserves no core**: it builds one TypeScript
1608
1942
  // program and walks it for about 5s, and it is over well before lint and the type check. A
1609
1943
  // reservation would only take a place from the four-core CI runner's fan-out and a worker from the
1610
1944
  // unit suite for the whole gate.
1611
- { label: "exports", target: "exports:unused", reserved_cores: 0 }
1945
+ { label: "exports", target: "exports:unused", reserved_cores: 0 },
1946
+ // **The metrics ratchet is kit's own**: it holds kit's repository-wide
1947
+ // totals to the merge-base's. It is one in-process eslint pass with only `max-lines` enabled, over
1948
+ // in a few seconds, so it reserves no core for the reason the unused-member check above does not.
1949
+ // It times no startup here: beside the unit suite that reads the load, not josh.
1950
+ {
1951
+ label: METRICS_LABEL,
1952
+ target: METRICS_LABEL,
1953
+ args: ["--no-startup"],
1954
+ reserved_cores: 0,
1955
+ memory_mb: core_budget.MEMORY_MB.eslint_scan,
1956
+ is_kit_only: true
1957
+ }
1612
1958
  ];
1613
1959
  var GATE_CHECKS = [
1614
1960
  ...STATIC_CHECKS,
1615
1961
  { label: UNIT_LABEL, target: UNIT_LABEL, reserved_cores: 0 }
1616
1962
  ];
1617
- function select_gate_checks(is_unit_included) {
1618
- return is_unit_included ? GATE_CHECKS : STATIC_CHECKS;
1963
+ function select_gate_checks(is_unit_included, is_kit_repository = true) {
1964
+ const checks = is_unit_included ? GATE_CHECKS : STATIC_CHECKS;
1965
+ return is_kit_repository ? checks : checks.filter((check) => check.is_kit_only !== true);
1619
1966
  }
1620
1967
  function has_unit_check(checks) {
1621
1968
  return checks.some((check) => check.label === UNIT_LABEL);
@@ -1655,19 +2002,33 @@ function check_weight(check, plan, available_cores) {
1655
2002
  if (check.label !== UNIT_LABEL) return check.reserved_cores;
1656
2003
  return plan.unit_worker_cap ?? solo_unit_weight(available_cores);
1657
2004
  }
1658
- function direct_unit_weight(available_cores = availableParallelism3(), live_runs = unit_worker_share.live_run_count()) {
2005
+ function unit_memory(workers) {
2006
+ return workers * core_budget.MEMORY_MB.unit_worker;
2007
+ }
2008
+ function check_memory(check, plan, available_cores) {
2009
+ if (check.label !== UNIT_LABEL) return check.memory_mb ?? 0;
2010
+ return unit_memory(check_weight(check, plan, available_cores));
2011
+ }
2012
+ function direct_unit_weight(available_cores = availableParallelism4(), live_runs = unit_worker_share.live_run_count()) {
1659
2013
  const weight = unit_worker_share.current_share(available_cores, live_runs) ?? solo_unit_weight(available_cores);
1660
2014
  return Math.max(unit_worker_share.MIN_WORKERS, weight);
1661
2015
  }
2016
+ function direct_unit_memory() {
2017
+ return unit_memory(direct_unit_weight());
2018
+ }
2019
+ function unit_cap_for(checks, available_cores, concurrent_runs) {
2020
+ if (!has_unit_check(checks)) return void 0;
2021
+ return resolve_unit_worker_cap(available_cores, concurrent_runs);
2022
+ }
1662
2023
  function plan_of(concurrency, unit_worker_cap, checks = GATE_CHECKS) {
1663
2024
  return { checks, concurrency, unit_worker_cap };
1664
2025
  }
1665
- function resolve_gate_plan(available_cores = availableParallelism3(), concurrent_runs = unit_worker_share.SOLO_RUNS, is_unit_included = true) {
1666
- const checks = select_gate_checks(is_unit_included);
2026
+ function resolve_gate_plan(available_cores = availableParallelism4(), concurrent_runs = unit_worker_share.SOLO_RUNS, is_unit_included = true, is_kit_repository = true) {
2027
+ const checks = select_gate_checks(is_unit_included, is_kit_repository);
1667
2028
  return {
1668
2029
  checks,
1669
2030
  concurrency: resolve_concurrency(available_cores, concurrent_runs, checks),
1670
- unit_worker_cap: is_unit_included ? resolve_unit_worker_cap(available_cores, concurrent_runs) : void 0
2031
+ unit_worker_cap: unit_cap_for(checks, available_cores, concurrent_runs)
1671
2032
  };
1672
2033
  }
1673
2034
  function format_machine(available_cores, concurrent_runs) {
@@ -1680,7 +2041,7 @@ function format_unit_cap(plan) {
1680
2041
  if (plan.unit_worker_cap === void 0) return `${UNIT_LABEL} unrestricted`;
1681
2042
  return `${UNIT_LABEL} at ${String(plan.unit_worker_cap)} workers`;
1682
2043
  }
1683
- function format_gate_plan(plan, available_cores = availableParallelism3(), concurrent_runs = unit_worker_share.SOLO_RUNS) {
2044
+ function format_gate_plan(plan, available_cores = availableParallelism4(), concurrent_runs = unit_worker_share.SOLO_RUNS) {
1684
2045
  const cap = format_unit_cap(plan);
1685
2046
  const count = `${String(plan.concurrency)} of ${String(plan.checks.length)}`;
1686
2047
  const width = `${count}${josh_verdict.GATE_OPENING_MARK}`;
@@ -1691,12 +2052,15 @@ var gate_plan = {
1691
2052
  GATE_CHECKS,
1692
2053
  LINT_LABEL,
1693
2054
  MEASURED_CORES,
2055
+ METRICS_LABEL,
1694
2056
  RESERVED_CORES,
1695
2057
  STATIC_CHECKS,
1696
2058
  TYPE_CHECK_LABEL,
1697
2059
  UNIT_LABEL,
1698
2060
  WARNING_CHECKER_LABELS,
2061
+ check_memory,
1699
2062
  check_weight,
2063
+ direct_unit_memory,
1700
2064
  direct_unit_weight,
1701
2065
  format_gate_plan,
1702
2066
  format_machine,
@@ -1732,28 +2096,45 @@ var DEV_COMMANDS = {
1732
2096
  description: "Check code with prettier and eslint (skips a tool a basic project lacks)",
1733
2097
  category: "Development",
1734
2098
  reference: ["", "developer", ["processes"]],
1735
- core_weight: core_budget.CORE_WEIGHTS.lint
2099
+ core_weight: core_budget.CORE_WEIGHTS.lint,
2100
+ memory_mb: core_budget.MEMORY_MB.lint
1736
2101
  },
1737
2102
  "lint:related": {
1738
2103
  script: "scripts/lint/lint-related.ts",
1739
2104
  description: "Check only the changed files with prettier and eslint (whole tree on fallback)",
1740
2105
  category: "Development",
1741
2106
  reference: [FILE_ARGUMENTS, "developer", ["processes"]],
1742
- core_weight: core_budget.CORE_WEIGHTS.lint
2107
+ core_weight: core_budget.CORE_WEIGHTS.lint,
2108
+ memory_mb: core_budget.MEMORY_MB.lint
1743
2109
  },
1744
2110
  lines: {
1745
2111
  script: "scripts/lines/lines-command.ts",
1746
2112
  description: "Print a file's code lines against the max-lines limit and the headroom left",
1747
2113
  category: "Development",
1748
2114
  reference: [REQUIRED_FILE_ARGUMENTS, "developer", ["none"]],
1749
- core_weight: core_budget.CORE_WEIGHTS.eslint_scan
2115
+ core_weight: core_budget.CORE_WEIGHTS.eslint_scan,
2116
+ memory_mb: core_budget.MEMORY_MB.eslint_scan
2117
+ },
2118
+ metrics: {
2119
+ script: "scripts/metrics/metrics-command.ts",
2120
+ description: "Print repository-wide quality totals and durations, and fail when a total grew past the merge-base or a duration past its baseline",
2121
+ category: "Development",
2122
+ reference: [
2123
+ '[--no-startup | --totals-only | --accept --reason "<why>"]',
2124
+ "developer",
2125
+ ["files"]
2126
+ ],
2127
+ core_weight: core_budget.CORE_WEIGHTS.eslint_scan,
2128
+ memory_mb: core_budget.MEMORY_MB.eslint_scan,
2129
+ is_kit_only: true
1750
2130
  },
1751
2131
  "refactor:scan": {
1752
2132
  script: "scripts/refactor/refactor-scan-cli.ts",
1753
2133
  description: "List refactoring candidates in the changed scope by category and answer clear/candidates",
1754
2134
  category: "Development",
1755
2135
  reference: ["", "automation", ["processes"]],
1756
- core_weight: core_budget.CORE_WEIGHTS.eslint_scan
2136
+ core_weight: core_budget.CORE_WEIGHTS.eslint_scan,
2137
+ memory_mb: core_budget.MEMORY_MB.eslint_scan
1757
2138
  },
1758
2139
  bytes: {
1759
2140
  script: "scripts/lines/bytes-command.ts",
@@ -1767,6 +2148,12 @@ var DEV_COMMANDS = {
1767
2148
  category: "AI tools",
1768
2149
  reference: ["[--refresh]", "developer", ["files"]]
1769
2150
  },
2151
+ "rule:list": {
2152
+ script: "scripts/rules/rule-list.ts",
2153
+ description: "Print the trigger-delivered rules \u2014 each one's source, firing call and silent turn \u2014 from the guard rows",
2154
+ category: "AI tools",
2155
+ reference: ["", "automation", ["none"]]
2156
+ },
1770
2157
  format: {
1771
2158
  script: "scripts/lint/format.ts",
1772
2159
  description: "Format code with prettier and eslint (skips a tool a basic project lacks)",
@@ -1787,8 +2174,8 @@ var DEV_COMMANDS = {
1787
2174
  // **No `tsx_arguments`, deliberately.** `JOSH_BATCH_GUARD` is a per-machine preference kept in
1788
2175
  // `.env`, which every other command reads through `OPTIONAL_ENV_FILE_FLAGS` — but declaring any
1789
2176
  // `tsx_arguments` disqualifies a command from in-process dispatch (`josh-in-process.ts`), and
1790
- // this one runs before every `Bash` call. That is the hot path joshuafolkken/kit#1342 took a
1791
- // second ~0.16 s tsx start off. The script calls `process.loadEnvFile` itself instead, which is
2177
+ // this one runs before every `Bash` call, where a second ~0.16 s tsx start is not affordable.
2178
+ // The script calls `process.loadEnvFile` itself instead, which is
1792
2179
  // node's own `--env-file` parser with node's own precedence.
1793
2180
  },
1794
2181
  "pretool:guard": {
@@ -1812,7 +2199,7 @@ var DEV_COMMANDS = {
1812
2199
  },
1813
2200
  "session:lang": {
1814
2201
  script: "scripts/josh/session-language-cli.ts",
1815
- description: "Claude Code hook: print the resolved JOSH_SESSION_LANG (defaults to ja) for the session context",
2202
+ description: "Claude Code hook: print a non-default JOSH_SESSION_LANG for the session context, and the run:board reply rule while a backlogrun is live (otherwise nothing)",
1816
2203
  category: "Development",
1817
2204
  reference: ["", "automation", ["none"]]
1818
2205
  // **No `tsx_arguments`, deliberately**, the same as `batch:guard` above: this runs on every
@@ -1825,7 +2212,7 @@ var DEV_COMMANDS = {
1825
2212
  category: "Development",
1826
2213
  reference: ["<pretool|posttool>", "automation", ["none"]]
1827
2214
  // The live-source fallback `scripts/hooks/run-hook.sh` derives from the `codex-hook-adapter`
1828
- // bundle name (joshuafolkken/kit#3184). **No `tsx_arguments`**, the same as `pretool:guard`
2215
+ // bundle name. **No `tsx_arguments`**, the same as `pretool:guard`
1829
2216
  // above: it runs before every guarded Codex call.
1830
2217
  },
1831
2218
  "cspell:dot": {
@@ -1833,7 +2220,8 @@ var DEV_COMMANDS = {
1833
2220
  description: "Run spell check including dotfiles",
1834
2221
  category: "Development",
1835
2222
  reference: ["", "developer", ["processes"]],
1836
- core_weight: core_budget.CORE_WEIGHTS.spell_check
2223
+ core_weight: core_budget.CORE_WEIGHTS.spell_check,
2224
+ memory_mb: core_budget.MEMORY_MB.spell_check
1837
2225
  },
1838
2226
  behavior: {
1839
2227
  script: "scripts/behavior/behavior-cli.ts",
@@ -1852,14 +2240,16 @@ var DEV_COMMANDS = {
1852
2240
  description: "Run unit tests with Vitest (skips when Vitest is absent; fails when it has no tests)",
1853
2241
  category: "Development",
1854
2242
  reference: [FILTER_ARGUMENTS, "developer", ["processes"]],
1855
- core_weight: gate_plan.direct_unit_weight
2243
+ core_weight: gate_plan.direct_unit_weight,
2244
+ memory_mb: gate_plan.direct_unit_memory
1856
2245
  },
1857
2246
  "test:related": {
1858
2247
  script: "scripts/test/test-related.ts",
1859
2248
  description: "Run only the unit tests related to the changed files (full suite on fallback)",
1860
2249
  category: "Development",
1861
2250
  reference: [FILE_ARGUMENTS, "developer", ["processes"]],
1862
- core_weight: gate_plan.direct_unit_weight
2251
+ core_weight: gate_plan.direct_unit_weight,
2252
+ memory_mb: gate_plan.direct_unit_memory
1863
2253
  },
1864
2254
  "test:declared": {
1865
2255
  script: "scripts/test/test-declared.ts",
@@ -1903,7 +2293,8 @@ var DEV_COMMANDS = {
1903
2293
  description: "Type-check with tsc (skips a basic project with no TypeScript to check)",
1904
2294
  category: "Development",
1905
2295
  reference: ["[arguments...]", "developer", ["processes"]],
1906
- core_weight: core_budget.CORE_WEIGHTS.type_check
2296
+ core_weight: core_budget.CORE_WEIGHTS.type_check,
2297
+ memory_mb: core_budget.MEMORY_MB.type_check
1907
2298
  },
1908
2299
  port: {
1909
2300
  script: "scripts/ports/port-command.ts",
@@ -2024,9 +2415,9 @@ var MAINTENANCE_COMMANDS = {
2024
2415
  shell: [
2025
2416
  "sh",
2026
2417
  "-c",
2027
- "export NODE_AUTH_TOKEN=$(gh auth token) && pnpm josh latest:guard && pnpm josh latest:corepack && pnpm josh latest:update && pnpm josh ranges && pnpm josh audit && pnpm josh latest:scope --record"
2418
+ "export NODE_AUTH_TOKEN=$(gh auth token) && pnpm josh latest:guard && pnpm josh latest:update && pnpm josh ranges && pnpm josh audit && pnpm josh latest:corepack && pnpm josh latest:scope --record"
2028
2419
  ],
2029
- description: "Update pnpm, dependencies, and run security audit",
2420
+ description: "Update dependencies, run security audit, then update pnpm",
2030
2421
  category: "Maintenance",
2031
2422
  reference: ["", "developer", ["files", "network", "processes"]],
2032
2423
  argument_targets: ["latest:corepack", "latest:update", "audit"]
@@ -2175,16 +2566,16 @@ var VERSIONING_COMMANDS = {
2175
2566
  category: "Versioning",
2176
2567
  reference: ["", "developer", ["network"]]
2177
2568
  },
2178
- // The one place that decides a version (joshuafolkken/kit#1169). A `script` entry for the same
2569
+ // The one place that decides a version. A `script` entry for the same
2179
2570
  // reason `ranges` is one: script paths resolve against the kit package root, so it keeps working
2180
2571
  // from a consumer repository where the file lives under node_modules.
2181
2572
  release: {
2182
2573
  script: "scripts/release/release-cli.ts",
2183
2574
  description: "Release the merges main has taken since the version last changed",
2184
2575
  category: "Versioning",
2185
- reference: ["[version]", "maintainer", ["git", "network", "release"]]
2576
+ reference: ["[--dry-run]", "maintainer", ["git", "network", "release"]]
2186
2577
  },
2187
- // The read-only half of the one above (joshuafolkken/kit#1582). `release --dry-run` cannot
2578
+ // The read-only half of the one above. `release --dry-run` cannot
2188
2579
  // answer this question: it refuses off the default branch and on a dirty tree, which is every
2189
2580
  // position a run asks it from. A `script` entry for the same reason `release` is one.
2190
2581
  "release:scope": {
@@ -2193,8 +2584,8 @@ var VERSIONING_COMMANDS = {
2193
2584
  category: "Versioning",
2194
2585
  reference: ["[--json]", "automation", ["none"]]
2195
2586
  },
2196
- // Run by the release workflows, kit's and the one sync distributes, after a tag has published
2197
- // (joshuafolkken/kit#3007). Settings come from the environment, so the workflow decides them.
2587
+ // Run by the release workflows, kit's and the one sync distributes, after a tag has published.
2588
+ // Settings come from the environment, so the workflow decides them.
2198
2589
  "release:github": {
2199
2590
  script: "scripts/release/github-release-cli.ts",
2200
2591
  description: "Create the GitHub Release for a published tag, with generated notes",
@@ -2222,20 +2613,17 @@ var WORKFLOW_COMMANDS = {
2222
2613
  reference: ["<message>", "developer", ["network"]],
2223
2614
  default_script_arguments: ["-y", "--skip-commit", "--skip-push"]
2224
2615
  },
2225
- // **The optional form, on both** (joshuafolkken/kit#1564). These two were the last commands
2226
- // passing the mandatory `--env-file=.env`, which node resolves before the script's first line: on
2227
- // a machine with no `.env` they died as `.env: not found` with exit code 9, even where
2228
- // `TELEGRAM_BOT_TOKEN` and `TELEGRAM_CHAT_ID` existed as real environment variables — a cloud
2229
- // session, and `followup` with them the merge step of every `fullrun` there. `doctor` was moved to
2230
- // this form for the same reason in joshuafolkken/kit#869.
2616
+ // **The optional form, on both**. The mandatory `--env-file=.env` is resolved by node before the
2617
+ // script's first line: on a machine with no `.env` it dies as `.env: not found` with exit code 9,
2618
+ // even where `TELEGRAM_BOT_TOKEN` and `TELEGRAM_CHAT_ID` exist as real environment variables — a
2619
+ // cloud session, and `followup` with them the merge step of every `fullrun` there.
2231
2620
  //
2232
2621
  // Nothing is lost by relaxing it: both scripts already load `.env` through `josh_environment_file`
2233
2622
  // themselves, so the file is read either way and node's precedence — an existing environment
2234
2623
  // variable wins over the file — is node's own in both spellings.
2235
2624
  //
2236
- // **What the mandatory flag was accidentally providing was noise**, and that is replaced rather
2237
- // than dropped: `telegram_notify.send` now throws on missing credentials and on a failed send, so
2238
- // `josh notify` exits non-zero instead of warning and answering 0.
2625
+ // **A missing credential still fails loudly**: `telegram_notify.send` throws on missing credentials
2626
+ // and on a failed send, so `josh notify` exits non-zero instead of warning and answering 0.
2239
2627
  followup: {
2240
2628
  script: "scripts/followup/git-followup-workflow.ts",
2241
2629
  description: "Follow-up git workflow",
@@ -2251,11 +2639,23 @@ var WORKFLOW_COMMANDS = {
2251
2639
  script: "scripts/notify/telegram-test.ts",
2252
2640
  description: "Send Telegram notification",
2253
2641
  category: "Workflow",
2254
- reference: ["--task-type <type> --body <text>", "automation", ["notifications"]],
2642
+ reference: [
2643
+ "[--task-type <type>] [--body <text> | --body-file <path>] [--issue-url <url>] [--pr-url <url>] [--issue-title <text>] [--repo-name <name>]",
2644
+ "automation",
2645
+ ["notifications"]
2646
+ ],
2255
2647
  tsx_arguments: OPTIONAL_ENV_FILE_FLAGS
2256
2648
  },
2257
- // The observation ledger's commit path for the lines no run's own commit carried
2258
- // (joshuafolkken/kit#1756, joshuafolkken/kit#2763): a lane's lines sit in the primary checkout, which
2649
+ // One observation-ledger sighting: the key's count, the append and the second-sighting verdict,
2650
+ // which a run used to type as a `cat | grep -c` and judge by hand.
2651
+ "observation:record": {
2652
+ script: "scripts/observations/observation-record-cli.ts",
2653
+ description: "Record an observation sighting and answer whether it is now filed",
2654
+ category: "Workflow",
2655
+ reference: ["<key> <depth> <where> <what> [--checkout <path>]", "automation", ["files"]]
2656
+ },
2657
+ // The observation ledger's commit path for the lines no run's own commit carried:
2658
+ // a lane's lines sit in the primary checkout, which
2259
2659
  // its commit cannot see, and the recurrence count the promotion rule reads is a count of main.
2260
2660
  "observations:flush": {
2261
2661
  script: "scripts/observations/observations-flush-cli.ts",
@@ -2263,8 +2663,8 @@ var WORKFLOW_COMMANDS = {
2263
2663
  category: "Workflow",
2264
2664
  reference: ["", "automation", ["git", "network"]]
2265
2665
  },
2266
- // The one write path for a `/code-review` round's findings (joshuafolkken/kit#2325), plus the
2267
- // `--check` gate `followup` runs before it merges (joshuafolkken/kit#2343). It appends a `- rf:`
2666
+ // The one write path for a `/code-review` round's findings, plus the
2667
+ // `--check` gate `followup` runs before it merges. It appends a `- rf:`
2268
2668
  // line per finding — or one zero-finding line for a clean round — to the observation ledger, so
2269
2669
  // `observations:flush` commits them and the recurrence count survives the run.
2270
2670
  "review:record": {
@@ -2272,12 +2672,12 @@ var WORKFLOW_COMMANDS = {
2272
2672
  description: "Record a review round\u2019s findings, or check a round was recorded",
2273
2673
  category: "Workflow",
2274
2674
  reference: [
2275
- "--issue <N> [<category>:<severity>:<file> ...] | --check --issue <N>",
2675
+ "--issue <N> [--comment] [<category>:<severity>:<file> ...] | --check --issue <N>",
2276
2676
  "automation",
2277
- ["files"]
2677
+ ["files", "network"]
2278
2678
  ]
2279
2679
  },
2280
- // The reader over what `review:record` wrote (joshuafolkken/kit#2325): each recurring category’s
2680
+ // The reader over what `review:record` wrote: each recurring category’s
2281
2681
  // count, and the number of zero-finding rounds that distinguishes a quiet category from an unwatched one.
2282
2682
  "review:findings": {
2283
2683
  script: "scripts/review/review-findings-cli.ts",
@@ -2286,7 +2686,7 @@ var WORKFLOW_COMMANDS = {
2286
2686
  reference: ["", "developer", ["files"]]
2287
2687
  },
2288
2688
  // After a behavior-change Issue merges, re-run its declared baseline and print before/after; a value
2289
- // that did not move appends a refuted-premise line to the observation ledger (joshuafolkken/kit#2212).
2689
+ // that did not move appends a refuted-premise line to the observation ledger.
2290
2690
  "measure:rerun": {
2291
2691
  script: "scripts/issue/measure-rerun-cli.ts",
2292
2692
  description: "Re-run a merged issue\u2019s baseline command and print the before/after pair",
@@ -2294,7 +2694,7 @@ var WORKFLOW_COMMANDS = {
2294
2694
  reference: ["<issue-number>", "automation", ["network", "processes", "files"]]
2295
2695
  },
2296
2696
  // A script rather than an `sh -c` chain, because it has a precondition to enforce: run inside a
2297
- // linked work tree it would hijack the default branch from every other one (joshuafolkken/kit#1535).
2697
+ // linked work tree it would hijack the default branch from every other one.
2298
2698
  "main:sync": {
2299
2699
  script: "scripts/git/main-sync.ts",
2300
2700
  description: "Checkout default branch, pull latest, and prune merged remote-gone branches (refuses inside a lane)",
@@ -2302,9 +2702,8 @@ var WORKFLOW_COMMANDS = {
2302
2702
  reference: ["", "developer", ["git", "network"]]
2303
2703
  },
2304
2704
  // A script rather than an `sh -c` chain, because the strategy has to be named rather than left to
2305
- // the caller's git configuration: the `git pull` this replaced aborted with `Need to specify how
2306
- // to reconcile divergent branches` on exactly the diverged branch the command exists for
2307
- // (joshuafolkken/kit#1659).
2705
+ // the caller's git configuration: a bare `git pull` aborts with `Need to specify how to reconcile
2706
+ // divergent branches` on exactly the diverged branch the command exists for.
2308
2707
  "main:merge": {
2309
2708
  script: "scripts/git/main-merge.ts",
2310
2709
  description: "Merge origin default branch into the current branch",
@@ -2340,6 +2739,7 @@ var ALIASES = {
2340
2739
  lr: "lint:related",
2341
2740
  ln: "lines",
2342
2741
  by: "bytes",
2742
+ mt: "metrics",
2343
2743
  f: "format",
2344
2744
  sd: "cspell:dot",
2345
2745
  bh: "behavior",
@@ -2382,7 +2782,9 @@ var ALIASES = {
2382
2782
  ruv: "rule:value",
2383
2783
  ev: "eval",
2384
2784
  lsm: "lane:sample",
2385
- lst: "lane:stats"
2785
+ lst: "lane:stats",
2786
+ lli: "lane:limit",
2787
+ blr: "backlogrun"
2386
2788
  };
2387
2789
 
2388
2790
  // scripts/josh/josh-composite-arguments.ts
@@ -2745,15 +3147,16 @@ async function run_entry(entry, subcommand_arguments) {
2745
3147
  if (entry.shell) return run_shell_command(entry.shell, subcommand_arguments);
2746
3148
  return await run_script_entry(entry, subcommand_arguments);
2747
3149
  }
2748
- function command_weight(entry) {
2749
- return typeof entry.core_weight === "function" ? entry.core_weight() : entry.core_weight;
3150
+ function declared(value) {
3151
+ return typeof value === "function" ? value() : value;
2750
3152
  }
2751
3153
  async function dispatch_entry(entry, subcommand_arguments) {
2752
- const weight = command_weight(entry);
3154
+ const weight = declared(entry.core_weight);
2753
3155
  if (weight === void 0) return await run_entry(entry, subcommand_arguments);
2754
3156
  return await core_budget.with_command_reservation(
2755
3157
  weight,
2756
- async () => await run_entry(entry, subcommand_arguments)
3158
+ async () => await run_entry(entry, subcommand_arguments),
3159
+ { memory_mb: declared(entry.memory_mb) }
2757
3160
  );
2758
3161
  }
2759
3162
  async function run_command(cmd, subcommand_arguments, is_consumer = false) {