@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.
- package/README.md +9 -0
- package/adapters/claude/olko-github-pr/skills/lekker-review/SKILL.md +44 -0
- package/adapters/claude/olko-github-pr/skills/lekker-review/references/agents/quality.md +18 -0
- package/adapters/claude/olko-github-pr/skills/lekker-review/references/agents/simplification.md +29 -0
- package/adapters/claude/olko-github-pr/skills/lekker-review/references/output-format.md +30 -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/README.md +60 -0
- package/plugins/olko-github-pr/skills/lekker-review/SKILL.md +44 -0
- package/plugins/olko-github-pr/skills/lekker-review/assets/poster-overview.html +204 -0
- package/plugins/olko-github-pr/skills/lekker-review/assets/poster-overview.png +0 -0
- package/plugins/olko-github-pr/skills/lekker-review/assets/poster-proof.html +199 -0
- package/plugins/olko-github-pr/skills/lekker-review/assets/poster-proof.png +0 -0
- package/plugins/olko-github-pr/skills/lekker-review/references/agents/quality.md +18 -0
- package/plugins/olko-github-pr/skills/lekker-review/references/agents/simplification.md +29 -0
- package/plugins/olko-github-pr/skills/lekker-review/references/output-format.md +30 -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
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
|
+

|
|
182
|
+
|
|
183
|
+

|
|
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
|
package/adapters/claude/olko-github-pr/skills/lekker-review/references/agents/simplification.md
CHANGED
|
@@ -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
|
@@ -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
|
+

|
|
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
|
+

|
|
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 <150 AND โค5 files ยท DEEP >800 OR >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>
|