@olegkoval/agent-skills 1.36.0 โ†’ 1.37.0

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.
Files changed (26) hide show
  1. package/README.md +9 -0
  2. package/adapters/claude/olko-github-pr/skills/lekker-review/SKILL.md +44 -0
  3. package/adapters/claude/olko-github-pr/skills/lekker-review/references/agents/quality.md +18 -0
  4. package/adapters/claude/olko-github-pr/skills/lekker-review/references/agents/simplification.md +29 -0
  5. package/adapters/claude/olko-github-pr/skills/lekker-review/references/output-format.md +30 -0
  6. package/package.json +1 -1
  7. package/plugins/olko-apple-kit/.claude-plugin/plugin.json +1 -1
  8. package/plugins/olko-creative/.claude-plugin/plugin.json +1 -1
  9. package/plugins/olko-garmin-kit/.claude-plugin/plugin.json +1 -1
  10. package/plugins/olko-git-tools/.claude-plugin/plugin.json +1 -1
  11. package/plugins/olko-github-pr/.claude-plugin/plugin.json +1 -1
  12. package/plugins/olko-github-pr/skills/lekker-review/README.md +60 -0
  13. package/plugins/olko-github-pr/skills/lekker-review/SKILL.md +44 -0
  14. package/plugins/olko-github-pr/skills/lekker-review/assets/poster-overview.html +204 -0
  15. package/plugins/olko-github-pr/skills/lekker-review/assets/poster-overview.png +0 -0
  16. package/plugins/olko-github-pr/skills/lekker-review/assets/poster-proof.html +199 -0
  17. package/plugins/olko-github-pr/skills/lekker-review/assets/poster-proof.png +0 -0
  18. package/plugins/olko-github-pr/skills/lekker-review/references/agents/quality.md +18 -0
  19. package/plugins/olko-github-pr/skills/lekker-review/references/agents/simplification.md +29 -0
  20. package/plugins/olko-github-pr/skills/lekker-review/references/output-format.md +30 -0
  21. package/plugins/olko-obsidian/.claude-plugin/plugin.json +1 -1
  22. package/plugins/olko-product/.claude-plugin/plugin.json +1 -1
  23. package/plugins/olko-reflection/.claude-plugin/plugin.json +1 -1
  24. package/plugins/olko-release/.claude-plugin/plugin.json +1 -1
  25. package/plugins/olko-skill-meta/.claude-plugin/plugin.json +1 -1
  26. package/plugins/olko-web-ops/.claude-plugin/plugin.json +1 -1
package/README.md CHANGED
@@ -174,6 +174,15 @@ Drive GitHub pull requests to merge-ready: review-bot loops, CI fixes, descripti
174
174
  | [dependabot-triage](plugins/olko-github-pr/skills/dependabot-triage/SKILL.md) | Triages open Dependabot and Renovate PRs in bulk: classifies by risk tier, auto-approves safe patch bumps, flags breaking major upgrades for human review, and posts a digest | Clearing a backlog of dependency update PRs during a maintenance window |
175
175
  | [lekker-review](plugins/olko-github-pr/skills/lekker-review/SKILL.md) | Runs a FAANG-quality PR review in an isolated worktree: 5 parallel specialist agents, adversarial finding verification, proof-of-bug tests for Criticals, and an optional --fix mode that applies and commits its own findings (Claude Code only, needs the Workflow tool) | Reviewing a GitHub PR beyond what a single-pass review or a bot reviewer catches |
176
176
 
177
+ #### lekker-review at a glance
178
+
179
+ Full write-up in the [skill README](plugins/olko-github-pr/skills/lekker-review/README.md).
180
+
181
+ ![The five specialist agents, the severity tiers, and the approval standard](plugins/olko-github-pr/skills/lekker-review/assets/poster-overview.png)
182
+
183
+ ![Adversarial refutation, the hard-rule exemption, proof of bug, and the fix-mode proof flip](plugins/olko-github-pr/skills/lekker-review/assets/poster-proof.png)
184
+
185
+
177
186
  ### olko-git-tools (3)
178
187
 
179
188
  Everyday git and GitHub CLI operations: conventional commits, branch hygiene.
@@ -330,6 +330,50 @@ anchors. Apply your own judgment to every finding.
330
330
  - Pre-existing code not touched by this diff
331
331
  - Anything you are not confident about - omit rather than hedge
332
332
 
