@joshuafolkken/kit 1.1240.0 → 1.1373.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (934) hide show
  1. package/.claude/agents/investigator.md +1 -0
  2. package/.claude/settings.json +4 -0
  3. package/.claude/skills/dependency-update/SKILL.md +5 -3
  4. package/.claude/skills/epic-commands/SKILL.md +82 -113
  5. package/.claude/skills/epic-commands/epic-bundle.md +38 -63
  6. package/.claude/skills/epic-commands/execution-waves.md +30 -51
  7. package/.claude/skills/verify-ui/SKILL.md +13 -20
  8. package/.claude/skills/workflow-commands/SKILL.md +10 -10
  9. package/.claude/skills/workflow-commands/background-commands.md +4 -4
  10. package/.claude/skills/workflow-commands/backlogrun-child.md +30 -105
  11. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +29 -0
  12. package/.claude/skills/workflow-commands/backlogrun-lanes.md +45 -131
  13. package/.claude/skills/workflow-commands/backlogrun-park.md +36 -53
  14. package/.claude/skills/workflow-commands/backlogrun-progress.md +81 -331
  15. package/.claude/skills/workflow-commands/backlogrun-recovery.md +29 -83
  16. package/.claude/skills/workflow-commands/backlogrun-steps.md +105 -424
  17. package/.claude/skills/workflow-commands/backlogrun.md +52 -61
  18. package/.claude/skills/workflow-commands/chain-rule.md +36 -40
  19. package/.claude/skills/workflow-commands/entry-sequence.md +6 -6
  20. package/.claude/skills/workflow-commands/followup.md +19 -20
  21. package/.claude/skills/workflow-commands/fullrun-steps.md +23 -27
  22. package/.claude/skills/workflow-commands/fullrun.md +10 -10
  23. package/.claude/skills/workflow-commands/halfrun.md +9 -8
  24. package/.claude/skills/workflow-commands/into-target.md +12 -18
  25. package/.claude/skills/workflow-commands/issue-comments.md +11 -26
  26. package/.claude/skills/workflow-commands/kickoff.md +26 -16
  27. package/.claude/skills/workflow-commands/latest-gate.md +17 -28
  28. package/.claude/skills/workflow-commands/needs-human-review.md +13 -24
  29. package/.claude/skills/workflow-commands/observation-filing.md +37 -28
  30. package/.claude/skills/workflow-commands/observation-ledger.md +48 -38
  31. package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -9
  32. package/.claude/skills/workflow-commands/prerequisite.md +23 -15
  33. package/.claude/skills/workflow-commands/progress-watcher.md +17 -11
  34. package/.claude/skills/workflow-commands/prrun.md +3 -3
  35. package/.claude/skills/workflow-commands/retrospective.md +13 -18
  36. package/.claude/skills/workflow-commands/split-assessment.md +6 -4
  37. package/.claude/skills/workflow-commands/target-repository.md +25 -28
  38. package/.claude/skills/workflow-commands/working-tree-hold.md +11 -17
  39. package/.gitattributes +2 -1
  40. package/.github/workflows/ci.yml +14 -0
  41. package/.vscode/tasks.json +14 -0
  42. package/CLAUDE.md +10 -61
  43. package/README.md +23 -66
  44. package/SECURITY.md +1 -1
  45. package/dist/CLAUDE.md +10 -61
  46. package/dist/commands/document-section-cli.js +43 -11
  47. package/dist/config-merge/index.js +11 -2
  48. package/dist/hooks/audit-provision.js +2 -2
  49. package/dist/hooks/batch-guard.js +7 -7
  50. package/dist/hooks/{chunk-KHGB5S3Y.js → chunk-7UBFU3CL.js} +18 -20
  51. package/dist/hooks/{chunk-ZQGD4GBY.js → chunk-7WKYHEGU.js} +8 -44
  52. package/dist/hooks/{chunk-4TZVB44A.js → chunk-AKGCP4LX.js} +285 -363
  53. package/dist/hooks/{chunk-QVSWU24O.js → chunk-BZMPVFDY.js} +7 -5
  54. package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
  55. package/dist/hooks/{chunk-GPTFMK5E.js → chunk-GG72ANKI.js} +1 -1
  56. package/dist/hooks/{chunk-XZYKEM6J.js → chunk-JCRDBQXB.js} +13 -11
  57. package/dist/hooks/{chunk-F3ELQ2AF.js → chunk-JGW24KKM.js} +4 -4
  58. package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
  59. package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
  60. package/dist/hooks/{chunk-WK2XSHSI.js → chunk-SLSFIWTX.js} +550 -875
  61. package/dist/hooks/chunk-UTHMB4O2.js +1590 -0
  62. package/dist/hooks/{chunk-KRBERBBI.js → chunk-V4TKZHER.js} +4 -4
  63. package/dist/hooks/chunk-YLBBSSTF.js +3705 -0
  64. package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
  65. package/dist/hooks/codex-hook-adapter.js +26 -21
  66. package/dist/hooks/duplicate-read-guard.js +8 -8
  67. package/dist/hooks/format-edited.js +4 -4
  68. package/dist/hooks/inputs.json +195 -181
  69. package/dist/hooks/investigation-guard.js +8 -8
  70. package/dist/hooks/pretool-guard.js +15 -15
  71. package/dist/hooks/session-lang.js +406 -8
  72. package/dist/hooks/stop-guard.js +122 -187
  73. package/dist/josh.js +282 -95
  74. package/dist/version/index.js +15 -13
  75. package/eslint/base.js +43 -5
  76. package/eslint/rules/english-only-prose.js +3 -3
  77. package/eslint/rules/import.js +12 -0
  78. package/eslint/rules/namespace-object-export.js +2 -2
  79. package/package.json +17 -11
  80. package/pnpm-workspace.yaml +2 -4
  81. package/prompts/coding-standards.md +14 -48
  82. package/prompts/collaboration-workflow/file-edits.md +1 -1
  83. package/prompts/collaboration-workflow/issue-citation.md +1 -1
  84. package/prompts/collaboration-workflow/issue-template.md +3 -10
  85. package/prompts/collaboration-workflow/operating-rules.md +7 -8
  86. package/prompts/collaboration-workflow/output-bounds.md +1 -1
  87. package/prompts/collaboration-workflow/overview.md +1 -1
  88. package/prompts/collaboration-workflow/plan-comment.md +2 -1
  89. package/prompts/collaboration-workflow/principles.md +21 -3
  90. package/prompts/collaboration-workflow/report-format.md +16 -29
  91. package/prompts/collaboration-workflow/residency.md +1 -1
  92. package/prompts/collaboration-workflow/rule-delivery.md +7 -95
  93. package/prompts/collaboration-workflow/shell-body.md +3 -23
  94. package/prompts/collaboration-workflow/turn-batching.md +4 -13
  95. package/prompts/collaboration-workflow/wip-cap.md +5 -11
  96. package/prompts/refactoring.md +1 -1
  97. package/prompts/review-rubric.md +3 -22
  98. package/prompts/review.md +15 -38
  99. package/prompts/testing-guide.md +2 -4
  100. package/scripts/adopt/adopt-logic.ts +5 -5
  101. package/scripts/adopt/adopt-toolkits.ts +4 -5
  102. package/scripts/adopt/adopt.ts +2 -3
  103. package/scripts/agent/agent-argv.ts +7 -7
  104. package/scripts/agent/agent-diagnostics.ts +2 -2
  105. package/scripts/agent/agent-exit-record.ts +1 -1
  106. package/scripts/agent/agent-headless.ts +1 -1
  107. package/scripts/agent/agent-launch-environment.ts +6 -1
  108. package/scripts/agent/agent-role-profile.ts +49 -22
  109. package/scripts/agent/agent-session-role.ts +32 -0
  110. package/scripts/agent/api-outage.ts +1 -1
  111. package/scripts/agent/claude-agent-argv.ts +4 -4
  112. package/scripts/agent/claude-result-event.ts +4 -4
  113. package/scripts/agent/codex-hooks.ts +2 -2
  114. package/scripts/agent/interactive-ask.ts +3 -6
  115. package/scripts/auto-ok/auto-ok-cli.ts +46 -60
  116. package/scripts/backlog/backlog-arrival-added.ts +34 -0
  117. package/scripts/backlog/backlog-arrival.ts +54 -17
  118. package/scripts/backlog/backlog-budget-cli.ts +34 -6
  119. package/scripts/backlog/backlog-budget.ts +17 -24
  120. package/scripts/backlog/backlog-defect-priority.ts +1 -1
  121. package/scripts/backlog/backlog-drive-args.ts +5 -4
  122. package/scripts/backlog/backlog-drive-cli.ts +14 -10
  123. package/scripts/backlog/backlog-drive-epic.ts +85 -0
  124. package/scripts/backlog/backlog-drive-launch.ts +1 -1
  125. package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
  126. package/scripts/backlog/backlog-drive-named.ts +39 -9
  127. package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
  128. package/scripts/backlog/backlog-drive-restore.ts +1 -1
  129. package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
  130. package/scripts/backlog/backlog-drive.ts +43 -28
  131. package/scripts/backlog/backlog-idle.ts +88 -0
  132. package/scripts/backlog/backlog-named.ts +11 -15
  133. package/scripts/backlog/backlog-next.ts +26 -30
  134. package/scripts/backlog/backlog-offer-cli.ts +28 -23
  135. package/scripts/backlog/backlog-offer.ts +7 -7
  136. package/scripts/backlog/backlog-overlap.ts +178 -0
  137. package/scripts/backlog/backlog-plan-cli.ts +14 -90
  138. package/scripts/backlog/backlog-plan-read.ts +111 -0
  139. package/scripts/backlog/backlog-plan.ts +11 -10
  140. package/scripts/backlog/backlog-pool.ts +13 -14
  141. package/scripts/backlog/backlog-rank.ts +11 -11
  142. package/scripts/backlog/backlog-ready.ts +15 -10
  143. package/scripts/backlog/backlog-scope.ts +14 -15
  144. package/scripts/backlog/backlog-stalled-cli.ts +2 -2
  145. package/scripts/backlog/backlog-stalled-detect.ts +4 -4
  146. package/scripts/backlog/backlog-stalled.ts +5 -6
  147. package/scripts/backlog/backlog-waves.ts +4 -4
  148. package/scripts/backlog/backlogrun-args.ts +74 -0
  149. package/scripts/backlog/backlogrun-cli.ts +113 -0
  150. package/scripts/backlog/backlogrun-launch.ts +178 -0
  151. package/scripts/behavior/behavior-assertion.ts +6 -8
  152. package/scripts/behavior/behavior-cli.ts +1 -1
  153. package/scripts/behavior/behavior-rules.ts +3 -3
  154. package/scripts/build/build-claude-md.ts +4 -4
  155. package/scripts/build/build-codex-hooks.ts +2 -2
  156. package/scripts/build/build-commands.ts +1 -1
  157. package/scripts/build/build-hooks.ts +5 -5
  158. package/scripts/build/build.ts +1 -1
  159. package/scripts/build/hook-bundle-stamp.ts +109 -7
  160. package/scripts/build/local-bin.ts +2 -2
  161. package/scripts/cases/cases-cli.ts +1 -1
  162. package/scripts/cases/cases-logic.ts +2 -2
  163. package/scripts/ci/composite-actions.ts +1 -2
  164. package/scripts/ci/pr-classification.ts +2 -2
  165. package/scripts/claude/workflow-destination.ts +1 -1
  166. package/scripts/clone/clone-aggregate.ts +1 -1
  167. package/scripts/clone/clone-fingerprint.ts +1 -1
  168. package/scripts/clone/clone-scan-cli.ts +1 -1
  169. package/scripts/clone/clone-scan.ts +1 -1
  170. package/scripts/config-merge/index.ts +1 -1
  171. package/scripts/config-merge/json-format.ts +1 -3
  172. package/scripts/config-merge/patch-json-array.ts +90 -0
  173. package/scripts/config-merge/patch-json-key.ts +6 -3
  174. package/scripts/config-merge/patch-json-list.ts +1 -1
  175. package/scripts/cost-runtime/codex-usage.ts +1 -1
  176. package/scripts/cost-runtime/context-cut-payback.ts +4 -5
  177. package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
  178. package/scripts/cost-runtime/cost-attribute.ts +3 -3
  179. package/scripts/cost-runtime/cost-blocks.ts +3 -4
  180. package/scripts/cost-runtime/cost-cli.ts +14 -11
  181. package/scripts/cost-runtime/cost-corpus.ts +11 -11
  182. package/scripts/cost-runtime/cost-pricing.ts +4 -4
  183. package/scripts/cost-runtime/cost-tokens.ts +1 -2
  184. package/scripts/cost-runtime/cost-transcript.ts +29 -29
  185. package/scripts/cost-runtime/cost-usage.ts +6 -7
  186. package/scripts/cost-runtime/cost-verdict.ts +10 -11
  187. package/scripts/cost-runtime/own-session.ts +1 -1
  188. package/scripts/cost-runtime/transcript-cwd.ts +2 -2
  189. package/scripts/delegation/delegation-cli.ts +4 -4
  190. package/scripts/delegation/delegation-policy.ts +13 -15
  191. package/scripts/delegation/duplicate-read-guard.ts +9 -10
  192. package/scripts/delegation/fanout-cli.ts +1 -1
  193. package/scripts/delegation/fanout.ts +1 -1
  194. package/scripts/delegation/investigation-guard.ts +18 -22
  195. package/scripts/delegation/investigation-reads.ts +48 -238
  196. package/scripts/discovery/repo-discovery.ts +1 -1
  197. package/scripts/discovery/repo-map-logic.ts +1 -2
  198. package/scripts/discovery/repo-origin.ts +3 -3
  199. package/scripts/discovery/repo-party-cli.ts +2 -2
  200. package/scripts/discovery/repo-party.ts +2 -2
  201. package/scripts/doctor/doctor-consumer.ts +1 -1
  202. package/scripts/doctor/doctor-io.ts +6 -7
  203. package/scripts/doctor/doctor-logic.ts +1 -1
  204. package/scripts/doctor/doctor-ports.ts +1 -1
  205. package/scripts/doctor/doctor.ts +8 -9
  206. package/scripts/document/backlogrun-parent-read-set.ts +5 -6
  207. package/scripts/document/bash-output-cap.ts +5 -7
  208. package/scripts/document/capped-print-part.ts +1 -1
  209. package/scripts/document/capped-print.ts +1 -1
  210. package/scripts/document/document-byte-budget.ts +33 -64
  211. package/scripts/document/document-byte-check.ts +4 -4
  212. package/scripts/document/document-reachability.ts +7 -8
  213. package/scripts/document/document-read-cli.ts +2 -2
  214. package/scripts/document/document-scan.ts +30 -5
  215. package/scripts/document/document-section-cli.ts +6 -8
  216. package/scripts/document/document-section.ts +8 -12
  217. package/scripts/document/edit-files-cli.ts +3 -4
  218. package/scripts/document/entry-read-budget.ts +8 -70
  219. package/scripts/document/entry-read-set.ts +51 -34
  220. package/scripts/document/lane-child-read-set.ts +9 -9
  221. package/scripts/document/read-files-cli.ts +1 -2
  222. package/scripts/document/read-set-cli.ts +16 -19
  223. package/scripts/document/read-set-cost.ts +4 -4
  224. package/scripts/document/read-set-point-of-use.ts +28 -38
  225. package/scripts/document/read-set-pricing.ts +1 -1
  226. package/scripts/document/read-set-trim.ts +3 -3
  227. package/scripts/document/resident-budget.ts +8 -10
  228. package/scripts/epic/epic-add-body.ts +15 -18
  229. package/scripts/epic/epic-add-plan.ts +26 -28
  230. package/scripts/epic/epic-add.ts +32 -25
  231. package/scripts/epic/epic-audit-checks.ts +27 -37
  232. package/scripts/epic/epic-audit-cli.ts +21 -22
  233. package/scripts/epic/epic-audit-orphans.ts +16 -17
  234. package/scripts/epic/epic-audit-rationale.ts +10 -15
  235. package/scripts/epic/epic-audit-report.ts +2 -5
  236. package/scripts/epic/epic-audit.ts +18 -14
  237. package/scripts/epic/epic-body.ts +10 -10
  238. package/scripts/epic/epic-bundle-cli.ts +36 -34
  239. package/scripts/epic/epic-bundle-evidence.ts +5 -5
  240. package/scripts/epic/epic-bundle-gaps.ts +6 -9
  241. package/scripts/epic/epic-bundle-poll.ts +1 -1
  242. package/scripts/epic/epic-bundle-referenced.ts +11 -14
  243. package/scripts/epic/epic-bundle.ts +19 -20
  244. package/scripts/epic/epic-busy.ts +44 -21
  245. package/scripts/epic/epic-candidate-confirm.ts +15 -18
  246. package/scripts/epic/epic-chains.ts +18 -23
  247. package/scripts/epic/epic-classify.ts +11 -12
  248. package/scripts/epic/epic-cli-argv.ts +5 -6
  249. package/scripts/epic/epic-cli-remove.ts +9 -4
  250. package/scripts/epic/epic-cli.ts +38 -26
  251. package/scripts/epic/epic-close-comment.ts +14 -15
  252. package/scripts/epic/epic-close.ts +25 -29
  253. package/scripts/epic/epic-cross-repo.ts +18 -21
  254. package/scripts/epic/epic-decision.ts +14 -18
  255. package/scripts/epic/epic-fetch.ts +25 -31
  256. package/scripts/epic/epic-graph.ts +15 -17
  257. package/scripts/epic/epic-index.ts +14 -16
  258. package/scripts/epic/epic-issue.ts +9 -11
  259. package/scripts/epic/epic-label-age.ts +74 -0
  260. package/scripts/epic/epic-lane-offer.ts +35 -24
  261. package/scripts/epic/epic-nested.ts +1 -1
  262. package/scripts/epic/epic-next-read.ts +8 -8
  263. package/scripts/epic/epic-next-views.ts +12 -12
  264. package/scripts/epic/epic-next.ts +29 -33
  265. package/scripts/epic/epic-outside-blocker.ts +11 -10
  266. package/scripts/epic/epic-parse.ts +22 -24
  267. package/scripts/epic/epic-promote.ts +3 -2
  268. package/scripts/epic/epic-rank.ts +1 -1
  269. package/scripts/epic/epic-read.ts +10 -8
  270. package/scripts/epic/epic-reconcile.ts +8 -6
  271. package/scripts/epic/epic-reference.ts +5 -4
  272. package/scripts/epic/epic-relation-recheck.ts +10 -11
  273. package/scripts/epic/epic-relations.ts +9 -8
  274. package/scripts/epic/epic-remove-plan.ts +4 -5
  275. package/scripts/epic/epic-remove.ts +7 -5
  276. package/scripts/epic/epic-report.ts +18 -20
  277. package/scripts/epic/epic-run.ts +6 -5
  278. package/scripts/epic/epic-sections.ts +2 -2
  279. package/scripts/epic/epic-shape.ts +3 -3
  280. package/scripts/epic/epic-solo-stale.ts +3 -2
  281. package/scripts/epic/epic-solo.ts +8 -8
  282. package/scripts/epic/epic-triage.ts +5 -4
  283. package/scripts/epic/epic-validate.ts +8 -7
  284. package/scripts/epic/epic.ts +5 -5
  285. package/scripts/exports/unused-members-cli.ts +1 -1
  286. package/scripts/followup/followup-issue-number.ts +1 -2
  287. package/scripts/followup/git-followup-cleanup.ts +6 -7
  288. package/scripts/followup/git-followup-finish.ts +11 -13
  289. package/scripts/followup/git-followup-flush.ts +11 -7
  290. package/scripts/followup/git-followup-issue-close.ts +16 -13
  291. package/scripts/followup/git-followup-label.ts +9 -6
  292. package/scripts/followup/git-followup-merged.ts +1 -1
  293. package/scripts/followup/git-followup-pending.ts +7 -9
  294. package/scripts/followup/git-followup-stages.ts +28 -17
  295. package/scripts/followup/git-followup-workflow.ts +19 -21
  296. package/scripts/followup/git-pr-followup-checks.ts +13 -20
  297. package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
  298. package/scripts/followup/git-pr-followup.ts +18 -17
  299. package/scripts/gate/core-admission.ts +2 -2
  300. package/scripts/gate/core-budget.ts +15 -26
  301. package/scripts/gate/gate-ledger.ts +114 -0
  302. package/scripts/gate/gate-log.ts +7 -9
  303. package/scripts/gate/gate-plan.ts +70 -35
  304. package/scripts/gate/gate-report.ts +14 -15
  305. package/scripts/gate/gate-skip.ts +11 -13
  306. package/scripts/gate/gate-steps.ts +5 -1
  307. package/scripts/gate/gate-tree.ts +3 -4
  308. package/scripts/gate/hook-gate-reuse.ts +9 -9
  309. package/scripts/gate/machine-capacity.ts +168 -30
  310. package/scripts/gate/pre-commit-type-check.ts +4 -4
  311. package/scripts/gate/project-checks.ts +12 -4
  312. package/scripts/gate/scoped-green.ts +11 -18
  313. package/scripts/gate/type-check-command.ts +2 -2
  314. package/scripts/gate/type-check-step.ts +4 -4
  315. package/scripts/gate/verification-gate.ts +53 -51
  316. package/scripts/gh/gh-spawn.ts +2 -2
  317. package/scripts/gh/git-ai-review-scan.ts +3 -2
  318. package/scripts/gh/git-gh-api-path.ts +10 -11
  319. package/scripts/gh/git-gh-exec.ts +43 -48
  320. package/scripts/gh/git-gh-failure.ts +6 -9
  321. package/scripts/gh/git-gh-helpers.ts +1 -1
  322. package/scripts/gh/git-gh-issue-list.ts +15 -19
  323. package/scripts/gh/git-gh-issue-read.ts +43 -60
  324. package/scripts/gh/git-gh-issue-rest.ts +14 -15
  325. package/scripts/gh/git-gh-issue-write.ts +52 -40
  326. package/scripts/gh/git-gh-issue.ts +23 -24
  327. package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
  328. package/scripts/gh/git-gh-pr-read.ts +46 -50
  329. package/scripts/gh/git-gh-pr-rest.ts +23 -26
  330. package/scripts/gh/git-gh-pr-review.ts +2 -2
  331. package/scripts/gh/git-gh-pr-rollup.ts +4 -4
  332. package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
  333. package/scripts/gh/git-gh-pr.ts +16 -16
  334. package/scripts/gh/git-gh-reachability.ts +11 -12
  335. package/scripts/gh/git-gh-repo.ts +2 -3
  336. package/scripts/gh/git-gh-rest-state.ts +1 -1
  337. package/scripts/gh/git-pr-ai-review.ts +6 -5
  338. package/scripts/gh/git-pr-checks-eval.ts +28 -30
  339. package/scripts/gh/git-pr-checks-parse.ts +14 -16
  340. package/scripts/gh/git-pr-checks-watch.ts +17 -17
  341. package/scripts/gh/git-pr-checks.ts +20 -23
  342. package/scripts/gh/git-pr-coderabbit.ts +8 -6
  343. package/scripts/gh/git-pr-confirmation.ts +5 -5
  344. package/scripts/gh/git-pr-managed-config.ts +7 -9
  345. package/scripts/gh/git-pr-messages.ts +1 -1
  346. package/scripts/gh/git-pr.ts +15 -16
  347. package/scripts/gh/github-issue-url.ts +8 -9
  348. package/scripts/git/base-tree.ts +66 -0
  349. package/scripts/git/change-base.ts +42 -2
  350. package/scripts/git/changed-file-scope.ts +5 -5
  351. package/scripts/git/changed-paths.ts +1 -2
  352. package/scripts/git/constants.ts +2 -2
  353. package/scripts/git/git-branch.ts +1 -1
  354. package/scripts/git/git-closes-keyword.ts +3 -3
  355. package/scripts/git/git-command.ts +53 -41
  356. package/scripts/git/git-common-directory.ts +3 -3
  357. package/scripts/git/git-diff-reads.ts +14 -15
  358. package/scripts/git/git-error.ts +1 -1
  359. package/scripts/git/git-execa-error.ts +1 -2
  360. package/scripts/git/git-issue.ts +10 -8
  361. package/scripts/git/git-location-environment.ts +3 -4
  362. package/scripts/git/git-ls-remote.ts +6 -8
  363. package/scripts/git/git-pre-push-hook.ts +11 -10
  364. package/scripts/git/git-preflight.ts +5 -5
  365. package/scripts/git/git-push-transport.ts +2 -2
  366. package/scripts/git/git-remote-branch.ts +1 -2
  367. package/scripts/git/git-schemas.ts +16 -23
  368. package/scripts/git/git-spawn-sync.ts +1 -1
  369. package/scripts/git/git-spawn.ts +37 -14
  370. package/scripts/git/git-ssh-keepalive.ts +12 -5
  371. package/scripts/git/git-staging.ts +7 -8
  372. package/scripts/git/git-workflow.ts +1 -1
  373. package/scripts/git/git-worktree.ts +35 -27
  374. package/scripts/git/gone-branch.ts +2 -2
  375. package/scripts/git/listing-cutoff.ts +1 -2
  376. package/scripts/git/lockfile-sync.ts +65 -0
  377. package/scripts/git/main-merge-guard.ts +1 -2
  378. package/scripts/git/main-merge.ts +7 -7
  379. package/scripts/git/main-sync.ts +23 -8
  380. package/scripts/git/parse-json-array.ts +18 -23
  381. package/scripts/git/repository-lock.ts +34 -2
  382. package/scripts/git/stash/git-stash.ts +4 -5
  383. package/scripts/git/stash/stash-orphans.ts +5 -3
  384. package/scripts/git/stash/stash-pop-args.ts +1 -1
  385. package/scripts/git/stash/stash-pop-cli.ts +3 -3
  386. package/scripts/git/stash/stash-sweep-lock.ts +2 -2
  387. package/scripts/hooks/batch-guard.ts +11 -13
  388. package/scripts/hooks/check-commit-message.ts +12 -9
  389. package/scripts/hooks/codex-hook-adapter.ts +16 -10
  390. package/scripts/hooks/edited-cspell.ts +3 -4
  391. package/scripts/hooks/format-edited-cli.ts +1 -1
  392. package/scripts/hooks/format-edited-file.ts +11 -17
  393. package/scripts/hooks/format-rewrite-notice.ts +19 -17
  394. package/scripts/hooks/pre-push-unit.ts +10 -14
  395. package/scripts/hooks/pretool-guard-cli.ts +4 -4
  396. package/scripts/hooks/pretool-guard.ts +93 -18
  397. package/scripts/hooks/reserved-run.ts +2 -2
  398. package/scripts/hooks/step-zero-notice.ts +1 -1
  399. package/scripts/hooks/stop-guard.ts +21 -10
  400. package/scripts/init/basic-path-migration.ts +2 -2
  401. package/scripts/init/claude-kit-only-settings.ts +2 -2
  402. package/scripts/init/claude-plugin-config.ts +2 -2
  403. package/scripts/init/distributed-paths.ts +4 -4
  404. package/scripts/init/hook-command-rewrite.ts +3 -3
  405. package/scripts/init/hook-launch.ts +5 -5
  406. package/scripts/init/init-actions.ts +13 -0
  407. package/scripts/init/init-ai-copy.ts +11 -11
  408. package/scripts/init/init-bootstrap.ts +3 -3
  409. package/scripts/init/init-copy-content.ts +4 -4
  410. package/scripts/init/init-logic-json-merge.ts +7 -9
  411. package/scripts/init/init-logic-migrate.ts +1 -1
  412. package/scripts/init/init-logic-templates.ts +1 -1
  413. package/scripts/init/init-logic-workspace.ts +4 -4
  414. package/scripts/init/init-logic-yaml-merge.ts +2 -2
  415. package/scripts/init/init-logic.ts +19 -22
  416. package/scripts/init/init.ts +7 -7
  417. package/scripts/init/kit-base-preset.ts +1 -1
  418. package/scripts/init/kit-setup-state.ts +1 -1
  419. package/scripts/init/kit-written-paths.ts +1 -2
  420. package/scripts/init/package-manager-pin.ts +1 -1
  421. package/scripts/init/project-profile-cli.ts +1 -1
  422. package/scripts/init/project-profile.ts +3 -3
  423. package/scripts/init/session-language-environment.ts +1 -1
  424. package/scripts/init/start-exec.ts +3 -4
  425. package/scripts/init/start-plan.ts +2 -2
  426. package/scripts/init/start-setup-pr.ts +3 -2
  427. package/scripts/init/start-steps.ts +2 -2
  428. package/scripts/init/tsconfig-preset-migration.ts +1 -1
  429. package/scripts/init/vscode-tasks.ts +62 -0
  430. package/scripts/issue/baseline-measure.ts +2 -2
  431. package/scripts/issue/behavior-change-lint.ts +2 -2
  432. package/scripts/issue/defect-rate-cli.ts +6 -7
  433. package/scripts/issue/defect-rate.ts +37 -27
  434. package/scripts/issue/git-next-issues.ts +9 -8
  435. package/scripts/issue/issue-auto-ok.ts +24 -11
  436. package/scripts/issue/issue-backlinks-cli.ts +5 -5
  437. package/scripts/issue/issue-backlinks.ts +6 -6
  438. package/scripts/issue/issue-cite-cli.ts +20 -18
  439. package/scripts/issue/issue-cite.ts +18 -8
  440. package/scripts/issue/issue-closing-pr.ts +4 -4
  441. package/scripts/issue/issue-comment-cli.ts +6 -4
  442. package/scripts/issue/issue-file-cli.ts +52 -15
  443. package/scripts/issue/issue-file-fold.ts +155 -0
  444. package/scripts/issue/issue-file.ts +9 -6
  445. package/scripts/issue/issue-fold-cli.ts +14 -9
  446. package/scripts/issue/issue-fold.ts +23 -8
  447. package/scripts/issue/issue-labels.ts +34 -38
  448. package/scripts/issue/issue-lint-cli.ts +2 -2
  449. package/scripts/issue/issue-lint.ts +1 -1
  450. package/scripts/issue/issue-merged.ts +10 -4
  451. package/scripts/issue/issue-number-shape.ts +27 -0
  452. package/scripts/issue/issue-rank.ts +1 -1
  453. package/scripts/issue/issue-read-cli.ts +4 -5
  454. package/scripts/issue/issue-read.ts +4 -5
  455. package/scripts/issue/issue-reference.ts +5 -5
  456. package/scripts/issue/issue-release-cli.ts +17 -7
  457. package/scripts/issue/issue-release.ts +3 -3
  458. package/scripts/issue/issue-report-failures.ts +7 -4
  459. package/scripts/issue/issue-scout-cli.ts +11 -11
  460. package/scripts/issue/issue-scout-closed.ts +4 -4
  461. package/scripts/issue/issue-scout.ts +4 -5
  462. package/scripts/issue/issue-state-cli.ts +17 -10
  463. package/scripts/issue/issue-state.ts +12 -13
  464. package/scripts/issue/issue-wip.ts +7 -7
  465. package/scripts/issue/markdown-section.ts +3 -3
  466. package/scripts/issue/measure-rerun-cli.ts +10 -9
  467. package/scripts/issue/reproduction-measure.ts +3 -3
  468. package/scripts/issue/session-cite.ts +56 -0
  469. package/scripts/josh/agent-session-environment.ts +10 -8
  470. package/scripts/josh/cli-body.ts +2 -2
  471. package/scripts/josh/command-suggest.ts +1 -1
  472. package/scripts/josh/file-map-stamp.ts +20 -23
  473. package/scripts/josh/hook-decision.ts +24 -28
  474. package/scripts/josh/josh-command-map.ts +4 -1
  475. package/scripts/josh/josh-command-types.ts +30 -35
  476. package/scripts/josh/josh-commands-ai.ts +6 -6
  477. package/scripts/josh/josh-commands-backlog.ts +15 -3
  478. package/scripts/josh/josh-commands-clone.ts +1 -1
  479. package/scripts/josh/josh-commands-development.ts +25 -4
  480. package/scripts/josh/josh-commands-document.ts +3 -3
  481. package/scripts/josh/josh-commands-guard.ts +3 -3
  482. package/scripts/josh/josh-commands-issue.ts +4 -5
  483. package/scripts/josh/josh-commands-lane.ts +14 -4
  484. package/scripts/josh/josh-commands-lint.ts +1 -1
  485. package/scripts/josh/josh-commands-run.ts +21 -7
  486. package/scripts/josh/josh-commands-split.ts +1 -2
  487. package/scripts/josh/josh-commands-versioning.ts +5 -5
  488. package/scripts/josh/josh-commands-workflow.ts +30 -22
  489. package/scripts/josh/josh-environment-file.ts +1 -1
  490. package/scripts/josh/josh-in-process.ts +3 -3
  491. package/scripts/josh/josh-logic.ts +6 -7
  492. package/scripts/josh/josh-run.ts +3 -3
  493. package/scripts/josh/josh-verdict.ts +9 -12
  494. package/scripts/josh/josh.ts +3 -3
  495. package/scripts/josh/kit-only.ts +2 -2
  496. package/scripts/josh/path-decision.ts +3 -3
  497. package/scripts/josh/platform-temporary.ts +7 -5
  498. package/scripts/josh/process-identity.ts +24 -6
  499. package/scripts/josh/process-owner.ts +4 -4
  500. package/scripts/josh/session-language-cli.ts +53 -11
  501. package/scripts/josh/session-language.ts +1 -1
  502. package/scripts/josh/stamp-file.ts +48 -29
  503. package/scripts/josh/stamp-record.ts +57 -0
  504. package/scripts/lane/lane-await.ts +35 -11
  505. package/scripts/lane/lane-cache.ts +6 -6
  506. package/scripts/lane/lane-capacity.ts +32 -17
  507. package/scripts/lane/lane-child-invocation.ts +17 -15
  508. package/scripts/lane/lane-child-marker.ts +12 -12
  509. package/scripts/lane/lane-cli.ts +12 -13
  510. package/scripts/lane/lane-close.ts +6 -6
  511. package/scripts/lane/lane-dispatch.ts +61 -72
  512. package/scripts/lane/lane-environment.ts +5 -5
  513. package/scripts/lane/lane-guard-policy.ts +7 -21
  514. package/scripts/lane/lane-handoff.ts +2 -2
  515. package/scripts/lane/lane-install.ts +9 -10
  516. package/scripts/lane/lane-launch-cli.ts +13 -8
  517. package/scripts/lane/lane-ledger.ts +73 -11
  518. package/scripts/lane/lane-leftover.ts +2 -2
  519. package/scripts/lane/lane-limit-cli.ts +160 -0
  520. package/scripts/lane/lane-limit-override.ts +74 -0
  521. package/scripts/lane/lane-load.ts +19 -68
  522. package/scripts/lane/lane-measure-cli.ts +15 -25
  523. package/scripts/lane/lane-occupancy.ts +6 -4
  524. package/scripts/lane/lane-open.ts +20 -19
  525. package/scripts/lane/lane-output.ts +4 -3
  526. package/scripts/lane/lane-paths.ts +12 -11
  527. package/scripts/lane/lane-phase.ts +33 -0
  528. package/scripts/lane/lane-reap.ts +2 -2
  529. package/scripts/lane/lane-registry.ts +16 -15
  530. package/scripts/lane/lane-relaunch.ts +9 -9
  531. package/scripts/lane/lane-report.ts +5 -4
  532. package/scripts/lane/lane-resume.ts +2 -2
  533. package/scripts/lane/lane-sampler.ts +55 -0
  534. package/scripts/lane/lane-seed.ts +7 -7
  535. package/scripts/lane/lane-stage-stats.ts +135 -0
  536. package/scripts/lane/lane-start-point.ts +8 -11
  537. package/scripts/lane/lane-stats.ts +60 -15
  538. package/scripts/lane/lane-stray.ts +1 -1
  539. package/scripts/lane/lane-vacant.ts +1 -1
  540. package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
  541. package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
  542. package/scripts/lane/openai-review-broker.ts +2 -4
  543. package/scripts/lib/ancestor-directories.ts +1 -1
  544. package/scripts/lib/bounded-pool.ts +2 -2
  545. package/scripts/lib/buffered-process.ts +4 -6
  546. package/scripts/lib/caddy-logs.sh +0 -0
  547. package/scripts/lib/cli-flags.ts +39 -6
  548. package/scripts/lib/error-message.ts +1 -1
  549. package/scripts/lib/json-value.ts +17 -3
  550. package/scripts/lib/poll.ts +1 -1
  551. package/scripts/lib/status-icons.ts +3 -3
  552. package/scripts/lib/timed-fetch.ts +1 -1
  553. package/scripts/lib/timeouts.ts +1 -1
  554. package/scripts/lines/bytes-command.ts +3 -4
  555. package/scripts/lines/effective-limit.ts +25 -12
  556. package/scripts/lines/line-budget.ts +47 -55
  557. package/scripts/lines/line-targets.ts +6 -2
  558. package/scripts/lines/lines-command.ts +3 -3
  559. package/scripts/lint/cross-file-recheck.ts +155 -0
  560. package/scripts/lint/cspell-cached.ts +1 -1
  561. package/scripts/lint/format.ts +1 -2
  562. package/scripts/lint/lint-parallel.ts +35 -19
  563. package/scripts/lint/lint-related-scope.ts +25 -15
  564. package/scripts/lint/lint-related.ts +6 -7
  565. package/scripts/managed-marker/index.ts +1 -1
  566. package/scripts/managed-marker/managed-marker-logic.ts +1 -2
  567. package/scripts/notify/git-notify.ts +9 -7
  568. package/scripts/notify/telegram-notify.ts +53 -37
  569. package/scripts/notify/telegram-test-logic.ts +3 -3
  570. package/scripts/notify/telegram-test.ts +45 -30
  571. package/scripts/observations/observation-ledger-home.ts +14 -8
  572. package/scripts/observations/observation-ledger-line.ts +3 -2
  573. package/scripts/observations/observation-ledger-migrate.ts +3 -4
  574. package/scripts/observations/observation-ledger-prepare.ts +4 -4
  575. package/scripts/observations/observation-ledger.ts +14 -15
  576. package/scripts/observations/observation-record-cli.ts +83 -0
  577. package/scripts/observations/observation-record.ts +91 -0
  578. package/scripts/observations/observations-flush-cli.ts +1 -1
  579. package/scripts/observations/observations-flush-landing.ts +7 -6
  580. package/scripts/observations/observations-flush.ts +26 -27
  581. package/scripts/overrides/overrides-check.ts +18 -8
  582. package/scripts/package/package-scout-cli.ts +1 -1
  583. package/scripts/package/package-scout-format.ts +2 -2
  584. package/scripts/package/package-scout.ts +1 -1
  585. package/scripts/propagate/propagate-git-failure.ts +1 -1
  586. package/scripts/propagate/propagate-git.ts +7 -7
  587. package/scripts/propagate/propagate-plan.ts +2 -2
  588. package/scripts/propagate/propagate-publish.ts +2 -3
  589. package/scripts/propagate/propagate-run.ts +5 -7
  590. package/scripts/propagate/propagate-select.ts +1 -1
  591. package/scripts/propagate/propagate-steps.ts +19 -20
  592. package/scripts/propagate/propagate-targets.ts +6 -10
  593. package/scripts/propagate/propagate.ts +5 -5
  594. package/scripts/refactor/import-graph.ts +1 -1
  595. package/scripts/refactor/refactor-lint.ts +4 -10
  596. package/scripts/refactor/refactor-scan-cli.ts +1 -1
  597. package/scripts/refactor/refactor-scan.ts +2 -2
  598. package/scripts/refactor/refactor-targets.ts +1 -1
  599. package/scripts/release/github-release-cli.ts +25 -3
  600. package/scripts/release/github-release-runs.ts +1 -1
  601. package/scripts/release/release-cli.ts +21 -4
  602. package/scripts/release/release-history.ts +6 -10
  603. package/scripts/release/release-plan.ts +3 -3
  604. package/scripts/release/release-progress.ts +3 -4
  605. package/scripts/release/release-publish.ts +8 -9
  606. package/scripts/release/release-scope-cli.ts +8 -10
  607. package/scripts/release/release-tag.ts +6 -8
  608. package/scripts/release/release-worktree.ts +5 -5
  609. package/scripts/repo/auto-merge-setting-logic.ts +7 -9
  610. package/scripts/repo/auto-merge-setting.ts +1 -1
  611. package/scripts/repo/repo-setting.ts +4 -4
  612. package/scripts/repo/repository-labels.ts +1 -1
  613. package/scripts/repo/required-checks-logic.ts +3 -3
  614. package/scripts/repo/required-checks-report.ts +1 -1
  615. package/scripts/repo/ruleset-check-cli.ts +1 -1
  616. package/scripts/repo/ruleset-check.ts +1 -1
  617. package/scripts/report/report-format-reference.ts +26 -0
  618. package/scripts/report/report-lint-cli.ts +2 -2
  619. package/scripts/report/report-lint.ts +16 -2
  620. package/scripts/review/disposition-cli.ts +2 -2
  621. package/scripts/review/disposition-logic.ts +1 -1
  622. package/scripts/review/live-evidence.ts +9 -6
  623. package/scripts/review/review-attest-cli.ts +1 -2
  624. package/scripts/review/review-attest.ts +3 -3
  625. package/scripts/review/review-brief-cli.ts +19 -20
  626. package/scripts/review/review-brief.ts +29 -32
  627. package/scripts/review/review-checkout.ts +2 -2
  628. package/scripts/review/review-diff-parts.ts +3 -5
  629. package/scripts/review/review-diff-write.ts +1 -1
  630. package/scripts/review/review-finding-ledger.ts +7 -4
  631. package/scripts/review/review-findings-cli.ts +2 -2
  632. package/scripts/review/review-level.ts +4 -7
  633. package/scripts/review/review-record-cli.ts +73 -16
  634. package/scripts/review/review-record.ts +5 -4
  635. package/scripts/review/review-round2-cli.ts +2 -3
  636. package/scripts/review/review-round2.ts +13 -21
  637. package/scripts/review/review-stamps.ts +9 -71
  638. package/scripts/review/review-tree.ts +4 -5
  639. package/scripts/rules/bash-triggers.ts +4 -4
  640. package/scripts/rules/decision-oracle-batch.ts +6 -7
  641. package/scripts/rules/decision-oracle-stage.ts +1 -1
  642. package/scripts/rules/decision-oracle-tokens.ts +1 -2
  643. package/scripts/rules/decision-oracle.ts +2 -2
  644. package/scripts/rules/delivered-rules.ts +61 -406
  645. package/scripts/rules/destructive-command.ts +2 -2
  646. package/scripts/rules/direct-filing.ts +4 -4
  647. package/scripts/rules/direct-pr-create.ts +2 -2
  648. package/scripts/rules/early-heartbeat.ts +15 -19
  649. package/scripts/rules/file-body.ts +5 -6
  650. package/scripts/rules/filing-cap.ts +6 -7
  651. package/scripts/rules/filing-offer.ts +1 -1
  652. package/scripts/rules/firing-point.ts +6 -6
  653. package/scripts/rules/gh-api.ts +2 -2
  654. package/scripts/rules/git-argv.ts +3 -3
  655. package/scripts/rules/git-force.ts +2 -2
  656. package/scripts/rules/hook-context-line.ts +31 -0
  657. package/scripts/rules/implementation-cut-verdict.ts +5 -8
  658. package/scripts/rules/implementation-cut.ts +35 -32
  659. package/scripts/rules/index-guard.ts +2 -2
  660. package/scripts/rules/issue-citation.ts +7 -7
  661. package/scripts/rules/issue-comments.ts +21 -13
  662. package/scripts/rules/josh-git-bare.ts +2 -2
  663. package/scripts/rules/lane-background.ts +14 -16
  664. package/scripts/rules/lane-carry-conflict.ts +41 -5
  665. package/scripts/rules/lane-interactive-ask.ts +6 -9
  666. package/scripts/rules/lane-park.ts +12 -16
  667. package/scripts/rules/lane-split-park.ts +1 -2
  668. package/scripts/rules/lane-switch-main.ts +10 -13
  669. package/scripts/rules/last-prompt.ts +1 -1
  670. package/scripts/rules/oracle-consulted.ts +5 -5
  671. package/scripts/rules/oracle-firing.ts +6 -9
  672. package/scripts/rules/oracle-list-cli.ts +2 -2
  673. package/scripts/rules/permission-guards.ts +2 -2
  674. package/scripts/rules/piped-verification.ts +79 -9
  675. package/scripts/rules/poll-loop.ts +9 -11
  676. package/scripts/rules/pre-gate-cut.ts +33 -30
  677. package/scripts/rules/prior-comment-read.ts +3 -3
  678. package/scripts/rules/protected-files.ts +25 -13
  679. package/scripts/rules/raw-field-body.ts +3 -4
  680. package/scripts/rules/reply-language.ts +1 -1
  681. package/scripts/rules/rule-body-guard.ts +10 -12
  682. package/scripts/rules/rule-guard.ts +1 -1
  683. package/scripts/rules/rule-list.ts +51 -0
  684. package/scripts/rules/rule-registry-rows.ts +282 -0
  685. package/scripts/rules/rule-registry.ts +109 -0
  686. package/scripts/rules/rule-value-cache.ts +2 -2
  687. package/scripts/rules/rule-value-cli.ts +6 -4
  688. package/scripts/rules/rule-value.ts +61 -22
  689. package/scripts/rules/run-tail-rule.ts +11 -15
  690. package/scripts/rules/shell-body-trigger.ts +7 -7
  691. package/scripts/rules/shell-segments.ts +2 -4
  692. package/scripts/rules/stop-rules.ts +54 -41
  693. package/scripts/rules/tail-commands.ts +1 -1
  694. package/scripts/rules/test-declared-commit.ts +2 -2
  695. package/scripts/rules/third-party-write.ts +3 -3
  696. package/scripts/rules/worktree-guard.ts +12 -5
  697. package/scripts/run/add/run-add-cli.ts +165 -0
  698. package/scripts/run/add/run-add.ts +124 -0
  699. package/scripts/run/board/run-board-cli.ts +207 -0
  700. package/scripts/run/board/run-board-closed.ts +95 -0
  701. package/scripts/run/board/run-board-every.ts +60 -0
  702. package/scripts/run/board/run-board-fetch.ts +38 -0
  703. package/scripts/run/board/run-board-fit.ts +219 -0
  704. package/scripts/run/board/run-board-github.ts +162 -0
  705. package/scripts/run/board/run-board-header.ts +275 -0
  706. package/scripts/run/board/run-board-kind.ts +35 -0
  707. package/scripts/run/board/run-board-labels.ts +299 -0
  708. package/scripts/run/board/run-board-layout.ts +222 -0
  709. package/scripts/run/board/run-board-link.ts +31 -0
  710. package/scripts/run/board/run-board-machine.ts +198 -0
  711. package/scripts/run/board/run-board-notes.ts +103 -0
  712. package/scripts/run/board/run-board-phase.ts +136 -0
  713. package/scripts/run/board/run-board-plan.ts +129 -0
  714. package/scripts/run/board/run-board-read.ts +62 -0
  715. package/scripts/run/board/run-board-render-legend.ts +82 -0
  716. package/scripts/run/board/run-board-render-notes.ts +77 -0
  717. package/scripts/run/board/run-board-render-slot.ts +50 -0
  718. package/scripts/run/board/run-board-render.ts +407 -0
  719. package/scripts/run/board/run-board-scope.ts +17 -0
  720. package/scripts/run/board/run-board-screen.ts +43 -0
  721. package/scripts/run/board/run-board-span.ts +66 -0
  722. package/scripts/run/board/run-board-spin.ts +115 -0
  723. package/scripts/run/board/run-board-state.ts +113 -0
  724. package/scripts/run/board/run-board-status.ts +279 -0
  725. package/scripts/run/board/run-board-tick.ts +210 -0
  726. package/scripts/run/board/run-board-track.ts +22 -0
  727. package/scripts/run/board/run-board-usage-read.ts +255 -0
  728. package/scripts/run/board/run-board-usage-rusage.ts +124 -0
  729. package/scripts/run/board/run-board-usage-text.ts +80 -0
  730. package/scripts/run/board/run-board-usage.ts +165 -0
  731. package/scripts/run/carry/run-carry-added.ts +62 -0
  732. package/scripts/run/carry/run-carry-args.ts +25 -22
  733. package/scripts/run/carry/run-carry-change.ts +1 -1
  734. package/scripts/run/carry/run-carry-cli.ts +71 -48
  735. package/scripts/run/carry/run-carry-conversation.ts +6 -7
  736. package/scripts/run/carry/run-carry-ended.ts +85 -0
  737. package/scripts/run/carry/run-carry-reclaim.ts +1 -1
  738. package/scripts/run/carry/run-carry-stash.ts +3 -2
  739. package/scripts/run/carry/run-carry-streak.ts +8 -10
  740. package/scripts/run/carry/run-carry.ts +85 -89
  741. package/scripts/run/cut/run-cut-args.ts +7 -7
  742. package/scripts/run/cut/run-cut-cli.ts +54 -36
  743. package/scripts/run/cut/run-cut-handoff.ts +15 -15
  744. package/scripts/run/cut/run-cut-report.ts +37 -16
  745. package/scripts/run/cut/run-cut.ts +63 -77
  746. package/scripts/run/detached-launch.ts +35 -50
  747. package/scripts/run/entry/run-entry-cli.ts +48 -27
  748. package/scripts/run/entry/run-entry-stop.ts +7 -9
  749. package/scripts/run/entry/run-entry.ts +5 -6
  750. package/scripts/run/event/run-event-cli.ts +5 -6
  751. package/scripts/run/event/run-event-filed.ts +69 -0
  752. package/scripts/run/event/run-event-follow.ts +3 -3
  753. package/scripts/run/event/run-event-plan.ts +38 -0
  754. package/scripts/run/event/run-event-render.ts +9 -4
  755. package/scripts/run/event/run-event-scope.ts +47 -18
  756. package/scripts/run/event/run-event-stream-emit.ts +64 -11
  757. package/scripts/run/event/run-event-stream.ts +171 -46
  758. package/scripts/run/event/run-event-watch.ts +4 -6
  759. package/scripts/run/hold/run-hold-cli.ts +65 -62
  760. package/scripts/run/hold/run-hold.ts +88 -46
  761. package/scripts/run/merge/run-merge-cli.ts +116 -77
  762. package/scripts/run/merge/run-merge-collect.ts +107 -0
  763. package/scripts/run/merge/run-merge-steps.ts +112 -65
  764. package/scripts/run/merge/run-merge-token.ts +30 -0
  765. package/scripts/run/merge/run-merge.ts +31 -22
  766. package/scripts/run/progress/run-progress-args.ts +4 -4
  767. package/scripts/run/progress/run-progress-cli.ts +39 -50
  768. package/scripts/run/progress/run-progress-clock.ts +25 -32
  769. package/scripts/run/progress/run-progress-config.ts +6 -9
  770. package/scripts/run/progress/run-progress-read.ts +9 -10
  771. package/scripts/run/progress/run-progress.ts +48 -53
  772. package/scripts/run/review/run-review-cli.ts +6 -6
  773. package/scripts/run/review/run-review-steps.ts +6 -6
  774. package/scripts/run/review/run-review.ts +9 -11
  775. package/scripts/run/run-cli-fault.ts +29 -0
  776. package/scripts/run/run-ending-cli.ts +3 -3
  777. package/scripts/run/run-ending.ts +10 -14
  778. package/scripts/run/run-halfrun-resume.ts +6 -8
  779. package/scripts/run/run-headless.ts +26 -12
  780. package/scripts/run/run-invocation.ts +17 -22
  781. package/scripts/run/run-label.ts +7 -5
  782. package/scripts/run/run-liveness-cli.ts +19 -6
  783. package/scripts/run/run-liveness.ts +27 -38
  784. package/scripts/run/run-next-cli.ts +5 -9
  785. package/scripts/run/run-next.ts +4 -5
  786. package/scripts/run/run-parent-cut-hook.ts +10 -12
  787. package/scripts/run/run-preflight.ts +25 -29
  788. package/scripts/run/run-prep-cli.ts +17 -13
  789. package/scripts/run/run-prep-locate.ts +4 -5
  790. package/scripts/run/run-prep.ts +7 -10
  791. package/scripts/run/run-prrun-resume.ts +2 -2
  792. package/scripts/run/run-report-cli.ts +4 -4
  793. package/scripts/run/run-report.ts +9 -14
  794. package/scripts/run/run-retrospective.ts +3 -3
  795. package/scripts/run/run-section.ts +42 -0
  796. package/scripts/run/run-stage-read.ts +2 -2
  797. package/scripts/run/run-stage.ts +6 -4
  798. package/scripts/run/run-status-cli.ts +7 -5
  799. package/scripts/run/run-status.ts +6 -7
  800. package/scripts/run/run-step-cli.ts +64 -18
  801. package/scripts/run/run-step.ts +107 -51
  802. package/scripts/run/run-stop-notify.ts +7 -8
  803. package/scripts/run/run-stranded-cli.ts +1 -1
  804. package/scripts/run/run-stranded-detect.ts +4 -4
  805. package/scripts/run/run-stranded.ts +11 -13
  806. package/scripts/run/run-tail-cli.ts +15 -16
  807. package/scripts/run/run-tail.ts +14 -33
  808. package/scripts/run/run-watcher-guard-cli.ts +3 -4
  809. package/scripts/run/run-watcher-guard.ts +11 -12
  810. package/scripts/run/run-watcher-hook.ts +6 -12
  811. package/scripts/run/ship/run-ship-cli.ts +67 -33
  812. package/scripts/run/ship/run-ship-detach.ts +15 -13
  813. package/scripts/run/ship/run-ship-lock.ts +1 -1
  814. package/scripts/run/ship/run-ship-next.ts +7 -8
  815. package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
  816. package/scripts/run/ship/run-ship-preflight.ts +10 -11
  817. package/scripts/run/ship/run-ship-probe.ts +4 -4
  818. package/scripts/run/ship/run-ship-return.ts +1 -1
  819. package/scripts/run/ship/run-ship-review-steps.ts +43 -24
  820. package/scripts/run/ship/run-ship-review.ts +12 -14
  821. package/scripts/run/ship/run-ship-scoped.ts +15 -6
  822. package/scripts/run/ship/run-ship-stage.ts +80 -26
  823. package/scripts/run/ship/run-ship-steps.ts +26 -16
  824. package/scripts/run/ship/run-ship-stop-text.ts +4 -2
  825. package/scripts/run/ship/run-ship-sync.ts +9 -8
  826. package/scripts/run/ship/run-ship.ts +17 -32
  827. package/scripts/run/tidy/run-tidy-cli.ts +9 -5
  828. package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
  829. package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
  830. package/scripts/run/tidy/run-tidy.ts +4 -3
  831. package/scripts/run/wake/run-wake-cli.ts +27 -32
  832. package/scripts/run/wake/run-wake-describe.ts +24 -28
  833. package/scripts/run/wake/run-wake-driver.ts +14 -14
  834. package/scripts/run/wake/run-wake-handoff.ts +6 -6
  835. package/scripts/run/wake/run-wake-loop.ts +9 -9
  836. package/scripts/run/wake/run-wake-restart.ts +4 -5
  837. package/scripts/run/wake/run-wake-session.ts +23 -27
  838. package/scripts/run/wake/run-wake.ts +57 -279
  839. package/scripts/safe-chain/ci-installer-pin.ts +3 -3
  840. package/scripts/safe-chain/pack-hook.ts +2 -2
  841. package/scripts/safe-chain/preinstall-command.ts +2 -2
  842. package/scripts/security/security-audit-logic.ts +1 -1
  843. package/scripts/security/security-audit-provision-logic.ts +1 -1
  844. package/scripts/security/security-audit-provision.ts +2 -2
  845. package/scripts/security/security-audit.ts +5 -5
  846. package/scripts/security/security-updates-logic.ts +2 -3
  847. package/scripts/security/security-updates.ts +2 -4
  848. package/scripts/self-sync-guard/index.ts +1 -1
  849. package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
  850. package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
  851. package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
  852. package/scripts/sonar/sonar-hotspots.ts +1 -1
  853. package/scripts/sonar/sonar-new-code-cli.ts +1 -1
  854. package/scripts/sonar/sonar-new-code.ts +1 -1
  855. package/scripts/sonar/sonar-project.ts +1 -1
  856. package/scripts/split/split-assess-cli.ts +1 -1
  857. package/scripts/split/split-assess.ts +3 -3
  858. package/scripts/sync/directory-copy-guard.ts +2 -3
  859. package/scripts/sync/managed-config-scope-cli.ts +1 -2
  860. package/scripts/sync/managed-config-scope.ts +4 -4
  861. package/scripts/sync/plugin-skill-directories.ts +2 -2
  862. package/scripts/sync/reconcile-templates.ts +17 -8
  863. package/scripts/sync/removed-skill-manifest.ts +2 -3
  864. package/scripts/sync/sync-ai-files.ts +7 -7
  865. package/scripts/sync/sync-configs.ts +30 -3
  866. package/scripts/sync/sync-hook-safety.ts +2 -2
  867. package/scripts/sync/sync.ts +23 -10
  868. package/scripts/sync/synced-paths.ts +2 -1
  869. package/scripts/sync/workflow-pin-logic.ts +1 -1
  870. package/scripts/test/test-declared-changed.ts +4 -4
  871. package/scripts/test/test-declared-logic.ts +2 -3
  872. package/scripts/test/test-declared-match.ts +25 -4
  873. package/scripts/test/test-declared.ts +26 -9
  874. package/scripts/test/test-red-commit.ts +3 -2
  875. package/scripts/test/test-red-logic.ts +7 -14
  876. package/scripts/test/test-red.ts +12 -47
  877. package/scripts/test/test-related-scope.ts +2 -3
  878. package/scripts/test/test-related.ts +3 -3
  879. package/scripts/test/test-type-logic.ts +1 -2
  880. package/scripts/test/test-unit-guard.ts +13 -17
  881. package/scripts/test/unit-worker-share.ts +7 -8
  882. package/scripts/time-runtime/time-agent-bundles.ts +2 -4
  883. package/scripts/time-runtime/time-background.ts +17 -21
  884. package/scripts/time-runtime/time-batch-guard.ts +67 -342
  885. package/scripts/time-runtime/time-bundle-call.ts +26 -28
  886. package/scripts/time-runtime/time-bundles.ts +11 -12
  887. package/scripts/time-runtime/time-call-identity.ts +1 -1
  888. package/scripts/time-runtime/time-command-key.ts +2 -2
  889. package/scripts/time-runtime/time-density-hook.ts +8 -11
  890. package/scripts/time-runtime/time-density.ts +5 -5
  891. package/scripts/time-runtime/time-followup-stage.ts +7 -7
  892. package/scripts/time-runtime/time-format.ts +5 -5
  893. package/scripts/time-runtime/time-hook-transcript.ts +3 -3
  894. package/scripts/time-runtime/time-instant.ts +1 -1
  895. package/scripts/time-runtime/time-markers.ts +15 -19
  896. package/scripts/time-runtime/time-phase-names.ts +3 -3
  897. package/scripts/time-runtime/time-reported-failure.ts +15 -19
  898. package/scripts/time-runtime/time-round-trips.ts +20 -23
  899. package/scripts/time-runtime/time-shell.ts +8 -8
  900. package/scripts/time-runtime/time-single-check.ts +1 -2
  901. package/scripts/time-runtime/time-spans.ts +35 -40
  902. package/scripts/time-runtime/time-tool-call.ts +15 -16
  903. package/scripts/time-runtime/time-transcript-line.ts +53 -34
  904. package/scripts/time-runtime/time-writes.ts +5 -5
  905. package/scripts/ui/ui-routes-cli.ts +1 -2
  906. package/scripts/ui/ui-routes.ts +1 -2
  907. package/scripts/version/bump-version.ts +1 -1
  908. package/scripts/version/fresh-metadata-cache.ts +2 -2
  909. package/scripts/version/latest-corepack.ts +26 -26
  910. package/scripts/version/latest-lane-guard.ts +1 -1
  911. package/scripts/version/latest-scope-cli.ts +2 -2
  912. package/scripts/version/latest-stamp.ts +1 -2
  913. package/scripts/version/latest-update.ts +2 -2
  914. package/scripts/version/npm-registry.ts +2 -2
  915. package/scripts/version/package-manager-version.ts +18 -0
  916. package/scripts/version/publishable-range-check.ts +2 -1
  917. package/scripts/version/publishable-range.ts +1 -1
  918. package/scripts/version/release-age.ts +11 -11
  919. package/scripts/version/release-hold.ts +2 -2
  920. package/scripts/version/safe-chain-version-update.ts +3 -3
  921. package/scripts/version/version-check-logic.ts +2 -3
  922. package/scripts/version/version-check.ts +1 -2
  923. package/scripts/version/version-command-config.ts +2 -2
  924. package/scripts/version/version-commands.ts +3 -3
  925. package/scripts/version/version-remote.ts +4 -4
  926. package/scripts/version/version-targets.ts +2 -2
  927. package/templates/gitignore +7 -0
  928. package/dist/hooks/chunk-KHX4U3BG.js +0 -6400
  929. package/dist/hooks/chunk-RKUAD3I6.js +0 -90
  930. package/dist/hooks/chunk-WPALEIRX.js +0 -18
  931. package/scripts/backlog/backlog-restructure.ts +0 -152
  932. package/scripts/rules/issue-fold-rule.ts +0 -72
  933. package/scripts/rules/wip-cap.ts +0 -63
  934. package/scripts/run/run-issue-number.ts +0 -19
