@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,5 +1,7 @@
1
1
  #!/usr/bin/env tsx
2
2
  import { fileURLToPath } from 'node:url'
3
+ import { issue_number_shape } from '#scripts/issue/issue-number-shape'
4
+ import { run_cli_fault } from '#scripts/run/run-cli-fault'
3
5
  import { run_halfrun_resume } from '#scripts/run/run-halfrun-resume'
4
6
  import { run_label } from '#scripts/run/run-label'
5
7
  import { run_preflight, type PreflightDecision } from '#scripts/run/run-preflight'
@@ -8,32 +10,28 @@ import { run_tidy_cli } from '#scripts/run/tidy/run-tidy-cli'
8
10
  import { run_hold, type HoldRead, type RunHold } from './run-hold'
9
11
 
10
12
  // `josh run:hold [<N>]` and `josh run:release [<N> | --force]` — the working-tree guard the typed
11
- // entry points ask before they start (joshuafolkken/kit#1091).
13
+ // entry points ask before they start.
12
14
  //
13
- // **A numbered claim asks the preflight question first** (joshuafolkken/kit#1965). `run:preflight`
14
- // was a separate command a run had to ask before this one; the two-step "preflight, then hold" was
15
- // one call too many, so the claim now runs the check itself and hands back a hold only on a `clean`
16
- // tree. A `reclaim` / `resume` / `park` tree is returned as that verdict without a record being
17
- // written, and the read-only check stays re-askable — clean up what it named, ask `run:hold` again.
18
- // The decision logic itself lives on in `run-preflight.ts` for `run:progress` to reuse; only its CLI
19
- // went away.
15
+ // **A numbered claim asks the preflight question first**: the claim runs the check itself and hands
16
+ // back a hold only on a `clean` tree. A `reclaim` / `resume` / `park` tree is returned as that verdict
17
+ // without a record being written, and the read-only check stays re-askable — clean up what it named,
18
+ // ask `run:hold` again. The decision logic lives in `run-preflight.ts` for `run:progress` to reuse.
20
19
  //
21
- // **A release names the run it belongs to, exactly as the claim did** (joshuafolkken/kit#1799). The
22
- // record carries no owner until then, so `run:release` removed whatever was there — and the `busy`
23
- // stop message tells a person to type it when they judge a record stale, which is a judgement made
24
- // from outside the run that wrote it. That made the guard's own recovery instruction a way to free a
25
- // live run's tree: the incident of 2026-08-30, reached through the guard meant to prevent it.
20
+ // **A release names the run it belongs to, exactly as the claim did.** The `busy` stop message tells
21
+ // a person to release when they judge a record stale — a judgement made from outside the run that
22
+ // wrote it — so an unowned release would make the guard's own recovery instruction a way to free a
23
+ // live run's tree.
26
24
  //
27
25
  // **It answers, so the entry point does not judge.** "This one is a small change, it will be fine" is
28
- // the judgement made under time pressure that produced the incident, and it is the same shape
29
- // `delegation-policy.ts` refuses to leave to an agent. A token on standard output is what the entry
26
+ // a judgement made under time pressure, and it is the same shape `delegation-policy.ts` refuses to
27
+ // leave to an agent. A token on standard output is what the entry
30
28
  // point obeys.
31
29
  //
32
30
  // The contract is `epic:next`'s: **standard output carries exactly one token** — `hold`, `busy` or
33
31
  // `unknown` — and every explanation goes to standard error, so `answer=$(pnpm josh run:hold 1091)`
34
32
  // captures something a loop can branch on.
35
33
  //
36
- // **A successful claim then sweeps merged residue** — `run:tidy` (joshuafolkken/kit#2701). After the
34
+ // **A successful claim then sweeps merged residue** — `run:tidy`. After the
37
35
  // claim rather than before it: the sweep may append to the primary checkout's observation ledger, and
38
36
  // doing that ahead of the preflight would turn a clean primary checkout into a `reclaim`.
39
37
 
@@ -41,23 +39,23 @@ const SUCCESS_EXIT_CODE = 0
41
39
  const FAILURE_EXIT_CODE = 1
42
40
  const ARGV_OFFSET = 2
