@joshuafolkken/kit 1.1240.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 (934) 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 +19 -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 +26 -16
  27. package/.claude/skills/workflow-commands/latest-gate.md +17 -28
  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/.vscode/tasks.json +14 -0
  42. package/CLAUDE.md +10 -61
  43. package/README.md +29 -47
  44. package/SECURITY.md +1 -1
  45. package/dist/CLAUDE.md +10 -61
  46. package/dist/commands/document-section-cli.js +42 -10
  47. package/dist/config-merge/index.js +11 -2
  48. package/dist/hooks/audit-provision.js +2 -2
  49. package/dist/hooks/batch-guard.js +7 -7
  50. package/dist/hooks/{chunk-KHGB5S3Y.js → chunk-43G45XJF.js} +18 -20
  51. package/dist/hooks/{chunk-4TZVB44A.js → chunk-4TW4MQUL.js} +284 -362
  52. package/dist/hooks/{chunk-XZYKEM6J.js → chunk-76RK6E3H.js} +13 -11
  53. package/dist/hooks/{chunk-F3ELQ2AF.js → chunk-DZWZ3DKY.js} +4 -4
  54. package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
  55. package/dist/hooks/{chunk-GPTFMK5E.js → chunk-GG72ANKI.js} +1 -1
  56. package/dist/hooks/{chunk-ZQGD4GBY.js → chunk-KPM4YIIX.js} +8 -44
  57. package/dist/hooks/chunk-MXVQMLDP.js +3705 -0
  58. package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
  59. package/dist/hooks/{chunk-QVSWU24O.js → chunk-NZBHG6FW.js} +7 -5
  60. package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
  61. package/dist/hooks/{chunk-KRBERBBI.js → chunk-R6CRQEAL.js} +4 -4
  62. package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
  63. package/dist/hooks/{chunk-WK2XSHSI.js → chunk-TLJYAGZK.js} +549 -874
  64. package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
  65. package/dist/hooks/codex-hook-adapter.js +26 -21
  66. package/dist/hooks/duplicate-read-guard.js +8 -8
  67. package/dist/hooks/format-edited.js +4 -4
  68. package/dist/hooks/inputs.json +216 -202
  69. package/dist/hooks/investigation-guard.js +8 -8
  70. package/dist/hooks/pretool-guard.js +15 -15
  71. package/dist/hooks/session-lang.js +406 -8
  72. package/dist/hooks/stop-guard.js +122 -187
  73. package/dist/josh.js +281 -94
  74. package/dist/version/index.js +15 -13
  75. package/eslint/base.js +43 -5
  76. package/eslint/rules/english-only-prose.js +3 -3
  77. package/eslint/rules/import.js +12 -0
  78. package/eslint/rules/namespace-object-export.js +2 -2
  79. package/package.json +16 -10
  80. package/pnpm-workspace.yaml +2 -4
  81. package/prompts/coding-standards.md +14 -48
  82. package/prompts/collaboration-workflow/file-edits.md +1 -1
  83. package/prompts/collaboration-workflow/issue-citation.md +1 -1
  84. package/prompts/collaboration-workflow/issue-template.md +3 -10
  85. package/prompts/collaboration-workflow/operating-rules.md +7 -8
  86. package/prompts/collaboration-workflow/output-bounds.md +1 -1
  87. package/prompts/collaboration-workflow/overview.md +1 -1
  88. package/prompts/collaboration-workflow/plan-comment.md +2 -1
  89. package/prompts/collaboration-workflow/principles.md +21 -3
  90. package/prompts/collaboration-workflow/report-format.md +16 -29
  91. package/prompts/collaboration-workflow/residency.md +1 -1
  92. package/prompts/collaboration-workflow/rule-delivery.md +7 -95
  93. package/prompts/collaboration-workflow/shell-body.md +3 -23
  94. package/prompts/collaboration-workflow/turn-batching.md +4 -13
  95. package/prompts/collaboration-workflow/wip-cap.md +5 -11
  96. package/prompts/refactoring.md +1 -1
  97. package/prompts/review-rubric.md +3 -22
  98. package/prompts/review.md +15 -38
  99. package/prompts/testing-guide.md +2 -4
  100. package/scripts/adopt/adopt-logic.ts +5 -5
  101. package/scripts/adopt/adopt-toolkits.ts +4 -5
  102. package/scripts/adopt/adopt.ts +2 -3
  103. package/scripts/agent/agent-argv.ts +7 -7
  104. package/scripts/agent/agent-diagnostics.ts +2 -2
  105. package/scripts/agent/agent-exit-record.ts +1 -1
  106. package/scripts/agent/agent-headless.ts +1 -1
  107. package/scripts/agent/agent-launch-environment.ts +6 -1
  108. package/scripts/agent/agent-role-profile.ts +49 -22
  109. package/scripts/agent/agent-session-role.ts +32 -0
  110. package/scripts/agent/api-outage.ts +1 -1
  111. package/scripts/agent/claude-agent-argv.ts +4 -4
  112. package/scripts/agent/claude-result-event.ts +4 -4
  113. package/scripts/agent/codex-hooks.ts +2 -2
  114. package/scripts/agent/interactive-ask.ts +3 -6
  115. package/scripts/auto-ok/auto-ok-cli.ts +46 -60
  116. package/scripts/backlog/backlog-arrival-added.ts +34 -0
  117. package/scripts/backlog/backlog-arrival.ts +54 -17
  118. package/scripts/backlog/backlog-budget-cli.ts +34 -6
  119. package/scripts/backlog/backlog-budget.ts +17 -24
  120. package/scripts/backlog/backlog-defect-priority.ts +1 -1
  121. package/scripts/backlog/backlog-drive-args.ts +5 -4
  122. package/scripts/backlog/backlog-drive-cli.ts +14 -10
  123. package/scripts/backlog/backlog-drive-epic.ts +85 -0
  124. package/scripts/backlog/backlog-drive-launch.ts +1 -1
  125. package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
  126. package/scripts/backlog/backlog-drive-named.ts +39 -9
  127. package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
  128. package/scripts/backlog/backlog-drive-restore.ts +1 -1
  129. package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
  130. package/scripts/backlog/backlog-drive.ts +43 -28
  131. package/scripts/backlog/backlog-idle.ts +88 -0
  132. package/scripts/backlog/backlog-named.ts +11 -15
  133. package/scripts/backlog/backlog-next.ts +26 -30
  134. package/scripts/backlog/backlog-offer-cli.ts +28 -23
  135. package/scripts/backlog/backlog-offer.ts +7 -7
  136. package/scripts/backlog/backlog-overlap.ts +178 -0
  137. package/scripts/backlog/backlog-plan-cli.ts +14 -90
  138. package/scripts/backlog/backlog-plan-read.ts +111 -0
  139. package/scripts/backlog/backlog-plan.ts +11 -10
  140. package/scripts/backlog/backlog-pool.ts +13 -14
  141. package/scripts/backlog/backlog-rank.ts +11 -11
  142. package/scripts/backlog/backlog-ready.ts +15 -10
  143. package/scripts/backlog/backlog-scope.ts +14 -15
  144. package/scripts/backlog/backlog-stalled-cli.ts +2 -2
  145. package/scripts/backlog/backlog-stalled-detect.ts +4 -4
  146. package/scripts/backlog/backlog-stalled.ts +5 -6
  147. package/scripts/backlog/backlog-waves.ts +4 -4
  148. package/scripts/backlog/backlogrun-args.ts +74 -0
  149. package/scripts/backlog/backlogrun-cli.ts +113 -0
  150. package/scripts/backlog/backlogrun-launch.ts +178 -0
  151. package/scripts/behavior/behavior-assertion.ts +6 -8
  152. package/scripts/behavior/behavior-cli.ts +1 -1
  153. package/scripts/behavior/behavior-rules.ts +3 -3
  154. package/scripts/build/build-claude-md.ts +4 -4
  155. package/scripts/build/build-codex-hooks.ts +2 -2
  156. package/scripts/build/build-commands.ts +1 -1
  157. package/scripts/build/build-hooks.ts +5 -5
  158. package/scripts/build/build.ts +1 -1
  159. package/scripts/build/hook-bundle-stamp.ts +109 -7
  160. package/scripts/build/local-bin.ts +2 -2
  161. package/scripts/cases/cases-cli.ts +1 -1
  162. package/scripts/cases/cases-logic.ts +2 -2
  163. package/scripts/ci/composite-actions.ts +1 -2
  164. package/scripts/ci/pr-classification.ts +2 -2
  165. package/scripts/claude/workflow-destination.ts +1 -1
  166. package/scripts/clone/clone-aggregate.ts +1 -1
  167. package/scripts/clone/clone-fingerprint.ts +1 -1
  168. package/scripts/clone/clone-scan-cli.ts +1 -1
  169. package/scripts/clone/clone-scan.ts +1 -1
  170. package/scripts/config-merge/index.ts +1 -1
  171. package/scripts/config-merge/json-format.ts +1 -3
  172. package/scripts/config-merge/patch-json-array.ts +90 -0
  173. package/scripts/config-merge/patch-json-key.ts +6 -3
  174. package/scripts/config-merge/patch-json-list.ts +1 -1
  175. package/scripts/cost-runtime/codex-usage.ts +1 -1
  176. package/scripts/cost-runtime/context-cut-payback.ts +4 -5
  177. package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
  178. package/scripts/cost-runtime/cost-attribute.ts +3 -3
  179. package/scripts/cost-runtime/cost-blocks.ts +3 -4
  180. package/scripts/cost-runtime/cost-cli.ts +14 -11
  181. package/scripts/cost-runtime/cost-corpus.ts +11 -11
  182. package/scripts/cost-runtime/cost-pricing.ts +4 -4
  183. package/scripts/cost-runtime/cost-tokens.ts +1 -2
  184. package/scripts/cost-runtime/cost-transcript.ts +29 -29
  185. package/scripts/cost-runtime/cost-usage.ts +6 -7
  186. package/scripts/cost-runtime/cost-verdict.ts +10 -11
  187. package/scripts/cost-runtime/own-session.ts +1 -1
  188. package/scripts/cost-runtime/transcript-cwd.ts +2 -2
  189. package/scripts/delegation/delegation-cli.ts +4 -4
  190. package/scripts/delegation/delegation-policy.ts +13 -15
  191. package/scripts/delegation/duplicate-read-guard.ts +9 -10
  192. package/scripts/delegation/fanout-cli.ts +1 -1
  193. package/scripts/delegation/fanout.ts +1 -1
  194. package/scripts/delegation/investigation-guard.ts +18 -22
  195. package/scripts/delegation/investigation-reads.ts +48 -238
  196. package/scripts/discovery/repo-discovery.ts +1 -1
  197. package/scripts/discovery/repo-map-logic.ts +1 -2
  198. package/scripts/discovery/repo-origin.ts +3 -3
  199. package/scripts/discovery/repo-party-cli.ts +2 -2
  200. package/scripts/discovery/repo-party.ts +2 -2
  201. package/scripts/doctor/doctor-consumer.ts +1 -1
  202. package/scripts/doctor/doctor-io.ts +6 -7
  203. package/scripts/doctor/doctor-logic.ts +1 -1
  204. package/scripts/doctor/doctor-ports.ts +1 -1
  205. package/scripts/doctor/doctor.ts +8 -9
  206. package/scripts/document/backlogrun-parent-read-set.ts +5 -6
  207. package/scripts/document/bash-output-cap.ts +5 -7
  208. package/scripts/document/capped-print-part.ts +1 -1
  209. package/scripts/document/capped-print.ts +1 -1
  210. package/scripts/document/document-byte-budget.ts +33 -64
  211. package/scripts/document/document-byte-check.ts +4 -4
  212. package/scripts/document/document-reachability.ts +7 -8
  213. package/scripts/document/document-read-cli.ts +2 -2
  214. package/scripts/document/document-scan.ts +26 -2
  215. package/scripts/document/document-section-cli.ts +6 -8
  216. package/scripts/document/document-section.ts +8 -12
  217. package/scripts/document/edit-files-cli.ts +3 -4
  218. package/scripts/document/entry-read-budget.ts +8 -70
  219. package/scripts/document/entry-read-set.ts +51 -34
  220. package/scripts/document/lane-child-read-set.ts +9 -9
  221. package/scripts/document/read-files-cli.ts +1 -2
  222. package/scripts/document/read-set-cli.ts +16 -19
  223. package/scripts/document/read-set-cost.ts +4 -4
  224. package/scripts/document/read-set-point-of-use.ts +28 -38
  225. package/scripts/document/read-set-pricing.ts +1 -1
  226. package/scripts/document/read-set-trim.ts +3 -3
  227. package/scripts/document/resident-budget.ts +8 -10
  228. package/scripts/epic/epic-add-body.ts +15 -18
  229. package/scripts/epic/epic-add-plan.ts +26 -28
  230. package/scripts/epic/epic-add.ts +32 -25
  231. package/scripts/epic/epic-audit-checks.ts +27 -37
  232. package/scripts/epic/epic-audit-cli.ts +21 -22
  233. package/scripts/epic/epic-audit-orphans.ts +16 -17
  234. package/scripts/epic/epic-audit-rationale.ts +10 -15
  235. package/scripts/epic/epic-audit-report.ts +2 -5
  236. package/scripts/epic/epic-audit.ts +18 -14
  237. package/scripts/epic/epic-body.ts +10 -10
  238. package/scripts/epic/epic-bundle-cli.ts +36 -34
  239. package/scripts/epic/epic-bundle-evidence.ts +5 -5
  240. package/scripts/epic/epic-bundle-gaps.ts +6 -9
  241. package/scripts/epic/epic-bundle-poll.ts +1 -1
  242. package/scripts/epic/epic-bundle-referenced.ts +11 -14
  243. package/scripts/epic/epic-bundle.ts +19 -20
  244. package/scripts/epic/epic-busy.ts +44 -21
  245. package/scripts/epic/epic-candidate-confirm.ts +15 -18
  246. package/scripts/epic/epic-chains.ts +18 -23
  247. package/scripts/epic/epic-classify.ts +11 -12
  248. package/scripts/epic/epic-cli-argv.ts +5 -6
  249. package/scripts/epic/epic-cli-remove.ts +9 -4
  250. package/scripts/epic/epic-cli.ts +38 -26
  251. package/scripts/epic/epic-close-comment.ts +14 -15
  252. package/scripts/epic/epic-close.ts +25 -29
  253. package/scripts/epic/epic-cross-repo.ts +18 -21
  254. package/scripts/epic/epic-decision.ts +14 -18
  255. package/scripts/epic/epic-fetch.ts +25 -31
  256. package/scripts/epic/epic-graph.ts +15 -17
  257. package/scripts/epic/epic-index.ts +14 -16
  258. package/scripts/epic/epic-issue.ts +9 -11
  259. package/scripts/epic/epic-label-age.ts +74 -0
  260. package/scripts/epic/epic-lane-offer.ts +35 -24
  261. package/scripts/epic/epic-nested.ts +1 -1
  262. package/scripts/epic/epic-next-read.ts +8 -8
  263. package/scripts/epic/epic-next-views.ts +12 -12
  264. package/scripts/epic/epic-next.ts +29 -33
  265. package/scripts/epic/epic-outside-blocker.ts +11 -10
  266. package/scripts/epic/epic-parse.ts +22 -24
  267. package/scripts/epic/epic-promote.ts +3 -2
  268. package/scripts/epic/epic-rank.ts +1 -1
  269. package/scripts/epic/epic-read.ts +10 -8
  270. package/scripts/epic/epic-reconcile.ts +8 -6
  271. package/scripts/epic/epic-reference.ts +5 -4
  272. package/scripts/epic/epic-relation-recheck.ts +10 -11
  273. package/scripts/epic/epic-relations.ts +9 -8
  274. package/scripts/epic/epic-remove-plan.ts +4 -5
  275. package/scripts/epic/epic-remove.ts +7 -5
  276. package/scripts/epic/epic-report.ts +18 -20
  277. package/scripts/epic/epic-run.ts +6 -5
  278. package/scripts/epic/epic-sections.ts +2 -2
  279. package/scripts/epic/epic-shape.ts +3 -3
  280. package/scripts/epic/epic-solo-stale.ts +3 -2
  281. package/scripts/epic/epic-solo.ts +8 -8
  282. package/scripts/epic/epic-triage.ts +5 -4
  283. package/scripts/epic/epic-validate.ts +8 -7
  284. package/scripts/epic/epic.ts +5 -5
  285. package/scripts/exports/unused-members-cli.ts +1 -1
  286. package/scripts/followup/followup-issue-number.ts +1 -2
  287. package/scripts/followup/git-followup-cleanup.ts +6 -7
  288. package/scripts/followup/git-followup-finish.ts +11 -13
  289. package/scripts/followup/git-followup-flush.ts +11 -7
  290. package/scripts/followup/git-followup-issue-close.ts +16 -13
  291. package/scripts/followup/git-followup-label.ts +9 -6
  292. package/scripts/followup/git-followup-merged.ts +1 -1
  293. package/scripts/followup/git-followup-pending.ts +7 -9
  294. package/scripts/followup/git-followup-stages.ts +28 -17
  295. package/scripts/followup/git-followup-workflow.ts +19 -21
  296. package/scripts/followup/git-pr-followup-checks.ts +13 -20
  297. package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
  298. package/scripts/followup/git-pr-followup.ts +18 -17
  299. package/scripts/gate/core-admission.ts +2 -2
  300. package/scripts/gate/core-budget.ts +15 -26
  301. package/scripts/gate/gate-ledger.ts +114 -0
  302. package/scripts/gate/gate-log.ts +7 -9
  303. package/scripts/gate/gate-plan.ts +70 -35
  304. package/scripts/gate/gate-report.ts +14 -15
  305. package/scripts/gate/gate-skip.ts +11 -13
  306. package/scripts/gate/gate-steps.ts +5 -1
  307. package/scripts/gate/gate-tree.ts +3 -4
  308. package/scripts/gate/hook-gate-reuse.ts +9 -9
  309. package/scripts/gate/machine-capacity.ts +168 -30
  310. package/scripts/gate/pre-commit-type-check.ts +4 -4
  311. package/scripts/gate/project-checks.ts +12 -4
  312. package/scripts/gate/scoped-green.ts +11 -18
  313. package/scripts/gate/type-check-command.ts +2 -2
  314. package/scripts/gate/type-check-step.ts +4 -4
  315. package/scripts/gate/verification-gate.ts +53 -51
  316. package/scripts/gh/gh-spawn.ts +2 -2
  317. package/scripts/gh/git-ai-review-scan.ts +3 -2
  318. package/scripts/gh/git-gh-api-path.ts +10 -11
  319. package/scripts/gh/git-gh-exec.ts +43 -48
  320. package/scripts/gh/git-gh-failure.ts +6 -9
  321. package/scripts/gh/git-gh-helpers.ts +1 -1
  322. package/scripts/gh/git-gh-issue-list.ts +15 -19
  323. package/scripts/gh/git-gh-issue-read.ts +43 -60
  324. package/scripts/gh/git-gh-issue-rest.ts +14 -15
  325. package/scripts/gh/git-gh-issue-write.ts +52 -40
  326. package/scripts/gh/git-gh-issue.ts +23 -24
  327. package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
  328. package/scripts/gh/git-gh-pr-read.ts +46 -50
  329. package/scripts/gh/git-gh-pr-rest.ts +23 -26
  330. package/scripts/gh/git-gh-pr-review.ts +2 -2
  331. package/scripts/gh/git-gh-pr-rollup.ts +4 -4
  332. package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
  333. package/scripts/gh/git-gh-pr.ts +16 -16
  334. package/scripts/gh/git-gh-reachability.ts +11 -12
  335. package/scripts/gh/git-gh-repo.ts +2 -3
  336. package/scripts/gh/git-gh-rest-state.ts +1 -1
  337. package/scripts/gh/git-pr-ai-review.ts +6 -5
  338. package/scripts/gh/git-pr-checks-eval.ts +28 -30
  339. package/scripts/gh/git-pr-checks-parse.ts +14 -16
  340. package/scripts/gh/git-pr-checks-watch.ts +17 -17
  341. package/scripts/gh/git-pr-checks.ts +20 -23
  342. package/scripts/gh/git-pr-coderabbit.ts +8 -6
  343. package/scripts/gh/git-pr-confirmation.ts +5 -5
  344. package/scripts/gh/git-pr-managed-config.ts +7 -9
  345. package/scripts/gh/git-pr-messages.ts +1 -1
  346. package/scripts/gh/git-pr.ts +15 -16
  347. package/scripts/gh/github-issue-url.ts +8 -9
  348. package/scripts/git/base-tree.ts +66 -0
  349. package/scripts/git/change-base.ts +42 -2
  350. package/scripts/git/changed-file-scope.ts +5 -5
  351. package/scripts/git/changed-paths.ts +1 -2
  352. package/scripts/git/constants.ts +2 -2
  353. package/scripts/git/git-branch.ts +1 -1
  354. package/scripts/git/git-closes-keyword.ts +3 -3
  355. package/scripts/git/git-command.ts +53 -41
  356. package/scripts/git/git-common-directory.ts +3 -3
  357. package/scripts/git/git-diff-reads.ts +14 -15
  358. package/scripts/git/git-error.ts +1 -1
  359. package/scripts/git/git-execa-error.ts +1 -2
  360. package/scripts/git/git-issue.ts +10 -8
  361. package/scripts/git/git-location-environment.ts +3 -4
  362. package/scripts/git/git-ls-remote.ts +6 -8
  363. package/scripts/git/git-pre-push-hook.ts +11 -10
  364. package/scripts/git/git-preflight.ts +5 -5
  365. package/scripts/git/git-push-transport.ts +2 -2
  366. package/scripts/git/git-remote-branch.ts +1 -2
  367. package/scripts/git/git-schemas.ts +16 -23
  368. package/scripts/git/git-spawn-sync.ts +1 -1
  369. package/scripts/git/git-spawn.ts +37 -14
  370. package/scripts/git/git-ssh-keepalive.ts +12 -5
  371. package/scripts/git/git-staging.ts +7 -8
  372. package/scripts/git/git-workflow.ts +1 -1
  373. package/scripts/git/git-worktree.ts +35 -27
  374. package/scripts/git/gone-branch.ts +2 -2
  375. package/scripts/git/listing-cutoff.ts +1 -2
  376. package/scripts/git/lockfile-sync.ts +65 -0
  377. package/scripts/git/main-merge-guard.ts +1 -2
  378. package/scripts/git/main-merge.ts +7 -7
  379. package/scripts/git/main-sync.ts +23 -8
  380. package/scripts/git/parse-json-array.ts +18 -23
  381. package/scripts/git/repository-lock.ts +34 -2
  382. package/scripts/git/stash/git-stash.ts +4 -5
  383. package/scripts/git/stash/stash-orphans.ts +5 -3
  384. package/scripts/git/stash/stash-pop-args.ts +1 -1
  385. package/scripts/git/stash/stash-pop-cli.ts +3 -3
  386. package/scripts/git/stash/stash-sweep-lock.ts +2 -2
  387. package/scripts/hooks/batch-guard.ts +11 -13
  388. package/scripts/hooks/check-commit-message.ts +12 -9
  389. package/scripts/hooks/codex-hook-adapter.ts +16 -10
  390. package/scripts/hooks/edited-cspell.ts +3 -4
  391. package/scripts/hooks/format-edited-cli.ts +1 -1
  392. package/scripts/hooks/format-edited-file.ts +11 -17
  393. package/scripts/hooks/format-rewrite-notice.ts +19 -17
  394. package/scripts/hooks/pre-push-unit.ts +10 -14
  395. package/scripts/hooks/pretool-guard-cli.ts +4 -4
  396. package/scripts/hooks/pretool-guard.ts +93 -18
  397. package/scripts/hooks/reserved-run.ts +2 -2
  398. package/scripts/hooks/step-zero-notice.ts +1 -1
  399. package/scripts/hooks/stop-guard.ts +21 -10
  400. package/scripts/init/basic-path-migration.ts +2 -2
  401. package/scripts/init/claude-kit-only-settings.ts +2 -2
  402. package/scripts/init/claude-plugin-config.ts +2 -2
  403. package/scripts/init/distributed-paths.ts +4 -4
  404. package/scripts/init/hook-command-rewrite.ts +3 -3
  405. package/scripts/init/hook-launch.ts +5 -5
  406. package/scripts/init/init-actions.ts +13 -0
  407. package/scripts/init/init-ai-copy.ts +11 -11
  408. package/scripts/init/init-bootstrap.ts +3 -3
  409. package/scripts/init/init-copy-content.ts +4 -4
  410. package/scripts/init/init-logic-json-merge.ts +7 -9
  411. package/scripts/init/init-logic-migrate.ts +1 -1
  412. package/scripts/init/init-logic-templates.ts +1 -1
  413. package/scripts/init/init-logic-workspace.ts +4 -4
  414. package/scripts/init/init-logic-yaml-merge.ts +2 -2
  415. package/scripts/init/init-logic.ts +19 -22
  416. package/scripts/init/init.ts +7 -7
  417. package/scripts/init/kit-base-preset.ts +1 -1
  418. package/scripts/init/kit-setup-state.ts +1 -1
  419. package/scripts/init/kit-written-paths.ts +1 -2
  420. package/scripts/init/package-manager-pin.ts +1 -1
  421. package/scripts/init/project-profile-cli.ts +1 -1
  422. package/scripts/init/project-profile.ts +3 -3
  423. package/scripts/init/session-language-environment.ts +1 -1
  424. package/scripts/init/start-exec.ts +3 -4
  425. package/scripts/init/start-plan.ts +2 -2
  426. package/scripts/init/start-setup-pr.ts +3 -2
  427. package/scripts/init/start-steps.ts +2 -2
  428. package/scripts/init/tsconfig-preset-migration.ts +1 -1
  429. package/scripts/init/vscode-tasks.ts +62 -0
  430. package/scripts/issue/baseline-measure.ts +2 -2
  431. package/scripts/issue/behavior-change-lint.ts +2 -2
  432. package/scripts/issue/defect-rate-cli.ts +6 -7
  433. package/scripts/issue/defect-rate.ts +37 -27
  434. package/scripts/issue/git-next-issues.ts +9 -8
  435. package/scripts/issue/issue-auto-ok.ts +24 -11
  436. package/scripts/issue/issue-backlinks-cli.ts +5 -5
  437. package/scripts/issue/issue-backlinks.ts +6 -6
  438. package/scripts/issue/issue-cite-cli.ts +20 -18
  439. package/scripts/issue/issue-cite.ts +18 -8
  440. package/scripts/issue/issue-closing-pr.ts +4 -4
  441. package/scripts/issue/issue-comment-cli.ts +6 -4
  442. package/scripts/issue/issue-file-cli.ts +52 -15
  443. package/scripts/issue/issue-file-fold.ts +155 -0
  444. package/scripts/issue/issue-file.ts +9 -6
  445. package/scripts/issue/issue-fold-cli.ts +14 -9
  446. package/scripts/issue/issue-fold.ts +23 -8
  447. package/scripts/issue/issue-labels.ts +34 -38
  448. package/scripts/issue/issue-lint-cli.ts +2 -2
  449. package/scripts/issue/issue-lint.ts +1 -1
  450. package/scripts/issue/issue-merged.ts +10 -4
  451. package/scripts/issue/issue-number-shape.ts +27 -0
  452. package/scripts/issue/issue-rank.ts +1 -1
  453. package/scripts/issue/issue-read-cli.ts +4 -5
  454. package/scripts/issue/issue-read.ts +4 -5
  455. package/scripts/issue/issue-reference.ts +5 -5
  456. package/scripts/issue/issue-release-cli.ts +17 -7
  457. package/scripts/issue/issue-release.ts +3 -3
  458. package/scripts/issue/issue-report-failures.ts +7 -4
  459. package/scripts/issue/issue-scout-cli.ts +11 -11
  460. package/scripts/issue/issue-scout-closed.ts +4 -4
  461. package/scripts/issue/issue-scout.ts +4 -5
  462. package/scripts/issue/issue-state-cli.ts +17 -10
  463. package/scripts/issue/issue-state.ts +12 -13
  464. package/scripts/issue/issue-wip.ts +7 -7
  465. package/scripts/issue/markdown-section.ts +3 -3
  466. package/scripts/issue/measure-rerun-cli.ts +10 -9
  467. package/scripts/issue/reproduction-measure.ts +3 -3
  468. package/scripts/issue/session-cite.ts +56 -0
  469. package/scripts/josh/agent-session-environment.ts +10 -8
  470. package/scripts/josh/cli-body.ts +2 -2
  471. package/scripts/josh/command-suggest.ts +1 -1
  472. package/scripts/josh/file-map-stamp.ts +20 -23
  473. package/scripts/josh/hook-decision.ts +24 -28
  474. package/scripts/josh/josh-command-map.ts +4 -1
  475. package/scripts/josh/josh-command-types.ts +30 -35
  476. package/scripts/josh/josh-commands-ai.ts +6 -6
  477. package/scripts/josh/josh-commands-backlog.ts +15 -3
  478. package/scripts/josh/josh-commands-clone.ts +1 -1
  479. package/scripts/josh/josh-commands-development.ts +25 -4
  480. package/scripts/josh/josh-commands-document.ts +3 -3
  481. package/scripts/josh/josh-commands-guard.ts +3 -3
  482. package/scripts/josh/josh-commands-issue.ts +4 -5
  483. package/scripts/josh/josh-commands-lane.ts +14 -4
  484. package/scripts/josh/josh-commands-lint.ts +1 -1
  485. package/scripts/josh/josh-commands-run.ts +20 -6
  486. package/scripts/josh/josh-commands-split.ts +1 -2
  487. package/scripts/josh/josh-commands-versioning.ts +5 -5
  488. package/scripts/josh/josh-commands-workflow.ts +30 -22
  489. package/scripts/josh/josh-environment-file.ts +1 -1
  490. package/scripts/josh/josh-in-process.ts +3 -3
  491. package/scripts/josh/josh-logic.ts +6 -7
  492. package/scripts/josh/josh-run.ts +3 -3
  493. package/scripts/josh/josh-verdict.ts +9 -12
  494. package/scripts/josh/josh.ts +3 -3
  495. package/scripts/josh/kit-only.ts +2 -2
  496. package/scripts/josh/path-decision.ts +3 -3
  497. package/scripts/josh/platform-temporary.ts +7 -5
  498. package/scripts/josh/process-identity.ts +24 -6
  499. package/scripts/josh/process-owner.ts +4 -4
  500. package/scripts/josh/session-language-cli.ts +53 -11
  501. package/scripts/josh/session-language.ts +1 -1
  502. package/scripts/josh/stamp-file.ts +48 -29
  503. package/scripts/josh/stamp-record.ts +57 -0
  504. package/scripts/lane/lane-await.ts +35 -11
  505. package/scripts/lane/lane-cache.ts +6 -6
  506. package/scripts/lane/lane-capacity.ts +32 -17
  507. package/scripts/lane/lane-child-invocation.ts +17 -15
  508. package/scripts/lane/lane-child-marker.ts +12 -12
  509. package/scripts/lane/lane-cli.ts +12 -13
  510. package/scripts/lane/lane-close.ts +6 -6
  511. package/scripts/lane/lane-dispatch.ts +61 -72
  512. package/scripts/lane/lane-environment.ts +5 -5
  513. package/scripts/lane/lane-guard-policy.ts +7 -21
  514. package/scripts/lane/lane-handoff.ts +2 -2
  515. package/scripts/lane/lane-install.ts +9 -10
  516. package/scripts/lane/lane-launch-cli.ts +13 -8
  517. package/scripts/lane/lane-ledger.ts +73 -11
  518. package/scripts/lane/lane-leftover.ts +2 -2
  519. package/scripts/lane/lane-limit-cli.ts +160 -0
  520. package/scripts/lane/lane-limit-override.ts +74 -0
  521. package/scripts/lane/lane-load.ts +19 -68
  522. package/scripts/lane/lane-measure-cli.ts +15 -25
  523. package/scripts/lane/lane-occupancy.ts +6 -4
  524. package/scripts/lane/lane-open.ts +20 -19
  525. package/scripts/lane/lane-output.ts +4 -3
  526. package/scripts/lane/lane-paths.ts +12 -11
  527. package/scripts/lane/lane-phase.ts +33 -0
  528. package/scripts/lane/lane-reap.ts +2 -2
  529. package/scripts/lane/lane-registry.ts +16 -15
  530. package/scripts/lane/lane-relaunch.ts +9 -9
  531. package/scripts/lane/lane-report.ts +5 -4
  532. package/scripts/lane/lane-resume.ts +2 -2
  533. package/scripts/lane/lane-sampler.ts +55 -0
  534. package/scripts/lane/lane-seed.ts +7 -7
  535. package/scripts/lane/lane-stage-stats.ts +135 -0
  536. package/scripts/lane/lane-start-point.ts +8 -11
  537. package/scripts/lane/lane-stats.ts +60 -15
  538. package/scripts/lane/lane-stray.ts +1 -1
  539. package/scripts/lane/lane-vacant.ts +1 -1
  540. package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
  541. package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
  542. package/scripts/lane/openai-review-broker.ts +2 -4
  543. package/scripts/lib/ancestor-directories.ts +1 -1
  544. package/scripts/lib/bounded-pool.ts +2 -2
  545. package/scripts/lib/buffered-process.ts +4 -6
  546. package/scripts/lib/caddy-logs.sh +0 -0
  547. package/scripts/lib/cli-flags.ts +39 -6
  548. package/scripts/lib/error-message.ts +1 -1
  549. package/scripts/lib/json-value.ts +17 -3
  550. package/scripts/lib/poll.ts +1 -1
  551. package/scripts/lib/status-icons.ts +3 -3
  552. package/scripts/lib/timed-fetch.ts +1 -1
  553. package/scripts/lib/timeouts.ts +1 -1
  554. package/scripts/lines/bytes-command.ts +3 -4
  555. package/scripts/lines/effective-limit.ts +25 -12
  556. package/scripts/lines/line-budget.ts +47 -55
  557. package/scripts/lines/line-targets.ts +6 -2
  558. package/scripts/lines/lines-command.ts +3 -3
  559. package/scripts/lint/cspell-cached.ts +1 -1
  560. package/scripts/lint/cycle-recheck.ts +122 -0
  561. package/scripts/lint/format.ts +1 -2
  562. package/scripts/lint/lint-parallel.ts +34 -19
  563. package/scripts/lint/lint-related-scope.ts +25 -15
  564. package/scripts/lint/lint-related.ts +6 -7
  565. package/scripts/managed-marker/index.ts +1 -1
  566. package/scripts/managed-marker/managed-marker-logic.ts +1 -2
  567. package/scripts/notify/git-notify.ts +9 -7
  568. package/scripts/notify/telegram-notify.ts +53 -37
  569. package/scripts/notify/telegram-test-logic.ts +3 -3
  570. package/scripts/notify/telegram-test.ts +45 -30
  571. package/scripts/observations/observation-ledger-home.ts +14 -8
  572. package/scripts/observations/observation-ledger-line.ts +3 -2
  573. package/scripts/observations/observation-ledger-migrate.ts +3 -4
  574. package/scripts/observations/observation-ledger-prepare.ts +4 -4
  575. package/scripts/observations/observation-ledger.ts +14 -15
  576. package/scripts/observations/observation-record-cli.ts +83 -0
  577. package/scripts/observations/observation-record.ts +91 -0
  578. package/scripts/observations/observations-flush-cli.ts +1 -1
  579. package/scripts/observations/observations-flush-landing.ts +7 -6
  580. package/scripts/observations/observations-flush.ts +26 -27
  581. package/scripts/overrides/overrides-check.ts +18 -8
  582. package/scripts/package/package-scout-cli.ts +1 -1
  583. package/scripts/package/package-scout-format.ts +2 -2
  584. package/scripts/package/package-scout.ts +1 -1
  585. package/scripts/propagate/propagate-git-failure.ts +1 -1
  586. package/scripts/propagate/propagate-git.ts +7 -7
  587. package/scripts/propagate/propagate-plan.ts +2 -2
  588. package/scripts/propagate/propagate-publish.ts +2 -3
  589. package/scripts/propagate/propagate-run.ts +5 -7
  590. package/scripts/propagate/propagate-select.ts +1 -1
  591. package/scripts/propagate/propagate-steps.ts +19 -20
  592. package/scripts/propagate/propagate-targets.ts +6 -10
  593. package/scripts/propagate/propagate.ts +5 -5
  594. package/scripts/refactor/import-graph.ts +1 -1
  595. package/scripts/refactor/refactor-lint.ts +4 -10
  596. package/scripts/refactor/refactor-scan-cli.ts +1 -1
  597. package/scripts/refactor/refactor-scan.ts +2 -2
  598. package/scripts/refactor/refactor-targets.ts +1 -1
  599. package/scripts/release/github-release-cli.ts +25 -3
  600. package/scripts/release/github-release-runs.ts +1 -1
  601. package/scripts/release/release-cli.ts +21 -4
  602. package/scripts/release/release-history.ts +6 -10
  603. package/scripts/release/release-plan.ts +3 -3
  604. package/scripts/release/release-progress.ts +3 -4
  605. package/scripts/release/release-publish.ts +8 -9
  606. package/scripts/release/release-scope-cli.ts +8 -10
  607. package/scripts/release/release-tag.ts +6 -8
  608. package/scripts/release/release-worktree.ts +5 -5
  609. package/scripts/repo/auto-merge-setting-logic.ts +7 -9
  610. package/scripts/repo/auto-merge-setting.ts +1 -1
  611. package/scripts/repo/repo-setting.ts +4 -4
  612. package/scripts/repo/repository-labels.ts +1 -1
  613. package/scripts/repo/required-checks-logic.ts +3 -3
  614. package/scripts/repo/required-checks-report.ts +1 -1
  615. package/scripts/repo/ruleset-check-cli.ts +1 -1
  616. package/scripts/repo/ruleset-check.ts +1 -1
  617. package/scripts/report/report-format-reference.ts +26 -0
  618. package/scripts/report/report-lint-cli.ts +2 -2
  619. package/scripts/report/report-lint.ts +16 -2
  620. package/scripts/review/disposition-cli.ts +2 -2
  621. package/scripts/review/disposition-logic.ts +1 -1
  622. package/scripts/review/live-evidence.ts +9 -6
  623. package/scripts/review/review-attest-cli.ts +1 -2
  624. package/scripts/review/review-attest.ts +3 -3
  625. package/scripts/review/review-brief-cli.ts +19 -20
  626. package/scripts/review/review-brief.ts +29 -32
  627. package/scripts/review/review-checkout.ts +2 -2
  628. package/scripts/review/review-diff-parts.ts +3 -5
  629. package/scripts/review/review-diff-write.ts +1 -1
  630. package/scripts/review/review-finding-ledger.ts +7 -4
  631. package/scripts/review/review-findings-cli.ts +2 -2
  632. package/scripts/review/review-level.ts +4 -7
  633. package/scripts/review/review-record-cli.ts +73 -16
  634. package/scripts/review/review-record.ts +5 -4
  635. package/scripts/review/review-round2-cli.ts +2 -3
  636. package/scripts/review/review-round2.ts +13 -21
  637. package/scripts/review/review-stamps.ts +9 -71
  638. package/scripts/review/review-tree.ts +4 -5
  639. package/scripts/rules/bash-triggers.ts +4 -4
  640. package/scripts/rules/decision-oracle-batch.ts +5 -6
  641. package/scripts/rules/decision-oracle-stage.ts +1 -1
  642. package/scripts/rules/decision-oracle-tokens.ts +1 -2
  643. package/scripts/rules/decision-oracle.ts +2 -2
  644. package/scripts/rules/delivered-rules.ts +61 -406
  645. package/scripts/rules/destructive-command.ts +2 -2
  646. package/scripts/rules/direct-filing.ts +4 -4
  647. package/scripts/rules/direct-pr-create.ts +2 -2
  648. package/scripts/rules/early-heartbeat.ts +15 -19
  649. package/scripts/rules/file-body.ts +5 -6
  650. package/scripts/rules/filing-cap.ts +6 -7
  651. package/scripts/rules/filing-offer.ts +1 -1
  652. package/scripts/rules/firing-point.ts +6 -6
  653. package/scripts/rules/gh-api.ts +2 -2
  654. package/scripts/rules/git-argv.ts +3 -3
  655. package/scripts/rules/git-force.ts +2 -2
  656. package/scripts/rules/hook-context-line.ts +31 -0
  657. package/scripts/rules/implementation-cut-verdict.ts +5 -8
  658. package/scripts/rules/implementation-cut.ts +35 -32
  659. package/scripts/rules/index-guard.ts +2 -2
  660. package/scripts/rules/issue-citation.ts +7 -7
  661. package/scripts/rules/issue-comments.ts +21 -13
  662. package/scripts/rules/josh-git-bare.ts +2 -2
  663. package/scripts/rules/lane-background.ts +14 -16
  664. package/scripts/rules/lane-carry-conflict.ts +41 -5
  665. package/scripts/rules/lane-interactive-ask.ts +6 -9
  666. package/scripts/rules/lane-park.ts +12 -16
  667. package/scripts/rules/lane-split-park.ts +1 -2
  668. package/scripts/rules/lane-switch-main.ts +10 -13
  669. package/scripts/rules/last-prompt.ts +1 -1
  670. package/scripts/rules/oracle-consulted.ts +5 -5
  671. package/scripts/rules/oracle-firing.ts +6 -9
  672. package/scripts/rules/oracle-list-cli.ts +2 -2
  673. package/scripts/rules/permission-guards.ts +2 -2
  674. package/scripts/rules/piped-verification.ts +79 -9
  675. package/scripts/rules/poll-loop.ts +9 -11
  676. package/scripts/rules/pre-gate-cut.ts +33 -30
  677. package/scripts/rules/prior-comment-read.ts +3 -3
  678. package/scripts/rules/protected-files.ts +25 -13
  679. package/scripts/rules/raw-field-body.ts +3 -4
  680. package/scripts/rules/reply-language.ts +1 -1
  681. package/scripts/rules/rule-body-guard.ts +10 -12
  682. package/scripts/rules/rule-guard.ts +1 -1
  683. package/scripts/rules/rule-list.ts +51 -0
  684. package/scripts/rules/rule-registry-rows.ts +282 -0
  685. package/scripts/rules/rule-registry.ts +109 -0
  686. package/scripts/rules/rule-value-cache.ts +2 -2
  687. package/scripts/rules/rule-value-cli.ts +6 -4
  688. package/scripts/rules/rule-value.ts +61 -22
  689. package/scripts/rules/run-tail-rule.ts +11 -15
  690. package/scripts/rules/shell-body-trigger.ts +7 -7
  691. package/scripts/rules/shell-segments.ts +2 -4
  692. package/scripts/rules/stop-rules.ts +54 -41
  693. package/scripts/rules/tail-commands.ts +1 -1
  694. package/scripts/rules/test-declared-commit.ts +2 -2
  695. package/scripts/rules/third-party-write.ts +3 -3
  696. package/scripts/rules/worktree-guard.ts +12 -5
  697. package/scripts/run/add/run-add-cli.ts +165 -0
  698. package/scripts/run/add/run-add.ts +124 -0
  699. package/scripts/run/board/run-board-cli.ts +207 -0
  700. package/scripts/run/board/run-board-closed.ts +95 -0
  701. package/scripts/run/board/run-board-every.ts +60 -0
  702. package/scripts/run/board/run-board-fetch.ts +38 -0
  703. package/scripts/run/board/run-board-fit.ts +219 -0
  704. package/scripts/run/board/run-board-github.ts +162 -0
  705. package/scripts/run/board/run-board-header.ts +275 -0
  706. package/scripts/run/board/run-board-kind.ts +35 -0
  707. package/scripts/run/board/run-board-labels.ts +299 -0
  708. package/scripts/run/board/run-board-layout.ts +222 -0
  709. package/scripts/run/board/run-board-link.ts +31 -0
  710. package/scripts/run/board/run-board-machine.ts +198 -0
  711. package/scripts/run/board/run-board-notes.ts +103 -0
  712. package/scripts/run/board/run-board-phase.ts +136 -0
  713. package/scripts/run/board/run-board-plan.ts +129 -0
  714. package/scripts/run/board/run-board-read.ts +62 -0
  715. package/scripts/run/board/run-board-render-legend.ts +82 -0
  716. package/scripts/run/board/run-board-render-notes.ts +77 -0
  717. package/scripts/run/board/run-board-render-slot.ts +50 -0
  718. package/scripts/run/board/run-board-render.ts +407 -0
  719. package/scripts/run/board/run-board-scope.ts +17 -0
  720. package/scripts/run/board/run-board-screen.ts +43 -0
  721. package/scripts/run/board/run-board-span.ts +66 -0
  722. package/scripts/run/board/run-board-spin.ts +115 -0
  723. package/scripts/run/board/run-board-state.ts +113 -0
  724. package/scripts/run/board/run-board-status.ts +279 -0
  725. package/scripts/run/board/run-board-tick.ts +210 -0
  726. package/scripts/run/board/run-board-track.ts +22 -0
  727. package/scripts/run/board/run-board-usage-read.ts +255 -0
  728. package/scripts/run/board/run-board-usage-rusage.ts +124 -0
  729. package/scripts/run/board/run-board-usage-text.ts +80 -0
  730. package/scripts/run/board/run-board-usage.ts +165 -0
  731. package/scripts/run/carry/run-carry-added.ts +62 -0
  732. package/scripts/run/carry/run-carry-args.ts +25 -22
  733. package/scripts/run/carry/run-carry-change.ts +1 -1
  734. package/scripts/run/carry/run-carry-cli.ts +71 -48
  735. package/scripts/run/carry/run-carry-conversation.ts +6 -7
  736. package/scripts/run/carry/run-carry-ended.ts +85 -0
  737. package/scripts/run/carry/run-carry-reclaim.ts +1 -1
  738. package/scripts/run/carry/run-carry-stash.ts +3 -2
  739. package/scripts/run/carry/run-carry-streak.ts +8 -10
  740. package/scripts/run/carry/run-carry.ts +85 -89
  741. package/scripts/run/cut/run-cut-args.ts +7 -7
  742. package/scripts/run/cut/run-cut-cli.ts +54 -36
  743. package/scripts/run/cut/run-cut-handoff.ts +15 -15
  744. package/scripts/run/cut/run-cut-report.ts +37 -16
  745. package/scripts/run/cut/run-cut.ts +63 -77
  746. package/scripts/run/detached-launch.ts +35 -50
  747. package/scripts/run/entry/run-entry-cli.ts +48 -27
  748. package/scripts/run/entry/run-entry-stop.ts +7 -9
  749. package/scripts/run/entry/run-entry.ts +5 -6
  750. package/scripts/run/event/run-event-cli.ts +5 -6
  751. package/scripts/run/event/run-event-filed.ts +69 -0
  752. package/scripts/run/event/run-event-follow.ts +3 -3
  753. package/scripts/run/event/run-event-plan.ts +38 -0
  754. package/scripts/run/event/run-event-render.ts +9 -4
  755. package/scripts/run/event/run-event-scope.ts +47 -18
  756. package/scripts/run/event/run-event-stream-emit.ts +64 -11
  757. package/scripts/run/event/run-event-stream.ts +171 -46
  758. package/scripts/run/event/run-event-watch.ts +4 -6
  759. package/scripts/run/hold/run-hold-cli.ts +65 -62
  760. package/scripts/run/hold/run-hold.ts +88 -46
  761. package/scripts/run/merge/run-merge-cli.ts +116 -77
  762. package/scripts/run/merge/run-merge-collect.ts +107 -0
  763. package/scripts/run/merge/run-merge-steps.ts +112 -65
  764. package/scripts/run/merge/run-merge-token.ts +30 -0
  765. package/scripts/run/merge/run-merge.ts +31 -22
  766. package/scripts/run/progress/run-progress-args.ts +4 -4
  767. package/scripts/run/progress/run-progress-cli.ts +39 -50
  768. package/scripts/run/progress/run-progress-clock.ts +25 -32
  769. package/scripts/run/progress/run-progress-config.ts +6 -9
  770. package/scripts/run/progress/run-progress-read.ts +9 -10
  771. package/scripts/run/progress/run-progress.ts +48 -53
  772. package/scripts/run/review/run-review-cli.ts +6 -6
  773. package/scripts/run/review/run-review-steps.ts +6 -6
  774. package/scripts/run/review/run-review.ts +9 -11
  775. package/scripts/run/run-cli-fault.ts +29 -0
  776. package/scripts/run/run-ending-cli.ts +3 -3
  777. package/scripts/run/run-ending.ts +10 -14
  778. package/scripts/run/run-halfrun-resume.ts +6 -8
  779. package/scripts/run/run-headless.ts +25 -12
  780. package/scripts/run/run-invocation.ts +17 -22
  781. package/scripts/run/run-label.ts +7 -5
  782. package/scripts/run/run-liveness-cli.ts +19 -6
  783. package/scripts/run/run-liveness.ts +27 -38
  784. package/scripts/run/run-next-cli.ts +5 -9
  785. package/scripts/run/run-next.ts +4 -5
  786. package/scripts/run/run-parent-cut-hook.ts +10 -12
  787. package/scripts/run/run-preflight.ts +25 -29
  788. package/scripts/run/run-prep-cli.ts +17 -13
  789. package/scripts/run/run-prep-locate.ts +4 -5
  790. package/scripts/run/run-prep.ts +7 -10
  791. package/scripts/run/run-prrun-resume.ts +2 -2
  792. package/scripts/run/run-report-cli.ts +4 -4
  793. package/scripts/run/run-report.ts +9 -14
  794. package/scripts/run/run-retrospective.ts +3 -3
  795. package/scripts/run/run-section.ts +42 -0
  796. package/scripts/run/run-stage-read.ts +2 -2
  797. package/scripts/run/run-stage.ts +6 -4
  798. package/scripts/run/run-status-cli.ts +7 -5
  799. package/scripts/run/run-status.ts +6 -7
  800. package/scripts/run/run-step-cli.ts +13 -15
  801. package/scripts/run/run-step.ts +58 -47
  802. package/scripts/run/run-stop-notify.ts +7 -8
  803. package/scripts/run/run-stranded-cli.ts +1 -1
  804. package/scripts/run/run-stranded-detect.ts +4 -4
  805. package/scripts/run/run-stranded.ts +11 -13
  806. package/scripts/run/run-tail-cli.ts +15 -16
  807. package/scripts/run/run-tail.ts +14 -33
  808. package/scripts/run/run-watcher-guard-cli.ts +3 -4
  809. package/scripts/run/run-watcher-guard.ts +11 -12
  810. package/scripts/run/run-watcher-hook.ts +6 -12
  811. package/scripts/run/ship/run-ship-cli.ts +67 -33
  812. package/scripts/run/ship/run-ship-detach.ts +15 -13
  813. package/scripts/run/ship/run-ship-lock.ts +1 -1
  814. package/scripts/run/ship/run-ship-next.ts +7 -8
  815. package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
  816. package/scripts/run/ship/run-ship-preflight.ts +10 -11
  817. package/scripts/run/ship/run-ship-probe.ts +4 -4
  818. package/scripts/run/ship/run-ship-return.ts +1 -1
  819. package/scripts/run/ship/run-ship-review-steps.ts +43 -24
  820. package/scripts/run/ship/run-ship-review.ts +12 -14
  821. package/scripts/run/ship/run-ship-scoped.ts +15 -6
  822. package/scripts/run/ship/run-ship-stage.ts +80 -26
  823. package/scripts/run/ship/run-ship-steps.ts +26 -16
  824. package/scripts/run/ship/run-ship-stop-text.ts +4 -2
  825. package/scripts/run/ship/run-ship-sync.ts +9 -8
  826. package/scripts/run/ship/run-ship.ts +17 -32
  827. package/scripts/run/tidy/run-tidy-cli.ts +9 -5
  828. package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
  829. package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
  830. package/scripts/run/tidy/run-tidy.ts +4 -3
  831. package/scripts/run/wake/run-wake-cli.ts +27 -32
  832. package/scripts/run/wake/run-wake-describe.ts +24 -28
  833. package/scripts/run/wake/run-wake-driver.ts +14 -14
  834. package/scripts/run/wake/run-wake-handoff.ts +6 -6
  835. package/scripts/run/wake/run-wake-loop.ts +9 -9
  836. package/scripts/run/wake/run-wake-restart.ts +4 -5
  837. package/scripts/run/wake/run-wake-session.ts +23 -27
  838. package/scripts/run/wake/run-wake.ts +57 -279
  839. package/scripts/safe-chain/ci-installer-pin.ts +3 -3
  840. package/scripts/safe-chain/pack-hook.ts +2 -2
  841. package/scripts/safe-chain/preinstall-command.ts +2 -2
  842. package/scripts/security/security-audit-logic.ts +1 -1
  843. package/scripts/security/security-audit-provision-logic.ts +1 -1
  844. package/scripts/security/security-audit-provision.ts +2 -2
  845. package/scripts/security/security-audit.ts +5 -5
  846. package/scripts/security/security-updates-logic.ts +2 -3
  847. package/scripts/security/security-updates.ts +2 -4
  848. package/scripts/self-sync-guard/index.ts +1 -1
  849. package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
  850. package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
  851. package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
  852. package/scripts/sonar/sonar-hotspots.ts +1 -1
  853. package/scripts/sonar/sonar-new-code-cli.ts +1 -1
  854. package/scripts/sonar/sonar-new-code.ts +1 -1
  855. package/scripts/sonar/sonar-project.ts +1 -1
  856. package/scripts/split/split-assess-cli.ts +1 -1
  857. package/scripts/split/split-assess.ts +3 -3
  858. package/scripts/sync/directory-copy-guard.ts +2 -3
  859. package/scripts/sync/managed-config-scope-cli.ts +1 -2
  860. package/scripts/sync/managed-config-scope.ts +4 -4
  861. package/scripts/sync/plugin-skill-directories.ts +2 -2
  862. package/scripts/sync/reconcile-templates.ts +17 -8
  863. package/scripts/sync/removed-skill-manifest.ts +2 -3
  864. package/scripts/sync/sync-ai-files.ts +7 -7
  865. package/scripts/sync/sync-configs.ts +30 -3
  866. package/scripts/sync/sync-hook-safety.ts +2 -2
  867. package/scripts/sync/sync.ts +23 -10
  868. package/scripts/sync/synced-paths.ts +2 -1
  869. package/scripts/sync/workflow-pin-logic.ts +1 -1
  870. package/scripts/test/test-declared-changed.ts +4 -4
  871. package/scripts/test/test-declared-logic.ts +2 -3
  872. package/scripts/test/test-declared-match.ts +25 -4
  873. package/scripts/test/test-declared.ts +26 -9
  874. package/scripts/test/test-red-commit.ts +3 -2
  875. package/scripts/test/test-red-logic.ts +7 -14
  876. package/scripts/test/test-red.ts +12 -47
  877. package/scripts/test/test-related-scope.ts +2 -3
  878. package/scripts/test/test-related.ts +3 -3
  879. package/scripts/test/test-type-logic.ts +1 -2
  880. package/scripts/test/test-unit-guard.ts +13 -17
  881. package/scripts/test/unit-worker-share.ts +7 -8
  882. package/scripts/time-runtime/time-agent-bundles.ts +2 -4
  883. package/scripts/time-runtime/time-background.ts +17 -21
  884. package/scripts/time-runtime/time-batch-guard.ts +67 -342
  885. package/scripts/time-runtime/time-bundle-call.ts +26 -28
  886. package/scripts/time-runtime/time-bundles.ts +11 -12
  887. package/scripts/time-runtime/time-call-identity.ts +1 -1
  888. package/scripts/time-runtime/time-command-key.ts +2 -2
  889. package/scripts/time-runtime/time-density-hook.ts +8 -11
  890. package/scripts/time-runtime/time-density.ts +5 -5
  891. package/scripts/time-runtime/time-followup-stage.ts +7 -7
  892. package/scripts/time-runtime/time-format.ts +5 -5
  893. package/scripts/time-runtime/time-hook-transcript.ts +3 -3
  894. package/scripts/time-runtime/time-instant.ts +1 -1
  895. package/scripts/time-runtime/time-markers.ts +15 -19
  896. package/scripts/time-runtime/time-phase-names.ts +3 -3
  897. package/scripts/time-runtime/time-reported-failure.ts +15 -19
  898. package/scripts/time-runtime/time-round-trips.ts +20 -23
  899. package/scripts/time-runtime/time-shell.ts +8 -8
  900. package/scripts/time-runtime/time-single-check.ts +1 -2
  901. package/scripts/time-runtime/time-spans.ts +35 -40
  902. package/scripts/time-runtime/time-tool-call.ts +15 -16
  903. package/scripts/time-runtime/time-transcript-line.ts +53 -34
  904. package/scripts/time-runtime/time-writes.ts +5 -5
  905. package/scripts/ui/ui-routes-cli.ts +1 -2
  906. package/scripts/ui/ui-routes.ts +1 -2
  907. package/scripts/version/bump-version.ts +1 -1
  908. package/scripts/version/fresh-metadata-cache.ts +2 -2
  909. package/scripts/version/latest-corepack.ts +26 -26
  910. package/scripts/version/latest-lane-guard.ts +1 -1
  911. package/scripts/version/latest-scope-cli.ts +2 -2
  912. package/scripts/version/latest-stamp.ts +1 -2
  913. package/scripts/version/latest-update.ts +2 -2
  914. package/scripts/version/npm-registry.ts +2 -2
  915. package/scripts/version/package-manager-version.ts +18 -0
  916. package/scripts/version/publishable-range-check.ts +2 -1
  917. package/scripts/version/publishable-range.ts +1 -1
  918. package/scripts/version/release-age.ts +11 -11
  919. package/scripts/version/release-hold.ts +2 -2
  920. package/scripts/version/safe-chain-version-update.ts +3 -3
  921. package/scripts/version/version-check-logic.ts +2 -3
  922. package/scripts/version/version-check.ts +1 -2
  923. package/scripts/version/version-command-config.ts +2 -2
  924. package/scripts/version/version-commands.ts +3 -3
  925. package/scripts/version/version-remote.ts +4 -4
  926. package/scripts/version/version-targets.ts +2 -2
  927. package/templates/gitignore +7 -0
  928. package/dist/hooks/chunk-KHX4U3BG.js +0 -6400
  929. package/dist/hooks/chunk-RKUAD3I6.js +0 -90
  930. package/dist/hooks/chunk-WPALEIRX.js +0 -18
  931. package/scripts/backlog/backlog-restructure.ts +0 -152
  932. package/scripts/rules/issue-fold-rule.ts +0 -72
  933. package/scripts/rules/wip-cap.ts +0 -63
  934. package/scripts/run/run-issue-number.ts +0 -19
