@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
@@ -54,7 +54,7 @@ inside the invocation" below):
54
54
  | `--max` | how many issues one invocation may merge — a run's own filing competes for that number rather than extending it | `run:carry --merged` |
55
55
  | `--idle`, and the 8-hour whole-run bound | how long one invocation may go on looking for more | the record's `started_at` |
56
56
  | **Ten filings per invocation** | how much one invocation may add to the pool at all, on **every** filing route (`SKILL.md` → §2d) | `run:carry --filed` |
57
- | The WIP cap of 30 open issues | how large the pool may become, across invocations | `prompts/collaboration-workflow/wip-cap.md` |
57
+ | The WIP cap on open issues | how large the pool may become, across invocations | `prompts/collaboration-workflow/wip-cap.md` |
58
58
 
59
59
  One invocation may add at most ten issues to the pool and merge at most `--max` of them, after which
60
60
  the run ends and the next one waits for a person to type the keyword.
@@ -140,7 +140,7 @@ be answered and every standing record is refused rather than resumed. A live PID
140
140
  the sandbox cannot read is held as `busy`.
141
141
 
142
142
  **Ask it before the plan, in the same turn as the first `git switch main && git pull`.** The contract
143
- is `docs/josh-commands.md` → "`josh run:carry`"; what this loop does with each answer is here:
143
+ is `docs/josh-commands-automation.md` → "`josh run:carry`"; what this loop does with each answer is here:
144
144
 
145
145
  | It answers | What the run does |
146
146
  | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
@@ -233,7 +233,7 @@ expired or cannot be read ends it the same way. `none` — the run having finish
233
233
 
234
234
  **A person keeps control of it.** `pnpm josh run:wake --list` names the running supervisor and
235
235
  `--stop` ends it; the full contract, what it launches and why that is a constant rather than a
236
- setting are `docs/josh-commands.md` → "`josh run:wake`".
236
+ setting are `docs/josh-commands-automation.md` → "`josh run:wake`".
237
237
 
238
238
  **Every unattended role runs with the provider selected from the invoking CLI and its own profile.**
239
239
  Codex sessions use OpenAI; Claude Code sessions use Anthropic. Anthropic uses scheduler
@@ -244,7 +244,7 @@ and legacy `JOSH_LANE_*` values to the worker only. Invalid configuration, a mis
244
244
  session marker, or a missing, outdated or unauthenticated CLI refuses without fallback, promotion or
245
245
  worker retry. `run:wake --list`, `lane:list`, the review brief and each launch
246
246
  log expose the resolved provider, role, model and effort.
247
- `docs/josh-commands.md` → "`josh lane:dispatch`" and `backlogrun-child.md` → "Each child runs in a
247
+ `docs/josh-commands-automation.md` → "`josh lane:dispatch`" and `backlogrun-child.md` → "Each child runs in a
248
248
  delegated unit" are the single sources.
249
249
 
250
250
  **It relays progress from the existing report record.** The driver keeps the same `run:merge` event
@@ -301,10 +301,10 @@ stop at a time.**
301
301
  never the body.
302
302
  - **Order and isolate the pool in the same pass** (joshuafolkken/kit#2776), from the same
303
303
  `issue:read`: an issue that must land first (it builds what another reuses, or both edit one code
304
- path) becomes a native `blocked-by`; an issue the `wip-cap.md` → 「実行のしかた」 enumeration hits
305
- gets `run:solo`, **every other one `run:lane`**. Comment the reason; the offer commands enforce all
304
+ path) becomes a native `blocked-by`; an issue meeting all three of the `wip-cap.md` → 「実行のしかた」
305
+ conditions gets `run:solo`, **every other one `run:lane`**. Comment the reason; the offer commands enforce all
306
306
  three, answering `triage` while an issue has neither.