@@ -4,16 +4,18 @@ import { fileURLToPath } from 'node:url'
4
4
  import { cli_flags } from '#scripts/lib/cli-flags'
5
5
  import { lane_capacity } from './lane-capacity'
6
6
  import { lane_ledger } from './lane-ledger'
7
- import { lane_load } from './lane-load'
7
+ import { lane_sampler, type MeasureContext } from './lane-sampler'
8
+ import { lane_stage_stats } from './lane-stage-stats'
8
9
  import { lane_stats } from './lane-stats'
9
10
 
10
- // `josh lane:sample` / `josh lane:stats` — the lane-limit measurement (joshuafolkken/kit#3355).
11
+ // `josh lane:sample` / `josh lane:stats` — the lane-limit measurement.
11
12
  //
12
13
  // `lane:sample` appends one machine-load sample to the ledger, or one every `--every <seconds>` until it
13
14
  // is stopped; `lane:stats` reduces a period of the ledger to the one table row #3347 records per lane
14
- // limit. The merges and the gates write themselves (`run:merge`, `josh gate`), so a person runs only
15
- // the sampler beside a `backlogrun` and closes the period with `lane:stats`. The procedure is
16
- // `docs/maintainers/lane-limit-measurement.md`.
15
+ // limit, and under it the per-stage durations of the period's lanes. Every entry writes itself during
16
+ // a `backlogrun` — the merges, the gates, the stages, and the load `backlog:drive` samples while it
17
+ // runs — so a person only closes the period with `lane:stats`; `lane:sample` is for a load reading
18
+ // outside one. The procedure is `docs/maintainers/lane-limit-measurement.md`.
17
19
 
