@jesdi/skills 0.0.15 → 0.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/README.md CHANGED
@@ -58,7 +58,7 @@ which ones are part of the standard setup, where they come from, and (under
58
58
  upstream with the [skills.sh](https://skills.sh/) CLI:
59
59
 
60
60
  ```bash
61
- npx skills add mattpocock/skills # grill-me, grill-with-docs, grilling, improve-codebase-architecture, to-questionnaire, tdd, code-review, codebase-design, diagnosing-bugs, resolving-merge-conflicts
61
+ npx skills add mattpocock/skills # grill-me, grill-with-docs, grilling, improve-codebase-architecture, to-questionnaire, tdd, code-review, codebase-design, diagnosing-bugs, resolving-merge-conflicts, handoff, teach, wait-what
62
62
  npx skills add JuliusBrussee/caveman # caveman suite
63
63
  npx skills add vercel-labs/skills # find-skills
64
64
  npx skills add vercel-labs/agent-skills # vercel-react-best-practices
@@ -70,13 +70,13 @@ versions; `npx skills update` refreshes them.
70
70
 
71
71
  ### Forks (the one exception)
72
72
 
73
- `to-spec`, `to-tickets`, `prototype` and `wizard` are modified copies of the
74
- mattpocock/skills originals, vendored under `skills/<name>/` with the upstream
75
- MIT `LICENSE` and a header naming the upstream commit. They keep their upstream
76
- names on purpose, so **never install the upstream copies of those four names
77
- alongside them** (`npx skills add mattpocock/skills` installs the whole set —
78
- deselect those four, or uninstall them afterwards). `external-skills.json`
79
- lists them under `forks`.
73
+ `implement-spec`, `to-spec`, `to-tickets`, `prototype` and `wizard` are
74
+ modified copies of the mattpocock/skills originals, vendored under
75
+ `skills/<name>/` with the upstream MIT `LICENSE` and a header naming the
76
+ upstream commit. They keep their upstream names on purpose, so **never install
77
+ the upstream copies of those five names alongside them** (`npx skills add
78
+ mattpocock/skills` installs the whole set — deselect those five, or uninstall
79
+ them afterwards). `external-skills.json` lists them under `forks`.
80
80
 
81
81
  ### The box set
82
82
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jesdi/skills",
3
- "version": "0.0.15",
3
+ "version": "0.0.17",
4
4
  "description": "jesdi's agent skills (content package consumed by @jesdi/skills-cli)",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -34,23 +34,33 @@ size, orchestration.
34
34
  causes it (an invariant enforced by an optional parameter is a structure
35
35
  finding). Everything else belongs in a different review.
36
36
 
37
+ **Repo conventions come first.** Read the repo's AGENTS.md (and CLAUDE.md,
38
+ CONTRIBUTING.md, or coding-standards file) before the diff. A breach of a
39
+ documented rule is a finding; cite the file and the rule. A documented rule
40
+ overrides a smell: when the repo endorses a pattern the table would flag,
41
+ don't flag it.
42
+
37
43
  ## The smells
38
44
 
39
45
  Run every meaningful change through this table, top to bottom. Each row is one
40
46
  concept; the *Ask* is the question that exposes it, the *Remedy* is what to
41
- push for.
47
+ push for. Names in parentheses are the matching Fowler smells (*Refactoring*,
48
+ ch. 3), folded into the row that already covers them.
42
49
 
43
50
  | # | Smell | Ask | Remedy |
44
51
  |---|-------|-----|--------|
45
- | 1 | **Duplicated concept** — one idea expressed twice: near-duplicate helper, parallel model, copy-pasted branch, a flag *and* an optional both meaning "off", the same predicate reimplemented instead of reused | What single concept are these copies of? Where is its canonical home? | Name the concept once; make the variants its data or parameters; delete the copies. Never accept a second copy because the first one exists. |
52
+ | 1 | **Duplicated concept** — one idea expressed twice: near-duplicate helper, parallel model, copy-pasted branch (Duplicated Code), a flag *and* an optional both meaning "off", the same predicate reimplemented instead of reused, the same `switch`/`if`-cascade on the same type in two places (Repeated Switches) | What single concept are these copies of? Where is its canonical home? | Name the concept once; make the variants its data or parameters (one map or one polymorphic dispatch both sites share); delete the copies. Never accept a second copy because the first one exists. |
46
53
  | 2 | **Complexity rearranged, not deleted** — the diff moves code around but the reader still holds the same number of branches, modes, and helpers | Which reframing of the model or ownership makes these branches disappear? | Change the model so the special case becomes the default flow. Prefer the version that feels inevitable in hindsight. |
47
54
  | 3 | **Special case in a shared flow** — new `if`, one-off boolean, nullable mode, or feature check bolted into an unrelated path | Whose decision is this, and why is it made here? | Move it behind its own abstraction (policy, resolver, dispatcher, module); keep the shared path linear. |
48
- | 4 | **Wrong layer / boundary leak** — feature logic in a shared module, implementation details through an API, callers re-deriving what the owner already knows | Which module owns this concept? | Move the logic to the owner; callers receive results, not raw inputs to recompute. |
49
- | 5 | **Indirection without clarity** — thin wrapper, pass-through helper, "generic" mechanism hiding a simple data shape | What does the reader learn from this layer? | Delete it and keep the direct call. Boring and direct beats clever. |
50
- | 6 | **Weak contract** — `any`, `unknown`, casts, optional params, silent fallbacks that paper over an unclear invariant | What invariant is this hiding? | Make the boundary explicit in the type so the control flow simplifies. |
51
- | 7 | **File sprawl** — the diff pushes a file past a healthy size boundary (~1k lines) | Should this be decomposed *before* adding to it? | Split by concept first; waive only with a compelling structural reason. |
52
- | 8 | **Needless sequencing / non-atomic update** — independent work serialized, related updates that can leave state half-applied | Is this actually dependent? Can it be observed half-done? | Parallelize independent work; group related updates. Not micro-optimization — brittleness. |
53
- | 9 | **Short-horizon change** — "temporary", TODO-later, quick patch, deferred cleanup, a shape chosen because it is the smallest diff | What does this look like when its reason is gone? What does removing it cost? | Do the durable fix now, or structure the stopgap so removal is a pure deletion (one branch, one file), never a refactor of live callers. |
55
+ | 4 | **Wrong layer / boundary leak** — feature logic in a shared module, implementation details through an API, callers re-deriving what the owner already knows, a function that works on another module's data more than its own (Feature Envy), callers walking `a.b().c().d()` to reach what they need (Message Chains) | Which module owns this concept? | Move the logic to the owner; callers receive results, not raw inputs to recompute. Hide a navigation walk behind one method on the first object. |
56
+ | 5 | **Change doesn't follow module lines** — one logical change forces small edits scattered across many files (Shotgun Surgery), or one module is edited for several unrelated reasons (Divergent Change) | If this rule changes again, how many files move? Does this module have one reason to change? | Gather what changes together into one module; split a module that changes for unrelated reasons. |
57
+ | 6 | **Indirection without clarity** — thin wrapper, pass-through helper or class that only delegates (Middle Man), "generic" mechanism hiding a simple data shape, parameters, hooks or abstractions for needs nobody has yet (Speculative Generality) | What does the reader learn from this layer? Who needs this flexibility today? | Delete it and keep the direct call. Boring and direct beats clever. |
58
+ | 7 | **Refused inheritance** — a subclass or implementer that ignores, stubs out, or overrides most of what it inherits (Refused Bequest) | Is this really a kind of its parent? | Drop the inheritance; compose, or implement a narrower interface. |
59
+ | 8 | **Weak contract** — `any`, `unknown`, casts, optional params, silent fallbacks that paper over an unclear invariant; a string or number standing in for a domain concept (Primitive Obsession); the same few fields or params always travelling together (Data Clumps) | What invariant is this hiding? Which type wants to be born? | Make the boundary explicit in the type, a small domain type or one bundled type, so the control flow simplifies. |
60
+ | 9 | **Mysterious name** — a function, variable, or type whose name hides what it does or holds, or says something it no longer does | Could a reader predict the body from the name? | Rename it. If no honest name comes, the concept is murky: fix the design, not the name. |
61
+ | 10 | **File sprawl** — the diff pushes a file past a healthy size boundary (~1k lines) | Should this be decomposed *before* adding to it? | Split by concept first; waive only with a compelling structural reason. |
62
+ | 11 | **Needless sequencing / non-atomic update** — independent work serialized, related updates that can leave state half-applied | Is this actually dependent? Can it be observed half-done? | Parallelize independent work; group related updates. Not micro-optimization — brittleness. |
63
+ | 12 | **Short-horizon change** — "temporary", TODO-later, quick patch, deferred cleanup, a shape chosen because it is the smallest diff | What does this look like when its reason is gone? What does removing it cost? | Do the durable fix now, or structure the stopgap so removal is a pure deletion (one branch, one file), never a refactor of live callers. |
54
64
 
55
65
  Short-horizon change is the long-term rule and it applies to every other smell: prefer
56
66
  consolidating now over a third copy later; prefer the simplification that
@@ -88,9 +98,11 @@ Write the review in this shape:
88
98
 
89
99
  Working code is not the bar. `REQUEST CHANGES` when any of Duplicated
90
100
  concept, Complexity rearranged, Special case in a shared flow, Wrong layer,
91
- Indirection without clarity, Weak contract, or Short-horizon change is present
92
- and unjustified, or when a visible code-judo move was skipped. File sprawl and
93
- Needless sequencing block when the cleaner structure is obvious.
101
+ Change doesn't follow module lines, Indirection without clarity, Refused
102
+ inheritance, Weak contract, or Short-horizon change is present and
103
+ unjustified, when a documented repo rule is broken, or when a visible
104
+ code-judo move was skipped. Mysterious name, File sprawl and Needless
105
+ sequencing block when the cleaner structure is obvious.
94
106
 
95
107
  ## Author pushback
96
108
 
@@ -102,6 +114,9 @@ Needless sequencing block when the cleaner structure is obvious.
102
114
  | "The existing code already does it this way" | Existing mess licenses fixing the concept, not adding a copy of it. |
103
115
  | "A restructure is out of scope" | If the restructure deletes the complexity this change adds, it is the scope. |
104
116
 
117
+ The Fowler smell list is an idea from mattpocock/skills `code-review`; the
118
+ wording here is ours.
119
+
105
120
  ## Review Tone
106
121
 
107
122
  Be direct, serious, and demanding about quality.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Matt Pocock
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,55 @@
1
+ ---
2
+ name: implement-spec
3
+ description: "Implement a specification in code."
4
+ disable-model-invocation: true
5
+ ---
6
+
7
+ <!--
8
+ Modified copy of https://github.com/mattpocock/skills/tree/5b15a47f2d7150f545fbcacbfe381787fc0230dc/skills/in-progress/implement-spec
9
+ (in-progress, after mattpocock-skills v1.2.3). Copyright (c) 2026 Matt Pocock, MIT — see LICENSE.
10
+ Changes: a model tier per subagent; a context-isolated test-writer commits
11
+ locked acceptance tests at the ticket's Seam, the implementer turns them green
12
+ with /tdd and reports to a contract; per-ticket review before merge, fix loop
13
+ capped at 4 rounds with escalation; a ruling ledger and four stop conditions;
14
+ full suite after each merge; final /review-diff on the most capable model, one
15
+ fixer; closes tickets only if they are issues. Review loop and ledger adapt
16
+ superpowers' subagent-driven-development (obra/superpowers, MIT).
17
+ -->
18
+
19
+ You have been provided a spec. This spec should have tickets associated with it, describing how to implement the spec.
20
+
21
+ The goal is a PR which implements the entire spec on a single branch.
22
+
23
+ The tickets are not a list of steps. They are a **task graph** with blocking relationships between them. This means there is always a **frontier** of tickets which are ready to be grabbed.
24
+
25
+ Communication to and from subagents should be sparse. Communicate primarily through **context pointers**: to the spec, tickets, research notes, and previous commits. Don't duplicate information already available via pointers.
26
+
27
+ Run ticket subagents in the background where possible for **maximum concurrency**.
28
+
29
+ **Name the model on every dispatch.** Omitted, it inherits yours. Exploration, test-writer, reviewer: mid tier (reviewer higher for risky diffs). Implementer: mid tier; cheapest when the ticket carries the complete code; most capable for design judgment or broad codebase work. Merger: cheapest. Escalations: one tier above the agent that got stuck. Final reviewer: most capable.
30
+
31
+ **Rule, don't stall.** Keep a **ledger** file in the notes directory: every decision as `Ruling: <what> — <why> — <cost if wrong>`, and each ticket's state, so you can resume after compaction. Don't check in between tickets. Stop and ask only for: an irreversible or destructive operation, a security-sensitive action, a side effect outside the worktrees (a push to a shared branch, a publish), or a spec so broken that every path forward is a guess.
32
+
33
+ ## Steps
34
+
35
+ 1. Read the spec and tickets. Read enough to understand the task graph.
36
+
37
+ 2. Create a notes directory outside the repo, readable by all subagents, and start the ledger there. (optional) An **exploration subagent** saves its notes on relevant code and docs there, so implementers focus on implementation.
38
+
39
+ 3. Create a branch, and a draft PR. If the spec and tickets are issues, mark the PR as 'closing' them.
40
+
41
+ 4. Each ticket gets its own worktree and branch. For a ticket with behavioral criteria, a **test-writer subagent** goes first. It sees ONLY the spec, the ticket, CONTEXT.md/ADRs and the public interface of the ticket's **Seam** line (pointers, not summaries), never the implementer's plan or code. It writes one black-box acceptance test per criterion through that interface (defining the interface if it doesn't exist yet), confirms each fails for the right reason (missing behavior, not an import or syntax error), commits them red, and reports the SHA and files. Those files are now **locked**. A ticket with no behavioral criteria (Seam: `none — refactor`) skips this: its existing tests are the contract, unmodified.
42
+
43
+ 5. An **implementer subagent** starts from that commit and makes the locked tests green, using /tdd vertical slices for anything internal. It never edits locked files and never dispatches subagents. It reports: status (DONE, DONE_WITH_CONCERNS, NEEDS_CONTEXT or BLOCKED), commits, red→green evidence for locked tests and its own slices, files touched, concerns. If a locked test contradicts the spec or ticket, it reports BLOCKED with evidence; you rule, and either send the test-writer a correction or overrule the implementer. Handle any BLOCKED by changing something: more context, a stronger model, a split ticket, or a ruling. Never retry unchanged.
44
+
45
+ 6. On DONE, a **reviewer subagent** checks the diff against the ticket and spec, then for quality. It also checks that `git diff <test-writer-sha>..HEAD -- <locked files>` is empty and that every criterion has a locked test. Critical or Important findings start a fix loop of at most 4 rounds, each a fix plus a re-review scoped to that fix: rounds 1-2 resume the implementer; rounds 3-4 go to a fresh implementer one tier up. After round 4, rule on each open finding in the ledger and move on. Minor findings go to the ledger for the final review.
46
+
47
+ 7. Once a ticket passes review, a **merger subagent** merges it to the PR branch and runs the full test suite. If it fails, an implementer fixes the PR branch before the next merge.
48
+
49
+ 8. If this changes the **frontier** of available tickets, start the next tickets. This allows for maximum concurrency.
50
+
51
+ 9. Once all tickets are complete, a reviewer on the most capable model runs /review-diff on the PR branch, given the ledger's minor findings and rulings. One **implementer subagent** fixes every finding, then re-review that fix once. Rule on anything left.
52
+
53
+ 10. Mark the PR as ready for review. List every ruling from the ledger in your final message.
54
+
55
+ 11. Clean up all ticket worktrees.
@@ -0,0 +1,5 @@
1
+ interface:
2
+ display_name: "Implement Spec"
3
+ short_description: "Implement a whole spec as one PR"
4
+ policy:
5
+ allow_implicit_invocation: false
@@ -0,0 +1,122 @@
1
+ ---
2
+ name: review-diff
3
+ description: >-
4
+ Review a branch before merge: first a gate (the repo's check command plus
5
+ crap-gate), then three independent reviewers in parallel — spec (did we build
6
+ what was asked, no more, no less), correctness via Codex (races, idempotency,
7
+ money, time, authz, indexes, N+1, migrations, error paths, test quality) and
8
+ structure (deep-quality-review). `--quick` runs only spec and correctness,
9
+ shortened, for a live interview. Use when the user says "/review-diff",
10
+ "review this branch", "review this slice", "review before merge", or before
11
+ closing out a spec task.
12
+ ---
13
+
14
+ # /review-diff
15
+
16
+ One gate, then three reviewers that never see each other's output. Each
17
+ answers one question; their reports stay separate, because a strong answer
18
+ on one axis must not hide a failure on another.
19
+
20
+ | Reviewer | Question | Runs as |
21
+ |---|---|---|
22
+ | Spec | Did we build what the spec asked, no more, no less? | subagent, `spec.md` |
23
+ | Correctness | Can this lose money or corrupt data? | `codex exec`, `correctness.md` |
24
+ | Structure | Is the code getting messier? | subagent, `deep-quality-review` |
25
+
26
+ `spec.md` and `correctness.md` sit next to this file (`<skill-dir>`).
27
+
28
+ ## Arguments
29
+
30
+ - A range (`A..B`) or a base ref. Default: the merge-base with the repo's
31
+ default branch (`origin/main`, else `main`). Review `git diff <base>...HEAD`.
32
+ - A spec path, optional.
33
+ - `--quick`: interview mode. Gate, then spec + correctness only; each report
34
+ keeps its top 3 findings in under 150 words. Default: all three, full
35
+ reports.
36
+
37
+ Before anything else, confirm the range resolves and the diff is non-empty. A
38
+ bad ref fails here, not inside three reviewers.
39
+
40
+ ## Step 0 — gate (sequential, a precondition, not a reviewer)
41
+
42
+ 1. Run the repo's check command: `make check` if the Makefile has it,
43
+ otherwise the one AGENTS.md / CONTRIBUTING.md / package.json documents. None
44
+ documented → say so and continue.
45
+ 2. Run crap-gate if the repo has `.crap-gate.json`: prefer its wrapper
46
+ (`make crap-gate` / `make crap`), else `sh <crap-gate-dir>/run.sh`, where
47
+ the dir is the first of `.my-skills/crap-gate`, `.agents/skills/crap-gate`,
48
+ `.claude/skills/crap-gate`, `~/.my-skills/crap-gate` that exists. No
49
+ config → "crap-gate: not configured, skipped". Config but skill missing →
50
+ "crap-gate: skill not installed, skipped".
51
+
52
+ Either red → **stop**. Report the failing command and the first failures, and
53
+ no review: reviewing red code wastes the reviewers, and "is there a test for
54
+ this scenario" means nothing while tests fail.
55
+
56
+ ## Steps 1–3 — reviewers, in parallel
57
+
58
+ Launch all of them in one go; don't let one wait for another. Give each only
59
+ the range, the commit list (`git log --oneline <range>`) and its brief. Never
60
+ paste one reviewer's output into another's prompt.
61
+
62
+ - **Spec.** Find the spec: the path argument, then a spec under `specs/`
63
+ matching the branch or feature (skip templates), then issue refs in the
64
+ commits (`#123`, fetched with `gh issue view`). None → skip: "Spec: no spec
65
+ found, skipped". Otherwise spawn a subagent: "Read and follow
66
+ `<skill-dir>/spec.md`. Range: <range>. Commits: <list>. Spec: <path or fetched text>."
67
+ - **Correctness.** If `codex` is on PATH, run it (in the background while
68
+ the others run):
69
+
70
+ ```bash
71
+ out=$(mktemp) && codex exec -s read-only --ephemeral -o "$out" \
72
+ "Read and follow <skill-dir>/correctness.md. Range: <range>. Commits: <list>.<quick>" \
73
+ >/dev/null 2>&1; cat "$out"
74
+ ```
75
+
76
+ No Codex → spawn a subagent with the same instruction and note "Correctness:
77
+ Codex unavailable, ran on <current model>". The second model is the point;
78
+ never drop the note.
79
+ - **Structure** (skipped in `--quick`). Spawn a subagent: "Use the
80
+ `deep-quality-review` skill on range <range>." Skill not installed → skip:
81
+ "Structure: deep-quality-review not installed, skipped".
82
+
83
+ In `--quick`, append to each brief: "Quick mode: top 3 findings, under 150
84
+ words." No subagents in this harness → run them one after another, each in a
85
+ fresh context if you can, and say so.
86
+
87
+ ## Output
88
+
89
+ ```
90
+ Gate: `make check` green · crap-gate green
91
+
92
+ ## Spec
93
+ <report, verbatim or lightly cleaned>
94
+
95
+ ## Correctness (Codex)
96
+ <report>
97
+
98
+ ## Structure
99
+ <report>
100
+
101
+ Spec: 3 findings — worst: <one line>
102
+ Correctness: 1 finding — worst: <one line>
103
+ Structure: REQUEST CHANGES, 2 findings — worst: <one line>
104
+ ```
105
+
106
+ A skipped step keeps its place with its one-line note (in the gate line, or
107
+ as the section body and summary line). `--quick` has no Structure section and
108
+ no Structure summary line. A clean reviewer's summary line is `0 findings`.
109
+
110
+ Do not merge, dedupe or re-rank findings across reviewers, and do not pick an
111
+ overall winner. A finding two reviewers both raise stays in both reports; that
112
+ is signal.
113
+
114
+ ## Dependencies
115
+
116
+ Needs the `deep-quality-review` and `crap-gate` skills (install them with the
117
+ skills CLI next to this one) and, for the second model, the `codex` CLI. Any
118
+ of them missing skips that step with a one-line note; it never fails the
119
+ review.
120
+
121
+ The spec axis is an idea from mattpocock/skills `code-review`; the wording
122
+ here is ours.
@@ -0,0 +1,29 @@
1
+ # Correctness reviewer
2
+
3
+ You check one thing: **can this diff lose money, corrupt data, or let the
4
+ wrong person act?** Not style, not structure, not spec coverage. Assume lint,
5
+ types and tests already pass.
6
+
7
+ Read `git diff <range>` in full, then only the surrounding code a check needs
8
+ (the model behind a query, the existing indexes, the caller of a handler).
9
+
10
+ | Check | Flag |
11
+ |---|---|
12
+ | Concurrency | Read-then-write without a lock, conditional `UPDATE … WHERE`, or DB constraint: overselling, double-spend, lost updates. Transactions that commit half the work. |
13
+ | Idempotency | Webhooks, payment callbacks, retries and queue consumers that do the work twice when the same message arrives twice. |
14
+ | Money | Floats for amounts (use integer cents or decimal), rounding in more than one place, currency dropped. |
15
+ | Time | Naive datetimes, local time stored, "today" computed without the business timezone. Store UTC. |
16
+ | Authorization | A check done only in the client, or missing on the server: can user A read or change user B's rows by changing an id? |
17
+ | Foreign keys | A new FK column that is filtered or joined on without an index. |
18
+ | N+1 | One query per loop iteration where a join or `IN (…)` would do. |
19
+ | Migrations | Not reversible, or unsafe on a live table (a NOT NULL column without a default, a rewrite under lock). |
20
+ | Failure paths | A payment-provider, checkout or stock-decrement call whose failure (timeout, decline, provider error) is unhandled or silently swallowed. |
21
+ | Test quality | Tautological tests (asserting a mock's return value, or a value the test just set with no code in between) and tests on internals instead of the public seam. Say what they should assert. |
22
+
23
+ Every finding: `file:line`, the concrete failure scenario (inputs or
24
+ interleaving → wrong result), and the fix. "Consider reviewing" is not a
25
+ finding. Report only what you can point at; mark anything unconfirmed
26
+ "(unverified)".
27
+
28
+ Output: findings, worst first, then one line naming the checks with nothing
29
+ to report ("Clean: money, time, …"). Under 400 words.
@@ -0,0 +1,24 @@
1
+ # Spec reviewer
2
+
3
+ You check one thing: **did this diff build what the spec asked, no more, no
4
+ less?** Not style, not structure, not bugs outside the spec.
5
+
6
+ 1. Read the spec in full, then `git diff <range>` in full (not a summary),
7
+ then the tests the diff adds or touches.
8
+ 2. Walk the spec requirement by requirement and report:
9
+ - **Missing / partial**: asked for, not built or only half built.
10
+ - **Scope creep**: built, not asked for (endpoints, flags, fields, UI,
11
+ options). Say what to delete.
12
+ - **Built wrong**: looks implemented, but behaves differently from the
13
+ spec line.
14
+ - **Untested scenario**: each Given/When/Then scenario with no test that
15
+ exercises it through the public seam (the API, the UI, the use case), not
16
+ through an internal helper. A test that only passes because a layer
17
+ above the one the scenario names stops the input (e.g. API validation
18
+ hiding an untested DB constraint) does not count.
19
+ 3. Every finding quotes the spec line it rests on, then `file:line` and the
20
+ concrete fix. No spec line → not a finding.
21
+
22
+ Output: findings grouped under those four headings. Leave out empty groups
23
+ and end with one line naming them ("Clean: scope creep, built wrong"). Don't
24
+ list what was fine. Under 400 words.
@@ -8,7 +8,8 @@ Modified copy of https://github.com/mattpocock/skills/tree/3cca18b368ae95cdbdebb
8
8
  (mattpocock-skills v1.2.3). Copyright (c) 2026 Matt Pocock, MIT — see LICENSE.
9
9
  Changes: tickets always go to `.agent/tickets/<NN>-<slug>.md` (no tracker path);
10
10
  numbering is contiguous from 01 in dependency order; acceptance criteria must state
11
- observable behavior; the approval quiz is skipped when unattended; model
11
+ observable behavior; every ticket names its **Seam** (the public interface its
12
+ acceptance tests hit); the approval quiz is skipped when unattended; model
12
13
  invocation is allowed.
13
14
  -->
14
15
 
@@ -51,6 +52,7 @@ When a human is in the loop, present the proposed breakdown as a numbered list.
51
52
 
52
53
  - **Title**: short descriptive name
53
54
  - **Blocked by**: which other tickets (if any) must complete first
55
+ - **Seam**: the public interface its acceptance tests hit
54
56
  - **What it delivers**: the end-to-end behaviour this ticket makes work
55
57
 
56
58
  Ask the user:
@@ -81,6 +83,8 @@ Do NOT close or modify any parent issue.
81
83
 
82
84
  **Blocked by:** the numbers/titles of the tickets that gate this one, or "None (can start immediately)".
83
85
 
86
+ **Seam:** the public interface the acceptance tests hit (a function, an HTTP route, a CLI command, a config loader…), or `none — refactor`.
87
+
84
88
  - [ ] Acceptance criterion 1
85
89
  - [ ] Acceptance criterion 2
86
90
 
@@ -92,4 +96,10 @@ Every acceptance criterion states **observable behavior**: something a reviewer
92
96
 
93
97
  </acceptance-criteria-rule>
94
98
 
99
+ <seam-rule>
100
+
101
+ Every ticket carries a **Seam** line: the one public interface through which its acceptance criteria are tested, black-box. `implement-spec` hands it to a test-writer that sees nothing else of the code, so name it precisely enough to write a test against, and never an internal helper. A ticket with no behavioral criteria (a pure prefactor or refactor) says `none — refactor`: its existing tests are the contract.
102
+
103
+ </seam-rule>
104
+
95
105
  Avoid specific file paths or code snippets: they go stale fast. Exception: if a prototype produced a snippet that encodes a decision more precisely than prose can (state machine, reducer, schema, type shape), inline it and note briefly that it came from a prototype. Trim to the decision-rich parts, not a working demo, just the important bits.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "generatedAt": "2026-09-13T13:58:48.949Z",
3
+ "generatedAt": "2026-09-24T09:06:27.178Z",
4
4
  "skills": [
5
5
  {
6
6
  "name": "backlog",
@@ -28,8 +28,8 @@
28
28
  },
29
29
  {
30
30
  "name": "deep-quality-review",
31
- "version": "0.1.1",
32
- "hash": "sha256-da5ce29dc5349bcbed74589f3475fa12907ae7eed385e4ecc680bf67edae7e43",
31
+ "version": "0.1.2",
32
+ "hash": "sha256-134c1a194e9ec53f244e6500e68cf963b384759d8b5f5c934784665b6ef4b8f6",
33
33
  "description": "Extremely strict maintainability review of a branch's changes: duplicated concepts, complexity that got rearranged instead of deleted, spaghetti branching, boundary leaks, weak type contracts, file sprawl, and \"temporary\" fixes that will outlive their reason. Use when the user asks for a \"deep code quality review\", \"thermonuclear review\", \"harsh maintainability review\", \"code judo\", \"is this making the codebase messier\", or before merging a change that touches shared code. Not a correctness, security, or test-coverage review."
34
34
  },
35
35
  {
@@ -44,6 +44,12 @@
44
44
  "hash": "sha256-916ea397cd74d91c4b6060672088b9c54353c915b98bcaef3514815694842e5a",
45
45
  "description": "Minimal example skill proving the distribution pipeline works. Responds to \"test my skills setup\" by confirming the skill is loaded."
46
46
  },
47
+ {
48
+ "name": "implement-spec",
49
+ "version": "0.1.0",
50
+ "hash": "sha256-95c4889bd41cbb8eb6522cbea5b074779b0964e521e6decbe801d52734921ecb",
51
+ "description": "Implement a specification in code."
52
+ },
47
53
  {
48
54
  "name": "pr-visual-diff",
49
55
  "version": "0.1.0",
@@ -56,6 +62,12 @@
56
62
  "hash": "sha256-211e0e116ff6efbc4589ea7264835855b9495ba535f242733af913903fe7707d",
57
63
  "description": "Build a throwaway prototype to answer a design question, delivered as one self-contained HTML file. Use when the user wants to sanity-check whether a state model or logic feels right, or explore what a UI should look like."
58
64
  },
65
+ {
66
+ "name": "review-diff",
67
+ "version": "0.1.0",
68
+ "hash": "sha256-f1efdffdad0abf536777a3afcc733b2612ed51abad0b1a04d24f280bf2f223d3",
69
+ "description": "Review a branch before merge: first a gate (the repo's check command plus crap-gate), then three independent reviewers in parallel — spec (did we build what was asked, no more, no less), correctness via Codex (races, idempotency, money, time, authz, indexes, N+1, migrations, error paths, test quality) and structure (deep-quality-review). `--quick` runs only spec and correctness, shortened, for a live interview. Use when the user says \"/review-diff\", \"review this branch\", \"review this slice\", \"review before merge\", or before closing out a spec task."
70
+ },
59
71
  {
60
72
  "name": "to-spec",
61
73
  "version": "0.1.0",
@@ -64,8 +76,8 @@
64
76
  },
65
77
  {
66
78
  "name": "to-tickets",
67
- "version": "0.1.0",
68
- "hash": "sha256-23e1381b40dd4ffa151a2f89dcb82462464ea424228b45a31e6656406d34fedc",
79
+ "version": "0.1.1",
80
+ "hash": "sha256-4c838fa240c742353f77b3a3c1246a0948140587e81c9bc587f84c648e552bba",
69
81
  "description": "Break a spec, plan, or the current conversation into numbered tracer-bullet ticket files under .agent/tickets/, each declaring its blocking edges and acceptance criteria phrased as observable behavior. Use after a spec is approved and before implementation starts."
70
82
  },
71
83
  {