@olegkoval/agent-skills 1.45.0 → 1.45.1
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/adapters/claude/olko-github-pr/skills/lekker-review/references/revmux/lenses/lekker-conventions.md +20 -20
- package/adapters/claude/olko-github-pr/skills/lekker-review/references/revmux/lenses/lekker-implementation.md +12 -12
- package/adapters/claude/olko-github-pr/skills/lekker-review/references/revmux/lenses/lekker-quality.md +7 -7
- package/adapters/claude/olko-github-pr/skills/lekker-review/references/revmux/lenses/lekker-simplification.md +9 -9
- package/adapters/claude/olko-github-pr/skills/lekker-review/references/revmux/lenses/lekker-test-quality.md +18 -18
- package/adapters/claude/olko-github-pr/skills/lekker-review/references/revmux/phase4-comparison.md +0 -2
- package/adapters/claude/olko-github-pr/skills/lekker-review/references/revmux/profile.md +41 -41
- package/adapters/claude/olko-github-pr/skills/lekker-review/scripts/fixtures/house-rules.md +5 -5
- package/adapters/claude/olko-github-pr/skills/lekker-review/scripts/fixtures/revmux-report.json +1 -1
- package/adapters/claude/olko-github-pr/skills/lekker-review/scripts/revmux-engine.sh +1 -0
- package/package.json +1 -1
- package/plugins/olko-apple-kit/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-creative/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-garmin-kit/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-git-tools/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-github-pr/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-github-pr/skills/lekker-review/references/revmux/lenses/lekker-conventions.md +20 -20
- package/plugins/olko-github-pr/skills/lekker-review/references/revmux/lenses/lekker-implementation.md +12 -12
- package/plugins/olko-github-pr/skills/lekker-review/references/revmux/lenses/lekker-quality.md +7 -7
- package/plugins/olko-github-pr/skills/lekker-review/references/revmux/lenses/lekker-simplification.md +9 -9
- package/plugins/olko-github-pr/skills/lekker-review/references/revmux/lenses/lekker-test-quality.md +18 -18
- package/plugins/olko-github-pr/skills/lekker-review/references/revmux/phase4-comparison.md +0 -2
- package/plugins/olko-github-pr/skills/lekker-review/references/revmux/profile.md +41 -41
- package/plugins/olko-github-pr/skills/lekker-review/scripts/fixtures/house-rules.md +5 -5
- package/plugins/olko-github-pr/skills/lekker-review/scripts/fixtures/revmux-report.json +1 -1
- package/plugins/olko-github-pr/skills/lekker-review/scripts/revmux-engine.sh +1 -0
- package/plugins/olko-obsidian/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-product/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-reflection/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-release/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-skill-meta/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-web-ops/.claude-plugin/plugin.json +1 -1
|
@@ -1,43 +1,43 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: deviations from Teifi's own codebase conventions
|
|
2
|
+
description: deviations from Teifi's own codebase conventions - the "strong teammate" non-blocking lens
|
|
3
3
|
---
|
|
4
4
|
## Lens: lekker-conventions
|
|
5
5
|
|
|
6
6
|
Review the change for deviations from Teifi's established codebase
|
|
7
7
|
conventions and idioms. This is the "strong teammate" lens: the suggestions a
|
|
8
|
-
senior Teifi engineer leaves
|
|
8
|
+
senior Teifi engineer leaves - non-blocking, but they make the code match how
|
|
9
9
|
the rest of the codebase is written. Look beyond the diff only for
|
|
10
10
|
convention-specific precedent and reuse searches. Other lenses may inspect the
|
|
11
11
|
runtime context they need for their own cross-file checks.
|
|
12
12
|
|
|
13
|
-
Read `{{PROFILE}}` now, before forming any opinion
|
|
13
|
+
Read `{{PROFILE}}` now, before forming any opinion - it carries the Teifi
|
|
14
14
|
conventions text. Its §1 (naming matrix), §2 (comment policy), §5 (commit
|
|
15
|
-
hygiene) and §6 (generated code) are yours
|
|
15
|
+
hygiene) and §6 (generated code) are yours - they are the house style, so a
|
|
16
16
|
deviation needs NO codebase precedent beyond that file (the file IS the
|
|
17
17
|
precedent; cite the section, e.g. "teifi-conventions §1 verbs").
|
|
18
18
|
Everything else in this lens still requires a cited precedent from the code.
|
|
19
19
|
|
|
20
20
|
Axes to cover:
|
|
21
21
|
- Naming (teifi-conventions §1): every symbol the diff INTRODUCES against the
|
|
22
|
-
matrix
|
|
22
|
+
matrix - boolean without `is`/`has`, async I/O named `get`, a row lock or a
|
|
23
23
|
throw-on-miss or a cache read absent from the name (`…ForUpdate`,
|
|
24
24
|
`…OrThrow`, `…Cached`), a collidable component without its domain prefix, a
|
|
25
25
|
bare generic noun (`line`, `node`, `row`) where the domain has two variants in
|
|
26
26
|
scope. NEVER flag a boundary name (DB column, GraphQL/oRPC field, enum value,
|
|
27
|
-
route string, wire key)
|
|
27
|
+
route string, wire key) - renaming it breaks callers outside the diff.
|
|
28
28
|
- Comments (teifi-conventions §2): one finding per over-commenting offender the
|
|
29
29
|
diff ADDED, with the deletion as the fix. Never a vague "too many comments",
|
|
30
30
|
never a pre-existing comment, never a lint/type pragma or a genuine
|
|
31
31
|
non-obvious "why".
|
|
32
32
|
- Generated code (teifi-conventions §6): a changed `.sql` / `.graphql` /
|
|
33
33
|
`.json` schema / `prisma/schema.prisma` whose generated artifact is absent
|
|
34
|
-
from the diff (or the reverse)
|
|
34
|
+
from the diff (or the reverse) - major. Raise NO naming, comment, or
|
|
35
35
|
complexity finding inside a `generated/` directory. A hand-rolled `fetch` to
|
|
36
|
-
the Shopify Admin GraphQL endpoint instead of the genql client
|
|
36
|
+
the Shopify Admin GraphQL endpoint instead of the genql client - major.
|
|
37
37
|
- Commits (teifi-conventions §5): non-conventional or vague commit subjects, and
|
|
38
38
|
any Claude Code / assistant mention in the commit or PR text.
|
|
39
39
|
- Type-system idioms:
|
|
40
|
-
* A hand-written interface/type that duplicates an existing Zod schema
|
|
40
|
+
* A hand-written interface/type that duplicates an existing Zod schema -
|
|
41
41
|
should be `z.infer<typeof zSchema>` so the schema stays the single source
|
|
42
42
|
of truth. (Grep for a matching z-schema in the same feature folder.)
|
|
43
43
|
* Raw `string` used for a Shopify GID or an entity id where a branded
|
|
@@ -50,12 +50,12 @@ Axes to cover:
|
|
|
50
50
|
* A GID validated/parsed inline where a shared helper exists (e.g.
|
|
51
51
|
`zNamespacedGid`). Grep the shared libs and the repo before asserting.
|
|
52
52
|
- Reuse (search the worktree AND sibling Teifi repos before flagging):
|
|
53
|
-
* Inline fetch/client logic that should reuse
|
|
53
|
+
* Inline fetch/client logic that should reuse - or be promoted into - a
|
|
54
54
|
shared client (e.g. a company-switcher client) that already exists or that
|
|
55
55
|
the codebase clearly wants.
|
|
56
56
|
* A util/helper that already exists elsewhere being re-implemented inline.
|
|
57
57
|
* A symbol defined locally that is (or should be) exported from a shared
|
|
58
|
-
module
|
|
58
|
+
module - "are we not exporting this somewhere?"
|
|
59
59
|
- Consistency:
|
|
60
60
|
* Cache-key / composite-key separators that disagree with the repo's
|
|
61
61
|
prevailing choice (e.g. `:` vs `::`). Grep existing key-building code to
|
|
@@ -64,10 +64,10 @@ Axes to cover:
|
|
|
64
64
|
HttpError('...', 403)` instead of a bare string / generic Error).
|
|
65
65
|
* Naming/casing that breaks the convention used by sibling files.
|
|
66
66
|
|
|
67
|
-
MANDATORY SWEEP
|
|
67
|
+
MANDATORY SWEEP - do this FIRST, before forming any opinion:
|
|
68
68
|
|
|
69
69
|
The axes above are symptom-driven: they only fire once you already suspect a
|
|
70
|
-
duplication. That is how a re-implemented helper slips through
|
|
70
|
+
duplication. That is how a re-implemented helper slips through - nobody thinks to
|
|
71
71
|
look. So run these enumerations mechanically, whether or not anything looks wrong.
|
|
72
72
|
|
|
73
73
|
1. **Sibling sweep for every file the diff ADDS.** For each added file, list its
|
|
@@ -119,12 +119,12 @@ HARD RULES:
|
|
|
119
119
|
- Only raise a finding when the better pattern PROVABLY ALREADY EXISTS. Cite it:
|
|
120
120
|
the file:line where the helper/type/convention lives, or the sibling file that
|
|
121
121
|
does it the idiomatic way. If you cannot find a concrete precedent, DROP the
|
|
122
|
-
finding
|
|
122
|
+
finding - "this would be nicer as X" on taste alone is not allowed.
|
|
123
123
|
- Every finding must still trace to a `+` line in the diff (the deviation must
|
|
124
124
|
be code this change added/changed). The supporting precedent may live outside the
|
|
125
125
|
diff; the deviation may not.
|
|
126
126
|
- These are suggestions, not blockers. Do not inflate severity. Report each as
|
|
127
|
-
`file:line
|
|
127
|
+
`file:line - <deviation> (precedent: <file:line of the existing pattern>)`.
|
|
128
128
|
- ONE EXCEPTION to non-blocking: if the re-implementation DIVERGES in behaviour
|
|
129
129
|
from the helper it duplicates, that is not a style nit, it is two spellings of
|
|
130
130
|
the same value that disagree, and it belongs on lekker-quality's severity
|
|
@@ -145,14 +145,14 @@ omits it silently reports "no precedent exists" for whole directories.
|
|
|
145
145
|
|
|
146
146
|
A mined record of what other bots (Greptile / Gemini / CodeRabbit) have
|
|
147
147
|
commented on in this repo may be present under `{{CONTEXT}}`. Use it as a prior,
|
|
148
|
-
not as a checklist: a high count means "frequently raised here", not "correct"
|
|
148
|
+
not as a checklist: a high count means "frequently raised here", not "correct" -
|
|
149
149
|
never raise a finding because a bot once said it, only because it is true here.
|
|
150
150
|
|
|
151
151
|
Rules:
|
|
152
|
-
- Report file:line
|
|
152
|
+
- Report file:line - description with a precedent citation. No positive
|
|
153
153
|
observations. No taste-only suggestions.
|
|
154
|
-
- Quote the verbatim offending line(s)
|
|
155
|
-
from memory
|
|
154
|
+
- Quote the verbatim offending line(s) - never paraphrased, never reconstructed
|
|
155
|
+
from memory - and give a concrete drop-in fix, or when the fix is
|
|
156
156
|
architectural, a minimal skeleton plus one sentence on what else must change.
|
|
157
|
-
- A finding you cannot quote and cannot fix is a finding you have not proven
|
|
157
|
+
- A finding you cannot quote and cannot fix is a finding you have not proven -
|
|
158
158
|
drop it instead.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: correctness, scalability and integration issues
|
|
2
|
+
description: correctness, scalability and integration issues - Teifi's GQL-1 hard rule included
|
|
3
3
|
---
|
|
4
4
|
## Lens: lekker-implementation
|
|
5
5
|
|
|
@@ -35,12 +35,12 @@ Axes to cover:
|
|
|
35
35
|
idempotency, external API pagination not handled.
|
|
36
36
|
- GraphQL pagination (GQL-1): for every GraphQL query in the diff that uses a
|
|
37
37
|
nodes connection (`nodes { ... }`):
|
|
38
|
-
(a) Check that `pageInfo { hasNextPage endCursor }` is present alongside nodes
|
|
39
|
-
(b) Check that all pages are fetched (a loop or recursion using endCursor)
|
|
38
|
+
(a) Check that `pageInfo { hasNextPage endCursor }` is present alongside nodes - if missing, critical.
|
|
39
|
+
(b) Check that all pages are fetched (a loop or recursion using endCursor) - a single-page fetch is a bug, critical.
|
|
40
40
|
(c) Check the page size: must be 250 (Shopify max). If any other size is used without a code comment explaining why, flag as major.
|
|
41
41
|
Title any critical finding under this axis `[GQL-1] ...`.
|
|
42
42
|
- Feature-flag rollout (Reflag repos ONLY): first check the repo actually uses
|
|
43
|
-
Reflag
|
|
43
|
+
Reflag - a `package.json` (any depth, excluding node_modules) depending on
|
|
44
44
|
`@reflag/node-sdk` or `@teifi-digital/reflag-client`. If it does not, SKIP this
|
|
45
45
|
axis entirely and raise nothing; a repo with no flag client cannot act on the
|
|
46
46
|
finding. Where it does apply, ask whether the change should ship behind a flag:
|
|
@@ -51,26 +51,26 @@ Axes to cover:
|
|
|
51
51
|
correct, internal/admin-only surfaces, or work fully covered by tests and
|
|
52
52
|
verifiable in staging. Tie-breaker: if you would not be comfortable fixing it
|
|
53
53
|
forward at 2am, it needs a flag. Name which of (a)-(d) applies.
|
|
54
|
-
Severity: major at most, usually minor
|
|
54
|
+
Severity: major at most, usually minor - this is a rollout judgement call, not
|
|
55
55
|
a defect. NEVER title this with a bracketed hard-rule tag (that would force
|
|
56
56
|
critical and imply a policy violation). Never invent a concrete flag key as
|
|
57
57
|
though it exists: flag keys must be confirmed against Reflag, so say a flag is
|
|
58
58
|
needed without naming one.
|
|
59
59
|
Also raise as a structural concern (severity major) when a diff BOTH adds a
|
|
60
|
-
column/table AND changes what is read or written
|
|
60
|
+
column/table AND changes what is read or written - the SOP requires splitting
|
|
61
61
|
that into expand / migrate / read-switch / contract PRs. Name the split.
|
|
62
62
|
|
|
63
|
-
GQL-1's full rule text lives in `{{PROFILE}}`
|
|
63
|
+
GQL-1's full rule text lives in `{{PROFILE}}` - read it there before applying it.
|
|
64
64
|
|
|
65
65
|
Rules:
|
|
66
66
|
- Every finding must trace to a `+` line in the diff, with one exception: an
|
|
67
67
|
unmet AC whose defect lives in code the diff did not touch. Anchor that one to
|
|
68
68
|
the unchanged file:line that had to change, and say in the description why the
|
|
69
|
-
unchanged line is the defect. That line may be an unchanged one
|
|
69
|
+
unchanged line is the defect. That line may be an unchanged one - do not drop
|
|
70
70
|
an unmet AC for lack of a quotable added line.
|
|
71
|
-
- Report file:line
|
|
72
|
-
- Quote the verbatim offending line(s)
|
|
73
|
-
from memory
|
|
71
|
+
- Report file:line - description. No positive observations.
|
|
72
|
+
- Quote the verbatim offending line(s) - never paraphrased, never reconstructed
|
|
73
|
+
from memory - and give a concrete drop-in fix, or when the fix is
|
|
74
74
|
architectural, a minimal skeleton plus one sentence on what else must change.
|
|
75
|
-
- A finding you cannot quote and cannot fix is a finding you have not proven
|
|
75
|
+
- A finding you cannot quote and cannot fix is a finding you have not proven -
|
|
76
76
|
drop it instead.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: quality, security and data-integrity issues
|
|
2
|
+
description: quality, security and data-integrity issues - Teifi's TS-1/TS-2 hard rules included
|
|
3
3
|
---
|
|
4
4
|
## Lens: lekker-quality
|
|
5
5
|
|
|
@@ -50,7 +50,7 @@ Axes to cover:
|
|
|
50
50
|
cast, explain the correct type, show the fix. Ask if they're Harry Potter.
|
|
51
51
|
Title the finding `[TS-1] ...`.
|
|
52
52
|
- No JavaScript files (TS-2): if the diff adds any `.js` file to a non-Liquid
|
|
53
|
-
theme repo, flag as critical
|
|
53
|
+
theme repo, flag as critical - must be `.ts`. Title the finding `[TS-2] ...`.
|
|
54
54
|
- Dependency changes. Skip this axis entirely unless the diff touches
|
|
55
55
|
`package.json`, a lockfile, or a vendored dependency. Where it applies:
|
|
56
56
|
(a) A version bump is a behaviour change nobody in this PR wrote. If neither
|
|
@@ -73,15 +73,15 @@ TS-1 and TS-2 are Teifi hard rules: their text is defined in full in `{{PROFILE}
|
|
|
73
73
|
title start with the bracketed tag, e.g. `[TS-1] ...` or `[TS-2] ...`, so the
|
|
74
74
|
caller can recognize it as a policy violation rather than an ordinary finding.
|
|
75
75
|
|
|
76
|
-
CI status, Sentry signals, and existing reviews may be present in `{{CONTEXT}}`
|
|
76
|
+
CI status, Sentry signals, and existing reviews may be present in `{{CONTEXT}}` -
|
|
77
77
|
read what is there before forming an opinion, and skip anything that is absent
|
|
78
78
|
rather than treating its absence as a finding.
|
|
79
79
|
|
|
80
80
|
Rules:
|
|
81
81
|
- Every finding must trace to a `+` line in the diff.
|
|
82
|
-
- Report file:line
|
|
83
|
-
- Quote the verbatim offending line(s) from the diff
|
|
84
|
-
reconstructed from memory
|
|
82
|
+
- Report file:line - description. No positive observations.
|
|
83
|
+
- Quote the verbatim offending line(s) from the diff - never paraphrased, never
|
|
84
|
+
reconstructed from memory - and give a concrete drop-in fix, or when the fix
|
|
85
85
|
is architectural, a minimal skeleton plus one sentence on what else must change.
|
|
86
|
-
- A finding you cannot quote and cannot fix is a finding you have not proven
|
|
86
|
+
- A finding you cannot quote and cannot fix is a finding you have not proven -
|
|
87
87
|
drop it instead of reporting it as a minor observation with no evidence.
|
|
@@ -6,17 +6,17 @@ description: over-engineering and DRY violations, plus Teifi's debug-artifact hy
|
|
|
6
6
|
Review the change for over-engineering and DRY violations.
|
|
7
7
|
|
|
8
8
|
Look for:
|
|
9
|
-
- Copy-paste logic: identical blocks that differ only in a constant
|
|
9
|
+
- Copy-paste logic: identical blocks that differ only in a constant - flag
|
|
10
10
|
for extraction.
|
|
11
|
-
- Parallel implementations: two functions doing the same thing
|
|
11
|
+
- Parallel implementations: two functions doing the same thing - one should
|
|
12
12
|
call the other.
|
|
13
13
|
- Unnecessary abstraction inversion: private helper called exactly once, adds
|
|
14
|
-
no reuse
|
|
14
|
+
no reuse - should be inlined.
|
|
15
15
|
- Over-engineered control flow: nested ternaries / promise chains that could
|
|
16
16
|
be plain if/else or async/await.
|
|
17
17
|
- Config spread: same magic constant defined in multiple files.
|
|
18
18
|
- Debug artifacts and hygiene: apply the fixed severity table in §3 of
|
|
19
|
-
`{{PROFILE}}` (the Teifi conventions section)
|
|
19
|
+
`{{PROFILE}}` (the Teifi conventions section) - `debugger` and
|
|
20
20
|
`.only`/`fit`/`fdescribe` are critical, an added `console.log`/`console.debug`
|
|
21
21
|
in production code and a hardcoded URL are major, an unreferenced
|
|
22
22
|
TODO/FIXME and a >3-line commented-out block are minor. Those severities
|
|
@@ -42,7 +42,7 @@ Look for:
|
|
|
42
42
|
Minor, or major when the dead path is still reachable from production code.
|
|
43
43
|
|
|
44
44
|
Only flag where duplication or complexity creates a real maintenance risk or
|
|
45
|
-
bug surface
|
|
45
|
+
bug surface - not aesthetic preference.
|
|
46
46
|
|
|
47
47
|
When you flag a structural problem, name the move, not just the smell: replace a
|
|
48
48
|
chain of conditionals with a typed model or an explicit dispatcher, collapse
|
|
@@ -55,9 +55,9 @@ actionable: name the move or drop the finding.
|
|
|
55
55
|
|
|
56
56
|
Rules:
|
|
57
57
|
- Every finding must trace to a `+` line in the diff.
|
|
58
|
-
- Report file:line
|
|
59
|
-
- Quote the verbatim offending line(s)
|
|
60
|
-
from memory
|
|
58
|
+
- Report file:line - description. No positive observations.
|
|
59
|
+
- Quote the verbatim offending line(s) - never paraphrased, never reconstructed
|
|
60
|
+
from memory - and give a concrete drop-in fix, or when the fix is
|
|
61
61
|
architectural, a minimal skeleton plus one sentence on what else must change.
|
|
62
|
-
- A finding you cannot quote and cannot fix is a finding you have not proven
|
|
62
|
+
- A finding you cannot quote and cannot fix is a finding you have not proven -
|
|
63
63
|
drop it instead.
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: whether tests actually catch bugs
|
|
2
|
+
description: whether tests actually catch bugs - mutation-slip analysis, mock smell, Teifi test conventions
|
|
3
3
|
---
|
|
4
4
|
## Lens: lekker-test-quality
|
|
5
5
|
|
|
6
6
|
Review the change with a strict focus on test quality. This is NOT about
|
|
7
|
-
coverage numbers
|
|
7
|
+
coverage numbers - it is about whether the tests actually catch bugs.
|
|
8
8
|
|
|
9
|
-
Step 1
|
|
9
|
+
Step 1 - Inventory the tests. Read the diff at `{{SCOPE}}`. List every test
|
|
10
10
|
file/spec added or modified. If no test files are in the diff, note that and
|
|
11
11
|
continue to axis (f) below.
|
|
12
12
|
|
|
13
|
-
Step 2
|
|
13
|
+
Step 2 - For each changed test file, read the full file from `{{WORKDIR}}`.
|
|
14
14
|
|
|
15
|
-
Step 3
|
|
15
|
+
Step 3 - Evaluate each of these axes:
|
|
16
16
|
|
|
17
17
|
a) Meaningful assertions vs. smoke tests
|
|
18
18
|
- Does the test verify a specific outcome, or just that no exception was
|
|
@@ -60,7 +60,7 @@ e) Test isolation and reliability
|
|
|
60
60
|
(a beforeEach that does not clean up)?
|
|
61
61
|
- Are there tests that depend on execution order or global singletons?
|
|
62
62
|
- Could a test make a real network/DB call in CI (flaky)? The fix is a
|
|
63
|
-
simple injected fake at the boundary, not blanket module mocking
|
|
63
|
+
simple injected fake at the boundary, not blanket module mocking - see
|
|
64
64
|
axis (g).
|
|
65
65
|
- Are async tests properly awaited? (floating promises, missing `await` on
|
|
66
66
|
`expect().resolves`, unhandled rejections)
|
|
@@ -75,12 +75,12 @@ f) Test-to-code ratio signal
|
|
|
75
75
|
```
|
|
76
76
|
Report whether existing coverage closes the gap or not.
|
|
77
77
|
|
|
78
|
-
g) Mock smell
|
|
79
|
-
(House standard: Notion "To mock or not to mock"
|
|
78
|
+
g) Mock smell - test the behavior, not the way it's built
|
|
79
|
+
(House standard: Notion "To mock or not to mock" -
|
|
80
80
|
https://app.notion.com/p/teifi/To-mock-or-not-to-mock-36ff8ed0f7db80f09495d174e3b86cd6)
|
|
81
81
|
Flag tests coupled to *how* the code is built rather than *what* it does for
|
|
82
82
|
the user. For each smell, do NOT just criticize: give the concrete no-mock
|
|
83
|
-
refactor. The default fix is almost always the same shape
|
|
83
|
+
refactor. The default fix is almost always the same shape - pull the logic
|
|
84
84
|
into a pure function (functional core) and test that directly, leaving a thin
|
|
85
85
|
shell covered by a few real integration tests.
|
|
86
86
|
|
|
@@ -96,7 +96,7 @@ g) Mock smell — test the behavior, not the way it's built
|
|
|
96
96
|
fetch-and-wire once with a real integration test. For streaming/paging
|
|
97
97
|
code specifically: a shared `collect()`/reassembly helper should be a
|
|
98
98
|
pure function of `AsyncGenerator<T[]> → Promise<T[]>` (or similar) fed a
|
|
99
|
-
plain fake generator in its own test
|
|
99
|
+
plain fake generator in its own test - never a mocked client - and any
|
|
100
100
|
call-site logic that combines multiple streams (parallel joins, chunked
|
|
101
101
|
batching) should be its own pure function tested the same way.
|
|
102
102
|
- Spying on calls / asserting call shape: `toHaveBeenCalledWith`,
|
|
@@ -110,7 +110,7 @@ g) Mock smell — test the behavior, not the way it's built
|
|
|
110
110
|
attributes, then asserting on them): the assertions are about the mock, and
|
|
111
111
|
break on a component swap or prop rename that changes nothing a user sees.
|
|
112
112
|
→ Pull the logic (pagination, display state) into a pure function over
|
|
113
|
-
plain values
|
|
113
|
+
plain values - e.g. `paginate(items, page, pageSize)` - and assert the
|
|
114
114
|
value it returns.
|
|
115
115
|
- Mocking a query hook (`useQuery` / a `use-X` hook) to hand a component
|
|
116
116
|
canned data: re-tests React Query's own plumbing and couples to the hook's
|
|
@@ -135,7 +135,7 @@ h) Teifi test conventions
|
|
|
135
135
|
Read `{{PROFILE}}` and apply its §4 (test conventions) to every test file in
|
|
136
136
|
the diff: `__tests__/` placement beside the source, `.test.ts` vs
|
|
137
137
|
`.test.tsx`, English-sentence test names, `describe` nesting <= 2,
|
|
138
|
-
`afterEach(cleanup)`, `retry: false` on the test QueryClient (major
|
|
138
|
+
`afterEach(cleanup)`, `retry: false` on the test QueryClient (major - its
|
|
139
139
|
absence hangs the suite on a failing query), the getByRole → getByLabelText
|
|
140
140
|
→ getByText → getByTestId priority, module-boundary mocking, `safeParse` for
|
|
141
141
|
Zod schemas, and the typed `it.each` matrix with AC tags plus the
|
|
@@ -145,17 +145,17 @@ h) Teifi test conventions
|
|
|
145
145
|
test passes against the real module. Quote the line, give the relative path
|
|
146
146
|
as the fix.
|
|
147
147
|
A comment explaining WHY a test exists (a captured past bug, a subtle
|
|
148
|
-
contract) is sanctioned
|
|
148
|
+
contract) is sanctioned - never flag it as over-commenting.
|
|
149
149
|
|
|
150
150
|
Report each per-line issue as:
|
|
151
|
-
`test-file:line
|
|
151
|
+
`test-file:line - <concise description of the gap or weakness>`
|
|
152
152
|
|
|
153
153
|
For every mock-smell finding from axis (g), append the no-mock fix on the next
|
|
154
154
|
line as `→ Fix: <pure-function / simple-fake refactor in one line>`. A
|
|
155
155
|
criticism without a fix is incomplete.
|
|
156
156
|
|
|
157
157
|
Report the mutation-slip analysis as a single paragraph under a
|
|
158
|
-
"**Mutation-slip risk:**" heading
|
|
158
|
+
"**Mutation-slip risk:**" heading - not as line items.
|
|
159
159
|
|
|
160
160
|
Rules:
|
|
161
161
|
- Every per-line finding must trace to test code in the diff, OR to business
|
|
@@ -163,10 +163,10 @@ Rules:
|
|
|
163
163
|
- Report problems only. No praise for tests that meet the bar.
|
|
164
164
|
- If no test files are changed AND no existing tests cover the new code paths,
|
|
165
165
|
report: "No test coverage for new code paths."
|
|
166
|
-
- Quote the verbatim offending line(s)
|
|
166
|
+
- Quote the verbatim offending line(s) - never paraphrased, never reconstructed
|
|
167
167
|
from memory. When the finding IS the absence of a test, there is no test line
|
|
168
168
|
to quote: quote the untested production line(s) from the diff instead, and
|
|
169
169
|
give the test that should exist as the fix. Never drop a "no coverage"
|
|
170
|
-
finding just because nothing bad is written down
|
|
170
|
+
finding just because nothing bad is written down - absence is the finding.
|
|
171
171
|
- A finding you cannot quote and cannot fix (outside the no-coverage case
|
|
172
|
-
above) is a finding you have not proven
|
|
172
|
+
above) is a finding you have not proven - drop it instead.
|
package/adapters/claude/olko-github-pr/skills/lekker-review/references/revmux/phase4-comparison.md
CHANGED
|
@@ -37,6 +37,4 @@ worktree; "merged" means two revmux findings described one mechanism.
|
|
|
37
37
|
## Still open
|
|
38
38
|
|
|
39
39
|
- Same PRs through the default `workflow` engine for a side-by-side (Oleg-driven).
|
|
40
|
-
- Read-only enforcement: revmux default `--tools` includes Bash; prompt-enforced
|
|
41
|
-
only. `--tools=Read,Grep,Glob,WebFetch,WebSearch` override not yet applied.
|
|
42
40
|
- Adapter: price synth + verify once revmux reports a per-model split.
|