@joshuafolkken/kit 1.1471.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 (267) hide show
  1. package/.claude/settings.json +6 -6
  2. package/.claude/skills/epic-commands/SKILL.md +2 -14
  3. package/.claude/skills/epic-commands/epic-bundle.md +9 -5
  4. package/.claude/skills/epic-commands/execution-waves.md +1 -2
  5. package/.claude/skills/verify-ui/SKILL.md +1 -2
  6. package/.claude/skills/workflow-commands/SKILL.md +7 -9
  7. package/.claude/skills/workflow-commands/background-commands.md +3 -7
  8. package/.claude/skills/workflow-commands/backlogrun-child.md +3 -10
  9. package/.claude/skills/workflow-commands/backlogrun-lanes.md +6 -15
  10. package/.claude/skills/workflow-commands/backlogrun-park.md +2 -8
  11. package/.claude/skills/workflow-commands/backlogrun-progress.md +10 -19
  12. package/.claude/skills/workflow-commands/backlogrun-recovery.md +8 -8
  13. package/.claude/skills/workflow-commands/backlogrun-steps.md +2 -10
  14. package/.claude/skills/workflow-commands/backlogrun.md +31 -50
  15. package/.claude/skills/workflow-commands/chain-rule.md +7 -6
  16. package/.claude/skills/workflow-commands/delegation.md +12 -8
  17. package/.claude/skills/workflow-commands/entry-sequence.md +1 -3
  18. package/.claude/skills/workflow-commands/followup.md +3 -6
  19. package/.claude/skills/workflow-commands/fullrun-steps.md +3 -5
  20. package/.claude/skills/workflow-commands/fullrun.md +4 -6
  21. package/.claude/skills/workflow-commands/halfrun.md +3 -7
  22. package/.claude/skills/workflow-commands/into-target.md +1 -2
  23. package/.claude/skills/workflow-commands/issue-comments.md +3 -3
  24. package/.claude/skills/workflow-commands/issue-scout.md +3 -2
  25. package/.claude/skills/workflow-commands/latest-gate.md +2 -6
  26. package/.claude/skills/workflow-commands/needs-human-review.md +2 -5
  27. package/.claude/skills/workflow-commands/observation-filing.md +0 -14
  28. package/.claude/skills/workflow-commands/observation-ledger.md +4 -9
  29. package/.claude/skills/workflow-commands/pre-gate-cut.md +11 -16
  30. package/.claude/skills/workflow-commands/prerequisite.md +1 -2
  31. package/.claude/skills/workflow-commands/progress-watcher.md +2 -7
  32. package/.claude/skills/workflow-commands/prrun.md +3 -5
  33. package/.claude/skills/workflow-commands/retrospective.md +4 -4
  34. package/.claude/skills/workflow-commands/split-assessment.md +1 -3
  35. package/.claude/skills/workflow-commands/target-repository.md +1 -2
  36. package/.claude/skills/workflow-commands/working-tree-hold.md +2 -4
  37. package/.codex/hooks.json +6 -6
  38. package/.github/actions/setup-node/action.yml +1 -1
  39. package/.github/workflows/ci.yml +1 -1
  40. package/.github/workflows/publish.yml +2 -2
  41. package/CLAUDE.md +1 -1
  42. package/cspell/index.yaml +7 -0
  43. package/dist/CLAUDE.md +1 -1
  44. package/dist/commands/document-section-cli.js +67 -34
  45. package/dist/hooks/batch-guard.js +6 -6
  46. package/dist/hooks/chunk-4KKD2UTK.js +66 -0
  47. package/dist/hooks/{chunk-J47HU5H5.js → chunk-6TS2JD6D.js} +3 -3
  48. package/dist/hooks/chunk-7DSBJVFH.js +50 -0
  49. package/dist/hooks/{chunk-YHBZAJSV.js → chunk-A65Y4YOR.js} +3 -3
  50. package/dist/hooks/{chunk-E7OIKX5Z.js → chunk-APUO6U4J.js} +85 -7
  51. package/dist/hooks/{chunk-IX6TTTI6.js → chunk-EFXE6C37.js} +8 -22
  52. package/dist/hooks/chunk-GP4IEC4O.js +20 -0
  53. package/dist/hooks/{chunk-SHGPANFB.js → chunk-JP45SOCJ.js} +3 -3
  54. package/dist/hooks/{chunk-K4EOONYM.js → chunk-LAOV7NLM.js} +1 -1
  55. package/dist/hooks/chunk-M4HGZV7U.js +83 -0
  56. package/dist/hooks/{chunk-KC5AK2GF.js → chunk-O6GDRNJB.js} +3 -3
  57. package/dist/hooks/{chunk-YYPI7SJZ.js → chunk-PF2NZL2A.js} +5 -5
  58. package/dist/hooks/{chunk-H5HVWYXK.js → chunk-PTICX4OL.js} +3 -4
  59. package/dist/hooks/{chunk-IIGFYXKC.js → chunk-RT27QRJW.js} +581 -1438
  60. package/dist/hooks/{chunk-43ZHT22P.js → chunk-SYOTDYCI.js} +1127 -1089
  61. package/dist/hooks/{chunk-AS74OU3D.js → chunk-TNUMY6NL.js} +1507 -1336
  62. package/dist/hooks/chunk-UPUZF3AN.js +279 -0
  63. package/dist/hooks/{chunk-EUMACUK2.js → chunk-WK6SMBIC.js} +1948 -806
  64. package/dist/hooks/codex-hook-adapter.js +17 -14
  65. package/dist/hooks/duplicate-read-guard.js +7 -7
  66. package/dist/hooks/format-edited.js +5 -4
  67. package/dist/hooks/inputs.json +317 -264
  68. package/dist/hooks/investigation-guard.js +8 -11
  69. package/dist/hooks/pretool-guard.js +16 -13
  70. package/dist/hooks/session-lang.js +370 -25
  71. package/dist/hooks/stop-guard.js +2576 -176
  72. package/dist/josh.js +2124 -277
  73. package/lefthook/base.yml +5 -3
  74. package/package.json +12 -10
  75. package/prompts/collaboration-workflow/file-edits.md +1 -3
  76. package/prompts/collaboration-workflow/gh-rest.md +1 -2
  77. package/prompts/collaboration-workflow/issue-citation.md +2 -4
  78. package/prompts/collaboration-workflow/issue-template.md +10 -2
  79. package/prompts/collaboration-workflow/lane-instructions.md +35 -0
  80. package/prompts/collaboration-workflow/operating-rules.md +2 -6
  81. package/prompts/collaboration-workflow/output-bounds.md +3 -3
  82. package/prompts/collaboration-workflow/overview.md +1 -1
  83. package/prompts/collaboration-workflow/principles.md +14 -8
  84. package/prompts/collaboration-workflow/report-format.md +9 -0
  85. package/prompts/collaboration-workflow/residency.md +12 -8
  86. package/prompts/collaboration-workflow/rule-delivery.md +3 -11
  87. package/prompts/collaboration-workflow/shell-body.md +6 -6
  88. package/prompts/collaboration-workflow/turn-batching.md +5 -5
  89. package/prompts/collaboration-workflow/upstream-interrupt.md +2 -2
  90. package/prompts/collaboration-workflow/wip-cap.md +6 -6
  91. package/prompts/collaboration-workflow.md +1 -0
  92. package/prompts/review.md +4 -5
  93. package/prompts/testing-guide.md +2 -2
  94. package/scripts/agent/agent-argv.ts +20 -4
  95. package/scripts/agent/agent-role-profile.ts +101 -45
  96. package/scripts/agent/agent-safe-text.ts +60 -0
  97. package/scripts/agent/claude-agent-argv.ts +14 -0
  98. package/scripts/agent/codex-agent-argv.ts +2 -0
  99. package/scripts/agent/lane-instructions.ts +144 -0
  100. package/scripts/backlog/backlog-budget.ts +4 -4
  101. package/scripts/backlog/backlog-drive-named.ts +1 -1
  102. package/scripts/backlog/backlog-drive-restore.ts +9 -1
  103. package/scripts/backlog/backlog-occupied.ts +56 -0
  104. package/scripts/backlog/backlog-ready.ts +47 -10
  105. package/scripts/delegation/duplicate-read-guard.ts +2 -2
  106. package/scripts/delegation/investigation-guard.ts +15 -65
  107. package/scripts/delegation/investigation-reads.ts +0 -1
  108. package/scripts/document/document-byte-budget.ts +6 -5
  109. package/scripts/document/document-section-cli.ts +17 -5
  110. package/scripts/document/entry-read-budget.ts +2 -2
  111. package/scripts/document/read-set-cli.ts +4 -1
  112. package/scripts/epic/epic-audit-orphans.ts +5 -8
  113. package/scripts/epic/epic-audit.ts +52 -1
  114. package/scripts/epic/epic-bundle-evidence.ts +49 -26
  115. package/scripts/epic/epic-bundle-referenced.ts +14 -3
  116. package/scripts/epic/epic-bundle.ts +17 -9
  117. package/scripts/followup/git-followup-workflow.ts +19 -1
  118. package/scripts/gate/check-inputs.ts +129 -0
  119. package/scripts/gate/check-reuse.ts +162 -0
  120. package/scripts/gate/core-budget.ts +93 -44
  121. package/scripts/gate/core-wait.ts +130 -0
  122. package/scripts/gate/free-cores.ts +49 -0
  123. package/scripts/gate/gate-ledger.ts +17 -3
  124. package/scripts/gate/gate-plan.ts +23 -1
  125. package/scripts/gate/gate-report.ts +15 -2
  126. package/scripts/gate/gate-run-steps.ts +150 -0
  127. package/scripts/gate/held-mark.ts +55 -0
  128. package/scripts/gate/machine-capacity.ts +70 -11
  129. package/scripts/gate/pre-commit-type-check.ts +14 -1
  130. package/scripts/gate/verification-gate.ts +58 -125
  131. package/scripts/gh/git-gh-issue-rest.ts +1 -0
  132. package/scripts/gh/git-gh-issue-write.ts +24 -2
  133. package/scripts/gh/git-pr.ts +13 -1
  134. package/scripts/git/main-merge-regenerate.ts +78 -0
  135. package/scripts/git/main-merge.ts +14 -5
  136. package/scripts/hooks/batch-guard.ts +5 -8
  137. package/scripts/hooks/pre-commit-lint.ts +91 -0
  138. package/scripts/hooks/pre-push-unit.ts +1 -1
  139. package/scripts/hooks/pretool-guard.ts +27 -52
  140. package/scripts/hooks/reserved-run.ts +1 -0
  141. package/scripts/hooks/run-hook.sh +10 -12
  142. package/scripts/hooks/stop-actions.ts +204 -0
  143. package/scripts/hooks/stop-guard.ts +62 -21
  144. package/scripts/init/hook-launch.ts +12 -7
  145. package/scripts/issue/expected-effect-lint.ts +59 -0
  146. package/scripts/issue/issue-cite-cli.ts +35 -15
  147. package/scripts/issue/issue-classification.ts +1 -1
  148. package/scripts/issue/issue-lint-cli.ts +5 -3
  149. package/scripts/issue/issue-scout-cli.ts +19 -14
  150. package/scripts/issue/markdown-section.ts +19 -5
  151. package/scripts/josh/command-usage.ts +110 -0
  152. package/scripts/josh/josh-command-map.ts +2 -0
  153. package/scripts/josh/josh-command-types.ts +55 -9
  154. package/scripts/josh/josh-commands-ai.ts +13 -0
  155. package/scripts/josh/josh-commands-development.ts +1 -1
  156. package/scripts/josh/josh-commands-hooks.ts +6 -0
  157. package/scripts/josh/josh-commands-lane.ts +10 -1
  158. package/scripts/josh/josh-commands-workflow.ts +5 -0
  159. package/scripts/josh/josh-logic.ts +6 -15
  160. package/scripts/josh/josh-usage-automation.ts +121 -0
  161. package/scripts/josh/josh-usage-backlog.ts +180 -0
  162. package/scripts/josh/josh-usage-developer.ts +230 -0
  163. package/scripts/josh/josh-usage-hooks.ts +38 -0
  164. package/scripts/josh/josh-usage-issue.ts +205 -0
  165. package/scripts/josh/josh-usage-review.ts +101 -0
  166. package/scripts/josh/josh-usage-run.ts +252 -0
  167. package/scripts/josh/josh-usage-session.ts +238 -0
  168. package/scripts/josh/josh-usage-workflow.ts +212 -0
  169. package/scripts/josh/josh.ts +14 -5
  170. package/scripts/josh/package-directory.ts +20 -0
  171. package/scripts/lane/lane-capacity.ts +8 -2
  172. package/scripts/lane/lane-check-stats.ts +56 -0
  173. package/scripts/lane/lane-child-invocation.ts +35 -4
  174. package/scripts/lane/lane-dispatch.ts +3 -3
  175. package/scripts/lane/lane-guard-policy.ts +2 -2
  176. package/scripts/lane/lane-handoff.ts +8 -1
  177. package/scripts/lane/lane-install.ts +12 -4
  178. package/scripts/lane/lane-ledger.ts +43 -1
  179. package/scripts/lane/lane-limit-cli.ts +8 -9
  180. package/scripts/lane/lane-measure-cli.ts +2 -0
  181. package/scripts/lane/lane-preserve.ts +29 -1
  182. package/scripts/lane/lane-registry.ts +9 -7
  183. package/scripts/lane/lane-restart.ts +5 -26
  184. package/scripts/lane/lane-session-action.ts +146 -0
  185. package/scripts/lane/lane-session-broker.ts +57 -138
  186. package/scripts/lane/lane-withdraw-cli.ts +71 -0
  187. package/scripts/lane/lane-withdraw.ts +182 -0
  188. package/scripts/lint/format.ts +4 -4
  189. package/scripts/lint/lint-parallel.ts +10 -3
  190. package/scripts/lint/lint-related-scope.ts +4 -1
  191. package/scripts/notify/telegram-test.ts +10 -5
  192. package/scripts/report/report-format-reference.ts +2 -0
  193. package/scripts/review/acceptance-map-check.ts +61 -0
  194. package/scripts/review/acceptance-map.ts +205 -0
  195. package/scripts/review/review-brief-cli.ts +1 -1
  196. package/scripts/rules/agent-model.ts +59 -0
  197. package/scripts/rules/delivered-rules.ts +11 -2
  198. package/scripts/rules/filing-cap.ts +1 -0
  199. package/scripts/rules/firing-point.ts +6 -5
  200. package/scripts/rules/guard-remedy.ts +117 -0
  201. package/scripts/rules/issue-comments.ts +67 -6
  202. package/scripts/rules/last-prompt.ts +50 -5
  203. package/scripts/rules/oracle-list-cli.ts +7 -0
  204. package/scripts/rules/piped-verification.ts +3 -1
  205. package/scripts/rules/rule-list.ts +4 -1
  206. package/scripts/rules/rule-registry-rows.ts +10 -0
  207. package/scripts/rules/rule-registry.ts +7 -4
  208. package/scripts/rules/rule-rewrite.ts +114 -0
  209. package/scripts/rules/rule-value.ts +7 -1
  210. package/scripts/rules/shell-segments.ts +15 -0
  211. package/scripts/rules/stop-decision.ts +77 -0
  212. package/scripts/rules/stop-rules.ts +147 -47
  213. package/scripts/rules/tail-commands.ts +15 -1
  214. package/scripts/run/board/run-board-cli.ts +2 -0
  215. package/scripts/run/board/run-board-closed.ts +8 -2
  216. package/scripts/run/board/run-board-github.ts +9 -1
  217. package/scripts/run/board/run-board-header.ts +4 -1
  218. package/scripts/run/board/run-board-labels.ts +2 -0
  219. package/scripts/run/board/run-board-layout.ts +1 -1
  220. package/scripts/run/board/run-board-read.ts +16 -0
  221. package/scripts/run/board/run-board-reason.ts +10 -1
  222. package/scripts/run/board/run-board-render-legend.ts +1 -0
  223. package/scripts/run/board/run-board-render-slot.ts +1 -1
  224. package/scripts/run/board/run-board-render-waits.ts +41 -0
  225. package/scripts/run/board/run-board-render.ts +6 -1
  226. package/scripts/run/board/run-board-row-yield.ts +1 -0
  227. package/scripts/run/board/run-board-state.ts +5 -0
  228. package/scripts/run/board/run-board-status.ts +72 -21
  229. package/scripts/run/board/run-board-tick.ts +5 -1
  230. package/scripts/run/cut/run-cut-cli.ts +3 -2
  231. package/scripts/run/cut/run-cut-report.ts +16 -0
  232. package/scripts/run/detached-launch.ts +23 -4
  233. package/scripts/run/entry/run-entry-cli.ts +8 -1
  234. package/scripts/run/event/run-event-render.ts +1 -0
  235. package/scripts/run/event/run-event-scope.ts +19 -1
  236. package/scripts/run/event/run-event-stream-emit.ts +13 -6
  237. package/scripts/run/event/run-event-stream.ts +4 -0
  238. package/scripts/run/hold/run-hold-session.ts +46 -0
  239. package/scripts/run/hold/run-hold.ts +7 -1
  240. package/scripts/run/launch-priority.ts +32 -0
  241. package/scripts/run/merge/run-merge-cli.ts +16 -65
  242. package/scripts/run/merge/run-merge-signals.ts +99 -0
  243. package/scripts/run/merge/run-merge-steps.ts +11 -1
  244. package/scripts/run/merge/run-merge.ts +21 -9
  245. package/scripts/run/run-liveness.ts +1 -1
  246. package/scripts/run/run-poll-hook.ts +157 -0
  247. package/scripts/run/run-step-cli.ts +22 -15
  248. package/scripts/run/run-step-section.ts +85 -0
  249. package/scripts/run/ship/run-ship-cli.ts +5 -12
  250. package/scripts/run/ship/run-ship-detach.ts +9 -0
  251. package/scripts/run/ship/run-ship-next.ts +10 -2
  252. package/scripts/run/ship/run-ship-overlap.ts +195 -0
  253. package/scripts/run/ship/run-ship-pre-detach.ts +33 -15
  254. package/scripts/run/ship/run-ship-preflight.ts +28 -2
  255. package/scripts/run/ship/run-ship-return.ts +31 -7
  256. package/scripts/run/ship/run-ship-review-steps.ts +12 -10
  257. package/scripts/run/ship/run-ship-steps.ts +1 -1
  258. package/scripts/run/ship/run-ship-stop-context.ts +206 -0
  259. package/scripts/run/ship/run-ship-sync.ts +14 -6
  260. package/scripts/test/test-e2e-guard.ts +30 -5
  261. package/scripts/test/test-unit-guard.ts +16 -1
  262. package/scripts/test/unit-worker-share.ts +26 -4
  263. package/scripts/time-runtime/time-shell.ts +29 -4
  264. package/scripts/time-runtime/time-spans.ts +1 -0
  265. package/scripts/time-runtime/time-tool-call.ts +7 -0
  266. package/templates/gitignore +6 -2
  267. package/dist/hooks/chunk-K4LMBQC2.js +0 -68
