@rallycry/conveyor-agent 10.13.72 → 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-ZNL7X5LQ.js → boot-PKQ2I66D.js} +49 -2
- package/dist/{chunk-WMMBAKPE.js → chunk-GL2DIQEQ.js} +121 -8
- package/dist/{chunk-2L5THOWD.js → chunk-JQVAWRVL.js} +2 -2
- package/dist/{chunk-LSZ2KLJY.js → chunk-N4WSUTGV.js} +40 -3
- package/dist/{chunk-2SN32LM6.js → chunk-PEEGCZAR.js} +2055 -1035
- package/dist/cli.js +257 -100
- package/dist/index.d.ts +170 -3
- package/dist/index.js +3 -3
- package/dist/{serve-boot-4N3FRXVQ.js → serve-boot-YPAUKENG.js} +3 -3
- 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,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.
|
|
@@ -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.
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: conveyor-workflows
|
|
3
|
+
description: How to work with Conveyor from any repo it manages — connect or repair the Conveyor MCP, create and plan cards, decide task vs suggestion vs incident, build packs, start or monitor agent builds, open PRs the non-duplicating way, and review completed work. Use when asked "how do I use conveyor", "create a card", "file this in conveyor", "start a build", "review this conveyor task", when Conveyor MCP tools are missing or erroring, or when a PR was auto-closed or a duplicate card appeared.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Conveyor Workflows
|
|
7
|
+
|
|
8
|
+
Conveyor is the task source of truth for this repo. Cards must let the next
|
|
9
|
+
agent or human pick up cold: search before creating, keep task chat current,
|
|
10
|
+
and let Conveyor's own automation do the linking.
|
|
11
|
+
|
|
12
|
+
## Connect and resolve context
|
|
13
|
+
|
|
14
|
+
- All Conveyor tools are called fully-qualified (`mcp__conveyor__get_task`);
|
|
15
|
+
bare names fail with "No such tool available".
|
|
16
|
+
- Start with `mcp__conveyor__get_connection_context`. No default project?
|
|
17
|
+
`mcp__conveyor__list_projects` and match `githubRepoOwner/Name` against the
|
|
18
|
+
cwd's `git remote`. Conveyor MCP is multi-project — pass `projectId`
|
|
19
|
+
explicitly when working across projects.
|
|
20
|
+
- **A mistyped `projectId` surfaces as "Insufficient permissions", not "not
|
|
21
|
+
found".** Re-check the ID character-for-character before concluding you lack
|
|
22
|
+
access.
|
|
23
|
+
- MCP missing, stale, or unauthenticated → [references/mcp-setup.md](references/mcp-setup.md).
|
|
24
|
+
- Two MCP surfaces exist with different arg shapes: the in-pod agent tools
|
|
25
|
+
(`post_to_chat` takes `message`) and the standalone `@rallycry/conveyor-mcp`
|
|
26
|
+
server for external clients (`content`, plus `taskId`/`comment` variants).
|
|
27
|
+
You are on the in-pod surface when Conveyor provisioned your workspace;
|
|
28
|
+
external when the MCP was configured by hand. Each accepts the other's
|
|
29
|
+
field name as an alias where possible, but read the tool's schema — don't
|
|
30
|
+
guess across surfaces.
|
|
31
|
+
|
|
32
|
+
## Cards: create, classify, plan
|
|
33
|
+
|
|
34
|
+
- **Search first**: `mcp__conveyor__search_tasks` on 2-3 keyword variants
|
|
35
|
+
(`typeFilters` to include incidents/suggestions); use
|
|
36
|
+
`mcp__conveyor__list_tasks` when filtering by status/assignee instead of
|
|
37
|
+
text (results are priority-ordered). A card may already exist — attach to
|
|
38
|
+
it (post your context to its chat) rather than forking a duplicate.
|
|
39
|
+
- **Classify**: buildable work → `mcp__conveyor__create_task`; an
|
|
40
|
+
idea/improvement you are NOT committing to build →
|
|
41
|
+
`mcp__conveyor__create_suggestion`; incidents (production breakage) are
|
|
42
|
+
filed by monitoring and users through Conveyor's incident tooling — you
|
|
43
|
+
will usually *work* incident cards, not create them.
|
|
44
|
+
- **Mechanics**: `create_task` takes the title, description, `plan`
|
|
45
|
+
(markdown), and optional status/tags; cards start in `Planning`. Every
|
|
46
|
+
status change you make goes through `mcp__conveyor__update_task`
|
|
47
|
+
(`status: "Open"` / `"InProgress"` / `"Cancelled"`, plus plan/description
|
|
48
|
+
edits). Review-side transitions are NOT yours — see the PR section.
|
|
49
|
+
- **Description vs plan**: the description is capped at 255 chars — 1-2 plain
|
|
50
|
+
sentences a non-engineer can read. All technical detail goes in the plan.
|
|
51
|
+
- **Plan quality bar**: a context-free reader must be able to execute — exact
|
|
52
|
+
repo-relative files and symbols, runnable testing commands, decisions
|
|
53
|
+
already made recorded in Notes. Format and sizing:
|
|
54
|
+
[../conveyor-plan/references/plan-format.md](../conveyor-plan/references/plan-format.md).
|
|
55
|
+
For research-backed planning, use the `conveyor-plan` skill — it is the first
|
|
56
|
+
half of the pair below.
|
|
57
|
+
- **One card per deliverable/PR** (mirror packs below are the documented
|
|
58
|
+
exception). Multi-PR work becomes a pack: children via
|
|
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
|
|
62
|
+
`mcp__conveyor__add_dependency` edges. Orchestration packs run children as
|
|
63
|
+
their own builds/PRs; mirror packs (children created with
|
|
64
|
+
`followParentStatus: true` on `create_subtask`) document already-done work
|
|
65
|
+
shipping in ONE PR on the parent. Don't pack below
|
|
66
|
+
genuinely-multiple-independent-pieces scope.
|
|
67
|
+
- **Identification is Conveyor's job**: moving a card beyond Planning
|
|
68
|
+
(`update_task` → `status: "Open"`) auto-fills story points, icon, agent,
|
|
69
|
+
and tags — for pack children too. Post your SP/tag recommendation to chat
|
|
70
|
+
BEFORE the flip; never set icon or points yourself.
|
|
71
|
+
|
|
72
|
+
## Tags are the project glossary
|
|
73
|
+
|
|
74
|
+
Tags are the shared vocabulary humans and agents align on, not just board
|
|
75
|
+
labels. Each tag carries a `description` (≤255 — the summary), an `overview`
|
|
76
|
+
(the full markdown spec: philosophy, mechanics, invariants), `contextPaths`
|
|
77
|
+
(where the code/rules live), and parent/child tags (a sub-type taxonomy).
|
|
78
|
+
|
|
79
|
+
- **Read**: `mcp__conveyor__list_tags` for the inventory (names, descriptions,
|
|
80
|
+
hierarchy, `contextPaths`, `hasOverview`) — the context links ship inline, so
|
|
81
|
+
auditing what the glossary wires up takes one call, not one per tag;
|
|
82
|
+
`mcp__conveyor__get_tag` (id or exact name) for one term's full entry —
|
|
83
|
+
overview, linked files, hierarchy, and recent revisions with their reasons. When a card or chat message deep-links a term
|
|
84
|
+
(`@[tag:<id>]` — the web composer offers this when you type a tag name),
|
|
85
|
+
`get_tag` is how you pull its full context. To deep-link a term yourself,
|
|
86
|
+
write `@[tag:<name>]` with the tag's exact name — chat posts and card
|
|
87
|
+
plans/descriptions are canonicalized to the id token at write time, so you
|
|
88
|
+
never need the id. An unknown name stays plain text.
|
|
89
|
+
- **Write**: `mcp__conveyor__manage_tags` (Moderate+). Whenever your work
|
|
90
|
+
changes how a tagged system behaves, update that tag's `overview` and pass a
|
|
91
|
+
one-line `reason` — it lands in the tag's revision history (in-pod agents
|
|
92
|
+
get their current card auto-stamped too), so the team sees why the glossary
|
|
93
|
+
changed. Any loaded term worth a definition deserves a tag.
|
|
94
|
+
- **The PR nudge**: `create_pull_request` may append a "Touched glossary
|
|
95
|
+
areas" line — your diff's files matched against tag `contextPaths`. Treat it
|
|
96
|
+
as a checklist prompt, not an order: update a listed tag's
|
|
97
|
+
overview/description only when your change altered what the term means, add
|
|
98
|
+
the tag to the card only when the work is genuinely about that area, and
|
|
99
|
+
skip freely otherwise. Never bulk-assign tags from path matches alone.
|
|
100
|
+
|
|
101
|
+
## Execute
|
|
102
|
+
|
|
103
|
+
- **Status reflects reality**: claiming a card = `update_task` →
|
|
104
|
+
`status: "InProgress"` plus a chat note saying who/where is working it.
|
|
105
|
+
Never hand-move a card to `ReviewPR` or set its PR link — that transition
|
|
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.
|
|
129
|
+
- **Cloud or local**: `mcp__conveyor__start_task` boots a cloud agent
|
|
130
|
+
environment for an Open card (that agent run is the card's "build" —
|
|
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.
|
|
138
|
+
- **Reserved-branch trap**: a card with an assigned agent may have a reserved
|
|
139
|
+
`githubBranch`. Check `get_task` before pushing: if set, push to THAT
|
|
140
|
+
branch; a PR from any other branch gets auto-closed and unlinked.
|
|
141
|
+
- **Chat is the log**: post at real milestones — claim, blocking discovery,
|
|
142
|
+
decisions, gates green, PR — not play-by-play. Findings (root causes, dead
|
|
143
|
+
ends, verification results) belong in task chat, not just your session.
|
|
144
|
+
- **Files**: `mcp__conveyor__upload_attachment` hosts images/video/files on
|
|
145
|
+
the card; the returned URL is reusable in PR bodies. Attach visual evidence
|
|
146
|
+
for UI changes before opening the PR.
|
|
147
|
+
- **Found-but-not-fixed** → a follow-up card with enough context to execute
|
|
148
|
+
cold, not a TODO in chat.
|
|
149
|
+
|
|
150
|
+
## Open the PR — two paths, pick exactly ONE
|
|
151
|
+
|
|
152
|
+
| Situation | Path |
|
|
153
|
+
| --- | --- |
|
|
154
|
+
| A card exists (found or created) | `mcp__conveyor__create_pull_request` — one call opens the PR, links the card, moves it to ReviewPR. Pass `head:` if the card has no branch. |
|
|
155
|
+
| No card exists | Open the PR with your git host's normal tooling and STOP — Conveyor's PR sync spawns and links a card itself. |
|
|
156
|
+
|
|
157
|
+
Card linking belongs to exactly one actor, never you by hand. Mixing paths is
|
|
158
|
+
the known failure mode: a hand-moved card linked to nothing plus a
|
|
159
|
+
sync-spawned duplicate.
|
|
160
|
+
|
|
161
|
+
## Monitor and review
|
|
162
|
+
|
|
163
|
+
- Monitor with `mcp__conveyor__get_task`, `mcp__conveyor__read_task_chat`,
|
|
164
|
+
and `mcp__conveyor__get_build_status`.
|
|
165
|
+
- Reviewing a ReviewPR card: inspect the diff and task chat; approve with
|
|
166
|
+
`mcp__conveyor__approve_task` only if the PR implements the plan and
|
|
167
|
+
follows repo patterns — it advances the card through the review pipeline
|
|
168
|
+
(and, per project settings, approves/merges the PR). Otherwise
|
|
169
|
+
`mcp__conveyor__request_changes` with specific feedback, which returns the
|
|
170
|
+
card to the builder. Manual test checklists ride
|
|
171
|
+
`mcp__conveyor__set_manual_tests` and surface for human sign-off at the
|
|
172
|
+
review stage.
|
|
173
|
+
- Don't approve or merge your own PRs unless the project's policy explicitly
|
|
174
|
+
allows it.
|
|
175
|
+
- Remote workspace access (SSH/preview) goes through
|
|
176
|
+
`mcp__conveyor__workspace_start_tunnel` / `workspace_stop_tunnel` — one
|
|
177
|
+
canonical tunnel per task, torn down when done.
|
|
178
|
+
|
|
179
|
+
## Reliability gotchas
|
|
180
|
+
|
|
181
|
+
- **A mutating call that errors may have already landed.** "Session not
|
|
182
|
+
found" / timeout on `create_*`, `post_*`, `approve_*`, merge → check the
|
|
183
|
+
effect (`read_task_chat`, `get_task`, the PR) before re-firing; cap
|
|
184
|
+
identical retries at one. Blind re-fires double-post and double-approve.
|
|
185
|
+
- **Git ground truth is remote-first** in agent pods and shared workspaces:
|
|
186
|
+
on a surprising conflict, failed push, or dirty tree, run `git ls-remote
|
|
187
|
+
origin <branch>` and `git merge-base --is-ancestor` before rebuilding
|
|
188
|
+
anything locally — platform autosync may have already pushed for you, and a
|
|
189
|
+
dirty tree may belong to a concurrent session.
|
|
190
|
+
|
|
191
|
+
## Improve This Skill
|
|
192
|
+
|
|
193
|
+
If this skill was insufficient or slowed the work down, file it with
|
|
194
|
+
`mcp__conveyor__create_suggestion` on your current project: the issue,
|
|
195
|
+
evidence, and proposed fix.
|