@joshuafolkken/kit 1.1136.0 → 1.1178.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 (200) hide show
  1. package/.claude/settings.json +4 -4
  2. package/.claude/skills/epic-commands/SKILL.md +27 -239
  3. package/.claude/skills/epic-commands/epic-bundle.md +115 -0
  4. package/.claude/skills/epic-commands/execution-waves.md +126 -0
  5. package/.claude/skills/workflow-commands/SKILL.md +48 -194
  6. package/.claude/skills/workflow-commands/background-commands.md +1 -1
  7. package/.claude/skills/workflow-commands/backlogrun-child.md +12 -123
  8. package/.claude/skills/workflow-commands/backlogrun-lanes.md +14 -63
  9. package/.claude/skills/workflow-commands/backlogrun-park.md +16 -15
  10. package/.claude/skills/workflow-commands/backlogrun-progress.md +17 -173
  11. package/.claude/skills/workflow-commands/backlogrun-recovery.md +155 -0
  12. package/.claude/skills/workflow-commands/backlogrun-steps.md +65 -144
  13. package/.claude/skills/workflow-commands/backlogrun.md +5 -4
  14. package/.claude/skills/workflow-commands/chain-rule.md +3 -2
  15. package/.claude/skills/workflow-commands/delegation.md +2 -2
  16. package/.claude/skills/workflow-commands/entry-sequence.md +62 -0
  17. package/.claude/skills/workflow-commands/followup.md +104 -181
  18. package/.claude/skills/workflow-commands/fullrun-steps.md +8 -9
  19. package/.claude/skills/workflow-commands/fullrun.md +16 -73
  20. package/.claude/skills/workflow-commands/halfrun.md +10 -36
  21. package/.claude/skills/workflow-commands/into-target.md +4 -4
  22. package/.claude/skills/workflow-commands/issue-comments.md +7 -8
  23. package/.claude/skills/workflow-commands/issue-scout.md +6 -6
  24. package/.claude/skills/workflow-commands/kickoff.md +6 -6
  25. package/.claude/skills/workflow-commands/needs-human-review.md +6 -6
  26. package/.claude/skills/workflow-commands/observation-filing.md +21 -172
  27. package/.claude/skills/workflow-commands/observation-ledger.md +150 -0
  28. package/.claude/skills/workflow-commands/pre-gate-cut.md +35 -95
  29. package/.claude/skills/workflow-commands/prerequisite.md +6 -6
  30. package/.claude/skills/workflow-commands/progress-watcher.md +90 -0
  31. package/.claude/skills/workflow-commands/prrun.md +5 -5
  32. package/.claude/skills/workflow-commands/retrospective.md +9 -9
  33. package/.claude/skills/workflow-commands/split-assessment.md +2 -2
  34. package/.claude/skills/workflow-commands/target-repository.md +2 -2
  35. package/.claude/skills/workflow-commands/working-tree-hold.md +7 -5
  36. package/.codex/hooks.json +4 -4
  37. package/.github/workflows/ci.yml +15 -2
  38. package/AGENTS.md +1 -6
  39. package/CLAUDE.md +58 -120
  40. package/GEMINI.md +1 -6
  41. package/dist/CLAUDE.md +58 -120
  42. package/dist/hooks/batch-guard.js +4 -4
  43. package/dist/hooks/{chunk-NFZGFGOR.js → chunk-32GQTL4F.js} +14 -1
  44. package/dist/hooks/{chunk-HBKZLITF.js → chunk-DO6NWWHU.js} +4 -4
  45. package/dist/hooks/{chunk-KBXZLMRH.js → chunk-G6KRCKEC.js} +216 -76
  46. package/dist/hooks/{chunk-JKKTVDAG.js → chunk-GDS5N2KB.js} +186 -309
  47. package/dist/hooks/chunk-I4XSL4TT.js +56 -0
  48. package/dist/hooks/{chunk-GDU26K3J.js → chunk-S6X6WYKR.js} +886 -174
  49. package/dist/hooks/{chunk-FO2I7UT7.js → chunk-UAGLLIGZ.js} +1 -1
  50. package/dist/hooks/{chunk-RFWWUI5F.js → chunk-VESKRQOF.js} +3 -3
  51. package/dist/hooks/{chunk-KOKOAV6D.js → chunk-VQLLNFNT.js} +6 -4
  52. package/dist/hooks/{chunk-LJBLGHEH.js → chunk-ZAL3NRGL.js} +4 -6
  53. package/dist/hooks/codex-hook-adapter.js +10 -10
  54. package/dist/hooks/duplicate-read-guard.js +5 -5
  55. package/dist/hooks/format-edited.js +2 -2
  56. package/dist/hooks/inputs.json +178 -177
  57. package/dist/hooks/investigation-guard.js +5 -5
  58. package/dist/hooks/pretool-guard.js +11 -10
  59. package/dist/hooks/stop-guard.js +20 -6
  60. package/dist/josh.js +29 -3
  61. package/dist/version/index.js +5 -1
  62. package/package.json +2 -1
  63. package/prompts/collaboration-workflow/file-edits.md +11 -10
  64. package/prompts/collaboration-workflow/gh-rest.md +2 -4
  65. package/prompts/collaboration-workflow/glossary.md +1 -1
  66. package/prompts/collaboration-workflow/issue-citation.md +5 -9
  67. package/prompts/collaboration-workflow/issue-template.md +40 -115
  68. package/prompts/collaboration-workflow/operating-rules.md +4 -5
  69. package/prompts/collaboration-workflow/output-bounds.md +12 -78
  70. package/prompts/collaboration-workflow/overview.md +7 -13
  71. package/prompts/collaboration-workflow/plan-comment.md +11 -39
  72. package/prompts/collaboration-workflow/principles.md +3 -4
  73. package/prompts/collaboration-workflow/report-format.md +28 -74
  74. package/prompts/collaboration-workflow/residency.md +12 -109
  75. package/prompts/collaboration-workflow/rule-delivery.md +98 -97
  76. package/prompts/collaboration-workflow/shell-body.md +3 -13
  77. package/prompts/collaboration-workflow/turn-batching.md +14 -88
  78. package/prompts/collaboration-workflow/upstream-interrupt.md +12 -14
  79. package/prompts/collaboration-workflow/wip-cap.md +6 -45
  80. package/prompts/collaboration-workflow.md +1 -13
  81. package/prompts/review-rubric.md +8 -71
  82. package/prompts/review.md +25 -55
  83. package/prompts/testing-guide.md +18 -67
  84. package/scripts/agent/agent-role-profile.ts +1 -1
  85. package/scripts/agent/codex-hooks.ts +3 -12
  86. package/scripts/backlog/backlog-budget.ts +1 -1
  87. package/scripts/backlog/backlog-drive-cli.ts +4 -3
  88. package/scripts/backlog/backlog-drive-offer-argv.ts +10 -1
  89. package/scripts/backlog/backlog-next.ts +15 -4
  90. package/scripts/backlog/backlog-offer.ts +6 -6
  91. package/scripts/backlog/backlog-plan-cli.ts +6 -5
  92. package/scripts/backlog/backlog-rank.ts +18 -9
  93. package/scripts/backlog/backlog-restructure.ts +152 -0
  94. package/scripts/backlog/backlog-waves.ts +15 -17
  95. package/scripts/behavior/behavior-rules.ts +11 -4
  96. package/scripts/cost-runtime/context-cut-threshold.ts +1 -9
  97. package/scripts/cost-runtime/cost-verdict.ts +15 -28
  98. package/scripts/delegation/investigation-reads.ts +5 -5
  99. package/scripts/discovery/repo-discovery.ts +21 -7
  100. package/scripts/discovery/repo-origin.ts +26 -0
  101. package/scripts/discovery/repo-party.ts +42 -1
  102. package/scripts/document/backlogrun-parent-read-set.ts +14 -15
  103. package/scripts/document/document-byte-budget.ts +34 -20
  104. package/scripts/document/entry-read-budget.ts +21 -9
  105. package/scripts/document/lane-child-read-set.ts +12 -14
  106. package/scripts/document/read-set-cli.ts +4 -4
  107. package/scripts/document/read-set-point-of-use.ts +10 -2
  108. package/scripts/document/resident-budget.ts +47 -0
  109. package/scripts/epic/epic-shape.ts +10 -13
  110. package/scripts/epic/epic-solo.ts +1 -1
  111. package/scripts/exports/unused-members-cli.ts +7 -3
  112. package/scripts/followup/git-followup-stages.ts +9 -0
  113. package/scripts/followup/git-pr-followup.ts +1 -1
  114. package/scripts/gh/git-gh-api-path.ts +7 -0
  115. package/scripts/gh/git-gh-issue.ts +5 -3
  116. package/scripts/gh/git-gh-pr-read.ts +4 -0
  117. package/scripts/gh/git-pr-checks-eval.ts +8 -0
  118. package/scripts/gh/git-pr-checks.ts +11 -1
  119. package/scripts/git/constants.ts +10 -0
  120. package/scripts/git/main-merge.ts +57 -21
  121. package/scripts/git/schemas.ts +2 -0
  122. package/scripts/hooks/pretool-guard-cli.ts +2 -2
  123. package/scripts/hooks/pretool-guard.ts +45 -2
  124. package/scripts/hooks/run-hook.sh +41 -0
  125. package/scripts/init/hook-command-rewrite.ts +18 -35
  126. package/scripts/init/hook-launch.ts +21 -32
  127. package/scripts/issue/issue-auto-ok.ts +95 -0
  128. package/scripts/issue/issue-file-cli.ts +53 -7
  129. package/scripts/issue/issue-file.ts +28 -5
  130. package/scripts/issue/issue-labels.ts +12 -12
  131. package/scripts/issue/issue-rank.ts +1 -1
  132. package/scripts/issue/issue-read-cli.ts +3 -3
  133. package/scripts/issue/issue-read.ts +2 -2
  134. package/scripts/issue/issue-scout-cli.ts +2 -2
  135. package/scripts/issue/issue-state-cli.ts +1 -1
  136. package/scripts/issue/issue-state.ts +2 -2
  137. package/scripts/issue/issue-wip.ts +70 -0
  138. package/scripts/josh/hook-decision.ts +17 -0
  139. package/scripts/josh/josh-commands-development.ts +11 -1
  140. package/scripts/josh/josh-commands-issue.ts +2 -2
  141. package/scripts/lane/lane-launch-cli.ts +21 -3
  142. package/scripts/lines/bytes-command.ts +29 -6
  143. package/scripts/notify/telegram-notify.ts +26 -1
  144. package/scripts/observations/observation-ledger-line.ts +1 -1
  145. package/scripts/release/release-progress.ts +167 -0
  146. package/scripts/release/release-publish.ts +19 -8
  147. package/scripts/release/release-tag.ts +22 -8
  148. package/scripts/rules/decision-oracle-stage.ts +1 -1
  149. package/scripts/rules/decision-oracle.ts +6 -6
  150. package/scripts/rules/delivered-rules.ts +11 -11
  151. package/scripts/rules/direct-pr-create.ts +110 -0
  152. package/scripts/rules/file-body.ts +98 -42
  153. package/scripts/rules/filing-cap.ts +2 -2
  154. package/scripts/rules/filing-offer.ts +1 -1
  155. package/scripts/rules/gh-api.ts +18 -1
  156. package/scripts/rules/implementation-cut.ts +3 -1
  157. package/scripts/rules/lane-background.ts +67 -10
  158. package/scripts/rules/permission-guards.ts +10 -2
  159. package/scripts/rules/pre-gate-cut.ts +2 -2
  160. package/scripts/rules/stop-rules.ts +4 -4
  161. package/scripts/rules/test-declared-commit.ts +1 -1
  162. package/scripts/rules/third-party-write.ts +56 -12
  163. package/scripts/run/run-carry.ts +11 -5
  164. package/scripts/run/run-cut-cli.ts +1 -1
  165. package/scripts/run/run-cut-handoff.ts +21 -1
  166. package/scripts/run/run-cut-report.ts +2 -2
  167. package/scripts/run/run-entry-cli.ts +11 -3
  168. package/scripts/run/run-hold-cli.ts +16 -2
  169. package/scripts/run/run-label.ts +50 -0
  170. package/scripts/run/run-merge-steps.ts +8 -3
  171. package/scripts/run/run-merge.ts +1 -1
  172. package/scripts/run/run-prep-cli.ts +6 -2
  173. package/scripts/run/run-prep.ts +17 -0
  174. package/scripts/run/run-ship-cli.ts +27 -6
  175. package/scripts/run/run-ship-next.ts +13 -0
  176. package/scripts/run/run-ship-pre-detach.ts +66 -0
  177. package/scripts/run/run-ship-preflight.ts +34 -3
  178. package/scripts/run/run-ship-return.ts +7 -4
  179. package/scripts/run/run-ship-review-steps.ts +1 -1
  180. package/scripts/run/run-ship-review.ts +26 -5
  181. package/scripts/run/run-ship-stage.ts +13 -0
  182. package/scripts/run/run-ship-steps.ts +10 -2
  183. package/scripts/run/run-ship-sync.ts +114 -0
  184. package/scripts/run/run-ship.ts +6 -0
  185. package/scripts/run/run-step-cli.ts +20 -7
  186. package/scripts/run/run-wake-cli.ts +8 -1
  187. package/scripts/run/run-wake-driver.ts +62 -8
  188. package/scripts/run/run-wake-session.ts +2 -1
  189. package/scripts/test/test-declared-logic.ts +1 -1
  190. package/scripts/test/test-red-logic.ts +17 -2
  191. package/scripts/test/test-red.ts +8 -7
  192. package/scripts/time-runtime/time-batch-guard.ts +52 -16
  193. package/scripts/time-runtime/time-density-hook.ts +20 -2
  194. package/scripts/time-runtime/time-density.ts +4 -3
  195. package/scripts/time-runtime/time-markers.ts +15 -4
  196. package/scripts/time-runtime/time-transcript-line.ts +27 -1
  197. package/scripts/version/npm-registry.ts +11 -1
  198. package/templates/workflows/ci.yml +9 -1
  199. package/.claude/skills/workflow-commands/followup-reference.md +0 -118
  200. package/dist/hooks/chunk-HANSKHES.js +0 -464
