@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
@@ -2,45 +2,44 @@ import { agent_argv, type AgentArgv, type AgentArgvResult } from '#scripts/agent
2
2
  import { agent_role_profile, type AgentProfile } from '#scripts/agent/agent-role-profile'
3
3
  import { git_gh_command } from '#scripts/gh/git-gh-command'
4
4
  import type { LabelWrite } from '#scripts/gh/git-gh-issue-write'
5
+ import { issue_cite } from '#scripts/issue/issue-cite'
5
6
  import { IN_PROGRESS_LABEL } from '#scripts/issue/issue-labels'
7
+ import { issue_number_shape } from '#scripts/issue/issue-number-shape'
8
+ import { session_cite } from '#scripts/issue/session-cite'
6
9
  import { telegram_notify } from '#scripts/notify/telegram-notify'
7
10
  import { detached_launch } from '#scripts/run/detached-launch'
8
11
  import { run_event_stream } from '#scripts/run/event/run-event-stream'
9
12
  import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
10
13
  import { run_ending } from '#scripts/run/run-ending'
11
- import { run_issue_number } from '#scripts/run/run-issue-number'
14
+ import { run_label } from '#scripts/run/run-label'
12
15
  import { lane_child_invocation } from './lane-child-invocation'
13
16
  import { lane_child_marker } from './lane-child-marker'
14
17
  import { lane_dispatch_log } from './lane-dispatch-log'
18
+ import { lane_ledger } from './lane-ledger'
15
19
  import { lane_output } from './lane-output'
16
20
  import { lane_registry, type LaneInfo } from './lane-registry'
17
21
  import { lane_resume, type ResumePlan } from './lane-resume'
18
22
  import { openai_lane_supervisor } from './openai-lane-supervisor'
19
23
 
20
- // `josh lane:dispatch <issue-number>` — start a lane's child as an operating-system process of its own
21
- // (joshuafolkken/kit#1749).
24
+ // `josh lane:dispatch <issue-number>` — start a lane's child as an operating-system process of its own.
22
25
  //
23
- // **The premise the session cut rests on was not true, and this is what makes it true.** A delegated
24
- // child used to be an in-process subagent of the parent session, so cutting the parent killed every
25
- // child still implementing: `backlogrun-progress.md` → "The hand-off" says "nothing has to finish, because nothing
26
- // is being abandoned", and what actually happened was that the next session polled a file whose writer
27
- // was dead, waited out the silent-unit window, booked each lane `stopped`, and aborted the whole run on
28
- // the third one. Launched detached, the child survives the cut and the sentence holds as written.
26
+ // **This is what makes the premise the session cut rests on true.** `backlogrun-progress.md` → "The
27
+ // hand-off" says "nothing has to finish, because nothing is being abandoned"; an in-process child
28
+ // would die with the parent it was cut from. Launched detached, the child survives the cut and the
29
+ // sentence holds as written.
29
30
  //
30
31
  // **Nothing here is new machinery.** The lane is already a linked work tree with its own branch and
31
32
  // ports (`lane-open.ts`), the detached launcher is already `run:wake`'s (`detached-launch.ts`), and the
32
33
  // recorded output path is already how a session that never opened a lane polls it (`lane-output.ts`).
33
- // What was missing was the one command that puts the three together.
34
+ // This is the one command that puts the three together.
34
35
  //
35
- // **The recording happens inside the dispatch, so "the lane records no path" stops being a state.**
36
- // `backlogrun.md`'s hand-off has an exception for a lane nobody could poll, and it exists because the
37
- // recording used to be a separate step a run could forget. A lane dispatched through here is recorded
38
- // by the same call that starts it.
36
+ // **The recording happens inside the dispatch, so "the lane records no path" is not a state.** A
37
+ // lane dispatched through here is recorded by the same call that starts it, so no run can forget it.
39
38
 
40
39
  // The invocation the child is given. Composed from this constant and a digits-only issue number, never
41
40
  // from text that was read from anywhere — the same discipline `run-wake-session.ts` applies to the
42
41
  // invocation it rebuilds out of the carry record.
43
- // The resume guide a relaunched child is pointed at (joshuafolkken/kit#2022). It carries the resume
42
+ // The resume guide a relaunched child is pointed at. It carries the resume
44
43
  // procedure a `run:cut` successor follows, so naming it lets the child read one section rather than the
45
44
  // workflow-commands entry documents it would otherwise read to learn it is a resume at all.
46
45
  const NOTE_SEPARATOR = '; '