333
+ **Approval standard.** The verdict answers "does this definitely improve the
334
+ codebase's health", not "is this how I would have written it". Perfect code does
335
+ not exist. `โœ… LGTM - ship it` is the right call for a change that improves
336
+ health and violates no hard rule, even with open Observations or Idiomatic
337
+ findings. Reserve `๐Ÿšซ Needs work` for an unfixed Critical, a hard-rule
338
+ violation, or an Important finding that changes external behaviour or data
339
+ shape. Never manufacture a Critical to justify a verdict, and never block on
340
+ taste.
341
+
342
+ **PR sizing.** Judge how much a reviewer must hold at once, not the raw diff
343
+ count:
344
+ - Under ~300 changed lines, or larger but one logical change: no finding.
345
+ - Over ~800 changed lines spanning more than one logical change: `important`,
346
+ and name the split. Pick the strategy that fits - stack (sequential
347
+ dependencies), by file group (different reviewers), horizontal (shared code
348
+ and stubs first, then consumers), vertical (smaller full-stack slices).
349
+ - A diff that both refactors existing code and adds new behaviour: `important`
350
+ at any size. Those are two PRs, and bundling them hides the real change.
351
+ - A change that pushes a single file past ~1000 total lines with no
352
+ decomposition: `observation`. Ask for the extraction first, then the feature.
353
+ Exempt: whole-file deletions and mechanical or automated refactors, where the
354
+ reviewer verifies intent rather than every line.
355
+
356
+ **Verify the verification.** Read the PR body for the author's verification
357
+ story: which tests were run, whether the build passed, whether it was exercised
358
+ manually, screenshots for a UI change, a before/after for a behaviour or
359
+ performance change. A non-trivial PR whose body claims nothing about
360
+ verification is an `observation` naming the evidence that is missing. `CI: โœ…
361
+ All passing` is not a verification story - it only says the suite that already
362
+ existed still runs.
363
+
364
+ **Rationalizations to reject.** If one of these is the reason a finding is about
365
+ to be dropped or softened, keep the finding:
366
+
367
+ | Rationalization | Reality |
368
+ |---|---|
369
+ | "The tests pass, so it's fine" | Tests do not catch architecture, security, or data-shape problems. |
370
+ | "It works, that's good enough" | Working code that is unreadable or insecure is debt that compounds. |
371
+ | "The refactor makes it cleaner" | Relocating complexity is not reducing it. Count the concepts a reader holds. |
372
+ | "It's only a small addition to this file" | Judge the resulting structure, not the diff size. |
373
+ | "It's just a version bump" | A bump is a behaviour change nobody in the PR wrote. |
374
+ | "They'll clean it up later" | Later does not come. Require it now, or require a ticket. |
375
+ | "An agent wrote it, so it's probably fine" | Generated code needs more scrutiny, not less: it is confident and plausible when wrong. |
376
+
333
377
  **Idiomatic & Consistency exception:** the conventions agent raises non-blocking
334
378
  suggestions ONLY when a concrete better pattern provably already exists in the
335
379
  codebase. Never on taste alone. These land in their own section, not in
@@ -36,6 +36,24 @@ Axes to cover:
36
36
  - No JavaScript files (TS-2): if the diff adds any `.js` file to a non-Liquid
37
37
  theme repo, flag as Critical โ€” must be `.ts`. Set `rule: "TS-2"` on the
38
38
  finding.
39
+ - Dependency changes. Skip this axis entirely unless the diff touches
40
+ `package.json`, a lockfile, or a vendored dependency. Where it applies:
41
+ (a) A version bump is a behaviour change nobody in this PR wrote. If neither
42
+ the PR body nor a commit message cites the changelog or migration notes,
43
+ that is `important`: semver is a promise the maintainer may not have kept,
44
+ and a "patch" can carry a behavioural change.
45
+ (b) A bulk bump of several unrelated packages in one PR is `important`. When
46
+ it breaks the build you have lost which package did it. The `fix` is to
47
+ split it per package, or per genuinely related group.
48
+ (c) When the repository tracks a committed lockfile, a `package.json`
49
+ dependency change with no matching lockfile change in the same diff is
50
+ `critical`: the lockfile is what actually ships. A lockfile change with no
51
+ `package.json` change and no explanation is also `critical`. Do not require
52
+ a lockfile from a repository that intentionally does not commit one.
53
+ (d) A new direct dependency that duplicates something already in the stack is
54
+ `important`. Name the existing thing that already solves it.
55
+ Raise NO naming, comment, complexity, or hard-rule finding inside a lockfile
56
+ or a `node_modules` path.
39
57
 
40
58
  Setting rule tags the finding as a house hard rule: it keeps its Critical
41
59
  severity and skips adversarial verification. Only set it for a genuine
@@ -20,10 +20,39 @@ Look for:
20
20
  anti-pattern (handler โ†’ service โ†’ repo with no logic in any layer).
21
21
  - Feature flags always on/off, fallback that can never trigger, dual
22
22
  implementations where old has no callers.
23
+ - Relocated complexity: a refactor that moves code without reducing the number
24
+ of concepts a reader must hold to follow it. Count them before and after, but
25
+ an unchanged count alone is not a finding. Flag only when the move leaves a
26
+ concrete residual coupling, duplication, branch, or bug-surface maintenance
27
+ risk, and name both that risk and the cheaper move available (deleting a
28
+ branch, a mode, or a layer outright, rather than re-centralising the same
29
+ logic). `important` when the PR is sold as a cleanup or refactor,
30
+ `observation` otherwise.
31
+ - Feature logic in a shared module: feature-specific behaviour added to a
32
+ general-purpose util, a shared client, or a base class. The branch belongs in
33
+ the package that owns the concept. Name the owning layer in the `fix`.
34
+ - Dead code this diff orphans: when the diff replaces or reroutes something,
35
+ grep the worktree for remaining callers of what it superseded (the old helper,
36
+ the old component, a now-unreferenced constant, a flag that can no longer be
37
+ false). Enumerate what is now unreachable. NEVER propose a silent deletion:
38
+ the `fix` lists the orphans and asks the author to confirm removal.
39
+ `observation`, or `important` when the dead path is still reachable from
40
+ production code. When WORKTREE_PATH is null in scan mode, do not infer absent
41
+ callers from the diff: mark orphan analysis unverified and request
42
+ worktree-backed verification instead.
23
43
 
24
44
  Only flag where duplication or complexity creates a real maintenance risk or
25
45
  bug surface โ€” not aesthetic preference.
26
46
 
47
+ When you flag a structural problem, name the move, not just the smell: replace a
48
+ chain of conditionals with a typed model or an explicit dispatcher, collapse
49
+ duplicate branches into one flow, separate orchestration from business logic,
50
+ move feature logic into the package that owns it, reuse the canonical helper
51
+ instead of a near-duplicate, delete a pass-through wrapper. Prefer the remedy
52
+ that removes moving pieces over one that spreads the same complexity around. A
53
+ finding that says "this is complex" without naming the restructuring is not
54
+ actionable: name the move or drop the finding.
55
+
27
56
  EXISTING_REVIEWS: read key "existingReviews" from CONTEXT_FILE (awareness only โ€” skip findings already raised)
