@joshuafolkken/kit 1.1240.0 → 1.1370.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (934) hide show
  1. package/.claude/agents/investigator.md +1 -0
  2. package/.claude/settings.json +4 -0
  3. package/.claude/skills/dependency-update/SKILL.md +5 -3
  4. package/.claude/skills/epic-commands/SKILL.md +82 -113
  5. package/.claude/skills/epic-commands/epic-bundle.md +38 -63
  6. package/.claude/skills/epic-commands/execution-waves.md +30 -51
  7. package/.claude/skills/verify-ui/SKILL.md +13 -20
  8. package/.claude/skills/workflow-commands/SKILL.md +10 -10
  9. package/.claude/skills/workflow-commands/background-commands.md +4 -4
  10. package/.claude/skills/workflow-commands/backlogrun-child.md +30 -105
  11. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +29 -0
  12. package/.claude/skills/workflow-commands/backlogrun-lanes.md +45 -131
  13. package/.claude/skills/workflow-commands/backlogrun-park.md +36 -53
  14. package/.claude/skills/workflow-commands/backlogrun-progress.md +81 -331
  15. package/.claude/skills/workflow-commands/backlogrun-recovery.md +29 -83
  16. package/.claude/skills/workflow-commands/backlogrun-steps.md +105 -424
  17. package/.claude/skills/workflow-commands/backlogrun.md +50 -61
  18. package/.claude/skills/workflow-commands/chain-rule.md +36 -40
  19. package/.claude/skills/workflow-commands/entry-sequence.md +6 -6
  20. package/.claude/skills/workflow-commands/followup.md +19 -20
  21. package/.claude/skills/workflow-commands/fullrun-steps.md +23 -27
  22. package/.claude/skills/workflow-commands/fullrun.md +10 -10
  23. package/.claude/skills/workflow-commands/halfrun.md +9 -8
  24. package/.claude/skills/workflow-commands/into-target.md +12 -18
  25. package/.claude/skills/workflow-commands/issue-comments.md +11 -26
  26. package/.claude/skills/workflow-commands/kickoff.md +26 -16
  27. package/.claude/skills/workflow-commands/latest-gate.md +17 -28
  28. package/.claude/skills/workflow-commands/needs-human-review.md +13 -24
  29. package/.claude/skills/workflow-commands/observation-filing.md +37 -28
  30. package/.claude/skills/workflow-commands/observation-ledger.md +48 -38
  31. package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -9
  32. package/.claude/skills/workflow-commands/prerequisite.md +23 -15
  33. package/.claude/skills/workflow-commands/progress-watcher.md +17 -11
  34. package/.claude/skills/workflow-commands/prrun.md +3 -3
  35. package/.claude/skills/workflow-commands/retrospective.md +13 -18
  36. package/.claude/skills/workflow-commands/split-assessment.md +6 -4
  37. package/.claude/skills/workflow-commands/target-repository.md +25 -28
  38. package/.claude/skills/workflow-commands/working-tree-hold.md +11 -17
  39. package/.gitattributes +2 -1
  40. package/.github/workflows/ci.yml +14 -0
  41. package/.vscode/tasks.json +14 -0
  42. package/CLAUDE.md +10 -61
  43. package/README.md +29 -47
  44. package/SECURITY.md +1 -1
  45. package/dist/CLAUDE.md +10 -61
  46. package/dist/commands/document-section-cli.js +42 -10
  47. package/dist/config-merge/index.js +11 -2
  48. package/dist/hooks/audit-provision.js +2 -2
  49. package/dist/hooks/batch-guard.js +7 -7
  50. package/dist/hooks/{chunk-KHGB5S3Y.js → chunk-43G45XJF.js} +18 -20
  51. package/dist/hooks/{chunk-4TZVB44A.js → chunk-4TW4MQUL.js} +284 -362
  52. package/dist/hooks/{chunk-XZYKEM6J.js → chunk-76RK6E3H.js} +13 -11
  53. package/dist/hooks/{chunk-F3ELQ2AF.js → chunk-DZWZ3DKY.js} +4 -4
  54. package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
  55. package/dist/hooks/{chunk-GPTFMK5E.js → chunk-GG72ANKI.js} +1 -1
  56. package/dist/hooks/{chunk-ZQGD4GBY.js → chunk-KPM4YIIX.js} +8 -44
  57. package/dist/hooks/chunk-MXVQMLDP.js +3705 -0
  58. package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
  59. package/dist/hooks/{chunk-QVSWU24O.js → chunk-NZBHG6FW.js} +7 -5
  60. package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
  61. package/dist/hooks/{chunk-KRBERBBI.js → chunk-R6CRQEAL.js} +4 -4
  62. package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
  63. package/dist/hooks/{chunk-WK2XSHSI.js → chunk-TLJYAGZK.js} +549 -874
  64. package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
  65. package/dist/hooks/codex-hook-adapter.js +26 -21
  66. package/dist/hooks/duplicate-read-guard.js +8 -8
  67. package/dist/hooks/format-edited.js +4 -4
  68. package/dist/hooks/inputs.json +216 -202
  69. package/dist/hooks/investigation-guard.js +8 -8
  70. package/dist/hooks/pretool-guard.js +15 -15
  71. package/dist/hooks/session-lang.js +406 -8
  72. package/dist/hooks/stop-guard.js +122 -187
  73. package/dist/josh.js +281 -94
  74. package/dist/version/index.js +15 -13
  75. package/eslint/base.js +43 -5
  76. package/eslint/rules/english-only-prose.js +3 -3
  77. package/eslint/rules/import.js +12 -0
  78. package/eslint/rules/namespace-object-export.js +2 -2
  79. package/package.json +16 -10
  80. package/pnpm-workspace.yaml +2 -4
  81. package/prompts/coding-standards.md +14 -48
  82. package/prompts/collaboration-workflow/file-edits.md +1 -1
  83. package/prompts/collaboration-workflow/issue-citation.md +1 -1
  84. package/prompts/collaboration-workflow/issue-template.md +3 -10
  85. package/prompts/collaboration-workflow/operating-rules.md +7 -8
  86. package/prompts/collaboration-workflow/output-bounds.md +1 -1
  87. package/prompts/collaboration-workflow/overview.md +1 -1
  88. package/prompts/collaboration-workflow/plan-comment.md +2 -1
  89. package/prompts/collaboration-workflow/principles.md +21 -3
  90. package/prompts/collaboration-workflow/report-format.md +16 -29
  91. package/prompts/collaboration-workflow/residency.md +1 -1
  92. package/prompts/collaboration-workflow/rule-delivery.md +7 -95
  93. package/prompts/collaboration-workflow/shell-body.md +3 -23
  94. package/prompts/collaboration-workflow/turn-batching.md +4 -13
  95. package/prompts/collaboration-workflow/wip-cap.md +5 -11
  96. package/prompts/refactoring.md +1 -1
  97. package/prompts/review-rubric.md +3 -22
  98. package/prompts/review.md +15 -38
  99. package/prompts/testing-guide.md +2 -4
  100. package/scripts/adopt/adopt-logic.ts +5 -5
  101. package/scripts/adopt/adopt-toolkits.ts +4 -5
  102. package/scripts/adopt/adopt.ts +2 -3
  103. package/scripts/agent/agent-argv.ts +7 -7
  104. package/scripts/agent/agent-diagnostics.ts +2 -2
  105. package/scripts/agent/agent-exit-record.ts +1 -1
  106. package/scripts/agent/agent-headless.ts +1 -1
  107. package/scripts/agent/agent-launch-environment.ts +6 -1
  108. package/scripts/agent/agent-role-profile.ts +49 -22
  109. package/scripts/agent/agent-session-role.ts +32 -0
  110. package/scripts/agent/api-outage.ts +1 -1
  111. package/scripts/agent/claude-agent-argv.ts +4 -4
  112. package/scripts/agent/claude-result-event.ts +4 -4
  113. package/scripts/agent/codex-hooks.ts +2 -2
  114. package/scripts/agent/interactive-ask.ts +3 -6
  115. package/scripts/auto-ok/auto-ok-cli.ts +46 -60
  116. package/scripts/backlog/backlog-arrival-added.ts +34 -0
  117. package/scripts/backlog/backlog-arrival.ts +54 -17
  118. package/scripts/backlog/backlog-budget-cli.ts +34 -6
  119. package/scripts/backlog/backlog-budget.ts +17 -24
  120. package/scripts/backlog/backlog-defect-priority.ts +1 -1
  121. package/scripts/backlog/backlog-drive-args.ts +5 -4
  122. package/scripts/backlog/backlog-drive-cli.ts +14 -10
  123. package/scripts/backlog/backlog-drive-epic.ts +85 -0
  124. package/scripts/backlog/backlog-drive-launch.ts +1 -1
  125. package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
  126. package/scripts/backlog/backlog-drive-named.ts +39 -9
  127. package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
  128. package/scripts/backlog/backlog-drive-restore.ts +1 -1
  129. package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
  130. package/scripts/backlog/backlog-drive.ts +43 -28
  131. package/scripts/backlog/backlog-idle.ts +88 -0
  132. package/scripts/backlog/backlog-named.ts +11 -15
  133. package/scripts/backlog/backlog-next.ts +26 -30
  134. package/scripts/backlog/backlog-offer-cli.ts +28 -23
  135. package/scripts/backlog/backlog-offer.ts +7 -7
  136. package/scripts/backlog/backlog-overlap.ts +178 -0
  137. package/scripts/backlog/backlog-plan-cli.ts +14 -90
  138. package/scripts/backlog/backlog-plan-read.ts +111 -0
  139. package/scripts/backlog/backlog-plan.ts +11 -10
  140. package/scripts/backlog/backlog-pool.ts +13 -14
  141. package/scripts/backlog/backlog-rank.ts +11 -11
  142. package/scripts/backlog/backlog-ready.ts +15 -10
  143. package/scripts/backlog/backlog-scope.ts +14 -15
  144. package/scripts/backlog/backlog-stalled-cli.ts +2 -2
  145. package/scripts/backlog/backlog-stalled-detect.ts +4 -4
  146. package/scripts/backlog/backlog-stalled.ts +5 -6
  147. package/scripts/backlog/backlog-waves.ts +4 -4
  148. package/scripts/backlog/backlogrun-args.ts +74 -0
  149. package/scripts/backlog/backlogrun-cli.ts +113 -0
  150. package/scripts/backlog/backlogrun-launch.ts +178 -0
  151. package/scripts/behavior/behavior-assertion.ts +6 -8
  152. package/scripts/behavior/behavior-cli.ts +1 -1
  153. package/scripts/behavior/behavior-rules.ts +3 -3
  154. package/scripts/build/build-claude-md.ts +4 -4
  155. package/scripts/build/build-codex-hooks.ts +2 -2
  156. package/scripts/build/build-commands.ts +1 -1
  157. package/scripts/build/build-hooks.ts +5 -5
  158. package/scripts/build/build.ts +1 -1
  159. package/scripts/build/hook-bundle-stamp.ts +109 -7
  160. package/scripts/build/local-bin.ts +2 -2
  161. package/scripts/cases/cases-cli.ts +1 -1
  162. package/scripts/cases/cases-logic.ts +2 -2
  163. package/scripts/ci/composite-actions.ts +1 -2
  164. package/scripts/ci/pr-classification.ts +2 -2
  165. package/scripts/claude/workflow-destination.ts +1 -1
  166. package/scripts/clone/clone-aggregate.ts +1 -1
  167. package/scripts/clone/clone-fingerprint.ts +1 -1
  168. package/scripts/clone/clone-scan-cli.ts +1 -1
  169. package/scripts/clone/clone-scan.ts +1 -1
  170. package/scripts/config-merge/index.ts +1 -1
  171. package/scripts/config-merge/json-format.ts +1 -3
  172. package/scripts/config-merge/patch-json-array.ts +90 -0
  173. package/scripts/config-merge/patch-json-key.ts +6 -3
  174. package/scripts/config-merge/patch-json-list.ts +1 -1
  175. package/scripts/cost-runtime/codex-usage.ts +1 -1
  176. package/scripts/cost-runtime/context-cut-payback.ts +4 -5
  177. package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
  178. package/scripts/cost-runtime/cost-attribute.ts +3 -3
  179. package/scripts/cost-runtime/cost-blocks.ts +3 -4
  180. package/scripts/cost-runtime/cost-cli.ts +14 -11
  181. package/scripts/cost-runtime/cost-corpus.ts +11 -11
  182. package/scripts/cost-runtime/cost-pricing.ts +4 -4
  183. package/scripts/cost-runtime/cost-tokens.ts +1 -2
  184. package/scripts/cost-runtime/cost-transcript.ts +29 -29
  185. package/scripts/cost-runtime/cost-usage.ts +6 -7
  186. package/scripts/cost-runtime/cost-verdict.ts +10 -11
  187. package/scripts/cost-runtime/own-session.ts +1 -1
  188. package/scripts/cost-runtime/transcript-cwd.ts +2 -2
  189. package/scripts/delegation/delegation-cli.ts +4 -4
  190. package/scripts/delegation/delegation-policy.ts +13 -15
  191. package/scripts/delegation/duplicate-read-guard.ts +9 -10
  192. package/scripts/delegation/fanout-cli.ts +1 -1
  193. package/scripts/delegation/fanout.ts +1 -1
  194. package/scripts/delegation/investigation-guard.ts +18 -22
  195. package/scripts/delegation/investigation-reads.ts +48 -238
  196. package/scripts/discovery/repo-discovery.ts +1 -1
  197. package/scripts/discovery/repo-map-logic.ts +1 -2
  198. package/scripts/discovery/repo-origin.ts +3 -3
  199. package/scripts/discovery/repo-party-cli.ts +2 -2
  200. package/scripts/discovery/repo-party.ts +2 -2
  201. package/scripts/doctor/doctor-consumer.ts +1 -1
  202. package/scripts/doctor/doctor-io.ts +6 -7
  203. package/scripts/doctor/doctor-logic.ts +1 -1
  204. package/scripts/doctor/doctor-ports.ts +1 -1
  205. package/scripts/doctor/doctor.ts +8 -9
  206. package/scripts/document/backlogrun-parent-read-set.ts +5 -6
  207. package/scripts/document/bash-output-cap.ts +5 -7
  208. package/scripts/document/capped-print-part.ts +1 -1
  209. package/scripts/document/capped-print.ts +1 -1
  210. package/scripts/document/document-byte-budget.ts +33 -64
  211. package/scripts/document/document-byte-check.ts +4 -4
  212. package/scripts/document/document-reachability.ts +7 -8
  213. package/scripts/document/document-read-cli.ts +2 -2
  214. package/scripts/document/document-scan.ts +26 -2
  215. package/scripts/document/document-section-cli.ts +6 -8
  216. package/scripts/document/document-section.ts +8 -12
  217. package/scripts/document/edit-files-cli.ts +3 -4
  218. package/scripts/document/entry-read-budget.ts +8 -70
  219. package/scripts/document/entry-read-set.ts +51 -34
  220. package/scripts/document/lane-child-read-set.ts +9 -9
  221. package/scripts/document/read-files-cli.ts +1 -2
  222. package/scripts/document/read-set-cli.ts +16 -19
  223. package/scripts/document/read-set-cost.ts +4 -4
  224. package/scripts/document/read-set-point-of-use.ts +28 -38
  225. package/scripts/document/read-set-pricing.ts +1 -1
  226. package/scripts/document/read-set-trim.ts +3 -3
  227. package/scripts/document/resident-budget.ts +8 -10
  228. package/scripts/epic/epic-add-body.ts +15 -18
  229. package/scripts/epic/epic-add-plan.ts +26 -28
  230. package/scripts/epic/epic-add.ts +32 -25
  231. package/scripts/epic/epic-audit-checks.ts +27 -37
  232. package/scripts/epic/epic-audit-cli.ts +21 -22
  233. package/scripts/epic/epic-audit-orphans.ts +16 -17
  234. package/scripts/epic/epic-audit-rationale.ts +10 -15
  235. package/scripts/epic/epic-audit-report.ts +2 -5
  236. package/scripts/epic/epic-audit.ts +18 -14
  237. package/scripts/epic/epic-body.ts +10 -10
  238. package/scripts/epic/epic-bundle-cli.ts +36 -34
  239. package/scripts/epic/epic-bundle-evidence.ts +5 -5
  240. package/scripts/epic/epic-bundle-gaps.ts +6 -9
  241. package/scripts/epic/epic-bundle-poll.ts +1 -1
  242. package/scripts/epic/epic-bundle-referenced.ts +11 -14
  243. package/scripts/epic/epic-bundle.ts +19 -20
  244. package/scripts/epic/epic-busy.ts +44 -21
  245. package/scripts/epic/epic-candidate-confirm.ts +15 -18
  246. package/scripts/epic/epic-chains.ts +18 -23
  247. package/scripts/epic/epic-classify.ts +11 -12
  248. package/scripts/epic/epic-cli-argv.ts +5 -6
  249. package/scripts/epic/epic-cli-remove.ts +9 -4
  250. package/scripts/epic/epic-cli.ts +38 -26
  251. package/scripts/epic/epic-close-comment.ts +14 -15
  252. package/scripts/epic/epic-close.ts +25 -29
  253. package/scripts/epic/epic-cross-repo.ts +18 -21
  254. package/scripts/epic/epic-decision.ts +14 -18
  255. package/scripts/epic/epic-fetch.ts +25 -31
  256. package/scripts/epic/epic-graph.ts +15 -17
  257. package/scripts/epic/epic-index.ts +14 -16
  258. package/scripts/epic/epic-issue.ts +9 -11
  259. package/scripts/epic/epic-label-age.ts +74 -0
  260. package/scripts/epic/epic-lane-offer.ts +35 -24
  261. package/scripts/epic/epic-nested.ts +1 -1
  262. package/scripts/epic/epic-next-read.ts +8 -8
  263. package/scripts/epic/epic-next-views.ts +12 -12
  264. package/scripts/epic/epic-next.ts +29 -33
  265. package/scripts/epic/epic-outside-blocker.ts +11 -10
  266. package/scripts/epic/epic-parse.ts +22 -24
  267. package/scripts/epic/epic-promote.ts +3 -2
  268. package/scripts/epic/epic-rank.ts +1 -1
  269. package/scripts/epic/epic-read.ts +10 -8
  270. package/scripts/epic/epic-reconcile.ts +8 -6
  271. package/scripts/epic/epic-reference.ts +5 -4
  272. package/scripts/epic/epic-relation-recheck.ts +10 -11
  273. package/scripts/epic/epic-relations.ts +9 -8
  274. package/scripts/epic/epic-remove-plan.ts +4 -5
  275. package/scripts/epic/epic-remove.ts +7 -5
  276. package/scripts/epic/epic-report.ts +18 -20
  277. package/scripts/epic/epic-run.ts +6 -5
  278. package/scripts/epic/epic-sections.ts +2 -2
  279. package/scripts/epic/epic-shape.ts +3 -3
  280. package/scripts/epic/epic-solo-stale.ts +3 -2
  281. package/scripts/epic/epic-solo.ts +8 -8
  282. package/scripts/epic/epic-triage.ts +5 -4
  283. package/scripts/epic/epic-validate.ts +8 -7
  284. package/scripts/epic/epic.ts +5 -5
  285. package/scripts/exports/unused-members-cli.ts +1 -1
  286. package/scripts/followup/followup-issue-number.ts +1 -2
  287. package/scripts/followup/git-followup-cleanup.ts +6 -7
  288. package/scripts/followup/git-followup-finish.ts +11 -13
  289. package/scripts/followup/git-followup-flush.ts +11 -7
  290. package/scripts/followup/git-followup-issue-close.ts +16 -13
  291. package/scripts/followup/git-followup-label.ts +9 -6
  292. package/scripts/followup/git-followup-merged.ts +1 -1
  293. package/scripts/followup/git-followup-pending.ts +7 -9
  294. package/scripts/followup/git-followup-stages.ts +28 -17
  295. package/scripts/followup/git-followup-workflow.ts +19 -21
  296. package/scripts/followup/git-pr-followup-checks.ts +13 -20
  297. package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
  298. package/scripts/followup/git-pr-followup.ts +18 -17
  299. package/scripts/gate/core-admission.ts +2 -2
  300. package/scripts/gate/core-budget.ts +15 -26
  301. package/scripts/gate/gate-ledger.ts +114 -0
  302. package/scripts/gate/gate-log.ts +7 -9
  303. package/scripts/gate/gate-plan.ts +70 -35
  304. package/scripts/gate/gate-report.ts +14 -15
  305. package/scripts/gate/gate-skip.ts +11 -13
  306. package/scripts/gate/gate-steps.ts +5 -1
  307. package/scripts/gate/gate-tree.ts +3 -4
  308. package/scripts/gate/hook-gate-reuse.ts +9 -9
  309. package/scripts/gate/machine-capacity.ts +168 -30
  310. package/scripts/gate/pre-commit-type-check.ts +4 -4
  311. package/scripts/gate/project-checks.ts +12 -4
  312. package/scripts/gate/scoped-green.ts +11 -18
  313. package/scripts/gate/type-check-command.ts +2 -2
  314. package/scripts/gate/type-check-step.ts +4 -4
  315. package/scripts/gate/verification-gate.ts +53 -51
  316. package/scripts/gh/gh-spawn.ts +2 -2
  317. package/scripts/gh/git-ai-review-scan.ts +3 -2
  318. package/scripts/gh/git-gh-api-path.ts +10 -11
  319. package/scripts/gh/git-gh-exec.ts +43 -48
  320. package/scripts/gh/git-gh-failure.ts +6 -9
  321. package/scripts/gh/git-gh-helpers.ts +1 -1
  322. package/scripts/gh/git-gh-issue-list.ts +15 -19
  323. package/scripts/gh/git-gh-issue-read.ts +43 -60
  324. package/scripts/gh/git-gh-issue-rest.ts +14 -15
  325. package/scripts/gh/git-gh-issue-write.ts +52 -40
  326. package/scripts/gh/git-gh-issue.ts +23 -24
  327. package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
  328. package/scripts/gh/git-gh-pr-read.ts +46 -50
  329. package/scripts/gh/git-gh-pr-rest.ts +23 -26
  330. package/scripts/gh/git-gh-pr-review.ts +2 -2
  331. package/scripts/gh/git-gh-pr-rollup.ts +4 -4
  332. package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
  333. package/scripts/gh/git-gh-pr.ts +16 -16
  334. package/scripts/gh/git-gh-reachability.ts +11 -12
  335. package/scripts/gh/git-gh-repo.ts +2 -3
  336. package/scripts/gh/git-gh-rest-state.ts +1 -1
  337. package/scripts/gh/git-pr-ai-review.ts +6 -5
  338. package/scripts/gh/git-pr-checks-eval.ts +28 -30
  339. package/scripts/gh/git-pr-checks-parse.ts +14 -16
  340. package/scripts/gh/git-pr-checks-watch.ts +17 -17
  341. package/scripts/gh/git-pr-checks.ts +20 -23
  342. package/scripts/gh/git-pr-coderabbit.ts +8 -6
  343. package/scripts/gh/git-pr-confirmation.ts +5 -5
  344. package/scripts/gh/git-pr-managed-config.ts +7 -9
  345. package/scripts/gh/git-pr-messages.ts +1 -1
  346. package/scripts/gh/git-pr.ts +15 -16
  347. package/scripts/gh/github-issue-url.ts +8 -9
  348. package/scripts/git/base-tree.ts +66 -0
  349. package/scripts/git/change-base.ts +42 -2
  350. package/scripts/git/changed-file-scope.ts +5 -5
  351. package/scripts/git/changed-paths.ts +1 -2
  352. package/scripts/git/constants.ts +2 -2
  353. package/scripts/git/git-branch.ts +1 -1
  354. package/scripts/git/git-closes-keyword.ts +3 -3
  355. package/scripts/git/git-command.ts +53 -41
  356. package/scripts/git/git-common-directory.ts +3 -3
  357. package/scripts/git/git-diff-reads.ts +14 -15
  358. package/scripts/git/git-error.ts +1 -1
  359. package/scripts/git/git-execa-error.ts +1 -2
  360. package/scripts/git/git-issue.ts +10 -8
  361. package/scripts/git/git-location-environment.ts +3 -4
  362. package/scripts/git/git-ls-remote.ts +6 -8
  363. package/scripts/git/git-pre-push-hook.ts +11 -10
  364. package/scripts/git/git-preflight.ts +5 -5
  365. package/scripts/git/git-push-transport.ts +2 -2
  366. package/scripts/git/git-remote-branch.ts +1 -2
  367. package/scripts/git/git-schemas.ts +16 -23
  368. package/scripts/git/git-spawn-sync.ts +1 -1
  369. package/scripts/git/git-spawn.ts +37 -14
  370. package/scripts/git/git-ssh-keepalive.ts +12 -5
  371. package/scripts/git/git-staging.ts +7 -8
  372. package/scripts/git/git-workflow.ts +1 -1
  373. package/scripts/git/git-worktree.ts +35 -27
  374. package/scripts/git/gone-branch.ts +2 -2
  375. package/scripts/git/listing-cutoff.ts +1 -2
  376. package/scripts/git/lockfile-sync.ts +65 -0
  377. package/scripts/git/main-merge-guard.ts +1 -2
  378. package/scripts/git/main-merge.ts +7 -7
  379. package/scripts/git/main-sync.ts +23 -8
  380. package/scripts/git/parse-json-array.ts +18 -23
  381. package/scripts/git/repository-lock.ts +34 -2
  382. package/scripts/git/stash/git-stash.ts +4 -5
  383. package/scripts/git/stash/stash-orphans.ts +5 -3
  384. package/scripts/git/stash/stash-pop-args.ts +1 -1
  385. package/scripts/git/stash/stash-pop-cli.ts +3 -3
  386. package/scripts/git/stash/stash-sweep-lock.ts +2 -2
  387. package/scripts/hooks/batch-guard.ts +11 -13
  388. package/scripts/hooks/check-commit-message.ts +12 -9
  389. package/scripts/hooks/codex-hook-adapter.ts +16 -10
  390. package/scripts/hooks/edited-cspell.ts +3 -4
  391. package/scripts/hooks/format-edited-cli.ts +1 -1
  392. package/scripts/hooks/format-edited-file.ts +11 -17
  393. package/scripts/hooks/format-rewrite-notice.ts +19 -17
  394. package/scripts/hooks/pre-push-unit.ts +10 -14
  395. package/scripts/hooks/pretool-guard-cli.ts +4 -4
  396. package/scripts/hooks/pretool-guard.ts +93 -18
  397. package/scripts/hooks/reserved-run.ts +2 -2
  398. package/scripts/hooks/step-zero-notice.ts +1 -1
  399. package/scripts/hooks/stop-guard.ts +21 -10
  400. package/scripts/init/basic-path-migration.ts +2 -2
  401. package/scripts/init/claude-kit-only-settings.ts +2 -2
  402. package/scripts/init/claude-plugin-config.ts +2 -2
  403. package/scripts/init/distributed-paths.ts +4 -4
  404. package/scripts/init/hook-command-rewrite.ts +3 -3
  405. package/scripts/init/hook-launch.ts +5 -5
  406. package/scripts/init/init-actions.ts +13 -0
  407. package/scripts/init/init-ai-copy.ts +11 -11
  408. package/scripts/init/init-bootstrap.ts +3 -3
  409. package/scripts/init/init-copy-content.ts +4 -4
  410. package/scripts/init/init-logic-json-merge.ts +7 -9
  411. package/scripts/init/init-logic-migrate.ts +1 -1
  412. package/scripts/init/init-logic-templates.ts +1 -1
  413. package/scripts/init/init-logic-workspace.ts +4 -4
  414. package/scripts/init/init-logic-yaml-merge.ts +2 -2
  415. package/scripts/init/init-logic.ts +19 -22
  416. package/scripts/init/init.ts +7 -7
  417. package/scripts/init/kit-base-preset.ts +1 -1
  418. package/scripts/init/kit-setup-state.ts +1 -1
  419. package/scripts/init/kit-written-paths.ts +1 -2
  420. package/scripts/init/package-manager-pin.ts +1 -1
  421. package/scripts/init/project-profile-cli.ts +1 -1
  422. package/scripts/init/project-profile.ts +3 -3
  423. package/scripts/init/session-language-environment.ts +1 -1
  424. package/scripts/init/start-exec.ts +3 -4
  425. package/scripts/init/start-plan.ts +2 -2
  426. package/scripts/init/start-setup-pr.ts +3 -2
  427. package/scripts/init/start-steps.ts +2 -2
  428. package/scripts/init/tsconfig-preset-migration.ts +1 -1
  429. package/scripts/init/vscode-tasks.ts +62 -0
  430. package/scripts/issue/baseline-measure.ts +2 -2
  431. package/scripts/issue/behavior-change-lint.ts +2 -2
  432. package/scripts/issue/defect-rate-cli.ts +6 -7
  433. package/scripts/issue/defect-rate.ts +37 -27
  434. package/scripts/issue/git-next-issues.ts +9 -8
  435. package/scripts/issue/issue-auto-ok.ts +24 -11
  436. package/scripts/issue/issue-backlinks-cli.ts +5 -5
  437. package/scripts/issue/issue-backlinks.ts +6 -6
  438. package/scripts/issue/issue-cite-cli.ts +20 -18
  439. package/scripts/issue/issue-cite.ts +18 -8
  440. package/scripts/issue/issue-closing-pr.ts +4 -4
  441. package/scripts/issue/issue-comment-cli.ts +6 -4
  442. package/scripts/issue/issue-file-cli.ts +52 -15
  443. package/scripts/issue/issue-file-fold.ts +155 -0
  444. package/scripts/issue/issue-file.ts +9 -6
  445. package/scripts/issue/issue-fold-cli.ts +14 -9
  446. package/scripts/issue/issue-fold.ts +23 -8
  447. package/scripts/issue/issue-labels.ts +34 -38
  448. package/scripts/issue/issue-lint-cli.ts +2 -2
  449. package/scripts/issue/issue-lint.ts +1 -1
  450. package/scripts/issue/issue-merged.ts +10 -4
  451. package/scripts/issue/issue-number-shape.ts +27 -0
  452. package/scripts/issue/issue-rank.ts +1 -1
  453. package/scripts/issue/issue-read-cli.ts +4 -5
  454. package/scripts/issue/issue-read.ts +4 -5
  455. package/scripts/issue/issue-reference.ts +5 -5
  456. package/scripts/issue/issue-release-cli.ts +17 -7
  457. package/scripts/issue/issue-release.ts +3 -3
  458. package/scripts/issue/issue-report-failures.ts +7 -4
  459. package/scripts/issue/issue-scout-cli.ts +11 -11
  460. package/scripts/issue/issue-scout-closed.ts +4 -4
  461. package/scripts/issue/issue-scout.ts +4 -5
  462. package/scripts/issue/issue-state-cli.ts +17 -10
  463. package/scripts/issue/issue-state.ts +12 -13
  464. package/scripts/issue/issue-wip.ts +7 -7
  465. package/scripts/issue/markdown-section.ts +3 -3
  466. package/scripts/issue/measure-rerun-cli.ts +10 -9
  467. package/scripts/issue/reproduction-measure.ts +3 -3
  468. package/scripts/issue/session-cite.ts +56 -0
  469. package/scripts/josh/agent-session-environment.ts +10 -8
  470. package/scripts/josh/cli-body.ts +2 -2
  471. package/scripts/josh/command-suggest.ts +1 -1
  472. package/scripts/josh/file-map-stamp.ts +20 -23
  473. package/scripts/josh/hook-decision.ts +24 -28
  474. package/scripts/josh/josh-command-map.ts +4 -1
  475. package/scripts/josh/josh-command-types.ts +30 -35
  476. package/scripts/josh/josh-commands-ai.ts +6 -6
  477. package/scripts/josh/josh-commands-backlog.ts +15 -3
  478. package/scripts/josh/josh-commands-clone.ts +1 -1
  479. package/scripts/josh/josh-commands-development.ts +25 -4
  480. package/scripts/josh/josh-commands-document.ts +3 -3
  481. package/scripts/josh/josh-commands-guard.ts +3 -3
  482. package/scripts/josh/josh-commands-issue.ts +4 -5
  483. package/scripts/josh/josh-commands-lane.ts +14 -4
  484. package/scripts/josh/josh-commands-lint.ts +1 -1
  485. package/scripts/josh/josh-commands-run.ts +20 -6
  486. package/scripts/josh/josh-commands-split.ts +1 -2
  487. package/scripts/josh/josh-commands-versioning.ts +5 -5
  488. package/scripts/josh/josh-commands-workflow.ts +30 -22
  489. package/scripts/josh/josh-environment-file.ts +1 -1
  490. package/scripts/josh/josh-in-process.ts +3 -3
  491. package/scripts/josh/josh-logic.ts +6 -7
  492. package/scripts/josh/josh-run.ts +3 -3
  493. package/scripts/josh/josh-verdict.ts +9 -12
  494. package/scripts/josh/josh.ts +3 -3
  495. package/scripts/josh/kit-only.ts +2 -2
  496. package/scripts/josh/path-decision.ts +3 -3
  497. package/scripts/josh/platform-temporary.ts +7 -5
  498. package/scripts/josh/process-identity.ts +24 -6
  499. package/scripts/josh/process-owner.ts +4 -4
  500. package/scripts/josh/session-language-cli.ts +53 -11
  501. package/scripts/josh/session-language.ts +1 -1
  502. package/scripts/josh/stamp-file.ts +48 -29
  503. package/scripts/josh/stamp-record.ts +57 -0
  504. package/scripts/lane/lane-await.ts +35 -11
  505. package/scripts/lane/lane-cache.ts +6 -6
  506. package/scripts/lane/lane-capacity.ts +32 -17
  507. package/scripts/lane/lane-child-invocation.ts +17 -15
  508. package/scripts/lane/lane-child-marker.ts +12 -12
  509. package/scripts/lane/lane-cli.ts +12 -13
  510. package/scripts/lane/lane-close.ts +6 -6
  511. package/scripts/lane/lane-dispatch.ts +61 -72
  512. package/scripts/lane/lane-environment.ts +5 -5
  513. package/scripts/lane/lane-guard-policy.ts +7 -21
  514. package/scripts/lane/lane-handoff.ts +2 -2
  515. package/scripts/lane/lane-install.ts +9 -10
  516. package/scripts/lane/lane-launch-cli.ts +13 -8
  517. package/scripts/lane/lane-ledger.ts +73 -11
  518. package/scripts/lane/lane-leftover.ts +2 -2
  519. package/scripts/lane/lane-limit-cli.ts +160 -0
  520. package/scripts/lane/lane-limit-override.ts +74 -0
  521. package/scripts/lane/lane-load.ts +19 -68
  522. package/scripts/lane/lane-measure-cli.ts +15 -25
  523. package/scripts/lane/lane-occupancy.ts +6 -4
  524. package/scripts/lane/lane-open.ts +20 -19
  525. package/scripts/lane/lane-output.ts +4 -3
  526. package/scripts/lane/lane-paths.ts +12 -11
  527. package/scripts/lane/lane-phase.ts +33 -0
  528. package/scripts/lane/lane-reap.ts +2 -2
  529. package/scripts/lane/lane-registry.ts +16 -15
  530. package/scripts/lane/lane-relaunch.ts +9 -9
  531. package/scripts/lane/lane-report.ts +5 -4
  532. package/scripts/lane/lane-resume.ts +2 -2
  533. package/scripts/lane/lane-sampler.ts +55 -0
  534. package/scripts/lane/lane-seed.ts +7 -7
  535. package/scripts/lane/lane-stage-stats.ts +135 -0
  536. package/scripts/lane/lane-start-point.ts +8 -11
  537. package/scripts/lane/lane-stats.ts +60 -15
  538. package/scripts/lane/lane-stray.ts +1 -1
  539. package/scripts/lane/lane-vacant.ts +1 -1
  540. package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
  541. package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
  542. package/scripts/lane/openai-review-broker.ts +2 -4
  543. package/scripts/lib/ancestor-directories.ts +1 -1
  544. package/scripts/lib/bounded-pool.ts +2 -2
  545. package/scripts/lib/buffered-process.ts +4 -6
  546. package/scripts/lib/caddy-logs.sh +0 -0
  547. package/scripts/lib/cli-flags.ts +39 -6
  548. package/scripts/lib/error-message.ts +1 -1
  549. package/scripts/lib/json-value.ts +17 -3
  550. package/scripts/lib/poll.ts +1 -1
  551. package/scripts/lib/status-icons.ts +3 -3
  552. package/scripts/lib/timed-fetch.ts +1 -1
  553. package/scripts/lib/timeouts.ts +1 -1
  554. package/scripts/lines/bytes-command.ts +3 -4
  555. package/scripts/lines/effective-limit.ts +25 -12
  556. package/scripts/lines/line-budget.ts +47 -55
  557. package/scripts/lines/line-targets.ts +6 -2
  558. package/scripts/lines/lines-command.ts +3 -3
  559. package/scripts/lint/cspell-cached.ts +1 -1
  560. package/scripts/lint/cycle-recheck.ts +122 -0
  561. package/scripts/lint/format.ts +1 -2
  562. package/scripts/lint/lint-parallel.ts +34 -19
  563. package/scripts/lint/lint-related-scope.ts +25 -15
  564. package/scripts/lint/lint-related.ts +6 -7
  565. package/scripts/managed-marker/index.ts +1 -1
  566. package/scripts/managed-marker/managed-marker-logic.ts +1 -2
  567. package/scripts/notify/git-notify.ts +9 -7
  568. package/scripts/notify/telegram-notify.ts +53 -37
  569. package/scripts/notify/telegram-test-logic.ts +3 -3
  570. package/scripts/notify/telegram-test.ts +45 -30
  571. package/scripts/observations/observation-ledger-home.ts +14 -8
  572. package/scripts/observations/observation-ledger-line.ts +3 -2
  573. package/scripts/observations/observation-ledger-migrate.ts +3 -4
  574. package/scripts/observations/observation-ledger-prepare.ts +4 -4
  575. package/scripts/observations/observation-ledger.ts +14 -15
  576. package/scripts/observations/observation-record-cli.ts +83 -0
  577. package/scripts/observations/observation-record.ts +91 -0
  578. package/scripts/observations/observations-flush-cli.ts +1 -1
  579. package/scripts/observations/observations-flush-landing.ts +7 -6
  580. package/scripts/observations/observations-flush.ts +26 -27
  581. package/scripts/overrides/overrides-check.ts +18 -8
  582. package/scripts/package/package-scout-cli.ts +1 -1
  583. package/scripts/package/package-scout-format.ts +2 -2
  584. package/scripts/package/package-scout.ts +1 -1
  585. package/scripts/propagate/propagate-git-failure.ts +1 -1
  586. package/scripts/propagate/propagate-git.ts +7 -7
  587. package/scripts/propagate/propagate-plan.ts +2 -2
  588. package/scripts/propagate/propagate-publish.ts +2 -3
  589. package/scripts/propagate/propagate-run.ts +5 -7
  590. package/scripts/propagate/propagate-select.ts +1 -1
  591. package/scripts/propagate/propagate-steps.ts +19 -20
  592. package/scripts/propagate/propagate-targets.ts +6 -10
  593. package/scripts/propagate/propagate.ts +5 -5
  594. package/scripts/refactor/import-graph.ts +1 -1
  595. package/scripts/refactor/refactor-lint.ts +4 -10
  596. package/scripts/refactor/refactor-scan-cli.ts +1 -1
  597. package/scripts/refactor/refactor-scan.ts +2 -2
  598. package/scripts/refactor/refactor-targets.ts +1 -1
  599. package/scripts/release/github-release-cli.ts +25 -3
  600. package/scripts/release/github-release-runs.ts +1 -1
  601. package/scripts/release/release-cli.ts +21 -4
  602. package/scripts/release/release-history.ts +6 -10
  603. package/scripts/release/release-plan.ts +3 -3
  604. package/scripts/release/release-progress.ts +3 -4
  605. package/scripts/release/release-publish.ts +8 -9
  606. package/scripts/release/release-scope-cli.ts +8 -10
  607. package/scripts/release/release-tag.ts +6 -8
  608. package/scripts/release/release-worktree.ts +5 -5
  609. package/scripts/repo/auto-merge-setting-logic.ts +7 -9
  610. package/scripts/repo/auto-merge-setting.ts +1 -1
  611. package/scripts/repo/repo-setting.ts +4 -4
  612. package/scripts/repo/repository-labels.ts +1 -1
  613. package/scripts/repo/required-checks-logic.ts +3 -3
  614. package/scripts/repo/required-checks-report.ts +1 -1
  615. package/scripts/repo/ruleset-check-cli.ts +1 -1
  616. package/scripts/repo/ruleset-check.ts +1 -1
  617. package/scripts/report/report-format-reference.ts +26 -0
  618. package/scripts/report/report-lint-cli.ts +2 -2
  619. package/scripts/report/report-lint.ts +16 -2
  620. package/scripts/review/disposition-cli.ts +2 -2
  621. package/scripts/review/disposition-logic.ts +1 -1
  622. package/scripts/review/live-evidence.ts +9 -6
  623. package/scripts/review/review-attest-cli.ts +1 -2
  624. package/scripts/review/review-attest.ts +3 -3
  625. package/scripts/review/review-brief-cli.ts +19 -20
  626. package/scripts/review/review-brief.ts +29 -32
  627. package/scripts/review/review-checkout.ts +2 -2
  628. package/scripts/review/review-diff-parts.ts +3 -5
  629. package/scripts/review/review-diff-write.ts +1 -1
  630. package/scripts/review/review-finding-ledger.ts +7 -4
  631. package/scripts/review/review-findings-cli.ts +2 -2
  632. package/scripts/review/review-level.ts +4 -7
  633. package/scripts/review/review-record-cli.ts +73 -16
  634. package/scripts/review/review-record.ts +5 -4
  635. package/scripts/review/review-round2-cli.ts +2 -3
  636. package/scripts/review/review-round2.ts +13 -21
  637. package/scripts/review/review-stamps.ts +9 -71
  638. package/scripts/review/review-tree.ts +4 -5
  639. package/scripts/rules/bash-triggers.ts +4 -4
  640. package/scripts/rules/decision-oracle-batch.ts +5 -6
  641. package/scripts/rules/decision-oracle-stage.ts +1 -1
  642. package/scripts/rules/decision-oracle-tokens.ts +1 -2
  643. package/scripts/rules/decision-oracle.ts +2 -2
  644. package/scripts/rules/delivered-rules.ts +61 -406
  645. package/scripts/rules/destructive-command.ts +2 -2
  646. package/scripts/rules/direct-filing.ts +4 -4
  647. package/scripts/rules/direct-pr-create.ts +2 -2
  648. package/scripts/rules/early-heartbeat.ts +15 -19
  649. package/scripts/rules/file-body.ts +5 -6
  650. package/scripts/rules/filing-cap.ts +6 -7
  651. package/scripts/rules/filing-offer.ts +1 -1
  652. package/scripts/rules/firing-point.ts +6 -6
  653. package/scripts/rules/gh-api.ts +2 -2
  654. package/scripts/rules/git-argv.ts +3 -3
  655. package/scripts/rules/git-force.ts +2 -2
  656. package/scripts/rules/hook-context-line.ts +31 -0
  657. package/scripts/rules/implementation-cut-verdict.ts +5 -8
  658. package/scripts/rules/implementation-cut.ts +35 -32
  659. package/scripts/rules/index-guard.ts +2 -2
  660. package/scripts/rules/issue-citation.ts +7 -7
  661. package/scripts/rules/issue-comments.ts +21 -13
  662. package/scripts/rules/josh-git-bare.ts +2 -2
  663. package/scripts/rules/lane-background.ts +14 -16
  664. package/scripts/rules/lane-carry-conflict.ts +41 -5
  665. package/scripts/rules/lane-interactive-ask.ts +6 -9
  666. package/scripts/rules/lane-park.ts +12 -16
  667. package/scripts/rules/lane-split-park.ts +1 -2
  668. package/scripts/rules/lane-switch-main.ts +10 -13
  669. package/scripts/rules/last-prompt.ts +1 -1
  670. package/scripts/rules/oracle-consulted.ts +5 -5
  671. package/scripts/rules/oracle-firing.ts +6 -9
  672. package/scripts/rules/oracle-list-cli.ts +2 -2
  673. package/scripts/rules/permission-guards.ts +2 -2
  674. package/scripts/rules/piped-verification.ts +79 -9
  675. package/scripts/rules/poll-loop.ts +9 -11
  676. package/scripts/rules/pre-gate-cut.ts +33 -30
  677. package/scripts/rules/prior-comment-read.ts +3 -3
  678. package/scripts/rules/protected-files.ts +25 -13
  679. package/scripts/rules/raw-field-body.ts +3 -4
  680. package/scripts/rules/reply-language.ts +1 -1
  681. package/scripts/rules/rule-body-guard.ts +10 -12
  682. package/scripts/rules/rule-guard.ts +1 -1
  683. package/scripts/rules/rule-list.ts +51 -0
  684. package/scripts/rules/rule-registry-rows.ts +282 -0
  685. package/scripts/rules/rule-registry.ts +109 -0
  686. package/scripts/rules/rule-value-cache.ts +2 -2
  687. package/scripts/rules/rule-value-cli.ts +6 -4
  688. package/scripts/rules/rule-value.ts +61 -22
  689. package/scripts/rules/run-tail-rule.ts +11 -15
  690. package/scripts/rules/shell-body-trigger.ts +7 -7
  691. package/scripts/rules/shell-segments.ts +2 -4
  692. package/scripts/rules/stop-rules.ts +54 -41
  693. package/scripts/rules/tail-commands.ts +1 -1
  694. package/scripts/rules/test-declared-commit.ts +2 -2
  695. package/scripts/rules/third-party-write.ts +3 -3
  696. package/scripts/rules/worktree-guard.ts +12 -5
  697. package/scripts/run/add/run-add-cli.ts +165 -0
  698. package/scripts/run/add/run-add.ts +124 -0
  699. package/scripts/run/board/run-board-cli.ts +207 -0
  700. package/scripts/run/board/run-board-closed.ts +95 -0
  701. package/scripts/run/board/run-board-every.ts +60 -0
  702. package/scripts/run/board/run-board-fetch.ts +38 -0
  703. package/scripts/run/board/run-board-fit.ts +219 -0
  704. package/scripts/run/board/run-board-github.ts +162 -0
  705. package/scripts/run/board/run-board-header.ts +275 -0
  706. package/scripts/run/board/run-board-kind.ts +35 -0
  707. package/scripts/run/board/run-board-labels.ts +299 -0
  708. package/scripts/run/board/run-board-layout.ts +222 -0
  709. package/scripts/run/board/run-board-link.ts +31 -0
  710. package/scripts/run/board/run-board-machine.ts +198 -0
  711. package/scripts/run/board/run-board-notes.ts +103 -0
  712. package/scripts/run/board/run-board-phase.ts +136 -0
  713. package/scripts/run/board/run-board-plan.ts +129 -0
  714. package/scripts/run/board/run-board-read.ts +62 -0
  715. package/scripts/run/board/run-board-render-legend.ts +82 -0
  716. package/scripts/run/board/run-board-render-notes.ts +77 -0
  717. package/scripts/run/board/run-board-render-slot.ts +50 -0
  718. package/scripts/run/board/run-board-render.ts +407 -0
  719. package/scripts/run/board/run-board-scope.ts +17 -0
  720. package/scripts/run/board/run-board-screen.ts +43 -0
  721. package/scripts/run/board/run-board-span.ts +66 -0
  722. package/scripts/run/board/run-board-spin.ts +115 -0
  723. package/scripts/run/board/run-board-state.ts +113 -0
  724. package/scripts/run/board/run-board-status.ts +279 -0
  725. package/scripts/run/board/run-board-tick.ts +210 -0
  726. package/scripts/run/board/run-board-track.ts +22 -0
  727. package/scripts/run/board/run-board-usage-read.ts +255 -0
  728. package/scripts/run/board/run-board-usage-rusage.ts +124 -0
  729. package/scripts/run/board/run-board-usage-text.ts +80 -0
  730. package/scripts/run/board/run-board-usage.ts +165 -0
  731. package/scripts/run/carry/run-carry-added.ts +62 -0
  732. package/scripts/run/carry/run-carry-args.ts +25 -22
  733. package/scripts/run/carry/run-carry-change.ts +1 -1
  734. package/scripts/run/carry/run-carry-cli.ts +71 -48
  735. package/scripts/run/carry/run-carry-conversation.ts +6 -7
  736. package/scripts/run/carry/run-carry-ended.ts +85 -0
  737. package/scripts/run/carry/run-carry-reclaim.ts +1 -1
  738. package/scripts/run/carry/run-carry-stash.ts +3 -2
  739. package/scripts/run/carry/run-carry-streak.ts +8 -10
  740. package/scripts/run/carry/run-carry.ts +85 -89
  741. package/scripts/run/cut/run-cut-args.ts +7 -7
  742. package/scripts/run/cut/run-cut-cli.ts +54 -36
  743. package/scripts/run/cut/run-cut-handoff.ts +15 -15
  744. package/scripts/run/cut/run-cut-report.ts +37 -16
  745. package/scripts/run/cut/run-cut.ts +63 -77
  746. package/scripts/run/detached-launch.ts +35 -50
  747. package/scripts/run/entry/run-entry-cli.ts +48 -27
  748. package/scripts/run/entry/run-entry-stop.ts +7 -9
  749. package/scripts/run/entry/run-entry.ts +5 -6
  750. package/scripts/run/event/run-event-cli.ts +5 -6
  751. package/scripts/run/event/run-event-filed.ts +69 -0
  752. package/scripts/run/event/run-event-follow.ts +3 -3
  753. package/scripts/run/event/run-event-plan.ts +38 -0
  754. package/scripts/run/event/run-event-render.ts +9 -4
  755. package/scripts/run/event/run-event-scope.ts +47 -18
  756. package/scripts/run/event/run-event-stream-emit.ts +64 -11
  757. package/scripts/run/event/run-event-stream.ts +171 -46
  758. package/scripts/run/event/run-event-watch.ts +4 -6
  759. package/scripts/run/hold/run-hold-cli.ts +65 -62
  760. package/scripts/run/hold/run-hold.ts +88 -46
  761. package/scripts/run/merge/run-merge-cli.ts +116 -77
  762. package/scripts/run/merge/run-merge-collect.ts +107 -0
  763. package/scripts/run/merge/run-merge-steps.ts +112 -65
  764. package/scripts/run/merge/run-merge-token.ts +30 -0
  765. package/scripts/run/merge/run-merge.ts +31 -22
  766. package/scripts/run/progress/run-progress-args.ts +4 -4
  767. package/scripts/run/progress/run-progress-cli.ts +39 -50
  768. package/scripts/run/progress/run-progress-clock.ts +25 -32
  769. package/scripts/run/progress/run-progress-config.ts +6 -9
  770. package/scripts/run/progress/run-progress-read.ts +9 -10
  771. package/scripts/run/progress/run-progress.ts +48 -53
  772. package/scripts/run/review/run-review-cli.ts +6 -6
  773. package/scripts/run/review/run-review-steps.ts +6 -6
  774. package/scripts/run/review/run-review.ts +9 -11
  775. package/scripts/run/run-cli-fault.ts +29 -0
  776. package/scripts/run/run-ending-cli.ts +3 -3
  777. package/scripts/run/run-ending.ts +10 -14
  778. package/scripts/run/run-halfrun-resume.ts +6 -8
  779. package/scripts/run/run-headless.ts +25 -12
  780. package/scripts/run/run-invocation.ts +17 -22
  781. package/scripts/run/run-label.ts +7 -5
  782. package/scripts/run/run-liveness-cli.ts +19 -6
  783. package/scripts/run/run-liveness.ts +27 -38
  784. package/scripts/run/run-next-cli.ts +5 -9
  785. package/scripts/run/run-next.ts +4 -5
  786. package/scripts/run/run-parent-cut-hook.ts +10 -12
  787. package/scripts/run/run-preflight.ts +25 -29
  788. package/scripts/run/run-prep-cli.ts +17 -13
  789. package/scripts/run/run-prep-locate.ts +4 -5
  790. package/scripts/run/run-prep.ts +7 -10
  791. package/scripts/run/run-prrun-resume.ts +2 -2
  792. package/scripts/run/run-report-cli.ts +4 -4
  793. package/scripts/run/run-report.ts +9 -14
  794. package/scripts/run/run-retrospective.ts +3 -3
  795. package/scripts/run/run-section.ts +42 -0
  796. package/scripts/run/run-stage-read.ts +2 -2
  797. package/scripts/run/run-stage.ts +6 -4
  798. package/scripts/run/run-status-cli.ts +7 -5
  799. package/scripts/run/run-status.ts +6 -7
  800. package/scripts/run/run-step-cli.ts +13 -15
  801. package/scripts/run/run-step.ts +58 -47
  802. package/scripts/run/run-stop-notify.ts +7 -8
  803. package/scripts/run/run-stranded-cli.ts +1 -1
  804. package/scripts/run/run-stranded-detect.ts +4 -4
  805. package/scripts/run/run-stranded.ts +11 -13
  806. package/scripts/run/run-tail-cli.ts +15 -16
  807. package/scripts/run/run-tail.ts +14 -33
  808. package/scripts/run/run-watcher-guard-cli.ts +3 -4
  809. package/scripts/run/run-watcher-guard.ts +11 -12
  810. package/scripts/run/run-watcher-hook.ts +6 -12
  811. package/scripts/run/ship/run-ship-cli.ts +67 -33
  812. package/scripts/run/ship/run-ship-detach.ts +15 -13
  813. package/scripts/run/ship/run-ship-lock.ts +1 -1
  814. package/scripts/run/ship/run-ship-next.ts +7 -8
  815. package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
  816. package/scripts/run/ship/run-ship-preflight.ts +10 -11
  817. package/scripts/run/ship/run-ship-probe.ts +4 -4
  818. package/scripts/run/ship/run-ship-return.ts +1 -1
  819. package/scripts/run/ship/run-ship-review-steps.ts +43 -24
  820. package/scripts/run/ship/run-ship-review.ts +12 -14
  821. package/scripts/run/ship/run-ship-scoped.ts +15 -6
  822. package/scripts/run/ship/run-ship-stage.ts +80 -26
  823. package/scripts/run/ship/run-ship-steps.ts +26 -16
  824. package/scripts/run/ship/run-ship-stop-text.ts +4 -2
  825. package/scripts/run/ship/run-ship-sync.ts +9 -8
  826. package/scripts/run/ship/run-ship.ts +17 -32
  827. package/scripts/run/tidy/run-tidy-cli.ts +9 -5
  828. package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
  829. package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
  830. package/scripts/run/tidy/run-tidy.ts +4 -3
  831. package/scripts/run/wake/run-wake-cli.ts +27 -32
  832. package/scripts/run/wake/run-wake-describe.ts +24 -28
  833. package/scripts/run/wake/run-wake-driver.ts +14 -14
  834. package/scripts/run/wake/run-wake-handoff.ts +6 -6
  835. package/scripts/run/wake/run-wake-loop.ts +9 -9
  836. package/scripts/run/wake/run-wake-restart.ts +4 -5
  837. package/scripts/run/wake/run-wake-session.ts +23 -27
  838. package/scripts/run/wake/run-wake.ts +57 -279
  839. package/scripts/safe-chain/ci-installer-pin.ts +3 -3
  840. package/scripts/safe-chain/pack-hook.ts +2 -2
  841. package/scripts/safe-chain/preinstall-command.ts +2 -2
  842. package/scripts/security/security-audit-logic.ts +1 -1
  843. package/scripts/security/security-audit-provision-logic.ts +1 -1
  844. package/scripts/security/security-audit-provision.ts +2 -2
  845. package/scripts/security/security-audit.ts +5 -5
  846. package/scripts/security/security-updates-logic.ts +2 -3
  847. package/scripts/security/security-updates.ts +2 -4
  848. package/scripts/self-sync-guard/index.ts +1 -1
  849. package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
  850. package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
  851. package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
  852. package/scripts/sonar/sonar-hotspots.ts +1 -1
  853. package/scripts/sonar/sonar-new-code-cli.ts +1 -1
  854. package/scripts/sonar/sonar-new-code.ts +1 -1
  855. package/scripts/sonar/sonar-project.ts +1 -1
  856. package/scripts/split/split-assess-cli.ts +1 -1
  857. package/scripts/split/split-assess.ts +3 -3
  858. package/scripts/sync/directory-copy-guard.ts +2 -3
  859. package/scripts/sync/managed-config-scope-cli.ts +1 -2
  860. package/scripts/sync/managed-config-scope.ts +4 -4
  861. package/scripts/sync/plugin-skill-directories.ts +2 -2
  862. package/scripts/sync/reconcile-templates.ts +17 -8
  863. package/scripts/sync/removed-skill-manifest.ts +2 -3
  864. package/scripts/sync/sync-ai-files.ts +7 -7
  865. package/scripts/sync/sync-configs.ts +30 -3
  866. package/scripts/sync/sync-hook-safety.ts +2 -2
  867. package/scripts/sync/sync.ts +23 -10
  868. package/scripts/sync/synced-paths.ts +2 -1
  869. package/scripts/sync/workflow-pin-logic.ts +1 -1
  870. package/scripts/test/test-declared-changed.ts +4 -4
  871. package/scripts/test/test-declared-logic.ts +2 -3
  872. package/scripts/test/test-declared-match.ts +25 -4
  873. package/scripts/test/test-declared.ts +26 -9
  874. package/scripts/test/test-red-commit.ts +3 -2
  875. package/scripts/test/test-red-logic.ts +7 -14
  876. package/scripts/test/test-red.ts +12 -47
  877. package/scripts/test/test-related-scope.ts +2 -3
  878. package/scripts/test/test-related.ts +3 -3
  879. package/scripts/test/test-type-logic.ts +1 -2
  880. package/scripts/test/test-unit-guard.ts +13 -17
  881. package/scripts/test/unit-worker-share.ts +7 -8
  882. package/scripts/time-runtime/time-agent-bundles.ts +2 -4
  883. package/scripts/time-runtime/time-background.ts +17 -21
  884. package/scripts/time-runtime/time-batch-guard.ts +67 -342
  885. package/scripts/time-runtime/time-bundle-call.ts +26 -28
  886. package/scripts/time-runtime/time-bundles.ts +11 -12
  887. package/scripts/time-runtime/time-call-identity.ts +1 -1
  888. package/scripts/time-runtime/time-command-key.ts +2 -2
  889. package/scripts/time-runtime/time-density-hook.ts +8 -11
  890. package/scripts/time-runtime/time-density.ts +5 -5
  891. package/scripts/time-runtime/time-followup-stage.ts +7 -7
  892. package/scripts/time-runtime/time-format.ts +5 -5
  893. package/scripts/time-runtime/time-hook-transcript.ts +3 -3
  894. package/scripts/time-runtime/time-instant.ts +1 -1
  895. package/scripts/time-runtime/time-markers.ts +15 -19
  896. package/scripts/time-runtime/time-phase-names.ts +3 -3
  897. package/scripts/time-runtime/time-reported-failure.ts +15 -19
  898. package/scripts/time-runtime/time-round-trips.ts +20 -23
  899. package/scripts/time-runtime/time-shell.ts +8 -8
  900. package/scripts/time-runtime/time-single-check.ts +1 -2
  901. package/scripts/time-runtime/time-spans.ts +35 -40
  902. package/scripts/time-runtime/time-tool-call.ts +15 -16
  903. package/scripts/time-runtime/time-transcript-line.ts +53 -34
  904. package/scripts/time-runtime/time-writes.ts +5 -5
  905. package/scripts/ui/ui-routes-cli.ts +1 -2
  906. package/scripts/ui/ui-routes.ts +1 -2
  907. package/scripts/version/bump-version.ts +1 -1
  908. package/scripts/version/fresh-metadata-cache.ts +2 -2
  909. package/scripts/version/latest-corepack.ts +26 -26
  910. package/scripts/version/latest-lane-guard.ts +1 -1
  911. package/scripts/version/latest-scope-cli.ts +2 -2
  912. package/scripts/version/latest-stamp.ts +1 -2
  913. package/scripts/version/latest-update.ts +2 -2
  914. package/scripts/version/npm-registry.ts +2 -2
  915. package/scripts/version/package-manager-version.ts +18 -0
  916. package/scripts/version/publishable-range-check.ts +2 -1
  917. package/scripts/version/publishable-range.ts +1 -1
  918. package/scripts/version/release-age.ts +11 -11
  919. package/scripts/version/release-hold.ts +2 -2
  920. package/scripts/version/safe-chain-version-update.ts +3 -3
  921. package/scripts/version/version-check-logic.ts +2 -3
  922. package/scripts/version/version-check.ts +1 -2
  923. package/scripts/version/version-command-config.ts +2 -2
  924. package/scripts/version/version-commands.ts +3 -3
  925. package/scripts/version/version-remote.ts +4 -4
  926. package/scripts/version/version-targets.ts +2 -2
  927. package/templates/gitignore +7 -0
  928. package/dist/hooks/chunk-KHX4U3BG.js +0 -6400
  929. package/dist/hooks/chunk-RKUAD3I6.js +0 -90
  930. package/dist/hooks/chunk-WPALEIRX.js +0 -18
  931. package/scripts/backlog/backlog-restructure.ts +0 -152
  932. package/scripts/rules/issue-fold-rule.ts +0 -72
  933. package/scripts/rules/wip-cap.ts +0 -63
  934. package/scripts/run/run-issue-number.ts +0 -19
