@joshuafolkken/kit 1.1514.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 (858) hide show
  1. package/.claude/agents/investigator.md +1 -1
  2. package/.claude/settings.json +5 -5
  3. package/.claude/skills/epic-commands/SKILL.md +26 -65
  4. package/.claude/skills/epic-commands/epic-bundle.md +3 -1
  5. package/.claude/skills/workflow-commands/SKILL.md +5 -5
  6. package/.claude/skills/workflow-commands/background-commands.md +5 -5
  7. package/.claude/skills/workflow-commands/backlogrun-child.md +10 -8
  8. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
  9. package/.claude/skills/workflow-commands/backlogrun-lanes.md +17 -13
  10. package/.claude/skills/workflow-commands/backlogrun-park.md +14 -23
  11. package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -2
  12. package/.claude/skills/workflow-commands/backlogrun-recovery.md +5 -5
  13. package/.claude/skills/workflow-commands/backlogrun-steps.md +10 -10
  14. package/.claude/skills/workflow-commands/backlogrun.md +1 -1
  15. package/.claude/skills/workflow-commands/chain-rule.md +13 -7
  16. package/.claude/skills/workflow-commands/delegation.md +6 -5
  17. package/.claude/skills/workflow-commands/entry-sequence.md +9 -9
  18. package/.claude/skills/workflow-commands/followup.md +9 -31
  19. package/.claude/skills/workflow-commands/fullrun-steps.md +36 -45
  20. package/.claude/skills/workflow-commands/fullrun.md +2 -2
  21. package/.claude/skills/workflow-commands/halfrun.md +17 -25
  22. package/.claude/skills/workflow-commands/issue-comments.md +16 -12
  23. package/.claude/skills/workflow-commands/issue-scout.md +2 -2
  24. package/.claude/skills/workflow-commands/kickoff.md +24 -23
  25. package/.claude/skills/workflow-commands/latest-gate.md +7 -12
  26. package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
  27. package/.claude/skills/workflow-commands/observation-filing.md +4 -36
  28. package/.claude/skills/workflow-commands/observation-ledger.md +1 -1
  29. package/.claude/skills/workflow-commands/pre-gate-cut.md +13 -30
  30. package/.claude/skills/workflow-commands/prerequisite.md +10 -16
  31. package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
  32. package/.claude/skills/workflow-commands/prrun.md +3 -7
  33. package/.claude/skills/workflow-commands/retrospective.md +1 -1
  34. package/.claude/skills/workflow-commands/split-assessment.md +13 -1
  35. package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
  36. package/.codex/hooks.json +5 -5
  37. package/.github/actions/setup-node/action.yml +9 -0
  38. package/.github/actions/setup-pnpm/action.yml +1 -1
  39. package/.github/dependabot.yml +16 -0
  40. package/.github/release.yml +0 -2
  41. package/.github/workflows/ci.yml +120 -10
  42. package/.github/workflows/publish.yml +8 -1
  43. package/.github/workflows/sonar-qube.yml +1 -0
  44. package/.prettierignore +2 -0
  45. package/.vscode/tasks.json +1 -2
  46. package/CLAUDE.md +3 -7
  47. package/README.md +4 -2
  48. package/SECURITY.md +1 -1
  49. package/dist/CLAUDE.md +3 -7
  50. package/dist/commands/document-read-cli.js +882 -0
  51. package/dist/commands/{document-section-cli.js → document-section-main.js} +79 -37
  52. package/dist/commands/read-set-cli.js +1867 -0
  53. package/dist/commands/run-prep-main.js +21653 -0
  54. package/dist/commands/run-step-cli.js +23880 -0
  55. package/dist/config-merge/index.js +5 -1
  56. package/dist/hooks/audit-provision.js +20 -35
  57. package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
  58. package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
  59. package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
  60. package/dist/hooks/{chunk-TNUMY6NL.js → chunk-PT5R6UJD.js} +4193 -1900
  61. package/dist/hooks/chunk-TUIFS5E7.js +72 -0
  62. package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
  63. package/dist/hooks/{chunk-APUO6U4J.js → chunk-WR2KQAYZ.js} +1843 -440
  64. package/dist/hooks/{chunk-O6GDRNJB.js → chunk-XGBNSWEI.js} +248 -46
  65. package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
  66. package/dist/hooks/codex-hook-adapter.js +10 -22
  67. package/dist/hooks/format-edited.js +5 -6
  68. package/dist/hooks/inputs.json +443 -317
  69. package/dist/hooks/pretool-guard.js +7 -25
  70. package/dist/hooks/session-lang.js +44 -51
  71. package/dist/hooks/stop-guard.js +7716 -2187
  72. package/dist/josh.js +6002 -3583
  73. package/dist/self-sync-guard/index.js +74 -10
  74. package/dist/version/index.js +115 -406
  75. package/eslint/base.js +1 -1
  76. package/lefthook/base.yml +3 -1
  77. package/package.json +10 -48
  78. package/pnpm-workspace.yaml +4 -2
  79. package/prompts/coding-standards.md +1 -1
  80. package/prompts/collaboration-workflow/file-edits.md +1 -7
  81. package/prompts/collaboration-workflow/issue-citation.md +1 -1
  82. package/prompts/collaboration-workflow/issue-template.md +33 -16
  83. package/prompts/collaboration-workflow/lane-instructions.md +1 -2
  84. package/prompts/collaboration-workflow/measurement.md +37 -0
  85. package/prompts/collaboration-workflow/operating-rules.md +4 -6
  86. package/prompts/collaboration-workflow/output-bounds.md +2 -7
  87. package/prompts/collaboration-workflow/plan-comment.md +3 -42
  88. package/prompts/collaboration-workflow/principles.md +5 -0
  89. package/prompts/collaboration-workflow/report-format.md +31 -60
  90. package/prompts/collaboration-workflow/residency.md +2 -2
  91. package/prompts/collaboration-workflow/shell-body.md +6 -16
  92. package/prompts/collaboration-workflow/turn-batching.md +0 -2
  93. package/prompts/collaboration-workflow/upstream-interrupt.md +14 -4
  94. package/prompts/collaboration-workflow/wip-cap.md +1 -1
  95. package/prompts/collaboration-workflow.md +3 -7
  96. package/prompts/refactoring.md +1 -1
  97. package/prompts/review-rubric.md +1 -2
  98. package/prompts/review.md +41 -21
  99. package/prompts/testing-guide.md +8 -43
  100. package/scripts/agent/agent-event.ts +15 -15
  101. package/scripts/agent/agent-exit-record.ts +13 -1
  102. package/scripts/agent/api-auth.ts +41 -0
  103. package/scripts/agent/api-outage.ts +1 -1
  104. package/scripts/auto-ok/auto-ok-cli.ts +14 -16
  105. package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
  106. package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
  107. package/scripts/auto-ok/auto-ok-judge.ts +13 -2
  108. package/scripts/auto-ok/auto-ok-main.ts +17 -0
  109. package/scripts/backlog/backlog-arrival.ts +14 -3
  110. package/scripts/backlog/backlog-budget-cli.ts +7 -33
  111. package/scripts/backlog/backlog-budget-main.ts +16 -0
  112. package/scripts/backlog/backlog-budget.ts +2 -3
  113. package/scripts/backlog/backlog-defect-priority.ts +4 -3
  114. package/scripts/backlog/backlog-drive-adopt.ts +67 -0
  115. package/scripts/backlog/backlog-drive-args.ts +4 -5
  116. package/scripts/backlog/backlog-drive-cli.ts +113 -28
  117. package/scripts/backlog/backlog-drive-hold.ts +162 -0
  118. package/scripts/backlog/backlog-drive-idle.ts +151 -0
  119. package/scripts/backlog/backlog-drive-judge.ts +25 -0
  120. package/scripts/backlog/backlog-drive-memory.ts +126 -0
  121. package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
  122. package/scripts/backlog/backlog-drive-named.ts +53 -6
  123. package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
  124. package/scripts/backlog/backlog-drive-paused.ts +169 -0
  125. package/scripts/backlog/backlog-drive-restore.ts +30 -7
  126. package/scripts/backlog/backlog-drive-seats.ts +18 -8
  127. package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
  128. package/scripts/backlog/backlog-drive.ts +79 -75
  129. package/scripts/backlog/backlog-next-main.ts +16 -0
  130. package/scripts/backlog/backlog-next-shared.ts +73 -0
  131. package/scripts/backlog/backlog-next.ts +48 -16
  132. package/scripts/backlog/backlog-occupied.ts +52 -39
  133. package/scripts/backlog/backlog-offer-cli.ts +6 -21
  134. package/scripts/backlog/backlog-offer-exclude.ts +15 -0
  135. package/scripts/backlog/backlog-offer-main.ts +12 -0
  136. package/scripts/backlog/backlog-offer.ts +36 -3
  137. package/scripts/backlog/backlog-overlap.ts +22 -4
  138. package/scripts/backlog/backlog-plan-read.ts +6 -2
  139. package/scripts/backlog/backlog-plan.ts +18 -4
  140. package/scripts/backlog/backlog-pool.ts +10 -10
  141. package/scripts/backlog/backlog-rank.ts +10 -2
  142. package/scripts/backlog/backlog-ready.ts +112 -30
  143. package/scripts/backlog/backlog-stalled-detect.ts +109 -36
  144. package/scripts/backlog/backlog-stalled.ts +52 -16
  145. package/scripts/backlog/backlog-wait-cause.ts +86 -0
  146. package/scripts/backlog/backlog-waves.ts +39 -13
  147. package/scripts/backlog/backlogrun-args.ts +19 -7
  148. package/scripts/backlog/backlogrun-cli.ts +19 -5
  149. package/scripts/backlog/backlogrun-launch.ts +6 -0
  150. package/scripts/backlog/backlogrun-restart.ts +97 -0
  151. package/scripts/backlog/backlogrun-stop.ts +79 -7
  152. package/scripts/behavior/behavior-cli.ts +2 -2
  153. package/scripts/behavior/behavior-rules.ts +47 -24
  154. package/scripts/build/build-bin.ts +2 -16
  155. package/scripts/build/build-claude-md.ts +0 -7
  156. package/scripts/build/build-commands.ts +0 -13
  157. package/scripts/build/build-hooks.ts +49 -48
  158. package/scripts/build/hook-bundle-stamp.ts +29 -11
  159. package/scripts/build/local-bin.ts +1 -1
  160. package/scripts/cases/cases-cli.ts +25 -13
  161. package/scripts/cases/cases-interaction-scan.ts +134 -0
  162. package/scripts/cases/cases-interaction.ts +183 -0
  163. package/scripts/cases/cases-logic.ts +39 -6
  164. package/scripts/ci/pr-classification-main.ts +18 -0
  165. package/scripts/ci/pr-classification.ts +10 -17
  166. package/scripts/clone/clone-scan.ts +1 -1
  167. package/scripts/cost-runtime/cost-blocks.ts +22 -37
  168. package/scripts/cost-runtime/cost-cli.ts +31 -14
  169. package/scripts/cost-runtime/cost-main.ts +12 -0
  170. package/scripts/cost-runtime/cost-transcript.ts +1 -0
  171. package/scripts/delegation/delegation-policy.ts +17 -4
  172. package/scripts/delegation/duplicate-read-guard.ts +0 -8
  173. package/scripts/delegation/investigation-guard.ts +0 -8
  174. package/scripts/delegation/investigation-reads.ts +3 -4
  175. package/scripts/dependabot/dependabot-cooldown.ts +194 -0
  176. package/scripts/discovery/repo-discovery.ts +24 -6
  177. package/scripts/doctor/doctor-consumer.ts +2 -5
  178. package/scripts/document/document-byte-budget.ts +8 -6
  179. package/scripts/document/document-scan.ts +1 -1
  180. package/scripts/document/document-section-cli.ts +0 -8
  181. package/scripts/document/document-section-main.ts +12 -0
  182. package/scripts/epic/epic-audit-cli.ts +12 -6
  183. package/scripts/epic/epic-bundle-apply.ts +137 -0
  184. package/scripts/epic/epic-bundle-cli.ts +32 -121
  185. package/scripts/epic/epic-bundle-format.ts +116 -0
  186. package/scripts/epic/epic-bundle-main.ts +17 -0
  187. package/scripts/epic/epic-busy.ts +5 -12
  188. package/scripts/epic/epic-classify.ts +24 -15
  189. package/scripts/epic/epic-cli-argv.ts +31 -0
  190. package/scripts/epic/epic-cli-decide.ts +42 -0
  191. package/scripts/epic/epic-cli.ts +6 -38
  192. package/scripts/epic/epic-close.ts +112 -55
  193. package/scripts/epic/epic-cross-repo.ts +4 -7
  194. package/scripts/epic/epic-decide.ts +119 -0
  195. package/scripts/epic/epic-decision.ts +9 -0
  196. package/scripts/epic/epic-fetch.ts +4 -0
  197. package/scripts/epic/epic-graph.ts +2 -0
  198. package/scripts/epic/epic-issue.ts +5 -1
  199. package/scripts/epic/epic-label-age.ts +1 -1
  200. package/scripts/epic/epic-lane-offer.ts +39 -4
  201. package/scripts/epic/epic-next-main.ts +24 -0
  202. package/scripts/epic/epic-next.ts +6 -24
  203. package/scripts/epic/epic-outside-blocker.ts +6 -2
  204. package/scripts/epic/epic-parse.ts +9 -3
  205. package/scripts/epic/epic-read.ts +1 -0
  206. package/scripts/epic/epic-reconcile.ts +39 -0
  207. package/scripts/epic/epic-run.ts +10 -1
  208. package/scripts/epic/epic-solo.ts +50 -14
  209. package/scripts/epic/epic.ts +41 -7
  210. package/scripts/exports/unused-members-cli.ts +2 -2
  211. package/scripts/followup/followup-checks-event.ts +8 -3
  212. package/scripts/followup/followup-coderabbit-wait.ts +82 -0
  213. package/scripts/followup/followup-review-gates.ts +81 -0
  214. package/scripts/followup/git-followup-stages.ts +13 -3
  215. package/scripts/followup/git-followup-workflow.ts +19 -66
  216. package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
  217. package/scripts/followup/git-pr-followup.ts +36 -8
  218. package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
  219. package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
  220. package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
  221. package/scripts/gate/busy-average.ts +58 -0
  222. package/scripts/gate/check-cpu.ts +60 -0
  223. package/scripts/gate/check-inputs.ts +39 -95
  224. package/scripts/gate/check-reuse.ts +33 -54
  225. package/scripts/gate/command-memory.ts +192 -0
  226. package/scripts/gate/core-admission.ts +218 -28
  227. package/scripts/gate/core-budget-timing.ts +37 -0
  228. package/scripts/gate/core-budget.ts +80 -98
  229. package/scripts/gate/core-wait-record.ts +48 -0
  230. package/scripts/gate/core-wait.ts +37 -5
  231. package/scripts/gate/core-weights.ts +86 -0
  232. package/scripts/gate/free-cores.ts +27 -4
  233. package/scripts/gate/gate-ledger.ts +32 -4
  234. package/scripts/gate/gate-plan.ts +41 -34
  235. package/scripts/gate/gate-report.ts +14 -2
  236. package/scripts/gate/gate-run-steps.ts +53 -8
  237. package/scripts/gate/gate-skip.ts +12 -2
  238. package/scripts/gate/gate-steps.ts +12 -1
  239. package/scripts/gate/input-fingerprint.ts +42 -0
  240. package/scripts/gate/machine-capacity.ts +65 -31
  241. package/scripts/gate/moved-paths.ts +67 -0
  242. package/scripts/gate/project-checks.ts +5 -12
  243. package/scripts/gate/scoped-green.ts +12 -8
  244. package/scripts/gate/since-green.ts +62 -0
  245. package/scripts/gate/toolchain-inputs.ts +115 -0
  246. package/scripts/gate/verification-gate.ts +27 -24
  247. package/scripts/gate/verification-inputs.ts +250 -0
  248. package/scripts/gh/gh-author-association.ts +96 -9
  249. package/scripts/gh/git-ai-review-scan.ts +4 -2
  250. package/scripts/gh/git-gh-api-path.ts +15 -0
  251. package/scripts/gh/git-gh-branch-rules.ts +73 -0
  252. package/scripts/gh/git-gh-conditional.ts +5 -2
  253. package/scripts/gh/git-gh-issue-read.ts +5 -1
  254. package/scripts/gh/git-gh-issue-write.ts +67 -29
  255. package/scripts/gh/git-gh-issue.ts +7 -3
  256. package/scripts/gh/git-gh-poll-read.ts +89 -0
  257. package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
  258. package/scripts/gh/git-gh-pr-rest.ts +1 -1
  259. package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
  260. package/scripts/gh/git-gh-pr.ts +27 -15
  261. package/scripts/gh/git-pr-checks-eval.ts +39 -7
  262. package/scripts/gh/git-pr-checks-parse.ts +39 -9
  263. package/scripts/gh/git-pr-merge-checked.ts +80 -0
  264. package/scripts/git/base-tree.ts +19 -2
  265. package/scripts/git/changed-file-scope.ts +6 -4
  266. package/scripts/git/changed-paths.ts +18 -1
  267. package/scripts/git/git-diff-reads.ts +27 -2
  268. package/scripts/git/git-grep-hits.ts +85 -0
  269. package/scripts/git/git-location-environment.ts +1 -1
  270. package/scripts/git/git-merge-conflicts.ts +83 -0
  271. package/scripts/git/git-preflight.ts +37 -12
  272. package/scripts/git/git-push-transport.ts +1 -2
  273. package/scripts/git/git-schemas.ts +17 -7
  274. package/scripts/git/git-spawn.ts +1 -2
  275. package/scripts/git/git-status.ts +4 -4
  276. package/scripts/git/main-merge-main.ts +12 -0
  277. package/scripts/git/main-merge-regenerate.ts +2 -2
  278. package/scripts/git/main-merge.ts +25 -9
  279. package/scripts/git/main-sync-main.ts +12 -0
  280. package/scripts/git/main-sync.ts +0 -9
  281. package/scripts/git/stash/git-stash.ts +27 -4
  282. package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
  283. package/scripts/git/stash/stash-pop-cli.ts +6 -12
  284. package/scripts/git/stash/stash-pop-main.ts +12 -0
  285. package/scripts/git/stash/stash-push-cli.ts +76 -0
  286. package/scripts/git/stash/stash-push-main.ts +12 -0
  287. package/scripts/hooks/batch-guard.ts +0 -8
  288. package/scripts/hooks/check-commit-message-main.ts +8 -0
  289. package/scripts/hooks/check-commit-message.ts +4 -7
  290. package/scripts/hooks/format-edited-file.ts +8 -24
  291. package/scripts/hooks/pre-commit-lint.ts +30 -3
  292. package/scripts/hooks/pre-push-unit.ts +4 -2
  293. package/scripts/hooks/pretool-guard-cli.ts +1 -8
  294. package/scripts/hooks/pretool-guard.ts +32 -19
  295. package/scripts/hooks/reserved-run.ts +67 -9
  296. package/scripts/hooks/run-hook.sh +13 -4
  297. package/scripts/hooks/shell-rules-notice.ts +37 -0
  298. package/scripts/hooks/stop-actions.ts +2 -21
  299. package/scripts/hooks/stop-guard.ts +13 -9
  300. package/scripts/init/hook-command-rewrite.ts +19 -5
  301. package/scripts/init/hook-launch.ts +15 -17
  302. package/scripts/init/init-actions.ts +0 -6
  303. package/scripts/init/init-ai-copy.ts +10 -36
  304. package/scripts/init/init-bootstrap.ts +9 -8
  305. package/scripts/init/init-dry-run-report.ts +1 -1
  306. package/scripts/init/init-dry-run.ts +1 -1
  307. package/scripts/init/init-file-action.ts +7 -9
  308. package/scripts/init/init-logic-json-merge.ts +2 -2
  309. package/scripts/init/init-logic-migrate.ts +9 -82
  310. package/scripts/init/init-logic.ts +3 -2
  311. package/scripts/init/init-main.ts +12 -0
  312. package/scripts/init/init.ts +5 -12
  313. package/scripts/init/kit-development-versions.ts +3 -7
  314. package/scripts/init/kit-written-paths.ts +2 -2
  315. package/scripts/init/project-profile.ts +5 -4
  316. package/scripts/init/tsconfig-preset-migration.ts +2 -1
  317. package/scripts/init/vscode-tasks.ts +1 -1
  318. package/scripts/issue/defect-origin-cli.ts +106 -0
  319. package/scripts/issue/defect-origin-line.ts +60 -0
  320. package/scripts/issue/defect-origin-main.ts +11 -0
  321. package/scripts/issue/defect-origin.ts +114 -0
  322. package/scripts/issue/defect-rate-cli.ts +34 -78
  323. package/scripts/issue/defect-rate.ts +0 -16
  324. package/scripts/issue/defect-report-cli.ts +128 -0
  325. package/scripts/issue/defect-report-format.ts +56 -0
  326. package/scripts/issue/defect-report-main.ts +11 -0
  327. package/scripts/issue/defect-report.ts +160 -0
  328. package/scripts/issue/expected-effect-lint.ts +1 -0
  329. package/scripts/issue/issue-already-done-cli.ts +62 -0
  330. package/scripts/issue/issue-body-or-comment.ts +40 -0
  331. package/scripts/issue/issue-cite-cli.ts +0 -9
  332. package/scripts/issue/issue-cite-main.ts +12 -0
  333. package/scripts/issue/issue-classification.ts +12 -7
  334. package/scripts/issue/issue-comment-cli.ts +10 -24
  335. package/scripts/issue/issue-comment-main.ts +12 -0
  336. package/scripts/issue/issue-evidence-exit.ts +100 -0
  337. package/scripts/issue/issue-file-cli.ts +29 -7
  338. package/scripts/issue/issue-file.ts +19 -19
  339. package/scripts/issue/issue-fold-cli.ts +2 -11
  340. package/scripts/issue/issue-fold-main.ts +12 -0
  341. package/scripts/issue/issue-labels.ts +81 -90
  342. package/scripts/issue/issue-lint-cli.ts +2 -10
  343. package/scripts/issue/issue-lint-main.ts +12 -0
  344. package/scripts/issue/issue-measured-cli.ts +56 -0
  345. package/scripts/issue/issue-merged.ts +19 -2
  346. package/scripts/issue/issue-not-before-label.ts +135 -0
  347. package/scripts/issue/issue-not-before.ts +111 -0
  348. package/scripts/issue/issue-number-shape.ts +15 -1
  349. package/scripts/issue/issue-park.ts +28 -0
  350. package/scripts/issue/issue-plan-cli.ts +151 -0
  351. package/scripts/issue/issue-priority.ts +151 -0
  352. package/scripts/issue/issue-rank.ts +7 -1
  353. package/scripts/issue/issue-read-cli.ts +3 -10
  354. package/scripts/issue/issue-read-main.ts +12 -0
  355. package/scripts/issue/issue-read.ts +29 -5
  356. package/scripts/issue/issue-release-cli.ts +0 -10
  357. package/scripts/issue/issue-release-main.ts +13 -0
  358. package/scripts/issue/issue-release.ts +7 -12
  359. package/scripts/issue/issue-sample-gate.ts +192 -0
  360. package/scripts/issue/issue-sample-source.ts +76 -0
  361. package/scripts/issue/issue-scout-cli.ts +0 -11
  362. package/scripts/issue/issue-scout-main.ts +14 -0
  363. package/scripts/issue/issue-state-cli.ts +0 -10
  364. package/scripts/issue/issue-state-main.ts +12 -0
  365. package/scripts/issue/issue-watch-diff.ts +56 -15
  366. package/scripts/issue/issue-watch.ts +2 -1
  367. package/scripts/issue/issue-wip.ts +2 -7
  368. package/scripts/issue/measure-rerun-cli.ts +13 -8
  369. package/scripts/issue/plan-consumers-cli.ts +39 -0
  370. package/scripts/issue/plan-consumers-main.ts +11 -0
  371. package/scripts/issue/plan-consumers-section.ts +55 -0
  372. package/scripts/issue/plan-consumers.ts +127 -0
  373. package/scripts/josh/agent-session-environment.ts +1 -1
  374. package/scripts/josh/command-usage.ts +15 -43
  375. package/scripts/josh/file-map-stamp.ts +49 -16
  376. package/scripts/josh/hook-decision.ts +32 -20
  377. package/scripts/josh/josh-command-map.ts +4 -1
  378. package/scripts/josh/josh-command-types.ts +12 -6
  379. package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
  380. package/scripts/josh/josh-commands-ai.ts +157 -158
  381. package/scripts/josh/josh-commands-backlog.ts +82 -16
  382. package/scripts/josh/josh-commands-clone.ts +1 -0
  383. package/scripts/josh/josh-commands-development.ts +111 -71
  384. package/scripts/josh/josh-commands-document.ts +43 -1
  385. package/scripts/josh/josh-commands-epic.ts +171 -0
  386. package/scripts/josh/josh-commands-hooks.ts +25 -2
  387. package/scripts/josh/josh-commands-issue-write.ts +181 -0
  388. package/scripts/josh/josh-commands-issue.ts +124 -24
  389. package/scripts/josh/josh-commands-lane.ts +103 -2
  390. package/scripts/josh/josh-commands-lint.ts +19 -8
  391. package/scripts/josh/josh-commands-maintenance.ts +112 -4
  392. package/scripts/josh/josh-commands-pause.ts +29 -0
  393. package/scripts/josh/josh-commands-progress.ts +87 -0
  394. package/scripts/josh/josh-commands-project.ts +138 -9
  395. package/scripts/josh/josh-commands-review.ts +124 -0
  396. package/scripts/josh/josh-commands-run.ts +211 -23
  397. package/scripts/josh/josh-commands-ship.ts +169 -0
  398. package/scripts/josh/josh-commands-split.ts +9 -0
  399. package/scripts/josh/josh-commands-versioning.ts +49 -2
  400. package/scripts/josh/josh-commands-workflow.ts +144 -6
  401. package/scripts/josh/josh-logic.ts +6 -13
  402. package/scripts/josh/package-directory.ts +2 -4
  403. package/scripts/josh/process-identity.ts +13 -4
  404. package/scripts/josh/session-language-cli.ts +4 -8
  405. package/scripts/josh/session-language-main.ts +13 -0
  406. package/scripts/josh/session-language.ts +6 -1
  407. package/scripts/josh/shared-cache.ts +90 -0
  408. package/scripts/josh/stamp-file.ts +9 -15
  409. package/scripts/lane/lane-await.ts +51 -12
  410. package/scripts/lane/lane-cache.ts +5 -30
  411. package/scripts/lane/lane-capacity.ts +14 -23
  412. package/scripts/lane/lane-check-stats.ts +62 -21
  413. package/scripts/lane/lane-child-invocation.ts +8 -0
  414. package/scripts/lane/lane-cli.ts +15 -5
  415. package/scripts/lane/lane-close.ts +86 -18
  416. package/scripts/lane/lane-core-wait-stats.ts +66 -0
  417. package/scripts/lane/lane-dispatch.ts +24 -3
  418. package/scripts/lane/lane-gap-stats.ts +156 -0
  419. package/scripts/lane/lane-handoff.ts +69 -1
  420. package/scripts/lane/lane-held-stats.ts +129 -0
  421. package/scripts/lane/lane-install.ts +4 -11
  422. package/scripts/lane/lane-launch-cli.ts +0 -9
  423. package/scripts/lane/lane-launch-main.ts +12 -0
  424. package/scripts/lane/lane-ledger-schema.ts +266 -0
  425. package/scripts/lane/lane-ledger.ts +92 -123
  426. package/scripts/lane/lane-limit-cli.ts +12 -1
  427. package/scripts/lane/lane-measure-cli.ts +57 -11
  428. package/scripts/lane/lane-open.ts +9 -1
  429. package/scripts/lane/lane-parked.ts +3 -3
  430. package/scripts/lane/lane-pause-cli.ts +130 -0
  431. package/scripts/lane/lane-pause.ts +158 -0
  432. package/scripts/lane/lane-process-table.ts +166 -0
  433. package/scripts/lane/lane-reap-settle.ts +124 -0
  434. package/scripts/lane/lane-reap.ts +50 -15
  435. package/scripts/lane/lane-registry.ts +24 -3
  436. package/scripts/lane/lane-residents.ts +162 -0
  437. package/scripts/lane/lane-restart.ts +22 -2
  438. package/scripts/lane/lane-round-two-stats.ts +49 -0
  439. package/scripts/lane/lane-sampler.ts +4 -0
  440. package/scripts/lane/lane-session-action.ts +19 -5
  441. package/scripts/lane/lane-session-broker.ts +102 -21
  442. package/scripts/lane/lane-snapshot-trace.ts +84 -0
  443. package/scripts/lane/lane-spans.ts +51 -0
  444. package/scripts/lane/lane-spent.ts +6 -3
  445. package/scripts/lane/lane-stage-stats.ts +7 -2
  446. package/scripts/lane/lane-state.ts +302 -0
  447. package/scripts/lane/lane-stats.ts +58 -4
  448. package/scripts/lane/lane-stop-stats.ts +113 -37
  449. package/scripts/lane/lane-test-related-stats.ts +127 -0
  450. package/scripts/lane/lane-transcript-calls.ts +145 -0
  451. package/scripts/lane/lane-transcript-stats.ts +168 -0
  452. package/scripts/lane/lane-vacant.ts +13 -3
  453. package/scripts/lane/lane-withdraw-cli.ts +5 -4
  454. package/scripts/lane/lane-withdraw.ts +50 -49
  455. package/scripts/lane/process-directories.ts +70 -0
  456. package/scripts/lane/process-lane-marks.ts +94 -0
  457. package/scripts/lib/atomic-write.ts +62 -0
  458. package/scripts/lib/buffered-process.ts +12 -5
  459. package/scripts/lib/cli-flags.ts +53 -0
  460. package/scripts/lib/figure-format.ts +63 -0
  461. package/scripts/lib/json-value.ts +9 -1
  462. package/scripts/lib/package-manifest.ts +35 -0
  463. package/scripts/lib/read-file.ts +3 -1
  464. package/scripts/lib/stamped-memo.ts +63 -0
  465. package/scripts/lib/stdout-on-stderr.ts +24 -0
  466. package/scripts/lib/timeouts.ts +9 -0
  467. package/scripts/lib/transcript-record.ts +91 -0
  468. package/scripts/lines/effective-limit.ts +1 -1
  469. package/scripts/lint/eslint-cache-dependencies.ts +145 -0
  470. package/scripts/lint/eslint-daemon.ts +265 -0
  471. package/scripts/lint/format.ts +11 -2
  472. package/scripts/lint/import-graph.ts +279 -0
  473. package/scripts/lint/lint-gate-scope.ts +102 -0
  474. package/scripts/lint/lint-parallel-main.ts +19 -0
  475. package/scripts/lint/lint-parallel.ts +62 -30
  476. package/scripts/lint/lint-related-scope.ts +30 -24
  477. package/scripts/lint/lint-related.ts +38 -6
  478. package/scripts/notify/confirmation-options.ts +1 -2
  479. package/scripts/notify/telegram-notify.ts +20 -20
  480. package/scripts/notify/telegram-test-logic.ts +0 -1
  481. package/scripts/notify/telegram-test-main.ts +8 -0
  482. package/scripts/notify/telegram-test.ts +2 -6
  483. package/scripts/observations/observation-ledger.ts +13 -0
  484. package/scripts/observations/observations-flush-landing.ts +5 -3
  485. package/scripts/observations/observations-flush.ts +6 -1
  486. package/scripts/overrides/overrides-check.ts +2 -5
  487. package/scripts/overrides/overrides-files.ts +2 -1
  488. package/scripts/overrides/overrides-logic.ts +3 -6
  489. package/scripts/package/verify-optional-eslint-install.ts +8 -6
  490. package/scripts/propagate/propagate-publish.ts +2 -7
  491. package/scripts/propagate/propagate-targets.ts +4 -12
  492. package/scripts/refactor/import-graph.ts +9 -7
  493. package/scripts/release/github-release-runs.ts +17 -6
  494. package/scripts/release/release-approval-prune.ts +18 -0
  495. package/scripts/release/release-history.ts +1 -3
  496. package/scripts/release/release-progress.ts +42 -22
  497. package/scripts/release/release-publish-run.ts +39 -0
  498. package/scripts/release/release-publish.ts +6 -6
  499. package/scripts/release/release-scope-cli.ts +0 -10
  500. package/scripts/release/release-scope-main.ts +12 -0
  501. package/scripts/repo/repo-setting.ts +3 -6
  502. package/scripts/repo/required-checks-logic.ts +6 -15
  503. package/scripts/report/report-format-reference.ts +2 -0
  504. package/scripts/report/report-labels.ts +155 -0
  505. package/scripts/report/report-lint-cli.ts +3 -0
  506. package/scripts/report/report-lint.ts +85 -110
  507. package/scripts/report/report-template-cli.ts +59 -0
  508. package/scripts/report/report-template.ts +112 -0
  509. package/scripts/review/acceptance-map.ts +1 -0
  510. package/scripts/review/removed-tests-check.ts +86 -0
  511. package/scripts/review/removed-tests.ts +149 -0
  512. package/scripts/review/review-brief-cli.ts +81 -15
  513. package/scripts/review/review-brief-main.ts +12 -0
  514. package/scripts/review/review-brief.ts +31 -3
  515. package/scripts/review/review-code-tree.ts +10 -6
  516. package/scripts/review/review-comment-round.ts +26 -8
  517. package/scripts/review/review-finding-ledger.ts +30 -15
  518. package/scripts/review/review-interaction.ts +94 -0
  519. package/scripts/review/review-readers-scan.ts +163 -0
  520. package/scripts/review/review-record-cli.ts +69 -30
  521. package/scripts/review/review-record-main.ts +12 -0
  522. package/scripts/review/review-round-one-blobs.ts +221 -0
  523. package/scripts/review/review-round2-cli.ts +49 -12
  524. package/scripts/review/review-round2.ts +80 -12
  525. package/scripts/review/review-stamps.ts +19 -1
  526. package/scripts/review/review-stop-log.ts +96 -0
  527. package/scripts/review/review-stops-cli.ts +85 -0
  528. package/scripts/review/review-tree.ts +6 -17
  529. package/scripts/review/review-untouched-readers.ts +146 -0
  530. package/scripts/review/test-titles.ts +118 -0
  531. package/scripts/rules/agent-model.ts +8 -0
  532. package/scripts/rules/bash-triggers.ts +46 -3
  533. package/scripts/rules/decision-oracle-batch.ts +9 -1
  534. package/scripts/rules/decision-oracle.ts +2 -2
  535. package/scripts/rules/delivered-rules.ts +80 -2
  536. package/scripts/rules/destructive-command.ts +8 -1
  537. package/scripts/rules/direct-filing.ts +10 -2
  538. package/scripts/rules/direct-issue-comment.ts +117 -0
  539. package/scripts/rules/direct-pr-create.ts +69 -3
  540. package/scripts/rules/early-heartbeat.ts +2 -1
  541. package/scripts/rules/file-body.ts +7 -0
  542. package/scripts/rules/filing-cap.ts +7 -0
  543. package/scripts/rules/git-argv.ts +72 -14
  544. package/scripts/rules/git-force.ts +12 -2
  545. package/scripts/rules/guard-remedy.ts +4 -0
  546. package/scripts/rules/implementation-cut-verdict.ts +1 -1
  547. package/scripts/rules/implementation-cut.ts +11 -3
  548. package/scripts/rules/index-guard.ts +8 -1
  549. package/scripts/rules/issue-comments.ts +9 -1
  550. package/scripts/rules/josh-git-bare.ts +7 -0
  551. package/scripts/rules/lane-background.ts +67 -25
  552. package/scripts/rules/lane-carry-conflict.ts +6 -0
  553. package/scripts/rules/lane-direct-tool.ts +74 -0
  554. package/scripts/rules/lane-interactive-ask.ts +9 -2
  555. package/scripts/rules/lane-park.ts +45 -23
  556. package/scripts/rules/lane-split-park.ts +10 -2
  557. package/scripts/rules/lane-switch-main.ts +7 -0
  558. package/scripts/rules/oracle-consulted.ts +10 -0
  559. package/scripts/rules/oracle-firing.ts +1 -0
  560. package/scripts/rules/permission-guards.ts +3 -0
  561. package/scripts/rules/piped-verification.ts +1 -1
  562. package/scripts/rules/poll-loop.ts +7 -0
  563. package/scripts/rules/pr-merge.ts +123 -0
  564. package/scripts/rules/protected-files.ts +32 -5
  565. package/scripts/rules/raw-field-body.ts +6 -0
  566. package/scripts/rules/rule-body-guard.ts +8 -0
  567. package/scripts/rules/rule-list.ts +9 -28
  568. package/scripts/rules/rule-value-cache.ts +4 -9
  569. package/scripts/rules/rule-value-cli.ts +51 -32
  570. package/scripts/rules/rule-value.ts +1 -1
  571. package/scripts/rules/shell-segments.ts +35 -0
  572. package/scripts/rules/stop-rule-rows.ts +64 -0
  573. package/scripts/rules/stop-rules.ts +3 -4
  574. package/scripts/rules/test-declared-commit.ts +11 -1
  575. package/scripts/rules/third-party-write.ts +7 -0
  576. package/scripts/rules/timed-rerun.ts +69 -0
  577. package/scripts/rules/worktree-guard.ts +13 -3
  578. package/scripts/run/board/run-board-app-name.ts +23 -0
  579. package/scripts/run/board/run-board-cli.ts +65 -32
  580. package/scripts/run/board/run-board-earlier.ts +94 -0
  581. package/scripts/run/board/run-board-ending-reason.ts +67 -0
  582. package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
  583. package/scripts/run/board/run-board-estimate.ts +98 -0
  584. package/scripts/run/board/run-board-fit.ts +153 -36
  585. package/scripts/run/board/run-board-fold.ts +123 -0
  586. package/scripts/run/board/run-board-fresh.ts +2 -2
  587. package/scripts/run/board/run-board-gather-live.ts +29 -0
  588. package/scripts/run/board/run-board-gather-thread.ts +189 -0
  589. package/scripts/run/board/run-board-gather-worker.ts +29 -0
  590. package/scripts/run/board/run-board-gather.ts +187 -0
  591. package/scripts/run/board/run-board-github.ts +118 -38
  592. package/scripts/run/board/run-board-header.ts +82 -20
  593. package/scripts/run/board/run-board-keys.ts +58 -0
  594. package/scripts/run/board/run-board-kind.ts +20 -6
  595. package/scripts/run/board/run-board-labels.ts +116 -71
  596. package/scripts/run/board/run-board-lane-state.ts +109 -0
  597. package/scripts/run/board/run-board-lane-time.ts +122 -0
  598. package/scripts/run/board/run-board-layout.ts +239 -60
  599. package/scripts/run/board/run-board-length.ts +52 -0
  600. package/scripts/run/board/run-board-machine.ts +8 -4
  601. package/scripts/run/board/run-board-main.ts +12 -0
  602. package/scripts/run/board/run-board-notes.ts +52 -31
  603. package/scripts/run/board/run-board-now.ts +1 -1
  604. package/scripts/run/board/run-board-operation.ts +15 -33
  605. package/scripts/run/board/run-board-phase.ts +1 -1
  606. package/scripts/run/board/run-board-plan-shared.ts +115 -0
  607. package/scripts/run/board/run-board-plan.ts +55 -3
  608. package/scripts/run/board/run-board-planning.ts +45 -0
  609. package/scripts/run/board/run-board-priority.ts +44 -0
  610. package/scripts/run/board/run-board-process-groups.ts +195 -0
  611. package/scripts/run/board/run-board-read.ts +151 -27
  612. package/scripts/run/board/run-board-reason.ts +235 -51
  613. package/scripts/run/board/run-board-released.ts +35 -0
  614. package/scripts/run/board/run-board-render-checks.ts +39 -5
  615. package/scripts/run/board/run-board-render-condition.ts +96 -0
  616. package/scripts/run/board/run-board-render-drawn.ts +67 -0
  617. package/scripts/run/board/run-board-render-foot.ts +59 -0
  618. package/scripts/run/board/run-board-render-icon.ts +35 -0
  619. package/scripts/run/board/run-board-render-lanes.ts +145 -0
  620. package/scripts/run/board/run-board-render-lead.ts +80 -0
  621. package/scripts/run/board/run-board-render-legend.ts +117 -48
  622. package/scripts/run/board/run-board-render-notes.ts +156 -29
  623. package/scripts/run/board/run-board-render-processes.ts +196 -0
  624. package/scripts/run/board/run-board-render-section.ts +119 -0
  625. package/scripts/run/board/run-board-render-slot.ts +3 -36
  626. package/scripts/run/board/run-board-render-tail.ts +115 -48
  627. package/scripts/run/board/run-board-render-time.ts +56 -0
  628. package/scripts/run/board/run-board-render-title.ts +117 -24
  629. package/scripts/run/board/run-board-render-waits.ts +104 -20
  630. package/scripts/run/board/run-board-render.ts +207 -265
  631. package/scripts/run/board/run-board-roots.ts +54 -0
  632. package/scripts/run/board/run-board-row-yield.ts +9 -4
  633. package/scripts/run/board/run-board-setup.ts +1 -12
  634. package/scripts/run/board/run-board-snapshot.ts +111 -0
  635. package/scripts/run/board/run-board-spin.ts +2 -2
  636. package/scripts/run/board/run-board-state.ts +22 -33
  637. package/scripts/run/board/run-board-status.ts +147 -71
  638. package/scripts/run/board/run-board-thanks-read.ts +2 -2
  639. package/scripts/run/board/run-board-tick.ts +122 -107
  640. package/scripts/run/board/run-board-usage-board.ts +78 -0
  641. package/scripts/run/board/run-board-usage-lanes.ts +113 -0
  642. package/scripts/run/board/run-board-usage-listing.ts +93 -0
  643. package/scripts/run/board/run-board-usage-read.ts +120 -150
  644. package/scripts/run/board/run-board-usage-rusage.ts +19 -7
  645. package/scripts/run/board/run-board-usage-text.ts +139 -51
  646. package/scripts/run/board/run-board-usage-top.ts +102 -0
  647. package/scripts/run/board/run-board-usage.ts +89 -72
  648. package/scripts/run/board/run-board-usual.ts +20 -9
  649. package/scripts/run/carry/run-carry-args.ts +4 -7
  650. package/scripts/run/carry/run-carry-conversation.ts +1 -1
  651. package/scripts/run/carry/run-carry.ts +9 -4
  652. package/scripts/run/cut/run-cut-handoff.ts +2 -2
  653. package/scripts/run/event/run-event-cli.ts +1 -5
  654. package/scripts/run/event/run-event-filed.ts +12 -6
  655. package/scripts/run/event/run-event-follow.ts +2 -3
  656. package/scripts/run/event/run-event-render.ts +6 -10
  657. package/scripts/run/event/run-event-scope.ts +2 -2
  658. package/scripts/run/event/run-event-stream-emit.ts +82 -22
  659. package/scripts/run/event/run-event-stream.ts +34 -8
  660. package/scripts/run/hold/run-hold-adopt.ts +65 -0
  661. package/scripts/run/hold/run-hold-cli.ts +93 -22
  662. package/scripts/run/hold/run-hold-main.ts +12 -0
  663. package/scripts/run/hold/run-hold-member.ts +37 -0
  664. package/scripts/run/hold/run-stop-notify.ts +183 -0
  665. package/scripts/run/merge/run-merge-auth.ts +31 -0
  666. package/scripts/run/merge/run-merge-cli.ts +62 -48
  667. package/scripts/run/merge/run-merge-close.ts +74 -0
  668. package/scripts/run/merge/run-merge-collect.ts +6 -13
  669. package/scripts/run/merge/run-merge-driver.ts +71 -0
  670. package/scripts/run/merge/run-merge-main.ts +12 -0
  671. package/scripts/run/merge/run-merge-outcome.ts +23 -0
  672. package/scripts/run/merge/run-merge-restart.ts +39 -0
  673. package/scripts/run/merge/run-merge-ship.ts +20 -4
  674. package/scripts/run/merge/run-merge-signals.ts +33 -9
  675. package/scripts/run/merge/run-merge-steps.ts +120 -85
  676. package/scripts/run/merge/run-merge.ts +38 -37
  677. package/scripts/run/park/run-park-cli.ts +91 -0
  678. package/scripts/run/park/run-park.ts +88 -0
  679. package/scripts/run/park/run-stalled.ts +68 -0
  680. package/scripts/run/pause/run-pause-cli.ts +73 -0
  681. package/scripts/run/pause/run-pause.ts +251 -0
  682. package/scripts/run/progress/run-progress-cli.ts +4 -12
  683. package/scripts/run/progress/run-progress-clock.ts +1 -1
  684. package/scripts/run/progress/run-progress-config.ts +6 -14
  685. package/scripts/run/progress/run-progress-main.ts +12 -0
  686. package/scripts/run/progress/run-progress.ts +1 -4
  687. package/scripts/run/review/run-review.ts +2 -1
  688. package/scripts/run/run-ending.ts +1 -0
  689. package/scripts/run/run-invocation.ts +5 -6
  690. package/scripts/run/run-liveness-cli.ts +6 -8
  691. package/scripts/run/run-liveness.ts +60 -29
  692. package/scripts/run/run-next.ts +1 -1
  693. package/scripts/run/run-parent-cut-hook.ts +2 -2
  694. package/scripts/run/run-preflight.ts +18 -3
  695. package/scripts/run/run-prep-cli.ts +1 -10
  696. package/scripts/run/run-prep-locate.ts +7 -50
  697. package/scripts/run/run-prep-main.ts +12 -0
  698. package/scripts/run/run-prep.ts +6 -0
  699. package/scripts/run/run-report-cli.ts +101 -13
  700. package/scripts/run/run-report-handoff.ts +114 -0
  701. package/scripts/run/run-step.ts +1 -1
  702. package/scripts/run/run-stranded-detect.ts +13 -0
  703. package/scripts/run/run-watcher-guard-cli.ts +1 -1
  704. package/scripts/run/run-watcher-guard.ts +1 -1
  705. package/scripts/run/ship/run-ship-args.ts +121 -0
  706. package/scripts/run/ship/run-ship-body-draft.ts +110 -0
  707. package/scripts/run/ship/run-ship-cli.ts +63 -140
  708. package/scripts/run/ship/run-ship-detach.ts +19 -8
  709. package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
  710. package/scripts/run/ship/run-ship-next.ts +18 -2
  711. package/scripts/run/ship/run-ship-overlap.ts +42 -5
  712. package/scripts/run/ship/run-ship-place.ts +96 -0
  713. package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
  714. package/scripts/run/ship/run-ship-pre-detach.ts +81 -24
  715. package/scripts/run/ship/run-ship-preflight.ts +137 -32
  716. package/scripts/run/ship/run-ship-probe.ts +11 -3
  717. package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
  718. package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
  719. package/scripts/run/ship/run-ship-return.ts +107 -23
  720. package/scripts/run/ship/run-ship-review-steps.ts +105 -151
  721. package/scripts/run/ship/run-ship-review.ts +73 -6
  722. package/scripts/run/ship/run-ship-reviewer.ts +207 -0
  723. package/scripts/run/ship/run-ship-stage.ts +55 -6
  724. package/scripts/run/ship/run-ship-steps.ts +46 -15
  725. package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
  726. package/scripts/run/ship/run-ship-stop-text.ts +11 -6
  727. package/scripts/run/ship/run-ship-sync.ts +43 -6
  728. package/scripts/run/ship/run-ship.ts +30 -2
  729. package/scripts/run/tidy/run-tidy-cli.ts +0 -4
  730. package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
  731. package/scripts/run/tidy/run-tidy-main.ts +8 -0
  732. package/scripts/run/wake/run-wake-cli.ts +119 -100
  733. package/scripts/run/wake/run-wake-code.ts +83 -0
  734. package/scripts/run/wake/run-wake-driver.ts +19 -8
  735. package/scripts/run/wake/run-wake-loop.ts +34 -3
  736. package/scripts/run/wake/run-wake-main.ts +13 -0
  737. package/scripts/run/wake/run-wake-ports.ts +90 -0
  738. package/scripts/run/wake/run-wake-takeover.ts +66 -0
  739. package/scripts/run/wake/run-wake.ts +2 -1
  740. package/scripts/safe-chain/pack-hook.ts +2 -2
  741. package/scripts/safe-chain/preinstall-command.ts +2 -1
  742. package/scripts/safe-chain/project-config.ts +3 -9
  743. package/scripts/security/security-audit-main.ts +8 -0
  744. package/scripts/security/security-audit-provision-logic.ts +0 -11
  745. package/scripts/security/security-audit-provision-main.ts +12 -0
  746. package/scripts/security/security-audit-provision.ts +11 -26
  747. package/scripts/security/security-audit.ts +6 -7
  748. package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
  749. package/scripts/split/split-assess-cli.ts +2 -2
  750. package/scripts/split/split-assess.ts +15 -0
  751. package/scripts/split/split-measure.ts +65 -0
  752. package/scripts/sync/claude-settings-merge.ts +8 -15
  753. package/scripts/sync/directory-copy-guard.ts +4 -9
  754. package/scripts/sync/file-content.ts +78 -8
  755. package/scripts/sync/sync-ai-files.ts +3 -5
  756. package/scripts/sync/sync-configs.ts +11 -23
  757. package/scripts/sync/sync-hook-safety.ts +4 -10
  758. package/scripts/sync/sync-main.ts +11 -0
  759. package/scripts/sync/sync.ts +25 -37
  760. package/scripts/test/test-declared-changed.ts +2 -2
  761. package/scripts/test/test-declared.ts +1 -1
  762. package/scripts/test/test-e2e-guard.ts +25 -1
  763. package/scripts/test/test-e2e-stamp.ts +38 -0
  764. package/scripts/test/test-pinned-logic.ts +145 -0
  765. package/scripts/test/test-pinned-main.ts +78 -0
  766. package/scripts/test/test-pinned.ts +100 -0
  767. package/scripts/test/test-read-map.ts +264 -0
  768. package/scripts/test/test-read-recording.ts +91 -0
  769. package/scripts/test/test-read-trace.ts +148 -0
  770. package/scripts/test/test-red-main.ts +12 -0
  771. package/scripts/test/test-red.ts +12 -30
  772. package/scripts/test/test-related-main.ts +18 -0
  773. package/scripts/test/test-related-record.ts +119 -0
  774. package/scripts/test/test-related-scope.ts +229 -43
  775. package/scripts/test/test-related.ts +300 -22
  776. package/scripts/test/test-unit-guard-main.ts +15 -0
  777. package/scripts/test/test-unit-guard.ts +42 -24
  778. package/scripts/test/unit-count-file.ts +37 -0
  779. package/scripts/test/unit-run-marker.ts +162 -0
  780. package/scripts/test/unit-setup-files.ts +51 -0
  781. package/scripts/test/unit-worker-share.ts +61 -149
  782. package/scripts/test/whole-suite-files.ts +63 -0
  783. package/scripts/time-runtime/time-background.ts +20 -2
  784. package/scripts/time-runtime/time-bundles.ts +4 -3
  785. package/scripts/time-runtime/time-density-hook.ts +8 -6
  786. package/scripts/time-runtime/time-followup-stage.ts +1 -3
  787. package/scripts/time-runtime/time-format.ts +5 -28
  788. package/scripts/time-runtime/time-markers.ts +10 -1
  789. package/scripts/time-runtime/time-shell.ts +97 -10
  790. package/scripts/time-runtime/time-transcript-line.ts +49 -62
  791. package/scripts/uninstall/uninstall.ts +1 -1
  792. package/scripts/version/bump-version-main.ts +12 -0
  793. package/scripts/version/bump-version.ts +25 -25
  794. package/scripts/version/effective-upstream.ts +6 -12
  795. package/scripts/version/latest-corepack.ts +17 -32
  796. package/scripts/version/latest-if-required-cli.ts +93 -0
  797. package/scripts/version/latest-lane-guard-main.ts +8 -0
  798. package/scripts/version/latest-lane-guard.ts +0 -4
  799. package/scripts/version/latest-scope-cli.ts +0 -9
  800. package/scripts/version/latest-scope-main.ts +12 -0
  801. package/scripts/version/latest-update.ts +5 -5
  802. package/scripts/version/npm-registry.ts +44 -6
  803. package/scripts/version/publishable-range-check.ts +5 -16
  804. package/scripts/version/release-age.ts +1 -1
  805. package/scripts/version/release-hold.ts +1 -1
  806. package/scripts/version/release-window.ts +38 -0
  807. package/scripts/version/running-binary.ts +1 -1
  808. package/scripts/version/safe-chain-version-update.ts +3 -8
  809. package/scripts/version/version-targets.ts +6 -28
  810. package/templates/dependabot.yml +29 -0
  811. package/templates/gitignore +4 -1
  812. package/templates/pnpm-workspace.basic.yaml +1 -1
  813. package/templates/sonar-project.properties +3 -2
  814. package/templates/workflows/ci.yml +12 -4
  815. package/templates/workflows/github-release.yml +4 -0
  816. package/tsconfig.sonar.json +1 -1
  817. package/.ncurc.json +0 -3
  818. package/dist/hooks/batch-guard.js +0 -29
  819. package/dist/hooks/chunk-4KKD2UTK.js +0 -66
  820. package/dist/hooks/chunk-6TS2JD6D.js +0 -237
  821. package/dist/hooks/chunk-7DSBJVFH.js +0 -50
  822. package/dist/hooks/chunk-A65Y4YOR.js +0 -79
  823. package/dist/hooks/chunk-CDY4NFQG.js +0 -15
  824. package/dist/hooks/chunk-EFXE6C37.js +0 -81
  825. package/dist/hooks/chunk-GP4IEC4O.js +0 -20
  826. package/dist/hooks/chunk-JP45SOCJ.js +0 -56
  827. package/dist/hooks/chunk-LAOV7NLM.js +0 -45
  828. package/dist/hooks/chunk-M4HGZV7U.js +0 -83
  829. package/dist/hooks/chunk-PF2NZL2A.js +0 -131
  830. package/dist/hooks/chunk-PTICX4OL.js +0 -358
  831. package/dist/hooks/chunk-RT27QRJW.js +0 -6247
  832. package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
  833. package/dist/hooks/chunk-UPUZF3AN.js +0 -279
  834. package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
  835. package/dist/hooks/duplicate-read-guard.js +0 -30
  836. package/dist/hooks/investigation-guard.js +0 -29
  837. package/scripts/backlog/backlog-stalled-cli.ts +0 -30
  838. package/scripts/cost-runtime/cost-format.ts +0 -29
  839. package/scripts/init/basic-path-migration.ts +0 -24
  840. package/scripts/issue/issue-backlinks-cli.ts +0 -93
  841. package/scripts/josh/josh-commands-guard.ts +0 -38
  842. package/scripts/josh/josh-usage-automation.ts +0 -121
  843. package/scripts/josh/josh-usage-backlog.ts +0 -180
  844. package/scripts/josh/josh-usage-developer.ts +0 -230
  845. package/scripts/josh/josh-usage-hooks.ts +0 -38
  846. package/scripts/josh/josh-usage-issue.ts +0 -205
  847. package/scripts/josh/josh-usage-review.ts +0 -101
  848. package/scripts/josh/josh-usage-run.ts +0 -252
  849. package/scripts/josh/josh-usage-session.ts +0 -238
  850. package/scripts/josh/josh-usage-workflow.ts +0 -212
  851. package/scripts/lint/cross-file-recheck.ts +0 -155
  852. package/scripts/registry-migration/migrate-logic.ts +0 -237
  853. package/scripts/registry-migration/migrate.ts +0 -292
  854. package/scripts/registry-migration/user-npmrc.ts +0 -15
  855. package/scripts/rules/rule-guard.ts +0 -23
  856. package/scripts/rules/rule-registry-rows.ts +0 -292
  857. package/scripts/rules/rule-registry.ts +0 -112
  858. package/scripts/run/run-stranded-cli.ts +0 -27