28
57
 
29
58
  PROJECT_RULES to verify: read key "projectRules" from CONTEXT_FILE.
@@ -140,6 +140,36 @@ proof inline.>
140
140
 
141
141
  ---
142
142
 
143
+ ## ๐Ÿ“‹ PR-level findings
144
+
145
+ PR-level findings have no single file:line. Render them with this dedicated
146
+ contract instead of demoting them to Observations because a location is absent:
147
+
148
+ For an `important` sizing finding:
149
+
150
+ ### #N โ€” Sizing
151
+
152
+ **Scope:** PR-level ยท **Severity:** Important
153
+
154
+ **Risk:** <why the PR cannot be reviewed safely as presented>
155
+
156
+ **Action:** <the recommended split and strategy>
157
+
158
+ For a missing verification story:
159
+
160
+ ### Verification story โ€” action required
161
+
162
+ **Missing evidence:** <tests run, manual exercise, screenshots for UI, or
163
+ before/after for behaviour or performance>
164
+
165
+ **Action:** <exactly what the author must add to the PR description>
166
+
167
+ An `important` sizing finding counts toward the Important total and continues
168
+ the finding-number sequence. Missing verification evidence is an explicit
169
+ action, not a no-action Observation.
170
+
171
+ *(Omit section entirely if empty.)*
172
+
143
173
  ## ๐Ÿ“ Observations
144
174
 
145
175
  - <note โ€” tradeoff, risk to watch, or design question worth raising>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@olegkoval/agent-skills",
3
- "version": "1.36.0",
3
+ "version": "1.37.0",
4
4
  "private": false,
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-apple-kit",
3
3
  "description": "Build and ship Apple platform apps: macOS menubar apps, App Store submissions.",
4
- "version": "1.36.0",
4
+ "version": "1.37.0",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-creative",
3
3
  "description": "Creative and personal projects: photo galleries, music players, listings, wiki editing.",
4
- "version": "1.36.0",
4
+ "version": "1.37.0",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-garmin-kit",
3
3
  "description": "Build, test and publish Garmin Connect IQ watch faces.",
4
- "version": "1.36.0",
4
+ "version": "1.37.0",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-git-tools",
3
3
  "description": "Everyday git and GitHub CLI operations: conventional commits, branch hygiene.",
4
- "version": "1.36.0",
4
+ "version": "1.37.0",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-github-pr",
3
3
  "description": "Drive GitHub pull requests to merge-ready: review-bot loops, CI fixes, descriptions, dependency triage.",
4
- "version": "1.36.0",
4
+ "version": "1.37.0",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -0,0 +1,60 @@
1
+ # lekker-review
2
+
3
+ FAANG-quality PR code review for GitHub. It gathers the context a human reviewer
4
+ would gather and checks the branch out into an isolated worktree when the depth
5
+ requires one. `scan` runs two triage agents without a verifier. `medium` and
6
+ `deep` run five specialists and attempt proofs for at most five non-rule
7
+ Critical findings.
8
+
9
+ ![lekker-review at a glance](assets/poster-overview.png)
10
+
11
+ ## Why it is not a checklist reviewer
12
+
13
+ Most review tooling reports whatever the model believed on its first pass.
14
+ This skill spends most of its budget trying to disprove itself.
15
+
16
+ ![How findings are proved](assets/poster-proof.png)
17
+
18
+ - **Adversarial verification.** `medium` sends non-rule Criticals through an
19
+ independent verifier's five-challenge refutation; `deep` also sends
20
+ Importants. `scan` does not run verifiers.
21
+ - **Proof of bug.** In `medium` and `deep`, up to five non-rule Criticals are
22
+ sent to prover agents that attempt to write and run a failing test. A proof
23
+ that comes back green is counter-evidence: the finding is downgraded or
24
+ explicitly justified, never quietly kept.
25
+ - **Hard-rule exemption.** A finding tagged with a `rule` keeps Critical
26
+ severity and skips verification, because the verifier asks runtime-failure
27
+ questions that a standards violation can never answer.
28
+ - **Fix mode.** `--fix` has one agent edit each file, a read-only verifier read
29
+ the real `git diff`, and the captured proof re-run. If the proof stays red the
30
+ group is reverted. Nothing is pushed without explicit confirmation.
31
+
32
+ ## Requirements
33
+
34
+ Claude Code only. The review pipeline needs the Workflow tool for multi-agent
35
+ orchestration and the Artifact tool for the living review page. `git` and an
36
+ authenticated `gh` are required.
37
+
38
+ ## Setup
39
+
40
+ `references/house-rules.md` ships as a template. Replace its example rules with
41
+ your team's own non-negotiables, the ones that should always be Critical
42
+ regardless of review depth. The skill has no hard rules of its own: everything
43
+ blocking comes from that file.
44
+
45
+ ## Usage
46
+
47
+ ```text
48
+ lekker-review https://github.com/owner/repo/pull/123
49
+ lekker-review owner/repo 123 deep --post
50
+ lekker-review owner/repo 123 --fix
51
+ ```
52
+
53
+ Depth is auto-selected from the diff size when you do not name one: `scan` under
54
+ 150 changed lines and 5 files, `deep` over 800 changed lines or 25 files or when
55
+ the diff touches migrations or `*.sql`, `medium` otherwise.
56
+
57
+ ## Regenerating the posters
58
+
59
+ The posters are self-contained HTML in `assets/`. Open either file in a browser
60
+ at a 1280x720 viewport and screenshot it to regenerate the PNG.
@@ -329,6 +329,50 @@ anchors. Apply your own judgment to every finding.
329
329
  - Pre-existing code not touched by this diff
