@joshuafolkken/kit 1.1035.0 → 1.1094.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 (605) hide show
  1. package/.claude/settings.json +9 -8
  2. package/.claude/skills/epic-commands/SKILL.md +5 -7
  3. package/.claude/skills/verify-ui/SKILL.md +1 -1
  4. package/.claude/skills/workflow-commands/SKILL.md +21 -13
  5. package/.claude/skills/workflow-commands/background-commands.md +5 -4
  6. package/.claude/skills/workflow-commands/backlogrun-child.md +3 -3
  7. package/.claude/skills/workflow-commands/backlogrun-lanes.md +9 -7
  8. package/.claude/skills/workflow-commands/backlogrun-park.md +6 -0
  9. package/.claude/skills/workflow-commands/backlogrun-progress.md +31 -37
  10. package/.claude/skills/workflow-commands/backlogrun-steps.md +25 -25
  11. package/.claude/skills/workflow-commands/backlogrun.md +2 -2
  12. package/.claude/skills/workflow-commands/chain-rule.md +6 -4
  13. package/.claude/skills/workflow-commands/delegation.md +3 -3
  14. package/.claude/skills/workflow-commands/followup-reference.md +3 -3
  15. package/.claude/skills/workflow-commands/followup.md +7 -3
  16. package/.claude/skills/workflow-commands/fullrun-steps.md +3 -2
  17. package/.claude/skills/workflow-commands/fullrun.md +3 -2
  18. package/.claude/skills/workflow-commands/halfrun.md +16 -19
  19. package/.claude/skills/workflow-commands/issue-comments.md +2 -2
  20. package/.claude/skills/workflow-commands/issue-fold-existing.md +10 -10
  21. package/.claude/skills/workflow-commands/issue-scout.md +1 -1
  22. package/.claude/skills/workflow-commands/kickoff.md +9 -4
  23. package/.claude/skills/workflow-commands/latest-gate.md +1 -1
  24. package/.claude/skills/workflow-commands/needs-human-review.md +1 -1
  25. package/.claude/skills/workflow-commands/observation-filing.md +44 -89
  26. package/.claude/skills/workflow-commands/pre-gate-cut.md +33 -36
  27. package/.claude/skills/workflow-commands/prerequisite.md +1 -1
  28. package/.claude/skills/workflow-commands/prrun.md +36 -0
  29. package/.claude/skills/workflow-commands/retrospective.md +1 -1
  30. package/.claude/skills/workflow-commands/working-tree-hold.md +24 -4
  31. package/.codex/hooks.json +16 -20
  32. package/.github/actions/setup-pnpm/action.yml +93 -0
  33. package/.github/dependabot.yml +5 -1
  34. package/.github/workflows/auto-tag.yml +21 -0
  35. package/.github/workflows/ci.yml +26 -128
  36. package/.github/workflows/pr-classification.yml +5 -41
  37. package/.github/workflows/publish.yml +42 -48
  38. package/.github/workflows/sonar-qube.yml +37 -4
  39. package/AGENTS.md +12 -2
  40. package/CLAUDE.md +15 -16
  41. package/GEMINI.md +14 -2
  42. package/README.md +59 -18
  43. package/SECURITY.md +36 -6
  44. package/cspell/index.yaml +2 -1
  45. package/dist/CLAUDE.md +15 -16
  46. package/dist/config-merge/index.js +15 -3
  47. package/dist/hooks/batch-guard.js +4 -4
  48. package/dist/hooks/{chunk-Y27M6A7X.js → chunk-3C4YCCEF.js} +5 -13
  49. package/dist/hooks/{chunk-D67KVGGY.js → chunk-7ZPFAVR7.js} +17 -88
  50. package/dist/hooks/{chunk-HOYJU5RM.js → chunk-E54KGFEQ.js} +11 -4
  51. package/dist/hooks/{chunk-KG6PZD72.js → chunk-IL27YTPH.js} +2 -2
  52. package/dist/hooks/{chunk-GJT4BNVE.js → chunk-KHWHKJOM.js} +3 -3
  53. package/dist/hooks/{chunk-HU66PWWL.js → chunk-M2XDCUKD.js} +1076 -509
  54. package/dist/hooks/{chunk-GLBDBJOK.js → chunk-NKOG3XAV.js} +199 -304
  55. package/dist/hooks/{chunk-ZXNE6NY3.js → chunk-O4LL4HTI.js} +2 -7
  56. package/dist/hooks/{chunk-XPLP27WA.js → chunk-OIZUHPJI.js} +5 -27
  57. package/dist/hooks/{chunk-EIFCAJRB.js → chunk-UD24EAIL.js} +2546 -1636
  58. package/dist/hooks/codex-hook-adapter.js +10 -11
  59. package/dist/hooks/duplicate-read-guard.js +5 -5
  60. package/dist/hooks/format-edited.js +15 -34
  61. package/dist/hooks/inputs.json +279 -0
  62. package/dist/hooks/investigation-guard.js +5 -5
  63. package/dist/hooks/pretool-guard.js +23 -16
  64. package/dist/hooks/session-lang.js +0 -1
  65. package/dist/hooks/stop-guard.js +188 -509
  66. package/dist/josh.js +166 -225
  67. package/dist/managed-marker/index.js +2 -1
  68. package/dist/version/index.js +412 -64
  69. package/eslint/rules/promise.js +5 -0
  70. package/package.json +13 -8
  71. package/prompts/collaboration-workflow/file-edits.md +6 -53
  72. package/prompts/collaboration-workflow/issue-citation.md +5 -5
  73. package/prompts/collaboration-workflow/operating-rules.md +4 -4
  74. package/prompts/collaboration-workflow/overview.md +13 -1
  75. package/prompts/collaboration-workflow/report-format.md +1 -1
  76. package/prompts/collaboration-workflow/residency.md +4 -4
  77. package/prompts/collaboration-workflow/rule-delivery.md +5 -36
  78. package/prompts/collaboration-workflow/shell-body.md +7 -9
  79. package/prompts/collaboration-workflow/turn-batching.md +21 -37
  80. package/prompts/collaboration-workflow/upstream-interrupt.md +1 -1
  81. package/prompts/collaboration-workflow/wip-cap.md +36 -36
  82. package/prompts/collaboration-workflow.md +5 -8
  83. package/prompts/review-rubric.md +1 -1
  84. package/prompts/review.md +3 -3
  85. package/prompts/sonar-hotspot-handling.md +12 -4
  86. package/prompts/testing-guide.md +3 -3
  87. package/scripts/adopt/adopt-toolkits.ts +2 -2
  88. package/scripts/adopt/adopt.ts +0 -2
  89. package/scripts/agent/agent-argv.ts +0 -2
  90. package/scripts/agent/agent-diagnostics.ts +1 -1
  91. package/scripts/agent/agent-role-profile.ts +0 -7
  92. package/scripts/agent/claude-agent-argv.ts +0 -2
  93. package/scripts/agent/codex-agent-argv.ts +1 -1
  94. package/scripts/agent/codex-hooks.ts +92 -0
  95. package/scripts/agent/interactive-ask.ts +1 -1
  96. package/scripts/auto-ok/auto-ok-cli.ts +15 -25
  97. package/scripts/backlog/backlog-budget.ts +0 -2
  98. package/scripts/backlog/backlog-defect-priority.ts +2 -2
  99. package/scripts/backlog/backlog-drive-cli.ts +10 -8
  100. package/scripts/backlog/backlog-drive-named-offer.ts +16 -3
  101. package/scripts/backlog/backlog-drive-named.ts +2 -1
  102. package/scripts/backlog/backlog-drive.ts +76 -16
  103. package/scripts/backlog/backlog-named.ts +0 -3
  104. package/scripts/backlog/backlog-next.ts +32 -22
  105. package/scripts/backlog/backlog-offer-cli.ts +0 -5
  106. package/scripts/backlog/backlog-plan-cli.ts +6 -8
  107. package/scripts/backlog/backlog-plan.ts +1 -1
  108. package/scripts/backlog/backlog-pool.ts +34 -17
  109. package/scripts/backlog/backlog-rank.ts +106 -0
  110. package/scripts/backlog/backlog-ready.ts +19 -3
  111. package/scripts/backlog/backlog-scope.ts +1 -3
  112. package/scripts/backlog/backlog-stalled-detect.ts +2 -2
  113. package/scripts/backlog/backlog-stalled.ts +0 -1
  114. package/scripts/backlog/backlog-waves.ts +47 -31
  115. package/scripts/behavior/behavior-cli.ts +1 -1
  116. package/scripts/build/build-codex-hooks.ts +26 -0
  117. package/scripts/build/build-hooks.ts +92 -11
  118. package/scripts/build/hook-bundle-stamp.ts +111 -0
  119. package/scripts/cases/cases-cli.ts +1 -1
  120. package/scripts/cases/cases-logic.ts +1 -1
  121. package/scripts/ci/composite-actions.ts +30 -0
  122. package/scripts/ci/pr-classification.ts +3 -3
  123. package/scripts/claude/workflow-destination.ts +10 -1
  124. package/scripts/clone/clone-fingerprint.ts +0 -1
  125. package/scripts/clone/clone-scan-cli.ts +1 -1
  126. package/scripts/clone/clone-scan.ts +1 -1
  127. package/scripts/config-merge/json-format.ts +0 -1
  128. package/scripts/config-merge/patch-yaml-list.ts +1 -1
  129. package/scripts/cost-runtime/codex-usage.ts +2 -9
  130. package/scripts/cost-runtime/cost-attribute.ts +0 -1
  131. package/scripts/cost-runtime/cost-cli.ts +0 -3
  132. package/scripts/cost-runtime/cost-corpus.ts +0 -2
  133. package/scripts/cost-runtime/cost-format.ts +0 -3
  134. package/scripts/cost-runtime/cost-pricing.ts +0 -1
  135. package/scripts/cost-runtime/cost-tokens.ts +0 -1
  136. package/scripts/delegation/delegation-cli.ts +1 -1
  137. package/scripts/delegation/delegation-policy.ts +11 -1
  138. package/scripts/delegation/duplicate-read-guard.ts +0 -8
  139. package/scripts/delegation/fanout-cli.ts +1 -1
  140. package/scripts/delegation/fanout.ts +0 -2
  141. package/scripts/delegation/investigation-reads.ts +1 -164
  142. package/scripts/discovery/repo-map-logic.ts +0 -1
  143. package/scripts/discovery/repo-party-cli.ts +1 -1
  144. package/scripts/doctor/doctor-consumer.ts +4 -6
  145. package/scripts/doctor/doctor-logic.ts +0 -4
  146. package/scripts/doctor/doctor.ts +14 -9
  147. package/scripts/document/document-byte-budget.ts +8 -9
  148. package/scripts/document/document-byte-check.ts +0 -1
  149. package/scripts/document/document-read-cli.ts +0 -2
  150. package/scripts/document/document-section-cli.ts +1 -1
  151. package/scripts/document/document-section.ts +0 -3
  152. package/scripts/document/edit-files-cli.ts +0 -1
  153. package/scripts/document/entry-read-budget.ts +13 -4
  154. package/scripts/document/lane-child-read-set.ts +1 -6
  155. package/scripts/document/read-files-cli.ts +0 -4
  156. package/scripts/document/read-set-cli.ts +0 -2
  157. package/scripts/document/read-set-point-of-use.ts +1 -0
  158. package/scripts/document/read-set-pricing.ts +0 -1
  159. package/scripts/document/read-set-trim.ts +1 -1
  160. package/scripts/epic/epic-add.ts +1 -1
  161. package/scripts/epic/epic-audit-cli.ts +1 -4
  162. package/scripts/epic/epic-audit-orphans.ts +1 -3
  163. package/scripts/epic/epic-audit-rationale.ts +0 -1
  164. package/scripts/epic/epic-audit-report.ts +0 -2
  165. package/scripts/epic/epic-audit.ts +5 -4
  166. package/scripts/epic/epic-bundle-cli.ts +1 -1
  167. package/scripts/epic/epic-bundle-evidence.ts +0 -1
  168. package/scripts/epic/epic-bundle-referenced.ts +1 -5
  169. package/scripts/epic/epic-bundle.ts +0 -4
  170. package/scripts/epic/epic-busy.ts +4 -5
  171. package/scripts/epic/epic-candidate-confirm.ts +0 -5
  172. package/scripts/epic/epic-classify.ts +2 -2
  173. package/scripts/epic/epic-cli-argv.ts +0 -1
  174. package/scripts/epic/epic-close-comment.ts +1 -1
  175. package/scripts/epic/epic-close.ts +5 -2
  176. package/scripts/epic/epic-cross-repo.ts +2 -4
  177. package/scripts/epic/epic-decision.ts +0 -1
  178. package/scripts/epic/epic-fetch.ts +2 -2
  179. package/scripts/epic/epic-index.ts +2 -3
  180. package/scripts/epic/epic-issue.ts +1 -15
  181. package/scripts/epic/epic-lane-offer.ts +20 -30
  182. package/scripts/epic/epic-nested.ts +1 -1
  183. package/scripts/epic/epic-next-read.ts +1 -3
  184. package/scripts/epic/epic-next-views.ts +0 -1
  185. package/scripts/epic/epic-next.ts +1 -10
  186. package/scripts/epic/epic-parse.ts +0 -1
  187. package/scripts/epic/epic-promote.ts +0 -9
  188. package/scripts/epic/epic-rank.ts +37 -0
  189. package/scripts/epic/epic-read.ts +1 -2
  190. package/scripts/epic/epic-reconcile.ts +1 -1
  191. package/scripts/epic/epic-reference.ts +1 -13
  192. package/scripts/epic/epic-relation-recheck.ts +1 -1
  193. package/scripts/epic/epic-relations.ts +1 -1
  194. package/scripts/epic/epic-remove.ts +1 -1
  195. package/scripts/epic/epic-report.ts +0 -1
  196. package/scripts/epic/epic-run.ts +2 -3
  197. package/scripts/epic/epic-shape.ts +1 -1
  198. package/scripts/epic/epic-solo-stale.ts +107 -0
  199. package/scripts/epic/epic-solo.ts +32 -30
  200. package/scripts/epic/epic-triage.ts +1 -1
  201. package/scripts/epic/epic-validate.ts +1 -1
  202. package/scripts/epic/epic.ts +1 -1
  203. package/scripts/exports/unused-members-cli.ts +53 -0
  204. package/scripts/{git → followup}/followup-issue-number.ts +1 -6
  205. package/scripts/{git → followup}/git-followup-cleanup.ts +2 -1
  206. package/scripts/{git → followup}/git-followup-finish.ts +1 -3
  207. package/scripts/{git → followup}/git-followup-flush.ts +2 -2
  208. package/scripts/{git → followup}/git-followup-issue-close.ts +2 -2
  209. package/scripts/{git → followup}/git-followup-label.ts +4 -4
  210. package/scripts/followup/git-followup-merged.ts +112 -0
  211. package/scripts/{git → followup}/git-followup-pending.ts +1 -1
  212. package/scripts/{git → followup}/git-followup-workflow.ts +19 -11
  213. package/scripts/{git → followup}/git-pr-followup-wrapup.ts +9 -3
  214. package/scripts/{git → followup}/git-pr-followup.ts +53 -16
  215. package/scripts/gate/core-budget.ts +3 -9
  216. package/scripts/gate/gate-plan.ts +7 -4
  217. package/scripts/gate/gate-report.ts +0 -6
  218. package/scripts/gate/gate-tree.ts +1 -1
  219. package/scripts/gate/pre-commit-type-check.ts +0 -6
  220. package/scripts/gate/project-checks.ts +7 -8
  221. package/scripts/gate/scoped-green.ts +0 -1
  222. package/scripts/gate/type-check-step.ts +1 -1
  223. package/scripts/gate/verification-gate.ts +0 -2
  224. package/scripts/gh/fix-gh-packages.ts +15 -12
  225. package/scripts/gh/gh-spawn.ts +2 -2
  226. package/scripts/{git → gh}/git-ai-review-scan.ts +1 -5
  227. package/scripts/{git → gh}/git-gh-check.ts +2 -1
  228. package/scripts/{git → gh}/git-gh-exec.ts +1 -1
  229. package/scripts/{git → gh}/git-gh-failure.ts +1 -1
  230. package/scripts/{git → gh}/git-gh-helpers.ts +0 -1
  231. package/scripts/{git → gh}/git-gh-issue-list.ts +2 -0
  232. package/scripts/{git → gh}/git-gh-issue-read.ts +1 -1
  233. package/scripts/{git → gh}/git-gh-issue-rest.ts +6 -3
  234. package/scripts/{git → gh}/git-gh-pr-read.ts +24 -0
  235. package/scripts/{git → gh}/git-gh-pr-rest.ts +5 -2
  236. package/scripts/{git → gh}/git-gh-pr-review.ts +2 -2
  237. package/scripts/{git → gh}/git-gh-pr-rollup.ts +1 -3
  238. package/scripts/{git → gh}/git-gh-pr.ts +3 -1
  239. package/scripts/{git → gh}/git-pr-ai-review.ts +2 -5
  240. package/scripts/{git → gh}/git-pr-checks-eval.ts +0 -10
  241. package/scripts/{git → gh}/git-pr-checks-parse.ts +4 -20
  242. package/scripts/{git → gh}/git-pr-checks.ts +2 -1
  243. package/scripts/{git → gh}/git-pr-coderabbit.ts +2 -5
  244. package/scripts/{git → gh}/git-pr-confirmation.ts +1 -3
  245. package/scripts/{git → gh}/git-pr-managed-config.ts +2 -3
  246. package/scripts/{git → gh}/git-pr.ts +3 -3
  247. package/scripts/git/changed-file-scope.ts +0 -1
  248. package/scripts/git/git-branch.ts +3 -6
  249. package/scripts/git/git-command.ts +1 -1
  250. package/scripts/git/git-commit.ts +1 -1
  251. package/scripts/git/git-common-directory.ts +80 -24
  252. package/scripts/git/git-error.ts +66 -9
  253. package/scripts/git/git-execa-error.ts +6 -1
  254. package/scripts/git/git-issue.ts +1 -1
  255. package/scripts/git/git-preflight.ts +24 -6
  256. package/scripts/git/git-prompt.ts +6 -31
  257. package/scripts/git/git-push-transport.ts +12 -69
  258. package/scripts/git/git-push.ts +1 -1
  259. package/scripts/git/git-spawn.ts +79 -3
  260. package/scripts/git/git-ssh-keepalive.ts +74 -0
  261. package/scripts/git/git-staging.ts +1 -0
  262. package/scripts/git/git-status.ts +1 -1
  263. package/scripts/git/git-workflow.ts +1 -1
  264. package/scripts/git/gone-branch.ts +4 -2
  265. package/scripts/git/listing-cutoff.ts +1 -1
  266. package/scripts/git/main-merge.ts +1 -1
  267. package/scripts/git/main-sync.ts +19 -1
  268. package/scripts/git/parse-json-array.ts +0 -3
  269. package/scripts/git/repository-lock.ts +16 -16
  270. package/scripts/git/{git-stash.ts → stash/git-stash.ts} +1 -1
  271. package/scripts/git/{stash-pop-args.ts → stash/stash-pop-args.ts} +1 -1
  272. package/scripts/git/{stash-pop-cli.ts → stash/stash-pop-cli.ts} +0 -1
  273. package/scripts/git/{stash-sweep-lock.ts → stash/stash-sweep-lock.ts} +3 -3
  274. package/scripts/hooks/codex-hook-adapter.ts +0 -1
  275. package/scripts/hooks/edited-cspell.ts +1 -1
  276. package/scripts/hooks/format-edited-cli.ts +15 -0
  277. package/scripts/hooks/format-edited-file.ts +4 -9
  278. package/scripts/hooks/pre-push-unit.ts +0 -4
  279. package/scripts/hooks/pretool-guard-cli.ts +21 -0
  280. package/scripts/hooks/pretool-guard.ts +36 -19
  281. package/scripts/hooks/reserved-run.ts +1 -1
  282. package/scripts/hooks/step-zero-notice.ts +76 -0
  283. package/scripts/hooks/stop-guard.ts +47 -21
  284. package/scripts/init/claude-plugin-config.ts +4 -5
  285. package/scripts/init/hook-command-rewrite.ts +16 -8
  286. package/scripts/init/hook-launch.ts +41 -15
  287. package/scripts/init/init-basic.ts +2 -5
  288. package/scripts/init/init-logic.ts +7 -0
  289. package/scripts/init/init.ts +0 -3
  290. package/scripts/init/project-profile.ts +6 -11
  291. package/scripts/init/start-exec.ts +8 -2
  292. package/scripts/init/start-plan.ts +18 -5
  293. package/scripts/init/start-setup-pr.ts +52 -25
  294. package/scripts/init/start-steps.ts +42 -9
  295. package/scripts/init/start.ts +40 -10
  296. package/scripts/issue/behavior-change-lint.ts +0 -1
  297. package/scripts/issue/defect-rate-cli.ts +3 -3
  298. package/scripts/issue/defect-rate.ts +1 -2
  299. package/scripts/{git → issue}/git-next-issues.ts +37 -8
  300. package/scripts/issue/issue-backlinks-cli.ts +1 -5
  301. package/scripts/issue/issue-cite-cli.ts +2 -6
  302. package/scripts/issue/issue-cite.ts +19 -3
  303. package/scripts/issue/issue-classification.ts +1 -9
  304. package/scripts/issue/issue-closing-pr.ts +4 -4
  305. package/scripts/issue/issue-comment-cli.ts +2 -2
  306. package/scripts/issue/issue-file-cli.ts +5 -5
  307. package/scripts/issue/issue-file.ts +2 -2
  308. package/scripts/issue/issue-fold-cli.ts +1 -1
  309. package/scripts/issue/issue-fold-existing-cli.ts +1 -1
  310. package/scripts/{git → issue}/issue-labels.ts +20 -0
  311. package/scripts/issue/issue-lint-cli.ts +1 -1
  312. package/scripts/issue/issue-merged.ts +2 -2
  313. package/scripts/issue/issue-rank.ts +89 -0
  314. package/scripts/issue/issue-read-cli.ts +8 -47
  315. package/scripts/issue/issue-read.ts +0 -2
  316. package/scripts/issue/issue-report-failures.ts +80 -0
  317. package/scripts/issue/issue-scout-cli.ts +1 -7
  318. package/scripts/issue/issue-scout-closed.ts +2 -2
  319. package/scripts/issue/issue-scout.ts +0 -2
  320. package/scripts/issue/issue-state-cli.ts +5 -46
  321. package/scripts/issue/issue-state.ts +1 -5
  322. package/scripts/issue/markdown-section.ts +1 -1
  323. package/scripts/issue/measure-rerun-cli.ts +1 -1
  324. package/scripts/issue/reproduction-measure.ts +1 -1
  325. package/scripts/josh/cli-body.ts +1 -1
  326. package/scripts/josh/file-map-stamp.ts +0 -3
  327. package/scripts/josh/josh-command-map.ts +2 -102
  328. package/scripts/josh/josh-commands-ai.ts +9 -102
  329. package/scripts/josh/josh-commands-backlog.ts +5 -1
  330. package/scripts/josh/josh-commands-development.ts +10 -3
  331. package/scripts/josh/josh-commands-issue.ts +2 -2
  332. package/scripts/josh/josh-commands-maintenance.ts +7 -0
  333. package/scripts/josh/josh-commands-project.ts +7 -1
  334. package/scripts/josh/josh-commands-run.ts +114 -0
  335. package/scripts/josh/josh-commands-versioning.ts +8 -0
  336. package/scripts/josh/josh-commands-workflow.ts +2 -2
  337. package/scripts/josh/path-decision.ts +0 -3
  338. package/scripts/josh/process-owner.ts +16 -0
  339. package/scripts/josh/session-language-cli.ts +0 -1
  340. package/scripts/lane/lane-await.ts +3 -6
  341. package/scripts/lane/lane-capacity.ts +6 -3
  342. package/scripts/lane/lane-child-invocation.ts +20 -7
  343. package/scripts/lane/lane-child-marker.ts +16 -2
  344. package/scripts/lane/lane-cli.ts +33 -18
  345. package/scripts/lane/lane-close.ts +1 -3
  346. package/scripts/lane/lane-dispatch.ts +3 -4
  347. package/scripts/lane/lane-environment.ts +0 -9
  348. package/scripts/lane/lane-handoff.ts +38 -0
  349. package/scripts/lane/lane-launch-cli.ts +21 -11
  350. package/scripts/lane/lane-open.ts +0 -3
  351. package/scripts/lane/lane-output.ts +0 -1
  352. package/scripts/lane/lane-registry.ts +9 -0
  353. package/scripts/lane/lane-report.ts +10 -4
  354. package/scripts/lane/openai-lane-ship.ts +2 -0
  355. package/scripts/lane/openai-lane-supervisor-decision.ts +2 -1
  356. package/scripts/lane/openai-lane-supervisor.ts +6 -4
  357. package/scripts/lane/openai-review-broker.ts +3 -0
  358. package/scripts/lib/bounded-pool.ts +1 -0
  359. package/scripts/lib/json-value.ts +5 -4
  360. package/scripts/lib/poll.ts +3 -1
  361. package/scripts/lib/timed-fetch.ts +15 -0
  362. package/scripts/lib/timeouts.ts +13 -0
  363. package/scripts/{yaml → lib}/yaml-document.ts +3 -1
  364. package/scripts/{bytes → lines}/bytes-command.ts +0 -2
  365. package/scripts/lines/lines-command.ts +0 -1
  366. package/scripts/lint/lint-related-scope.ts +0 -1
  367. package/scripts/lint/lint-related.ts +1 -1
  368. package/scripts/{git → notify}/telegram-notify.ts +2 -2
  369. package/scripts/{git → notify}/telegram-test.ts +4 -4
  370. package/scripts/observations/observation-ledger-home.ts +0 -1
  371. package/scripts/observations/observation-ledger-line.ts +0 -1
  372. package/scripts/observations/observation-ledger-migrate.ts +1 -1
  373. package/scripts/observations/observations-flush-landing.ts +3 -3
  374. package/scripts/observations/observations-flush.ts +2 -2
  375. package/scripts/overrides/lockfile-overrides.ts +1 -1
  376. package/scripts/overrides/overrides-logic.ts +1 -1
  377. package/scripts/package/package-scout-cli.ts +2 -7
  378. package/scripts/package/package-scout.ts +0 -2
  379. package/scripts/propagate/propagate-git-failure.ts +0 -1
  380. package/scripts/propagate/propagate-git.ts +0 -2
  381. package/scripts/propagate/propagate-plan.ts +185 -0
  382. package/scripts/propagate/propagate-publish.ts +2 -3
  383. package/scripts/propagate/propagate-run.ts +5 -3
  384. package/scripts/propagate/propagate-steps.ts +19 -6
  385. package/scripts/propagate/propagate-targets.ts +13 -6
  386. package/scripts/propagate/propagate.ts +60 -46
  387. package/scripts/refactor/import-graph.ts +0 -1
  388. package/scripts/refactor/refactor-lint.ts +0 -2
  389. package/scripts/refactor/refactor-scan.ts +0 -1
  390. package/scripts/refactor/refactor-targets.ts +0 -1
  391. package/scripts/registry-migration/migrate-logic.ts +1 -2
  392. package/scripts/registry-migration/migrate.ts +19 -9
  393. package/scripts/release/github-release-cli.ts +8 -6
  394. package/scripts/release/github-release-environment.ts +46 -0
  395. package/scripts/release/github-release.ts +151 -94
  396. package/scripts/release/release-history.ts +0 -1
  397. package/scripts/release/release-plan.ts +0 -1
  398. package/scripts/release/release-publish.ts +2 -3
  399. package/scripts/release/release-scope-cli.ts +1 -2
  400. package/scripts/release/release-tag.ts +2 -4
  401. package/scripts/repo/auto-merge-setting-logic.ts +1 -4
  402. package/scripts/repo/repo-setting.ts +1 -1
  403. package/scripts/repo/repository-labels.ts +3 -3
  404. package/scripts/repo/required-checks-logic.ts +206 -0
  405. package/scripts/repo/required-checks-report.ts +71 -0
  406. package/scripts/repo/ruleset-check-cli.ts +53 -0
  407. package/scripts/repo/ruleset-check.ts +147 -0
  408. package/scripts/report/report-lint-cli.ts +0 -4
  409. package/scripts/review/disposition-cli.ts +1 -1
  410. package/scripts/review/live-evidence.ts +1 -1
  411. package/scripts/review/review-attest-cli.ts +0 -6
  412. package/scripts/review/review-attest.ts +48 -16
  413. package/scripts/review/review-brief-cli.ts +72 -8
  414. package/scripts/review/review-brief.ts +67 -9
  415. package/scripts/review/review-diff-parts.ts +89 -0
  416. package/scripts/review/review-diff-write.ts +97 -0
  417. package/scripts/review/review-finding-ledger.ts +0 -1
  418. package/scripts/review/review-record-cli.ts +1 -1
  419. package/scripts/review/review-record.ts +0 -1
  420. package/scripts/review/review-round2-cli.ts +1 -1
  421. package/scripts/review/review-stamps.ts +6 -2
  422. package/scripts/review/review-tree.ts +14 -2
  423. package/scripts/rules/decision-oracle-stage.ts +18 -0
  424. package/scripts/rules/decision-oracle.ts +10 -7
  425. package/scripts/rules/delivered-rules.ts +9 -1
  426. package/scripts/rules/destructive-command.ts +119 -0
  427. package/scripts/rules/direct-filing.ts +1 -1
  428. package/scripts/rules/file-body.ts +0 -3
  429. package/scripts/rules/filing-cap.ts +0 -2
  430. package/scripts/rules/gh-api.ts +7 -2
  431. package/scripts/rules/git-argv.ts +18 -7
  432. package/scripts/rules/git-force.ts +0 -2
  433. package/scripts/rules/implementation-cut.ts +1 -2
  434. package/scripts/rules/index-guard.ts +71 -0
  435. package/scripts/rules/issue-citation.ts +50 -25
  436. package/scripts/rules/issue-fold.ts +1 -2
  437. package/scripts/rules/lane-background.ts +15 -7
  438. package/scripts/rules/lane-carry-conflict.ts +1 -2
  439. package/scripts/rules/lane-park.ts +14 -8
  440. package/scripts/rules/last-prompt.ts +1 -0
  441. package/scripts/rules/oracle-consulted.ts +1 -1
  442. package/scripts/rules/oracle-firing.ts +1 -0
  443. package/scripts/rules/oracle-list-cli.ts +0 -3
  444. package/scripts/rules/permission-guards.ts +14 -0
  445. package/scripts/rules/pre-gate-cut.ts +2 -2
  446. package/scripts/rules/protected-files.ts +74 -0
  447. package/scripts/rules/reply-language.ts +1 -1
  448. package/scripts/rules/rule-body-guard.ts +0 -3
  449. package/scripts/rules/rule-value-cli.ts +0 -1
  450. package/scripts/rules/shell-body-trigger.ts +0 -1
  451. package/scripts/rules/shell-segments.ts +0 -1
  452. package/scripts/rules/stop-rules.ts +13 -5
  453. package/scripts/rules/tail-commands.ts +1 -1
  454. package/scripts/rules/test-declared-commit.ts +1 -1
  455. package/scripts/rules/third-party-write.ts +0 -1
  456. package/scripts/rules/worktree-guard.ts +26 -9
  457. package/scripts/run/run-carry-cli.ts +0 -2
  458. package/scripts/run/run-carry-stash.ts +2 -2
  459. package/scripts/run/run-carry-streak.ts +1 -1
  460. package/scripts/run/run-cut-cli.ts +0 -7
  461. package/scripts/run/run-cut.ts +8 -54
  462. package/scripts/run/run-ending-cli.ts +1 -1
  463. package/scripts/run/run-ending.ts +1 -4
  464. package/scripts/run/run-entry-cli.ts +101 -24
  465. package/scripts/run/run-entry.ts +0 -1
  466. package/scripts/run/run-event-cli.ts +0 -2
  467. package/scripts/run/run-event-follow.ts +1 -0
  468. package/scripts/run/run-event-render.ts +1 -1
  469. package/scripts/run/run-event-scope.ts +53 -4
  470. package/scripts/run/run-event-stream.ts +0 -3
  471. package/scripts/run/run-event-watch.ts +1 -0
  472. package/scripts/run/run-halfrun-resume.ts +20 -7
  473. package/scripts/run/run-headless.ts +24 -8
  474. package/scripts/run/run-hold-cli.ts +33 -10
  475. package/scripts/run/run-hold.ts +25 -5
  476. package/scripts/run/run-issue-number.ts +1 -1
  477. package/scripts/run/run-liveness-cli.ts +1 -1
  478. package/scripts/run/run-liveness.ts +2 -3
  479. package/scripts/run/run-merge-cli.ts +5 -13
  480. package/scripts/run/run-merge-steps.ts +5 -5
  481. package/scripts/run/run-merge.ts +1 -1
  482. package/scripts/run/run-next-cli.ts +1 -1
  483. package/scripts/run/run-parent-cut-hook.ts +143 -0
  484. package/scripts/run/run-preflight.ts +2 -9
  485. package/scripts/run/run-prep-cli.ts +2 -2
  486. package/scripts/run/run-prep-locate.ts +1 -1
  487. package/scripts/run/run-progress-cli.ts +4 -7
  488. package/scripts/run/run-progress-clock.ts +6 -34
  489. package/scripts/run/run-progress-config.ts +0 -4
  490. package/scripts/run/run-progress-read.ts +3 -3
  491. package/scripts/run/run-progress.ts +22 -10
  492. package/scripts/run/run-prrun-resume.ts +117 -0
  493. package/scripts/run/run-report-cli.ts +1 -2
  494. package/scripts/run/run-report.ts +0 -1
  495. package/scripts/run/run-retrospective.ts +1 -1
  496. package/scripts/run/run-review-cli.ts +0 -3
  497. package/scripts/run/run-review-steps.ts +2 -0
  498. package/scripts/run/run-review.ts +0 -2
  499. package/scripts/run/run-ship-cli.ts +27 -77
  500. package/scripts/run/run-ship-detach.ts +1 -0
  501. package/scripts/run/run-ship-next.ts +106 -0
  502. package/scripts/run/run-ship-preflight.ts +87 -0
  503. package/scripts/run/run-ship-return.ts +8 -3
  504. package/scripts/run/run-ship-review-steps.ts +23 -30
  505. package/scripts/run/run-ship-review.ts +20 -0
  506. package/scripts/run/run-ship-scoped.ts +45 -0
  507. package/scripts/run/run-ship-stage.ts +5 -1
  508. package/scripts/run/run-ship-steps.ts +105 -0
  509. package/scripts/run/run-ship.ts +2 -1
  510. package/scripts/run/run-stage-read.ts +62 -0
  511. package/scripts/run/run-stage.ts +160 -0
  512. package/scripts/run/run-status-cli.ts +1 -1
  513. package/scripts/run/run-step-cli.ts +21 -14
  514. package/scripts/run/run-step.ts +1 -1
  515. package/scripts/run/run-stop-notify.ts +1 -3
  516. package/scripts/run/run-stranded-cli.ts +0 -4
  517. package/scripts/run/run-stranded-detect.ts +2 -2
  518. package/scripts/run/run-tail-cli.ts +17 -11
  519. package/scripts/run/run-tail.ts +2 -0
  520. package/scripts/run/run-tidy-lanes.ts +2 -1
  521. package/scripts/run/run-tidy-stashes.ts +12 -12
  522. package/scripts/run/run-wake-cli.ts +4 -5
  523. package/scripts/run/run-wake-describe.ts +19 -1
  524. package/scripts/run/run-wake-loop.ts +2 -2
  525. package/scripts/run/run-wake.ts +2 -4
  526. package/scripts/run/run-watcher-guard-cli.ts +0 -4
  527. package/scripts/run/run-watcher-guard.ts +9 -7
  528. package/scripts/run/run-watcher-hook.ts +1 -1
  529. package/scripts/safe-chain/ci-installer-pin.ts +11 -5
  530. package/scripts/safe-chain/project-config.ts +1 -1
  531. package/scripts/security/security-audit-provision-logic.ts +0 -1
  532. package/scripts/security/security-audit-provision.ts +3 -2
  533. package/scripts/security/security-audit.ts +0 -1
  534. package/scripts/security/security-updates-logic.ts +0 -1
  535. package/scripts/sonar/sonar-hotspots-cli.ts +10 -52
  536. package/scripts/sonar/sonar-hotspots.ts +0 -1
  537. package/scripts/sonar/sonar-new-code-cli.ts +150 -0
  538. package/scripts/sonar/sonar-new-code.ts +79 -0
  539. package/scripts/sonar/sonar-project.ts +97 -0
  540. package/scripts/split/split-assess-cli.ts +1 -1
  541. package/scripts/split/split-assess.ts +2 -5
  542. package/scripts/sync/managed-config-scope-cli.ts +1 -1
  543. package/scripts/sync/skill-migration.ts +0 -1
  544. package/scripts/sync/sync-hook-safety.ts +2 -3
  545. package/scripts/sync/sync.ts +1 -8
  546. package/scripts/sync/template-source-logic.ts +0 -1
  547. package/scripts/sync/workflow-pin-logic.ts +16 -28
  548. package/scripts/test/test-declared-logic.ts +0 -1
  549. package/scripts/test/test-declared.ts +0 -2
  550. package/scripts/test/test-red-commit.ts +2 -2
  551. package/scripts/test/test-red.ts +14 -7
  552. package/scripts/test/test-type-logic.ts +1 -1
  553. package/scripts/test/unit-worker-share.ts +7 -16
  554. package/scripts/time-runtime/time-batch-guard.ts +1 -2
  555. package/scripts/time-runtime/time-bundle-call.ts +2 -3
  556. package/scripts/time-runtime/time-bundles.ts +0 -4
  557. package/scripts/time-runtime/time-density-hook.ts +0 -2
  558. package/scripts/time-runtime/time-followup-stage.ts +1 -1
  559. package/scripts/time-runtime/time-format.ts +0 -73
  560. package/scripts/time-runtime/time-round-trips.ts +0 -4
  561. package/scripts/time-runtime/time-single-check.ts +1 -1
  562. package/scripts/time-runtime/time-spans.ts +1 -1
  563. package/scripts/time-runtime/time-transcript-line.ts +1 -2
  564. package/scripts/ui/ui-routes-cli.ts +0 -5
  565. package/scripts/ui/ui-routes.ts +0 -5
  566. package/scripts/version/effective-upstream.ts +2 -2
  567. package/scripts/version/latest-corepack.ts +7 -9
  568. package/scripts/version/latest-scope-cli.ts +0 -2
  569. package/scripts/version/latest-update.ts +0 -2
  570. package/scripts/version/npm-registry.ts +97 -0
  571. package/scripts/version/publishable-range-check.ts +1 -1
  572. package/scripts/version/release-hold.ts +0 -4
  573. package/scripts/version/running-binary.ts +2 -2
  574. package/scripts/version/version-check-logic.ts +0 -2
  575. package/scripts/version/version-commands.ts +5 -4
  576. package/scripts/version/version-remote.ts +28 -14
  577. package/scripts/version/version-targets.ts +4 -4
  578. package/templates/sonar-project.properties +28 -1
  579. package/templates/workflows/dependabot-auto-merge.yml +5 -3
  580. package/templates/workflows/github-release.yml +81 -0
  581. package/prompts/collaboration-workflow/cross-repo-epic.md +0 -5
  582. package/prompts/collaboration-workflow/epic-audit.md +0 -5
  583. package/prompts/collaboration-workflow/epic-bundle.md +0 -5
  584. package/scripts/init/plugin-install-hint.ts +0 -47
  585. package/scripts/version/parse-json.ts +0 -13
  586. /package/scripts/{git → followup}/git-followup-stages.ts +0 -0
  587. /package/scripts/{git → gh}/git-gh-api-path.ts +0 -0
  588. /package/scripts/{git → gh}/git-gh-command.ts +0 -0
  589. /package/scripts/{git → gh}/git-gh-issue-write.ts +0 -0
  590. /package/scripts/{git → gh}/git-gh-issue.ts +0 -0
  591. /package/scripts/{git → gh}/git-gh-pr-auto-merge.ts +0 -0
  592. /package/scripts/{git → gh}/git-gh-pr-snapshot.ts +0 -0
  593. /package/scripts/{git → gh}/git-gh-reachability.ts +0 -0
  594. /package/scripts/{git → gh}/git-gh-repo.ts +0 -0
  595. /package/scripts/{git → gh}/git-gh-rest-state.ts +0 -0
  596. /package/scripts/{git → gh}/git-pr-checks-watch.ts +0 -0
  597. /package/scripts/{git → gh}/git-pr-error.ts +0 -0
  598. /package/scripts/{git → gh}/git-pr-messages.ts +0 -0
  599. /package/scripts/{git → gh}/github-issue-url.ts +0 -0
  600. /package/scripts/git/{stash-orphans.ts → stash/stash-orphans.ts} +0 -0
  601. /package/scripts/{git → issue}/issue-reference.ts +0 -0
  602. /package/scripts/{git → lib}/animation-helpers.ts +0 -0
  603. /package/scripts/{git → lib}/git-animation.ts +0 -0
  604. /package/scripts/{git → notify}/git-notify.ts +0 -0
  605. /package/scripts/{git → notify}/telegram-test-logic.ts +0 -0
