@joshuafolkken/kit 1.1136.0 → 1.1166.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.
- package/.claude/settings.json +4 -4
- package/.claude/skills/epic-commands/SKILL.md +27 -239
- package/.claude/skills/epic-commands/epic-bundle.md +115 -0
- package/.claude/skills/epic-commands/execution-waves.md +126 -0
- package/.claude/skills/workflow-commands/SKILL.md +48 -194
- package/.claude/skills/workflow-commands/background-commands.md +1 -1
- package/.claude/skills/workflow-commands/backlogrun-child.md +12 -123
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +11 -60
- package/.claude/skills/workflow-commands/backlogrun-park.md +10 -8
- package/.claude/skills/workflow-commands/backlogrun-progress.md +17 -173
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +155 -0
- package/.claude/skills/workflow-commands/backlogrun-steps.md +64 -144
- package/.claude/skills/workflow-commands/backlogrun.md +5 -4
- package/.claude/skills/workflow-commands/chain-rule.md +3 -2
- package/.claude/skills/workflow-commands/delegation.md +2 -2
- package/.claude/skills/workflow-commands/entry-sequence.md +62 -0
- package/.claude/skills/workflow-commands/followup.md +104 -181
- package/.claude/skills/workflow-commands/fullrun-steps.md +8 -9
- package/.claude/skills/workflow-commands/fullrun.md +16 -73
- package/.claude/skills/workflow-commands/halfrun.md +10 -36
- package/.claude/skills/workflow-commands/into-target.md +4 -4
- package/.claude/skills/workflow-commands/issue-comments.md +7 -8
- package/.claude/skills/workflow-commands/issue-scout.md +6 -6
- package/.claude/skills/workflow-commands/kickoff.md +6 -6
- package/.claude/skills/workflow-commands/needs-human-review.md +6 -6
- package/.claude/skills/workflow-commands/observation-filing.md +21 -172
- package/.claude/skills/workflow-commands/observation-ledger.md +150 -0
- package/.claude/skills/workflow-commands/pre-gate-cut.md +33 -93
- package/.claude/skills/workflow-commands/prerequisite.md +6 -6
- package/.claude/skills/workflow-commands/progress-watcher.md +90 -0
- package/.claude/skills/workflow-commands/prrun.md +5 -5
- package/.claude/skills/workflow-commands/retrospective.md +9 -9
- package/.claude/skills/workflow-commands/split-assessment.md +2 -2
- package/.claude/skills/workflow-commands/target-repository.md +2 -2
- package/.claude/skills/workflow-commands/working-tree-hold.md +7 -5
- package/.codex/hooks.json +4 -4
- package/AGENTS.md +1 -6
- package/CLAUDE.md +58 -120
- package/GEMINI.md +1 -6
- package/dist/CLAUDE.md +58 -120
- package/dist/hooks/batch-guard.js +4 -4
- package/dist/hooks/{chunk-NFZGFGOR.js → chunk-5KTCMCOT.js} +14 -1
- package/dist/hooks/{chunk-LJBLGHEH.js → chunk-A6P7PN7P.js} +4 -6
- package/dist/hooks/{chunk-FO2I7UT7.js → chunk-ANJ2WGFD.js} +1 -1
- package/dist/hooks/{chunk-GDU26K3J.js → chunk-DYAVAM6S.js} +563 -126
- package/dist/hooks/{chunk-RFWWUI5F.js → chunk-ENA7P5FB.js} +3 -3
- package/dist/hooks/{chunk-KBXZLMRH.js → chunk-GU5MATVE.js} +213 -65
- package/dist/hooks/chunk-GYNGP7HI.js +56 -0
- package/dist/hooks/{chunk-HBKZLITF.js → chunk-URJA6XY4.js} +4 -4
- package/dist/hooks/{chunk-KOKOAV6D.js → chunk-V2BTOZHT.js} +6 -4
- package/dist/hooks/{chunk-JKKTVDAG.js → chunk-ZDZ555YH.js} +100 -20
- package/dist/hooks/codex-hook-adapter.js +10 -10
- package/dist/hooks/duplicate-read-guard.js +5 -5
- package/dist/hooks/format-edited.js +2 -2
- package/dist/hooks/inputs.json +193 -192
- package/dist/hooks/investigation-guard.js +5 -5
- package/dist/hooks/pretool-guard.js +11 -10
- package/dist/hooks/stop-guard.js +5 -5
- package/dist/josh.js +25 -2
- package/dist/version/index.js +5 -1
- package/package.json +2 -1
- package/prompts/collaboration-workflow/file-edits.md +11 -10
- package/prompts/collaboration-workflow/gh-rest.md +2 -4
- package/prompts/collaboration-workflow/glossary.md +1 -1
- package/prompts/collaboration-workflow/issue-citation.md +5 -9
- package/prompts/collaboration-workflow/issue-template.md +40 -115
- package/prompts/collaboration-workflow/operating-rules.md +4 -5
- package/prompts/collaboration-workflow/output-bounds.md +12 -78
- package/prompts/collaboration-workflow/overview.md +7 -13
- package/prompts/collaboration-workflow/plan-comment.md +11 -39
- package/prompts/collaboration-workflow/principles.md +3 -4
- package/prompts/collaboration-workflow/report-format.md +28 -74
- package/prompts/collaboration-workflow/residency.md +12 -109
- package/prompts/collaboration-workflow/rule-delivery.md +98 -97
- package/prompts/collaboration-workflow/shell-body.md +3 -13
- package/prompts/collaboration-workflow/turn-batching.md +14 -88
- package/prompts/collaboration-workflow/upstream-interrupt.md +12 -14
- package/prompts/collaboration-workflow/wip-cap.md +6 -45
- package/prompts/collaboration-workflow.md +1 -13
- package/prompts/review-rubric.md +8 -71
- package/prompts/review.md +25 -55
- package/prompts/testing-guide.md +18 -67
- package/scripts/agent/agent-role-profile.ts +1 -1
- package/scripts/agent/codex-hooks.ts +3 -12
- package/scripts/backlog/backlog-budget.ts +1 -1
- package/scripts/backlog/backlog-drive-cli.ts +4 -3
- package/scripts/backlog/backlog-drive-offer-argv.ts +10 -1
- package/scripts/backlog/backlog-offer.ts +6 -6
- package/scripts/behavior/behavior-rules.ts +11 -4
- package/scripts/delegation/investigation-reads.ts +5 -5
- package/scripts/discovery/repo-discovery.ts +21 -7
- package/scripts/discovery/repo-origin.ts +26 -0
- package/scripts/discovery/repo-party.ts +42 -1
- package/scripts/document/backlogrun-parent-read-set.ts +14 -15
- package/scripts/document/document-byte-budget.ts +34 -20
- package/scripts/document/entry-read-budget.ts +21 -9
- package/scripts/document/lane-child-read-set.ts +12 -14
- package/scripts/document/read-set-cli.ts +4 -4
- package/scripts/document/read-set-point-of-use.ts +10 -2
- package/scripts/document/resident-budget.ts +47 -0
- package/scripts/epic/epic-shape.ts +10 -13
- package/scripts/epic/epic-solo.ts +1 -1
- package/scripts/exports/unused-members-cli.ts +7 -3
- package/scripts/gh/git-gh-api-path.ts +7 -0
- package/scripts/hooks/pretool-guard-cli.ts +2 -2
- package/scripts/hooks/pretool-guard.ts +45 -2
- package/scripts/hooks/run-hook.sh +41 -0
- package/scripts/init/hook-command-rewrite.ts +18 -35
- package/scripts/init/hook-launch.ts +21 -32
- package/scripts/issue/issue-auto-ok.ts +95 -0
- package/scripts/issue/issue-file-cli.ts +53 -7
- package/scripts/issue/issue-file.ts +28 -5
- package/scripts/issue/issue-labels.ts +12 -12
- package/scripts/issue/issue-rank.ts +1 -1
- package/scripts/issue/issue-read-cli.ts +3 -3
- package/scripts/issue/issue-read.ts +2 -2
- package/scripts/issue/issue-scout-cli.ts +2 -2
- package/scripts/issue/issue-state-cli.ts +1 -1
- package/scripts/issue/issue-state.ts +2 -2
- package/scripts/issue/issue-wip.ts +70 -0
- package/scripts/josh/hook-decision.ts +17 -0
- package/scripts/josh/josh-commands-development.ts +10 -0
- package/scripts/josh/josh-commands-issue.ts +2 -2
- package/scripts/lines/bytes-command.ts +29 -6
- package/scripts/observations/observation-ledger-line.ts +1 -1
- package/scripts/release/release-progress.ts +167 -0
- package/scripts/release/release-publish.ts +19 -8
- package/scripts/release/release-tag.ts +22 -8
- package/scripts/rules/decision-oracle-stage.ts +1 -1
- package/scripts/rules/decision-oracle.ts +6 -6
- package/scripts/rules/delivered-rules.ts +11 -11
- package/scripts/rules/direct-pr-create.ts +110 -0
- package/scripts/rules/file-body.ts +98 -42
- package/scripts/rules/filing-cap.ts +2 -2
- package/scripts/rules/filing-offer.ts +1 -1
- package/scripts/rules/gh-api.ts +18 -1
- package/scripts/rules/implementation-cut.ts +3 -1
- package/scripts/rules/lane-background.ts +67 -10
- package/scripts/rules/permission-guards.ts +10 -2
- package/scripts/rules/stop-rules.ts +4 -4
- package/scripts/rules/test-declared-commit.ts +1 -1
- package/scripts/rules/third-party-write.ts +56 -12
- package/scripts/run/run-cut-handoff.ts +21 -1
- package/scripts/run/run-entry-cli.ts +11 -3
- package/scripts/run/run-hold-cli.ts +16 -2
- package/scripts/run/run-label.ts +50 -0
- package/scripts/run/run-merge-steps.ts +8 -3
- package/scripts/run/run-merge.ts +1 -1
- package/scripts/run/run-prep-cli.ts +6 -2
- package/scripts/run/run-prep.ts +17 -0
- package/scripts/run/run-ship-preflight.ts +34 -3
- package/scripts/run/run-ship-review-steps.ts +1 -1
- package/scripts/run/run-ship-review.ts +26 -5
- package/scripts/run/run-step-cli.ts +20 -7
- package/scripts/run/run-wake-driver.ts +24 -1
- package/scripts/run/run-wake-session.ts +2 -1
- package/scripts/test/test-declared-logic.ts +1 -1
- package/scripts/time-runtime/time-batch-guard.ts +52 -16
- package/scripts/time-runtime/time-density-hook.ts +20 -2
- package/scripts/time-runtime/time-density.ts +4 -3
- package/scripts/time-runtime/time-markers.ts +15 -4
- package/scripts/version/npm-registry.ts +11 -1
- package/templates/workflows/ci.yml +9 -1
- package/.claude/skills/workflow-commands/followup-reference.md +0 -118
- 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:
|
|
4
|
-
|
|
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
|
-
|
|
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.
|
|
36
|
-
|
|
37
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
47
|
+
## `auto-merge` — Default `fullrun` behavior
|
|
100
48
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
-
|
|
110
|
-
|
|
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
|
-
|
|
67
|
+
## Completion notifications: always via `pnpm josh followup`
|
|
114
68
|
|
|
115
|
-
|
|
116
|
-
pnpm josh
|
|
117
|
-
|
|
118
|
-
|
|
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
|
-
|
|
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
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
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
|
-
|
|
144
|
-
decoration**: leave it out and this command merges.
|
|
85
|
+
## Reading the stage-timing block
|
|
145
86
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
166
|
-
pnpm josh ms
|
|
101
|
+
pnpm josh notify --task-type failure --issue-url "<issue-url>" --body-file <reason-file>
|
|
167
102
|
```
|
|
168
103
|
|
|
169
|
-
|
|
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
|
-
|
|
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
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
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
|
-
|
|
13
|
-
`
|
|
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 (`
|
|
56
|
-
`<N>`. (3) Add
|
|
57
|
-
`in-progress
|
|
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
|
|
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
|
|
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).
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
|
10
|
+
## The difference — the entry and the end
|
|
13
11
|
|
|
14
|
-
**
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|
-
|
|
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
|
|
65
|
-
|
|
66
|
-
the cut
|
|
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)
|
|
10
|
-
|
|
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
|
|
13
|
+
## The difference — the entry
|
|
13
14
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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>`:
|
|
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 `
|
|
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
|
|
4
|
-
an `into <target>` suffix, not at any entry** (joshuafolkken/kit#2161). A run given a `#N`
|
|
5
|
-
`new` never reaches it, so it costs a workflow entry nothing to leave it here. `SKILL.md` →
|
|
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
|
|
4
|
-
|
|
5
|
-
|
|
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
|
|
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
|
|
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
|
|