@@ -0,0 +1,55 @@
1
+ import { lane_ledger } from './lane-ledger'
2
+ import { lane_load } from './lane-load'
3
+
4
+ // The machine-load sampler: one `load` entry appended to the lane ledger, once or on a timer.
5
+ //
6
+ // **`start` is how a `backlogrun` samples itself.** `backlog:drive` starts it for as long as its loop
7
+ // runs, so a period needs nobody to remember a second terminal — the sampler `josh lane:sample` offers
8
+ // was started by hand, and a run nobody started it beside recorded no load at all. The timer lives in
9
+ // the drive's own process and is unreferenced: it ends with the drive, never holds it open, and leaves
10
+ // no process or pid file behind to stop.
11
+
12
+ const SAMPLE_INTERVAL_MS = 60_000
13
+
14
+ // Where the ledger is and what "now" is, overridable so a test reads a fixed ledger at a fixed instant.
15
+ interface MeasureContext {
16
+ ledger_path?: string
17
+ now_ms?: number
18
+ }
19
+
20
+ async function take(context: MeasureContext = {}): Promise<void> {
21
+ const at = new Date(context.now_ms ?? Date.now()).toISOString()
22
+
23
+ await lane_ledger.record(await lane_load.sample(at), context.ledger_path)
24
+ }
25
+
26
+ // A timer tick has no caller to raise into, and a sample that could not be read must never end the run
27
+ // it measures.
28
+ async function take_quietly(context: MeasureContext): Promise<void> {
29
+ try {
30
+ await take(context)
31
+ } catch {
32
+ // Best-effort: an unread sample is a gap in the measurement, not a failure of the run.
33
+ }
34
+ }
35
+
36
+ /** Sample now and then every minute; the returned function stops it. */
37
+ function start(context: MeasureContext = {}): () => void {
38
+ void take_quietly(context)
39
+ const timer = setInterval(() => {
40
+ void take_quietly(context)
41
+ }, SAMPLE_INTERVAL_MS).unref()
42
+
43
+ return () => {
44
+ clearInterval(timer)
45
+ }
46
+ }
47
+
48
+ const lane_sampler = {
49
+ SAMPLE_INTERVAL_MS,
50
+ start,
51
+ take,
52
+ }
53
+
54
+ export type { MeasureContext }
55
+ export { lane_sampler }
@@ -1,13 +1,13 @@
1
- // Which seat a lane gets (joshuafolkken/kit#1490, joshuafolkken/kit#1494).
1
+ // Which seat a lane gets.
2
2
 
