@rallycry/conveyor-skills 1.0.16 → 1.0.17

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rallycry/conveyor-skills",
3
- "version": "1.0.16",
3
+ "version": "1.0.17",
4
4
  "description": "Shared Claude Code skills for Conveyor consumer repos, linked into .claude/skills via the conveyor-skills CLI",
5
5
  "keywords": [
6
6
  "claude",
@@ -201,6 +201,11 @@ and never silence a failure with a filter, a `.skip`, or a "known flake" note:
201
201
  either your diff broke it, or the test is broken or environment-dependent and
202
202
  you fix the test.
203
203
 
204
+ **A schema change regenerates its pages.** Run the project's own generate step
205
+ after changing the schema (in Conveyor, `bun run db:generate` rewrites
206
+ `docs/schema`) and commit the regenerated pages with the change. Never edit a
207
+ schema page by hand: CI fails a pull request whose pages are stale.
208
+
204
209
  **Long gates in a pod: background them the sanctioned way.** Launch a long
205
210
  gate with the harness's `run_in_background` Bash option and end the turn — the
206
211
  runner tracks the launch, holds pod liveness while a gate process is alive,
@@ -291,6 +296,22 @@ in chat and mark it Complete.
291
296
 
292
297
  ## Open the PR
293
298
 
299
+ ### The PR body
300
+
301
+ Write the parts a person reads; Conveyor appends the rest.
302
+
303
+ - `## Summary`: 2-4 sentences on what changed and why.
304
+ - `## User flow`: for a user-facing change, the steps a person takes and what
305
+ they see.
306
+ - `## Screenshots`: the captures from Verify (the existing rule above).
307
+ - `## Happy path & edge cases`: 3-6 bullets: the paths you verified, and the
308
+ edge cases you deliberately did NOT handle, so a reviewer can veto
309
+ over-engineering or ask for one.
310
+
311
+ Never write `## Schema & wire changes` or `## Showcase` yourself: Conveyor
312
+ appends each one when it applies (a project with schema pages whose PR changed
313
+ them; a card with showcase attachments) when it opens the PR. Say why the schema changed in the Summary instead.
314
+
294
315
  ### Readiness policy
295
316
 
296
317
  A newer base alone is not a reason to refresh an already-green branch. Keep that
@@ -151,6 +151,13 @@ Actionability bar — every step must survive a context-free reader:
151
151
  - No "as discussed", no links to this chat, no TODOs the executor must
152
152
  research from scratch.
153
153
 
154
+ **A plan that changes stored data or the wire contract adds a `## Schema
155
+ impact` block** ([references/plan-format.md](references/plan-format.md)): the
156
+ models it touches in a `schema` fence, the proposed delta as a `mermaid`
157
+ `erDiagram`, and one line on which existing field or relation already stores
158
+ the fact. That line is where a denormalization gets caught, such as a coach's
159
+ authority copied into a permission field when a role relation already records it.
160
+
154
161
  **Close with the Builder briefing, and write it for the NEXT session.** Every
155
162
  other section addresses a reader; this one addresses the agent that will inherit
156
163
  this card having read the card and nothing else — no research, no dead ends, no
@@ -2,13 +2,26 @@
2
2
 
3
3
  ## Plan Format
4
4
 
5
- ```markdown
5
+ ````markdown
6
6
  ## Objective
7
7
  One sentence: what this task accomplishes and why.
8
8
 
9
9
  ## Approach
10
10
  High-level strategy with relevant files/patterns/APIs.
11
11
 
12
+ ## Schema impact
13
+ Only when the plan changes stored data or the wire contract; omit it otherwise.
14
+ ```schema
15
+ Task
16
+ ```
17
+ ```mermaid
18
+ erDiagram
19
+ Task {
20
+ String reviewNote "added, optional"
21
+ }
22
+ ```
23
+ Already stored? The existing field or relation that holds this fact today, or "none".
24
+
12
25
  ## Implementation Steps
13
26
  1. Concrete step.
14
27
  2. Concrete step.
@@ -26,7 +39,24 @@ High-level strategy with relevant files/patterns/APIs.
26
39
  - **Already decided:** choices the builder should not reopen, one line of why each.
27
40
  - **Traps:** what looks right and is not.
28
41
  - **Verify in this order:** cheapest disqualifying check first.
29
- ```
42
+ ````
43
+
44
+ ## Schema impact — propose the delta, never a page
45
+
46
+ Only a plan that changes stored data or the wire contract carries this block.
47
+
48
+ - A `schema` fence names the models the plan touches. Each renders as its
49
+ current diagram from the project's generated schema pages, so a reviewer
50
+ sees what exists before the change.
51
+ - A `mermaid` `erDiagram` shows the proposed delta: only the models and fields
52
+ that change, each change named in its quoted comment (`"added"`,
53
+ `"removed"`, `"renamed from x"`).
54
+ - One line answers **which existing field or relation already stores this
55
+ fact?** "None" is a fine answer. A second copy of a fact (a permission column
56
+ beside the role that grants it) needs a stated reason, or it is a
57
+ denormalization to design out now.
58
+ - Never write or edit a schema page in a plan. The builder changes the schema
59
+ and regenerates the pages, which then record what actually shipped.
30
60
 
31
61
  ## Citations — ground every code step in the code
32
62
 
@@ -55,10 +55,16 @@ the loop.
55
55
  1. `mcp__conveyor__get_task` for the plan — you cannot judge "does this do what
56
56
  it says" without the "what it says".
57
57
  2. **Ask the PR what you are reviewing, BEFORE any diff:**
58
- `gh pr view <pr> --json state,baseRefName,headRefOid,files`. The PR's base is
58
+ `gh pr view <pr> --json state,baseRefName,headRefOid,files,body`. The PR's base is
59
59
  often not the project default branch, and asking costs one call instead of
60
60
  six spent guessing.
61
- 3. Get the diff with the **merge-base** form, never two-dot, and **fetch the
61
+ 3. **Read the PR body's `## Schema & wire changes` section first** when it has
62
+ one (Conveyor generates it from the changed files). Check each model and
63
+ contract it lists against the plan's `## Schema impact` block: a model the
64
+ plan never named, or a proposed delta that did not land, is a finding. The
65
+ section lists the files as they were at the last `create_pull_request`
66
+ call; when it disagrees with the diff, the diff wins.
67
+ 4. Get the diff with the **merge-base** form, never two-dot, and **fetch the
62
68
  base first** — a pod clones single-branch, so `origin/<base>` does not exist
63
69
  until you ask for it and the diff fails or silently compares against nothing:
64
70
 
@@ -69,18 +75,18 @@ the loop.
69
75
  Two-dot (`git diff <base>..HEAD`) compares against the base TIP, so it
70
76
  reports already-merged commits as part of this change and sends you reviewing
71
77
  code nobody here wrote.
72
- 4. **When the diff and the PR disagree, the PR wins.** Diff the head SHA
78
+ 5. **When the diff and the PR disagree, the PR wins.** Diff the head SHA
73
79
  directly instead (`git diff <headSha>^ <headSha>`). Your checkout can be
74
80
  stale and so can the remote branch tip — a merged PR's commit may be
75
81
  reachable only by SHA. If the PR reports `MERGED` or `CLOSED`, say so and
76
82
  review the recorded head SHA rather than assuming your tree matches it.
77
- 5. **Read the code under review out of the PR's commit, not the working tree:**
83
+ 6. **Read the code under review out of the PR's commit, not the working tree:**
78
84
  `git show <sha>:<path>` and `git grep <pattern> <sha>`. Grepping the working
79
85
  tree when the PR is based elsewhere returns confident, wrong answers — it has
80
86
  produced false review findings.
81
- 6. Read the surrounding code before judging consistency. A pattern is only a
87
+ 7. Read the surrounding code before judging consistency. A pattern is only a
82
88
  pattern if the neighbours share it.
83
- 7. `mcp__conveyor__get_tag` on the card's tags — a tag's overview and linked
89
+ 8. `mcp__conveyor__get_tag` on the card's tags — a tag's overview and linked
84
90
  rules are what "follows existing patterns" actually means in this project.
85
91
 
86
92
  ## Criteria
@@ -96,6 +102,11 @@ the loop.
96
102
  - **Test coverage** — are new paths tested? Edge cases covered? A test that
97
103
  asserts nothing is worse than no test, because it reads as coverage.
98
104
  - **Typing** — proper types, no unnecessary `any`, correct async/await.
105
+ - **Data model** — a fact stored twice (denormalization), a nullable column
106
+ with no stated reason, a relation that duplicates an existing path, a
107
+ contract member without `describe`, and a hand-edited or stale schema page
108
+ (its generated header line is missing, or the project's generate step leaves
109
+ a diff).
99
110
  - **Naming and readability** — clear names, and no comment that says something
100
111
  the code does not do.
101
112
 
@@ -112,6 +112,14 @@ labels. Each tag carries a `description` (≤255 — the summary), an `overview`
112
112
  overview/description only when your change altered what the term means, add
113
113
  the tag to the card only when the work is genuinely about that area, and
114
114
  skip freely otherwise. Never bulk-assign tags from path matches alone.
115
+ - **The schema note**: on a project with schema pages, the in-pod
116
+ `create_pull_request` also returns a "Schema & wire changes detected" line
117
+ (`schemaNote`) naming the changed models, contracts and schema sources, and
118
+ the PR body carries the generated section (on both surfaces). When it says
119
+ the schema sources changed but no page did, regenerate the pages, commit
120
+ them, and call `create_pull_request` again: it reuses the open PR and
121
+ rewrites the section. A project without schema pages
122
+ can set them up with the public guide `guides/schema-pages`.
115
123
 
116
124
  ## Execute
117
125