@@ -60,7 +59,7 @@ interface Dispatched {
60
59
  log_path: string
61
60
  pid: number
62
61
  profile: AgentProfile
63
- // The session id this dispatch resumed, or `undefined` when it started fresh (joshuafolkken/kit#2317).
62
+ // The session id this dispatch resumed, or `undefined` when it started fresh.
64
63
  // `describe` reports which path was taken, so an `outage` re-dispatch says whether it recovered the
65
64
  // disconnected child's context or fell back to a fresh run.
66
65
  resumed_from: string | undefined
@@ -110,14 +109,13 @@ function child_invocation(issue: string): string {
110
109
 
111
110
  /**
112
111
  * The prompt a relaunched child is given after a `run:cut` — a resume-specific instruction followed by
113
- * the bare `child_invocation` (joshuafolkken/kit#2022). A relaunched child used to be given the plain
114
- * `fullrun #<N>`, so it read the workflow-commands entry documents (SKILL.md, fullrun.md, ~29k tokens)
115
- * every resume before it could learn it was a resume at all — the "do not re-read" exception lives
116
- * inside the very skill it had to open. This preamble tells it up front, so it goes straight to
117
- * `run:cut --resume` and the stage that answers.
112
+ * the bare `child_invocation`. Given the plain `fullrun #<N>`, a relaunched child would read the
113
+ * workflow-commands entry documents every resume before it could learn it was a resume at all — the
114
+ * "do not re-read" exception lives inside the very skill it would have to open. This preamble tells
115
+ * it up front, so it goes straight to `run:cut --resume` and the stage that answers.
118
116
  *
119
117
  * **It ends with `child_invocation` on purpose, not as decoration.** The parent's liveness poll is
120
- * `pgrep -laf "<child_invocation>$"` (built at dispatch — see `log_sentence`), so a relaunched process
118
+ * `lane_child_invocation.process_pattern` (read by `run:liveness` — see `log_sentence`), so a relaunched process
121
119
  * whose command line did not end with `fullrun #<N>` would be booked stopped while it ran. The trailing
122
120
  * invocation keeps that poll matching and is also the ordinary run a `fresh` verdict falls back to.
123
121
  */
@@ -171,7 +169,7 @@ function failed_start(
171
169
 
172
170
  // The `dispatched` outcome, built from the request the launch was composed from — one place so the
173
171
  // three launch paths cannot drift on which fields a dispatched child carries (the resume flag among
174
- // them, joshuafolkken/kit#2317). The request's `argv` rides along harmlessly, as it did before.
172
+ // them). The request's `argv` rides along harmlessly.
175
173
  // **`kind` is written last on purpose**: the request was spread from a `Prepared`, so it still carries
176
174
  // `kind: 'prepared'` at runtime, and letting the spread win would mislabel the outcome.
177
175
  function dispatched_of(
@@ -190,7 +188,7 @@ function existing_dispatch(request: StartRequest): DispatchOutcome | undefined {
190
188
  if (!openai_lane_supervisor.approve(request.lane.directory, active.nonce)) {
191
189
  return failed_start(
192
190
  request,
193
- `the OpenAI supervisor for lane #${request.lane.issue} was cancelled`,
191
+ `the OpenAI supervisor for lane ${session_cite.issue(request.lane.issue)} was cancelled`,
194
192
  [],
195
193
  )
196
194
  }
@@ -216,13 +214,17 @@ async function openai_dispatched_start(
216
214
  if (owner?.issue !== lane.issue) {
217
215
  if (nonce !== undefined) openai_lane_supervisor.cancel(lane.directory, nonce)
218
216
 
219
- return failed_start(request, `the OpenAI supervisor did not claim lane #${lane.issue}`, notes)
217
+ return failed_start(
218
+ request,
219
+ `the OpenAI supervisor did not claim lane ${session_cite.issue(lane.issue)}`,
220
+ notes,
221
+ )
220
222
  }
221
223
 
222
224
  if (!openai_lane_supervisor.approve(lane.directory, owner.nonce)) {
223
225
  return failed_start(
224
226
  request,
225
- `the OpenAI supervisor for lane #${lane.issue} was cancelled`,
227
+ `the OpenAI supervisor for lane ${session_cite.issue(lane.issue)} was cancelled`,
226
228
  notes,
227
229
  )
228
230
  }
@@ -267,7 +269,7 @@ async function started(request: StartRequest): Promise<DispatchOutcome> {
267
269
 
268
270
  // Build the argv the plan calls for: a resume carries the stored session id, a fresh start does not.
269
271
  // Both run the same profile diagnostics under the already-resolved profile, so a resume is refused for
270
- // exactly the reasons a fresh dispatch is (joshuafolkken/kit#2317).
272
+ // exactly the reasons a fresh dispatch is.
271
273
  function built_for(plan: ResumePlan, profile: AgentProfile, lane: LaneInfo): AgentArgvResult {
272
274
  if (plan.kind === 'resume') {
273
275
  return agent_argv.with_resume_in(plan.invocation, profile, plan.session_id, lane.directory)
@@ -276,7 +278,7 @@ function built_for(plan: ResumePlan, profile: AgentProfile, lane: LaneInfo): Age
276
278
  return agent_argv.with_profile_in(plan.invocation, profile, lane.directory)
277
279
  }
278
280
 
279
- // **The re-dispatch decides resume-or-fresh from the lane's own exit record** (joshuafolkken/kit#2317).
281
+ // **The re-dispatch decides resume-or-fresh from the lane's own exit record**.
280
282
  // The record is read from the log the previous dispatch of this lane wrote — a first dispatch finds
281
283
  // none and starts fresh, an `outage` ending with a session id resumes it. The provider is resolved
282
284
  // first because the resume mechanism is Claude Code's, and an OpenAI lane falls back to fresh.
@@ -304,30 +306,33 @@ function prepared(lane: LaneInfo): Prepared {
304
306
  // **The parent claims the marker before it starts the child**, so the window in which a running child
305
307
  // is uncounted closes at dispatch rather than tens of minutes later once the child's own `fullrun` gets
306
308
  // to its (idempotent) apply. `issue_add_label` creates the label if the repository lacks it — a
307
- // `POST /issues/{N}/labels` provisions a missing label with a generated color (measured on
308
- // joshuafolkken/kit#1026, `git-gh-issue-write.ts`) — so no separate `label_ensure` is needed here, and
309
+ // `POST /issues/{N}/labels` provisions a missing label with a generated color
310
+ // (`git-gh-issue-write.ts`) — so no separate `label_ensure` is needed here, and
309
311
  // its unapplied answer is a real refusal to launch rather than a note — confirmed by a read-back, so
310
- // a write that landed but answered with an error still launches (joshuafolkken/kit#3312).
312
+ // a write that landed but answered with an error still launches.
311
313
  async function mark_in_progress(issue: string): Promise<LabelWrite> {
312
314
  return await git_gh_command.issue_apply_label(issue, IN_PROGRESS_LABEL)
313
315
  }
314
316
 
315
- // The dispatch owns both halves of the marker: it applied it, so a launch that never started takes it
316
- // back off, leaving no `in-progress` on an issue nothing is running. A removal that itself fails is
317
- // swallowed — the failed launch is already warned about, and `lane:list` / `run:progress` surface a
318
- // stuck marker — so this never turns a launch failure into a thrown error.
319
- async function unmark_in_progress(issue: string): Promise<void> {
320
- try {
321
- await git_gh_command.issue_remove_label(issue, IN_PROGRESS_LABEL)
322
- } catch {
323
- /* the launch already failed and is warned about; a stuck marker is reported by lane:list */
324
- }
325
- }
326
-
327
317
  // A started child is recorded on the run's stream, which is where the stall detector ages the last
328
- // dispatch from (joshuafolkken/kit#2464) — unrecorded, every stall read "hours since the last dispatch"
318
+ // dispatch from — unrecorded, every stall read "hours since the last dispatch"
329
319
  // minutes after a launch. A failed start records nothing: no child is running. The marker is claimed
330
320
  // first, so a refused one starts nothing.
321
+ //
322
+ // The dispatch owns both halves of the marker: it applied it, so a launch that never started takes it
323
+ // back off through `run_label.unmark`, leaving no `in-progress` on an issue nothing is running. That
324
+ // removal warns and never throws, so it cannot turn a launch failure into a thrown error.
325
+ //
326
+ // The lane ledger takes the same instant: `lane:stats` times a lane's implementation from it, and the
327
+ // stream is capped, so a period's earlier dispatches would be gone from there.
328
+ async function record_started(issue: string): Promise<void> {
329
+ await run_event_stream_emit.emit(
330
+ run_event_stream.EVENT_KIND.CHILD_LAUNCH,
331
+ `${issue_cite.plain(issue)} dispatched`,
332
+ )
333
+ await lane_ledger.record_dispatch(Number(issue))
334
+ }
335
+
331
336
  async function finish_dispatch(issue: string, request: StartRequest): Promise<DispatchOutcome> {
332
337
  const mark = await mark_in_progress(issue)
333
338
 
@@ -336,16 +341,14 @@ async function finish_dispatch(issue: string, request: StartRequest): Promise<Di
336
341
 
337
342
  const is_failed = outcome.kind === 'failed'
338
343
 
339
- await (is_failed
340
- ? unmark_in_progress(issue)
341
- : run_event_stream_emit.emit(run_event_stream.EVENT_KIND.CHILD_LAUNCH, `#${issue} dispatched`))
344
+ await (is_failed ? run_label.unmark(issue) : record_started(issue))
342
345
 
343
346
  return outcome
344
347
  }
345
348
 
346
349
  /** Start `fullrun #<N>` detached in the lane for `#<N>`, recording where it writes as it does so. */
347
350
  async function dispatch_child(issue: string): Promise<DispatchOutcome> {
348
- run_issue_number.require_issue_number(issue)
351
+ issue_number_shape.require_issue_number(issue)
349
352
 
350
353
  const lane = await lane_registry.find_open_lane(issue)
351
354
 
@@ -366,25 +369,11 @@ async function dispatch_child(issue: string): Promise<DispatchOutcome> {
366
369
  // The child is running — saying otherwise would send the caller to dispatch a second one into the same
367
370
  // lane — but its output is going nowhere, so a message naming the path would point at a file that will
368
371
  // never grow, and a poll of that file would book a working child as stopped.
369
- // The liveness pattern the parent polls with — the shared one, which also finds a detached ship
370
- // supervisor (joshuafolkken/kit#2428). `describe` never throws, so an issue that is not a number falls
371
- // back to the launched invocation rather than raising from the validator.
372
- function poll_pattern(outcome: Dispatched, issue: string): string {
373
- if (!run_issue_number.ISSUE_NUMBER_PATTERN.test(issue)) return `${outcome.invocation}$`
374
-
375
- return lane_child_invocation.process_pattern(issue)
376
- }
377
-
378
372
  function log_sentence(outcome: Dispatched, issue: string): string {
379
- // **The pattern matches the child's own command line, not the lane it runs in**
380
- // (joshuafolkken/kit#1948). The child is `claude … ${outcome.invocation}` and its argv carries no
381
- // path, so `pgrep -laf <lane directory>` found nothing for a living child and a poll booked it
382
- // stopped. The invocation is the last argument, so it sits at the end of the command line; the `$`
383
- // anchor is what keeps `fullrun #12` from matching a running `fullrun #123`. `run:liveness` takes
384
- // `--process` as what the caller *saw*, never as a property of the child's kind — told to pass
385
- // `alive`, a parent that never ran `pgrep` would answer `alive` for a child that crashed an hour ago
386
- // and poll it for ever.
387
- const poll = `run \`pgrep -laf "${poll_pattern(outcome, issue)}"\` and pass what it found to \`pnpm josh run:liveness ${issue} --output ${outcome.log_path} --process alive\` — or \`--process none\` where it found nothing`
373
+ // **`run:liveness` reads the child's process for itself**, with the shared
374
+ // pattern that matches the child's own command line and a detached ship supervisor, so no parent
375
+ // passes `alive` by hand for a child that crashed an hour ago.
376
+ const poll = `run \`pnpm josh run:liveness ${issue} --output ${outcome.log_path}\` — it reads the child's process for itself`
388
377
 
389
378
  if (outcome.notes.length > 0) {
390
379
  return ` Its output is NOT being kept — ${outcome.notes.join(NOTE_SEPARATOR)} — so ${outcome.log_path} will not grow and the process trace is the only answer: ${poll}.`
@@ -394,7 +383,7 @@ function log_sentence(outcome: Dispatched, issue: string): string {
394
383
  }
395
384
 
396
385
  // Whether this dispatch resumed the disconnected child's session or started fresh — the report the
397
- // `outage` re-dispatch owes (joshuafolkken/kit#2317). A fresh start says so too, so the absence of a
386
+ // `outage` re-dispatch owes. A fresh start says so too, so the absence of a
398
387
  // resume is never silent when an outage record was present.
399
388
  function resume_sentence(outcome: Dispatched): string {
400
389
  if (outcome.resumed_from === undefined) {
@@ -408,20 +397,20 @@ function resume_sentence(outcome: Dispatched): string {
408
397
  // message the warning exists to carry — the pid among it, with the child already running.
409
398
  function describe(outcome: DispatchOutcome, issue: string): string {
410
399
  if (outcome.kind === 'no-lane') {
411
- return `No lane is open for #${issue}. Run \`pnpm josh lane:open ${issue}\` first, then dispatch into it.`
400
+ return `No lane is open for ${session_cite.issue(issue)}. Run \`pnpm josh lane:open ${issue}\` first, then dispatch into it.`
412
401
  }
413
402
 
414
403
  if (outcome.kind === 'unrecordable') return outcome.reason
415
404
 
416
405
  if (outcome.kind === LABEL_UNSET_KIND) {
417
- return `The child for #${issue} was not started: the \`${IN_PROGRESS_LABEL}\` label could not be applied (${outcome.reason}), so the lane would be counted as empty. Nothing was launched.`
406
+ return `The child for ${session_cite.issue(issue)} was not started: the \`${IN_PROGRESS_LABEL}\` label could not be applied (${outcome.reason}), so the lane would be counted as empty. Nothing was launched.`
418
407
  }
419
408
 
420
409
  if (outcome.kind === 'failed') {
421
- return `The child for #${issue} did not start: ${outcome.note}. Its log is at ${outcome.log_path}.`
410
+ return `The child for ${session_cite.issue(issue)} did not start: ${outcome.note}.${agent_role_profile.default_notice()} Its log is at ${outcome.log_path}.`
422
411
  }
423
412
 
424
- return `Dispatched \`${outcome.invocation}\` as process ${String(outcome.pid)} in ${outcome.lane.directory} with ${agent_role_profile.describe(outcome.profile)}.${resume_sentence(outcome)}${log_sentence(outcome, issue)}`
413
+ return `Dispatched \`${outcome.invocation}\` as process ${String(outcome.pid)} in ${outcome.lane.directory} with ${agent_role_profile.describe(outcome.profile)}.${agent_role_profile.default_notice()}${resume_sentence(outcome)}${log_sentence(outcome, issue)}`
425
414
  }
426
415
 
427
416
  /**
@@ -441,7 +430,7 @@ function is_worth_warning(outcome: DispatchOutcome): boolean {
441
430
  // own failures to standard error and never throws, so this cannot turn a refusal into an exception.
442
431
  async function warn_of_problem(outcome: DispatchOutcome, issue: string): Promise<void> {
443
432
  await telegram_notify.warn({
444
- issue_title: `${WARNING_TITLE} #${issue}`,
433
+ issue_title: `${WARNING_TITLE} ${issue_cite.plain(issue)}`,
445
434
  body: describe(outcome, issue),
446
435
  recovery: WARNING_RECOVERY,
447
436
  })
@@ -1,7 +1,7 @@
1
1
  import { LANE_SEAT_KEY, PORT_SEED_KEY, ports } from '#ports'
2
2
  import { agent_role_profile, type AgentProfile } from '#scripts/agent/agent-role-profile'
3
3
 
4
- // The lane's `.env`, built from the root's (joshuafolkken/kit#1490, joshuafolkken/kit#1494).
4
+ // The lane's `.env`, built from the root's.
5
5
  //
6
6
  // **Port separation is required here, not optional.** `ports/index.js` resolves the project root as
7
7
  // the nearest ancestor holding a `package.json` — which, inside a linked work tree, is the lane's
@@ -9,8 +9,8 @@ import { agent_role_profile, type AgentProfile } from '#scripts/agent/agent-role
9
9
  // root's runs on the root's exact offset; either way every lane lands on one pair of ports, and a
10
10
  // busy port fails without retrying on another. At the default six lanes that turns E2E from "fails
11
11
  // sometimes" into "fails nearly always". So the lane's `.env` keeps the project's `PORT_SEED`
12
- // unchanged and adds `JOSH_LANE_SEAT`, and `ports/index.js` combines them as `seed × 10 + seat`
13
- // (joshuafolkken/kit#1494): the file plainly shows which number is the project's and which is the
12
+ // unchanged and adds `JOSH_LANE_SEAT`, and `ports/index.js` combines them as `seed × 10 + seat`:
13
+ // the file plainly shows which number is the project's and which is the
14
14
  // seat, and the multiplication that separates the bands lives in one place rather than here.
15
15
  //
16
16
  // **Everything else in the file is carried across verbatim**, comments and blank lines included:
@@ -18,7 +18,7 @@ import { agent_role_profile, type AgentProfile } from '#scripts/agent/agent-role
18
18
  // are as necessary inside a lane as outside one, and a lane that had to have them re-entered would
19
19
  // not be a place a run could start unattended.
20
20
 
21
- // Where the delegated unit running this lane's child writes (joshuafolkken/kit#1713). It goes in the
21
+ // Where the delegated unit running this lane's child writes. It goes in the
22
22
  // lane's own `.env` — the store `lane-registry.ts` already reads — rather than in a ledger beside the
23
23
  // trees, so `git worktree remove` erases the record along with the lane it described and there is
24
24
  // nothing left to go stale. `.env` is gitignored in kit and in every consumer `josh sync` reaches,
@@ -149,7 +149,7 @@ function read_lane_ports(content: string): { development: number; preview: numbe
149
149
  /**
150
150
  * The output path a lane's `.env` records, or `undefined` where it records none.
151
151
  *
152
- * **A blank assignment is `undefined` rather than an empty path** (joshuafolkken/kit#1713). A lane
152
+ * **A blank assignment is `undefined` rather than an empty path**. A lane
153
153
  * whose record was cleared has nothing to poll, and an empty string handed to
154
154
  * `pnpm josh run:liveness --output` is a relative path — refused by its own root check, so the
155
155
  * child would come back `undetermined` for ever rather than saying the record is missing.
@@ -1,35 +1,21 @@
1
1
  import { lane_child_marker, type MarkerSource } from './lane-child-marker'
2
2
 
3
3
  // How each `PreToolUse` guard behaves in a dispatched lane child, as an enumeration rather than a
4
- // judgement (joshuafolkken/kit#2138, joshuafolkken/kit#2164).
4
+ // judgement.
5
5
  //
6
6
  // **The three guards were built for the interactive main line, where a refusal is guidance.** A denial
7
7
  // rewrites the next move of a person's session. A dispatched lane child is a headless `claude -p`
8
- // process, so a *denial* ends the conversation with nothing committed — joshuafolkken/kit#2138 measured
9
- // a child killed before its commit by two investigation refusals and one batching refusal, every one of
10
- // them a read of a file the child was about to edit. So a guard whose correction is a denial cannot fire
11
- // as one in a child.
8
+ // process, so a *denial* ends the conversation with nothing committed. So a guard whose correction is a
9
+ // denial cannot fire as one in a child.
12
10
  //
13
- // **But a denial is not the only way a guard can speak, and that is what kit#2164 tried.** A guard can
14
- // also raise a *notice* — a non-blocking `additionalContext` that carries the same guidance without a
15
- // `permissionDecision`, so the turn is never ended. kit#2164 downgraded the batching guard to a notice
16
- // in the child for exactly that reason. So the choice is three-valued, not two:
11
+ // **But a denial is not the only way a guard can speak.** A guard can also raise a *notice* — a
12
+ // non-blocking `additionalContext` that carries the same guidance without a `permissionDecision`, so the
13
+ // turn is never ended. So the choice is three-valued, not two:
17
14
  //
18
15
  // - `refuse` — deny the call (the main-line default; the child keeps this for the safety rules).
19
16
  // - `notice` — let the call through but attach the guidance, so a headless child is nudged, not killed.
20
17
  // - `off` — say nothing at all, for a guard whose remedy the child cannot carry out.
21
18
  //
22
- // **The notice did not move the number, kit#2178 took it off, and kit#2276 restores it changed.** The
23
- // lane child that ran right after kit#2164 merged came in at 1.00 calls per turn on both sides of the
24
- // first notice (transcript `f39efeb5`), so kit#2178 turned the batching notice `off` in the child rather
25
- // than pay the per-turn context cost of guidance measured not to work. But with it off, the notice fired
26
- // **zero** times across the 2026-09-21 backlogrun the density was next measured on, so the 1.147 read
27
- // there is the rate with no guidance at all — not a second measurement of the notice failing. kit#2276
28
- // therefore restores it as `notice`, with the two things #2164's lacked: it names the concrete recent
29
- // calls the run issued one-per-turn, and it recurs every single-call turn rather than every three. The
30
- // mode stays a genuine experiment — the density is re-measured on the next backlogrun, and a notice that
31
- // still does not move it is redesigned rather than kept.
32
- //
33
19
  // **It is an enumeration and not a judgement, for the reason `delegation-policy.ts` is one.** "This
34
20
  // guard's mode in a child" is a call made under the same pressure that produced the misfire. The list is
35
21
  // the whole of it, and a guard nobody classified refuses — the safe direction, since a wrongly-silenced
@@ -37,7 +23,7 @@ import { lane_child_marker, type MarkerSource } from './lane-child-marker'
37
23
  // survived once. `lane-guard-policy.test.ts` pins that the enumeration and the guards' live behavior
38
24
  // cannot disagree.
39
25
 
40
- // The three ways a guard may behave in a lane child (joshuafolkken/kit#2164). Outside a lane child every
26
+ // The three ways a guard may behave in a lane child. Outside a lane child every
41
27
  // guard is `refuse`, which is why that is also the fail-safe default below.
42
28
  type LaneGuardMode = 'refuse' | 'notice' | 'off'
43
29
  type LaneGuardId = 'investigation' | 'batching' | 'rule' | 'duplicate-read'
@@ -2,12 +2,12 @@ import { git_common_directory } from '#scripts/git/git-common-directory'
2
2
  import { run_ship_detach } from '#scripts/run/ship/run-ship-detach'
3
3
  import { lane_child_marker, type MarkerSource } from './lane-child-marker'
4
4
 
5
- // Whether a lane has handed its post-implementation region to the detached ship (joshuafolkken/kit#2962).
5
+ // Whether a lane has handed its post-implementation region to the detached ship.
6
6
  //
7
7
  // **A child that ran `pnpm josh ship --detach` waits on nobody when it ends.** The supervisor drives the
8
8
  // gate, the review and the merge, and notifies on its own outcome, so the `Stop` hook's demand for a
9
9
  // `confirmation` notify and `lane-park`'s refusal of that notify only bought a "nothing needed"
10
- // Telegram and a wasted turn — measured on 2026-10-02 as 43 demands, 21 refusals and ~94 extra turns.
10
+ // Telegram and a wasted turn.
11
11
  // Both hooks read this one predicate, so they cannot disagree about whether the lane was handed off.
12
12
  //
13
13
  // **Running, never merely recorded.** A ship that failed hands its region back to the child, whose
@@ -3,7 +3,7 @@ import path from 'node:path'
3
3
  import { buffered_process } from '#scripts/lib/buffered-process'
4
4
  import { INSTALL_TIMEOUT_MS } from '#scripts/lib/timeouts'
5
5
 
6
- // Filling the lane, which is the other half of opening one (joshuafolkken/kit#1554).
6
+ // Filling the lane, which is the other half of opening one.
7
7
  //
8
8
  // **A work tree with no `node_modules` is not a lane yet.** A linked work tree starts as a checkout
9
9
  // and nothing else, and the lane root is a hidden *sibling* of the repository, so nothing above it
@@ -19,7 +19,7 @@ import { INSTALL_TIMEOUT_MS } from '#scripts/lib/timeouts'
19
19
  // The child is spawned through `buffered_process` rather than through `execa` here. What this needs
20
20
  // is exactly that module's contract — output buffered rather than inherited, a non-zero exit
21
21
  // reported rather than thrown, and a bound on how long the child may hang — and a second copy of it
22
- // is how a fix to one missed the other before (joshuafolkken/kit#914).
22
+ // is how a fix to one missed the other before.
23
23
 
24
24
  // `--frozen-lockfile` because a lane is cut from `refs/remotes/origin/<default>` and has to build
25
25
  // exactly the lock committed there. A lock the install would rather rewrite is a finding, not
@@ -27,8 +27,8 @@ import { INSTALL_TIMEOUT_MS } from '#scripts/lib/timeouts'
27
27
  const INSTALL_ARGUMENTS = ['install', '--frozen-lockfile']
28
28
  // The manifest whose absence is the whole skip condition. A lane cut from a repository that has no
29
29
  // `package.json` has nothing to install, so running `pnpm install` there could only fail on a
30
- // manifest that was never there — which is exactly the fixture a cross-process lane test needs
31
- // (joshuafolkken/kit#2148). The condition is strictly "the file does not exist": a manifest that is
30
+ // manifest that was never there — which is exactly the fixture a cross-process lane test needs.
31
+ // The condition is strictly "the file does not exist": a manifest that is
32
32
  // present but unreadable or broken still runs the install and still fails as before, so a genuinely
33
33
  // broken repository is never passed silently.
34
34
  const MANIFEST_FILE_NAME = 'package.json'
@@ -46,10 +46,9 @@ interface InstallResult {
46
46
 
47
47
  // A lane with no manifest has nothing to install, so the install is skipped rather than run — the
48
48
  // seam a cross-process lane test needs, and a root-cause fix rather than a switch, because running
49
- // an install with no install target was the defect (joshuafolkken/kit#2148). The condition is
50
- // strictly the file's absence: `existsSync` answers only whether the path is there, never whether
51
- // its contents parse, so a present-but-broken manifest falls through to the real install and fails
52
- // exactly as before.
49
+ // an install with no install target is the defect. The condition is strictly the file's absence:
50
+ // `existsSync` answers only whether the path is there, never whether its contents parse, so a
51
+ // present-but-broken manifest falls through to the real install and fails there.
53
52
  function has_manifest(directory: string): boolean {
54
53
  return existsSync(path.join(directory, MANIFEST_FILE_NAME))
55
54
  }
@@ -58,12 +57,12 @@ function has_manifest(directory: string): boolean {
58
57
  * Install the lane's dependencies, and report whether it worked rather than throwing.
59
58
  *
60
59
  * **A lane with no `package.json` skips the install** — there is nothing to install, so the reported
61
- * state is installed rather than failed, and no child is spawned (joshuafolkken/kit#2148). This is
60
+ * state is installed rather than failed, and no child is spawned. This is
62
61
  * the only seam: the production call path, its arguments and its environment are all unchanged.
63
62
  *
64
63
  * **The verdict is the exit code and only the exit code.** `pnpm install` runs `prepare`, which runs
65
64
  * the lefthook installer, and in a linked work tree the hooks are shared with the primary repository
66
- * — so a warning from it is expected and correct (joshuafolkken/kit#1503, #1507). Reading the child's
65
+ * — so a warning from it is expected and correct. Reading the child's
67
66
  * text for a word like "failed" would turn that correct warning into a refusal to open a lane.
68
67
  */
69
68
  async function install_dependencies(directory: string): Promise<InstallResult> {
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env tsx
2
2
  import { fileURLToPath } from 'node:url'
3
+ import { issue_number_shape } from '#scripts/issue/issue-number-shape'
3
4
  import { josh_command } from '#scripts/josh/josh-run'
4
5
  import { lane_registry, type LaneInfo } from '#scripts/lane/lane-registry'
5
6
  import { lane_vacant } from '#scripts/lane/lane-vacant'
@@ -8,7 +9,7 @@ import { INSTALL_TIMEOUT_MS } from '#scripts/lib/timeouts'
8
9
  import { execa } from 'execa'
9
10
 
10
11
  // `josh lane:launch <issue> [--stash <message>]` — one composite command for a `backlogrun` lane-start
11
- // event (joshuafolkken/kit#2162). Opening one lane was four to six turns of the parent: `lane:open`,
12
+ // event. Opening one lane was four to six turns of the parent: `lane:open`,
12
13
  // then — only the first lane, and only when `josh latest` had stashed — `stash:pop` and a re-install,
13
14
  // then `lane:dispatch`. This collapses them into one call that returns the child's pid, or a refusal,
14
15
  // the same shape `lane:dispatch` alone has.
@@ -24,7 +25,6 @@ const SUCCESS_EXIT_CODE = 0
24
25
  const FAILURE_EXIT_CODE = 1
25
26
  const should_forward_stderr = true
26
27
  const PNPM = 'pnpm'
27
- const ISSUE_PATTERN = /^[1-9]\d*$/u
28
28
 
29
29
  const USAGE = 'Usage: josh lane:launch <issue-number> [--stash <message>]'
30
30
 
@@ -44,7 +44,13 @@ function read_context(argv: ReadonlyArray<string>): LaunchContext | undefined {
44
44
 
45
45
  const [issue, ...rest] = parsed.positionals
46
46
 
47
- if (issue === undefined || rest.length > 0 || !ISSUE_PATTERN.test(issue)) return undefined
47
+ if (
48
+ issue === undefined ||
49
+ rest.length > 0 ||
50
+ !issue_number_shape.ISSUE_NUMBER_PATTERN.test(issue)
51
+ ) {
52
+ return undefined
53
+ }
48
54
 
49
55
  return { issue, stash: parsed.values.stash }
50
56
  }
@@ -82,8 +88,7 @@ async function prepare(stash: string | undefined, directory: string): Promise<bo
82
88
  }
83
89
 
84
90
  // Where the chain ended. `unopened` is a `lane:open` refusal — no lane was taken; `failed` is a step
85
- // after it, which leaves the opened lane holding a seat, so a caller cannot read the two alike
86
- // (joshuafolkken/kit#3027).
91
+ // after it, which leaves the opened lane holding a seat, so a caller cannot read the two alike.
87
92
  type LaunchOutcome = { kind: 'launched'; pid: string } | { kind: 'unopened' } | { kind: 'failed' }
88
93
 
89
94
  const UNOPENED: LaunchOutcome = { kind: 'unopened' }
@@ -95,7 +100,7 @@ async function close_if_vacant(lane: LaneInfo | undefined): Promise<void> {
95
100
  await josh_command.josh_run(['lane:close', lane.issue], should_forward_stderr)
96
101
  }
97
102
 
98
- // **A lane a park kept open is resumed, not reopened** (joshuafolkken/kit#3228). A child parked before
103
+ // **A lane a park kept open is resumed, not reopened**. A child parked before
99
104
  // its commit leaves its uncommitted work in its lane, and `lane:open` refuses that lane as
100
105
  // `already-open` — so the released child is dispatched into the kept tree instead. **Only a lane a
101
106
  // child was already dispatched into counts as kept**: `lane:dispatch` records the child's output in the
@@ -103,7 +108,7 @@ async function close_if_vacant(lane: LaneInfo | undefined): Promise<void> {
103
108
  // `lane:open` and its refusal. So does a stranded lane, whose `.env` is gone with its tree.
104
109
  //
105
110
  // **A lane no child was dispatched into and that holds nothing is closed and opened afresh**
106
- // (joshuafolkken/kit#3289) — a run cut between the open and the dispatch leaves one. It is reopened
111
+ // — a run cut between the open and the dispatch leaves one. It is reopened
107
112
  // rather than reused because nothing recorded whether its install finished. A lane with work or a live
108
113
  // process in it still meets `lane:open`'s refusal.
109
114
  async function lane_directory(issue: string): Promise<string | undefined> {
@@ -119,7 +124,7 @@ async function lane_directory(issue: string): Promise<string | undefined> {
119
124
  }
120
125
 
121
126
  // The launch chain in-process. The CLI prints the pid; `backlog:drive` launches through this same
122
- // chain (joshuafolkken/kit#2508).
127
+ // chain.
123
128
  async function launch_lane(context: LaunchContext): Promise<LaunchOutcome> {
124
129
  const directory = await lane_directory(context.issue)
125
130