@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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rallycry/conveyor-skills",
3
- "version": "1.0.3",
3
+ "version": "1.0.5",
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",
@@ -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 **pod**
240
- > you stay wake-able: the system wakes you on CI results and review comments,
241
- > so go idle rather than polling. In a **standalone local run** there is no
242
- > wake mechanism report the card and PR state to the user and STOP. No
243
- > pacing, no loop, no babysitting; a follow-up CI fix is a fresh ask. Under
244
- > `conveyor-local-loop` the loop's own Babysit tier owns aftercare instead, and
245
- > its pacing rules govern.
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 turns, not one
86
-
87
- A pack of any size will not fit in a single turn, and there is no partial
88
- credit for a tree left mid-child. Treat **one iteration = one step** (implement
89
- one child, or merge one, or the finale) and end the turn on a committed,
90
- pushed state.
91
-
92
- - Driven by `/loop` (locally) or woken by events (in a pod): do one step, then
93
- end the turn. Under `/loop` with no interval, arm the next wake before
94
- ending — short (60–90s) while there is a child ready to work, long
95
- (1200–1800s) while waiting on something external, and **stop the loop** once
96
- the finale PR is open and quiet.
97
- - Invoked bare with no loop: do one step, report where the pack stands and what
98
- the next step is, and stop. Do not self-schedule.
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 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
@@ -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 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