@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,14 +1,13 @@
1
1
  import { git_stash } from '#scripts/git/stash/git-stash'
2
+ import { session_cite } from '#scripts/issue/session-cite'
2
3
  import type { CarryRead } from '#scripts/run/carry/run-carry'
3
4
  import { run_event_stream } from '#scripts/run/event/run-event-stream'
4
5
  import { latest_scope_cli } from '#scripts/version/latest-scope-cli'
5
6
  import { run_retrospective } from './run-retrospective'
6
7
 
7
8
  // `josh run:step <N>` — the run's next single action, computed from three mechanical inputs and nothing
8
- // else (joshuafolkken/kit#2248). It is the child of epic #2166 that lifts the fold from an *event* to a
9
- // whole *run*: `run:next` printed one prose line for a `fullrun`'s pre-implementation position, and the
10
- // backlogrun loop stayed a state machine written in English that the reader rebuilt every turn. This
11
- // computes the position from the event stream (`run-event-stream.ts`), the carry record
9
+ // else, so the run's loop is not a state machine written in English that the reader rebuilds every
10
+ // turn. This computes the position from the event stream (`run-event-stream.ts`), the carry record
12
11
  // (`run-carry.ts`) and the issue state (`run-prep.ts`) — never the conversation — and prints one line.
13
12
  //
14
13
  // **The print is one of two shapes, never a procedure.** A runnable command the reader pastes, or a
@@ -24,12 +23,12 @@ import { run_retrospective } from './run-retrospective'
24
23
  const CLOSED = 'CLOSED'
25
24
 
26
25
  // The fixed verdict tokens — the non-command, non-decide answers. Kept as the oracle's declared
27
- // vocabulary (joshuafolkken/kit#2248), so `decision-oracle.test.ts` pins the list against these.
26
+ // vocabulary, so `decision-oracle.test.ts` pins the list against these.
28
27
  const IMPLEMENT = 'implement'
29
28
  const HUMAN_REVIEW = 'human-review'
30
29
  const UPDATE_DEPS = 'update-deps'
31
30
  const ALREADY_DONE = 'already-done'
32
- // A closed issue whose lane tree still holds uncommitted work (joshuafolkken/kit#2476) — `run:step`
31
+ // A closed issue whose lane tree still holds uncommitted work — `run:step`
33
32
  // itself prints the `decide:` line naming the stash, and this is the token `run:entry` reports.
34
33
  const KEEP_WORK = 'keep-work'
35
34
  const WAIT = 'wait'
