@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
@@ -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,9 +57,7 @@ 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
62
  - **The gate runs beside this review, not in front of it** — started with the review, joined before the
62
63
  commit. A red gate is fixed and re-run whatever the review concluded.
@@ -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
 
@@ -2,8 +2,7 @@
2
2
 
3
3
  Everything between a green CI and a merged PR: the command, the merge it authorizes, the notifications,
4
4
  the reviewer scan, the config report and the release ask. `fullrun` and `backlogrun` end here; `halfrun`
5
- stops before the commit. This file is the single source. Where each rule came from:
6
- `docs/maintainers/followup-rationale.md` → "Where each rule came from".
5
+ stops before the commit.
7
6
 
8
7
  ## Run `pnpm josh followup`
9
8
 
@@ -106,15 +105,13 @@ pnpm josh notify --task-type failure --issue-url "<issue-url>" --body-file <reas
106
105
  non-zero; with it, the reason is posted and the run proceeds.
107
106
  - **A comment listing that could not be read is a standing blocker**.
108
107
  - **Temporary**: CodeRabbit is non-blocking end to end — out of the default required checks
109
- (restore via `JOSH_REQUIRED_CHECKS`); its findings are audit notes. Reverting it:
110
- `docs/maintainers/followup-rationale.md` → "The temporary CodeRabbit exemption".
108
+ (restore via `JOSH_REQUIRED_CHECKS`); its findings are audit notes.
111
109
 
112
110
  ## Config file reporting
113
111
 
114
112
  `followup` matches every changed path against what `josh sync` distributes (`AI_COPY_FILES`,
115
113
  `AI_COPY_FILE_MAPPINGS`, `AI_COPY_DIRECTORIES`, `SYNCED_PATHS`) and **reports** the claimed paths in the
116
- notification and the Issue report. **It stops nothing** (`docs/maintainers/followup-rationale.md` →
117
- "Why config claims are reported, not stopped"). `pnpm josh sync:scope` gives the same answer.
114
+ notification and the Issue report. **It stops nothing.** `pnpm josh sync:scope` gives the same answer.
118
115
 
119
116
  ## When `pnpm josh release` runs
120
117
 
@@ -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
@@ -1,7 +1,6 @@
1
1
  # An Issue's comments are part of the Issue
2
2
 
3
- **The single source of the comment read**, read before implementing a `#N` Issue. Rationale and
4
- history: `docs/maintainers/issue-comments-rationale.md` → "Why comments are read".
3
+ Read before implementing a `#N` Issue.
5
4
 
6
5
  **Every `#N` entry point reads the Issue's comments before it implements** — `fullrun`, `halfrun` and
7
6
  `kickoff`; a `backlogrun` named issue and epic child inherit it through `fullrun`. One call, in the same
@@ -73,7 +72,8 @@ one this run still owes.
73
72
  body. A thread longer than the Issue is the pre-implementation reading `delegation.md` describes: brief
74
73
  a unit to return **the agreements in force plus the comment URLs that carry them**, never the text.
75
74
 
76
- **`pnpm josh rule:guard` refuses the body-only read** (`prompts/collaboration-workflow/rule-delivery.md`).
75
+ **Under Claude Code the hook prepends the comments to a line that opens with a body-only `gh api` read
76
+ and refuses every other body-only read; the Codex adapter refuses them all** (`prompts/collaboration-workflow/rule-delivery.md`).
77
77
  **This file is the rule, not the hook** — a session without hooks still owes the read.
78
78
 
79
79
  ## A person's update mid-run
@@ -28,8 +28,9 @@ pnpm josh issue:file "<title>" --body-file <complete-draft.md> --depth <n> --dis
28
28
  `add_to_epic` / `create_epic` Tier A and `ask` a stop, in exactly the reading `into-target.md`'s
29
29
  `into <target>` suffix would have given by hand. Where the user typed `into <target>`, that naming wins.
30
30
  - **`Epic: not asked` is not `Epic: none`.** The epic half decides from the issue numbers the body
31
- names. **Cite `#N` in the body whenever the work follows an existing Issue** — one line is enough,
32
- and naming the epic itself (`part of epic #<E>`) is answered with that epic.
31
+ names in its acceptance criteria or its `parent: #N` line; a background mention does not count.
32
+ **Cite `#N` there whenever the work follows an existing Issue** — one line is enough, and naming
33
+ the epic itself (`parent: #<E>`) is answered with that epic.
33
34
  - **`epic:bundle` then runs on the new Issue, in the same call.** Act on its printed answer; a `⚠`
34
35
  means rerun `pnpm josh epic:bundle <N>` — the Issue exists, so never refile; a placing answer
35
36
  reads the `epic-commands` skill.
@@ -1,9 +1,7 @@
1
1
  # The dependency update — when `josh latest` runs
2
2
 
3
3
  `josh latest` updates every dependency, the published ranges, `pnpm audit` and pnpm, in that
4
- order and over the network. This file is the **single source** of when it runs; every entry point
5
- references it and none restates it. History: `docs/maintainers/latest-gate-rationale.md` → "Where
6
- each rule came from".
4
+ order and over the network.
7
5
 
8
6
  ## Ask the command; do not decide
9
7
 
@@ -59,8 +57,6 @@ merge is CI**: the `Security Audit` job runs on every pull request and is one of
59
57
 
60
58
  **The lock file the update rewrites lands with whichever issue ran it.** `josh latest` leaves
61
59
  `pnpm-lock.yaml` modified and that issue's `pnpm josh git -y` commits it. Should the issue then fail
62
- CI on a bump rather than on its own change, fix it forward before parking the issue for it. Rationale
63
- for the elapsed-time window: `docs/maintainers/latest-gate-rationale.md` → "Why an elapsed-time
64
- window rather than once per batch".
60
+ CI on a bump rather than on its own change, fix it forward before parking the issue for it.
65
61
 
66
62
  `docs/josh-commands-automation.md` documents the command itself.
@@ -1,8 +1,6 @@
1
1
  # `needs-human-review` — the child that stops before its commit
2
2
 
3
- **The single source of the label**, read at its point of use — the moment `pnpm josh issue:state <N>`
4
- answers `human_review: yes`. Rationale and history: `docs/maintainers/needs-human-review-rationale.md`
5
- → "Why the label exists".
3
+ Read the moment `pnpm josh issue:state <N>` answers `human_review: yes`.
6
4
 
7
5
  An issue carrying **`needs-human-review`** is degraded to a `halfrun`-shaped stop, whichever entry
8
6
  point reached it — `fullrun` or `backlogrun` — and the label may be applied **only by a person**.
@@ -46,8 +44,7 @@ gh api repos/{owner}/{repo}/labels -f name=needs-human-review -f color=d93f0b -f
46
44
  **It is not `needs-decision`**: `needs-decision` withholds a run's *start*; this withholds its *end*.
47
45
  So a `needs-human-review` issue is still offered, and a child stopped by it **goes on holding its
48
46
  repository** — `scripts/issue/issue-labels.ts` keeps it out of `NOT_DIRECTLY_RUNNABLE_LABELS` and
49
- `scripts/epic/epic-busy.ts` keeps it out of the parked set (`docs/maintainers/needs-human-review-rationale.md`
50
- → "Why it is not `needs-decision`").
47
+ `scripts/epic/epic-busy.ts` keeps it out of the parked set.
51
48
 
52
49
  Each entry point's own branch stays in its own file — `fullrun.md`, `halfrun.md`,
53
50
  `backlogrun.md` — and routes here for the definition.
@@ -59,8 +59,6 @@ gh api repos/{owner}/{repo}/issues/<N>/labels -f 'labels[]=depth:1' # an Issue
59
59
  - **An Issue carrying more than one counts as the lowest depth present.**
60
60
  - **An `epic` takes no depth label** and is excluded from the share's denominator.
61
61
 
62
- Rationale: `docs/maintainers/observation-filing-rationale.md` → "Why the depth label is applied at filing".
63
-
64
62
  - **A discretionary observation at depth 1 or deeper is filed only where it can cite the depth-0 work