@@ -1,10 +1,9 @@
1
1
  # Finishing a run — `pnpm josh followup`
2
2
 
3
- Everything between a green CI and a merged PR: what `followup` scans for, the gate that stops a run,
4
- how auto-merge is authorized, and the Telegram notifications. `fullrun` and `backlogrun` both end here;
5
- `halfrun` never reaches this file, because it stops before the commit.
6
-
7
- This file is the single source of the rule.
3
+ Everything between a green CI and a merged PR: the command, the merge it authorizes, the notifications,
4
+ the reviewer scan, the config report and the release ask. `fullrun` and `backlogrun` end here;
5
+ `halfrun` never reaches this file, because it stops before the commit. This file is the single source
6
+ of the rule (joshuafolkken/kit#3176 merged the former post-execution reference into it).
8
7
 
9
8
  ## Run `pnpm josh followup`
10
9
 
@@ -22,9 +21,8 @@ Telegram, merges by default, posts the Issue report, closes completed epics, rem
22
21
  and releases the hold. Only `--no-merge` stops the merge; `--merge` is a deprecated no-op. **A pull
23
22
  request already merged by hand** (a `prrun` stop, joshuafolkken/kit#3023) skips the CI wait, the AI
24
23
  review scan and the merge and runs only the post-merge tail; a completion report already on the Issue
25
- is not posted or notified twice, so re-running is safe. Keep the
26
- default Issue target. Ignore a finding only after verifying it is inapplicable; rate-limit text is not
27
- a finding.
24
+ is not posted or notified twice, so re-running is safe. Keep the default Issue target. Ignore a
25
+ finding only after verifying it is inapplicable; rate-limit text is not a finding.
28
26
 
29
27
  A pre-merge failure stops the run; an unverifiable AI finding or CI failure needing input receives a
30
28
  `confirmation` Telegram. Post-merge cleanup failures are named and do not undo the merge; run the
@@ -32,198 +30,123 @@ named recovery without rerunning it. Because notification precedes merge, the pr
32
30
  authoritative.
33
31
 
34
32
  After success, run `pnpm josh ms`; in a lane its refusal is expected and the parent uses
35
- `pnpm josh lane:close <N>`. Never delete the branch unless requested. Read
36
- `followup-reference.md` after execution for timing output, reviewer-scan details, config claims and the
37
- release ask.
38
-
39
- ## Command stages and options — reference
40
-
41
- `pnpm josh followup` is a **separate script run after `pnpm josh git`**, not a stage inside it. The
42
- commit and the pull request come first; this is everything after them.
43
-
44
- What one invocation does, in order:
45
-
46
- - **Waits for the CI status checks — the required ones only.** A non-required check (CodeQL, Workers
47
- Builds) is never waited on. A non-required check that failed is still reported to the user
48
- (`prompts/collaboration-workflow/operating-rules.md` → "CI チェック失敗時の対応").
49
- - **Checks unresolved CodeRabbit line comments**, posting the ignore-reason comment when one is
50
- supplied.
51
- - **Scans the AI reviewers' top-level comments** — run independently of CI status.
52
- - **Sends the `completion` Telegram (✅) itself**, once every gate above has passed. A CI failure or an
53
- exception is re-thrown as-is with **no** Telegram sent — so a silent run is a failed run. **It fires
54
- before the merge, not after it**: a merge rejected by branch protection or a conflict leaves the ✅
55
- already sent, so never read a received completion Telegram as proof the pull request merged — read
56
- what the command printed.
57
- - **Merges** — unless `--no-merge` was passed. **Merging is the default**, and `--merge` is a
58
- deprecated no-op. `--no-merge` is the only thing that stops it.
59
- - **Posts the completion report to the Issue**, after the merge: it edits the Issue body when the body
60
- is empty, and adds a comment when it already has content. The report never goes to the pull request.
61
- A run that stopped at the merge therefore has no Issue comment, and the missing comment is what a
62
- failed merge looks like from GitHub.
63
- - **Closes the epics the Issue completes**, on a merged run only.
64
- - **Confirms the Issue itself closed**, on a merged run only. GitHub has left merged runs' Issues
65
- open despite `closes #N` (joshuafolkken/kit#2770), so an Issue still open a few seconds after the
66
- merge is closed with a comment saying why, and the repair is printed as a warning.
67
- - **Takes the `in-progress` label back off the Issue**, on a merged run only. A run that merged nothing
68
- keeps it. The removal reads the Issue's labels and sends back the spelling GitHub stored, so an
69
- `In-Progress` repository is not missed, and an Issue that never carried the label is never written to.
70
- - **Nothing after the merge can end the run.** Once the pull request has merged, every remaining step —
71
- the Issue comment, the epic close, the review records and the working-tree hold
72
- release — runs on its own: one that fails is reported by name, with the command that finishes it by
73
- hand where one exists (`pnpm josh run:release --force` for the hold; `gh pr comment` or `gh api …
74
- /comments` for the completion report). Before the merge nothing changes: a failure there still ends
75
- the run, because re-running the command is the whole recovery. **A reported cleanup failure is not a
76
- merge failure**: read the ⚠ lines, run what they name, and do not re-run the merge.
77
- - **Recovers the issue number from the pull request body** when the invocation named none: the `closes
78
- #N` keyword supplies it.
79
- ### The post-execution reference is in `followup-reference.md`
80
-
81
- Everything the run reaches **after** it issues `pnpm josh followup` is in `followup-reference.md`, so
82
- the read that lands in the turn that issues the command stays small: the per-stage timing block the
83
- command prints and how to read it, the `failure` Telegram sent by hand when recovery is given up, the
84
- AI-reviewer comment scan, the config-file report, and the release ask that closes the completion
85
- summary. What stays below is what a run needs **before** it issues the command.
86
-
87
- ### The options
33
+ `pnpm josh lane:close <N>`. Never delete the branch unless requested. The sections below are read
34
+ after execution, when its output needs reading.
35
+
36
+ ## The options
88
37
 
89
38
  | Option | What it is |
90
39
  | --- | --- |
91
- | `--no-merge` | **The only flag that stops the merge.** Merging is the default; `--merge` is a deprecated no-op |
40
+ | `--no-merge` | **The only flag that stops the merge** — leave it out and the command merges |
92
41
  | `--notify-target` | `pr` \| `issue` \| `both`, defaulting to `issue`. **Keep the default** — the workflow puts no completion report on the pull request |
93
- | `--notify-message` | The completion comment body, in the `JOSH_SESSION_LANG` language (`ja` when unset), in the two-layer report shape: three lines of `Cause: / Fix: / Result:` first, one plain sentence each with no jargon or file names, then the changes as bullets under `Details:`. **Not a bare list of `Added … / Changed …`** |
94
- | `--notify-message-file` | The same body, read from a file (`-` reads stdin). **Use it whenever the report names a command or a path** — inside shell double quotes a backtick or a `$` is evaluated before this command starts (`prompts/collaboration-workflow/shell-body.md`) |
42
+ | `--notify-message` / `--notify-message-file` | The completion comment body in the two-layer report shape — `Cause: / Fix: / Result:`, then `Details:` bullets, never a bare `Added … / Changed …` list. **Use the file form whenever the report names a command or a path** (`prompts/collaboration-workflow/shell-body.md`); `-` reads stdin |
95
43
  | `--coderabbit-ignore-reason` | The reason comment for leaving CodeRabbit line comments unresolved |
96
44
  | `--ai-review-ignore-reason` | The reason comment for leaving an AI-review blocker (Claude Review / a CodeRabbit summary) unresolved |
97
- | `--issue-number` | The Issue number — or give it positionally as `"<title> #<number>"` |
45
+ | `--issue-number` | The Issue number — or give it positionally as `"<title> #<number>"`; with neither, the PR body's `closes #N` supplies it |
98
46
 
99
- Example 1 — the basic form (`fullrun` includes the merge):
47
+ ## `auto-merge` — Default `fullrun` behavior
100
48
 
101
- ```bash
102
- pnpm josh followup "<issue-title> #<issue-number>" \
103
- --notify-message "Implemented <title>
104
- Cause: <why this was needed, in one plain sentence>
105
- Fix: <what was changed, in one plain sentence>
106
- Result: <what is different for the user now>
107
-
108
- Details:
109
- - Added ...
110
- - Changed ..."
111
- ```
49
+ Invoking `fullrun` is itself the explicit authorization to merge; the user adds no keyword.
50
+
51
+ - **Always run `pnpm josh ms` after a successful merge** — it returns the tree to the default branch
52
+ with the merge commit pulled. **In a lane, `pnpm josh lane:close <N>` is the terminal step instead**:
53
+ git allows one branch per work tree, so `josh ms` refuses there, and the refresh is the parent's.
54
+ - **Green CI is not authorization to merge while AI review findings are open.** On a blocker
55
+ `followup` sends a `confirmation` Telegram and exits non-zero — fix and re-run. SonarCloud is not
56
+ scanned here; the required `SonarQube` check carries it.
57
+ - **Verify a CodeRabbit finding before bypassing it.** Never pass `--coderabbit-ignore-reason`
58
+ reflexively: a SHA pin flagged "not matching the tag" is checked with `gh api
59
+ repos/<owner>/<repo>/commits/<tag> --jq '.sha'`, and the bypass cites that command.
60
+ - **The merge is `followup`'s, not yours** — it calls the REST merge endpoint from inside a node
61
+ script, and `.claude/settings.json` refuses `gh pr merge` and its `gh api` spellings (`CLAUDE.md` →
62
+ "Git Rules"). Do **not** pass `--delete-branch` unless the user asks.
63
+ - **A failed merge** (branch protection, a conflict) is reported and stops the run — never retried with
64
+ other flags or past a protection. To skip the merge, use `kickoff` or say "do not merge" in the same
65
+ turn and pass `--no-merge`.
112
66
 
113
- Example 2 — with a CodeRabbit ignore reason:
67
+ ## Completion notifications: always via `pnpm josh followup`
114
68
 
115
- ```bash
116
- pnpm josh followup "<issue-title> #<issue-number>" \
117
- --notify-message "Implemented <title>
118
- Cause: ...
119
- Fix: ...
120
- Result: ...
121
-
122
- Details:
123
- - Added ...
124
- - Fixed ..." \
125
- --coderabbit-ignore-reason "<why the finding does not apply>"
126
- ```
69
+ **Never send a `completion` Telegram with `pnpm josh notify`** — `followup` sends it with the PR URL,
70
+ which the manual CLI does not fill in. `pnpm josh notify` stays the tool for `planning`,
71
+ `confirmation`, `kickoff_retry` and `failure`. **It fires before the merge**, so a received ✅ is not
72
+ proof the PR merged — read what the command printed; a silent run is a failed run.
127
73
 
128
- Example 3 — with an AI-review (Claude Review) blocker ignore reason:
74
+ **Always run it in the foreground** — the deliberate exception to `background-commands.md`, because
75
+ nearly every later step reads its result. The CI wait defaults to 32 minutes, so give the call the
76
+ largest timeout it accepts (`timeout: 600000` in Claude Code). Where the harness detaches an
77
+ over-running command, wait for its report; where it kills the call, set `JOSH_CI_TIMEOUT_SECONDS` to fit
78
+ and re-run once CI has settled. Re-run it after every follow-up commit.
129
79
 
130
- ```bash
131
- pnpm josh followup "<issue-title> #<issue-number>" \
132
- --notify-message "Implemented <title>
133
- Cause: ...
134
- Fix: ...
135
- Result: ...
136
-
137
- Details:
138
- - Added ...
139
- - Fixed ..." \
140
- --ai-review-ignore-reason "<tracked in issue #123>"
141
- ```
80
+ **The count of unreleased merges is surfaced at completion — not a version.** It prints `🚚 unreleased
81
+ merges on main: <n>` and puts the count in the Telegram. **Do not report a shipped version**: a child
82
+ no longer bumps, so `package.json` names the previous release. What the run does about it is "When
83
+ `pnpm josh release` runs" below.
142
84
 
143
- Example 4 — no merge (after a `kickoff`, or when the merge is done by hand). **`--no-merge` is not
144
- decoration**: leave it out and this command merges.
85
+ ## Reading the stage-timing block
145
86
 
146
- ```bash
147
- pnpm josh followup "<issue-title> #<issue-number>" \
148
- --no-merge \
149
- --notify-message "Implemented <title>
150
- Cause: ...
151
- Fix: ...
152
- Result: ...
153
-
154
- Details:
155
- - Added ..."
156
- ```
87
+ The command closes with one `followup stage: <name> <seconds>` row per stage and a
88
+ `followup stages total:` line (joshuafolkken/kit#1349), so where it spent its time is read, not
89
+ guessed.
157
90
 
158
- ## `auto-merge` — Default `fullrun` behavior
91
+ - **A failed run prints it too**, up to the stage that threw, named `interrupted` — a short block is
92
+ the run stopping early, not the printer breaking. The `merge` row appears only on a run that merged.
93
+ - **A row named `<a>-and-<b>` is a batch of requests sent together** (joshuafolkken/kit#1446);
94
+ `checks-wait` is never overlapped, because it is the merge gate.
95
+ - **The total is the sum of the stages**, not the wall clock — the post-merge tail (record clears, the
96
+ hold release, the next-issue listing) sits outside it.
159
97
 
160
- Every `fullrun` / `fullrun new` invocation uses `pnpm josh followup`, which handles the full sequence
161
- internally: wait for CI → verify AI review findings → send completion notification → merge. The user
162
- does **not** need to add a keyword. Invoking `fullrun` is itself the explicit authorization to merge.
98
+ A `failure` Telegram is sent **by hand, exactly once**, and only when recovery is given up:
163
99
 
164
100
  ```bash
165
- pnpm josh followup "<title> #<N>" --notify-message "..."
166
- pnpm josh ms
101
+ pnpm josh notify --task-type failure --issue-url "<issue-url>" --body-file <reason-file>
167
102
  ```
168
103
 
169
- - **Always run `pnpm josh ms` after a successful merge.** `pnpm josh followup` leaves the working tree
170
- on the merged feature branch; `pnpm josh ms` (checkout default branch + `git pull`) returns it to the
171
- default branch with the merge commit pulled. Skip this step only if the merge itself failed.
172
- - **In a lane, the terminal step is `pnpm josh lane:close <N>` instead, and `josh ms` refuses.** A lane
173
- is a linked work tree, and git allows one branch in one work tree at a time. `josh ms` exits non-zero
174
- there and says so, which is the expected answer. The default-branch refresh is the parent's, in the
175
- primary checkout.
176
- - **AI review findings are checked automatically.** `pnpm josh followup` scans for CodeRabbit / Claude
177
- Review findings before merging. If blockers are found, it sends a `confirmation` Telegram and exits
178
- non-zero — fix the findings and re-run. **Green CI is not authorization to merge while AI review
179
- findings are open.** (SonarCloud findings are not scanned by `followup`; the `sonar-qube.yml` CI
180
- workflow runs the scan with `sonar.qualitygate.wait=true` and then `josh sonar:new-code`, so a red
181
- Quality Gate or a single new Sonar issue or duplicated block fails the required `SonarQube` check,
182
- which `followup` waits on.)
183
- - **CodeRabbit rate-limit is not a finding.** If the only CodeRabbit comment is a rate-limit warning
184
- (`rate limited by coderabbit.ai` or `Rate limit exceeded`) and there is no substantive review, treat
185
- it as "no findings" and proceed. Same if CodeRabbit produced no comment on the latest commit.
186
- - **Verify CodeRabbit findings before bypassing.** Do not pass `--coderabbit-ignore-reason` reflexively
187
- — first verify. Example: CodeRabbit may flag a GitHub Actions SHA pin like `pnpm/action-setup@<sha> #
188
- v6.0.8` as "not matching the tag" because it queried the annotated-tag-object SHA, not the commit
189
- SHA. Confirm with `gh api repos/<owner>/<repo>/commits/<tag> --jq '.sha'` — if that matches the
190
- pinned SHA, the finding is a false positive. Only then bypass, citing the verification command.
191
- - Merge goes through REST internally — the pull request's own merge endpoint with an explicit
192
- `merge_method` (`gh pr merge` goes through GraphQL, which a cloud session is refused). **That path is
193
- `followup`'s, not yours**: `.claude/settings.json` refuses `gh pr merge` and the `gh api` / `gh api
194
- graphql` spellings of the same merge; `followup` calls gh from inside a node script. The prohibition
195
- in `CLAUDE.md` → "Git Rules" is the rule.
196
- - Use the merge strategy the repo allows (`--merge` / `--squash` / `--rebase`); default to `--merge`.
197
- Inspect with `gh api repos/<owner>/<repo> --jq '{allow_merge_commit, allow_squash_merge,
198
- allow_rebase_merge}'` when unsure.
199
- - Do **not** pass `--delete-branch` unless the user asks.
200
- - If the merge fails (branch protections, conflicts), report the reason and stop — do not retry with
201
- different flags or bypass protections.
202
- - **If the user wants to skip the merge step**, use `kickoff` or say "do not merge" in the same turn,
203
- and pass `--no-merge`. Outside a `fullrun` invocation, never run `gh pr merge` on your own.
104
+ ## AI reviewer comment scan
204
105
 
205
- ## Completion notifications: always via `pnpm josh followup`
106
+ `followup` scans top-level PR comments from AI reviewers **independently of CI status**, so a finding
107
+ posted after CI goes green is not silently shipped.
108
+
109
+ - **Blockers are structural, not NLP**: a Claude Review body with `### Issues`, `### Problem`,
110
+ `#### Logic bug` or a numbered `### 1. …` heading; a CodeRabbit `Actionable comments posted: N` with
111
+ N > 0. Rate-limit notices and sign-offs (`All issues resolved ✓`) match nothing.
112
+ - **A standing blocker without `--ai-review-ignore-reason`** sends a `confirmation` Telegram and exits
113
+ non-zero; with it, the reason is posted to the PR and the run proceeds.
114
+ - **A comment listing that could not be read is a standing blocker** (joshuafolkken/kit#973) — never
115
+ an empty listing that passes.
116
+ - **Temporary (kit#753)**: CodeRabbit is non-blocking end to end — out of the default required checks
117
+ (restore via `JOSH_REQUIRED_CHECKS`), its actionable count and unreadable line-comment listing are
118
+ audit notes rather than blockers. Revert together with kit#752.
119
+
120
+ ## Config file reporting
121
+
122
+ `followup` matches every changed path against what `josh sync` distributes (`AI_COPY_FILES`,
123
+ `AI_COPY_FILE_MAPPINGS`, `AI_COPY_DIRECTORIES`, `SYNCED_PATHS`) and **reports** the claimed paths in the
124
+ completion notification and the Issue report (joshuafolkken/kit#1578). **It stops nothing**
125
+ (joshuafolkken/kit#1592): in kit every skill or prompt change is a distributed path, so a stop here
126
+ only stopped the work its own acceptance criteria ordered. `pnpm josh sync:scope` gives the same
127
+ answer on demand; there is no flag to pass.
128
+
129
+ ## When `pnpm josh release` runs
130
+
131
+ **The release point is a position plus a command's answer, never a judgement**
132
+ (joshuafolkken/kit#1582).
133
+
134
+ **The position: once per invocation, after the last merge** — a lone `fullrun`'s only one, a
135
+ `backlogrun`'s **last** child, never once per child. In a lane the parent asks it, in the primary
136
+ checkout, after the last lane is closed.
137
+
138
+ ```bash
139
+ pnpm josh release:scope # → required | skip | unknown
140
+ ```
206
141
 
207
- Never send `completion` Telegram notifications manually with `pnpm josh notify --task-type completion
208
- ...`. Always use `pnpm josh followup` — it fetches the PR URL through REST
209
- (`repos/{owner}/{repo}/pulls/{N}`) and always includes it, whereas the manual CLI does not
210
- auto-populate `--pr-url`.
211
-
212
- **Always run `pnpm josh followup` in the foreground** (no `&`, no shell backgrounding). **It is the
213
- deliberate exception to `background-commands.md`**: nearly every step after it reads its result, so
214
- detaching it would buy an empty turn. It waits for CI — 32 minutes by default, about 34 worst case —
215
- which can outlast one tool call, so give the call the largest timeout it accepts (in Claude Code,
216
- `timeout: 600000`). Where the harness detaches an over-running command and reports when it finishes,
217
- wait for that report instead of re-running. Where it kills the call at the cap, set `JOSH_CI_TIMEOUT_SECONDS`
218
- to a budget that fits inside the cap and re-run once CI has settled. Shell backgrounding never works.
219
-
220
- - Applies to the initial PR and every follow-up commit — re-run `pnpm josh followup "<title> #<N>"
221
- --notify-message "..."` each time you want to notify completion (notification is sent right before
222
- the merge).
223
- - `pnpm josh notify` remains the right tool for `planning`, `confirmation`, `kickoff_retry` and
224
- `failure` notifications.
225
- - **The count of unreleased merges is surfaced at completion — not a version.** When `pnpm josh
226
- followup` finishes it prints `🚚 unreleased merges on main: <n>` and puts the same count in the
227
- `completion` Telegram body. **Do not report a shipped version**: a child no longer bumps, so
228
- `package.json` names the *previous* release, and what ships is decided later by `pnpm josh release`.
229
- What the run *does* about it is `followup-reference.md` → "When `pnpm josh release` runs".
142
+ | It answers | What it means | What the run does |
143
+ | ---------- | ---------------------------------------------------------------- | --------------------------------------------------------------------------------- |
144
+ | `required` | main has taken at least one merge since the version last changed | Close the completion report with the release request, naming `pnpm josh release` |
145
+ | `skip` | the count is zero — nothing is waiting to ship | Say so in one line and finish |
146
+ | `unknown` | the count could not be read | **Report it as `unknown`** — it is never read as `skip` |
147
+
148
+ **The run never types `pnpm josh release` itself.** It opens and merges a PR of its own and starts
149
+ the tag → publish → `production` chain — outward-facing and effectively irreversible, so Tier C.
150
+ Typing `fullrun` authorizes this Issue's merge and nothing past it; a person types the release in the
151
+ primary checkout, on the default branch, with a clean tree. `release:scope` counts nothing of its own —
152
+ it reads the same fetch-then-count `followup` uses for the Telegram line, so the two cannot disagree.
@@ -9,10 +9,8 @@ the run is at, and the sections below carry that step in full.
9
9
 
10
10
  File Issues with `pnpm josh issue:file` (it applies the classification labels); see `prompts/collaboration-workflow/issue-template.md`.
11
11
 
12
- **Add `in-progress` the moment `run:hold` answered `hold`** (create if missing:
13
- `gh api repos/{owner}/{repo}/labels -f name=in-progress -f color=0075ca -f description="Work is
14
- actively in progress" --silent 2>/dev/null || true`, then `gh api
15
- repos/{owner}/{repo}/issues/<N>/labels -f 'labels[]=in-progress'`) → Read Issue #N and its comments
12
+ **`in-progress` is already on the Issue** — `run:entry` applied it once the tree was held and the
13
+ budget allowed the run, and `run:release <N>` takes it back off → Read Issue #N and its comments
16
14
  (`issue-comments.md`) → **normalize the title** (if not in English or can be phrased more clearly,
17
15
  derive a better English title and `gh api -X PATCH repos/{owner}/{repo}/issues/<N> -f title="<title>"`)
18
16
  → post the agreed plan only if the Issue body is blank (`gh api -X PATCH
@@ -52,9 +50,10 @@ primary checkout; a Claude run keeps it.
52
50
  `kickoff new` + `fullrun #N` in one run. Steps: (1) Derive an English title, or use the provided one.
53
51
  (2) Create Issue: `pnpm josh issue:file "<title>" --body-file <body-file> --depth <n>` (per
54
52
  `prompts/collaboration-workflow/issue-template.md`) — its duplicate scan runs first, and a candidate
55
- that covers the same work stops the run rather than filing a second Issue (`SKILL.md` → §2e). Capture
56
- `<N>`. (3) Add
57
- `in-progress` (as above). (4) Post the agreed plan in the session language: fill the body if blank,
53
+ that covers the same work stops the run rather than filing a second Issue (`issue-scout.md`). Capture
54
+ `<N>`. (3) Add `in-progress` (the bare hold named no issue):
55
+ `gh api repos/{owner}/{repo}/issues/<N>/labels -f 'labels[]=in-progress'`. (4) Post the agreed plan
56
+ in the session language: fill the body if blank,
58
57
  otherwise add a comment. (5) If the working tree already has staged or modified files,
59
58
  `git stash push -m "fullrun new: pre-existing changes" -- ':!docs/maintainers/observations'` first
60
59
  (joshuafolkken/kit#2919). (6) `git switch main && git pull`. (7)
@@ -74,7 +73,7 @@ ship "<title> #<N>" --notify-message "..."` (gate → commit/push/PR → the CI-
74
73
  stopping at the first failed step; joshuafolkken/kit#2398); **where a second round ran**, the PR opened
75
74
  at (11) and the region stays separate — `pnpm josh followup "<title> #<N>" --notify-message "..."` then
76
75
  `pnpm josh run:tail <N>`. (14) **After the merge, run `pnpm josh ms`.** (15) **Ask `pnpm josh
77
- release:scope` and close the completion summary with what it answered** (`followup-reference.md` →
76
+ release:scope` and close the completion summary with what it answered** (`followup.md` →
78
77
  "When `pnpm josh release` runs").
79
78
 
80
79
  ## The release ask — the last step of either form
@@ -93,5 +92,5 @@ own end.
93
92
  Once the merge is done, `pnpm josh release:scope` says whether a release is owed — `required`, `skip`
94
93
  or `unknown`, and `unknown` is never read as `skip`. On `required` the completion summary closes with
95
94
  the request and the exact command; the run never types `pnpm josh release` itself, because publishing
96
- is Tier C (`followup-reference.md` → "When `pnpm josh release` runs", the single source). A `fullrun`
95
+ is Tier C (`followup.md` → "When `pnpm josh release` runs", the single source). A `fullrun`
97
96
  invoked as one child of a `backlogrun` does not ask it — that batch asks once at its own end.
@@ -1,84 +1,27 @@
1
1
  # `fullrun` — the manifest (plan → implement → PR → merge → notify)
2
2
 
3
- **This file is the manifest, not the procedure** (joshuafolkken/kit#2189). It carries the ordered
4
- steps as terse triggers and pointers; the fine print of each step is read on demand from the file its
5
- pointer names, and `pnpm josh run:step <N>` prints the run's next single action, computed from the
6
- event stream, the carry record and the issue state (`run:next` is its pre-implementation degenerate
7
- form, and the two share one mapping).
8
- `chain-rule.md`, `followup.md`, `background-commands.md` and `latest-gate.md` are **not entry
9
- reads** — each is fetched at its point of use, in the turn that reaches it. The step lists themselves
10
- are `fullrun-steps.md`, read when a step needs its detail.
3
+ **This file is the manifest, not the procedure** (joshuafolkken/kit#2189). The entry sequence and
4
+ the stop branches are `entry-sequence.md`, shared with `halfrun` and `prrun` (joshuafolkken/kit#3174);
5
+ this file names only what is `fullrun`'s own. `pnpm josh run:step <N>` prints the run's next single
6
+ action. `chain-rule.md`, `followup.md`, `background-commands.md` and `latest-gate.md` are **not entry
7
+ reads** — each is fetched at its point of use. The step lists are `fullrun-steps.md`, read when a step
8
+ needs its detail.
11
9
 
12
- ## The ordered entry sequence
10
+ ## The difference — the entry and the end
13
11
 
14
- **One call folds the mechanical steps of this sequence** (joshuafolkken/kit#2372): `pnpm josh
15
- run:entry <N>` claims the tree, reads the budget, bundles the reads and decides the pre-implementation
16
- step — steps 1, 3, 4 and 5 below in one round trip, so a lane no longer re-bills its context on each.
17
- Its `entry #<N> — hold: … · cost: … · verdict: …` line carries the three facts the run branches on; a
18
- `busy`/`unknown` hold or an `over` budget short-circuits with a non-zero exit, and the numbered steps
19
- below are the detail behind each fact (`run:entry` reuses their own logic, it does not replace their
20
- single sources). Step 2 — the `in-progress` label — stays its own call, applied the moment the folded
21
- call reports `hold`.
12
+ - **The entry passes no `--to`**: `pnpm josh run:entry <N>` is `fullrun`'s stage. Follow `run:step`
13
+ into `fullrun-steps.md` — the `fullrun #N` list or the `fullrun new` list.
14
+ - **The end merges**: `run:step` names the verification gate, `pnpm josh followup`, `pnpm josh ms` and
15
+ the release ask in order. Invoking `fullrun` authorizes the merge, through `pnpm josh followup` only.
16
+ - **A split or a prerequisite stops the run**: typing `fullrun` approved **one** Issue.
22
17
 
23
- 1. **Claim the working tree — first, before anything else.** For `fullrun #N`, first run the folded
24
- `pnpm josh run:entry <N>` above (no `--to` is `fullrun`, §2k); it calls `run:hold` as its first step. For `fullrun new`, call
25
- bare `pnpm josh run:hold`, ahead of the title and filing. `hold` continues; `busy` / `unknown` stop
26
- with a `confirmation` Telegram carrying stderr.
27
- `working-tree-hold.md` is the single source; a cross-repository target resolves its checkout from
28
- `pnpm josh doctor` first (`target-repository.md`).
29
- 2. **Apply `in-progress` the moment `run:hold` answered `hold`** — a `#N` counts as holding its lane
30
- from the claim (`fullrun-steps.md` carries the create/apply commands; a `fullrun new` applies it
31
- right after filing). Every stop that leaves the tree clean removes it in the same turn as
32
- `pnpm josh run:release`: `gh api -X DELETE repos/{owner}/{repo}/issues/<N>/labels/in-progress
33
- 2>/dev/null || true`. A `needs-human-review` stop keeps both hold and label.
34
- 3. **Ask the session boundary in the same turn as the hold** — `pnpm josh cost --cut`. `under`
35
- continues; `over` (or unanswerable) stops before the title — `run:entry` sends this and step 1's
36
- `confirmation` Telegram and runs `run:release` (`stop notified: …`); by hand only for `new`.
37
- **Skip it when dispatched by `backlogrun`** (that batch owns the question). `backlogrun-progress.md`
38
- → "The hand-off" is the single source of the check and the shared 135,000 threshold.
39
- 4. **Gather the mechanical reads — `pnpm josh run:prep <N>`**: `issue:read`'s body/comments
40
- (`issue-comments.md`), `issue:state`'s state/labels/`human_review`, and `latest:scope`'s dependency
41
- scope in one report, run beside `run:hold` and `cost --cut` in the same turn. The §2g comment stops,
42
- the `human_review` stop and the dependency decision are read off it.
43
- 5. **Print the next action — `pnpm josh run:step <N>`** (`run:next` for the prose form of the
44
- pre-implementation step) — and follow it into `fullrun-steps.md`: the
45
- `fullrun #N` list or the `fullrun new` list. Before implementing, `git switch main && git pull`, then
46
- `pnpm josh latest:scope` — update dependencies only on `required` (`latest-gate.md`), never on every
47
- run. `run:step` names every later action in order — the verification gate, `pnpm josh followup`,
48
- `pnpm josh ms`, the release ask — each read at the point-of-use doc the header lists, never
49
- re-narrated here (`residency.md` → "順序の問い").
18
+ ## The lane-child seam
50
19
 
51
- ## The progress step and the lane-child seam
52
-
53
- - **Start the progress watcher once the hold is claimed** — `pnpm josh run:progress --wait` in the
54
- background, started once and relayed never, and `pnpm josh run:progress --mark` in the same turn as
55
- every real report (`backlogrun-progress.md` → "Progress while the run is quiet"). A `fullrun`
56
- dispatched as a lane child starts none and never reads that document (`pnpm josh read:set
57
- lane-child`). **The watcher is a per-session heartbeat; the run's report surface is not it** — the
58
- ambient surface is the run's event stream, followed identically before and after a cut, so nothing
59
- about the reporter moves when execution hands off (`backlogrun-progress.md` → "The invariant is a
60
- tier, not a mechanism").
61
20
  - **A lane child asks whether it is a resume first — `pnpm josh run:cut --resume <N>`** (`run:entry` asks it
62
21
  before the hold, joshuafolkken/kit#2760); on `resume` it skips the title, plan, hold and implementation and goes to the gate. At the pre-gate
63
22
  boundary — immediately after `pnpm josh main:merge`, before the gate — it takes the cut with
64
- `pnpm josh run:cut <N>` (the ordered step in `chain-rule.md`), and it records any park on the Issue before the stop notify.
65
- `pre-gate-cut.md` → "Resuming — the fresh process's entry check" and `pre-gate-cut.md` → "Taking
66
- the cut" are the single sources of the two.
23
+ `pnpm josh run:cut <N>` (the ordered step in `chain-rule.md`, which names the cut's single source),
24
+ and it records any park on the Issue before the stop notify. A run that is not a lane child never
25
+ reads the cut's document (joshuafolkken/kit#3172).
67
26
  - **`resume: halfrun`** adopted a stopped `halfrun` (#2796): gate in full; `resume: prrun-*` a stopped
68
27
  `prrun` (#3023); `working-tree-hold.md`.
69
-
70
- ## The stop branches
71
-
72
- - **`needs-human-review`** — implement and gate, then stop before the commit; `needs-human-review.md`.
73
- - **A split** — the assessment (`split-assessment.md` → "The question") finds two or more
74
- separately-mergeable deliverables over one gate: file the children (each `route:split`) and the epic,
75
- then **STOP** with "Please run `backlogrun #<E> --only` to execute this epic." Typing `fullrun`
76
- approved **one** Issue.
77
- - **A prerequisite** — file it (`route:tier-a`), stash, record the dependency, and **STOP** with
78
- "Please run `backlogrun #<E> --only` to execute this epic"; `prerequisite.md`.
79
- - **An observation** — file it without asking and carry on; `SKILL.md` → §2i.
80
-
81
- **Automatic filing is capped at 10 Issues per run.** On reaching it, stop and report.
82
-
83
- **The `into <target>` suffix** (a `new` entry) inserts the artifact into a named epic —
84
- `into-target.md`, read when the suffix is typed.
@@ -6,33 +6,20 @@ When this run files a new Issue, file it with `pnpm josh issue:file`, which lint
6
6
  implements the change and runs the full verification gate, then **stops before commit** — nothing is
7
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
8
 
9
- **This file is the manifest** (joshuafolkken/kit#2189): terse ordered steps, each pointing at the file
10
- that holds its detail.
9
+ **This file is the manifest** (joshuafolkken/kit#2189). The entry sequence and the stop branches are
10
+ `entry-sequence.md`, shared with `fullrun` and `prrun` (joshuafolkken/kit#3174); this file names only
11
+ what is `halfrun`'s own.
11
12
 
12
- ## The ordered entry sequence
13
+ ## The difference — the entry
13
14
 
14
- 1. **Claim the working tree first** — `pnpm josh run:entry <N> --to halfrun` (bare `pnpm josh
15
- run:hold` for `new`), ahead of the title and a `new` filing; it folds steps 3 and 5 and starts
16
- at its stage line's `start:` (`SKILL.md` → §2k). `busy` / `unknown` stop with a `confirmation` Telegram (`run:entry` sends it). **The stop
17
- before commit keeps the hold** (a second run would trample the uncommitted work); a stop on a
18
- split, prerequisite or third-party target releases it. `working-tree-hold.md` is the single source; a
19
- cross-repository target resolves its checkout from `pnpm josh doctor` first (`target-repository.md`).
20
- 2. **Apply `in-progress` the moment `run:hold` answered `hold`** — the stop before commit keeps it on;
21
- a stop that leaves the tree clean removes it in the same turn as `pnpm josh run:release` (`gh api -X
22
- DELETE repos/{owner}/{repo}/issues/<N>/labels/in-progress 2>/dev/null || true`).
23
- 3. **Ask the session boundary** — `pnpm josh cost --cut` (folded into `run:entry`); `over` stops — `run:entry` notifies and releases
24
- (`halfrun new`: by hand). **Skip it when dispatched by a batch.** `backlogrun-progress.md` → "The hand-off" is
25
- the single source of the check and the shared 135,000 threshold.
26
- 4. **Start the progress watcher once the hold is claimed** — `pnpm josh run:progress --wait` in the
27
- background, started once — it reports to the event stream itself and nothing is relayed — and
28
- `--mark` in the same turn as every real report; the stop before commit ends the watcher
29
- itself (`backlogrun-progress.md` → "Progress while the run is quiet").
30
- 5. **The mechanical reads** — `run:entry` folds `run:prep` (body/comments — `SKILL.md` → §2g;
31
- `human_review`; `latest:scope`); a `new` entry runs `pnpm josh run:prep <N>` once filed.
15
+ - **`pnpm josh run:entry <N> --to halfrun`** opens the run.
16
+ - **The stop before commit keeps the hold and `in-progress`** — a second run would trample the
17
+ uncommitted work; a stop on a split, prerequisite or third-party target releases both. The stop also
18
+ ends the progress watcher itself.
32
19
 
33
20
  ## The step list
34
21
 
35
- `halfrun #<N>`: add `in-progress` → read Issue #N and its comments → **normalize the title** (same as
22
+ `halfrun #<N>`: read Issue #N and its comments → **normalize the title** (same as
36
23
  `fullrun`) → post the agreed plan only if the body is blank → `git switch main && git pull`, then `pnpm
37
24
  josh latest:scope` and update dependencies only on `required` (`latest-gate.md`; the
38
25
  `dependency-update` skill) → implement → run the **full verification gate** (refactor →
@@ -56,23 +43,10 @@ back with fixes, treat each as a new round: implement, re-run `pnpm josh gate`,
56
43
  `halfrun new` or `halfrun new "<title>"`: `kickoff new` + `halfrun #<N>` (no Issue exists yet). Steps
57
44
  mirror `fullrun new` (1)–(8): derive an English title (or use the provided one) → create the Issue
58
45
  (`pnpm josh issue:file "<title>" --body-file <body-file> --depth <n>`, body per
59
- `prompts/collaboration-workflow/issue-template.md`; its duplicate scan is read per `SKILL.md` → §2e) → add `in-progress` → post the agreed plan → stash
46
+ `prompts/collaboration-workflow/issue-template.md`; its duplicate scan is read per `issue-scout.md`) → add `in-progress` (as `fullrun new` (3)) → post the agreed plan → stash
60
47
  any pre-existing changes with `git stash push -m "halfrun new: pre-existing changes" -- ':!docs/maintainers/observations'`
61
48
  (the pathspec keeps the observation ledger in the tree for this run's commit; joshuafolkken/kit#2919), popped by
62
49
  message with `pnpm josh stash:pop "halfrun new: pre-existing changes"`, never a positional `git stash pop` →
63
50
  `git switch main && git pull` → `pnpm josh latest:scope` → implement → run the gate (as above, `pnpm
64
51
  josh test:e2e` run by **you**) → `pnpm josh run:hold <N> --halfrun-stop` → send the `confirmation`
65
52
  Telegram and **stop**.
66
-
67
- ## The stop branches
68
-
69
- - **`needs-human-review`** — implement and gate, then stop before the commit; `needs-human-review.md`.
70
- - **A split** — the assessment (`split-assessment.md` → "The question") finds two or more
71
- separately-mergeable deliverables over one gate: file the children (each `route:split`) and the epic,
72
- then **STOP** with "Please run `backlogrun #<E> --only` to execute this epic." Typing `halfrun`
73
- authorized **one** Issue, never a batch.
74
- - **A prerequisite** — file it (`route:tier-a`), stash, record the dependency, and **STOP**;
75
- `prerequisite.md` is the single source of the filing, the `-u` stash and the epic:bundle branch.
76
- - **An observation** — file it without asking and carry on; `SKILL.md` → §2i.
77
-
78
- **Automatic filing is capped at 10 Issues per run.** On reaching it, stop and report.
@@ -1,9 +1,9 @@
1
1
  # The `into <target>` suffix — where the new Issue lands
2
2
 
3
- **This is `SKILL.md` → §2a's body, read at its point of use — the moment a `new` entry is typed with
4
- an `into <target>` suffix, not at any entry** (joshuafolkken/kit#2161). A run given a `#N` or a bare
5
- `new` never reaches it, so it costs a workflow entry nothing to leave it here. `SKILL.md` → §2a keeps
6
- the trigger and points here.
3
+ **This file is the suffix's single source, read at its point of use — the moment a `new` entry is
4
+ typed with an `into <target>` suffix, not at any entry** (joshuafolkken/kit#2161). A run given a `#N`
5
+ or a bare `new` never reaches it, so it costs a workflow entry nothing to leave it here. `SKILL.md` →
6
+ §2's table keeps the trigger and points here.
7
7
 
8
8
  `kickoff new` / `fullrun new` / `halfrun new` accept a suffix naming the epic the run's artifact
9
9
  belongs to. Without it the artifact belongs to no epic, and `epic:next` only ever offers an epic's
@@ -1,8 +1,8 @@
1
1
  # An Issue's comments are part of the Issue
2
2
 
3
- **This is the body of `SKILL.md` §2g, relocated here so the entry read carries the trigger and the
4
- pointer, not the procedure** (joshuafolkken/kit#2189). `SKILL.md` §2g is the resident stub, and every
5
- `#N` entry file routes here for the definition. It is read at its point of use — before implementing a
3
+ **This file is the single source, so the entry read carries the trigger and the pointer, not the
4
+ procedure** (joshuafolkken/kit#2189). `SKILL.md` → §2's table keeps the trigger, and every `#N` entry
5
+ file routes here for the definition. It is read at its point of use — before implementing a
6
6
  `#N` Issue.
7
7
 
8
8
  **Every `#N` entry point reads the Issue's comments before it implements** — `fullrun`, `halfrun` and
@@ -73,7 +73,6 @@ holding a lane. **Only a person removes it, by closing the Issue.**
73
73
  ```bash
74
74
  gh api repos/{owner}/{repo}/labels -f name=already-done -f color=6f42c1 -f description="Verified already merged — a person closes it" --silent 2>/dev/null || true
75
75
  gh api repos/{owner}/{repo}/issues/<N>/labels -f 'labels[]=already-done'
76
- gh api -X DELETE repos/{owner}/{repo}/issues/<N>/labels/in-progress 2>/dev/null || true
77
76
  ```
78
77
 
79
78
  The procedure, in order:
@@ -81,10 +80,10 @@ The procedure, in order:
81
80
  1. **Record the evidence as an Issue comment, before the label.** Name the pull request or commit that
82
81
  merged the work and, for each acceptance criterion the Issue states, the file and lines that satisfy
83
82
  it. **A claim with no citations is not the finding this exit is for.**
84
- 2. **Apply `already-done` and remove `in-progress`** — the two commands above. Leaving `in-progress`
85
- on holds a lane against an Issue nothing will ever run.
83
+ 2. **Apply `already-done`** — the two commands above.
86
84
  3. **Commit nothing, push nothing, open no pull request.** The tree is clean, so release the hold with
87
- `pnpm josh run:release <N>`.
85
+ `pnpm josh run:release <N>`, which also removes `in-progress` — left on, it holds a lane against an
86
+ Issue nothing will ever run.
88
87
  4. **Then behave as the entry point does for a parked child.** A `fullrun` / `halfrun` a person typed
89
88
  sends a `confirmation` Telegram naming the Issue and the merge that already covers it, and stops. An
90
89
  `backlogrun` child is park-and-continue (`backlogrun-park.md` → "park and continue").
@@ -98,7 +97,7 @@ citations: a criterion you cannot point at merged code for is a criterion this r
98
97
 
99
98
  **The fetch is one call however long the thread is; what costs is carrying it afterwards** — which is
100
99
  why the call above projects each comment down to its author, its timestamp and its body. Once the
101
- thread runs longer than the Issue itself it is exactly the pre-implementation reading §2b describes:
100
+ thread runs longer than the Issue itself it is exactly the pre-implementation reading `delegation.md` describes:
102
101
  brief a delegated unit to return **the agreements in force plus the comment URLs that carry them**,
103
102
  never the comment text.
104
103