@@ -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 = {
@@ -55,6 +55,15 @@ function reason_for(oracle: Oracle, firing_point: FiringPoint): string {
55
55
  )
56
56
  }
57
57
 
58
+ // One description for every generated row: the rule is the same act whichever oracle it names.
59
+ const ABOUT: DeliveredRule['about'] = {
60
+ title: 'An act its oracle was not asked about',
61
+ topic: '`decision-oracle.ts`',
62
+ fires:
63
+ 'a `Bash` governed by an oracle that declared a firing point (`pkg:scout` governs `pnpm add`), issued without that `pnpm josh <command>`. Refused until it ran',
64
+ quiet: 'no governed act, or the oracle already ran',
65
+ }
66
+
58
67
  function row_for(oracle: Oracle, firing_point: FiringPoint): DeliveredRule {
59
68
  const names = command_names(oracle)
60
69
 
@@ -65,6 +74,7 @@ function row_for(oracle: Oracle, firing_point: FiringPoint): DeliveredRule {
65
74
  already_satisfied: (tail: string, _call: GuardedCall): boolean =>
66
75
  tail_commands.prior_bash_commands(tail).some((command) => runs_the_oracle(command, names)),
67
76
  keeps: bash_triggers.on_bash_command((command: string) => runs_the_oracle(command, names)),
77
+ about: ABOUT,
68
78
  }
69
79
  }
