@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
|
@@ -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
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
|
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
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
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
|
-
|
|
207
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
131
|
-
|
|
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
|
|
146
|
-
|
|
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
|