@joshuafolkken/kit 1.1455.0 → 1.1514.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 (374) hide show
  1. package/.claude/settings.json +6 -6
  2. package/.claude/skills/dependency-update/SKILL.md +26 -55
  3. package/.claude/skills/epic-commands/SKILL.md +83 -156
  4. package/.claude/skills/epic-commands/epic-bundle.md +51 -79
  5. package/.claude/skills/epic-commands/execution-waves.md +43 -81
  6. package/.claude/skills/verify-ui/SKILL.md +24 -50
  7. package/.claude/skills/workflow-commands/SKILL.md +7 -9
  8. package/.claude/skills/workflow-commands/background-commands.md +31 -46
  9. package/.claude/skills/workflow-commands/backlogrun-child.md +65 -85
  10. package/.claude/skills/workflow-commands/backlogrun-lanes.md +86 -125
  11. package/.claude/skills/workflow-commands/backlogrun-park.md +68 -118
  12. package/.claude/skills/workflow-commands/backlogrun-progress.md +17 -28
  13. package/.claude/skills/workflow-commands/backlogrun-recovery.md +17 -26
  14. package/.claude/skills/workflow-commands/backlogrun-steps.md +35 -52
  15. package/.claude/skills/workflow-commands/backlogrun.md +31 -50
  16. package/.claude/skills/workflow-commands/chain-rule.md +31 -40
  17. package/.claude/skills/workflow-commands/delegation.md +12 -8
  18. package/.claude/skills/workflow-commands/entry-sequence.md +1 -3
  19. package/.claude/skills/workflow-commands/followup.md +55 -77
  20. package/.claude/skills/workflow-commands/fullrun-steps.md +3 -5
  21. package/.claude/skills/workflow-commands/fullrun.md +4 -6
  22. package/.claude/skills/workflow-commands/halfrun.md +3 -7
  23. package/.claude/skills/workflow-commands/into-target.md +1 -2
  24. package/.claude/skills/workflow-commands/issue-comments.md +43 -60
  25. package/.claude/skills/workflow-commands/issue-scout.md +3 -2
  26. package/.claude/skills/workflow-commands/kickoff.md +65 -74
  27. package/.claude/skills/workflow-commands/latest-gate.md +2 -6
  28. package/.claude/skills/workflow-commands/needs-human-review.md +2 -5
  29. package/.claude/skills/workflow-commands/observation-filing.md +59 -118
  30. package/.claude/skills/workflow-commands/observation-ledger.md +52 -112
  31. package/.claude/skills/workflow-commands/pre-gate-cut.md +88 -142
  32. package/.claude/skills/workflow-commands/prerequisite.md +11 -17
  33. package/.claude/skills/workflow-commands/progress-watcher.md +23 -33
  34. package/.claude/skills/workflow-commands/prrun.md +3 -5
  35. package/.claude/skills/workflow-commands/retrospective.md +35 -54
  36. package/.claude/skills/workflow-commands/split-assessment.md +32 -58
  37. package/.claude/skills/workflow-commands/target-repository.md +1 -2
  38. package/.claude/skills/workflow-commands/working-tree-hold.md +54 -73
  39. package/.codex/hooks.json +6 -6
  40. package/.github/actions/setup-node/action.yml +1 -1
  41. package/.github/workflows/ci.yml +1 -1
  42. package/.github/workflows/publish.yml +2 -2
  43. package/CLAUDE.md +7 -6
  44. package/cspell/index.yaml +7 -0
  45. package/dist/CLAUDE.md +7 -6
  46. package/dist/commands/document-section-cli.js +67 -34
  47. package/dist/hooks/batch-guard.js +6 -6
  48. package/dist/hooks/chunk-4KKD2UTK.js +66 -0
  49. package/dist/hooks/{chunk-GPLGZ6IC.js → chunk-6TS2JD6D.js} +14 -3
  50. package/dist/hooks/chunk-7DSBJVFH.js +50 -0
  51. package/dist/hooks/{chunk-5H4SSDSD.js → chunk-A65Y4YOR.js} +3 -3
  52. package/dist/hooks/{chunk-3C4XRYG6.js → chunk-APUO6U4J.js} +102 -19
  53. package/dist/hooks/{chunk-IX6TTTI6.js → chunk-EFXE6C37.js} +8 -22
  54. package/dist/hooks/chunk-GP4IEC4O.js +20 -0
  55. package/dist/hooks/chunk-JP45SOCJ.js +56 -0
  56. package/dist/hooks/{chunk-OLMO72ON.js → chunk-LAOV7NLM.js} +1 -1
  57. package/dist/hooks/chunk-M4HGZV7U.js +83 -0
  58. package/dist/hooks/{chunk-TBJFTSUY.js → chunk-O6GDRNJB.js} +9 -7
  59. package/dist/hooks/{chunk-HFGWYGUV.js → chunk-PF2NZL2A.js} +5 -5
  60. package/dist/hooks/{chunk-WNLVGT7E.js → chunk-PTICX4OL.js} +4 -5
  61. package/dist/hooks/{chunk-HHI6FO3R.js → chunk-RT27QRJW.js} +763 -1515
  62. package/dist/hooks/{chunk-7WQBPLUN.js → chunk-SYOTDYCI.js} +1149 -1095
  63. package/dist/hooks/{chunk-LIAFCXL7.js → chunk-TNUMY6NL.js} +1519 -1332
  64. package/dist/hooks/chunk-UPUZF3AN.js +279 -0
  65. package/dist/hooks/{chunk-Z4XI7CZS.js → chunk-WK6SMBIC.js} +1932 -784
  66. package/dist/hooks/codex-hook-adapter.js +17 -14
  67. package/dist/hooks/duplicate-read-guard.js +7 -7
  68. package/dist/hooks/format-edited.js +5 -4
  69. package/dist/hooks/inputs.json +302 -247
  70. package/dist/hooks/investigation-guard.js +8 -11
  71. package/dist/hooks/pretool-guard.js +16 -13
  72. package/dist/hooks/session-lang.js +372 -26
  73. package/dist/hooks/stop-guard.js +2593 -189
  74. package/dist/josh.js +2128 -282
  75. package/dist/managed-marker/index.js +1 -2
  76. package/dist/version/index.js +15 -12
  77. package/eslint/base.js +2 -1
  78. package/eslint/rules/unicorn.js +16 -0
  79. package/lefthook/base.yml +5 -3
  80. package/package.json +14 -12
  81. package/prompts/coding-standards.md +12 -22
  82. package/prompts/collaboration-workflow/file-edits.md +25 -45
  83. package/prompts/collaboration-workflow/gh-rest.md +19 -36
  84. package/prompts/collaboration-workflow/glossary.md +5 -7
  85. package/prompts/collaboration-workflow/issue-citation.md +6 -14
  86. package/prompts/collaboration-workflow/issue-template.md +40 -32
  87. package/prompts/collaboration-workflow/lane-instructions.md +35 -0
  88. package/prompts/collaboration-workflow/operating-rules.md +33 -46
  89. package/prompts/collaboration-workflow/output-bounds.md +15 -15
  90. package/prompts/collaboration-workflow/overview.md +14 -19
  91. package/prompts/collaboration-workflow/plan-comment.md +13 -13
  92. package/prompts/collaboration-workflow/principles.md +57 -54
  93. package/prompts/collaboration-workflow/proposal-request.md +1 -9
  94. package/prompts/collaboration-workflow/report-format.md +41 -49
  95. package/prompts/collaboration-workflow/residency.md +15 -11
  96. package/prompts/collaboration-workflow/rule-delivery.md +7 -15
  97. package/prompts/collaboration-workflow/shell-body.md +10 -20
  98. package/prompts/collaboration-workflow/turn-batching.md +8 -14
  99. package/prompts/collaboration-workflow/upstream-interrupt.md +26 -34
  100. package/prompts/collaboration-workflow/wip-cap.md +26 -32
  101. package/prompts/collaboration-workflow.md +25 -25
  102. package/prompts/refactoring.md +33 -43
  103. package/prompts/review-rubric.md +84 -129
  104. package/prompts/review.md +110 -141
  105. package/prompts/sonar-hotspot-handling.md +22 -50
  106. package/prompts/testing-guide.md +48 -99
  107. package/scripts/adopt/adopt-toolkits.ts +2 -4
  108. package/scripts/agent/agent-argv.ts +20 -4
  109. package/scripts/agent/agent-exit-record.ts +23 -1
  110. package/scripts/agent/agent-role-profile.ts +101 -45
  111. package/scripts/agent/agent-safe-text.ts +60 -0
  112. package/scripts/agent/claude-agent-argv.ts +14 -0
  113. package/scripts/agent/codex-agent-argv.ts +9 -2
  114. package/scripts/agent/lane-instructions.ts +144 -0
  115. package/scripts/backlog/backlog-budget-cli.ts +1 -2
  116. package/scripts/backlog/backlog-budget.ts +4 -4
  117. package/scripts/backlog/backlog-drive-carried.ts +26 -0
  118. package/scripts/backlog/backlog-drive-cli.ts +10 -5
  119. package/scripts/backlog/backlog-drive-named.ts +3 -5
  120. package/scripts/backlog/backlog-drive-restore.ts +28 -2
  121. package/scripts/backlog/backlog-drive-seats.ts +27 -0
  122. package/scripts/backlog/backlog-drive.ts +11 -6
  123. package/scripts/backlog/backlog-occupied.ts +56 -0
  124. package/scripts/backlog/backlog-ready.ts +59 -15
  125. package/scripts/behavior/behavior-rules.ts +3 -2
  126. package/scripts/cost-runtime/codex-usage.ts +4 -2
  127. package/scripts/cost-runtime/cost-cli.ts +1 -2
  128. package/scripts/delegation/duplicate-read-guard.ts +2 -2
  129. package/scripts/delegation/investigation-guard.ts +15 -65
  130. package/scripts/delegation/investigation-reads.ts +1 -2
  131. package/scripts/discovery/repo-discovery.ts +4 -2
  132. package/scripts/discovery/repo-origin.ts +2 -4
  133. package/scripts/doctor/doctor-logic.ts +6 -3
  134. package/scripts/document/document-byte-budget.ts +28 -27
  135. package/scripts/document/document-byte-check.ts +1 -2
  136. package/scripts/document/document-section-cli.ts +17 -5
  137. package/scripts/document/entry-read-budget.ts +3 -3
  138. package/scripts/document/read-set-cli.ts +4 -1
  139. package/scripts/epic/epic-audit-orphans.ts +5 -8
  140. package/scripts/epic/epic-audit-rationale.ts +8 -2
  141. package/scripts/epic/epic-audit.ts +52 -1
  142. package/scripts/epic/epic-bundle-cli.ts +1 -2
  143. package/scripts/epic/epic-bundle-evidence.ts +49 -26
  144. package/scripts/epic/epic-bundle-referenced.ts +14 -3
  145. package/scripts/epic/epic-bundle.ts +17 -9
  146. package/scripts/epic/epic-chains.ts +6 -2
  147. package/scripts/epic/epic-close-comment.ts +1 -2
  148. package/scripts/followup/git-followup-workflow.ts +19 -1
  149. package/scripts/gate/check-inputs.ts +129 -0
  150. package/scripts/gate/check-reuse.ts +162 -0
  151. package/scripts/gate/core-budget.ts +93 -44
  152. package/scripts/gate/core-wait.ts +130 -0
  153. package/scripts/gate/free-cores.ts +49 -0
  154. package/scripts/gate/gate-ledger.ts +17 -3
  155. package/scripts/gate/gate-plan.ts +23 -1
  156. package/scripts/gate/gate-report.ts +15 -2
  157. package/scripts/gate/gate-run-steps.ts +150 -0
  158. package/scripts/gate/held-mark.ts +55 -0
  159. package/scripts/gate/machine-capacity.ts +70 -11
  160. package/scripts/gate/pre-commit-type-check.ts +14 -1
  161. package/scripts/gate/verification-gate.ts +65 -127
  162. package/scripts/gh/git-gh-issue-rest.ts +1 -0
  163. package/scripts/gh/git-gh-issue-write.ts +24 -2
  164. package/scripts/gh/git-pr.ts +19 -3
  165. package/scripts/git/git-common-directory.ts +3 -3
  166. package/scripts/git/git-diff-reads.ts +16 -9
  167. package/scripts/git/git-execa-error.ts +1 -2
  168. package/scripts/git/main-merge-regenerate.ts +78 -0
  169. package/scripts/git/main-merge.ts +14 -5
  170. package/scripts/hooks/batch-guard.ts +5 -8
  171. package/scripts/hooks/format-edited-file.ts +10 -4
  172. package/scripts/hooks/pre-commit-lint.ts +91 -0
  173. package/scripts/hooks/pre-push-unit.ts +15 -4
  174. package/scripts/hooks/pretool-guard.ts +48 -79
  175. package/scripts/hooks/reserved-run.ts +1 -0
  176. package/scripts/hooks/run-hook.sh +10 -12
  177. package/scripts/hooks/step-zero-notice.ts +3 -2
  178. package/scripts/hooks/stop-actions.ts +204 -0
  179. package/scripts/hooks/stop-guard.ts +62 -21
  180. package/scripts/init/hook-command-rewrite.ts +6 -2
  181. package/scripts/init/hook-launch.ts +12 -7
  182. package/scripts/init/init-logic-deploy-vps.ts +4 -2
  183. package/scripts/issue/behavior-change-lint.ts +12 -6
  184. package/scripts/issue/expected-effect-lint.ts +59 -0
  185. package/scripts/issue/issue-cite-cli.ts +35 -15
  186. package/scripts/issue/issue-classification.ts +1 -1
  187. package/scripts/issue/issue-lint-cli.ts +5 -3
  188. package/scripts/issue/issue-scout-cli.ts +22 -16
  189. package/scripts/issue/markdown-section.ts +19 -5
  190. package/scripts/josh/command-usage.ts +110 -0
  191. package/scripts/josh/file-map-stamp.ts +1 -3
  192. package/scripts/josh/hook-decision.ts +17 -2
  193. package/scripts/josh/josh-command-map.ts +2 -0
  194. package/scripts/josh/josh-command-types.ts +55 -9
  195. package/scripts/josh/josh-commands-ai.ts +13 -0
  196. package/scripts/josh/josh-commands-development.ts +1 -1
  197. package/scripts/josh/josh-commands-hooks.ts +6 -0
  198. package/scripts/josh/josh-commands-lane.ts +10 -1
  199. package/scripts/josh/josh-commands-workflow.ts +5 -0
  200. package/scripts/josh/josh-logic.ts +6 -15
  201. package/scripts/josh/josh-usage-automation.ts +121 -0
  202. package/scripts/josh/josh-usage-backlog.ts +180 -0
  203. package/scripts/josh/josh-usage-developer.ts +230 -0
  204. package/scripts/josh/josh-usage-hooks.ts +38 -0
  205. package/scripts/josh/josh-usage-issue.ts +205 -0
  206. package/scripts/josh/josh-usage-review.ts +101 -0
  207. package/scripts/josh/josh-usage-run.ts +252 -0
  208. package/scripts/josh/josh-usage-session.ts +238 -0
  209. package/scripts/josh/josh-usage-workflow.ts +212 -0
  210. package/scripts/josh/josh.ts +14 -5
  211. package/scripts/josh/package-directory.ts +20 -0
  212. package/scripts/lane/lane-await.ts +3 -2
  213. package/scripts/lane/lane-capacity.ts +8 -2
  214. package/scripts/lane/lane-check-stats.ts +56 -0
  215. package/scripts/lane/lane-child-invocation.ts +49 -5
  216. package/scripts/lane/lane-dispatch.ts +3 -3
  217. package/scripts/lane/lane-guard-policy.ts +5 -5
  218. package/scripts/lane/lane-handoff.ts +8 -1
  219. package/scripts/lane/lane-install.ts +12 -4
  220. package/scripts/lane/lane-ledger.ts +52 -1
  221. package/scripts/lane/lane-limit-cli.ts +8 -9
  222. package/scripts/lane/lane-load.ts +9 -2
  223. package/scripts/lane/lane-measure-cli.ts +4 -0
  224. package/scripts/lane/lane-parked.ts +18 -0
  225. package/scripts/lane/lane-preserve.ts +29 -1
  226. package/scripts/lane/lane-process-load.ts +125 -0
  227. package/scripts/lane/lane-process-stats.ts +93 -0
  228. package/scripts/lane/lane-registry.ts +17 -10
  229. package/scripts/lane/lane-restart.ts +5 -26
  230. package/scripts/lane/lane-session-action.ts +146 -0
  231. package/scripts/lane/lane-session-broker.ts +68 -125
  232. package/scripts/lane/lane-spent.ts +14 -3
  233. package/scripts/lane/lane-stats.ts +1 -0
  234. package/scripts/lane/lane-withdraw-cli.ts +71 -0
  235. package/scripts/lane/lane-withdraw.ts +182 -0
  236. package/scripts/lint/format.ts +4 -4
  237. package/scripts/lint/lint-parallel.ts +10 -3
  238. package/scripts/lint/lint-related-scope.ts +4 -1
  239. package/scripts/managed-marker/managed-marker-logic.ts +1 -2
  240. package/scripts/notify/telegram-test.ts +10 -5
  241. package/scripts/overrides/lockfile-overrides.ts +1 -3
  242. package/scripts/propagate/propagate.ts +1 -2
  243. package/scripts/release/release-progress.ts +3 -2
  244. package/scripts/report/report-format-reference.ts +2 -0
  245. package/scripts/report/report-lint.ts +7 -4
  246. package/scripts/review/acceptance-map-check.ts +61 -0
  247. package/scripts/review/acceptance-map.ts +205 -0
  248. package/scripts/review/review-brief-cli.ts +1 -1
  249. package/scripts/review/review-record-cli.ts +6 -2
  250. package/scripts/rules/agent-model.ts +59 -0
  251. package/scripts/rules/delivered-rules.ts +11 -2
  252. package/scripts/rules/destructive-command.ts +6 -9
  253. package/scripts/rules/direct-filing.ts +3 -7
  254. package/scripts/rules/early-heartbeat.ts +7 -18
  255. package/scripts/rules/file-body.ts +6 -13
  256. package/scripts/rules/filing-cap.ts +4 -6
  257. package/scripts/rules/firing-point.ts +6 -5
  258. package/scripts/rules/git-force.ts +5 -9
  259. package/scripts/rules/guard-remedy.ts +117 -0
  260. package/scripts/rules/implementation-cut.ts +37 -35
  261. package/scripts/rules/index-guard.ts +4 -7
  262. package/scripts/rules/issue-comments.ts +67 -16
  263. package/scripts/rules/josh-git-bare.ts +3 -6
  264. package/scripts/rules/lane-background.ts +10 -21
  265. package/scripts/rules/lane-carry-conflict.ts +7 -17
  266. package/scripts/rules/lane-interactive-ask.ts +6 -11
  267. package/scripts/rules/lane-park.ts +5 -13
  268. package/scripts/rules/lane-split-park.ts +2 -7
  269. package/scripts/rules/lane-switch-main.ts +9 -12
  270. package/scripts/rules/last-prompt.ts +50 -5
  271. package/scripts/rules/oracle-consulted.ts +4 -5
  272. package/scripts/rules/oracle-list-cli.ts +7 -0
  273. package/scripts/rules/piped-verification.ts +84 -32
  274. package/scripts/rules/poll-loop.ts +7 -17
  275. package/scripts/rules/pre-gate-cut.ts +7 -21
  276. package/scripts/rules/prior-comment-read.ts +7 -5
  277. package/scripts/rules/protected-files.ts +5 -9
  278. package/scripts/rules/raw-field-body.ts +3 -7
  279. package/scripts/rules/rule-body-guard.ts +4 -11
  280. package/scripts/rules/rule-list.ts +4 -1
  281. package/scripts/rules/rule-registry-rows.ts +10 -0
  282. package/scripts/rules/rule-registry.ts +7 -4
  283. package/scripts/rules/rule-rewrite.ts +114 -0
  284. package/scripts/rules/rule-value.ts +7 -1
  285. package/scripts/rules/run-tail-rule.ts +6 -22
  286. package/scripts/rules/shell-body-trigger.ts +4 -6
  287. package/scripts/rules/shell-segments.ts +22 -0
  288. package/scripts/rules/stop-decision.ts +77 -0
  289. package/scripts/rules/stop-rules.ts +164 -77
  290. package/scripts/rules/tail-commands.ts +15 -1
  291. package/scripts/rules/test-declared-commit.ts +4 -10
  292. package/scripts/rules/third-party-write.ts +5 -10
  293. package/scripts/rules/worktree-guard.ts +5 -12
  294. package/scripts/run/board/run-board-cli.ts +2 -0
  295. package/scripts/run/board/run-board-closed.ts +8 -2
  296. package/scripts/run/board/run-board-github.ts +19 -3
  297. package/scripts/run/board/run-board-header.ts +4 -1
  298. package/scripts/run/board/run-board-idle.ts +31 -0
  299. package/scripts/run/board/run-board-labels.ts +2 -0
  300. package/scripts/run/board/run-board-layout.ts +1 -1
  301. package/scripts/run/board/run-board-read.ts +25 -12
  302. package/scripts/run/board/run-board-reason.ts +17 -4
  303. package/scripts/run/board/run-board-render-legend.ts +1 -0
  304. package/scripts/run/board/run-board-render-slot.ts +1 -1
  305. package/scripts/run/board/run-board-render-waits.ts +41 -0
  306. package/scripts/run/board/run-board-render.ts +6 -1
  307. package/scripts/run/board/run-board-row-yield.ts +1 -0
  308. package/scripts/run/board/run-board-state.ts +9 -0
  309. package/scripts/run/board/run-board-status.ts +89 -23
  310. package/scripts/run/board/run-board-thanks.ts +7 -2
  311. package/scripts/run/board/run-board-tick.ts +37 -8
  312. package/scripts/run/carry/run-carry-args.ts +1 -3
  313. package/scripts/run/carry/run-carry-conversation.ts +7 -2
  314. package/scripts/run/cut/run-cut-cli.ts +18 -22
  315. package/scripts/run/cut/run-cut-decline.ts +72 -0
  316. package/scripts/run/cut/run-cut-ready.ts +74 -0
  317. package/scripts/run/cut/run-cut-report.ts +29 -0
  318. package/scripts/run/cut/run-cut.ts +10 -1
  319. package/scripts/run/detached-launch.ts +23 -4
  320. package/scripts/run/entry/run-entry-cli.ts +8 -1
  321. package/scripts/run/event/run-event-render.ts +1 -0
  322. package/scripts/run/event/run-event-scope.ts +19 -1
  323. package/scripts/run/event/run-event-stream-emit.ts +13 -6
  324. package/scripts/run/event/run-event-stream.ts +4 -0
  325. package/scripts/run/hold/run-hold-cli.ts +14 -3
  326. package/scripts/run/hold/run-hold-session.ts +46 -0
  327. package/scripts/run/hold/run-hold.ts +13 -4
  328. package/scripts/run/launch-priority.ts +32 -0
  329. package/scripts/run/merge/run-merge-cli.ts +16 -42
  330. package/scripts/run/merge/run-merge-ship.ts +59 -1
  331. package/scripts/run/merge/run-merge-signals.ts +99 -0
  332. package/scripts/run/merge/run-merge-steps.ts +11 -1
  333. package/scripts/run/merge/run-merge.ts +22 -9
  334. package/scripts/run/run-ending.ts +31 -3
  335. package/scripts/run/run-liveness.ts +1 -1
  336. package/scripts/run/run-parent-cut-hook.ts +5 -10
  337. package/scripts/run/run-poll-hook.ts +157 -0
  338. package/scripts/run/run-preflight.ts +1 -2
  339. package/scripts/run/run-step-cli.ts +22 -15
  340. package/scripts/run/run-step-section.ts +85 -0
  341. package/scripts/run/run-stop-notify.ts +1 -2
  342. package/scripts/run/run-watcher-guard.ts +6 -3
  343. package/scripts/run/ship/run-ship-cli.ts +5 -12
  344. package/scripts/run/ship/run-ship-detach.ts +9 -0
  345. package/scripts/run/ship/run-ship-next.ts +10 -2
  346. package/scripts/run/ship/run-ship-overlap.ts +195 -0
  347. package/scripts/run/ship/run-ship-pre-detach.ts +33 -15
  348. package/scripts/run/ship/run-ship-preflight.ts +28 -2
  349. package/scripts/run/ship/run-ship-return.ts +31 -7
  350. package/scripts/run/ship/run-ship-review-steps.ts +25 -14
  351. package/scripts/run/ship/run-ship-review.ts +15 -2
  352. package/scripts/run/ship/run-ship-steps.ts +1 -1
  353. package/scripts/run/ship/run-ship-stop-context.ts +206 -0
  354. package/scripts/run/ship/run-ship-sync.ts +14 -6
  355. package/scripts/run/tidy/run-tidy-cli.ts +3 -3
  356. package/scripts/run/tidy/run-tidy-lanes.ts +3 -2
  357. package/scripts/safe-chain/project-config.ts +7 -2
  358. package/scripts/sync/sync-hook-safety.ts +8 -2
  359. package/scripts/test/test-e2e-guard.ts +30 -5
  360. package/scripts/test/test-unit-guard.ts +16 -1
  361. package/scripts/test/unit-worker-share.ts +26 -3
  362. package/scripts/time-runtime/time-batch-guard.ts +3 -3
  363. package/scripts/time-runtime/time-hook-transcript.ts +3 -2
  364. package/scripts/time-runtime/time-shell.ts +39 -4
  365. package/scripts/time-runtime/time-spans.ts +1 -0
  366. package/scripts/time-runtime/time-tool-call.ts +7 -0
  367. package/scripts/version/effective-upstream.ts +3 -4
  368. package/scripts/version/kit-version-config.ts +8 -2
  369. package/scripts/version/latest-corepack.ts +1 -2
  370. package/scripts/version/release-hold.ts +11 -4
  371. package/scripts/version/version-commands.ts +12 -4
  372. package/templates/gitignore +6 -2
  373. package/dist/hooks/chunk-D5QBTOCZ.js +0 -68
  374. package/dist/hooks/chunk-UT7YC3N2.js +0 -56
