@rallycry/conveyor-skills 1.0.3 → 1.0.5
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
|
@@ -38,6 +38,42 @@ out in an **Environment** note — never assume; check which one you are in.
|
|
|
38
38
|
serially. Parallel fan-out is a deliberate choice the user makes by pressing
|
|
39
39
|
Build on the parent, not something a build session opts into.
|
|
40
40
|
|
|
41
|
+
## Goal and finish line
|
|
42
|
+
|
|
43
|
+
Which goal applies depends on the route below. State it once, then hold it: a
|
|
44
|
+
run ends when its finish line is true, not earlier.
|
|
45
|
+
|
|
46
|
+
**Task path goal:** a pull request for this card.
|
|
47
|
+
**Finish line:** the card in ReviewPR, the PR open, CI started. Then aftercare
|
|
48
|
+
per `## Aftercare` — in a pod you stay wake-able; standalone locally you stop.
|
|
49
|
+
**A task turn may end only when:** a harness-tracked background gate is in
|
|
50
|
+
flight (Claude Code only); you are blocked on a human with the question posted;
|
|
51
|
+
or the finish line is true.
|
|
52
|
+
|
|
53
|
+
**Pack path goal:** the WHOLE pack, not one child. Per child the goal covers
|
|
54
|
+
the full cycle: plan reviewed and promoted → implemented on the pack branch →
|
|
55
|
+
gated → reviewer-of-record pass → merged (locally) or
|
|
56
|
+
`mcp__conveyor__update_task` → ReviewDev (pod) → base synced. Then
|
|
57
|
+
cross-reference, then the finale.
|
|
58
|
+
**Finish line:** every child is ReviewDev, Complete, or Cancelled AND the
|
|
59
|
+
parent's finale PR into the base branch is open with CI started. One child done
|
|
60
|
+
is not the finish line. A turn that ends with a ready child and no wake armed
|
|
61
|
+
is the failure this section exists to prevent.
|
|
62
|
+
**A pack turn may end only when:** a harness-tracked background gate is in
|
|
63
|
+
flight (Claude Code only — Codex holds the gate's command session open
|
|
64
|
+
instead); you are blocked on a human with the parked protocol posted; or the
|
|
65
|
+
finale PR is open and green-and-quiet. Nothing else. Anything else is a stalled
|
|
66
|
+
run, not a paused one.
|
|
67
|
+
|
|
68
|
+
**Runtime:** *Codex CLI* — before the first step (Setup step 1 on the pack
|
|
69
|
+
path), create a thread goal with your goal tool whose objective is the finish
|
|
70
|
+
line sentence for this route, naming the card slug. Call `update_goal` with
|
|
71
|
+
`complete` only when that finish line is true (for a pack: the finale PR is
|
|
72
|
+
open); `blocked` only per the parked protocol; never because the budget is
|
|
73
|
+
low. *Claude Code* — there is no goal tool; the pacing rule in
|
|
74
|
+
[references/pack-path.md](references/pack-path.md) is the loop, and its pack
|
|
75
|
+
heartbeat is the fallback.
|
|
76
|
+
|
|
41
77
|
## Environment
|
|
42
78
|
|
|
43
79
|
Resolve which one you are in before touching git or the filesystem.
|
|
@@ -236,13 +272,14 @@ the merged base.
|
|
|
236
272
|
|
|
237
273
|
The card is in ReviewPR. What happens next depends on who is driving:
|
|
238
274
|
|
|
239
|
-
> **Environment — a pod is woken; a standalone local run is not.** In a
|
|
240
|
-
> you stay wake-able: the system wakes you on CI results and review
|
|
241
|
-
> so go idle rather than polling.
|
|
242
|
-
>
|
|
243
|
-
>
|
|
244
|
-
>
|
|
245
|
-
>
|
|
275
|
+
> **Environment — a pod is woken; a standalone local run is not.** In a
|
|
276
|
+
> **pod** you stay wake-able: the system wakes you on CI results and review
|
|
277
|
+
> comments, so go idle rather than polling. That holds only once the PR exists
|
|
278
|
+
> — mid-pack, nothing wakes either environment (see the pack path's pacing
|
|
279
|
+
> rule). In a **standalone local run** there is no wake mechanism — report the
|
|
280
|
+
> card and PR state to the user and STOP. No pacing, no loop, no babysitting;
|
|
281
|
+
> a follow-up CI fix is a fresh ask. Under `conveyor-local-loop` the loop's
|
|
282
|
+
> own Babysit tier owns aftercare instead, and its pacing rules govern.
|
|
246
283
|
|
|
247
284
|
When you are the one handling it:
|
|
248
285
|
|
|
@@ -82,23 +82,65 @@ session memory for pack state.
|
|
|
82
82
|
|
|
83
83
|
Work children **one at a time**. Interleaving them thrashes branch state.
|
|
84
84
|
|
|
85
|
-
## Pacing — a pack is many
|
|
86
|
-
|
|
87
|
-
A
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
-
|
|
98
|
-
|
|
85
|
+
## Pacing — a pack is many steps, not many turns
|
|
86
|
+
|
|
87
|
+
A child boundary is not a turn boundary. Keep driving the pack in the same
|
|
88
|
+
turn: merge, implement the next child, merge, cross-reference, finale. Nothing
|
|
89
|
+
wakes a pack session between children — not locally, and not in a pod, where
|
|
90
|
+
children have no PRs, no builds, and no CI to generate an event. A turn that
|
|
91
|
+
ends with a child still ready is a stalled pack, not a paused one: locally it
|
|
92
|
+
sits until a human re-runs the skill; in a pod it idles out, sleeps, and waits
|
|
93
|
+
on the pack watchdog — roughly an hour lost per occurrence.
|
|
94
|
+
|
|
95
|
+
End a turn with children remaining ONLY when a wake is guaranteed:
|
|
96
|
+
|
|
97
|
+
- **A background gate is in flight.** Its completion notification re-invokes
|
|
98
|
+
you. (Launch it with the harness's `run_in_background`; hand-rolled
|
|
99
|
+
backgrounding wakes nothing.) *Codex CLI substitution:* Codex has no
|
|
100
|
+
background gate. Hold the gate's command session open until it returns an
|
|
101
|
+
exit result, then continue in the same turn — ending the turn is not how a
|
|
102
|
+
Codex runner waits.
|
|
103
|
+
- **You are blocked on a human** — the parked protocol below. The user's chat
|
|
104
|
+
reply is the wake.
|
|
105
|
+
- **The finale PR is open and quiet** — the Babysit tier. Green and quiet is
|
|
106
|
+
the end.
|
|
107
|
+
|
|
108
|
+
Any other end-of-turn is runtime-specific:
|
|
109
|
+
|
|
110
|
+
**Claude Code.** Arm `ScheduleWakeup` first: 60–90s, prompt restating which
|
|
111
|
+
child comes next. That is the pod-sanctioned mechanism (the pod prompt allows
|
|
112
|
+
`ScheduleWakeup` exactly when nothing else will notify you), and it is a rare
|
|
113
|
+
exception, not the cadence. On top of it, run a **pack heartbeat**: at Setup,
|
|
114
|
+
before the first child, arm ONE long fallback wake (`ScheduleWakeup`,
|
|
115
|
+
1200–1500s) whose prompt is the pack continuation — "re-derive with
|
|
116
|
+
`mcp__conveyor__list_subtasks` and take the next ready child; if nothing is
|
|
117
|
+
ready and no gate is in flight, stop" — and re-arm it at every child boundary
|
|
118
|
+
so exactly one is outstanding. A heartbeat that fires mid-work re-derives
|
|
119
|
+
state and is a no-op. This is NOT the "insurance wakeup" the pod prompt
|
|
120
|
+
forbids: that rule is about a background job's own completion notification,
|
|
121
|
+
which does fire. Nothing at all notifies a pack between children, so the
|
|
122
|
+
heartbeat is the only guaranteed wake a Claude pack has. Do not delete it.
|
|
123
|
+
|
|
124
|
+
**Codex CLI.** There is no `ScheduleWakeup` and no `/loop`. The thread goal
|
|
125
|
+
created per the SKILL.md *Goal and finish line* section is the continuation:
|
|
126
|
+
an idle thread is re-prompted to keep working toward it. The only way to leave
|
|
127
|
+
a child ready is therefore to keep working in the same turn — merge, next
|
|
128
|
+
child, merge. Mark the goal complete only when the finale PR is open.
|
|
129
|
+
|
|
130
|
+
Never end a turn "to report progress" — in either runtime, chat is where
|
|
131
|
+
progress goes, and posting there does not end the pack.
|
|
132
|
+
|
|
133
|
+
**Pre-exit invariant.** Before ending ANY turn, re-run
|
|
134
|
+
`mcp__conveyor__list_subtasks`. A child that is `Open` with its dependencies
|
|
135
|
+
met, or `InProgress` under your claim, plus no background job in flight and no
|
|
136
|
+
parked question outstanding, means you are not done: continue, or arm the
|
|
137
|
+
wake. Ending a turn in that state without a wake is the bug this section
|
|
138
|
+
exists to prevent.
|
|
99
139
|
|
|
100
140
|
`conveyor-local-loop` supplies its own pacing table and its own claim-marker
|
|
101
|
-
prefix; when running under it, those govern.
|
|
141
|
+
prefix; when running under it, those govern. Under `/loop` the invariant above
|
|
142
|
+
still holds — the loop's re-invocation is a fallback for a dropped wake, never
|
|
143
|
+
a reason to stop after one child.
|
|
102
144
|
|
|
103
145
|
## Implement a child
|
|
104
146
|
|
|
@@ -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
|
|
@@ -142,8 +166,10 @@ 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
|
|