@@ -1,15 +1,15 @@
1
- import { run_issue_number } from '#scripts/run/run-issue-number'
1
+ import { issue_number_shape } from '#scripts/issue/issue-number-shape'
2
2
  import { lane_paths } from './lane-paths'
3
3
 
4
4
  // The mark a dispatched lane child carries, so the pre-gate cut and a resume are decided from the
5
- // environment rather than from the model's reading of the prompt (joshuafolkken/kit#1904).
5
+ // environment rather than from the model's reading of the prompt.
6
6
  //
7
- // **A dispatched child used to be indistinguishable from a person's own session.** `lane:dispatch`
8
- // and the `run:cut` relaunch both start the child with `claude -p "fullrun #<N>"` and a copied
9
- // environment, and nothing in the argv, the environment or a file said "this session was launched, not
10
- // typed". So `pre-gate-cut.ts` left the human-or-child question to the model, which read its own prompt
11
- // and — across the six children joshuafolkken/kit#1850 measured — decided "person" every time and
12
- // declined the cut. This variable is that missing fact, made mechanical.
7
+ // **Without this mark a dispatched child is indistinguishable from a person's own session.**
8
+ // `lane:dispatch` and the `run:cut` relaunch both start the child with `claude -p "fullrun #<N>"` and
9
+ // a copied environment, and nothing in the argv, the environment or a file says "this session was
10
+ // launched, not typed". Left to the model, the human-or-child question is answered by reading its own
11
+ // prompt, which decides "person" and declines the cut. This variable is that missing fact, made
12
+ // mechanical.
13
13
  //