@@ -5,6 +5,11 @@
5
5
  "deny": [
6
6
  "Bash(rm -rf *)",
7
7
  "Bash(rm -rf /*)",
8
+ "Bash(rm -fr *)",
9
+ "Bash(gh repo delete*)",
10
+ "Bash(gh repo archive*)",
11
+ "Bash(gh pr close*)",
12
+ "Read(./.env)",
8
13
  "Bash(git push --force*)",
9
14
  "Bash(git push -f*)",
10
15
  "Bash(git push *--force*)",
@@ -56,11 +61,7 @@
56
61
  "hooks": [
57
62
  {
58
63
  "type": "command",
59
- "command": "echo 'MANDATORY before writing any implementation code: present the two-layer work summary (Now / Change / Check, then every change with its test). Full rule: Code Change Rules Step 0 in CLAUDE.md.'"
60
- },
61
- {
62
- "type": "command",
63
- "command": "if [ -f dist/hooks/session-lang.js ]; then node dist/hooks/session-lang.js; else pnpm josh session:lang; fi",
64
+ "command": "if project_root=\"$(env -u GIT_ALTERNATE_OBJECT_DIRECTORIES -u GIT_COMMON_DIR -u GIT_DIR -u GIT_INDEX_FILE -u GIT_NAMESPACE -u GIT_OBJECT_DIRECTORY -u GIT_WORK_TREE git rev-parse --show-toplevel 2>/dev/null)\"; then unset GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_COMMON_DIR GIT_DIR GIT_INDEX_FILE GIT_NAMESPACE GIT_OBJECT_DIRECTORY GIT_WORK_TREE; else project_root=\"$(git rev-parse --show-toplevel)\" || exit 1; fi; cd \"$project_root\" && if node --disable-warning=ExperimentalWarning scripts/hooks/hook-bundle-ready.ts; then node dist/hooks/session-lang.js; else pnpm josh session:lang; fi",
64
65
  "timeout": 10
65
66
  }
66
67
  ]
@@ -72,7 +73,7 @@
72
73
  "hooks": [
73
74
  {
74
75
  "type": "command",
75
- "command": "if [ -f dist/hooks/pretool-guard.js ]; then node dist/hooks/pretool-guard.js; else pnpm josh pretool:guard; fi",
76
+ "command": "if project_root=\"$(env -u GIT_ALTERNATE_OBJECT_DIRECTORIES -u GIT_COMMON_DIR -u GIT_DIR -u GIT_INDEX_FILE -u GIT_NAMESPACE -u GIT_OBJECT_DIRECTORY -u GIT_WORK_TREE git rev-parse --show-toplevel 2>/dev/null)\"; then unset GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_COMMON_DIR GIT_DIR GIT_INDEX_FILE GIT_NAMESPACE GIT_OBJECT_DIRECTORY GIT_WORK_TREE; else project_root=\"$(git rev-parse --show-toplevel)\" || exit 1; fi; cd \"$project_root\" && if node --disable-warning=ExperimentalWarning scripts/hooks/hook-bundle-ready.ts; then node dist/hooks/pretool-guard.js; else pnpm josh pretool:guard; fi",
76
77
  "timeout": 20
77
78
  }
78
79
  ]
@@ -84,7 +85,7 @@
84
85
  "hooks": [
85
86
  {
86
87
  "type": "command",
87
- "command": "if [ -f dist/hooks/format-edited.js ]; then node dist/hooks/format-edited.js; else pnpm josh format:edited; fi",
88
+ "command": "if project_root=\"$(env -u GIT_ALTERNATE_OBJECT_DIRECTORIES -u GIT_COMMON_DIR -u GIT_DIR -u GIT_INDEX_FILE -u GIT_NAMESPACE -u GIT_OBJECT_DIRECTORY -u GIT_WORK_TREE git rev-parse --show-toplevel 2>/dev/null)\"; then unset GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_COMMON_DIR GIT_DIR GIT_INDEX_FILE GIT_NAMESPACE GIT_OBJECT_DIRECTORY GIT_WORK_TREE; else project_root=\"$(git rev-parse --show-toplevel)\" || exit 1; fi; cd \"$project_root\" && if node --disable-warning=ExperimentalWarning scripts/hooks/hook-bundle-ready.ts; then node dist/hooks/format-edited.js; else pnpm josh format:edited; fi",
88
89
  "timeout": 90
89
90
  }
90
91
  ]
@@ -96,7 +97,7 @@
96
97
  "hooks": [
97
98
  {
98
99
  "type": "command",
99
- "command": "if [ -f dist/hooks/stop-guard.js ]; then node dist/hooks/stop-guard.js; else pnpm josh stop:guard; fi",
100
+ "command": "if project_root=\"$(env -u GIT_ALTERNATE_OBJECT_DIRECTORIES -u GIT_COMMON_DIR -u GIT_DIR -u GIT_INDEX_FILE -u GIT_NAMESPACE -u GIT_OBJECT_DIRECTORY -u GIT_WORK_TREE git rev-parse --show-toplevel 2>/dev/null)\"; then unset GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_COMMON_DIR GIT_DIR GIT_INDEX_FILE GIT_NAMESPACE GIT_OBJECT_DIRECTORY GIT_WORK_TREE; else project_root=\"$(git rev-parse --show-toplevel)\" || exit 1; fi; cd \"$project_root\" && if node --disable-warning=ExperimentalWarning scripts/hooks/hook-bundle-ready.ts; then node dist/hooks/stop-guard.js; else pnpm josh stop:guard; fi",
100
101
  "timeout": 20
101
102
  }
102
103
  ]
@@ -6,9 +6,7 @@ description: The procedures for the `josh epic:*` commands that make an epic run
6
6
  # The `josh epic:*` commands
7
7
 
8
8
  These three commands are what turn an epic from a list of issue numbers into something a run can
9
- execute unattended. **This skill is their single source**: `prompts/collaboration-workflow/` keeps
10
- `epic-bundle.md`, `epic-audit.md` and `cross-repo-epic.md` only as pointers here, and the history
11
- behind the rules is `docs/maintainers/epic-commands-rationale.md` (joshuafolkken/kit#2892).
9
+ execute unattended. **This skill is their single source**, and the history behind the rules is `docs/maintainers/epic-commands-rationale.md` (joshuafolkken/kit#2892).
12
10
 
13
11
  The workflow keywords themselves — `kickoff`, `fullrun`, `halfrun`, `backlogrun` — live in the
14
12
  `workflow-commands` skill.
@@ -118,7 +116,7 @@ about the search itself rather than about anything the children say (joshuafolkk
118
116
 
119
117
  **One thing it cannot check** belongs to planning: when a child introduces a new label, command,
120
118
  state or artifact, list the existing code referencing that concept and confirm some child owns
121
- updating it. Label names are single-sourced in `scripts/git/issue-labels.ts`.
119
+ updating it. Label names are single-sourced in `scripts/issue/issue-labels.ts`.
122
120
 
123
121
  History: `docs/maintainers/epic-commands-rationale.md` → "`epic:audit` — why the children are read across".
124
122
 
@@ -153,7 +151,7 @@ command prints a ⚠️ line naming that child rather than reporting a reorderin
153
151
  `owner/repo#number` and kept by the epic named earlier; withheld there, it stays withheld, because a
154
152
  `blocked-by` relation belongs to the issue rather than to the epic listing it. **One unusable graph
155
153
  refuses the whole answer**, and **one reference that does not parse fails the read** rather than
156
- being dropped. `docs/josh-commands.md` → "`josh epic:next`" carries the worked form.
154
+ being dropped. `docs/josh-commands-automation.md` → "`josh epic:next`" carries the worked form.
157
155
 
158
156
  **An `in-progress` issue occupies a lane rather than the whole repository.** The occupancy is counted
159
157
  from that repository's own `in-progress` listing — never from anything the session remembers, since
@@ -196,7 +194,7 @@ inherits; open and tracked by none, the child waits on a person and the
196
194
  blocker is named on standard error; a state the relation did not carry reads as waiting. **So an order
197
195
  between two epics is recorded with a native `blocked-by` relation and honoured by naming both epics**
198
196
  — `epic:next 1936 1931`, or `backlog:next`, whose set is the whole opted-in backlog. The table is
199
- `docs/josh-commands.md` → "`josh epic:next`".
197
+ `docs/josh-commands-automation.md` → "`josh epic:next`".
200
198
 
201
199
  Two things stop the command rather than being worked around: a **circular dependency**, and a
202
200
  **disagreement between the epic body and the `blocked-by` relations** (an epic written before `josh`
@@ -484,7 +482,7 @@ than restated — and beside it the one thing this one deliberately refuses: whe
484
482
  already been filed, from a title comparison (joshuafolkken/kit#1252). **Both run**, and neither
485
483
  replaces the other: `pnpm josh issue:file` runs the scout before it creates the issue, and
486
484
  `epic:bundle` afterwards, from the real number and the relations recorded against it.
487
- Full behavior: `docs/josh-commands.md` → "`josh issue:file`".
485
+ Full behavior: `docs/josh-commands-automation.md` → "`josh issue:file`".
488
486
 
489
487
  **When the relation carries an order, record it** in `blocked-by` and in the epic's `Dependencies` —
490
488
  on an addition as much as on a new epic. Without it the batch survives and the reason for it does
@@ -15,7 +15,7 @@ green while spacing, layout and styling are visibly broken. This skill is the lo
15
15
  In order:
16
16
 
17
17
  1. The routes given as arguments (`/verify-ui / /blog`).
18
- 2. Otherwise, derive the candidates with `pnpm josh ui:routes` (alias `josh uir`): it reads the
18
+ 2. Otherwise, derive the candidates with `pnpm josh ui:routes`: it reads the
19
19
  change (the branch diff, or the staged diff with `--staged`) and lists the routes it touches,
20
20
  tracing a changed shared component to the routes that render it. From that list **pick the ones a
21
21
  reader would notice** — that narrowing is the judgement the command leaves to you.
@@ -1,20 +1,20 @@
1
1
  ---
2
2
  name: workflow-commands
3
- description: The procedures for the Issue-driven shorthand commands `kickoff`, `fullrun`, `halfrun` and `backlogrun` — planning, implementation, the verification gate, unattended epic and backlog execution, the `/code-review` → `followup` chain rule, auto-merge and the Telegram notifications. Read this the moment the user types one of those keywords (with or without `#N` / `new`), before running any command, and read it too when asked what one of them does or when a run of one has to be resumed or repaired.
3
+ description: The procedures for the Issue-driven shorthand commands `kickoff`, `fullrun`, `halfrun`, `prrun` and `backlogrun` — planning, implementation, the verification gate, unattended epic and backlog execution, the `/code-review` → `followup` chain rule, auto-merge and the Telegram notifications. Read this the moment the user types one of those keywords (with or without `#N` / `new`), before running any command, and read it too when asked what one of them does or when a run of one has to be resumed or repaired.
4
4
  ---
5
5
 
6
6
  # Issue-driven workflow commands
7
7
 
8
- `kickoff`, `fullrun`, `halfrun` and `backlogrun` are the shorthand commands this
8
+ `kickoff`, `fullrun`, `halfrun`, `prrun` and `backlogrun` are the shorthand commands this
9
9
  package's collaboration workflow is built on. Their procedures live here rather than in `CLAUDE.md`
10
10
  because each one applies only while its own command is running.
11
11
 
12
- The canonical extended reference is `prompts/collaboration-workflow/` (indexed by
13
- `prompts/collaboration-workflow.md`); this skill is the operational procedure, and the two must agree.
12
+ Each topic file under `prompts/collaboration-workflow/` sources its own rule; this skill sources the
13
+ procedures. Neither restates the other.
14
14
 
15
15
  ## 0. The rule that fires before any of them — explicit invocation
16
16
 
17
- **Never start a `kickoff` / `halfrun` / `fullrun` / `backlogrun` workflow (including their
17
+ **Never start a `kickoff` / `halfrun` / `prrun` / `fullrun` / `backlogrun` workflow (including their
18
18
  `#N` and `new` variants) unless the user has typed the keyword in the current turn's prompt.** This rule is also
19
19
  resident in the AI documents, because it has to hold when this skill has *not* been loaded.
20
20
 
@@ -44,6 +44,7 @@ the file its pointer names (for `fullrun`, the step lists are `fullrun-steps.md`
44
44
  | `kickoff` / `kickoff #N` / `kickoff new` | `kickoff.md` |
45
45
  | `fullrun` / `fullrun #N` / `fullrun new` | `fullrun.md` |
46
46
  | `halfrun` / `halfrun #N` / `halfrun new` | `halfrun.md` |
47
+ | `prrun` / `prrun #N` / `prrun new` | `prrun.md` — the difference over `fullrun.md`, read with it |
47
48
  | `backlogrun` / `backlogrun #N…` / `backlogrun #E…` | `backlogrun.md` — its dispatched child reads `fullrun.md` + `split-assessment.md` in its own unit, not the parent at entry |
48
49
 
49
50
  Each command manifest cites `split-assessment.md` → "The question" — the split decision, read at the
@@ -92,8 +93,8 @@ procedure alone, and the rest of `backlogrun-park.md` is read only when it is re
92
93
  **A pointer written `` `X.md` → "Heading" `` is read as that section, never by opening `X.md` whole:**
93
94
 
94
95
  ```bash
95
- pnpm josh doc:section <file.md> "<heading>" # the section, verbatim ; alias: josh ds
96
- pnpm josh read:set [<keyword>] # what an entry reads, and what it costs ; alias: josh rs
96
+ pnpm josh doc:section <file.md> "<heading>" # the section, verbatim
97
+ pnpm josh read:set [<keyword>] # what an entry reads, and what it costs
97
98
  ```
98
99
 
99
100
  The section is fetched in the same turn, printed verbatim with its subsections; **a heading that does
@@ -115,12 +116,12 @@ procedure.
115
116
  | While implementing | Re-run one check by name, not the whole gate — `pnpm josh lint:related`, `pnpm josh cspell:dot`, `pnpm josh test:related`; the last pair runs in front of the gate, and `pnpm josh review:brief` refuses a brief on a tree neither was green on | `chain-rule.md` |
116
117
  | A review has run | Its verdict counts only once `pnpm josh review:attest --check` answers `ok`; `missing` / `mismatch` are refusals `pnpm josh followup` blocks the merge on | `chain-rule.md` → "The brief names the checkout, and a review that read another one is refused" |
117
118
  | E2E gate | The CI E2E job where the command ends in a PR (`fullrun` / `backlogrun`, enforced by `pnpm josh followup`); you run `pnpm josh test:e2e` yourself where it does not (`halfrun`) | `prompts/testing-guide.md` → "Closing the E2E gate without a human run" |
118
- | A defect in the verification path turns up | The interrupt runs alone; a batch resumes only once it has merged — decided from an enumeration, not from how serious it looks | `prompts/collaboration-workflow/wip-cap.md` → 「実行のしかた」 |
119
+ | A defect in kit's own verification turns up | It runs alone, and a batch resumes only once it has merged, when three conditions all hold (a defect, in kit's own verification, making unrelated PRs answer wrongly on `main` now) — never from how serious it looks | `prompts/collaboration-workflow/wip-cap.md` → 「実行のしかた」 |
119
120
  | A command can take minutes | Issue it in the background; the turn never ends at the push (`pnpm josh followup` stays foreground) | §2h → `background-commands.md` → "Background the gate and push" |
120
121
  | `pnpm josh issue:state <N>` answers `human_review: yes` | Implement and gate, then stop before the commit | §2z → `needs-human-review.md` |
121
122
  | Under `backlogrun`, a stop that would end a batch, or a named non-epic item | Park one child and continue; run a named non-epic item as a `fullrun` | `backlogrun-park.md` → "park and continue"; `backlogrun-child.md` → "When `#N` is not an epic" |
122
123
  | `backlogrun`'s authorization | The whole `auto-ok` opted-in pool as well as its named items; `pnpm josh backlog:next` offers them | `backlogrun.md` |
123
- | First call of `fullrun` / `halfrun` (not `kickoff`) | Claim the tree: `fullrun #N` starts with `pnpm josh run:entry <N>` (which runs the hold); `fullrun new` and `halfrun` use `pnpm josh run:hold` | §2f → `working-tree-hold.md` |
124
+ | First call of any entry | `#N`: `pnpm josh run:entry <N> --to <command>` (claims the tree, except `kickoff`); `new` (not `kickoff`): `pnpm josh run:hold` | §2k; §2f → `working-tree-hold.md` |
124
125
  | Same turn as the hold (not a dispatched child, not `kickoff`) | `pnpm josh cost --cut`; `under` continues, `over` stops with a `confirmation` Telegram and the resume command, then `pnpm josh run:release` | `backlogrun-progress.md` → "The hand-off" (shared 135,000 threshold) |
125
126
  | Before any work starts (every entry) | The split assessment; the default is not to split — separability **and** a scope clearly over one gate must hold together; a `fullrun` / `halfrun` that finds a split files the epic and **stops** | `split-assessment.md` → "The question" |
126
127
  | Another Issue here must land first | A prerequisite is a dependency, not a park (the third of four mid-run discoveries) | §2d → `prerequisite.md` |
@@ -193,14 +194,14 @@ refuses the second `pnpm josh issue:file` call until it has.
193
194
  its duplicate and epic answers.** This applies inside every workflow, including observations and review
194
195
  follow-ups. The guard refuses any other filing call. Read `issue-scout.md` at that point for the
195
196
  duplicate, closed-Issue and epic decisions and for `--distinct`; `issue-fold-existing.md` handles a
196
- compatible duplicate. `docs/josh-commands.md` → "`josh issue:file`" defines the command.
197
+ compatible duplicate. `docs/josh-commands-automation.md` → "`josh issue:file`" defines the command.
197
198
 
198
199
  ## 2f. The working-tree hold — one run per tree
199
200
 
200
201
  **Trigger:** the first call of `fullrun` and `halfrun` alike — before the title is normalized, before
201
- `git switch main`, and before a `new` entry files its Issue. **Then:** `fullrun #N` first runs
202
- `pnpm josh run:entry <N>`, which includes the tree claim; `fullrun new` and `halfrun` first run
203
- `pnpm josh run:hold [<N>]`. `hold` continues; `busy` and `unknown` stop with a `confirmation` Telegram
202
+ `git switch main`, and before a `new` entry files its Issue. **Then:** a `#N` entry first runs
203
+ `pnpm josh run:entry <N> --to <command>` (§2k, the tree claim included); `new` runs bare
204
+ `pnpm josh run:hold`. `hold` continues; `busy` and `unknown` stop with a `confirmation` Telegram
204
205
  carrying what stderr printed. **`kickoff` is exempt** (it edits nothing). A stop that leaves the tree
205
206
  clean releases explicitly with `pnpm josh run:release [<N>]`; a `halfrun` or `needs-human-review` stop
206
207
  keeps the hold; `pnpm josh followup` releases a merged run. The answer table, the per-child rule and
@@ -241,6 +242,13 @@ digest it names once.** File up to two worthwhile improvements through `issue:fi
241
242
  `epic:bundle` included), stack the rest in the observation ledger, and close the step with the command described
242
243
  there. A dispatched lane child never runs the retrospective.
243
244
 
245
+ ## 2k. The stage ladder
246
+
247
+ `kickoff` → `halfrun` → `prrun` → `fullrun` (joshuafolkken/kit#3042): the command sets how far a run
248
+ goes, the Issue where it starts. `run:entry <N> --to <command>` prints `stage #<N> — at: … · start:
249
+ …`; **`start: reached` redoes nothing — stop** (at `merged`, the next line answers). A
250
+ stop's `Next:` line names the commands further up. Table: `docs/how-to/run-issues.md`.
251
+
244
252
  ## 3. What stays resident, and what is read from here
245
253
 
246
254
  **The residency criterion is `prompts/collaboration-workflow/residency.md`, its single source — read
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## Background the gate and push
4
4
 
5
- - **The clean path folds the region into one backgrounded `pnpm josh ship`** (gate → `git -y` →
5
+ - **The clean path folds the region into one backgrounded `pnpm josh ship`** (preflight → gate → `git -y` →
6
6
  foreground `followup` → `run:tail`; joshuafolkken/kit#2398). The calls below serve a due second round.
7
7
  - Background `pnpm josh gate` beside the review; join it before commit.
8
8
  - Issue `pnpm josh git -y` in the background; its completion resumes the run, so the turn never ends
@@ -131,9 +131,10 @@ turn-end this section forbids. The boundary, its two commands and the resume ver
131
131
 
132
132
  **A headless lane child (`claude -p`) is where "a background command re-invokes the run" does not
133
133
  hold: its background Bash tasks are killed when its turn ends** (joshuafolkken/kit#2704). It hands the
134
- gate-to-merge region to `pnpm josh ship --detach` instead (`chain-rule.md` step 0); `pnpm josh
135
- rule:guard` refuses a backgrounded `josh gate` / `git` / `followup` there, and the `Stop` hook sends a
136
- child with a task still running back to wait rather than to notify.
134
+ gate-to-merge region to a foreground `pnpm josh ship --detach` instead (`chain-rule.md` step 0) —
135
+ its preflight runs before the supervisor exists, so a backgrounded `ship` dies with the turn
136
+ (joshuafolkken/kit#3027); `pnpm josh rule:guard` refuses a backgrounded `josh gate` / `git` /
137
+ `followup` / `ship` there, and the `Stop` hook sends a child with a task still running back to wait.
137
138
 
138
139
  The operational section above is the single source of the rule. `followup.md`, `chain-rule.md` and
139
140
  `backlogrun-progress.md` → "Progress while the run is quiet" route here for it rather than restating it.
@@ -94,7 +94,7 @@ child over" in `backlogrun-lanes.md` carries the command.
94
94
  JSONL. `JOSH_WORKER_MODEL` overrides Claude Code only; `JOSH_WORKER_EFFORT` covers both providers,
95
95
  and legacy `JOSH_LANE_*` applies only here. Bad markers, missing CLI/auth and failure
96
96
  refuse or park without fallback or retry.
97
- `docs/josh-commands.md` → "`josh lane:dispatch`" is the single source.
97
+ `docs/josh-commands-automation.md` → "`josh lane:dispatch`" is the single source.
98
98
 
99
99
  **The parent reads GitHub, never the summary.** That is `epic-child`'s verifier: a unit that reports
100
100
  a child finished without its PR merged leaves that child open, and `pnpm josh issue:state <N>` says so
@@ -164,7 +164,7 @@ unit was given** — this session's own unless the unit was handed a separate wo
164
164
  the recovery below is taken there too.
165
165
 
166
166
  ```bash
167
- pnpm josh run:liveness <N> --output <path> --process none # alias: josh rv
167
+ pnpm josh run:liveness <N> --output <path> --process none
168
168
  pnpm josh run:liveness <N> --output <path> --process alive
169
169
  pnpm josh run:liveness <N> --output <path> --process none --window 45 --repo <owner/repo>
170
170
  ```
@@ -290,7 +290,7 @@ separate command to ask first. Rationale: `docs/maintainers/backlogrun-child-rat
290
290
  preflight is part of the claim".
291
291
 
292
292
  ```bash
293
- answer=$(pnpm josh run:hold 926) # alias: josh rh ; one token on stdout, prose on stderr
293
+ answer=$(pnpm josh run:hold 926) # one token on stdout, prose on stderr
294
294
  ```
295
295
 
296
296
  | Answer | What it found | What to do |
@@ -65,7 +65,7 @@ it is".
65
65
 
66
66
  `pnpm josh epic:next <E> --repo <owner/repo> --lanes` answers with **one issue number per line**, up to
67
67
  the number of free lanes, and each of those children runs in a **lane** of its own: a linked git work
68
- tree with its own branch, its own `.env` and its own dev and preview ports (`docs/josh-commands.md` →
68
+ tree with its own branch, its own `.env` and its own dev and preview ports (`docs/josh-commands-automation.md` →
69
69
  "`josh lane:open` / `josh lane:close` / `josh lane:list` / `josh lane:prune`"). **Implementation, the
70
70
  verification gate and the review run in parallel; the merges stay serial** — each one lands on the
71
71
  `main` the next is then measured against.
@@ -76,12 +76,14 @@ verification are `pre-gate-cut.md`, the single source. **The child is told apart
76
76
  resume stage is handed to it, by a mark the dispatch sets** — `JOSH_LANE_CHILD`, the lane's issue
77
77
  number (`pre-gate-cut.md` → "The dispatch mark" and "The stage is passed to the resumed child").
78
78
 
79
- **One kind of child takes no lane beside anything: an interrupt whose subject is a defect in the
80
- verification path itself.** It runs alone, and the batch resumes only once it has merged. **Decide it
81
- from the enumeration, never from how serious it looks** — does the defect reach the verification gate
79
+ **One kind of child takes no lane beside anything: a defect in kit's own verification that makes
80
+ unrelated PRs answer wrongly on `main` today.** It runs alone, and the batch resumes only once it has
81
+ merged. **Decide it from three conditions that must all hold, never from how serious it looks** — is
82
+ it a defect (not an improvement, refactor, removal or feature)? Is it in kit's own verification gate
82
83
  (lint / type check / spell check / unit tests), the code review, the pre-push hook, or the merge
83
- checks? One of those, and the issue carries `run:solo`; none, and it carries `run:lane` and fills a
84
- lane like any other child. `backlog:next` and `epic:next --lanes` enforce both (joshuafolkken/kit#2776,
84
+ checks — not a consumer repository's CI or template? Does it, on `main` now, make unrelated PRs
85
+ answer wrongly (a false green or a false red)? All three, and the issue carries `run:solo`; any one
86
+ missing, and it carries `run:lane` and fills a lane like any other child. `backlog:next` and `epic:next --lanes` enforce both (joshuafolkken/kit#2776,
85
87
  #2779). The rule is
86
88
  `prompts/collaboration-workflow/wip-cap.md` → 「実行のしかた」, its single source.
87
89
 
@@ -137,7 +139,7 @@ runs `lane:open`, then — only when `--stash` is given, which is the first lane
137
139
  into the lane and re-installs against the lock it brought in, then `lane:dispatch`:
138
140
 
139
141
  ```bash
140
- pid=$(pnpm josh lane:launch "$n") || exit 1 # the child's pid on stdout, nothing else; alias: josh lnla
142
+ pid=$(pnpm josh lane:launch "$n") || exit 1 # the child's pid on stdout, nothing else
141
143
  pid=$(pnpm josh lane:launch "$n" --stash "backlogrun: josh latest before lanes") || exit 1 # the first lane only, and only if `josh latest` stashed
142
144
  ```
143
145
 
@@ -33,6 +33,12 @@ authorization, whether it came from a named epic or from the opted-in pool:
33
33
  is Tier A" carries the re-dispatch itself. A released child takes a lane exactly as any batch child
34
34
  does.
35
35
 
36
+ ## The parent does not investigate a lane failure itself
37
+
38
+ **A lane failure whose reason is not on its Issue is read by a unit** — `pnpm josh delegate
39
+ lane-failure-investigation` (joshuafolkken/kit#2947); the parent checks the cited lines and
40
+ `pnpm josh issue:state` before it parks, re-dispatches or files.
41
+
36
42
  ## `needs-human-review` — the one stop that is not a park
37
43
 
38
44
  A child carrying **`needs-human-review`** is degraded to a `halfrun`-shaped stop and **the whole run ends
@@ -48,13 +48,13 @@ for a whole interval (that exit says so on standard error). **Nothing in flight
48
48
 
49
49
  **`--mark` at every real report.** Whenever this loop reports something of its own — a child merged,
50
50
  parked, a stop — run `pnpm josh run:progress --mark` in the same turn to restart the silence clock. The clock is silence, never a timer
51
- (`docs/josh-commands.md` → "`josh run:progress`").
51
+ (`docs/josh-commands-automation.md` → "`josh run:progress`").
52
52
 
53
- **Do not keep a progress clock of your own** — the hook refuses the arm rather than asking.
54
- `scripts/rules/early-heartbeat.ts` → `decide` refuses a sleep-only `Bash` call on three tests — a timer it already allowed is still live, the
55
- report it would produce would land before the interval is up, or the wait runs longer than the interval
56
- — so **a single correctly-spaced arm is allowed**. It is still not the way to report; the step above
57
- prints without arming anything, and `--wait` is not a wait timer.
53
+ **Do not keep a progress clock of your own** — the hook refuses the arm rather than asking
54
+ (`scripts/rules/early-heartbeat.ts` → `decide`), though **a single correctly-spaced arm is allowed**. It
55
+ is still not the way to report; the step above prints without arming anything, and `--wait` is not a
56
+ wait timer. Rationale: `docs/maintainers/backlogrun-progress-rationale.md` → "Why the heartbeat reads
57
+ as it does".
58
58
 
59
59
  **The default interval is twenty minutes, overridable — by the person, not the run.**
60
60
  `JOSH_PROGRESS_INTERVAL_MINUTES` moves both sides (the guard reads it through the watcher's reader);
@@ -65,14 +65,11 @@ moves the watcher alone** — it makes the watcher quieter than the floor, never
65
65
  **Every unscheduled progress statement is answered by `pnpm josh run:progress --once`** — presented in
66
66
  the same five field lines, the reply to an explicit ask and the note just after a run starts alike.
67
67
  **Never write a clock time the command did not print** (not an approximation, not a placeholder — where
68
- a field is missing, say so). **`--once` records the report**, so no `--mark` beside it. **A live timer
69
- is counted from the record the guard writes when it allows one**, never from the machine's `sleep`
70
- processes.
68
+ a field is missing, say so). **`--once` records the report**, so no `--mark` beside it.
71
69
 
72
70
  **Every report opens with the time the observation was taken** — not only how long it has been quiet: an
73
- absolute instant, `at YYYY-MM-DD HH:MM±HH:MM / YYYY-MM-DDTHH:MMZ`. **The date is part of it**, and **the local clock
74
- leads with UTC beside it and the offset that ties them**. **It is added, never substituted for the
75
- elapsed figure**, and **the presented line needs no stamp computed for it** — the command prints the
71
+ absolute instant, `at YYYY-MM-DD HH:MM±HH:MM / YYYY-MM-DDTHH:MMZ`. **It is added, never substituted for
72
+ the elapsed figure**, and **the presented line needs no stamp computed for it** — the command prints the
76
73
  `at` stamp and the `next` field.
77
74
 
78
75
  **The line carries observations, never "still running", and nothing in it is a verification result** —
@@ -87,8 +84,8 @@ promoted to interrupt, never demoted to requested.**
87
84
 
88
85
  **The report surface belongs to the run, not to the session** (joshuafolkken/kit#2207). The run's
89
86
  session-facing events — a plan posted, a child launched, a PR opened, a review round, a park, a cut, a
90
- stop, a merge — are appended to one ordered stream keyed to the run's identity (`pnpm josh run:event`),
91
- which survives the cut because it is the run's and not any one session's. **Every session is a writer;
87
+ stop, a merge — are appended to one ordered stream keyed to the run's identity (`pnpm josh run:event`).
88
+ **Every session is a writer;
92
89
  the reader is a script in a pane of the person's own, never a conversation** (#2492):
93
90
  `pnpm josh run:event --watch` prints each event the moment it lands, in the session language, and the
94
91
  `heartbeat` events say the run is alive when quiet. **No session relays the stream** — name the watch command once, at the first cut or when
@@ -106,8 +103,7 @@ remaining child blocked behind a parked one, the backlog drained of anything run
106
103
  streak tripped — is pushed to the interrupt tier: `pnpm josh run:carry --end --stopped "<reason>"` sends one ⏸️ confirmation
107
104
  as it ends the record, and because the record is gone by the second `--end` the same stop never notifies
108
105
  twice. A parked child is pushed by the child itself, which records the park and sends its own
109
- `confirmation` before it stops (`backlogrun-park.md`). **Nothing new carries either one** — both ride the
110
- existing notification types and the record the watcher already keeps. Rationale for the tiers:
106
+ `confirmation` before it stops (`backlogrun-park.md`). Rationale for the tiers:
111
107
  `docs/maintainers/backlogrun-progress-rationale.md` → "Why the signal tiers are split this way".
112
108
 
113
109
  **A heartbeat is emitted from the moment a run has started, even before any child carries
@@ -146,9 +142,8 @@ long.
146
142
  watcher's scope and placement: `docs/maintainers/backlogrun-progress-rationale.md` → "Why the watcher
147
143
  runs where it does".
148
144
 
149
- **A run that merges needs no teardown; a run that stops has to end the reporting itself.** The issue
150
- leaves the `in-progress` listing at the merge, so whatever is waiting prints nothing and `--hours` ends
151
- it. **A stop keeps that label on purpose** — so **no further `--wait` is started** after the stop
145
+ **A run that merges needs no teardown; a run that stops has to end the reporting itself.** **A stop
146
+ keeps the `in-progress` label on purpose** — so **no further `--wait` is started** after the stop
152
147
  notification, and any long-running watcher still in the background is stopped in the same turn. That
153
148
  covers `halfrun`'s stop before commit, a `needs-human-review` stop, a split or prerequisite stop, and
154
149
  a `backlogrun` named issue's failure stop.
@@ -167,9 +162,9 @@ answers=$(pnpm josh epic:next 858 909 --repo joshuafolkken/kit --lanes)
167
162
  # every named epic, merged into the same pool — "Several epics in one run" above
168
163
  ```
169
164
 
170
- **`--lanes` is the form to use.** A lane's branch is `<N>-lane`, which `pnpm josh git` commits from, so
171
- a child handed a lane runs the whole `fullrun` procedure inside it. Read a line per child, and treat a
172
- single non-numeric line as the verdict.
165
+ **`--lanes` is the form to use.** Read a line per child, and treat a single non-numeric line as the
166
+ verdict. Rationale: `docs/maintainers/backlogrun-progress-rationale.md` → "Why a named epic's children
167
+ run in lanes".
173
168
 
174
169
  1. Run the command above.
175
170
  2. **One or more numbers** — where the child runs in this session's own checkout, its `fullrun` claim
@@ -317,8 +312,8 @@ the next turn of this session costs more than the threshold in billed input.
317
312
 
318
313
  **135,000 is shared by the scheduler entry, scheduler hand-off and lane worker implementation cut.**
319
314
  The value is `CONTEXT_CUT_THRESHOLD` in `scripts/cost-runtime/context-cut-threshold.ts`; `cost --cut`,
320
- `run:merge` and `run_cut.IMPLEMENTATION_CONTEXT_THRESHOLD` all read it rather than carrying separate
321
- numbers. The output ceiling and the entry-read figure are a separate 150,000, not this threshold.
315
+ `run:merge`, `run_cut.IMPLEMENTATION_CONTEXT_THRESHOLD` and the parent hand-off guard all read it. The
316
+ output ceiling and the entry-read figure are a separate 150,000, not this threshold.
322
317
 
323
318
  ### The check is asked at every merge, and delegation does not excuse it
324
319
 
@@ -333,7 +328,7 @@ answer, and take `over`'s branch at that child.
333
328
 
334
329
  ### When to ask, and what to do
335
330
 
336
- **Ask once per child, immediately after its merge and `pnpm josh ms`** — never mid-child.
331
+ **Ask once per child, immediately after its merge and `pnpm josh ms`**; mid-child, a hook asks (#2947).
337
332
 
338
333
  ### A parent without a completion callback hands off at its first dispatch
339
334
 
@@ -443,10 +438,9 @@ survive the cut is re-dispatched, never adopted** — `pnpm josh lane:open <N>`
443
438
  progress comment is generated from it** (joshuafolkken/kit#2024) — children run, Issues filed,
444
439
  **consecutive failures**, and the time the run started. `pnpm josh run:merge` writes the merge into
445
440
  the record and mirrors the counters onto the epic comment at every child's merge. **The
446
- consecutive-failure count is the one that matters** — the stopped-unit section leans on it to notice
447
- the environment is at fault, and a merge resets it. **The record survives a session cut and a
448
- compaction alike.** Rationale: `docs/maintainers/backlogrun-progress-rationale.md` → "Why state lives
449
- in records, not the conversation".
441
+ consecutive-failure count is the one that matters**, and a merge resets it. Rationale:
442
+ `docs/maintainers/backlogrun-progress-rationale.md` → "Why state lives in records, not the
443
+ conversation".
450
444
 
451
445
  ### What carries over, and where it lives
452
446
 
@@ -463,16 +457,18 @@ in records, not the conversation".
463
457
 
464
458
  ## Waiting, and never waiting forever
465
459
 
466
- | Setting | Value | Why |
460
+ | Setting | Value | Meaning |
467
461
  | --- | --- | --- |
468
462
  | Polling interval | 60 s | **A floor between two asks, never a clock the parent sets.** It bounds a re-ask made while the parent is *already awake*; what wakes it is "The parent keeps no clock of its own" below. |
469
463
  | `backlogrun` idle-watch poll | 5 min | Not the interval above, and a floor in the same sense. |
470
464
  | Silent delegated unit | 30 min | Not the child's duration — the time its output has gone **unchanged**. Past it, run the traces above and book a stopped unit as a failure. |
471
- | Stale `in-progress` | 90 min | Longer than any single child has taken; past it, the other session is gone. |
465
+ | Stale `in-progress` | 90 min | Past it, the other session is gone. |
472
466
  | Publish wait | 10 min | `josh propagate`'s own budget. A failed publish never appears. |
473
- | Whole run | 8 h | An unattended run that has not finished overnight needs a person, not more waiting. |
467
+ | Whole run | 8 h | Past it, the run needs a person. |
474
468
 
475
- Each timeout **ends the wait and reports** — none is retried indefinitely. A stale child's label is
469
+ Each timeout **ends the wait and reports** — none is retried indefinitely. Rationale for the figures:
470
+ `docs/maintainers/backlogrun-progress-rationale.md` → "Why the parent waits on classification, not a
471
+ clock". A stale child's label is
476
472
  removed first, so the next poll can offer it. **A graph that has deadlocked on a cycle is not this loop's
477
473
  to untangle**: `epic:next` detects it and exits with an error.
478
474
 
@@ -487,9 +483,7 @@ source and `run:report` the final report.
487
483
  `docs/maintainers/backlogrun-progress-rationale.md` → "Why the parent waits on classification, not a
488
484
  clock".
489
485
 
490
- The driver checks lane completion every five seconds and makes a new backlog offer no sooner than one
491
- minute after the previous offer, except after collecting a child — waits that cost no AI turns. The
492
- watcher reports on its own interval, and a judgment session may take its exit as a prompt to act.
486
+ The watcher reports on its own interval, and a judgment session may take its exit as a prompt to act.
493
487
 
494
488
  #### The wake exists only while something is in flight
495
489
 
@@ -527,7 +521,7 @@ Per-child completion notifications are unchanged: `pnpm josh followup` sends one
527
521
  **start** notification when the run begins, and an epic **completion** summary at the end. **Do not
528
522
  compose that summary by hand — `pnpm josh run:report` generates it from this invocation's events**
529
523
  (joshuafolkken/kit#2249, scoped in #2393): it renders what merged, what parked and why, and what was cut,
530
- reusing `format_event`, closing with the release tail below. Its output is the Telegram body too — pass it to
524
+ closing with the release tail below. Its output is the Telegram body too — pass it to
531
525
  `pnpm josh notify --body-file`.
532
526
 
533
527
  **That same session asks `pnpm josh release:scope` once, after the last child has merged** — in the