@@ -54,7 +54,7 @@
54
54
  "hooks": [
55
55
  {
56
56
  "type": "command",
57
- "command": "project_root=\"$(env -u GIT_ALTERNATE_OBJECT_DIRECTORIES -u GIT_COMMON_DIR -u GIT_DIR -u GIT_INDEX_FILE -u GIT_NAMESPACE -u GIT_OBJECT_DIRECTORY -u GIT_WORK_TREE git rev-parse --show-toplevel 2>/dev/null || git rev-parse --show-toplevel)\" && cd \"$project_root\" && sh scripts/hooks/run-hook.sh audit-provision",
57
+ "command": "if project_root=\"$(unset GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_COMMON_DIR GIT_DIR GIT_INDEX_FILE GIT_NAMESPACE GIT_OBJECT_DIRECTORY GIT_WORK_TREE; git rev-parse --show-toplevel 2>/dev/null)\"; then unset GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_COMMON_DIR GIT_DIR GIT_INDEX_FILE GIT_NAMESPACE GIT_OBJECT_DIRECTORY GIT_WORK_TREE; else project_root=\"$(git rev-parse --show-toplevel)\"; fi && cd \"$project_root\" && sh scripts/hooks/run-hook.sh audit-provision",
58
58
  "timeout": 180
59
59
  }
60
60
  ]
