@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.
@@ -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.
@@ -0,0 +1,43 @@
1
+ # Conveyor MCP Setup
2
+
3
+ Use this when Conveyor MCP tools are missing, stale, or unauthenticated.
4
+
5
+ ## Preferred install path
6
+
7
+ Ask the user to open Conveyor, choose the target project, then go to
8
+ **Settings → User Settings** (`/projects/<project>/user-settings`). The
9
+ **Connect Claude Code** section generates the exact install command / MCP JSON
10
+ for their account and project — use that, not Project Settings and not the
11
+ MCP Tools reference page.
12
+
13
+ ## Manual repair (Claude Code)
14
+
15
+ ```bash
16
+ claude mcp remove conveyor -s local 2>/dev/null;
17
+ claude mcp add conveyor -s local \
18
+ -e CONVEYOR_API_URL=<api-url> \
19
+ -e CONVEYOR_USER_TOKEN=<user-token> \
20
+ -e CONVEYOR_PROJECT_ID=<project-id> \
21
+ -- npx -y @rallycry/conveyor-mcp@latest
22
+ ```
23
+
24
+ - Run from the repo folder; `-s local` scopes the server there.
25
+ - The `remove` prefix makes token rotation idempotent.
26
+ - Keep `@latest`; avoid unbuilt local packages.
27
+ - `CONVEYOR_API_URL` and `CONVEYOR_USER_TOKEN` are required;
28
+ `CONVEYOR_PROJECT_ID` sets the default project (omit it to pass `projectId`
29
+ per call).
30
+ - Non-Claude MCP hosts use the same command/env/package shape in their own
31
+ config format.
32
+
33
+ After install, restart or reload MCP servers, then verify with
34
+ `mcp__conveyor__get_connection_context` or `mcp__conveyor__list_tasks`.
35
+
36
+ ## Auth failure vs permission failure
37
+
38
+ - Expired/invalid token → tools error with authentication failures; re-run
39
+ the connect flow above to mint a fresh token.
40
+ - "Insufficient permissions" on a call that should work → check the
41
+ `projectId` first (a typo produces this exact error), then ask a project
42
+ admin about your role: mutations (tasks, builds, PRs) need Moderate access
43
+ or higher.