@rallycry/conveyor-agent 10.13.71 → 11.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/dist/{boot-PKHZUDAC.js → boot-PKQ2I66D.js} +56 -5
- package/dist/chunk-3F4ZZKCA.js +291 -0
- package/dist/{chunk-QU53HND5.js → chunk-GL2DIQEQ.js} +116 -47
- package/dist/chunk-JQVAWRVL.js +697 -0
- package/dist/chunk-N4WSUTGV.js +2564 -0
- package/dist/{chunk-7MMECTTJ.js → chunk-PEEGCZAR.js} +2257 -3701
- package/dist/{chunk-DOB2XE2I.js → chunk-UBDSLM44.js} +4 -2
- package/dist/{chunk-GJXAAPJ6.js → chunk-W4LZ7R6Z.js} +117 -400
- package/dist/chunk-XORJ6SII.js +46 -0
- package/dist/cli.js +304 -804
- package/dist/index.d.ts +170 -3
- package/dist/index.js +9 -5
- package/dist/serve-boot-YPAUKENG.js +225 -0
- package/dist/{server-CC7KUJOK.js → server-7XH7RYUX.js} +3 -2
- package/package.json +5 -4
- 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 +258 -0
- package/skills/conveyor-meeting-review/SKILL.md +72 -0
- package/skills/conveyor-plan/SKILL.md +177 -0
- package/skills/conveyor-plan/references/plan-format.md +134 -0
- 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 +195 -0
- package/skills/conveyor-workflows/references/mcp-setup.md +43 -0
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: conveyor-plan
|
|
3
|
+
description: Produce the plan for a Conveyor card — research-backed and immediately buildable by someone with zero session context. Use when the user says "/conveyor-plan <idea>", "plan this as a conveyor card", "write this up for a claudespace agent", or when a session is asked to plan the card it is on. Runs plan-mode-quality research (codebase + prior Conveyor cards + prod logs), asks clarifying questions only when scope is genuinely ambiguous, then writes the plan onto the card. Works in a cloud pod and a local checkout alike; to execute a plan that already exists use conveyor-build.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Conveyor Plan
|
|
7
|
+
|
|
8
|
+
Produce ONE artifact: a Conveyor card whose plan an executor with zero session
|
|
9
|
+
context can follow. Everything they need must be ON the card — they never see
|
|
10
|
+
this conversation, and that executor may be a cloud pod, a local session, or
|
|
11
|
+
you tomorrow.
|
|
12
|
+
|
|
13
|
+
The research and drafting below are identical everywhere. Only the two ends
|
|
14
|
+
differ — resolving which project you are in, and where the finished plan lands
|
|
15
|
+
— and both carry an **Environment** note.
|
|
16
|
+
|
|
17
|
+
The division of labor is fixed: **you research and recommend; Conveyor's
|
|
18
|
+
identification decides.** Moving the card to Open fires identification
|
|
19
|
+
automatically (story points, icon, agent, and tags if you set none). Never set
|
|
20
|
+
icon or story points yourself, and never `start_task` unless the user asks.
|
|
21
|
+
|
|
22
|
+
## Phase 0 — Resolve context
|
|
23
|
+
|
|
24
|
+
1. `mcp__conveyor__get_connection_context` (all Conveyor tools fully-qualified;
|
|
25
|
+
bare names fail). It also tells you which environment you are in: a pod
|
|
26
|
+
session reports a task binding and no user account.
|
|
27
|
+
|
|
28
|
+
> **Environment.** In a **pod** you are already bound to one project and one
|
|
29
|
+
> card — there is nothing to resolve, and `mcp__conveyor__list_projects`
|
|
30
|
+
> does not exist there. **Locally**, if the connection reports no default
|
|
31
|
+
> project, use `mcp__conveyor__list_projects` and match
|
|
32
|
+
> `githubRepoOwner/Name` to the cwd's `git remote`. Ambiguous → ask.
|
|
33
|
+
|
|
34
|
+
2. Copy project IDs exactly — a mistyped `projectId` surfaces as
|
|
35
|
+
"Insufficient permissions", not "not found". Verify the ID before
|
|
36
|
+
concluding you lack access.
|
|
37
|
+
|
|
38
|
+
## Phase 0.5 — What KIND of card is this?
|
|
39
|
+
|
|
40
|
+
The research below is the same for all three, but what counts as a finished
|
|
41
|
+
plan is not:
|
|
42
|
+
|
|
43
|
+
- **Task** — the default. Someone has decided the work should happen; your job
|
|
44
|
+
is to make it executable. Proceed as written below.
|
|
45
|
+
- **Suggestion** — someone thinks this *should* happen. Establish that the ask
|
|
46
|
+
is real and unmet **before** planning it: does the feature already exist in
|
|
47
|
+
some form, was it tried and cancelled before (and why), and is the underlying
|
|
48
|
+
need better served another way? A plan for something already shipped is worse
|
|
49
|
+
than no plan, because it will be built twice.
|
|
50
|
+
- **Incident, or any unverified report** — do **NOT** plan a fix from the
|
|
51
|
+
description. A report names a symptom, and the symptom is often not the bug;
|
|
52
|
+
machine-filed reports carry whatever the throwing code said. If the root
|
|
53
|
+
cause has not been established with telemetry or a reproduction, this card
|
|
54
|
+
needs **`/conveyor-triage`** first. Plan the fix only once triage has named
|
|
55
|
+
the cause.
|
|
56
|
+
|
|
57
|
+
## Phase 1 — Research (parallelize)
|
|
58
|
+
|
|
59
|
+
Scale to the idea's size; a one-file tweak needs minutes, not a survey.
|
|
60
|
+
|
|
61
|
+
- **Glossary first**: `mcp__conveyor__get_tag` on every tag the idea's text
|
|
62
|
+
mentions (`@[tag:id]` deep-links or plain loaded terms — "task", "school",
|
|
63
|
+
an entity name) before searching the codebase. A tag's overview + linked
|
|
64
|
+
files often replace a grep sweep, and the description catches
|
|
65
|
+
wrong-term-for-the-concept early (`mcp__conveyor__list_tags` shows the
|
|
66
|
+
inventory with hierarchy).
|
|
67
|
+
- **Codebase**: use a code-graph or architecture skill if the repo provides
|
|
68
|
+
one for architecture/flow questions; `rg` for exact strings. Fan out
|
|
69
|
+
Explore subagents for broad sweeps. Investigate deliberately rather than
|
|
70
|
+
reading around: search first and read second, start from 3-5 critical files,
|
|
71
|
+
form a hypothesis, then validate it with targeted reads. Never re-read a file
|
|
72
|
+
already in your context. **Stop when you can cite a specific `file.ts:line`
|
|
73
|
+
and a symbol name for every step your plan will contain** — that is the
|
|
74
|
+
threshold, and more reading past it buys nothing.
|
|
75
|
+
- **Prior art**: `mcp__conveyor__search_tasks` on 2-3 keyword variants
|
|
76
|
+
(`typeFilters` to include incidents/suggestions when relevant), then
|
|
77
|
+
`mcp__conveyor__get_task` on the closest hits. You're looking for duplicates
|
|
78
|
+
(stop and surface), related shipped work (reuse its patterns), and
|
|
79
|
+
cancelled attempts (learn why before re-proposing).
|
|
80
|
+
- **Prod signals** (only when the feature touches live behavior):
|
|
81
|
+
`mcp__conveyor__query_gcp_logs` / `mcp__conveyor__query_grafana_logs` for
|
|
82
|
+
error rates, actual usage, current behavior. **Environment:** these are
|
|
83
|
+
local/MCP only — a pod has no log tools, so state the question the logs would
|
|
84
|
+
answer in the plan's Notes instead of guessing at the answer.
|
|
85
|
+
- **Blast radius**: enumerate callers/consumers of every surface the plan
|
|
86
|
+
touches (shared packages, DB schema, published packages, webhooks, other
|
|
87
|
+
cards in flight on the same files). Unintended impact goes in the plan's
|
|
88
|
+
Notes, not in your head.
|
|
89
|
+
|
|
90
|
+
## Phase 2 — Clarify (only if needed)
|
|
91
|
+
|
|
92
|
+
Ask the user only decisions that change the plan's shape — scope cuts, UX
|
|
93
|
+
choices, irreversible tradeoffs. Batch them in one round; never drip. Facts
|
|
94
|
+
the repo can answer are yours to find, not theirs.
|
|
95
|
+
|
|
96
|
+
## Phase 3 — Draft the plan
|
|
97
|
+
|
|
98
|
+
Use the plan format in [references/plan-format.md](references/plan-format.md):
|
|
99
|
+
Objective / Approach / Implementation Steps / Testing / Notes / Builder briefing.
|
|
100
|
+
|
|
101
|
+
Actionability bar — every step must survive a context-free reader:
|
|
102
|
+
|
|
103
|
+
- Name exact repo-relative files and symbols, with the pattern to follow
|
|
104
|
+
("mirror `apps/api/src/services/task/methods/mutations.ts`").
|
|
105
|
+
- Testing = runnable commands + observable acceptance criteria.
|
|
106
|
+
- Notes = risks, blast radius, dependencies, and decisions already made (so
|
|
107
|
+
the executor doesn't relitigate them).
|
|
108
|
+
- No "as discussed", no links to this chat, no TODOs the executor must
|
|
109
|
+
research from scratch.
|
|
110
|
+
|
|
111
|
+
**Close with the Builder briefing, and write it for the NEXT session.** Every
|
|
112
|
+
other section addresses a reader; this one addresses the agent that will inherit
|
|
113
|
+
this card having read the card and nothing else — no research, no dead ends, no
|
|
114
|
+
memory of this conversation. Four lines, ~10 max: where to start, what is already
|
|
115
|
+
decided (and why, so it is not reopened), which traps look correct and are not,
|
|
116
|
+
and the order to verify in. Write it last, when you know which parts were hard.
|
|
117
|
+
|
|
118
|
+
It is not optional and it is not a summary. It is the only channel your context
|
|
119
|
+
has across the handoff, because handoffs carry the card and never the session.
|
|
120
|
+
|
|
121
|
+
Size it: 1 SP default, 2 multi-file, 3 complex patterns/design, 5 hard. Larger
|
|
122
|
+
→ propose a pack (parent + `mcp__conveyor__create_subtask` children) instead of
|
|
123
|
+
one mega-card. **Child→child ordering rides `create_subtask`/`update_subtask`'s
|
|
124
|
+
own `dependsOn` field, NOT `mcp__conveyor__add_dependency`** — on the pod surface
|
|
125
|
+
that tool is scoped to the session's own task and cannot draw an edge between two
|
|
126
|
+
children.
|
|
127
|
+
|
|
128
|
+
Show the user title + description + plan + SP/tag recommendation before
|
|
129
|
+
touching Conveyor, unless they asked you to just ship it.
|
|
130
|
+
|
|
131
|
+
## Phase 4 — Create and hand off (order matters)
|
|
132
|
+
|
|
133
|
+
> **Environment — a pod plans the card it is already on.** The steps below
|
|
134
|
+
> create a NEW card, which is the local/MCP shape; `mcp__conveyor__create_task`
|
|
135
|
+
> does not exist in a pod. In a pod, the card exists and you are on it: save
|
|
136
|
+
> the plan with `mcp__conveyor__update_task` (`plan`, and `description` if it
|
|
137
|
+
> needs sharpening), post the same recommendation message to chat, and stop —
|
|
138
|
+
> a pod does not promote its own card to Open. If the pod also has to leave
|
|
139
|
+
> plan mode, note that `update_task` carries no story points or risk; those go
|
|
140
|
+
> through `mcp__conveyor__update_task_properties`. Everything in Phases 1-3 is
|
|
141
|
+
> identical in both environments. To break a large pod card into a pack, use
|
|
142
|
+
> `mcp__conveyor__create_subtask` rather than `create_task`, and set child→child
|
|
143
|
+
> ordering through its `dependsOn` field — `mcp__conveyor__add_dependency` is
|
|
144
|
+
> scoped to the session's OWN task in a pod and cannot draw an edge between two
|
|
145
|
+
> children.
|
|
146
|
+
>
|
|
147
|
+
> **In a pod, create every child BEFORE you save the parent plan.** The parent
|
|
148
|
+
> plan save is what triggers the handoff, and the handoff reads the card's child
|
|
149
|
+
> count at that instant to decide what to spawn: children present → a pack
|
|
150
|
+
> coordinator that works them serially; none → a single leaf builder. Save the
|
|
151
|
+
> parent plan first and you hand a whole pack to a leaf builder. Order is
|
|
152
|
+
> therefore: children (with their plans and `dependsOn` edges) → parent plan
|
|
153
|
+
> LAST.
|
|
154
|
+
|
|
155
|
+
Identification fires the moment the card lands beyond Planning and reads task
|
|
156
|
+
chat for your recommendation — so chat BEFORE the status flip:
|
|
157
|
+
|
|
158
|
+
1. `mcp__conveyor__create_task` — `status: "Planning"`, concise imperative
|
|
159
|
+
title, 2-4 sentence description (the board-card summary), full plan.
|
|
160
|
+
Optionally `tags`: only names from `mcp__conveyor__list_tags` that clearly
|
|
161
|
+
fit (unknown names are rejected; pre-set tags make identification skip tag
|
|
162
|
+
assignment — when unsure, omit and let it choose).
|
|
163
|
+
2. `mcp__conveyor__post_to_chat` — one message: recommended SP + one-line
|
|
164
|
+
rationale, tag suggestion, any executor warnings.
|
|
165
|
+
3. `mcp__conveyor__update_task` — `status: "Open"` (+ `risk` when the plan
|
|
166
|
+
touches critical surface). This triggers identification.
|
|
167
|
+
4. Verify with `mcp__conveyor__get_task`: status Open, `agentId` set. SP and
|
|
168
|
+
tags are NOT in the `get_task` response — confirm on the board if needed.
|
|
169
|
+
5. Report the card URL (`<project url>/cards/<slug>`), what identification
|
|
170
|
+
filled, and that it's ready for `start_task`. Park-in-Planning instead if
|
|
171
|
+
the user wants to review first; offer (don't run) `start_task`.
|
|
172
|
+
|
|
173
|
+
## Improve This Skill
|
|
174
|
+
|
|
175
|
+
If this skill was insufficient or slowed the work down, file it with
|
|
176
|
+
`mcp__conveyor__create_suggestion` on the Conveyor project: the issue,
|
|
177
|
+
evidence, and proposed fix.
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# Conveyor Plan Format & Sizing
|
|
2
|
+
|
|
3
|
+
## Plan Format
|
|
4
|
+
|
|
5
|
+
```markdown
|
|
6
|
+
## Objective
|
|
7
|
+
One sentence: what this task accomplishes and why.
|
|
8
|
+
|
|
9
|
+
## Approach
|
|
10
|
+
High-level strategy with relevant files/patterns/APIs.
|
|
11
|
+
|
|
12
|
+
## Implementation Steps
|
|
13
|
+
1. Concrete step.
|
|
14
|
+
2. Concrete step.
|
|
15
|
+
|
|
16
|
+
## Testing
|
|
17
|
+
- Commands and manual checks.
|
|
18
|
+
- Edge cases.
|
|
19
|
+
|
|
20
|
+
## Notes
|
|
21
|
+
- Dependencies, risks, blockers, or files likely touched.
|
|
22
|
+
|
|
23
|
+
## Builder briefing
|
|
24
|
+
- **Start here:** the one or two files to open first.
|
|
25
|
+
- **Already decided:** choices the builder should not reopen, one line of why each.
|
|
26
|
+
- **Traps:** what looks right and is not.
|
|
27
|
+
- **Verify in this order:** cheapest disqualifying check first.
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Citations — ground every code step in the code
|
|
31
|
+
|
|
32
|
+
A plan an executor can follow names locations, not areas. For every step that
|
|
33
|
+
touches code:
|
|
34
|
+
|
|
35
|
+
- Cite the exact location as `path/from/repo/root.ts:lineNumber` (e.g.
|
|
36
|
+
`packages/conveyor-agent/src/execution/mode-prompt.ts:129`). Ranges are fine
|
|
37
|
+
for larger edits (`foo.ts:120-145`); a whole file with no line is not.
|
|
38
|
+
- Name the specific function, class, constant, or JSX element being touched.
|
|
39
|
+
- When behavior hinges on a short piece of code, quote 1–3 lines inline rather
|
|
40
|
+
than paraphrasing it.
|
|
41
|
+
- For a file that does not exist yet, write `NEW: path/to/new-file.ts` and
|
|
42
|
+
describe the module it fits into.
|
|
43
|
+
|
|
44
|
+
## The Testing section is a definition of done
|
|
45
|
+
|
|
46
|
+
The executor treats it as the acceptance criteria, so enumerate:
|
|
47
|
+
|
|
48
|
+
- The scoped verification for this change — the repo's own lint/typecheck and
|
|
49
|
+
affected-test commands — naming the specific package suites the diff will
|
|
50
|
+
touch. A docs-only plan should say plainly that no local gates are needed and
|
|
51
|
+
that CI validates on the PR.
|
|
52
|
+
- Any task-specific end-to-end check: a manual UI walk-through, an API smoke
|
|
53
|
+
test, a migration dry-run.
|
|
54
|
+
|
|
55
|
+
A planner working read-only is not expected to RUN these. Describe them.
|
|
56
|
+
|
|
57
|
+
## The Builder briefing is written for the NEXT session
|
|
58
|
+
|
|
59
|
+
The section that closes the plan is the only one not addressed to a reader — it
|
|
60
|
+
is addressed to the session that inherits this card, which has read **this card
|
|
61
|
+
and nothing else**. It has none of your research, none of your dead ends, and no
|
|
62
|
+
memory of the conversation that produced any of it.
|
|
63
|
+
|
|
64
|
+
That is deliberate. Handoffs carry the card, never the session (see the decision
|
|
65
|
+
record in `.claude/rules/agent-modes.md`), so this section is where a planner's
|
|
66
|
+
hard-won context survives the boundary — and it is the whole reason forking the
|
|
67
|
+
planner's session was not needed.
|
|
68
|
+
|
|
69
|
+
Four lines, one each:
|
|
70
|
+
|
|
71
|
+
- **Start here** — where to open the code, not a summary of it.
|
|
72
|
+
- **Already decided** — what NOT to reopen, with one line of why. This is the
|
|
73
|
+
highest-value line: without it a builder re-litigates a choice you already
|
|
74
|
+
made, and usually lands somewhere worse because it has less context.
|
|
75
|
+
- **Traps** — what looks correct and is not. Anything that cost you a wrong
|
|
76
|
+
turn will cost the builder the same one.
|
|
77
|
+
- **Verify in this order** — cheapest disqualifying check first, so a wrong
|
|
78
|
+
approach dies in seconds instead of at the gate.
|
|
79
|
+
|
|
80
|
+
**Bounded at ~10 lines.** If it runs longer, that is a signal about the plan
|
|
81
|
+
body, not about the briefing: something belonged in Approach, Implementation
|
|
82
|
+
Steps, or Testing and did not get there. Do not use it as an appendix, and do
|
|
83
|
+
not restate the steps — a briefing that repeats the plan is one more thing to
|
|
84
|
+
keep in sync.
|
|
85
|
+
|
|
86
|
+
Write it last, when you know which parts were hard.
|
|
87
|
+
|
|
88
|
+
## Sizing
|
|
89
|
+
|
|
90
|
+
Default **1 SP**. Use **2 SP** for multi-file work, **3 SP** for complex
|
|
91
|
+
patterns/design choices, **5 SP** only for hard work. Split anything larger.
|
|
92
|
+
|
|
93
|
+
## Packs (parent + child tasks)
|
|
94
|
+
|
|
95
|
+
A **pack** is Conveyor's bundle shape: a parent card with child cards.
|
|
96
|
+
`create_subtask(parentTaskId, ...)` creates a NEW child; to move an EXISTING
|
|
97
|
+
card under a parent (or out of one) use `set_task_parent`. `create_task` /
|
|
98
|
+
`update_task` have no parent field. Each child is a full card
|
|
99
|
+
(own chat, plan, story points). Split into a pack only when the work is
|
|
100
|
+
genuinely multiple independently buildable pieces (8-SP-tier); otherwise keep
|
|
101
|
+
one card.
|
|
102
|
+
|
|
103
|
+
- **Orchestration packs** (future work): `start_task` on the parent boots a
|
|
104
|
+
*pack runner* that works each ready child, honoring dependency edges. Give
|
|
105
|
+
each child a detailed plan with a **Testing / Verification** section —
|
|
106
|
+
identification sizes children like any other card. The parent card's
|
|
107
|
+
`featureBranch` setting (default on) makes children branch off and PR back
|
|
108
|
+
into the parent's branch instead of the default base.
|
|
109
|
+
|
|
110
|
+
**Every child needs a real plan, held to the same bar as a standalone card:**
|
|
111
|
+
a multi-step implementation guide with `file.ts:line` citations, the
|
|
112
|
+
function/symbol names it touches, a pattern to follow where one exists
|
|
113
|
+
("mirror `src/services/foo.ts`"), testing requirements, and acceptance
|
|
114
|
+
criteria. A one-line description is not a plan, and the executor cannot ask
|
|
115
|
+
you what you meant.
|
|
116
|
+
|
|
117
|
+
**Express cross-child ordering as `dependsOn` metadata, never as prose.**
|
|
118
|
+
Pass `dependsOn` (sibling ids or slugs) on `create_subtask` for any child
|
|
119
|
+
that blocks on another; leave genuinely independent children with none. A
|
|
120
|
+
runner schedules off those edges — "do this after step 2" written in plan
|
|
121
|
+
text is invisible to it, and the child will be picked up out of order.
|
|
122
|
+
- **Mirror packs** (already-done work shipping in ONE PR on the parent's
|
|
123
|
+
branch): create children with **`followParentStatus: true`** — title and a
|
|
124
|
+
plain-language description only. A follower mirrors its parent's status
|
|
125
|
+
automatically through the whole pipeline, identification sizes it, and it
|
|
126
|
+
never posts its own Slack card. Evidence rolls up to the **parent**. Never
|
|
127
|
+
`start_task` a mirror pack's parent, and leave children's PR fields empty —
|
|
128
|
+
the parent owns the PR.
|
|
129
|
+
|
|
130
|
+
## Status Flow
|
|
131
|
+
|
|
132
|
+
`Planning -> Open -> InProgress -> ReviewPR -> ReviewDev -> ReviewLive -> Complete`
|
|
133
|
+
|
|
134
|
+
`Cancelled` is terminal. A task must be `Open` before `start_task`.
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: conveyor-review
|
|
3
|
+
description: Review a Conveyor card's pull request and render a verdict — correctness, pattern consistency, security, performance, error handling, test coverage, typing, readability — fixing small issues directly and flagging the rest. Use when the user says "/conveyor-review <card or PR>", "review this PR", "do a code review", when a claudespace session boots in review mode, or when acting as reviewer of record for a pack child. Works in a cloud pod and a local checkout; the verdict tools differ per environment and the skill says which.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Conveyor Review
|
|
7
|
+
|
|
8
|
+
Read a PR against the plan it claims to implement, fix what is small, flag what
|
|
9
|
+
is not, and render exactly one verdict. The card is the spec, the diff is the
|
|
10
|
+
evidence, and task chat is where the team sees your reasoning.
|
|
11
|
+
|
|
12
|
+
**This skill is the mechanics.** Your *persona* — tone, how many issues to
|
|
13
|
+
raise, what this project cares about — comes from the reviewer agent's own
|
|
14
|
+
instructions, and from the host repo's CLAUDE.md. Where the two disagree about
|
|
15
|
+
process, this skill loses: a project's own rules outrank a general one.
|
|
16
|
+
|
|
17
|
+
## Ground rules
|
|
18
|
+
|
|
19
|
+
- **All Conveyor tools fully-qualified** — `mcp__conveyor__get_task`, not
|
|
20
|
+
`get_task`. Bare names fail.
|
|
21
|
+
- **Exactly one verdict per review.** Not zero (the card waits forever), not
|
|
22
|
+
two (the first one wins and the second is noise).
|
|
23
|
+
- **Substantive issues only.** Linting and formatting have their own gates;
|
|
24
|
+
spending a verdict on style spends the team's attention on the wrong thing.
|
|
25
|
+
- **Review the diff, not the repository.** Pre-existing problems in a file the
|
|
26
|
+
PR touches are not this PR's job — note them in chat if they matter, or file
|
|
27
|
+
a suggestion, but do not block on them.
|
|
28
|
+
|
|
29
|
+
## Read the change
|
|
30
|
+
|
|
31
|
+
1. `mcp__conveyor__get_task` for the plan — you cannot judge "does this do what
|
|
32
|
+
it says" without the "what it says".
|
|
33
|
+
2. **Ask the PR what you are reviewing, BEFORE any diff:**
|
|
34
|
+
`gh pr view <pr> --json state,baseRefName,headRefOid,files`. The PR's base is
|
|
35
|
+
often not the project default branch, and asking costs one call instead of
|
|
36
|
+
six spent guessing.
|
|
37
|
+
3. Get the diff with the **merge-base** form, never two-dot, and **fetch the
|
|
38
|
+
base first** — a pod clones single-branch, so `origin/<base>` does not exist
|
|
39
|
+
until you ask for it and the diff fails or silently compares against nothing:
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
git fetch origin <base> -q && git diff $(git merge-base origin/<base> HEAD)..HEAD
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Two-dot (`git diff <base>..HEAD`) compares against the base TIP, so it
|
|
46
|
+
reports already-merged commits as part of this change and sends you reviewing
|
|
47
|
+
code nobody here wrote.
|
|
48
|
+
4. **When the diff and the PR disagree, the PR wins.** Diff the head SHA
|
|
49
|
+
directly instead (`git diff <headSha>^ <headSha>`). Your checkout can be
|
|
50
|
+
stale and so can the remote branch tip — a merged PR's commit may be
|
|
51
|
+
reachable only by SHA. If the PR reports `MERGED` or `CLOSED`, say so and
|
|
52
|
+
review the recorded head SHA rather than assuming your tree matches it.
|
|
53
|
+
5. **Read the code under review out of the PR's commit, not the working tree:**
|
|
54
|
+
`git show <sha>:<path>` and `git grep <pattern> <sha>`. Grepping the working
|
|
55
|
+
tree when the PR is based elsewhere returns confident, wrong answers — it has
|
|
56
|
+
produced false review findings.
|
|
57
|
+
6. Read the surrounding code before judging consistency. A pattern is only a
|
|
58
|
+
pattern if the neighbours share it.
|
|
59
|
+
7. `mcp__conveyor__get_tag` on the card's tags — a tag's overview and linked
|
|
60
|
+
rules are what "follows existing patterns" actually means in this project.
|
|
61
|
+
|
|
62
|
+
## Criteria
|
|
63
|
+
|
|
64
|
+
- **Correctness** — does it do what the plan says? Logic errors, off-by-one,
|
|
65
|
+
race conditions.
|
|
66
|
+
- **Pattern consistency** — does it match nearby code and the card's tag rules?
|
|
67
|
+
- **Security** — no hardcoded secrets, no injection, input validated at
|
|
68
|
+
boundaries.
|
|
69
|
+
- **Performance** — no needless loops, no N+1 queries, nothing blocking in an
|
|
70
|
+
async context.
|
|
71
|
+
- **Error handling** — handled at system boundaries, nothing swallowed.
|
|
72
|
+
- **Test coverage** — are new paths tested? Edge cases covered? A test that
|
|
73
|
+
asserts nothing is worse than no test, because it reads as coverage.
|
|
74
|
+
- **Typing** — proper types, no unnecessary `any`, correct async/await.
|
|
75
|
+
- **Naming and readability** — clear names, and no comment that says something
|
|
76
|
+
the code does not do.
|
|
77
|
+
|
|
78
|
+
**If previous review feedback is in the chat history, verify those specific
|
|
79
|
+
issues were addressed before raising new ones.** Re-litigating a resolved point
|
|
80
|
+
while the actual fix goes unchecked is the most common way a second review
|
|
81
|
+
wastes everyone's time.
|
|
82
|
+
|
|
83
|
+
## Fix or flag
|
|
84
|
+
|
|
85
|
+
You have write access. Use it in proportion:
|
|
86
|
+
|
|
87
|
+
- **Small and unambiguous** → fix it, commit, push, then re-review your own
|
|
88
|
+
change as part of the diff. After pushing, wait for CI before approving.
|
|
89
|
+
- **Larger, or a judgment call the author should make** → flag it in the
|
|
90
|
+
verdict with the file, the line, what is wrong, and a suggested direction.
|
|
91
|
+
|
|
92
|
+
Fixing something you do not fully understand is worse than flagging it.
|
|
93
|
+
|
|
94
|
+
## The verdict
|
|
95
|
+
|
|
96
|
+
> **Environment — the tools differ, and only one pair exists per surface.**
|
|
97
|
+
> In a **pod** (review-mode session): `mcp__conveyor__approve_code_review` or
|
|
98
|
+
> `mcp__conveyor__request_code_changes`. **Locally** via conveyor-mcp:
|
|
99
|
+
> `mcp__conveyor__approve_task` or `mcp__conveyor__request_changes`. The pod
|
|
100
|
+
> pair does not exist locally and the local pair does not exist in a pod, so
|
|
101
|
+
> reaching for the wrong one fails outright rather than degrading.
|
|
102
|
+
|
|
103
|
+
Every verdict carries a **risk** level, judged by the surface the change
|
|
104
|
+
touches — not by how large the diff is:
|
|
105
|
+
|
|
106
|
+
- `critical` — auth, billing, data integrity, migrations
|
|
107
|
+
- `high` — important surface with broad blast radius
|
|
108
|
+
- `medium` — moderate, contained
|
|
109
|
+
- `low` — small or isolated
|
|
110
|
+
|
|
111
|
+
The card may already carry a risk level, and **whether you can correct it
|
|
112
|
+
depends on where you are running** — the same environment split as the verdict
|
|
113
|
+
tools above:
|
|
114
|
+
|
|
115
|
+
- **Locally** (conveyor-mcp): `update_task` takes `risk`. If your review
|
|
116
|
+
disagrees with the card, set what you believe is correct — you have the
|
|
117
|
+
authority to override in either direction, and a stale risk level is worse
|
|
118
|
+
than a changed one.
|
|
119
|
+
- **In a pod** (review-mode session): you cannot. `update_task`'s agent surface
|
|
120
|
+
omits `risk` on purpose, and `update_task_properties` — the only pod tool that
|
|
121
|
+
carries it — is not in a review session's toolset. **State the risk you judge
|
|
122
|
+
correct in your verdict** and let a human or identification apply it.
|
|
123
|
+
|
|
124
|
+
That asymmetry is deliberate, not an oversight, and it is written down because
|
|
125
|
+
the instruction used to read "set what you believe is correct" unconditionally —
|
|
126
|
+
which no pod reviewer could follow. Same defect the story-points paragraph below
|
|
127
|
+
already records.
|
|
128
|
+
|
|
129
|
+
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
|
|
132
|
+
follow. It is also a gate you sit behind rather than above: story points set
|
|
133
|
+
the card's graduated merge minimum, so a reviewer that could lower them would
|
|
134
|
+
be lowering the bar for merging the very PR under review. Flag a mis-sized
|
|
135
|
+
card in the verdict and let identification or a human re-size it.
|
|
136
|
+
|
|
137
|
+
## Reviewer of record for a pack child
|
|
138
|
+
|
|
139
|
+
A PR into a **pack branch** gets no automated review — the pack's own session
|
|
140
|
+
is the reviewer, and the independent review happens later on the pack's PR into
|
|
141
|
+
`dev`. When you are that reviewer:
|
|
142
|
+
|
|
143
|
+
- Apply the same criteria above. The absence of an automated pass makes this
|
|
144
|
+
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.
|
|
147
|
+
- You wrote this code, which makes self-review the weak point. An independent
|
|
148
|
+
reviewer with the diff and no memory of writing it catches what you cannot.
|
|
149
|
+
|
|
150
|
+
## Blocked
|
|
151
|
+
|
|
152
|
+
If the PR cannot be reviewed as it stands — the plan is missing, the diff is
|
|
153
|
+
empty, CI never ran, or the branch does not match the card — say so in chat
|
|
154
|
+
with the specific blocker and do NOT render a verdict. An approval issued
|
|
155
|
+
because you could not see the code is worse than no review at all.
|
|
156
|
+
|
|
157
|
+
## Improve This Skill
|
|
158
|
+
|
|
159
|
+
If this skill was insufficient or slowed the work down, file it with
|
|
160
|
+
`mcp__conveyor__create_suggestion` on the Conveyor project: the issue,
|
|
161
|
+
evidence, and proposed fix.
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: conveyor-start
|
|
3
|
+
description: Hand a planned Conveyor card to the cloud — start its build, confirm the environment actually came up, and report where to watch it. Use when the user says "/conveyor-start <card>", "start this card", "build this in the cloud", "kick off a pod for this", or asks to hand work off rather than do it locally. Local/MCP surface only; inside a pod the skill says so instead of failing.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Conveyor Start
|
|
7
|
+
|
|
8
|
+
The handoff verb. `/conveyor-plan` produces a buildable card and `/conveyor-build`
|
|
9
|
+
executes one **here**; this one hands the card to a cloud pod and gets you back
|
|
10
|
+
a place to watch it.
|
|
11
|
+
|
|
12
|
+
Its whole job is the gap between "I pressed start" and "something is actually
|
|
13
|
+
running." A start that silently did nothing looks identical to a start that
|
|
14
|
+
worked, until you check an hour later.
|
|
15
|
+
|
|
16
|
+
> **Environment — this skill does not apply inside a pod.** `start_task` exists
|
|
17
|
+
> only on the external `conveyor-mcp` surface, never on the in-pod agent
|
|
18
|
+
> surface, and that is deliberate (recorded in `agent-modes.md`, "pods never run
|
|
19
|
+
> the conveyor-mcp binary"). If you are running inside a claudespace pod, say
|
|
20
|
+
> so and stop: you cannot start a build from in here, and a pod that wants
|
|
21
|
+
> parallel work creates child cards and lets the pack path fire them. Do not
|
|
22
|
+
> hunt for an equivalent tool — there isn't one.
|
|
23
|
+
|
|
24
|
+
## Ground rules
|
|
25
|
+
|
|
26
|
+
- **All Conveyor tools fully-qualified** — `mcp__conveyor__start_task`, not
|
|
27
|
+
`start_task`. Bare names fail.
|
|
28
|
+
- **Never start a card you have not read.** A start mints compute against a
|
|
29
|
+
human's subscription key and reassigns the card; doing that to the wrong card
|
|
30
|
+
is expensive and confusing to undo.
|
|
31
|
+
- **One card per invocation.** Starting several is a decision about spend and
|
|
32
|
+
concurrency that belongs to a person, not to a convenience loop.
|
|
33
|
+
|
|
34
|
+
## 1. Resolve and qualify the card
|
|
35
|
+
|
|
36
|
+
`mcp__conveyor__get_task` (or `get_card_by_slug` for a `/cards/<slug>` URL).
|
|
37
|
+
Then check it is genuinely startable, and say which check failed rather than
|
|
38
|
+
starting anyway:
|
|
39
|
+
|
|
40
|
+
- **Status is `Open`.** A `Planning` card is not ready — it has no agreed plan.
|
|
41
|
+
A card already `InProgress` has an environment; you want `resume_task`, and
|
|
42
|
+
starting again would duplicate the work.
|
|
43
|
+
- **It has an executable plan.** Not a title and a sentence — a plan a
|
|
44
|
+
context-free reader could build from. If it does not, **stop and offer
|
|
45
|
+
`/conveyor-plan` first**: starting a pod against a thin plan burns an hour to
|
|
46
|
+
produce the wrong thing, and the agent cannot ask you a clarifying question
|
|
47
|
+
mid-build.
|
|
48
|
+
- **Its dependencies are met.** `mcp__conveyor__get_dependencies` — a blocker
|
|
49
|
+
counts as met only at ReviewDev or beyond. Starting a blocked card produces an
|
|
50
|
+
agent that cannot finish.
|
|
51
|
+
|
|
52
|
+
If any check fails, report which one and what would fix it. Do not start.
|
|
53
|
+
|
|
54
|
+
## 2. Start it
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
mcp__conveyor__start_task(taskId)
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
The build runs on **your** account and key, and starting reassigns the card to
|
|
61
|
+
you — that is the documented contract, not a side effect. If you are starting
|
|
62
|
+
something on someone else's behalf, say so, because their name comes off the
|
|
63
|
+
card.
|
|
64
|
+
|
|
65
|
+
## 3. Confirm it actually started
|
|
66
|
+
|
|
67
|
+
**This is the step the verb exists for.** `start_task` returns once the intent
|
|
68
|
+
is written; the environment converges afterwards, so a successful call is not a
|
|
69
|
+
running pod.
|
|
70
|
+
|
|
71
|
+
Poll `mcp__conveyor__get_build_status` until the workspace reports it is
|
|
72
|
+
provisioning or running, and give it a couple of minutes — a cold pod takes
|
|
73
|
+
longer than a warm one. Then report the outcome honestly:
|
|
74
|
+
|
|
75
|
+
- **Running / provisioning** → started; go to step 4.
|
|
76
|
+
- **Still pending well past the boot window** → say it has not come up yet and
|
|
77
|
+
point at the card's setup log rather than declaring success.
|
|
78
|
+
- **Failed** → report the failure reason from the card. A provision failure
|
|
79
|
+
posts its cause to the card (quota denials, missing credentials); read it
|
|
80
|
+
instead of guessing, and do not immediately retry — a terminal cause will
|
|
81
|
+
fail the same way.
|
|
82
|
+
|
|
83
|
+
Never report "started" from the tool call alone.
|
|
84
|
+
|
|
85
|
+
## 4. Hand back a place to watch
|
|
86
|
+
|
|
87
|
+
Give the person, in one short message:
|
|
88
|
+
|
|
89
|
+
- the card URL,
|
|
90
|
+
- that the agent posts progress to the card's chat,
|
|
91
|
+
- `mcp__conveyor__get_connect_urls` for the preview/attach links when they want
|
|
92
|
+
to look inside,
|
|
93
|
+
- and `mcp__conveyor__stop_task` if they want it back.
|
|
94
|
+
|
|
95
|
+
Then stop. You are not the build's babysitter — the card is where it reports,
|
|
96
|
+
and a loop that watches a cloud build from a local session just spends tokens
|
|
97
|
+
narrating something the card already shows.
|
|
98
|
+
|
|
99
|
+
## What this skill is not
|
|
100
|
+
|
|
101
|
+
- **Not a builder.** If the work should happen in this checkout, that is
|
|
102
|
+
`/conveyor-build`. Starting a pod to avoid doing a two-minute local edit is
|
|
103
|
+
slower, not faster.
|
|
104
|
+
- **Not a planner.** A card that needs a plan gets `/conveyor-plan` first; this
|
|
105
|
+
skill refuses rather than starting into ambiguity.
|
|
106
|
+
- **Not a merger.** The pod opens a PR; review and merge are their own verbs.
|