14
14
  // **Its value is the issue number, because a mark that only said "a child" could not be told from one
15
15
  // that leaked.** A person's shell, or a parent session that was itself a dispatched child, can carry
@@ -19,7 +19,7 @@ import { lane_paths } from './lane-paths'
19
19
  // `.claude/skills/workflow-commands/pre-gate-cut.md`.
20
20
  const KEY = 'JOSH_LANE_CHILD'
21
21
 
22
- // **A dispatched child also asks for the five-minute prompt-cache TTL** (joshuafolkken/kit#2944). A
22
+ // **A dispatched child also asks for the five-minute prompt-cache TTL**. A
23
23
  // headless `claude -p` session on a subscription defaults to the one-hour TTL, whose writes bill at 2x
24
24
  // the input rate against 1.25x for five minutes. A replay of 1,953 lane transcripts (about 57,000
25
25
  // requests) found 0.3% of request gaps over five minutes, so the shorter TTL — re-writing the prefix on
@@ -34,7 +34,7 @@ type MarkerSource = Readonly<Record<string, string | undefined>>
34
34
  // issue number rather than from text read anywhere — the same discipline `lane-dispatch.ts` applies to
35
35
  // the invocation it builds — so a malformed number fails here rather than reaching a child.
36
36
  function environment_for(issue: string): Record<string, string> {
37
- run_issue_number.require_issue_number(issue)
37
+ issue_number_shape.require_issue_number(issue)
38
38
 
39
39
  return { [KEY]: issue, [CACHE_TTL_KEY]: CACHE_TTL }
40
40
  }