330
330
  - Anything you are not confident about - omit rather than hedge
331
331
 
332
+ **Approval standard.** The verdict answers "does this definitely improve the
333
+ codebase's health", not "is this how I would have written it". Perfect code does
334
+ not exist. `โœ… LGTM - ship it` is the right call for a change that improves
335
+ health and violates no hard rule, even with open Observations or Idiomatic
336
+ findings. Reserve `๐Ÿšซ Needs work` for an unfixed Critical, a hard-rule
337
+ violation, or an Important finding that changes external behaviour or data
338
+ shape. Never manufacture a Critical to justify a verdict, and never block on
339
+ taste.
340
+
341
+ **PR sizing.** Judge how much a reviewer must hold at once, not the raw diff
342
+ count:
343
+ - Under ~300 changed lines, or larger but one logical change: no finding.
344
+ - Over ~800 changed lines spanning more than one logical change: `important`,
345
+ and name the split. Pick the strategy that fits - stack (sequential
346
+ dependencies), by file group (different reviewers), horizontal (shared code
347
+ and stubs first, then consumers), vertical (smaller full-stack slices).
348
+ - A diff that both refactors existing code and adds new behaviour: `important`
349
+ at any size. Those are two PRs, and bundling them hides the real change.
350
+ - A change that pushes a single file past ~1000 total lines with no
351
+ decomposition: `observation`. Ask for the extraction first, then the feature.
352
+ Exempt: whole-file deletions and mechanical or automated refactors, where the
353
+ reviewer verifies intent rather than every line.
354
+
355
+ **Verify the verification.** Read the PR body for the author's verification
356
+ story: which tests were run, whether the build passed, whether it was exercised
357
+ manually, screenshots for a UI change, a before/after for a behaviour or
358
+ performance change. A non-trivial PR whose body claims nothing about
359
+ verification is an `observation` naming the evidence that is missing. `CI: โœ…
360
+ All passing` is not a verification story - it only says the suite that already
361
+ existed still runs.
362
+
363
+ **Rationalizations to reject.** If one of these is the reason a finding is about
364
+ to be dropped or softened, keep the finding:
365
+
366
+ | Rationalization | Reality |
367
+ |---|---|
368
+ | "The tests pass, so it's fine" | Tests do not catch architecture, security, or data-shape problems. |
369
+ | "It works, that's good enough" | Working code that is unreadable or insecure is debt that compounds. |
370
+ | "The refactor makes it cleaner" | Relocating complexity is not reducing it. Count the concepts a reader holds. |
371
+ | "It's only a small addition to this file" | Judge the resulting structure, not the diff size. |
372
+ | "It's just a version bump" | A bump is a behaviour change nobody in the PR wrote. |
373
+ | "They'll clean it up later" | Later does not come. Require it now, or require a ticket. |
374
+ | "An agent wrote it, so it's probably fine" | Generated code needs more scrutiny, not less: it is confident and plausible when wrong. |
375
+
332
376
  **Idiomatic & Consistency exception:** the conventions agent raises non-blocking
333
377
  suggestions ONLY when a concrete better pattern provably already exists in the
334
378
  codebase. Never on taste alone. These land in their own section, not in