18
20
  const ARGV_OFFSET = 2
19
21
  const FAILURE_EXIT_CODE = 1
@@ -28,12 +30,6 @@ const USAGE = [
28
30
  const SAMPLE_OPTIONS = { every: { type: 'string' } } as const
29
31
  const STATS_OPTIONS = { period: { type: 'string' }, limit: { type: 'string' } } as const
30
32
 
31
- // Where the ledger is and what "now" is, overridable so a test reads a fixed ledger at a fixed instant.
32
- interface MeasureContext {
33
- ledger_path?: string
34
- now_ms?: number
35
- }
36
-
37
33
  function refuse(): number {
38
34
  console.error(USAGE)
39
35
 
@@ -47,12 +43,6 @@ function positive(text: string | undefined): number | undefined {
47
43
  return text !== undefined && Number.isFinite(value) && value > 0 ? value : undefined
48
44
  }
49
45
 
50
- async function take_sample(context: MeasureContext): Promise<void> {
51
- const at = new Date(context.now_ms ?? Date.now()).toISOString()
52
-
53
- await lane_ledger.record(await lane_load.sample(at), context.ledger_path)
54
- }
55
-
56
46
  // The `--every` interval: `{ seconds: undefined }` for a single sample, `undefined` for a refusal.
57
47
  function sample_interval(rest: ReadonlyArray<string>): { seconds: number | undefined } | undefined {
58
48
  const values = cli_flags.values_of(rest, SAMPLE_OPTIONS)
@@ -71,7 +61,7 @@ function sample_interval(rest: ReadonlyArray<string>): { seconds: number | undef
71
61
  async function keep_sampling(context: MeasureContext, seconds: number): Promise<void> {
72
62
  const ticks = every(seconds * MS_PER_SECOND, context)
73
63
 
74
- for await (const tick_context of ticks) await take_sample(tick_context)
64
+ for await (const tick_context of ticks) await lane_sampler.take(tick_context)
75
65
  }
76
66
 
77
67
  // One sample now, then — with `--every` — one per interval.
@@ -83,7 +73,7 @@ async function sample_command(
83
73
 
84
74
  if (interval === undefined) return refuse()
85
75
 
86
- await take_sample(context)
76
+ await lane_sampler.take(context)
87
77
 
88
78
  if (interval.seconds !== undefined) await keep_sampling(context, interval.seconds)
89
79
 
@@ -92,10 +82,10 @@ async function sample_command(
92
82
 
93
83
  // The label defaults to the limit this process reads, which is the period's limit only when nobody
94
84
  // changed it since — `--limit` names it outright.
95
- function limit_label(given: string | undefined): string {
85
+ async function limit_label(given: string | undefined): Promise<string> {
96
86
  if (given !== undefined) return given
97
87
 
98
- const choice = lane_capacity.lane_limit()
88
+ const choice = await lane_capacity.lane_limit()
99
89
 
100
90
  return choice.kind === 'limit' ? String(choice.limit) : lane_stats.MISSING
101
91
  }
@@ -118,10 +108,11 @@ async function stats_command(
118
108
  if (values === undefined || period_days === undefined) return refuse()
119
109
 
120
110
  const window = lane_stats.window_of(period_days, context.now_ms ?? Date.now())
121
- const label = { limit: limit_label(values.limit), period_days }
122
- const row = lane_stats.row(await read_ledger(context), window, label)
111
+ const label = { limit: await limit_label(values.limit), period_days }
112
+ const entries = await read_ledger(context)
113
+ const row = lane_stats.row(entries, window, label)
123
114
 
124
- console.info(`${lane_stats.header()}\n${row}`)
115
+ console.info(`${lane_stats.header()}\n${row}\n\n${lane_stage_stats.table(entries, window)}`)
125
116
 
126
117
  return 0
127
118
  }
@@ -145,5 +136,4 @@ const lane_measure_cli = {
145
136
 
146
137
  if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
147
138
 
148
- export type { MeasureContext }
149
139
  export { lane_measure_cli }
@@ -1,5 +1,7 @@
1
+ import { session_cite } from '#scripts/issue/session-cite'
2
+
1
3
  // The difference between the issues an `in-progress` label says are running and the lanes that are
2
- // actually open (joshuafolkken/kit#2235).
4
+ // actually open.
3
5
  //
4
6
  // `epic:next` counts lane occupancy from the `in-progress` label list; `lane:list` reads the work
5
7
  // trees that are actually open. Nothing named the difference, so a session read hand-made signals —
@@ -69,15 +71,15 @@ function classify(in_progress: ReadonlyArray<number>, lanes: LaneRead): Occupanc
69
71
  }
70
72
 
71
73
  function stopped_line(issue: number): string {
72
- return `⚠ ${STOPPED} #${String(issue)} — carries \`in-progress\` but no lane is open — a stale label. Remove it if the run is done (labels are a person's to change), or reopen the lane.`
74
+ return `⚠ ${STOPPED} ${session_cite.issue(issue)} — carries \`in-progress\` but no lane is open — a stale label. Remove it if the run is done (labels are a person's to change), or reopen the lane.`
73
75
  }
74
76
 
75
77
  function unknown_line(issue: number): string {
76
- return `⚠ ${UNKNOWN} #${String(issue)} — carries \`in-progress\` but the lane listing could not be read, so whether its lane is live is unknown — do not treat it as stopped.`
78
+ return `⚠ ${UNKNOWN} ${session_cite.issue(issue)} — carries \`in-progress\` but the lane listing could not be read, so whether its lane is live is unknown — do not treat it as stopped.`
77
79
  }
78
80
 
79
81
  function without_label_line(issue: number): string {
80
- return `⚠ a lane is open for #${String(issue)} but it carries no \`in-progress\` label — another session could claim the same issue. Apply the label or close the lane (a person's, never this command's).`
82
+ return `⚠ a lane is open for ${session_cite.issue(issue)} but it carries no \`in-progress\` label — another session could claim the same issue. Apply the label or close the lane (a person's, never this command's).`
81
83
  }
82
84
 
83
85
  function labelled_lines(labelled: ReadonlyArray<LabelledIssue>): Array<string> {
@@ -2,6 +2,7 @@ import { mkdirSync, readdirSync, rmSync, writeFileSync } from 'node:fs'
2
2
  import path from 'node:path'
3
3
  import { ENV_FILE_NAME } from '#ports'
4
4
  import { git_worktree } from '#scripts/git/git-worktree'
5
+ import { session_cite } from '#scripts/issue/session-cite'
5
6
  import { file_reader } from '#scripts/lib/read-file'
6
7
  import { lane_cache } from './lane-cache'
7
8
  import { lane_environment } from './lane-environment'
@@ -12,8 +13,7 @@ import { lane_registry, type LaneInfo } from './lane-registry'
12
13
  import { lane_seed_policy } from './lane-seed'
13
14
  import { lane_start_point } from './lane-start-point'
14
15
 
15
- // Opening a lane: one linked work tree, one branch, one port seed, and the dependencies to run in it
16
- // (joshuafolkken/kit#1490, joshuafolkken/kit#1554).
16
+ // Opening a lane: one linked work tree, one branch, one port seed, and the dependencies to run in it.
17
17
  //
18
18
  // **The reading side of a linked work tree already worked; only the creating side was missing.**
19
19
  // `git_directories()` resolves the tree's own git directory, `run-hold.ts` keys its record on it and
@@ -41,7 +41,7 @@ const FULL_OUTCOME: OpenOutcome = { kind: 'full' }
41
41
  // `lane_paths.SEAT_LOCK_DIR`, in the lanes root and clear of the lanes themselves (which are numbered, never dot-prefixed). The claim
42
42
  // is what closes the gap between reading the free seats and writing the lane's `.env`: two
43
43
  // `lane:open` runs that both saw seat 1 free cannot both create the same lock, so the loser steps to
44
- // the next free seat (joshuafolkken/kit#1494). The lock is released once the lane's `.env` is on
44
+ // the next free seat. The lock is released once the lane's `.env` is on
45
45
  // disk and the seat is discoverable — or on any failure — so only a hard crash mid-open can strand
46
46
  // one, which removing the lanes-root `.seat-locks` directory clears.
47
47
  const SEAT_LOCK_PREFIX = 'seat-'
@@ -132,8 +132,8 @@ function reserve_seat(root: string, free: ReadonlyArray<number>): SeatReservatio
132
132
  * collision nothing reports until an E2E run fails somewhere else. Failing here names the lane and
133
133
  * what to do about it.
134
134
  *
135
- * **A lane git already lists but whose `.env` is not yet on disk is mid-open, not broken**
136
- * (joshuafolkken/kit#2147). It holds a seat lock from its seat claim until its `.env` write — the
135
+ * **A lane git already lists but whose `.env` is not yet on disk is mid-open, not broken**.
136
+ * It holds a seat lock from its seat claim until its `.env` write — the
137
137
  * whole window in which it reads as unreadable — and that lock keeps its seat off this open's table
138
138
  * (`reserve_seat` cannot claim a locked seat), so tolerating it here cannot cause a collision. The
139
139
  * count of held locks is the count of opens in flight, so only the unreadable lanes beyond it are
@@ -145,7 +145,9 @@ function guard_unreadable(root: string, lanes: ReadonlyArray<LaneInfo>): void {
145
145
 
146
146
  if (unreadable.length <= open_in_flight_count(root)) return
147
147
 
148
- const named = unreadable.map((lane) => `#${lane.issue} (${lane.directory})`).join(', ')
148
+ const named = unreadable
149
+ .map((lane) => `${session_cite.issue(lane.issue)} (${lane.directory})`)
150
+ .join(', ')
149
151
 
150
152
  throw new Error(
151
153
  `Cannot read the port seed of these open lanes, so a free seat cannot be chosen: ${named}. Restore each lane's ${ENV_FILE_NAME}, or close the lane with \`pnpm josh lane:close <issue-number>\`.`,
@@ -157,7 +159,7 @@ function guard_unreadable(root: string, lanes: ReadonlyArray<LaneInfo>): void {
157
159
  *
158
160
  * Reported as a success, the caller captures the directory and types the first `pnpm josh …` in it —
159
161
  * which fails with `tsx: command not found`, the exact failure the install exists to remove, now
160
- * with a success line printed above it (joshuafolkken/kit#1554). The work tree is left where it is
162
+ * with a success line printed above it. The work tree is left where it is
161
163
  * because both ways out need it there: the install can be run again against it, or `lane:close` can
162
164
  * take it away. The child's own output is carried along, since it is the only thing that says which
163
165
  * of the two applies.
@@ -166,7 +168,7 @@ function guard_install(lane: LaneInfo, result: InstallResult): void {
166
168
  if (result.is_installed) return
167
169
 
168
170
  throw new Error(
169
- `Opened a lane for #${lane.issue} at ${lane.directory}, but installing its dependencies failed, so no \`pnpm josh …\` will run there. Finish it with \`pnpm --dir ${lane.directory} install --frozen-lockfile\`, or take it away with \`pnpm josh lane:close ${lane.issue}\`.\n${result.output}`,
171
+ `Opened a lane for ${session_cite.issue(lane.issue)} at ${lane.directory}, but installing its dependencies failed, so no \`pnpm josh …\` will run there. Finish it with \`pnpm --dir ${lane.directory} install --frozen-lockfile\`, or take it away with \`pnpm josh lane:close ${lane.issue}\`.\n${result.output}`,
170
172
  )
171
173
  }
172
174
 
@@ -196,19 +198,19 @@ function build_plan(
196
198
  //
197
199
  // The start point comes from `lane_start_point` rather than from the default branch's bare name:
198
200
  // that name resolves to a local ref nothing advances, and the lane would start without the work
199
- // merged just before it (joshuafolkken/kit#1535). **It answers `undefined` when a branch of this
201
+ // merged just before it. **It answers `undefined` when a branch of this
200
202
  // lane's name already exists**, which puts the work tree on that branch instead of creating one —
201
- // the only route back to a child that was parked after pushing (joshuafolkken/kit#1627).
203
+ // the only route back to a child that was parked after pushing.
202
204
  //
203
- // **The install is the last step rather than a caller's, because a lane without it is unusable**
204
- // (joshuafolkken/kit#1554). Leaving it to whoever opened the lane made it a step nothing enforced,
205
+ // **The install is the last step rather than a caller's, because a lane without it is unusable**.
206
+ // Leaving it to whoever opened the lane made it a step nothing enforced,
205
207
  // and every lane opened without it failed on its first `pnpm josh …`. It runs after the `.env`
206
208
  // rather than before, so a lane that fails here still carries the seat it was allocated and the
207
209
  // failure is recoverable by re-running the install alone.
208
210
  //
209
- // **The gate's verification caches are seeded from the main checkout before the install**
210
- // (joshuafolkken/kit#1849), so the lane's first `josh gate` is warm rather than cold. The pre-built
211
- // hook bundles are seeded the same way (joshuafolkken/kit#2160): `dist/hooks/` is git-ignored, so a
211
+ // **The gate's verification caches are seeded from the main checkout before the install**,
212
+ // so the lane's first `josh gate` is warm rather than cold. The pre-built
213
+ // hook bundles are seeded the same way: `dist/hooks/` is git-ignored, so a
212
214
  // lane's work tree never carries it and every Claude Code hook drops to the slow `pnpm josh …`
213
215
  // fallback without this copy. Both are best-effort and run after the `.env` write for the same reason
214
216
  // the install does: a lane whose warming found nothing still carries its seat and is perfectly
@@ -217,7 +219,7 @@ async function materialize(plan: LanePlan, source_root: string): Promise<void> {
217
219
  // The seat lock is released the moment the `.env` is on disk — from then the lane is readable and
218
220
  // its seat discoverable, so nothing more holds the seat. It must **not** ride the multi-minute
219
221
  // install: a lock outlasting the unreadable window would inflate `open_in_flight_count` and mask a
220
- // genuinely broken lane (joshuafolkken/kit#2147). The `finally` covers a failure before the `.env`
222
+ // genuinely broken lane. The `finally` covers a failure before the `.env`
221
223
  // is written, where nothing was created that should hold it.
222
224
  try {
223
225
  mkdirSync(path.dirname(plan.lane.directory), { recursive: true })
@@ -236,8 +238,7 @@ async function materialize(plan: LanePlan, source_root: string): Promise<void> {
236
238
  }
237
239
 
238
240
  // Both refusals run before the seat is claimed, so neither leaves a lock behind. A directory at the
239
- // lane's path that git does not register is `lane_leftover`'s to remove or refuse
240
- // (joshuafolkken/kit#2857).
241
+ // lane's path that git does not register is `lane_leftover`'s to remove or refuse.
241
242
  async function clear_the_way(
242
243
  root: string,
243
244
  issue: string,
@@ -257,7 +258,7 @@ async function clear_the_way(
257
258
  async function open_lane(issue: string): Promise<OpenOutcome> {
258
259
  // The main work tree's, never this one's: run from inside a lane, the current root would put the
259
260
  // new lane under `<lane>/.<lane>-lanes` and read the lane's own seed as the root's — a lane
260
- // `list_lanes` cannot see, on ports it never recorded (joshuafolkken/kit#1497).
261
+ // `list_lanes` cannot see, on ports it never recorded.
261
262
  const repository_root = await lane_registry.main_repository_root()
262
263
  const lanes = await lane_registry.list_lanes()
263
264
  const existing = lane_registry.find_lane(lanes, issue)
@@ -2,12 +2,13 @@ import { writeFileSync } from 'node:fs'
2
2
  import path from 'node:path'
3
3
  import { ENV_FILE_NAME } from '#ports'
4
4
  import type { AgentProfile } from '#scripts/agent/agent-role-profile'
5
+ import { session_cite } from '#scripts/issue/session-cite'
5
6
  import { run_liveness } from '#scripts/run/run-liveness'
6
7
  import { lane_environment } from './lane-environment'
7
8
  import { lane_registry, type LaneInfo } from './lane-registry'
8
9
 
9
10
  // Where the delegated unit running a lane's child writes, recorded in the lane and read back from
10
- // anywhere (joshuafolkken/kit#1713).
11
+ // anywhere.
11
12
  //
12
13
  // **This is the one fact about an in-flight lane that only the dispatching session held.** The
13
14
  // harness names a unit's output file after that session's own id and the unit's, and neither is
@@ -106,10 +107,10 @@ function describe_refusal(refusal: Refusal, issue: string): string {
106
107
  }
107
108
 
108
109
  if (refusal.kind === 'unreadable') {
109
- return `The lane for #${issue} has a ${ENV_FILE_NAME} that cannot be read at ${refusal.lane.directory}. Fix it and run this again — writing a new one would drop the lane's port seat with it.`
110
+ return `The lane for ${session_cite.issue(issue)} has a ${ENV_FILE_NAME} that cannot be read at ${refusal.lane.directory}. Fix it and run this again — writing a new one would drop the lane's port seat with it.`
110
111
  }
111
112
 
112
- return `No lane is open for #${issue}. Run \`pnpm josh lane:list\` to see what is open.`
113
+ return `No lane is open for ${session_cite.issue(issue)}. Run \`pnpm josh lane:list\` to see what is open.`
113
114
  }
114
115
 
115
116
  const lane_output = {
@@ -1,6 +1,7 @@
1
1
  import path from 'node:path'
2
+ import { issue_number_shape } from '#scripts/issue/issue-number-shape'
2
3
 
3
- // Where a lane lives on disk, and what its branch is called (joshuafolkken/kit#1490).
4
+ // Where a lane lives on disk, and what its branch is called.
4
5
  //
5
6
  // **A lane is deliberately not nested inside the repository.** A linked work tree is a second full
6
7
  // checkout, so putting it under the main one would hand every path-walking tool in the project a
@@ -13,7 +14,7 @@ import path from 'node:path'
13
14
  const LANE_ROOT_KEY = 'JOSH_LANE_ROOT'
14
15
  const LANE_DIRECTORY_SUFFIX = '-lanes'
15
16
  // **The issue number comes first because `pnpm josh git` will not commit from a branch that starts
16
- // any other way** (joshuafolkken/kit#1497). Its `has_same_issue_prefix` reads `/^\d+-/`, so the
17
+ // any other way**. Its `has_same_issue_prefix` reads `/^\d+-/`, so the
17
18
  // original `lane/<N>` spelling made every lane a checkout nothing could be committed from — and
18
19
  // switching the branch inside the lane is not the way round it, because `lane_registry` identifies a
19
20
  // lane *by* this name: the moment it changes, the work tree drops out of `lane:list`, its seat is
@@ -43,9 +44,6 @@ function lane_directory(root: string, issue: string): string {
43
44
  return path.join(root, issue)
44
45
  }
45
46
 
46
- // A lane directory's own name is the issue number, so the number a checkout belongs to is readable
47
- // from its path alone.
48
- const LANE_ISSUE_PATTERN = /^\d+$/u
49
47
  // Built from the suffix above rather than spelled again, so the two readings of a lane root cannot
50
48
  // drift apart. `.kit-lanes` and `.app-kit-lanes` both match; a plain `lanes` does not, because
51
49
  // `default_lane_root` always writes the leading dot.
@@ -62,10 +60,13 @@ function is_lane_root(directory: string, environment: LaneEnvironment): boolean
62
60
  // **The inverse of `lane_directory`, and the one lane test that needs no git.** `lane_registry`
63
61
  // answers the same question authoritatively by parsing `git worktree list`, but that read is
64
62
  // asynchronous and a `PreToolUse` guard is synchronous by contract — so a guard that has to know
65
- // whether the checkout it is running in is a lane reads it off the path instead
66
- // (joshuafolkken/kit#1864). It is deliberately the weaker of the two: it says the directory *sits
63
+ // whether the checkout it is running in is a lane reads it off the path instead.
64
+ // It is deliberately the weaker of the two: it says the directory *sits
67
65
  // where a lane sits*, never that a work tree is registered there, so a caller that needs the
68
66
  // registration still goes through `lane_registry`.
67
+ //
68
+ // A lane directory's own name is the issue number, so the number a checkout belongs to is readable
69
+ // from its path alone.
69
70
  function lane_issue_of(
70
71
  directory: string,
71
72
  environment: LaneEnvironment = process.env,
@@ -73,7 +74,7 @@ function lane_issue_of(
73
74
  const resolved = path.resolve(directory)
74
75
  const issue = path.basename(resolved)
75
76
 
76
- if (!LANE_ISSUE_PATTERN.test(issue)) return undefined
77
+ if (!issue_number_shape.ISSUE_NUMBER_PATTERN.test(issue)) return undefined
77
78
 
78
79
  return is_lane_root(path.dirname(resolved), environment) ? issue : undefined
79
80
  }
@@ -83,14 +84,14 @@ function lane_branch(issue: string): string {
83
84
  }
84
85
 
85
86
  // The lanes root's own bookkeeping, beside the lanes and never one of them: `lane:open` claims a seat
86
- // by creating a lock directory under it (joshuafolkken/kit#1494).
87
+ // by creating a lock directory under it.
87
88
  const SEAT_LOCK_DIR = '.seat-locks'
88
89
 
89
90
  // A name the lane machinery writes into a lanes root: a lane's issue number, or a lanes root of its
90
91
  // own — the nested one a lane opened from inside a lane once put there. Anything else in the root
91
- // was put there by someone else (joshuafolkken/kit#3370).
92
+ // was put there by someone else.
92
93
  function is_lane_entry(name: string): boolean {
93
- return LANE_ISSUE_PATTERN.test(name) || DEFAULT_LANE_ROOT_PATTERN.test(name)
94
+ return issue_number_shape.ISSUE_NUMBER_PATTERN.test(name) || DEFAULT_LANE_ROOT_PATTERN.test(name)
94
95
  }
95
96
 
96
97
  const lane_paths = {
@@ -0,0 +1,33 @@
1
+ import { issue_cite } from '#scripts/issue/issue-cite'
2
+ import { run_event_plan } from '#scripts/run/event/run-event-plan'
3
+ import { run_event_stream } from '#scripts/run/event/run-event-stream'
4
+ import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
5
+ import { lane_child_marker, type MarkerSource } from './lane-child-marker'
6
+
7
+ // The `implement` phase a lane child reports to `run:board`. Every other phase
8
+ // is read off an event the run already writes — the launch, the ship stages — but nothing marked the
9
+ // moment the plan turned into code. The first runtime-file edit is that moment, and the Step 0 notice
10
+ // already fires on it once per session, so the pretool hook calls this beside it. The Step 0 work summary
11
+ // is where a plan settles, so the issue's `plan` event is written here first, unless `run:entry` already
12
+ // wrote it for a planned issue.
13
+ //
14
+ // **A dispatched lane child only.** A person's own session, or one carrying a mark leaked from a parent,
15
+ // is not a lane the board draws a row for, so it writes nothing.
16
+ async function mark_implement(
17
+ directory: string = process.cwd(),
18
+ source: MarkerSource = process.env,
19
+ ): Promise<void> {
20
+ const issue = lane_child_marker.marked_issue(source)
21
+
22
+ if (issue === undefined || !lane_child_marker.is_child_of(directory, source)) return
23
+
24
+ await run_event_plan.emit_plan(issue)
25
+ await run_event_stream_emit.emit(
26
+ run_event_stream.EVENT_KIND.LANE_PHASE,
27
+ `${issue_cite.plain(issue)} implement`,
28
+ )
29
+ }
30
+
31
+ const lane_phase = { mark_implement }
32
+
33
+ export { lane_phase }
@@ -2,7 +2,7 @@ import { execFileSync } from 'node:child_process'
2
2
  import { PROBE_TIMEOUT_MS } from '#scripts/lib/timeouts'
3
3
  import { lane_child_invocation } from './lane-child-invocation'
4
4
 
5
- // Ending a lane child that did not end itself (joshuafolkken/kit#2421).
5
+ // Ending a lane child that did not end itself.
6
6
  //
7
7
  // **A detached child is kept alive on purpose and was never ended by anything.** `detached_launch`
8
8
  // lets a child outlive its parent's session, and every reader of it — `run:liveness`, the 30-minute
@@ -89,7 +89,7 @@ function ancestry_of(pid: number, probes: ReapProbes): Set<number> {
89
89
  }
90
90
 
91
91
  // This process and every process above it. The Stop hook reads it to tell whether the session that
92
- // declared a carry record's `--owner "$PPID"` is the one it runs under (joshuafolkken/kit#2472).
92
+ // declared a carry record's `--owner "$PPID"` is the one it runs under.
93
93
  function own_ancestry(probes: ReapProbes = SYSTEM_PROBES): Set<number> {
94
94
  return ancestry_of(process.pid, probes)
95
95
  }
@@ -5,11 +5,12 @@ import type { AgentProfile } from '#scripts/agent/agent-role-profile'
5
5
  import { repo_discovery } from '#scripts/discovery/repo-discovery'
6
6
  import { git_command } from '#scripts/git/git-command'
7
7
  import { git_worktree } from '#scripts/git/git-worktree'
8
+ import { issue_number_shape } from '#scripts/issue/issue-number-shape'
8
9
  import { file_reader } from '#scripts/lib/read-file'
9
10
  import { lane_environment } from './lane-environment'
10
11
  import { lane_paths } from './lane-paths'
11
12
 
12
- // The open lanes, read from git and from each lane's own `.env` (joshuafolkken/kit#1490).
13
+ // The open lanes, read from git and from each lane's own `.env`.
13
14
  //
14
15
  // **There is no ledger file, and that is the design rather than an omission.** A lane's seat has to
15
16
  // live in its `.env` anyway — that file is what `josh port` and `playwright.config.ts` read inside
@@ -25,11 +26,11 @@ interface LaneInfo {
25
26
  directory: string
26
27
  // The lane's seat (`JOSH_LANE_SEAT`, 1..9), and the dev/preview ports it resolves to through
27
28
  // `ports/index.js` — all `undefined` when the lane's `.env` cannot be read. The seat is what a new
28
- // lane's allocation has to avoid; the ports are what the report shows (joshuafolkken/kit#1494).
29
+ // lane's allocation has to avoid; the ports are what the report shows.
29
30
  seat: number | undefined
30
31
  development_port: number | undefined
31
32
  preview_port: number | undefined
32
- // Where the delegated unit running this lane's child writes (joshuafolkken/kit#1713), or
33
+ // Where the delegated unit running this lane's child writes, or
33
34
  // `undefined` where the lane records none. It is the one thing about a lane that a session which
34
35
  // did not open it cannot derive: the harness names a unit's file after the dispatching session
35
36
  // and the unit's own id, neither of which is written anywhere else on disk. Recorded here, a
@@ -43,10 +44,6 @@ interface LaneInfo {
43
44
  const WORKTREE_PREFIX = 'worktree '
44
45
  const BRANCH_PREFIX = 'branch refs/heads/'
45
46
  const BLOCK_SEPARATOR = '\n\n'
46
- // The same shape `lane:open` accepts. Nothing reserves the `-lane` suffix, so a hand-made
47
- // `spike-lane` branch with a work tree would otherwise be read as a lane — and `lane:close --all`
48
- // would delete its directory and its branch on an issue number that never existed.
49
- const ISSUE_PATTERN = /^[1-9]\d*$/u
50
47
 
51
48
  function line_value(lines: ReadonlyArray<string>, prefix: string): string | undefined {
52
49
  return lines.find((line) => line.startsWith(prefix))?.slice(prefix.length)
@@ -101,7 +98,7 @@ function held_seat(content: string | undefined): SeatPorts {
101
98
  /**
102
99
  * The lane's own `.env`, or `undefined` when it cannot be read.
103
100
  *
104
- * One read serves both the seat and the recorded output path (joshuafolkken/kit#1713). Reading the
101
+ * One read serves both the seat and the recorded output path. Reading the
105
102
  * file twice would let the two disagree about whether it could be read at all, and `unreadable` is
106
103
  * a state the report shows rather than a state anything falls back from.
107
104
  */
@@ -112,12 +109,16 @@ function read_environment(directory: string): string | undefined {
112
109
  // A lane is identified by its branch rather than by where it sits, so nothing here compares two
113
110
  // spellings of one path — git prints the resolved one, and a lane root reached through a symlink
114
111
  // would otherwise read as no lane at all.
112
+ //
113
+ // The issue is the same shape `lane:open` accepts. Nothing reserves the `-lane` suffix, so a hand-made
114
+ // `spike-lane` branch with a work tree would otherwise be read as a lane — and `lane:close --all`
115
+ // would delete its directory and its branch on an issue number that never existed.
115
116
  function branch_issue(branch: string | undefined): string | undefined {
116
117
  if (!branch?.endsWith(lane_paths.LANE_BRANCH_SUFFIX)) return undefined
117
118
 
118
119
  const issue = branch.slice(0, -lane_paths.LANE_BRANCH_SUFFIX.length)
119
120
 
120
- return ISSUE_PATTERN.test(issue) ? issue : undefined
121
+ return issue_number_shape.ISSUE_NUMBER_PATTERN.test(issue) ? issue : undefined
121
122
  }
122
123
 
123
124
  // **Stranded means the work tree is gone from disk, and nothing else.** git also marks a
@@ -154,8 +155,8 @@ function build_lane(
154
155
  }
155
156
  }
156
157
 
157
- // **A lane is its branch *and* its place, and the place is what makes the identification safe**
158
- // (joshuafolkken/kit#1497). The branch alone is not a namespace anyone stays out of: `pnpm josh git`
158
+ // **A lane is its branch *and* its place, and the place is what makes the identification safe**.
159
+ // The branch alone is not a namespace anyone stays out of: `pnpm josh git`
159
160
  // builds an issue branch as `<N>-<slug of the title>`, so an issue titled "Lane" produces `<N>-lane`
160
161
  // — byte for byte the name `lane_paths.lane_branch` builds. Read as a lane, that work tree is
161
162
  // whichever checkout the person was working in, and `lane:close --all` would delete it, because
@@ -194,11 +195,11 @@ async function worktree_blocks(): Promise<Array<string>> {
194
195
  /**
195
196
  * The main work tree's root, whichever work tree this was run in.
196
197
  *
197
- * **Every lane path is derived from here, and `git rev-parse --show-toplevel` is not it**
198
- * (joshuafolkken/kit#1497). That answers the *current* work tree, which inside a lane is the lane
198
+ * **Every lane path is derived from here, and `git rev-parse --show-toplevel` is not it**.
199
+ * That answers the *current* work tree, which inside a lane is the lane
199
200
  * itself — so `lane:list` run there would look for lanes under `<lane>/.<lane>-lanes` and report that
200
201
  * none are open while six are running. The step from the current work tree to the main one is exactly
201
- * what `repo_discovery.main_worktree` resolves from the filesystem (joshuafolkken/kit#2233), so this
202
+ * what `repo_discovery.main_worktree` resolves from the filesystem, so this
202
203
  * is a thin async layer over it: `repository_root()` names the current work tree, and the shared
203
204
  * resolver walks its `.git`/`commondir` up to the main checkout. Keeping that walk in one place lets
204
205
  * the synchronous discovery callers — which cannot await this — share the same answer. For an ordinary
@@ -252,7 +253,7 @@ function find_lane(lanes: ReadonlyArray<LaneInfo>, issue: string): LaneInfo | un
252
253
  /**
253
254
  * The open lane for one issue, read from the listing every other lane reading goes through.
254
255
  *
255
- * **The listing and the find are one call because every caller needs both** (joshuafolkken/kit#1749).
256
+ * **The listing and the find are one call because every caller needs both**.
256
257
  * Each one that wrote the pair itself is a place the listing could be read differently — from a cache,
257
258
  * from a stale array — and the whole point of reading it live is that the answer is the same in every
258
259
  * session, including one that never opened the lane.
@@ -8,8 +8,8 @@ import type { LaneInfo } from './lane-registry'
8
8
 
9
9
  // Relaunching a lane child session into its own lane — a fresh agent process started detached, under
10
10
  // the lane's stored profile at the effort of the phase it resumes into, logging to the lane's dispatch
11
- // log and carrying the dispatch mark afresh. **It was `run:cut`'s alone until a second caller needed it**
12
- // (joshuafolkken/kit#2428): the detached `josh ship` supervisor hands a stopped stage back to an agent
11
+ // log and carrying the dispatch mark afresh. **It was `run:cut`'s alone until a second caller needed it**:
12
+ // the detached `josh ship` supervisor hands a stopped stage back to an agent
13
13
  // the same way the pre-gate cut hands the gate to one, so the launch is shared rather than copied — the
14
14
  // copy that drifts is the one that forgets the mark and is read as a person by every guard.
15
15
  //
@@ -38,9 +38,9 @@ function relaunch(
38
38
  log_path: lane_dispatch_log.default_log_path(lane),
39
39
  profile: built.profile,
40
40
  // The relaunch keeps the mark, so the resumed child is still a dispatched child to every rule
41
- // that reads it (joshuafolkken/kit#1904); the inherited environment cannot be relied on here,
42
- // since the parent-session strip runs on the way in. **The ship supervisor's mark is dropped**
43
- // (joshuafolkken/kit#2428): a detached supervisor is what relaunches after a stopped stage, and an
41
+ // that reads it; the inherited environment cannot be relied on here,
42
+ // since the parent-session strip runs on the way in. **The ship supervisor's mark is dropped**:
43
+ // a detached supervisor is what relaunches after a stopped stage, and an
44
44
  // agent that inherited its mark would read its own in-turn `josh ship` failure as a supervisor's —
45
45
  // relaunching a second child into the lane beside itself.
46
46
  env: { ...lane_child_marker.env_for(lane.issue), [SUPERVISED_KEY]: undefined },
@@ -50,14 +50,14 @@ function relaunch(
50
50
  }
51
51
 
52
52
  // An OpenAI lane's process is started by its supervisor, never by a relaunch — both `run:cut` and the
53
- // `run:merge` cut fallback ask this one predicate (joshuafolkken/kit#2484).
53
+ // `run:merge` cut fallback ask this one predicate.
54
54
  function is_openai_lane(lane: LaneInfo): boolean {
55
55
  return lane.profile?.provider === OPENAI_PROVIDER
56
56
  }
57
57
 
58
- // The relaunch after a cut: the resume-specific prompt, not the record's bare `fullrun #<N>`
59
- // (joshuafolkken/kit#2022), so the successor goes straight to `run:cut --resume` without reading the
60
- // workflow-commands entry documents. Shared by `run:cut` and the `run:merge` fallback (joshuafolkken/kit#2484).
58
+ // The relaunch after a cut: the resume-specific prompt, not the record's bare `fullrun #<N>`,
59
+ // so the successor goes straight to `run:cut --resume` without reading the
60
+ // workflow-commands entry documents. Shared by `run:cut` and the `run:merge` fallback.
61
61
  function resume(lane: LaneInfo, phase: string, on_note: (note: string) => void): RelaunchResult {
62
62
  return relaunch(lane, lane_child_invocation.resume_invocation(lane.issue), phase, on_note)
63
63
  }
@@ -1,9 +1,10 @@
1
1
  import { agent_role_profile } from '#scripts/agent/agent-role-profile'
2
2
  import { issue_cite, type IssueCiter } from '#scripts/issue/issue-cite'
3
+ import { session_cite } from '#scripts/issue/session-cite'
3
4
  import { run_liveness } from '#scripts/run/run-liveness'
4
5
  import type { LaneInfo } from './lane-registry'
5
6
 
6
- // What a person reads when they ask what is open (joshuafolkken/kit#1490, joshuafolkken/kit#1494).
7
+ // What a person reads when they ask what is open.
7
8
  //
8
9
  // The dev and preview ports are the ones the registry already resolved through `ports/index.js`
9
10
  // when it read each lane's `.env`, so the numbers printed here are the same ones `josh port` and
@@ -31,7 +32,7 @@ function value_or_unknown(value: number | undefined): string {
31
32
  }
32
33
 
33
34
  // The recorded output path goes last and is labelled, so it is told apart from the directory beside
34
- // it (joshuafolkken/kit#1713). A lane that records none prints `output -` rather than nothing at
35
+ // it. A lane that records none prints `output -` rather than nothing at
35
36
  // all: a session that did not open the lane has to be able to see that the record is missing, not
36
37
  // read a shorter row as one field it failed to notice.
37
38
  function output_column(output: string | undefined): string {
@@ -52,7 +53,7 @@ function event_column(lane: LaneInfo): string {
52
53
  // The plain `#N`, for a caller that could not read the repository the issue would link into.
53
54
  const PLAIN_CITE: IssueCiter = issue_cite.citer(undefined, new Map())
54
55
 
55
- // The issue leads as a citation (joshuafolkken/kit#2943): a lane status report copies this row, and a
56
+ // The issue leads as a citation: a lane status report copies this row, and a
56
57
  // bare `#N` copied into it is what the Stop guard sends back.
57
58
  function describe_lane(lane: LaneInfo, cite: IssueCiter = PLAIN_CITE): string {
58
59
  return [
@@ -84,7 +85,7 @@ function describe_ports(lane: LaneInfo): string {
84
85
  // The one-line confirmation a person reads on standard error while standard output carries the
85
86
  // directory alone, so `dir=$(pnpm josh lane:open 1490)` stays usable.
86
87
  function describe_opened(lane: LaneInfo): string {
87
- return `Opened a lane for #${lane.issue} on ${lane.branch}: ${describe_ports(lane)}.`
88
+ return `Opened a lane for ${session_cite.issue(lane.issue)} on ${lane.branch}: ${describe_ports(lane)}.`
88
89
  }
89
90
 
90
91
  const lane_report = {
@@ -3,8 +3,8 @@ import { api_outage } from '#scripts/agent/api-outage'
3
3
  import type { ClaudeResultEvent } from '#scripts/agent/claude-result-event'
4
4
  import { lane_child_invocation } from './lane-child-invocation'
5
5
 
6
- // How a lane re-dispatch chooses between resuming the disconnected child's session and starting fresh
7
- // (joshuafolkken/kit#2317). The premise the whole issue rests on: a child that could not reach the API
6
+ // How a lane re-dispatch chooses between resuming the disconnected child's session and starting fresh.
7
+ // The premise the whole issue rests on: a child that could not reach the API
8
8
  // left a `session_id` in its exit record, and re-dispatching it as a bare `fullrun #<N>` threw that
9
9
  // context away — a resumed child keeps it and loses only the last round-trip.
10
10
  //