@rallycry/conveyor-skills 1.0.8 → 1.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/package.json +1 -1
- package/skills/conveyor-build/SKILL.md +19 -13
- package/skills/conveyor-consensus/SKILL.md +4 -3
- package/skills/conveyor-plan/SKILL.md +4 -0
- package/skills/conveyor-plan/references/plan-format.md +7 -3
- package/skills/conveyor-prune/SKILL.md +181 -0
- package/skills/conveyor-triage/SKILL.md +3 -1
- package/skills/conveyor-workflows/SKILL.md +8 -5
package/README.md
CHANGED
|
@@ -19,6 +19,7 @@ normal dependency bumps: no git submodules, no manual syncing.
|
|
|
19
19
|
| `conveyor-review` | `/conveyor-review <card>` | Review the PR against its plan and render one verdict, with risk |
|
|
20
20
|
| `conveyor-consensus` | `/conveyor-consensus <question>` | Sweep the sources a project actually has, count what happened, score the proposals against those counts, and attach an HTML verdict to the card |
|
|
21
21
|
| `conveyor-local-loop` | `/loop /conveyor-local-loop` | Run this machine as a serial local agent: claim Open cards and packs, build to PR, repeat |
|
|
22
|
+
| `conveyor-prune` | `/conveyor-prune [project\|all]` | Sweep every Planning/Open card, give each one disposition (cancel, park on hold, merge into a pack, keep), apply only the confirmed rows (local surface only) |
|
|
22
23
|
|
|
23
24
|
**One skill per lifecycle phase:** triage an unverified report → plan the work →
|
|
24
25
|
start it in the cloud *or* build it here → review it. `start` and `build` are
|
package/package.json
CHANGED
|
@@ -111,7 +111,11 @@ task binding and no user account.
|
|
|
111
111
|
1. Resolve the card from the argument — slug, id, or URL. **None given → ask
|
|
112
112
|
which card.** Never infer one from the branch you happen to be on.
|
|
113
113
|
2. `mcp__conveyor__get_task` for the full plan and
|
|
114
|
-
`mcp__conveyor__read_task_chat` for addenda and user answers.
|
|
114
|
+
`mcp__conveyor__read_task_chat` for addenda and user answers. On a pack
|
|
115
|
+
child the source documents usually sit on the parent card:
|
|
116
|
+
`mcp__conveyor__list_task_files` with `task_id` set to the parent (in a pod;
|
|
117
|
+
the local surface spells it `taskId`) lists them, and
|
|
118
|
+
`mcp__conveyor__get_attachment` with the same `task_id` reads one. Consult
|
|
115
119
|
`mcp__conveyor__get_tag` on the card's tags before diving in — a tag's
|
|
116
120
|
overview and linked files are the fast path into the subsystem.
|
|
117
121
|
3. Route on the card's shape:
|
|
@@ -202,6 +206,15 @@ capture a screenshot (static) or a short recording (interaction) with the host
|
|
|
202
206
|
repo's own tooling and attach it with `mcp__conveyor__upload_attachment`, then
|
|
203
207
|
embed the returned URL in the PR body. A UI PR without it is incomplete.
|
|
204
208
|
|
|
209
|
+
**Manual tests are for human eyes, and few.** Before the PR, record with
|
|
210
|
+
`mcp__conveyor__set_manual_tests` only what a person must see in the running
|
|
211
|
+
app to sign the card off: at most 5, usually 1, none for a change with no
|
|
212
|
+
user-visible behavior. One sentence each, in plain language: where to go, what
|
|
213
|
+
to do, what they should see ("Open any card with a PR: the Pull Request slat
|
|
214
|
+
sits directly under Description"). Never record gates, commands, CI, logs, or
|
|
215
|
+
database steps; the server rejects them. A rejected item is a signal to drop
|
|
216
|
+
it, not to rephrase it.
|
|
217
|
+
|
|
205
218
|
**On a deep pack the gate surface grows, and that is expected.**
|
|
206
219
|
`test:affected` diffs against `origin/dev`, so by the fourth child it also
|
|
207
220
|
covers the three already merged into the pack branch. That is correct
|
|
@@ -249,7 +262,10 @@ Instead: post the answer, config, or findings with
|
|
|
249
262
|
`mcp__conveyor__upload_attachment` (any file type, up to 25MB), and complete
|
|
250
263
|
the card directly with `force_update_task_status("Complete")` — there is no PR
|
|
251
264
|
or review step for a no-code task. Never publish a deliverable as an off-card
|
|
252
|
-
link; the card is where it belongs.
|
|
265
|
+
link; the card is where it belongs. When a revision supersedes an earlier
|
|
266
|
+
upload, remove the old copy with `mcp__conveyor__delete_attachment` (permanent,
|
|
267
|
+
`fileId` from `list_task_files`) so the Files list shows one current version
|
|
268
|
+
of each deliverable.
|
|
253
269
|
|
|
254
270
|
When unsure, check the diff: a real diff means open a PR, no diff means finish
|
|
255
271
|
in chat and mark it Complete.
|
|
@@ -269,17 +285,7 @@ nothing invalidates the verification you just did:
|
|
|
269
285
|
recorded on the card. That fallback is usually right and is exactly why the
|
|
270
286
|
mistake is invisible — until the card's recorded branch has drifted, and the
|
|
271
287
|
PR opens against `dev`.
|
|
272
|
-
4.
|
|
273
|
-
after `create_pull_request` succeeds — it is part of opening a PR, not a
|
|
274
|
-
follow-up. `sections` is a top-level array argument, not prose stuffed into
|
|
275
|
-
`overview`; keep `overview` a short intro and order the sections with core
|
|
276
|
-
behavior first, tests and generated files later. Reference only files this
|
|
277
|
-
diff actually changed, never context you merely read. Anchors are optional
|
|
278
|
-
and strict — `{"path": "..."}` alone is the safe form. Republish for the new
|
|
279
|
-
head SHA after any later push, or the card's Guide tab shows stale. It is
|
|
280
|
-
best-effort: if it still fails after one corrected retry, carry on — it
|
|
281
|
-
never blocks opening or updating the PR.
|
|
282
|
-
5. Post a chat summary: what shipped, how it was verified, what a reviewer
|
|
288
|
+
4. Post a chat summary: what shipped, how it was verified, what a reviewer
|
|
283
289
|
should look at, and anything you did NOT do.
|
|
284
290
|
|
|
285
291
|
Then confirm CI actually started (read-only `gh pr checks`). Do not wait on it.
|
|
@@ -21,7 +21,7 @@ The genre: **an uninterested observer pulls every relevant source, counts what a
|
|
|
21
21
|
1. `get_connection_context` — who and where. Same call in a pod and a local MCP session; it reports the card in a pod and the account/board in an MCP client.
|
|
22
22
|
2. `list_project_integrations` — which of repository, Slack/Discord, email, GCP, Grafana, Google Analytics, Drive, Cloudflare, incidents are configured, plus the registered work channels. Credential-free booleans; this is the map.
|
|
23
23
|
3. `list_project_channels` — the channels an admin registered as agent-reachable, each with a description of what happens there. **The description is the routing signal**: it is how you tell the channel where support complaints land from the one where releases are announced. Only registered channels are reachable at all; an unregistered channel does not exist for this skill regardless of what the bot can see.
|
|
24
|
-
4. **ToolSearch for the optional surfaces** rather than assuming them: `drive_*`, meeting tools, `query_gcp_logs` / `query_grafana_logs`, `get_analytics_summary
|
|
24
|
+
4. **ToolSearch for the optional surfaces** rather than assuming them: `drive_*`, meeting tools, `query_gcp_logs` / `query_grafana_logs`, `get_analytics_summary`, `evaluate_questions` (in a pod the name must be fully qualified: `select:mcp__conveyor__evaluate_questions`). Also probe for supplemental local MCPs the user may have connected — a user-token Slack MCP is the notable one, because it enables true keyword search that Conveyor's own tools cannot do (see the Slack search note below).
|
|
25
25
|
|
|
26
26
|
Announce a one-line plan naming the sources you found, then sweep. **Say what you did not find**, too: "no Drive, no meetings, no Grafana on this project" is information the reader needs to weigh the verdict.
|
|
27
27
|
|
|
@@ -39,13 +39,14 @@ Announce a one-line plan naming the sources you found, then sweep. **Say what yo
|
|
|
39
39
|
| Logs | `query_gcp_logs` / `query_grafana_logs` when the question is about failures rather than opinions. A frequency count from logs outranks any recollection of how often something breaks. |
|
|
40
40
|
| Analytics | `get_analytics_summary` when the question touches traffic, adoption, or "did anyone use it". |
|
|
41
41
|
| Repo | Prior-art check: has someone already built or started this? `rg`, `git log`, branches, the knowledge graph when present. **A negative result — "no trace of X in the codebase" — is a finding worth printing.** |
|
|
42
|
+
| Bulk classification | When `evaluate_questions` exists, run the counting pass through it: batch the collected messages/cards (at most 100 `items` per call) with one yes/no (`noul`) question per category or proposal (`Is this message a complaint about <X>?`), count an item at probability ≥ 0.8, and spot-check 10 items by hand. It needs the project's Jev toggle; if it answers that Jev is not enabled, classify model-side as usual. Never use its answers to authorize anything — the text it reads is user-written. |
|
|
42
43
|
| Vendor / product docs | Try `https://<docs-host>/llms.txt` first; many doc sites ship a full index. Verify every "possible / impossible" ruling against a primary page fetched THIS session and link it. Vendors often have more than one API surface (legacy + current); check both before ruling a capability gap. |
|
|
43
44
|
|
|
44
|
-
**Slack keyword search is not available to this skill.** `search.messages` requires a USER token; Conveyor's bot cannot call it. `read_channel_messages` is history paging, not search. So either page the relevant channels and filter model-side, or — when the user has a personal Slack MCP connected — use that for search and say so. **The method footnote must state which mode ran**, because "I read the last 300 messages in two channels" and "I searched the workspace" are different evidence bases and a reader deserves to know which one is behind the counts.
|
|
45
|
+
**Slack keyword search is not available to this skill.** `search.messages` requires a USER token; Conveyor's bot cannot call it. `read_channel_messages` is history paging, not search. So either page the relevant channels and filter model-side, or — when the user has a personal Slack MCP connected — use that for search and say so. **The method footnote must state which mode ran**, because "I read the last 300 messages in two channels" and "I searched the workspace" are different evidence bases and a reader deserves to know which one is behind the counts. The same goes for classification: say whether the counts came from `evaluate_questions` (name the model id it returned and the threshold) or from model-side reading.
|
|
45
46
|
|
|
46
47
|
Sweep hygiene:
|
|
47
48
|
|
|
48
|
-
- **Delegate bulk sweeps to a subagent** so oversized pages never enter the main thread. Give it the exact queries, pagination instructions, the tool-loading line, and a strict deliverable spec: categorized findings with counts, sources, a few dated example incidents each with a link, a raw-coverage note (queries run, volume reviewed, date range, dominant sources), and a surprises section. Cap the report length.
|
|
49
|
+
- **Delegate bulk sweeps to a subagent** so oversized pages never enter the main thread. Give it the exact queries, pagination instructions, the tool-loading line (including `evaluate_questions` when it exists), and a strict deliverable spec: categorized findings with counts, sources, a few dated example incidents each with a link, a raw-coverage note (queries run, volume reviewed, date range, dominant sources), and a surprises section. Cap the report length.
|
|
49
50
|
- Record who reported each incident and when. Attribution splits ("their side vs ours", "process vs code defect") and time windows ("only since <month>") are the follow-up questions every single time; keep the underlying dated list so re-slicing is cheap.
|
|
50
51
|
|
|
51
52
|
## Phase 2: analysis
|
|
@@ -100,6 +100,10 @@ Scale to the idea's size; a one-file tweak needs minutes, not a survey.
|
|
|
100
100
|
already in your context. **Stop when you can cite a specific `file.ts:line`
|
|
101
101
|
and a symbol name for every step your plan will contain** — that is the
|
|
102
102
|
threshold, and more reading past it buys nothing.
|
|
103
|
+
- **Attachments**: `mcp__conveyor__list_task_files` on the card, and on its
|
|
104
|
+
parent when the card is a pack child (in a pod pass `task_id`; the local
|
|
105
|
+
surface takes `taskId`). Source documents, screenshots and worksheets usually
|
|
106
|
+
live there, and a plan written without reading them plans the wrong work.
|
|
103
107
|
- **Prior art**: `mcp__conveyor__search_tasks` on 2-3 keyword variants
|
|
104
108
|
(`typeFilters` to include incidents/suggestions when relevant), then
|
|
105
109
|
`mcp__conveyor__get_task` on the closest hits. You're looking for duplicates
|
|
@@ -14,7 +14,8 @@ High-level strategy with relevant files/patterns/APIs.
|
|
|
14
14
|
2. Concrete step.
|
|
15
15
|
|
|
16
16
|
## Testing
|
|
17
|
-
-
|
|
17
|
+
- Gates: the scoped lint/typecheck/test commands.
|
|
18
|
+
- Manual tests (0-3): one plain sentence each, user path only; omit when nothing is user-visible.
|
|
18
19
|
- Edge cases.
|
|
19
20
|
|
|
20
21
|
## Notes
|
|
@@ -49,8 +50,11 @@ The executor treats it as the acceptance criteria, so enumerate:
|
|
|
49
50
|
affected-test commands — naming the specific package suites the diff will
|
|
50
51
|
touch. A docs-only plan should say plainly that no local gates are needed and
|
|
51
52
|
that CI validates on the PR.
|
|
52
|
-
-
|
|
53
|
-
|
|
53
|
+
- Manual tests, as a separate list of 0-3 items: one plain sentence each
|
|
54
|
+
naming where to go, what to do, and what a person should see. User paths
|
|
55
|
+
only; never a command, a gate, CI, or a log check. Omit the list when the
|
|
56
|
+
change has nothing user-visible. The builder copies the Manual tests list
|
|
57
|
+
into `set_manual_tests` and nothing else from this section.
|
|
54
58
|
|
|
55
59
|
A planner working read-only is not expected to RUN these. Describe them.
|
|
56
60
|
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: conveyor-prune
|
|
3
|
+
description: Prune a Conveyor backlog in one confirm-then-apply pass — sweep every Planning and Open card, give each exactly one disposition (cancel stale, park on hold, merge overlapping cards into a pack, touch up the keepers), present the table, and apply only what a human confirms. Use when the user says "/conveyor-prune [project|all]", "prune my backlog", "clean up my open cards", "groom the board", or "what's stale on the board". Local/MCP surface only; inside a pod the skill says so instead of failing. Never mutates before the confirmation reply.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Conveyor Prune
|
|
7
|
+
|
|
8
|
+
The recurring "clean up my open backlog" ask, made repeatable. A board full of
|
|
9
|
+
cards nobody has looked at in weeks is not a backlog, it is noise that hides
|
|
10
|
+
the work that matters. This skill reads every unstarted card, decides what
|
|
11
|
+
each one is, shows you the whole table once, and applies exactly the rows you
|
|
12
|
+
confirm.
|
|
13
|
+
|
|
14
|
+
## Goal and finish line
|
|
15
|
+
|
|
16
|
+
**Goal:** every Planning and Open card in scope has exactly one recorded
|
|
17
|
+
disposition — cancel, park, merge, or keep — with one line of evidence each.
|
|
18
|
+
|
|
19
|
+
**Finish line:** the disposition table posted back with what was applied per
|
|
20
|
+
row, and the "deliberately not touched" list.
|
|
21
|
+
|
|
22
|
+
**A turn may end only when:** (a) the table is presented and you are waiting
|
|
23
|
+
for the confirmation reply, or (b) the confirmed rows are applied and reported.
|
|
24
|
+
Anything else — a half-swept project, a table with rows marked "TBD", a
|
|
25
|
+
mutation applied before the reply — is a stalled run, not a paused one.
|
|
26
|
+
|
|
27
|
+
> **Environment — this skill does not apply inside a pod.** The sweep needs
|
|
28
|
+
> `list_projects`, `set_task_parent`, `create_task`, and `move_card`, and the
|
|
29
|
+
> on-hold flag on `update_task` — all of which exist only on the external
|
|
30
|
+
> `conveyor-mcp` surface, never on the in-pod agent surface. That is
|
|
31
|
+
> deliberate: a pod acts on its own card, and parking or cancelling other
|
|
32
|
+
> people's cards from inside a build is a human call. If
|
|
33
|
+
> `mcp__conveyor__get_connection_context` reports a task binding and no user
|
|
34
|
+
> account, you are in a pod: say so and stop. Do not hunt for an equivalent.
|
|
35
|
+
|
|
36
|
+
## Ground rules
|
|
37
|
+
|
|
38
|
+
- **All Conveyor tools fully-qualified** — `mcp__conveyor__list_tasks`, not
|
|
39
|
+
`list_tasks`. Bare names fail. Most of them are deferred; reach them via
|
|
40
|
+
ToolSearch (`select:mcp__conveyor__list_tasks,mcp__conveyor__update_task,…`)
|
|
41
|
+
rather than expecting them preloaded.
|
|
42
|
+
- **Nothing mutates before the confirmation reply.** Not "I'll cancel the
|
|
43
|
+
obvious ones while you read". The table is the proposal; the reply is the
|
|
44
|
+
authority.
|
|
45
|
+
- **One confirmation round per table**, never an item-by-item drip. The human
|
|
46
|
+
edits rows in one reply ("cancel 3 and 7, park the rest"); "apply all" is a
|
|
47
|
+
legitimate reply too.
|
|
48
|
+
- **Exactly one disposition per card.** A card that is both "merge into pack
|
|
49
|
+
X" and "park" is a card you have not decided about.
|
|
50
|
+
- **This skill never deletes a card**, never touches a card at InProgress or
|
|
51
|
+
beyond, and never starts a build.
|
|
52
|
+
|
|
53
|
+
## 1 — Scope
|
|
54
|
+
|
|
55
|
+
1. `mcp__conveyor__get_connection_context` — which project the connection
|
|
56
|
+
defaults to, and whether you are in a pod (see the banner above).
|
|
57
|
+
2. Resolve the argument. No argument or a project name → that one project.
|
|
58
|
+
`all` → `mcp__conveyor__list_projects`, then run steps 1–5 per project.
|
|
59
|
+
The connection's default project may not be the one you mean, so **pass
|
|
60
|
+
`projectId` explicitly on every call** — a sweep that silently lands on the
|
|
61
|
+
default project prunes the wrong board.
|
|
62
|
+
3. The sweep, per project:
|
|
63
|
+
- `mcp__conveyor__list_tasks { status: "Planning", onHold: false, limit: 200 }`
|
|
64
|
+
- `mcp__conveyor__list_tasks { status: "Open", onHold: false, limit: 200 }`
|
|
65
|
+
|
|
66
|
+
`limit` is load-bearing: the default is 50 rows, and a sweep that stops at
|
|
67
|
+
50 reports a clean board it never finished reading. `onHold: false` is
|
|
68
|
+
load-bearing too: a card already parked has a disposition; re-triaging it
|
|
69
|
+
every pass is how "on hold" stops meaning anything. Tasks only unless the
|
|
70
|
+
user asked for incidents or suggestions (`typeFilters`).
|
|
71
|
+
4. Skip, and list under "deliberately not touched":
|
|
72
|
+
- rows with `parentTaskId` set — prune the pack parent; its children follow
|
|
73
|
+
the parent's disposition;
|
|
74
|
+
- rows with a non-null `codespaceStatus` — something is running on it;
|
|
75
|
+
- rows with a `githubPRUrl` — work exists; that is a review question, not
|
|
76
|
+
a prune question.
|
|
77
|
+
5. `mcp__conveyor__list_tags` once — the project's vocabulary, and whether a
|
|
78
|
+
`duplicate` tag exists (step 3 uses it, and never creates it).
|
|
79
|
+
|
|
80
|
+
## 2 — Evidence per card, cheapest first
|
|
81
|
+
|
|
82
|
+
Stop at the first source that settles the disposition; do not read the
|
|
83
|
+
transcript when the title already answers.
|
|
84
|
+
|
|
85
|
+
1. `mcp__conveyor__get_task` — plan, description, age, the chat tail. A card
|
|
86
|
+
with no plan and no chat in weeks reads very differently from one with a
|
|
87
|
+
plan somebody revised last Tuesday.
|
|
88
|
+
2. `mcp__conveyor__search_tasks` — **two or three keyword variants** per
|
|
89
|
+
card, across ALL statuses (`statusFilters` unset). The point is to find the
|
|
90
|
+
Complete or ReviewX card that already ships this. One search misses the card
|
|
91
|
+
that used the other word for it.
|
|
92
|
+
3. `mcp__conveyor__read_task_chat` — only when the overlap lives in the
|
|
93
|
+
discussion rather than the title, or when a card's chat might record a
|
|
94
|
+
decision to drop it.
|
|
95
|
+
|
|
96
|
+
Cluster merge candidates as you go: cards sharing two or more tags, or whose
|
|
97
|
+
plans cite the same files, are usually one unit of work wearing several
|
|
98
|
+
titles.
|
|
99
|
+
|
|
100
|
+
## 3 — Dispositions
|
|
101
|
+
|
|
102
|
+
Exactly one per card. The test is the decision; the mechanics are what you
|
|
103
|
+
will run in step 5, written into the table so the human confirms the actual
|
|
104
|
+
mutation, not a summary of it.
|
|
105
|
+
|
|
106
|
+
| Disposition | Test | Mechanics |
|
|
107
|
+
| --- | --- | --- |
|
|
108
|
+
| **Cancel** | The need is gone, or a Complete/ReviewX card already ships the MVP of it | `mcp__conveyor__post_to_chat` first (the reason, and the owning card's slug when one exists), then `mcp__conveyor__update_task { status: "Cancelled" }`. Add the project's `duplicate` tag via `addTags` when `list_tags` showed one; never create it |
|
|
109
|
+
| **Park on hold** | Still worth doing, not now — there is nothing wrong with it except priority | `mcp__conveyor__update_task { onHold: true }` plus a one-line `post_to_chat` note saying what would make it worth picking up. No tag: the on-hold boolean IS the state, the board reads it, and `list_tasks { onHold: true }` finds it later |
|
|
110
|
+
| **Merge** | Two or more cards share a theme or the same files and would be built as one unit | Prefer **adoption**: `mcp__conveyor__create_task` the parent in Planning with a description naming why these belong together, then `mcp__conveyor__set_task_parent` each existing card under it — that keeps every card's chat, history, and plan. Cancel-and-supersede only when the originals would not stand as independent children. Never `start_task` |
|
|
111
|
+
| **Keep** | Needle-moving and still accurate | Touch up the title or description with `mcp__conveyor__update_task` when they have drifted. If the plan is thin or missing, mark the row **needs `/conveyor-plan`** — this skill does not write plans |
|
|
112
|
+
|
|
113
|
+
A card whose card type or age alone would decide it is a card you have not
|
|
114
|
+
looked at. Age is evidence for "nobody wanted this"; it is not a disposition.
|
|
115
|
+
|
|
116
|
+
## 4 — Present and wait
|
|
117
|
+
|
|
118
|
+
One table for the whole scope (one per project under `all`), numbered rows:
|
|
119
|
+
|
|
120
|
+
| # | Card | Status | Age | Disposition | Evidence | Mutation |
|
|
121
|
+
| --- | --- | --- | --- | --- | --- | --- |
|
|
122
|
+
|
|
123
|
+
- **Evidence** is one line and names its source — "`ship-the-thing` is
|
|
124
|
+
Complete and covers this", "no plan, no chat since 2026-07-02", "same three
|
|
125
|
+
files as row 4". A row whose evidence you cannot name is a row you inferred;
|
|
126
|
+
label it as a guess or drop it to Keep.
|
|
127
|
+
- **Mutation** is the exact call you will make, so what gets confirmed is what
|
|
128
|
+
runs.
|
|
129
|
+
- Below the table, the **deliberately not touched** list from step 1.4, with
|
|
130
|
+
the reason per card, and any **contradictions** you found (two Open cards
|
|
131
|
+
arguing opposite directions, a card whose chat says "dropped" but whose
|
|
132
|
+
status says Open).
|
|
133
|
+
|
|
134
|
+
Then wait. That is the end of the turn. Do not apply the "obvious" rows early,
|
|
135
|
+
do not ask a second question, do not re-sweep. If the reply edits rows
|
|
136
|
+
("cancel 3 and 7, park the rest"), the edited table is what applies; if it is
|
|
137
|
+
"apply all", the table applies as presented; if it is partial ("just 1 and
|
|
138
|
+
4"), apply exactly those.
|
|
139
|
+
|
|
140
|
+
## 5 — Apply and report
|
|
141
|
+
|
|
142
|
+
Confirmed rows only, in this order: **cancel → merge → park → keep**. The
|
|
143
|
+
order matters: a card that gets merged under a new parent is never also
|
|
144
|
+
parked, and a cancelled card is never touched up.
|
|
145
|
+
|
|
146
|
+
- Run each row's mutation as written in the table, through the ordinary card
|
|
147
|
+
tools. There is no prune-specific write path, on purpose: a card pruned by
|
|
148
|
+
this skill is indistinguishable from one a person pruned by hand.
|
|
149
|
+
- Report per row: applied, or the exact error. **On a tool error, stop and
|
|
150
|
+
report the row rather than retrying it** — a retry storm on a card that
|
|
151
|
+
refuses a transition is worse than one honest "row 6 failed: <error>".
|
|
152
|
+
- Finish by posting the applied table back — what changed, what did not, and
|
|
153
|
+
the rows the human struck.
|
|
154
|
+
|
|
155
|
+
## What this skill is not
|
|
156
|
+
|
|
157
|
+
- **Not a planner.** A keeper with a thin plan gets flagged for
|
|
158
|
+
`/conveyor-plan`; this skill never writes a plan.
|
|
159
|
+
- **Not a starter.** It never calls `start_task`; a pruned board is a decision
|
|
160
|
+
about what exists, not about what runs next.
|
|
161
|
+
- **Not a deleter.** Cancel is the strongest disposition. A cancelled card
|
|
162
|
+
keeps its chat and history; a deleted one is gone.
|
|
163
|
+
- **Not a review.** InProgress, ReviewPR, ReviewDev, and ReviewLive cards are
|
|
164
|
+
out of scope, and so is any card with a PR or live compute.
|
|
165
|
+
|
|
166
|
+
## Environment notes
|
|
167
|
+
|
|
168
|
+
- All Conveyor tools are **fully qualified** and mostly **deferred** — one
|
|
169
|
+
ToolSearch `select:` with every name you expect to need, up front.
|
|
170
|
+
- The connection's default project may not be the one you mean; pass
|
|
171
|
+
`projectId` per project, on every call, especially under `all`.
|
|
172
|
+
- `list_tasks` defaults to 50 rows and `search_tasks` to 20 — pass `limit`.
|
|
173
|
+
- The on-hold flag is a database boolean the board hides on, not a tag.
|
|
174
|
+
`update_task { onHold: true }` on an InProgress-or-beyond card demotes it to
|
|
175
|
+
Open as it parks — one more reason those cards are out of scope here.
|
|
176
|
+
|
|
177
|
+
## Improve This Skill
|
|
178
|
+
|
|
179
|
+
If this skill was insufficient or slowed the work down, file it with
|
|
180
|
+
`mcp__conveyor__create_suggestion` on the Conveyor project: the issue,
|
|
181
|
+
evidence, and proposed fix.
|
|
@@ -80,7 +80,9 @@ Find the code path the report implicates and, where you can, reproduce it. A
|
|
|
80
80
|
diagnosis grounded only in reading is a hypothesis; a reproduction makes it a
|
|
81
81
|
finding. Attach evidence to the card with `mcp__conveyor__upload_attachment` —
|
|
82
82
|
a screenshot, a log excerpt, a short recording — so the Builder inherits proof
|
|
83
|
-
rather than your assertion.
|
|
83
|
+
rather than your assertion. A re-captured version replaces the old one:
|
|
84
|
+
`mcp__conveyor__delete_attachment` (permanent, `fileId` from
|
|
85
|
+
`list_task_files`) keeps the card's Files list to what is current.
|
|
84
86
|
|
|
85
87
|
## 5. Decide
|
|
86
88
|
|
|
@@ -90,8 +90,10 @@ labels. Each tag carries a `description` (≤255 — the summary), an `overview`
|
|
|
90
90
|
(where the code/rules live), and parent/child tags (a sub-type taxonomy).
|
|
91
91
|
|
|
92
92
|
- **Read**: `mcp__conveyor__list_tags` for the inventory (names, descriptions,
|
|
93
|
-
hierarchy, `
|
|
94
|
-
|
|
93
|
+
hierarchy, `hasOverview`, `contextPathCount`) — a compact summary by default,
|
|
94
|
+
so the whole glossary fits one tool result. Pass `detail: "full"` to ship the
|
|
95
|
+
context links inline, so auditing what the glossary wires up takes one call,
|
|
96
|
+
not one per tag;
|
|
95
97
|
`mcp__conveyor__get_tag` (id or exact name) for one term's full entry —
|
|
96
98
|
overview, linked files, hierarchy, and recent revisions with their reasons. When a card or chat message deep-links a term
|
|
97
99
|
(`@[tag:<id>]` — the web composer offers this when you type a tag name),
|
|
@@ -131,6 +133,7 @@ labels. Each tag carries a `description` (≤255 — the summary), an `overview`
|
|
|
131
133
|
| Do the work here | `conveyor-build` → follows the plan to a PR |
|
|
132
134
|
| Judge the work | `conveyor-review` → one verdict, with risk |
|
|
133
135
|
| Work a whole queue locally | `conveyor-local-loop` → selection and pacing over the above |
|
|
136
|
+
| Keep the board honest | `conveyor-prune` → one disposition per open card, applied only after confirmation (local surface only — it needs `set_task_parent`, `create_task`, and the on-hold flag) |
|
|
134
137
|
|
|
135
138
|
`conveyor-start` and `conveyor-build` are the same phase reached two ways —
|
|
136
139
|
hand the card off, or do it in this checkout — so the choice is about where
|
|
@@ -180,9 +183,9 @@ sync-spawned duplicate.
|
|
|
180
183
|
follows repo patterns — it advances the card through the review pipeline
|
|
181
184
|
(and, per project settings, approves/merges the PR). Otherwise
|
|
182
185
|
`mcp__conveyor__request_changes` with specific feedback, which returns the
|
|
183
|
-
card to the builder. Manual
|
|
184
|
-
|
|
185
|
-
review stage.
|
|
186
|
+
card to the builder. Manual tests (`mcp__conveyor__set_manual_tests`, at
|
|
187
|
+
most 5 per card, user paths in plain language) surface for human sign-off
|
|
188
|
+
at the review stage.
|
|
186
189
|
- Don't approve or merge your own PRs unless the project's policy explicitly
|
|
187
190
|
allows it.
|
|
188
191
|
- Remote workspace access (SSH/preview) goes through
|