@rallycry/conveyor-skills 1.0.4 → 1.0.6

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rallycry/conveyor-skills",
3
- "version": "1.0.4",
3
+ "version": "1.0.6",
4
4
  "description": "Shared Claude Code skills for Conveyor consumer repos, linked into .claude/skills via the conveyor-skills CLI",
5
5
  "keywords": [
6
6
  "claude",
@@ -33,10 +33,45 @@ out in an **Environment** note — never assume; check which one you are in.
33
33
  - **Never boot another environment for work you are doing.** Locally that
34
34
  means never `mcp__conveyor__start_task` (it exists only on the local/MCP
35
35
  surface, and it spawns a cloud pod that duplicates you). In a pod driving a
36
- pack it means never `mcp__conveyor__start_child_cloud_build` /
37
- `mcp__conveyor__stop_child_build` you implement the children yourself,
38
- serially. Parallel fan-out is a deliberate choice the user makes by pressing
39
- Build on the parent, not something a build session opts into.
36
+ pack there is no tool that fires a child build at all — you implement the
37
+ children yourself, serially. A pack has one execution model in both
38
+ environments: one session owns all the state.
39
+
40
+ ## Goal and finish line
41
+
42
+ Which goal applies depends on the route below. State it once, then hold it: a
43
+ run ends when its finish line is true, not earlier.
44
+
45
+ **Task path goal:** a pull request for this card.
46
+ **Finish line:** the card in ReviewPR, the PR open, CI started. Then aftercare
47
+ per `## Aftercare` — in a pod you stay wake-able; standalone locally you stop.
48
+ **A task turn may end only when:** a harness-tracked background gate is in
49
+ flight (Claude Code only); you are blocked on a human with the question posted;
50
+ or the finish line is true.
51
+
52
+ **Pack path goal:** the WHOLE pack, not one child. Per child the goal covers
53
+ the full cycle: plan reviewed and promoted → implemented on the pack branch →
54
+ gated → reviewer-of-record pass → merged (locally) or
55
+ `mcp__conveyor__update_task` → ReviewDev (pod) → base synced. Then
56
+ cross-reference, then the finale.
57
+ **Finish line:** every child is ReviewDev, Complete, or Cancelled AND the
58
+ parent's finale PR into the base branch is open with CI started. One child done
59
+ is not the finish line. A turn that ends with a ready child and no wake armed
60
+ is the failure this section exists to prevent.
61
+ **A pack turn may end only when:** a harness-tracked background gate is in
62
+ flight (Claude Code only — Codex holds the gate's command session open
63
+ instead); you are blocked on a human with the parked protocol posted; or the
64
+ finale PR is open and green-and-quiet. Nothing else. Anything else is a stalled
65
+ run, not a paused one.
66
+
67
+ **Runtime:** *Codex CLI* — before the first step (Setup step 1 on the pack
68
+ path), create a thread goal with your goal tool whose objective is the finish
69
+ line sentence for this route, naming the card slug. Call `update_goal` with
70
+ `complete` only when that finish line is true (for a pack: the finale PR is
71
+ open); `blocked` only per the parked protocol; never because the budget is
72
+ low. *Claude Code* — there is no goal tool; the pacing rule in
73
+ [references/pack-path.md](references/pack-path.md) is the loop, and its pack
74
+ heartbeat is the fallback.
40
75
 
41
76
  ## Environment
42
77
 
@@ -19,7 +19,8 @@ alternative is where pack incidents come from.
19
19
  parent already InProgress/ReviewPR has a coordinator — report and stop
20
20
  rather than compete.
21
21
  2. **Ensure the pack branch exists on origin.** Use the card's `githubBranch`
22
- if set; otherwise cut `ft/<parent-slug>` from `origin/dev`, push `-u`, and
22
+ if set; otherwise cut `ft/<parent-slug>` from `origin/<base>` (the card's base
23
+ branch — usually `dev`), push `-u`, and
23
24
  IMMEDIATELY record it: `mcp__conveyor__update_task` with
24
25
  `githubBranch: <branch>`.
25
26
 
@@ -96,18 +97,39 @@ End a turn with children remaining ONLY when a wake is guaranteed:
96
97
 
97
98
  - **A background gate is in flight.** Its completion notification re-invokes
98
99
  you. (Launch it with the harness's `run_in_background`; hand-rolled
99
- backgrounding wakes nothing.)
100
+ backgrounding wakes nothing.) *Codex CLI substitution:* Codex has no
101
+ background gate. Hold the gate's command session open until it returns an
102
+ exit result, then continue in the same turn — ending the turn is not how a
103
+ Codex runner waits.
100
104
  - **You are blocked on a human** — the parked protocol below. The user's chat