@@ -1,10 +1,5 @@
1
1
  # `backlogrun` — the manifest (named issues, epics and the opted-in backlog)
2
2
 
3
- **This file is the manifest, not the procedure**: the ordered flow as terse triggers, and the route
4
- table naming the one section each moment reads. Rationale and provenance:
5
- `docs/maintainers/backlogrun-rationale.md` → "Why the loop's position is computed";
6
- `docs/maintainers/backlogrun-rationale.md` → "Where each rule came from".
7
-
8
3
  **`backlogrun` names either nothing, or the issues and epics to run first.** With no argument it runs
9
4
  whatever `pnpm josh backlog:next` offers — the whole opted-in backlog, every issue carrying `auto-ok`
10
5
  plus every child of an epic whose root carries it, ordered by dependency and grouped into waves. With
@@ -12,9 +7,9 @@ plus every child of an epic whose root carries it, ordered by dependency and gro
12
7
  that same backlog. **`--only` stops it after the named list**, draining nothing.
13
8
 
14
9
  **The loop's current position is computed, not carried in the conversation.** `pnpm josh run:step <N>`
15
- reads where the run is from the event stream, the carry record and the issue state, and prints the next
16
- single action — a runnable command, or the one point a person has to judge. **With no `<N>` it answers
17
- for the parent itself**, from the carry record alone.
10
+ reads it from the event stream, the carry record and the issue state, and prints the next single
11
+ action — a runnable command, or the one point a person has to judge — followed by the section that
12
+ governs it. With no `<N>` it answers for the parent itself, from the carry record alone.
18
13
 