3
3
  // **The main work tree is seat 0, and nothing here can move it.** Lanes take seats 1..9, so a
4
4
  // project that has never opened one stays on exactly the ports `ports/index.js` already gives it —
5
5
  // `seed × 10` for its seed, the bases themselves for an unset seed, which is what CI runs on.
6
6
  const FIRST_LANE_SEAT = 1
7
- // **Nine seats, because the seat is the units digit of the offset `seed × 10 + lane`.** The seat no
8
- // longer carries the whole port band — the seed does, multiplied by ten — so a lane holds a single
9
- // seat number rather than an absolute seed, and there is no ceiling to check and no "multiple of
10
- // ten" convention for anyone to break (joshuafolkken/kit#1494 removed the band mechanism).
7
+ // **Nine seats, because the seat is the units digit of the offset `seed × 10 + lane`.** The seed,
8
+ // multiplied by ten, carries the port band rather than the seat, so a lane holds a single seat number
9
+ // rather than an absolute seed, and there is no ceiling to check and no "multiple of ten" convention
10
+ // for anyone to break.
11
11
  const LAST_LANE_SEAT = 9
12
12
 
13
13
  /**
@@ -20,8 +20,8 @@ const LAST_LANE_SEAT = 9
20
20
  * wrapped, because wrapping is that same collision under a friendlier name.
21
21
  *
22
22
  * The whole ascending list is returned rather than only the lowest, because the caller claims each
23
- * seat atomically and steps to the next when a concurrent `lane:open` claimed it first
24
- * (joshuafolkken/kit#1494): reading a free set and picking from it are two moments, and the gap
23
+ * seat atomically and steps to the next when a concurrent `lane:open` claimed it first:
24
+ * reading a free set and picking from it are two moments, and the gap
25
25
  * between them is where two opens once chose the same seat.
26
26
  */