@@ -47,14 +47,14 @@ function marked_issue(source: MarkerSource = process.env): string | undefined {
47
47
 
48
48
  if (value === undefined) return undefined
49
49
 
50
- return run_issue_number.ISSUE_NUMBER_PATTERN.test(value) ? value : undefined
50
+ return issue_number_shape.ISSUE_NUMBER_PATTERN.test(value) ? value : undefined
51
51
  }
52
52
 
53
53
  // True when this session is a dispatched lane child for the checkout it is running in: the mark is
54
54
  // present and names this lane's own issue, read from the checkout path. A numeric mark naming a
55
55
  // *different* issue leaked in from a parent session into a checkout it does not belong to, so it is
56
56
  // read as a person's run — the trust condition the header describes, applied the same way
57
- // `pre-gate-cut.ts` applies it to the resume decision (joshuafolkken/kit#1947).
57
+ // `pre-gate-cut.ts` applies it to the resume decision.
58
58
  function is_child_of(directory: string, source: MarkerSource = process.env): boolean {
59
59
  const marked = marked_issue(source)
60
60
 
@@ -4,6 +4,8 @@ import { epic_busy } from '#scripts/epic/epic-busy'
4
4
  import { git_gh_command } from '#scripts/gh/git-gh-command'
5
5
  import type { OpenIssueData } from '#scripts/git/git-schemas'
6
6
  import { issue_cite, type IssueCiter } from '#scripts/issue/issue-cite'
7
+ import { issue_number_shape } from '#scripts/issue/issue-number-shape'
8
+ import { session_cite } from '#scripts/issue/session-cite'
7
9
  import { error_text } from '#scripts/lib/error-message'
8
10
  import { run_carry } from '#scripts/run/carry/run-carry'
9
11
  import { run_carry_reclaim } from '#scripts/run/carry/run-carry-reclaim'
@@ -18,8 +20,7 @@ import { lane_report } from './lane-report'
18
20
  import { lane_seed_policy } from './lane-seed'
19
21
  import { lane_stray } from './lane-stray'
20
22
 
21
- // `josh lane:open` / `lane:close` / `lane:list` / `lane:prune` — the lane's whole lifecycle
22
- // (joshuafolkken/kit#1490).
23
+ // `josh lane:open` / `lane:close` / `lane:list` / `lane:prune` — the lane's whole lifecycle.
23
24
  //
24
25
  // **`lane:open` prints the lane's directory on standard output and nothing else**, so
25
26
  // `dir=$(pnpm josh lane:open 1490)` is what a caller needs and a refusal is an empty capture beside
@@ -33,7 +34,6 @@ const SINGLE_ARGUMENT = 1
33
34
  const ISSUE_AND_PATH_ARGUMENTS = 2
34
35
  const ALL_FLAG = '--all'
35
36
  const NONE_TOKEN = 'none'
36
- const ISSUE_NUMBER_PATTERN = /^[1-9]\d*$/u
37
37
 
38
38
  const USAGE = [
39
39
  'Usage: josh lane:open <issue-number>',
@@ -54,8 +54,7 @@ function report_usage(): number {
54
54
  }
55
55
 
56
56
  // Read the carry record and refuse if this session has already handed off its budget via `--cut`.
57
- // A cut session must not open new lanes or dispatch new children — the successor owns the budget
58
- // (joshuafolkken/kit#2114).
57
+ // A cut session must not open new lanes or dispatch new children — the successor owns the budget.
59
58
  async function guard_cut_session(): Promise<string | undefined> {
60
59
  const directory = await run_carry.repository_directory()
61
60
 
@@ -73,7 +72,7 @@ async function guard_cut_session(): Promise<string | undefined> {
73
72
  function parse_lane_issue(value: string | undefined): string | undefined {
74
73
  if (value === undefined) return undefined
75
74
 
76
- return ISSUE_NUMBER_PATTERN.test(value) ? value : undefined
75
+ return issue_number_shape.ISSUE_NUMBER_PATTERN.test(value) ? value : undefined
77
76
  }
78
77
 
79
78
  function parse_issue(rest: ReadonlyArray<string>): string | undefined {
@@ -89,7 +88,7 @@ function refusal_message(outcome: Exclude<OpenOutcome, { kind: 'opened' }>): str
89
88
  return `All ${String(lane_seed_policy.LAST_LANE_SEAT)} lane seats are taken. Run \`pnpm josh lane:list\` to see them and \`pnpm josh lane:close <issue-number>\` to free one.`
90
89
  }
91
90
 
92
- return `A lane for #${outcome.lane.issue} is already open at ${outcome.lane.directory}. Run \`pnpm josh lane:close ${outcome.lane.issue}\` before opening it again.`
91
+ return `A lane for ${session_cite.issue(outcome.lane.issue)} is already open at ${outcome.lane.directory}. Run \`pnpm josh lane:close ${outcome.lane.issue}\` before opening it again.`
93
92
  }
94
93
 
95
94
  function report_open(outcome: OpenOutcome): number {
@@ -119,7 +118,7 @@ function report_issues(issues: ReadonlyArray<string>): number {
119
118
  function report_close(outcome: CloseOutcome): number {
120
119
  if (outcome.reaped.length > 0) {
121
120
  console.error(
122
- `Terminated the lane child for #${outcome.issue} that had not ended by itself: process ${outcome.reaped.join(', ')}.`,
121
+ `Terminated the lane child for ${session_cite.issue(outcome.issue)} that had not ended by itself: process ${outcome.reaped.join(', ')}.`,
123
122
  )
124
123
  }
125
124
 
@@ -128,7 +127,7 @@ function report_close(outcome: CloseOutcome): number {
128
127
  }
129
128
 
130
129
  console.error(
131
- `Closing the lane for #${outcome.issue} left this behind: ${outcome.left_behind.join(', ')}. Remove it and run \`pnpm josh lane:close ${outcome.issue}\` again.`,
130
+ `Closing the lane for ${session_cite.issue(outcome.issue)} left this behind: ${outcome.left_behind.join(', ')}. Remove it and run \`pnpm josh lane:close ${outcome.issue}\` again.`,
132
131
  )
133
132
 
134
133
  return FAILURE_EXIT_CODE
@@ -141,7 +140,7 @@ function report_sweep(outcome: SweepOutcome): number {
141
140
 
142
141
  if (outcome.failed.length === 0) return code
143
142
 
144
- const named = outcome.failed.map((issue) => `#${issue}`).join(', ')
143
+ const named = outcome.failed.map((issue) => session_cite.issue(issue)).join(', ')
145
144
 
146
145
  // `lane:list` reads git's work trees, and the usual survivor is a branch whose work tree is
147
146
  // already gone — which that listing cannot show. Closing each one again is what names it.
@@ -194,7 +193,7 @@ const OCCUPANCY_UNREADABLE =
194
193
  'Could not read the `in-progress` listing, so the lane/label difference was not checked — that is not "everything agrees"; check `gh auth status`.'
195
194
 
196
195
  // The `in-progress` issues this repository shows running, read the way `epic:next` reads lane
197
- // occupancy — never rebuilt (joshuafolkken/kit#2235). A read that could not see the whole listing is
196
+ // occupancy — never rebuilt. A read that could not see the whole listing is
198
197
  // `undefined`, so the difference is skipped rather than computed against a set known to be partial.
199
198
  async function to_holders(repo: string): Promise<ReadonlyArray<OpenIssueData> | undefined> {
200
199
  const read = await epic_busy.read_repository(repo)
@@ -204,7 +203,7 @@ async function to_holders(repo: string): Promise<ReadonlyArray<OpenIssueData> |
204
203
  }
205
204
 
206
205
  // The repository and its running issues, read once: the listing cites each lane from the titles here
207
- // (joshuafolkken/kit#2943) and the occupancy check compares against the same set.
206
+ // and the occupancy check compares against the same set.
208
207
  interface InProgress {
209
208
  repo: string | undefined
210
209
  holders: ReadonlyArray<OpenIssueData> | undefined
@@ -273,7 +272,7 @@ async function prune_command(rest: ReadonlyArray<string>): Promise<number> {
273
272
 
274
273
  // After the closes, so a lane whose close left its directory behind is swept in the same run. A
275
274
  // kept stray is reported, never a failure: it waits on a person, and a non-zero exit would stop
276
- // every `backlogrun` preparation until one came (joshuafolkken/kit#3370).
275
+ // every `backlogrun` preparation until one came.
277
276
  await lane_stray.sweep_and_report()
278
277
 
279
278
  return code
@@ -6,7 +6,7 @@ import { lane_paths } from './lane-paths'
6
6
  import { lane_reap } from './lane-reap'
7
7
  import { lane_registry, type LaneInfo } from './lane-registry'
8
8
 
9
- // Closing a lane: no work tree, no branch, no directory (joshuafolkken/kit#1490).
9
+ // Closing a lane: no work tree, no branch, no directory.
10
10
  //
11
11
  // **A lane is closed after a park, a failure or an interruption as readily as after a success**, so
12
12
  // every step here is written to run over a subject that is already gone or that still holds
@@ -21,7 +21,7 @@ interface LaneTargets {
21
21
 
22
22
  // The lane an issue number names: its registration, when there is one, and the paths a close acts on.
23
23
  // Resolved once here so a caller that has to look inside the tree before closing it reads the same
24
- // directory the close removes (joshuafolkken/kit#2476).
24
+ // directory the close removes.
25
25
  interface ResolvedLane {
26
26
  existing: LaneInfo | undefined
27
27
  targets: LaneTargets
@@ -107,8 +107,8 @@ function close_kind(did_exist: boolean, left_behind: ReadonlyArray<string>): Clo
107
107
  }
108
108
 
109
109
  // The main work tree's root, not this one's — the same reading `list_lanes` uses, so the fallback
110
- // directory an unregistered lane is closed by is the one `lane:open` would have created
111
- // (joshuafolkken/kit#1497). Derived here from the current work tree, a close run inside a lane
110
+ // directory an unregistered lane is closed by is the one `lane:open` would have created.
111
+ // Derived here from the current work tree, a close run inside a lane
112
112
  // reports `none` over a directory that is still on disk.
113
113
  async function lane_root_directory(): Promise<string> {
114
114
  return lane_paths.lane_root(await lane_registry.main_repository_root())
@@ -130,8 +130,8 @@ async function close_lane(issue: string): Promise<CloseOutcome> {
130
130
  const { existing, targets } = await resolve_lane(issue)
131
131
  const did_exist = existing !== undefined || existsSync(targets.directory)
132
132
  // Before the removal, not after: a child still running in the tree would keep writing into a
133
- // directory being deleted, and a process outliving its lane is the half-discarded state
134
- // joshuafolkken/kit#2421 found — the work tree gone, the child still answering `alive`.
133
+ // directory being deleted, and a process outliving its lane is a half-discarded state — the work
134
+ // tree gone, the child still answering `alive`.
135
135
  const reaped = lane_reap.reap_child(issue)
136
136
 
137
137
  await remove_lane(targets)
@@ -2,45 +2,44 @@ import { agent_argv, type AgentArgv, type AgentArgvResult } from '#scripts/agent
2
2
  import { agent_role_profile, type AgentProfile } from '#scripts/agent/agent-role-profile'
3
3
  import { git_gh_command } from '#scripts/gh/git-gh-command'
4
4
  import type { LabelWrite } from '#scripts/gh/git-gh-issue-write'
5
+ import { issue_cite } from '#scripts/issue/issue-cite'
5
6
  import { IN_PROGRESS_LABEL } from '#scripts/issue/issue-labels'
7
+ import { issue_number_shape } from '#scripts/issue/issue-number-shape'
8
+ import { session_cite } from '#scripts/issue/session-cite'
6
9
  import { telegram_notify } from '#scripts/notify/telegram-notify'
7
10
  import { detached_launch } from '#scripts/run/detached-launch'
8
11
  import { run_event_stream } from '#scripts/run/event/run-event-stream'
9
12
  import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
10
13
  import { run_ending } from '#scripts/run/run-ending'
11
- import { run_issue_number } from '#scripts/run/run-issue-number'
14
+ import { run_label } from '#scripts/run/run-label'
12
15
  import { lane_child_invocation } from './lane-child-invocation'
13
16
  import { lane_child_marker } from './lane-child-marker'
14
17
  import { lane_dispatch_log } from './lane-dispatch-log'
18
+ import { lane_ledger } from './lane-ledger'
15
19
  import { lane_output } from './lane-output'
16
20
  import { lane_registry, type LaneInfo } from './lane-registry'
17
21
  import { lane_resume, type ResumePlan } from './lane-resume'
18
22
  import { openai_lane_supervisor } from './openai-lane-supervisor'
19
23
 
20
- // `josh lane:dispatch <issue-number>` — start a lane's child as an operating-system process of its own
21
- // (joshuafolkken/kit#1749).
24
+ // `josh lane:dispatch <issue-number>` — start a lane's child as an operating-system process of its own.
22
25
  //
23
- // **The premise the session cut rests on was not true, and this is what makes it true.** A delegated
24
- // child used to be an in-process subagent of the parent session, so cutting the parent killed every
25
- // child still implementing: `backlogrun-progress.md` → "The hand-off" says "nothing has to finish, because nothing
26
- // is being abandoned", and what actually happened was that the next session polled a file whose writer
27
- // was dead, waited out the silent-unit window, booked each lane `stopped`, and aborted the whole run on
28
- // the third one. Launched detached, the child survives the cut and the sentence holds as written.
26
+ // **This is what makes the premise the session cut rests on true.** `backlogrun-progress.md` → "The
27
+ // hand-off" says "nothing has to finish, because nothing is being abandoned"; an in-process child
28
+ // would die with the parent it was cut from. Launched detached, the child survives the cut and the
29
+ // sentence holds as written.
29
30
  //
30
31
  // **Nothing here is new machinery.** The lane is already a linked work tree with its own branch and
31
32
  // ports (`lane-open.ts`), the detached launcher is already `run:wake`'s (`detached-launch.ts`), and the
32
33
  // recorded output path is already how a session that never opened a lane polls it (`lane-output.ts`).
33
- // What was missing was the one command that puts the three together.
34
+ // This is the one command that puts the three together.
34
35
  //
35
- // **The recording happens inside the dispatch, so "the lane records no path" stops being a state.**
36
- // `backlogrun.md`'s hand-off has an exception for a lane nobody could poll, and it exists because the
37
- // recording used to be a separate step a run could forget. A lane dispatched through here is recorded
38
- // by the same call that starts it.
36
+ // **The recording happens inside the dispatch, so "the lane records no path" is not a state.** A
37
+ // lane dispatched through here is recorded by the same call that starts it, so no run can forget it.
39
38
 
40
39
  // The invocation the child is given. Composed from this constant and a digits-only issue number, never
41
40
  // from text that was read from anywhere — the same discipline `run-wake-session.ts` applies to the
42
41
  // invocation it rebuilds out of the carry record.
43
- // The resume guide a relaunched child is pointed at (joshuafolkken/kit#2022). It carries the resume
42
+ // The resume guide a relaunched child is pointed at. It carries the resume
44
43
  // procedure a `run:cut` successor follows, so naming it lets the child read one section rather than the
45
44
  // workflow-commands entry documents it would otherwise read to learn it is a resume at all.
46
45
  const NOTE_SEPARATOR = '; '
@@ -60,7 +59,7 @@ interface Dispatched {
60
59
  log_path: string
61
60
  pid: number
62
61
  profile: AgentProfile
63
- // The session id this dispatch resumed, or `undefined` when it started fresh (joshuafolkken/kit#2317).
62
+ // The session id this dispatch resumed, or `undefined` when it started fresh.
64
63
  // `describe` reports which path was taken, so an `outage` re-dispatch says whether it recovered the
65
64
  // disconnected child's context or fell back to a fresh run.
66
65
  resumed_from: string | undefined
@@ -110,14 +109,13 @@ function child_invocation(issue: string): string {
110
109
 
111
110
  /**
112
111
  * The prompt a relaunched child is given after a `run:cut` — a resume-specific instruction followed by
113
- * the bare `child_invocation` (joshuafolkken/kit#2022). A relaunched child used to be given the plain
114
- * `fullrun #<N>`, so it read the workflow-commands entry documents (SKILL.md, fullrun.md, ~29k tokens)
115
- * every resume before it could learn it was a resume at all — the "do not re-read" exception lives
116
- * inside the very skill it had to open. This preamble tells it up front, so it goes straight to
117
- * `run:cut --resume` and the stage that answers.
112
+ * the bare `child_invocation`. Given the plain `fullrun #<N>`, a relaunched child would read the
113
+ * workflow-commands entry documents every resume before it could learn it was a resume at all — the
114
+ * "do not re-read" exception lives inside the very skill it would have to open. This preamble tells
115
+ * it up front, so it goes straight to `run:cut --resume` and the stage that answers.
118
116
  *
119
117
  * **It ends with `child_invocation` on purpose, not as decoration.** The parent's liveness poll is
120
- * `pgrep -laf "<child_invocation>$"` (built at dispatch — see `log_sentence`), so a relaunched process
118
+ * `lane_child_invocation.process_pattern` (read by `run:liveness` — see `log_sentence`), so a relaunched process
121
119
  * whose command line did not end with `fullrun #<N>` would be booked stopped while it ran. The trailing
122
120
  * invocation keeps that poll matching and is also the ordinary run a `fresh` verdict falls back to.
123
121
  */
@@ -171,7 +169,7 @@ function failed_start(
171
169
 
172
170
  // The `dispatched` outcome, built from the request the launch was composed from — one place so the
173
171
  // three launch paths cannot drift on which fields a dispatched child carries (the resume flag among
174
- // them, joshuafolkken/kit#2317). The request's `argv` rides along harmlessly, as it did before.
172
+ // them). The request's `argv` rides along harmlessly.
175
173
  // **`kind` is written last on purpose**: the request was spread from a `Prepared`, so it still carries
176
174
  // `kind: 'prepared'` at runtime, and letting the spread win would mislabel the outcome.
177
175
  function dispatched_of(
@@ -190,7 +188,7 @@ function existing_dispatch(request: StartRequest): DispatchOutcome | undefined {
190
188
  if (!openai_lane_supervisor.approve(request.lane.directory, active.nonce)) {
191
189
  return failed_start(
192
190
  request,
193
- `the OpenAI supervisor for lane #${request.lane.issue} was cancelled`,
191
+ `the OpenAI supervisor for lane ${session_cite.issue(request.lane.issue)} was cancelled`,
194
192
  [],
195
193
  )
196
194
  }
@@ -216,13 +214,17 @@ async function openai_dispatched_start(
216
214
  if (owner?.issue !== lane.issue) {
217
215
  if (nonce !== undefined) openai_lane_supervisor.cancel(lane.directory, nonce)
218
216
 
219
- return failed_start(request, `the OpenAI supervisor did not claim lane #${lane.issue}`, notes)
217
+ return failed_start(
218
+ request,
219
+ `the OpenAI supervisor did not claim lane ${session_cite.issue(lane.issue)}`,
220
+ notes,
221
+ )
220
222
  }
221
223
 
222
224
  if (!openai_lane_supervisor.approve(lane.directory, owner.nonce)) {
223
225
  return failed_start(
224
226
  request,
225
- `the OpenAI supervisor for lane #${lane.issue} was cancelled`,
227
+ `the OpenAI supervisor for lane ${session_cite.issue(lane.issue)} was cancelled`,
226
228
  notes,
227
229
  )
228
230
  }
@@ -267,7 +269,7 @@ async function started(request: StartRequest): Promise<DispatchOutcome> {
267
269
 
268
270
  // Build the argv the plan calls for: a resume carries the stored session id, a fresh start does not.
269
271
  // Both run the same profile diagnostics under the already-resolved profile, so a resume is refused for
270
- // exactly the reasons a fresh dispatch is (joshuafolkken/kit#2317).
272
+ // exactly the reasons a fresh dispatch is.
271
273
  function built_for(plan: ResumePlan, profile: AgentProfile, lane: LaneInfo): AgentArgvResult {
272
274
  if (plan.kind === 'resume') {
273
275
  return agent_argv.with_resume_in(plan.invocation, profile, plan.session_id, lane.directory)
@@ -276,7 +278,7 @@ function built_for(plan: ResumePlan, profile: AgentProfile, lane: LaneInfo): Age
276
278
  return agent_argv.with_profile_in(plan.invocation, profile, lane.directory)
277
279
  }
278
280
 
279
- // **The re-dispatch decides resume-or-fresh from the lane's own exit record** (joshuafolkken/kit#2317).
281
+ // **The re-dispatch decides resume-or-fresh from the lane's own exit record**.
280
282
  // The record is read from the log the previous dispatch of this lane wrote — a first dispatch finds
281
283
  // none and starts fresh, an `outage` ending with a session id resumes it. The provider is resolved
282
284
  // first because the resume mechanism is Claude Code's, and an OpenAI lane falls back to fresh.
@@ -304,30 +306,33 @@ function prepared(lane: LaneInfo): Prepared {
304
306
  // **The parent claims the marker before it starts the child**, so the window in which a running child
305
307
  // is uncounted closes at dispatch rather than tens of minutes later once the child's own `fullrun` gets
306
308
  // to its (idempotent) apply. `issue_add_label` creates the label if the repository lacks it — a
307
- // `POST /issues/{N}/labels` provisions a missing label with a generated color (measured on
308
- // joshuafolkken/kit#1026, `git-gh-issue-write.ts`) — so no separate `label_ensure` is needed here, and
309
+ // `POST /issues/{N}/labels` provisions a missing label with a generated color
310
+ // (`git-gh-issue-write.ts`) — so no separate `label_ensure` is needed here, and
309
311
  // its unapplied answer is a real refusal to launch rather than a note — confirmed by a read-back, so
310
- // a write that landed but answered with an error still launches (joshuafolkken/kit#3312).
312
+ // a write that landed but answered with an error still launches.
311
313
  async function mark_in_progress(issue: string): Promise<LabelWrite> {
312
314
  return await git_gh_command.issue_apply_label(issue, IN_PROGRESS_LABEL)
313
315
  }
314
316
 
315
- // The dispatch owns both halves of the marker: it applied it, so a launch that never started takes it
316
- // back off, leaving no `in-progress` on an issue nothing is running. A removal that itself fails is
317
- // swallowed — the failed launch is already warned about, and `lane:list` / `run:progress` surface a
318
- // stuck marker — so this never turns a launch failure into a thrown error.
319
- async function unmark_in_progress(issue: string): Promise<void> {
320
- try {
321
- await git_gh_command.issue_remove_label(issue, IN_PROGRESS_LABEL)
322
- } catch {
323
- /* the launch already failed and is warned about; a stuck marker is reported by lane:list */
324
- }
325
- }
326
-
327
317
  // A started child is recorded on the run's stream, which is where the stall detector ages the last
328
- // dispatch from (joshuafolkken/kit#2464) — unrecorded, every stall read "hours since the last dispatch"
318
+ // dispatch from — unrecorded, every stall read "hours since the last dispatch"
329
319
  // minutes after a launch. A failed start records nothing: no child is running. The marker is claimed
330
320
  // first, so a refused one starts nothing.
321
+ //
322
+ // The dispatch owns both halves of the marker: it applied it, so a launch that never started takes it
323
+ // back off through `run_label.unmark`, leaving no `in-progress` on an issue nothing is running. That
324
+ // removal warns and never throws, so it cannot turn a launch failure into a thrown error.
325
+ //
326
+ // The lane ledger takes the same instant: `lane:stats` times a lane's implementation from it, and the
327
+ // stream is capped, so a period's earlier dispatches would be gone from there.
328
+ async function record_started(issue: string): Promise<void> {
329
+ await run_event_stream_emit.emit(
330
+ run_event_stream.EVENT_KIND.CHILD_LAUNCH,
331
+ `${issue_cite.plain(issue)} dispatched`,
332
+ )
333
+ await lane_ledger.record_dispatch(Number(issue))
334
+ }
335
+
331
336
  async function finish_dispatch(issue: string, request: StartRequest): Promise<DispatchOutcome> {
332
337
  const mark = await mark_in_progress(issue)
333
338
 
@@ -336,16 +341,14 @@ async function finish_dispatch(issue: string, request: StartRequest): Promise<Di
336
341
 
337
342
  const is_failed = outcome.kind === 'failed'
338
343
 
339
- await (is_failed
340
- ? unmark_in_progress(issue)
341
- : run_event_stream_emit.emit(run_event_stream.EVENT_KIND.CHILD_LAUNCH, `#${issue} dispatched`))
344
+ await (is_failed ? run_label.unmark(issue) : record_started(issue))
342
345
 
343
346
  return outcome
344
347
  }
345
348
 
346
349
  /** Start `fullrun #<N>` detached in the lane for `#<N>`, recording where it writes as it does so. */
347
350
  async function dispatch_child(issue: string): Promise<DispatchOutcome> {
348
- run_issue_number.require_issue_number(issue)
351
+ issue_number_shape.require_issue_number(issue)
349
352
 
350
353
  const lane = await lane_registry.find_open_lane(issue)
351
354
 
@@ -366,25 +369,11 @@ async function dispatch_child(issue: string): Promise<DispatchOutcome> {
366
369
  // The child is running — saying otherwise would send the caller to dispatch a second one into the same
367
370
  // lane — but its output is going nowhere, so a message naming the path would point at a file that will
368
371
  // never grow, and a poll of that file would book a working child as stopped.
369
- // The liveness pattern the parent polls with — the shared one, which also finds a detached ship
370
- // supervisor (joshuafolkken/kit#2428). `describe` never throws, so an issue that is not a number falls
371
- // back to the launched invocation rather than raising from the validator.
372
- function poll_pattern(outcome: Dispatched, issue: string): string {
373
- if (!run_issue_number.ISSUE_NUMBER_PATTERN.test(issue)) return `${outcome.invocation}$`
374
-
375
- return lane_child_invocation.process_pattern(issue)
376
- }
377
-
378
372
  function log_sentence(outcome: Dispatched, issue: string): string {
379
- // **The pattern matches the child's own command line, not the lane it runs in**
380
- // (joshuafolkken/kit#1948). The child is `claude … ${outcome.invocation}` and its argv carries no
381
- // path, so `pgrep -laf <lane directory>` found nothing for a living child and a poll booked it
382
- // stopped. The invocation is the last argument, so it sits at the end of the command line; the `$`
383
- // anchor is what keeps `fullrun #12` from matching a running `fullrun #123`. `run:liveness` takes
384
- // `--process` as what the caller *saw*, never as a property of the child's kind — told to pass
385
- // `alive`, a parent that never ran `pgrep` would answer `alive` for a child that crashed an hour ago
386
- // and poll it for ever.
387
- const poll = `run \`pgrep -laf "${poll_pattern(outcome, issue)}"\` and pass what it found to \`pnpm josh run:liveness ${issue} --output ${outcome.log_path} --process alive\` — or \`--process none\` where it found nothing`
373
+ // **`run:liveness` reads the child's process for itself**, with the shared
374
+ // pattern that matches the child's own command line and a detached ship supervisor, so no parent
375
+ // passes `alive` by hand for a child that crashed an hour ago.
376
+ const poll = `run \`pnpm josh run:liveness ${issue} --output ${outcome.log_path}\` — it reads the child's process for itself`
388
377
 
389
378
  if (outcome.notes.length > 0) {
390
379
  return ` Its output is NOT being kept — ${outcome.notes.join(NOTE_SEPARATOR)} — so ${outcome.log_path} will not grow and the process trace is the only answer: ${poll}.`
@@ -394,7 +383,7 @@ function log_sentence(outcome: Dispatched, issue: string): string {
394
383
  }
395
384
 
396
385
  // Whether this dispatch resumed the disconnected child's session or started fresh — the report the
397
- // `outage` re-dispatch owes (joshuafolkken/kit#2317). A fresh start says so too, so the absence of a
386
+ // `outage` re-dispatch owes. A fresh start says so too, so the absence of a
398
387
  // resume is never silent when an outage record was present.
399
388
  function resume_sentence(outcome: Dispatched): string {
400
389
  if (outcome.resumed_from === undefined) {
@@ -408,20 +397,20 @@ function resume_sentence(outcome: Dispatched): string {
408
397
  // message the warning exists to carry — the pid among it, with the child already running.
409
398
  function describe(outcome: DispatchOutcome, issue: string): string {
410
399
  if (outcome.kind === 'no-lane') {
411
- return `No lane is open for #${issue}. Run \`pnpm josh lane:open ${issue}\` first, then dispatch into it.`
400
+ return `No lane is open for ${session_cite.issue(issue)}. Run \`pnpm josh lane:open ${issue}\` first, then dispatch into it.`
412
401
  }
413
402
 
414
403
  if (outcome.kind === 'unrecordable') return outcome.reason
415
404
 
416
405
  if (outcome.kind === LABEL_UNSET_KIND) {
417
- return `The child for #${issue} was not started: the \`${IN_PROGRESS_LABEL}\` label could not be applied (${outcome.reason}), so the lane would be counted as empty. Nothing was launched.`
406
+ return `The child for ${session_cite.issue(issue)} was not started: the \`${IN_PROGRESS_LABEL}\` label could not be applied (${outcome.reason}), so the lane would be counted as empty. Nothing was launched.`
418
407
  }
419
408
 
420
409
  if (outcome.kind === 'failed') {
421
- return `The child for #${issue} did not start: ${outcome.note}. Its log is at ${outcome.log_path}.`
410
+ return `The child for ${session_cite.issue(issue)} did not start: ${outcome.note}.${agent_role_profile.default_notice()} Its log is at ${outcome.log_path}.`
422
411
  }
423
412
 
424
- return `Dispatched \`${outcome.invocation}\` as process ${String(outcome.pid)} in ${outcome.lane.directory} with ${agent_role_profile.describe(outcome.profile)}.${resume_sentence(outcome)}${log_sentence(outcome, issue)}`
413
+ return `Dispatched \`${outcome.invocation}\` as process ${String(outcome.pid)} in ${outcome.lane.directory} with ${agent_role_profile.describe(outcome.profile)}.${agent_role_profile.default_notice()}${resume_sentence(outcome)}${log_sentence(outcome, issue)}`
425
414
  }
426
415
 
427
416
  /**
@@ -441,7 +430,7 @@ function is_worth_warning(outcome: DispatchOutcome): boolean {
441
430
  // own failures to standard error and never throws, so this cannot turn a refusal into an exception.
442
431
  async function warn_of_problem(outcome: DispatchOutcome, issue: string): Promise<void> {
443
432
  await telegram_notify.warn({
444
- issue_title: `${WARNING_TITLE} #${issue}`,
433
+ issue_title: `${WARNING_TITLE} ${issue_cite.plain(issue)}`,
445
434
  body: describe(outcome, issue),
446
435
  recovery: WARNING_RECOVERY,
447
436
  })
@@ -1,7 +1,7 @@
1
1
  import { LANE_SEAT_KEY, PORT_SEED_KEY, ports } from '#ports'
2
2
  import { agent_role_profile, type AgentProfile } from '#scripts/agent/agent-role-profile'
3
3
 
4
- // The lane's `.env`, built from the root's (joshuafolkken/kit#1490, joshuafolkken/kit#1494).
4
+ // The lane's `.env`, built from the root's.
5
5
  //
6
6
  // **Port separation is required here, not optional.** `ports/index.js` resolves the project root as
7
7
  // the nearest ancestor holding a `package.json` — which, inside a linked work tree, is the lane's
@@ -9,8 +9,8 @@ import { agent_role_profile, type AgentProfile } from '#scripts/agent/agent-role
9
9
  // root's runs on the root's exact offset; either way every lane lands on one pair of ports, and a
10
10
  // busy port fails without retrying on another. At the default six lanes that turns E2E from "fails
11
11
  // sometimes" into "fails nearly always". So the lane's `.env` keeps the project's `PORT_SEED`
12
- // unchanged and adds `JOSH_LANE_SEAT`, and `ports/index.js` combines them as `seed × 10 + seat`
13
- // (joshuafolkken/kit#1494): the file plainly shows which number is the project's and which is the
12
+ // unchanged and adds `JOSH_LANE_SEAT`, and `ports/index.js` combines them as `seed × 10 + seat`:
13
+ // the file plainly shows which number is the project's and which is the
14
14
  // seat, and the multiplication that separates the bands lives in one place rather than here.
15
15
  //
16
16
  // **Everything else in the file is carried across verbatim**, comments and blank lines included:
@@ -18,7 +18,7 @@ import { agent_role_profile, type AgentProfile } from '#scripts/agent/agent-role
18
18
  // are as necessary inside a lane as outside one, and a lane that had to have them re-entered would
19
19
  // not be a place a run could start unattended.
20
20
 
21
- // Where the delegated unit running this lane's child writes (joshuafolkken/kit#1713). It goes in the
21
+ // Where the delegated unit running this lane's child writes. It goes in the
22
22
  // lane's own `.env` — the store `lane-registry.ts` already reads — rather than in a ledger beside the
23
23
  // trees, so `git worktree remove` erases the record along with the lane it described and there is
24
24
  // nothing left to go stale. `.env` is gitignored in kit and in every consumer `josh sync` reaches,
@@ -149,7 +149,7 @@ function read_lane_ports(content: string): { development: number; preview: numbe
149
149
  /**
150
150
  * The output path a lane's `.env` records, or `undefined` where it records none.
151
151
  *
152
- * **A blank assignment is `undefined` rather than an empty path** (joshuafolkken/kit#1713). A lane
152
+ * **A blank assignment is `undefined` rather than an empty path**. A lane
153
153
  * whose record was cleared has nothing to poll, and an empty string handed to
154
154
  * `pnpm josh run:liveness --output` is a relative path — refused by its own root check, so the
155
155
  * child would come back `undetermined` for ever rather than saying the record is missing.
@@ -1,35 +1,21 @@
1
1
  import { lane_child_marker, type MarkerSource } from './lane-child-marker'
2
2
 
3
3
  // How each `PreToolUse` guard behaves in a dispatched lane child, as an enumeration rather than a
4
- // judgement (joshuafolkken/kit#2138, joshuafolkken/kit#2164).
4
+ // judgement.
5
5
  //
6
6
  // **The three guards were built for the interactive main line, where a refusal is guidance.** A denial
7
7
  // rewrites the next move of a person's session. A dispatched lane child is a headless `claude -p`
8
- // process, so a *denial* ends the conversation with nothing committed — joshuafolkken/kit#2138 measured
9
- // a child killed before its commit by two investigation refusals and one batching refusal, every one of
10
- // them a read of a file the child was about to edit. So a guard whose correction is a denial cannot fire
11
- // as one in a child.
8
+ // process, so a *denial* ends the conversation with nothing committed. So a guard whose correction is a
9
+ // denial cannot fire as one in a child.
12
10
  //
13
- // **But a denial is not the only way a guard can speak, and that is what kit#2164 tried.** A guard can
14
- // also raise a *notice* — a non-blocking `additionalContext` that carries the same guidance without a
15
- // `permissionDecision`, so the turn is never ended. kit#2164 downgraded the batching guard to a notice
16
- // in the child for exactly that reason. So the choice is three-valued, not two:
11
+ // **But a denial is not the only way a guard can speak.** A guard can also raise a *notice* — a
12
+ // non-blocking `additionalContext` that carries the same guidance without a `permissionDecision`, so the
13
+ // turn is never ended. So the choice is three-valued, not two:
17
14
  //
18
15
  // - `refuse` — deny the call (the main-line default; the child keeps this for the safety rules).
19
16
  // - `notice` — let the call through but attach the guidance, so a headless child is nudged, not killed.
20
17
  // - `off` — say nothing at all, for a guard whose remedy the child cannot carry out.
21
18
  //
22
- // **The notice did not move the number, kit#2178 took it off, and kit#2276 restores it changed.** The
23
- // lane child that ran right after kit#2164 merged came in at 1.00 calls per turn on both sides of the
24
- // first notice (transcript `f39efeb5`), so kit#2178 turned the batching notice `off` in the child rather
25
- // than pay the per-turn context cost of guidance measured not to work. But with it off, the notice fired
26
- // **zero** times across the 2026-09-21 backlogrun the density was next measured on, so the 1.147 read
27
- // there is the rate with no guidance at all — not a second measurement of the notice failing. kit#2276
28
- // therefore restores it as `notice`, with the two things #2164's lacked: it names the concrete recent
29
- // calls the run issued one-per-turn, and it recurs every single-call turn rather than every three. The
30
- // mode stays a genuine experiment — the density is re-measured on the next backlogrun, and a notice that
31
- // still does not move it is redesigned rather than kept.
32
- //
33
19
  // **It is an enumeration and not a judgement, for the reason `delegation-policy.ts` is one.** "This
34
20
  // guard's mode in a child" is a call made under the same pressure that produced the misfire. The list is
35
21
  // the whole of it, and a guard nobody classified refuses — the safe direction, since a wrongly-silenced
@@ -37,7 +23,7 @@ import { lane_child_marker, type MarkerSource } from './lane-child-marker'
37
23
  // survived once. `lane-guard-policy.test.ts` pins that the enumeration and the guards' live behavior
38
24
  // cannot disagree.
39
25
 
40
- // The three ways a guard may behave in a lane child (joshuafolkken/kit#2164). Outside a lane child every
26
+ // The three ways a guard may behave in a lane child. Outside a lane child every
41
27
  // guard is `refuse`, which is why that is also the fail-safe default below.
42
28
  type LaneGuardMode = 'refuse' | 'notice' | 'off'
43
29
  type LaneGuardId = 'investigation' | 'batching' | 'rule' | 'duplicate-read'
@@ -2,12 +2,12 @@ import { git_common_directory } from '#scripts/git/git-common-directory'
2
2
  import { run_ship_detach } from '#scripts/run/ship/run-ship-detach'
3
3
  import { lane_child_marker, type MarkerSource } from './lane-child-marker'
4
4
 
5
- // Whether a lane has handed its post-implementation region to the detached ship (joshuafolkken/kit#2962).
5
+ // Whether a lane has handed its post-implementation region to the detached ship.
6
6
  //
7
7
  // **A child that ran `pnpm josh ship --detach` waits on nobody when it ends.** The supervisor drives the
8
8
  // gate, the review and the merge, and notifies on its own outcome, so the `Stop` hook's demand for a
9
9
  // `confirmation` notify and `lane-park`'s refusal of that notify only bought a "nothing needed"
10
- // Telegram and a wasted turn — measured on 2026-10-02 as 43 demands, 21 refusals and ~94 extra turns.
10
+ // Telegram and a wasted turn.
11
11
  // Both hooks read this one predicate, so they cannot disagree about whether the lane was handed off.
12
12
  //
13
13
  // **Running, never merely recorded.** A ship that failed hands its region back to the child, whose