@@ -52,15 +51,14 @@ const VOCABULARY: ReadonlyArray<string> = [
52
51
  const EXPIRED_DECISION =
53
52
  'decide: whole-run budget spent — resume with `pnpm josh run:carry --resume` | discard with `pnpm josh run:carry --end`'
54
53
 
55
- // The one step a stopped run still owes before it ends: the end-of-run retrospective
56
- // (joshuafolkken/kit#2328). It reads the run's own measurements and files the improvements worth
57
- // carrying into the next run; the command is kit-only, so it means nothing — and is never printed — in a
58
- // consumer project.
54
+ // The one step a stopped run still owes before it ends: the end-of-run retrospective.
55
+ // It reads the run's own measurements and files the improvements worth carrying into the next run;
56
+ // the command is kit-only, so it means nothing — and is never printed — in a consumer project.
59
57
  const RETROSPECTIVE_COMMAND = 'pnpm josh retrospective'
60
58
 
61
59
  // The pre-implementation verdict `run:next` degenerates to: the position of a run that has emitted no
62
60
  // event yet. `run-next.ts` maps each of these to its prose sentence, so this is the single copy of the
63
- // state → step mapping and there is no second implementation (joshuafolkken/kit#2248).
61
+ // state → step mapping and there is no second implementation.
64
62
  type PreVerdict =
65
63
  | typeof IMPLEMENT
66
64
  | typeof HUMAN_REVIEW
@@ -73,10 +71,9 @@ interface PreInput {
73
71
  state: string | undefined
74
72
  is_human_review: boolean
75
73
  latest_scope: string
76
- // Whether a lane child's tree holds uncommitted work, read by `run:prep`'s gather
77
- // (joshuafolkken/kit#2476). A closed issue over such a tree is not "nothing to do": the work was
78
- // popped back from a park and is lost with the lane unless it is kept, so `already-done` gives way to
79
- // `keep-work`.
74
+ // Whether a lane child's tree holds uncommitted work, read by `run:prep`'s gather.
75
+ // A closed issue over such a tree is not "nothing to do": the work was popped back from a park and
76
+ // is lost with the lane unless it is kept, so `already-done` gives way to `keep-work`.
80
77
  has_changes: boolean
81
78
  }
82
79
 
@@ -101,36 +98,40 @@ interface StepInput extends PreInput {
101
98
  // event is read: the position is where the run *is*, not how it got there.
102
99
  last_event: string | undefined
103
100
  carry_kind: CarryRead['kind']
104
- // Whether this invocation's end-of-run retrospective has already run, read off the carry record
105
- // (joshuafolkken/kit#2328). At the stop position it is what tells a run that still owes a
101
+ // Whether this invocation's end-of-run retrospective has already run, read off the carry record.
102
+ // At the stop position it is what tells a run that still owes a
106
103
  // retrospective from one that has run it, so the step is printed exactly once.
107
104
  is_retrospective_done: boolean
108
- // Whether this checkout is a kit consumer rather than kit itself (joshuafolkken/kit#2328). The
105
+ // Whether this checkout is a kit consumer rather than kit itself. The
109
106
  // retrospective command is kit-only — refused in a consumer — so the step is never printed there; the
110
107
  // consumer determination is the existing `doctor-consumer.ts` one, never a new judgement.
111
108
  is_consumer: boolean
112
109
  issue_number: string
113
110
  // Whether this run is a dispatched lane child, read by the CLI from the dispatch mark
114
111
  // (`lane-child-marker.ts`). A child must never be handed `run:merge` — that is the parent's own
115
- // budget command and returns `busy` in a child (joshuafolkken/kit#2267, joshuafolkken/kit#2297).
112
+ // budget command and returns `busy` in a child.
116
113
  is_lane_child: boolean
117
- // Whether the end-of-run retrospective is switched on, read by the CLI from `JOSH_RETROSPECTIVE`
118
- // (joshuafolkken/kit#2370). It defaults **off** — the auto-filed improvement issues the step drives
114
+ // Whether the end-of-run retrospective is switched on, read by the CLI from `JOSH_RETROSPECTIVE`.
115
+ // It defaults **off** — the auto-filed improvement issues the step drives
119
116
  // are opt-in — so a run that leaves the variable unset never prints the retrospective step, while the
120
117
  // retrospective's own logic is untouched and `pnpm josh retrospective` still runs by hand.
121
118
  is_retrospective_enabled: boolean
122
119
  // Whether this session is woken when a background command it started completes, read by the CLI from
123
- // the session's own environment (joshuafolkken/kit#2653). A parent without the callback cannot wait
120
+ // the session's own environment. A parent without the callback cannot wait
124
121
  // on its lanes except by polling, so it hands the run to the supervisor instead of waiting.
125
122
  has_completion_callback: boolean
126
123
  // Whether the carried invocation has already taken its maximum cuts, read off the carry record by the
127
- // CLI (joshuafolkken/kit#2346). At the cap `run:carry --cut` refuses, so the hand-off is not offered.
124
+ // CLI. At the cap `run:carry --cut` refuses, so the hand-off is not offered.
128
125
  is_at_cut_cap: boolean
129
126
  // Whether the carry record has been handed off by a cut and no successor has adopted it yet, read off
130
- // the record by the CLI (joshuafolkken/kit#2760) and set only in the session that declared the record.
127
+ // the record by the CLI and set only in the session that declared the record.
131
128
  // The session that took the cut is the only one that can read this — a successor spends the mark when
132
129
  // it begins — so it is what tells that session to stop.
133
130
  is_handed_off: boolean
131
+ // Whether this run launched the issue and its stream holds no `merge` for it yet, read by the CLI.
132
+ // A parent that reads a closed child as `already-done` never runs
133
+ // `run:merge`, so the merge is never written and `run:board` shows the child running forever.
134
+ is_merge_owed: boolean
134
135
  }
135
136
 
136
137
  interface StepAction {
@@ -146,26 +147,30 @@ function command(line: string): StepAction {
146
147
  return { kind: 'command', line }
147
148
  }
148
149
 
150
+ function merge_command(issue_number: string): StepAction {
151
+ return command(`pnpm josh run:merge ${issue_number}`)
152
+ }
153
+
149
154
  // The action for each event a run can be positioned at, keyed on the newest one. Each dispatches to the
150
155
  // command that owns that phase. `stop`, `drain` and `child-launch` are handled apart in
151
156
  // `FULL_INPUT_ACTIONS`, because each needs more than the issue number. A merge and an outage share a
152
157
  // next step: `run:merge` classifies both, including the outage's stop condition.
153
158
  const KIND = run_event_stream.EVENT_KIND
154
- // A park and a stall share this next step: both mean runnable work is waiting to be offered
155
- // (joshuafolkken/kit#2359), so both are pointed at the backlog.
159
+ // A park and a stall share this next step: both mean runnable work is waiting to be offered,
160
+ // so both are pointed at the backlog.
156
161
  const OFFER_BACKLOG = 'pnpm josh backlog:next'
157
162
  const EVENT_ACTIONS: Record<string, (issue_number: string) => StepAction> = {
158
163
  [KIND.PR_OPENED]: () => command('pnpm josh followup'),
159
164
  [KIND.REVIEW_ROUND]: () => command('pnpm josh review:round2'),
160
- [KIND.MERGE]: (issue_number) => command(`pnpm josh run:merge ${issue_number}`),
161
- [KIND.OUTAGE]: (issue_number) => command(`pnpm josh run:merge ${issue_number}`),
165
+ [KIND.MERGE]: merge_command,
166
+ [KIND.OUTAGE]: merge_command,
162
167
  [KIND.PARK]: () => command(OFFER_BACKLOG),
163
168
  [KIND.CUT]: (issue_number) => command(`pnpm josh run:cut --resume ${issue_number}`),
164
169
  // A stall is undispatched ready work with a free lane, so its next step is exactly a park's: offer
165
170
  // the backlog. The detector only reports the stall; reading it here as a dispatch is what turns the
166
171
  // report into the action that resolves it.
167
172
  [KIND.STALL]: () => command(OFFER_BACKLOG),
168
- // The post-implementation region is with a detached ship supervisor (joshuafolkken/kit#2428): nothing
173
+ // The post-implementation region is with a detached ship supervisor: nothing
169
174
  // is the agent's until the supervisor stops or the issue closes, which the terminal read answers.
170
175
  [KIND.SHIP_LAUNCH]: () => verdict(WAIT),
171
176
  // The supervisor stopped at a failed stage and handed control back — the next step is reading the
@@ -174,29 +179,28 @@ const EVENT_ACTIONS: Record<string, (issue_number: string) => StepAction> = {
174
179
  }
175
180
 
176
181
  // The parent-only positions a dispatched lane child must never act on. `run:merge` is the parent's
177
- // budget command — a child that ran it read the `busy` it got back as a competing session and parked
178
- // its Issue unimplemented (joshuafolkken/kit#2267). A merge or an outage is the parent's to classify,
179
- // so a child at one has nothing to run and stops rather than being handed `run:merge`
180
- // (joshuafolkken/kit#2297).
182
+ // budget command — a child that ran it would read the `busy` it got back as a competing session and
183
+ // park its Issue unimplemented. A merge or an outage is the parent's to classify, so a child at one
184
+ // has nothing to run and stops rather than being handed `run:merge`.
181
185
  const PARENT_ONLY_EVENTS: ReadonlySet<string> = new Set([KIND.MERGE, KIND.OUTAGE])
182
186
 
183
187
  // A stopped run's last owed step is the end-of-run retrospective. When it is not owed the position stops
184
- // with no command to run, which is what the position meant before the retrospective existed.
188
+ // with no command to run.
185
189
  function stop_action(input: StepInput): StepAction {
186
190
  return run_retrospective.is_owed(input) ? command(RETROSPECTIVE_COMMAND) : verdict(STOP)
187
191
  }
188
192
 
189
- // The drain fires the retrospective *before* the idle watch, not after it (joshuafolkken/kit#2335): the
190
- // retrospective files the improvement issues the watch then picks up, so running it after the watch — as
191
- // the stop position alone did — spent the watch on an empty pool. When the retrospective is not owed the
193
+ // The drain fires the retrospective *before* the idle watch, not after it: the
194
+ // retrospective files the improvement issues the watch then picks up, so running it after the watch
195
+ // would spend the watch on an empty pool. When the retrospective is not owed the
192
196
  // run proceeds to that watch, which is a `WAIT` rather than a `STOP`: the backlog is empty but the run is
193
197
  // not ending, and the real `STOP` follows when the watch expires with the retrospective already done.
194
198
  function drain_action(input: StepInput): StepAction {
195
199
  return run_retrospective.is_owed(input) ? command(RETROSPECTIVE_COMMAND) : verdict(WAIT)
196
200
  }
197
201
 
198
- // The hand-off a `backlogrun` parent without a completion callback takes right after dispatching
199
- // (joshuafolkken/kit#2653). It is the existing merge-time cut, so the ownership check and the cut cap
202
+ // The hand-off a `backlogrun` parent without a completion callback takes right after dispatching.
203
+ // It is the existing merge-time cut, so the ownership check and the cut cap
200
204
  // apply unchanged, and the supervisor's driver adopts the in-flight lanes from their `child-launch`
201
205
  // events.
202
206
  const HAND_OFF_COMMAND = 'pnpm josh run:carry --cut --owner "$PPID"'
@@ -237,14 +241,14 @@ function event_action(event: string, issue_number: string, is_lane_child: boolea
237
241
 
238
242
  // A run that has planned but emitted nothing else is still at its pre-implementation position, so a
239
243
  // `plan` reads the same as an empty stream. A resume from an implementation cut is back at the same
240
- // position (joshuafolkken/kit#3375): read as the `cut` it follows, it pointed at the spent resume again.
244
+ // position: read as the `cut` it follows, it would point at the spent resume again.
241
245
  const IMPLEMENTATION_POSITIONS: ReadonlySet<string> = new Set([KIND.PLAN, KIND.RESUME])
242
246
 
243
247
  function is_pre_implementation(last_event: string | undefined): boolean {
244
248
  return last_event === undefined || IMPLEMENTATION_POSITIONS.has(last_event)
245
249
  }
246
250
 
247
- // **No cut at the setup→implementation boundary** (joshuafolkken/kit#2489). A lane child's context is
251
+ // **No cut at the setup→implementation boundary**. A lane child's context is
248
252
  // bounded by the threshold-gated implementation cut alone (`implementation-cut.ts`): the first edit is
249
253
  // the moment both would have looked at, and below the threshold a cut there is one that does not pay
250
254
  // for itself (`context-cut-payback.ts`), so a planned lane child implements in the same session.
@@ -252,23 +256,30 @@ function pre_implementation_action(input: StepInput): StepAction {
252
256
  return verdict(pre_verdict(input))
253
257
  }
254
258
 
259
+ // A parent whose child closed before `run:merge` wrote the merge still owes it:
260
+ // `run:merge` is the one writer of the `merge` event, so answering `already-done` here would leave the
261
+ // child running on `run:board` forever. A lane child is never handed `run:merge`.
262
+ function owes_merge(input: StepInput): boolean {
263
+ return input.is_merge_owed && input.carry_kind === 'carried' && !input.is_lane_child
264
+ }
265
+
255
266
  // A closed issue ends the run, but a tree still holding uncommitted work is surfaced rather than
256
- // answered `already-done` — the answer a child read as "nothing to do" before its lane was removed
257
- // with the work in it (joshuafolkken/kit#2476).
267
+ // answered `already-done` — the answer a child reads as "nothing to do" before its lane is removed
268
+ // with the work in it.
258
269
  function closed_action(input: StepInput): StepAction {
270
+ if (owes_merge(input)) return merge_command(input.issue_number)
259
271
  if (closed_verdict(input) === ALREADY_DONE) return verdict(ALREADY_DONE)
260
272
 
261
273
  const message = git_stash.work_message(input.issue_number, ALREADY_DONE)
262
274
 
263
275
  return {
264
276
  kind: 'decide',
265
- line: `decide: #${input.issue_number} is closed but this tree holds uncommitted work — keep it with \`git stash push -u -m "${message}"\` | carry it into a new issue`,
277
+ line: `decide: ${session_cite.issue(input.issue_number)} is closed but this tree holds uncommitted work — keep it with \`git stash push -u -m "${message}"\` | carry it into a new issue`,
266
278
  }
267
279
  }
268
280
 
269
- // **A cut hands the run on, so the session that took it stops** (joshuafolkken/kit#2760). The driver had
270
- // no handed-off state, so after `run:carry --cut` it went on answering `wait` or the next offer — a
271
- // `backlogrun` parent measured at 233k kept launching children in the same conversation up to 294k. A
281
+ // **A cut hands the run on, so the session that took it stops** — otherwise it would go on answering
282
+ // `wait` or the next offer after `run:carry --cut`, launching children in the same conversation. A
272
283
  // lane child never holds the carry record, so its own position is not decided here.
273
284
  function is_handed_off_parent(input: StepInput): boolean {
274
285
  return input.is_handed_off && input.carry_kind === 'carried' && !input.is_lane_child
@@ -1,12 +1,11 @@
1
1
  import { telegram_notify } from '#scripts/notify/telegram-notify'
2
2
  import type { CarryRead } from '#scripts/run/carry/run-carry'
3
3
 
4
- // **A `backlogrun` that halts because a person is needed used to reach nobody once the session was
5
- // cut** (joshuafolkken/kit#2136). Every remaining child blocked behind a parked one, the backlog
6
- // drained of anything runnable, the failure streak tripped — each ends the run, and while the session
7
- // was the person's the stop was there in the conversation. After a cut the parent is a headless
8
- // `claude -p backlogrun`, so the stop reached its own transcript and nowhere else, and the run sat
9
- // stopped until someone thought to ask. The 15-minute heartbeat stays a pull; a *stop* is a state
4
+ // **A `backlogrun` that halts because a person is needed must reach them after a session cut.** Every
5
+ // remaining child blocked behind a parked one, the backlog drained of anything runnable, the failure
6
+ // streak tripped — each ends the run, and while the session is the person's the stop is there in the
7
+ // conversation. After a cut the parent is a headless `claude -p backlogrun`, so the stop would reach
8
+ // its own transcript and nowhere else. The 15-minute heartbeat stays a pull; a *stop* is a state
10
9
  // change, and a state change is what `confirmation` exists to push.
11
10
  //
12
11
  // **This is the decision, kept apart from the send so the dedup can be pinned without a Telegram.**
@@ -21,8 +20,8 @@ const STOP_TITLE = 'backlogrun stopped'
21
20
  const STOP_RECOVERY =
22
21
  'If this did not arrive, `pnpm josh run:wake --list` relays the last progress line.'
23
22
 
24
- // **Only a stop over a record that is still there is announced, and that is the whole of the dedup**
25
- // (joshuafolkken/kit#2136). `--end` removes the record, so a second `--end --stopped` — a retried
23
+ // **Only a stop over a record that is still there is announced, and that is the whole of the dedup**.
24
+ // `--end` removes the record, so a second `--end --stopped` — a retried
26
25
  // turn, a re-evaluation — reads `none` and plans nothing, which is why one event never sends twice. A
27
26
  // clean finish passes no reason and stays silent, because a completed run has its own notification and
28
27
  // this type is for the run that halted needing a person. An `unreadable` record is not announced: with
@@ -3,7 +3,7 @@ import { fileURLToPath } from 'node:url'
3
3
  import { run_stranded } from './run-stranded'
4
4
  import { run_stranded_detect } from './run-stranded-detect'
5
5
 
6
- // `josh run:stranded` — read the three facts once and print the verdict (joshuafolkken/kit#2375). This
6
+ // `josh run:stranded` — read the three facts once and print the verdict. This
7
7
  // is the manual and testable face of the detector `stop-guard.ts` runs on every stop; both call the one
8
8
  // `detect_and_report`, so the command and the hook can never drift.
9
9
  //
@@ -10,10 +10,10 @@ import {
10
10
  type SupervisorLiveness,
11
11
  } from './run-stranded'
12
12
 
13
- // The I/O half of the strand detector (joshuafolkken/kit#2375): it gathers the three facts the pure
13
+ // The I/O half of the strand detector: it gathers the three facts the pure
14
14
  // judge in `run-stranded.ts` weighs, then — on a strand — leaves the marker and sends the one
15
15
  // notification. `stop-guard.ts` wires it into the Stop hook, so it runs at each loop boundary beside the
16
- // stall detector it mirrors (joshuafolkken/kit#2359); the CLI exposes the same call for a person to run
16
+ // stall detector it mirrors; the CLI exposes the same call for a person to run
17
17
  // by hand.
18
18
  //
19
19
  // **Cheap and local.** Every read is a file on disk — the carry record, the wake record — and a process
@@ -23,8 +23,8 @@ import {
23
23
 
24
24
  // The recovery line names the command that hands the run to a fresh supervisor — the same one the pure
25
25
  // judge holds, so the notification and the recovery can never drift. It is deliberately not
26
- // `run:carry --resume`: the cutting session is refused `busy` and must stay refused
27
- // (joshuafolkken/kit#1935), so recovery is another actor's.
26
+ // `run:carry --resume`: the cutting session is refused `busy` and must stay refused,
27
+ // so recovery is another actor's.
28
28
  const STRAND_RECOVERY = `Restart supervision with \`${run_stranded.RECOVERY_COMMAND}\` — it wakes a fresh successor to claim the budget; the cutting session must not resume it itself.`
29
29
 
30
30
  // The seams a test replaces: the two record targets, the two record reads, the owner and supervisor
@@ -2,12 +2,10 @@ import { process_identity } from '#scripts/josh/process-identity'
2
2
  import { run_carry, type CarryRead, type RunCarry } from '#scripts/run/carry/run-carry'
3
3
  import type { RunWake } from '#scripts/run/wake/run-wake'
4
4
 
5
- // The mechanical judge of a *stranded* run (joshuafolkken/kit#2375). On 2026-09-22 a `backlogrun`'s
6
- // cost hand-off left the record carried and handed off, the session that cut it died, no successor ever
7
- // claimed the budget, and no supervisor was watching — so five lanes ran on with nobody driving, and the
8
- // only way forward was a person noticing and running the recovery by hand. Three facts, read and never
9
- // weighed, are what say that state has been reached: the budget was handed off, its owner is gone, and
10
- // no supervisor is alive to wake a successor.
5
+ // The mechanical judge of a *stranded* run: a handed-off budget whose cutting session died, with no
6
+ // successor claiming it and no supervisor watching, so lanes run on with nobody driving. Three facts,
7
+ // read and never weighed, are what say that state has been reached: the budget was handed off, its
8
+ // owner is gone, and no supervisor is alive to wake a successor.
11
9
  //
12
10
  // **Pure by design, exactly as `backlog-stalled.ts` is.** The carry read, the owner's liveness and the
13
11
  // supervisor's are handed in, so the four acceptance cases — all three holding, a live owner, a claimed
@@ -18,7 +16,7 @@ import type { RunWake } from '#scripts/run/wake/run-wake'
18
16
  // **It is a report, never a stop.** A false positive costs one notification, never a halted run or a
19
17
  // torn-down lane — so every axis is read toward *not* stranded when it cannot be proven: an unreadable
20
18
  // carry record is not stranded, and a supervisor whose liveness cannot be established counts as watching.
21
- // **And recovery is another actor's, not the reader's** (joshuafolkken/kit#1935): the cutting session is
19
+ // **And recovery is another actor's, not the reader's**: the cutting session is
22
20
  // refused `busy` and must stay refused, so what the notification names is `run:wake --start`, which
23
21
  // starts a supervisor that wakes a *fresh* successor rather than driving the run itself.
24
22
 
@@ -27,7 +25,7 @@ import type { RunWake } from '#scripts/run/wake/run-wake'
27
25
  // which is the `busy` refusal `run-carry.ts` → `is_count_refused` exists to keep.
28
26
  const RECOVERY_COMMAND = 'pnpm josh run:wake --start'
29
27
 
30
- // The three answers a supervisor's liveness probe gives, named (joshuafolkken/kit#2375). `live` is a
28
+ // The three answers a supervisor's liveness probe gives, named. `live` is a
31
29
  // supervisor still watching, `gone` is one whose process has died or a record that was never there at
32
30
  // all, and `unknown` is the platform answering for nobody — a pid that is alive paired with a start
33
31
  // token this machine could not read. The three are kept apart because the strand judge resolves
@@ -53,11 +51,11 @@ interface StrandedInput {
53
51
  supervisor: SupervisorLiveness
54
52
  }
55
53
 
56
- // **The supervisor's liveness, three-valued** (joshuafolkken/kit#2375). An absent wake record is `gone`:
57
- // `run:wake --list` reported `none` in the run this fixes, and nothing watching is the very state a
58
- // strand needs. A present record is read through `process_identity.is_same_process`, whose own three
59
- // answers this passes straight through — `true` is `live`, `false` is `gone`, and the platform's "cannot
60
- // tell" is `unknown`. The prober is injected so the three cases are tested without a real process.
54
+ // **The supervisor's liveness, three-valued.** An absent wake record is `gone`: nothing watching is
55
+ // the very state a strand needs. A present record is read through `process_identity.is_same_process`,
56
+ // whose own three answers this passes straight through — `true` is `live`, `false` is `gone`, and the
57
+ // platform's "cannot tell" is `unknown`. The prober is injected so the three cases are tested without
58
+ // a real process.
61
59
  function supervisor_liveness(
62
60
  wake: RunWake | undefined,
63
61
  same_process: (
@@ -1,29 +1,29 @@
1
1
  #!/usr/bin/env tsx
2
2
  import { fileURLToPath } from 'node:url'
3
+ import { issue_number_shape } from '#scripts/issue/issue-number-shape'
3
4
  import { josh_command } from '#scripts/josh/josh-run'
4
5
  import { lane_child_marker } from '#scripts/lane/lane-child-marker'
5
6
  import { run_tail, type TailSection } from './run-tail'
6
7
 
7
- // `josh run:tail [<N> ...]` — one call for the fixed post-merge sequence a run closes on
8
- // (joshuafolkken/kit#2372). The loop used to spend a round trip on `observations:flush`, one on
9
- // `issue:cite` and one on `release:scope`, re-billing a lane's full context each time; this runs the
10
- // three internally and prints one composite report, the same way `backlog:offer` chains its two calls
11
- // and `run:prep` bundles three reads. Each step's stderr is forwarded, so the reader still sees every
12
- // explanation the three would have printed on their own.
8
+ // `josh run:tail [<N> ...]` — one call for the fixed post-merge sequence a run closes on.
9
+ // It runs `observations:flush`, `issue:cite` and `release:scope` internally, so no round trip per step
10
+ // re-bills a lane's full context, and prints one composite report, the same way
11
+ // `backlog:offer` chains its two calls and `run:prep` bundles three reads. Each
12
+ // step's stderr is forwarded, so the reader still sees every explanation the three would have
13
+ // printed on their own.
13
14
  //
14
15
  // The issue numbers are the completion's citations — the closed issue and any follow-ups filed this run
15
16
  // — and go to `issue:cite`; the other two take none. A `run:tail` with no numbers still closes the run,
16
17
  // because `issue:cite` with no target exits zero.
17
18
  //
18
- // **A dispatched lane child skips the ledger step** (joshuafolkken/kit#2492). A flush opens a
19
+ // **A dispatched lane child skips the ledger step**. A flush opens a
19
20
  // ledger-only pull request and waits out its whole CI before it merges — minutes per issue, spent on a
20
21
  // file only the retrospective and the measurements read — and a lane has nothing for it: its lines
21
- // merged with its own pull request (joshuafolkken/kit#2919). A single run outside a lane keeps the
22
+ // merged with its own pull request. A single run outside a lane keeps the
22
23
  // step for a line written on the default branch outside any issue's run.
23
24
 
24
25
  const ARGV_OFFSET = 2
25
26
  const FAILURE_EXIT_CODE = 1
26
- const ISSUE_NUMBER_PATTERN = /^[1-9]\d*$/u
27
27
  const USAGE = 'Usage: josh run:tail [<issue-number> ...]'
28
28
  const should_forward_stderr = true
29
29
 
@@ -33,14 +33,13 @@ interface Step {
33
33
  }
34
34
 
35
35
  // The steps in the order a run closes on: the checkout returns to the default branch, any ledger line
36
- // the run's own commit did not carry (joshuafolkken/kit#2763) is committed so the recurrence count is on
36
+ // the run's own commit did not carry is committed so the recurrence count is on
37
37
  // main — on most runs the flush answers `clean` — the citations are read for the completion report, and
38
38
  // the release scope is decided last.
39
39
  //
40
- // **The return comes first because the flush refuses anywhere else** (joshuafolkken/kit#2979). A run
41
- // closes right after its merge, still on the feature branch it shipped from, and `josh ship` reaches
42
- // this report with nothing in between — so the flush stopped a merged run as failed. `main:sync` is the
43
- // step a person used to type after the fact; it fast-forwards the local default branch before the
40
+ // **The return comes first because the flush refuses anywhere else**. A run closes right
41
+ // after its merge, still on the feature branch it shipped from, and `josh ship` reaches this report
42
+ // with nothing in between. `main:sync` fast-forwards the local default branch before the
44
43
  // checkout, so a ledger line appended after the merge is carried along rather than refused.
45
44
  const LEDGER_STEPS: ReadonlyArray<Step> = [
46
45
  { header: run_tail.SYNC_HEADER, argv: () => ['main:sync'] },
@@ -58,7 +57,7 @@ function steps_for(is_lane_child: boolean): ReadonlyArray<Step> {
58
57
  // Numbers only — a target `issue:cite` reads as an issue, so a stray flag is refused rather than
59
58
  // forwarded to the wrong step.
60
59
  function parse_issues(argv: ReadonlyArray<string>): ReadonlyArray<string> | undefined {
61
- if (argv.every((token) => ISSUE_NUMBER_PATTERN.test(token))) return argv
60
+ if (argv.every((token) => issue_number_shape.is_issue_number(token))) return argv
62
61
 
63
62
  return undefined
64
63
  }
@@ -74,7 +73,7 @@ async function run_step(step: Step, issues: ReadonlyArray<string>): Promise<Tail
74
73
  }
75
74
 
76
75
  // Run the steps in order, not concurrently: the ledger commit must land on main before the release scope
77
- // reads main's pending count, and the order is what a lane spent three turns on.
76
+ // reads main's pending count.
78
77
  async function close_run(issues: ReadonlyArray<string>): Promise<ReadonlyArray<TailSection>> {
79
78
  const sections: Array<TailSection> = []
80
79
 
@@ -1,5 +1,5 @@
1
- // `josh run:tail [<N> ...]` — the one call that closes a run (joshuafolkken/kit#2372). It folds the
2
- // fixed post-merge bookkeeping a lane spends three separate round trips on — commit the observation
1
+ // `josh run:tail [<N> ...]` — the one call that closes a run. It folds the fixed
2
+ // post-merge bookkeeping that would otherwise take three separate round trips — commit the observation
3
3
  // ledger (`observations:flush`), read the completion citations (`issue:cite`), and decide whether a
4
4
  // release is owed (`release:scope`) — into one composite, the same shape `run:prep` bundles three reads
5
5
  // on. None of the three needs a decision between it and the next, so nothing the reader had to judge is
@@ -9,53 +9,34 @@
9
9
  // each step's output under a header and answers the exit code from the collected codes, so a test pins
10
10
  // the composite without a ledger ever being committed or a release ever read.
11
11
 
12
+ import { run_section, type Section } from './run-section'
13
+
12
14
  const SYNC_HEADER = '=== sync ==='
13
15
  const OBSERVATIONS_HEADER = '=== observations ==='
14
16
  const CITATIONS_HEADER = '=== citations ==='
15
17
  const RELEASE_HEADER = '=== release ==='
16
- const SECTION_SEPARATOR = '\n\n'
17
-
18
- const SUCCESS_EXIT_CODE = 0
19
- const FAILURE_EXIT_CODE = 1
20
-
21
- interface TailSection {
22
- header: string
23
- body: string
24
- code: number
25
- }
26
-
27
- function section_report(section: TailSection): string {
28
- return `${section.header}\n${section.body}`
29
- }
30
18
 
31
- function format_report(sections: ReadonlyArray<TailSection>): string {
32
- return sections.map((section) => section_report(section)).join(SECTION_SEPARATOR)
33
- }
19
+ type TailSection = Section
34
20
 
35
- // **A failed step's stderr joins its body** (joshuafolkken/kit#2462). A detached run's log keeps the
36
- // report, not the terminal, so a refusal printed only to stderr left the section reading
37
- // `ELIFECYCLE` alone. A passing step's stderr is commentary and stays out of the report.
21
+ // **A failed step's stderr joins its body.** A detached run's log keeps the report, not the
22
+ // terminal, so a refusal printed only to stderr would leave the section reading `ELIFECYCLE` alone. A
23
+ // passing step's stderr is commentary and stays out of the report.
38
24
  function section_body(out: string, error_output: string | undefined, code: number): string {
39
- if (code === SUCCESS_EXIT_CODE || error_output === undefined) return out
25
+ if (error_output === undefined || code === run_section.SUCCESS_EXIT_CODE) return out
40
26
 
41
27
  return [out, error_output].filter((part) => part.length > 0).join('\n')
42
28
  }
43
29
 
44
- // Non-zero when any step failed, exactly as each of the three exits on its own — a bundle where the
45
- // ledger commit failed is never read as a clean close because the citations after it succeeded.
46
- function exit_code(sections: ReadonlyArray<TailSection>): number {
47
- const is_clean = sections.every((section) => section.code === SUCCESS_EXIT_CODE)
48
-
49
- return is_clean ? SUCCESS_EXIT_CODE : FAILURE_EXIT_CODE
50
- }
51
-
30
+ // The exit code is non-zero when any step failed, exactly as each of the three exits on its own — a
31
+ // bundle where the ledger commit failed is never read as a clean close because the citations after it
32
+ // succeeded.
52
33
  const run_tail = {
53
34
  CITATIONS_HEADER,
54
35
  OBSERVATIONS_HEADER,
55
36
  RELEASE_HEADER,
56
37
  SYNC_HEADER,
57
- exit_code,
58
- format_report,
38
+ exit_code: run_section.exit_code_of,
39
+ format_report: run_section.format_sections,
59
40
  section_body,
60
41
  }
61
42
 
@@ -4,10 +4,9 @@ import { run_progress_read } from '#scripts/run/progress/run-progress-read'
4
4
  import { run_watcher_guard } from './run-watcher-guard'
5
5
 
6
6
  // `josh run:watcher:guard` — refuses when lane children are in-flight but the progress watcher has not
7
- // pinged its life record recently (joshuafolkken/kit#2113). This is the hand-run form, kept for a run
8
- // that calls it before a loop iteration; the *automatic* wiring is in `pretool-guard.ts`, which
9
- // composes the same guard through `run-watcher-hook.ts` so every tool call is checked
10
- // (joshuafolkken/kit#2353).
7
+ // pinged its life record recently. This is the hand-run form, kept for a run that calls it before a
8
+ // loop iteration; the *automatic* wiring is in `pretool-guard.ts`, which composes the same guard
9
+ // through `run-watcher-hook.ts` so every tool call is checked.
11
10
  //
12
11
  // **Exits 0 (ok) or 1 (stale).** A non-zero exit is what the hook mechanism treats as a refusal —
13
12
  // the same contract `batch:guard` and `rule:guard` hold.
@@ -4,18 +4,17 @@ import { run_headless } from './run-headless'
4
4
 
5
5
  // A watcher that stopped while children are still in-flight leaves the run's event stream without a
6
6
  // heartbeat and the parent without the wake an arrival would deliver. This guard detects that state so
7
- // a hook can refuse the calls that follow a missed restart (joshuafolkken/kit#2113).
7
+ // a hook can refuse the calls that follow a missed restart.
8
8
  //
9
9
  // **Staleness threshold is `TICK_MULTIPLIER` watcher ticks.** The watcher pings its life record on
10
10
  // every tick (every 30 s), so a gap wider than three ticks means the process has almost certainly
11
11
  // stopped: it exited on an arrival, its bound expired, or the session was cut without a restart. A
12
- // report is no longer one of those (joshuafolkken/kit#3102) — `--wait` streams its reports and keeps
13
- // running — so a restart is owed only after an exit the parent was woken for. Three gives one missed
14
- // tick of slack before the guard fires.
12
+ // report is not one of those — `--wait` streams its reports and keeps running — so a restart is owed
13
+ // only after an exit the parent was woken for. Three gives one missed tick of slack before the guard
14
+ // fires.
15
15
  //
16
- // **It watches no relay** (joshuafolkken/kit#2492). A session following the run's event stream after a
17
- // cut used to be held to it here; that relay re-read the session's whole history per event, so the
18
- // stream is now watched from a pane of its own (`run:event --watch`) and no session owes it.
16
+ // **It watches no relay.** A relay would re-read the session's whole history per event, so the stream
17
+ // is watched from a pane of its own (`run:board`) and no session owes it.
19
18
 
20
19
  const WATCHER_TICK_MS = 30_000
21
20
  const TICK_MULTIPLIER = 3
@@ -34,11 +33,11 @@ type GuardResult = { kind: 'ok' } | { kind: 'stale'; note: string }
34
33
 
35
34
  const OK_RESULT: GuardResult = { kind: 'ok' }
36
35
 
37
- // **Only the run that opened the lanes owes them a watcher** (joshuafolkken/kit#2965). The lane listing
38
- // is machine-wide, so a session with no run of its own — an investigation, a `fullrun` beside a batch —
39
- // used to be refused for another run's lanes. The session that drives the live `backlogrun` carry
40
- // record is the one that dispatched them; every other session passes. A session `run:wake` woke owes
41
- // none either (joshuafolkken/kit#3245): the supervisor's driver watches the lanes, and the woken session
36
+ // **Only the run that opened the lanes owes them a watcher**. The lane listing is
37
+ // machine-wide, so without this a session with no run of its own — an investigation, a `fullrun`
38
+ // beside a batch — would be refused for another run's lanes. The session that drives the live
39
+ // `backlogrun` carry record is the one that dispatched them; every other session passes. A session
40
+ // `run:wake` woke owes none either: the supervisor's driver watches the lanes, and the woken session
42
41
  // only acts on the branch it was handed and cuts.
43
42
  async function owes_watcher(): Promise<boolean> {
44
43
  if (run_headless.is_headless() || !(await run_headless.is_backlog_parent())) return false