@@ -66,7 +66,7 @@
66
66
  "hooks": [
67
67
  {
68
68
  "type": "command",
69
- "command": "project_root=\"$(env -u GIT_ALTERNATE_OBJECT_DIRECTORIES -u GIT_COMMON_DIR -u GIT_DIR -u GIT_INDEX_FILE -u GIT_NAMESPACE -u GIT_OBJECT_DIRECTORY -u GIT_WORK_TREE git rev-parse --show-toplevel 2>/dev/null || git rev-parse --show-toplevel)\" && cd \"$project_root\" && sh scripts/hooks/run-hook.sh session-lang",
69
+ "command": "if project_root=\"$(unset GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_COMMON_DIR GIT_DIR GIT_INDEX_FILE GIT_NAMESPACE GIT_OBJECT_DIRECTORY GIT_WORK_TREE; git rev-parse --show-toplevel 2>/dev/null)\"; then unset GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_COMMON_DIR GIT_DIR GIT_INDEX_FILE GIT_NAMESPACE GIT_OBJECT_DIRECTORY GIT_WORK_TREE; else project_root=\"$(git rev-parse --show-toplevel)\"; fi && cd \"$project_root\" && sh scripts/hooks/run-hook.sh session-lang",
70
70
  "timeout": 10
71
71
  }
72
72
  ]