101
105
  reply is the wake.
102
106
  - **The finale PR is open and quiet** — the Babysit tier. Green and quiet is
103
107
  the end.
104
108
 
105
- Any other end-of-turn must arm `ScheduleWakeup` first: 60–90s, prompt
106
- restating which child comes next. That is the pod-sanctioned mechanism (the
107
- pod prompt allows `ScheduleWakeup` exactly when nothing else will notify you),
108
- and it is a rare exception, not the cadence. Never end a turn "to report
109
- progress" chat is where progress goes, and posting there does not end the
110
- pack.
109
+ Any other end-of-turn is runtime-specific:
110
+
111
+ **Claude Code.** Arm `ScheduleWakeup` first: 60–90s, prompt restating which
112
+ child comes next. That is the pod-sanctioned mechanism (the pod prompt allows
113
+ `ScheduleWakeup` exactly when nothing else will notify you), and it is a rare
114
+ exception, not the cadence. On top of it, run a **pack heartbeat**: at Setup,
115
+ before the first child, arm ONE long fallback wake (`ScheduleWakeup`,
116
+ 1200–1500s) whose prompt is the pack continuation — "re-derive with
117
+ `mcp__conveyor__list_subtasks` and take the next ready child; if nothing is
118
+ ready and no gate is in flight, stop" — and re-arm it at every child boundary
119
+ so exactly one is outstanding. A heartbeat that fires mid-work re-derives
120
+ state and is a no-op. This is NOT the "insurance wakeup" the pod prompt
121
+ forbids: that rule is about a background job's own completion notification,
122
+ which does fire. Nothing at all notifies a pack between children, so the
123
+ heartbeat is the only guaranteed wake a Claude pack has. Do not delete it.
124
+
125
+ **Codex CLI.** There is no `ScheduleWakeup` and no `/loop`. The thread goal
126
+ created per the SKILL.md *Goal and finish line* section is the continuation:
127
+ an idle thread is re-prompted to keep working toward it. The only way to leave
128
+ a child ready is therefore to keep working in the same turn — merge, next
129
+ child, merge. Mark the goal complete only when the finale PR is open.
130
+
131
+ Never end a turn "to report progress" — in either runtime, chat is where
132
+ progress goes, and posting there does not end the pack.
111
133
 
112
134
  **Pre-exit invariant.** Before ending ANY turn, re-run
113
135
  `mcp__conveyor__list_subtasks`. A child that is `Open` with its dependencies
@@ -141,6 +163,12 @@ spell the argument differently (`base:` locally, `baseBranch:` in a pod).
141
163
  > always opens the PR for the card the session is bound to, so mid-pack it would
142
164
  > open the PARENT's PR early and strand every remaining child. One commit per
143
165
  > child keeps the single final PR reviewable child by child.
166
+ >
167
+ > Every child status write carries the child's id: claim with
168
+ > `mcp__conveyor__update_task(task_id: <child>, status: "InProgress")` and land
169
+ > with `update_task(task_id: <child>, status: "ReviewDev")`. Without `task_id`
170
+ > the write targets the PARENT card you are bound to. No per-child build fires
171
+ > in a pod, so a status you do not write is a board that silently lies.
144
172
 
145
173
  Before opening the child's PR, re-check the parent's status. If it went
146
174
  InProgress or ReviewPR, a coordinator took over: post that you are yielding,
@@ -203,12 +231,11 @@ leave the branch pushed, and stop.
203
231
  `githubBranch: <pack>`), advance the child by hand (`update_task` →
204
232
  `ReviewDev`), and post the drift to parent chat so it is visible.
205
233
  3. **Sync `dev` into the pack branch — yours to do, in either environment.**
206
- (The fan-out cloud path had the server do this before each child launch; a
207
- session driving the pack itself gets no such help and resolves conflicts
208
- in-session.)
234
+ Nothing server-side syncs the pack branch for you; a session driving the
235
+ pack resolves conflicts in-session.
209
236
 
210
237
  ```bash
211
- git checkout <pack> && git pull && git fetch origin dev && git merge origin/dev --no-edit && git push
238
+ git checkout <pack> && git pull && git fetch origin <base> && git merge origin/<base> --no-edit && git push
212
239
  ```
