@joshuafolkken/kit 1.1471.0 → 1.1784.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 (895) hide show
  1. package/.claude/agents/investigator.md +1 -1
  2. package/.claude/settings.json +6 -6
  3. package/.claude/skills/epic-commands/SKILL.md +26 -77
  4. package/.claude/skills/epic-commands/epic-bundle.md +12 -6
  5. package/.claude/skills/epic-commands/execution-waves.md +1 -2
  6. package/.claude/skills/verify-ui/SKILL.md +1 -2
  7. package/.claude/skills/workflow-commands/SKILL.md +12 -14
  8. package/.claude/skills/workflow-commands/background-commands.md +8 -12
  9. package/.claude/skills/workflow-commands/backlogrun-child.md +13 -18
  10. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
  11. package/.claude/skills/workflow-commands/backlogrun-lanes.md +23 -28
  12. package/.claude/skills/workflow-commands/backlogrun-park.md +16 -31
  13. package/.claude/skills/workflow-commands/backlogrun-progress.md +12 -21
  14. package/.claude/skills/workflow-commands/backlogrun-recovery.md +12 -12
  15. package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -20
  16. package/.claude/skills/workflow-commands/backlogrun.md +32 -51
  17. package/.claude/skills/workflow-commands/chain-rule.md +18 -11
  18. package/.claude/skills/workflow-commands/delegation.md +13 -8
  19. package/.claude/skills/workflow-commands/entry-sequence.md +10 -12
  20. package/.claude/skills/workflow-commands/followup.md +10 -35
  21. package/.claude/skills/workflow-commands/fullrun-steps.md +38 -49
  22. package/.claude/skills/workflow-commands/fullrun.md +6 -8
  23. package/.claude/skills/workflow-commands/halfrun.md +20 -32
  24. package/.claude/skills/workflow-commands/into-target.md +1 -2
  25. package/.claude/skills/workflow-commands/issue-comments.md +19 -15
  26. package/.claude/skills/workflow-commands/issue-scout.md +5 -4
  27. package/.claude/skills/workflow-commands/kickoff.md +24 -23
  28. package/.claude/skills/workflow-commands/latest-gate.md +9 -18
  29. package/.claude/skills/workflow-commands/needs-human-review.md +11 -19
  30. package/.claude/skills/workflow-commands/observation-filing.md +4 -50
  31. package/.claude/skills/workflow-commands/observation-ledger.md +5 -10
  32. package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -44
  33. package/.claude/skills/workflow-commands/prerequisite.md +11 -18
  34. package/.claude/skills/workflow-commands/progress-watcher.md +3 -8
  35. package/.claude/skills/workflow-commands/prrun.md +6 -12
  36. package/.claude/skills/workflow-commands/retrospective.md +5 -5
  37. package/.claude/skills/workflow-commands/split-assessment.md +14 -4
  38. package/.claude/skills/workflow-commands/target-repository.md +1 -2
  39. package/.claude/skills/workflow-commands/working-tree-hold.md +11 -13
  40. package/.codex/hooks.json +6 -6
  41. package/.github/actions/setup-node/action.yml +10 -1
  42. package/.github/actions/setup-pnpm/action.yml +1 -1
  43. package/.github/dependabot.yml +16 -0
  44. package/.github/release.yml +0 -2
  45. package/.github/workflows/ci.yml +121 -11
  46. package/.github/workflows/publish.yml +10 -3
  47. package/.github/workflows/sonar-qube.yml +1 -0
  48. package/.prettierignore +2 -0
  49. package/.vscode/tasks.json +1 -2
  50. package/CLAUDE.md +4 -8
  51. package/README.md +4 -2
  52. package/SECURITY.md +1 -1
  53. package/cspell/index.yaml +7 -0
  54. package/dist/CLAUDE.md +4 -8
  55. package/dist/commands/document-read-cli.js +882 -0
  56. package/dist/commands/{document-section-cli.js → document-section-main.js} +137 -62
  57. package/dist/commands/read-set-cli.js +1867 -0
  58. package/dist/commands/run-prep-main.js +21653 -0
  59. package/dist/commands/run-step-cli.js +23880 -0
  60. package/dist/config-merge/index.js +5 -1
  61. package/dist/hooks/audit-provision.js +20 -35
  62. package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
  63. package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
  64. package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
  65. package/dist/hooks/{chunk-AS74OU3D.js → chunk-PT5R6UJD.js} +4582 -2118
  66. package/dist/hooks/chunk-TUIFS5E7.js +72 -0
  67. package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
  68. package/dist/hooks/{chunk-E7OIKX5Z.js → chunk-WR2KQAYZ.js} +1863 -382
  69. package/dist/hooks/{chunk-KC5AK2GF.js → chunk-XGBNSWEI.js} +248 -46
  70. package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
  71. package/dist/hooks/codex-hook-adapter.js +10 -19
  72. package/dist/hooks/format-edited.js +5 -5
  73. package/dist/hooks/inputs.json +436 -257
  74. package/dist/hooks/pretool-guard.js +7 -22
  75. package/dist/hooks/session-lang.js +380 -42
  76. package/dist/hooks/stop-guard.js +8711 -782
  77. package/dist/josh.js +5263 -997
  78. package/dist/self-sync-guard/index.js +74 -10
  79. package/dist/version/index.js +115 -406
  80. package/eslint/base.js +1 -1
  81. package/lefthook/base.yml +8 -4
  82. package/package.json +17 -53
  83. package/pnpm-workspace.yaml +4 -2
  84. package/prompts/coding-standards.md +1 -1
  85. package/prompts/collaboration-workflow/file-edits.md +1 -9
  86. package/prompts/collaboration-workflow/gh-rest.md +1 -2
  87. package/prompts/collaboration-workflow/issue-citation.md +2 -4
  88. package/prompts/collaboration-workflow/issue-template.md +42 -17
  89. package/prompts/collaboration-workflow/lane-instructions.md +34 -0
  90. package/prompts/collaboration-workflow/measurement.md +37 -0
  91. package/prompts/collaboration-workflow/operating-rules.md +6 -12
  92. package/prompts/collaboration-workflow/output-bounds.md +4 -9
  93. package/prompts/collaboration-workflow/overview.md +1 -1
  94. package/prompts/collaboration-workflow/plan-comment.md +3 -42
  95. package/prompts/collaboration-workflow/principles.md +19 -8
  96. package/prompts/collaboration-workflow/report-format.md +37 -57
  97. package/prompts/collaboration-workflow/residency.md +12 -8
  98. package/prompts/collaboration-workflow/rule-delivery.md +3 -11
  99. package/prompts/collaboration-workflow/shell-body.md +8 -18
  100. package/prompts/collaboration-workflow/turn-batching.md +4 -6
  101. package/prompts/collaboration-workflow/upstream-interrupt.md +16 -6
  102. package/prompts/collaboration-workflow/wip-cap.md +7 -7
  103. package/prompts/collaboration-workflow.md +4 -7
  104. package/prompts/refactoring.md +1 -1
  105. package/prompts/review-rubric.md +1 -2
  106. package/prompts/review.md +45 -26
  107. package/prompts/testing-guide.md +10 -45
  108. package/scripts/agent/agent-argv.ts +20 -4
  109. package/scripts/agent/agent-event.ts +15 -15
  110. package/scripts/agent/agent-exit-record.ts +13 -1
  111. package/scripts/agent/agent-role-profile.ts +101 -45
  112. package/scripts/agent/agent-safe-text.ts +60 -0
  113. package/scripts/agent/api-auth.ts +41 -0
  114. package/scripts/agent/api-outage.ts +1 -1
  115. package/scripts/agent/claude-agent-argv.ts +14 -0
  116. package/scripts/agent/codex-agent-argv.ts +2 -0
  117. package/scripts/agent/lane-instructions.ts +144 -0
  118. package/scripts/auto-ok/auto-ok-cli.ts +14 -16
  119. package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
  120. package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
  121. package/scripts/auto-ok/auto-ok-judge.ts +13 -2
  122. package/scripts/auto-ok/auto-ok-main.ts +17 -0
  123. package/scripts/backlog/backlog-arrival.ts +14 -3
  124. package/scripts/backlog/backlog-budget-cli.ts +7 -33
  125. package/scripts/backlog/backlog-budget-main.ts +16 -0
  126. package/scripts/backlog/backlog-budget.ts +6 -7
  127. package/scripts/backlog/backlog-defect-priority.ts +4 -3
  128. package/scripts/backlog/backlog-drive-adopt.ts +67 -0
  129. package/scripts/backlog/backlog-drive-args.ts +4 -5
  130. package/scripts/backlog/backlog-drive-cli.ts +113 -28
  131. package/scripts/backlog/backlog-drive-hold.ts +162 -0
  132. package/scripts/backlog/backlog-drive-idle.ts +151 -0
  133. package/scripts/backlog/backlog-drive-judge.ts +25 -0
  134. package/scripts/backlog/backlog-drive-memory.ts +126 -0
  135. package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
  136. package/scripts/backlog/backlog-drive-named.ts +54 -7
  137. package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
  138. package/scripts/backlog/backlog-drive-paused.ts +169 -0
  139. package/scripts/backlog/backlog-drive-restore.ts +39 -8
  140. package/scripts/backlog/backlog-drive-seats.ts +18 -8
  141. package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
  142. package/scripts/backlog/backlog-drive.ts +79 -75
  143. package/scripts/backlog/backlog-next-main.ts +16 -0
  144. package/scripts/backlog/backlog-next-shared.ts +73 -0
  145. package/scripts/backlog/backlog-next.ts +48 -16
  146. package/scripts/backlog/backlog-occupied.ts +69 -0
  147. package/scripts/backlog/backlog-offer-cli.ts +6 -21
  148. package/scripts/backlog/backlog-offer-exclude.ts +15 -0
  149. package/scripts/backlog/backlog-offer-main.ts +12 -0
  150. package/scripts/backlog/backlog-offer.ts +36 -3
  151. package/scripts/backlog/backlog-overlap.ts +22 -4
  152. package/scripts/backlog/backlog-plan-read.ts +6 -2
  153. package/scripts/backlog/backlog-plan.ts +18 -4
  154. package/scripts/backlog/backlog-pool.ts +10 -10
  155. package/scripts/backlog/backlog-rank.ts +10 -2
  156. package/scripts/backlog/backlog-ready.ts +137 -18
  157. package/scripts/backlog/backlog-stalled-detect.ts +109 -36
  158. package/scripts/backlog/backlog-stalled.ts +52 -16
  159. package/scripts/backlog/backlog-wait-cause.ts +86 -0
  160. package/scripts/backlog/backlog-waves.ts +39 -13
  161. package/scripts/backlog/backlogrun-args.ts +19 -7
  162. package/scripts/backlog/backlogrun-cli.ts +19 -5
  163. package/scripts/backlog/backlogrun-launch.ts +6 -0
  164. package/scripts/backlog/backlogrun-restart.ts +97 -0
  165. package/scripts/backlog/backlogrun-stop.ts +79 -7
  166. package/scripts/behavior/behavior-cli.ts +2 -2
  167. package/scripts/behavior/behavior-rules.ts +47 -24
  168. package/scripts/build/build-bin.ts +2 -16
  169. package/scripts/build/build-claude-md.ts +0 -7
  170. package/scripts/build/build-commands.ts +0 -13
  171. package/scripts/build/build-hooks.ts +49 -48
  172. package/scripts/build/hook-bundle-stamp.ts +29 -11
  173. package/scripts/build/local-bin.ts +1 -1
  174. package/scripts/cases/cases-cli.ts +25 -13
  175. package/scripts/cases/cases-interaction-scan.ts +134 -0
  176. package/scripts/cases/cases-interaction.ts +183 -0
  177. package/scripts/cases/cases-logic.ts +39 -6
  178. package/scripts/ci/pr-classification-main.ts +18 -0
  179. package/scripts/ci/pr-classification.ts +10 -17
  180. package/scripts/clone/clone-scan.ts +1 -1
  181. package/scripts/cost-runtime/cost-blocks.ts +22 -37
  182. package/scripts/cost-runtime/cost-cli.ts +31 -14
  183. package/scripts/cost-runtime/cost-main.ts +12 -0
  184. package/scripts/cost-runtime/cost-transcript.ts +1 -0
  185. package/scripts/delegation/delegation-policy.ts +17 -4
  186. package/scripts/delegation/duplicate-read-guard.ts +2 -10
  187. package/scripts/delegation/investigation-guard.ts +15 -73
  188. package/scripts/delegation/investigation-reads.ts +3 -5
  189. package/scripts/dependabot/dependabot-cooldown.ts +194 -0
  190. package/scripts/discovery/repo-discovery.ts +24 -6
  191. package/scripts/doctor/doctor-consumer.ts +2 -5
  192. package/scripts/document/document-byte-budget.ts +9 -6
  193. package/scripts/document/document-scan.ts +1 -1
  194. package/scripts/document/document-section-cli.ts +17 -13
  195. package/scripts/document/document-section-main.ts +12 -0
  196. package/scripts/document/entry-read-budget.ts +2 -2
  197. package/scripts/document/read-set-cli.ts +4 -1
  198. package/scripts/epic/epic-audit-cli.ts +12 -6
  199. package/scripts/epic/epic-audit-orphans.ts +5 -8
  200. package/scripts/epic/epic-audit.ts +52 -1
  201. package/scripts/epic/epic-bundle-apply.ts +137 -0
  202. package/scripts/epic/epic-bundle-cli.ts +32 -121
  203. package/scripts/epic/epic-bundle-evidence.ts +49 -26
  204. package/scripts/epic/epic-bundle-format.ts +116 -0
  205. package/scripts/epic/epic-bundle-main.ts +17 -0
  206. package/scripts/epic/epic-bundle-referenced.ts +14 -3
  207. package/scripts/epic/epic-bundle.ts +17 -9
  208. package/scripts/epic/epic-busy.ts +5 -12
  209. package/scripts/epic/epic-classify.ts +24 -15
  210. package/scripts/epic/epic-cli-argv.ts +31 -0
  211. package/scripts/epic/epic-cli-decide.ts +42 -0
  212. package/scripts/epic/epic-cli.ts +6 -38
  213. package/scripts/epic/epic-close.ts +112 -55
  214. package/scripts/epic/epic-cross-repo.ts +4 -7
  215. package/scripts/epic/epic-decide.ts +119 -0
  216. package/scripts/epic/epic-decision.ts +9 -0
  217. package/scripts/epic/epic-fetch.ts +4 -0
  218. package/scripts/epic/epic-graph.ts +2 -0
  219. package/scripts/epic/epic-issue.ts +5 -1
  220. package/scripts/epic/epic-label-age.ts +1 -1
  221. package/scripts/epic/epic-lane-offer.ts +39 -4
  222. package/scripts/epic/epic-next-main.ts +24 -0
  223. package/scripts/epic/epic-next.ts +6 -24
  224. package/scripts/epic/epic-outside-blocker.ts +6 -2
  225. package/scripts/epic/epic-parse.ts +9 -3
  226. package/scripts/epic/epic-read.ts +1 -0
  227. package/scripts/epic/epic-reconcile.ts +39 -0
  228. package/scripts/epic/epic-run.ts +10 -1
  229. package/scripts/epic/epic-solo.ts +50 -14
  230. package/scripts/epic/epic.ts +41 -7
  231. package/scripts/exports/unused-members-cli.ts +2 -2
  232. package/scripts/followup/followup-checks-event.ts +8 -3
  233. package/scripts/followup/followup-coderabbit-wait.ts +82 -0
  234. package/scripts/followup/followup-review-gates.ts +81 -0
  235. package/scripts/followup/git-followup-stages.ts +13 -3
  236. package/scripts/followup/git-followup-workflow.ts +31 -60
  237. package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
  238. package/scripts/followup/git-pr-followup.ts +36 -8
  239. package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
  240. package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
  241. package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
  242. package/scripts/gate/busy-average.ts +58 -0
  243. package/scripts/gate/check-cpu.ts +60 -0
  244. package/scripts/gate/check-inputs.ts +73 -0
  245. package/scripts/gate/check-reuse.ts +141 -0
  246. package/scripts/gate/command-memory.ts +192 -0
  247. package/scripts/gate/core-admission.ts +218 -28
  248. package/scripts/gate/core-budget-timing.ts +37 -0
  249. package/scripts/gate/core-budget.ts +150 -119
  250. package/scripts/gate/core-wait-record.ts +48 -0
  251. package/scripts/gate/core-wait.ts +162 -0
  252. package/scripts/gate/core-weights.ts +86 -0
  253. package/scripts/gate/free-cores.ts +72 -0
  254. package/scripts/gate/gate-ledger.ts +49 -7
  255. package/scripts/gate/gate-plan.ts +44 -15
  256. package/scripts/gate/gate-report.ts +29 -4
  257. package/scripts/gate/gate-run-steps.ts +195 -0
  258. package/scripts/gate/gate-skip.ts +12 -2
  259. package/scripts/gate/gate-steps.ts +12 -1
  260. package/scripts/gate/held-mark.ts +55 -0
  261. package/scripts/gate/input-fingerprint.ts +42 -0
  262. package/scripts/gate/machine-capacity.ts +124 -31
  263. package/scripts/gate/moved-paths.ts +67 -0
  264. package/scripts/gate/pre-commit-type-check.ts +14 -1
  265. package/scripts/gate/project-checks.ts +5 -12
  266. package/scripts/gate/scoped-green.ts +12 -8
  267. package/scripts/gate/since-green.ts +62 -0
  268. package/scripts/gate/toolchain-inputs.ts +115 -0
  269. package/scripts/gate/verification-gate.ts +65 -129
  270. package/scripts/gate/verification-inputs.ts +250 -0
  271. package/scripts/gh/gh-author-association.ts +96 -9
  272. package/scripts/gh/git-ai-review-scan.ts +4 -2
  273. package/scripts/gh/git-gh-api-path.ts +15 -0
  274. package/scripts/gh/git-gh-branch-rules.ts +73 -0
  275. package/scripts/gh/git-gh-conditional.ts +5 -2
  276. package/scripts/gh/git-gh-issue-read.ts +5 -1
  277. package/scripts/gh/git-gh-issue-rest.ts +1 -0
  278. package/scripts/gh/git-gh-issue-write.ts +77 -17
  279. package/scripts/gh/git-gh-issue.ts +7 -3
  280. package/scripts/gh/git-gh-poll-read.ts +89 -0
  281. package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
  282. package/scripts/gh/git-gh-pr-rest.ts +1 -1
  283. package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
  284. package/scripts/gh/git-gh-pr.ts +27 -15
  285. package/scripts/gh/git-pr-checks-eval.ts +39 -7
  286. package/scripts/gh/git-pr-checks-parse.ts +39 -9
  287. package/scripts/gh/git-pr-merge-checked.ts +80 -0
  288. package/scripts/gh/git-pr.ts +13 -1
  289. package/scripts/git/base-tree.ts +19 -2
  290. package/scripts/git/changed-file-scope.ts +6 -4
  291. package/scripts/git/changed-paths.ts +18 -1
  292. package/scripts/git/git-diff-reads.ts +27 -2
  293. package/scripts/git/git-grep-hits.ts +85 -0
  294. package/scripts/git/git-location-environment.ts +1 -1
  295. package/scripts/git/git-merge-conflicts.ts +83 -0
  296. package/scripts/git/git-preflight.ts +37 -12
  297. package/scripts/git/git-push-transport.ts +1 -2
  298. package/scripts/git/git-schemas.ts +17 -7
  299. package/scripts/git/git-spawn.ts +1 -2
  300. package/scripts/git/git-status.ts +4 -4
  301. package/scripts/git/main-merge-main.ts +12 -0
  302. package/scripts/git/main-merge-regenerate.ts +78 -0
  303. package/scripts/git/main-merge.ts +39 -14
  304. package/scripts/git/main-sync-main.ts +12 -0
  305. package/scripts/git/main-sync.ts +0 -9
  306. package/scripts/git/stash/git-stash.ts +27 -4
  307. package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
  308. package/scripts/git/stash/stash-pop-cli.ts +6 -12
  309. package/scripts/git/stash/stash-pop-main.ts +12 -0
  310. package/scripts/git/stash/stash-push-cli.ts +76 -0
  311. package/scripts/git/stash/stash-push-main.ts +12 -0
  312. package/scripts/hooks/batch-guard.ts +5 -16
  313. package/scripts/hooks/check-commit-message-main.ts +8 -0
  314. package/scripts/hooks/check-commit-message.ts +4 -7
  315. package/scripts/hooks/format-edited-file.ts +8 -24
  316. package/scripts/hooks/pre-commit-lint.ts +118 -0
  317. package/scripts/hooks/pre-push-unit.ts +4 -2
  318. package/scripts/hooks/pretool-guard-cli.ts +1 -8
  319. package/scripts/hooks/pretool-guard.ts +57 -69
  320. package/scripts/hooks/reserved-run.ts +67 -8
  321. package/scripts/hooks/run-hook.sh +18 -11
  322. package/scripts/hooks/shell-rules-notice.ts +37 -0
  323. package/scripts/hooks/stop-actions.ts +185 -0
  324. package/scripts/hooks/stop-guard.ts +72 -27
  325. package/scripts/init/hook-command-rewrite.ts +19 -5
  326. package/scripts/init/hook-launch.ts +15 -12
  327. package/scripts/init/init-actions.ts +0 -6
  328. package/scripts/init/init-ai-copy.ts +10 -36
  329. package/scripts/init/init-bootstrap.ts +9 -8
  330. package/scripts/init/init-dry-run-report.ts +1 -1
  331. package/scripts/init/init-dry-run.ts +1 -1
  332. package/scripts/init/init-file-action.ts +7 -9
  333. package/scripts/init/init-logic-json-merge.ts +2 -2
  334. package/scripts/init/init-logic-migrate.ts +9 -82
  335. package/scripts/init/init-logic.ts +3 -2
  336. package/scripts/init/init-main.ts +12 -0
  337. package/scripts/init/init.ts +5 -12
  338. package/scripts/init/kit-development-versions.ts +3 -7
  339. package/scripts/init/kit-written-paths.ts +2 -2
  340. package/scripts/init/project-profile.ts +5 -4
  341. package/scripts/init/tsconfig-preset-migration.ts +2 -1
  342. package/scripts/init/vscode-tasks.ts +1 -1
  343. package/scripts/issue/defect-origin-cli.ts +106 -0
  344. package/scripts/issue/defect-origin-line.ts +60 -0
  345. package/scripts/issue/defect-origin-main.ts +11 -0
  346. package/scripts/issue/defect-origin.ts +114 -0
  347. package/scripts/issue/defect-rate-cli.ts +34 -78
  348. package/scripts/issue/defect-rate.ts +0 -16
  349. package/scripts/issue/defect-report-cli.ts +128 -0
  350. package/scripts/issue/defect-report-format.ts +56 -0
  351. package/scripts/issue/defect-report-main.ts +11 -0
  352. package/scripts/issue/defect-report.ts +160 -0
  353. package/scripts/issue/expected-effect-lint.ts +60 -0
  354. package/scripts/issue/issue-already-done-cli.ts +62 -0
  355. package/scripts/issue/issue-body-or-comment.ts +40 -0
  356. package/scripts/issue/issue-cite-cli.ts +33 -22
  357. package/scripts/issue/issue-cite-main.ts +12 -0
  358. package/scripts/issue/issue-classification.ts +13 -8
  359. package/scripts/issue/issue-comment-cli.ts +10 -24
  360. package/scripts/issue/issue-comment-main.ts +12 -0
  361. package/scripts/issue/issue-evidence-exit.ts +100 -0
  362. package/scripts/issue/issue-file-cli.ts +29 -7
  363. package/scripts/issue/issue-file.ts +19 -19
  364. package/scripts/issue/issue-fold-cli.ts +2 -11
  365. package/scripts/issue/issue-fold-main.ts +12 -0
  366. package/scripts/issue/issue-labels.ts +81 -90
  367. package/scripts/issue/issue-lint-cli.ts +7 -13
  368. package/scripts/issue/issue-lint-main.ts +12 -0
  369. package/scripts/issue/issue-measured-cli.ts +56 -0
  370. package/scripts/issue/issue-merged.ts +19 -2
  371. package/scripts/issue/issue-not-before-label.ts +135 -0
  372. package/scripts/issue/issue-not-before.ts +111 -0
  373. package/scripts/issue/issue-number-shape.ts +15 -1
  374. package/scripts/issue/issue-park.ts +28 -0
  375. package/scripts/issue/issue-plan-cli.ts +151 -0
  376. package/scripts/issue/issue-priority.ts +151 -0
  377. package/scripts/issue/issue-rank.ts +7 -1
  378. package/scripts/issue/issue-read-cli.ts +3 -10
  379. package/scripts/issue/issue-read-main.ts +12 -0
  380. package/scripts/issue/issue-read.ts +29 -5
  381. package/scripts/issue/issue-release-cli.ts +0 -10
  382. package/scripts/issue/issue-release-main.ts +13 -0
  383. package/scripts/issue/issue-release.ts +7 -12
  384. package/scripts/issue/issue-sample-gate.ts +192 -0
  385. package/scripts/issue/issue-sample-source.ts +76 -0
  386. package/scripts/issue/issue-scout-cli.ts +19 -25
  387. package/scripts/issue/issue-scout-main.ts +14 -0
  388. package/scripts/issue/issue-state-cli.ts +0 -10
  389. package/scripts/issue/issue-state-main.ts +12 -0
  390. package/scripts/issue/issue-watch-diff.ts +56 -15
  391. package/scripts/issue/issue-watch.ts +2 -1
  392. package/scripts/issue/issue-wip.ts +2 -7
  393. package/scripts/issue/markdown-section.ts +19 -5
  394. package/scripts/issue/measure-rerun-cli.ts +13 -8
  395. package/scripts/issue/plan-consumers-cli.ts +39 -0
  396. package/scripts/issue/plan-consumers-main.ts +11 -0
  397. package/scripts/issue/plan-consumers-section.ts +55 -0
  398. package/scripts/issue/plan-consumers.ts +127 -0
  399. package/scripts/josh/agent-session-environment.ts +1 -1
  400. package/scripts/josh/command-usage.ts +82 -0
  401. package/scripts/josh/file-map-stamp.ts +49 -16
  402. package/scripts/josh/hook-decision.ts +32 -20
  403. package/scripts/josh/josh-command-map.ts +6 -1
  404. package/scripts/josh/josh-command-types.ts +65 -13
  405. package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
  406. package/scripts/josh/josh-commands-ai.ts +169 -157
  407. package/scripts/josh/josh-commands-backlog.ts +82 -16
  408. package/scripts/josh/josh-commands-clone.ts +1 -0
  409. package/scripts/josh/josh-commands-development.ts +111 -71
  410. package/scripts/josh/josh-commands-document.ts +43 -1
  411. package/scripts/josh/josh-commands-epic.ts +171 -0
  412. package/scripts/josh/josh-commands-hooks.ts +31 -2
  413. package/scripts/josh/josh-commands-issue-write.ts +181 -0
  414. package/scripts/josh/josh-commands-issue.ts +124 -24
  415. package/scripts/josh/josh-commands-lane.ts +112 -2
  416. package/scripts/josh/josh-commands-lint.ts +19 -8
  417. package/scripts/josh/josh-commands-maintenance.ts +112 -4
  418. package/scripts/josh/josh-commands-pause.ts +29 -0
  419. package/scripts/josh/josh-commands-progress.ts +87 -0
  420. package/scripts/josh/josh-commands-project.ts +138 -9
  421. package/scripts/josh/josh-commands-review.ts +124 -0
  422. package/scripts/josh/josh-commands-run.ts +211 -23
  423. package/scripts/josh/josh-commands-ship.ts +169 -0
  424. package/scripts/josh/josh-commands-split.ts +9 -0
  425. package/scripts/josh/josh-commands-versioning.ts +49 -2
  426. package/scripts/josh/josh-commands-workflow.ts +149 -6
  427. package/scripts/josh/josh-logic.ts +11 -27
  428. package/scripts/josh/josh.ts +14 -5
  429. package/scripts/josh/package-directory.ts +18 -0
  430. package/scripts/josh/process-identity.ts +13 -4
  431. package/scripts/josh/session-language-cli.ts +4 -8
  432. package/scripts/josh/session-language-main.ts +13 -0
  433. package/scripts/josh/session-language.ts +6 -1
  434. package/scripts/josh/shared-cache.ts +90 -0
  435. package/scripts/josh/stamp-file.ts +9 -15
  436. package/scripts/lane/lane-await.ts +51 -12
  437. package/scripts/lane/lane-cache.ts +5 -30
  438. package/scripts/lane/lane-capacity.ts +19 -22
  439. package/scripts/lane/lane-check-stats.ts +97 -0
  440. package/scripts/lane/lane-child-invocation.ts +43 -4
  441. package/scripts/lane/lane-cli.ts +15 -5
  442. package/scripts/lane/lane-close.ts +86 -18
  443. package/scripts/lane/lane-core-wait-stats.ts +66 -0
  444. package/scripts/lane/lane-dispatch.ts +27 -6
  445. package/scripts/lane/lane-gap-stats.ts +156 -0
  446. package/scripts/lane/lane-guard-policy.ts +2 -2
  447. package/scripts/lane/lane-handoff.ts +76 -1
  448. package/scripts/lane/lane-held-stats.ts +129 -0
  449. package/scripts/lane/lane-install.ts +16 -15
  450. package/scripts/lane/lane-launch-cli.ts +0 -9
  451. package/scripts/lane/lane-launch-main.ts +12 -0
  452. package/scripts/lane/lane-ledger-schema.ts +266 -0
  453. package/scripts/lane/lane-ledger.ts +108 -97
  454. package/scripts/lane/lane-limit-cli.ts +19 -9
  455. package/scripts/lane/lane-measure-cli.ts +58 -10
  456. package/scripts/lane/lane-open.ts +9 -1
  457. package/scripts/lane/lane-parked.ts +3 -3
  458. package/scripts/lane/lane-pause-cli.ts +130 -0
  459. package/scripts/lane/lane-pause.ts +158 -0
  460. package/scripts/lane/lane-preserve.ts +29 -1
  461. package/scripts/lane/lane-process-table.ts +166 -0
  462. package/scripts/lane/lane-reap-settle.ts +124 -0
  463. package/scripts/lane/lane-reap.ts +50 -15
  464. package/scripts/lane/lane-registry.ts +33 -10
  465. package/scripts/lane/lane-residents.ts +162 -0
  466. package/scripts/lane/lane-restart.ts +26 -27
  467. package/scripts/lane/lane-round-two-stats.ts +49 -0
  468. package/scripts/lane/lane-sampler.ts +4 -0
  469. package/scripts/lane/lane-session-action.ts +160 -0
  470. package/scripts/lane/lane-session-broker.ts +134 -134
  471. package/scripts/lane/lane-snapshot-trace.ts +84 -0
  472. package/scripts/lane/lane-spans.ts +51 -0
  473. package/scripts/lane/lane-spent.ts +6 -3
  474. package/scripts/lane/lane-stage-stats.ts +7 -2
  475. package/scripts/lane/lane-state.ts +302 -0
  476. package/scripts/lane/lane-stats.ts +58 -4
  477. package/scripts/lane/lane-stop-stats.ts +113 -37
  478. package/scripts/lane/lane-test-related-stats.ts +127 -0
  479. package/scripts/lane/lane-transcript-calls.ts +145 -0
  480. package/scripts/lane/lane-transcript-stats.ts +168 -0
  481. package/scripts/lane/lane-vacant.ts +13 -3
  482. package/scripts/lane/lane-withdraw-cli.ts +72 -0
  483. package/scripts/lane/lane-withdraw.ts +183 -0
  484. package/scripts/lane/process-directories.ts +70 -0
  485. package/scripts/lane/process-lane-marks.ts +94 -0
  486. package/scripts/lib/atomic-write.ts +62 -0
  487. package/scripts/lib/buffered-process.ts +12 -5
  488. package/scripts/lib/cli-flags.ts +53 -0
  489. package/scripts/lib/figure-format.ts +63 -0
  490. package/scripts/lib/json-value.ts +9 -1
  491. package/scripts/lib/package-manifest.ts +35 -0
  492. package/scripts/lib/read-file.ts +3 -1
  493. package/scripts/lib/stamped-memo.ts +63 -0
  494. package/scripts/lib/stdout-on-stderr.ts +24 -0
  495. package/scripts/lib/timeouts.ts +9 -0
  496. package/scripts/lib/transcript-record.ts +91 -0
  497. package/scripts/lines/effective-limit.ts +1 -1
  498. package/scripts/lint/eslint-cache-dependencies.ts +145 -0
  499. package/scripts/lint/eslint-daemon.ts +265 -0
  500. package/scripts/lint/format.ts +14 -5
  501. package/scripts/lint/import-graph.ts +279 -0
  502. package/scripts/lint/lint-gate-scope.ts +102 -0
  503. package/scripts/lint/lint-parallel-main.ts +19 -0
  504. package/scripts/lint/lint-parallel.ts +72 -33
  505. package/scripts/lint/lint-related-scope.ts +33 -24
  506. package/scripts/lint/lint-related.ts +38 -6
  507. package/scripts/notify/confirmation-options.ts +1 -2
  508. package/scripts/notify/telegram-notify.ts +20 -20
  509. package/scripts/notify/telegram-test-logic.ts +0 -1
  510. package/scripts/notify/telegram-test-main.ts +8 -0
  511. package/scripts/notify/telegram-test.ts +12 -11
  512. package/scripts/observations/observation-ledger.ts +13 -0
  513. package/scripts/observations/observations-flush-landing.ts +5 -3
  514. package/scripts/observations/observations-flush.ts +6 -1
  515. package/scripts/overrides/overrides-check.ts +2 -5
  516. package/scripts/overrides/overrides-files.ts +2 -1
  517. package/scripts/overrides/overrides-logic.ts +3 -6
  518. package/scripts/package/verify-optional-eslint-install.ts +8 -6
  519. package/scripts/propagate/propagate-publish.ts +2 -7
  520. package/scripts/propagate/propagate-targets.ts +4 -12
  521. package/scripts/refactor/import-graph.ts +9 -7
  522. package/scripts/release/github-release-runs.ts +17 -6
  523. package/scripts/release/release-approval-prune.ts +18 -0
  524. package/scripts/release/release-history.ts +1 -3
  525. package/scripts/release/release-progress.ts +42 -22
  526. package/scripts/release/release-publish-run.ts +39 -0
  527. package/scripts/release/release-publish.ts +6 -6
  528. package/scripts/release/release-scope-cli.ts +0 -10
  529. package/scripts/release/release-scope-main.ts +12 -0
  530. package/scripts/repo/repo-setting.ts +3 -6
  531. package/scripts/repo/required-checks-logic.ts +6 -15
  532. package/scripts/report/report-format-reference.ts +4 -0
  533. package/scripts/report/report-labels.ts +155 -0
  534. package/scripts/report/report-lint-cli.ts +3 -0
  535. package/scripts/report/report-lint.ts +85 -110
  536. package/scripts/report/report-template-cli.ts +59 -0
  537. package/scripts/report/report-template.ts +112 -0
  538. package/scripts/review/acceptance-map-check.ts +61 -0
  539. package/scripts/review/acceptance-map.ts +206 -0
  540. package/scripts/review/removed-tests-check.ts +86 -0
  541. package/scripts/review/removed-tests.ts +149 -0
  542. package/scripts/review/review-brief-cli.ts +82 -16
  543. package/scripts/review/review-brief-main.ts +12 -0
  544. package/scripts/review/review-brief.ts +31 -3
  545. package/scripts/review/review-code-tree.ts +10 -6
  546. package/scripts/review/review-comment-round.ts +26 -8
  547. package/scripts/review/review-finding-ledger.ts +30 -15
  548. package/scripts/review/review-interaction.ts +94 -0
  549. package/scripts/review/review-readers-scan.ts +163 -0
  550. package/scripts/review/review-record-cli.ts +69 -30
  551. package/scripts/review/review-record-main.ts +12 -0
  552. package/scripts/review/review-round-one-blobs.ts +221 -0
  553. package/scripts/review/review-round2-cli.ts +49 -12
  554. package/scripts/review/review-round2.ts +80 -12
  555. package/scripts/review/review-stamps.ts +19 -1
  556. package/scripts/review/review-stop-log.ts +96 -0
  557. package/scripts/review/review-stops-cli.ts +85 -0
  558. package/scripts/review/review-tree.ts +6 -17
  559. package/scripts/review/review-untouched-readers.ts +146 -0
  560. package/scripts/review/test-titles.ts +118 -0
  561. package/scripts/rules/agent-model.ts +67 -0
  562. package/scripts/rules/bash-triggers.ts +46 -3
  563. package/scripts/rules/decision-oracle-batch.ts +9 -1
  564. package/scripts/rules/decision-oracle.ts +2 -2
  565. package/scripts/rules/delivered-rules.ts +90 -3
  566. package/scripts/rules/destructive-command.ts +8 -1
  567. package/scripts/rules/direct-filing.ts +10 -2
  568. package/scripts/rules/direct-issue-comment.ts +117 -0
  569. package/scripts/rules/direct-pr-create.ts +69 -3
  570. package/scripts/rules/early-heartbeat.ts +2 -1
  571. package/scripts/rules/file-body.ts +7 -0
  572. package/scripts/rules/filing-cap.ts +8 -0
  573. package/scripts/rules/firing-point.ts +6 -5
  574. package/scripts/rules/git-argv.ts +72 -14
  575. package/scripts/rules/git-force.ts +12 -2
  576. package/scripts/rules/guard-remedy.ts +121 -0
  577. package/scripts/rules/implementation-cut-verdict.ts +1 -1
  578. package/scripts/rules/implementation-cut.ts +11 -3
  579. package/scripts/rules/index-guard.ts +8 -1
  580. package/scripts/rules/issue-comments.ts +76 -7
  581. package/scripts/rules/josh-git-bare.ts +7 -0
  582. package/scripts/rules/lane-background.ts +67 -25
  583. package/scripts/rules/lane-carry-conflict.ts +6 -0
  584. package/scripts/rules/lane-direct-tool.ts +74 -0
  585. package/scripts/rules/lane-interactive-ask.ts +9 -2
  586. package/scripts/rules/lane-park.ts +45 -23
  587. package/scripts/rules/lane-split-park.ts +10 -2
  588. package/scripts/rules/lane-switch-main.ts +7 -0
  589. package/scripts/rules/last-prompt.ts +50 -5
  590. package/scripts/rules/oracle-consulted.ts +10 -0
  591. package/scripts/rules/oracle-firing.ts +1 -0
  592. package/scripts/rules/oracle-list-cli.ts +7 -0
  593. package/scripts/rules/permission-guards.ts +3 -0
  594. package/scripts/rules/piped-verification.ts +4 -2
  595. package/scripts/rules/poll-loop.ts +7 -0
  596. package/scripts/rules/pr-merge.ts +123 -0
  597. package/scripts/rules/protected-files.ts +32 -5
  598. package/scripts/rules/raw-field-body.ts +6 -0
  599. package/scripts/rules/rule-body-guard.ts +8 -0
  600. package/scripts/rules/rule-list.ts +12 -28
  601. package/scripts/rules/rule-rewrite.ts +114 -0
  602. package/scripts/rules/rule-value-cache.ts +4 -9
  603. package/scripts/rules/rule-value-cli.ts +51 -32
  604. package/scripts/rules/rule-value.ts +8 -2
  605. package/scripts/rules/shell-segments.ts +50 -0
  606. package/scripts/rules/stop-decision.ts +77 -0
  607. package/scripts/rules/stop-rule-rows.ts +64 -0
  608. package/scripts/rules/stop-rules.ts +150 -51
  609. package/scripts/rules/tail-commands.ts +15 -1
  610. package/scripts/rules/test-declared-commit.ts +11 -1
  611. package/scripts/rules/third-party-write.ts +7 -0
  612. package/scripts/rules/timed-rerun.ts +69 -0
  613. package/scripts/rules/worktree-guard.ts +13 -3
  614. package/scripts/run/board/run-board-app-name.ts +23 -0
  615. package/scripts/run/board/run-board-cli.ts +65 -30
  616. package/scripts/run/board/run-board-closed.ts +8 -2
  617. package/scripts/run/board/run-board-earlier.ts +94 -0
  618. package/scripts/run/board/run-board-ending-reason.ts +67 -0
  619. package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
  620. package/scripts/run/board/run-board-estimate.ts +98 -0
  621. package/scripts/run/board/run-board-fit.ts +153 -36
  622. package/scripts/run/board/run-board-fold.ts +123 -0
  623. package/scripts/run/board/run-board-fresh.ts +2 -2
  624. package/scripts/run/board/run-board-gather-live.ts +29 -0
  625. package/scripts/run/board/run-board-gather-thread.ts +189 -0
  626. package/scripts/run/board/run-board-gather-worker.ts +29 -0
  627. package/scripts/run/board/run-board-gather.ts +187 -0
  628. package/scripts/run/board/run-board-github.ts +119 -31
  629. package/scripts/run/board/run-board-header.ts +86 -21
  630. package/scripts/run/board/run-board-keys.ts +58 -0
  631. package/scripts/run/board/run-board-kind.ts +20 -6
  632. package/scripts/run/board/run-board-labels.ts +118 -71
  633. package/scripts/run/board/run-board-lane-state.ts +109 -0
  634. package/scripts/run/board/run-board-lane-time.ts +122 -0
  635. package/scripts/run/board/run-board-layout.ts +240 -61
  636. package/scripts/run/board/run-board-length.ts +52 -0
  637. package/scripts/run/board/run-board-machine.ts +8 -4
  638. package/scripts/run/board/run-board-main.ts +12 -0
  639. package/scripts/run/board/run-board-notes.ts +52 -31
  640. package/scripts/run/board/run-board-now.ts +1 -1
  641. package/scripts/run/board/run-board-operation.ts +15 -33
  642. package/scripts/run/board/run-board-phase.ts +1 -1
  643. package/scripts/run/board/run-board-plan-shared.ts +115 -0
  644. package/scripts/run/board/run-board-plan.ts +55 -3
  645. package/scripts/run/board/run-board-planning.ts +45 -0
  646. package/scripts/run/board/run-board-priority.ts +44 -0
  647. package/scripts/run/board/run-board-process-groups.ts +195 -0
  648. package/scripts/run/board/run-board-read.ts +153 -13
  649. package/scripts/run/board/run-board-reason.ts +238 -45
  650. package/scripts/run/board/run-board-released.ts +35 -0
  651. package/scripts/run/board/run-board-render-checks.ts +39 -5
  652. package/scripts/run/board/run-board-render-condition.ts +96 -0
  653. package/scripts/run/board/run-board-render-drawn.ts +67 -0
  654. package/scripts/run/board/run-board-render-foot.ts +59 -0
  655. package/scripts/run/board/run-board-render-icon.ts +35 -0
  656. package/scripts/run/board/run-board-render-lanes.ts +145 -0
  657. package/scripts/run/board/run-board-render-lead.ts +80 -0
  658. package/scripts/run/board/run-board-render-legend.ts +117 -47
  659. package/scripts/run/board/run-board-render-notes.ts +156 -29
  660. package/scripts/run/board/run-board-render-processes.ts +196 -0
  661. package/scripts/run/board/run-board-render-section.ts +119 -0
  662. package/scripts/run/board/run-board-render-slot.ts +3 -36
  663. package/scripts/run/board/run-board-render-tail.ts +115 -48
  664. package/scripts/run/board/run-board-render-time.ts +56 -0
  665. package/scripts/run/board/run-board-render-title.ts +117 -24
  666. package/scripts/run/board/run-board-render-waits.ts +125 -0
  667. package/scripts/run/board/run-board-render.ts +206 -259
  668. package/scripts/run/board/run-board-roots.ts +54 -0
  669. package/scripts/run/board/run-board-row-yield.ts +10 -4
  670. package/scripts/run/board/run-board-setup.ts +1 -12
  671. package/scripts/run/board/run-board-snapshot.ts +111 -0
  672. package/scripts/run/board/run-board-spin.ts +2 -2
  673. package/scripts/run/board/run-board-state.ts +23 -29
  674. package/scripts/run/board/run-board-status.ts +206 -79
  675. package/scripts/run/board/run-board-thanks-read.ts +2 -2
  676. package/scripts/run/board/run-board-tick.ts +123 -104
  677. package/scripts/run/board/run-board-usage-board.ts +78 -0
  678. package/scripts/run/board/run-board-usage-lanes.ts +113 -0
  679. package/scripts/run/board/run-board-usage-listing.ts +93 -0
  680. package/scripts/run/board/run-board-usage-read.ts +120 -150
  681. package/scripts/run/board/run-board-usage-rusage.ts +19 -7
  682. package/scripts/run/board/run-board-usage-text.ts +139 -51
  683. package/scripts/run/board/run-board-usage-top.ts +102 -0
  684. package/scripts/run/board/run-board-usage.ts +89 -72
  685. package/scripts/run/board/run-board-usual.ts +20 -9
  686. package/scripts/run/carry/run-carry-args.ts +4 -7
  687. package/scripts/run/carry/run-carry-conversation.ts +1 -1
  688. package/scripts/run/carry/run-carry.ts +9 -4
  689. package/scripts/run/cut/run-cut-cli.ts +3 -2
  690. package/scripts/run/cut/run-cut-handoff.ts +2 -2
  691. package/scripts/run/cut/run-cut-report.ts +16 -0
  692. package/scripts/run/detached-launch.ts +23 -4
  693. package/scripts/run/entry/run-entry-cli.ts +8 -1
  694. package/scripts/run/event/run-event-cli.ts +1 -5
  695. package/scripts/run/event/run-event-filed.ts +12 -6
  696. package/scripts/run/event/run-event-follow.ts +2 -3
  697. package/scripts/run/event/run-event-render.ts +7 -10
  698. package/scripts/run/event/run-event-scope.ts +20 -2
  699. package/scripts/run/event/run-event-stream-emit.ts +78 -11
  700. package/scripts/run/event/run-event-stream.ts +37 -7
  701. package/scripts/run/hold/run-hold-adopt.ts +65 -0
  702. package/scripts/run/hold/run-hold-cli.ts +93 -22
  703. package/scripts/run/hold/run-hold-main.ts +12 -0
  704. package/scripts/run/hold/run-hold-member.ts +37 -0
  705. package/scripts/run/hold/run-hold-session.ts +46 -0
  706. package/scripts/run/hold/run-hold.ts +7 -1
  707. package/scripts/run/hold/run-stop-notify.ts +183 -0
  708. package/scripts/run/launch-priority.ts +32 -0
  709. package/scripts/run/merge/run-merge-auth.ts +31 -0
  710. package/scripts/run/merge/run-merge-cli.ts +72 -107
  711. package/scripts/run/merge/run-merge-close.ts +74 -0
  712. package/scripts/run/merge/run-merge-collect.ts +6 -13
  713. package/scripts/run/merge/run-merge-driver.ts +71 -0
  714. package/scripts/run/merge/run-merge-main.ts +12 -0
  715. package/scripts/run/merge/run-merge-outcome.ts +23 -0
  716. package/scripts/run/merge/run-merge-restart.ts +39 -0
  717. package/scripts/run/merge/run-merge-ship.ts +20 -4
  718. package/scripts/run/merge/run-merge-signals.ts +123 -0
  719. package/scripts/run/merge/run-merge-steps.ts +128 -83
  720. package/scripts/run/merge/run-merge.ts +53 -40
  721. package/scripts/run/park/run-park-cli.ts +91 -0
  722. package/scripts/run/park/run-park.ts +88 -0
  723. package/scripts/run/park/run-stalled.ts +68 -0
  724. package/scripts/run/pause/run-pause-cli.ts +73 -0
  725. package/scripts/run/pause/run-pause.ts +251 -0
  726. package/scripts/run/progress/run-progress-cli.ts +4 -12
  727. package/scripts/run/progress/run-progress-clock.ts +1 -1
  728. package/scripts/run/progress/run-progress-config.ts +6 -14
  729. package/scripts/run/progress/run-progress-main.ts +12 -0
  730. package/scripts/run/progress/run-progress.ts +1 -4
  731. package/scripts/run/review/run-review.ts +2 -1
  732. package/scripts/run/run-ending.ts +1 -0
  733. package/scripts/run/run-invocation.ts +5 -6
  734. package/scripts/run/run-liveness-cli.ts +6 -8
  735. package/scripts/run/run-liveness.ts +61 -30
  736. package/scripts/run/run-next.ts +1 -1
  737. package/scripts/run/run-parent-cut-hook.ts +2 -2
  738. package/scripts/run/run-poll-hook.ts +157 -0
  739. package/scripts/run/run-preflight.ts +18 -3
  740. package/scripts/run/run-prep-cli.ts +1 -10
  741. package/scripts/run/run-prep-locate.ts +7 -50
  742. package/scripts/run/run-prep-main.ts +12 -0
  743. package/scripts/run/run-prep.ts +6 -0
  744. package/scripts/run/run-report-cli.ts +101 -13
  745. package/scripts/run/run-report-handoff.ts +114 -0
  746. package/scripts/run/run-step-cli.ts +22 -15
  747. package/scripts/run/run-step-section.ts +85 -0
  748. package/scripts/run/run-step.ts +1 -1
  749. package/scripts/run/run-stranded-detect.ts +13 -0
  750. package/scripts/run/run-watcher-guard-cli.ts +1 -1
  751. package/scripts/run/run-watcher-guard.ts +1 -1
  752. package/scripts/run/ship/run-ship-args.ts +121 -0
  753. package/scripts/run/ship/run-ship-body-draft.ts +110 -0
  754. package/scripts/run/ship/run-ship-cli.ts +67 -151
  755. package/scripts/run/ship/run-ship-detach.ts +27 -7
  756. package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
  757. package/scripts/run/ship/run-ship-next.ts +27 -3
  758. package/scripts/run/ship/run-ship-overlap.ts +232 -0
  759. package/scripts/run/ship/run-ship-place.ts +96 -0
  760. package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
  761. package/scripts/run/ship/run-ship-pre-detach.ts +102 -27
  762. package/scripts/run/ship/run-ship-preflight.ts +161 -30
  763. package/scripts/run/ship/run-ship-probe.ts +11 -3
  764. package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
  765. package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
  766. package/scripts/run/ship/run-ship-return.ts +123 -15
  767. package/scripts/run/ship/run-ship-review-steps.ts +105 -149
  768. package/scripts/run/ship/run-ship-review.ts +73 -6
  769. package/scripts/run/ship/run-ship-reviewer.ts +207 -0
  770. package/scripts/run/ship/run-ship-stage.ts +55 -6
  771. package/scripts/run/ship/run-ship-steps.ts +46 -15
  772. package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
  773. package/scripts/run/ship/run-ship-stop-context.ts +206 -0
  774. package/scripts/run/ship/run-ship-stop-text.ts +11 -6
  775. package/scripts/run/ship/run-ship-sync.ts +57 -12
  776. package/scripts/run/ship/run-ship.ts +30 -2
  777. package/scripts/run/tidy/run-tidy-cli.ts +0 -4
  778. package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
  779. package/scripts/run/tidy/run-tidy-main.ts +8 -0
  780. package/scripts/run/wake/run-wake-cli.ts +119 -100
  781. package/scripts/run/wake/run-wake-code.ts +83 -0
  782. package/scripts/run/wake/run-wake-driver.ts +19 -8
  783. package/scripts/run/wake/run-wake-loop.ts +34 -3
  784. package/scripts/run/wake/run-wake-main.ts +13 -0
  785. package/scripts/run/wake/run-wake-ports.ts +90 -0
  786. package/scripts/run/wake/run-wake-takeover.ts +66 -0
  787. package/scripts/run/wake/run-wake.ts +2 -1
  788. package/scripts/safe-chain/pack-hook.ts +2 -2
  789. package/scripts/safe-chain/preinstall-command.ts +2 -1
  790. package/scripts/safe-chain/project-config.ts +3 -9
  791. package/scripts/security/security-audit-main.ts +8 -0
  792. package/scripts/security/security-audit-provision-logic.ts +0 -11
  793. package/scripts/security/security-audit-provision-main.ts +12 -0
  794. package/scripts/security/security-audit-provision.ts +11 -26
  795. package/scripts/security/security-audit.ts +6 -7
  796. package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
  797. package/scripts/split/split-assess-cli.ts +2 -2
  798. package/scripts/split/split-assess.ts +15 -0
  799. package/scripts/split/split-measure.ts +65 -0
  800. package/scripts/sync/claude-settings-merge.ts +8 -15
  801. package/scripts/sync/directory-copy-guard.ts +4 -9
  802. package/scripts/sync/file-content.ts +78 -8
  803. package/scripts/sync/sync-ai-files.ts +3 -5
  804. package/scripts/sync/sync-configs.ts +11 -23
  805. package/scripts/sync/sync-hook-safety.ts +4 -10
  806. package/scripts/sync/sync-main.ts +11 -0
  807. package/scripts/sync/sync.ts +25 -37
  808. package/scripts/test/test-declared-changed.ts +2 -2
  809. package/scripts/test/test-declared.ts +1 -1
  810. package/scripts/test/test-e2e-guard.ts +55 -6
  811. package/scripts/test/test-e2e-stamp.ts +38 -0
  812. package/scripts/test/test-pinned-logic.ts +145 -0
  813. package/scripts/test/test-pinned-main.ts +78 -0
  814. package/scripts/test/test-pinned.ts +100 -0
  815. package/scripts/test/test-read-map.ts +264 -0
  816. package/scripts/test/test-read-recording.ts +91 -0
  817. package/scripts/test/test-read-trace.ts +148 -0
  818. package/scripts/test/test-red-main.ts +12 -0
  819. package/scripts/test/test-red.ts +12 -30
  820. package/scripts/test/test-related-main.ts +18 -0
  821. package/scripts/test/test-related-record.ts +119 -0
  822. package/scripts/test/test-related-scope.ts +229 -43
  823. package/scripts/test/test-related.ts +300 -22
  824. package/scripts/test/test-unit-guard-main.ts +15 -0
  825. package/scripts/test/test-unit-guard.ts +54 -21
  826. package/scripts/test/unit-count-file.ts +37 -0
  827. package/scripts/test/unit-run-marker.ts +162 -0
  828. package/scripts/test/unit-setup-files.ts +51 -0
  829. package/scripts/test/unit-worker-share.ts +71 -137
  830. package/scripts/test/whole-suite-files.ts +63 -0
  831. package/scripts/time-runtime/time-background.ts +20 -2
  832. package/scripts/time-runtime/time-bundles.ts +4 -3
  833. package/scripts/time-runtime/time-density-hook.ts +8 -6
  834. package/scripts/time-runtime/time-followup-stage.ts +1 -3
  835. package/scripts/time-runtime/time-format.ts +5 -28
  836. package/scripts/time-runtime/time-markers.ts +10 -1
  837. package/scripts/time-runtime/time-shell.ts +126 -14
  838. package/scripts/time-runtime/time-spans.ts +1 -0
  839. package/scripts/time-runtime/time-tool-call.ts +7 -0
  840. package/scripts/time-runtime/time-transcript-line.ts +49 -62
  841. package/scripts/uninstall/uninstall.ts +1 -1
  842. package/scripts/version/bump-version-main.ts +12 -0
  843. package/scripts/version/bump-version.ts +25 -25
  844. package/scripts/version/effective-upstream.ts +6 -12
  845. package/scripts/version/latest-corepack.ts +17 -32
  846. package/scripts/version/latest-if-required-cli.ts +93 -0
  847. package/scripts/version/latest-lane-guard-main.ts +8 -0
  848. package/scripts/version/latest-lane-guard.ts +0 -4
  849. package/scripts/version/latest-scope-cli.ts +0 -9
  850. package/scripts/version/latest-scope-main.ts +12 -0
  851. package/scripts/version/latest-update.ts +5 -5
  852. package/scripts/version/npm-registry.ts +44 -6
  853. package/scripts/version/publishable-range-check.ts +5 -16
  854. package/scripts/version/release-age.ts +1 -1
  855. package/scripts/version/release-hold.ts +1 -1
  856. package/scripts/version/release-window.ts +38 -0
  857. package/scripts/version/running-binary.ts +1 -1
  858. package/scripts/version/safe-chain-version-update.ts +3 -8
  859. package/scripts/version/version-targets.ts +6 -28
  860. package/templates/dependabot.yml +29 -0
  861. package/templates/gitignore +10 -3
  862. package/templates/pnpm-workspace.basic.yaml +1 -1
  863. package/templates/sonar-project.properties +3 -2
  864. package/templates/workflows/ci.yml +12 -4
  865. package/templates/workflows/github-release.yml +4 -0
  866. package/tsconfig.sonar.json +1 -1
  867. package/.ncurc.json +0 -3
  868. package/dist/hooks/batch-guard.js +0 -29
  869. package/dist/hooks/chunk-43ZHT22P.js +0 -3495
  870. package/dist/hooks/chunk-CDY4NFQG.js +0 -15
  871. package/dist/hooks/chunk-EUMACUK2.js +0 -2038
  872. package/dist/hooks/chunk-H5HVWYXK.js +0 -359
  873. package/dist/hooks/chunk-IIGFYXKC.js +0 -7104
  874. package/dist/hooks/chunk-IX6TTTI6.js +0 -95
  875. package/dist/hooks/chunk-J47HU5H5.js +0 -237
  876. package/dist/hooks/chunk-K4EOONYM.js +0 -45
  877. package/dist/hooks/chunk-K4LMBQC2.js +0 -68
  878. package/dist/hooks/chunk-SHGPANFB.js +0 -56
  879. package/dist/hooks/chunk-YHBZAJSV.js +0 -79
  880. package/dist/hooks/chunk-YYPI7SJZ.js +0 -131
  881. package/dist/hooks/duplicate-read-guard.js +0 -30
  882. package/dist/hooks/investigation-guard.js +0 -32
  883. package/scripts/backlog/backlog-stalled-cli.ts +0 -30
  884. package/scripts/cost-runtime/cost-format.ts +0 -29
  885. package/scripts/init/basic-path-migration.ts +0 -24
  886. package/scripts/issue/issue-backlinks-cli.ts +0 -93
  887. package/scripts/josh/josh-commands-guard.ts +0 -38
  888. package/scripts/lint/cross-file-recheck.ts +0 -155
  889. package/scripts/registry-migration/migrate-logic.ts +0 -237
  890. package/scripts/registry-migration/migrate.ts +0 -292
  891. package/scripts/registry-migration/user-npmrc.ts +0 -15
  892. package/scripts/rules/rule-guard.ts +0 -23
  893. package/scripts/rules/rule-registry-rows.ts +0 -282
  894. package/scripts/rules/rule-registry.ts +0 -109
  895. package/scripts/run/run-stranded-cli.ts +0 -27