27
27
  function free_seats(used: ReadonlyArray<number>): Array<number> {
@@ -0,0 +1,135 @@
1
+ import { run_ship_stage } from '#scripts/run/ship/run-ship-stage'
2
+ import { lane_ledger, type DispatchEntry, type LedgerEntry, type StageEntry } from './lane-ledger'
3
+ import { lane_stats, type StatsWindow } from './lane-stats'
4
+
5
+ // Where a lane's time goes: the ledger's `stage` and `dispatch` entries of one period reduced to one
6
+ // row per stage — median, maximum and how many runs — printed by `josh lane:stats` under the lane-limit
7
+ // row. The rows are in the order a lane passes them.
8
+ //
9
+ // **A stage nothing recorded prints `not measured`, never `0`.** A period that ran no second review
10
+ // round has no `round-2` duration, which is not a round that took no time.
11
+ //
12
+ // **`implement` is derived, not recorded**: from a lane's dispatch to the start of the first ship stage
13
+ // of the same issue that followed it. Nothing has to know, at the hand-off, when the child was
14
+ // dispatched, and a ship resumed after a fix cannot record the implementation twice.
15
+ //
16
+ // **`ci-wait` is `followup`'s own lap, inside the `followup` stage** — a row of its own so the wait for
17
+ // CI reads beside `review`, the round-one review it would overlap.
18
+
19
+ const MS_PER_MINUTE = 60_000
20
+ const DECIMALS = 1
21
+ const NOT_MEASURED = 'not measured'
22
+ const IMPLEMENT = 'implement'
23
+ const COLUMNS = ['stage', 'median (min)', 'max (min)', 'runs'] as const
24
+ const { STAGE } = run_ship_stage
25
+ const STAGES = [
26
+ IMPLEMENT,
27
+ STAGE.PREFLIGHT,
28
+ STAGE.REVIEW,
29
+ STAGE.SYNC,
30
+ STAGE.GATE,
31
+ STAGE.COMMIT,
32
+ STAGE.ROUND_TWO,
33
+ STAGE.FOLLOWUP,
34
+ lane_ledger.CI_WAIT_STAGE,
35
+ STAGE.REPORT,
36
+ ] as const
37
+
38
+ interface Measured {
39
+ implement: ReadonlyArray<number>
40
+ stages: ReadonlyArray<StageEntry>
41
+ }
42
+
43
+ function is_stage(entry: LedgerEntry): entry is StageEntry {
44
+ return entry.kind === lane_ledger.KIND.STAGE
45
+ }
46
+
47
+ function is_dispatch(entry: LedgerEntry): entry is DispatchEntry {
48
+ return entry.kind === lane_ledger.KIND.DISPATCH
49
+ }
50
+
51
+ function is_number(value: number | undefined): value is number {
52
+ return value !== undefined
53
+ }
54
+
55
+ function started_ms(stage: StageEntry): number {
56
+ return Date.parse(stage.at) - stage.elapsed_ms
57
+ }
58
+
59
+ // When the same issue was dispatched again, or never: a child that died before its ship must not have
60
+ // its implementation stretched to the ship of the child that replaced it.
61
+ function next_dispatch_ms(sorted: ReadonlyArray<DispatchEntry>, index: number): number {
62
+ const next = sorted.slice(index + 1).find((entry) => entry.issue === sorted[index]?.issue)
63
+
64
+ return next === undefined ? Infinity : Date.parse(next.at)
65
+ }
66
+
67
+ function implement_ms(
68
+ dispatch: DispatchEntry,
69
+ until_ms: number,
70
+ stages: ReadonlyArray<StageEntry>,
71
+ ): number | undefined {
72
+ const from_ms = Date.parse(dispatch.at)
73
+ const starts = stages
74
+ .filter((stage) => stage.issue === dispatch.issue)
75
+ .map((stage) => started_ms(stage))
76
+ .filter((start) => start >= from_ms && start < until_ms)
77
+
78
+ return starts.length === 0 ? undefined : Math.min(...starts) - from_ms
79
+ }
80
+
81
+ function implement_durations(
82
+ dispatches: ReadonlyArray<DispatchEntry>,
83
+ stages: ReadonlyArray<StageEntry>,
84
+ ): Array<number> {
85
+ const sorted = dispatches.toSorted((left, right) => Date.parse(left.at) - Date.parse(right.at))
86
+
87
+ return sorted
88
+ .map((dispatch, index) => implement_ms(dispatch, next_dispatch_ms(sorted, index), stages))
89
+ .filter(is_number)
90
+ }
91
+
92
+ function durations_of(stage: string, measured: Measured): ReadonlyArray<number> {
93
+ if (stage === IMPLEMENT) return measured.implement
94
+
95
+ return measured.stages.filter((entry) => entry.stage === stage).map((entry) => entry.elapsed_ms)
96
+ }
97
+
98
+ function cell(milliseconds: number | undefined): string {
99
+ return milliseconds === undefined
100
+ ? NOT_MEASURED
101
+ : (milliseconds / MS_PER_MINUTE).toFixed(DECIMALS)
102
+ }
103
+
104
+ function stage_row(stage: string, measured: Measured): string {
105
+ const durations = durations_of(stage, measured)
106
+
107
+ return lane_stats.to_row([
108
+ stage,
109
+ cell(lane_stats.median(durations)),
110
+ cell(lane_stats.peak(durations)),
111
+ String(durations.length),
112
+ ])
113
+ }
114
+
115
+ // The period's table: `entries` is the whole ledger, filtered here to `window`.
116
+ function table(entries: ReadonlyArray<LedgerEntry>, window: StatsWindow): string {
117
+ const period = lane_stats.in_window(entries, window)
118
+ const stages = period.filter(is_stage)
119
+ const measured = { implement: implement_durations(period.filter(is_dispatch), stages), stages }
120
+
121
+ return [
122
+ lane_stats.to_row(COLUMNS),
123
+ lane_stats.to_row(COLUMNS.map(() => '---')),
124
+ ...STAGES.map((stage) => stage_row(stage, measured)),
125
+ ].join('\n')
126
+ }
127
+
128
+ const lane_stage_stats = {
129
+ IMPLEMENT,
130
+ NOT_MEASURED,
131
+ STAGES,
132
+ table,
133
+ }
134
+
135
+ export { lane_stage_stats }
@@ -1,15 +1,14 @@
1
1
  import { git_command } from '#scripts/git/git-command'
2
2
  import { git_remote_branch } from '#scripts/git/git-remote-branch'
3
3
 
4
- // Where a lane is cut from (joshuafolkken/kit#1535).
4
+ // Where a lane is cut from.
5
5
  //
6
6
  // **The bare default-branch name is the wrong start point, because git resolves it to the *local*
7
7
  // `refs/heads/<default>` — a ref nothing in this workflow ever advances.** Merges happen on GitHub
8
8
  // through `pnpm josh followup`, and this repository's main work tree does not have the
9
9
  // default branch checked out, so there is no fast-forward for it to receive. It falls one commit
10
10
  // further behind on every merge, and a lane opened from it starts without the work that was just
11
- // merged. Measured on 2026-09-07: `refs/heads/main` was `e3a68c04` while `refs/remotes/origin/main`
12
- // was `78f746f9`.
11
+ // merged.
13
12
  //
14
13
  // **The remote-tracking ref is the one that is current**, because a fetch updates it without anyone
15
14
  // checking anything out — which is exactly the property the local branch lacks. It is named in full
@@ -20,9 +19,9 @@ const REFS_REMOTES_ORIGIN_PREFIX = 'refs/remotes/origin/'
20
19
 
21
20
  // A fetch *failure* is reported and stepped over rather than raised. `lane:open` has to keep working
22
21
  // with no network at all — offline, and on a clone with no `origin` — and what it degrades to is
23
- // whatever `origin/<default>` already holds, which is still never *behind* the local branch. Note
24
- // what this does not cover: `fetch_branch` runs through `git_spawn.read`, which sets no
25
- // timeout, so a connection that hangs rather than failing blocks here instead of degrading.
22
+ // whatever `origin/<default>` already holds, which is still never *behind* the local branch. A
23
+ // connection that hangs rather than failing degrades the same way: `fetch_branch` runs through
24
+ // `git_spawn.read_remote`, whose budget ends the wait as a failure.
26
25
  async function refresh_default_branch(default_branch: string): Promise<void> {
27
26
  try {
28
27
  await git_command.fetch_branch(default_branch)
@@ -65,7 +64,7 @@ async function resolve(): Promise<string> {
65
64
  return start_point
66
65
  }
67
66
 
68
- // **A branch that already exists is attached to, never cut afresh** (joshuafolkken/kit#1627). Its
67
+ // **A branch that already exists is attached to, never cut afresh**. Its
69
68
  // commits are a child's finished work: `epicrun` leaves a lane's branch behind whenever a child is
70
69
  // parked after pushing, and `lane:close` deletes the local branch while the remote one and the pull
71
70
  // request stay. Cutting a new `<N>-lane` from the default branch there orphans both — and it did so
@@ -130,8 +129,7 @@ async function present_reference(branch_name: string): Promise<string> {
130
129
 
131
130
  // `absent` is the one answer that refuses the ref: the branch is gone from origin, so a ref still
132
131
  // pointing at it is stale and the lane is cut from the default branch as any new one is. Why origin
133
- // itself is asked rather than the remote-tracking ref is `git_remote_branch`'s own comment
134
- // (joshuafolkken/kit#1641 moved the asking there, so `pnpm josh release` could reuse it).
132
+ // itself is asked rather than the remote-tracking ref is `git_remote_branch`'s own comment.
135
133
  async function remote_reference_for(branch_name: string): Promise<string | undefined> {
136
134
  const answer = await git_remote_branch.ask(branch_name)
137
135
 
@@ -148,8 +146,7 @@ async function remote_reference_for(branch_name: string): Promise<string | undef
148
146
  *
149
147
  * `undefined` means **attach**: the branch is already here, so the work tree is put on it and no
150
148
  * branch is created. Every other answer is a commit-ish a new branch is cut from — the remote-tracking
151
- * ref of the lane branch when only the remote has it, and the default branch's when neither does,
152
- * which is the behavior every lane had before joshuafolkken/kit#1627.
149
+ * ref of the lane branch when only the remote has it, and the default branch's when neither does.
153
150
  *
154
151
  * **Nothing here deletes a branch to simplify the call.** That is what would lose the commits this
155
152
  * function exists to keep.
@@ -1,6 +1,8 @@
1
+ import { machine_capacity } from '#scripts/gate/machine-capacity'
1
2
  import type { GateEntry, LedgerEntry, LoadEntry } from './lane-ledger'
3
+ import { lane_sampler } from './lane-sampler'
2
4
 
3
- // The lane-limit measurement's one table row (joshuafolkken/kit#3355): the ledger entries of one period
5
+ // The lane-limit measurement's one table row: the ledger entries of one period
4
6
  // reduced to throughput, gate duration and machine load, in the column order
5
7
  // `docs/maintainers/lane-limit-measurement.md` documents, so the row pastes into #3347's table as is.
6
8
  //
@@ -15,6 +17,9 @@ import type { GateEntry, LedgerEntry, LoadEntry } from './lane-ledger'
15
17
  //
16
18
  // **The means take working samples only** for the same reason: the sampler runs through the nights,
17
19
  // and their idle samples would read four busy lanes as about one. Peaks and minima take every sample.
20
+ //
21
+ // **Swap is a rate, not a level.** A sample carries `machine_capacity`'s counter — every page swapped
22
+ // since boot — so the swap columns are what was swapped between consecutive samples, per hour.
18
23
 
19
24
  const MS_PER_MINUTE = 60_000
20
25
  const MS_PER_HOUR = 3_600_000
@@ -23,6 +28,8 @@ const ACTIVE_GAP_MS = MS_PER_HOUR
23
28
  const MS_PER_DAY = 86_400_000
24
29
  const MB_PER_GB = 1024
25
30
  const HALF = 2
31
+ // Half the sampler's interval: two samples closer than this are not one interval apart.
32
+ const MIN_RATE_GAP_MS = lane_sampler.SAMPLE_INTERVAL_MS / HALF
26
33
  const DECIMALS = 1
27
34
  const MISSING = '—'
28
35
  const CELL_SEPARATOR = ' | '
@@ -37,8 +44,8 @@ const COLUMNS = [
37
44
  'gate max (min)',
38
45
  'load peak',
39
46
  'load mean',
40
- 'swap peak (GB)',
41
- 'swap mean (GB)',
47
+ 'swapped peak (GB/h)',
48
+ 'swapped mean (GB/h)',
42
49
  'free memory min (GB)',
43
50
  'free memory mean (GB)',
44
51
  'load samples',
@@ -107,6 +114,22 @@ function is_working(sample: LoadEntry): sample is WorkingEntry {
107
114
  return (sample.lanes ?? 0) > 0
108
115
  }
109
116
 
117
+ interface SamplePair {
118
+ sample: LoadEntry
119
+ next: LoadEntry
120
+ }
121
+
122
+ // Each sample beside the one that followed it, in time order.
123
+ function sample_pairs(samples: ReadonlyArray<LoadEntry>): Array<SamplePair> {
124
+ const sorted = samples.toSorted((left, right) => Date.parse(left.at) - Date.parse(right.at))
125
+
126
+ return sorted.slice(1).map((next, index) => ({ sample: sorted[index] ?? next, next }))
127
+ }
128
+
129
+ function elapsed_ms({ sample, next }: SamplePair): number {
130
+ return Date.parse(next.at) - Date.parse(sample.at)
131
+ }
132
+
110
133
  function sum_hours(gaps: ReadonlyArray<number>): number | undefined {
111
134
  const active = gaps.filter((gap) => gap <= ACTIVE_GAP_MS).reduce((sum, gap) => sum + gap, 0)
112
135
 
@@ -117,7 +140,7 @@ function sum_hours(gaps: ReadonlyArray<number>): number | undefined {
117
140
  // and gates) no longer than `ACTIVE_GAP_MS`.
118
141
  function gap_hours(entries: ReadonlyArray<LedgerEntry>): number | undefined {
119
142
  const instants = entries
120
- .filter((entry) => !is_load(entry))
143
+ .filter((entry) => entry.kind === 'merge' || is_gate(entry))
121
144
  .map((entry) => Date.parse(entry.at))
122
145
  .toSorted((left, right) => left - right)
123
146
 
@@ -129,16 +152,27 @@ function gap_hours(entries: ReadonlyArray<LedgerEntry>): number | undefined {
129
152
  // The time from each working sample to the next sample. The cap still applies, so a sampler stopped
130
153
  // mid-run does not count its silence as work.
131
154
  function sampled_hours(samples: ReadonlyArray<LoadEntry>): number | undefined {
132
- const sorted = samples.toSorted((left, right) => Date.parse(left.at) - Date.parse(right.at))
133
- const gaps = sorted
134
- .slice(1)
135
- .map((next, index) => ({ sample: sorted[index] ?? next, next }))
155
+ const gaps = sample_pairs(samples)
136
156
  .filter(({ sample }) => is_working(sample))
137
- .map(({ sample, next }) => Date.parse(next.at) - Date.parse(sample.at))
157
+ .map((pair) => elapsed_ms(pair))
138
158
 
139
159
  return sum_hours(gaps)
140
160
  }
141
161
 
162
+ // The GB swapped per hour from one sample to the next. `swapped_mb` is a counter, so only a difference
163
+ // says anything; a gap past `ACTIVE_GAP_MS` is a stopped sampler, whose silence is no rate. A gap under
164
+ // `MIN_RATE_GAP_MS` is no rate either: a drive restarted seconds after its last sample, or a second
165
+ // sampler beside it, would stretch a few seconds' burst to an hour and own the peak.
166
+ function swap_rate(pair: SamplePair): number | undefined {
167
+ const swapped = machine_capacity.swapped_between(pair.sample.swapped_mb, pair.next.swapped_mb)
168
+ const elapsed = elapsed_ms(pair)
169
+ const is_one_interval = elapsed >= MIN_RATE_GAP_MS && elapsed <= ACTIVE_GAP_MS
170
+
171
+ if (swapped === undefined || !is_one_interval) return undefined
172
+
173
+ return swapped / MB_PER_GB / (elapsed / MS_PER_HOUR)
174
+ }
175
+
142
176
  // The hours work was under way; `undefined` when nothing leaves any active time.
143
177
  function active_hours(entries: ReadonlyArray<LedgerEntry>): number | undefined {
144
178
  const samples = entries.filter(is_load)
@@ -172,18 +206,26 @@ function gate_cells(entries: ReadonlyArray<LedgerEntry>): Array<string> {
172
206
  return [cell(median(minutes)), cell(peak(minutes))]
173
207
  }
174
208
 
209
+ function swap_cells(samples: ReadonlyArray<LoadEntry>): Array<string> {
210
+ const pairs = sample_pairs(samples)
211
+ const rates = pairs.map((pair) => swap_rate(pair)).filter(is_number)
212
+ const working_rates = pairs
213
+ .filter(({ sample }) => is_working(sample))
214
+ .map((pair) => swap_rate(pair))
215
+ .filter(is_number)
216
+
217
+ return [cell(peak(rates)), cell(mean(working_rates))]
218
+ }
219
+
175
220
  function load_cells(samples: ReadonlyArray<LoadEntry>): Array<string> {
176
221
  const working = samples.filter(is_working)
177
- const swap = samples.map((sample) => sample.swap_mb).filter(is_number)
178
- const working_swap = working.map((sample) => sample.swap_mb).filter(is_number)
179
- const free = samples.map((sample) => sample.free_mb)
180
- const working_free = working.map((sample) => sample.free_mb)
222
+ const free = samples.map((sample) => sample.available_mb).filter(is_number)
223
+ const working_free = working.map((sample) => sample.available_mb).filter(is_number)
181
224
 
182
225
  return [
183
226
  cell(peak(samples.map((sample) => sample.load))),
184
227
  cell(mean(working.map((sample) => sample.load))),
185
- cell(gigabytes(peak(swap))),
186
- cell(gigabytes(mean(working_swap))),
228
+ ...swap_cells(samples),
187
229
  cell(gigabytes(lowest(free))),
188
230
  cell(gigabytes(mean(working_free))),
189
231
  String(samples.length),
@@ -215,8 +257,11 @@ const lane_stats = {
215
257
  COLUMNS,
216
258
  MISSING,
217
259
  header,
260
+ in_window,
218
261
  median,
262
+ peak,
219
263
  row,
264
+ to_row,
220
265
  window_of,
221
266
  }
222
267
 
@@ -6,7 +6,7 @@ import { lane_open } from './lane-open'
6
6
  import { lane_paths } from './lane-paths'
7
7
  import { lane_registry } from './lane-registry'
8
8
 
9
- // What the lanes root holds that no registered work tree accounts for (joshuafolkken/kit#3370).
9
+ // What the lanes root holds that no registered work tree accounts for.
10
10
  //
11
11
  // **Every other sweep starts from `git worktree list`**, so a directory whose registration is gone —
12
12
  // a lane whose `rmSync` stopped half-way, one whose `.git` points at a registration git pruned, an
@@ -3,7 +3,7 @@ import { run_hold } from '#scripts/run/hold/run-hold'
3
3
  import { lane_await } from './lane-await'
4
4
  import type { LaneInfo } from './lane-registry'
5
5
 
6
- // Whether an open lane holds nothing worth keeping (joshuafolkken/kit#3289): no commit on its branch
6
+ // Whether an open lane holds nothing worth keeping: no commit on its branch
7
7
  // beyond the default branch, a clean work tree, and no child or ship supervisor alive for its issue. A
8
8
  // `backlogrun` cut between `lane:open` and `lane:dispatch` leaves exactly such a lane, and `lane:open`
9
9
  // refuses it as `already-open` — so the next launch of that issue failed on a lane with nothing in it.
@@ -1,4 +1,5 @@
1
1
  import { stamp_file } from '#scripts/josh/stamp-file'
2
+ import { json_value } from '#scripts/lib/json-value'
2
3
  import { z } from 'zod'
3
4
 
4
5
  const DECISION_PREFIX = 'josh-openai-lane-supervisor-decision-'
@@ -16,14 +17,9 @@ function target(lane_directory: string, nonce: string): string {
16
17
  }
17
18
 
18
19
  function read(lane_directory: string, nonce: string): Decision | undefined {
19
- try {
20
- const raw = stamp_file.read_stamp_text(target(lane_directory, nonce)) ?? ''
21
- const value: unknown = JSON.parse(raw)
20
+ const raw = stamp_file.read_stamp_text(target(lane_directory, nonce)) ?? ''
22
21
 
23
- return schema.parse(value)
24
- } catch {
25
- return undefined
26
- }
22
+ return json_value.parse_with(raw, schema)
27
23
  }
28
24
 
29
25
  function decide(lane_directory: string, nonce: string, decision: Decision['decision']): boolean {
@@ -3,11 +3,12 @@ import { linkSync, statSync, unlinkSync } from 'node:fs'
3
3
  import { process_identity } from '#scripts/josh/process-identity'
4
4
  import { process_owner_schema } from '#scripts/josh/process-owner'
5
5
  import { stamp_file } from '#scripts/josh/stamp-file'
6
+ import { json_value } from '#scripts/lib/json-value'
6
7
  import { z } from 'zod'
7
8
  import { openai_lane_supervisor_decision } from './openai-lane-supervisor-decision'
8
9
 
9
10
  // The supervisor's owner and state stamps — who holds a lane, and which child it last launched —
10
- // split out of `openai-lane-supervisor.ts` when it reached its line limit (joshuafolkken/kit#3264).
11
+ // split out of `openai-lane-supervisor.ts` when it reached its line limit.
11
12
  // `openai_lane_supervisor` re-exports each public one under the name it always had, so the move
12
13
  // changed no call site and no suite that spies on `openai_lane_supervisor`.
13
14
 
@@ -41,14 +42,7 @@ function state_path(lane_directory: string): string {
41
42
  }
42
43
 
43
44
  function parsed_stamp<T>(target: string, schema: z.ZodType<T>): T | undefined {
44
- try {
45
- const value: unknown = JSON.parse(stamp_file.read_stamp_text(target) ?? '')
46
- const parsed = schema.safeParse(value)
47
-
48
- return parsed.success ? parsed.data : undefined
49
- } catch {
50
- return undefined
51
- }
45
+ return json_value.parse_with(stamp_file.read_stamp_text(target) ?? '', schema)
52
46
  }
53
47
 
54
48
  function read(lane_directory: string): SupervisorOwner | undefined {
@@ -7,6 +7,7 @@ import { agent_role_profile } from '#scripts/agent/agent-role-profile'
7
7
  import { git_common_directory } from '#scripts/git/git-common-directory'
8
8
  import { stamp_file } from '#scripts/josh/stamp-file'
9
9
  import { error_text } from '#scripts/lib/error-message'
10
+ import { json_value } from '#scripts/lib/json-value'
10
11
  import { detached_launch } from '#scripts/run/detached-launch'
11
12
  import { run_ship_review } from '#scripts/run/ship/run-ship-review'
12
13
  import { z } from 'zod'
@@ -60,10 +61,7 @@ function response_path(directory: string, issue: string): string | undefined {
60
61
 
61
62
  function read_record<T>(target: string, schema: z.ZodType<T>): T | undefined {
62
63
  try {
63
- const content: unknown = JSON.parse(readFileSync(target, 'utf8'))
64
- const parsed = schema.safeParse(content)
65
-
66
- return parsed.success ? parsed.data : undefined
64
+ return json_value.parse_with(readFileSync(target, 'utf8'), schema)
67
65
  } catch {
68
66
  return undefined
69
67
  }
@@ -1,6 +1,6 @@
1
1
  import path from 'node:path'
2
2
 
3
- // One parent-directory walk, in one place (joshuafolkken/kit#3260). Five modules had each written
3
+ // One parent-directory walk, in one place. Five modules had each written
4
4
  // their own — the josh package-root lookup, the gate's project root, the effective-upstream version
5
5
  // read, the local-bin shim search and the progress-interval read — and they had drifted to three
6
6
  // different stop conditions. The walk stops at the filesystem root (where `dirname` answers itself)
@@ -5,7 +5,7 @@
5
5
  // and `epic-bundle-referenced.ts` each read one issue per reference and must not turn a rate limit
6
6
  // into a wrong answer. The reads were written as waves — slice, `Promise.all`, next slice — which
7
7
  // idles the whole batch behind its slowest member, so the three were neither the same code nor the
8
- // same behavior (joshuafolkken/kit#1144).
8
+ // same behavior.
9
9
  //
10
10
  // A worker pool instead: `limit` consumers pull from one queue, so a slot is refilled the moment its
11
11
  // task ends rather than when its neighbors do.
@@ -32,7 +32,7 @@ interface Pool<Item, Result> {
32
32
  // so the clamp passes it straight through and `Array.from({ length: NaN })` builds no consumer at all
33
33
  // — an empty result for a non-empty input, which is precisely what the paragraph above promises
34
34
  // cannot happen. A caller reading that promise is entitled not to validate first, so it is closed
35
- // here (joshuafolkken/kit#1144). A fractional limit is floored for the same reason: `Array.from`
35
+ // here. A fractional limit is floored for the same reason: `Array.from`
36
36
  // truncates it silently, and a width that is not the number asked for should be a decision rather
37
37
  // than a side effect.
38
38
  function pool_width(limit: number, total: number): number {
@@ -7,8 +7,7 @@ import { SUITE_TIMEOUT_MS } from './timeouts'
7
7
  // need the same three things: the output buffered until the child finishes (concurrent writers
8
8
  // otherwise interleave into an unreadable transcript), a non-zero exit reported rather than thrown
9
9
  // (so one failing check does not abort its siblings), and a bound on how long a child may hang.
10
- // They had the same code twice, which is how a fix to one of them missed the other
11
- // (joshuafolkken/kit#914).
10
+ // They had the same code twice, which is how a fix to one of them missed the other.
12
11
 
13
12
  const PNPM = 'pnpm'
14
13
  const FORCE_COLOR = '1'
@@ -21,13 +20,12 @@ interface BufferedProcessResult {
21
20
  exit_code: number | undefined
22
21
  // How long the child ran, in milliseconds. Measured here rather than at each call site because
23
22
  // this function owns the child's lifetime — a caller timing it from outside would have to repeat
24
- // the same two readings, and every fan-out caller would repeat them once per branch
25
- // (joshuafolkken/kit#1248).
23
+ // the same two readings, and every fan-out caller would repeat them once per branch.
26
24
  elapsed_ms: number
27
25
  }
28
26
 
29
- // The two things a caller outside the fan-out needs to vary, and the only two
30
- // (joshuafolkken/kit#1554). `lane:open` runs its install in the work tree it just created rather
27
+ // The two things a caller outside the fan-out needs to vary, and the only two.
28
+ // `lane:open` runs its install in the work tree it just created rather
31
29
  // than in the directory `josh` was typed in, and bounds it well under the fan-out's half hour
32
30
  // because an install that never answers has to end the command rather than hold a parallel run
33
31
  // open. Everything else — the buffering, the non-throwing exit, and the color policy that respects
File without changes
@@ -1,9 +1,19 @@
1
1
  import { parseArgs, type ParseArgsConfig, type ParseArgsOptionsConfig } from 'node:util'
2
2
 
3
3
  // Argument reading for the commands under `scripts/`.
4
- //
4
+
5
+ const HELP_FLAGS: ReadonlySet<string> = new Set(['--help', '-h'])
6
+
7
+ // The usage line `refuse_unknown_flags` ends with, for a command that prints it on its own help
8
+ // request (`josh release --help`).
9
+ function usage_line(known_flags: ReadonlyArray<string>, command: string): string {
10
+ if (known_flags.length === 0) return `Usage: josh ${command}`
11
+
12
+ return `Usage: josh ${command} [${known_flags.join('] [')}]`
13
+ }
14
+
5
15
  // Reject anything not on the list rather than ignoring it: a misspelled `--dryrun` that fell through
6
- // would run the real write path. `josh propagate` and `josh adopt` both write into working trees, so
16
+ // would run the real write path. `josh propagate`, `josh adopt` and `josh release` all write, so
7
17
  // the refusal is single-sourced here rather than described once per command (`CLAUDE.md` → "No
8
18
  // clones").
9
19
  function refuse_unknown_flags(
@@ -13,15 +23,36 @@ function refuse_unknown_flags(
13
23
  ): string | undefined {
14
24
  const unknown = argv.filter((argument) => !known_flags.includes(argument))
15
25
  if (unknown.length === 0) return undefined
16
- const usage = `Usage: josh ${command} [${known_flags.join('] [')}]`
17
26
 
18
- return `Unknown argument(s): ${unknown.join(' ')}\n${usage}`
27
+ return `Unknown argument(s): ${unknown.join(' ')}\n${usage_line(known_flags, command)}`
28
+ }
29
+
30
+ // The argument gate of a command that publishes (`josh release`, `josh release:github`): a help
31
+ // request prints the usage and exits 0, an unknown argument is refused with exit 1, both before any side effect. `undefined` means the
32
+ // arguments are all known and the command may run.
33
+ function answer_help_or_unknown(
34
+ argv: ReadonlyArray<string>,
35
+ known_flags: ReadonlyArray<string>,
36
+ command: string,
37
+ ): number | undefined {
38
+ if (argv.some((argument) => HELP_FLAGS.has(argument))) {
39
+ console.info(usage_line(known_flags, command))
40
+
41
+ return 0
42
+ }
43
+
44
+ const refusal = refuse_unknown_flags(argv, known_flags, command)
45
+ if (refusal === undefined) return undefined
46
+
47
+ console.error(refusal)
48
+
49
+ return 1
19
50
  }
20
51
 
21
52
  // `parseArgs`, answering `undefined` where it would throw — an unknown flag, a missing option value,
22
53
  // or a positional the config does not allow. Each caller turns that into its usage line and a failure
23
54
  // exit rather than a stack trace, on commands whose output a workflow reads; eleven of them had begun
24
- // to carry a copy of the same try/catch each (joshuafolkken/kit#2902), and this is the one copy.
55
+ // to carry a copy of the same try/catch each, and this is the one copy.
25
56
  function parse_or_undefined<T extends ParseArgsConfig>(
26
57
  config: T,
27
58
  ): ReturnType<typeof parseArgs<T>> | undefined {
@@ -34,7 +65,7 @@ function parse_or_undefined<T extends ParseArgsConfig>(
34
65
 
35
66
  // The two shapes every command reads `argv` in: flags alone, or flags beside positionals. Both are
36
67
  // strict, so an unknown flag is `undefined` rather than a silently ignored typo; the commands had each
37
- // carried a one-line wrapper spelling these out (joshuafolkken/kit#3072).
68
+ // carried a one-line wrapper spelling these out.
38
69
  type FlagsOnly<T extends ParseArgsOptionsConfig> = ReturnType<
39
70
  typeof parseArgs<{ args: Array<string>; options: T }>
40
71
  >
@@ -123,7 +154,9 @@ function attach_values(
123
154
 
124
155
  const cli_flags = {
125
156
  attach_values,
157
+ usage_line,
126
158
  refuse_unknown_flags,
159
+ answer_help_or_unknown,
127
160
  parse_or_undefined,
128
161
  values_of,
129
162
  arguments_of,