65
63
  it stopped or delayed** — an Issue number or a run, never "this would slow runs down". **Cannot cite
66
64
  one, it is not filed**: it goes to the ledger (`observation-ledger.md`); the blockage arriving or a
@@ -74,12 +72,9 @@ Rationale: `docs/maintainers/observation-filing-rationale.md` → "Why the depth
74
72
  - **Cannot write both, it is not filed** — it goes to the ledger.
75
73
  - **This narrows depth 2 alone, and the exemptions above carry over unchanged.**
76
74
 
77
- Rationale: `docs/maintainers/observation-filing-rationale.md` → "Why depth gates a discretionary filing".
78
-
79
75
  **It governs this route only — the fourth row of `prerequisite.md`'s table.** A review finding routed
80
76
  to branch 2 of `prompts/review.md` → "Review round cap" is filed under that section's own bar and
81
77
  **does not take the depth test**. **That bar is the reason, and the subject's depth is not.**
82
- Rationale: `docs/maintainers/observation-filing-rationale.md` → "Why a review branch-2 filing skips the depth test".
83
78
 
84
79
  **And a PR that *adds* a measurement names its reader in the same way** — the Issue that read the value
85
80
  to decide something, or the path of the rule that reads it. **A measurement with no reader is not
@@ -98,8 +93,6 @@ added.** `route:tier-a` and `route:interrupt` carry over unchanged.
98
93
 
99
94
  **Two readings of the same backlog give the same number.**
100
95
 
101
- Rationale: `docs/maintainers/observation-filing-rationale.md` → "Why the depth-0 denominator is fixed".
102
-
103
96
  **What the number is for is not decided here** — no `backlog:next` change and no target value until it
104
97
  has been measured the same way more than once.
105
98
 
@@ -114,10 +107,3 @@ run's ceiling.
114
107
  appends what is left.** **The 10-per-run ceiling for this route is the parent's to count.** **Lines
115
108
  its own `review:record` and `measure:rerun` write are not this route** — they go to its issue's file in
116
109
  its lane (`observation-ledger.md` → "The ledger — where an observation that cannot cite a blockage goes").
117
-
118
- Rationale: `docs/maintainers/observation-filing-rationale.md` → "Why a delegated child neither files nor appends".
119
-
120
- **This file is the single source of every procedure above**; nothing under
121
- `prompts/collaboration-workflow/` restates it.
122
-
123
- Provenance: `docs/maintainers/observation-filing-rationale.md` → "Where each rule came from".
@@ -1,14 +1,11 @@
1
1
  # The observation ledger — grammar, commit path and promotion
2
2
 
3
3
  **Read only when the depth test in `observation-filing.md` turns an observation away, or a user
4
- reports a bug** (its kind of miss, below), in the turn that appends the line. Single source of the
5
- ledger's grammar, commit path and second-sighting promotion. Provenance:
6
- `docs/maintainers/observation-ledger-rationale.md` → "Where each rule came from".
4
+ reports a bug** (its kind of miss, below), in the turn that appends the line.
7
5
 
8
6
  ## The ledger — where an observation that cannot cite a blockage goes
9
7
 
10
- **An observation the depth test turns away is recorded in the ledger, not discarded.** Rationale:
11
- `docs/maintainers/observation-ledger-rationale.md` → "Why the ledger exists".
8
+ **An observation the depth test turns away is recorded in the ledger, not discarded.**
12
9
 
13
10
  - **The destination is the `.josh/observations/` directory in the repository the observation is