19
14
  **A named item may be a single issue or an epic.** A single-issue item is one `fullrun`; **a named epic runs its children in
20
15
  dependency order across the free lanes, and the run does not advance to the next named item until
@@ -29,52 +24,46 @@ is still that one invocation (`backlogrun-steps.md` → "The session cut is insi
29
24
 
30
25
  ## The manifest — the ordered flow
31
26
 
27
+ A section `run:step` prints is not fetched again. Every other one is read at its step with
28
+ `pnpm josh doc:section <file> "<heading>"` — never a whole document (`SKILL.md` → "A section
29
+ reference is read as a section").
30
+
32
31
  1. **Claim nothing at the entry — this parent orchestrates and never implements.** The working-tree
33
32
  hold, the split assessment and `fullrun.md` are read by a dispatched child inside its own delegated
34
33
  `fullrun` unit, never at the parent's entry.
35
34
  2. **Begin the carry record before the plan** — `pnpm josh run:carry --begin "<invocation>" --owner
36
- "$PPID"` and `pnpm josh run:wake --start`, in the same turn as the first `pnpm josh ms`.
35
+ "$PPID"` and `pnpm josh run:wake --start`, in the same turn as the first `pnpm josh ms`. Its answers:
36
+ `backlogrun-steps.md` → "The session cut is inside the invocation"; a resumed session:
37
+ `backlogrun-progress.md` → "Resuming after a cut".
37
38
  3. **What this invocation approves** — the opted-in pool, a run's own filings once bundled, and the
38
- brake that bounds the amount; the route table's row points at the single source of the `auto-ok` rule.
39
+ brake that bounds the amount: `backlogrun-steps.md` → "What one invocation approves".
39
40
  4. **Report the plan before the first child** — `pnpm josh backlog:plan`, then resolve every
40
41
  `needs-decision` issue decidable from its body in one pass, recording `blocked-by`, `run:solo` and
41
- `run:lane` in the same pass.
42
+ `run:lane` in the same pass: `backlogrun-steps.md` → "The plan, before the first child starts";
43
+ `run:solo`: `backlogrun-lanes.md` → "A solo run".
42
44
  5. **Named issues run first, in order** — each as a delegated `fullrun`, one at a time, then the pool;
43
45
  `--only` stops after the list.
46
+ - Once per session: `backlogrun-steps.md` → "What runs once per session, not once per issue" and
47
+ `backlogrun-child.md` → "`josh latest` runs once per session, not once per child"
48
+ (`latest-gate.md` whole on `required`).
49
+ - The watcher: `progress-watcher.md` → "Progress while the run is quiet".
50
+ - Lanes: `backlogrun-lanes.md` → "Once per repository, before the first lane opens", by hand
51
+ `backlogrun-lanes.md` → "Opening one lane and dispatching its child".
52
+ - Dispatch: `backlogrun-child.md` → "Each child runs in a delegated unit".
44
53
  6. **The loop belongs to the supervisor — hand it over with what the bare `pnpm josh run:step`
45
54
  prints**, whatever the plan held: `run:wake` runs `backlog:drive`, which returns a branch to an AI
46
- session only when it needs judgment.
55
+ session only when it needs judgment (`backlogrun-steps.md` → "The loop").
56
+ - An `epic #N` hand-back or a `merge` branch: `backlogrun-progress.md` → "Running a named epic's
57
+ children".
58
+ - A merge answered `over`: `backlogrun-progress.md` → "The hand-off".
59
+ - A unit gone silent: `backlogrun-recovery.md` → "A delegated unit that stopped without reporting".
60
+ - A child that cannot finish: `backlogrun-park.md` → "park and continue".
47
61
  7. **End the record when the run ends** — `run:report`, then `run:carry --end` (or `--end --stopped
48
- "<reason>"`) and `run:wake --stop`. An empty plan is not that end; the driver's idle watch decides it.
49
- A person stops a run from the terminal with `pnpm josh backlogrun --stop`, which makes both calls.
50
-
51
- ## The route table
52
-
53
- **Read one section, at the moment its row names, with `pnpm josh doc:section <file> "<heading>"`** —
54
- never a whole document (`SKILL.md` → "A section reference is read as a section"):
55
-
56
- | The moment | Read |
57
- | --- | --- |
58
- | The entry: the carry record and its answers | `backlogrun-steps.md` → "The session cut is inside the invocation" |
59
- | What the invocation may merge, and the `auto-ok` rule | `backlogrun-steps.md` → "What one invocation approves" |
60
- | Before the first child: the plan and the decision pass | `backlogrun-steps.md` → "The plan, before the first child starts" |
61
- | The driver hands a branch back | `backlogrun-steps.md` → "The loop" |
62
- | Once per session | `backlogrun-steps.md` → "What runs once per session, not once per issue" |
63
- | `josh latest:scope` answers `required` | `latest-gate.md` (whole) |
64
- | Starting the progress watcher | `progress-watcher.md` → "Progress while the run is quiet" |
65
- | The run ends | `backlogrun-steps.md` → "End the record when the run ends" |
66
- | Labelling an issue `run:solo` | `backlogrun-lanes.md` → "A solo run" |
67
- | Before the first lane opens | `backlogrun-lanes.md` → "Once per repository, before the first lane opens" |
68
- | Opening a lane by hand | `backlogrun-lanes.md` → "Opening one lane and dispatching its child" |
69
- | The first child is in hand | `backlogrun-child.md` → "`josh latest` runs once per session, not once per child" |
70
- | Dispatching a child | `backlogrun-child.md` → "Each child runs in a delegated unit" |
71
- | An `epic #N` hand-back, a `merge` branch, or a `run:merge` token | `backlogrun-progress.md` → "Running a named epic's children" |
72
- | A merge answered `over` | `backlogrun-progress.md` → "The hand-off" |
73
- | A resumed session | `backlogrun-progress.md` → "Resuming after a cut" |
74
- | The run's last merge | `backlogrun-progress.md` → "Who sends the summary, and who propagates" |
75
- | `josh release:scope`, after the last merge | `followup.md` → "When `pnpm josh release` runs" |
76
- | A unit went silent | `backlogrun-recovery.md` → "A delegated unit that stopped without reporting" |
77
- | A child cannot finish | `backlogrun-park.md` → "park and continue" |
62
+ "<reason>"`) and `run:wake --stop`: `backlogrun-steps.md` → "End the record when the run ends".
63
+ - An empty plan is not that end; the driver's idle watch decides it. A person stops a run from the
64
+ terminal with `pnpm josh backlogrun --stop`, which makes both calls.
65
+ - The last merge: `backlogrun-progress.md` → "Who sends the summary, and who propagates", then
66
+ `followup.md` → "When `pnpm josh release` runs".
78
67
 
79
68
  ## Guards
80
69
 
@@ -85,11 +74,3 @@ never a whole document (`SKILL.md` → "A section reference is read as a section
85
74
  | Consecutive child failures | 3 | Stop and report; something is wrong with the environment, not the children. |
86
75
 
87
76
  A failure that is not consecutive parks its child and the run continues.
88
-
89
- ## This file is the single source of the `backlogrun` procedure
90
-
91
- `CLAUDE.md` carries the keyword's row in the shorthand table and the explicit-invocation rule;
92
- `SKILL.md` → §1 routes here. This manifest names which children there are and in what order; each
93
- step's procedure is the section its route-table row names. Where any of them could disagree, the rule
94
- is that this manifest and `backlogrun-steps.md` add nothing to a child's procedure — they only say
95
- which children there are.
@@ -8,7 +8,8 @@ Review results and successful pushes are never turn boundaries.
8
8
  0. **A lane child**: `pnpm josh main:merge`, the self-check (`prompts/review.md` → "Before round 1 —
9
9
  the implementer's self-check"), the scoped pair, `pnpm josh ship --detach --review
10
10
  "<title> #<N>"` (`--cite <N>`), then **end the turn** on `launched`/`busy`. A stop relaunches a child
11
- whose prompt names `pnpm josh ship --log <N>` and (Anthropic lane) the re-detach to run after
11
+ whose prompt carries the failed output's tail and the changed files (`pnpm josh ship --log <N>` when
12
+ the stage printed nothing) and (Anthropic lane) the re-detach to run after
12
13
  the fix — `pnpm josh ship --detach`, `--review` only if the stopped ship carried it and stopped before
13
14
  round 2, which is final (`scripts/run/ship/run-ship-next.ts`); the supervisor skips a recorded round 1.
14
15
  `failed` → step 1. A backgrounded `ship` issued alone is moved to the foreground by the hook
@@ -18,7 +19,8 @@ Review results and successful pushes are never turn boundaries.
18
19
  (`prompts/review.md` → "Before round 1 — the implementer's self-check"), run the final scoped lint/test pair and
19
20
  `pnpm josh run:review`: it starts `pnpm josh gate` in the background and prints the `/code-review`
20
21
  brief in one call, so the two overlap. Launch the `/code-review` subagent as the `general-purpose`
21
- agent type with that brief (every tool, so `--fix` applies; never a guessed type name).
22
+ agent type with that brief and the alias of its `model=` id (`claude-opus-5-5` → `opus`) (every
23
+ tool, so `--fix` applies; never a guessed type name).
22
24
  Never load the review skill in the main line.
23
25
  2. Once the review returns, run `pnpm josh run:review --join` to join and read the gate before
24
26
  committing; it exits non-zero on a red gate. Fix any red check, then rerun the affected scoped check
@@ -40,7 +42,8 @@ Review results and successful pushes are never turn boundaries.
40
42
  **`pnpm josh followup` refuses the merge until the round is recorded**
41
43
  (`pnpm josh review:record --check --issue <N>`).
42
44
  5. **The clean path ships in one call** — with no second round due, background
43
- `pnpm josh ship "<title> #<N>" --body-file <evidence.md>`: PR preflight → gate → `git -y` →
45
+ `pnpm josh ship "<title> #<N>" --body-file <evidence.md>` — the file carries `## 実機証跡` and
46
+ `## 受け入れ条件の対応` (`report-format.md`), both asked at the preflight: PR preflight → gate → `git -y` →
44
47
  `followup` → `run:tail`, stopping at the first failure. `--review` runs both rounds. **Else a due
45
48
  round 2 does not fit `ship`**: the PR opens between the rounds — background
46
49
  `pnpm josh git -y "<title> #<N>"`, round 2 beside CI, then `pnpm josh followup`.
@@ -54,46 +57,34 @@ Recommendations are informational; severity decides. A CodeRabbit rate-limit war
54
57
  ## Orchestration facts single-sourced here
55
58
 
56
59
  These are the gate → review → PR → merge facts other documents cite; this file is their single source
57
- (`prompts/review.md` carries the review _policy_, `prompts/review-rubric.md` the rubric). Where each
58
- rule came from and why it holds: `docs/maintainers/chain-rule-rationale.md` → "Where each rule came
59
- from", `docs/maintainers/chain-rule-rationale.md` → "Why the orchestration facts hold".
60
+ (`prompts/review.md` carries the review _policy_, `prompts/review-rubric.md` the rubric).
60
61
 
61
- - **The gate runs beside this review, not in front of it** — `pnpm josh gate` is started when the review
62
- starts and joined before the commit. A red gate is fixed and re-run whatever the review concluded, and
63
- there is no path to a commit on a gate nobody read.
64
- - **origin/main is merged in before the gate** — `pnpm josh main:merge` merges `origin/<default>` into
65
- the branch before the gate and the review start. It is the last edit, so the scoped pair and the gate
66
- run once over it. A conflict here fires `backlogrun-recovery.md` → "Conflicts are not predicted"
67
- early. **This is the one place a conflicted merge's procedure is written**:
68
- `main:merge` refuses before merging when uncommitted changes touch a path the default branch also
69
- changed, or when the index still holds unresolved or staged paths — commit the work first with
70
- `pnpm josh git -y`, then rerun it, and **never stash around the merge**. A merge that stops on a
71
- conflict is finished the same way: remove the markers, then `pnpm josh git -y` stages the resolution
72
- and records the merge commit. That commit is the sanctioned flow, so it is **Tier A** — a lane child
73
- never stops to ask a person for `git add`, and the `Stop` hook sends back a reply that does.
74
- - **A single check answers once per tree** — while implementing, re-run a single check by name
75
- (`pnpm josh lint:related`, `pnpm josh cspell:dot`, `pnpm josh test:related`, or the project's type
76
- check) after every edit; a repeat of the same command with the same arguments over a tree nothing has
77
- touched since buys only a copy of the answer already in hand. In kit a detached `pnpm josh ship` also
78
- checks the metrics totals before the hand-off, so the implementing session accepts a grown total with
79
- its reason, as the ship's output names.
80
- - **The pull request opens between the rounds, so CI runs beside round 2** — `pnpm josh git -y` sits
81
- between the two review rounds. Round 1 runs on the uncommitted tree and its High/Medium findings are
82
- fixed before anything is committed; the verification pass over those fixes then runs against the open
83
- pull request, beside the CI the commit started.
84
- - **The round-2 fix commit is pushed before its gate** — a fix the second round makes in place is
85
- pushed (`pnpm josh git -y` again, a follow-up commit) before its `pnpm josh gate`, so the gate runs
86
- inside the CI wait and is joined before `pnpm josh followup` rather than in front of it.
87
- - **A clean second round issues the merge in the same turn** — the turn that reads a clean second round
88
- issues `pnpm josh followup`, after any branch-2 filing and `pnpm josh epic:bundle` and never in a turn
89
- of its own. Clean has two halves: no confirmed High is standing, and nothing was routed to branch 1 of
90
- the disposition.
91
- - **The review runs in a subagent, never a main-line skill load** — `/code-review` is spawned through
92
- the `Agent` tool in its own context, as the agent type step 1 names.
62
+ - **The gate runs beside this review, not in front of it** — started with the review, joined before the
63
+ commit. A red gate is fixed and re-run whatever the review concluded.
64
+ - **origin/main is merged in before the gate** — `pnpm josh main:merge` is the last edit, so the scoped
65
+ pair and the gate run once over it; a conflict fires `backlogrun-recovery.md` → "Conflicts are not
66
+ predicted" early. **This is the one place a conflicted merge's procedure is written**: `main:merge`
67
+ refuses when uncommitted changes touch a path the default branch also changed, or the index holds
68
+ unresolved or staged paths — commit first with `pnpm josh git -y`, rerun, and **never stash around the
69
+ merge**. A merge stopped on a conflict: remove the markers, then `pnpm josh git -y` stages the
70
+ resolution and records the merge commit — **Tier A**; a lane child never asks a person for `git add`.
71
+ - **A single check answers once per tree** — re-run one check by name (`pnpm josh lint:related`,
72
+ `pnpm josh cspell:dot`, `pnpm josh test:related`, or the type check) after every edit, never twice
73
+ over an untouched tree. In kit a detached `pnpm josh ship` also checks the metrics totals; accept a
74
+ grown total with its reason, as its output names.
75
+ - **The pull request opens between the rounds, so CI runs beside round 2** — round 1 runs on the
76
+ uncommitted tree and its High/Medium fixes land before the commit; the verification pass runs against
77
+ the open pull request.
78
+ - **The round-2 fix commit is pushed before its gate** — `pnpm josh git -y` again, so the gate runs
79
+ inside the CI wait and is joined before `pnpm josh followup`.
80
+ - **A clean second round issues the merge in the same turn** — `pnpm josh followup`, after any branch-2
81
+ filing and `pnpm josh epic:bundle`. Clean: no confirmed High standing, nothing routed to branch 1.
82
+ - **The review runs in a subagent, never a main-line skill load** — `/code-review` through the `Agent`
83
+ tool, as the agent type step 1 names.
93
84
  - **The brief names the checkout, and a review that read another one is refused** — `pnpm josh
94
- review:brief` prints the checkout root, branch and HEAD and a nonce; the review runs `pnpm josh
85
+ review:brief` prints the checkout root, branch, HEAD and a nonce; the review runs `pnpm josh
95
86
  review:attest <nonce>` from the tree it read, and `pnpm josh review:attest --check` must answer `ok`
96
- before the run or `pnpm josh followup` acts on the verdict, or it is discarded.
87
+ before anything acts on the verdict.
97
88
 
98
89
  This file is the single source of the gate → review → PR → merge chain rule; other documents reference
99
90
  it rather than restating it. `prompts/collaboration-workflow/plan-comment.md` keeps Step 3.
@@ -37,15 +37,13 @@ classification lives in `backlogrun-child.md` → "Each child runs in a delegate
37
37
  main line.** The unit returns conclusions with `file:line` citations, never the file text. It may run
38
38
  a temporary probe script and return its output.
39
39
 
40
- **The threshold is 3 files, and it is a count, not a forecast.** When the next read reaches it,
41
- delegate the unread investigation. Brief the unit on what was already read; do not re-read it there.
42
- **A delegation resets the counter rather than spending it**; `pnpm josh investigation:guard` counts
43
- unedited files and search turns and refuses the threshold call. `pnpm josh delegate --list` prints
44
- the threshold.
40
+ **The threshold is 3 files, and it is a count, not a forecast.** Brief the unit on what was already
41
+ read. **A delegation resets the counter rather than spending it**; `pnpm josh investigation:guard`
42
+ refuses the threshold call, in a lane child too (`pnpm josh delegate --list`; counting:
43
+ `docs/josh-commands-automation.md` → "`josh investigation:guard`").
45
44
 
46
- **Dispatch the unit as the `investigator` agent** (`kit:investigator` in a consumer) — the parent's
47
- model at a lowered effort, read-only.
48
- `docs/josh-commands-automation.md` → "`josh investigation:guard`" carries the command's counting details.
45
+ **Dispatch the unit as the `investigator` agent** (`kit:investigator` in a consumer) — read-only, on
46
+ the `model` its definition names.
49
47
 
50
48
  **The main line does not idle while the unit reads:** read files this run will edit, then verify the
51
49
  unit's cited lines. Independent investigations launch together; a brief that needs another unit's
@@ -54,3 +52,9 @@ answer waits for that answer.
54
52
  **When the Issue already names the file, function or rule, read that edit target in the main line.**
55
53
  It is not `survey`, and it is not `diagnosis`: the unit describes how the subject works;
56
54
  the main line decides what that means and what to change.
55
+
56
+ ## A `general-purpose` subagent names its model
57
+
58
+ **A `general-purpose` dispatch → set `model`**: `sonnet` for routine work, `opus` for judgment; a review
59
+ takes the alias of the `model=` id its brief prints (`claude-opus-5-5` → `opus`). Delivered by the
60
+ `agent-model` row of `pnpm josh rule:guard`.
@@ -1,8 +1,6 @@
1
1
  # The entry sequence and the stop branches — shared by `fullrun`, `halfrun` and `prrun`
2
2
 
3
- `fullrun.md`, `halfrun.md` and `prrun.md` name only how their own run differs from this shared
4
- procedure; `pnpm josh run:step <N>` prints the run's next single action. History:
5
- `docs/maintainers/entry-sequence-rationale.md` → "Where each rule came from".
3
+ `pnpm josh run:step <N>` prints the run's next single action.
6
4
 
7
5
  ## The ordered entry sequence
8
6
 
@@ -1,10 +1,8 @@
1
1
  # Finishing a run — `pnpm josh followup`
2
2
 
3
3
  Everything between a green CI and a merged PR: the command, the merge it authorizes, the notifications,
4
- the reviewer scan, the config report and the release ask. `fullrun` and `backlogrun` end here;
5
- `halfrun` never reaches this file, because it stops before the commit. This file is the single source
6
- of the rule. Where each rule came from: `docs/maintainers/followup-rationale.md` → "Where each rule
7
- came from".
4
+ the reviewer scan, the config report and the release ask. `fullrun` and `backlogrun` end here; `halfrun`
5
+ stops before the commit.
8
6
 
9
7
  ## Run `pnpm josh followup`
10
8
 
@@ -20,85 +18,75 @@ bullets. Use the file option whenever it contains a command or path.
20
18
  It waits for required CI, checks CodeRabbit and top-level AI review comments, sends the completion
21
19
  Telegram, merges by default, posts the Issue report, closes completed epics, removes `in-progress`,
22
20
  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) skips the CI wait, the AI review scan and the merge
24
- and runs only the post-merge tail; a completion report already on the Issue is not posted or notified
25
- twice, so re-running is safe. Keep the default Issue target. Ignore a finding only after verifying it
26
- is inapplicable; rate-limit text is not a finding.
21
+ request already merged by hand** (a `prrun` stop) runs only the post-merge tail; a report already on the
22
+ Issue is not posted twice, so re-running is safe. Keep the default Issue target. Ignore a finding only
23
+ after verifying it is inapplicable; rate-limit text is not a finding.
27
24
 
28
- **A red rate-limited CodeRabbit check is cleared by a retrigger, not a bypass.** Wait out the window
29
- the rate-limit comment states, post `@coderabbitai review` on the pull request, and rerun `followup`.
30
- Bypassing the check is Tier C — only on explicit user instruction, and only when the stated window is
31
- impractically long or the retrigger is rate-limited again.
25
+ **A red rate-limited CodeRabbit check is cleared by a retrigger, not a bypass.** Wait out the stated
26
+ window, post `@coderabbitai review` on the pull request, and rerun `followup`. Bypassing is Tier C — on
27
+ explicit user instruction only, when the window is impractically long or the retrigger is rate-limited
28
+ again.
32
29
 
33
- A pre-merge failure stops the run; an unverifiable AI finding or CI failure needing input receives a
34
- `confirmation` Telegram. Post-merge cleanup failures are named and do not undo the merge; run the
35
- named recovery without rerunning it. Because notification precedes merge, the printed result is
36
- authoritative.
30
+ A pre-merge failure stops the run; an unverifiable AI finding or CI failure needing input sends a
31
+ `confirmation` Telegram. A post-merge cleanup failure is named and does not undo the merge; run the
32
+ named recovery without rerunning `followup`. The printed result is authoritative.
37
33
 
38
- After success, run `pnpm josh ms`; in a lane its refusal is expected and the parent uses
39
- `pnpm josh lane:close <N>`. Never delete the branch unless requested. The sections below are read
40
- after execution, when its output needs reading.
34
+ After success, run `pnpm josh ms`; in a lane it refuses and the parent uses `pnpm josh lane:close <N>`.
35
+ Never delete the branch unless requested. The sections below are read when the output needs reading.
41
36
 
42
37
  ## The options
43
38
 
44
39
  | Option | What it is |
45
40
  | --- | --- |
46
- | `--no-merge` | **The only flag that stops the merge** — leave it out and the command merges |
47
- | `--notify-target` | `pr` \| `issue` \| `both`, defaulting to `issue`. **Keep the default** — the workflow puts no completion report on the pull request |
48
- | `--notify-message` / `--notify-message-file` | The completion comment body in the two-layer report shape — `Cause: / Fix: / Result:`, then `Details:` bullets, never a bare `Added … / Changed …` list. **Use the file form whenever the report names a command or a path** (`prompts/collaboration-workflow/shell-body.md`); `-` reads stdin |
49
- | `--coderabbit-ignore-reason` | The reason comment for leaving CodeRabbit line comments unresolved |
50
- | `--ai-review-ignore-reason` | The reason comment for leaving an AI-review blocker (Claude Review / a CodeRabbit summary) unresolved |
51
- | `--issue-number` | The Issue number — or give it positionally as `"<title> #<number>"`; with neither, the PR body's `closes #N` supplies it |
41
+ | `--no-merge` | **The only flag that stops the merge** |
42
+ | `--notify-target` | `pr` \| `issue` \| `both`, default `issue`. **Keep the default** |
43
+ | `--notify-message` / `--notify-message-file` | The completion comment in the two-layer shape — `Cause: / Fix: / Result:`, then `Details:` bullets, never a bare `Added … / Changed …` list. **Use the file form whenever the report names a command or a path** (`prompts/collaboration-workflow/shell-body.md`); `-` reads stdin |
44
+ | `--coderabbit-ignore-reason` | Why CodeRabbit line comments stay unresolved |
45
+ | `--ai-review-ignore-reason` | Why an AI-review blocker (Claude Review / a CodeRabbit summary) stays unresolved |
46
+ | `--issue-number` | The Issue number — or positionally as `"<title> #<number>"`; with neither, the PR body's `closes #N` |
52
47
 
53
48
  ## `auto-merge` — Default `fullrun` behavior
54
49
 
55
- Invoking `fullrun` is itself the explicit authorization to merge; the user adds no keyword.
50
+ Invoking `fullrun` is itself the explicit authorization to merge.
56
51
 
57
- - **Always run `pnpm josh ms` after a successful merge** — it returns the tree to the default branch
58
- with the merge commit pulled. **In a lane, `pnpm josh lane:close <N>` is the terminal step instead**:
59
- `josh ms` refuses there, and the refresh is the parent's.
60
- - **Green CI is not authorization to merge while AI review findings are open.** On a blocker
61
- `followup` sends a `confirmation` Telegram and exits non-zero — fix and re-run. SonarCloud is not
62
- scanned here; the required `SonarQube` check carries it.
52
+ - **Always run `pnpm josh ms` after a successful merge**. **In a lane, `pnpm josh lane:close <N>` is the
53
+ terminal step instead** — `josh ms` refuses there.
54
+ - **Green CI is not authorization to merge while AI review findings are open.** A blocker sends a
55
+ `confirmation` Telegram and exits non-zero — fix and re-run. SonarCloud is carried by the required
56
+ `SonarQube` check.
63
57
  - **Verify a CodeRabbit finding before bypassing it.** Never pass `--coderabbit-ignore-reason`
64
58
  reflexively: a SHA pin flagged "not matching the tag" is checked with `gh api
65
59
  repos/<owner>/<repo>/commits/<tag> --jq '.sha'`, and the bypass cites that command.
66
- - **The merge is `followup`'s, not yours** — it calls the REST merge endpoint from inside a node
67
- script, and `.claude/settings.json` refuses `gh pr merge` and its `gh api` spellings (`CLAUDE.md` →
68
- "Git Rules"). Do **not** pass `--delete-branch` unless the user asks.
60
+ - **The merge is `followup`'s, not yours** — `.claude/settings.json` refuses `gh pr merge` and its
61
+ `gh api` spellings (`CLAUDE.md` → "Git Rules"). Do **not** pass `--delete-branch` unless asked.
69
62
  - **A failed merge** (branch protection, a conflict) is reported and stops the run — never retried with
70
- other flags or past a protection. To skip the merge, use `kickoff` or say "do not merge" in the same
71
- turn and pass `--no-merge`.
63
+ other flags. To skip the merge, use `kickoff` or say "do not merge" in the same turn and pass
64
+ `--no-merge`.
72
65
 
73
66
  ## Completion notifications: always via `pnpm josh followup`
74
67
 
75
- **Never send a `completion` Telegram with `pnpm josh notify`** — `followup` sends it with the PR URL,
76
- which the manual CLI does not fill in. `pnpm josh notify` stays the tool for `planning`,
77
- `confirmation`, `kickoff_retry` and `failure`. **It fires before the merge**, so a received ✅ is not
78
- proof the PR merged — read what the command printed; a silent run is a failed run.
68
+ **Never send a `completion` Telegram with `pnpm josh notify`** — `followup` fills in the PR URL.
69
+ `pnpm josh notify` stays the tool for `planning`, `confirmation`, `kickoff_retry` and `failure`. **It
70
+ fires before the merge**, so a ✅ is not proof the PR merged — read what the command printed.
79
71
 
80
- **Always run it in the foreground** — the deliberate exception to `background-commands.md`, because
81
- nearly every later step reads its result. The CI wait defaults to 32 minutes, so give the call the
82
- largest timeout it accepts (`timeout: 600000` in Claude Code). Where the harness detaches an
83
- over-running command, wait for its report; where it kills the call, set `JOSH_CI_TIMEOUT_SECONDS` to fit
84
- and re-run once CI has settled. Re-run it after every follow-up commit.
72
+ **Always run it in the foreground** — the exception to `background-commands.md`. The CI wait defaults
73
+ to 32 minutes; give the call the largest timeout it accepts (`timeout: 600000` in Claude Code). Where the
74
+ harness detaches the call, wait for its report; where it kills it, set `JOSH_CI_TIMEOUT_SECONDS` and
75
+ re-run once CI has settled. Re-run after every follow-up commit.
85
76
 
86
77
  **The count of unreleased merges is surfaced at completion — not a version.** It prints `🚚 unreleased
87
- merges on main: <n>` and puts the count in the Telegram. **Do not report a shipped version**: a child
88
- no longer bumps, so `package.json` names the previous release. What the run does about it is "When
89
- `pnpm josh release` runs" below.
78
+ merges on main: <n>`. **Do not report a shipped version** — a child no longer bumps. See "When `pnpm
79
+ josh release` runs" below.
90
80
 
91
81
  ## Reading the stage-timing block
92
82
 
93
- The command closes with one `followup stage: <name> <seconds>` row per stage and a
94
- `followup stages total:` line, so where it spent its time is read, not guessed.
83
+ One `followup stage: <name> <seconds>` row per stage, then `followup stages total:`.
95
84
 
96
- - **A failed run prints it too**, up to the stage that threw, named `interrupted` — a short block is
97
- the run stopping early, not the printer breaking. The `merge` row appears only on a run that merged.
85
+ - **A failed run prints it too**, up to the stage that threw, named `interrupted`. The `merge` row
86
+ appears only on a run that merged.
98
87
  - **A row named `<a>-and-<b>` is a batch of requests sent together**; `checks-wait` is never
99
- overlapped, because it is the merge gate.
100
- - **The total is the sum of the stages**, not the wall clock — the post-merge tail (record clears, the
101
- hold release, the next-issue listing) sits outside it.
88
+ overlapped.
89
+ - **The total is the sum of the stages**, not the wall clock — the post-merge tail sits outside it.
102
90
 
103
91
  A `failure` Telegram is sent **by hand, exactly once**, and only when recovery is given up:
104
92
 
@@ -108,36 +96,28 @@ pnpm josh notify --task-type failure --issue-url "<issue-url>" --body-file <reas
108
96
 
109
97
  ## AI reviewer comment scan
110
98
 
111
- `followup` scans top-level PR comments from AI reviewers **independently of CI status**, so a finding
112
- posted after CI goes green is not silently shipped.
99
+ `followup` scans top-level PR comments from AI reviewers **independently of CI status**.
113
100
 
114
101
  - **Blockers are structural, not NLP**: a Claude Review body with `### Issues`, `### Problem`,
115
102
  `#### Logic bug` or a numbered `### 1. …` heading; a CodeRabbit `Actionable comments posted: N` with
116
103
  N > 0. Rate-limit notices and sign-offs (`All issues resolved ✓`) match nothing.
117
104
  - **A standing blocker without `--ai-review-ignore-reason`** sends a `confirmation` Telegram and exits
118
- non-zero; with it, the reason is posted to the PR and the run proceeds.
119
- - **A comment listing that could not be read is a standing blocker** — never an empty listing that
120
- passes.
105
+ non-zero; with it, the reason is posted and the run proceeds.
106
+ - **A comment listing that could not be read is a standing blocker**.
121
107
  - **Temporary**: CodeRabbit is non-blocking end to end — out of the default required checks
122
- (restore via `JOSH_REQUIRED_CHECKS`), its actionable count and unreadable line-comment listing are
123
- audit notes rather than blockers. When it is reverted:
124
- `docs/maintainers/followup-rationale.md` → "The temporary CodeRabbit exemption".
108
+ (restore via `JOSH_REQUIRED_CHECKS`); its findings are audit notes.
125
109
 
126
110
  ## Config file reporting
127
111
 
128
112
  `followup` matches every changed path against what `josh sync` distributes (`AI_COPY_FILES`,
129
113
  `AI_COPY_FILE_MAPPINGS`, `AI_COPY_DIRECTORIES`, `SYNCED_PATHS`) and **reports** the claimed paths in the
130
- completion notification and the Issue report. **It stops nothing**
131
- (`docs/maintainers/followup-rationale.md` → "Why config claims are reported, not stopped").
132
- `pnpm josh sync:scope` gives the same answer on demand; there is no flag to pass.
114
+ notification and the Issue report. **It stops nothing.** `pnpm josh sync:scope` gives the same answer.
133
115
 
134
116
  ## When `pnpm josh release` runs
135
117
 
136
- **The release point is a position plus a command's answer, never a judgement.**
137
-
138
- **The position: once per invocation, after the last merge** — a lone `fullrun`'s only one, a
139
- `backlogrun`'s **last** child, never once per child. In a lane the parent asks it, in the primary
140
- checkout, after the last lane is closed.
118
+ **The release point is a position plus a command's answer, never a judgement.** **The position: once
119
+ per invocation, after the last merge** — a lone `fullrun`'s only one, a `backlogrun`'s **last** child.
120
+ With lanes the parent asks it, in the primary checkout, after the last lane is closed.
141
121
 
142
122
  ```bash
143
123
  pnpm josh release:scope # → required | skip | unknown
@@ -149,11 +129,9 @@ pnpm josh release:scope # → required | skip | unknown
149
129
  | `skip` | the count is zero — nothing is waiting to ship | Say so in one line and finish |
150
130
  | `unknown` | the count could not be read | **Report it as `unknown`** — it is never read as `skip` |
151
131
 
152
- **The run never types `pnpm josh release` itself.** It opens and merges a PR of its own and starts
153
- the tag → publish → `production` chain — outward-facing and effectively irreversible, so Tier C.
154
- Typing `fullrun` authorizes this Issue's merge and nothing past it; a person types the release in the
155
- primary checkout, on the default branch, with a clean tree. `release:scope` counts nothing of its own —
156
- it reads the same fetch-then-count `followup` uses for the Telegram line, so the two cannot disagree.
132
+ **The run never types `pnpm josh release` itself** — it starts the tag → publish → `production` chain,
133
+ outward-facing and effectively irreversible, so Tier C. A person types it in the primary checkout, on
134
+ the default branch, with a clean tree.
157
135
 
158
136
  **On `required`, the release request cites the open release Issue** — the one `issue:file --release` / `issue:release <N>` links blockers to — with a number-link
159
137
  (`prompts/collaboration-workflow/issue-citation.md`). List it with
@@ -1,8 +1,7 @@
1
1
  # `fullrun` — the step lists and the branches
2
2
 
3
- **The detailed procedure behind `fullrun.md`'s manifest**, read on demand — `pnpm josh run:next <N>`
4
- names which step the run is at, and the sections below carry that step in full. History:
5
- `docs/maintainers/fullrun-steps-rationale.md` → "Where each rule came from".
3
+ `pnpm josh run:next <N>` names which step the run is at, and the sections below carry that step in
4
+ full.
6
5
 
7
6
  ## The `fullrun #N` step list
8
7
 
@@ -31,8 +30,7 @@ fit**: open the PR between the rounds with `pnpm josh git -y "<title> #<N>"`, ru
31
30
  default `ja`). Before implementing, run `pnpm josh ms`, then `pnpm josh latest:scope`