213
240
 
214
241
  **Merge, never rebase** — the pack branch is shared with open child PRs and
@@ -217,7 +244,7 @@ leave the branch pushed, and stop.
217
244
 
218
245
  If the merge drags in unrelated changes or errors, `dev` may have been
219
246
  rewound (a revert or force-push). Verify the previous sync point is still an
220
- ancestor of `origin/dev` (`git merge-base --is-ancestor`); if it is not,
247
+ ancestor of `origin/<base>` (`git merge-base --is-ancestor`); if it is not,
221
248
  abort the merge and escalate rather than chasing the noise.
222
249
  4. Report the merge to parent chat in a line or two.
223
250
 
@@ -227,7 +254,7 @@ leave the branch pushed, and stop.
227
254
  pack branch's actual state against the acceptance and verification criteria
228
255
  — a real checklist pass, not a vibe. Small gap → fix on the pack branch.
229
256
  Substantial gap → a new child card with a plan, and the loop continues.
230
- 2. Pre-PR protocol on the pack branch: sync `origin/dev` FIRST, then ONE
257
+ 2. Pre-PR protocol on the pack branch: sync `origin/<base>` FIRST, then ONE
231
258
  verification pass scoped to the pack's cumulative diff against `dev`
232
259
  (cross-package packs earn the full suite).
233
260
  3. `mcp__conveyor__create_pull_request` on the PARENT: `head:` the pack branch,
@@ -19,6 +19,34 @@ identification decides.** Moving the card to Open fires identification
19
19
  automatically (story points, icon, agent, and tags if you set none). Never set
20
20
  icon or story points yourself, and never `start_task` unless the user asks.
21
21
 
22
+ ## Goal and finish line
23
+
24
+ **Goal:** a plan on this card that a context-free executor can build, or one
25
+ batched round of questions for a human when scope is genuinely ambiguous.
26
+ **Finish line:** the plan is saved with `mcp__conveyor__update_task` AND the
27
+ recommendation is posted with `mcp__conveyor__post_to_chat` and
28
+ `milestone: "plan_ready"`. In a pod, story points and risk are also set
29
+ (`mcp__conveyor__update_task_properties`) and plan mode is exited.
30
+ **A turn may end only when:** (a) the finish line above is true, or (b) an
31
+ `AskUserQuestion` is pending. Nothing else. Anything else is a stalled run, not
32
+ a paused one.
33
+
34
+ **Never ask whether to start building, and never offer to.** Once the plan is
35
+ saved, the handoff is not yours: in the cloud the system spawns a separate
36
+ Builder session for the card, and locally a human runs `/conveyor-build` when
37
+ they are ready. Until one of those happens, every further turn on this card is
38
+ a plan iteration — read the feedback, revise, re-save, re-post `plan_ready`.
39
+ Do not claim the card, do not touch the tree, and do not invoke
40
+ `/conveyor-build` unprompted. (Locally the user may ask for it in the same
41
+ session; that request is the only trigger.)
42
+
43
+ **Runtime:** *Codex CLI* — before Phase 0, create a thread goal with your goal
44
+ tool whose objective is: "Save a plan on card <slug> that a context-free
45
+ builder can execute, or ask the blocking questions; do not start
46
+ implementation." Mark it complete only when the finish line is true, never
47
+ because the budget is low. *Claude Code* — there is no goal tool; the finish
48
+ line and the two turn endings above are the loop.
49
+
22
50
  ## Phase 0 — Resolve context
23
51
 