@@ -46,7 +46,7 @@ function is_index_segment(segment: string): boolean {
46
46
  }
47
47
 
48
48
  function is_index_mutation(command: string): boolean {
49
- return shell_segments.segments_of(command).some((segment) => is_index_segment(segment))
49
+ return shell_segments.commands_of(command).some((segment) => is_index_segment(segment))
50
50
  }
51
51
 
52
52
  const INDEX_MUTATION_REASON =
@@ -61,6 +61,13 @@ const ROW = {
61
61
  is_trigger: bash_triggers.on_bash_command(is_index_mutation),
62
62
  reason: INDEX_MUTATION_REASON,
63
63
  decide: (): boolean => true,
64
+ about: {
65
+ title: 'Index mutation',
66
+ topic: '`operating-rules.md`',
67
+ fires:
68
+ '`git add` / `commit` / `reset` / `rm` / `mv` / `restore --staged` in any spelling. Every occurrence',
69
+ quiet: '`pnpm josh git` — the approved commit flow',
70
+ },
64
71
  }
65
72
 
66
73
  const index_guard = { INDEX_MUTATION_REASON, ROW, is_index_mutation }
@@ -1,3 +1,7 @@
1
+ import { cost_blocks } from '#scripts/cost-runtime/cost-blocks'
2
+ import { json_value } from '#scripts/lib/json-value'
3
+ import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
4
+ import { time_shell } from '#scripts/time-runtime/time-shell'
1
5
  import { bash_triggers } from './bash-triggers'
