@rallycry/conveyor-skills 1.0.11 → 1.0.13

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,295 @@
1
+ # Review dimensions — what to look for, and what to strike
2
+
3
+ The per-dimension checklist behind step 2 of
4
+ [conveyor-release-review](../SKILL.md). Read that first: the evidence bar, the
5
+ priority rubric and the adversarial pass all live there.
6
+
7
+ Each dimension below has four parts:
8
+
9
+ - **Look for** — the candidates worth raising.
10
+ - **Cheapest evidence** — the first thing to try, because step 3 works
11
+ cheapest-first.
12
+ - **A finding** — what a real one looks like once the evidence is in.
13
+ - **A strike** — a candidate from the same dimension that the adversarial pass
14
+ should kill, and why. These matter as much as the findings: most of what a
15
+ release review turns up belongs here.
16
+
17
+ The examples are illustrations, not a list to match against. File paths in
18
+ them are invented.
19
+
20
+ ## 1. Cross-PR interaction
21
+
22
+ The headline check, and the one no single-card review was positioned to make.
23
+
24
+ **Look for**
25
+
26
+ - Build the **overlap map** first: from `git diff --name-only`, group files by
27
+ the PRs that touched them, then widen to symbols, database tables, caches,
28
+ queues and shared packages. Two PRs that never touch the same file can still
29
+ meet at a table or a cache key.
30
+ - Two green PRs on one surface: read their combined diff as a single change.
31
+ - A shared-package change rippling into a caller that merged **earlier** in
32
+ the release, written against the old behavior.
33
+ - Two PRs that each added a default, a retry, or a debounce to the same path.
34
+
35
+ **Cheapest evidence** — a scoped test that exercises both changes together;
36
+ the dev environment's logs for the shared path since the later PR merged.
37
+
38
+ **A finding** — PR A renames a status value in the shared package; PR B,
39
+ merged two days earlier, filters a query on the old name. Proven:
40
+ `shared/status.ts:41` no longer exports the value `board/query.ts:118`
41
+ compares against, so the filter matches nothing. High if the board is a live
42
+ flow.
43
+
44
+ **A strike** — two PRs both edited the same settings page, in different
45
+ sections, with no shared state. Overlap on a file is a reason to look, not a
46
+ finding. Struck: the evidence does not support the claim.
47
+
48
+ ## 2. Data and migrations
49
+
50
+ Inherently untoggleable. CI runs migrations against a schema no production
51
+ data ever stressed.
52
+
53
+ **Look for**
54
+
55
+ - Destructive steps: dropped columns or tables, narrowed types, new `NOT NULL`
56
+ without a default, unique indexes on columns that may hold duplicates.
57
+ - Lock-heavy operations on large tables: index builds, rewrites, backfills
58
+ inside the migration transaction.
59
+ - **Ordering between migrations** from different PRs on the same table. They
60
+ merge cleanly and still break in sequence.
61
+ - The deploy window: old code running against the new schema, or new code
62
+ against the old one, depending on the project's deploy order.
63
+ - A backfill the code assumes has run.
64
+
65
+ **Cheapest evidence** — production row counts and a duplicate check through
66
+ the project's sanctioned read-only path; the migration SQL itself.
67
+
68
+ **A finding** — a migration adds a unique index on `(project_id, slug)`.
69
+ Observed: a read-only count on production returns 14 duplicate pairs. The
70
+ migration fails at deploy. High.
71
+
72
+ **A strike** — "the index build could lock the table". Observed: the table
73
+ holds 900 rows. Struck: niche path, and the evidence shows the cost is
74
+ milliseconds.
75
+
76
+ ## 3. Rollback and off-switches
77
+
78
+ **Look for**
79
+
80
+ - Large behavior changes with no flag, setting or config to turn them off.
81
+ With a switch, mitigation is a config change; without one it is a rollback
82
+ or a hotfix.
83
+ - Changes whose rollback is unsafe: a migration with no down path that the
84
+ previous code cannot run against, a data format the old code cannot read.
85
+ - A flag that exists but defaults on for everyone at once.
86
+
87
+ **Cheapest evidence** — a static read for the gate; the project's flag or
88
+ settings catalog.
89
+
90
+ **A finding** — a rewritten notification fan-out ships ungated, and the
91
+ migration beside it drops the column the old implementation read. Proven:
92
+ reverting the code alone leaves it reading a column that no longer exists.
93
+ Rollback needs a restore. High.
94
+
95
+ **A strike** — "this refactor has no feature flag". The refactor preserves
96
+ behavior and is covered by the existing suite. Struck: over-engineering — a
97
+ flag for a change with no behavior difference is a second code path to
98
+ maintain for nothing.
99
+
100
+ ## 4. Deploy and config
101
+
102
+ **Look for**
103
+
104
+ - Environment variables or secrets the code now requires, checked against
105
+ what the deploy configuration actually provides.
106
+ - CI, workflow and infra-manifest changes that only take effect at release.
107
+ - Dependency major bumps, runtime version requirements, new system packages.
108
+ - Steps a human has to take. These go in the report's **deploy checklist**
109
+ whether or not they are findings.
110
+
111
+ **Cheapest evidence** — a grep of the diff for new environment reads, against
112
+ the deploy manifests; startup validation output from a local boot.
113
+
114
+ **A finding** — the API validates a new required variable at startup, and the
115
+ production deploy manifest does not set it. Proven from the two files:
116
+ the service refuses to boot. High.
117
+
118
+ **A strike** — a new optional variable with a working default. Not a finding.
119
+ It belongs in the deploy checklist as a note, and nowhere else.
120
+
121
+ ## 5. Contracts and compatibility
122
+
123
+ **Look for**
124
+
125
+ - API, socket, webhook or tool contract changes — renamed fields, newly
126
+ required fields, removed methods — against clients that deploy on a
127
+ different schedule: a web client cached in a browser, a mobile build, an
128
+ agent baked into an image, a published package pinned downstream.
129
+ - Strict schemas that now reject what yesterday's client still sends.
130
+ - Published-package changes that are breaking under a patch release.
131
+
132
+ **Cheapest evidence** — production logs for the old shape still arriving;
133
+ the consumer's pinned version.
134
+
135
+ **A finding** — a request schema gained `.strict()`. Observed: production
136
+ logs show a client still sending the field it now rejects, 2,100 requests in
137
+ the last day. Those requests fail after the release. High or Medium by what
138
+ the requests are.
139
+
140
+ **A strike** — an added optional response field. Additive, ignored by old
141
+ clients. Struck: no consequence.
142
+
143
+ ## 6. Security and access
144
+
145
+ **Look for**
146
+
147
+ - New methods, endpoints or tools without an access check, or with a check
148
+ that resolves no entity and so passes for any signed-in user.
149
+ - Secrets, tokens or personal data written to logs.
150
+ - Unbounded queries and unpaginated lists on user-controlled input.
151
+ - Injection: string-built queries, shell commands, unescaped rendering.
152
+
153
+ **Cheapest evidence** — a local call to the new method as a user who should
154
+ be refused.
155
+
156
+ **A finding** — a new read method declares member-level access but resolves
157
+ no entry id. Reproduced locally: a user outside the project receives the
158
+ project's data. High.
159
+
160
+ **A strike** — "this admin-only method should also rate-limit". It sits
161
+ behind an admin check and an existing global limiter, cited. Struck:
162
+ redundant code path.
163
+
164
+ ## 7. Stubs and cleanup
165
+
166
+ Search the **diff**, not the tree. Pre-existing debt is out of scope.
167
+
168
+ **Look for** — TODO / FIXME / HACK, debug logging, `.only` and skipped tests,
169
+ commented-out code, placeholder copy, temporary endpoints, flags and
170
+ translation keys the release added and never referenced, or whose last
171
+ reference it removed.
172
+
173
+ **Cheapest evidence** — `git diff origin/<default>..."$TIP"` piped through a
174
+ search for the markers, added lines only.
175
+
176
+ **A finding** — a test file gained `.only`. Proven: the rest of that suite
177
+ has not run in CI since the PR merged, and two of its cases fail when run.
178
+ Medium, or High if those cases guard a live flow.
179
+
180
+ **A strike** — a TODO noting a possible future optimization. Struck: no
181
+ consequence. Twelve of these in a report are how a real finding gets skimmed
182
+ past.
183
+
184
+ ## 8. Documented-contract drift
185
+
186
+ **Look for**
187
+
188
+ - For each subsystem the release touched, `mcp__conveyor__get_tag` and read
189
+ the overview and its linked files. Three findings hide here: a change that
190
+ silently makes a documented claim false, a change that should have updated
191
+ the overview and did not, and a renamed or deleted file that a tag still
192
+ links.
193
+ - Rules and docs in the repo that agents load as context. A rule that now
194
+ describes removed behavior misleads every future session.
195
+
196
+ **Cheapest evidence** — a static comparison of the claim against the code;
197
+ the tag's link-verification status.
198
+
199
+ **A finding** — a tag overview states that one process owns a given write,
200
+ and the release added a second writer. Proven with both `file:line` cites.
201
+ Medium: nothing breaks today, and every future change will be planned on a
202
+ false premise.
203
+
204
+ **A strike** — an overview that is merely less detailed than the new code.
205
+ Struck: not caused by the release, and nothing in it is false.
206
+
207
+ ## 9. Verification gaps
208
+
209
+ **Look for**
210
+
211
+ - Changed paths that are risky and have no test.
212
+ - Manual tests on member cards left unapproved or rejected:
213
+ `mcp__conveyor__list_manual_tests`.
214
+ - CI state on the release PR, and checks that were skipped or never ran.
215
+ - Suites weakened in the release: assertions removed, a filter added.
216
+
217
+ **Cheapest evidence** — run the scoped test that should exist; the manual
218
+ test list.
219
+
220
+ **A finding** — a payment path changed and its only manual test was
221
+ rejected with a note that was never addressed. Observed on the card. Medium,
222
+ or High if a reproduction confirms the rejection.
223
+
224
+ **A strike** — "this helper has no unit test". It is covered by the
225
+ integration suite, cited. Struck: redundant.
226
+
227
+ ## 10. Open signals
228
+
229
+ **Look for**
230
+
231
+ - `mcp__conveyor__read_task_chat` on member cards: a follow-up promised
232
+ ("I'll handle the empty state in a later card") with no card to show for
233
+ it, or a reviewer concern that was acknowledged and never resolved.
234
+ - Incidents filed since the changes merged to the dev branch that implicate
235
+ a release change: `search_tasks` with `typeFilters: ["incident"]`.
236
+ - Errors in the dev environment's logs that began at a merge in this release.
237
+
238
+ **Cheapest evidence** — dev logs with a start time at the merge; the
239
+ incident's own context.
240
+
241
+ **A finding** — an error appears in dev logs 410 times, first seen four
242
+ minutes after a release PR merged, with a stack in a file that PR changed.
243
+ Observed. Priority by what the failing call does.
244
+
245
+ **A strike** — an incident filed during the window whose stack is in code
246
+ the release never touched. Struck: not caused by the release. It already has
247
+ a card.
248
+
249
+ ## Project dimensions
250
+
251
+ A wrapper skill adds dimensions in the same four-part shape, and each becomes
252
+ a ledger row. The shape to follow:
253
+
254
+ ```markdown
255
+ ## <Name>
256
+
257
+ **Look for** — <the candidates, and where the project's rules for them live>
258
+ **Cheapest evidence** — <the project tool that settles it fastest>
259
+ **A finding** — <one real example>
260
+ **A strike** — <one that should be killed, and which strike test kills it>
261
+ ```
262
+
263
+ Dimensions that tend to be project-specific: multi-tenant assumptions (one
264
+ customer's usage treated as the contract), a project's own authorization
265
+ model, domain invariants, regulated data. They face the same evidence bar and
266
+ the same adversarial pass as everything above.
267
+
268
+ ### The wrapper skill
269
+
270
+ The project's own skill stays thin. It invokes this one and adds what only
271
+ that project knows:
272
+
273
+ ```markdown
274
+ ---
275
+ name: release-review
276
+ description: Review a pending release of <project>.
277
+ ---
278
+ Run `/conveyor-release-review` with these additions.
279
+
280
+ Project dimensions:
281
+ - <name>: <the question>, <where the rules live>, <cheapest evidence>
282
+
283
+ Evidence tools:
284
+ - Local reproduction: `<the repo's mock or dev stack command>`
285
+ - Read-only production data: `<the repo's sanctioned script>`
286
+ ```
287
+
288
+ A wrapper may add dimensions and name tools. It may not lower the evidence
289
+ bar, skip the adversarial pass, or change what the priority levels mean.
290
+
291
+ A wrapper also may not relax the fan-out rules in
292
+ [fan-out.md](fan-out.md): subagents hand back text and write no report files,
293
+ only the orchestrator spawns agents, and at most four run at once. These
294
+ follow from how the harness behaves and from account limits, not from project
295
+ policy. A wrapper may LOWER the cap; it may never raise it or lift a rule.
@@ -0,0 +1,130 @@
1
+ # Fanning out — the mechanics
2
+
3
+ How the orchestrator of a [release review](../SKILL.md) splits the ledger
4
+ across subagents without losing their work. SKILL.md states the three rules;
5
+ this file is how to follow them.
6
+
7
+ ## Why
8
+
9
+ Two limits broke earlier runs. Neither is project policy. Both come from how
10
+ the harness and the account behave, so a wrapper skill may lower the cap
11
+ below but never raise it or lift a rule.
12
+
13
+ 1. **The harness refuses report files from subagents.** Claude Code's Write
14
+ tool refuses a subagent `.md` whose name starts with REPORT, SUMMARY,
15
+ FINDINGS or ANALYSIS:
16
+
17
+ ```
18
+ Subagents should return findings as text, not write report files.
19
+ ```
20
+
21
+ This guard is deliberate. Do not route around it with another file name or
22
+ a Bash heredoc. The subagent's final message is the report.
23
+
24
+ 2. **Every agent draws on one account session limit.** The limit is a single
25
+ five-hour usage window. Every subagent and the orchestrator share it. When
26
+ it runs out, every call fails at once:
27
+
28
+ ```
29
+ You've hit your session limit · resets 9:20pm
30
+ ```
31
+
32
+ (HTTP 429, `rateLimitType: "five_hour"`). Every agent in flight dies, and
33
+ its unsaved work dies with it. The orchestrator is down too, until the
34
+ reset. A run with 13 agents in flight lost 10; a run with about 10 in flight
35
+ (one reviewer spawned 3 of its own) lost 5. Runs at 7 and at 4 lost none.
36
+
37
+ No cap makes a run safe, because the limit is account-wide. The cap bounds
38
+ what one hit destroys. The no-nesting rule and the tool-call budget cut what a
39
+ run spends.
40
+
41
+ ## The run directory
42
+
43
+ `/tmp/conveyor-release-review/<label-slug>/`, where `<label-slug>` is the
44
+ release label in kebab case (`release-2026-09-30`, `pre-release-2026-09-30`).
45
+ Create it before the first launch. It holds:
46
+
47
+ - `brief.md` — the shared part of every agent prompt: the brief block below,
48
+ the ground rules and the evidence bar, verbatim.
49
+ - `ledger.md` — the coverage ledger. Its first line names the run directory,
50
+ so a resumed or compacted session finds it again.
51
+ - `<slice>.md` — one file per agent, holding that agent's hand-back.
52
+
53
+ **On each completion notice, in this order:**
54
+
55
+ 1. Write the hand-back verbatim to `<slice>.md`. Do this before you read it
56
+ closely, and before anything else can fail.
57
+ 2. Mark the ledger rows the hand-back covers.
58
+ 3. Launch the next slice, if one is waiting.
59
+
60
+ The saved files are the durable record. They survive compaction and a resume,
61
+ and the adversarial agent reads findings from them by path.
62
+
63
+ ## The brief block
64
+
65
+ Paste this verbatim into every agent prompt, area and adversarial alike:
66
+
67
+ ```markdown
68
+ 1. Your final message is your report. Do not write report, summary or
69
+ findings files, and do not route a refused write through Bash or another
70
+ file name. The orchestrator saves your final message.
71
+ 2. Do not spawn agents or run workflows (no Agent, Task or Workflow tool).
72
+ The orchestrator owns all fan-out.
73
+ 3. Budget: about 150 tool calls. At the budget, stop and return what you
74
+ have, listing what you did not reach as "not reviewed".
75
+ 4. Already settled, do not re-derive: <list, or "nothing yet">.
76
+ ```
77
+
78
+ Then give the hand-back format:
79
+
80
+ - **Coverage** — one row per PR or card: `clean`, `finding`, or
81
+ `not reviewable (why)`.
82
+ - **Findings** — each with its priority, the PR that introduced it, the
83
+ evidence grade, the exact command and its result, the smallest fix, and the
84
+ strongest case for striking it.
85
+ - **Unverified** — each with the query that would settle it.
86
+ - **Struck** — each with its reason.
87
+ - **Deploy-checklist items.**
88
+
89
+ ## Scheduling
90
+
91
+ - **At most 4 agents in flight**, the adversarial agent included.
92
+ - **Launch as slots free up**, not in fixed waves. When one agent hands back
93
+ and its file is saved, launch the next slice.
94
+ - **One adversarial agent.** Launch it only after every area file exists and
95
+ you have finished steps 3 and 4. First write `candidates.md`: every
96
+ candidate that reached step 4, with its evidence, its priority and the fix
97
+ you would propose. The area files hold raw hand-backs, so they miss your own
98
+ candidates, your grading and your fixes. The agent reads `candidates.md`,
99
+ opens the area files only for detail, argues for striking each candidate,
100
+ and hands back one verdict per candidate. Save its hand-back to
101
+ `adversarial.md`.
102
+ - While agents run, end the turn. Their completion notices resume the run.
103
+
104
+ ## When an agent dies
105
+
106
+ **A session limit** (`session limit · resets <time>`):
107
+
108
+ 1. You are down too. Nothing runs until the reset, and an immediate retry
109
+ fails. Do not retry.
110
+ 2. After the reset, reread the run directory and the ledger.
111
+ 3. Relaunch only the slices with no `<slice>.md`. Narrow each one if you can,
112
+ and give each an already-settled list built from the saved files.
113
+ 4. Never relaunch above the cap that hit the limit. If 4 in flight hit it,
114
+ relaunch at 3 or fewer.
115
+
116
+ **Any other error** (overloaded, or a rate limit with no reset time):
117
+
118
+ 1. Wait a minute or two, then relaunch that one slice once.
119
+ 2. If it fails again, review the slice yourself, or mark its ledger rows
120
+ `not reviewable (agent failed twice: <error>)`.
121
+
122
+ **Always:**
123
+
124
+ - Never relaunch a slice whose file exists.
125
+ - Never relaunch a whole wave.
126
+
127
+ ## If you were spawned as a subagent yourself
128
+
129
+ You are not the orchestrator. Do not fan out. Work the ledger yourself, and
130
+ return your report as your final message.
@@ -0,0 +1,183 @@
1
+ # Report and card templates
2
+
3
+ The shapes behind steps 6 and 7 of
4
+ [conveyor-release-review](../SKILL.md). Fill them in; do not pad them. A
5
+ section with nothing to say is written as one line saying so, never dropped,
6
+ because a missing section reads as a skipped check.
7
+
8
+ `<label>` is `Release <version>` when a release is cut, and
9
+ `Pre-release <YYYY-MM-DD>` otherwise.
10
+
11
+ ## The report
12
+
13
+ Posted to the conversation, and to the release card's chat when one exists.
14
+
15
+ ```markdown
16
+ **HOLD — <label> @ <tip sha, 7 chars>.** 2 High findings. Blockers: <pack link>
17
+
18
+ Reviewed `origin/<default>...<tip>`: 38 PRs, 214 files. Tip recorded
19
+ <timestamp>; <"unchanged at report time" | "moved to <sha>, N commits not reviewed">.
20
+
21
+ ### Findings
22
+
23
+ | Priority | Finding | Evidence | Introduced by | Card |
24
+ | --- | --- | --- | --- | --- |
25
+ | High | Unique index fails on 14 duplicate rows | Observed | #4712 | <link> |
26
+ | Medium | Board filter matches nothing after status rename | Proven | #4698 + #4705 | <link> |
27
+
28
+ Release blockers: <pack link> (2 cards, Open)
29
+ Release suggestions: <pack link> (3 cards, Planning)
30
+
31
+ ### Deploy checklist
32
+
33
+ - [ ] Set `<VARIABLE>` in production before the API deploys (#4720)
34
+ - [ ] Nothing else requires a human step.
35
+
36
+ ### Coverage
37
+
38
+ 38 of 38 PRs evaluated. 2 without a card, reviewed on the diff alone: #4701, #4733.
39
+
40
+ | Dimension | Result |
41
+ | --- | --- |
42
+ | Cross-PR interaction | 1 finding. 6 overlapping surfaces read as combined diffs. |
43
+ | Data and migrations | 1 finding. 4 migrations, none lock-heavy at production size. |
44
+ | Rollback and off-switches | Clean. |
45
+ | ... | ... |
46
+
47
+ ### Struck
48
+
49
+ | Candidate | Struck because |
50
+ | --- | --- |
51
+ | Add a retry to the export job | Redundant: the queue already retries 3 times (`jobs/queue.ts:88`) |
52
+ | Guard against a malformed legacy payload | Niche and graceful: 0 occurrences in 30 days, error already surfaces to the user |
53
+
54
+ ### Unverified
55
+
56
+ | Candidate | Would be | What would settle it |
57
+ | --- | --- | --- |
58
+ | Webhook handler may double-fire on redelivery | High | A redelivery against the dev environment, or the provider's delivery log |
59
+
60
+ ### Method
61
+
62
+ Evidence sources used: dev and prod logs, local stack, read-only production data.
63
+ Unavailable: <source>, so <which dimensions rest on static reading>.
64
+ Not reviewed: <anything skipped, and why>.
65
+ ```
66
+
67
+ Rules for the verdict line:
68
+
69
+ - It is the **first line**, in both destinations. Someone who reads nothing
70
+ else must still get the verdict.
71
+ - It names the SHA. A verdict without one cannot be checked against what
72
+ actually shipped.
73
+ - `SHIP WITH OPEN QUESTIONS` names each open question on that same line or the
74
+ next one. It is not a softer `SHIP`.
75
+
76
+ ## The hold notice
77
+
78
+ Posted to the release card when the verdict is `HOLD`. The first line carries
79
+ the whole message; the report follows beneath it.
80
+
81
+ ```markdown
82
+ **HOLD — do not ship <label> until the blockers merge.** 2 High findings: <pack link>
83
+ ```
84
+
85
+ ## The pack parent
86
+
87
+ ```markdown
88
+ ## Objective
89
+ Clear the findings that block <label>, found by the release review of
90
+ `<tip sha>` on <date>.
91
+
92
+ ## Approach
93
+ Each child is one finding with its own evidence and its own smallest fix.
94
+ They are independent unless a `dependsOn` edge says otherwise.
95
+
96
+ ## Implementation Steps
97
+ 1. <child title> — <one line>
98
+ 2. <child title> — <one line>
99
+
100
+ ## Testing
101
+ Each child carries its own gates and acceptance criteria.
102
+
103
+ ## Notes
104
+ - Release card: <link>. Reviewed SHA: `<tip sha>`.
105
+ - <One of:> This is a full release, so fixes merged to `<dev>` ship with it.
106
+ <or> This is a cherry-pick release: once these merge, a human adds them with
107
+ Add to Release.
108
+ - Priority is the urgency of the fix. Risk is set by identification and review.
109
+
110
+ ## Builder briefing
111
+ - **Start here:** the child with the earliest deploy-time consequence.
112
+ - **Already decided:** each fix is the smallest change that removes the
113
+ consequence. Do not widen it.
114
+ - **Traps:** <what looks right and is not>
115
+ - **Verify in this order:** re-run each child's evidence command first; a
116
+ finding that no longer reproduces is a finding someone already fixed.
117
+ ```
118
+
119
+ The suggestions pack uses the same shape. Its Objective says these are worth
120
+ doing and do not hold the release, and its Notes say the pack sits in Planning
121
+ until a human promotes it.
122
+
123
+ ## The finding card
124
+
125
+ One per finding, as a pack child or as a standalone card. It follows the
126
+ `/conveyor-plan` plan format
127
+ ([plan-format.md](../../conveyor-plan/references/plan-format.md)) with two
128
+ sections added at the top, because a builder who cannot re-run the evidence
129
+ cannot tell a fixed finding from a wrong one.
130
+
131
+ ```markdown
132
+ ## Finding
133
+ <What breaks, for whom, and when. One short paragraph.>
134
+
135
+ Priority: <level>. Found in <label> @ `<tip sha>`. Release card: <link>.
136
+ Introduced by: #<pr> (<card slug>), #<pr> (<card slug>).
137
+
138
+ ## Evidence
139
+ Grade: <Observed | Reproduced | Proven>
140
+
141
+ <the exact query or command>
142
+
143
+ Result: <what it returned, with the numbers>
144
+
145
+ ## Objective
146
+ <One sentence: the consequence this card removes.>
147
+
148
+ ## Approach
149
+ <The smallest change that removes it, and why nothing larger is needed.>
150
+
151
+ ## Implementation Steps
152
+ 1. `path/to/file.ts:120` — `symbolName`: <the change>
153
+ 2. ...
154
+
155
+ ## Testing
156
+ - Gates: <the repo's scoped commands for this diff>
157
+ - The evidence command above no longer shows the failure.
158
+ - Manual tests (0-3): <plain sentences, user path only>
159
+
160
+ ## Notes
161
+ - What the adversarial pass considered and rejected: <larger fixes, and why>
162
+ - Blast radius: <callers and consumers of what this touches>
163
+
164
+ ## Builder briefing
165
+ - **Start here:** <file>
166
+ - **Already decided:** <what not to reopen, and why>
167
+ - **Traps:** <what looks right and is not>
168
+ - **Verify in this order:** <cheapest disqualifying check first>
169
+ ```
170
+
171
+ Rules for the card:
172
+
173
+ - **The description is for a non-engineer**: one or two plain sentences on
174
+ what goes wrong and for whom. Technical detail goes in the plan.
175
+ - **The title names the consequence, not the dimension.** "Deploy fails on
176
+ duplicate slugs", not "Migration issue".
177
+ - **Evidence is reproducible or it is not evidence.** An exact command, not
178
+ "checked the logs".
179
+ - **Never paste a secret, a token or personal data** into a card. Quote the
180
+ shape of the log line, not the user's email in it.
181
+ - **The fix is the smallest one.** Anything larger that the adversarial pass
182
+ rejected is recorded under Notes, so the builder does not rediscover it and
183
+ build it anyway.
@@ -110,6 +110,12 @@ You have write access. Use it in proportion:
110
110
 
111
111
  - **Small and unambiguous** → fix it, commit, push, then re-review your own
112
112
  change as part of the diff. After pushing, wait for CI before approving.
113
+ **Locally**, a fix checks out the PR branch in a checkout other sessions may
114
+ share. Run `checkout acquire --card <slug>` before the checkout (`held` →
115
+ flag the fix instead of making it), `checkout acquire --card <slug> --branch
116
+ <pr-branch>` after it, and `checkout release --card <slug>` once the fix is
117
+ pushed and the tree is restored — protocol in
118
+ [conveyor-build's checkout-claim reference](../conveyor-build/references/checkout-claim.md).
113
119
  - **Larger, or a judgment call the author should make** → flag it in the
114
120
  verdict with the file, the line, what is wrong, and a suggested direction.
115
121
 
@@ -132,6 +132,7 @@ labels. Each tag carries a `description` (≤255 — the summary), an `overview`
132
132
  | 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) |
133
133
  | Do the work here | `conveyor-build` → follows the plan to a PR |
134
134
  | Judge the work | `conveyor-review` → one verdict, with risk |
135
+ | Audit a release before it ships | `conveyor-release-review` → evidence-backed findings, filed by priority as a blocker pack and a suggestions pack (local surface only — it needs `create_task`, `manage_priorities`, and `add_dependency` on another card) |
135
136
  | Work a whole queue locally | `conveyor-local-loop` → selection and pacing over the above |
136
137
  | 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) |
137
138
 
@@ -214,6 +215,13 @@ sync-spawned duplicate.
214
215
  origin <branch>` and `git merge-base --is-ancestor` before rebuilding
215
216
  anything locally — platform autosync may have already pushed for you, and a
216
217
  dirty tree may belong to a concurrent session.
218
+ - **Local sessions take turns on one checkout.** `conveyor-build`,
219
+ `conveyor-local-loop` and local `conveyor-review` fixes hold a checkout
220
+ claim, so a second session waits instead of switching branches underneath
221
+ the first. `conveyor-skills checkout status` shows who holds it (card,
222
+ branch, host, heartbeat age). `conveyor-skills checkout release --force` is
223
+ the human override for a wedged claim — an agent runs it only when the user
224
+ says so. Protocol: `conveyor-build/references/checkout-claim.md`.
217
225
 
218
226
  ## Improve This Skill
219
227