@joshuafolkken/kit 1.1050.0 → 1.1128.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 (630) hide show
  1. package/.claude/settings.json +9 -8
  2. package/.claude/skills/epic-commands/SKILL.md +5 -7
  3. package/.claude/skills/workflow-commands/SKILL.md +20 -12
  4. package/.claude/skills/workflow-commands/background-commands.md +36 -84
  5. package/.claude/skills/workflow-commands/backlogrun-child.md +1 -1
  6. package/.claude/skills/workflow-commands/backlogrun-lanes.md +8 -6
  7. package/.claude/skills/workflow-commands/backlogrun-progress.md +30 -33
  8. package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -12
  9. package/.claude/skills/workflow-commands/backlogrun.md +2 -2
  10. package/.claude/skills/workflow-commands/chain-rule.md +4 -2
  11. package/.claude/skills/workflow-commands/delegation.md +3 -3
  12. package/.claude/skills/workflow-commands/followup-reference.md +1 -1
  13. package/.claude/skills/workflow-commands/followup.md +7 -3
  14. package/.claude/skills/workflow-commands/fullrun-steps.md +3 -2
  15. package/.claude/skills/workflow-commands/fullrun.md +8 -6
  16. package/.claude/skills/workflow-commands/halfrun.md +19 -21
  17. package/.claude/skills/workflow-commands/issue-comments.md +1 -1
  18. package/.claude/skills/workflow-commands/issue-fold-existing.md +10 -10
  19. package/.claude/skills/workflow-commands/issue-scout.md +1 -1
  20. package/.claude/skills/workflow-commands/kickoff.md +9 -4
  21. package/.claude/skills/workflow-commands/latest-gate.md +8 -16
  22. package/.claude/skills/workflow-commands/needs-human-review.md +1 -1
  23. package/.claude/skills/workflow-commands/observation-filing.md +3 -3
  24. package/.claude/skills/workflow-commands/pre-gate-cut.md +4 -8
  25. package/.claude/skills/workflow-commands/prerequisite.md +1 -1
  26. package/.claude/skills/workflow-commands/prrun.md +36 -0
  27. package/.claude/skills/workflow-commands/retrospective.md +1 -1
  28. package/.claude/skills/workflow-commands/split-assessment.md +4 -18
  29. package/.claude/skills/workflow-commands/working-tree-hold.md +22 -2
  30. package/.codex/hooks.json +16 -20
  31. package/.github/actions/setup-node/action.yml +33 -0
  32. package/.github/actions/setup-pnpm/action.yml +93 -0
  33. package/.github/dependabot.yml +5 -1
  34. package/.github/workflows/auto-tag.yml +2 -3
  35. package/.github/workflows/ci.yml +31 -134
  36. package/.github/workflows/dependabot-auto-merge.yml +1 -0
  37. package/.github/workflows/pr-classification.yml +6 -44
  38. package/.github/workflows/production.yml +1 -0
  39. package/.github/workflows/publish.yml +43 -47
  40. package/.github/workflows/sonar-qube.yml +41 -4
  41. package/.pnpmfile.mjs +29 -0
  42. package/AGENTS.md +5 -2
  43. package/CLAUDE.md +33 -27
  44. package/GEMINI.md +5 -2
  45. package/README.md +66 -20
  46. package/SECURITY.md +37 -6
  47. package/cspell/index.yaml +6 -1
  48. package/dist/CLAUDE.basic.md +6 -6
  49. package/dist/CLAUDE.md +33 -27
  50. package/dist/CLAUDE.static.md +6 -6
  51. package/dist/config-merge/index.js +48 -12
  52. package/dist/hooks/batch-guard.js +4 -4
  53. package/dist/hooks/{chunk-7VPDUBRN.js → chunk-4JZDP5X5.js} +152 -155
  54. package/dist/hooks/{chunk-HJIISEAC.js → chunk-5SD2YM7Z.js} +5 -13
  55. package/dist/hooks/{chunk-NAS4C7GP.js → chunk-77J7IEQM.js} +2 -2
  56. package/dist/hooks/{chunk-DMQN45FN.js → chunk-7HVB7SZG.js} +3 -3
  57. package/dist/hooks/{chunk-RLDX5SOC.js → chunk-AIOIOMPX.js} +4413 -1970
  58. package/dist/hooks/{chunk-5BK3K7V4.js → chunk-M7QKEKWO.js} +873 -2049
  59. package/dist/hooks/{chunk-WQ4OSBSS.js → chunk-MKVGBQPA.js} +2 -2
  60. package/dist/hooks/{chunk-EJDX2TOB.js → chunk-NXYMNPUQ.js} +7 -88
  61. package/dist/hooks/{chunk-NJQOBE6L.js → chunk-QVLT52OV.js} +2 -7
  62. package/dist/hooks/{chunk-GQ7KP45M.js → chunk-XYUIQOW3.js} +2 -2
  63. package/dist/hooks/codex-hook-adapter.js +12 -48
  64. package/dist/hooks/duplicate-read-guard.js +5 -5
  65. package/dist/hooks/format-edited.js +2 -2
  66. package/dist/hooks/inputs.json +280 -0
  67. package/dist/hooks/investigation-guard.js +5 -5
  68. package/dist/hooks/pretool-guard.js +9 -9
  69. package/dist/hooks/session-lang.js +0 -1
  70. package/dist/hooks/stop-guard.js +192 -333
  71. package/dist/josh.js +240 -148
  72. package/dist/managed-marker/index.js +2 -1
  73. package/dist/version/index.js +70 -78
  74. package/eslint/rules/promise.js +5 -0
  75. package/eslint/rules/unicorn.js +3 -2
  76. package/package.json +26 -5
  77. package/pnpm-workspace.yaml +5 -7
  78. package/prompts/collaboration-workflow/glossary.md +17 -0
  79. package/prompts/collaboration-workflow/issue-citation.md +5 -5
  80. package/prompts/collaboration-workflow/issue-template.md +1 -1
  81. package/prompts/collaboration-workflow/operating-rules.md +5 -5
  82. package/prompts/collaboration-workflow/overview.md +13 -1
  83. package/prompts/collaboration-workflow/principles.md +9 -0
  84. package/prompts/collaboration-workflow/report-format.md +1 -1
  85. package/prompts/collaboration-workflow/residency.md +3 -3
  86. package/prompts/collaboration-workflow/rule-delivery.md +1 -1
  87. package/prompts/collaboration-workflow/turn-batching.md +3 -3
  88. package/prompts/collaboration-workflow/upstream-interrupt.md +1 -1
  89. package/prompts/collaboration-workflow/wip-cap.md +25 -22
  90. package/prompts/collaboration-workflow.md +6 -8
  91. package/prompts/review-rubric.md +1 -1
  92. package/prompts/review.md +3 -3
  93. package/prompts/sonar-hotspot-handling.md +11 -3
  94. package/prompts/testing-guide.md +3 -3
  95. package/scripts/adopt/adopt-toolkits.ts +0 -2
  96. package/scripts/adopt/adopt.ts +0 -2
  97. package/scripts/agent/agent-argv.ts +0 -2
  98. package/scripts/agent/agent-diagnostics.ts +1 -1
  99. package/scripts/agent/agent-role-profile.ts +0 -7
  100. package/scripts/agent/claude-agent-argv.ts +0 -2
  101. package/scripts/agent/codex-agent-argv.ts +1 -1
  102. package/scripts/agent/codex-hooks.ts +92 -0
  103. package/scripts/agent/interactive-ask.ts +1 -1
  104. package/scripts/auto-ok/auto-ok-cli.ts +6 -16
  105. package/scripts/backlog/backlog-arrival.ts +30 -10
  106. package/scripts/backlog/backlog-budget-cli.ts +15 -16
  107. package/scripts/backlog/backlog-budget.ts +0 -2
  108. package/scripts/backlog/backlog-defect-priority.ts +2 -2
  109. package/scripts/backlog/backlog-drive-cli.ts +10 -8
  110. package/scripts/backlog/backlog-drive-named-offer.ts +16 -3
  111. package/scripts/backlog/backlog-drive-named.ts +2 -1
  112. package/scripts/backlog/backlog-drive.ts +76 -16
  113. package/scripts/backlog/backlog-named.ts +0 -3
  114. package/scripts/backlog/backlog-next.ts +9 -15
  115. package/scripts/backlog/backlog-offer-cli.ts +6 -19
  116. package/scripts/backlog/backlog-plan-cli.ts +1 -7
  117. package/scripts/backlog/backlog-plan.ts +30 -19
  118. package/scripts/backlog/backlog-pool.ts +3 -6
  119. package/scripts/backlog/backlog-rank.ts +2 -2
  120. package/scripts/backlog/backlog-ready.ts +39 -10
  121. package/scripts/backlog/backlog-scope.ts +1 -3
  122. package/scripts/backlog/backlog-stalled-detect.ts +2 -2
  123. package/scripts/backlog/backlog-stalled.ts +0 -1
  124. package/scripts/backlog/backlog-waves.ts +5 -2
  125. package/scripts/behavior/behavior-cli.ts +1 -1
  126. package/scripts/build/build-codex-hooks.ts +26 -0
  127. package/scripts/build/build-hooks.ts +85 -9
  128. package/scripts/build/hook-bundle-stamp.ts +111 -0
  129. package/scripts/cases/cases-cli.ts +1 -1
  130. package/scripts/cases/cases-logic.ts +1 -1
  131. package/scripts/ci/composite-actions.ts +30 -0
  132. package/scripts/ci/pr-classification.ts +3 -3
  133. package/scripts/claude/workflow-destination.ts +10 -1
  134. package/scripts/clone/clone-fingerprint.ts +0 -1
  135. package/scripts/clone/clone-scan-cli.ts +1 -1
  136. package/scripts/clone/clone-scan.ts +1 -1
  137. package/scripts/config-merge/json-format.ts +0 -1
  138. package/scripts/config-merge/parse-jsonc.ts +33 -3
  139. package/scripts/config-merge/patch-json-key.ts +13 -6
  140. package/scripts/config-merge/patch-yaml-list.ts +1 -1
  141. package/scripts/cost-runtime/codex-usage.ts +2 -9
  142. package/scripts/cost-runtime/cost-attribute.ts +0 -1
  143. package/scripts/cost-runtime/cost-cli.ts +3 -10
  144. package/scripts/cost-runtime/cost-corpus.ts +0 -2
  145. package/scripts/cost-runtime/cost-format.ts +0 -3
  146. package/scripts/cost-runtime/cost-pricing.ts +0 -1
  147. package/scripts/cost-runtime/cost-tokens.ts +0 -1
  148. package/scripts/delegation/delegation-cli.ts +1 -1
  149. package/scripts/delegation/delegation-policy.ts +0 -1
  150. package/scripts/delegation/duplicate-read-guard.ts +0 -8
  151. package/scripts/delegation/fanout-cli.ts +1 -1
  152. package/scripts/delegation/fanout.ts +0 -2
  153. package/scripts/delegation/investigation-reads.ts +1 -164
  154. package/scripts/discovery/repo-map-logic.ts +0 -1
  155. package/scripts/discovery/repo-party-cli.ts +1 -1
  156. package/scripts/doctor/doctor-consumer.ts +6 -10
  157. package/scripts/doctor/doctor-io.ts +9 -13
  158. package/scripts/doctor/doctor-logic.ts +0 -4
  159. package/scripts/doctor/doctor.ts +14 -9
  160. package/scripts/document/backlogrun-parent-read-set.ts +12 -1
  161. package/scripts/document/document-byte-budget.ts +5 -5
  162. package/scripts/document/document-byte-check.ts +0 -1
  163. package/scripts/document/document-read-cli.ts +0 -2
  164. package/scripts/document/document-section-cli.ts +1 -1
  165. package/scripts/document/document-section.ts +0 -3
  166. package/scripts/document/edit-files-cli.ts +0 -1
  167. package/scripts/document/entry-read-budget.ts +21 -7
  168. package/scripts/document/entry-read-set.ts +32 -8
  169. package/scripts/document/lane-child-read-set.ts +8 -6
  170. package/scripts/document/read-files-cli.ts +0 -4
  171. package/scripts/document/read-set-cli.ts +0 -2
  172. package/scripts/document/read-set-point-of-use.ts +9 -3
  173. package/scripts/document/read-set-pricing.ts +0 -1
  174. package/scripts/document/read-set-trim.ts +4 -2
  175. package/scripts/epic/epic-add.ts +1 -1
  176. package/scripts/epic/epic-audit-cli.ts +1 -4
  177. package/scripts/epic/epic-audit-orphans.ts +1 -3
  178. package/scripts/epic/epic-audit-rationale.ts +0 -1
  179. package/scripts/epic/epic-audit-report.ts +0 -2
  180. package/scripts/epic/epic-audit.ts +8 -22
  181. package/scripts/epic/epic-bundle-cli.ts +1 -1
  182. package/scripts/epic/epic-bundle-evidence.ts +0 -1
  183. package/scripts/epic/epic-bundle-referenced.ts +1 -5
  184. package/scripts/epic/epic-bundle.ts +0 -4
  185. package/scripts/epic/epic-busy.ts +4 -5
  186. package/scripts/epic/epic-candidate-confirm.ts +0 -5
  187. package/scripts/epic/epic-classify.ts +2 -2
  188. package/scripts/epic/epic-cli-argv.ts +0 -1
  189. package/scripts/epic/epic-close-comment.ts +1 -1
  190. package/scripts/epic/epic-close.ts +5 -2
  191. package/scripts/epic/epic-cross-repo.ts +2 -4
  192. package/scripts/epic/epic-decision.ts +0 -1
  193. package/scripts/epic/epic-fetch.ts +2 -2
  194. package/scripts/epic/epic-index.ts +2 -3
  195. package/scripts/epic/epic-issue.ts +1 -15
  196. package/scripts/epic/epic-lane-offer.ts +9 -8
  197. package/scripts/epic/epic-nested.ts +1 -1
  198. package/scripts/epic/epic-next-read.ts +1 -3
  199. package/scripts/epic/epic-next-views.ts +0 -1
  200. package/scripts/epic/epic-next.ts +1 -10
  201. package/scripts/epic/epic-parse.ts +0 -1
  202. package/scripts/epic/epic-promote.ts +0 -9
  203. package/scripts/epic/epic-rank.ts +2 -2
  204. package/scripts/epic/epic-read.ts +1 -2
  205. package/scripts/epic/epic-reconcile.ts +1 -1
  206. package/scripts/epic/epic-reference.ts +1 -13
  207. package/scripts/epic/epic-relation-recheck.ts +1 -1
  208. package/scripts/epic/epic-relations.ts +1 -1
  209. package/scripts/epic/epic-remove.ts +1 -1
  210. package/scripts/epic/epic-report.ts +0 -1
  211. package/scripts/epic/epic-run.ts +2 -3
  212. package/scripts/epic/epic-shape.ts +1 -1
  213. package/scripts/epic/epic-solo-stale.ts +107 -0
  214. package/scripts/epic/epic-solo.ts +3 -2
  215. package/scripts/epic/epic-triage.ts +1 -1
  216. package/scripts/epic/epic-validate.ts +1 -1
  217. package/scripts/epic/epic.ts +1 -1
  218. package/scripts/exports/unused-members-cli.ts +53 -0
  219. package/scripts/{git → followup}/followup-issue-number.ts +1 -6
  220. package/scripts/{git → followup}/git-followup-cleanup.ts +2 -1
  221. package/scripts/{git → followup}/git-followup-finish.ts +1 -3
  222. package/scripts/{git → followup}/git-followup-flush.ts +2 -2
  223. package/scripts/{git → followup}/git-followup-issue-close.ts +2 -2
  224. package/scripts/{git → followup}/git-followup-label.ts +4 -4
  225. package/scripts/followup/git-followup-merged.ts +112 -0
  226. package/scripts/{git → followup}/git-followup-pending.ts +1 -1
  227. package/scripts/{git → followup}/git-followup-workflow.ts +19 -11
  228. package/scripts/{git → followup}/git-pr-followup-wrapup.ts +9 -3
  229. package/scripts/{git → followup}/git-pr-followup.ts +53 -16
  230. package/scripts/gate/core-budget.ts +3 -9
  231. package/scripts/gate/gate-plan.ts +7 -4
  232. package/scripts/gate/gate-report.ts +0 -6
  233. package/scripts/gate/gate-tree.ts +1 -1
  234. package/scripts/gate/pre-commit-type-check.ts +0 -6
  235. package/scripts/gate/project-checks.ts +7 -8
  236. package/scripts/gate/scoped-green.ts +0 -1
  237. package/scripts/gate/type-check-step.ts +1 -1
  238. package/scripts/gate/verification-gate.ts +0 -2
  239. package/scripts/gh/fix-gh-packages.ts +15 -12
  240. package/scripts/gh/gh-spawn.ts +2 -2
  241. package/scripts/{git → gh}/git-ai-review-scan.ts +1 -5
  242. package/scripts/{git → gh}/git-gh-check.ts +2 -1
  243. package/scripts/{git → gh}/git-gh-exec.ts +1 -1
  244. package/scripts/{git → gh}/git-gh-failure.ts +1 -1
  245. package/scripts/{git → gh}/git-gh-helpers.ts +0 -1
  246. package/scripts/{git → gh}/git-gh-issue-list.ts +13 -10
  247. package/scripts/{git → gh}/git-gh-issue-read.ts +1 -1
  248. package/scripts/{git → gh}/git-gh-issue-rest.ts +6 -3
  249. package/scripts/{git → gh}/git-gh-issue-write.ts +4 -1
  250. package/scripts/{git → gh}/git-gh-pr-auto-merge.ts +4 -1
  251. package/scripts/{git → gh}/git-gh-pr-read.ts +24 -0
  252. package/scripts/{git → gh}/git-gh-pr-rest.ts +5 -2
  253. package/scripts/{git → gh}/git-gh-pr-review.ts +2 -2
  254. package/scripts/{git → gh}/git-gh-pr-rollup.ts +1 -3
  255. package/scripts/{git → gh}/git-gh-pr.ts +3 -1
  256. package/scripts/{git → gh}/git-pr-ai-review.ts +2 -5
  257. package/scripts/{git → gh}/git-pr-checks-eval.ts +0 -10
  258. package/scripts/{git → gh}/git-pr-checks-parse.ts +4 -20
  259. package/scripts/{git → gh}/git-pr-checks.ts +2 -1
  260. package/scripts/{git → gh}/git-pr-coderabbit.ts +2 -5
  261. package/scripts/{git → gh}/git-pr-confirmation.ts +1 -3
  262. package/scripts/{git → gh}/git-pr-managed-config.ts +2 -3
  263. package/scripts/{git → gh}/git-pr.ts +3 -3
  264. package/scripts/git/changed-file-scope.ts +0 -1
  265. package/scripts/git/git-branch.ts +3 -6
  266. package/scripts/git/git-command.ts +6 -1
  267. package/scripts/git/git-commit.ts +1 -1
  268. package/scripts/git/git-common-directory.ts +80 -24
  269. package/scripts/git/git-error.ts +66 -9
  270. package/scripts/git/git-issue.ts +1 -1
  271. package/scripts/git/git-preflight.ts +2 -2
  272. package/scripts/git/git-prompt.ts +6 -31
  273. package/scripts/git/git-push.ts +1 -1
  274. package/scripts/git/git-spawn-sync.ts +65 -0
  275. package/scripts/git/git-spawn.ts +5 -4
  276. package/scripts/git/git-staging.ts +1 -0
  277. package/scripts/git/git-status.ts +1 -1
  278. package/scripts/git/git-workflow.ts +1 -1
  279. package/scripts/git/gone-branch.ts +1 -0
  280. package/scripts/git/listing-cutoff.ts +1 -1
  281. package/scripts/git/main-merge.ts +1 -1
  282. package/scripts/git/main-sync.ts +19 -1
  283. package/scripts/git/parse-json-array.ts +0 -3
  284. package/scripts/git/repository-lock.ts +16 -16
  285. package/scripts/git/{git-stash.ts → stash/git-stash.ts} +1 -1
  286. package/scripts/git/{stash-pop-args.ts → stash/stash-pop-args.ts} +2 -7
  287. package/scripts/git/{stash-pop-cli.ts → stash/stash-pop-cli.ts} +0 -1
  288. package/scripts/git/{stash-sweep-lock.ts → stash/stash-sweep-lock.ts} +3 -3
  289. package/scripts/hooks/codex-hook-adapter.ts +0 -1
  290. package/scripts/hooks/edited-cspell.ts +1 -1
  291. package/scripts/hooks/format-edited-file.ts +2 -0
  292. package/scripts/hooks/pre-push-unit.ts +0 -4
  293. package/scripts/hooks/pretool-guard.ts +22 -4
  294. package/scripts/hooks/reserved-run.ts +1 -1
  295. package/scripts/hooks/step-zero-notice.ts +76 -0
  296. package/scripts/hooks/stop-guard.ts +47 -21
  297. package/scripts/init/claude-plugin-config.ts +4 -5
  298. package/scripts/init/hook-command-rewrite.ts +16 -8
  299. package/scripts/init/hook-launch.ts +41 -15
  300. package/scripts/init/init-basic.ts +2 -5
  301. package/scripts/init/init-file-action.ts +54 -0
  302. package/scripts/init/init-logic-migrate.ts +35 -17
  303. package/scripts/init/init-logic-secretlint.ts +1 -1
  304. package/scripts/init/init-logic.ts +10 -19
  305. package/scripts/init/init.ts +11 -71
  306. package/scripts/init/kit-written-paths.ts +2 -0
  307. package/scripts/init/project-profile.ts +9 -17
  308. package/scripts/init/start-exec.ts +1 -1
  309. package/scripts/init/start-setup-pr.ts +6 -6
  310. package/scripts/init/start-steps.ts +3 -1
  311. package/scripts/issue/behavior-change-lint.ts +0 -1
  312. package/scripts/issue/defect-rate-cli.ts +64 -23
  313. package/scripts/issue/defect-rate.ts +1 -2
  314. package/scripts/{git → issue}/git-next-issues.ts +3 -3
  315. package/scripts/issue/issue-backlinks-cli.ts +1 -5
  316. package/scripts/issue/issue-backlinks.ts +7 -14
  317. package/scripts/issue/issue-cite-cli.ts +2 -6
  318. package/scripts/issue/issue-cite.ts +12 -8
  319. package/scripts/issue/issue-classification.ts +1 -9
  320. package/scripts/issue/issue-closing-pr.ts +4 -4
  321. package/scripts/issue/issue-comment-cli.ts +2 -2
  322. package/scripts/issue/issue-file-cli.ts +5 -5
  323. package/scripts/issue/issue-file.ts +7 -14
  324. package/scripts/issue/issue-fold-cli.ts +1 -1
  325. package/scripts/issue/issue-fold-existing-cli.ts +1 -1
  326. package/scripts/{git → issue}/issue-labels.ts +8 -0
  327. package/scripts/issue/issue-lint-cli.ts +1 -1
  328. package/scripts/issue/issue-merged.ts +2 -2
  329. package/scripts/{git → issue}/issue-rank.ts +1 -1
  330. package/scripts/issue/issue-read-cli.ts +8 -47
  331. package/scripts/issue/issue-read.ts +0 -2
  332. package/scripts/issue/issue-report-failures.ts +80 -0
  333. package/scripts/issue/issue-scout-cli.ts +1 -7
  334. package/scripts/issue/issue-scout-closed.ts +2 -2
  335. package/scripts/issue/issue-scout.ts +0 -2
  336. package/scripts/issue/issue-state-cli.ts +5 -46
  337. package/scripts/issue/issue-state.ts +1 -5
  338. package/scripts/issue/markdown-section.ts +21 -6
  339. package/scripts/issue/measure-rerun-cli.ts +74 -15
  340. package/scripts/issue/reproduction-measure.ts +1 -1
  341. package/scripts/josh/cli-body.ts +1 -1
  342. package/scripts/josh/file-map-stamp.ts +0 -3
  343. package/scripts/josh/josh-command-map.ts +2 -0
  344. package/scripts/josh/josh-commands-ai.ts +9 -102
  345. package/scripts/josh/josh-commands-backlog.ts +5 -1
  346. package/scripts/josh/josh-commands-development.ts +8 -1
  347. package/scripts/josh/josh-commands-issue.ts +2 -2
  348. package/scripts/josh/josh-commands-maintenance.ts +7 -0
  349. package/scripts/josh/josh-commands-project.ts +7 -1
  350. package/scripts/josh/josh-commands-run.ts +114 -0
  351. package/scripts/josh/josh-commands-versioning.ts +8 -0
  352. package/scripts/josh/josh-commands-workflow.ts +3 -3
  353. package/scripts/josh/path-decision.ts +0 -3
  354. package/scripts/josh/process-owner.ts +16 -0
  355. package/scripts/josh/run-github-prerequisite.ts +3 -6
  356. package/scripts/josh/session-language-cli.ts +0 -1
  357. package/scripts/lane/lane-await.ts +46 -19
  358. package/scripts/lane/lane-capacity.ts +6 -3
  359. package/scripts/lane/lane-child-invocation.ts +20 -7
  360. package/scripts/lane/lane-cli.ts +1 -4
  361. package/scripts/lane/lane-close.ts +5 -4
  362. package/scripts/lane/lane-dispatch.ts +3 -4
  363. package/scripts/lane/lane-environment.ts +0 -9
  364. package/scripts/lane/lane-handoff.ts +38 -0
  365. package/scripts/lane/lane-launch-cli.ts +31 -27
  366. package/scripts/lane/lane-open.ts +0 -3
  367. package/scripts/lane/lane-output.ts +0 -1
  368. package/scripts/lane/lane-registry.ts +9 -0
  369. package/scripts/lane/openai-lane-ship.ts +2 -0
  370. package/scripts/lane/openai-lane-supervisor-decision.ts +2 -1
  371. package/scripts/lane/openai-lane-supervisor.ts +6 -4
  372. package/scripts/lane/openai-review-broker.ts +7 -1
  373. package/scripts/lib/bounded-pool.ts +1 -0
  374. package/scripts/lib/cli-flags.ts +31 -2
  375. package/scripts/lib/error-message.ts +12 -1
  376. package/scripts/lib/json-value.ts +5 -4
  377. package/scripts/lib/poll.ts +3 -1
  378. package/scripts/lib/timed-fetch.ts +15 -0
  379. package/scripts/lib/timeouts.ts +13 -0
  380. package/scripts/{yaml → lib}/yaml-document.ts +3 -1
  381. package/scripts/{bytes → lines}/bytes-command.ts +0 -2
  382. package/scripts/lines/line-targets.ts +0 -11
  383. package/scripts/lines/lines-command.ts +5 -4
  384. package/scripts/lint/lint-related-scope.ts +0 -1
  385. package/scripts/lint/lint-related.ts +1 -1
  386. package/scripts/{git → notify}/telegram-notify.ts +2 -2
  387. package/scripts/{git → notify}/telegram-test.ts +4 -4
  388. package/scripts/observations/observation-ledger-home.ts +0 -1
  389. package/scripts/observations/observation-ledger-line.ts +0 -1
  390. package/scripts/observations/observation-ledger-migrate.ts +1 -1
  391. package/scripts/observations/observations-flush-landing.ts +3 -3
  392. package/scripts/observations/observations-flush.ts +2 -2
  393. package/scripts/overrides/lockfile-overrides.ts +1 -1
  394. package/scripts/overrides/overrides-logic.ts +1 -1
  395. package/scripts/package/package-scout-cli.ts +2 -7
  396. package/scripts/package/package-scout.ts +0 -2
  397. package/scripts/propagate/propagate-git-failure.ts +0 -1
  398. package/scripts/propagate/propagate-git.ts +3 -10
  399. package/scripts/propagate/propagate-publish.ts +2 -3
  400. package/scripts/propagate/propagate-run.ts +0 -2
  401. package/scripts/propagate/propagate-steps.ts +3 -5
  402. package/scripts/propagate/propagate-targets.ts +0 -4
  403. package/scripts/propagate/propagate.ts +0 -4
  404. package/scripts/refactor/import-graph.ts +0 -1
  405. package/scripts/refactor/refactor-lint.ts +0 -2
  406. package/scripts/refactor/refactor-scan.ts +2 -2
  407. package/scripts/refactor/refactor-targets.ts +0 -1
  408. package/scripts/registry-migration/migrate-logic.ts +28 -21
  409. package/scripts/registry-migration/migrate.ts +25 -14
  410. package/scripts/release/github-release-cli.ts +19 -6
  411. package/scripts/release/github-release-environment.ts +46 -0
  412. package/scripts/release/github-release.ts +151 -94
  413. package/scripts/release/release-history.ts +0 -1
  414. package/scripts/release/release-plan.ts +0 -1
  415. package/scripts/release/release-publish.ts +38 -5
  416. package/scripts/release/release-scope-cli.ts +1 -2
  417. package/scripts/release/release-tag.ts +2 -4
  418. package/scripts/release/release-worktree.ts +97 -2
  419. package/scripts/repo/auto-merge-setting-logic.ts +1 -4
  420. package/scripts/repo/repo-setting.ts +1 -1
  421. package/scripts/repo/repository-labels.ts +3 -3
  422. package/scripts/repo/required-checks-logic.ts +206 -0
  423. package/scripts/repo/required-checks-report.ts +71 -0
  424. package/scripts/repo/ruleset-check-cli.ts +53 -0
  425. package/scripts/repo/ruleset-check.ts +147 -0
  426. package/scripts/report/report-lint-cli.ts +0 -4
  427. package/scripts/review/disposition-cli.ts +1 -1
  428. package/scripts/review/live-evidence.ts +1 -1
  429. package/scripts/review/review-attest-cli.ts +0 -6
  430. package/scripts/review/review-attest.ts +4 -16
  431. package/scripts/review/review-brief-cli.ts +23 -6
  432. package/scripts/review/review-brief.ts +21 -8
  433. package/scripts/review/review-checkout.ts +3 -2
  434. package/scripts/review/review-diff-parts.ts +89 -0
  435. package/scripts/review/review-diff-write.ts +97 -0
  436. package/scripts/review/review-finding-ledger.ts +0 -1
  437. package/scripts/review/review-record-cli.ts +10 -17
  438. package/scripts/review/review-record.ts +0 -1
  439. package/scripts/review/review-round2-cli.ts +1 -1
  440. package/scripts/review/review-stamps.ts +0 -3
  441. package/scripts/review/review-tree.ts +14 -2
  442. package/scripts/rules/decision-oracle-stage.ts +18 -0
  443. package/scripts/rules/decision-oracle.ts +10 -7
  444. package/scripts/rules/delivered-rules.ts +9 -1
  445. package/scripts/rules/destructive-command.ts +119 -0
  446. package/scripts/rules/direct-filing.ts +1 -1
  447. package/scripts/rules/early-heartbeat.ts +4 -3
  448. package/scripts/rules/file-body.ts +0 -3
  449. package/scripts/rules/filing-cap.ts +0 -2
  450. package/scripts/rules/gh-api.ts +7 -2
  451. package/scripts/rules/git-argv.ts +18 -7
  452. package/scripts/rules/git-force.ts +0 -2
  453. package/scripts/rules/implementation-cut.ts +0 -1
  454. package/scripts/rules/index-guard.ts +71 -0
  455. package/scripts/rules/issue-citation.ts +50 -25
  456. package/scripts/rules/lane-background.ts +15 -7
  457. package/scripts/rules/lane-park.ts +22 -6
  458. package/scripts/rules/last-prompt.ts +1 -0
  459. package/scripts/rules/oracle-consulted.ts +1 -1
  460. package/scripts/rules/oracle-firing.ts +1 -0
  461. package/scripts/rules/oracle-list-cli.ts +0 -3
  462. package/scripts/rules/permission-guards.ts +14 -0
  463. package/scripts/rules/protected-files.ts +74 -0
  464. package/scripts/rules/reply-language.ts +1 -1
  465. package/scripts/rules/rule-body-guard.ts +0 -3
  466. package/scripts/rules/rule-value-cli.ts +0 -1
  467. package/scripts/rules/shell-body-trigger.ts +0 -1
  468. package/scripts/rules/shell-segments.ts +0 -1
  469. package/scripts/rules/stop-rules.ts +20 -9
  470. package/scripts/rules/tail-commands.ts +1 -1
  471. package/scripts/rules/test-declared-commit.ts +1 -1
  472. package/scripts/rules/third-party-write.ts +0 -1
  473. package/scripts/rules/worktree-guard.ts +26 -9
  474. package/scripts/run/run-carry-args.ts +8 -12
  475. package/scripts/run/run-carry-cli.ts +0 -2
  476. package/scripts/run/run-carry-stash.ts +2 -2
  477. package/scripts/run/run-carry-streak.ts +1 -1
  478. package/scripts/run/run-cut-args.ts +1 -6
  479. package/scripts/run/run-cut-cli.ts +0 -7
  480. package/scripts/run/run-cut.ts +8 -54
  481. package/scripts/run/run-ending-cli.ts +2 -6
  482. package/scripts/run/run-ending.ts +1 -4
  483. package/scripts/run/run-entry-cli.ts +133 -25
  484. package/scripts/run/run-entry-stop.ts +104 -0
  485. package/scripts/run/run-entry.ts +0 -1
  486. package/scripts/run/run-event-cli.ts +0 -2
  487. package/scripts/run/run-event-follow.ts +1 -0
  488. package/scripts/run/run-event-render.ts +1 -1
  489. package/scripts/run/run-event-scope.ts +53 -4
  490. package/scripts/run/run-event-stream-emit.ts +7 -2
  491. package/scripts/run/run-event-stream.ts +0 -3
  492. package/scripts/run/run-event-watch.ts +1 -0
  493. package/scripts/run/run-halfrun-resume.ts +20 -7
  494. package/scripts/run/run-headless.ts +2 -2
  495. package/scripts/run/run-hold-cli.ts +33 -10
  496. package/scripts/run/run-hold.ts +29 -6
  497. package/scripts/run/run-issue-number.ts +1 -1
  498. package/scripts/run/run-liveness-cli.ts +2 -6
  499. package/scripts/run/run-liveness.ts +2 -3
  500. package/scripts/run/run-merge-cli.ts +7 -23
  501. package/scripts/run/run-merge-steps.ts +5 -5
  502. package/scripts/run/run-merge.ts +1 -1
  503. package/scripts/run/run-next-cli.ts +1 -1
  504. package/scripts/run/run-parent-cut-hook.ts +4 -2
  505. package/scripts/run/run-preflight.ts +2 -9
  506. package/scripts/run/run-prep-cli.ts +6 -3
  507. package/scripts/run/run-prep-locate.ts +1 -1
  508. package/scripts/run/run-progress-args.ts +20 -4
  509. package/scripts/run/run-progress-cli.ts +35 -36
  510. package/scripts/run/run-progress-clock.ts +10 -35
  511. package/scripts/run/run-progress-config.ts +0 -4
  512. package/scripts/run/run-progress-read.ts +1 -2
  513. package/scripts/run/run-progress.ts +1 -2
  514. package/scripts/run/run-prrun-resume.ts +117 -0
  515. package/scripts/run/run-report-cli.ts +1 -2
  516. package/scripts/run/run-report.ts +0 -1
  517. package/scripts/run/run-retrospective.ts +1 -1
  518. package/scripts/run/run-review-cli.ts +0 -3
  519. package/scripts/run/run-review-steps.ts +2 -0
  520. package/scripts/run/run-review.ts +0 -2
  521. package/scripts/run/run-ship-cli.ts +29 -19
  522. package/scripts/run/run-ship-detach.ts +1 -0
  523. package/scripts/run/run-ship-next.ts +106 -0
  524. package/scripts/run/run-ship-preflight.ts +1 -1
  525. package/scripts/run/run-ship-probe.ts +4 -1
  526. package/scripts/run/run-ship-return.ts +8 -3
  527. package/scripts/run/run-ship-review-steps.ts +18 -4
  528. package/scripts/run/run-ship-review.ts +11 -0
  529. package/scripts/run/run-ship-scoped.ts +1 -0
  530. package/scripts/run/run-ship-steps.ts +1 -1
  531. package/scripts/run/run-ship.ts +0 -1
  532. package/scripts/run/run-stage-read.ts +62 -0
  533. package/scripts/run/run-stage.ts +160 -0
  534. package/scripts/run/run-status-cli.ts +3 -16
  535. package/scripts/run/run-step-cli.ts +21 -14
  536. package/scripts/run/run-step.ts +1 -1
  537. package/scripts/run/run-stop-notify.ts +1 -3
  538. package/scripts/run/run-stranded-cli.ts +0 -4
  539. package/scripts/run/run-stranded-detect.ts +2 -2
  540. package/scripts/run/run-tail-cli.ts +17 -11
  541. package/scripts/run/run-tail.ts +2 -0
  542. package/scripts/run/run-tidy-lanes.ts +6 -2
  543. package/scripts/run/run-tidy-stashes.ts +12 -12
  544. package/scripts/run/run-wake-cli.ts +4 -13
  545. package/scripts/run/run-wake-loop.ts +2 -2
  546. package/scripts/run/run-wake.ts +2 -4
  547. package/scripts/run/run-watcher-guard-cli.ts +0 -4
  548. package/scripts/run/run-watcher-guard.ts +18 -12
  549. package/scripts/run/run-watcher-hook.ts +1 -1
  550. package/scripts/safe-chain/ci-installer-pin.ts +11 -5
  551. package/scripts/safe-chain/pack-hook.ts +92 -0
  552. package/scripts/safe-chain/project-config.ts +1 -1
  553. package/scripts/security/security-audit-provision-logic.ts +0 -1
  554. package/scripts/security/security-audit-provision.ts +3 -2
  555. package/scripts/security/security-audit.ts +0 -1
  556. package/scripts/security/security-updates-logic.ts +0 -1
  557. package/scripts/sonar/sonar-hotspots-cli.ts +10 -52
  558. package/scripts/sonar/sonar-hotspots.ts +0 -1
  559. package/scripts/sonar/sonar-new-code-cli.ts +150 -0
  560. package/scripts/sonar/sonar-new-code.ts +79 -0
  561. package/scripts/sonar/sonar-project.ts +97 -0
  562. package/scripts/split/split-assess-cli.ts +1 -1
  563. package/scripts/split/split-assess.ts +2 -5
  564. package/scripts/sync/managed-config-scope-cli.ts +1 -1
  565. package/scripts/sync/skill-migration.ts +0 -1
  566. package/scripts/sync/sync-ai-files.ts +4 -0
  567. package/scripts/sync/sync-hook-safety.ts +2 -3
  568. package/scripts/sync/sync.ts +1 -8
  569. package/scripts/sync/template-source-logic.ts +0 -1
  570. package/scripts/sync/workflow-pin-logic.ts +16 -28
  571. package/scripts/test/test-declared-changed.ts +13 -16
  572. package/scripts/test/test-declared-logic.ts +0 -1
  573. package/scripts/test/test-declared.ts +3 -9
  574. package/scripts/test/test-red-commit.ts +2 -2
  575. package/scripts/test/test-red.ts +14 -7
  576. package/scripts/test/test-type-logic.ts +1 -1
  577. package/scripts/test/unit-worker-share.ts +7 -16
  578. package/scripts/time-runtime/time-batch-guard.ts +1 -2
  579. package/scripts/time-runtime/time-bundle-call.ts +0 -1
  580. package/scripts/time-runtime/time-bundles.ts +0 -4
  581. package/scripts/time-runtime/time-density-hook.ts +0 -2
  582. package/scripts/time-runtime/time-followup-stage.ts +1 -1
  583. package/scripts/time-runtime/time-format.ts +0 -73
  584. package/scripts/time-runtime/time-round-trips.ts +0 -4
  585. package/scripts/time-runtime/time-single-check.ts +1 -1
  586. package/scripts/time-runtime/time-spans.ts +1 -1
  587. package/scripts/time-runtime/time-transcript-line.ts +1 -2
  588. package/scripts/ui/ui-routes-cli.ts +0 -5
  589. package/scripts/ui/ui-routes.ts +0 -5
  590. package/scripts/version/effective-upstream.ts +2 -2
  591. package/scripts/version/latest-corepack.ts +7 -9
  592. package/scripts/version/latest-scope-cli.ts +0 -2
  593. package/scripts/version/latest-update.ts +0 -2
  594. package/scripts/version/npm-registry.ts +2 -2
  595. package/scripts/version/publishable-range-check.ts +1 -1
  596. package/scripts/version/release-hold.ts +0 -4
  597. package/scripts/version/running-binary.ts +2 -2
  598. package/scripts/version/version-check-logic.ts +0 -2
  599. package/scripts/version/version-commands.ts +11 -1
  600. package/scripts/version/version-remote.ts +3 -3
  601. package/scripts/version/version-targets.ts +4 -4
  602. package/templates/CLAUDE.basic.md +6 -6
  603. package/templates/sonar-project.properties +28 -1
  604. package/templates/workflows/ci.yml +16 -82
  605. package/templates/workflows/dependabot-auto-merge.yml +6 -3
  606. package/templates/workflows/github-release.yml +79 -0
  607. package/tsconfig.sonar.json +4 -22
  608. package/prompts/collaboration-workflow/cross-repo-epic.md +0 -5
  609. package/prompts/collaboration-workflow/epic-audit.md +0 -5
  610. package/prompts/collaboration-workflow/epic-bundle.md +0 -5
  611. package/scripts/init/plugin-install-hint.ts +0 -47
  612. package/scripts/version/parse-json.ts +0 -13
  613. /package/scripts/{git → followup}/git-followup-stages.ts +0 -0
  614. /package/scripts/{git → gh}/git-gh-api-path.ts +0 -0
  615. /package/scripts/{git → gh}/git-gh-command.ts +0 -0
  616. /package/scripts/{git → gh}/git-gh-issue.ts +0 -0
  617. /package/scripts/{git → gh}/git-gh-pr-snapshot.ts +0 -0
  618. /package/scripts/{git → gh}/git-gh-reachability.ts +0 -0
  619. /package/scripts/{git → gh}/git-gh-repo.ts +0 -0
  620. /package/scripts/{git → gh}/git-gh-rest-state.ts +0 -0
  621. /package/scripts/{git → gh}/git-pr-checks-watch.ts +0 -0
  622. /package/scripts/{git → gh}/git-pr-error.ts +0 -0
  623. /package/scripts/{git → gh}/git-pr-messages.ts +0 -0
  624. /package/scripts/{git → gh}/github-issue-url.ts +0 -0
  625. /package/scripts/git/{stash-orphans.ts → stash/stash-orphans.ts} +0 -0
  626. /package/scripts/{git → issue}/issue-reference.ts +0 -0
  627. /package/scripts/{git → lib}/animation-helpers.ts +0 -0
  628. /package/scripts/{git → lib}/git-animation.ts +0 -0
  629. /package/scripts/{git → notify}/git-notify.ts +0 -0
  630. /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