32
31
  and update dependencies only on `required` — `latest-gate.md` is its single source, and on `required`
33
32
  load the `dependency-update` skill afterwards. **A dispatched lane child skips `pnpm josh ms`** — it
34
- refuses in a lane, and `pnpm josh main:merge` brings the latest default in during the gate
35
- (`docs/maintainers/fullrun-steps-rationale.md` → "Why a lane child skips `josh ms`"). The parent runs
33
+ refuses in a lane, and `pnpm josh main:merge` brings the latest default in during the gate. The parent runs
36
34
  `pnpm josh ms` in the primary checkout, never the child — `backlogrun-lanes.md` and
37
35
  `backlogrun-child.md` are the single sources. When running `pnpm josh followup`, pass an
38
36
  implementation summary via `--notify-message` in the session language, leading with the three
@@ -1,11 +1,9 @@
1
1
  # `fullrun` — the manifest (plan → implement → PR → merge → notify)
2
2
 
3
- **This file is the manifest, not the procedure.** The entry sequence and the stop branches are
4
- `entry-sequence.md`, shared with `halfrun` and `prrun`; this file names only what is `fullrun`'s own.
5
- `pnpm josh run:step <N>` prints the run's next single action. `chain-rule.md`, `followup.md`,
6
- `background-commands.md` and `latest-gate.md` are **not entry reads** — each is fetched at its point of
7
- use. The step lists are `fullrun-steps.md`, read when a step needs its detail. History:
8
- `docs/maintainers/fullrun-rationale.md` → "Where each rule came from".
3
+ The entry sequence and the stop branches are `entry-sequence.md`. `pnpm josh run:step <N>` prints the
4
+ run's next single action. `chain-rule.md`, `followup.md`, `background-commands.md` and
5
+ `latest-gate.md` are **not entry reads** — each is fetched at its point of use. The step lists are
6
+ `fullrun-steps.md`, read when a step needs its detail.
9
7
 