24
52
  1. `mcp__conveyor__get_connection_context` (all Conveyor tools fully-qualified;
@@ -135,7 +163,10 @@ touching Conveyor, unless they asked you to just ship it.
135
163
  > does not exist in a pod. In a pod, the card exists and you are on it: save
136
164
  > the plan with `mcp__conveyor__update_task` (`plan`, and `description` if it
137
165
  > needs sharpening), post the same recommendation message to chat with
138
- > `milestone: "plan_ready"`, and stop a pod does not promote its own card to
166
+ > `milestone: "plan_ready"`, and stop. "Stop" means end the turn with no
167
+ > question about starting work — per *Goal and finish line*, the Builder is a
168
+ > separate session the system spawns, and every later turn here is a plan
169
+ > iteration. A pod does not promote its own card to
139
170
  > Open. A parked plan is never `blocked`: that milestone means you cannot
140
171
  > continue until a human acts, and it pages nobody. To page a person, ask them
141
172
  > with AskUserQuestion. If the pod also has to leave
@@ -26,6 +26,30 @@ process, this skill loses: a project's own rules outrank a general one.
26
26
  PR touches are not this PR's job — note them in chat if they matter, or file
27
27
  a suggestion, but do not block on them.
28
28
 
29
+ ## Goal and finish line
30
+
31
+ **Goal:** one verdict on this PR.
32
+ **Finish line:** the environment's verdict tool returned success —
33
+ `mcp__conveyor__approve_code_review` / `mcp__conveyor__request_code_changes`
34
+ in a pod, `mcp__conveyor__approve_task` / `mcp__conveyor__request_changes`
35
+ locally — OR a blocked note is posted with the specific blocker and no verdict
36
+ (the `## Blocked` case).
37
+ **A turn may end only when:** (a) the verdict call succeeded — read the
38
+ response; a "superseded by a newer review cycle" error is not success; (b) the
39
+ blocked note is posted; or (c) you pushed your own fix and are waiting for CI
40
+ before approving. Nothing else. Findings posted with no verdict called is a
41
+ stalled review, not a paused one.
42
+
43
+ **Reviewer of record for a pack child** has no verdict tool: its finish line is
44
+ the merge (locally) or the `mcp__conveyor__update_task` → ReviewDev write
45
+ (pod), and the pack path's goal wording in conveyor-build governs instead.
46
+
47
+ **Runtime:** *Codex CLI* — before reading the change, create a thread goal with
48
+ your goal tool: "Render exactly one review verdict on PR <n> for card <slug>."
49
+ Mark it complete only after the verdict call succeeded, never because the
50
+ budget is low. *Claude Code* — there is no goal tool; the finish line above is
51
+ the loop.
52
+
29
53
  ## Read the change
30
54
 
31
55
  1. `mcp__conveyor__get_task` for the plan — you cannot judge "does this do what
@@ -127,8 +151,8 @@ which no pod reviewer could follow. Same defect the story-points paragraph below
127
151
  already records.
128
152
 
129
153
  Story points are deliberately NOT yours to change. `update_task`'s agent
130
- surface omits `storyPointValue` on purpose, and a pod review session has no
131
- tool that carries it — so this used to be an instruction no reviewer could
154
+ surface omits `storyPointValue` on purpose, and no pod tool carries the card's
155
+ OWN story points — so this used to be an instruction no reviewer could
132
156
  follow. It is also a gate you sit behind rather than above: story points set
133
157
  the card's graduated merge minimum, so a reviewer that could lower them would
134
158
  be lowering the bar for merging the very PR under review. Flag a mis-sized
@@ -142,11 +166,26 @@ is the reviewer, and the independent review happens later on the pack's PR into
142
166
 
143
167
  - Apply the same criteria above. The absence of an automated pass makes this
144
168
  review more load-bearing, not less.
145
- - There is **no verdict tool** — merging the child PR is the approval. Say what
146
- you checked in chat so the record exists.
169
+ - There is **no verdict tool** — merging the child PR (locally) or the
170
+ `mcp__conveyor__update_task` ReviewDev write (pod) is the approval, and
171
+ that write or merge is this review's finish line; the pack path's goal
172
+ wording applies. Say what you checked in chat so the record exists.
147
173
  - You wrote this code, which makes self-review the weak point. An independent
148
174
  reviewer with the diff and no memory of writing it catches what you cannot.
149
175
 
176
+ ## Reviewing a pack's finale PR
177
+
178
+ A pack parent's PR into the base branch is an ordinary review of the pack's
179
+ cumulative diff — there is no coordination job. The parent's own session
180
+ implemented every child, so read the whole diff against the base and render one
181
+ verdict as above. Child cards have no merge gate of their own, so correcting a
182
+ CHILD's story points with `mcp__conveyor__update_subtask` (`storyPointValue`)
183
+ when the actual work diverged from the estimate is legitimate here, in either
184
+ direction — where the tool exists: a pod's review runner and a local session
185
+ carry it, a task session flipped to review does not (flag the mis-size in the
186
+ verdict instead). The parent card's own story points stay off-limits per the
187
+ note above.
188
+
150
189
  ## Blocked
151
190
 
152
191
  If the PR cannot be reviewed as it stands — the plan is missing, the diff is