@joshuafolkken/kit 1.1453.0 → 1.1471.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 (224) hide show
  1. package/.claude/skills/dependency-update/SKILL.md +26 -55
  2. package/.claude/skills/epic-commands/SKILL.md +87 -148
  3. package/.claude/skills/epic-commands/epic-bundle.md +45 -77
  4. package/.claude/skills/epic-commands/execution-waves.md +44 -81
  5. package/.claude/skills/verify-ui/SKILL.md +25 -50
  6. package/.claude/skills/workflow-commands/background-commands.md +36 -47
  7. package/.claude/skills/workflow-commands/backlogrun-child.md +72 -85
  8. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +1 -1
  9. package/.claude/skills/workflow-commands/backlogrun-lanes.md +91 -121
  10. package/.claude/skills/workflow-commands/backlogrun-park.md +73 -117
  11. package/.claude/skills/workflow-commands/backlogrun-progress.md +7 -9
  12. package/.claude/skills/workflow-commands/backlogrun-recovery.md +11 -20
  13. package/.claude/skills/workflow-commands/backlogrun-steps.md +43 -52
  14. package/.claude/skills/workflow-commands/chain-rule.md +24 -34
  15. package/.claude/skills/workflow-commands/followup.md +57 -76
  16. package/.claude/skills/workflow-commands/halfrun.md +2 -1
  17. package/.claude/skills/workflow-commands/issue-comments.md +43 -60
  18. package/.claude/skills/workflow-commands/kickoff.md +65 -74
  19. package/.claude/skills/workflow-commands/observation-filing.md +62 -107
  20. package/.claude/skills/workflow-commands/observation-ledger.md +56 -111
  21. package/.claude/skills/workflow-commands/pre-gate-cut.md +89 -138
  22. package/.claude/skills/workflow-commands/prerequisite.md +10 -15
  23. package/.claude/skills/workflow-commands/progress-watcher.md +21 -26
  24. package/.claude/skills/workflow-commands/prrun.md +2 -1
  25. package/.claude/skills/workflow-commands/retrospective.md +31 -50
  26. package/.claude/skills/workflow-commands/split-assessment.md +34 -58
  27. package/.claude/skills/workflow-commands/working-tree-hold.md +54 -71
  28. package/CLAUDE.md +7 -6
  29. package/README.md +2 -9
  30. package/dist/CLAUDE.md +7 -6
  31. package/dist/hooks/batch-guard.js +6 -6
  32. package/dist/hooks/{chunk-Y3GKIKGW.js → chunk-43ZHT22P.js} +31 -15
  33. package/dist/hooks/{chunk-MBJYQPEK.js → chunk-AS74OU3D.js} +24 -8
  34. package/dist/hooks/{chunk-3C4XRYG6.js → chunk-E7OIKX5Z.js} +17 -12
  35. package/dist/hooks/{chunk-Z4XI7CZS.js → chunk-EUMACUK2.js} +18 -12
  36. package/dist/hooks/{chunk-NO4AALP5.js → chunk-H5HVWYXK.js} +4 -4
  37. package/dist/hooks/{chunk-5C7L6FRC.js → chunk-IIGFYXKC.js} +346 -241
  38. package/dist/hooks/{chunk-W5ZKGTSY.js → chunk-J47HU5H5.js} +14 -3
  39. package/dist/hooks/{chunk-OLMO72ON.js → chunk-K4EOONYM.js} +1 -1
  40. package/dist/hooks/{chunk-LBFYEOXJ.js → chunk-K4LMBQC2.js} +4 -4
  41. package/dist/hooks/{chunk-D3NJXN5M.js → chunk-KC5AK2GF.js} +8 -6
  42. package/dist/hooks/chunk-SHGPANFB.js +56 -0
  43. package/dist/hooks/{chunk-EF5GQ6WS.js → chunk-YHBZAJSV.js} +3 -3
  44. package/dist/hooks/{chunk-SHYUQOIS.js → chunk-YYPI7SJZ.js} +5 -5
  45. package/dist/hooks/codex-hook-adapter.js +13 -13
  46. package/dist/hooks/duplicate-read-guard.js +7 -7
  47. package/dist/hooks/format-edited.js +3 -3
  48. package/dist/hooks/inputs.json +251 -247
  49. package/dist/hooks/investigation-guard.js +7 -7
  50. package/dist/hooks/pretool-guard.js +12 -12
  51. package/dist/hooks/session-lang.js +6 -5
  52. package/dist/hooks/stop-guard.js +75 -18
  53. package/dist/josh.js +6 -7
  54. package/dist/managed-marker/index.js +1 -2
  55. package/dist/version/index.js +15 -12
  56. package/eslint/base.js +2 -1
  57. package/eslint/rules/unicorn.js +16 -0
  58. package/package.json +3 -3
  59. package/prompts/coding-standards.md +12 -22
  60. package/prompts/collaboration-workflow/file-edits.md +26 -44
  61. package/prompts/collaboration-workflow/gh-rest.md +20 -36
  62. package/prompts/collaboration-workflow/glossary.md +5 -7
  63. package/prompts/collaboration-workflow/issue-citation.md +7 -13
  64. package/prompts/collaboration-workflow/issue-template.md +29 -29
  65. package/prompts/collaboration-workflow/operating-rules.md +35 -44
  66. package/prompts/collaboration-workflow/output-bounds.md +15 -15
  67. package/prompts/collaboration-workflow/overview.md +14 -19
  68. package/prompts/collaboration-workflow/plan-comment.md +13 -13
  69. package/prompts/collaboration-workflow/principles.md +50 -53
  70. package/prompts/collaboration-workflow/proposal-request.md +1 -9
  71. package/prompts/collaboration-workflow/report-format.md +32 -49
  72. package/prompts/collaboration-workflow/residency.md +10 -10
  73. package/prompts/collaboration-workflow/rule-delivery.md +9 -9
  74. package/prompts/collaboration-workflow/shell-body.md +11 -21
  75. package/prompts/collaboration-workflow/turn-batching.md +8 -14
  76. package/prompts/collaboration-workflow/upstream-interrupt.md +26 -34
  77. package/prompts/collaboration-workflow/wip-cap.md +24 -30
  78. package/prompts/collaboration-workflow.md +24 -25
  79. package/prompts/refactoring.md +33 -43
  80. package/prompts/review-rubric.md +84 -129
  81. package/prompts/review.md +111 -141
  82. package/prompts/sonar-hotspot-handling.md +22 -50
  83. package/prompts/testing-guide.md +48 -99
  84. package/scripts/adopt/adopt-toolkits.ts +2 -4
  85. package/scripts/agent/agent-exit-record.ts +23 -1
  86. package/scripts/agent/codex-agent-argv.ts +7 -2
  87. package/scripts/backlog/backlog-budget-cli.ts +1 -2
  88. package/scripts/backlog/backlog-drive-carried.ts +26 -0
  89. package/scripts/backlog/backlog-drive-cli.ts +10 -5
  90. package/scripts/backlog/backlog-drive-named.ts +2 -4
  91. package/scripts/backlog/backlog-drive-restore.ts +19 -1
  92. package/scripts/backlog/backlog-drive-seats.ts +27 -0
  93. package/scripts/backlog/backlog-drive.ts +11 -6
  94. package/scripts/backlog/backlog-ready.ts +13 -6
  95. package/scripts/behavior/behavior-rules.ts +3 -2
  96. package/scripts/cost-runtime/codex-usage.ts +4 -2
  97. package/scripts/cost-runtime/cost-cli.ts +1 -2
  98. package/scripts/delegation/investigation-guard.ts +1 -1
  99. package/scripts/delegation/investigation-reads.ts +1 -1
  100. package/scripts/discovery/repo-discovery.ts +4 -2
  101. package/scripts/discovery/repo-origin.ts +2 -4
  102. package/scripts/doctor/doctor-logic.ts +6 -3
  103. package/scripts/document/document-byte-budget.ts +27 -27
  104. package/scripts/document/document-byte-check.ts +1 -2
  105. package/scripts/document/entry-read-budget.ts +2 -2
  106. package/scripts/epic/epic-audit-rationale.ts +8 -2
  107. package/scripts/epic/epic-bundle-cli.ts +1 -2
  108. package/scripts/epic/epic-chains.ts +6 -2
  109. package/scripts/epic/epic-close-comment.ts +1 -2
  110. package/scripts/gate/verification-gate.ts +7 -2
  111. package/scripts/gh/git-pr-ai-review.ts +12 -1
  112. package/scripts/gh/git-pr-confirmation.ts +11 -7
  113. package/scripts/gh/git-pr.ts +6 -2
  114. package/scripts/git/git-common-directory.ts +3 -3
  115. package/scripts/git/git-diff-reads.ts +16 -9
  116. package/scripts/git/git-execa-error.ts +1 -2
  117. package/scripts/hooks/format-edited-file.ts +10 -4
  118. package/scripts/hooks/pre-push-unit.ts +15 -4
  119. package/scripts/hooks/pretool-guard.ts +23 -29
  120. package/scripts/hooks/step-zero-notice.ts +3 -2
  121. package/scripts/init/hook-command-rewrite.ts +6 -2
  122. package/scripts/init/init-logic-deploy-vps.ts +4 -2
  123. package/scripts/issue/behavior-change-lint.ts +12 -6
  124. package/scripts/issue/issue-scout-cli.ts +3 -2
  125. package/scripts/josh/file-map-stamp.ts +1 -3
  126. package/scripts/josh/hook-decision.ts +17 -2
  127. package/scripts/josh/josh-commands-workflow.ts +1 -1
  128. package/scripts/lane/lane-await.ts +3 -2
  129. package/scripts/lane/lane-child-invocation.ts +14 -1
  130. package/scripts/lane/lane-guard-policy.ts +4 -4
  131. package/scripts/lane/lane-ledger.ts +9 -0
  132. package/scripts/lane/lane-load.ts +9 -2
  133. package/scripts/lane/lane-measure-cli.ts +2 -0
  134. package/scripts/lane/lane-parked.ts +18 -0
  135. package/scripts/lane/lane-process-load.ts +125 -0
  136. package/scripts/lane/lane-process-stats.ts +93 -0
  137. package/scripts/lane/lane-registry.ts +8 -3
  138. package/scripts/lane/lane-session-broker.ts +29 -5
  139. package/scripts/lane/lane-spent.ts +14 -3
  140. package/scripts/lane/lane-stats.ts +1 -0
  141. package/scripts/managed-marker/managed-marker-logic.ts +1 -2
  142. package/scripts/notify/confirmation-options.ts +59 -0
  143. package/scripts/notify/notify-opt-in.ts +33 -0
  144. package/scripts/notify/telegram-notify.ts +25 -8
  145. package/scripts/notify/telegram-test-logic.ts +33 -1
  146. package/scripts/notify/telegram-test.ts +4 -2
  147. package/scripts/overrides/lockfile-overrides.ts +1 -3
  148. package/scripts/propagate/propagate.ts +1 -2
  149. package/scripts/release/release-progress.ts +3 -2
  150. package/scripts/report/report-lint.ts +7 -4
  151. package/scripts/review/review-record-cli.ts +6 -2
  152. package/scripts/rules/destructive-command.ts +6 -9
  153. package/scripts/rules/direct-filing.ts +3 -7
  154. package/scripts/rules/early-heartbeat.ts +7 -18
  155. package/scripts/rules/file-body.ts +6 -13
  156. package/scripts/rules/filing-cap.ts +3 -6
  157. package/scripts/rules/git-force.ts +5 -9
  158. package/scripts/rules/implementation-cut.ts +37 -35
  159. package/scripts/rules/index-guard.ts +4 -7
  160. package/scripts/rules/issue-comments.ts +5 -15
  161. package/scripts/rules/josh-git-bare.ts +3 -6
  162. package/scripts/rules/lane-background.ts +10 -21
  163. package/scripts/rules/lane-carry-conflict.ts +7 -17
  164. package/scripts/rules/lane-interactive-ask.ts +6 -11
  165. package/scripts/rules/lane-park.ts +5 -13
  166. package/scripts/rules/lane-split-park.ts +2 -7
  167. package/scripts/rules/lane-switch-main.ts +9 -12
  168. package/scripts/rules/oracle-consulted.ts +4 -5
  169. package/scripts/rules/piped-verification.ts +81 -31
  170. package/scripts/rules/poll-loop.ts +7 -17
  171. package/scripts/rules/pre-gate-cut.ts +7 -21
  172. package/scripts/rules/prior-comment-read.ts +7 -5
  173. package/scripts/rules/protected-files.ts +5 -9
  174. package/scripts/rules/raw-field-body.ts +3 -7
  175. package/scripts/rules/rule-body-guard.ts +4 -11
  176. package/scripts/rules/run-tail-rule.ts +6 -22
  177. package/scripts/rules/shell-body-trigger.ts +7 -8
  178. package/scripts/rules/shell-segments.ts +7 -0
  179. package/scripts/rules/stop-rules.ts +17 -29
  180. package/scripts/rules/test-declared-commit.ts +4 -10
  181. package/scripts/rules/third-party-write.ts +5 -10
  182. package/scripts/rules/worktree-guard.ts +5 -12
  183. package/scripts/run/board/run-board-github.ts +11 -3
  184. package/scripts/run/board/run-board-idle.ts +31 -0
  185. package/scripts/run/board/run-board-read.ts +9 -12
  186. package/scripts/run/board/run-board-reason.ts +7 -3
  187. package/scripts/run/board/run-board-state.ts +4 -0
  188. package/scripts/run/board/run-board-status.ts +18 -3
  189. package/scripts/run/board/run-board-thanks.ts +7 -2
  190. package/scripts/run/board/run-board-tick.ts +32 -7
  191. package/scripts/run/carry/run-carry-args.ts +1 -3
  192. package/scripts/run/carry/run-carry-conversation.ts +7 -2
  193. package/scripts/run/cut/run-cut-cli.ts +15 -20
  194. package/scripts/run/cut/run-cut-decline.ts +72 -0
  195. package/scripts/run/cut/run-cut-ready.ts +74 -0
  196. package/scripts/run/cut/run-cut-report.ts +13 -0
  197. package/scripts/run/cut/run-cut.ts +10 -1
  198. package/scripts/run/entry/run-entry-stop.ts +6 -3
  199. package/scripts/run/hold/run-hold-cli.ts +14 -3
  200. package/scripts/run/hold/run-hold.ts +6 -3
  201. package/scripts/run/merge/run-merge-cli.ts +30 -7
  202. package/scripts/run/merge/run-merge-ship.ts +59 -1
  203. package/scripts/run/merge/run-merge.ts +3 -2
  204. package/scripts/run/run-ending.ts +31 -3
  205. package/scripts/run/run-parent-cut-hook.ts +5 -10
  206. package/scripts/run/run-preflight.ts +1 -2
  207. package/scripts/run/run-stop-notify.ts +3 -2
  208. package/scripts/run/run-watcher-guard.ts +6 -3
  209. package/scripts/run/ship/run-ship-review-steps.ts +13 -4
  210. package/scripts/run/ship/run-ship-review.ts +15 -2
  211. package/scripts/run/tidy/run-tidy-cli.ts +3 -3
  212. package/scripts/run/tidy/run-tidy-lanes.ts +3 -2
  213. package/scripts/safe-chain/project-config.ts +7 -2
  214. package/scripts/sync/sync-hook-safety.ts +8 -2
  215. package/scripts/test/unit-worker-share.ts +3 -2
  216. package/scripts/time-runtime/time-batch-guard.ts +3 -3
  217. package/scripts/time-runtime/time-hook-transcript.ts +3 -2
  218. package/scripts/time-runtime/time-shell.ts +10 -0
  219. package/scripts/version/effective-upstream.ts +3 -4
  220. package/scripts/version/kit-version-config.ts +8 -2
  221. package/scripts/version/latest-corepack.ts +1 -2
  222. package/scripts/version/release-hold.ts +11 -4
  223. package/scripts/version/version-commands.ts +12 -4
  224. package/dist/hooks/chunk-UT7YC3N2.js +0 -56