@@ -74,11 +74,11 @@
74
74
  ],
75
75
  "PreToolUse": [
76
76
  {
77
- "matcher": "Bash|Edit|Read|Write|AskUserQuestion",
77
+ "matcher": "Bash|Edit|Read|Write|AskUserQuestion|Agent|Task",
78
78
  "hooks": [
79
79
  {
80
80
  "type": "command",
81
- "command": "project_root=\"$(env -u GIT_ALTERNATE_OBJECT_DIRECTORIES -u GIT_COMMON_DIR -u GIT_DIR -u GIT_INDEX_FILE -u GIT_NAMESPACE -u GIT_OBJECT_DIRECTORY -u GIT_WORK_TREE git rev-parse --show-toplevel 2>/dev/null || git rev-parse --show-toplevel)\" && cd \"$project_root\" && sh scripts/hooks/run-hook.sh pretool-guard",
81
+ "command": "if project_root=\"$(unset GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_COMMON_DIR GIT_DIR GIT_INDEX_FILE GIT_NAMESPACE GIT_OBJECT_DIRECTORY GIT_WORK_TREE; git rev-parse --show-toplevel 2>/dev/null)\"; then unset GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_COMMON_DIR GIT_DIR GIT_INDEX_FILE GIT_NAMESPACE GIT_OBJECT_DIRECTORY GIT_WORK_TREE; else project_root=\"$(git rev-parse --show-toplevel)\"; fi && cd \"$project_root\" && sh scripts/hooks/run-hook.sh pretool-guard",
82
82
  "timeout": 20
83
83
  }
84
84
  ]
@@ -90,7 +90,7 @@
90
90
  "hooks": [
91
91
  {
92
92
  "type": "command",
93
- "command": "project_root=\"$(env -u GIT_ALTERNATE_OBJECT_DIRECTORIES -u GIT_COMMON_DIR -u GIT_DIR -u GIT_INDEX_FILE -u GIT_NAMESPACE -u GIT_OBJECT_DIRECTORY -u GIT_WORK_TREE git rev-parse --show-toplevel 2>/dev/null || git rev-parse --show-toplevel)\" && cd \"$project_root\" && sh scripts/hooks/run-hook.sh format-edited",
93
+ "command": "if project_root=\"$(unset GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_COMMON_DIR GIT_DIR GIT_INDEX_FILE GIT_NAMESPACE GIT_OBJECT_DIRECTORY GIT_WORK_TREE; git rev-parse --show-toplevel 2>/dev/null)\"; then unset GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_COMMON_DIR GIT_DIR GIT_INDEX_FILE GIT_NAMESPACE GIT_OBJECT_DIRECTORY GIT_WORK_TREE; else project_root=\"$(git rev-parse --show-toplevel)\"; fi && cd \"$project_root\" && sh scripts/hooks/run-hook.sh format-edited",
94
94
  "timeout": 90
95
95
  }
96
96
  ]
@@ -102,7 +102,7 @@
102
102
  "hooks": [
103
103
  {
104
104
  "type": "command",
105
- "command": "project_root=\"$(env -u GIT_ALTERNATE_OBJECT_DIRECTORIES -u GIT_COMMON_DIR -u GIT_DIR -u GIT_INDEX_FILE -u GIT_NAMESPACE -u GIT_OBJECT_DIRECTORY -u GIT_WORK_TREE git rev-parse --show-toplevel 2>/dev/null || git rev-parse --show-toplevel)\" && cd \"$project_root\" && sh scripts/hooks/run-hook.sh stop-guard",
105
+ "command": "if project_root=\"$(unset GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_COMMON_DIR GIT_DIR GIT_INDEX_FILE GIT_NAMESPACE GIT_OBJECT_DIRECTORY GIT_WORK_TREE; git rev-parse --show-toplevel 2>/dev/null)\"; then unset GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_COMMON_DIR GIT_DIR GIT_INDEX_FILE GIT_NAMESPACE GIT_OBJECT_DIRECTORY GIT_WORK_TREE; else project_root=\"$(git rev-parse --show-toplevel)\"; fi && cd \"$project_root\" && sh scripts/hooks/run-hook.sh stop-guard",
106
106
  "timeout": 20
107
107
  }
108
108
  ]
@@ -5,9 +5,6 @@ description: Procedures for `josh epic:audit`, `epic:next` and `epic:bundle`. Re
5
5
 
6
6
  # The `josh epic:*` commands
7
7
 
8
- This skill is the single source for the three commands. Reasons: `docs/maintainers/epic-commands-rationale.md`
9
- → "Where each rule came from".
10
-
11
8
  The workflow keywords themselves — `kickoff`, `fullrun`, `halfrun`, `prrun`, `backlogrun` — live in the
12
9
  `workflow-commands` skill.
13
10
 
@@ -61,8 +58,7 @@ pnpm josh epic "<epic-title>" <N1> <N2> ... --ordered # argument order is the d
61
58
 
62
59
  After any hand edit run `pnpm josh epic:check <E>` (exit 1 when the body no longer parses).
63
60
  `pnpm josh followup` closes the epic once every task-list child is closed; one tracking a
64
- cross-repository child is closed by hand. Without `josh`: `issue-template.md`; the format's history:
65
- `docs/maintainers/epic-commands-rationale.md` → "Creating an epic by hand".
61
+ cross-repository child is closed by hand. Without `josh`: `issue-template.md`.
66
62
 
67
63
  ## `josh epic:audit <E>` — contradictions across the children
68
64
 
@@ -98,8 +94,6 @@ The two `orphan search` findings are about the search, not the children:
98
94
  owns updating the existing code referencing that concept — do that at planning. Label names live in
99
95
  `scripts/issue/issue-labels.ts`.
100
96
 
101
- History: `docs/maintainers/epic-commands-rationale.md` → "`epic:audit` — why the children are read across".
102
-
103
97
  ## `josh epic:next <E…>` — what is runnable
104
98
 
105
99
  Returns **every** runnable child, bundled per repository with its local checkout. `--repo <owner/repo>`
@@ -143,8 +137,6 @@ Two things stop the command: a **circular dependency**, and a **disagreement bet
143
137
  and the `blocked-by` relations**. Only a line that is *nothing but* a chain is a declaration — a prose
144
138
  line recommending an execution order is a suggestion, not a dependency.
145
139
 
146
- Why: `docs/maintainers/epic-commands-rationale.md` → "`epic:next` — why it answers as it does".
147
-
148
140
  ## Epics that span repositories
149
141
 
150
142
  Write cross-repository children as `owner/repo#N` or a full issue URL. Their state is read through
@@ -163,7 +155,7 @@ branch declares is in the registry** (checked in that order; that exact version)
163
155
  bumps the version, so the target is the release that includes the blocker. **Unless that repository
164
156
  publishes nothing**: no `package.json` on its default branch, or `private`, resolves on close — read
165
157
  from its manifest, never the registry; a failed manifest read (not a 404) still waits. The publish
166
- check is `josh propagate`'s. History: `docs/maintainers/epic-commands-rationale.md` → "Cross-repository epics".
158
+ check is `josh propagate`'s.
167
159
 
168
160
  ## `josh epic:bundle <N>` — does this new issue belong with one already filed?
169
161
 
@@ -181,7 +173,3 @@ when that step printed `⚠`. **It recommends; it writes nothing.**
181
173
  | **The epic listing was cut short** | **Nothing** — every placing row above is withheld | — |
182
174
 
183
175
  **A placing answer is acted on with `epic-bundle.md`**. `Nothing to bundle.` needs no further read.
184
-
185
- History: `docs/maintainers/epic-commands-rationale.md` → "`epic:bundle` — why issues filed apart are bundled afterwards";
186
- the reasons behind `epic-bundle.md`: `docs/maintainers/epic-commands-rationale.md` → "`epic:bundle` — why each answer reads as it does";
187
- behind `execution-waves.md`: `docs/maintainers/epic-commands-rationale.md` → "Execution waves — why a wave is not a mechanism".
@@ -2,14 +2,18 @@
2
2
 
3
3
  Read this when a filing's `epic:bundle` answer places the issue (`add_to_epic`, `create_epic`, or a
4
4
  choice between epics), or when `SKILL.md` → "`josh epic:bundle <N>` — does this new issue belong with
5
- one already filed?" does not settle it. `Nothing to bundle.` needs neither. Reasons:
6
- `docs/maintainers/epic-commands-rationale.md` → "`epic:bundle` — why each answer reads as it does".
5
+ one already filed?" does not settle it. `Nothing to bundle.` needs neither.
7
6
 
8
- **Only two things count as a signal**: the issues referring to each other in prose, or a `blocked-by`
9
- already recorded between them. **A similar title never counts on its own.**
7
+ **Only two things count as a signal**: one issue naming the other in its acceptance criteria
8
+ (`## 受け入れ条件` / `## Acceptance criteria`) or its `parent: #N` / `親: #N` line, or a `blocked-by`
9
+ recorded between them. A reference elsewhere, or a similar title, never counts; the evidence line
10
+ names the section.
11
+
12
+ **A placing answer you do not follow** — check it against both issues first; record the reason as an
13
+ `Auto-decided:` line on the issue.
10
14
 
11
15
  **The release issue is neither a candidate nor a subject**, like an epic — its `blocked-by` relations
12
- are mechanical. Any other `blocked-by` or prose reference still counts.
16
+ are mechanical. Any other `blocked-by` or counted reference still counts.
13
17
 
14
18
  **The search is not limited to the open backlog.** Every number the subject's own body names is read
15
19
  (capped at twenty), whatever its state:
@@ -1,8 +1,7 @@
1
1
  # Execution waves — parallel, then one alone, then the rest
2
2
 
3
3
  Read this when an epic's children need an order between groups — a wave boundary, or one child that
4
- must run alone. It builds on `SKILL.md` → "`josh epic:next <E…>` — what is runnable". Reasons:
5
- `docs/maintainers/epic-commands-rationale.md` → "Execution waves — why a wave is not a mechanism".
4
+ must run alone. It builds on `SKILL.md` → "`josh epic:next <E…>` — what is runnable".
6
5
 
7
6
  **A wave is not a mechanism, and there is nothing to add for one** — the dependency declaration
8
7
  already expresses it.
@@ -7,8 +7,7 @@ argument-hint: '[route] [route...]'
7
7
  # Verify the rendered screen
8
8
 
9
9
  A rendered-UI change is not done until someone has looked at it (`CLAUDE.md` → completion gate);
10
- passing tests are not that look. Rationale: `docs/maintainers/verify-ui-rationale.md` → "Why the skill
11
- reads as it does".
10
+ passing tests are not that look.
12
11
 
13
12
  ## 1. Decide which routes to capture
14
13
 
@@ -5,10 +5,7 @@ description: Procedures for `kickoff`, `fullrun`, `halfrun`, `prrun` and `backlo
5
5
 
6
6
  # Issue-driven workflow commands
7
7
 
8
- `kickoff`, `fullrun`, `halfrun`, `prrun` and `backlogrun` are the shorthand commands this
9
- package's collaboration workflow is built on. **This file is their manifest — triggers and pointers,
10
- never a procedure**: each rule is stated once, in the file its row names. History:
11
- `docs/maintainers/workflow-commands-rationale.md` → "Where each rule came from".
8
+ Each rule is stated once, in the file its row names.
12
9
 
13
10
  ## 0. The rule that fires before any of them — explicit invocation
14
11
 
@@ -19,8 +16,9 @@ alone**: `backlogrun-steps.md` → "The session cut is inside the invocation".
19
16
  ## 1. Which file to read
20
17
 
21
18
  Read this file, then the files the typed command's row names. A command file is a **manifest** of
22
- terse triggers and pointers; `pnpm josh run:step <N>` prints the run's next single action, computed
23
- from the event stream, the carry record and the issue state, never the conversation.
19
+ terse triggers and pointers; `pnpm josh run:step <N>` prints the run's next single action and the
20
+ section that governs it, computed from the event stream, the carry record and the issue state, never
21
+ the conversation; a section it prints is not fetched again.
24
22
 
25
23
  | Typed keyword | Read |
26
24
  | ---------------------------------------- | ------------------------------------------- |
@@ -31,8 +29,8 @@ from the event stream, the carry record and the issue state, never the conversat
31
29
  | `backlogrun` / `backlogrun #N…` / `backlogrun #E…` | `backlogrun.md` — its dispatched child reads `fullrun.md` + `split-assessment.md` in its own unit, not the parent at entry |
32
30
 
33
31
  `entry-sequence.md` holds the entry sequence and stop branches `fullrun`, `halfrun` and `prrun` share;
34
- each manifest carries only its difference. `split-assessment.md` → "The question" is read at the
35
- entry as a section, its split-handling detail only when a split is found.
32
+ each manifest carries only its difference. `split-assessment.md` → "The question" is printed by
33
+ `pnpm josh run:entry` at the entry, its split-handling detail read only when a split is found.
36
34
 
37
35
  ### The fetch is one `Read` call per file
38
36
 
@@ -100,7 +98,7 @@ from — read at that trigger, never restated here.
100
98
  | `backlogrun`'s authorization | The whole `auto-ok` opted-in pool as well as its named items; `pnpm josh backlog:next` offers them | `backlogrun.md` |
101
99
  | `run:step` prints the retrospective step (a run drained its backlog and stopped, not a lane child) | Run what it prints once, file 0–2 improvements, then `pnpm josh run:carry --retrospective` | `retrospective.md` |
102
100
  | Any artifact prose (Issue bodies, comments, Telegram) | Session language (`JOSH_SESSION_LANG`, default `ja`); Issue/PR titles stay English | `prompts/collaboration-workflow/overview.md` |
103
- | Any mid-workflow stop | Send a `confirmation` Telegram first, so the user is alerted off-screen | `CLAUDE.md` → "Mid-workflow stop notification" |
101
+ | Any mid-workflow stop | `stop:guard` sends the `confirmation` Telegram; on its refusal, send it | `CLAUDE.md` → "Mid-workflow stop notification" |
104
102
 
105
103
  ## 3. What stays resident, and what is read from here
106
104
 
@@ -17,7 +17,6 @@
17
17
  - A lane child's hand-off or pre-gate cut is the sole turn boundary before the push (`chain-rule.md`).
18
18
 
19
19
  Use harness detachment so completion returns to the run. Foreground timeouts stay within the cap.
20
- Where each rule came from: `docs/maintainers/background-commands-rationale.md` → "Where each rule came from".
21
20
 
22
21
  ## How the wait ends — the task's exit, never a regex over its output
23
22
 
@@ -27,8 +26,7 @@ limit.
27
26
 
28
27
  **Never hand-write a `while`/`until` … `sleep` loop over the output file** — a regex that never matches
29
28
  waits to the block limit, one that matches a mid-run line exits early. `pnpm josh rule:guard` refuses it
30
- (`prompts/collaboration-workflow/rule-delivery.md`; `docs/maintainers/background-commands-rationale.md`
31
- → "Why a poll loop is refused").
29
+ (`prompts/collaboration-workflow/rule-delivery.md`).
32
30
 
33
31
  **To glance at interim output, `Read` the output file once**, never in a sleep loop. CI is waited on by
34
32
  `pnpm josh followup`; a progress heartbeat is `run:progress --wait`'s job (`early-heartbeat` refuses a
@@ -37,8 +35,7 @@ hand-armed timer).
37
35
  ## The tail and what overlaps each wait