14
11
  about**, **one file per issue**: `<N>.md` for the issue the run is executing (its branch's number,
@@ -60,8 +57,7 @@ blocked depth-0 work is filed as before.
60
57
 
61
58
  ## The commit path — how an appended line reaches the default branch
62
59
 
63
- **An append nobody commits is an append nobody can count.** Rationale:
64
- `docs/maintainers/observation-ledger-rationale.md` → "Why the ledger has a commit path".
60
+ **An append nobody commits is an append nobody can count.**
65
61
 
66
62
  - **A run's appended lines ride its own commit** — `pnpm josh git` stages `.josh/observations/`
67
63
  (`scripts/git/git-staging.ts`). **Record before the commit, not after the merge:** a finding recorded
@@ -87,8 +83,7 @@ blocked depth-0 work is filed as before.
87
83
 
88
84
  ## The second sighting is what files it
89
85
 
90
- **A repeat is the citation** — counted, not judged (`docs/maintainers/observation-ledger-rationale.md`
91
- → "Why a second sighting files"):
86
+ **A repeat is the citation** — counted, not judged:
92
87
 
93
88
  - **On `observation:record` answering `file`, the observation is filed**, at depth 1 or deeper, with
94
89
  no depth-0 citation (only when exactly one earlier sighting exists).
@@ -2,9 +2,9 @@
2
2
 
3
3
  The **pre-gate cut**: a dispatched lane child ends its process the moment implementation is done, and a
4
4
  **fresh** process resumes the same lane from the gate onward, without the implementation's accumulated
5
- context. Rationale: `docs/maintainers/pre-gate-cut-rationale.md` → "Why the cut exists".
5
+ context.
6
6
 
7
- This file is the single source of the boundary: `run:cut` takes it, `run:cut --resume` is the fresh
7
+ `run:cut` takes the boundary, `run:cut --resume` is the fresh
8
8
  process's entry check. A second boundary — the implementation-phase cut, _during_ implementation — is
9
9
  below; it states only what differs.
10
10
 
@@ -55,8 +55,7 @@ pnpm josh run:cut <N>
55
55
  ### The gate refuses until the cut has been taken
56
56
 
57
57
  `pnpm josh rule:guard` **refuses `pnpm josh gate`** in a lane with no cut record carried, handing back
58
- the command above. Rationale: `docs/maintainers/pre-gate-cut-rationale.md` → "Why the rules are
59
- guards, not prose".
58
+ the command above.
60
59
 
61
60
  - **It fires for a marked child and nowhere else**: the working directory is `<lane root>/<issue
62
61
  number>` **and** `JOSH_LANE_CHILD` names that issue. `run:cut` uses an open-lane lookup instead, so
@@ -66,8 +65,7 @@ guards, not prose".
66
65
  - **It fires once per run.**
67
66
  - **`--resume`, `--end` and `--json` do not count as taking the cut.**
68
67
 
69
- Its row: `prompts/collaboration-workflow/rule-delivery.md`. Suites: `docs/maintainers/pre-gate-cut-rationale.md`
70
- → "Which suites pin each guard".
68
+ Its row: `prompts/collaboration-workflow/rule-delivery.md`.
71
69
 
72
70
  ## Resuming — the fresh process's entry check
73
71
 
@@ -92,8 +90,7 @@ pnpm josh run:cut --resume <N>
92
90
  ### The stage is passed to the resumed child, not reconstructed by it
93
91
 
94
92
  **Skip the entry it has already done**: do not re-read the workflow skill, repeat the split assessment
95
- or re-normalize the title; the plan and decisions are read back from the issue. Rationale:
96
- `docs/maintainers/pre-gate-cut-rationale.md` → "Why the resume carries what it carries".
93
+ or re-normalize the title; the plan and decisions are read back from the issue.
97
94
 
98
95
  ## What is carried, and what is not
99
96
 
@@ -127,21 +124,21 @@ Same `cost_verdict.per_request_cost` through `cost_cli.session_verdict` as `back
127
124
  **The trigger**: `pnpm josh rule:guard` refuses an `Edit` / `Write` in a dispatched lane child over
128
125
  threshold, handing back `pnpm josh run:cut --impl <N> --handoff <path>`. `cut` ends the turn; the
129
126
  fresh process's `run:cut --resume <N>` answers `resume-impl` — **the implementation resume clears the
130
- record**, so the cut may fire again. **A cut that relaunches its successor owes no Telegram**. Outside a
127
+ record**, so the cut may fire again. **A cut that relaunches its successor owes no Telegram** — the
128
+ `Stop` hook reads the relaunch off the turn's own `run:cut` output, not off the record the resume
129
+ clears. Outside a
131
130
  lane, `run:cut --impl` prints the held run's instruction: on `over`, keep the hold, send a
132
131
  `confirmation` Telegram naming `fullrun #<N>`, end the turn. **It fires on every threshold crossing,
133
132
  not once per run**; **An edit reissued right after a refusal passes**; **An unmeasurable session
134
- warrants the cut**; **It is silent between a cut and its resume**. Rationale:
135
- `docs/maintainers/pre-gate-cut-rationale.md` → "Why the rules are guards, not prose"
136
- (`scripts/rules/implementation-cut.ts`). A child that ended without cutting is detected by
133
+ warrants the cut**; **It is silent between a cut and its resume** (`scripts/rules/implementation-cut.ts`).
134
+ A child that ended without cutting is detected by
137
135
  `pnpm josh run:ending <N> --output <path>`.
138
136
 
139
137
  ## The threshold
140
138
 
141
139
  `CONTEXT_CUT_THRESHOLD` and `cost_verdict.per_request_cost` live in
142
140
  `scripts/cost-runtime/context-cut-payback.ts`; both cuts and the parent hand-off read the same verdict,
143
- and an unmeasurable session is always cut. Rationale: `docs/maintainers/pre-gate-cut-rationale.md` →
144
- "Why the threshold is a break-even". Both cuts end the turn **before** the gate, so the push is never a
141
+ and an unmeasurable session is always cut. Both cuts end the turn **before** the gate, so the push is never a
145
142
  turn boundary (`chain-rule.md`).
146
143
 
147
144
  ## A lane child records its park before it stops
@@ -162,5 +159,3 @@ until then — **It fires once per run.** (`scripts/rules/lane-park.ts`).
162
159
  fires; `pnpm josh rule:guard` refuses `AskUserQuestion` for a marked lane child on every occurrence — park the question instead.
163
160
  `pnpm josh run:ending` lifts a slipped ask into the park basis (`scripts/rules/lane-interactive-ask.ts`,
164
161
  `scripts/agent/interactive-ask.ts`).
165
-
166
- Provenance of each rule: `docs/maintainers/pre-gate-cut-rationale.md` → "Where each rule came from".
@@ -1,8 +1,7 @@
1
1
  # A prerequisite discovered mid-run — a dependency, not a park
2
2
 
3
3
  **The single source of the prerequisite branch**, read at its point of use — the moment a run
4
- discovers that another Issue in this repository has to land first. History:
5
- `docs/maintainers/prerequisite-rationale.md` → "Where each rule came from".
4
+ discovers that another Issue in this repository has to land first.
6
5
 
7
6
  **A prerequisite discovered mid-run is a dependency, not a park** — the Issue in hand is still one
8
7
  deliverable, it just needs another one before it.
@@ -40,7 +40,6 @@ silence clock (`docs/josh-commands-run.md` → "`josh run:progress`").
40
40
  `JOSH_PROGRESS_INTERVAL_MINUTES` moves both sides; `josh` → `progress_interval_minutes` in
41
41
  `package.json` sits one step below it. **`--interval` moves the watcher alone** — quieter, never the
42
42
  guard stricter.
43
- Rationale: `docs/maintainers/progress-watcher-rationale.md` → "Why the heartbeat reads as it does".
44
43
 
45
44
  ### What a report says
46
45
 
@@ -61,8 +60,7 @@ off-screen, start `pnpm josh run:board --every <minutes>` in the background (`do
61
60
 
62
61
  **A stop is the only interrupt**: a `backlogrun` that has stopped ends with
63
62
  `pnpm josh run:carry --end --stopped "<reason>"`, which sends one ⏸️ confirmation; a parked child sends
64
- its own (`backlogrun-park.md`). Rationale: `docs/maintainers/progress-watcher-rationale.md` → "Why the
65
- signal tiers are split this way".
63
+ its own (`backlogrun-park.md`).
66
64
 
67
65
  ### Who starts it, and what counts as a report
68
66
 
@@ -85,7 +83,4 @@ tool result only you read is not one.** `--output` is omitted there, and `record
85
83
  **A run that merges needs no teardown; a run that stops has to end the reporting itself** — **no
86
84
  further `--wait` is started** after the stop notification, and the running one is stopped in the same
87
85
  turn: `halfrun`'s stop before commit, a `needs-human-review`, split or prerequisite stop, a
88
- `backlogrun` named issue's failure stop. Rationale: `docs/maintainers/progress-watcher-rationale.md` →
89
- "Why the watcher runs where it does".
90
-
91
- Provenance of each rule: `docs/maintainers/progress-watcher-rationale.md` → "Where each rule came from".
86
+ `backlogrun` named issue's failure stop.
@@ -1,10 +1,8 @@
1
1
  # `prrun` — the manifest (plan → implement → PR → green → stop, a person merges)
2
2
 
3
- `prrun` sits between `halfrun` (stop before commit) and `fullrun` (auto-merge). It runs `fullrun`
4
- up to a green, mergeable pull request and **stops before the merge**, so a person merges by hand.
5
- **Read `fullrun.md` and `entry-sequence.md` for every step** — the entry
6
- sequence, the step lists, the gate, the review and the stop branches are `fullrun`'s, unchanged. This
7
- file names only the difference.
3
+ `prrun` runs `fullrun` up to a green, mergeable pull request and **stops before the merge**, so a
4
+ person merges by hand. **Read `fullrun.md` and `entry-sequence.md` for every step** — the entry
5
+ sequence, the step lists, the gate, the review and the stop branches are `fullrun`'s, unchanged.
8
6
 
9
7
  ## The difference — the entry
10
8
 
@@ -8,9 +8,6 @@ mark the step done. Read this file in full, in the same turn, before filing.
8
8
  drained, *before* the idle watch, so the watch picks up what it files; a run that stops without
9
9
  draining — the failure guard, `--idle 0` — still prints it at the stop position. Kit-only.
10
10
 
11
- Rationale: `docs/maintainers/retrospective-rationale.md` → "Why the retrospective is read at its step";
12
- provenance: `docs/maintainers/retrospective-rationale.md` → "Where each rule came from".
13
-
14
11
  ## The digest is read, not skimmed
15
12
 
16
13
  The command `run:step` prints folds four existing measurements into one digest — it adds none:
@@ -30,9 +27,12 @@ and anything the run surfaced that lives outside it).
30
27
  **The filing condition is the existing depth test, unchanged** (`observation-filing.md` → "The depth
31
28
  test"). What cannot pass it is not filed — not a shortfall, just not yet a finding.
32
29
 
30
+ **A cost regression is filed.** The digest's `File a cost regression: …` line passes the depth test as
31
+ printed — measured, with the command it names as the reproduction — and ranks first: one Issue names
32
+ every regressed row, and the scout keeps a repeat sighting from filing twice.
33
+
33
34
  **Order what passes by effect, and file the top two.** **The third onward is stacked in the observation
34
35
  ledger** (drained by `pnpm josh observations:flush`). **File nothing when nothing passes.**
35
- `docs/maintainers/retrospective-rationale.md` → "Why the top two are a selection, not a ration".
36
36
 
37
37
  **Exclude what is already filed or already done, through the existing scout** (`issue-scout.md`): file
38
38
  with `pnpm josh issue:file`, which scouts first — an **open** candidate covering it means do not file, a
@@ -1,9 +1,7 @@
1
1
  # The split assessment — one definition, every entry point
2
2
 
3
3
  Before any entry point starts work on an Issue, decide whether the request is **one** deliverable or
4
- several. This file is the single definition; every command applies it identically. Reasons:
5
- `docs/maintainers/split-assessment-rationale.md` → "Why the default is not to split" and
6
- `docs/maintainers/split-assessment-rationale.md` → "Why diff size is not a reason to split".
4
+ several. Every command applies it identically.
7
5
 
8
6
  ## The question
9
7
 
@@ -2,8 +2,7 @@
2
2
 
3
3
  **This file is the prefix's single source, read at its point of use — the moment an entry is typed with an
4
4
  `owner/repo#` prefix (or a short `repo#` name), not at any entry.** A run given a bare `#N` or `new`
5
- targets the session's own repository and never reaches it. `SKILL.md` → §2's table keeps the trigger and
6
- points here. Rationale: `docs/maintainers/target-repository-rationale.md` → "Why the prefix reads as it does".
5
+ targets the session's own repository and never reaches it.
7
6
 
8
7
  Every entry point takes the target repository in front of the Issue reference. Without it the target
9
8
  is the repository the session runs in.
@@ -1,7 +1,6 @@
1
1
  # The working-tree hold — one run per tree
2
2
 
3
- **The single source of the hold**, read at its point of use — the moment a run is about to claim or
4
- release the tree. History: `docs/maintainers/working-tree-hold-rationale.md` → "Where each rule came from".
3
+ Read the moment a run is about to claim or release the tree.
5
4
 
6
5
  **Ask `pnpm josh run:hold` before anything else, and obey what it answers** — the first call of
7
6
  `fullrun` and `halfrun`, before the title, before `pnpm josh ms`, and **before a `new` entry files its
@@ -23,8 +22,7 @@ pnpm josh run:release --force # a record left behind by a run that has ended
23
22
 
24
23
  **The unit is the working tree** — one branch, one index and one uncommitted diff, and a linked work
25
24
  tree has its own three. **`backlogrun`'s per-repository guard (`epic-busy.ts`) is a separate layer.** **`kickoff`
26
- does not claim it** (`docs/maintainers/working-tree-hold-rationale.md` → "Why the unit is the working
27
- tree").
25
+ does not claim it.**
28
26
 
29
27
  **Claim it in the checkout the run will edit** — a cross-repository `fullrun owner/repo#N` resolves
30
28
  that checkout from `pnpm josh doctor` **first** (a read) and claims there.
package/.codex/hooks.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "hooks": [
7
7
  {
8
8
  "type": "command",
9
- "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",
9
+ "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",
10
10
  "timeout": 180
11
11
  }
12
12
  ]
@@ -17,7 +17,7 @@
17
17
  "hooks": [
18
18
  {
19
19
  "type": "command",
20
- "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",
20
+ "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",
21
21
  "timeout": 10
22
22
  }
23
23
  ]
@@ -25,11 +25,11 @@
25
25
  ],
26
26
  "PreToolUse": [
27
27
  {
28
- "matcher": "Bash|Edit|Read|Write|AskUserQuestion|apply_patch",
28
+ "matcher": "Bash|Edit|Read|Write|AskUserQuestion|Agent|Task|apply_patch",
29
29
  "hooks": [
30
30
  {
31
31
  "type": "command",
32
- "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 codex-hook-adapter pretool",
32
+ "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 codex-hook-adapter pretool",
33
33
  "timeout": 20
34
34
  }
35
35
  ]
@@ -41,7 +41,7 @@
41
41
  "hooks": [
42
42
  {
43
43
  "type": "command",
44
- "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 codex-hook-adapter posttool",
44
+ "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 codex-hook-adapter posttool",
45
45
  "timeout": 90
46
46
  }
47
47
  ]
@@ -53,7 +53,7 @@
53
53
  "hooks": [
54
54
  {
55
55
  "type": "command",
56
- "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",
56
+ "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",
57
57
  "timeout": 20
58
58
  }
59
59
  ]
@@ -26,7 +26,7 @@ runs:
26
26
  using: composite
27
27
  steps:
28
28
  - name: Setup Node.js
29
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
29
+ uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0
30
30
  with:
31
31
  node-version: '24'
32
32
  registry-url: ${{ inputs.registry-url }}
@@ -493,7 +493,7 @@ jobs:
493
493
  uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
494
494
 
495
495
  - name: Run security audit
496
- uses: google/osv-scanner-action/osv-scanner-action@a345acffa64b0eaede81a3d9aae6141214d9c8fc # v2.6.0
496
+ uses: google/osv-scanner-action/osv-scanner-action@b1d267aea5211fa648d9d442fa64b90dbdcbdd36 # v2.7.0
497
497
  with:
498
498
  scan-args: --lockfile=pnpm-lock.yaml
499
499