@@ -13,9 +13,8 @@ point-of-use document, never an entry read, and the single source of the heartbe
13
13
  pnpm josh run:progress --wait --output <the transcript path of each delegated unit> # in the background
14
14
  ```
15
15
 
16
- **Start it once; it reports by itself.** Each silence interval appends the
17
- five labelled lines to the run's event stream as a heartbeat and to the ambient log, prints nothing to
18
- standard output and keeps running — so a scheduled report never wakes the session, and the session
16
+ **Start it once; it reports by itself.** Each silence interval appends the five labelled lines to the
17
+ event stream and the ambient log, prints nothing to standard output and keeps running — the session
19
18
  relays none. **It exits only on one of three, and the command computes which:**
20
19
 
21
20
  | Exit | What the session does |
@@ -27,22 +26,20 @@ relays none. **It exits only on one of three, and the command computes which:**
27
26
  **A report is not an exit, and neither is a decline** — with no run recorded it keeps waiting, and the
28
27
  `--hours` exit says so on standard error.
29
28
 
30
- **`pnpm josh run:watcher:guard` detects a missed restart**: wired into
31
- `pretool-guard`, it refuses the next tool call while lane children are in
32
- flight and the watcher's life record has gone stale — once per run, so the restart is not blocked.
29
+ **`pnpm josh run:watcher:guard` detects a missed restart** — via `pretool-guard` it refuses the next
30
+ tool call while lane children are in flight and the watcher's record is stale, once per run.
33
31
 
34
- **`--mark` at every real report.** Whenever the run reports something of its own, run
35
- `pnpm josh run:progress --mark` in the same turn to restart the silence clock. The clock is silence,
36
- never a timer (`docs/josh-commands-run.md` → "`josh run:progress`").
32
+ **`--mark` at every real report** — `pnpm josh run:progress --mark` in the same turn restarts the
33
+ silence clock (`docs/josh-commands-run.md` → "`josh run:progress`").
37
34
 
38
- **Do not keep a progress clock of your own** — the hook refuses the arm rather than asking
35
+ **Do not keep a progress clock of your own** — the hook refuses the arm
39
36
  (`scripts/rules/early-heartbeat.ts` → `decide`), though a single correctly-spaced arm is allowed.
40
37
  `--wait` is not a wait timer.
41
38
 
42
39
  **The default interval is twenty minutes, overridable — by the person, not the run.**
43
- `JOSH_PROGRESS_INTERVAL_MINUTES` moves both sides (the guard reads it through the watcher's reader);
44
- `josh` → `progress_interval_minutes` in `package.json` sits one step below the variable. **`--interval`
45
- moves the watcher alone** — it makes the watcher quieter than the floor, never the guard stricter.
40
+ `JOSH_PROGRESS_INTERVAL_MINUTES` moves both sides; `josh` → `progress_interval_minutes` in
41
+ `package.json` sits one step below it. **`--interval` moves the watcher alone** — quieter, never the
42
+ guard stricter.
46
43
  Rationale: `docs/maintainers/progress-watcher-rationale.md` → "Why the heartbeat reads as it does".
47
44
 
48
45
  ### What a report says
@@ -75,21 +72,19 @@ signal tiers are split this way".
75
72
  `JOSH_LANE_CHILD` mark** — it still runs `--mark` for the parent's clock, but every reporting form
76
73
  (`--wait`, `--once`, the default watch) exits at once with a notice.
77
74
 
78
- **It is started in the target repository's checkout, and `--mark` is run there too.** A heartbeat is
79
- emitted from the moment a run has started — a registered lane, a held work tree or a carried budget —
80
- even before any child carries `in-progress`; only a checkout with no run recorded stays silent.
75
+ **It is started in the target repository's checkout, and `--mark` is run there too.** It beats from the
76
+ moment a run has started — a registered lane, a held work tree or a carried budget; only a checkout
77
+ with no run recorded stays silent.
81
78
 
82
79
  **In a single-issue run, a real report is any turn that puts a progress statement in front of the
83
- person** — four of them, `--mark` run in the same turn as each: **the Step 0 work summary, the pull
84
- request opening, each review round's verdict, and any `confirmation` / `failure` / `completion`
85
- notification or stop.** **A tool result only you read is not one** — a gate run, a `gh` read, an edit.
86
- `--output` is omitted there, and `record` reads `unread`. In a `backlogrun`, a child merged, parked or
87
- stopped is the report.
88
-
89
- **A run that merges needs no teardown; a run that stops has to end the reporting itself.** A stop
90
- keeps the `in-progress` label on purpose, so **no further `--wait` is started** after the stop
91
- notification, and the running `--wait` is stopped in the same turn, since no report ends it. That
92
- covers `halfrun`'s stop before commit, a `needs-human-review` stop, a split or prerequisite stop, and a
80
+ person** — `--mark` in the same turn as each: **the Step 0 work summary, the pull request opening, each
81
+ review round's verdict, and any `confirmation` / `failure` / `completion` notification or stop.** **A
82
+ tool result only you read is not one.** `--output` is omitted there, and `record` reads `unread`. In a
83
+ `backlogrun`, a child merged, parked or stopped is the report.
84
+
85
+ **A run that merges needs no teardown; a run that stops has to end the reporting itself** — **no
86
+ further `--wait` is started** after the stop notification, and the running one is stopped in the same
87
+ turn: `halfrun`'s stop before commit, a `needs-human-review`, split or prerequisite stop, a
93
88
  `backlogrun` named issue's failure stop. Rationale: `docs/maintainers/progress-watcher-rationale.md` →
94
89
  "Why the watcher runs where it does".
95
90
 
@@ -27,7 +27,8 @@ Where `fullrun` runs `pnpm josh followup` and merges, `prrun` does three things
27
27
  follows for finishing without an agent:
28
28
  `pnpm josh notify --task-type confirmation --issue-url "<issue-url>" --body=$'prrun ready to
29
29
  merge: <pr-url>\nNext: fullrun #<N>\nAfter a manual merge, without an agent: pnpm josh followup
30
- "<title> #<N>"'`. The stop report names the same two, in the same order.
30
+ "<title> #<N>"' --recommended "fullrun #<N>" --alternative "Merge by hand, then pnpm josh
31
+ followup"`. The stop report names the same two, in the same order.
31
32
 
32
33
  **Invoking `prrun` is _not_ authorization to merge** — never run `pnpm josh followup` without
33
34
  `--no-merge` in a `prrun`. After a person merges by hand, the same `pnpm josh followup "<title> #<N>"`
@@ -1,75 +1,56 @@
1
1
  # The end-of-run retrospective
2
2
 
3
- **This is the retrospective's procedure, and it is read when `run:step` prints the retrospective step —
4
- not at the entry.** `SKILL.md` → §2's table keeps the rule itself: run what `run:step` prints once,
5
- file the improvements worth carrying into the next run, stack the rest, and mark the step done.
6
- Everything that decides *how* — what the four sections mean, how the top two are chosen, the
7
- exclusions, and the `auto-ok` judgement — is here. Read it in full, in the same turn, before filing.
3
+ **Read it when `run:step` prints the retrospective step — not at the entry.** `SKILL.md` → §2's table
4
+ keeps the rule: run what `run:step` prints once, file the improvements worth carrying, stack the rest,
5
+ mark the step done. Read this file in full, in the same turn, before filing.
8
6
 