@@ -0,0 +1,204 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=1280, initial-scale=1">
6
+ <title>Lekker Review Overview</title>
7
+ <style>
8
+ * { box-sizing: border-box; }
9
+ html, body { width: 1280px; height: 720px; margin: 0; overflow: hidden; }
10
+ body {
11
+ color: #e8e8e8;
12
+ background: radial-gradient(circle at 0 0, rgba(255, 200, 60, 0.05), transparent 38%), #0d0d0d;
13
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
14
+ }
15
+ .poster {
16
+ width: 1280px;
17
+ height: 720px;
18
+ padding: 40px;
19
+ display: grid;
20
+ grid-template-rows: 62px 38px 220px 128px 60px 22px;
21
+ gap: 16px;
22
+ align-content: space-between;
23
+ overflow: hidden;
24
+ }
25
+ h1 {
26
+ margin: 0 0 8px;
27
+ color: #f5c542;
28
+ font: 700 30px/1 ui-monospace, "SFMono-Regular", Menlo, monospace;
29
+ letter-spacing: 0.06em;
30
+ }
31
+ .subtitle { margin: 0; color: #9a9a9a; font-size: 15px; line-height: 1.35; white-space: nowrap; }
32
+ .pipeline { display: flex; align-items: center; gap: 8px; min-width: 0; }
33
+ .step {
34
+ height: 38px;
35
+ padding: 0 13px;
36
+ display: flex;
37
+ align-items: center;
38
+ justify-content: center;
39
+ color: #9a9a9a;
40
+ background: #161616;
41
+ border: 1px solid #2c2c2c;
42
+ border-radius: 8px;
43
+ font: 13px/1 ui-monospace, "SFMono-Regular", Menlo, monospace;
44
+ white-space: nowrap;
45
+ }
46
+ .step.hot { color: #f5c542; border-color: #f5c542; }
47
+ .arrow { flex: 0 0 auto; color: #555; font: 15px/1 ui-monospace, "SFMono-Regular", Menlo, monospace; }
48
+ .cards { display: flex; gap: 16px; min-width: 0; }
49
+ .card {
50
+ flex: 1 1 0;
51
+ min-width: 0;
52
+ height: 220px;
53
+ padding: 16px;
54
+ background: #161616;
55
+ border: 1px solid #262626;
56
+ border-radius: 10px;
57
+ overflow: hidden;
58
+ }
59
+ .kicker {
60
+ margin: 0 0 8px;
61
+ color: #f5c542;
62
+ font: 700 11px/1.2 ui-monospace, "SFMono-Regular", Menlo, monospace;
63
+ letter-spacing: 0.11em;
64
+ text-transform: uppercase;
65
+ }
66
+ h2 { margin: 0 0 14px; font-size: 19px; line-height: 1.1; font-weight: 600; }
67
+ .claims { display: grid; gap: 9px; }
68
+ .claim { margin: 0; color: #9a9a9a; font-size: 12.5px; line-height: 1.38; }
69
+ .panel {
70
+ padding: 14px 16px;
71
+ background: #161616;
72
+ border: 1px solid #262626;
73
+ border-radius: 10px;
74
+ overflow: hidden;
75
+ }
76
+ .panel-title {
77
+ margin: 0 0 10px;
78
+ color: #f5c542;
79
+ font: 700 11px/1 ui-monospace, "SFMono-Regular", Menlo, monospace;
80
+ letter-spacing: 0.11em;
81
+ }
82
+ .severity-row { display: flex; flex-wrap: wrap; gap: 10px; min-width: 0; margin-bottom: 10px; }
83
+ .chip {
84
+ flex: 1 1 0;
85
+ min-width: 0;
86
+ padding: 7px 10px;
87
+ color: #8a8a8a;
88
+ background: #1e1e1e;
89
+ border: 1px solid #2c2c2c;
90
+ border-radius: 6px;
91
+ font: 11.5px/1.15 ui-monospace, "SFMono-Regular", Menlo, monospace;
92
+ white-space: normal;
93
+ }
94
+ .chip strong { color: #e8e8e8; font-weight: 700; }
95
+ .chip.critical { color: #f0dcdc; background: #a35c60; border-color: #a35c60; }
96
+ .chip.critical strong { color: #f0dcdc; }
97
+ .rule { margin: 0; color: #e8e8e8; font-size: 12.5px; line-height: 1.25; font-weight: 600; }
98
+ .statement {
99
+ display: flex;
100
+ align-items: center;
101
+ color: #e8e8e8;
102
+ font-size: 18px;
103
+ line-height: 1.2;
104
+ font-weight: 600;
105
+ }
106
+ footer {
107
+ display: flex;
108
+ align-items: end;
109
+ justify-content: space-between;
110
+ color: #6a6a6a;
111
+ font: 11.5px/1 ui-monospace, "SFMono-Regular", Menlo, monospace;
112
+ white-space: nowrap;
113
+ }
114
+ </style>
115
+ </head>
116
+ <body>
117
+ <main class="poster">
118
+ <header>
119
+ <h1>LEKKER REVIEW</h1>
120
+ <p class="subtitle">Depth selects two triage agents or five specialists; verification follows depth. Nothing is pushed without confirmation.</p>
121
+ </header>
122
+
123
+ <section class="pipeline" aria-label="Review pipeline">
124
+ <div class="step">parse input</div><span class="arrow">โ†’</span>
125
+ <div class="step">context + worktree</div><span class="arrow">โ†’</span>
126
+ <div class="step">review agents</div><span class="arrow">โ†’</span>
127
+ <div class="step hot">verify + prove</div><span class="arrow">โ†’</span>
128
+ <div class="step">synthesize</div><span class="arrow">โ†’</span>
129
+ <div class="step">fix / post</div>
130
+ </section>
131
+
132
+ <section class="cards" aria-label="Review agents">
133
+ <article class="card">
134
+ <p class="kicker">AGENT 01</p>
135
+ <h2>Quality</h2>
136
+ <div class="claims">
137
+ <p class="claim">Business logic</p>
138
+ <p class="claim">Data integrity and security</p>
139
+ <p class="claim">Error handling and scalability</p>
140
+ <p class="claim">Pre-existing code stays out of scope</p>
141
+ </div>
142
+ </article>
143
+ <article class="card">
144
+ <p class="kicker">AGENT 02</p>
145
+ <h2>Implementation</h2>
146
+ <div class="claims">
147
+ <p class="claim">Integration contracts</p>
148
+ <p class="claim">Migration safety</p>
149
+ <p class="claim">CI failures feed Critical findings</p>
150
+ <p class="claim">External behavior and data shape</p>
151
+ </div>
152
+ </article>
153
+ <article class="card">
154
+ <p class="kicker">AGENT 03</p>
155
+ <h2>Simplification</h2>
156
+ <div class="claims">
157
+ <p class="claim">Count reader-held concepts</p>
158
+ <p class="claim">Relocating is not reducing</p>
159
+ <p class="claim">Split refactor from behavior</p>
160
+ <p class="claim">Ignore 2-3 duplicated lines</p>
161
+ </div>
162
+ </article>
163
+ <article class="card">
164
+ <p class="kicker">AGENT 04</p>
165
+ <h2>Conventions</h2>
166
+ <div class="claims">
167
+ <p class="claim">Existing precedent required</p>
168
+ <p class="claim">Cite the precedent</p>
169
+ <p class="claim">Taste alone is dropped</p>
170
+ <p class="claim">Idiomatic findings never block</p>
171
+ </div>
172
+ </article>
173
+ <article class="card">
174
+ <p class="kicker">AGENT 05</p>
175
+ <h2>Test Quality</h2>
176
+ <div class="claims">
177
+ <p class="claim">Coverage verdict</p>
178
+ <p class="claim">Mutation-slip risk</p>
179
+ <p class="claim">Mock smells and gaps</p>
180
+ <p class="claim">Would tests catch a regression?</p>
181
+ </div>
182
+ </article>
183
+ </section>
184
+
185
+ <section class="panel" aria-label="Severity tiers">
186
+ <p class="panel-title">SEVERITY</p>
187
+ <div class="severity-row">
188
+ <div class="chip critical"><strong>Critical</strong> / blocks the merge</div>
189
+ <div class="chip"><strong>Important</strong> / should fix</div>
190
+ <div class="chip"><strong>Observation</strong> / worth raising</div>
191
+ <div class="chip"><strong>Idiomatic</strong> / cited precedent</div>
192
+ </div>
193
+ <p class="rule">Critical and Important cover real failure risk; adopter-defined hard-rule violations also remain Critical. No nitpicking.</p>
194
+ </section>
195
+
196
+ <div class="statement">Approve when the change definitely improves codebase health, violates no hard rule, and leaves only non-blocking findings.</div>
197
+
198
+ <footer>
199
+ <span>AUTO: SCAN additions+deletions &lt;150 AND โ‰ค5 files ยท DEEP &gt;800 OR &gt;25 files OR migrations/ OR *.sql ยท MEDIUM otherwise</span>
200
+ <span>lekker-review</span>
201
+ </footer>
202
+ </main>
203
+ </body>
204
+ </html>
@@ -0,0 +1,199 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=1280, initial-scale=1">
6
+ <title>Lekker Review Proof</title>
7
+ <style>
8
+ * { box-sizing: border-box; }
9
+ html, body { width: 1280px; height: 720px; margin: 0; overflow: hidden; }
10
+ body {
11
+ color: #e8e8e8;
12
+ background: radial-gradient(circle at 0 0, rgba(255, 200, 60, 0.05), transparent 38%), #0d0d0d;
13
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
14
+ }
15
+ .poster {
16
+ width: 1280px;
17
+ height: 720px;
18
+ padding: 40px;
19
+ display: grid;
20
+ grid-template-rows: 62px 38px 286px 86px 66px 22px;
21
+ gap: 16px;
22
+ overflow: hidden;
23
+ }
24
+ h1 {
25
+ margin: 0 0 8px;
26
+ color: #f5c542;
27
+ font: 700 30px/1 ui-monospace, "SFMono-Regular", Menlo, monospace;
28
+ letter-spacing: 0.06em;
29
+ }
30
+ .subtitle { margin: 0; color: #9a9a9a; font-size: 15px; line-height: 1.35; white-space: nowrap; }
31
+ .pipeline { display: flex; align-items: center; gap: 8px; min-width: 0; }
32
+ .step {
33
+ height: 38px;
34
+ padding: 0 14px;
35
+ display: flex;
36
+ align-items: center;
37
+ justify-content: center;
38
+ color: #9a9a9a;
39
+ background: #161616;
40
+ border: 1px solid #2c2c2c;
41
+ border-radius: 8px;
42
+ font: 13px/1 ui-monospace, "SFMono-Regular", Menlo, monospace;
43
+ white-space: nowrap;
44
+ }
45
+ .step.hot { color: #f5c542; border-color: #f5c542; }
46
+ .arrow { flex: 0 0 auto; color: #555; font: 15px/1 ui-monospace, "SFMono-Regular", Menlo, monospace; }
47
+ .cards { display: flex; gap: 16px; min-width: 0; }
48
+ .card {
49
+ flex: 1 1 0;
50
+ min-width: 0;
51
+ height: 286px;
52
+ padding: 16px;
53
+ background: #161616;
54
+ border: 1px solid #262626;
55
+ border-radius: 10px;
56
+ overflow: hidden;
57
+ }
58
+ .kicker {
59
+ margin: 0 0 8px;
60
+ color: #f5c542;
61
+ font: 700 11px/1.2 ui-monospace, "SFMono-Regular", Menlo, monospace;
62
+ letter-spacing: 0.11em;
63
+ }
64
+ h2 { margin: 0 0 14px; font-size: 19px; line-height: 1.1; font-weight: 600; }
65
+ .claims { display: grid; gap: 9px; }
66
+ .claim { margin: 0; color: #9a9a9a; font-size: 12.5px; line-height: 1.38; }
67
+ .claim strong { color: #e8e8e8; font-weight: 600; }
68
+ .panel {
69
+ padding: 13px 16px;
70
+ background: #161616;
71
+ border: 1px solid #262626;
72
+ border-radius: 10px;
73
+ display: flex;
74
+ align-items: center;
75
+ gap: 14px;
76
+ overflow: hidden;
77
+ }
78
+ .panel-title {
79
+ flex: 0 0 auto;
80
+ margin: 0;
81
+ color: #f5c542;
82
+ font: 700 11px/1 ui-monospace, "SFMono-Regular", Menlo, monospace;
83
+ letter-spacing: 0.11em;
84
+ }
85
+ .chip {
86
+ flex: 0 0 auto;
87
+ padding: 8px 11px;
88
+ color: #8a8a8a;
89
+ background: #1e1e1e;
90
+ border: 1px solid #2c2c2c;
91
+ border-radius: 6px;
92
+ font: 11.5px/1 ui-monospace, "SFMono-Regular", Menlo, monospace;
93
+ white-space: nowrap;
94
+ }
95
+ .chip.red { color: #f0dcdc; background: #a35c60; border-color: #a35c60; }
96
+ .panel-rule { margin: 0; color: #e8e8e8; font-size: 12.5px; line-height: 1.28; font-weight: 600; }
97
+ .statement {
98
+ display: flex;
99
+ align-items: center;
100
+ color: #e8e8e8;
101
+ font-size: 18px;
102
+ line-height: 1.2;
103
+ font-weight: 600;
104
+ }
105
+ footer {
106
+ display: flex;
107
+ align-items: end;
108
+ justify-content: space-between;
109
+ color: #6a6a6a;
110
+ font: 11.5px/1 ui-monospace, "SFMono-Regular", Menlo, monospace;
111
+ white-space: nowrap;
112
+ }
113
+ </style>
114
+ </head>
115
+ <body>
116
+ <main class="poster">
117
+ <header>
118
+ <h1>LEKKER PROOF</h1>
119
+ <p class="subtitle">Depth gates verification and proof attempts; a proven Critical must flip green after a fix.</p>
120
+ </header>
121
+
122
+ <section class="pipeline" aria-label="Evidence pipeline">
123
+ <div class="step">finding</div><span class="arrow">โ†’</span>
124
+ <div class="step">five challenges</div><span class="arrow">โ†’</span>
125
+ <div class="step hot">proof attempt</div><span class="arrow">โ†’</span>
126
+ <div class="step">real git diff</div><span class="arrow">โ†’</span>
127
+ <div class="step">green proof</div><span class="arrow">โ†’</span>
128
+ <div class="step">confirmed push</div>
129
+ </section>
130
+
131
+ <section class="cards" aria-label="Proof mechanisms">
132
+ <article class="card">
133
+ <p class="kicker">PROOF 01</p>
134
+ <h2>Refute It</h2>
135
+ <div class="claims">
136
+ <p class="claim">One verifier applies five adversarial challenges to one finding.</p>
137
+ <p class="claim"><strong>Scan:</strong> no findings verified.</p>
138
+ <p class="claim"><strong>Medium:</strong> Criticals verified.</p>
139
+ <p class="claim"><strong>Deep:</strong> Criticals and Importants verified.</p>
140
+ </div>
141
+ </article>
142
+ <article class="card">
143
+ <p class="kicker">PROOF 02</p>
144
+ <h2>Keep the Rule</h2>
145
+ <div class="claims">
146
+ <p class="claim">Teams define hard rules in <strong>references/house-rules.md</strong>.</p>
147
+ <p class="claim">Reviewers tag violations with <strong>rule</strong>; they stay Critical.</p>
148
+ <p class="claim">Runtime questions cannot prove standards and would drop non-negotiable findings.</p>
149
+ <p class="claim">Rule-tagged findings skip provers; policy has no failing test.</p>
150
+ </div>
151
+ </article>
152
+ <article class="card">
153
+ <p class="kicker">PROOF 03</p>
154
+ <h2>Prove the Bug</h2>
155
+ <div class="claims">
156
+ <p class="claim">At medium and deep depth, up to five non-rule Criticals get a prover.</p>
157
+ <p class="claim">It runs in the isolated worktree.</p>
158
+ <p class="claim">Captured red demonstrates the Critical bug.</p>
159
+ <p class="claim">Green is counter-evidence: downgrade or justify.</p>
160
+ </div>
161
+ </article>
162
+ <article class="card">
163
+ <p class="kicker">PROOF 04</p>
164
+ <h2>Fix, Then Verify</h2>
165
+ <div class="claims">
166
+ <p class="claim">One fix agent edits each file.</p>
167
+ <p class="claim">A read-only verifier reads the real git diff.</p>
168
+ <p class="claim">A red proof after the fix reverts the group.</p>
169
+ <p class="claim">Nothing is pushed without explicit confirmation.</p>
170
+ </div>
171
+ </article>
172
+ <article class="card">
173
+ <p class="kicker">PROOF 05</p>
174
+ <h2>Keep It Living</h2>
175
+ <div class="claims">
176
+ <p class="claim">Reviews publish a private artifact page by default.</p>
177
+ <p class="claim">Re-reviews update the same URL.</p>
178
+ <p class="claim">A timeline shows what changed since the last review.</p>
179
+ <p class="claim">Findings close commit by commit.</p>
180
+ </div>
181
+ </article>
182
+ </section>
183
+
184
+ <section class="panel" aria-label="Counter-evidence rule">
185
+ <p class="panel-title">COUNTER-EVIDENCE</p>
186
+ <span class="chip red">RED = bug demonstrated</span>
187
+ <span class="chip">GREEN = code behaved correctly</span>
188
+ <p class="panel-rule">A green proof cannot silently remain Critical. It must be downgraded or explicitly justified.</p>
189
+ </section>
190
+
191
+ <div class="statement">An executed test outranks an agent's opinion. If the proof stays red after a fix, the group is reverted.</div>
192
+
193
+ <footer>
194
+ <span>VERIFY: scan none ยท medium Critical ยท deep Critical + Important ยท rule-tagged findings exempt and never proved</span>
195
+ <span>lekker-review</span>
196
+ </footer>
197
+ </main>
198
+ </body>
199
+ </html>
@@ -36,6 +36,24 @@ Axes to cover:
36
36
  - No JavaScript files (TS-2): if the diff adds any `.js` file to a non-Liquid
37
37
  theme repo, flag as Critical โ€” must be `.ts`. Set `rule: "TS-2"` on the
38
38
  finding.
39
+ - Dependency changes. Skip this axis entirely unless the diff touches
40
+ `package.json`, a lockfile, or a vendored dependency. Where it applies:
41
+ (a) A version bump is a behaviour change nobody in this PR wrote. If neither
42
+ the PR body nor a commit message cites the changelog or migration notes,
43
+ that is `important`: semver is a promise the maintainer may not have kept,
44
+ and a "patch" can carry a behavioural change.
45
+ (b) A bulk bump of several unrelated packages in one PR is `important`. When
46
+ it breaks the build you have lost which package did it. The `fix` is to
47
+ split it per package, or per genuinely related group.
48
+ (c) When the repository tracks a committed lockfile, a `package.json`
49
+ dependency change with no matching lockfile change in the same diff is
50
+ `critical`: the lockfile is what actually ships. A lockfile change with no
51
+ `package.json` change and no explanation is also `critical`. Do not require
52
+ a lockfile from a repository that intentionally does not commit one.
53
+ (d) A new direct dependency that duplicates something already in the stack is
54
+ `important`. Name the existing thing that already solves it.
55
+ Raise NO naming, comment, complexity, or hard-rule finding inside a lockfile
56
+ or a `node_modules` path.
39
57
 
40
58
  Setting rule tags the finding as a house hard rule: it keeps its Critical
41
59
  severity and skips adversarial verification. Only set it for a genuine
@@ -20,10 +20,39 @@ Look for:
20
20
  anti-pattern (handler โ†’ service โ†’ repo with no logic in any layer).
21
21
  - Feature flags always on/off, fallback that can never trigger, dual
22
22
  implementations where old has no callers.
23
+ - Relocated complexity: a refactor that moves code without reducing the number
24
+ of concepts a reader must hold to follow it. Count them before and after, but
25
+ an unchanged count alone is not a finding. Flag only when the move leaves a
26
+ concrete residual coupling, duplication, branch, or bug-surface maintenance
27
+ risk, and name both that risk and the cheaper move available (deleting a
28
+ branch, a mode, or a layer outright, rather than re-centralising the same
29
+ logic). `important` when the PR is sold as a cleanup or refactor,
30
+ `observation` otherwise.
31
+ - Feature logic in a shared module: feature-specific behaviour added to a
32
+ general-purpose util, a shared client, or a base class. The branch belongs in
33
+ the package that owns the concept. Name the owning layer in the `fix`.
34
+ - Dead code this diff orphans: when the diff replaces or reroutes something,
35
+ grep the worktree for remaining callers of what it superseded (the old helper,
36
+ the old component, a now-unreferenced constant, a flag that can no longer be
37
+ false). Enumerate what is now unreachable. NEVER propose a silent deletion:
38
+ the `fix` lists the orphans and asks the author to confirm removal.
39
+ `observation`, or `important` when the dead path is still reachable from
40
+ production code. When WORKTREE_PATH is null in scan mode, do not infer absent
41
+ callers from the diff: mark orphan analysis unverified and request
42
+ worktree-backed verification instead.
23
43
 
24
44
  Only flag where duplication or complexity creates a real maintenance risk or
25
45
  bug surface โ€” not aesthetic preference.
26
46
 
47
+ When you flag a structural problem, name the move, not just the smell: replace a
48
+ chain of conditionals with a typed model or an explicit dispatcher, collapse
49
+ duplicate branches into one flow, separate orchestration from business logic,
50
+ move feature logic into the package that owns it, reuse the canonical helper
51
+ instead of a near-duplicate, delete a pass-through wrapper. Prefer the remedy
52
+ that removes moving pieces over one that spreads the same complexity around. A
53
+ finding that says "this is complex" without naming the restructuring is not
54
+ actionable: name the move or drop the finding.
55
+
27
56
  EXISTING_REVIEWS: read key "existingReviews" from CONTEXT_FILE (awareness only โ€” skip findings already raised)
28
57
 
29
58
  PROJECT_RULES to verify: read key "projectRules" from CONTEXT_FILE.
@@ -140,6 +140,36 @@ proof inline.>
140
140
 
141
141
  ---
142
142
 
143
+ ## ๐Ÿ“‹ PR-level findings
144
+
145
+ PR-level findings have no single file:line. Render them with this dedicated
146
+ contract instead of demoting them to Observations because a location is absent:
147
+
148
+ For an `important` sizing finding:
149
+
150
+ ### #N โ€” Sizing
151
+
152
+ **Scope:** PR-level ยท **Severity:** Important
153
+
154
+ **Risk:** <why the PR cannot be reviewed safely as presented>
155
+
156
+ **Action:** <the recommended split and strategy>
157
+
158
+ For a missing verification story:
159
+
160
+ ### Verification story โ€” action required
161
+
162
+ **Missing evidence:** <tests run, manual exercise, screenshots for UI, or
163
+ before/after for behaviour or performance>
164
+
165
+ **Action:** <exactly what the author must add to the PR description>
166
+
167
+ An `important` sizing finding counts toward the Important total and continues
168
+ the finding-number sequence. Missing verification evidence is an explicit
169
+ action, not a no-action Observation.
170
+
171
+ *(Omit section entirely if empty.)*
172
+
143
173
  ## ๐Ÿ“ Observations
144
174
 
145
175
  - <note โ€” tradeoff, risk to watch, or design question worth raising>
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-obsidian",
3
3
  "description": "Keep an Obsidian vault in sync with work: PR sync, task rollover, morning routine.",
4
- "version": "1.36.0",
4
+ "version": "1.37.0",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-product",
3
3
  "description": "Take a product idea to a shippable build: MVP passes, full-stack scaffolds, launch plans.",
4
- "version": "1.36.0",
4
+ "version": "1.37.0",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-reflection",
3
3
  "description": "Look back and improve: self-critique, retrospectives, performance review, rapid learning.",
4
- "version": "1.36.0",
4
+ "version": "1.37.0",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-release",
3
3
  "description": "Ship a release: semantic-release setup, changelogs, store listing copy, release-day routine.",
4
- "version": "1.36.0",
4
+ "version": "1.37.0",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-skill-meta",
3
3
  "description": "Author and maintain agent skills and the AI toolchain itself.",
4
- "version": "1.36.0",
4
+ "version": "1.37.0",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-web-ops",
3
3
  "description": "Operate a website: WAF rules, search console audits, analytics bootstrap, docs indexes.",
4
- "version": "1.36.0",
4
+ "version": "1.37.0",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },