@rallycry/conveyor-skills 0.1.3 → 1.0.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/README.md +19 -5
- package/package.json +1 -1
- package/skills/conveyor-build/SKILL.md +262 -0
- package/skills/conveyor-build/references/pack-path.md +224 -0
- package/skills/conveyor-build/references/task-path.md +67 -0
- package/skills/conveyor-consensus/SKILL.md +99 -0
- package/skills/conveyor-consensus/references/doc-template.html +204 -0
- package/skills/conveyor-local-loop/SKILL.md +34 -41
- package/skills/conveyor-meeting-review/SKILL.md +72 -0
- package/skills/conveyor-plan/SKILL.md +85 -12
- package/skills/conveyor-plan/references/plan-format.md +82 -5
- package/skills/conveyor-review/SKILL.md +161 -0
- package/skills/conveyor-start/SKILL.md +106 -0
- package/skills/conveyor-triage/SKILL.md +174 -0
- package/skills/conveyor-workflows/SKILL.md +34 -8
- package/skills/conveyor-local-pack/SKILL.md +0 -223
- package/skills/conveyor-local-task/SKILL.md +0 -92
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: conveyor-triage
|
|
3
|
+
description: Investigate an unverified report — an incident, a bug card, a machine-filed error — until the root cause is either named or honestly declared unknown, then hand it to a Builder as a planned card. Use when the user says "/conveyor-triage <card>", "triage this incident", "what's causing this report", or when a triage session boots on a report card. Ends in a plan and a handoff, never in a pull request.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Conveyor Triage
|
|
7
|
+
|
|
8
|
+
Turn a report into either a **named root cause with a fix plan**, a **precise
|
|
9
|
+
statement of what is still unknown**, or a **cancellation with an explanation**.
|
|
10
|
+
|
|
11
|
+
**Triage does not ship code.** Even when you find the cause and the fix is
|
|
12
|
+
obvious, you write it down and hand it off — the card goes to a Builder with a
|
|
13
|
+
plan, story-point recommendation, and your evidence. A triager that starts
|
|
14
|
+
implementing loses the thing that makes triage valuable: an honest account of
|
|
15
|
+
what is actually known.
|
|
16
|
+
|
|
17
|
+
**Default to triage.** A precise "here is what I ruled out and what I could not
|
|
18
|
+
determine" is more useful than a confident wrong fix.
|
|
19
|
+
|
|
20
|
+
## Ground rules
|
|
21
|
+
|
|
22
|
+
- **All Conveyor tools fully-qualified** — `mcp__conveyor__get_task`, not
|
|
23
|
+
`get_task`.
|
|
24
|
+
- **Reports are not infallible, and many are machine-filed** — error
|
|
25
|
+
boundaries and internal reporters produce titles that are whatever the
|
|
26
|
+
throwing code said, not a considered bug report. Read the code before
|
|
27
|
+
believing the description.
|
|
28
|
+
- **Repo-specific commands are the host repo's business.** Gate commands, log
|
|
29
|
+
queries, rule paths, and database access all live in its CLAUDE.md and rules.
|
|
30
|
+
This skill says *what to establish*, not which command establishes it.
|
|
31
|
+
|
|
32
|
+
## 1. Claim it
|
|
33
|
+
|
|
34
|
+
Move the card to `InProgress` with `mcp__conveyor__update_task` and say in chat
|
|
35
|
+
that you are investigating. The status move is the claim — it is what stops a
|
|
36
|
+
second session picking up the same report.
|
|
37
|
+
|
|
38
|
+
## 2. Check whether this is a repeat
|
|
39
|
+
|
|
40
|
+
**Incident dedup reopens closed cards.** A report you are reading as new may be
|
|
41
|
+
the third occurrence, with the original investigation already in its chat. Read
|
|
42
|
+
`mcp__conveyor__read_task_chat` before trusting the description's timeline — a
|
|
43
|
+
reopen changes what the evidence means, and "nobody noticed the reopen" is
|
|
44
|
+
itself worth a suggestion.
|
|
45
|
+
|
|
46
|
+
## 3. Gather telemetry before reading code
|
|
47
|
+
|
|
48
|
+
Pull what the report actually carries first — its attachments
|
|
49
|
+
(`mcp__conveyor__list_task_files`, `mcp__conveyor__get_attachment`), the stack,
|
|
50
|
+
the structured context, and the card's own chat.
|
|
51
|
+
|
|
52
|
+
> **Environment — the log tooling is NOT the same on both surfaces, and this
|
|
53
|
+
> is the difference that decides how far triage can get.**
|
|
54
|
+
>
|
|
55
|
+
> **Locally** (conveyor-mcp) you have the full set:
|
|
56
|
+
> `mcp__conveyor__query_gcp_logs` and `mcp__conveyor__query_grafana_logs` for
|
|
57
|
+
> production telemetry, `mcp__conveyor__get_task_logs` for a card's agent
|
|
58
|
+
> history, and `mcp__conveyor__get_task_sessions` for compute state.
|
|
59
|
+
>
|
|
60
|
+
> **In a pod, none of those exist.** The only equivalent is
|
|
61
|
+
> `mcp__conveyor__get_execution_logs`, which reads *this* card's own CLI
|
|
62
|
+
> history — not production, and not another card's. A pod triage session
|
|
63
|
+
> therefore cannot reach production telemetry at all.
|
|
64
|
+
>
|
|
65
|
+
> That is a limit on your CONCLUSION, not just on your tooling. If naming the
|
|
66
|
+
> root cause requires production logs and you are in a pod, the honest outcome
|
|
67
|
+
> is a triage handoff that says exactly which query would settle it — not a
|
|
68
|
+
> guess dressed as a finding.
|
|
69
|
+
|
|
70
|
+
Note which environment the report came from before querying; asking the wrong
|
|
71
|
+
one produces confident nonsense.
|
|
72
|
+
|
|
73
|
+
**Write down what the report does NOT contain.** Missing route, missing user,
|
|
74
|
+
missing build revision, missing screenshot — each gap is both a limit on your
|
|
75
|
+
conclusion and a suggestion to file in step 7.
|
|
76
|
+
|
|
77
|
+
## 4. Locate and reproduce
|
|
78
|
+
|
|
79
|
+
Find the code path the report implicates and, where you can, reproduce it. A
|
|
80
|
+
diagnosis grounded only in reading is a hypothesis; a reproduction makes it a
|
|
81
|
+
finding. Attach evidence to the card with `mcp__conveyor__upload_attachment` —
|
|
82
|
+
a screenshot, a log excerpt, a short recording — so the Builder inherits proof
|
|
83
|
+
rather than your assertion.
|
|
84
|
+
|
|
85
|
+
## 5. Decide
|
|
86
|
+
|
|
87
|
+
### Hand off for a fix — only if ALL of these hold
|
|
88
|
+
|
|
89
|
+
- You can name the root cause **in code** — not "something in permissions", not
|
|
90
|
+
"probably a race".
|
|
91
|
+
- The fix is self-contained: no unverifiable migration, no multi-service
|
|
92
|
+
redesign.
|
|
93
|
+
- You are confident it will not regress adjacent behavior, checked against the
|
|
94
|
+
domain's rules.
|
|
95
|
+
- **That confidence is grounded in telemetry or a reproduction, not in code
|
|
96
|
+
reading alone.** If neither backs the diagnosis, triage instead.
|
|
97
|
+
|
|
98
|
+
### Triage — if ANY of these hold
|
|
99
|
+
|
|
100
|
+
- The description is vague: no specific element, action, or expected-vs-actual.
|
|
101
|
+
- No clear cause after a genuine investigation.
|
|
102
|
+
- Intermittent, and telemetry does not explain it.
|
|
103
|
+
- Needs a repro environment, design input, production-data access, or infra
|
|
104
|
+
changes you cannot make safely.
|
|
105
|
+
|
|
106
|
+
### Cancel — if ANY of these hold
|
|
107
|
+
|
|
108
|
+
- The code behaves as designed and the reporter's expectation was wrong.
|
|
109
|
+
- The "bug" describes functionality that does not exist yet — that is a feature
|
|
110
|
+
request; file it with `mcp__conveyor__create_suggestion`.
|
|
111
|
+
- The reporter appears confused about how the feature works.
|
|
112
|
+
|
|
113
|
+
Post a clear, non-dismissive explanation **before** cancelling. A cancellation
|
|
114
|
+
with no explanation reads as dismissal and the report will come back.
|
|
115
|
+
|
|
116
|
+
### Before you call it "already fixed" or "stale pre-fix data" — verify both halves
|
|
117
|
+
|
|
118
|
+
This verdict needs two facts, each **checked**, never assumed:
|
|
119
|
+
|
|
120
|
+
1. **Was the fix actually deployed in the code the report ran against?**
|
|
121
|
+
Establish which environment and which branch, then check whether the fix
|
|
122
|
+
commit is an ancestor of what was running, and compare its merge time
|
|
123
|
+
against the card's creation **and any reopen timestamps**.
|
|
124
|
+
2. **Does the data predate the fix?** Look up the subject entity's age; the
|
|
125
|
+
report does not carry it.
|
|
126
|
+
|
|
127
|
+
The self-contradiction that signals a bad diagnosis: *"the fix is deployed"*
|
|
128
|
+
and *"the data predates the fix"* cannot both be true for an entity created
|
|
129
|
+
after the deploy. A report filed today, on an environment carrying the fix for
|
|
130
|
+
days, about an entity created today, is a **live bug** — reproduce it on
|
|
131
|
+
current code rather than writing it off. And never inherit a previous
|
|
132
|
+
investigation's "this predates the fix" conclusion without re-running check 1.
|
|
133
|
+
|
|
134
|
+
## 6. Write the outcome onto the card
|
|
135
|
+
|
|
136
|
+
**Handing off for a fix:** save a plan with `mcp__conveyor__update_task` that
|
|
137
|
+
names the root cause with `file.ts:line` citations, states the fix and the
|
|
138
|
+
files it touches, lists the verification a Builder should run, and recommends
|
|
139
|
+
story points and risk. Then move the card to `Open` so a Builder can claim it.
|
|
140
|
+
Do **not** cut a branch, and do **not** open a PR.
|
|
141
|
+
|
|
142
|
+
**Triaging:** post what you established, what you ruled out, and precisely what
|
|
143
|
+
is still unknown — including what evidence would resolve it. Then move it to
|
|
144
|
+
`Open`. "Needs a repro with the console open" is an actionable handoff;
|
|
145
|
+
"couldn't reproduce" is not.
|
|
146
|
+
|
|
147
|
+
**Cancelling:** explain the actual behavior, then cancel.
|
|
148
|
+
|
|
149
|
+
## 7. File at least one suggestion — always
|
|
150
|
+
|
|
151
|
+
Every triage produces at least one `mcp__conveyor__create_suggestion`, in
|
|
152
|
+
parallel with the outcome above. Investigation is the only time the gaps in
|
|
153
|
+
your own reporting pipeline are visible; the moment passes.
|
|
154
|
+
|
|
155
|
+
| What you observed | What to suggest |
|
|
156
|
+
| --- | --- |
|
|
157
|
+
| The report carried only a message and a stack | Enrich reports with route, user, and build revision |
|
|
158
|
+
| No trace id, so it could not be correlated to server spans | Propagate trace context from client to server |
|
|
159
|
+
| No console output captured | Capture browser console output in reports |
|
|
160
|
+
| Visual bug with no screenshot | Add viewport capture to the report form |
|
|
161
|
+
| A reopened dedup hit that nobody noticed | Surface reopen count and timestamps on the card |
|
|
162
|
+
| A generic title that deduped wrongly | Tune the report fingerprint for that source |
|
|
163
|
+
| No expected-vs-actual in the description | Add structured expected/actual fields to the form |
|
|
164
|
+
| You read five or more files to understand a domain with no rule doc | Add a rule doc for that domain |
|
|
165
|
+
| A test would have caught this | Add coverage for that path — found by report, not CI |
|
|
166
|
+
|
|
167
|
+
Use `mcp__conveyor__list_tags` to pick real tag names; unknown names come back
|
|
168
|
+
in the result rather than failing the call.
|
|
169
|
+
|
|
170
|
+
## Improve This Skill
|
|
171
|
+
|
|
172
|
+
If this skill was insufficient or slowed the work down, file it with
|
|
173
|
+
`mcp__conveyor__create_suggestion` on the Conveyor project: the issue,
|
|
174
|
+
evidence, and proposed fix.
|
|
@@ -52,11 +52,13 @@ and let Conveyor's own automation do the linking.
|
|
|
52
52
|
repo-relative files and symbols, runnable testing commands, decisions
|
|
53
53
|
already made recorded in Notes. Format and sizing:
|
|
54
54
|
[../conveyor-plan/references/plan-format.md](../conveyor-plan/references/plan-format.md).
|
|
55
|
-
For research-backed planning
|
|
56
|
-
|
|
55
|
+
For research-backed planning, use the `conveyor-plan` skill — it is the first
|
|
56
|
+
half of the pair below.
|
|
57
57
|
- **One card per deliverable/PR** (mirror packs below are the documented
|
|
58
58
|
exception). Multi-PR work becomes a pack: children via
|
|
59
|
-
`mcp__conveyor__create_subtask` (
|
|
59
|
+
`mcp__conveyor__create_subtask` (new children) or
|
|
60
|
+
`mcp__conveyor__set_task_parent` (adopt an existing card into the pack, or
|
|
61
|
+
detach one with `parentTaskId: null`), with
|
|
60
62
|
`mcp__conveyor__add_dependency` edges. Orchestration packs run children as
|
|
61
63
|
their own builds/PRs; mirror packs (children created with
|
|
62
64
|
`followParentStatus: true` on `create_subtask`) document already-done work
|
|
@@ -102,13 +104,37 @@ labels. Each tag carries a `description` (≤255 — the summary), an `overview`
|
|
|
102
104
|
`status: "InProgress"` plus a chat note saying who/where is working it.
|
|
103
105
|
Never hand-move a card to `ReviewPR` or set its PR link — that transition
|
|
104
106
|
belongs to `create_pull_request` / the PR sync.
|
|
107
|
+
- **One skill per lifecycle phase, and they mean the same thing everywhere.** A
|
|
108
|
+
cloud pod running a card and a local session working one read the SAME skill
|
|
109
|
+
text; the handful of genuine environment differences (WIP autosync, whether
|
|
110
|
+
`create_pull_request` pushes for you, which verdict tools exist, shared vs
|
|
111
|
+
dedicated dev stack) are called out inline.
|
|
112
|
+
|
|
113
|
+
| Phase | Skill |
|
|
114
|
+
| --- | --- |
|
|
115
|
+
| Investigate an unverified report | `conveyor-triage` → hands off a planned card, never a PR |
|
|
116
|
+
| Plan the work | `conveyor-plan` → writes an executable plan onto the card |
|
|
117
|
+
| Hand it to the cloud | `conveyor-start` → starts a pod and confirms it came up (local surface only — `start_task` does not exist in a pod) |
|
|
118
|
+
| Do the work here | `conveyor-build` → follows the plan to a PR |
|
|
119
|
+
| Judge the work | `conveyor-review` → one verdict, with risk |
|
|
120
|
+
| Work a whole queue locally | `conveyor-local-loop` → selection and pacing over the above |
|
|
121
|
+
|
|
122
|
+
`conveyor-start` and `conveyor-build` are the same phase reached two ways —
|
|
123
|
+
hand the card off, or do it in this checkout — so the choice is about where
|
|
124
|
+
the work runs, not about what happens to the card. `conveyor-build` routes a
|
|
125
|
+
childless card to its task path and a feature-branch pack to its pack path on
|
|
126
|
+
its own; you do not pick. And an
|
|
127
|
+
incident goes to `conveyor-triage` before `conveyor-plan` — planning a fix
|
|
128
|
+
from a symptom is how the wrong thing gets built confidently.
|
|
105
129
|
- **Cloud or local**: `mcp__conveyor__start_task` boots a cloud agent
|
|
106
130
|
environment for an Open card (that agent run is the card's "build" —
|
|
107
|
-
`mcp__conveyor__get_build_status` reports it)
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
131
|
+
`mcp__conveyor__get_build_status` reports it), and that agent runs
|
|
132
|
+
`conveyor-build` itself. To execute cards on the local machine instead, use
|
|
133
|
+
`conveyor-build` directly for one card, or `conveyor-local-loop` to work a
|
|
134
|
+
whole queue. Don't do both — a started task's agent will duplicate local
|
|
135
|
+
work. The loop idles on `conveyor-wait`, a CLI in `@rallycry/conveyor-mcp`
|
|
136
|
+
that blocks until a card becomes claimable, so an idle loop wakes on a board
|
|
137
|
+
event instead of a timer.
|
|
112
138
|
- **Reserved-branch trap**: a card with an assigned agent may have a reserved
|
|
113
139
|
`githubBranch`. Check `get_task` before pushing: if set, push to THAT
|
|
114
140
|
branch; a PR from any other branch gets auto-closed and unlinked.
|
|
@@ -1,223 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: conveyor-local-pack
|
|
3
|
-
description: Drive one Conveyor pack (parent card + children) on this machine start to finish — this session is BOTH the pack coordinator and every child's implementer. Work children serially in dependency order, PR each into the pack branch, review + merge locally, sync dev after every merge, then land the whole pack as one final parent PR into dev. The local alternative to pressing Build on a parent card. Use when the user says "/conveyor-local-pack <card>", "drive this pack locally", or "run the whole pack on my machine". One invocation = one step (next child, a merge, or the finale); run continuously with "/loop /conveyor-local-pack <card>" (no interval) and it self-paces until the final PR is green, then stops itself. For a single non-pack card use conveyor-local-task; to work the whole Open queue (packs included) use conveyor-local-loop.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Conveyor Local Pack
|
|
7
|
-
|
|
8
|
-
The cloud pack runner's autonomous loop (`pack-runner-prompt.ts`), adapted to
|
|
9
|
-
one machine. Two deliberate differences from the pod version:
|
|
10
|
-
|
|
11
|
-
- **No coordination-only rule.** The cloud runner fires child pods and never
|
|
12
|
-
writes code; here the same session implements each child itself.
|
|
13
|
-
- **No server-side base sync.** The server merges dev into the pack branch
|
|
14
|
-
before each cloud child launch; locally that sync is your job, after every
|
|
15
|
-
child merge.
|
|
16
|
-
|
|
17
|
-
Everything else carries over: the card is the spec, task chat is the log, and
|
|
18
|
-
the host repo's CLAUDE.md governs gates, verification, and PR mechanics. This
|
|
19
|
-
skill assumes a feature-branch pack — children branch from and PR into the
|
|
20
|
-
pack branch, and the pack lands on dev in ONE final PR. If the parent has no
|
|
21
|
-
feature branch (children PR straight into dev), this skill does not apply:
|
|
22
|
-
run /conveyor-local-loop over the children instead.
|
|
23
|
-
|
|
24
|
-
## Ground rules
|
|
25
|
-
|
|
26
|
-
- **The parent card stays PARKED until the final PR.** Never
|
|
27
|
-
`mcp__conveyor__start_task` the parent and never set it InProgress: the pack
|
|
28
|
-
watchdog and child-event notifier ignore parked parents, but an ACTIVE
|
|
29
|
-
parent treats a headless InProgress child as a dead agent environment and
|
|
30
|
-
"recovers" it onto a cloud pod — duplicate implementation (observed
|
|
31
|
-
2026-07-28). The final `create_pull_request` is what moves the parent to
|
|
32
|
-
ReviewPR. Parent already InProgress/ReviewPR at setup → a coordinator is (or
|
|
33
|
-
was) active; report and stop rather than compete.
|
|
34
|
-
- **Conveyor is the state store.** A pack spans days and the session gets
|
|
35
|
-
compacted; every iteration re-derives state from `mcp__conveyor__get_task` +
|
|
36
|
-
`mcp__conveyor__list_subtasks`, never from conversation memory.
|
|
37
|
-
- **All Conveyor tools fully-qualified** (`mcp__conveyor__get_task`; bare
|
|
38
|
-
names fail).
|
|
39
|
-
- **WIP = 1, strictly serial.** One child at a time, in dependency order. No
|
|
40
|
-
cloud offload: never `start_task` a child — a pod would duplicate the local
|
|
41
|
-
work. Want parallel fan-out? Press Build on the parent instead.
|
|
42
|
-
- **You are the reviewer of record for child PRs** — the automated code
|
|
43
|
-
reviewer skips PRs that target the pack branch. Review each child diff for
|
|
44
|
-
real before merging; the independent review happens on the pack's final PR
|
|
45
|
-
into dev (automated reviewer + human).
|
|
46
|
-
- **Never approve or merge the FINAL parent PR.** Finish line = parent in
|
|
47
|
-
ReviewPR with green CI; the user takes it from there.
|
|
48
|
-
- **Child PRs into the pack branch get NO CI** (Conveyor runs CI on PRs to
|
|
49
|
-
dev/main only) — the local gate pass is the ONLY verification before a
|
|
50
|
-
child merges. Mandatory, never skippable. In a repo that does run CI on
|
|
51
|
-
pack-branch PRs, let it finish before merging.
|
|
52
|
-
- **Run in the main workspace checkout — never a git worktree.** The fully
|
|
53
|
-
provisioned main workspace (installed `node_modules`, `.env`/direnv auth
|
|
54
|
-
wiring, the running dev stack) is the whole value of local execution;
|
|
55
|
-
worktrees miss all of it and have consistently degraded agent sessions.
|
|
56
|
-
Clean tree before any branch switch is still a hard rule: dirty
|
|
57
|
-
`git status` at iteration start → touch nothing, report, idle — the
|
|
58
|
-
resolution is the user committing or stashing, not a second checkout.
|
|
59
|
-
- **Push early.** No pod WIP-autosync locally; committed-and-pushed is the
|
|
60
|
-
only durable state. Push child branches (`-u origin`) as soon as they
|
|
61
|
-
exist, and the pack branch after every merge/sync.
|
|
62
|
-
|
|
63
|
-
## Setup (first iteration only)
|
|
64
|
-
|
|
65
|
-
1. Resolve the parent card from the argument (slug/id/URL — required; without
|
|
66
|
-
one, ask which pack). `mcp__conveyor__get_task` +
|
|
67
|
-
`mcp__conveyor__read_task_chat`.
|
|
68
|
-
2. Confirm it is a parked feature-branch pack: has (or will have) children,
|
|
69
|
-
status not InProgress/ReviewPR, no active agent session.
|
|
70
|
-
3. Ensure the pack branch exists on origin: use the card's branch if set;
|
|
71
|
-
else cut `ft/<parent-slug>` from `origin/dev`, push `-u`, and IMMEDIATELY
|
|
72
|
-
record it on the card — `mcp__conveyor__update_task` with
|
|
73
|
-
`githubBranch: <branch>` (the branch must already be pushed; the API
|
|
74
|
-
verifies the ref exists). This write is load-bearing, not bookkeeping:
|
|
75
|
-
identification mints a competing `conveyor/*` branch onto any branchless
|
|
76
|
-
card it processes, and every pack-child merge handler keys on the card's
|
|
77
|
-
recorded branch matching the PRs' real base — a drifted record strands
|
|
78
|
-
externally-merged children in ReviewPR. Name the branch in the claim post
|
|
79
|
-
too.
|
|
80
|
-
4. No children yet? Break the work down first, exactly as a fresh cloud
|
|
81
|
-
parent would: explore the codebase, save the parent-level plan on the card
|
|
82
|
-
(`mcp__conveyor__update_task`), then `mcp__conveyor__create_subtask` each
|
|
83
|
-
child with a detailed standalone plan (file:line citations, verification
|
|
84
|
-
steps) and `dependsOn` wherever one blocks on another.
|
|
85
|
-
5. Post to parent chat: `[local-pack] claimed — driving this pack locally on
|
|
86
|
-
<hostname>, pack branch <branch>`.
|
|
87
|
-
|
|
88
|
-
## Iteration order
|
|
89
|
-
|
|
90
|
-
Each invocation re-reads the parent + `list_subtasks`, then does the FIRST
|
|
91
|
-
that applies:
|
|
92
|
-
|
|
93
|
-
1. **Recover** — a child with my `[local-pack] claimed` marker sitting
|
|
94
|
-
InProgress without a PR? Resume it. Its branch may exist locally or on
|
|
95
|
-
origin — audit what already landed before re-implementing anything.
|
|
96
|
-
2. **Merge** — a child in ReviewPR: merge path below.
|
|
97
|
-
3. **Promote** — a Planning child whose plan is solid:
|
|
98
|
-
`mcp__conveyor__update_subtask` → status Open (+ story points/agent if
|
|
99
|
-
unset). Genuinely not plannable → escalate to parent chat.
|
|
100
|
-
4. **Implement** — the next Open child with all dependencies met (a
|
|
101
|
-
dependency counts as met at ReviewDev/Complete — i.e. merged into the
|
|
102
|
-
pack — or Cancelled; ReviewPR is NOT met). No `dependsOn` set anywhere →
|
|
103
|
-
ordinal order. Implement path below.
|
|
104
|
-
5. **Finale** — every child ReviewDev/Complete: cross-reference + final PR,
|
|
105
|
-
below.
|
|
106
|
-
6. **Babysit** — final PR open: red CI or review comments → address directly
|
|
107
|
-
on the pack branch (never claim or work children once the parent is in
|
|
108
|
-
ReviewPR); green and quiet → post the wrap-up to parent chat and STOP the
|
|
109
|
-
loop.
|
|
110
|
-
|
|
111
|
-
## Implement a child
|
|
112
|
-
|
|
113
|
-
1. `mcp__conveyor__get_task` on the child — reload the full plan fresh every
|
|
114
|
-
time — + `read_task_chat` for addenda. Plan too thin for a context-free
|
|
115
|
-
reader → post what's missing to parent chat, skip it, take the next ready
|
|
116
|
-
child.
|
|
117
|
-
2. Claim: `mcp__conveyor__update_task` → InProgress, then chat marker
|
|
118
|
-
`[local-pack] claimed — working locally on <hostname>`.
|
|
119
|
-
3. Branch from the PACK branch, never dev: `git fetch origin <pack> && git
|
|
120
|
-
checkout -B <feat|fix|chore>/<child-slug> origin/<pack>`. If the child
|
|
121
|
-
already has a branch with commits on origin, resume THAT branch — audit it
|
|
122
|
-
first. Reinstall deps if the lockfile changed.
|
|
123
|
-
4. Work the plan. Chat updates at real milestones only, not play-by-play.
|
|
124
|
-
5. Verify per the host CLAUDE.md (scoped gates: `bun run check` +
|
|
125
|
-
`bun run test:affected`). Note `test:affected` diffs vs origin/dev, so on
|
|
126
|
-
a deep pack it naturally also covers previously merged children — that is
|
|
127
|
-
fine, not a bug to fix. UI-visible change → capture evidence and
|
|
128
|
-
`mcp__conveyor__upload_attachment` before the PR.
|
|
129
|
-
6. Refresh vs the pack branch (`git fetch origin <pack> && git merge
|
|
130
|
-
origin/<pack> --no-edit && git push`), then
|
|
131
|
-
`mcp__conveyor__create_pull_request` with `head:` the child branch and —
|
|
132
|
-
ALWAYS EXPLICITLY — `base:` the pack branch. The default base is dev;
|
|
133
|
-
omitting `base` opens the child against the wrong branch. Post a summary
|
|
134
|
-
to the child's chat.
|
|
135
|
-
|
|
136
|
-
## Merge a child (ReviewPR)
|
|
137
|
-
|
|
138
|
-
1. Reviewer-of-record pass: re-read the child's plan, then the FULL diff
|
|
139
|
-
(`git fetch origin <pack> <child> && git diff
|
|
140
|
-
origin/<pack>...origin/<child>`) with reviewer eyes — plan coverage,
|
|
141
|
-
stray files, pattern consistency, and that the gate pass actually
|
|
142
|
-
happened. Found a real problem → fix it on the child branch first (you are
|
|
143
|
-
also the implementer), re-gate, then continue.
|
|
144
|
-
2. Merge: `mcp__conveyor__approve_and_merge_pr`. Known trap: the merge queue
|
|
145
|
-
can NEVER auto-merge a zero-check pack-branch PR — if the merge queues
|
|
146
|
-
without landing, merge locally instead (`git checkout <pack> && git pull
|
|
147
|
-
&& git merge --no-ff <child-branch> && git push`; GitHub then marks the PR
|
|
148
|
-
merged). Either way CONFIRM the child advanced to ReviewDev
|
|
149
|
-
(`mcp__conveyor__get_task`; allow ~1 min for the merge webhook). Still
|
|
150
|
-
ReviewPR after a local-merge fallback is an escalation, not a shrug — it
|
|
151
|
-
means the parent card's `githubBranch` has drifted from the real pack
|
|
152
|
-
branch: fix the parent record (`mcp__conveyor__update_task` with
|
|
153
|
-
`githubBranch: <pack>`), advance the child by hand (`update_task` →
|
|
154
|
-
ReviewDev), and post the drift to parent chat.
|
|
155
|
-
3. **Sync dev into the pack branch** — the local stand-in for the server-side
|
|
156
|
-
base sync: `git checkout <pack> && git pull && git fetch origin dev && git
|
|
157
|
-
merge origin/dev --no-edit && git push`. Merge, never rebase: the pack
|
|
158
|
-
branch is shared (open child PRs, WIP refs) and rewriting it breaks them.
|
|
159
|
-
Conflicts are yours to resolve properly — you wrote the code. If the merge
|
|
160
|
-
drags in unrelated changes or errors, dev may have been rewound
|
|
161
|
-
(revert/force-push): verify the previous sync point is still an ancestor
|
|
162
|
-
of `origin/dev` (`git merge-base --is-ancestor`), and if not, abort the
|
|
163
|
-
merge and escalate instead of chasing the noise.
|
|
164
|
-
4. Report the merge to parent chat in one line. Next iteration begins the
|
|
165
|
-
next child.
|
|
166
|
-
|
|
167
|
-
## Finale (all children ReviewDev/Complete)
|
|
168
|
-
|
|
169
|
-
1. **Cross-reference:** for the parent plan and EVERY child plan, check the
|
|
170
|
-
pack branch's actual state against the plan's acceptance and verification
|
|
171
|
-
criteria — a real checklist pass, not a vibe. Small gap → fix directly on
|
|
172
|
-
the pack branch. Substantial gap → new child card with a plan
|
|
173
|
-
(`create_subtask`); the loop continues.
|
|
174
|
-
2. Pre-PR protocol on the pack branch, per the host CLAUDE.md: sync
|
|
175
|
-
`origin/dev` FIRST, then ONE verification pass scoped to the pack's
|
|
176
|
-
cumulative diff vs dev (cross-package packs → full `bun run test`).
|
|
177
|
-
3. `mcp__conveyor__create_pull_request` on the PARENT: `head:` pack branch,
|
|
178
|
-
`base:` dev. The parent moves to ReviewPR. Post the pack summary to parent
|
|
179
|
-
chat: what shipped per child, how it was verified, what reviewers should
|
|
180
|
-
look at.
|
|
181
|
-
4. Confirm CI actually started (read-only `gh pr checks`); do NOT wait on it
|
|
182
|
-
— the babysit tier owns it from here.
|
|
183
|
-
|
|
184
|
-
**Parked protocol** — after 2 genuinely different failed approaches on a
|
|
185
|
-
child, or a decision only the user can make: post `[local-pack] parked:
|
|
186
|
-
<reason + the specific question>` to the child AND the parent chat, set the
|
|
187
|
-
child back to Open, restore the tree, and take the next child whose
|
|
188
|
-
dependency chain doesn't run through the parked one. Everything remaining
|
|
189
|
-
blocked → idle long; the user's chat reply is the un-park signal.
|
|
190
|
-
|
|
191
|
-
## Pacing (dynamic /loop only)
|
|
192
|
-
|
|
193
|
-
Under `/loop` with no interval, end EVERY iteration with exactly one
|
|
194
|
-
`ScheduleWakeup` (prompt = the original /loop input verbatim, card argument
|
|
195
|
-
included):
|
|
196
|
-
|
|
197
|
-
| State | Delay | Reason should say |
|
|
198
|
-
|-------|-------|-------------------|
|
|
199
|
-
| A background gate is in flight — its completion notification is the real wake | 1200–1800s fallback | "fallback while <gate> runs" |
|
|
200
|
-
| Any actionable work: a child to implement/merge/promote, finale pending, red CI or comments on the final PR | 60–90s | which child / which step is next |
|
|
201
|
-
| Blocked on the user: parked children only, or a pack-level question posted | 1200–1800s | what it's waiting on |
|
|
202
|
-
| Loop-fatal: MCP dead after 2 tries, dirty tree, broken repo | notify the user (PushNotification if available), then 1800s — or `stop: true` if continuing is unsafe | what is wrong |
|
|
203
|
-
| Final PR green and quiet, wrap-up posted | `stop: true` | pack done |
|
|
204
|
-
|
|
205
|
-
Invoked bare (no /loop)? Run one iteration, report, and suggest
|
|
206
|
-
`/loop /conveyor-local-pack <card>` — don't self-schedule.
|
|
207
|
-
|
|
208
|
-
## What this is not
|
|
209
|
-
|
|
210
|
-
- Not a cloud coordinator: never `start_task` and never fire pods, for the
|
|
211
|
-
parent or a child. Serial local execution is the point; for parallel
|
|
212
|
-
fan-out, press Build on the parent instead of using this skill.
|
|
213
|
-
- Not the final reviewer: `approve_and_merge_pr` is for CHILD PRs into the
|
|
214
|
-
pack branch only — never the parent's PR into dev.
|
|
215
|
-
- Not a pod: the dev DB and dev-server ports are shared with the user's
|
|
216
|
-
interactive sessions — no destructive experiments, never reset the dev DB,
|
|
217
|
-
reuse a running dev stack rather than fighting over ports.
|
|
218
|
-
|
|
219
|
-
## Improve This Skill
|
|
220
|
-
|
|
221
|
-
If this skill was insufficient or slowed the work down, file it with
|
|
222
|
-
`mcp__conveyor__create_suggestion` on the Conveyor project: the issue,
|
|
223
|
-
evidence, and proposed fix.
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: conveyor-local-task
|
|
3
|
-
description: Complete ONE linked Conveyor card on this machine, start to ReviewPR — claim it, execute its plan in the main workspace, gate, open the PR, report, done. Use when the user says "/conveyor-local-task <card>", "do this card locally", or "complete this task on my machine". One card only, no queue and no loop — for a whole pack use conveyor-local-pack; to work everything Open (packs included) use conveyor-local-loop.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Conveyor Local Task
|
|
7
|
-
|
|
8
|
-
Execute one Conveyor card exactly as a claudespace agent would, using this
|
|
9
|
-
machine instead of a pod: the card IS the spec, task chat is the log, and the
|
|
10
|
-
host repo's CLAUDE.md governs gates, verification, and PR mechanics. This
|
|
11
|
-
skill adds only claiming, routing, and local-machine hygiene. Finish line =
|
|
12
|
-
card in ReviewPR with CI started; the user reviews and merges.
|
|
13
|
-
|
|
14
|
-
## Ground rules
|
|
15
|
-
|
|
16
|
-
- **All Conveyor tools fully-qualified** (`mcp__conveyor__get_task`; bare
|
|
17
|
-
names fail).
|
|
18
|
-
- **Run in the main workspace checkout — never a git worktree.** The fully
|
|
19
|
-
provisioned main workspace (installed `node_modules`, `.env`/direnv auth
|
|
20
|
-
wiring, the running dev stack) is the whole value of local execution;
|
|
21
|
-
worktrees miss all of it and have consistently degraded agent sessions.
|
|
22
|
-
Clean tree before any branch switch is a hard rule: dirty `git status` →
|
|
23
|
-
touch nothing and report — the resolution is the user committing or
|
|
24
|
-
stashing, not a second checkout.
|
|
25
|
-
- **Never `mcp__conveyor__start_task`** — that boots a cloud pod and
|
|
26
|
-
duplicates the work you're about to do locally.
|
|
27
|
-
- **Never approve or merge your own PR.** ReviewPR with green-or-running CI
|
|
28
|
-
is where you stop.
|
|
29
|
-
- **Push early.** There is no pod WIP-autosync locally; committed-and-pushed
|
|
30
|
-
is the only durable state. Push the branch (`-u origin`) as soon as it
|
|
31
|
-
exists.
|
|
32
|
-
- **Not a pod:** the dev DB and dev-server ports are shared with the user's
|
|
33
|
-
interactive sessions — no destructive experiments, never reset the dev DB,
|
|
34
|
-
reuse a running dev stack rather than fighting over ports.
|
|
35
|
-
|
|
36
|
-
## Resolve and route
|
|
37
|
-
|
|
38
|
-
1. Resolve the card from the argument (slug, id, or URL; none given → ask
|
|
39
|
-
which card). `mcp__conveyor__get_task` for the full plan +
|
|
40
|
-
`mcp__conveyor__read_task_chat` for addenda and user answers. Consult
|
|
41
|
-
`mcp__conveyor__get_tag` on the card's tags before diving in — the
|
|
42
|
-
overview + linked files are the fast path into the subsystem.
|
|
43
|
-
2. Route pack cards away:
|
|
44
|
-
- Card **has children** → it's a pack coordinator; point the user at
|
|
45
|
-
`/conveyor-local-pack` and stop. Children that PR straight into dev are
|
|
46
|
-
not a feature-branch pack — point at `/conveyor-local-loop` instead, or
|
|
47
|
-
run this skill on one child card.
|
|
48
|
-
- Card **has a `parentTaskId`** and the parent is InProgress or ReviewPR →
|
|
49
|
-
decline: an actively-orchestrating parent reads a headless InProgress
|
|
50
|
-
child as a dead agent environment and "recovers" it onto a cloud pod
|
|
51
|
-
(duplicate implementation). Parent parked → proceed; the child's base is
|
|
52
|
-
the parent's feature branch.
|
|
53
|
-
3. Plan missing or failing the context-free-reader bar → don't wing it: post
|
|
54
|
-
what's missing to chat and stop. The card must stand alone.
|
|
55
|
-
|
|
56
|
-
## Claim and execute
|
|
57
|
-
|
|
58
|
-
1. Re-confirm via `mcp__conveyor__get_task` that the card is claimable (Open —
|
|
59
|
-
or whatever the user explicitly overrode — with no assignee or active
|
|
60
|
-
session), then `mcp__conveyor__update_task` → `status: "InProgress"` and
|
|
61
|
-
`mcp__conveyor__post_to_chat`: `[local-task] claimed — working locally on
|
|
62
|
-
<hostname>`.
|
|
63
|
-
2. Branch from the card's base, never blindly dev: `base` = the card's
|
|
64
|
-
`baseBranch` (a pack child's base is the PARENT's feature branch). If the
|
|
65
|
-
card already has a `githubBranch` with commits on origin, resume THAT
|
|
66
|
-
branch — a prior pod may have landed real work; audit it before
|
|
67
|
-
re-implementing anything. Else `git fetch origin <base> && git checkout -B
|
|
68
|
-
<feat|fix|chore>/<slug> origin/<base>`. Reinstall deps if the lockfile
|
|
69
|
-
changed.
|
|
70
|
-
3. Work the plan. Post chat updates at real milestones only (claim, blocking
|
|
71
|
-
discovery, gates green, PR) — not play-by-play.
|
|
72
|
-
4. Verify per the host repo's CLAUDE.md policy (scoped gates). UI-visible
|
|
73
|
-
change → capture screenshot/recording evidence with the repo's tooling and
|
|
74
|
-
attach via `mcp__conveyor__upload_attachment` before opening the PR.
|
|
75
|
-
5. Refresh against the base (`git fetch origin <base> && git merge
|
|
76
|
-
origin/<base> --no-edit && git push`), then
|
|
77
|
-
`mcp__conveyor__create_pull_request` with `head:` your branch and — always
|
|
78
|
-
explicitly — `base:` the card's base branch. The card moves to ReviewPR.
|
|
79
|
-
Post a chat summary: what shipped, how verified, what to look at.
|
|
80
|
-
6. Confirm CI actually started (read-only `gh pr checks`); do NOT wait on it.
|
|
81
|
-
Report the card + PR state to the user — done. No pacing, no loop, no
|
|
82
|
-
babysitting: follow-up CI fixes are a fresh ask.
|
|
83
|
-
|
|
84
|
-
**Blocked** — after 2 genuinely different failed approaches, or on a decision
|
|
85
|
-
only the user can make: post to chat the reason + the specific question, set
|
|
86
|
-
the card back to `"Open"`, restore the tree (`git checkout dev`), and report.
|
|
87
|
-
|
|
88
|
-
## Improve This Skill
|
|
89
|
-
|
|
90
|
-
If this skill was insufficient or slowed the work down, file it with
|
|
91
|
-
`mcp__conveyor__create_suggestion` on the Conveyor project: the issue,
|
|
92
|
-
evidence, and proposed fix.
|