9
- **When it fires is not this file's, and not a judgement.** The run driver prints the step the moment the
10
- backlog drains — `backlog:offer` marks that drain on the event stream and `run:step` fires the
11
- retrospective at it, *before* the idle watch, so the improvement issues it files are what the watch then
12
- picks up; a run that stops without draining — the failure guard, `--idle 0` — still prints it at the
13
- stop position. It is kit-only — `run:step` prints the step only in the kit repository.
7
+ **When it fires is not a judgement.** `run:step` prints the step when `backlog:offer` marks the backlog
8
+ drained, *before* the idle watch, so the watch picks up what it files; a run that stops without
9
+ draining — the failure guard, `--idle 0` — still prints it at the stop position. Kit-only.
14
10
 
15
11
  Rationale: `docs/maintainers/retrospective-rationale.md` → "Why the retrospective is read at its step";
16
12
  provenance: `docs/maintainers/retrospective-rationale.md` → "Where each rule came from".
17
13
 
18
14
  ## The digest is read, not skimmed
19
15
 
20
- The command `run:step` prints folds four measurements that already exist into one digest — it adds no
21
- new measurement (the observation-filing rule against readerless numbers). Read each section for what it
22
- is for:
16
+ The command `run:step` prints folds four existing measurements into one digest — it adds none:
23
17
 
24
- - **Run cost & time by role.** A role whose share of the wall clock runs ahead of its share of the cost
25
- is marked `waiting-heavy` — the run spent that time waiting rather than working. That gap is a
26
- candidate improvement, not a verdict: a role that waits by design is not a defect.
27
- - **Recurring review findings.** A category that keeps coming back across rounds is friction in the
28
- code or the rules the reviews keep catching; the zero-finding denominator tells a genuinely quiet
29
- category apart from one nobody looked at.
30
- - **Observation ledger.** How many observations are already held without being filed — a reminder to
31
- promote one a second sighting has now earned, rather than a fresh finding.
32
- - **Run events.** The parks, outages, cuts and review rounds the run hit — where it did not run
33
- straight through.
18
+ - **Run cost & time by role.** A role whose wall-clock share runs ahead of its cost share is marked
19
+ `waiting-heavy` — a candidate improvement, not a verdict: some roles wait by design.
20
+ - **Recurring review findings.** A category that keeps coming back is friction the reviews keep
21
+ catching; the zero-finding denominator separates a quiet category from an unexamined one.
22
+ - **Observation ledger.** Observations held without being filed — promote one a second sighting earned.
23
+ - **Run events.** The parks, outages, cuts and review rounds — where the run did not run straight through.
34
24
 
35
- The digest closes by pointing back here; the two targets it names are **the run itself** (the first,
36
- third and fourth sections) and **the repository** (the second, and anything the run surfaced that lives
37
- outside it).
25
+ The two targets are **the run itself** (sections one, three, four) and **the repository** (section two,
26
+ and anything the run surfaced that lives outside it).
38
27
 
39
28
  ## What to file, and how the top two are chosen
40
29
 