10
8
  ## The difference — the entry and the end
11
9
 
@@ -2,13 +2,9 @@
2
2
 
3
3
  When this run files a new Issue, file it with `pnpm josh issue:file`, which lints the body and applies the classification labels it declares beside the `--depth` and `--route` labels; `prompts/collaboration-workflow/issue-template.md` is the single source for this classification.
4
4
 
5
- `halfrun` sits between `kickoff` (plan only) and `fullrun` (full execution with auto-merge). It
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 a person verifies the working tree by hand. Use it when a change needs human eyes before shipping.
8
-
9
- **This file is the manifest.** The entry sequence and the stop branches are `entry-sequence.md`,
10
- shared with `fullrun` and `prrun`; this file names only what is `halfrun`'s own. History:
11
- `docs/maintainers/halfrun-rationale.md` → "Where each rule came from".
5
+ `halfrun` implements the change and runs the full verification gate, then **stops before commit** —
6
+ nothing is committed, pushed, or opened as a PR — so a person verifies the working tree by hand. The
7
+ entry sequence and the stop branches are `entry-sequence.md`.
12
8
 
13
9
  ## The difference — the entry
14
10
 
@@ -2,8 +2,7 @@
2
2
 
3
3
  **This file is the suffix's single source, read at its point of use — the moment a `new` entry is
4
4
  typed with an `into <target>` suffix, not at any entry.** A run given a `#N` or a bare `new` never
5
- reaches it. `SKILL.md` → §2's table keeps the trigger and points here. Rationale:
6
- `docs/maintainers/into-target-rationale.md` → "Why the suffix reads as it does".
5
+ reaches it.
7
6
 
8
7
  `kickoff new` / `fullrun new` / `halfrun new` accept a suffix naming the epic the run's artifact
9
8
  belongs to. Without it the artifact belongs to no epic, and `epic:next` only ever offers an epic's