38
36
 
39
37
  **Never give a foreground call a timeout above the harness cap** — a larger number detaches it without
40
- the completion notification (`docs/maintainers/background-commands-rationale.md` → "Why the tail
41
- collects idle time").
38
+ the completion notification.
42
39
 
43
40
  **The tail is emptied before `followup` is issued.** Each step is asked one question: **does it read the
44
41
  merge result?**
@@ -64,8 +61,7 @@ merge result?**
64
61
  **The turn never ends at the push.** The `pnpm josh git -y` completion resumes the run, and that turn
65
62
  goes straight through any branch-2 filing and `pnpm josh epic:bundle` to `pnpm josh followup`. `pnpm
66
63
  josh rule:guard` refuses the foreground push (`prompts/collaboration-workflow/rule-delivery.md`); the
67
- push reissued detached is not refused again (`docs/maintainers/background-commands-rationale.md` → "Why
68
- the push is guarded").
64
+ push reissued detached is not refused again.
69
65
 
70
66
  **One turn does end before the push: a dispatched lane child's pre-gate cut** — `pre-gate-cut.md` →
71
67
  "Taking the cut".
@@ -1,14 +1,6 @@
1
1
  # `backlogrun` — running a child (shared mechanics, delegation, liveness, session setup)
2
2
 
3
- Point-of-use, read one section at a time from `backlogrun.md` → "The route table". Reasons:
4
-
5
- - `docs/maintainers/backlogrun-child-rationale.md` → "Why the file is read by section"
6
- - `docs/maintainers/backlogrun-child-rationale.md` → "Why a bare Issue promotes itself under `backlogrun` but not under `fullrun`"
7
- - `docs/maintainers/backlogrun-child-rationale.md` → "Why each child runs in a delegated unit"
8
- - `docs/maintainers/backlogrun-child-rationale.md` → "Why the summary is bounded the way it is"
9
- - `docs/maintainers/backlogrun-child-rationale.md` → "Why the audit runs before the first child"
10
- - `docs/maintainers/backlogrun-child-rationale.md` → "Why `josh latest` is hoisted to the session"
11
- - `docs/maintainers/backlogrun-child-rationale.md` → "Why the preflight is part of the claim"
3
+ Point-of-use, read one section at a time from `backlogrun.md` → "The manifest — the ordered flow".
12
4
 
13
5
  ## Running a child — the shared mechanics
14
6
 
@@ -89,7 +81,8 @@ is unchanged.
89
81
 
90
82
  ## A delegated unit that stopped without reporting
91
83
 
92
- **Hand the child off without blocking, and poll** — a stopped unit leaves no notification. Once its
84
+ **Hand the child off without blocking, and wait on `pnpm josh lane:await <N>`** — a stopped unit
85
+ leaves no notification, so the await's exit is the wake. Once its
93
86
  output is unchanged for the silent-unit window, read `backlogrun-recovery.md` → "A delegated unit that
94
87
  stopped without reporting" and ask `pnpm josh run:liveness`.
95
88
 
@@ -1,15 +1,6 @@
1
1
  # `backlogrun` — lanes and concurrency
2
2
 
3
- Point-of-use, read one section at a time from `backlogrun.md` → "The route table". Reasons:
4
-
5
- - `docs/maintainers/backlogrun-lanes-rationale.md` → "Why the lane ceiling is shaped the way it is"
6
- - `docs/maintainers/backlogrun-lanes-rationale.md` → "Why CI concurrency is capped by the lane limit"
7
- - `docs/maintainers/backlogrun-lanes-rationale.md` → "Why a lane's review needs a brief and an attestation"
8
- - `docs/maintainers/backlogrun-lanes-rationale.md` → "Why the lane branch is `<N>-lane` and never switched"
9
- - `docs/maintainers/backlogrun-lanes-rationale.md` → "Why lanes cost as well as buy throughput"
10
- - `docs/maintainers/backlogrun-lanes-rationale.md` → "Why `lane:launch` folds the lane steps into one"
11
- - `docs/maintainers/backlogrun-lanes-rationale.md` → "Why a committed child's lane is kept"
12
- - `docs/maintainers/backlogrun-lanes-rationale.md` → "Where each rule came from"
3
+ Point-of-use, read one section at a time from `backlogrun.md` → "The manifest — the ordered flow".
13
4
 
14
5
  ## Concurrency: as many children per repository as it has free lanes
15
6
 
@@ -29,7 +20,6 @@ answer wrongly (a false green or a false red)? All three, and the issue carries
29
20
  missing, and it carries `run:lane`. `backlog:next` and `epic:next --lanes` answer `triage` for an
30
21
  issue with neither, so a filed issue carries one of the two from its filing. **It stops the other
31
22
  lanes for one reason only: a batch run on broken verification leaves nobody's result trustworthy.**
32
- This section is the rule's single source; why: `docs/maintainers/wip-cap-rationale.md` → "Why a solo run".
33
23
 
34
24
  ## Lanes — running more than one child at a time
35
25
 
@@ -77,7 +67,7 @@ pid=$(pnpm josh lane:launch "$n") || exit 1 # the child's pid on stdout, nothi
77
67
 
78
68
  | It answers | What the run does |
79
69
  | --- | --- |
80
- | a pid | The child runs; poll it |
70
+ | a pid | The child runs; wait on it with `lane:await` |
81
71
  | empty, non-zero, `full` | No free lane; wait for one |
82
72
  | empty, non-zero, `already-open` or a failed install | **Park that child and name `pnpm josh lane:close <N>`** — a lock the lane cannot build is a person's to fix |
83
73
  | `lane:open` reports a reused `<N>-lane` on stderr | The way back to a child parked after it pushed — **a reused branch is not a fresh lane** |
@@ -96,14 +86,15 @@ Everything else is unchanged; `pnpm josh followup` releases the lane's hold at t
96
86
  - **It records where the child writes** — `<temp>/josh-lane-dispatch-<N>.log`.
97
87
  - **A refusal is an empty capture beside a non-zero exit**, with a `warning` Telegram. **Park that
98
88
  child and name the log the message carries**; never re-dispatch into the same lane without reading it.
99
- - **A child that started with nowhere to write exits zero and warns** — **poll that lane on the
100
- process trace alone**.
89
+ - **A child that started with nowhere to write exits zero and warns** — **wait on that lane with
90
+ `lane:await`, which reads the process trace alone**.
101
91
  - **The child is started as `fullrun #<N>` with the lane as its working directory**; the typed
102
92
  `backlogrun` covers it.
103
93
  - **It passes `--permission-mode bypassPermissions`, never `--dangerously-skip-permissions`.**
104
94
  `.claude/settings.json`'s `deny` list still refuses what it names; report what stopped, never loosen it.
105
95
 
106
- **Start each child without blocking on it, and poll them all** — a silent one is
96
+ **Start each child without blocking on it, then wait on `backlog:drive` or `lane:await`**
97
+ (`scripts/run/run-poll-hook.ts`) — a silent one is
107
98
  `backlogrun-recovery.md` → "A delegated unit that stopped without reporting", read in that child's lane.
108
99
 
109
100
  **`pnpm josh ms` is the parent's now, not the child's** — run it in the primary checkout **before
@@ -1,10 +1,7 @@
1
1
  # `backlogrun` — a child that cannot finish
2
2
 
3
3
  **Read this file in full when a child cannot finish** — before parking it, before a
4
- `needs-human-review` stop, or before recording a mid-run prerequisite or split. Point-of-use, never an
5
- entry read (`backlogrun.md` points here). Single source of park-and-continue, the `needs-human-review`
6
- stop, a stale `in-progress`, a mid-run prerequisite and a mid-run split. Provenance:
7
- `docs/maintainers/backlogrun-park-rationale.md` → "Where each rule came from".
4
+ `needs-human-review` stop, or before recording a mid-run prerequisite or split.
8
5
 
9
6
  ## What happens to a child that cannot finish
10
7
 
@@ -33,8 +30,6 @@ parks, re-dispatches or files.
33
30
  A child carrying **`needs-human-review`** stops `halfrun`-shaped and **the whole run ends there**:
34
31
  implementation and the gate run, nothing is committed, the tree is left dirty and unstashed, a
35
32
  `confirmation` Telegram carries the resume command, and the remaining children are not started.
36
- Rationale: `docs/maintainers/backlogrun-park-rationale.md` → "Why `needs-human-review` ends the run
37
- instead of parking".
38
33
 
39
34
  **The child goes on holding its repository**, and **its lane is left open and untouched**. **Name the
40
35
  lane directory in the stop report and in the Telegram.** Lanes in flight finish; no new lane opens.
@@ -90,8 +85,7 @@ It never carries:
90
85
 
91
86
  **When in doubt, it is Tier A**: decide, comment the decision, and continue. **A label a mechanical step
92
87
  applied** (a failed or abandoned child, a lost merge race) is read against this list once its reason is
93
- known, and removed when the reason is not on it. Rationale:
94
- `docs/maintainers/backlogrun-park-rationale.md` → "Why a run spends no attention on a non-finding".
88
+ known, and removed when the reason is not on it.
95
89
 
96
90
  ## `in-progress` is removed by whoever finds it stale
97
91
 
@@ -1,14 +1,11 @@
1
1
  # `backlogrun` — progress, the hand-off, resume and waiting
2
2
 
3
- Point-of-use, read one section at a time from `backlogrun.md` → "The route table"; the heartbeat is `progress-watcher.md` → "Progress while the run is quiet".
3
+ Point-of-use, read one section at a time from `backlogrun.md` → "The manifest — the ordered flow"; the heartbeat is `progress-watcher.md` → "Progress while the run is quiet".
4
4
 
5
5
  ## Running a named epic's children
6
6
 
7
- **`backlog:drive` walks this loop on its own; a session runs it when the driver hands back `epic #N`**
8
- (the loop: `docs/maintainers/backlogrun-driver.md`; rationale:
9
- `docs/maintainers/backlogrun-progress-rationale.md` → "Why a named epic's children run in lanes";
10
- `docs/maintainers/backlogrun-progress-rationale.md` → "Why state lives in records, not the
11
- conversation"). Each child runs as `fullrun #<N>` in a lane —
7
+ **`backlog:drive` walks this loop on its own; a session runs it when the driver hands back `epic #N`.**
8
+ Each child runs as `fullrun #<N>` in a lane —
12
9
  `pnpm josh lane:launch <N>` (`backlogrun-lanes.md` → "Opening one lane and dispatching its child"),
13
10
  then `pnpm josh lane:await <N...> --owner "$PPID"` in the background — and every ending is read by one
14
11
  command:
@@ -20,10 +17,7 @@ next=$(pnpm josh run:merge <N> --epic <E> --repo <owner/repo> --owner "$PPID" --
20
17
  **`pnpm josh run:merge <N>` is the only reading of how a child ended** — never
21
18
  classify `issue:state` by hand or ask `epic:next` in its place. **Pass `--output <path>`, the child's
22
19
  transcript**; the named-epic flags are dropped for the opted-in backlog. It classifies, counts, closes
23
- the lane and comments itself; act on the token. Rationale:
24
- `docs/maintainers/backlogrun-progress-rationale.md` → "Why a child's ending is read by `run:merge` alone";
25
- `docs/maintainers/backlogrun-progress-rationale.md` → "Why a child's ending is classified at once";
26
- provenance of each rule: `docs/maintainers/backlogrun-progress-rationale.md` → "Where each rule came from".
20
+ the lane and comments itself; act on the token.
27
21
 
28
22
  | It prints | What the run does |
29
23
  | --- | --- |
@@ -52,8 +46,7 @@ after every child's merge and `pnpm josh ms`, never wired to `pnpm josh delegate
52
46
  carrying the budget** (`backlogrun-steps.md` → "The session cut is inside the invocation"); it is not a
53
47
  stop. The threshold is `CONTEXT_CUT_THRESHOLD` in `scripts/cost-runtime/context-cut-threshold.ts`
54
48
  (135,000, shared by the scheduler entry, hand-off and the lane worker cut, `pre-gate-cut.md` → "The
55
- implementation-phase cut"). Rationale: `docs/maintainers/backlogrun-progress-rationale.md` → "Why the
56
- hand-off check is asked at every merge".
49
+ implementation-phase cut").
57
50
 
58
51
  | It answers | What the run does |
59
52
  | --- | --- |
@@ -72,8 +65,7 @@ and output path; fill a missing path with `pnpm josh lane:output <N> <path>`:
72
65
  closed by `pnpm josh lane:prune`.
73
66
  - **Every in-flight lane records a path** — count everything, run `pnpm josh run:carry --cut --owner
74
67
  "$PPID"`, post the progress comment naming every lane and its path with `pnpm josh run:board`, and end
75
- the turn; the `run:wake` driver polls the lanes. Rationale:
76
- `docs/maintainers/backlogrun-progress-rationale.md` → "Why lanes are handed over rather than drained".
68
+ the turn; the `run:wake` driver polls the lanes.
77
69
  - **`--cut` answers `capped`** (`MAX_CUTS`) — **do not `run:wake` or hand off**;
78
70
  carry this session on and re-ask at the next merge.
79
71
 
@@ -88,7 +80,7 @@ park** — nothing is labelled, stashed or filed.
88
80
  ### Picking the lanes up in the fresh session
89
81
 
90
82
  **Start no child again and open no lane already open.** In one turn: `pnpm josh lane:list` (a line
91
- with a path is a handed-over child, polled per `backlogrun-recovery.md` → "A delegated unit that stopped
83
+ with a path is a handed-over child, waited on per `backlogrun-recovery.md` → "A delegated unit that stopped
92
84
  without reporting"), `pnpm josh run:progress --wait --output <handed-over paths>` in the background
93
85
  (`run:watcher:guard`), `pnpm josh run:liveness`, and `epic:next --lanes`, a lane per child it offers.
94
86
  **A carried-over child finishes in its own unit — never run its `followup` yourself**; one lost in the
@@ -104,15 +96,14 @@ the epic body; what merged the epic's task list.
104
96
 
105
97
  | Setting | Value | Meaning |
106
98
  | --- | --- | --- |
107
- | Polling interval | 60 s | **In flight, a floor between two asks, never a clock** — the wake is `lane:await`'s completion or the watcher's arrival exit, never a report. **With nothing in flight no wake comes: it is the parent's own clock.** A `backlogrun` idle watch is polled at this same interval. |
99
+ | Re-ask floor | 60 s | **In flight, never a clock — the wait is `backlog:drive` or `lane:await`**, and the wake is their exit or the watcher's arrival exit, never a report; a state read repeated with nothing decided in between is refused. **With nothing in flight no wake comes: it is the parent's own clock.** A `backlogrun` idle watch re-asks at this same floor. |
108
100
  | Silent delegated unit | 30 min | Not the child's duration — the time its output has gone **unchanged**. Past it, ask `run:liveness` and book a stopped unit as a failure. |
109
101
  | Stale `in-progress` | 90 min | Past it, the other session is gone. |
110
102
  | Publish wait | 10 min | `josh propagate`'s own budget. A failed publish never appears. |
111
103
  | `backlogrun` idle watch | 8 h | Counted from when the run's hands became free, never from its start; `pnpm josh backlog:budget` decides it. |
112
104
 
113
- Each timeout **ends the wait and reports** — none is retried indefinitely. Rationale for the figures:
114
- `docs/maintainers/backlogrun-progress-rationale.md` → "Why the parent waits on classification, not a
115
- clock". A stale child's label is removed first, so the next poll can offer it. **A graph that has
105
+ Each timeout **ends the wait and reports** — none is retried indefinitely. A stale child's label is
106
+ removed first, so the next ask can offer it. **A graph that has
116
107
  deadlocked on a cycle is not this loop's to untangle**: `epic:next` detects it and exits with an error.
117
108
 
118
109
  ## Who sends the summary, and who propagates
@@ -4,7 +4,8 @@ Point-of-use, read one section at the failure that reaches it; the single source
4
4
 
5
5
  ## A delegated unit that stopped without reporting
6
6
 
7
- **A stop from outside leaves no notification behind, so the parent polls rather than waits.** Record
7
+ **A stop from outside leaves no notification behind, so the parent waits on `lane:await`, whose exit
8
+ covers it.** Record
8
9
  where a lane child writes with `pnpm josh lane:output <N> <path>` in the dispatch turn, and once its
9
10
  output has been unchanged for the silent-unit window (`backlogrun-progress.md` → "Waiting, and never
10
11
  waiting forever") **ask the command rather than combining the traces yourself**, in the checkout the
@@ -18,14 +19,11 @@ pnpm josh run:liveness <N> --output <absolute path> --process <command lines nam
18
19
 
19
20
  | Answer | What the parent does |
20
21
  | --- | --- |
21
- | `alive` | Keep polling; touch nothing |
22
+ | `alive` | Wait on `lane:await` again; touch nothing |
22
23
  | `settled` | Re-read with `pnpm josh run:status <N>` and take the branch its state section says |
23
24
  | `undetermined` | Read the trace that failed and ask again. **A second in a row on the same child is a fault in the check**: send a `confirmation` naming the trace and stop — never escalate it to `stopped` |
24
25
  | `stopped` | The recovery below |
25
26
 
26
- Rationale: `docs/maintainers/backlogrun-recovery-rationale.md` → "Why liveness needs silence and no
27
- process together".
28
-
29
27
  **On `stopped`, re-read with `pnpm josh run:status <N>`.** **A re-read carrying `needs-decision`** — the
30
28
  unit parked it, then stopped: leave the label on and count nothing. Otherwise, while `state: OPEN`:
31
29
 
@@ -39,7 +37,10 @@ unit parked it, then stopped: leave the label on and count nothing. Otherwise, w
39
37
  the stale `in-progress` itself.
40
38
  3. **Act on the token it printed** — `backlogrun-progress.md` → "Running a named epic's children".
41
39
 
42
- Rationale: `docs/maintainers/backlogrun-recovery-rationale.md` → "Why the poll routes through `run:merge`".
40
+ ## A person withdraws a running child
41
+
42
+ On a person's instruction to drop a running child's issue, run `pnpm josh lane:withdraw <N>
43
+ --reason "<their reason>"` — `docs/josh-commands.md` → "`josh lane:withdraw`".
43
44
 
44
45
  ## Conflicts are not predicted
45
46
 
@@ -51,8 +52,7 @@ followup` ends that child with a named conflict in about ten seconds.
51
52
 
52
53
  **That child does not stop: it resolves the conflict in its own lane**, uncounted by the
53
54
  consecutive-failure guard. **The merge direction is `origin/main` into the lane's branch, never a
54
- rebase**; no step rewrites a pushed commit (`docs/maintainers/backlogrun-recovery-rationale.md` → "Why a
55
- conflict is resolved in the lane rather than handed to a person").
55
+ rebase**; no step rewrites a pushed commit.
56
56
 
57
57
  1. **Resolve in the lane.** `git fetch origin main`, merge `origin/main` into the lane's branch, resolve
58
58
  in place. Do not close the lane, open another, or switch its branch.
@@ -1,14 +1,6 @@
1
1
  # `backlogrun` — the detailed procedure behind the manifest
2
2
 
3
- Point-of-use, read one section at a time from `backlogrun.md` → "The route table"; how the driver runs the loop on its own is `docs/maintainers/backlogrun-driver.md`. Reasons:
4
-
5
- - `docs/maintainers/backlogrun-steps-rationale.md` → "Why the authorization boundary is shaped this way"
6
- - `docs/maintainers/backlogrun-steps-rationale.md` → "Why a session cut does not end the run"
7
- - `docs/maintainers/backlogrun-steps-rationale.md` → "Why the plan and the decision pass come first"
8
- - `docs/maintainers/backlogrun-steps-rationale.md` → "Why the loop's contract is shaped this way"
9
- - `docs/maintainers/backlogrun-steps-rationale.md` → "Why the idle watch lasts 8 hours from when the hands became free"
10
- - `docs/maintainers/backlogrun-steps-rationale.md` → "Why the cost check skips a watch"
11
- - `docs/maintainers/backlogrun-steps-rationale.md` → "Where each rule came from"
3
+ Point-of-use, read one section at a time from `backlogrun.md` → "The manifest — the ordered flow".
12
4
 
13
5
  ## What one invocation approves
14
6
 
@@ -135,7 +127,7 @@ section the row names:
135
127
  | `window` | Hand the loop back as is | — |
136
128
 
137
129
  **A candidate only in another repository is never a token** — report it with its checkout. The budgets,
138
- verdicts and stops are the driver's own: `docs/maintainers/backlogrun-driver.md`.
130
+ verdicts and stops are the driver's own.
139
131
 
140
132
  ## What runs once per session, not once per issue
141
133
 
@@ -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.