@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
@@ -1,9 +1,11 @@
1
1
  import { hook_decision } from '#scripts/josh/hook-decision'
2
+ import { json_value } from '#scripts/lib/json-value'
2
3
  import { z } from 'zod'
3
4
  import { filing_offer } from './filing-offer'
4
5
  import { issue_citation } from './issue-citation'
5
6
  import { lane_background } from './lane-background'
6
7
  import { reply_language } from './reply-language'
8
+ import { stop_decision, type StopDecision } from './stop-decision'
7
9
 
8
10
  // The stop-time rules, delivered on the `Stop` hook.
9
11
  //
@@ -19,11 +21,14 @@ import { reply_language } from './reply-language'
19
21
  // permission envelope. The stop guard is a second *entry* on the one foundation, exactly as
20
22
  // `pretool-guard` is one — not a second copy of the plumbing.
21
23
  //
22
- // **Every rule refuses**. Missing the stop notification or leaving a hold
23
- // on a clean tree costs a person a silent wait or a trampled tree; a bare `#N` in the reply reaches
24
- // the person watching but not the model that could fix it, so it too blocks — `{"decision":"block"}`
25
- // is the one channel a `Stop` hook has to the model, and `stop_hook_active` caps a false positive at a
26
- // single wasted turn. The detection is tightened to match (`issue-citation.ts`, `filing-offer.ts`).
24
+ // **A rule whose answer is fixed acts; only a rule that needs judgement refuses** (joshuafolkken/kit#3919).
25
+ // The stop notification, the hold release and the citation lines are each one mechanical operation the
26
+ // hook can run itself, so they come back as `actions` and the stop goes through: a refusal is a whole
27
+ // model turn spent re-reading the context to run a command the hook already knew. `stop-actions.ts`
28
+ // runs them, and only an action that fails falls back to its refusal. The rest — the reply's language,
29
+ // an unattended filing offer, a lane's index request or running task, a headless parent's wait — need
30
+ // the model, so they still block with `{"decision":"block"}`, the one channel a `Stop` hook has to it;
31
+ // `stop_hook_active` caps a false positive at a single wasted turn.
27
32
 
28
33
  const SWITCH_ENV_KEY = 'JOSH_STOP_GUARD'
29
34
  const BLOCK_DECISION = 'block'
@@ -40,14 +45,22 @@ type StopPayload = z.infer<typeof stop_payload_schema>
40
45
 
41
46
  // What one stop looks like to the rules, computed once by the CLI from the payload and the world.