@@ -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
@@ -115,13 +116,13 @@ 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
- | 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) |
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` |
125
+ | Same turn as the hold (not a dispatched child, not `kickoff`) | `pnpm josh cost --cut`; `under` continues, `over` stops — `run:entry` notifies and runs `run:release` (by hand for `new`) | `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` |
127
128
  | Something worth filing, none of the three | File it without asking (Tier A, first-party) and carry on; a delegated child returns it to the parent instead | §2i → `observation-filing.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
@@ -28,83 +28,39 @@ command finished.
28
28
 
29
29
  **Never hand-write a `while`/`until` … `sleep` loop over the output file.** The loop does not know
30
30
  when the command finished: a regex that never matches waits to the block limit, and one that matches
31
- a mid-run line exits too early — either way a full-context round trip is spent for nothing. Six lanes
32
- lost about 45 minutes, 13% of their wall clock, to exactly this (joshuafolkken/kit#2371), and in the
33
- worst case a lane grepped a merged PR's output file for 30 minutes after the merge had already
34
- landed. `pnpm josh rule:guard` refuses the poll loop and hands back this route, so the guarantee is a
35
- mechanism rather than prose to remember (`prompts/collaboration-workflow/rule-delivery.md`).
31
+ a mid-run line exits too early. `pnpm josh rule:guard` refuses the poll loop and hands back this route
32
+ (`prompts/collaboration-workflow/rule-delivery.md`). Rationale:
33
+ `docs/maintainers/background-commands-rationale.md` → "Why a poll loop is refused".
36
34
 
37
35
  **To glance at interim output, `Read` the output file once** — the notification names its path — and
38
36
  never in a sleep loop. If what you are waiting on is CI, `pnpm josh followup` waits on it for you in
39
37
  the foreground; a bare `sleep` that arms a progress heartbeat is `run:progress --wait`'s job, refused
40
- in front of a hand-armed timer by `early-heartbeat` (joshuafolkken/kit#1570). This loop is the case
41
- that rule leaves alone by design, because a loop ends on a condition rather than a clock — and here
42
- the condition it ends on is the wrong one.
43
-
44
- ## Decision record
45
-
46
- This document is read at its point of use, not at the entry: it binds only after the first edit —
47
- at the gate, the push, the CI wait and `pnpm josh followup` — so it is fetched in full, in the turn
48
- that reaches the first backgroundable command (`pnpm josh gate`), by the run that has to obey it
49
- (`SKILL.md` → §1, "Five documents are read at the point of use"). `SKILL.md` → §2h is the resident
50
- pointer to it, and carries the one thing it does not: the same rule at a batch's scale.
51
-
52
- **A run's idle time collects in its tail, and the two ways it collects there are one mistake**
53
- (joshuafolkken/kit#1510). `fullrun #1501` ran 45m03s on about 17 minutes of work. Of the 25 minutes
54
- nothing was running, **6m28s** was a `pnpm josh git -y` issued in the **foreground** with a
55
- 900-second tool timeout — above the harness's own 600-second cap, so the harness detached it at the
56
- cap and nothing read the output file for six and a half minutes afterwards — and **6m06s** was bare
57
- CI: the push landed, the turn ended, and the merge started only once the person asked whether it was
58
- merging. Both halves handed the deciding of *when to look back* to something that was never going to
59
- decide it.
60
-
61
- **Issue it in the background, and never give a foreground call a timeout above the harness cap.**
62
- The cap decides how long a foreground call waits, not the number passed to it, so a number above the
63
- cap chooses the detached path without choosing the completion notification that should come with it.
64
- A call issued detached from the start re-invokes the run when it exits — which is what makes the
65
- completion *delivered* rather than something to remember to poll for.
66
-
67
- The measured outliers were a 6m28s foreground `git -y`, 6m06s of unattended CI and a 19m26s push
68
- transport fault. The operational section above maps those waits to background gate/push and a
69
- foreground `followup`; `followup.md` remains its command procedure.
70
-
71
- **A tail does follow the merge, and it is not small** (joshuafolkken/kit#1462). This section first
72
- gave a different reason for that last bullet — that the merge ends the run, leaving no tail to
73
- overlap — and the measurement says otherwise. The run-timing report charges to **`post-run`** exactly what runs
74
- after the last `followup` span ends: **3.0 min, 5.9% of a 50.5-minute run**, in the lane child
75
- `--issue 1599` (PR #1602); **2 min 31 s, 14% of 20m15s**, in the plain `fullrun #1597` (PR #1603);
76
- **3.1 min** hand-measured in run #1441's delegated child, which is where this Issue started. **What
77
- was wrong is the premise, not the conclusion** — `followup` stays foreground, and what changes is
78
- *where the tail's work is done*.
79
-
80
- **So the tail is emptied before `followup` is issued, rather than worked through after it returns.**
38
+ in front of a hand-armed timer by `early-heartbeat`.
39
+
40
+ ## The tail and what overlaps each wait
41
+
42
+ **Never give a foreground call a timeout above the harness cap** — the cap decides how long a
43
+ foreground call waits, so a larger number detaches the call without the completion notification.
44
+ Rationale: `docs/maintainers/background-commands-rationale.md` → "Why the tail collects idle time".
45
+
46
+ **The tail is emptied before `followup` is issued, rather than worked through after it returns.**
81
47
  One question decides each step, and it is asked of the step rather than judged: **does it read the
82
48
  merge result?**
83
49
 
84
50
  - **It does — the step stays after `followup`.** `pnpm josh ms`, `pnpm josh issue:state <N>`,
85
51
  `pnpm josh epic:next`, `pnpm josh backlog:next --exclude <N>`, and `pnpm josh lane:close` /
86
- `pnpm josh lane:list`. Each is a verifier or is keyed to a merge that has to have happened, and
87
- bringing one forward would have it read a state nobody has reached yet. **De-duplicating a step is
88
- not removing it**: the parent reads the child's state from GitHub *because* a summary is not a
89
- verifier ("Each child runs in a delegated unit"), so none of these may be dropped or answered from
90
- memory.
52
+ `pnpm josh lane:list`. **De-duplicating a step is not removing it**: none of these may be dropped or
53
+ answered from memory.
91
54
  - **It does not — the step is composed in the turn that issues `followup`.** The epic progress
92
- comment's counter *values* (children run, Issues filed, consecutive failures, the run's start time)
93
- are all counted inside the run, and the completion report body is already
94
- placed beside `pnpm josh git -y` in the table below. **Only the write follows the merge.** The
95
- comment exists because a compaction takes the counters at a moment nobody chooses (`backlogrun-progress.md` →
96
- "The counters live in the record"), so composing the values earlier moves no write and loses
97
- no counter.
98
- - **`pnpm josh cost --cut` stays after the merge, and reads nothing from it.** It measures
99
- this session's own transcript, so the question above would bring it forward — but its answer grows
100
- with the session, and asking it a call early under-reads the very number the hand-off is decided
101
- on. It is seconds of tail against a guard on session size, so it keeps its documented seam
102
- (`backlogrun-progress.md` → "The check is asked at every merge").
103
-
104
- **What runs beside a backgrounded command is the work that writes nothing to the working tree.** That
105
- is the whole test, and it is the same one that lets the gate and the review overlap (`SKILL.md` →
106
- §2): a step that edits makes the background command's result stale, so it is not something to overlap
107
- with. Applied to the three waits a run actually has:
55
+ comment's counter *values* and the completion report body (placed beside `pnpm josh git -y` in the
56
+ table below). **Only the write follows the merge.**
57
+ - **`pnpm josh cost --cut` stays after the merge, and reads nothing from it** — its answer grows with
58
+ the session, so it keeps its documented seam (`backlogrun-progress.md` → "The check is asked at
59
+ every merge").
60
+
61
+ **What runs beside a backgrounded command is the work that writes nothing to the working tree** — a
62
+ step that edits makes the background command's result stale. Applied to the three waits a run
63
+ actually has:
108
64
 
109
65
  | While this runs | Do this beside it |
110
66
  | --------------- | ----------------- |
@@ -115,25 +71,21 @@ with. Applied to the three waits a run actually has:
115
71
 
116
72
  **The turn never ends at the push.** The completion notification for `pnpm josh git -y` is what
117
73
  resumes the run, and the turn that reads it goes straight through any branch-2 filing and
118
- `pnpm josh epic:bundle` to `pnpm josh followup`. joshuafolkken/kit#1333 had already settled that end
119
- state for a clean second round, and symptom 2 above is its regression — **so the guarantee is a
120
- mechanism and not only the procedure**: `pnpm josh rule:guard` refuses the foreground push step and
121
- states both halves at that call (`prompts/collaboration-workflow/rule-delivery.md`). A turn *ending*
122
- is the absence of a call and no `PreToolUse` hook can see one, so the last call before the seam is
123
- where the rule can be put; the push reissued detached is not refused again, so a run that obeys pays
124
- nothing.
125
-
126
- **One turn does end before the push, and only one: a dispatched lane child's pre-gate cut**
127
- (joshuafolkken/kit#1839). It ends the turn before the gate and relaunches a fresh process in the same
128
- act, so the run continues rather than stalling — the sanctioned boundary distinct from the push
129
- turn-end this section forbids. The boundary, its two commands and the resume verification are the
130
- `pre-gate-cut.md` skill document, its single source.
74
+ `pnpm josh epic:bundle` to `pnpm josh followup`. `pnpm josh rule:guard` refuses the foreground push
75
+ step and states both halves at that call (`prompts/collaboration-workflow/rule-delivery.md`); the push
76
+ reissued detached is not refused again. Rationale: `docs/maintainers/background-commands-rationale.md`
77
+ → "Why the push is guarded".
78
+
79
+ **One turn does end before the push, and only one: a dispatched lane child's pre-gate cut.** It ends
80
+ the turn before the gate and relaunches a fresh process in the same act — `pre-gate-cut.md` → "Taking
81
+ the cut" is its single source.
131
82
 
132
83
  **A headless lane child (`claude -p`) is where "a background command re-invokes the run" does not
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.
84
+ hold: its background Bash tasks are killed when its turn ends.** It hands the gate-to-merge region to
85
+ a foreground `pnpm josh ship --detach` instead (`chain-rule.md` step 0) — its preflight runs before the
86
+ supervisor exists, so a backgrounded `ship` dies with the turn; `pnpm josh rule:guard` refuses a
87
+ backgrounded `josh gate` / `git` / `followup` / `ship` there, and the `Stop` hook sends a child with a
88
+ task still running back to wait.
137
89
 
138
90
  The operational section above is the single source of the rule. `followup.md`, `chain-rule.md` and
139
91
  `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
@@ -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
 
@@ -18,14 +18,16 @@ by that supervisor; an AI parent is started only for a driver branch that requir
18
18
  pnpm josh run:progress --wait --output <the transcript path of each delegated unit> # in the background
19
19
  ```
20
20
 
21
- **`--wait` waits one silence interval out, prints one line and exits** — the long-running form (no
22
- `--wait`) is right only where output is streamed. The parent changes no value on the line. **Every
23
- interval is three moves and no fourth:**
21
+ **Start it once; it reports by itself** (joshuafolkken/kit#3102). Each silence interval appends the
22
+ five labelled lines to the run's event stream as a heartbeat and to the ambient log, prints nothing to
23
+ standard output and keeps running — so a scheduled report never wakes the parent, and the parent
24
+ relays none. **It exits only on one of three, and the command computes which:**
24
25
 
25
- 1. Start `pnpm josh run:progress --wait --output <transcript paths>` **in the background**.
26
- 2. When it exits, **present what it printed as-is** — the command prints the five labelled lines and the
27
- next report time itself.
28
- 3. **In that same turn, start the next one.** The interval is measured from the last report.
26
+ | Exit | What the parent does |
27
+ | ------------------------------------------------------- | ---------------------------------------------------------------------- |
28
+ | Newly runnable backlog work (the `ready #N` line) | Read the ready line, act on it, and restart the watcher in that turn |
29
+ | `pnpm josh followup` removed the run's life record | Nothing — the run has ended |
30
+ | `--hours` elapsed (8 by default for `--wait`) | Restart the watcher in that turn |
29
31
 
30
32
  **`pnpm josh run:watcher:guard` detects a missed restart** (joshuafolkken/kit#2113): it refuses when
31
33
  lane children are in-flight but the watcher's life record has gone stale. **It is wired into
@@ -33,22 +35,22 @@ lane children are in-flight but the watcher's life record has gone stale. **It i
33
35
  until the watcher is restarted — once per run, so the `pnpm josh run:progress --wait` that fixes it is
34
36
  not blocked.
35
37
 
36
- **`run:progress` prints the five labelled lines itself (joshuafolkken/kit#2026); present them as-is.** It emits the observation instant (`at`, local first and UTC beside it), the elapsed figures
38
+ **`run:progress` writes the five labelled lines itself (joshuafolkken/kit#2026).** It emits the observation instant (`at`, local first and UTC beside it), the elapsed figures
37
39
  (`quiet` and `unchanged`), the children in flight, the run state (`lanes`, `load`, `record`), and the
38
- scheduled `next`, each behind its own label and on its own line — so relay the output verbatim and
39
- round, rephrase or re-label nothing. How each field reads when it has nothing to report (`record
40
+ scheduled `next`, each behind its own label and on its own line — so where a session does present them
41
+ (`--once`), it relays the output verbatim and rounds, rephrases or re-labels nothing. How each field reads when it has nothing to report (`record
40
42
  unread`, `no in-progress child yet`, `lanes none`, an absent `next`) is fixed by the command's own unit
41
43
  tests. **A value said that way is still an observation, never a state**: `record unread` means no
42
44
  `--output` path was given, not *not stalled*; `lanes none` is *no lane is open*, not *nothing is
43
45
  running*; and the `next` line is a schedule — the time *if the silence continues*, superseded when a
44
46
  real report resets the clock through `--mark`.
45
47
 
46
- **It exits only when it has a line to hand over**, or when `--hours` runs out having never gone quiet
47
- for a whole interval (that exit says so on standard error). **Nothing in flight keeps it waiting.**
48
+ **A report is not an exit, and neither is a decline** — with no run recorded it keeps waiting, and the
49
+ `--hours` exit says so on standard error.
48
50
 
49
51
  **`--mark` at every real report.** Whenever this loop reports something of its own — a child merged,
50
52
  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`").
53
+ (`docs/josh-commands-automation.md` → "`josh run:progress`").
52
54
 
53
55
  **Do not keep a progress clock of your own** — the hook refuses the arm rather than asking
54
56
  (`scripts/rules/early-heartbeat.ts` → `decide`), though **a single correctly-spaced arm is allowed**. It
@@ -130,21 +132,13 @@ in the same turn as each: **the Step 0 work summary, the pull request opening, e
130
132
  verdict, and any `confirmation` / `failure` / `completion` notification or stop.** **A tool result only
131
133
  you read is not one** — a gate run, a `gh` read, an edit.
132
134
 
133
- **On a quiet tick the turn is the relayed line plus at most two lines of the run's own prose**, saying
134
- only what changed stage and what is being waited on. **A tick is quiet when none of the real reports
135
- happened since the last one**; a gate that went green, a review round, a file edited, a poll answering
136
- `wait` are the run working, not a report. **No table, no re-listing of children, no restating of the
137
- plan** — `epic:next`, the epic body and the progress comment hold all three. **A real report is not
138
- bounded by that**: `--mark` restarts the clock, so a merge, a park or a stop is where the run may be
139
- long.
140
-
141
135
  **`--output` is omitted in a single-issue run, and `record` reads `unread`.** Rationale for the
142
136
  watcher's scope and placement: `docs/maintainers/backlogrun-progress-rationale.md` → "Why the watcher
143
137
  runs where it does".
144
138
 
145
139
  **A run that merges needs no teardown; a run that stops has to end the reporting itself.** **A stop
146
140
  keeps the `in-progress` label on purpose** — so **no further `--wait` is started** after the stop
147
- notification, and any long-running watcher still in the background is stopped in the same turn. That
141
+ notification, and the running `--wait` is stopped in the same turn, since no report ends it. That
148
142
  covers `halfrun`'s stop before commit, a `needs-human-review` stop, a split or prerequisite stop, and
149
143
  a `backlogrun` named issue's failure stop.
150
144
 
@@ -275,11 +269,12 @@ run in lanes".
275
269
  a session that cannot measure is read as `over`. **Never read the condition off `pnpm josh delegate
276
270
  epic-child`** ("The check is asked at every merge" below).
277
271
  3. **`wait`** — go back to step 1. **With something of this run's own in flight, that happens on the
278
- wake the progress watcher's exit delivers** and the parent starts no sleep of its own; the 60 s
279
- figure bounds how soon the ask may be repeated. **With nothing in flight the watcher declines and
280
- never exits, so the parent keeps the interval** — the case for "another repository has work but this
281
- one does not", and for a cross-repository publish wait. The table in "The wake exists only while
282
- something is in flight" below decides which.
272
+ wake `lane:await` or the progress watcher's arrival exit delivers** and the parent starts no sleep
273
+ of its own; the 60 s figure bounds how soon the ask may be repeated. **A scheduled report is not one
274
+ of those wakes** (joshuafolkken/kit#3102). **With nothing in flight neither wake comes, so the parent
275
+ keeps the interval** — the case for "another repository has work but this one does not", and for a
276
+ cross-repository publish wait. "The wake exists only while something is in flight" below decides
277
+ which.
283
278
  4. **`stop`** — report the parked children and finish.
284
279
  5. **`complete`** — post the epic summary and finish.
285
280
  6. **Exit code 1** — `epic:next` refused a cyclic or contradictory graph, or could not read a child.
@@ -421,8 +416,8 @@ in the background, in the same turn as that first `lane:list`. The wired `run:wa
421
416
 
422
417
  **A carried-over child finishes in its own detached unit, and the resumed parent does not stand in front
423
418
  of its merge.** A lane handed over at the cut is still running its own `fullrun` — the foreground
424
- `pnpm josh followup` and the CI wait included — in a process of its own (background-commands.md →
425
- "`pnpm josh followup` — foreground": foreground is *within the unit*, the background from the parent).
419
+ `pnpm josh followup` and the CI wait included — in a process of its own (`background-commands.md` →
420
+ "Background the gate and push": foreground is *within the unit*, the background from the parent).
426
421
  **So the parent never runs a carried-over child's `followup` itself**: it polls the handed-over lane and
427
422
  opens new work beside it. **The reads and the dispatches go out together, in one turn** — `pnpm josh lane:list`,
428
423
  `pnpm josh run:liveness`, `epic:next --lanes`, and opening a lane for a child it offers take none of each
@@ -472,7 +467,7 @@ clock". A stale child's label is
472
467
  removed first, so the next poll can offer it. **A graph that has deadlocked on a cycle is not this loop's
473
468
  to untangle**: `epic:next` detects it and exits with an error.
474
469
 
475
- ### The parent keeps no clock of its own — the watcher's exit is the wake
470
+ ### The parent keeps no clock of its own — a child's completion or an arrival is the wake
476
471
 
477
472
  **After hand-off, the supervisor's driver owns the mechanical clock.** `backlog:drive` polls lane
478
473
  completion and the backlog inside the detached process, without waking an AI parent; the parent-turn
@@ -483,12 +478,14 @@ source and `run:report` the final report.
483
478
  `docs/maintainers/backlogrun-progress-rationale.md` → "Why the parent waits on classification, not a
484
479
  clock".
485
480
 
486
- The watcher reports on its own interval, and a judgment session may take its exit as a prompt to act.
481
+ The watcher reports on its own interval to the event stream and exits only on an arrival, so a judgment
482
+ session takes that exit — or a `lane:await` completion — as its prompt to act, never a report.
487
483
 
488
484
  #### The wake exists only while something is in flight
489
485
 
490
- `run:progress --wait` prints only when it has a human-facing line. With no child in flight it may
491
- decline; the driver still polls for new work and enforces the idle and whole-run bounds. A GitHub
486
+ `lane:await` wakes on a child's completion and `run:progress --wait` on an arrival; its reports wake
487
+ nobody. With no child in flight it may decline; the driver still polls for new work and enforces the
488
+ idle and whole-run bounds. A GitHub
492
489
  listing failure stays a retry or unreadable answer from the offer command, never an empty backlog.
493
490
 
494
491
  `epic:next` does not report when a label was applied, so read that from the issue's timeline: