@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
@@ -5,7 +5,7 @@ import { defect_rate, type DefectRate, type IssueKind } from '#scripts/issue/def
5
5
  import { defect_rate_cli } from '#scripts/issue/defect-rate-cli'
6
6
 
7
7
  // While the defect rate is above its baseline, `backlog:next` offers defects and hardening first and
8
- // defers new mechanisms (joshuafolkken/kit#2455). The re-ordering stays inside the runnable set — every
8
+ // defers new mechanisms. The re-ordering stays inside the runnable set — every
9
9
  // candidate is already ready to start — so no dependency the graph recorded is crossed.
10
10
 
11
11
  const UNMEASURED_MESSAGE =
@@ -1,15 +1,15 @@
1
+ import { issue_number_shape } from '#scripts/issue/issue-number-shape'
1
2
  import { cli_flags } from '#scripts/lib/cli-flags'
2
3
  import type { DriveState } from './backlog-drive'
3
4
 
4
5
  // The `josh backlog:drive` flags — read into a `DriveContext`, and written back as the `resume:` line —
5
- // split out of `backlog-drive-cli.ts` when it neared its line limit (joshuafolkken/kit#3264).
6
+ // split out of `backlog-drive-cli.ts` when it neared its line limit.
6
7
  // `backlog_drive_cli` re-exports `parse` and `resume_line` under the names they always had, so the move
7
8
  // changed no call site and no suite that reads them through `backlog_drive_cli`.
8
9
 
9
10
  const MS_PER_MINUTE = 60_000
10
11
  const LIST_SEPARATOR = ','
11
12
  const COUNT_PATTERN = /^\d+$/u
12
- const ISSUE_PATTERN = /^[1-9]\d*$/u
13
13
  const USAGE =
14
14
  'Usage: josh backlog:drive --owner <pid> [--active <ISO-8601>] [--max <n>] [--idle <minutes>] [--only] [--exclude <n>[,<n>...]] [--await <n>[,<n>...]] [--window <minutes>] [--stopped <n>]'
15
15
 
@@ -51,7 +51,7 @@ function to_issues(raw: string | undefined): ReadonlyArray<string> | undefined {
51
51
 
52
52
  const issues = raw.split(LIST_SEPARATOR)
53
53
 
54
- return issues.some((issue) => !ISSUE_PATTERN.test(issue)) ? undefined : issues
54
+ return issues.some((issue) => !issue_number_shape.is_issue_number(issue)) ? undefined : issues
55
55
  }
56
56
 