42
47
  interface StopContext {
43
- // The `run:hold` record for this working tree is still in place (`held` or `stale`).
44
- hold_present: boolean
48
+ // The Issue the `run:hold` record for this working tree names (`held` or `stale`) — `new` for an
49
+ // unnumbered entry — or `undefined` when no record is in place.
50
+ hold_issue: string | undefined
51
+ // That record is this session's own run's, or its owner cannot be told (`run-hold-session.ts`). A
52
+ // hold another run took is that run's pause to announce and release, never this session's.
53
+ hold_owned: boolean
54
+ // The person opened this turn with a question: the reply answers someone at the session, not a
55
+ // pause waiting on them (`stop-decision.ts` → `is_question`).
56
+ answers_question: boolean
45
57
  // `git status --porcelain` came back empty.
46
58
  tree_clean: boolean
47
59
  // That record carries a `prrun` stop mark: the run stopped at a green pull
48
60
  // request and keeps the hold over a clean tree on purpose, so a person can look before it merges.
49
61
  prrun_stopped: boolean
50
- // A `confirmation` notify is on this run's transcript tail.
62
+ // A `confirmation` notify is on this run's transcript tail, or the hook's own send is recorded on the
63
+ // hold since the pause began (`run-hold-session.ts` → `is_notified_since`).
51
64
  notified: boolean
52
65
  // The turn's session-facing reply text.
53
66
  message: string
@@ -56,7 +69,8 @@ interface StopContext {
56
69
  // This stop already forced a continuation earlier in the prompt — the loop-breaker Claude Code
57
70
  // documents, so a run that will not comply is not blocked forever.
58
71
  stop_hook_active: boolean
59
- // A pre-gate cut record is in place for this work tree. A dispatched lane child ends its turn at
72
+ // This turn ended at a cut — its record is in place, or this turn relaunched the successor that may
73
+ // already have cleared it (`stop-guard.ts` → `is_cut_stop`). A dispatched lane child ends its turn at
60
74
  // the cut holding the tree by design and hands off to a fresh process (`pre-gate-cut.md`), so that
61
75
  // turn-end is an automatic continuation, not the person-waiting pause the block rules are for.
62
76
  cut_pending: boolean
@@ -90,15 +104,26 @@ interface StopContext {
90
104
  backlog_parent: boolean
91
105
  }
92
106
 
107
+ // The operations the hook runs itself instead of refusing — each carries what it acts on.
108
+ type StopAction =
109
+ | { kind: 'notify'; issue: string; message: string; decision: StopDecision }
110
+ | { kind: 'release'; issue: string }
111
+ | { kind: 'cite'; references: ReadonlyArray<string> }
112
+
113
+ // `reason` refuses the stop; otherwise `actions` run, and `blocks_on_failure` says whether a failed one
114
+ // falls back to its refusal — never past the loop-breaker.
93
115
  interface StopOutcome {
94
116
  reason: string | undefined
117
+ actions: ReadonlyArray<StopAction>
118
+ blocks_on_failure: boolean
95
119
  }
96
120
 
97
- const NO_OUTCOME: StopOutcome = { reason: undefined }
121
+ const NO_OUTCOME: StopOutcome = { reason: undefined, actions: [], blocks_on_failure: false }
98
122
 
99
123
  // **A mid-workflow stop is announced off-screen before it happens.** `CLAUDE.md` → "Mid-workflow stop
100
124
  // notification" requires the `confirmation` Telegram before any pause; the hold is what says a run is
101
- // mid-workflow, and the transcript is what says the notify was sent.
125
+ // mid-workflow, and the transcript is what says the notify was sent. The hook sends it; this reason is
126
+ // only the fallback for a send that failed.
102
127
  const STOP_NOTIFY_REASON =
103
128
  '⛔ mid-workflow stop notification: this working tree is still held by a run and no `confirmation` ' +
104
129
  'Telegram was sent this turn. Send ' +
@@ -109,13 +134,14 @@ const STOP_NOTIFY_REASON =
109
134
  // **A clean tree that still holds is a tree the next run will trample.** `working-tree-hold.md`: a stop that
110
135
  // leaves the tree clean releases the hold; a `halfrun` pre-commit stop and a `needs-human-review` stop
111
136
  // keep it because their tree is dirty, which is why this row is silent whenever the tree is not clean.
137
+ // The hook releases it; this reason is only the fallback for a release that failed.
112
138
  const HOLD_RELEASE_REASON =
113
139
  '⛔ working-tree hold not released: this working tree is clean but its `run:hold` record is still in ' +
114
140
  'place. Release it with `pnpm josh run:release <N>` (bare for a `new` entry; ' +
115
141
  '`working-tree-hold.md`), then confirm in one line that it was released — do not repeat your ' +
116
142
  'previous reply.'
117
143
 
118
- // **A refusal that corrects rather than advises**. The bare `#N` is already
144
+ // **The fallback when the hook could not print the citation lines itself**. The bare `#N` is already
119
145
  // on screen and the hook cannot unsay it, so the reason does the one thing that helps the *next* reply:
120
146
  // it names the numbers it detected and hands over the exact `issue:cite` call that prints the
121
147
  // paste-ready lines, then asks for the corrected citation lines alone — not the whole reply reissued.
@@ -144,7 +170,7 @@ function build_citation_reason(references: ReadonlyArray<string>): string {
144
170
  const FILING_OFFER_REASON =
145
171
  '⛔ filing offer: your reply offers to file an Issue instead of filing it, and this run is ' +
146
172
  'unattended — nobody is there to answer. Run ' +
147
- '`pnpm josh issue:file "<title>" --body-file <path> --depth <0|1|2>` (Tier A, ' +
173
+ '`pnpm josh issue:file "<title>" --body-file <path>` (Tier A, ' +
148
174
  '`observation-filing.md`), then end with the one-line citation of what was filed; do not repeat ' +
149
175
  'your previous reply. If it is not worth filing after all, say so in one line instead.'
150
176
 
@@ -246,42 +272,52 @@ function needs_filing(context: StopContext): boolean {
246
272
  //
247
273
  // **A lane handed to the detached ship stands them down too**: the hold now
248
274
  // belongs to the supervisor driving the merge, and the person hears from that supervisor's own notify.
275
+ //
276
+ // **Another run's hold stands them down as well**: the pause and the claim are that run's.
249
277
  function is_held_idle(context: StopContext): boolean {
250
- return context.hold_present && !context.agent_pending && !context.handed_off
278
+ if (context.hold_issue === undefined || !context.hold_owned) return false
279
+
280
+ return !context.agent_pending && !context.handed_off
251
281
  }
252
282
 
283
+ // **A stop that answers the person's question is no pause** (joshuafolkken/kit#3961): they are reading
284
+ // the reply where it was written, whatever the tree's hold says.
253
285
  function needs_notify(context: StopContext): boolean {
254
- return is_held_idle(context) && !context.notified
286
+ return is_held_idle(context) && !context.notified && !context.answers_question
255
287
  }
256
288
 
257
- function needs_release(context: StopContext): boolean {
258
- return is_held_idle(context) && context.tree_clean && !context.prrun_stopped
289
+ // The notify a stop owes but cannot send: its reply names no decision to announce.
290
+ function needs_decision(context: StopContext): boolean {
291
+ return needs_notify(context) && stop_decision.decision_of(context.message) === undefined
259
292
  }
260
293
 
261
- function citation_reason(context: StopContext): string | undefined {
262
- const references = issue_citation.unquoted_references(context.message, context.prompt)
263
- if (references.length === 0) return undefined
264
-
265
- return build_citation_reason(references)
294
+ function needs_release(context: StopContext): boolean {
295
+ return is_held_idle(context) && context.tree_clean && !context.prrun_stopped
266
296
  }
267
297
 
268
- // The two rules on how a reply is written. **A headless agent's reply has no reader**:
269
- // its text lands in a stream-json log, so correcting its citations or its
270
- // language costs a turn and reaches nobody. The artifacts a person does read — a Telegram, an Issue, a
271
- // pull request — are held to the same rules by their own guards, not here.
272
- function wording_reason(context: StopContext): string | undefined {
273
- if (context.headless_agent) return undefined
298
+ // The bare references the citation lines are printed for. **A headless agent's reply has no reader**:
299
+ // its text lands in a stream-json log, so correcting its citations or its language costs a turn and
300
+ // reaches nobody. The artifacts a person does read — a Telegram, an Issue, a pull request — are held
301
+ // to the same rules by their own guards, not here.
302
+ function bare_references(context: StopContext): ReadonlyArray<string> {
303
+ if (context.headless_agent) return []
274
304
 
275
- return citation_reason(context) ?? language_reason(context)
305
+ return issue_citation.unquoted_references(context.message, context.prompt)
276
306
  }
277
307
 
278
- // The three rules that read the reply itself, filing offer first and the language last. A drifted reply
308
+ // The two rules that read the reply and need the model, the filing offer first. A drifted reply
279
309
  // refused for another reason is not rewritten, but the drift still ends: `block_envelope` appends the
280
310
  // session-language note to every refusal, so the turn it continues is written in the session language.
281
311
  function reply_reason(context: StopContext): string | undefined {
282
312
  if (needs_filing(context)) return FILING_OFFER_REASON
313
+ if (context.headless_agent) return undefined
283
314
 
284
- return wording_reason(context)
315
+ return language_reason(context)
316
+ }
317
+
318
+ // Sent back once; past the loop-breaker the run has said nothing is awaited, and nothing is sent.
319
+ function decision_reason(context: StopContext): string | undefined {
320
+ return needs_decision(context) ? stop_decision.DECISION_REASON : undefined
285
321
  }
286
322
 
287
323
  // The headless wait holds past the loop-breaker until the spin bound is reached.
@@ -306,24 +342,56 @@ function needs_background_wait(context: StopContext): boolean {
306
342
  return context.lane_child && context.background_pending
307
343
  }
308
344
 
309
- // The two hold rules, notify ahead of release — behind the lane index route
310
- // and the lane background wait, since the notify they would ask for announces
311
- // a pause the run has no reason to take.
312
- function hold_reason(context: StopContext): string | undefined {
345
+ // The two lane rules that mean the run is not pausing at all — ahead of every action, since the notify
346
+ // would announce a pause the run has no reason to take.
347
+ function lane_reason(context: StopContext): string | undefined {
313
348
  if (needs_index_route(context)) return LANE_INDEX_REASON
314
349
  if (needs_background_wait(context)) return lane_background.LANE_BACKGROUND_STOP_REASON
315
- if (needs_notify(context)) return STOP_NOTIFY_REASON
316
- if (needs_release(context)) return HOLD_RELEASE_REASON
317
350
 
318
351
  return undefined
319
352
  }
320
353
 
321
- // First-wins across every rule. Two things stand every rule down: `stop_hook_active` (the
322
- // loop-breaker, so a run that already got one continuation this prompt may stop) and a pre-gate cut in
323
- // flight (a lane child's automatic turn-end, not a person-waiting pause). The two hold rules keep their
324
- // order ahead of the reply rules, so a stop that both still owes its notify and holds a bare `#N` still
325
- // reports the notify first; the filing offer goes ahead of the citation, since the filing it forces
326
- // produces the citation the reply then needs.
354
+ // The refusals that need the model: the lane rules alone, else the reply's own and the decision
355
+ // together. **Joined, since the loop-breaker grants one continuation**: a decision refusal queued behind
356
+ // a language or filing refusal would never be sent, and its stop would pass with no notify.
357
+ function model_reason(context: StopContext): string | undefined {
358
+ const lane = lane_reason(context)
359
+ if (lane !== undefined) return lane
360
+
361
+ const reasons = [reply_reason(context), decision_reason(context)].filter(
362
+ (reason) => reason !== undefined,
363
+ )
364
+
365
+ return reasons.length === 0 ? undefined : reasons.join('\n\n')
366
+ }
367
+
368
+ // The notify carries the reply's own decision; a reply with none sends nothing (`needs_decision`).
369
+ function notify_actions(context: StopContext, issue: string): Array<StopAction> {
370
+ const decision = stop_decision.decision_of(context.message)
371
+ if (decision === undefined || !needs_notify(context)) return []
372
+
373
+ return [{ kind: 'notify', issue, message: context.message, decision }]
374
+ }
375
+
376
+ function hold_actions(context: StopContext): Array<StopAction> {
377
+ const issue = context.hold_issue
378
+ if (issue === undefined) return []
379
+
380
+ const notify = notify_actions(context, issue)
381
+
382
+ return needs_release(context) ? [...notify, { kind: 'release', issue }] : notify
383
+ }
384
+
385
+ // The actions in the order they run: the notify ahead of the release that ends the hold it reports.
386
+ function stop_actions(context: StopContext): ReadonlyArray<StopAction> {
387
+ const references = bare_references(context)
388
+ const cite: Array<StopAction> = references.length > 0 ? [{ kind: 'cite', references }] : []
389
+
390
+ return [...hold_actions(context), ...cite]
391
+ }
392
+
393
+ // First-wins across the refusals. `stop_hook_active` is the loop-breaker, so a run that already got one
394
+ // continuation this prompt may stop; the lane rules go first, then the filing offer, then the language.
327
395
  //
328
396
  // **The headless wait comes first and outlasts `stop_hook_active` up to its spin bound**.
329
397
  // The loop-breaker exists so a person is not wedged behind a rule the run will not satisfy; a headless
@@ -334,24 +402,53 @@ function block_reason(context: StopContext): string | undefined {
334
402
  if (is_headless_held(context)) return HEADLESS_WAIT_REASON
335
403
  if (context.stop_hook_active || context.cut_pending) return undefined
336
404
 
337
- return hold_reason(context) ?? reply_reason(context)
405
+ return model_reason(context)
406
+ }
407
+
408
+ // **The actions run only on the stop that goes through**, so a refused stop never notifies a pause its
409
+ // continuation then cancels, while the continuation's own stop, past the loop-breaker, still runs them
410
+ // and a failure there no longer refuses. A lane child still waiting on its own work runs none, and a
411
+ // pre-gate cut in flight stands everything but the headless wait down: it is a lane child's automatic
412
+ // turn-end, not a person-waiting pause.
413
+ function runs_actions(context: StopContext, reason: string | undefined): boolean {
414
+ return reason === undefined && !context.cut_pending && lane_reason(context) === undefined
338
415
  }
339
416
 
340
417
  function stop_outcome(context: StopContext): StopOutcome {
341
- return { reason: block_reason(context) }
418
+ const reason = block_reason(context)
419
+ if (!runs_actions(context, reason)) return { ...NO_OUTCOME, reason }
420
+
421
+ const actions = stop_actions(context)
422
+ if (actions.length === 0) return NO_OUTCOME
423
+
424
+ return { reason, actions, blocks_on_failure: !context.stop_hook_active }
425
+ }
426
+
427
+ // The refusal an action falls back to when the hook could not run it.
428
+ function fallback_reason(action: StopAction): string {
429
+ if (action.kind === 'notify') return STOP_NOTIFY_REASON
430
+ if (action.kind === 'release') return HOLD_RELEASE_REASON
431
+
432
+ return build_citation_reason(action.references)
342
433
  }
343
434
 
344
435
  // The documented shape a `Stop` hook blocks with: `reason` is fed back to Claude, which then continues
345
436
  // instead of stopping. Plain stdout is not it — only this envelope holds the stop. Every reason leaves
346
437
  // with the session-language note, so no rule can hand the model an English-only turn.
347
- function block_envelope(reason: string, lang: string): string {
348
- return JSON.stringify({ decision: BLOCK_DECISION, reason: `${reason} ${language_note(lang)}` })
438
+ // `notice` is what the hook already did on this stop, shown to the person alongside.
439
+ function block_envelope(reason: string, lang: string, notice?: string): string {
440
+ const refusal = { decision: BLOCK_DECISION, reason: `${reason} ${language_note(lang)}` }
441
+
442
+ return JSON.stringify(notice === undefined ? refusal : { ...refusal, systemMessage: notice })
349
443
  }
350
444
 
351
- function parse_stop_payload(raw_payload: string): StopPayload | undefined {
352
- const parsed = stop_payload_schema.safeParse(JSON.parse(raw_payload))
445
+ // The shape a `Stop` hook shows the person a line in without holding the stop: `systemMessage` alone.
446
+ function notice_envelope(notice: string): string {
447
+ return JSON.stringify({ systemMessage: notice })
448
+ }
353
449
 
354
- return parsed.success ? parsed.data : undefined
450
+ function parse_stop_payload(raw_payload: string): StopPayload | undefined {
451
+ return json_value.parse_with(raw_payload, stop_payload_schema)
355
452
  }
356
453
 
357
454
  function is_enabled(): boolean {
@@ -371,10 +468,12 @@ const stop_rules = {
371
468
  block_envelope,
372
469
  build_language_reason,
373
470
  count_headless_refusals,
471
+ fallback_reason,
374
472
  is_enabled,
473
+ notice_envelope,
375
474
  parse_stop_payload,
376
475
  stop_outcome,
377
476
  }
378
477
 
379
- export type { StopContext, StopOutcome }
478
+ export type { StopAction, StopContext, StopOutcome }
380
479
  export { stop_rules }
@@ -30,6 +30,20 @@ function prior_bash_commands(tail: string): ReadonlyArray<string> {
30
30
  return tail.split('\n').flatMap((line) => bash_commands_of(line))
31
31
  }
32
32
 
33
- const tail_commands = { is_bash_use, prior_bash_commands }
33
+ // **Whether a call `is_call` names answered with the `token` line** — the call and its own result
34
+ // paired off parsed blocks, so a transcript that merely quotes the command or the token does not
35
+ // count. An unreadable text reads as no answer.
36
+ function answered(text: string, is_call: (command: string) => boolean, token: string): boolean {
37
+ const blocks = time_transcript_line.parse_text(text).flatMap((line) => line.blocks)
38
+ const call_ids = new Set(
39
+ blocks
40
+ .filter((block) => is_call(time_shell.bash_command(block.input)))
41
+ .map((block) => block.id),
42
+ )
43
+
44
+ return blocks.some((block) => call_ids.has(block.result_id) && block.token_lines.includes(token))
45
+ }
46
+
47
+ const tail_commands = { answered, is_bash_use, prior_bash_commands }
34
48
 
35
49
  export { tail_commands }
@@ -38,7 +38,17 @@ const REASON =
38
38
  // The enumeration row itself, so `delivered-rules.ts` spreads one entry rather than restating the
39
39
  // trigger and reason it already single-sources here. Once per run (the default delivery) for the
40
40
  // reason above.
41
- const ROW = { id: 'test-declared', is_trigger: is_untested_commit, reason: REASON }
41
+ const ROW = {
42
+ id: 'test-declared',
43
+ is_trigger: is_untested_commit,
44
+ reason: REASON,
45
+ about: {
46
+ title: 'Test declaration',
47
+ topic: '`CLAUDE.md` → Code Change Rules',
48
+ fires: '`pnpm josh git -y` (`josh g`) while `pnpm josh test:declared` answers `required`',
49
+ quiet: '`exempt` (non-runtime only) or `satisfied` (tests included)',
50
+ },
51
+ }
42
52
 
43
53
  const test_declared_commit = { REASON, ROW }
44
54
 
@@ -117,6 +117,13 @@ const ROW = {
117
117
  is_trigger: bash_triggers.on_bash_command((command: string) => writes_third_party(command)),
118
118
  reason: THIRD_PARTY_WRITE_REASON,
119
119
  decide: (): boolean => true,
120
+ about: {
121
+ title: 'Third-party write',
122
+ topic: '`upstream-interrupt.md`',
123
+ fires:
124
+ 'a `gh api` write (field flag or a write method) to a repository whose owner is not this session. Every occurrence',
125
+ quiet: 'a read, or a first-party owner (`pnpm josh repo:party`)',
126
+ },
120
127
  }
121
128
 
122
129
  const third_party_write = {
@@ -0,0 +1,69 @@
1
+ import { bash_triggers } from './bash-triggers'
2
+ import { shell_segments } from './shell-segments'
3
+
4
+ // The trigger and the delivered text behind the `timed-rerun` row of `delivered-rules.ts`
5
+ // (joshuafolkken/kit#4356). A lane agent timed a whole-tree `eslint` twice to learn what CI already
6
+ // records, and each run took about 1.3 cores for seven minutes outside the core budget.
7
+ //
8
+ // **The timer is the trigger, not the tool.** What a run is after when it prefixes `time` or reaches
9
+ // for `hyperfine` is a duration, and a duration of CI or of the gate is already on record — the Actions
10
+ // jobs and the lane ledger. The tool under the timer can be anything, so reading the timer is the one
11
+ // trigger that does not have to enumerate them.
12
+ //
13
+ // **Once per run.** The rule allows one re-run when the record cannot answer, so the reissue goes
14
+ // through. On that reissue `lane-direct-tool` still refuses a lane child's `time`-prefixed heavy tool
15
+ // (`git_argv` skips the timer) and points it at `pnpm josh reserved-run`, the overlap
16
+ // `delivered-rules.ts` admits. A `hyperfine "<command>"` carries the tool inside a quoted argument,
17
+ // which `lane-direct-tool` does not read, so in a lane that reissue is not budgeted.
18
+
19
+ // A segment that opens with a timer, behind any environment assignments: `time`, `/usr/bin/time -p`
20
+ // and `hyperfine`. Anchored at the segment start, so a quoted mention or an argument is not a timer.
21
+ const TIMED_SEGMENT = /^\s*(?:[A-Za-z_]\w*=\S*\s+)*(?:\S*\/)?(?:time|hyperfine)\s/u
22
+
23
+ function is_timed_run(command: string): boolean {
24
+ return shell_segments
25
+ .quote_aware_commands_of(command)
26
+ .some((segment) => TIMED_SEGMENT.test(segment))
27
+ }
28
+
29
+ // Reading the record: an Actions run or job listing, or the lane ledger's gate timings.
30
+ const RECORD_READ = /\bgh\s+api\b.*\/actions\/runs\b|\bjosh\s+(?:lane:stats|lst)\b/u
31
+
32
+ function reads_the_record(command: string): boolean {
33
+ return RECORD_READ.test(command)
34
+ }
35
+
36
+ function measures_duration(command: string): boolean {
37
+ return reads_the_record(command) || is_timed_run(command)
38
+ }
39
+
40
+ const TIMED_RERUN_REASON =
41
+ '⛔ timed re-run: a CI or gate duration is already on record — read the Actions jobs with ' +
42
+ '`gh api …/actions/runs/<run_id>/jobs` or the gate timings with `pnpm josh lane:stats`. Re-run ' +
43
+ 'only when the record cannot answer: reissue the same command once, and post the result on the ' +
44
+ 'Issue (`prompts/collaboration-workflow/measurement.md`).'
45
+
46
+ // The row itself, so `delivered-rules.ts` spreads one entry; once per run, so the one allowed re-run
47
+ // goes through on the reissue.
48
+ const ROW = {
49
+ id: 'timed-rerun',
50
+ is_trigger: bash_triggers.on_bash_command(is_timed_run),
51
+ reason: TIMED_RERUN_REASON,
52
+ keeps: bash_triggers.on_bash_command(reads_the_record),
53
+ reaches: bash_triggers.on_bash_command(measures_duration),
54
+ about: {
55
+ title: 'Timed re-run',
56
+ topic: '`measurement.md`',
57
+ fires: 'a command timed with `time` / `/usr/bin/time` / `hyperfine`',
58
+ quiet: 'the duration is read from the Actions jobs or `pnpm josh lane:stats`',
59
+ },
60
+ }
61
+
62
+ const timed_rerun = {
63
+ ROW,
64
+ TIMED_RERUN_REASON,
65
+ is_timed_run,
66
+ reads_the_record,
67
+ }
68
+
69
+ export { timed_rerun }
@@ -17,7 +17,9 @@ import { shell_segments } from './shell-segments'
17
17
  // that stash findable and poppable by `pnpm josh stash:pop`, which is the whole of `operating-rules.md`'s
18
18
  // safety argument; the forms it warns against are the *positional/bare* ones. So `git stash push -m`
19
19
  // (with or without `-u`) and the read-only `git stash list` / `show` pass, and everything else — bare
20
- // `git stash`, a message-less push, `pop` / `apply` / `drop` / `save` / `clear` — is refused.
20
+ // `git stash`, a message-less push, `pop` / `apply` / `drop` / `save` / `clear` — is refused. Those
21
+ // flows now push with `pnpm josh stash:push` (joshuafolkken/kit#4131), invisible here; the raw message
22
+ // form still passes for a procedure written before it.
21
23
  //
22
24
  // **The refusal names the way on for a handed-over stash.** joshuafolkken/kit#3630's plan restored a
23
25
  // stash with `git stash apply`, and the lane parked on how to apply it instead of popping by message;
@@ -117,7 +119,7 @@ function is_unauthorized_segment(segment: string): boolean {
117
119
  }
118
120
 
119
121
  function is_unauthorized_worktree_change(command: string): boolean {
120
- return shell_segments.segments_of(command).some((segment) => is_unauthorized_segment(segment))
122
+ return shell_segments.commands_of(command).some((segment) => is_unauthorized_segment(segment))
121
123
  }
122
124
 
123
125
  // The instruction in the shape a refusal can carry: what the command touches, the authorized route,
@@ -125,7 +127,7 @@ function is_unauthorized_worktree_change(command: string): boolean {
125
127
  // invisible to this trigger, so a run that uses them is never refused.
126
128
  const WORKTREE_MUTATION_REASON =
127
129
  '⛔ unauthorized working-tree change: `git checkout --`, `git restore`, `git clean -f`, ' +
128
- '`git stash`. A documented flow stashes with `git stash push -u -m "<message>"`; a handed-over ' +
130
+ '`git stash`. A documented flow stashes with `pnpm josh stash:push "<message>"`; a handed-over ' +
129
131
  'stash is `pnpm josh stash:pop "<message>"`; record the substitution on the Issue (Tier A) unless ' +
130
132
  'the plan says why the owner keeps the stash: then stop and confirm. It fires on every occurrence ' +
131
133
  '(`operating-rules.md`).'
@@ -135,6 +137,14 @@ const ROW = {
135
137
  is_trigger: bash_triggers.on_bash_command(is_unauthorized_worktree_change),
136
138
  reason: WORKTREE_MUTATION_REASON,
137
139
  decide: (): boolean => true,
140
+ about: {
141
+ title: 'Unauthorized work-tree mutation',
142
+ topic: '`operating-rules.md`',
143
+ fires:
144
+ '`git checkout -- <path>` / `git restore <path>` / forced `git clean -f` / an unauthorized `git stash` (bare, push without a message, positional pop). Every occurrence',
145
+ quiet:
146
+ '`git stash push -m`, `git stash list`, `pnpm josh git`, `pnpm josh stash:push`, `pnpm josh stash:pop`',
147
+ },
138
148
  }
139
149
 
140
150
  const worktree_guard = {
@@ -0,0 +1,23 @@
1
+ import path from 'node:path'
2
+
3
+ // The name an app is drawn under on `run:board`'s 💻 processes section, computed from its command.
4
+ // `run-board-process-groups.ts` remembers each command's answer, so a redraw names only the processes
5
+ // new since the last one (joshuafolkken/kit#4263).
6
+
7
+ const APP_SUFFIX = '.app'
8
+ const COMMAND_SEPARATOR = ' '
9
+
10
+ // An app's name: the outermost `.app` bundle its executable sits in, else its command's own name.
11
+ function app_of(command: string): string {
12
+ const bundle = command.split(path.sep).find((part) => part.endsWith(APP_SUFFIX))
13
+
14
+ if (bundle !== undefined) return bundle.slice(0, -APP_SUFFIX.length)
15
+
16
+ const executable = command.startsWith(path.sep) ? command : command.split(COMMAND_SEPARATOR)[0]
17
+
18
+ return path.basename(executable ?? command)
19
+ }
20
+
21
+ const run_board_app_name = { app_of }
22
+
23
+ export { run_board_app_name }