41
- **The filing condition is the existing depth test, unchanged** — a filing cites the product work it
42
- improves, and a `depth:2` finding names which decision it turns on (`observation-filing.md` → "The depth
43
- test"). An improvement that cannot pass the test is not filed; it is not a shortfall of the two-item
44
- count, it simply is not yet a finding.
30
+ **The filing condition is the existing depth test, unchanged** (`observation-filing.md` → "The depth
31
+ test"). What cannot pass it is not filed — not a shortfall, just not yet a finding.
45
32
 
46
33
  **Order what passes by effect, and file the top two.** **The third onward is stacked in the observation
47
- ledger**, on the same append path `pnpm josh observations:flush` already drains. **File nothing when
48
- nothing passes** — a run whose measurements show no improvement worth carrying files zero Issues.
34
+ ledger** (drained by `pnpm josh observations:flush`). **File nothing when nothing passes.**
49
35
  `docs/maintainers/retrospective-rationale.md` → "Why the top two are a selection, not a ration".
50
36
 
51
- **Exclude what is already filed or already done, through the existing scout** (`issue-scout.md`). File
52
- each with `pnpm josh issue:file`, which runs the scout before creating anything: an **open** candidate
53
- covering the same work means do not file it, and a `(closed)` candidate covering it means the work is
54
- already merged. Neither exclusion is a new mechanism. The same call runs `epic:bundle` on each new
55
- Issue, as after any filing.
37
+ **Exclude what is already filed or already done, through the existing scout** (`issue-scout.md`): file
38
+ with `pnpm josh issue:file`, which scouts first — an **open** candidate covering it means do not file, a
39
+ `(closed)` one means already merged. It also runs `epic:bundle` on each new Issue.
56
40
 
57
41
  ## `auto-ok`, and closing the step
58
42
 
59
- **What a retrospective files is judged for `auto-ok`** — an improvement that needs no person's
60
- judgement declares `- 人の判断: 不要`, so `issue:file` applies the label (with the run label `prompts/collaboration-workflow/issue-template.md` requires) and the next run picks it up
61
- without waiting for a person. **`backlogrun-steps.md` → "What one invocation approves" is that
62
- judgement's single source**; it is written there, beside the brakes that bound it, rather than restated here. Every brake still counts a retrospective's filings: the
43
+ **What a retrospective files is judged for `auto-ok`** — one needing no person's judgement declares
44
+ `- 人の判断: 不要`, so `issue:file` applies the label (with the run label
45
+ `prompts/collaboration-workflow/issue-template.md` requires). **`backlogrun-steps.md` → "What one
46
+ invocation approves" is that judgement's single source.** Every brake still counts these filings: the
63
47
  ten-per-invocation ceiling, the WIP cap, `--max` and the 150,000-token session budget.
64
48
 
65
49
  **Close with `pnpm josh run:carry --retrospective --summary "<result>" --owner "$PPID"`.** It marks the
66
- retrospective run on the carry record, so `run:step` prints `stop` from then on rather than the step a
67
- second time. The mark rides the record across a session cut and is removed with the record at
68
- `pnpm josh run:carry --end`, so one invocation runs the retrospective exactly once whether or not it was
69
- cut. **`--summary` is required** — the same close writes it as one `retrospective` event on the event
70
- stream, so a zero-filing retrospective differs from one that never ran; name
71
- the issues filed (or that none were) and the candidates dropped with why.
50
+ carry record so `run:step` prints `stop` from then on; the mark survives a session cut and is removed at
51
+ `pnpm josh run:carry --end`, so one invocation runs it exactly once. **`--summary` is required** — it is
52
+ written as a `retrospective` event, so a zero-filing retrospective differs from one that never ran; name
53
+ the issues filed (or none) and the candidates dropped with why.
72
54
 
73
- **A dispatched lane child never reaches any of this** — the batch runs the retrospective at its own end,
74
- never a child's, exactly as it asks `release:scope` once at the batch's end. `run:step` already answers
75
- `stop` for a lane child at the stop position, so a child never prints the step to begin with.
55
+ **A dispatched lane child never reaches any of this** — the batch runs it at its own end; `run:step`
56
+ answers `stop` for a lane child at the stop position.
@@ -1,52 +1,43 @@
1
1
  # The split assessment — one definition, every entry point
2
2
 
3
- Before any entry point starts work on an Issue, decide whether the request is really **one**
4
- deliverable or several. This file is the single definition; every command applies it identically.
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".
5
7
 
6
8
  ## The question
7
9
 
8
- **The default is not to split.** Two questions have to answer yes **together**; either one alone
9
- leaves the work as one Issue:
10
+ **The default is not to split.** Two questions have to answer yes **together**:
10
11
 
11
12
  1. **Does the request contain two or more deliverables that could each be merged separately?**
12
13
  2. **Does the whole of it clearly exceed what one verification gate can confirm in one pass?** The
13
14
  guide is **about 10 changed files and about 400 changed lines** (test files excluded).
14
15
  Under that, it is one Issue however many separable pieces a reader can name inside it.
15
16
 
16
- Separately mergeable is still the first test, and it is unchanged: a change that must land in one
17
- commit to be correct is one deliverable however big it is. What changed is that **separability alone
18
- no longer splits anything** — it is now a necessary condition rather than a sufficient one.
19
-
20
- **The guide is a guide, and "clearly" is the operative word.** A run that has to argue itself past the
21
- numbers has already answered no. They are read against the whole request's estimate, not against the
22
- diff a first pass happens to produce, and a request that lands at 11 files is not thereby a split.
17
+ A change that must land in one commit to be correct is one deliverable however big it is; **separability
18
+ alone no longer splits anything**. **"Clearly" is the operative word** — a run that has to argue past
19
+ the numbers has answered no. They are read against the whole request's estimate, and 11 files is not
20
+ thereby a split.
23
21
 
24
22
  ## The same two questions decide the filing-time fold
25
23
 
26
24
  **The entry's split decision and the filing-time fold decision are the same two conditions, stated
27
- here once.** This assessment asks whether *one request* is several deliverables; the fold decision asks
28
- whether *several findings from one session* are one Issue — and reads the **same two questions in the
29
- same conjunction**: separability, and whether the whole clearly exceeds one gate.
30
- `pnpm josh issue:fold "<title>" …` answers `fold` / `separate` / `no-fold-needed`; its size half is
31
- `pnpm josh split:assess`, called not recomputed, and `separate` needs both halves exactly as `split`
32
- does. A diff with no non-test file, or none readable, answers `undetermined`: the size is then the
33
- whole request's estimate above. **There is no second criterion.** `observation-filing.md`'s observation, the review round cap's branch 2 and `prerequisite.md`'s
25
+ here once** — the fold asks whether *several findings from one session* are one Issue, with the same
26
+ conjunction. `pnpm josh issue:fold "<title>" …` answers `fold` / `separate` / `no-fold-needed`; its size
27
+ half is `pnpm josh split:assess`, called not recomputed. A diff with no readable non-test file answers
28
+ `undetermined`, and the size is the request's estimate. **There is no second criterion.**
29
+ `observation-filing.md`'s observation, the review round cap's branch 2 and `prerequisite.md`'s
34
30
  prerequisite each route a second filing through it — `pnpm josh issue:file` asks it itself at the
35
31
  run's second filing, never the first, and holds only a `fold`.
36
32
 
37
33
  ## Diff size is not a reason to split, and that is measured
38
34
 
39
- **Size is a bar a split has to clear; it is never a reason to split.** Question 2 is a *minimum* — below
40
- it the work stays whole — and nothing makes a large diff a reason to divide one. **A proposal to add a
41
- size threshold that splits more is required to say why the round-1 measurement does not reach it.**
42
- Rationale: `docs/maintainers/split-assessment-rationale.md` → "Why the default is not to split" and
43
- `docs/maintainers/split-assessment-rationale.md` → "Why diff size is not a reason to split".
35
+ **Size is a bar a split has to clear; it is never a reason to split.** **A proposal to add a size
36
+ threshold that splits more is required to say why the round-1 measurement does not reach it.**
44
37
 
45
- **The size half is measured, not eyeballed — `pnpm josh split:assess`.** It counts the branch's
46
- changed files and changed lines with test files excluded and answers `split` / `single` on size
47
- alone, so the guide can be checked against real diffs after the fact rather than trusted from an
48
- estimate. It answers the **size** question only; separability (question 1) stays a judgement, which is
49
- why a `split` from this command is the size condition met, not a decision to divide the Issue.
38
+ **The size half is measured, not eyeballed — `pnpm josh split:assess`** counts the branch's changed
39
+ files and lines, test files excluded, and answers `split` / `single` on size alone. Separability stays
40
+ a judgement, so its `split` is the size condition met, not a decision to divide.
50
41
 
51
42
  ## What each entry point does with the answer
52
43
 
@@ -59,26 +50,19 @@ why a `split` from this command is the size condition met, not a decision to div
59
50
 
60
51
  ## A prerequisite is not a split
61
52
 
62
- "This needs something else done first" is a different answer from "this is really several things". A
63
- split means the request in hand contains two or more deliverables; a prerequisite means it is still
64
- **one** deliverable that has another one in front of it. The prerequisite rule is `prerequisite.md`, its
65
- single source; each entry's own branch is in `backlogrun-park.md` → "A prerequisite discovered mid-run" and, for
66
- the stopping entry points, in `fullrun.md` / `halfrun.md`.
53
+ A split means the request contains several deliverables; a prerequisite means it is **one** deliverable
54
+ with another in front of it. `prerequisite.md` is the single source; each entry's branch is in
55
+ `backlogrun-park.md` → "A prerequisite discovered mid-run" and `fullrun.md` / `halfrun.md`.
67
56
 
68
57
  ## Two or more always means an epic
69
58
 
70
59
  **Splitting into two or more Issues always creates an epic. There is no count threshold and no ordering
71
- condition to evaluate.** This is about what follows a split, never about whether to make one — the bar
72
- for that is "The question" above. **An entry point that applies a different condition is a defect** —
73
- the whole point of one definition is that where the split was noticed cannot change what happens next.
74
-
75
- The epic is the non-closing home for the split rationale. A comment on the first child is buried the
76
- moment that child merges and closes.
60
+ condition to evaluate.** **An entry point that applies a different condition is a defect.** The epic
61
+ is the non-closing home for the split rationale.
77
62
 
78
63
  **Each split child is filed with the `route:split` label** —
79
- `pnpm josh issue:file "<sub-title>" --body-file <body-file> --depth <n> --route split` — so the
80
- backlog's composition stays countable by filing route rather than by grepping issue bodies. Each child
81
- is judged for `auto-ok` like any filing (`kickoff.md` → "Words typed after `new`").
64
+ `pnpm josh issue:file "<sub-title>" --body-file <body-file> --depth <n> --route split` — and judged for
65
+ `auto-ok` like any filing (`kickoff.md` → "Words typed after `new`").
82
66
 
83
67
  ## Promote, or create a new epic
84
68
 
@@ -87,33 +71,25 @@ on the Issue, without asking.
87
71
 
88
72
  - **`#N` is a request, a discussion, or a container → promote it.**
89
73
  `pnpm josh epic --promote <N> <N1> <N2> ... [--ordered]`. The body is appended to, never replaced.
90
- - **`#N` is itself one of the deliverables → keep `#N` as a child and create a new epic.** A bug report
91
- that turns out to need three fixes is the case: promoting the report would leave the report itself
92
- with nowhere to live.
74
+ - **`#N` is itself one of the deliverables → keep `#N` as a child and create a new epic** — e.g. a bug
75
+ report that needs three fixes.
93
76
 
94
77
  ## `backlogrun` is the one entry that does not stop
95
78
 
96
- `backlogrun` asked for the batch's authorization, so a split found under it is filed and continued through
97
- rather than stopped — including when the `backlogrun` was given a bare, non-epic Issue, where the split is
98
- what creates the epic (`backlogrun-child.md` → "When `#N` is not an epic"). The assessment itself is identical;
99
- only what follows the answer differs.
79
+ A split found under `backlogrun` is filed and continued through — including from a bare, non-epic
80
+ Issue, where the split creates the epic (`backlogrun-child.md` → "When `#N` is not an epic").
100
81
 
101
82
  ## Finding a split mid-run stops the run
102
83
 
103
- `fullrun` and `halfrun` **stop** after filing the children and the epic. They do not continue into
104
- implementation, and they do not silently become a `backlogrun`. Typing `fullrun` approved implementing and
105
- merging **one** Issue; a batch of N is a different authorization. Report what was filed and end with:
84
+ `fullrun` and `halfrun` **stop** after filing the children and the epic — typing `fullrun` approved
85
+ **one** Issue. Report what was filed and end with:
106
86
 
107
87
  > Please run `backlogrun #<E> --only` to execute this epic.
108
88
 
109
89
  ## There is no `kickoff epic`
110
90
 
111
- A separate keyword for "split this conversation into an epic" would duplicate `kickoff new` exactly,
112
- leaving a person to decide which of two commands to type for one job. The assessment above is how a
113
- split is reached from every entry.
91
+ It would duplicate `kickoff new`; the assessment above reaches a split from every entry.
114
92
 
115
93
  ## Issues filed separately, found related later
116
94
 
117
- Issues that were filed at different times and turn out to be related afterwards are **not** a split — a
118
- split is about one request in hand containing several deliverables. That case is outside this
119
- assessment, and `pnpm josh epic --promote` is what handles it.
95
+ Not a split — `pnpm josh epic --promote` handles it.
@@ -3,10 +3,9 @@
3
3
  **The single source of the hold**, read at its point of use — the moment a run is about to claim or
4
4
  release the tree. History: `docs/maintainers/working-tree-hold-rationale.md` → "Where each rule came from".
5
5
 
6
- **Ask `pnpm josh run:hold` before anything else, and obey what it answers.** It is the first call of
7
- `fullrun` and `halfrun` alike — before the title is normalized, before `pnpm josh ms`, and **before
8
- a `new` entry files its Issue**, because a run stopped after the filing has already left behind the
9
- artifact it should not have created.
6
+ **Ask `pnpm josh run:hold` before anything else, and obey what it answers** — the first call of
7
+ `fullrun` and `halfrun`, before the title, before `pnpm josh ms`, and **before a `new` entry files its
8
+ Issue**.
10
9
 
11
10
  ```bash
12
11
  pnpm josh run:hold <N> # a `#N` entry point
@@ -17,81 +16,65 @@ pnpm josh run:release --force # a record left behind by a run that has ended
17
16
  ```
18
17
 
19
18
  - **`hold` — this run now holds the tree. Continue.**
20
- - **`busy` — another run holds it. Stop.** Send a `confirmation` Telegram carrying what the command
21
- printed on stderr (the holder, when the record was written, and the release command) and stop.
22
- **File nothing, create no branch, edit nothing.**
19
+ - **`busy` — another run holds it. Stop.** Send a `confirmation` Telegram carrying its stderr (the
20
+ holder, when the record was written, the release command). **File nothing, create no branch, edit
21
+ nothing.**
23
22
  - **`unknown` — nothing was established. Stop the same way.** It is not "the tree is free".
24
23
 
25
24
  **The unit is the working tree** — one branch, one index and one uncommitted diff, and a linked work
26
- tree has its own three. **`backlogrun`'s per-repository guard (`epic-busy.ts`) is a separate layer and is
27
- unchanged.**
28
-
29
- **`kickoff` does not claim it** — it touches GitHub, never the branch, index or diff. Rationale for both:
30
- `docs/maintainers/working-tree-hold-rationale.md` → "Why the unit is the working tree".
31
-
32
- **Claim it in the checkout the run will edit.** The record is keyed to the work tree the command runs
33
- in, so a cross-repository `fullrun owner/repo#N` resolves that repository's checkout from `pnpm josh
34
- doctor` **first** — that resolution is a read and writes nothing — and claims there.
35
-
36
- **A release names the run it belongs to.** `pnpm josh run:release <N>` removes the record only where the
37
- record names `<N>`, the bare form only the unnumbered run's, and a record belonging to anything else
38
- answers **`held`** and is left standing. **`pnpm josh run:release --force` is the one spelling that
39
- removes a record this run did not write**, and the `busy` stop message names it rather than the
40
- ordinary one.
41
-
42
- **Release what the claim recorded, which is not always the Issue number.** A `#N` entry claimed `<N>`
43
- and releases `<N>`; a **`new` entry claimed before its Issue existed**, so it releases with the
44
- **bare** form however many numbers the run has acquired since — so a `fullrun new` that stops on a
45
- split types `pnpm josh run:release`, not `pnpm josh run:release <N>`. The bare form removes no
46
- label, so every `new` stop that releases — a split, a prerequisite or a third-party target — also runs `gh api -X DELETE repos/{owner}/{repo}/issues/<N>/labels/in-progress
47
- 2>/dev/null || true`.
48
-
49
- **Releasing is the run's, not a person's memory.** `pnpm josh followup` releases the hold on a merged
50
- run, and a record abandoned by a crashed session expires after 8 hours. **A stop that leaves the tree
51
- clean releases it explicitly**: a `fullrun` / `halfrun` that stops on a split, a prerequisite or a
52
- third-party target ends with `pnpm josh run:release <N>` (bare where that run entered as `new`, followed by the label DELETE above).
53
- **`halfrun`'s stop before commit keeps the hold**, and so does a `needs-human-review` stop: the
54
- uncommitted work still in the tree is exactly what a second run would trample, so the release command
55
- goes in the stop report and the Telegram for the person to type. **`fullrun #<N>` of the same issue
56
- adopts a `halfrun`'s kept hold** rather than being refused `busy` by it — "The halfrun resume" below. **An expired record over a tree that
57
- still has uncommitted changes does not free it**: the command answers `busy` and says to commit, stash,
58
- or release once the work is done; only an expired record over a clean tree is replaced.
59
-
60
- **The batch entry points claim per child, not per batch.** `backlogrun` never
61
- call it themselves; each child runs the `fullrun` procedure, so it claims on entry and `pnpm josh
62
- followup` releases it at that child's merge. The command's behavior and the answer table are
63
- `docs/josh-commands-run.md` → "`josh run:hold` / `josh run:release`"; this file is the single source of
64
- the procedure.
25
+ 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").
28
+
29
+ **Claim it in the checkout the run will edit** — a cross-repository `fullrun owner/repo#N` resolves
30
+ that checkout from `pnpm josh doctor` **first** (a read) and claims there.
31
+
32
+ **A release names the run it belongs to.** `pnpm josh run:release <N>` removes only a record naming
33
+ `<N>`, the bare form only the unnumbered run's; anything else answers **`held`** and stands. **`pnpm
34
+ josh run:release --force` is the one spelling that removes a record this run did not write**, and the
35
+ `busy` message names it.
36
+
37
+ **Release what the claim recorded.** A `#N` entry releases `<N>`; a **`new` entry claimed before its
38
+ Issue existed**, so it releases with the **bare** form — a `fullrun new` that stops on a split types
39
+ `pnpm josh run:release`. The bare form removes no label, so every `new` stop that releases also runs
40
+ `gh api -X DELETE repos/{owner}/{repo}/issues/<N>/labels/in-progress 2>/dev/null || true`.
41
+
42
+ **Releasing is the run's, not a person's memory.** `pnpm josh followup` releases on a merged run; an
43
+ abandoned record expires after 8 hours. **A stop that leaves the tree clean releases it explicitly** —
44
+ a split, a prerequisite or a third-party target ends with `pnpm josh run:release <N>` (bare for a `new`
45
+ entry, plus the label DELETE). **`halfrun`'s stop before commit keeps the hold**, as does a
46
+ `needs-human-review` stop: the release command goes in the stop report and the Telegram for the person
47
+ to type. **`fullrun #<N>` of the same issue adopts a `halfrun`'s kept hold** — "The halfrun resume"
48
+ below. **An expired record over a tree that still has uncommitted changes does not free it** — it
49
+ answers `busy`; only an expired record over a clean tree is replaced.
50
+
51
+ **The batch entry points claim per child, not per batch** — each `backlogrun` child claims on entry and
52
+ `pnpm josh followup` releases at its merge. The answer table is `docs/josh-commands-run.md` → "`josh
53
+ run:hold` / `josh run:release`".
65
54
 
66
55
  ## The halfrun resume
67
56
 
68
- **`fullrun #<N>` or `prrun #<N>` after a `halfrun` stop resumes it instead of claiming.** The
69
- stop is **recorded, never inferred**: the `halfrun` ends with `pnpm josh run:hold <N> --halfrun-stop`,
70
- which marks its own record (re-keying a `halfrun new`'s unnumbered one to the filed issue) — a
71
- `halfrun` still implementing or a `backlogrun` child leaves the same hold over the same dirty tree, and
72
- must not be adopted. On a marked hold for `#<N>` over a dirty tree, `run:entry` asks the session budget
73
- (`over` stops as usual), adopts the hold with the `fullrun` mark and prints `entry #<N> — resume:
74
- halfrun`. **Skip the title, the plan, the split assessment, `pnpm josh ms`,
75
- `latest:scope` and the implementation**: the diff in the tree is what the person verified. Re-read the
76
- issue (`pnpm josh issue:read <N>`), then run the gate **in full** from the refactor (`chain-rule.md` →
77
- "Run the review-to-merge chain") — a fix made during the manual check has had no gate — and ship as
78
- any `fullrun` does.
57
+ **`fullrun #<N>` or `prrun #<N>` after a `halfrun` stop resumes it instead of claiming.** The stop is
58
+ **recorded, never inferred**: the `halfrun` ends with `pnpm josh run:hold <N> --halfrun-stop`, marking
59
+ its record (re-keying a `halfrun new`'s unnumbered one) — a `halfrun` still implementing or a
60
+ `backlogrun` child leaves the same dirty tree and is not adopted. On a marked hold for `#<N>`,
61
+ `run:entry` asks the session budget, adopts the hold and prints `entry #<N> — resume: halfrun`. **Skip
62
+ the title, the plan, the split assessment, `pnpm josh ms`, `latest:scope` and the implementation**;
63
+ re-read the issue (`pnpm josh issue:read <N>`), run the gate **in full** from the refactor
64
+ (`chain-rule.md` → "Run the review-to-merge chain"), and ship as any `fullrun` does.
79
65
 
80
66
  ## The prrun resume
81
67
 
82
- **`fullrun #<N>` after a `prrun` stop resumes it the same way.** The `prrun`
83
- ends with `pnpm josh run:hold <N> --prrun-stop`, which writes the commit its pull request is on into its
84
- own record; only a record carrying that commit is adopted. `run:entry` asks the session budget, adopts
85
- the hold with the `fullrun` mark and prints one of three tokens — read, never inferred:
86
-
87
- - **`resume: prrun-merged`** — a person merged the pull request. Run `pnpm josh followup "<title>
88
- #<N>"` alone: it detects the merge and runs only the post-merge tail.
89
- - **`resume: prrun-merge`** — the branch is still on the stop's commit, both here and on the pull
90
- request, and the tree is clean, so what was verified is what would merge. Skip the gate and the
91
- review; run `pnpm josh followup` to merge.
92
- - **`resume: prrun-gate`** — the branch moved (locally, or by a push made on GitHub), its pull request
93
- could not be read, or the tree is dirty: a person changed something. Run the
94
- gate **in full** and the review (`chain-rule.md` → "Run the review-to-merge chain"), then ship as any
95
- `fullrun` does.
68
+ **`fullrun #<N>` after a `prrun` stop resumes it the same way.** The `prrun` ends with `pnpm josh
69
+ run:hold <N> --prrun-stop`, which records its pull request's commit; only a record carrying it is
70
+ adopted. `run:entry` prints one of three tokens — read, never inferred:
71
+
72
+ - **`resume: prrun-merged`** — a person merged it. Run `pnpm josh followup "<title> #<N>"` alone; it
73
+ runs only the post-merge tail.
74
+ - **`resume: prrun-merge`** — branch and pull request still on the stop's commit, tree clean. Skip the
75
+ gate and the review; run `pnpm josh followup` to merge.
76
+ - **`resume: prrun-gate`** — the branch moved, its pull request could not be read, or the tree is
77
+ dirty. Run the gate **in full** and the review (`chain-rule.md` → "Run the review-to-merge chain"),
78
+ then ship.
96
79
 
97
80
  All three skip the title, the plan, the split assessment and the implementation.
package/CLAUDE.md CHANGED
@@ -7,13 +7,14 @@ Stack: TypeScript · pnpm · SvelteKit · Vitest · Playwright · TailwindCSS ·
7
7
  ## Communication
8
8
 
9
9
  - **Answer opinion-seeking questions from a neutral standpoint.** A leading question is not a cue to agree — recommend the option you genuinely judge best.
10
- - **Fix root causes, not symptoms.** Where the proper fix is out of scope, surface the root cause instead of papering over it.
10
+ - **Fix root causes, not symptoms.** Where the proper fix is out of scope, surface it instead of papering over it.
11
11
  - **Cross-package problems → file the upstream Issue, then stop.** A defect in another package (a dependency, or `josh` / kit tooling) is never worked around locally — **weakening a verification gate is a workaround too**. File it (first-party Tier A, third-party Tier C) and stop. `prompts/collaboration-workflow/upstream-interrupt.md`. Your own repository's run tooling is not another package: `upstream-interrupt.md` → "実行中のリポジトリ自身のラン機構の不具合".
12
12
  - **Third-party repositories are Tier C.** Decide the party with `pnpm josh repo:party`; every write to a tracker we do not own needs explicit current-turn instruction. `prompts/collaboration-workflow/upstream-interrupt.md`.
13
13
  - **No clones — single-source, even across package boundaries.** Duplicate non-trivial logic only after presenting the alternative and getting explicit approval. `prompts/collaboration-workflow/principles.md` → "no-clones".
14
14
  - **Design for elegance and simplicity first.** Before adding a hook, guard, rule or abstraction, ask whether fixing the cause makes it unnecessary. `prompts/collaboration-workflow/principles.md` → "elegant-design"; conflicting quality goals → "quality-priority".
15
+ - **Write concise prose: conditions and actions only.** `prompts/collaboration-workflow/principles.md` → "concise-prose".
15
16
  - **Distinguish consultation from execution.** A question or goal statement asks for analysis only — act on an explicit imperative or a workflow keyword. `prompts/collaboration-workflow/principles.md` → "consult-vs-execute".
16
- - **Route distributed-doc / config changes upstream to kit.** In a consumer repo never edit kit-distributed docs/config (`josh sync` overwrites them); in kit you are the source. `prompts/collaboration-workflow/principles.md` → "upstream-to-kit".
17
+ - **Route distributed-doc / config changes upstream to kit.** In a consumer repo never edit kit-distributed docs/config; in kit you are the source. `prompts/collaboration-workflow/principles.md` → "upstream-to-kit".
17
18
  - **Latest-first, fix forward — pin back only as a last resort.** `prompts/collaboration-workflow/principles.md` → "latest-first".
18
19
  - **Output language follows `JOSH_SESSION_LANG`** (default `ja`) for session output and artifact prose; English for Issue/PR titles, code comments, test titles, commit messages and script strings. `prompts/collaboration-workflow/overview.md`.
19
20
  - **Durable rules belong in prompts/docs, not local MEMORY.** `prompts/collaboration-workflow/principles.md` → "durable-rules".
@@ -31,16 +32,16 @@ Log auto-decisions: an Issue comment in an Issue workflow, else a one-line "Auto
31
32
 
32
33
  ## Critical Conventions (non-standard — always apply)
33
34
 
34
- Naming, exports, file names and content rules are enforced by `eslint/rules/`; their single source is `prompts/coding-standards.md` → "Conventions". `function` syntax, not arrows (named SvelteKit route handlers may use the typed-const arrow idiom) — lint does not check it.
35
+ Naming, exports, file names and content rules are enforced by `eslint/rules/`; their single source is `prompts/coding-standards.md` → "Conventions". `function` syntax, not arrows (named SvelteKit route handlers may use typed-const arrows); lint does not check it.
35
36
 
36
37
  ### Quality limits
37
38
 
38
- - Function complexity ≤5 · nesting ≤2 · function ≤25 lines · file ≤300 lines · params ≤4 · statements per function ≤10 · cognitive complexity ≤4 — line counts are code lines, not physical lines (`pnpm josh lint`); test files allow 35 code lines per function.
39
+ - Function complexity ≤5 · nesting ≤2 · function ≤25 lines · file ≤300 lines · params ≤4 · statements per function ≤10 · cognitive complexity ≤4 — line counts are code lines, not physical lines; test functions allow 35 code lines.
39
40
  - No magic numbers beyond `0`, `1`, `-1` · no `any` · restricted `as` · explicit param and return types · single short early return → one-liner `if (x) return y`.
40
41
 
41
42
  ## Package-First Development
42
43
 
43
- Before building a feature, check for a well-maintained package — measure with `pnpm josh pkg:scout <keywords>`: `clear` → select it (Tier A), `close` → ask (Tier B).
44
+ Before building a feature, run `pnpm josh pkg:scout <keywords>`: `clear` → use it (Tier A), `close` → ask (Tier B).
44
45
 
45
46
  ## Code Change Rules
46
47
 
@@ -82,5 +83,5 @@ Never start a `kickoff` / `halfrun` / `prrun` / `fullrun` / `backlogrun` workflo
82
83
  Before pausing **any** run for the user — a command's stop, an upstream-Issue interrupt, a Tier C confirmation — send once per stop (skip when the user asked for the stop this turn):
83
84
 
84
85
  ```bash
85
- pnpm josh notify --task-type confirmation --issue-url "<issue-url>" --body=$'<one-line reason>\n<what is needed from the user>'
86
+ pnpm josh notify --task-type confirmation --issue-url "<url>" --body=$'<reason>' --recommended "<choice>" --alternative "<other>"
86
87
  ```
package/README.md CHANGED
@@ -39,7 +39,7 @@ Next: [tutorial](./docs/tutorial.md)
39
39
 
40
40
  #### Your first backlogrun
41
41
 
42
- Tell the agent the change you want, then type `kickoff new` to it. The Issue gets the `auto-ok` label when it needs no judgement from you (or add the label to an existing Issue).
42
+ File Issues with `kickoff new`, then run:
43
43
 
44
44
  ```bash
45
45
  pnpm josh backlogrun
@@ -59,14 +59,7 @@ Next: [tutorial](./docs/tutorial.md#without-github-one-change-checked-locally)
59
59
 
60
60
  ### Adding kit to an existing project
61
61
 
62
- - **Files written:** settings per profile, including Prettier — always on `full`, and on `basic` only when the project has web files and no formatter of its own ([per profile](./docs/init.md#project-profiles)); `--dry-run` previews them.
63
- - **Overwritten by `josh sync`:** the managed files, such as `.github/workflows/ci.yml` and `AGENTS.md` ([the list](./docs/sync.md#ai-files-overwritten)).
64
- - **Permissions:** the Claude Code settings kit writes (with `josh start`, or on `full`) set `bypassPermissions` with `Bash(*)`, guarded by a deny list and a hook ([how to opt out](./docs/init.md#claude-code-permission-mode)).
65
- - **On GitHub:** `josh start` adds labels, and on an existing `main` an Issue and a setup PR that you merge yourself ([the steps](./docs/init.md#josh-init-or-josh-start)).
66
-
67
- ## Claude Code in a fresh-machine run
68
-
69
- A `josh fresh:run` scenario that runs Claude Code needs a sign-in saved once with `pnpm josh auth:setup` ([steps](./docs/maintainers/fresh-machine.md#claude-code)).
62
+ Check first: [what kit changes in your project](./docs/how-to/add-kit.md#what-kit-changes-in-your-project)
70
63
 
71
64
  ## Docs
72
65