@mrciphersmith/keryx 0.2.72 → 0.2.74
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/dist/cli.js +33409 -32626
- package/package.json +2 -2
- package/src/gdskills/bundled/rules/core/gproject-contracts.mdc +1 -1
- package/src/gdskills/bundled/rules/core/jobs-documentation.mdc +1 -1
- package/src/gdskills/bundled/rules/core/subagent-context-construction.md +1 -1
- package/src/gdskills/bundled/skills/core/reviewer-skill-creator/SKILL.md +214 -0
- package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.codex.md +326 -20
- package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.cursor.md +320 -22
- package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.opencode.md +326 -12
- package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.zed.md +333 -9
- package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.codex.md +92 -4
- package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.cursor.md +92 -4
- package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.opencode.md +92 -4
- package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.zed.md +92 -4
- package/src/gdskills/bundled/skills/orchestration/context-collector/orchestrator-prompt.md +1 -1
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.codex.md +154 -1098
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.cursor.md +154 -1098
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.opencode.md +154 -1098
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.zed.md +154 -1098
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/orchestrator-prompt.md +1 -1
- package/src/gdskills/bundled/skills/orchestration/feature-dev/SKILL.codex.md +101 -41
- package/src/gdskills/bundled/skills/orchestration/feature-dev/SKILL.cursor.md +101 -41
- package/src/gdskills/bundled/skills/orchestration/flow-orchestrator/SKILL.md +48 -1
- package/src/gdskills/bundled/skills/orchestration/flow-orchestrator/input-contract.schema.json +70 -4
- package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.codex.md +115 -49
- package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.cursor.md +115 -49
- package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.opencode.md +115 -49
- package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.zed.md +115 -49
- package/src/gdskills/bundled/skills/orchestration/issue-analyzer/orchestrator-prompt.md +1 -1
- package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.codex.md +15 -6
- package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.cursor.md +15 -6
- package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.opencode.md +15 -6
- package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.zed.md +15 -6
- package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.codex.md +1 -1
- package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.cursor.md +1 -1
- package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.md +1 -1
- package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.opencode.md +1 -1
- package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.zed.md +1 -1
- package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.codex.md +300 -55
- package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.cursor.md +300 -55
- package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.md +120 -37
- package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.opencode.md +300 -55
- package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.zed.md +300 -55
- package/src/gdskills/bundled/skills/orchestration/task-implementer/input-contract.schema.json +56 -14
- package/src/gdskills/bundled/skills/orchestration/task-implementer/orchestrator-prompt.md +50 -23
- package/src/gdskills/bundled/skills/orchestration/task-implementer/output-contract.schema.json +6 -2
- package/src/gdskills/bundled/skills/orchestration/task-implementer/task-request.template.md +18 -12
- package/src/gdskills/bundled/skills/planning/brainstorm/SKILL.codex.md +1 -1
- package/src/gdskills/bundled/skills/planning/brainstorm/SKILL.cursor.md +1 -1
- package/src/gdskills/bundled/skills/planning/consistency-checker/SKILL.codex.md +169 -10
- package/src/gdskills/bundled/skills/planning/consistency-checker/SKILL.cursor.md +169 -10
- package/src/gdskills/bundled/skills/planning/consistency-checker/SKILL.md +1 -1
- package/src/gdskills/bundled/skills/planning/interview/SKILL.codex.md +7 -1
- package/src/gdskills/bundled/skills/planning/interview/SKILL.cursor.md +7 -1
- package/src/gdskills/bundled/skills/planning/interviewer/SKILL.codex.md +7 -1
- package/src/gdskills/bundled/skills/planning/interviewer/SKILL.cursor.md +7 -1
- package/src/gdskills/bundled/skills/planning/patterns-researcher/SKILL.codex.md +216 -10
- package/src/gdskills/bundled/skills/planning/patterns-researcher/SKILL.cursor.md +216 -10
- package/src/gdskills/bundled/skills/planning/patterns-researcher/SKILL.md +1 -1
- package/src/gdskills/bundled/skills/planning/planner/SKILL.codex.md +169 -10
- package/src/gdskills/bundled/skills/planning/planner/SKILL.cursor.md +169 -10
- package/src/gdskills/bundled/skills/planning/planner/SKILL.md +1 -1
- package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.codex.md +2 -2
- package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.cursor.md +2 -2
- package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.opencode.md +2 -2
- package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.zed.md +2 -2
- package/src/gdskills/bundled/skills/planning/problem-definer/SKILL.codex.md +134 -10
- package/src/gdskills/bundled/skills/planning/problem-definer/SKILL.cursor.md +134 -10
- package/src/gdskills/bundled/skills/planning/problem-definer/SKILL.md +1 -1
- package/src/gdskills/bundled/skills/planning/project-discovery/SKILL.codex.md +146 -10
- package/src/gdskills/bundled/skills/planning/project-discovery/SKILL.cursor.md +146 -10
- package/src/gdskills/bundled/skills/planning/project-discovery/SKILL.md +1 -1
- package/src/gdskills/bundled/skills/planning/spec-writer/SKILL.codex.md +211 -10
- package/src/gdskills/bundled/skills/planning/spec-writer/SKILL.cursor.md +211 -10
- package/src/gdskills/bundled/skills/planning/spec-writer/SKILL.md +1 -1
- package/src/gdskills/bundled/skills/planning/stack-advisor/SKILL.codex.md +162 -10
- package/src/gdskills/bundled/skills/planning/stack-advisor/SKILL.cursor.md +162 -10
- package/src/gdskills/bundled/skills/planning/stack-advisor/SKILL.md +1 -1
- package/src/gdskills/bundled/skills/platform/claude-md-management/SKILL.codex.md +1 -1
- package/src/gdskills/bundled/skills/platform/claude-md-management/SKILL.cursor.md +1 -1
- package/src/gdskills/bundled/skills/platform/hookify/SKILL.codex.md +1 -1
- package/src/gdskills/bundled/skills/platform/hookify/SKILL.cursor.md +1 -1
- package/src/gdskills/bundled/skills/quality/changelog/SKILL.codex.md +1 -1
- package/src/gdskills/bundled/skills/quality/changelog/SKILL.cursor.md +1 -1
- package/src/gdskills/bundled/skills/quality/commit/SKILL.codex.md +1 -1
- package/src/gdskills/bundled/skills/quality/commit/SKILL.cursor.md +1 -1
- package/src/gdskills/bundled/skills/quality/db-migrate/SKILL.codex.md +1 -1
- package/src/gdskills/bundled/skills/quality/db-migrate/SKILL.cursor.md +1 -1
- package/src/gdskills/bundled/skills/quality/dependency-update/SKILL.codex.md +1 -1
- package/src/gdskills/bundled/skills/quality/dependency-update/SKILL.cursor.md +1 -1
- package/src/gdskills/bundled/skills/quality/deploy/SKILL.codex.md +1 -1
- package/src/gdskills/bundled/skills/quality/deploy/SKILL.cursor.md +1 -1
- package/src/gdskills/bundled/skills/quality/perf-check/SKILL.codex.md +1 -1
- package/src/gdskills/bundled/skills/quality/perf-check/SKILL.cursor.md +1 -1
- package/src/gdskills/bundled/skills/quality/pr/SKILL.codex.md +1 -1
- package/src/gdskills/bundled/skills/quality/pr/SKILL.cursor.md +1 -1
- package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.codex.md +15 -1
- package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.cursor.md +248 -165
- package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.opencode.md +15 -1
- package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.zed.md +359 -19
- package/src/gdskills/bundled/skills/quality/push/SKILL.codex.md +1 -1
- package/src/gdskills/bundled/skills/quality/push/SKILL.cursor.md +1 -1
- package/src/gdskills/bundled/skills/quality/security-audit/SKILL.codex.md +1 -1
- package/src/gdskills/bundled/skills/quality/security-audit/SKILL.cursor.md +1 -1
- package/src/gdskills/bundled/skills/quality/test-gen/SKILL.codex.md +1 -1
- package/src/gdskills/bundled/skills/quality/test-gen/SKILL.cursor.md +1 -1
- package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.codex.md +299 -24
- package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.cursor.md +296 -31
- package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.opencode.md +309 -18
- package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.zed.md +312 -17
- package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.codex.md +29 -30
- package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.cursor.md +29 -30
- package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.opencode.md +29 -30
- package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.zed.md +29 -30
- package/src/gdskills/bundled/skills/review/code-learned-review/SKILL.codex.md +21 -30
- package/src/gdskills/bundled/skills/review/code-learned-review/SKILL.cursor.md +21 -30
- package/src/gdskills/bundled/skills/review/code-learned-review/SKILL.opencode.md +21 -30
- package/src/gdskills/bundled/skills/review/code-learned-review/SKILL.zed.md +21 -30
- package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.codex.md +19 -23
- package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.cursor.md +19 -23
- package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.opencode.md +19 -23
- package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.zed.md +19 -23
- package/src/gdskills/bundled/skills/review/code-style-review/SKILL.codex.md +17 -24
- package/src/gdskills/bundled/skills/review/code-style-review/SKILL.cursor.md +17 -24
- package/src/gdskills/bundled/skills/review/code-style-review/SKILL.opencode.md +17 -24
- package/src/gdskills/bundled/skills/review/code-style-review/SKILL.zed.md +17 -24
- package/src/gdskills/bundled/skills/review/review-clean-code/SKILL.md +33 -1
- package/src/gdskills/bundled/skills/review/review-layout/SKILL.md +217 -0
- package/src/gdskills/bundled/skills/review/review-logic/SKILL.md +26 -0
- package/src/gdskills/bundled/skills/review/review-orchestrator/SKILL.md +320 -5
- package/src/gdskills/bundled/skills/review/review-pr-feedback/SKILL.md +644 -113
- package/src/gdskills/bundled/skills/review/review-pr-feedback/input-contract.schema.json +79 -0
- package/src/gdskills/bundled/skills/review/review-pr-feedback/output-contract.schema.json +375 -0
- package/src/gdskills/bundled/skills/review/review-testing-practices/SKILL.md +111 -1
- package/src/gdskills/bundled/skills/review/review-verifier/SKILL.md +25 -1
- package/src/gdskills/bundled/skills/planning/brainstorm/SKILL.claude.md +0 -46
- package/src/gdskills/bundled/skills/planning/interviewer/SKILL.claude.md +0 -94
- package/src/gdskills/bundled/skills/quality/changelog/SKILL.claude.md +0 -45
- package/src/gdskills/bundled/skills/quality/db-migrate/SKILL.claude.md +0 -40
- package/src/gdskills/bundled/skills/quality/dependency-update/SKILL.claude.md +0 -45
- package/src/gdskills/bundled/skills/quality/deploy/SKILL.claude.md +0 -42
- package/src/gdskills/bundled/skills/quality/perf-check/SKILL.claude.md +0 -48
- package/src/gdskills/bundled/skills/quality/security-audit/SKILL.claude.md +0 -40
- package/src/gdskills/bundled/skills/quality/test-gen/SKILL.claude.md +0 -30
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mrciphersmith/keryx",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.74",
|
|
4
4
|
"description": "Version-controlled project context for AI coding agents: code graph, architecture wiki, project memory, relevant tests, quality signals, and task flows.",
|
|
5
5
|
"private": false,
|
|
6
6
|
"publishConfig": {
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
"check": "tsc --noEmit && bun test",
|
|
43
43
|
"check:doc-links": "bun scripts/check-doc-links.ts",
|
|
44
44
|
"baseline:review-precision": "bun scripts/review-precision-baseline.ts",
|
|
45
|
-
"test:guards": "bun test src/lib/config-dir.ast.test.ts src/lib/config-dir.readers.test.ts src/lib/production-graph.test.ts src/harness/policy/profiles.test.ts src/lib/serve-server.test.ts"
|
|
45
|
+
"test:guards": "bun test src/lib/config-dir.ast.test.ts src/lib/config-dir.readers.test.ts src/lib/production-graph.test.ts src/harness/policy/profiles.test.ts src/lib/serve-server.test.ts src/gdskills/agent-catalogue-xref.test.ts src/gdskills/enforcement-claims.test.ts"
|
|
46
46
|
},
|
|
47
47
|
"files": [
|
|
48
48
|
"dist",
|
|
@@ -33,7 +33,7 @@ Every dispatch from gproject-orchestrator MUST include:
|
|
|
33
33
|
```yaml
|
|
34
34
|
# Required (from base protocol)
|
|
35
35
|
description: "<phase>: <task>"
|
|
36
|
-
subagent_type: "general"
|
|
36
|
+
subagent_type: "general-purpose"
|
|
37
37
|
prompt: "<structured prompt — see template below>"
|
|
38
38
|
|
|
39
39
|
# gproject-specific (inside prompt)
|
|
@@ -80,7 +80,7 @@ Every job folder MUST contain at minimum:
|
|
|
80
80
|
...
|
|
81
81
|
```
|
|
82
82
|
|
|
83
|
-
> **`results/` folder:**
|
|
83
|
+
> **`results/` folder:** Written by `task-implementer` during Phase 6.1 (one file per task), then validated with `keryx skills contracts validate … --schema task-implementer-output` and recorded with `keryx job document <job-name> --type implementation-report --file <that file>`, which refuses if the file was never written. There is no `wave-executor` agent: the orchestrator dispatches each task itself, never receives a full task result inline, and reads a `results/` file only when a task reports `DONE_WITH_CONCERNS` or `BLOCKED`. This keeps the orchestrator context bounded.
|
|
84
84
|
|
|
85
85
|
## README.md Format
|
|
86
86
|
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: reviewer-skill-creator
|
|
3
|
+
model_tier: standard
|
|
4
|
+
description: |
|
|
5
|
+
Use when asked to create a project-local reviewer for review-orchestrator, usually
|
|
6
|
+
from an existing source: a rules file, a review profile, a conventions doc, a
|
|
7
|
+
team's written review standard. Scaffolds the package under
|
|
8
|
+
.metaproject/project-skills/review/<name>/, records where the source came from
|
|
9
|
+
so drift is detectable later, writes the reviewer against the orchestrated review
|
|
10
|
+
contract, and confirms the orchestrator can see it.
|
|
11
|
+
NOT for: editing a bundled reviewer keryx ships (those live in the source tree and
|
|
12
|
+
change through a PR), and NOT for creating an ordinary entity project-skill
|
|
13
|
+
(entity-skill-creator).
|
|
14
|
+
triggers:
|
|
15
|
+
- "create a reviewer"
|
|
16
|
+
- "new reviewer for review-orchestrator"
|
|
17
|
+
- "make a reviewer from this profile"
|
|
18
|
+
- "создай ревьюера"
|
|
19
|
+
- "создай нового ревьюера на основании"
|
|
20
|
+
metadata:
|
|
21
|
+
author: "MrCipherSmith"
|
|
22
|
+
version: "1.0.0"
|
|
23
|
+
category: "core"
|
|
24
|
+
compatible_harnesses: "cursor,codex,zed,opencode,claude"
|
|
25
|
+
license: "MIT"
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
# Reviewer Skill Creator
|
|
29
|
+
|
|
30
|
+
Turn a written review standard into a reviewer the orchestrator will dispatch.
|
|
31
|
+
|
|
32
|
+
The request usually arrives as one sentence — *"create a reviewer for
|
|
33
|
+
review-orchestrator based on `<path>/rules/core/some-profile.mdc`"* — and it names two
|
|
34
|
+
things: a **destination** (the review lane) and a **source** (a file someone
|
|
35
|
+
else maintains). Both matter, and the second is the one that is usually
|
|
36
|
+
mishandled.
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Where it goes, and why there
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
.metaproject/skills/gdskills/review/<name>/ <- reviewers keryx ships
|
|
44
|
+
.metaproject/project-skills/review/<name>/ <- reviewers this project defines
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
The parallel is the whole convention. A project reviewer is a project-skill whose
|
|
48
|
+
**module is `review`**; nothing else marks it, and `keryx review reviewers`
|
|
49
|
+
finds it by that alone. Anyone who knows where bundled reviewers live knows where
|
|
50
|
+
these go.
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## Workflow
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
reviewer-skill-creator Progress:
|
|
58
|
+
- [ ] Step 1: Read the source in full, and say what it is
|
|
59
|
+
- [ ] Step 2: Scaffold the package, recording the source
|
|
60
|
+
- [ ] Step 3: Write the reviewer against the orchestrated contract
|
|
61
|
+
- [ ] Step 4: De-personalise
|
|
62
|
+
- [ ] Step 5: Verify, and confirm the orchestrator sees it
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Step 1 — read the source in full, and say what it is
|
|
66
|
+
|
|
67
|
+
Read the whole file before writing anything. A review profile is usually not
|
|
68
|
+
organised as a reviewer: it is a list of rules, or a transcript of preferences,
|
|
69
|
+
or a checklist mixed with examples from one specific repository.
|
|
70
|
+
|
|
71
|
+
Sort what you find into three piles, out loud, in your reply:
|
|
72
|
+
|
|
73
|
+
- **Method** — a way of establishing something. *Delete the gate and see whether
|
|
74
|
+
the suite stays green. Measure the rendered width. Read the producer at a
|
|
75
|
+
pinned SHA.* This is the valuable pile and it transfers.
|
|
76
|
+
- **Convention** — a rule true of the source's own codebase. *Stores go in
|
|
77
|
+
`src/*/store.ts`.* Keep it only if it is true of THIS project; verify, do not
|
|
78
|
+
assume.
|
|
79
|
+
- **Persona** — one person's voice, catchphrases, verdict vocabulary, and habits
|
|
80
|
+
of address. This pile is dropped whole. See Step 4.
|
|
81
|
+
|
|
82
|
+
If the source is mostly the third pile, say so and stop. A reviewer distilled
|
|
83
|
+
from someone's tone reviews tone.
|
|
84
|
+
|
|
85
|
+
### Step 2 — scaffold the package, recording the source
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
keryx skills create "<short target>" \
|
|
89
|
+
--module review \
|
|
90
|
+
--name <reviewer-name> \
|
|
91
|
+
--note "<one line: what this reviewer is for>" \
|
|
92
|
+
--origin <path to the source file>
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Three fields, three different jobs, and mixing them is the recorded failure mode:
|
|
96
|
+
|
|
97
|
+
- `<short target>` is a **routing key** — a path, a symbol, or a short concept.
|
|
98
|
+
`keryx skills route` matches queries against it. Never a sentence.
|
|
99
|
+
- `--note` is the prose. It renders under Purpose and touches nothing that routes.
|
|
100
|
+
- `--origin` is the source file's path, stored verbatim and hashed. This is what
|
|
101
|
+
makes the next question answerable.
|
|
102
|
+
|
|
103
|
+
**Always pass `--origin` when a source file exists.** The source is maintained
|
|
104
|
+
somewhere else and will move on; without the hash, a reviewer built from last
|
|
105
|
+
month's version reads as current forever, and nobody finds out until its findings
|
|
106
|
+
disagree with the standard it claims to encode. With it,
|
|
107
|
+
`keryx review reviewers` reports `drift: changed` the moment the file differs.
|
|
108
|
+
|
|
109
|
+
Quote the path if it starts with `~` and you want it stored that way; an
|
|
110
|
+
unquoted `~` is expanded by the shell before keryx sees it. Either is fine —
|
|
111
|
+
both resolve — but the stored form is what a human reads later.
|
|
112
|
+
|
|
113
|
+
### Step 3 — write the reviewer against the orchestrated contract
|
|
114
|
+
|
|
115
|
+
The scaffold is a generic entity-skill template. Replace its body. A reviewer
|
|
116
|
+
that does not conform is handled by the Sub-Agent Report Quality Gate exactly as
|
|
117
|
+
a bundled one would be — local authorship is not evidence.
|
|
118
|
+
|
|
119
|
+
Required, all of it in `SKILL.md`:
|
|
120
|
+
|
|
121
|
+
- **Scope** — what this reviewer owns, and explicitly what it does not. Name the
|
|
122
|
+
neighbouring reviewers that own the excluded parts. A lane that does not say
|
|
123
|
+
where it stops duplicates three others.
|
|
124
|
+
- **Checklist** — the method pile from Step 1, as checks that can be performed.
|
|
125
|
+
- **Severity** — do **not** write a rubric. Point at
|
|
126
|
+
`review-orchestrator/SKILL.md` → **Severity (canonical)** and add one table
|
|
127
|
+
saying where this reviewer's recurring conditions land under it. Ten private
|
|
128
|
+
rubrics feeding one sort produce a ranking that means ten things at once.
|
|
129
|
+
- **Shared laws** — copy the three verbatim from the orchestrator: no
|
|
130
|
+
unreproducible harm claim above `info`, never flag the theoretical, one finding
|
|
131
|
+
per class.
|
|
132
|
+
- **Class scope** — `blocker` and `major` carry every site holding the shape and
|
|
133
|
+
the enumeration method that found them.
|
|
134
|
+
- **Orchestrated Review Contract** — return `REVIEW_RESULT` per
|
|
135
|
+
`reviewer-finding.schema.json`, with a finding-id prefix of your own.
|
|
136
|
+
|
|
137
|
+
If the source's method needs a command to be worth anything — a mutation, a
|
|
138
|
+
measurement, a probe — say so as an iron law, and say what the finding is worth
|
|
139
|
+
without it. A method nobody runs is a preference.
|
|
140
|
+
|
|
141
|
+
### Step 4 — de-personalise
|
|
142
|
+
|
|
143
|
+
Keep the method. Drop the person.
|
|
144
|
+
|
|
145
|
+
Strip names and handles, catchphrases, verdict vocabulary, forms of address, and
|
|
146
|
+
anything whose meaning depends on knowing the author. A rule that reads as one
|
|
147
|
+
person's taste will be followed as taste; the same rule stated as a procedure
|
|
148
|
+
with a stated reason will be followed as a procedure.
|
|
149
|
+
|
|
150
|
+
This is not politeness, it is transferability, and keryx enforces the same line
|
|
151
|
+
on its shipped tree: `bundled-eval.ts` fails a bundled skill that names the
|
|
152
|
+
reviewer it was learned from or reuses their phrases. Project-skills are not
|
|
153
|
+
scanned by that check — which makes this step your responsibility rather than
|
|
154
|
+
the gate's.
|
|
155
|
+
|
|
156
|
+
For every rule you keep, write the **reason** beside it. A reason survives being
|
|
157
|
+
transplanted into a codebase the author never saw; an assertion does not.
|
|
158
|
+
|
|
159
|
+
### Step 5 — verify, and confirm the orchestrator sees it
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
keryx skills verify review/<reviewer-name>
|
|
163
|
+
keryx review reviewers
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
The second is the one that matters: it is the same call
|
|
167
|
+
`review-orchestrator` makes, so its output is proof the reviewer will be
|
|
168
|
+
dispatched rather than a hope. Check the row shows your reviewer with
|
|
169
|
+
`drift: clean`.
|
|
170
|
+
|
|
171
|
+
Then say, in your reply, which of the three piles from Step 1 you kept, which you
|
|
172
|
+
dropped, and what you could not verify against this project.
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## Iron Laws
|
|
177
|
+
|
|
178
|
+
1. **`--origin` whenever a source file exists.** A reviewer built from a file
|
|
179
|
+
nobody can trace back is a reviewer nobody can update.
|
|
180
|
+
2. **The target is a routing key, the note is the prose.** A sentence in the
|
|
181
|
+
target produces a skill that matches no query and verifies as permanently
|
|
182
|
+
stale. This is a recorded failure, not a hypothetical.
|
|
183
|
+
3. **No private severity rubric.** Point at the canonical one.
|
|
184
|
+
4. **Drop the persona, keep the method, state the reason.**
|
|
185
|
+
5. **Do not claim the reviewer is wired until `keryx review reviewers` shows
|
|
186
|
+
it.** Creating files is not registration, and registration is not discovery.
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## Refreshing a reviewer whose source moved on
|
|
191
|
+
|
|
192
|
+
`keryx review reviewers` reporting `drift: changed` means the source file differs
|
|
193
|
+
from what was imported. It does **not** mean the reviewer is wrong.
|
|
194
|
+
|
|
195
|
+
Re-read the source, diff it against what the skill encodes, and then decide per
|
|
196
|
+
change: fold it in, or record in the skill why this project deliberately differs.
|
|
197
|
+
Re-run Step 2's command with the same `--name` to re-record the hash once the
|
|
198
|
+
skill matches the source again.
|
|
199
|
+
|
|
200
|
+
A deliberate divergence that is written down is a decision. The same divergence
|
|
201
|
+
undocumented is drift that will be silently "fixed" by whoever refreshes next.
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
205
|
+
## Scope Boundaries
|
|
206
|
+
|
|
207
|
+
| Concern | This skill | Use instead |
|
|
208
|
+
|---|---|---|
|
|
209
|
+
| Create a project-local reviewer | YES | — |
|
|
210
|
+
| Refresh one whose origin drifted | YES | — |
|
|
211
|
+
| Create an entity/module project-skill | NO | `entity-skill-creator` |
|
|
212
|
+
| Change a reviewer keryx ships | NO | edit `src/gdskills/bundled/skills/review/` and open a PR |
|
|
213
|
+
| Update a skill from review findings | NO | `entity-skill-learner`, `keryx skills learn` |
|
|
214
|
+
| Decide which reviewers a round dispatches | NO | `review-orchestrator` |
|
|
@@ -1,47 +1,353 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: code-verifier
|
|
3
|
-
|
|
3
|
+
model_tier: light
|
|
4
|
+
description: "Use when running a full quality gate after implementation — lint, type-check, tests, and import validation. Mandatory step in job-orchestrator after task-implementer and after fix iterations. Use standalone when you need a structured verification report."
|
|
4
5
|
triggers:
|
|
5
6
|
- "Run verification"
|
|
6
7
|
- "Quality gate"
|
|
8
|
+
- "Check code quality"
|
|
7
9
|
- "Run lint and tests"
|
|
8
10
|
- "Verify implementation"
|
|
11
|
+
- "Run checks"
|
|
9
12
|
metadata:
|
|
10
13
|
author: "MrCipherSmith"
|
|
11
14
|
version: "1.0.0"
|
|
12
15
|
category: "verification"
|
|
16
|
+
agent_worthy: true
|
|
13
17
|
compatible_harnesses: "cursor,codex,zed,opencode"
|
|
14
18
|
license: "MIT"
|
|
15
19
|
---
|
|
16
20
|
|
|
17
21
|
# Code Verifier
|
|
18
22
|
|
|
19
|
-
|
|
23
|
+
## Purpose
|
|
20
24
|
|
|
21
|
-
|
|
25
|
+
Runs the full quality gate for a project: lint, type-check, tests, and import validation. Provides a structured, parseable result that the orchestrator uses to decide whether to proceed or trigger a fix loop.
|
|
22
26
|
|
|
23
|
-
|
|
24
|
-
1. Detect PM and tooling (bun/npm/pnpm/yarn/python/go)
|
|
25
|
-
2. Run lint (ESLint/Biome/ruff)
|
|
26
|
-
3. Run type-check (tsc --noEmit / mypy / pyright)
|
|
27
|
-
4. Run tests (vitest/jest/pytest/go test)
|
|
28
|
-
5. Check circular imports (madge, if available)
|
|
29
|
-
6. Classify findings by severity, determine gate
|
|
30
|
-
7. Emit VERIFICATION_RESULT
|
|
27
|
+
**Distinct from `task-implementer` Phase 5:** task-implementer does inline self-verification during implementation. `code-verifier` is an independent gate that runs after all tasks in a wave are complete — giving a clean, consolidated view of the whole diff, not per-task.
|
|
31
28
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
29
|
+
**Input:** Codebase path + worktree path + scope (changed files or full project)
|
|
30
|
+
**Output:** `VERIFICATION_RESULT` structured report — gate status (pass/fail), per-check results, actionable findings
|
|
31
|
+
|
|
32
|
+
## When to Use
|
|
33
|
+
|
|
34
|
+
- Dispatched by `job-orchestrator` after each task-implementer wave (mandatory)
|
|
35
|
+
- Dispatched by `job-orchestrator` after each fix iteration
|
|
36
|
+
- Run standalone: "verify my code", "run quality gate", "/code-verifier"
|
|
37
|
+
- Any time you need a reproducible, structured view of project health
|
|
38
|
+
|
|
39
|
+
## Architecture: 4 Phases
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
Phase 1: DETECT → Auto-detect stack, tooling, commands
|
|
43
|
+
Phase 2: RUN → Execute lint → type-check → tests → import-check
|
|
44
|
+
Phase 3: ANALYZE → Parse outputs, classify findings by severity
|
|
45
|
+
Phase 4: REPORT → Emit VERIFICATION_RESULT
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Workflow
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
Code Verifier Progress:
|
|
54
|
+
- [ ] Phase 1: Detect stack and tooling
|
|
55
|
+
- [ ] Phase 2: Run verification checks
|
|
56
|
+
- [ ] Phase 3: Analyze and classify findings
|
|
57
|
+
- [ ] Phase 4: Report results
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
### Phase 1: DETECT
|
|
63
|
+
|
|
64
|
+
Auto-detect the project stack and available verification tools.
|
|
65
|
+
|
|
66
|
+
**1.1 Package manager and runner:**
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
cd <codebase_path>
|
|
70
|
+
|
|
71
|
+
if [ -f bun.lockb ]; then PM=bun; RUNNER="bun run"
|
|
72
|
+
elif [ -f pnpm-lock.yaml ]; then PM=pnpm; RUNNER="pnpm run"
|
|
73
|
+
elif [ -f yarn.lock ]; then PM=yarn; RUNNER="yarn"
|
|
74
|
+
elif [ -f package-lock.json ]; then PM=npm; RUNNER="npm run"
|
|
75
|
+
elif [ -f pyproject.toml ] || [ -f requirements.txt ]; then PM=python; RUNNER=""
|
|
76
|
+
elif [ -f go.mod ]; then PM=go; RUNNER=""
|
|
77
|
+
else PM=unknown; RUNNER=""
|
|
78
|
+
fi
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
**1.2 Detect available check commands:**
|
|
82
|
+
|
|
83
|
+
| Check | How to detect | Command |
|
|
84
|
+
|---|---|---|
|
|
85
|
+
| Lint | `package.json` has `"lint"` script | `$RUNNER lint` |
|
|
86
|
+
| Lint (auto) | `eslint.config.*` or `.eslintrc*` present | `npx eslint . --max-warnings 0` |
|
|
87
|
+
| Biome | `biome.json` present | `npx biome check .` |
|
|
88
|
+
| Type-check | `package.json` has `"type-check"` or `"typecheck"` script | `$RUNNER type-check` |
|
|
89
|
+
| Type-check (auto) | `tsconfig.json` present | `npx tsc --noEmit` |
|
|
90
|
+
| Tests | `package.json` has `"test"` script | `$RUNNER test --run` (vitest) or `$RUNNER test` |
|
|
91
|
+
| pytest | `pytest` in `pyproject.toml` or `requirements.txt` | `pytest --tb=short -q` |
|
|
92
|
+
| Go tests | `go.mod` present | `go test ./...` |
|
|
93
|
+
| Circular imports | `madge` in devDependencies | `npx madge --circular src/` |
|
|
94
|
+
|
|
95
|
+
**1.3 Determine scope:**
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
IF scope = "changed" (default when dispatched by orchestrator):
|
|
99
|
+
FILES = git diff --name-only <base_branch>...HEAD
|
|
100
|
+
Run tests only for files related to changed code
|
|
101
|
+
Run lint only on changed files: npx eslint <changed_files>
|
|
102
|
+
Run type-check on full project (tsc doesn't support file-level scope)
|
|
103
|
+
|
|
104
|
+
IF scope = "full":
|
|
105
|
+
Run all checks on full project
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
**Output of Phase 1:**
|
|
109
|
+
```
|
|
110
|
+
TOOLING:
|
|
111
|
+
pm: bun | pnpm | yarn | npm | python | go | unknown
|
|
112
|
+
runner: "bun run" | ...
|
|
113
|
+
checks_available: [lint, type-check, tests, circular-imports]
|
|
114
|
+
checks_skipped: [<reason>]
|
|
115
|
+
scope: changed | full
|
|
116
|
+
changed_files: [<paths>]
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
### Phase 2: RUN
|
|
122
|
+
|
|
123
|
+
Execute each available check in order. Capture full output.
|
|
124
|
+
|
|
125
|
+
**Execution order:** lint → type-check → tests → import-check
|
|
126
|
+
|
|
127
|
+
**Do NOT abort early** — run all checks even if one fails. The orchestrator needs the complete picture.
|
|
128
|
+
|
|
129
|
+
**2.1 Lint:**
|
|
130
|
+
```bash
|
|
131
|
+
# Changed files only (faster, more actionable)
|
|
132
|
+
npx eslint <changed_files> --format=json --max-warnings 0
|
|
133
|
+
# OR if lint script exists:
|
|
134
|
+
$RUNNER lint
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Capture:
|
|
138
|
+
- Exit code (0 = pass, non-zero = fail)
|
|
139
|
+
- Number of errors and warnings
|
|
140
|
+
- Per-file error list (file path, line, column, rule, message)
|
|
141
|
+
|
|
142
|
+
**2.2 Type-check:**
|
|
143
|
+
```bash
|
|
144
|
+
npx tsc --noEmit 2>&1
|
|
145
|
+
# OR:
|
|
146
|
+
$RUNNER type-check
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
Capture:
|
|
150
|
+
- Exit code
|
|
151
|
+
- Number of errors
|
|
152
|
+
- Per-error: file, line, column, message, TS error code
|
|
153
|
+
|
|
154
|
+
**2.3 Tests:**
|
|
155
|
+
```bash
|
|
156
|
+
$RUNNER test --run 2>&1 # vitest
|
|
157
|
+
# OR: npx jest --ci 2>&1
|
|
158
|
+
# OR: pytest --tb=short -q 2>&1
|
|
159
|
+
# OR: go test ./... 2>&1
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
Capture:
|
|
163
|
+
- Exit code
|
|
164
|
+
- Tests passed / failed / skipped counts
|
|
165
|
+
- Per-failure: test name, file, error message, stack (first 5 lines)
|
|
166
|
+
|
|
167
|
+
**2.4 Circular import check (if madge available):**
|
|
168
|
+
```bash
|
|
169
|
+
npx madge --circular --extensions ts,tsx src/ 2>&1
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Capture:
|
|
173
|
+
- Exit code
|
|
174
|
+
- List of circular chains (if any)
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
### Phase 3: ANALYZE
|
|
179
|
+
|
|
180
|
+
Parse raw outputs into structured findings. Classify by severity.
|
|
181
|
+
|
|
182
|
+
**3.1 Severity classification:**
|
|
183
|
+
|
|
184
|
+
| Finding | Severity |
|
|
185
|
+
|---|---|
|
|
186
|
+
| Type error | CRITICAL |
|
|
187
|
+
| Test failure | CRITICAL |
|
|
188
|
+
| ESLint error (not warning) | HIGH |
|
|
189
|
+
| Circular import | HIGH |
|
|
190
|
+
| ESLint warning | LOW |
|
|
191
|
+
| Skipped test | INFO |
|
|
192
|
+
|
|
193
|
+
**3.2 Gate decision:**
|
|
194
|
+
|
|
195
|
+
```
|
|
196
|
+
GATE = PASS
|
|
197
|
+
IF any CRITICAL findings → GATE = FAIL (blocks proceed)
|
|
198
|
+
IF any HIGH findings → GATE = FAIL (blocks proceed)
|
|
199
|
+
IF only LOW/INFO findings → GATE = PASS_WITH_WARNINGS
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
**3.3 Actionable finding format:**
|
|
203
|
+
|
|
204
|
+
Each finding must include enough context for `task-implementer` (fix mode) to resolve it without re-reading the full output:
|
|
205
|
+
|
|
206
|
+
```
|
|
207
|
+
{
|
|
208
|
+
severity: CRITICAL | HIGH | LOW | INFO,
|
|
209
|
+
check: lint | type-check | test | circular-import,
|
|
210
|
+
file: <path>,
|
|
211
|
+
line: <N> | null,
|
|
212
|
+
column: <N> | null,
|
|
213
|
+
rule: <ESLint rule or TS error code> | null,
|
|
214
|
+
message: <error text>,
|
|
215
|
+
suggestion: <optional fix hint>
|
|
216
|
+
}
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
---
|
|
220
|
+
|
|
221
|
+
### Phase 4: REPORT
|
|
222
|
+
|
|
223
|
+
Emit the structured `VERIFICATION_RESULT` as the final message.
|
|
35
224
|
|
|
36
|
-
## Output
|
|
37
225
|
```
|
|
38
226
|
VERIFICATION_RESULT:
|
|
39
227
|
gate: PASS | PASS_WITH_WARNINGS | FAIL
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
228
|
+
scope: changed | full
|
|
229
|
+
|
|
230
|
+
checks:
|
|
231
|
+
lint:
|
|
232
|
+
status: pass | fail | skipped
|
|
233
|
+
errors: <N>
|
|
234
|
+
warnings: <N>
|
|
235
|
+
command_used: "<command>"
|
|
236
|
+
|
|
237
|
+
type_check:
|
|
238
|
+
status: pass | fail | skipped
|
|
239
|
+
errors: <N>
|
|
240
|
+
command_used: "<command>"
|
|
241
|
+
|
|
242
|
+
tests:
|
|
243
|
+
status: pass | fail | skipped
|
|
244
|
+
passed: <N>
|
|
245
|
+
failed: <N>
|
|
246
|
+
skipped: <N>
|
|
247
|
+
command_used: "<command>"
|
|
248
|
+
|
|
249
|
+
circular_imports:
|
|
250
|
+
status: pass | fail | skipped
|
|
251
|
+
cycles: <N>
|
|
252
|
+
|
|
253
|
+
findings:
|
|
254
|
+
- severity: CRITICAL
|
|
255
|
+
check: type-check
|
|
256
|
+
file: src/services/UserService.ts
|
|
257
|
+
line: 42
|
|
258
|
+
rule: TS2345
|
|
259
|
+
message: "Argument of type 'string' is not assignable to parameter of type 'number'"
|
|
260
|
+
- severity: HIGH
|
|
261
|
+
check: lint
|
|
262
|
+
file: src/components/Form.tsx
|
|
263
|
+
line: 18
|
|
264
|
+
rule: "no-unused-vars"
|
|
265
|
+
message: "'value' is defined but never used"
|
|
266
|
+
|
|
267
|
+
summary: "<1-2 sentence human-readable summary>"
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
**STATUS reporting:**
|
|
271
|
+
|
|
272
|
+
```
|
|
273
|
+
STATUS: DONE — gate PASS or PASS_WITH_WARNINGS, report follows
|
|
274
|
+
STATUS: DONE_WITH_CONCERNS — PASS_WITH_WARNINGS with notable warnings
|
|
275
|
+
STATUS: BLOCKED — could not run checks (missing tooling, wrong directory)
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
> If `gate: FAIL` → STATUS is still `DONE` (the gate result, not the skill's execution). The orchestrator reads `gate: FAIL` and decides to trigger fix.
|
|
279
|
+
|
|
280
|
+
---
|
|
43
281
|
|
|
44
|
-
|
|
282
|
+
## Integration with job-orchestrator
|
|
283
|
+
|
|
284
|
+
The orchestrator dispatches `code-verifier` at two points:
|
|
285
|
+
|
|
286
|
+
**After task-implementer wave (pre-review gate):**
|
|
45
287
|
```
|
|
288
|
+
code-verifier:
|
|
289
|
+
codebase_path: <worktree_path>
|
|
290
|
+
scope: changed
|
|
291
|
+
base_branch: <base_branch from JOB_STATE>
|
|
292
|
+
→ If gate: FAIL → dispatch fix tasks → re-run code-verifier
|
|
293
|
+
→ If gate: PASS → proceed to review
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
**After fix iterations (post-fix gate):**
|
|
297
|
+
```
|
|
298
|
+
code-verifier:
|
|
299
|
+
codebase_path: <worktree_path>
|
|
300
|
+
scope: changed
|
|
301
|
+
→ If gate still FAIL after 2 iterations → report as BLOCKED, skip to report
|
|
302
|
+
→ If gate: PASS → proceed to report
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
**The orchestrator's internal "checks" step (2.8) is replaced by `code-verifier` dispatch.**
|
|
306
|
+
|
|
307
|
+
---
|
|
308
|
+
|
|
309
|
+
## Standalone Usage
|
|
310
|
+
|
|
311
|
+
```bash
|
|
312
|
+
# Run on current directory, changed files only
|
|
313
|
+
/code-verifier
|
|
314
|
+
|
|
315
|
+
# Run on specific project
|
|
316
|
+
/code-verifier --path /path/to/project
|
|
317
|
+
|
|
318
|
+
# Full project scan (not just changed files)
|
|
319
|
+
/code-verifier --scope full
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
---
|
|
323
|
+
|
|
324
|
+
## Automation Settings
|
|
325
|
+
|
|
326
|
+
| Setting | Default | Options | Description |
|
|
327
|
+
|---------|---------|---------|-------------|
|
|
328
|
+
| `scope` | `changed` | `changed` / `full` | Limit checks to changed files or run full project |
|
|
329
|
+
| `fail_on_warnings` | `false` | true/false | Treat ESLint warnings as gate failures |
|
|
330
|
+
| `include_circular` | `true` | true/false | Run circular import detection if madge available |
|
|
331
|
+
| `max_findings_reported` | `20` | 1-100 | Cap findings in report to avoid overflow |
|
|
332
|
+
|
|
333
|
+
---
|
|
334
|
+
|
|
335
|
+
## Error Handling
|
|
336
|
+
|
|
337
|
+
| Error | Action |
|
|
338
|
+
|---|---|
|
|
339
|
+
| Check command not found | Mark check as `skipped`, continue others |
|
|
340
|
+
| Wrong working directory | ABORT with `STATUS: BLOCKED` and directory hint |
|
|
341
|
+
| Command times out (>120s) | Mark check as `skipped (timeout)`, continue |
|
|
342
|
+
| Zero checks available | `STATUS: BLOCKED` — cannot verify without any tooling |
|
|
343
|
+
| Circular import tool missing | Skip silently (not installed in all projects) |
|
|
344
|
+
|
|
345
|
+
---
|
|
346
|
+
|
|
347
|
+
## Rules of Engagement
|
|
46
348
|
|
|
47
|
-
|
|
349
|
+
1. **Run ALL checks** — never abort after first failure. The orchestrator needs the full picture.
|
|
350
|
+
2. **Do NOT modify files** — this is read-only verification.
|
|
351
|
+
3. **Scope to changed files** by default — full scans are slow and produce noise.
|
|
352
|
+
4. **Be specific** in findings — include file, line, rule, message. Vague "lint failed" is not actionable.
|
|
353
|
+
5. Return `VERIFICATION_RESULT` as the **final message** to the orchestrator.
|