2
6
  import { gh_api } from './gh-api'
3
7
  import { prior_comment_read } from './prior-comment-read'
@@ -17,7 +21,7 @@ const ISSUE_VIEW_COMMAND = new RegExp(String.raw`^gh\s+${gh_api.GH_FLAGS}issue\s
17
21
  // (`…/issues`) and every sub-resource under it (`…/issues/1319/comments`) are left alone.
18
22
  const ISSUE_BODY_PATH = /repos\/[^\s'"]*\/issues\/\d+(?=$|["'\s])/u
19
23
  // **A write to that path is not a read of it**, which is why the body read below asks `gh_api.is_read`:
20
- // `gh api` sends POST as soon as any field flag appears, and `kickoff` PATCHes `…/issues/<N>` to
24
+ // `gh api` sends POST as soon as any field flag appears, and a run PATCHes `…/issues/<N>` to
21
25
  // normalize a title and to fill a blank body — so without the read check the delivery would be spent
22
26
  // refusing a write, and the genuine body read later in the same run would never be guarded.
23
27
  // A segment that fetches comments: the flag, a `comments` field in a `--json` projection, or the
@@ -77,6 +81,9 @@ function reads_issue_comments(command: string): boolean {
77
81
  return shell_segments.segments_of(command).some((segment) => fetches_issue_comments(segment))
78
82
  }
79
83
 
84
+ const RULE_DOC = '`.claude/skills/workflow-commands/issue-comments.md`'
85
+ const COMMENTS_FALLBACK = 'gh api repos/{owner}/{repo}/issues/<N>/comments'
86
+
80
87
  // **The refusal hands over the command that fixes it**, because reading is not the same as
81
88
  // obeying: a sentence saying "also read the comments" is prose that moves nothing, while a refused
82
89
  // body read leaves the run holding the reissue that makes the comments *present*. The conflict rule
@@ -88,12 +95,62 @@ function reads_issue_comments(command: string): boolean {
88
95
  // being the Issue the refused call named — so a run that reads only the opening still leaves holding
89
96
  // the fix. The label keeps `time_transcript_line.guard_from_refusal` naming this guard, not the command.
90
97
  const ISSUE_COMMENTS_REASON =
91
- '⛔ issue comments: pnpm josh issue:read <N>\n' +
92
- "Run that in place of this read — an Issue's comments are part of it, and a later comment " +
93
- 'supersedes the body it contradicts; refused until that command is on the transcript. Without ' +
94
- 'josh, read ' +
95
- '`gh api repos/{owner}/{repo}/issues/<N>/comments` beside the body ' +
96
- '(`.claude/skills/workflow-commands/issue-comments.md`).'
98
+ `⛔ issue comments: pnpm josh issue:read <N>\n` +
99
+ `Run that in place of this read — an Issue's comments are part of it, and a later comment ` +
100
+ `supersedes the body it contradicts; refused until that command is on the transcript. Without ` +
101
+ `josh, read \`${COMMENTS_FALLBACK}\` beside the body (${RULE_DOC}).`
102
+
103
+ // **A `gh api` body read is rewritten rather than refused** (joshuafolkken/kit#3920): the fix is the
104
+ // same Issue's comments endpoint, read on the same line, and the path the call already names is all
105
+ // it needs. Prepended on lines of their own, so a trailing comment or a `&&` chain on the typed line
106
+ // cannot swallow or skip them, and the typed line stays last — its exit status is still the call's.
107
+ // A `gh issue view` read is left to the refusal — its global flags (`--repo`) and its `--json`
108
+ // projection have no one comments spelling to add.
109
+ const COMMENTS_JQ = String.raw`'.[] | "— \(.user.login) \(.created_at)\n\(.body)\n"'`
110
+
111
+ const COMMENTS_NOTE =
112
+ "↻ issue comments: this read returned only the Issue's body, so the Issue's comments were fetched " +
113
+ `on the same line — a later comment supersedes the body it contradicts (${RULE_DOC}).`
114
+
115
+ // **Only a line that opens with the body read is rewritten.** Prepended ahead of a `cd` or a
116
+ // subshell, the comments read would resolve `{owner}/{repo}` in another directory and print another
117
+ // repository's comments; and the line is cut on its quote-blanked reading, so a body-read spelling
118
+ // quoted in a string or a heredoc body is never prepended as a real call. Every other line keeps the
119
+ // refusal.
120
+ function rewritable_path(command: string): string | undefined {
121
+ const read = shell_segments.first_of(command)
122
+
123
+ if (read === undefined || ISSUE_VIEW_COMMAND.test(read)) return undefined
124
+
125
+ return is_body_read_segment(read) ? ISSUE_BODY_PATH.exec(read)?.[0] : undefined
126
+ }
127
+
128
+ function comments_command(command: string): string | undefined {
129
+ if (!is_body_only_issue_read(command)) return undefined
130
+
131
+ const path = rewritable_path(command)
132
+
133
+ if (path === undefined) return undefined
134
+
135
+ return `gh api --paginate ${path}/comments --jq ${COMMENTS_JQ}\n${command}`
136
+ }
137
+
138
+ // The call's input with the comments read prepended, or `undefined` where the comments are already on
139
+ // the tail or the read has no rewritable spelling.
140
+ function comments_input(
141
+ call: GuardedCall,
142
+ tail: () => string,
143
+ ): Record<string, unknown> | undefined {
144
+ if (call.name !== cost_blocks.BASH_TOOL || !json_value.is_record(call.input)) return undefined
145
+
146
+ const command = comments_command(time_shell.bash_command(call.input))
147
+
148
+ if (command === undefined || prior_comment_read.already_read_for_call(tail(), call)) {
149
+ return undefined
150
+ }
151
+
152
+ return { ...call.input, command }
153
+ }
97
154
 
98
155
  // The enumeration row itself, so `delivered-rules.ts` spreads one entry. `already_satisfied` stands it
99
156
  // down once the comments are on the transcript tail, and until then it refuses every body-only read.
@@ -103,13 +160,25 @@ const ROW = {
103
160
  reason: ISSUE_COMMENTS_REASON,
104
161
  already_satisfied: prior_comment_read.already_read_for_call,
105
162
  keeps: bash_triggers.on_bash_command(reads_issue_comments),
163
+ rewrite: comments_input,
164
+ rewrite_note: COMMENTS_NOTE,
106
165
  // The opening the reason carried before it led with the command.
107
166
  former_reasons: ["⛔ an Issue's comments are part of the Issue: read them before implementing"],
167
+ about: {
168
+ title: 'Reading Issue comments',
169
+ topic: '`issue-comments.md`',
170
+ fires:
171
+ 'a `Bash` that reads only the Issue body (`gh issue view <N>`, or a GET ending in `…/issues/<N>`). Refused until it is re-read with the comments',
172
+ quiet:
173
+ 'no Issue read, or a read with `--comments` / `--json comments` / `…/comments` from the start',
174
+ },
108
175
  }
109
176
 
110
177
  const issue_comments = {
178
+ COMMENTS_NOTE,
111
179
  ISSUE_COMMENTS_REASON,
112
180
  ROW,
181
+ comments_input,
113
182
  is_body_only_issue_read,
114
183
  }
115
184
 
@@ -66,6 +66,13 @@ const ROW = {
66
66
  is_trigger: bash_triggers.on_bash_command(is_bare_josh_git),
67
67
  reason: JOSH_GIT_BARE_REASON,
68
68
  decide: (): boolean => true,
69
+ about: {
70
+ title: 'Bare `pnpm josh git`',
71
+ topic: '`CLAUDE.md` → Git Rules',
72
+ fires:
73
+ '`pnpm josh git` without `-y`, whose staging prompt cancels with no TTY. Every occurrence',
74
+ quiet: '`pnpm josh git -y`',
75
+ },
69
76
  }
70
77
 
71
78
  const josh_git_bare = {
@@ -26,7 +26,7 @@ import { run_tail_rule } from './run-tail-rule'
26
26
  // killed at the turn's end before any supervisor exists. Issued in the foreground it returns at
27
27
  // `launched` within the tool timeout, and the supervisor carries the rest. A backgrounded `ship` alone
28
28
  // is not refused but rewritten into that foreground call (`foreground_input`); one chained after
29
- // another long command is refused.
29
+ // another long command is refused. A foreground `ship` without the cap is given it the same way.
30
30
  //
31
31
  // **Its stop-time half reads the same fact from the other side.** A backgrounded task the transcript
32
32
  // launched but never saw finish is still running, and in a child the stop about to happen kills it —
@@ -43,9 +43,10 @@ const LONG_RUNNING_COMMANDS: ReadonlySet<string> = new Set([
43
43
 
44
44
  const BACKGROUND_KEY = 'run_in_background'
45
45
  const TIMEOUT_KEY = 'timeout'
46
- // The longest a foreground Bash call may run. A backgrounded call rarely carries a `timeout`, and one that
47
- // does may exceed the foreground cap, so the rewrite sets it: left at the two-minute default, a preflight
48
- // whose scoped pair outruns it is cut before `launched`, the #3027 failure the rewrite exists to avoid.
46
+ // The longest a foreground Bash call may run. A `ship` rarely carries a `timeout`, and a backgrounded one
47
+ // that does may exceed the foreground cap, so the rewrite sets it: left at the two-minute default, a
48
+ // preflight whose scoped pair outruns it is cut before `launched` (#3027) or moved to the background and
49
+ // killed with the turn (#4101).
49
50
  const FOREGROUND_TIMEOUT_MS = 600_000
50
51
 
51
52
  function is_backgrounded(input: unknown): boolean {
@@ -101,38 +102,72 @@ function is_background_long_run(
101
102
  return is_candidate(call) && is_lane_child()
102
103
  }
103
104
 
104
- // **A backgrounded `ship` in a child is rewritten, not refused**. The refusal
105
- // asked for nothing but the same call in the foreground — 14 of 41 lane `ship` refusals in one measured
106
- // backlogrun were that round trip, paid at the run's largest context. The input with the flag cleared,
107
- // or `undefined` for every call this does not apply to.
105
+ // The input of a Bash call whose long-running work is `ship` alone, or `undefined` for any other call.
106
+ function ship_alone_input(call: GuardedCall): Record<string, unknown> | undefined {
107
+ if (call.name !== cost_blocks.BASH_TOOL || !json_value.is_record(call.input)) return undefined
108
+
109
+ return ships_alone(time_shell.bash_command(call.input)) ? call.input : undefined
110
+ }
111
+
112
+ // A foreground call that already carries the foreground cap, which the harness never moves aside.
113
+ function is_capped_foreground(input: Record<string, unknown>): boolean {
114
+ const timeout = input[TIMEOUT_KEY]
115
+
116
+ return !is_backgrounded(input) && typeof timeout === 'number' && timeout >= FOREGROUND_TIMEOUT_MS
117
+ }
118
+
119
+ // **A `ship` in a child is run in the foreground at the cap, not refused**. The refusal of a
120
+ // backgrounded one asked for nothing but the same call in the foreground — 14 of 41 lane `ship`
121
+ // refusals in one measured backlogrun were that round trip, paid at the run's largest context.
122
+ //
123
+ // A foreground one at the two-minute default is moved aside once its preflight outruns it, and dies
124
+ // the same way (joshuafolkken/kit#4101). The input with the flag cleared and the cap set, or
125
+ // `undefined` for every call this does not apply to.
108
126
  function foreground_input(
109
127
  call: GuardedCall,
110
128
  is_lane_child: () => boolean = () => lane_child_marker.is_child_of(process.cwd()),
111
129
  ): Record<string, unknown> | undefined {
112
- if (!is_backgrounded_ship(call) || !json_value.is_record(call.input) || !is_lane_child()) {
113
- return undefined
114
- }
130
+ const input = ship_alone_input(call)
131
+
132
+ if (input === undefined || is_capped_foreground(input) || !is_lane_child()) return undefined
115
133
 
116
- return { ...call.input, [BACKGROUND_KEY]: false, [TIMEOUT_KEY]: FOREGROUND_TIMEOUT_MS }
134
+ return { ...input, [BACKGROUND_KEY]: false, [TIMEOUT_KEY]: FOREGROUND_TIMEOUT_MS }
117
135
  }
118
136
 
119
137
  const FOREGROUND_NOTE =
120
- 'lane background: this lane child backgrounded `josh ship`, which would die with the headless turn ' +
121
- 'before its supervisor exists — so it was run in the foreground instead, where it detaches itself ' +
122
- 'after the preflight. End the turn on `launched` / `busy`.'
138
+ "lane background: a lane child's `josh ship` backgrounded, by its flag or by outrunning the Bash " +
139
+ 'timeout, dies with the headless turn before its supervisor exists — so it was run in the ' +
140
+ 'foreground at the 600000 ms cap, where it detaches itself after the preflight. End the turn on ' +
141
+ '`launched` / `busy`.'
142
+
143
+ type LaunchedIds = (block: TranscriptBlock) => ReadonlyArray<string>
144
+
145
+ // One line's word on each id: a launch opens it, a finish notice closes it.
146
+ function apply_line(open: Set<string>, line: string, launched_ids: LaunchedIds): void {
147
+ const parsed = time_transcript_line.parse_line(line)
148
+
149
+ if (parsed === undefined) return
150
+
151
+ const launched = parsed.blocks.flatMap((block) => launched_ids(block))
152
+
153
+ for (const id of launched) open.add(id)
154
+ open.delete(parsed.finished_background)
155
+ }
123
156
 
124
157
  // The launches `launched_ids` reads off the transcript tail that never saw their finish. A launch is
125
- // read off its own tool result and a finish off the harness notice, both by `time_transcript_line`.
126
- function unfinished_ids(
127
- tail: string,
128
- launched_ids: (block: TranscriptBlock) => ReadonlyArray<string>,
129
- ): ReadonlyArray<string> {
130
- const lines = tail.split('\n').map((line) => time_transcript_line.parse_line(line))
131
- const finished = new Set(lines.map((line) => line?.finished_background ?? ''))
132
- const blocks = lines.flatMap((line) => line?.blocks ?? [])
133
- const launched = blocks.flatMap((block) => launched_ids(block))
158
+ // read off its own tool result and a finish off the harness notice or a `TaskStop` result, both by
159
+ // `time_transcript_line`.
160
+ //
161
+ // **Read in order, so the later word on an id wins.** A subagent resumed by `SendMessage` runs again
162
+ // under the id its first run's notice already named; a set of every finish ever seen would read the
163
+ // resumed run as finished (joshuafolkken/kit#4347).
164
+ function unfinished_ids(tail: string, launched_ids: LaunchedIds): ReadonlyArray<string> {
165
+ const open = new Set<string>()
166
+
167
+ for (const line of tail.split('\n')) apply_line(open, line, launched_ids)
168
+ open.delete('')
134
169
 
135
- return launched.filter((id) => id !== '' && !finished.has(id))
170
+ return [...open]
136
171
  }
137
172
 
138
173
  // The background tasks the tail launched and never saw finish — commands and subagents alike,
@@ -167,6 +202,13 @@ const ROW = {
167
202
  is_trigger: (call: GuardedCall): boolean => is_background_long_run(call),
168
203
  reason: LANE_BACKGROUND_REASON,
169
204
  decide: (): boolean => true,
205
+ about: {
206
+ title: 'Lane child background push',
207
+ topic: '`.claude/skills/workflow-commands/background-commands.md`',
208
+ fires:
209
+ 'a dispatched lane child backgrounding `josh gate` / `git` / `followup` / `ship`; it hands over `pnpm josh ship --detach`. Every occurrence',
210
+ quiet: 'not a lane child, or the foreground `ship --detach`',
211
+ },
170
212
  }
171
213
 
172
214
  const lane_background = {
@@ -109,6 +109,12 @@ const ROW = {
109
109
  is_trigger: bash_triggers.on_bash_command(is_carry_conflict),
110
110
  reason: LANE_CARRY_CONFLICT_REASON,
111
111
  decide: (): boolean => true,
112
+ about: {
113
+ title: 'Lane child carry commands',
114
+ topic: '`.claude/skills/workflow-commands/backlogrun-lanes.md`',
115
+ fires: 'a dispatched lane child running `pnpm josh run:merge` / `run:carry`. Every occurrence',
116
+ quiet: 'not a lane child — the parent owns the run budget',
117
+ },
112
118
  }
113
119
 
114
120
  const lane_carry_conflict = {
@@ -0,0 +1,74 @@
1
+ import { command_memory } from '#scripts/gate/command-memory'
2
+ import { lane_child_marker } from '#scripts/lane/lane-child-marker'
3
+ import { bash_triggers } from './bash-triggers'
4
+
5
+ // A dispatched lane child is stopped from running a heavy tool directly. The core budget
6
+ // (`scripts/gate/core-budget.ts`) counts only what a `josh` command reserves, so an `eslint`, `vitest`,
7
+ // `cspell` or `tsc` a lane agent launches itself is neither refused nor counted: it overlaps the other
8
+ // lanes' gates and shows up only as unexplained load to whatever is admitted next.
9
+ //
10
+ // **Every spelling collapses to the tool's name.** `command_memory.tool_calls_of` skips the wrapper
11
+ // words (`pnpm`, `npx`, `exec`, env assignments) and reads a shell's quoted script (`sh -c '…'`,
12
+ // `bash -c "…"`, `eval`) as the commands it runs, so `pnpm exec eslint`, `npx vitest`, `pnpm tsc`, a
13
+ // bare `cspell` and any of them inside `sh -c` are all read as the program they launch. A
14
+ // `pnpm josh …` reads as `josh` and passes — that is the budgeted path, and the command
15
+ // `pnpm josh reserved-run <weight> -- <command>` wraps is read as reserved.
16
+ //
17
+ // **A multi-worker eslint is refused even when reserved** (joshuafolkken/kit#4582): typed eslint holds a
18
+ // TypeScript program per worker, so `--concurrency 4` or `auto` held 12 GB in one lane and swapped the
19
+ // machine. `--concurrency off`, `1` and no flag pass.
20
+ //
21
+ // **Lane children only.** An interactive session outside a lane keeps its direct runs; the overlap this
22
+ // prevents is between concurrently dispatched lanes.
23
+
24
+ const HEAVY_TOOLS: ReadonlySet<string> = new Set(['eslint', 'vitest', 'cspell', 'tsc'])
25
+
26
+ // True when any command on the shell line launches one of the heavy tools outside a `reserved-run`.
27
+ // The cut is quote-aware, so a tool name inside a quoted argument (`git commit -m "run eslint"`) is
28
+ // never read as a command; a quoted script handed to a shell is.
29
+ function runs_heavy_tool(command: string): boolean {
30
+ return command_memory
31
+ .tool_calls_of(command)
32
+ .some((call) => !call.is_reserved && HEAVY_TOOLS.has(call.name))
33
+ }
34
+
35
+ // True when this session is a dispatched lane child launching a heavy tool directly, or eslint with
36
+ // more than one worker by any path.
37
+ function is_lane_direct_tool(
38
+ command: string,
39
+ is_lane_child: boolean = lane_child_marker.is_child_of(process.cwd()),
40
+ ): boolean {
41
+ if (!is_lane_child) return false
42
+
43
+ return runs_heavy_tool(command) || command_memory.runs_multi_worker_eslint(command)
44
+ }
45
+
46
+ const LANE_DIRECT_TOOL_REASON =
47
+ '⛔ lane child running `eslint` / `vitest` / `cspell` / `tsc` directly, or multi-worker eslint: ' +
48
+ 'it overlaps the other lanes. Run `pnpm josh lint:related`, `pnpm josh test:related`, ' +
49
+ '`pnpm josh cspell:dot` or `pnpm josh reserved-run <weight> -- <command>`, eslint at ' +
50
+ '`--concurrency off`; measure concurrency outside a lane. Refused on every occurrence.'
51
+
52
+ // The row itself, so `delivered-rules.ts` spreads one entry; the shape is `lane-switch-main.ts`'s.
53
+ const ROW = {
54
+ id: 'lane-direct-tool',
55
+ is_trigger: bash_triggers.on_bash_command(is_lane_direct_tool),
56
+ reason: LANE_DIRECT_TOOL_REASON,
57
+ decide: (): boolean => true,
58
+ about: {
59
+ title: 'Lane child running a heavy tool directly',
60
+ topic: '`docs/josh-commands-automation.md` → `josh reserved-run`',
61
+ fires:
62
+ 'a dispatched lane child launching `eslint` / `vitest` / `cspell` / `tsc` (bare, `pnpm exec`, `npx`, inside `sh -c`), or eslint with `--concurrency` other than `off` / `1` by any path, `reserved-run` included. Every occurrence',
63
+ quiet: 'not a lane child, or the run goes through `pnpm josh` with single-worker eslint',
64
+ },
65
+ }
66
+
67
+ const lane_direct_tool = {
68
+ LANE_DIRECT_TOOL_REASON,
69
+ ROW,
70
+ is_lane_direct_tool,
71
+ runs_heavy_tool,
72
+ }
73
+
74
+ export { lane_direct_tool }
@@ -43,8 +43,7 @@ function is_interactive_ask(
43
43
  const LANE_INTERACTIVE_ASK_REASON =
44
44
  '⛔ lane child interactive ask: this session is a dispatched lane child and cannot ask a ' +
45
45
  'person, so park instead: ' +
46
- "`gh api repos/{owner}/{repo}/issues/<N>/labels -f 'labels[]=needs-decision'`, " +
47
- '`pnpm josh issue:comment <N> --body-file <path>`, ' +
46
+ '`pnpm josh run:park <N> --body-file <path>` (it applies `needs-decision`), ' +
48
47
  'the `confirmation` Telegram, stop. It fires on every occurrence ' +
49
48
  '(`.claude/skills/workflow-commands/pre-gate-cut.md`, `backlogrun-park.md`).'
50
49
 
@@ -56,6 +55,14 @@ const ROW = {
56
55
  is_trigger: is_interactive_ask,
57
56
  reason: LANE_INTERACTIVE_ASK_REASON,
58
57
  decide: (): boolean => true,
58
+ about: {
59
+ title: 'Lane child interactive ask',
60
+ topic:
61
+ '`.claude/skills/workflow-commands/pre-gate-cut.md` → "The interactive ask is refused one call earlier"',
62
+ fires:
63
+ "a dispatched lane child's `AskUserQuestion`; it hands over the park procedure. Every occurrence",
64
+ quiet: 'not a lane child, or not an interactive tool',
65
+ },
59
66
  }
60
67
 
61
68
  const lane_interactive_ask = { LANE_INTERACTIVE_ASK_REASON, ROW, is_interactive_ask }
@@ -1,6 +1,7 @@
1
1
  import { NEEDS_DECISION_LABEL } from '#scripts/issue/issue-labels'
2
2
  import { lane_child_marker } from '#scripts/lane/lane-child-marker'
3
3
  import { lane_handoff } from '#scripts/lane/lane-handoff'
4
+ import { run_park } from '#scripts/run/park/run-park'
4
5
  import { bash_triggers } from './bash-triggers'
5
6
  import { shell_segments } from './shell-segments'
6
7
 
@@ -19,15 +20,12 @@ import { shell_segments } from './shell-segments'
19
20
  // confirmation` is the call every lane-child stop passes through. The agent that obeys this is always
20
21
  // a `claude -p` child, so the rule leaves residency entirely (`prompts/collaboration-workflow/rule-delivery.md`).
21
22
  //
22
- // **Why once per run and not a synchronous compliance check.** The pre-gate cut can stay silent on a
23
- // compliant run because the cut record is a local file it reads synchronously; the park is a label on
24
- // GitHub, which a `PreToolUse` guard cannot read (it answers synchronously, network calls are out).
25
- // Scanning the transcript tail for the label instead is unsafe in the one direction that matters: a
26
- // child that merely *read* `backlogrun-park.md`, whose prose carries the very `labels[]=needs-decision`
27
- // command, would look compliant and the guard would fall silent on a real violation — the whole bug,
28
- // reappearing inside its own check. So the row carries no `already_satisfied`: it fires once per run on
29
- // the stop, the reason is a checklist rather than an accusation, and a child that already parked simply
30
- // reissues. One wasted round trip on the compliant path is the safe direction; a missed park is not.
23
+ // **A parked child is silent, read off the local park record.** The park is a label on GitHub, which a
24
+ // `PreToolUse` guard cannot read (it answers synchronously, network calls are out), and scanning the
25
+ // transcript tail for the label is unsafe: a child that merely *read* `backlogrun-park.md` would look
26
+ // compliant. So `pnpm josh run:park` writes a local record once the comment and the label are both on
27
+ // the issue, and the guard reads it synchronously, the way the pre-gate cut guard reads the cut record
28
+ // (joshuafolkken/kit#4132). A child with no record still gets the once-per-run checklist.
31
29
 
32
30
  // `josh notify`, named canonically — `shell_segments.is_josh_command` expands an alias before the match.
33
31
  const NOTIFY_COMMANDS: ReadonlySet<string> = new Set(['notify'])
@@ -85,22 +83,42 @@ function is_parking_child(directory: string = process.cwd()): boolean {
85
83
  return lane_child_marker.is_child_of(directory) && !lane_handoff.is_handed_off(directory)
86
84
  }
87
85
 
88
- function is_unparked_stop(command: string, is_child: () => boolean = is_parking_child): boolean {
86
+ // A parking child that has not parked yet: `run:park` left no record for its issue in this repository.
87
+ // Kept apart from `is_parking_child`, which `run:entry` reads to leave a lane child's stop to this row
88
+ // whether or not it has parked.
89
+ function is_unparked_child(directory: string = process.cwd()): boolean {
90
+ if (!is_parking_child(directory)) return false
91
+
92
+ const issue = lane_child_marker.marked_issue()
93
+
94
+ return issue === undefined || !run_park.is_parked_sync(issue, directory)
95
+ }
96
+
97
+ function is_unparked_stop(command: string, is_child: () => boolean = is_unparked_child): boolean {
89
98
  if (!is_confirmation_notify(command)) return false
90
99
 
91
100
  return is_child()
92
101
  }
93
102
 
94
103
  // **Keeping this rule is applying `needs-decision`**, the one act the park asks for before the stop.
95
- // It reads an actual `Bash` command — a label application by REST or by `gh issue edit` — never the
96
- // transcript tail, so a doc read that quotes the command is not mistaken for the run making it.
104
+ // It reads an actual `Bash` command — `josh run:park`, or a label application by REST or by
105
+ // `gh issue edit` — never the transcript tail, so a doc read that quotes the command is not mistaken
106
+ // for the run making it. `run:park --clear` takes the park off, so it is not one.
97
107
  const APPLIES_NEEDS_DECISION = new RegExp(
98
108
  String.raw`(?:labels\[\]=|--add-label[= ]'?)${NEEDS_DECISION_LABEL}\b`,
99
109
  'u',
100
110
  )
111
+ const PARK_COMMANDS: ReadonlySet<string> = new Set(['run:park'])
112
+ const CLEAR_FLAG = /(?:^|\s)--clear\b/u
113
+
114
+ function is_park_command(segment: string): boolean {
115
+ return shell_segments.is_josh_command(segment, PARK_COMMANDS) && !CLEAR_FLAG.test(segment)
116
+ }
101
117
 
102
118
  function records_the_park(command: string): boolean {
103
- return APPLIES_NEEDS_DECISION.test(command)
119
+ if (APPLIES_NEEDS_DECISION.test(command)) return true
120
+
121
+ return shell_segments.segments_of(command).some((segment) => is_park_command(segment))
104
122
  }
105
123
 
106
124
  // The instruction in the shape a refusal can carry: what the stop must leave behind, how to record it,
@@ -109,24 +127,27 @@ function records_the_park(command: string): boolean {
109
127
  // clone `CLAUDE.md` prohibits.
110
128
  const LANE_PARK_REASON =
111
129
  '⛔ lane child park: this session is a dispatched lane child, so a stop for a person parks first: ' +
112
- "`gh api repos/{owner}/{repo}/issues/<N>/labels -f 'labels[]=needs-decision'`; " +
113
- '`pnpm josh issue:comment <N> --body-file <path>` (question, options, stash); a ' +
130
+ '`pnpm josh run:park <N> --body-file <path>` (question, options, stash — it applies ' +
131
+ '`needs-decision`); a ' +
114
132
  '`needs-human-review` / `already-done` stop already is. Reissue this notify, once per run ' +
115
133
  '(`.claude/skills/workflow-commands/pre-gate-cut.md`).'
116
134
 
117
- // The row itself, so `delivered-rules.ts` spreads one entry. **Once per run rather than `decide`, and
118
- // no `already_satisfied`.** The stop ends the turn, so it is not the recurring act `decide` is for. It carries no `already_satisfied` because the park it asks for is a GitHub label a
119
- // synchronous guard cannot read, and the transcript-tail alternative would read a child that merely
120
- // *read* `backlogrun-park.md` — whose prose carries the `labels[]=needs-decision` command — as
121
- // compliant and fall silent on a real violation (the header above). `keeps` reads an actual
122
- // label-application `Bash` command, never the tail, so it is not fooled the same way; `reaches` stays
123
- // `is_trigger`, since a compliant run issues the same confirmation notify and belongs in the
124
- // denominator.
135
+ // The row itself, so `delivered-rules.ts` spreads one entry. **Once per run rather than `decide`.** The
136
+ // stop ends the turn, so it is not the recurring act `decide` is for. A parked child is excluded in the
137
+ // trigger itself (`is_unparked_child`), so the park record is the satisfaction and no
138
+ // `already_satisfied` reads the tail. `keeps` reads an actual park `Bash` command, never the tail, so a
139
+ // doc read that quotes one is not mistaken for it.
125
140
  const ROW = {
126
141
  id: 'lane-park',
127
142
  is_trigger: bash_triggers.on_bash_command(is_unparked_stop),
128
143
  reason: LANE_PARK_REASON,
129
144
  keeps: bash_triggers.on_bash_command(records_the_park),
145
+ about: {
146
+ title: 'Lane child park',
147
+ topic: '`.claude/skills/workflow-commands/pre-gate-cut.md`',
148
+ fires: 'a dispatched lane child issuing `pnpm josh notify --task-type confirmation`',
149
+ quiet: 'not a lane child, or not a stop notification',
150
+ },
130
151
  }
131
152
 
132
153
  const lane_park = {
@@ -135,6 +156,7 @@ const lane_park = {
135
156
  ROW,
136
157
  is_confirmation_notify,
137
158
  is_parking_child,
159
+ is_unparked_child,
138
160
  is_unparked_stop,
139
161
  mentions_confirmation_notify,
140
162
  records_the_park,
@@ -24,11 +24,12 @@ import { tail_commands } from './tail-commands'
24
24
  // `josh epic`, named canonically — `shell_segments.is_josh_command` expands an alias before the match.
25
25
  const EPIC_COMMANDS: ReadonlySet<string> = new Set(['epic'])
26
26
  const PROMOTED_ISSUE = /--promote[=\s]+["']?(?<issue>\d+)\b/u
27
- // The issue a label write targets, in the two spellings `lane_park.records_the_park` accepts: the REST
28
- // path `…/issues/<N>/labels` and `gh issue edit <N>`.
27
+ // The issue a label write targets, in the spellings `lane_park.records_the_park` accepts: the REST
28
+ // path `…/issues/<N>/labels`, `gh issue edit <N>` and `josh run:park <N>`.
29
29
  const LABEL_TARGETS: ReadonlyArray<RegExp> = [
30
30
  /\/issues\/(?<issue>\d+)\/labels\b/u,
31
31
  /\bissue\s+edit\s+["']?(?<issue>\d+)\b/u,
32
+ /\brun:park\s+["']?(?<issue>\d+)\b/u,
32
33
  ]
33
34
  // The issue a confirmation notify is about, read off its `--issue-url` the way `stop-rules.ts` spells it.
34
35
  const ISSUE_URL = /--issue-url[=\s]+["']?([^\s"']+)/u
@@ -111,6 +112,13 @@ const ROW = {
111
112
  is_trigger: bash_triggers.on_bash_command(is_candidate),
112
113
  reason: LANE_SPLIT_PARK_REASON,
113
114
  decide,
115
+ about: {
116
+ title: 'A split is not a park',
117
+ topic: '`.claude/skills/workflow-commands/backlogrun-park.md` → "Splitting a child mid-run"',
118
+ fires:
119
+ 'a lane child that promoted its Issue to an epic this run parking it (`needs-decision`, `confirmation` notify). Every occurrence',
120
+ quiet: 'no promotion this run',
121
+ },
114
122
  }
115
123
 
116
124
  const lane_split_park = {
@@ -120,6 +120,13 @@ const ROW = {
120
120
  is_trigger: bash_triggers.on_bash_command(is_switch_away_from_lane),
121
121
  reason: LANE_SWITCH_MAIN_REASON,
122
122
  decide: (): boolean => true,
123
+ about: {
124
+ title: 'Lane child on `git switch main`',
125
+ topic: '`.claude/skills/workflow-commands/backlogrun-lanes.md`',
126
+ fires:
127
+ 'a dispatched lane child switching to the default branch or running `josh main:sync`. Every occurrence',
128
+ quiet: 'not a lane child — `pnpm josh main:merge` brings the default in at the gate',
129
+ },
123
130
  }
124
131
 
125
132
  const lane_switch_main = {