43
41
  const RELEASE_FLAG = '--release'
44
- // What removes a record this run did not write. **The deliberate friction of the whole change**
45
- // (joshuafolkken/kit#1799): every release now names the run it belongs to, and the one act that
46
- // cannot — clearing a record somebody else left behind — is spelled out rather than reached by
47
- // typing the ordinary command.
42
+ // What removes a record this run did not write. **Deliberate friction**: every release names the run
43
+ // it belongs to, and the one act that cannot — clearing a record somebody else left behind — is
44
+ // spelled out rather than reached by typing the ordinary command.
48
45
  const FORCE_FLAG = '--force'
49
46
  // What `fullrun #N`'s entry claims with, so the record says the run is a `fullrun` — the one run whose
50
- // implementation cut outside a lane resumes as `fullrun #N` (joshuafolkken/kit#2760).
47
+ // implementation cut outside a lane resumes as `fullrun #N`.
51
48
  const FULLRUN_FLAG = '--fullrun'
52
49
  const HALFRUN_STOP_FLAG = '--halfrun-stop'
53
- // A `prrun`'s stop before merge (joshuafolkken/kit#3023): its record keeps the commit it stopped on.
50
+ // A `prrun`'s stop before merge: its record keeps the commit it stopped on.
54
51
  const PRRUN_STOP_FLAG = '--prrun-stop'
55
52
  // The most a claim reads: the issue number and the one flag after it.
56
53
  const MAX_CLAIM_ARGUMENTS = 2
57
- const ISSUE_NUMBER_PATTERN = /^[1-9]\d*$/u
58
54
  const USAGE =
59
55
  'Usage: josh run:hold [<issue-number> [--fullrun | --halfrun-stop | --prrun-stop]] | josh run:release [<issue-number> | --force]'
60
56
 
57
+ const COMMAND = 'run:hold'
58
+
61
59
  const HOLD_VERDICT = 'hold'
62
60
  const BUSY_VERDICT = 'busy'
63
61
  const UNKNOWN_VERDICT = 'unknown'
@@ -121,7 +119,9 @@ function parse_claim(argv: ReadonlyArray<string>): HoldRequest | undefined {
121
119
 
122
120
  if (first === undefined) return { kind: 'claim', issue: run_hold.UNNUMBERED_ISSUE }
123
121
 
124
- if (argv.length > MAX_CLAIM_ARGUMENTS || !ISSUE_NUMBER_PATTERN.test(first)) return undefined
122
+ if (argv.length > MAX_CLAIM_ARGUMENTS || !issue_number_shape.ISSUE_NUMBER_PATTERN.test(first)) {
123
+ return undefined
124
+ }
125
125
 
126
126
  return numbered_claim(first, flag)
127
127
  }
@@ -129,7 +129,7 @@ function parse_claim(argv: ReadonlyArray<string>): HoldRequest | undefined {
129
129
  function parse_release_argument(first: string): HoldRequest | undefined {
130
130
  if (first === FORCE_FLAG) return FORCE_RELEASE_REQUEST
131
131
 
132
- return ISSUE_NUMBER_PATTERN.test(first) ? release_request(first) : undefined
132
+ return issue_number_shape.ISSUE_NUMBER_PATTERN.test(first) ? release_request(first) : undefined
133
133
  }
134
134
 
135
135
  // **A bare `run:release` is the unnumbered run's release, not a release of whatever is there.** It
@@ -171,8 +171,13 @@ function report_hold(): number {
171
171
  // that wrote it is the one whose uncommitted work would be trampled, so a record that cannot be
172
172
  // parsed is never read as an idle tree. **And an expired record still stops it while the tree is
173
173
  // dirty** — that is a run which stopped for a person, and the work is right there in the tree.
174
- async function blocking_message(read: HoldRead): Promise<string | undefined> {
175
- if (read.kind === 'held') return run_hold.held_message(read.hold)
174
+ // **A live record stops every claim but its own run's.**
175
+ function held_block(hold: RunHold, issue: string): string | undefined {
176
+ return run_hold.is_reentry(hold, issue) ? undefined : run_hold.held_message(hold)
177
+ }
178
+
179
+ async function blocking_message(read: HoldRead, issue: string): Promise<string | undefined> {
180
+ if (read.kind === 'held') return held_block(read.hold, issue)
176
181
 
177
182
  if (read.kind === 'unreadable') return run_hold.unreadable_message()
178
183
 
@@ -193,7 +198,7 @@ function take_free_tree(target: string, request: ClaimRequest): number {
193
198
 
194
199
  // **The stale path takes the tree the same exclusive way the free path does.** Replacing an expired
195
200
  // record with a plain write would tell two sessions that both found it expired that they both won —
196
- // the race the free path was just fixed for, reintroduced one branch over. Removing it first is what
201
+ // the race the free path guards against. Removing it first is what
197
202
  // turns the expired record into a free tree; the create is what decides between the two claimants.
198
203
  function replace_stale(target: string, request: ClaimRequest, hold: RunHold): number {
199
204
  console.error(run_hold.stale_message(hold))
@@ -202,9 +207,19 @@ function replace_stale(target: string, request: ClaimRequest, hold: RunHold): nu
202
207
  return take_free_tree(target, request)
203
208
  }
204
209
 
210
+ // The claim on a tree nothing blocks. A `held` record that got this far is the run's own, so it is
211
+ // kept as written — its stop marks included — and answered `hold`.
212
+ function take_tree(target: string, request: ClaimRequest, read: HoldRead): number {
213
+ if (read.kind === 'held') return report_hold()
214
+
215
+ return read.kind === 'stale'
216
+ ? replace_stale(target, request, read.hold)
217
+ : take_free_tree(target, request)
218
+ }
219
+
205
220
  // A non-clean preflight verdict is not an error: it is an answer a loop branches on, exactly as
206
221
  // `busy` is, so it prints the reason and advice the check composed and exits zero. Only an unreadable
207
- // tree is `unknown`, and that reaches `report_unknown` through `run`'s catch, as it always did.
222
+ // tree is `unknown`, and that reaches `report_unknown` through `answer`'s directory read.
208
223
  function report_preflight(decision: PreflightDecision): number {
209
224
  console.error(`${decision.reason}\n${decision.advice}`)
210
225
  console.info(decision.verdict)
@@ -232,14 +247,11 @@ async function claim(target: string, request: ClaimRequest, is_linked: boolean):
232
247
  if (gate !== undefined) return gate
233
248
 
234
249
  const read = run_hold.read_hold(target)
235
- const blocked = await blocking_message(read)
250
+ const blocked = await blocking_message(read, request.issue)
236
251
 
237
252
  if (blocked !== undefined) return report_busy(blocked)
238
253
 
239
- const code =
240
- read.kind === 'stale'
241
- ? replace_stale(target, request, read.hold)
242
- : take_free_tree(target, request)
254
+ const code = take_tree(target, request, read)
243
255
 
244
256
  if (code === SUCCESS_EXIT_CODE) await run_tidy_cli.sweep()
245
257
 
@@ -257,30 +269,28 @@ function report_held(hold: RunHold): number {
257
269
  return report(run_hold.foreign_release_message(hold), HELD_VERDICT, FAILURE_EXIT_CODE)
258
270
  }
259
271
 
260
- // A record nothing can parse names no run, so no claimant can match it — and removing it anyway is
261
- // the one thing this path exists to refuse. It answers `unknown` for the reason every other
272
+ // A record nothing can parse names no run, so no claimant can match it — and removing it, or marking
273
+ // a stop on it, is what these paths refuse. It answers `unknown` for the reason every other
262
274
  // unreadable state here does: nothing was established, so nothing may be concluded.
263
- function report_unreadable_release(): number {
275
+ function report_unreadable_record(): number {
264
276
  return report(run_hold.unreadable_message(), UNKNOWN_VERDICT, FAILURE_EXIT_CODE)
265
277
  }
266
278
 
267
- // **A release removes the record only where the record names the run asking** (joshuafolkken/kit#1799).
268
- // Until then this removed whatever was there, and the `busy` stop message sent a person here to clear
269
- // a record they had judged stale from outside the run that wrote it — so the guard's own recovery
270
- // instruction was a way to free a live run's tree, which is the incident it was written after.
279
+ // **A release removes the record only where the record names the run asking**, so the `busy` stop
280
+ // message's recovery instruction cannot free a live run's tree.
271
281
  function release_record(target: string, claimant: string): number {
272
282
  const read = run_hold.read_hold(target)
273
283
 
274
284
  if (read.kind === 'free') return remove_record(target, false)
275
285
 
276
- if (read.kind === 'unreadable') return report_unreadable_release()
286
+ if (read.kind === 'unreadable') return report_unreadable_record()
277
287
 
278
288
  if (!run_hold.is_own_hold(read.hold, claimant)) return report_held(read.hold)
279
289
 
280
290
  return remove_record(target, true)
281
291
  }
282
292
 
283
- // **A numbered run's own release takes its `in-progress` marker back off** (joshuafolkken/kit#3182),
293
+ // **A numbered run's own release takes its `in-progress` marker back off**,
284
294
  // whether or not a record was still there — the stop that releases is the run ending its hold on the
285
295
  // issue. A refused release (another run's record, an unreadable one) touches no label, and an
286
296
  // unnumbered run names no issue to touch.
@@ -318,17 +328,9 @@ function report_usage(): number {
318
328
  return FAILURE_EXIT_CODE
319
329
  }
320
330
 
321
- async function read_worktree(): Promise<string | undefined> {
322
- try {
323
- return await run_hold.worktree_directory()
324
- } catch {
325
- return undefined
326
- }
327
- }
328
-
329
- // **A `halfrun` stop marks its own record** (joshuafolkken/kit#2796) — the positive "this run has ended
330
- // over its verified diff" that `run:entry` adopts on `fullrun #N`. Another run's record is left alone.
331
- // A `prrun` stop marks its record the same way, with the commit it stopped on (joshuafolkken/kit#3023).
331
+ // **A `halfrun` stop marks its own record** — the positive "this run has ended over its verified diff"
332
+ // that `run:entry` adopts on `fullrun #N`. Another run's record is left alone. A `prrun` stop marks
333
+ // its record the same way, with the commit it stopped on.
332
334
  async function mark_stop(target: string, request: StopRequest): Promise<number> {
333
335
  const mark =
334
336
  request.kind === PRRUN_STOP_KIND
@@ -337,7 +339,7 @@ async function mark_stop(target: string, request: StopRequest): Promise<number>
337
339
 
338
340
  if (mark === run_halfrun_resume.MARKED) return report_hold()
339
341
 
340
- if (mark === run_halfrun_resume.UNREADABLE) return report_unknown()
342
+ if (mark === run_halfrun_resume.UNREADABLE) return report_unreadable_record()
341
343
 
342
344
  return report_busy(run_hold.race_message(run_hold.read_hold(target), target))
343
345
  }
@@ -353,7 +355,7 @@ async function dispatch(request: HoldRequest, target: string, is_linked: boolean
353
355
  }
354
356
 
355
357
  async function answer(request: HoldRequest): Promise<number> {
356
- const directory = await read_worktree()
358
+ const directory = await run_cli_fault.directory_of(COMMAND, run_hold.worktree_directory)
357
359
 
358
360
  if (directory === undefined) return report_unknown()
359
361
 
@@ -362,10 +364,11 @@ async function answer(request: HoldRequest): Promise<number> {
362
364
  return await dispatch(request, run_hold.hold_path(directory), is_linked)
363
365
  }
364
366
 
365
- // **Every path out of here prints exactly one token**, including the ones nobody planned: a permission
366
- // error on the record, or a git binary that is not there, used to leave standard output empty — and an
367
- // empty `$answer` matches none of the three tokens, which an entry point reads as "not busy" before
368
- // walking straight past the guard.
367
+ // **Every path out of here prints exactly one token**, including the ones nobody planned — a
368
+ // permission error on the record, or a git binary that is not there: an empty `$answer` matches none
369
+ // of the three tokens, which an entry point would read as "not busy" and walk straight past the guard.
370
+ // The token stays `unknown`, and the failure says what it was rather than borrowing the
371
+ // unreadable-git-directory message.
369
372
  async function run(argv: ReadonlyArray<string>): Promise<number> {
370
373
  const request = parse_request(argv)
371
374
 
@@ -373,8 +376,8 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
373
376
 
374
377
  try {
375
378
  return await answer(request)
376
- } catch {
377
- return report_unknown()
379
+ } catch (error) {
380
+ return report(run_cli_fault.message(COMMAND, error), UNKNOWN_VERDICT, FAILURE_EXIT_CODE)
378
381
  }
379
382
  }
380
383
 
@@ -1,13 +1,17 @@
1
1
  import { git_command } from '#scripts/git/git-command'
2
+ import { session_cite } from '#scripts/issue/session-cite'
3
+ import { agent_session_environment } from '#scripts/josh/agent-session-environment'
4
+ import { process_identity } from '#scripts/josh/process-identity'
2
5
  import { stamp_file } from '#scripts/josh/stamp-file'
6
+ import { stamp_record } from '#scripts/josh/stamp-record'
3
7
  import { error_text } from '#scripts/lib/error-message'
8
+ import { json_value } from '#scripts/lib/json-value'
4
9
  import { z } from 'zod'
5
10
 
6
- // joshuafolkken/kit#1091: `epicrun` asks `epic-busy.ts` whether a *repository* already has a child in
7
- // flight, and the entry points a person types — `fullrun`, `halfrun`, `kickoff` — never reach that
8
- // guard, because they do not go through `epic:next`. On 2026-08-30 two sessions therefore implemented
9
- // two issues in one checkout at once, and the second was one command away from committing nine files
10
- // onto the first one's branch.
11
+ // One run at a time per working tree. The entry points a person types — `fullrun`, `halfrun`,
12
+ // `kickoff` — never reach `epic-busy.ts`'s guard, because they do not go through `epic:next`, so
13
+ // without this two sessions could implement two issues in one checkout and commit onto each other's
14
+ // branch.
11
15
  //
12
16
  // **The unit is the working tree, not the repository.** What these entries contend for is one branch,
13
17
  // one index and one uncommitted diff; a linked work tree has its own three, so a second run there is
@@ -30,11 +34,9 @@ const MILLISECONDS_PER_HOUR = 3_600_000
30
34
  const HOLD_MAX_AGE_MS = HOLD_MAX_AGE_HOURS * MILLISECONDS_PER_HOUR
31
35
 
32
36
  const RELEASE_COMMAND = 'pnpm josh run:release'
33
- // The spelling that removes a record this run did not write (joshuafolkken/kit#1799). **It is a
34
- // separate spelling rather than the same one** because a stop message has to name something a person
35
- // can type when a record really has been abandoned — and the one it named until now removed a *live*
36
- // run's record just as readily, which is the incident this guard was written after, reached through
37
- // the guard's own recovery instruction.
37
+ // The spelling that removes a record this run did not write. **It is a separate spelling rather than
38
+ // the same one** because a stop message has to name something a person can type when a record really
39
+ // has been abandoned, without the plain release removing a *live* run's record just as readily.
38
40
  const FORCE_RELEASE_COMMAND = `${RELEASE_COMMAND} --force`
39
41
  // The sentence `epic-busy.ts` prints for the same reason: a guard that cannot read its record has not
40
42
  // established that the tree is free, and reporting it as free is the one failure that matters here.
@@ -44,19 +46,25 @@ interface RunHold {
44
46
  issue: string
45
47
  taken_at: string
46
48
  pid: number
47
- // Set only by `fullrun #N`'s entry (`run:entry` claims with `--fullrun`, joshuafolkken/kit#2760).
48
- // The implementation cut outside a lane resumes as `fullrun #N`, so a `halfrun` or an in-session
49
- // `backlogrun` child — which hold the tree just the same — must not be read as one. Optional and
50
- // `| undefined` because a record written before this field existed is simply not a `fullrun`'s.
49
+ // Set only by `fullrun #N`'s entry (`run:entry` claims with `--fullrun`). The implementation cut
50
+ // outside a lane resumes as `fullrun #N`, so a `halfrun` or an in-session `backlogrun` child — which
51
+ // hold the tree just the same — must not be read as one. Optional and `| undefined` because a record
52
+ // without this field is simply not a `fullrun`'s.
51
53
  is_fullrun?: boolean | undefined
52
- // Set only at a `halfrun`'s stop before commit (`run:hold <N> --halfrun-stop`, joshuafolkken/kit#2796):
53
- // the positive record that the run has *ended* over its verified diff, which is what lets
54
- // `fullrun #N` adopt the hold. A running `halfrun` or a `backlogrun` child never carries it.
54
+ // Set only at a `halfrun`'s stop before commit (`run:hold <N> --halfrun-stop`): the positive record
55
+ // that the run has *ended* over its verified diff, which is what lets `fullrun #N` adopt the hold. A
56
+ // running `halfrun` or a `backlogrun` child never carries it.
55
57
  is_halfrun_stop?: boolean | undefined
56
- // Set only at a `prrun`'s stop before merge (`run:hold <N> --prrun-stop`, joshuafolkken/kit#3023): the
57
- // commit the green pull request stood on, so `fullrun #N` can tell an untouched branch — merge it —
58
- // from one that moved since and has to pass the gate and the review again.
58
+ // Set only at a `prrun`'s stop before merge (`run:hold <N> --prrun-stop`): the commit the green pull
59
+ // request stood on, so `fullrun #N` can tell an untouched branch — merge it — from one that moved
60
+ // since and has to pass the gate and the review again.
59
61
  prrun_stop_head?: string | undefined
62
+ // The agent session the claim ran under — `pid` is the short-lived `josh run:hold` itself, gone
63
+ // before anything reads it back, so it can never say whether the run is still there. The pair with
64
+ // its start time is the identity `process-identity.ts` defines. Optional for a record without these
65
+ // fields, or by a claim made outside an agent session.
66
+ owner_pid?: number | undefined
67
+ owner_start?: string | undefined
60
68
  }
61
69
 
62
70
  type HoldRead =
@@ -83,8 +91,7 @@ async function worktree_directory(): Promise<string | undefined> {
83
91
  // A linked work tree — a lane — reports its own git directory as the first path and the common
84
92
  // directory every work tree of the repository shares as the second; the primary checkout reports one
85
93
  // path for both. Comparing the two detects a lane without assuming the git directory is named `.git`:
86
- // a `--separate-git-dir` clone or a bare repository defeats any `.git`-segment match
87
- // (joshuafolkken/kit#1106).
94
+ // a `--separate-git-dir` clone or a bare repository defeats any `.git`-segment match.
88
95
  async function is_linked_worktree(): Promise<boolean> {
89
96
  const directories = await git_command.git_directories()
90
97
 
@@ -98,18 +105,14 @@ const run_hold_schema = z.object({
98
105
  is_fullrun: z.boolean().optional(),
99
106
  is_halfrun_stop: z.boolean().optional(),
100
107
  prrun_stop_head: z.string().optional(),
108
+ owner_pid: z.number().optional(),
109
+ owner_start: z.string().optional(),
101
110
  })
102
111
 
103
112
  // `undefined` for anything that is not a well-formed record, so the caller decides what a broken one
104
113
  // means. It means blocked, not free — see `classify`.
105
114
  function parse_hold(raw: string): RunHold | undefined {
106
- try {
107
- const parsed = run_hold_schema.safeParse(JSON.parse(raw))
108
-
109
- return parsed.success ? parsed.data : undefined
110
- } catch {
111
- return undefined
112
- }
115
+ return json_value.parse_with(raw, run_hold_schema)
113
116
  }
114
117
 
115
118
  // **A `taken_at` that is not a date is stale, not current.** It passes the schema — it is a string —
@@ -117,12 +120,25 @@ function parse_hold(raw: string): RunHold | undefined {
117
120
  // state the expiry exists to make impossible. Fail-closed is still the answer for the *tree*: a stale
118
121
  // record only lets a claim through once `run-hold-cli.ts`'s `blocking_message` has also found the
119
122
  // tree clean.
120
- function is_stale(hold: RunHold, now: Date): boolean {
121
- const taken = Date.parse(hold.taken_at)
123
+ function is_expired(hold: RunHold, now: Date): boolean {
124
+ return stamp_record.is_older_than(hold.taken_at, HOLD_MAX_AGE_MS, now)
125
+ }
122
126
 
123
- if (Number.isNaN(taken)) return true
127
+ // **A record whose session has ended is stale before its age says so**: the run
128
+ // that wrote it cannot release it any more, so waiting out the eight hours only stops the next run for
129
+ // nothing. Only a recorded session that is provably gone counts — no owner, or a live pid whose start
130
+ // cannot be read, leaves the age as the whole test. **A stop-marked record is exempt**: a `halfrun` or
131
+ // `prrun` stop is held across a person's latency on purpose, long after its session ends.
132
+ function is_owner_gone(hold: RunHold): boolean {
133
+ const is_stop_mark = hold.is_halfrun_stop === true || hold.prrun_stop_head !== undefined
124
134
 
125
- return now.getTime() - taken > HOLD_MAX_AGE_MS
135
+ if (is_stop_mark || hold.owner_pid === undefined) return false
136
+
137
+ return process_identity.is_same_process(hold.owner_pid, hold.owner_start) === false
138
+ }
139
+
140
+ function is_stale(hold: RunHold, now: Date): boolean {
141
+ return is_expired(hold, now) || is_owner_gone(hold)
126
142
  }
127
143
 
128
144
  // **A record that cannot be read is `unreadable`, never `free`.** Absent is free; present and
@@ -142,8 +158,22 @@ function read_hold(target: string, now: Date = new Date()): HoldRead {
142
158
  return classify(stamp_file.read_stamp_text(target), now)
143
159
  }
144
160
 
161
+ type Environment = Readonly<Record<string, string | undefined>>
162
+ type SessionOwner = Pick<RunHold, 'owner_pid' | 'owner_start'>
163
+
164
+ // The agent session's own process, which Claude Code exports to every command it runs. Absent or
165
+ // malformed is no owner at all, never a guess at an ancestor: a wrong owner read as gone frees a live
166
+ // run's tree, which is the one failure this guard exists to prevent.
167
+ function session_owner(environment: Environment = process.env): SessionOwner {
168
+ const pid = Number(environment[agent_session_environment.AGENT_PID_KEY])
169
+
170
+ if (!Number.isSafeInteger(pid) || pid <= 0) return {}
171
+
172
+ return { owner_pid: pid, owner_start: process_identity.read_start(pid) }
173
+ }
174
+
145
175
  function build_hold(issue: string, now: Date, is_fullrun?: boolean): RunHold {
146
- return { issue, taken_at: now.toISOString(), pid: process.pid, is_fullrun }
176
+ return { issue, taken_at: now.toISOString(), pid: process.pid, is_fullrun, ...session_owner() }
147
177
  }
148
178
 
149
179
  function write_hold(target: string, issue: string, now: Date = new Date()): RunHold {
@@ -155,9 +185,8 @@ function write_hold(target: string, issue: string, now: Date = new Date()): RunH
155
185
  }
156
186
 
157
187
  // The claim on a tree that read as free. **Exclusive rather than a plain write**: two sessions typing
158
- // an entry point in the same second both read `free`, and a write would tell both of them they won —
159
- // which is the incident this guard was written after, reproduced by the guard itself. `false` means
160
- // the other one got there first.
188
+ // an entry point in the same second both read `free`, and a write would tell both of them they won.
189
+ // `false` means the other one got there first.
161
190
  function create_hold(
162
191
  target: string,
163
192
  issue: string,
@@ -168,7 +197,7 @@ function create_hold(
168
197
  }
169
198
 
170
199
  // What a stopped run's record carries on top of the claim: the `halfrun` stop's flag, or the commit a
171
- // `prrun` stop stood on (joshuafolkken/kit#3023).
200
+ // `prrun` stop stood on.
172
201
  type StopMarkFields = Pick<RunHold, 'is_halfrun_stop' | 'prrun_stop_head'>
173
202
 
174
203
  const HALFRUN_STOP_FIELDS: StopMarkFields = { is_halfrun_stop: true }
@@ -208,14 +237,15 @@ function release_hold(target: string): void {
208
237
  stamp_file.remove_stamp(target)
209
238
  }
210
239
 
211
- // The pid is recorded for the person reading the stop message, never as the liveness test: the process
212
- // that claims the tree is a short-lived `josh run:hold`, so it has exited by the time anything reads
213
- // the record back. Age is what expires a record; `pnpm josh run:release --force` is what clears
214
- // somebody else's early, and `pnpm josh run:release <N>` what the run that wrote it types.
240
+ // The pid named is the session's where the record has one: the claiming `josh run:hold` has exited by
241
+ // the time anything reads the record back, so its own pid tells a person nothing. Age or an ended
242
+ // session is what expires a record; `pnpm josh run:release --force` is what clears somebody else's
243
+ // early, and `pnpm josh run:release <N>` what the run that wrote it types.
215
244
  function describe_holder(hold: RunHold): string {
216
- const holder = hold.issue === UNNUMBERED_ISSUE ? 'an unnumbered run' : `#${hold.issue}`
245
+ const holder =
246
+ hold.issue === UNNUMBERED_ISSUE ? 'an unnumbered run' : session_cite.issue(hold.issue)
217
247
 
218
- return `${holder}, recorded ${hold.taken_at} (pid ${String(hold.pid)})`
248
+ return `${holder}, recorded ${hold.taken_at} (pid ${String(hold.owner_pid ?? hold.pid)})`
219
249
  }
220
250
 
221
251
  // The command the run that *wrote* a record types to remove it — the claim's own spelling, mirrored,
@@ -232,6 +262,13 @@ function is_own_hold(hold: RunHold, claimant: string): boolean {
232
262
  return hold.issue === claimant
233
263
  }
234
264
 
265
+ // **A claim for the issue the record already names is the same run asking again** — a second
266
+ // `run:entry` in one session must not answer `busy` to its own hold. The unnumbered `new` claim names
267
+ // no run, so two of them are still two runs.
268
+ function is_reentry(hold: RunHold, claimant: string): boolean {
269
+ return claimant !== UNNUMBERED_ISSUE && is_own_hold(hold, claimant)
270
+ }
271
+
235
272
  function held_message(hold: RunHold): string {
236
273
  return `This working tree is already held by ${describe_holder(hold)}. One run at a time per working tree: a second run here commits its files onto the other run's branch. If that record is stale, run \`${FORCE_RELEASE_COMMAND}\` in this working tree — it removes a record this run did not write, so be sure the run that did has ended — and ask again.`
237
274
  }
@@ -252,11 +289,15 @@ function unreadable_message(): string {
252
289
  }
253
290
 
254
291
  function stale_message(hold: RunHold): string {
255
- return `Replaced a stale run record held by ${describe_holder(hold)}: older than ${String(HOLD_MAX_AGE_HOURS)} hours, so the run that wrote it has ended without releasing it.`
292
+ const why = is_owner_gone(hold)
293
+ ? 'the session that wrote it has ended'
294
+ : `older than ${String(HOLD_MAX_AGE_HOURS)} hours`
295
+
296
+ return `Replaced a stale run record held by ${describe_holder(hold)}: ${why}, so the run that wrote it has ended without releasing it.`
256
297
  }
257
298
 
258
299
  function uncommitted_message(hold: RunHold): string {
259
- return `This working tree still has uncommitted changes, and its run record — held by ${describe_holder(hold)} — has expired. That is a run which stopped for a person rather than one that finished, so the tree is not free: commit or stash the work, or run \`${own_release_command(hold.issue)}\` once you are done with it, then ask again.`
300
+ return `This working tree still has uncommitted changes, and its run record — held by ${describe_holder(hold)} — has expired or outlived its session. That is a run which stopped for a person rather than one that finished, so the tree is not free: commit or stash the work, or run \`${own_release_command(hold.issue)}\` once you are done with it, then ask again.`
260
301
  }
261
302
 
262
303
  // The exclusive claim lost: another process wrote the record between this one's read and its write.
@@ -292,6 +333,7 @@ const run_hold = {
292
333
  hold_path,
293
334
  is_linked_worktree,
294
335
  is_own_hold,
336
+ is_reentry,
295
337
  is_tree_dirty,
296
338
  own_release_command,
297
339
  race_message,