57
57
  function forwarded_of(values: Values): ReadonlyArray<string> | undefined {
@@ -72,7 +72,8 @@ function is_valid_window(raw: string | undefined): boolean {
72
72
  }
73
73
 
74
74
  function is_valid_single(values: Values): boolean {
75
- const is_valid_stopped = values.stopped === undefined || ISSUE_PATTERN.test(values.stopped)
75
+ const is_valid_stopped =
76
+ values.stopped === undefined || issue_number_shape.ISSUE_NUMBER_PATTERN.test(values.stopped)
76
77
 
77
78
  return is_valid_stopped && is_valid_window(values.window)
78
79
  }
@@ -1,11 +1,14 @@
1
1
  #!/usr/bin/env tsx
2
2
  import { setTimeout as sleep } from 'node:timers/promises'
3
3
  import { fileURLToPath } from 'node:url'
4
+ import { issue_cite } from '#scripts/issue/issue-cite'
4
5
  import { hook_decision } from '#scripts/josh/hook-decision'
5
6
  import { josh_command } from '#scripts/josh/josh-run'
6
7
  import { lane_await, type AwaitState } from '#scripts/lane/lane-await'
7
8
  import { lane_registry } from '#scripts/lane/lane-registry'
9
+ import { lane_sampler } from '#scripts/lane/lane-sampler'
8
10
  import { error_text } from '#scripts/lib/error-message'
11
+ import { json_value } from '#scripts/lib/json-value'
9
12
  import { run_carry, type RunCarry } from '#scripts/run/carry/run-carry'
10
13
  import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
11
14
  import { run_merge_cli, type MergeResult } from '#scripts/run/merge/run-merge-cli'
@@ -29,7 +32,7 @@ import { backlog_drive_retrospective } from './backlog-drive-retrospective'
29
32
  import { backlog_offer_cli } from './backlog-offer-cli'
30
33
  import { backlog_ready } from './backlog-ready'
31
34
 
32
- // `josh backlog:drive` — the backlogrun parent's loop as one resident wait (joshuafolkken/kit#2499).
35
+ // `josh backlog:drive` — the backlogrun parent's loop as one resident wait.
33
36
  // The parent issues it once, in the background, and is woken only when it exits — with a token the model
34
37
  // has to read. The loop itself is `backlog-drive.ts`; this file is its ports onto the commands it reuses.
35
38
  //
@@ -58,13 +61,7 @@ const offer_read_schema = z.object({
58
61
  const offer_schema = z.object({ [backlog_offer_cli.JSON_KEY]: offer_read_schema })
59
62
 
60
63
  function to_offer(out: string): OfferRead | undefined {
61
- try {
62
- const parsed = offer_schema.safeParse(JSON.parse(out))
63
-
64
- return parsed.success ? parsed.data[backlog_offer_cli.JSON_KEY] : undefined
65
- } catch {
66
- return undefined
67
- }
64
+ return json_value.parse_with(out, offer_schema)?.[backlog_offer_cli.JSON_KEY]
68
65
  }
69
66
 
70
67
  async function read_record(): Promise<RunCarry | undefined> {
@@ -110,7 +107,7 @@ function merge_token(out: string, code: number): string {
110
107
 
111
108
  // The child's transcript, where its lane recorded one, so `run:merge` can tell an API outage from a
112
109
  // failure exactly as it does for the parent that passes `--output` by hand. No hand-off threshold: the
113
- // supervisor runs this loop, and a process has no context to cut (joshuafolkken/kit#3156).
110
+ // supervisor runs this loop, and a process has no context to cut.
114
111
  async function merge(issue: string, owner: string): Promise<MergeResult> {
115
112
  await backlog_drive_owner.assert_current(owner)
116
113
  const lane = await lane_registry.find_open_lane(issue)
@@ -165,7 +162,7 @@ async function open_lanes(): Promise<ReadonlyArray<string>> {
165
162
 
166
163
  function end_line(end: DriveEnd): string {
167
164
  const token = end.token === undefined || end.token === end.reason ? [] : [end.token]
168
- const issue = end.issue === undefined ? [] : [`#${end.issue}`]
165
+ const issue = end.issue === undefined ? [] : [issue_cite.plain(end.issue)]
169
166
  const base = [end.reason, ...token, ...issue].join(' ')
170
167
 
171
168
  return end.detail === undefined ? base : `${base} ${end.detail}`
@@ -224,13 +221,19 @@ async function drive(context: DriveContext): Promise<number> {
224
221
  return SUCCESS_EXIT_CODE
225
222
  }
226
223
 
224
+ // The machine load is sampled for exactly as long as the drive runs, so a `backlogrun` leaves its own
225
+ // load in the lane ledger without a sampler anyone has to start or stop (`lane-sampler.ts`).
227
226
  async function run_safe(context: DriveContext): Promise<number> {
227
+ const stop_sampling = lane_sampler.start()
228
+
228
229
  try {
229
230
  return await drive(context)
230
231
  } catch (error) {
231
232
  console.info(`error ${error_text.message_of(error)}`)
232
233
 
233
234
  return FAILURE_EXIT_CODE
235
+ } finally {
236
+ stop_sampling()
234
237
  }
235
238
  }
236
239
 
@@ -260,6 +263,7 @@ const backlog_drive_cli = {
260
263
  offer_argv: backlog_drive_offer_argv.offer_argv,
261
264
  parse: backlog_drive_args.parse,
262
265
  resume_line: backlog_drive_args.resume_line,
266
+ run,
263
267
  to_offer,
264
268
  }
265
269
 
@@ -0,0 +1,85 @@
1
+ import { git_gh_repo } from '#scripts/gh/git-gh-repo'
2
+ import { issue_cite } from '#scripts/issue/issue-cite'
3
+ import { issue_number_shape } from '#scripts/issue/issue-number-shape'
4
+ import { josh_command } from '#scripts/josh/josh-run'
5
+ import type { DriveState, OfferRead } from './backlog-drive'
6
+ import { backlog_drive_named } from './backlog-drive-named'
7
+ import { backlog_offer } from './backlog-offer'
8
+
9
+ // A named epic is driven from the epic itself. The work list is the epic's
10
+ // current children as `epic:next` derives them, never a copy in the carry record — so a child filed
11
+ // into the epic mid-run, by any route (`issue:file`, `epic --add`, a hand edit), is dispatched once it
12
+ // is runnable, without `run:add` and without waking a parent session.
13
+ //
14
+ // **Only what needs a person is handed back.** `stop` means every child left waits on a person, which a
15
+ // judgment session reads. A failed `epic:next` is either a network blip or a broken graph (a cycle, an
16
+ // undeclared order, an unreadable child), and its exit code does not tell them apart — so a failure is
17
+ // a `wait` that retries on the next pass, and `backlog:offer`'s consecutive-retry limit of them hands the
18
+ // epic back too, rather than waiting out the idle budget on an anomaly nobody is shown.
19
+
20
+ const NO_RETRIES = 0
21
+ const SUCCESS_EXIT_CODE = 0
22
+ const FIRST_LINE = 0
23
+ const WAIT: OfferRead = { verdict: 'wait', issues: [], retries: NO_RETRIES }
24
+
25
+ // `--lanes` lists every child a free lane could take, so one the loop already knows about is passed
26
+ // over rather than standing in front of the rest. `undefined` is an answer that could not be read.
27
+ async function ask_next(epic: string): Promise<ReadonlyArray<string> | undefined> {
28
+ const repo = await git_gh_repo.repo_get_name_with_owner()
29
+ if (repo === undefined) return undefined
30
+ const result = await josh_command.josh_run(['epic:next', epic, '--repo', repo, '--lanes'], true)
31
+
32
+ return result.code === SUCCESS_EXIT_CODE ? result.out.trim().split('\n') : undefined
33
+ }
34
+
35
+ function handed_back(epic: string): OfferRead {
36
+ return { ...WAIT, verdict: `epic ${issue_cite.plain(epic)}` }
37
+ }
38
+
39
+ function failed_offer(epic: string, state: DriveState): OfferRead {
40
+ const retries = state.retries + 1
41
+
42
+ return retries >= backlog_offer.RETRY_LIMIT ? handed_back(epic) : { ...WAIT, retries }
43
+ }
44
+
45
+ // A child the loop already launched, or merged and excluded, can still read as runnable while GitHub
46
+ // catches up, so it is skipped rather than launched twice. One child per offer
47
+ // keeps the carried maximum checked before each launch.
48
+ function child_offer(children: ReadonlyArray<string>, state: DriveState): OfferRead {
49
+ const child = children.find(
50
+ (item) => !state.in_flight.includes(item) && !state.exclude.includes(item),
51
+ )
52
+
53
+ return child === undefined ? WAIT : { verdict: 'run', issues: [child], retries: NO_RETRIES }
54
+ }
55
+
56
+ async function answered_offer(
57
+ epic: string,
58
+ answers: ReadonlyArray<string>,
59
+ state: DriveState,
60
+ owner: string,
61
+ ): Promise<OfferRead> {
62
+ const token = answers[FIRST_LINE]
63
+
64
+ if (token !== undefined && issue_number_shape.ISSUE_NUMBER_PATTERN.test(token)) {
65
+ return child_offer(answers, state)
66
+ }
67
+
68
+ if (token === 'stop') return handed_back(epic)
69
+
70
+ if (token === 'complete') {
71
+ await backlog_drive_named.mark_done(epic, { outcome: 'merged', code: 0, token: 'none' }, owner)
72
+ }
73
+
74
+ return WAIT
75
+ }
76
+
77
+ async function offer(epic: string, state: DriveState, owner: string): Promise<OfferRead> {
78
+ const answers = await ask_next(epic)
79
+
80
+ return answers === undefined
81
+ ? failed_offer(epic, state)
82
+ : await answered_offer(epic, answers, state, owner)
83
+ }
84
+
85
+ export const backlog_drive_epic = { offer }
@@ -2,7 +2,7 @@ import { git_stash } from '#scripts/git/stash/git-stash'
2
2
  import { lane_launch_cli, type LaunchOutcome } from '#scripts/lane/lane-launch-cli'
3
3
  import { backlog_drive_owner } from './backlog-drive-owner'
4
4
 
5
- // The driver's lane launch (joshuafolkken/kit#3272). The parent that ran `josh latest` in the primary
5
+ // The driver's lane launch. The parent that ran `josh latest` in the primary
6
6
  // checkout leaves its rewritten lock file in a stash under this message — `backlogrun-lanes.md` →
7
7
  // "Once per repository, before the first lane opens" — and the lane that pops it carries the update
8
8
  // into its pull request. **The stash itself is the "first lane" marker**: each launch asks whether it
@@ -1,10 +1,14 @@
1
+ import { issue_cite } from '#scripts/issue/issue-cite'
1
2
  import { EPIC_LABEL, has_label_name, NEEDS_DECISION_LABEL } from '#scripts/issue/issue-labels'
2
3
  import type { IssueState } from '#scripts/issue/issue-state'
3
4
  import { issue_state_cli } from '#scripts/issue/issue-state-cli'
4
5
  import type { RunCarry } from '#scripts/run/carry/run-carry'
6
+ import { run_carry_added } from '#scripts/run/carry/run-carry-added'
5
7
  import type { MergeResult } from '#scripts/run/merge/run-merge-cli'
8
+ import { run_invocation } from '#scripts/run/run-invocation'
6
9
  import { backlog_budget } from './backlog-budget'
7
10
  import type { DriveState, OfferRead } from './backlog-drive'
11
+ import { backlog_drive_epic } from './backlog-drive-epic'
8
12
  import { backlog_drive_named } from './backlog-drive-named'
9
13
 
10
14
  interface NamedContext {
@@ -47,15 +51,20 @@ function budget_offer(
47
51
  }
48
52
 
49
53
  // The outcome a named issue has already reached without this run dispatching it: closed is merged, and
50
- // a `needs-decision` park waits on a person, so re-dispatching it only repeats the stop it parked on
51
- // (joshuafolkken/kit#2965). Either is booked done rather than offered.
54
+ // a `needs-decision` park waits on a person, so re-dispatching it only repeats the stop it parked on.
55
+ // Either is booked done rather than offered.
52
56
  function settled_outcome(state: IssueState): MergeResult['outcome'] | undefined {
53
57
  if (state.state.toUpperCase() === 'CLOSED') return 'merged'
54
58
 
55
59
  return has_label_name(state.labels, NEEDS_DECISION_LABEL) ? 'parked' : undefined
56
60
  }
57
61
 
58
- async function classify(issue: string, named: OfferRead, owner: string): Promise<OfferRead> {
62
+ async function classify(
63
+ issue: string,
64
+ named: OfferRead,
65
+ state: DriveState,
66
+ owner: string,
67
+ ): Promise<OfferRead> {
59
68
  const result = await issue_state_cli.read_issue(issue)
60
69
 
61
70
  if (result.kind !== 'state') return { verdict: 'issue-state', issues: [], retries: NO_RETRIES }
@@ -68,11 +77,53 @@ async function classify(issue: string, named: OfferRead, owner: string): Promise
68
77
  return { verdict: 'wait', issues: [], retries: NO_RETRIES }
69
78
  }
70
79
 
71
- if (has_label_name(result.state.labels, EPIC_LABEL)) {
72
- return { verdict: `epic #${issue}`, issues: [], retries: NO_RETRIES }
73
- }
80
+ return has_label_name(result.state.labels, EPIC_LABEL)
81
+ ? await backlog_drive_epic.offer(issue, state, owner)
82
+ : named
83
+ }
84
+
85
+ // **A named issue booked done is not thereby merged**: a park and a failure are
86
+ // booked done too, so the run moves past them. One the run's own merges did not record and GitHub does
87
+ // not read as closed ended without a merge — and an unreadable state counts as that, because a false
88
+ // stop reaches a person while a false finish ends the run where nobody sees it.
89
+ async function is_unmerged(issue: number, merged: ReadonlyArray<number>): Promise<boolean> {
90
+ if (merged.includes(issue)) return false
91
+
92
+ const result = await issue_state_cli.read_issue(String(issue))
93
+
94
+ return result.kind !== 'state' || result.state.state.toUpperCase() !== 'CLOSED'
95
+ }
96
+
97
+ // The issues `run:add` put in count too: one that parked is no more a merge
98
+ // than a declared one.
99
+ async function unmerged_of(carry: RunCarry): Promise<Array<number>> {
100
+ const declared = run_carry_added.ordered(
101
+ run_invocation.issue_numbers(carry.invocation) ?? [],
102
+ carry.added,
103
+ )
104
+ const merged = carry.merged_issues ?? []
105
+ const flags = await Promise.all(declared.map(async (issue) => await is_unmerged(issue, merged)))
106
+
107
+ return declared.filter((_, index) => flags[index] === true)
108
+ }
109
+
110
+ // The `--only` run's end: a finish when every named issue merged, otherwise a stop naming the ones that
111
+ // did not, which `backlog-drive-finish.ts` closes with `run:carry --end --stopped` and its ⏸️ notice.
112
+ async function only_end(carry: RunCarry, named: OfferRead): Promise<OfferRead> {
113
+ const unmerged = await unmerged_of(carry)
114
+
115
+ if (unmerged.length === 0) return named
116
+
117
+ const listed = unmerged.map((issue) => issue_cite.plain(issue)).join(', ')
74
118
 
75
- return named
119
+ return { ...named, reason: `only: ${listed} ended without a merge`, is_finish: false }
120
+ }
121
+
122
+ async function not_run(
123
+ carry: RunCarry,
124
+ named: OfferRead | undefined,
125
+ ): Promise<OfferRead | undefined> {
126
+ return named?.is_finish === true ? await only_end(carry, named) : named
76
127
  }
77
128
 
78
129
  async function read(
@@ -81,12 +132,12 @@ async function read(
81
132
  context: NamedContext,
82
133
  ): Promise<OfferRead | undefined> {
83
134
  const named = backlog_drive_named.offer(carry, state, context.is_only)
84
- if (named?.verdict !== 'run') return named
135
+ if (named?.verdict !== 'run') return await not_run(carry, named)
85
136
  const budget = budget_offer(carry, state, context.forwarded)
86
137
  if (budget.verdict !== 'run') return budget
87
138
  const [issue] = named.issues
88
139
 
89
- return issue === undefined ? undefined : await classify(issue, named, context.owner)
140
+ return issue === undefined ? undefined : await classify(issue, named, state, context.owner)
90
141
  }
91
142
 
92
143
  export const backlog_drive_named_offer = { read }
@@ -3,16 +3,39 @@ import { issue_state_cli } from '#scripts/issue/issue-state-cli'
3
3
  import { run_carry, type RunCarry } from '#scripts/run/carry/run-carry'
4
4
  import type { RunEvent } from '#scripts/run/event/run-event-stream'
5
5
  import type { MergeResult } from '#scripts/run/merge/run-merge-cli'
6
+ import { run_merge_token } from '#scripts/run/merge/run-merge-token'
7
+ import { run_invocation } from '#scripts/run/run-invocation'
6
8
  import type { DriveState, OfferRead } from './backlog-drive'
7
9
  import { backlog_drive_restore } from './backlog-drive-restore'
8
10
  import { backlog_named } from './backlog-named'
9
11
 
12
+ const { MERGE_TOKEN } = run_merge_token
13
+
10
14
  const NO_RETRIES = 0
11
15
  const FIRST = 0
12
16
  const TERMINAL_OUTCOMES: ReadonlySet<string> = new Set(['merged', 'parked', 'split'])
13
17
 
18
+ // The skip follows the declared order alone: an issue `run:add` put in was
19
+ // asked for on its own, so its failure skips nothing and a declared failure does not skip it.
20
+ function is_declared(carry: RunCarry, issue: string): boolean {
21
+ return run_invocation.issue_numbers(carry.invocation)?.includes(Number(issue)) === true
22
+ }
23
+
24
+ // An issue `run:add` put in that is already in flight holds nothing up: it was
25
+ // asked for on its own, so the declared item behind it — an epic whose children fill the free lanes —
26
+ // is offered beside it. A declared issue in flight still holds the ones declared after it.
27
+ function is_held(carry: RunCarry, state: DriveState, issue: number): boolean {
28
+ return !state.in_flight.includes(String(issue)) || is_declared(carry, String(issue))
29
+ }
30
+
31
+ function next_of(carry: RunCarry, state: DriveState): number | undefined {
32
+ const remaining = run_carry.remaining_of(carry) ?? []
33
+
34
+ return remaining.find((issue) => is_held(carry, state, issue)) ?? remaining[FIRST]
35
+ }
36
+
14
37
  function offer(carry: RunCarry, state: DriveState, is_only: boolean): OfferRead | undefined {
15
- const next = run_carry.remaining_of(carry)?.[FIRST]
38
+ const next = next_of(carry, state)
16
39
 
17
40
  if (next !== undefined) {
18
41
  const issue = String(next)
@@ -28,9 +51,11 @@ function offer(carry: RunCarry, state: DriveState, is_only: boolean): OfferRead
28
51
  }
29
52
 
30
53
  function is_done(result: MergeResult): boolean {
31
- if (TERMINAL_OUTCOMES.has(result.outcome)) return result.code === 0 && result.token !== 'busy'
54
+ if (TERMINAL_OUTCOMES.has(result.outcome)) {
55
+ return result.code === 0 && result.token !== MERGE_TOKEN.BUSY
56
+ }
32
57
 
33
- return result.outcome === 'failed' && result.code === 0 && result.token !== 'stop'
58
+ return result.outcome === 'failed' && result.code === 0 && result.token !== MERGE_TOKEN.STOP
34
59
  }
35
60
 
36
61
  function can_mark(carry: RunCarry, issue: string, owner: string): boolean {
@@ -48,17 +73,22 @@ function mark_one(target: string, issue: string, owner: string): boolean {
48
73
  return true
49
74
  }
50
75
 
51
- function skip_after_failure(target: string, issue: string, owner: string): void {
52
- const read = run_carry.read_carry(target)
53
- if (read.kind !== 'carried') return
54
- const remaining = run_carry.remaining_of(read.carry) ?? []
76
+ function skipped_of(carry: RunCarry, issue: string): ReadonlyArray<number> {
77
+ if (!is_declared(carry, issue)) return []
78
+ const remaining = run_carry.remaining_of({ ...carry, added: undefined }) ?? []
55
79
  const named = [
56
80
  { issue: Number(issue), is_epic: false },
57
81
  ...remaining.map((number) => ({ issue: number, is_epic: false })),
58
82
  ]
59
- const { skipped } = backlog_named.after_failure(named, Number(issue))
60
83
 
61
- for (const number of skipped) {
84
+ return backlog_named.after_failure(named, Number(issue)).skipped
85
+ }
86
+
87
+ function skip_after_failure(target: string, issue: string, owner: string): void {
88
+ const read = run_carry.read_carry(target)
89
+ if (read.kind !== 'carried') return
90
+
91
+ for (const number of skipped_of(read.carry, issue)) {
62
92
  if (!mark_one(target, String(number), owner)) return
63
93
  }
64
94
  }
@@ -3,7 +3,7 @@ import type { DriveState } from './backlog-drive'
3
3
 
4
4
  const LIST_SEPARATOR = ','
5
5
 
6
- // **A child in flight is never offered** (joshuafolkken/kit#3156). A lane child merges its own PR and
6
+ // **A child in flight is never offered**. A lane child merges its own PR and
7
7
  // drops `in-progress` before GitHub closes the issue and before the loop collects it, so `backlog:next`
8
8
  // can offer it again; launching it then is refused by its still-open lane and handed to an AI session.
9
9
  function excluded(state: DriveState): ReadonlyArray<string> {
@@ -64,4 +64,4 @@ function restore(
64
64
  return lanes.filter((issue) => active.has(issue) && !merged_issues.includes(Number(issue)))
65
65
  }
66
66
 
67
- export const backlog_drive_restore = { restore, settled_issues, parked_issues }
67
+ export const backlog_drive_restore = { active_issues, restore, settled_issues, parked_issues }
@@ -4,8 +4,8 @@ import type { RunCarry } from '#scripts/run/carry/run-carry'
4
4
  import { run_retrospective } from '#scripts/run/run-retrospective'
5
5
 
6
6
  // Whether a drain owes the retrospective, read through the owed rule `run:step` reads, so a drain it
7
- // owes nothing at keeps the idle watch rather than waking a session with nothing to run
8
- // (joshuafolkken/kit#2750). The drive is the parent's loop, never a lane child's.
7
+ // owes nothing at keeps the idle watch rather than waking a session with nothing to run.
8
+ // The drive is the parent's loop, never a lane child's.
9
9
  function is_owed(carry: RunCarry): boolean {
10
10
  const root = find_package_directory(process.cwd())
11
11
 
@@ -1,10 +1,10 @@
1
1
  // The body of `josh backlog:drive`: the backlogrun parent's mechanical transitions, run as one resident
2
- // wait instead of a model turn per event (joshuafolkken/kit#2499).
2
+ // wait instead of a model turn per event.
3
3
  //
4
- // **What it replaces is the parent's turn between two commands.** Measured after #2492 the parent still
5
- // spent about half of its backlogrun requests on nothing but glue: a child's process ends, the model
6
- // wakes, runs `run:merge`, reads a number, runs `lane:launch`, restarts `lane:await`, ends its turn — or,
7
- // headless, polls in the foreground because its turn cannot end. Every one of those steps is a command
4
+ // **What it replaces is the parent's turn between two commands.** Without it the parent spends about
5
+ // half of its backlogrun requests on nothing but glue: a child's process ends, the model wakes, runs
6
+ // `run:merge`, reads a number, runs `lane:launch`, restarts `lane:await`, ends its turn — or, headless,
7
+ // polls in the foreground because its turn cannot end. Every one of those steps is a command
8
8
  // whose answer is already a token, so the loop here only reads tokens and never decides what one means.
9
9
  //
10
10
  // **It decides nothing another command answers.** Collecting a child is `run:merge`'s, choosing the next
@@ -16,25 +16,40 @@
16
16
  // **Everything it touches is a port**, the pattern `run-wake-loop.ts` set, so the sequencing is pinned
17
17
  // without a process, a network or a clock.
18
18
 
19
+ import { issue_cite } from '#scripts/issue/issue-cite'
19
20
  import type { LaunchOutcome } from '#scripts/lane/lane-launch-cli'
20
21
  import type { MergeResult } from '#scripts/run/merge/run-merge-cli'
22
+ import { run_merge_token, type MergeToken } from '#scripts/run/merge/run-merge-token'
21
23
 
24
+ const { MERGE_TOKEN } = run_merge_token
22
25
  const RUN_VERDICT = 'run'
23
26
  const STOP_VERDICT = 'stop'
24
- // The `run:merge` tokens that end the loop at once: a hand-off, a person's stop, the environment down,
25
- // a foreign owner, an unreadable state. `resumed` is not among them — the same lane is awaited again.
26
- const IMMEDIATE_TOKENS: ReadonlySet<string> = new Set([
27
- 'over',
28
- 'human-review',
29
- 'environment',
30
- 'busy',
31
- 'retry',
32
- ])
33
- // Every token `run:merge` prints first even on a non-zero exit. `stop` — a parked backlog or the failure
34
- // guard — is the offer's `stop` reached through a merge: the child is collected, nothing more starts,
35
- // and the children still in flight are collected before the loop ends (joshuafolkken/kit#2881).
36
- const HANDOFF_TOKENS: ReadonlySet<string> = new Set([...IMMEDIATE_TOKENS, STOP_VERDICT])
37
- const RESUMED_TOKEN = 'resumed'
27
+ // How the loop reads each `run:merge` token — keyed by the producer's own type, so a token added there
28
+ // is a type error here until it is classified. `hand-back` ends the loop at once: a hand-off, a person's
29
+ // stop, the environment down, a foreign owner, an unreadable state. `stop` — a parked backlog or the
30
+ // failure guard — is the offer's `stop` reached through a merge: the child is collected, nothing more
31
+ // starts, and the children still in flight are collected before the loop ends. `await` is a cut resumed
32
+ // in place: the same lane is awaited again.
33
+ type TokenHandling = 'hand-back' | 'stop' | 'await'
34
+ const TOKEN_HANDLING: Readonly<Record<MergeToken, TokenHandling>> = {
35
+ [MERGE_TOKEN.OVER]: 'hand-back',
36
+ [MERGE_TOKEN.HUMAN_REVIEW]: 'hand-back',
37
+ [MERGE_TOKEN.ENVIRONMENT]: 'hand-back',
38
+ [MERGE_TOKEN.BUSY]: 'hand-back',
39
+ [MERGE_TOKEN.RETRY]: 'hand-back',
40
+ [MERGE_TOKEN.STOP]: 'stop',
41
+ [MERGE_TOKEN.RESUMED]: 'await',
42
+ }
43
+
44
+ function tokens_handled(...handlings: ReadonlyArray<TokenHandling>): ReadonlySet<string> {
45
+ const entries = Object.entries(TOKEN_HANDLING)
46
+
47
+ return new Set(entries.filter(([, handling]) => handlings.includes(handling)).map(([key]) => key))
48
+ }
49
+
50
+ const IMMEDIATE_TOKENS = tokens_handled('hand-back')
51
+ // Every token `run:merge` prints first even on a non-zero exit.
52
+ const HANDOFF_TOKENS = tokens_handled('hand-back', 'stop')
38
53
  const MERGED_OUTCOME = 'merged'
39
54
  const WATCH_VERDICT = 'watch'
40
55
  // The verdicts the loop acts on without the parent. Any other is handed back as it was printed.
@@ -56,7 +71,7 @@ interface OfferRead {
56
71
  answer?: string | undefined
57
72
  reason?: string | undefined
58
73
  // Whether a drain here owes the retrospective: the opt-in switch is on and it has not run yet. Absent
59
- // reads as not owed, so a drain with the switch off keeps the idle watch (joshuafolkken/kit#2750).
74
+ // reads as not owed, so a drain with the switch off keeps the idle watch.
60
75
  is_retrospective_owed?: boolean
61
76
  is_finish?: boolean | undefined
62
77
  }
@@ -65,8 +80,7 @@ interface DriveState {
65
80
  // The children this run has in flight — seeded from the open lanes, so a restarted loop resumes them.
66
81
  in_flight: Array<string>
67
82
  // Every child merged, fed back to `backlog:offer` because GitHub closes a merged issue late. A parked
68
- // child is left out: its labels classify it, so one a person released is offered again
69
- // (joshuafolkken/kit#3041).
83
+ // child is left out: its labels classify it, so one a person released is offered again.
70
84
  exclude: Array<string>
71
85
  // When the run last did something, handed to `backlog:budget` as `--active`.
72
86
  active: string
@@ -160,7 +174,7 @@ function merge_stopped(issue: string, state: DriveState): DriveState {
160
174
  return {
161
175
  ...state,
162
176
  is_stopping: true,
163
- stop_reason: `run:merge #${issue} answered stop`,
177
+ stop_reason: `run:merge ${issue_cite.plain(issue)} answered stop`,
164
178
  stopped_by: issue,
165
179
  }
166
180
  }
@@ -181,7 +195,7 @@ function collected_state(
181
195
  active: string,
182
196
  ): DriveState {
183
197
  const in_flight =
184
- collected.token === RESUMED_TOKEN
198
+ collected.token === MERGE_TOKEN.RESUMED
185
199
  ? state.in_flight
186
200
  : state.in_flight.filter((item) => item !== issue)
187
201
  const exclude = excluded(issue, collected.outcome, state)
@@ -200,7 +214,7 @@ async function collect(issue: string, state: DriveState, ports: DrivePorts): Pro
200
214
 
201
215
  const next = collected_state(issue, collected, state, ports.now().toISOString())
202
216
 
203
- return { kind: 'continue', state: token === STOP_VERDICT ? merge_stopped(issue, next) : next }
217
+ return { kind: 'continue', state: token === MERGE_TOKEN.STOP ? merge_stopped(issue, next) : next }
204
218
  }
205
219
 
206
220
  async function collect_finished(state: DriveState, ports: DrivePorts): Promise<PassResult> {
@@ -219,7 +233,7 @@ async function collect_finished(state: DriveState, ports: DrivePorts): Promise<P
219
233
  return { kind: 'continue', state: current }
220
234
  }
221
235
 
222
- // A `lane:open` refused with every lane taken is a wait, not a judgement (joshuafolkken/kit#3027): the
236
+ // A `lane:open` refused with every lane taken is a wait, not a judgement: the
223
237
  // next offer after a lane frees retries it. A step failing after the lane opened is always handed back —
224
238
  // that lane holds the last seat itself, so the free count would read the failure as a full pool.
225
239
  async function refused(
@@ -234,12 +248,12 @@ async function refused(
234
248
  return ended('launch', state, undefined, issue)
235
249
  }
236
250
 
237
- // **No more launches than free lanes** (joshuafolkken/kit#3027). `backlog:offer` lists every ready issue
251
+ // **No more launches than free lanes**. `backlog:offer` lists every ready issue
238
252
  // without reading the lanes, so launching all of them overran `JOSH_LANE_LIMIT` until `lane:open` ran
239
253
  // out of seats. The free count is read once, before the first launch, because every launch here opens
240
254
  // a lane the count would otherwise have to be told about.
241
255
  //
242
- // **Only a launch is activity** (joshuafolkken/kit#3027): a pass that started nothing — every lane taken
256
+ // **Only a launch is activity**: a pass that started nothing — every lane taken
243
257
  // — keeps `active` where it was, or the once-a-minute offer would restart the idle budget for good.
244
258
  function launched(state: DriveState, in_flight: Array<string>, ports: DrivePorts): DriveState {
245
259
  if (in_flight.length === state.in_flight.length) return { ...state, in_flight }
@@ -410,6 +424,7 @@ async function run_loop(
410
424
 
411
425
  const backlog_drive = {
412
426
  HANDOFF_TOKENS,
427
+ TOKEN_HANDLING,
413
428
  initial_state,
414
429
  merge_stopped,
415
430
  run_loop,