307
- - **`priority:high` puts an issue first** (joshuafolkken/kit#2928; ranking: `docs/josh-commands.md` →
307
+ - **`priority:high` puts an issue first** (joshuafolkken/kit#2928; ranking: `docs/josh-commands-automation.md` →
308
308
  `josh backlog:next`). Apply it only on a cited ground — a stated deadline or urgency, or a person's
309
309
  written policy — commenting the ground; **never remove it**.
310
310
  - **Report the order those labels produce — `pnpm josh backlog:plan --waves`** (joshuafolkken/kit#2778),
@@ -342,7 +342,7 @@ follow, one per line.** `backlog:offer` forwards `--exclude` and `--repo` to `ba
342
342
  in `--json`. **The verdict table is "The two budgets" below; the answer-to-word mapping it applies is
343
343
  this section's table.**
344
344
 
345
- **`backlog:next`'s output contract is `docs/josh-commands.md` → "`josh backlog:next`", and four parts
345
+ **`backlog:next`'s output contract is `docs/josh-commands-automation.md` → "`josh backlog:next`", and four parts
346
346
  of it decide how the mapping is written:**
347
347
 
348
348
  1. **Standard output is one token per line, and everything else is standard error.**
@@ -365,7 +365,7 @@ subsection.
365
365
  | Answer | What to do | Budget answer |
366
366
  | --- | --- | --- |
367
367
  | One or more issue numbers | Start each one as a child, up to the free lanes — `backlogrun-lanes.md` → "Lanes" and "Each child runs in a delegated unit", unchanged. Then **ask the command again**, with the merged numbers added to `--exclude` | `candidates` |
368
- | `wait`, with something of this run's own still in flight | Everything opted in is blocked or already running, so waiting can still change the answer. **Ask the command again on the wake the progress watcher's exit delivers** — the parent starts no sleep of its own, and the interval is a floor on the re-ask rather than a clock (`backlogrun-progress.md` → "Waiting, and never waiting forever" and "The parent keeps no clock of its own") | `blocked` |
368
+ | `wait`, with something of this run's own still in flight | Everything opted in is blocked or already running, so waiting can still change the answer. **Ask the command again on the in-flight wake — `pnpm josh lane:await` or the progress watcher's arrival exit, never a report** — the parent starts no sleep of its own, and the interval is a floor on the re-ask rather than a clock (`backlogrun-progress.md` → "Waiting, and never waiting forever" and "The parent keeps no clock of its own") | `blocked` |
369
369
  | `wait` this checkout can never resolve — the only candidates the command reported on standard error are in other repositories, and this run has nothing of its own in flight | Report those candidates with their checkouts. **Waiting cannot resolve them, but a person opting a new issue in here still can**, so the ending is the idle watch's rather than this row's | `exhausted` |
370
370
  | `stop` | Nothing can proceed without a person. Report the parked issues and finish | `parked` |
371
371
  | `triage` | A candidate lacks `run:solo` / `run:lane` (joshuafolkken/kit#2779). Judge each one stderr names as the pre-start pass does, then **ask again**; running children continue | `untriaged` |
@@ -398,7 +398,7 @@ records.
398
398
  blocker sits in another opted-in epic — or is an opted-in standalone issue — makes the child wait on
399
399
  time, so one `backlogrun` runs both epics in that order. A blocker outside the opted-in backlog, or one
400
400
  inside it that itself waits on a person, makes the child wait on a person instead, and a cycle across
401
- epics answers `error`. The table is `docs/josh-commands.md` → "`josh epic:next`".
401
+ epics answers `error`. The table is `docs/josh-commands-automation.md` → "`josh epic:next`".
402
402
 
403
403
  **New work is picked up without restarting anything.** The command re-derives its pool from GitHub
404
404
  labels on every ask, so an issue filed and opted in while the run is going is offered on the next
@@ -451,7 +451,7 @@ tracks.
451
451
  | Verdict | What the loop does |
452
452
  | --- | --- |
453
453
  | `run` | Start what `backlog:next` offered, up to the free lanes. The reason names how many more the maximum still allows; start no more than that |
454
- | `watch` | Ask both commands again — at the 5-minute idle poll while the backlog is empty **and** nothing of this run's is in flight, and at the 60-second polling interval in every other case (a blocked backlog, a drain, or a watch that opened while children were still merging). *Whether the parent keeps that interval as a clock of its own* is the in-flight test: with nothing in flight the watcher declines for the whole watch and never exits, so the parent sleeps the interval itself; with something in flight the wake is the watcher's exit and the interval is only a floor on the re-ask (`backlogrun-progress.md` → "The wake exists only while something is in flight"). **Nothing is held while watching** — the working tree's hold and each drained lane were released at the last child's merge, so a watching run blocks no other run |
454
+ | `watch` | Ask both commands again — at the 5-minute idle poll while the backlog is empty **and** nothing of this run's is in flight, and at the 60-second polling interval in every other case (a blocked backlog, a drain, or a watch that opened while children were still merging). *Whether the parent keeps that interval as a clock of its own* is the in-flight test: with nothing in flight the watcher declines for the whole watch and never exits, so the parent sleeps the interval itself; with something in flight the wake is `pnpm josh lane:await` or the watcher's arrival exit — never a report — and the interval is only a floor on the re-ask (`backlogrun-progress.md` → "The wake exists only while something is in flight"). **Nothing is held while watching** — the working tree's hold and each drained lane were released at the last child's merge, so a watching run blocks no other run |
455
455
  | `stop` | Report and finish. The reason it printed **is** the termination reason the completion report carries |
456
456
 
457
457
  **At the drain the retrospective fires before this watch, not after it** (joshuafolkken/kit#2335):
@@ -466,7 +466,7 @@ again at its full budget. Both are ISO-8601 timestamps (`date -u +%FT%TZ`), and
466
466
  `--active` is refused. `--merged` is what has merged and `--running` what is still in a lane; **both
467
467
  count against the maximum**. **No ending abandons a lane**: whatever would have ended the run answers
468
468
  `watch` while `--running` is above zero, so the lanes drain and their merges reach the report. The full
469
- contract is `docs/josh-commands.md` → "`josh backlog:budget`".
469
+ contract is `docs/josh-commands-automation.md` → "`josh backlog:budget`".
470
470
 
471
471
  **The completion report names three things the budgets make meaningful**: how many issues this run
472
472
  took, how many of them were picked up during an idle watch, and the termination reason — quoted from
@@ -48,8 +48,8 @@ Each step is a terse trigger and a pointer; the procedure is read on demand from
48
48
  that bounds the amount. `auto-ok` is a person's alone.
49
49
  4. **Report the plan before the first child** — `pnpm josh backlog:plan`, then resolve every
50
50
  `needs-decision` issue decidable from its body in one pass. In the same pass, record `blocked-by`
51
- between issues that must land in order, and apply `run:solo` where the verification-path
52
- enumeration holds, `run:lane` elsewhere. `backlogrun-steps.md` → "The plan,
51
+ between issues that must land in order, and apply `run:solo` where all three of the
52
+ `wip-cap.md` → 「実行のしかた」 conditions hold, `run:lane` elsewhere. `backlogrun-steps.md` → "The plan,
53
53
  before the first child starts" and its "Resolve what the plan can resolve, before starting".
54
54
  5. **Named issues run first, in order** — `backlogrun-steps.md` → "Named issues run first, in order":
55
55
  the supervisor's driver dispatches each as a delegated `fullrun`, one at a time, then drains the
@@ -7,8 +7,10 @@ Review results and successful pushes are never turn boundaries.
7
7
 
8
8
  0. **A lane child** (#2428): `pnpm josh main:merge`, the scoped pair, `pnpm josh ship --detach --review
9
9
  "<title> #<N>"` (`--cite <N>`), then **end the turn** on `launched`/`busy`. A stop relaunches a child
10
- whose `run:step` names `ship --log <N>`: fix, re-detach (`--review` only if no round is recorded,
11
- else step 4). `failed` → step 1.
10
+ whose prompt names `pnpm josh ship --log <N>` and (Anthropic lane, #2964) the re-detach to run after
11
+ the fix — `pnpm josh ship --detach`, `--review` only if the stopped ship carried it and stopped before
12
+ round 2, which is final (`scripts/run/run-ship-next.ts`); the supervisor skips a recorded round 1.
13
+ `failed` → step 1.
12
14
  1. Run `pnpm josh main:merge`. **Then issue `pnpm josh run:cut <N>` alone, before the scoped pair and
13
15
  the gate** — the pre-gate cut (a no-op outside a lane, joshuafolkken/kit#2177). Then run the final scoped lint/test pair and `pnpm josh run:review`: it starts
14
16
  `pnpm josh gate` in the background and prints the `/code-review` brief in one call, so the two overlap
@@ -17,13 +17,13 @@ pnpm josh delegate --list # the enumeration, and what was rejected and why
17
17
  **how a wrong result is caught** cheaply in the parent tier, not merely by being unlikely to fail.
18
18
  `pnpm josh delegate --list` names both delegatable and rejected steps; a rejected step either has no
19
19
  verifier or lets a wrong result propagate too far. The command distinguishes `kept deliberately`
20
- from `kept by default`. `docs/josh-commands.md` → "`josh delegate`" carries the full enumeration.
20
+ from `kept by default`. `docs/josh-commands-automation.md` → "`josh delegate`" carries the full enumeration.
21
21
 
22
22
  **The mechanism is not the unit.** `pnpm josh delegate` covers a run step, a file-disjoint Step 0
23
23
  implementation unit (`pnpm josh fanout`), and `epic-child` — an epic's child and a named issue of a
24
24
  `backlogrun` alike. Do not add a second batch-child mechanism. Read `backlogrun-child.md` → "Each child
25
25
  runs in a delegated unit" at child dispatch; `backlogrun-steps.md` → "Named issues run first, in order"
26
- applies to named issues. `docs/josh-commands.md` → "`josh fanout`" carries file-disjoint dispatch.
26
+ applies to named issues. `docs/josh-commands-automation.md` → "`josh fanout`" carries file-disjoint dispatch.
27
27
 
28
28
  **`followup-filing` delegates the late review-finding filing chain** with the parent's finding text;
29
29
  the parent verifies the new Issue using `pnpm josh issue:state <new>`. For `epic-child`, the parent
@@ -41,7 +41,7 @@ a temporary probe script and return its output.
41
41
  delegate the unread investigation. Brief the unit on what was already read; do not re-read it there.
42
42
  **A delegation resets the counter rather than spending it**; `pnpm josh investigation:guard` counts
43
43
  unedited files and refuses the threshold read. `pnpm josh delegate --list` prints the threshold.
44
- `docs/josh-commands.md` → "`josh investigation:guard`" carries the command's counting details.
44
+ `docs/josh-commands-automation.md` → "`josh investigation:guard`" carries the command's counting details.
45
45
 
46
46
  **The main line does not idle while the unit reads:** read files this run will edit, then verify the
47
47
  unit's cited lines. Independent investigations launch together; a brief that needs another unit's
@@ -115,4 +115,4 @@ pnpm josh release:scope --json # the same answer as one JSON object
115
115
 
116
116
  **`pnpm josh release --dry-run` was checked first and does not answer this.** It refuses off the default branch and on a dirty working tree, and it counts against `HEAD` rather than `origin/<default>` — and every position above is a feature branch or a lane, which is exactly where it throws. So `release:scope` adds **no counting of its own**: it reads `git_followup_pending.read_pending`, the same fetch-then-count `pnpm josh followup` already uses for the Telegram line, and the two therefore cannot disagree.
117
117
 
118
- **This section is the single source.** `fullrun.md`, `backlogrun.md` and `backlogrun.md` point here rather than restating it, and `docs/josh-commands.md` → "`josh release:scope`" documents the command itself.
118
+ **This section is the single source.** `fullrun.md`, `backlogrun.md` and `backlogrun.md` point here rather than restating it, and `docs/josh-commands-automation.md` → "`josh release:scope`" documents the command itself.
@@ -19,7 +19,10 @@ bullets. Use the file option whenever it contains a command or path.
19
19
 
20
20
  It waits for required CI, checks CodeRabbit and top-level AI review comments, sends the completion
21
21
  Telegram, merges by default, posts the Issue report, closes completed epics, removes `in-progress`,
22
- and releases the hold. Only `--no-merge` stops the merge; `--merge` is a deprecated no-op. Keep the
22
+ and releases the hold. Only `--no-merge` stops the merge; `--merge` is a deprecated no-op. **A pull
23
+ request already merged by hand** (a `prrun` stop, joshuafolkken/kit#3023) skips the CI wait, the AI
24
+ review scan and the merge and runs only the post-merge tail; a completion report already on the Issue
25
+ is not posted or notified twice, so re-running is safe. Keep the
23
26
  default Issue target. Ignore a finding only after verifying it is inapplicable; rate-limit text is not
24
27
  a finding.
25
28
 
@@ -174,8 +177,9 @@ pnpm josh ms
174
177
  Review findings before merging. If blockers are found, it sends a `confirmation` Telegram and exits
175
178
  non-zero — fix the findings and re-run. **Green CI is not authorization to merge while AI review
176
179
  findings are open.** (SonarCloud findings are not scanned by `followup`; the `sonar-qube.yml` CI
177
- workflow runs the scan with `sonar.qualitygate.wait=true`, so a red Quality Gate fails the required
178
- `SonarQube` check, which `followup` waits on.)
180
+ workflow runs the scan with `sonar.qualitygate.wait=true` and then `josh sonar:new-code`, so a red
181
+ Quality Gate or a single new Sonar issue or duplicated block fails the required `SonarQube` check,
182
+ which `followup` waits on.)
179
183
  - **CodeRabbit rate-limit is not a finding.** If the only CodeRabbit comment is a rate-limit warning
180
184
  (`rate limited by coderabbit.ai` or `Rate limit exceeded`) and there is no substantive review, treat
181
185
  it as "no findings" and proceed. Same if CodeRabbit produced no comment on the latest commit.
@@ -26,7 +26,7 @@ in outline: refactor → `pnpm josh main:merge` → **a dispatched lane child ha
26
26
  joshuafolkken/kit#2428) → otherwise `pnpm josh run:cut <N>` (the pre-gate cut, before the gate; a no-op
27
27
  outside a lane) → start `pnpm josh gate` and a subagent `/code-review`
28
28
  with the brief `pnpm josh review:brief` prints on `git diff main`, join the gate before the commit,
29
- iterate to no high/medium findings, at most two reviews → **the clean path folds the ship region into
29
+ iterate to no high/medium findings, within the round cap (`prompts/review.md`) → **the clean path folds the ship region into
30
30
  one call**, `pnpm josh ship "<title> #<N>"` (gate → commit/push/PR → the CI-wait `followup` → the
31
31
  `run:tail` report bookkeeping, stopping at the first failed step; joshuafolkken/kit#2398), with any
32
32
  branch-2 filing (`pnpm josh issue:file`, which runs `epic:bundle` itself) run before it → **when a second round is due `ship` does not
@@ -44,7 +44,8 @@ implementation summary via `--notify-message` in the session language, leading w
44
44
  plain-language lines: `"Implemented <title>\nCause: ...\nFix: ...\nResult: ...\n\nDetails:\n-
45
45
  <change1>\n- <change2>"`. **`pnpm josh followup` waits for CI, verifies AI review findings, sends the
46
46
  completion notification, then merges; if blockers are found it exits non-zero — fix and re-run.**
47
- **マージ後に `pnpm josh ms` を実行する。** Codex レーンでは省略し、親の `run:merge` が主チェックアウトで同期する。Claude は従来どおり。
47
+ **Run `pnpm josh ms` after the merge.** A Codex lane skips it — the parent's `run:merge` syncs the
48
+ primary checkout; a Claude run keeps it.
48
49
 
49
50
  ## The `fullrun new` step list
50
51
 
@@ -21,7 +21,7 @@ single sources). Step 2 — the `in-progress` label — stays its own call, appl
21
21
  call reports `hold`.
22
22
 
23
23
  1. **Claim the working tree — first, before anything else.** For `fullrun #N`, first run the folded
24
- `pnpm josh run:entry <N>` above; it calls `run:hold` as its first step. For `fullrun new`, call
24
+ `pnpm josh run:entry <N>` above (no `--to` is `fullrun`, §2k); it calls `run:hold` as its first step. For `fullrun new`, call
25
25
  bare `pnpm josh run:hold`, ahead of the title and filing. `hold` continues; `busy` / `unknown` stop
26
26
  with a `confirmation` Telegram carrying stderr.
27
27
  `working-tree-hold.md` is the single source; a cross-repository target resolves its checkout from
@@ -32,8 +32,8 @@ call reports `hold`.
32
32
  `pnpm josh run:release`: `gh api -X DELETE repos/{owner}/{repo}/issues/<N>/labels/in-progress
33
33
  2>/dev/null || true`. A `needs-human-review` stop keeps both hold and label.
34
34
  3. **Ask the session boundary in the same turn as the hold** — `pnpm josh cost --cut`. `under`
35
- continues; `over` (or unanswerable) stops before the title with a `confirmation` Telegram carrying
36
- the figure and the resume command (`fullrun #<N>` / `fullrun new`), then `pnpm josh run:release`.
35
+ continues; `over` (or unanswerable) stops before the title — `run:entry` sends this and step 1's
36
+ `confirmation` Telegram and runs `run:release` (`stop notified: …`); by hand only for `new`.
37
37
  **Skip it when dispatched by `backlogrun`** (that batch owns the question). `backlogrun-progress.md`
38
38
  → "The hand-off" is the single source of the check and the shared 135,000 threshold.
39
39
  4. **Gather the mechanical reads — `pnpm josh run:prep <N>`**: `issue:read`'s body/comments
@@ -51,7 +51,7 @@ call reports `hold`.
51
51
  ## The progress step and the lane-child seam
52
52
 
53
53
  - **Start the progress watcher once the hold is claimed** — `pnpm josh run:progress --wait` in the
54
- background, presented as-is when it exits, and `pnpm josh run:progress --mark` in the same turn as
54
+ background, started once and relayed never, and `pnpm josh run:progress --mark` in the same turn as
55
55
  every real report (`backlogrun-progress.md` → "Progress while the run is quiet"). A `fullrun`
56
56
  dispatched as a lane child starts none and never reads that document (`pnpm josh read:set
57
57
  lane-child`). **The watcher is a per-session heartbeat; the run's report surface is not it** — the
@@ -62,8 +62,10 @@ call reports `hold`.
62
62
  before the hold, joshuafolkken/kit#2760); on `resume` it skips the title, plan, hold and implementation and goes to the gate. At the pre-gate
63
63
  boundary — immediately after `pnpm josh main:merge`, before the gate — it takes the cut with
64
64
  `pnpm josh run:cut <N>` (the ordered step in `chain-rule.md`), and it records any park on the Issue before the stop notify.
65
- `pre-gate-cut.md` is the single source of both.
66
- - **`resume: halfrun`** adopted a stopped `halfrun` (#2796): gate in full; `working-tree-hold.md`.
65
+ `pre-gate-cut.md` → "Resuming — the fresh process's entry check" and `pre-gate-cut.md` → "Taking
66
+ the cut" are the single sources of the two.
67
+ - **`resume: halfrun`** adopted a stopped `halfrun` (#2796): gate in full; `resume: prrun-*` a stopped
68
+ `prrun` (#3023); `working-tree-hold.md`.
67
69
 
68
70
  ## The stop branches
69
71
 
@@ -4,51 +4,49 @@ When this run files a new Issue, file it with `pnpm josh issue:file`, which lint
4
4
 
5
5
  `halfrun` sits between `kickoff` (plan only) and `fullrun` (full execution with auto-merge). It
6
6
  implements the change and runs the full verification gate, then **stops before commit** — nothing is
7
- committed, pushed, or opened as a PR — so the user manually verifies the change (typically by exercising
8
- the UI in a browser) against the working tree. Use `halfrun` when the change has UI/UX implications or
9
- anything else that requires human eyes before shipping.
7
+ committed, pushed, or opened as a PR — so a person verifies the working tree by hand. Use it when a change needs human eyes before shipping.
10
8
 
11
- **This file is the manifest** (joshuafolkken/kit#2189): the ordered steps as terse triggers and
12
- pointers, the detail read on demand from the file each pointer names.
9
+ **This file is the manifest** (joshuafolkken/kit#2189): terse ordered steps, each pointing at the file
10
+ that holds its detail.
13
11
 
14
12
  ## The ordered entry sequence
15
13
 
16
- 1. **Claim the working tree first** — `pnpm josh run:hold <N>` (bare for `halfrun new`), ahead of the
17
- title and a `new` entry's filing; `busy` / `unknown` stop with a `confirmation` Telegram. **The stop
18
- before commit keeps the hold** (the uncommitted work is what a second run would trample); a stop on a
14
+ 1. **Claim the working tree first** — `pnpm josh run:entry <N> --to halfrun` (bare `pnpm josh
15
+ run:hold` for `new`), ahead of the title and a `new` filing; it folds steps 3 and 5 and starts
16
+ at its stage line's `start:` (`SKILL.md` → §2k). `busy` / `unknown` stop with a `confirmation` Telegram (`run:entry` sends it). **The stop
17
+ before commit keeps the hold** (a second run would trample the uncommitted work); a stop on a
19
18
  split, prerequisite or third-party target releases it. `working-tree-hold.md` is the single source; a
20
19
  cross-repository target resolves its checkout from `pnpm josh doctor` first (`target-repository.md`).
21
20
  2. **Apply `in-progress` the moment `run:hold` answered `hold`** — the stop before commit keeps it on;
22
21
  a stop that leaves the tree clean removes it in the same turn as `pnpm josh run:release` (`gh api -X
23
22
  DELETE repos/{owner}/{repo}/issues/<N>/labels/in-progress 2>/dev/null || true`).
24
- 3. **Ask the session boundary in the same turn as the hold** — `pnpm josh cost --cut`, exactly as
25
- `fullrun`; `over` stops with a `confirmation` Telegram and the resume command (`halfrun #<N>` /
26
- `halfrun new`). **Skip it when dispatched by a batch.** `backlogrun-progress.md` → "The hand-off" is
23
+ 3. **Ask the session boundary** — `pnpm josh cost --cut` (folded into `run:entry`); `over` stops — `run:entry` notifies and releases
24
+ (`halfrun new`: by hand). **Skip it when dispatched by a batch.** `backlogrun-progress.md` → "The hand-off" is
27
25
  the single source of the check and the shared 135,000 threshold.
28
26
  4. **Start the progress watcher once the hold is claimed** — `pnpm josh run:progress --wait` in the
29
- background, `--mark` in the same turn as every real report; the stop before commit ends the watcher
27
+ background, started once — it reports to the event stream itself and nothing is relayed — and
28
+ `--mark` in the same turn as every real report; the stop before commit ends the watcher
30
29
  itself (`backlogrun-progress.md` → "Progress while the run is quiet").
31
- 5. **Gather the mechanical reads — `pnpm josh run:prep <N>`** (`issue:read`'s body/comments — `SKILL.md`
32
- → §2g → `issue-comments.md`; `issue:state`'s `human_review`; `latest:scope`), then `pnpm josh
33
- run:next <N>`.
30
+ 5. **The mechanical reads** — `run:entry` folds `run:prep` (body/comments — `SKILL.md` → §2g;
31
+ `human_review`; `latest:scope`); a `new` entry runs `pnpm josh run:prep <N>` once filed.
34
32
 
35
33
  ## The step list
36
34
 
37
35
  `halfrun #<N>`: add `in-progress` → read Issue #N and its comments → **normalize the title** (same as
38
36
  `fullrun`) → post the agreed plan only if the body is blank → `git switch main && git pull`, then `pnpm
39
- josh latest:scope` and update dependencies only on `required` (`latest-gate.md`; load the
40
- `dependency-update` skill on `required`) → implement → run the **full verification gate** (refactor →
37
+ josh latest:scope` and update dependencies only on `required` (`latest-gate.md`; the
38
+ `dependency-update` skill) → implement → run the **full verification gate** (refactor →
41
39
  start `pnpm josh gate` beside a subagent `/code-review` with the brief `pnpm josh review:brief` prints,
42
- join the gate before the stop, iterate to no high/medium findings, at most two reviews → `pnpm josh
40
+ join the gate before the stop, iterate to no high/medium findings, within the round cap (`prompts/review.md`) → `pnpm josh
43
41
  test:e2e`, run by **you**, because `halfrun` opens no pull request and there is no CI E2E job; a printed
44
42
  skip is the answer where the project has no suite) → **mark the stop: `pnpm josh run:hold <N>
45
43
  --halfrun-stop`** (the record `fullrun #<N>` adopts; `new` passes the filed number) → send a
46
44
  `confirmation` Telegram with the resume commands in the body → **stop**. Plan comments are in the session language. The `confirmation` Telegram
47
- body MUST include the exact resume commands — **`fullrun #<N>` first**, since that is how a verified
45
+ body MUST include the exact resume commands — **the `Next:` line first**, since that is how a verified
48
46
  `halfrun` ships (joshuafolkken/kit#2796): its `run:entry` adopts this stop's marked hold and resumes at
49
47
  the gate. The direct commands follow for shipping without an agent:
50
48
  `pnpm josh notify --task-type confirmation --issue-url "<issue-url>" --body=$'halfrun ready for manual
51
- verification\nNext: fullrun #<N>\nWithout an agent: pnpm josh git -y "<title> #<N>" && pnpm josh
49
+ verification\nNext: prrun #<N> | fullrun #<N>\nWithout an agent: pnpm josh git -y "<title> #<N>" && pnpm josh
52
50
  followup "<title> #<N>" --notify-message "Implemented <title>\\nCause: ...\\nFix: ...\\nResult:
53
51
  ...\\n\\nDetails:\\n- <change1>"'`. The stop report names the same two, in the same order.
54
52
  **Invoking `halfrun` is _not_ authorization to commit, push, or merge** — do not run `pnpm josh git -y` or `pnpm josh followup` yourself. If the user comes
@@ -72,7 +70,7 @@ Telegram and **stop**.
72
70
  - **A split** — the assessment (`split-assessment.md` → "The question") finds two or more
73
71
  separately-mergeable deliverables over one gate: file the children (each `route:split`) and the epic,
74
72
  then **STOP** with "Please run `backlogrun #<E> --only` to execute this epic." Typing `halfrun`
75
- authorized implementing **one** Issue and stopping for manual verification, never a batch.
73
+ authorized **one** Issue, never a batch.
76
74
  - **A prerequisite** — file it (`route:tier-a`), stash, record the dependency, and **STOP**;
77
75
  `prerequisite.md` is the single source of the filing, the `-u` stash and the epic:bundle branch.
78
76
  - **An observation** — file it without asking and carry on; `SKILL.md` → §2i.
@@ -66,7 +66,7 @@ procedure and not two. **Parking it is not the place**: `needs-decision` means "
66
66
  nobody has given", and here the answer exists.
67
67
 
68
68
  **The exit is the `already-done` label.** It is `needs-decision`'s counterpart: `epic:next`,
69
- `backlog:next` and `auto-ok:next` all stop offering the Issue (`scripts/git/issue-labels.ts` →
69
+ `backlog:next` and `auto-ok:next` all stop offering the Issue (`scripts/issue/issue-labels.ts` →
70
70
  `NOT_DIRECTLY_RUNNABLE_LABELS`, `epic-classify.ts` → `human`), and `epic:busy` stops counting it as
71
71
  holding a lane. **Only a person removes it, by closing the Issue.**
72
72
 
@@ -1,20 +1,20 @@
1
- # 未着手 Issue への追加要件の統合
1
+ # Folding added requirements into an unstarted Issue
2
2
 
3
- ## 候補の読み取り
3
+ ## Reading the candidates
4
4
 
5
- 起票予定の目的・要件・受け入れ条件を含む全文を `pnpm josh issue:scout "<title>" --body-file <draft.md>` に渡す。明示的に参照した `#N` は見出しが似ていなくても候補になる。`Duplicates: incomplete` は読み取りまたは探索の不足であり、候補なしという結論ではない。
5
+ Pass the whole draft — purpose, requirements and acceptance criteria — to `pnpm josh issue:scout "<title>" --body-file <draft.md>`. An explicitly referenced `#N` is a candidate even when its title looks unrelated. `Duplicates: incomplete` means the read or the search fell short; it is not a conclusion that no candidate exists.
6
6
 
7
- 候補の本文とコメントを `pnpm josh issue:read <N>` で全て読み、状態とラベルを `pnpm josh issue:state <N>` で読む。紐づく PR と依存・実行順も調べる。本文と後のコメントが矛盾した場合は後のコメントを採る。読み取り失敗や打ち切りがあれば統合可否は未確定とする。
7
+ Read each candidate's body and every comment with `pnpm josh issue:read <N>`, and its state and labels with `pnpm josh issue:state <N>`. Check the linked PRs and the dependencies and run order too. When the body and a later comment disagree, the later comment wins. A failed or truncated read leaves the fold decision undetermined.
8
8
 
9
- ## 判定
9
+ ## Deciding
10
10
 
11
- 下書きの各受け入れ条件を既存 Issue と照合する。完全な重複は起票も編集もしない。別の成果物は従来の起票経路を使う。固有の追加要件を統合できるのは、既存 Issue が open かつ未着手で PR がなく、依存と実行順に衝突がなく、合計の規模が `split-assessment.md` → "The question" の一回の検証に収まる場合に限る。状態または判断材料が不明なら統合しない。
11
+ Match each acceptance criterion of the draft against the existing Issue. A complete duplicate is neither filed nor edited. A separate deliverable takes the ordinary filing path. Added requirements of its own may be folded in only when the existing Issue is open and unstarted with no PR, its dependencies and run order do not conflict, and the combined size fits the one verification pass of `split-assessment.md` → "The question". When the state or any input to the decision is unknown, do not fold.
12
12
 
13
- 判定記録の JSON を作り、`pnpm josh issue:fold-existing <assessment.json> --json` を実行する。`content` は `duplicate` / `compatible` / `separate` / `unknown`、`size_verdict` は `single` / `split` とする。ほかに `is_open`、`is_unstarted`、`has_pull_request`、`has_complete_read`、`has_dependency_conflict`、`is_separable`、`existing_body`、`draft_body`、`verification` を記録する。不明な事実は省略し、`inspect` を得る。判定記録は読んだ証跡であり、読み取りそのものの代わりにはならない。
13
+ Write the assessment as JSON and run `pnpm josh issue:fold-existing <assessment.json> --json`. `content` is `duplicate` / `compatible` / `separate` / `unknown`, and `size_verdict` is `single` / `split`. Also record `is_open`, `is_unstarted`, `has_pull_request`, `has_complete_read`, `has_dependency_conflict`, `is_separable`, `existing_body`, `draft_body` and `verification`. Omit a fact you do not know, and the answer is `inspect`. The assessment is evidence of the reading, never a substitute for it.
14
14
 
15
- ## 追記と再読
15
+ ## Appending and re-reading
16
16
 
17
- `fold` の場合、追記案の `body` は元の本文を保持し、固有の追加要件と検証方法を末尾に加える。書き込み直前に本文とコメントが判定時から変わっていないことを再確認する。変わっていれば再判定する。
17
+ On `fold`, the proposed `body` keeps the original body and appends the added requirements and how to verify them. Immediately before writing, confirm the body and comments have not changed since the assessment; if they have, assess again.
18
18
 
19
19
  ```bash
20
20
  pnpm josh issue:fold-existing assessment.json --json > result.json
@@ -24,4 +24,4 @@ gh api -X PATCH repos/{owner}/{repo}/issues/<N> --input patch.json
24
24
  pnpm josh issue:read <N>
25
25
  ```
26
26
 
27
- 再読して、元の要件・コメント中の判断記録・追加要件・検証方法が残ることを確認する。書き込みまたは再読が失敗した場合、統合は完了していない。統合時は新しい Issue を作らない。`separate` は従来の起票経路へ戻り、`inspect` は不足した情報を読み直す。
27
+ Re-read it and confirm the original requirements, the decisions recorded in comments, the added requirements and the verification all remain. A failed write or re-read means the fold is not complete. A fold never creates a new Issue. `separate` returns to the ordinary filing path, and `inspect` re-reads the missing information.
@@ -41,4 +41,4 @@ pnpm josh issue:file "<title>" --body-file <complete-draft.md> --depth <n> --dis
41
41
  - **The split path files each child through the same command.** The epic is created with
42
42
  `pnpm josh epic` over children that were scanned.
43
43
 
44
- Full behavior: `docs/josh-commands.md` → "`josh issue:file`" and "`josh issue:scout`".
44
+ Full behavior: `docs/josh-commands-automation.md` → "`josh issue:file`" and "`josh issue:scout`".
@@ -1,13 +1,18 @@
1
1
  # `kickoff` — Planning phase only (plan → Issue → Telegram notify → stop)
2
2
 
3
- - `kickoff #<N>`: Read existing Issue #N **and every comment on it** — `pnpm josh issue:read <N>`; a
3
+ - `kickoff #<N>`: **First `pnpm josh run:entry <N> --to kickoff`** (`SKILL.md` → §2k) — it claims
4
+ nothing and prints the stage line alone; `start: reached` means the Issue is already planned or further
5
+ up the ladder, so report the stage line and **stop**. Otherwise read existing Issue #N **and every comment on it** — `pnpm josh issue:read <N>`; a
4
6
  decision recorded after the body was written lives only in a comment, and the later text is the
5
7
  agreement in force (`SKILL.md` → §2g, which also carries the two answers that stop the run instead) →
6
8
  **normalize the title**: if the title is not in English or can be phrased more clearly, derive a
7
9
  better English title and run `gh api -X PATCH repos/{owner}/{repo}/issues/<N> -f title="<title>"` →
8
10
  analyze requirements → **scope assessment per `split-assessment.md`** → post the plan to the Issue (if
9
11
  body is blank, `gh api -X PATCH repos/{owner}/{repo}/issues/<N> -f body="<plan>"`; otherwise
10
- `pnpm josh issue:comment <N> --body-file <path>`) → send Telegram notification → **stop**
12
+ `pnpm josh issue:comment <N> --body-file <path>`) → **apply the `run:planned` label** — the mark the next
13
+ command's `run:entry` reads to start at the implementation, provisioned by `josh sync` (`gh api
14
+ repos/{owner}/{repo}/issues/<N>/labels -f 'labels[]=run:planned' --silent`) → send Telegram
15
+ notification, its last line `Next: halfrun #<N> | prrun #<N> | fullrun #<N>` → **stop**
11
16
  (do not implement). **When the assessment finds two or more separately-mergeable deliverables**, take
12
17
  the split path instead of posting a plan: create the children as in `kickoff new`, then either
13
18
  **promote `#N`** with `pnpm josh epic --promote <N> <N1> <N2> ... [--ordered] [--rationale-file
@@ -37,7 +42,7 @@ than filing.
37
42
  **Read `split-assessment.md` → "The question" first.** It is the split decision every entry point
38
43
  applies, including this one — `kickoff #N` assesses scope exactly as `kickoff new` does. Its default is
39
44
  not to split: separability and a scope that clearly exceeds what one verification gate can confirm in
40
- one pass (the guide is about 10 changed files and about 400 changed lines) have to hold **together**.
45
+ one pass (the size guide is stated there) have to hold **together**.
41
46
  The rest of `split-assessment.md` — what each entry does with the answer — is read on demand when a
42
47
  split is found.
43
48
 
@@ -80,4 +85,4 @@ split is found.
80
85
  creation call. (3) Send Telegram notification listing all created issues. (4) Present the command
81
86
  `backlogrun #<E> --only`. (5) **Stop** — do not implement.
82
87
 
83
- `pnpm josh issue:file` lints the body and applies the classification labels it declares, following `prompts/collaboration-workflow/issue-template.md` for classification (`docs/josh-commands.md` → `josh issue:file`).
88
+ `pnpm josh issue:file` lints the body and applies the classification labels it declares, following `prompts/collaboration-workflow/issue-template.md` for classification (`docs/josh-commands-automation.md` → `josh issue:file`).
@@ -64,22 +64,14 @@ merge is CI**: the `Security Audit` job runs on every pull request and is one of
64
64
  whatever this gate answered locally. The local reading is a head start on a failure CI would catch
65
65
  anyway; it was never the only net.
66
66
 
67
- ## Why an elapsed-time window rather than "once per batch"
68
-
69
- The batch entry points had already hoisted the update to the head of a batch, and that hoist is
70
- correct — but it says nothing about a standalone `fullrun`, which **is** the head of its own
71
- one-issue batch and therefore updated on every invocation. A session that runs six issues one at a
72
- time paid the full cost six times while a batch of the same six paid it once, for no difference
73
- anybody chose. An elapsed-time window is the one condition that reads the same at every entry point,
74
- so no entry needs a rule of its own — and the batch hoists survive it unchanged, because a batch's
75
- second child asks the same command and is told `skip`.
76
-
77
- **The lock file the update rewrites still lands with whichever issue ran it.** `josh latest` leaves
78
- `pnpm-lock.yaml` modified and that issue's `pnpm josh git -y` commits it, exactly as before. What the
79
- window removes is the other runs carrying the same bumps; it does not make that one diff clean.
80
- Should the issue then fail CI on a bump rather than on its own change, that is a dependency problem
81
- found once — fix it forward before parking the issue for it.
67
+ ## The lock file lands with the issue that ran the update
68
+
69
+ **The lock file the update rewrites lands with whichever issue ran it.** `josh latest` leaves
70
+ `pnpm-lock.yaml` modified and that issue's `pnpm josh git -y` commits it. Should the issue then fail
71
+ CI on a bump rather than on its own change, fix it forward before parking the issue for it. Rationale
72
+ for the elapsed-time window: `docs/maintainers/latest-gate-rationale.md` → "Why an elapsed-time
73
+ window rather than once per batch".
82
74
 
83
75
  This file is the single source of the rule. `fullrun.md`, `halfrun.md`, `backlogrun.md` and `backlogrun.md`
84
76
  each name `pnpm josh latest:scope` at the point their procedure reaches it and route here for
85
- everything else; `docs/josh-commands.md` documents the command itself.
77
+ everything else; `docs/josh-commands-automation.md` documents the command itself.
@@ -57,7 +57,7 @@ run's *start*; this withholds its *end*. So a `needs-human-review` issue is stil
57
57
  the artifact a person is meant to look at would never be produced — and a child stopped by it **goes on
58
58
  holding its repository**, because the uncommitted work is still in the checkout; read as parked there,
59
59
  the next child would start `git switch main && git pull` on top of it. The code encodes both halves by
60
- leaving the label out of two sets: `scripts/git/issue-labels.ts` keeps it out of
60
+ leaving the label out of two sets: `scripts/issue/issue-labels.ts` keeps it out of
61
61
  `NOT_DIRECTLY_RUNNABLE_LABELS` and `scripts/epic/epic-busy.ts` keeps it out of the parked set.
62
62
 
63
63
  Each entry point's own branch stays in its own file — `fullrun.md`, `halfrun.md`,
@@ -19,7 +19,7 @@ Tier C (`CLAUDE.md`). Name what was filed in the completion report. An observati
19
19
  on is dropped rather than filed.
20
20
 
21
21
  **The filing ceilings still apply.** Count this filing in the ten-Issue limit for the run. An
22
- observation is discretionary, so above 30 open Issues in the target repository, close one first or do
22
+ observation is discretionary, so above the WIP cap in the target repository, close one first or do
23
23
  not file (`prompts/collaboration-workflow/wip-cap.md`). File it with `pnpm josh issue:file`
24
24
  (`issue-scout.md`), which lints the body against `prompts/collaboration-workflow/issue-template.md`,
25
25
  applies the classification labels it declares, runs the duplicate scan, and runs `epic:bundle` on the
@@ -42,7 +42,7 @@ The detail below is read at the filing decision, and the marker suite pins the r
42
42
 
43
43
  **The depth is recorded on the Issue as a label, and the label is applied when the Issue is filed**
44
44
  (joshuafolkken/kit#1729). `depth:0`, `depth:1` and `depth:2` are the three, defined once in
45
- `scripts/git/issue-labels.ts` and carrying no definition of their own — **the table above is the
45
+ `scripts/issue/issue-labels.ts` and carrying no definition of their own — **the table above is the
46
46
  single source**, and a label description that paraphrased it would be a second copy of the rule.
47
47
  **Every filing route applies one**, this route and the other three of §2d's table alike: a `new`
48
48
  entry point, a `route:tier-a` prerequisite, a `route:interrupt`, a split child and a review round
@@ -56,7 +56,7 @@ gh api repos/{owner}/{repo}/issues/<N>/labels -f 'labels[]=depth:1' # an Issue
56
56
 
57
57
  **Create the three once per repository**, before the first filing that applies one — REST auto-creates
58
58
  a missing label with a generated color and no description, and the three lines below are what give
59
- each a stable color a reader can scan a listing by. `DEPTH_LABELS` in `scripts/git/issue-labels.ts`
59
+ each a stable color a reader can scan a listing by. `DEPTH_LABELS` in `scripts/issue/issue-labels.ts`
60
60
  is the single source of the colors and descriptions, and `scripts/rules/issue-depth-label.test.ts` keys
61
61
  these lines to it so the two cannot drift.
62
62
 
@@ -69,9 +69,8 @@ pnpm josh run:cut <N>
69
69
  **`cut` is the only verdict that ends the turn.** Every other one — `under-threshold` included — leaves
70
70
  the current process to carry the run on itself.
71
71
 
72
- ### The gate refuses until the cut has been taken (joshuafolkken/kit#1864)
72
+ ### The gate refuses until the cut has been taken
73
73
 
74
- **This step was carried as prose and fired exactly never.** In measured lane children the cut was taken **0 times**, so
75
74
  `pnpm josh rule:guard` **refuses `pnpm josh gate`** while this checkout is a lane and no cut record is
76
75
  carried, handing back the command above. Rationale:
77
76
  `docs/maintainers/pre-gate-cut-rationale.md` → "Why the rules are guards, not prose".
@@ -165,13 +164,10 @@ hand-off". The parent's seam and the child's `run_cut.IMPLEMENTATION_CONTEXT_THR
165
164
  **135_000** `CONTEXT_CUT_THRESHOLD` (aliased so the tests cannot drift). No separate measurement is
166
165
  built for the lane child.
167
166
 
168
- ### It is a guard, fired at the edit that crosses the threshold (joshuafolkken/kit#2310)
167
+ ### It is a guard, fired at the edit that crosses the threshold
169
168
 
170
- **This step was carried as prose and fired exactly never** — the cut fired **0 times** while 33.9% of
171
- lane requests ran past 200,000 tokens. Rationale:
172
- `docs/maintainers/pre-gate-cut-rationale.md` → "Why the rules are guards, not prose".
173
-
174
- So `pnpm josh rule:guard` **refuses an `Edit` / `Write`** while this checkout is a dispatched lane child
169
+ Rationale: `docs/maintainers/pre-gate-cut-rationale.md` → "Why the rules are guards, not prose".
170
+ `pnpm josh rule:guard` **refuses an `Edit` / `Write`** while this checkout is a dispatched lane child
175
171
  whose recent-context cost is over threshold, handing back `pnpm josh run:cut --impl <N> --handoff <path>` — the
176
172
  refusal lands _before_ the edit. `cut` ends the turn, the rest leave this process implementing; a fresh
177
173
  process's `pnpm josh run:cut --resume <N>` then answers **`resume-impl`**, so it **skips the title, plan,
@@ -31,7 +31,7 @@ pnpm josh issue:file "<title>" --body-file <body-file> --depth <n> --route tier-
31
31
 
32
32
  The command lints the body against `prompts/collaboration-workflow/issue-template.md`, applies the
33
33
  classification labels it declares, and runs the duplicate scan and `epic:bundle` itself
34
- (`docs/josh-commands.md` → `josh issue:file`).
34
+ (`docs/josh-commands-automation.md` → `josh issue:file`).
35
35
 
36
36
  Every "file the prerequisite" below means that labelled filing, and it always happens **first**: the
37
37
  steps after it name a number that does not exist until it is. **Its duplicate scan is read exactly as
@@ -0,0 +1,36 @@
1
+ # `prrun` — the manifest (plan → implement → PR → green → stop, a person merges)
2
+
3
+ `prrun` sits between `halfrun` (stop before commit) and `fullrun` (auto-merge). It runs `fullrun`
4
+ up to a green, mergeable pull request and **stops before the merge**, so a person merges by hand
5
+ (joshuafolkken/kit#3023). **Read `fullrun.md` for every step** — the entry sequence, the step lists,
6
+ the gate, the review and the stop branches are `fullrun`'s, unchanged. This file names only the
7
+ difference, never a second copy of the procedure.
8
+
9
+ ## The difference — the entry
10
+
11
+ `prrun #<N>` opens with `pnpm josh run:entry <N> --to prrun` where `fullrun` passes no `--to`
12
+ (`SKILL.md` → §2k): a planned Issue starts at the implementation, a `halfrun` stop is adopted and
13
+ resumes at the gate, and an Issue already stopped by a `prrun` is reached — report the stage line and
14
+ stop. A merged Issue is reached too, but the `entry #<N>` line after the stage line answers it (§2k).
15
+
16
+ ## The difference — the end of the run
17
+
18
+ Where `fullrun` runs `pnpm josh followup` and merges, `prrun` does three things and stops:
19
+
20
+ 1. **Watch the pull request to mergeable** — `pnpm josh followup "<title> #<N>" --no-merge`
21
+ (`followup.md` → "Run `pnpm josh followup`", read in the same turn): required CI green and the AI
22
+ review findings resolved. A failure stops the run exactly as it stops a `fullrun`.
23
+ 2. **Mark the stop — `pnpm josh run:hold <N> --prrun-stop`.** It records the commit the pull request is
24
+ on in this run's own hold, the record `fullrun #<N>` adopts (its prrun resume, `working-tree-hold.md`). **The hold and `in-progress` stay**: the run is not finished until the merge's tail runs.
25
+ 3. **Send a `confirmation` Telegram with the resume commands, then stop.** **`fullrun #<N>` first** —
26
+ its `run:entry` reads where the pull request stands and resumes from there; the direct command
27
+ follows for finishing without an agent:
28
+ `pnpm josh notify --task-type confirmation --issue-url "<issue-url>" --body=$'prrun ready to
29
+ merge: <pr-url>\nNext: fullrun #<N>\nAfter a manual merge, without an agent: pnpm josh followup
30
+ "<title> #<N>"'`. The stop report names the same two, in the same order.
31
+
32
+ **Invoking `prrun` is _not_ authorization to merge** — never run `pnpm josh followup` without
33
+ `--no-merge` in a `prrun`. After a person merges by hand, the same `pnpm josh followup "<title> #<N>"`
34
+ runs only the post-merge tail (`followup.md`).
35
+
36
+ `prrun new`: `fullrun new` up to the pull request, then the three steps above with the filed number.
@@ -65,7 +65,7 @@ Issue, as after any filing.
65
65
  input, so the next run picks the improvements up without waiting for a person. **`backlogrun-steps.md` →
66
66
  "What one invocation approves" is that carve-out's single source**; it is written there, beside the
67
67
  brakes that bound it, rather than restated here. Every brake still counts a retrospective's filings: the
68
- ten-per-invocation ceiling, the WIP cap of 30, `--max`, the 150,000-token session budget and the 8-hour
68
+ ten-per-invocation ceiling, the WIP cap, `--max`, the 150,000-token session budget and the 8-hour
69
69
  whole-run bound.
70
70
 
71
71
  **Close with `pnpm josh run:carry --retrospective --summary "<result>" --owner "$PPID"`.** It marks the