70
80
 
@@ -90,6 +90,7 @@ const NOT_NAMED: ReadonlyMap<string, string> = new Map([
90
90
  ['run:cut:gate', SELF],
91
91
  ['backlog:budget', READ],
92
92
  ['run:liveness', READ],
93
+ ['stash:push', SELF],
93
94
  ['stash:pop', SELF],
94
95
  ['backlog:next', READ],
95
96
  ['auto-ok:next', READ],
@@ -1,6 +1,7 @@
1
1
  import { destructive_command } from './destructive-command'
2
2
  import { direct_pr_create } from './direct-pr-create'
3
3
  import { index_guard } from './index-guard'
4
+ import { pr_merge } from './pr-merge'
4
5
  import { protected_files } from './protected-files'
5
6
 
6
7
  // The three rows that close the deny-list bypasses, gathered so
@@ -10,11 +11,13 @@ import { protected_files } from './protected-files'
10
11
  // other row's — `git restore` is split with `worktree-mutation` by `--staged` alone. The fourth row,
11
12
  // `direct-pr-create`, closes the same kind of gap for `gh pr create`, which
12
13
  // the deny list never listed: it claims `gh pr create` and a `gh api` write to the pulls collection.
14
+ // The fifth, `pr-merge`, claims a merge in every spelling the `gh pr merge*` glob misses.
13
15
  const ROWS = [
14
16
  index_guard.ROW,
15
17
  destructive_command.ROW,
16
18
  protected_files.ROW,
17
19
  direct_pr_create.ROW,
20
+ pr_merge.ROW,
18
21
  ] as const
19
22
 
20
23
  const permission_guards = { ROWS }
@@ -16,7 +16,7 @@ import { shell_segments } from './shell-segments'
16
16
  // document, prompt and skill in this repository found exactly one piped verification example, and it
17
17
  // was the repository's own explanation of this bug — so there were no examples to rewrite, and the
18
18
  // pipe is invented each time rather than copied. The other candidate, a calling convention, had
19
- // already been rejected in writing by `scripts/time/time-reported-failure.ts`: a convention is obeyed
19
+ // already been rejected in writing by `tools/time/time-reported-failure.ts`: a convention is obeyed
20
20
  // or it is not. `prompts/collaboration-workflow/output-bounds.md` is the single source for the rule.
21
21
  //
22
22
  // It lives beside the enumeration rather than inside it because `delivered-rules.ts` is the list —
@@ -102,6 +102,13 @@ const ROW = {
102
102
  is_trigger: bash_triggers.on_bash_command(is_poll_loop),
103
103
  reason: POLL_LOOP_REASON,
104
104
  decide: (): boolean => true,
105
+ about: {
106
+ title: 'Output poll loop',
107
+ topic: '`.claude/skills/workflow-commands/background-commands.md`',
108
+ fires:
109
+ "a hand-written `while` / `until` wait loop over a command's output, a marker file or a process. Every occurrence",
110
+ quiet: 'the command started with `run_in_background` — its exit ends the wait',
111
+ },
105
112
  }
106
113
 
107
114
  const poll_loop = {
@@ -0,0 +1,123 @@
1
+ import { bash_triggers } from './bash-triggers'
2
+ import { direct_pr_create } from './direct-pr-create'
3
+ import { git_argv } from './git-argv'
4
+ import { shell_segments } from './shell-segments'
5
+
6
+ // The trigger and the delivered text behind the `pr-merge` row of `delivered-rules.ts`: a pull
7
+ // request merged by the agent's own `Bash` call. A merge is Tier C, and the one authorized route is
8
+ // `pnpm josh followup` (and `pnpm josh observations:flush`), which merges inside its own process —
9
+ // the word after the wrapper is `josh`, so neither is claimed here.
10
+ //
11
+ // **The deny list matches globs; this reads the program.** `Bash(gh pr merge*)` and
12
+ // `Bash(gh api *pulls/*/merge*)` miss `curl -X PUT …/pulls/5/merge`, a GraphQL body read from a file
13
+ // (`gh api graphql -F query=@merge.graphql`), and `enablePullRequestAutoMerge`, which merges once
14
+ // the checks pass. A body kept in a file or computed by the shell cannot be read here, so such a
15
+ // GraphQL call is refused whatever it holds — kit's own GitHub calls are REST (`gh-rest.md`).
16
+ //
17
+ // **It fires on every occurrence**, for the reason `git-force.ts` does.
18
+
19
+ const GH_COMMAND = 'gh'
20
+ const CURL_COMMAND = 'curl'
21
+ const PR_GROUP = 'pr'
22
+ const MERGE_ACTION = 'merge'
23
+ const API_SUBCOMMAND = 'api'
24
+ const GRAPHQL_ENDPOINT = 'graphql'
25
+ // The REST merge endpoint, in any spelling of the number (`5`, `$N`, `${PR}`).
26
+ const MERGE_PATH = /pulls\/[^/\s'"]+\/merge(?![\w-])/u
27
+ const MERGE_MUTATIONS = /\b(?:mergePullRequest|enablePullRequestAutoMerge)\b/u
28
+ const GRAPHQL_URL = /\/graphql\b/u
29
+ // A body read from a file or stdin: `@file` / `field=@file` for `gh api -F` and curl's `-d`, a
30
+ // short flag with the value attached (`-d@file`), and the flags that upload a whole file.
31
+ const FILE_BODY_VALUE = /^(?:-[A-Za-z]|[^=\s]*=)?['"]?@/u
32
+ const FILE_BODY_FLAGS: ReadonlySet<string> = new Set(['--input', '-T', '--upload-file'])
33
+ // A body the shell computes (`query="$(cat merge.graphql)"`, backticks) is no more readable here.
34
+ const SUBSTITUTED_BODY = /\$\(|`/u
35
+
36
+ type ApiCall = NonNullable<ReturnType<typeof git_argv.program_of>>
37
+
38
+ // The words that are neither a flag nor a flag's value, with `gh api`'s value-taking flags, so
39
+ // `gh api -X POST graphql` reaches `graphql` as the endpoint.
40
+ function positional_words(args: ReadonlyArray<string>): Array<string> {
41
+ return direct_pr_create.positional_words(args, direct_pr_create.API_VALUE_TAKING_FLAGS)
42
+ }
43
+
44
+ function is_pr_merge_cli_call(args: ReadonlyArray<string>): boolean {
45
+ const [group, action] = positional_words(args)
46
+
47
+ return group === PR_GROUP && action === MERGE_ACTION
48
+ }
49
+
50
+ function is_github_api_call(name: string, args: ReadonlyArray<string>): boolean {
51
+ if (name === CURL_COMMAND) return true
52
+
53
+ return name === GH_COMMAND && positional_words(args)[0] === API_SUBCOMMAND
54
+ }
55
+
56
+ // `gh api` reaches GraphQL through its `graphql` endpoint or, like curl, through the `/graphql` path
57
+ // or URL (`gh api /graphql --input body.json`).
58
+ function is_graphql_call(name: string, args: ReadonlyArray<string>): boolean {
59
+ if (args.some((argument) => GRAPHQL_URL.test(argument))) return true
60
+
61
+ return name === GH_COMMAND && positional_words(args)[1] === GRAPHQL_ENDPOINT
62
+ }
63
+
64
+ function is_unreadable_body(argument: string): boolean {
65
+ if (FILE_BODY_FLAGS.has(argument)) return true
66
+
67
+ return FILE_BODY_VALUE.test(argument) || SUBSTITUTED_BODY.test(argument)
68
+ }
69
+
70
+ // The segment cut ignores quotes, so a multi-line `-f query='mutation {⏎ mergePullRequest…'` leaves
71
+ // the mutation name in a later segment: a GraphQL call's mutation is looked for in the whole line.
72
+ function is_graphql_merge(command: string, name: string, args: ReadonlyArray<string>): boolean {
73
+ if (!is_graphql_call(name, args)) return false
74
+
75
+ return MERGE_MUTATIONS.test(command) || args.some((argument) => is_unreadable_body(argument))
76
+ }
77
+
78
+ function is_api_merge(command: string, segment: string, call: ApiCall): boolean {
79
+ if (MERGE_PATH.test(segment) || MERGE_MUTATIONS.test(segment)) return true
80
+
81
+ return is_graphql_merge(command, call.name, call.args)
82
+ }
83
+
84
+ function is_pr_merge_segment(command: string, segment: string): boolean {
85
+ const call = git_argv.program_of(segment)
86
+
87
+ if (call === undefined) return false
88
+ if (call.name === GH_COMMAND && is_pr_merge_cli_call(call.args)) return true
89
+
90
+ return is_github_api_call(call.name, call.args) && is_api_merge(command, segment, call)
91
+ }
92
+
93
+ function is_pr_merge(command: string): boolean {
94
+ return shell_segments
95
+ .commands_of(command)
96
+ .some((segment) => is_pr_merge_segment(command, segment))
97
+ }
98
+
99
+ const PR_MERGE_REASON =
100
+ '⛔ direct PR merge: `gh pr merge`, a `gh api` / `curl` call to `…/pulls/<N>/merge`, a ' +
101
+ '`mergePullRequest` / `enablePullRequestAutoMerge` mutation, or a GraphQL body read from a file ' +
102
+ 'merges outside the verified route, and a merge is Tier C. Merge with `pnpm josh followup` when the ' +
103
+ 'run authorizes it; otherwise leave it to the user (`CLAUDE.md` → Git Rules). This rule fires on ' +
104
+ 'every occurrence.'
105
+
106
+ const ROW = {
107
+ id: 'pr-merge',
108
+ is_trigger: bash_triggers.on_bash_command(is_pr_merge),
109
+ reason: PR_MERGE_REASON,
110
+ decide: (): boolean => true,
111
+ about: {
112
+ title: 'Direct PR merge',
113
+ topic: '`CLAUDE.md` → Git Rules',
114
+ fires:
115
+ '`gh pr merge`, a `gh api` / `curl` call to `…/pulls/<N>/merge`, a `mergePullRequest` / `enablePullRequestAutoMerge` mutation, or a GraphQL body read from a file. Every occurrence',
116
+ quiet:
117
+ '`pnpm josh followup` and `pnpm josh observations:flush`, which merge in their own process',
118
+ },
119
+ }
120
+
121
+ const pr_merge = { PR_MERGE_REASON, ROW, is_pr_merge }
122
+
123
+ export { pr_merge }