@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.
Files changed (144) hide show
  1. package/dist/cli.js +33409 -32626
  2. package/package.json +2 -2
  3. package/src/gdskills/bundled/rules/core/gproject-contracts.mdc +1 -1
  4. package/src/gdskills/bundled/rules/core/jobs-documentation.mdc +1 -1
  5. package/src/gdskills/bundled/rules/core/subagent-context-construction.md +1 -1
  6. package/src/gdskills/bundled/skills/core/reviewer-skill-creator/SKILL.md +214 -0
  7. package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.codex.md +326 -20
  8. package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.cursor.md +320 -22
  9. package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.opencode.md +326 -12
  10. package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.zed.md +333 -9
  11. package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.codex.md +92 -4
  12. package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.cursor.md +92 -4
  13. package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.opencode.md +92 -4
  14. package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.zed.md +92 -4
  15. package/src/gdskills/bundled/skills/orchestration/context-collector/orchestrator-prompt.md +1 -1
  16. package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.codex.md +154 -1098
  17. package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.cursor.md +154 -1098
  18. package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.opencode.md +154 -1098
  19. package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.zed.md +154 -1098
  20. package/src/gdskills/bundled/skills/orchestration/feature-analyzer/orchestrator-prompt.md +1 -1
  21. package/src/gdskills/bundled/skills/orchestration/feature-dev/SKILL.codex.md +101 -41
  22. package/src/gdskills/bundled/skills/orchestration/feature-dev/SKILL.cursor.md +101 -41
  23. package/src/gdskills/bundled/skills/orchestration/flow-orchestrator/SKILL.md +48 -1
  24. package/src/gdskills/bundled/skills/orchestration/flow-orchestrator/input-contract.schema.json +70 -4
  25. package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.codex.md +115 -49
  26. package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.cursor.md +115 -49
  27. package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.opencode.md +115 -49
  28. package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.zed.md +115 -49
  29. package/src/gdskills/bundled/skills/orchestration/issue-analyzer/orchestrator-prompt.md +1 -1
  30. package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.codex.md +15 -6
  31. package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.cursor.md +15 -6
  32. package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.opencode.md +15 -6
  33. package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.zed.md +15 -6
  34. package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.codex.md +1 -1
  35. package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.cursor.md +1 -1
  36. package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.md +1 -1
  37. package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.opencode.md +1 -1
  38. package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.zed.md +1 -1
  39. package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.codex.md +300 -55
  40. package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.cursor.md +300 -55
  41. package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.md +120 -37
  42. package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.opencode.md +300 -55
  43. package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.zed.md +300 -55
  44. package/src/gdskills/bundled/skills/orchestration/task-implementer/input-contract.schema.json +56 -14
  45. package/src/gdskills/bundled/skills/orchestration/task-implementer/orchestrator-prompt.md +50 -23
  46. package/src/gdskills/bundled/skills/orchestration/task-implementer/output-contract.schema.json +6 -2
  47. package/src/gdskills/bundled/skills/orchestration/task-implementer/task-request.template.md +18 -12
  48. package/src/gdskills/bundled/skills/planning/brainstorm/SKILL.codex.md +1 -1
  49. package/src/gdskills/bundled/skills/planning/brainstorm/SKILL.cursor.md +1 -1
  50. package/src/gdskills/bundled/skills/planning/consistency-checker/SKILL.codex.md +169 -10
  51. package/src/gdskills/bundled/skills/planning/consistency-checker/SKILL.cursor.md +169 -10
  52. package/src/gdskills/bundled/skills/planning/consistency-checker/SKILL.md +1 -1
  53. package/src/gdskills/bundled/skills/planning/interview/SKILL.codex.md +7 -1
  54. package/src/gdskills/bundled/skills/planning/interview/SKILL.cursor.md +7 -1
  55. package/src/gdskills/bundled/skills/planning/interviewer/SKILL.codex.md +7 -1
  56. package/src/gdskills/bundled/skills/planning/interviewer/SKILL.cursor.md +7 -1
  57. package/src/gdskills/bundled/skills/planning/patterns-researcher/SKILL.codex.md +216 -10
  58. package/src/gdskills/bundled/skills/planning/patterns-researcher/SKILL.cursor.md +216 -10
  59. package/src/gdskills/bundled/skills/planning/patterns-researcher/SKILL.md +1 -1
  60. package/src/gdskills/bundled/skills/planning/planner/SKILL.codex.md +169 -10
  61. package/src/gdskills/bundled/skills/planning/planner/SKILL.cursor.md +169 -10
  62. package/src/gdskills/bundled/skills/planning/planner/SKILL.md +1 -1
  63. package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.codex.md +2 -2
  64. package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.cursor.md +2 -2
  65. package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.opencode.md +2 -2
  66. package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.zed.md +2 -2
  67. package/src/gdskills/bundled/skills/planning/problem-definer/SKILL.codex.md +134 -10
  68. package/src/gdskills/bundled/skills/planning/problem-definer/SKILL.cursor.md +134 -10
  69. package/src/gdskills/bundled/skills/planning/problem-definer/SKILL.md +1 -1
  70. package/src/gdskills/bundled/skills/planning/project-discovery/SKILL.codex.md +146 -10
  71. package/src/gdskills/bundled/skills/planning/project-discovery/SKILL.cursor.md +146 -10
  72. package/src/gdskills/bundled/skills/planning/project-discovery/SKILL.md +1 -1
  73. package/src/gdskills/bundled/skills/planning/spec-writer/SKILL.codex.md +211 -10
  74. package/src/gdskills/bundled/skills/planning/spec-writer/SKILL.cursor.md +211 -10
  75. package/src/gdskills/bundled/skills/planning/spec-writer/SKILL.md +1 -1
  76. package/src/gdskills/bundled/skills/planning/stack-advisor/SKILL.codex.md +162 -10
  77. package/src/gdskills/bundled/skills/planning/stack-advisor/SKILL.cursor.md +162 -10
  78. package/src/gdskills/bundled/skills/planning/stack-advisor/SKILL.md +1 -1
  79. package/src/gdskills/bundled/skills/platform/claude-md-management/SKILL.codex.md +1 -1
  80. package/src/gdskills/bundled/skills/platform/claude-md-management/SKILL.cursor.md +1 -1
  81. package/src/gdskills/bundled/skills/platform/hookify/SKILL.codex.md +1 -1
  82. package/src/gdskills/bundled/skills/platform/hookify/SKILL.cursor.md +1 -1
  83. package/src/gdskills/bundled/skills/quality/changelog/SKILL.codex.md +1 -1
  84. package/src/gdskills/bundled/skills/quality/changelog/SKILL.cursor.md +1 -1
  85. package/src/gdskills/bundled/skills/quality/commit/SKILL.codex.md +1 -1
  86. package/src/gdskills/bundled/skills/quality/commit/SKILL.cursor.md +1 -1
  87. package/src/gdskills/bundled/skills/quality/db-migrate/SKILL.codex.md +1 -1
  88. package/src/gdskills/bundled/skills/quality/db-migrate/SKILL.cursor.md +1 -1
  89. package/src/gdskills/bundled/skills/quality/dependency-update/SKILL.codex.md +1 -1
  90. package/src/gdskills/bundled/skills/quality/dependency-update/SKILL.cursor.md +1 -1
  91. package/src/gdskills/bundled/skills/quality/deploy/SKILL.codex.md +1 -1
  92. package/src/gdskills/bundled/skills/quality/deploy/SKILL.cursor.md +1 -1
  93. package/src/gdskills/bundled/skills/quality/perf-check/SKILL.codex.md +1 -1
  94. package/src/gdskills/bundled/skills/quality/perf-check/SKILL.cursor.md +1 -1
  95. package/src/gdskills/bundled/skills/quality/pr/SKILL.codex.md +1 -1
  96. package/src/gdskills/bundled/skills/quality/pr/SKILL.cursor.md +1 -1
  97. package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.codex.md +15 -1
  98. package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.cursor.md +248 -165
  99. package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.opencode.md +15 -1
  100. package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.zed.md +359 -19
  101. package/src/gdskills/bundled/skills/quality/push/SKILL.codex.md +1 -1
  102. package/src/gdskills/bundled/skills/quality/push/SKILL.cursor.md +1 -1
  103. package/src/gdskills/bundled/skills/quality/security-audit/SKILL.codex.md +1 -1
  104. package/src/gdskills/bundled/skills/quality/security-audit/SKILL.cursor.md +1 -1
  105. package/src/gdskills/bundled/skills/quality/test-gen/SKILL.codex.md +1 -1
  106. package/src/gdskills/bundled/skills/quality/test-gen/SKILL.cursor.md +1 -1
  107. package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.codex.md +299 -24
  108. package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.cursor.md +296 -31
  109. package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.opencode.md +309 -18
  110. package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.zed.md +312 -17
  111. package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.codex.md +29 -30
  112. package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.cursor.md +29 -30
  113. package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.opencode.md +29 -30
  114. package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.zed.md +29 -30
  115. package/src/gdskills/bundled/skills/review/code-learned-review/SKILL.codex.md +21 -30
  116. package/src/gdskills/bundled/skills/review/code-learned-review/SKILL.cursor.md +21 -30
  117. package/src/gdskills/bundled/skills/review/code-learned-review/SKILL.opencode.md +21 -30
  118. package/src/gdskills/bundled/skills/review/code-learned-review/SKILL.zed.md +21 -30
  119. package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.codex.md +19 -23
  120. package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.cursor.md +19 -23
  121. package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.opencode.md +19 -23
  122. package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.zed.md +19 -23
  123. package/src/gdskills/bundled/skills/review/code-style-review/SKILL.codex.md +17 -24
  124. package/src/gdskills/bundled/skills/review/code-style-review/SKILL.cursor.md +17 -24
  125. package/src/gdskills/bundled/skills/review/code-style-review/SKILL.opencode.md +17 -24
  126. package/src/gdskills/bundled/skills/review/code-style-review/SKILL.zed.md +17 -24
  127. package/src/gdskills/bundled/skills/review/review-clean-code/SKILL.md +33 -1
  128. package/src/gdskills/bundled/skills/review/review-layout/SKILL.md +217 -0
  129. package/src/gdskills/bundled/skills/review/review-logic/SKILL.md +26 -0
  130. package/src/gdskills/bundled/skills/review/review-orchestrator/SKILL.md +320 -5
  131. package/src/gdskills/bundled/skills/review/review-pr-feedback/SKILL.md +644 -113
  132. package/src/gdskills/bundled/skills/review/review-pr-feedback/input-contract.schema.json +79 -0
  133. package/src/gdskills/bundled/skills/review/review-pr-feedback/output-contract.schema.json +375 -0
  134. package/src/gdskills/bundled/skills/review/review-testing-practices/SKILL.md +111 -1
  135. package/src/gdskills/bundled/skills/review/review-verifier/SKILL.md +25 -1
  136. package/src/gdskills/bundled/skills/planning/brainstorm/SKILL.claude.md +0 -46
  137. package/src/gdskills/bundled/skills/planning/interviewer/SKILL.claude.md +0 -94
  138. package/src/gdskills/bundled/skills/quality/changelog/SKILL.claude.md +0 -45
  139. package/src/gdskills/bundled/skills/quality/db-migrate/SKILL.claude.md +0 -40
  140. package/src/gdskills/bundled/skills/quality/dependency-update/SKILL.claude.md +0 -45
  141. package/src/gdskills/bundled/skills/quality/deploy/SKILL.claude.md +0 -42
  142. package/src/gdskills/bundled/skills/quality/perf-check/SKILL.claude.md +0 -48
  143. package/src/gdskills/bundled/skills/quality/security-audit/SKILL.claude.md +0 -40
  144. 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.72",
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:** Created by `task-implementer` during Phase 6 (one file per task). The orchestrator and wave-executor never receive full task results inline — they read these files only when a task reports `DONE_WITH_CONCERNS` or `BLOCKED`. This keeps the orchestrator context bounded.
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
 
@@ -62,7 +62,7 @@ Use this template for every subagent dispatch:
62
62
  ```
63
63
  Task({
64
64
  description: "<one-line summary for logs>",
65
- subagent_type: "general",
65
+ subagent_type: "general-purpose",
66
66
  prompt: |
67
67
  ## Task
68
68
  <Exactly what to do — no ambiguity>
@@ -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
- description: "Full quality gate: lint, type-check, tests, circular imports. Mandatory post-implementation step in job-orchestrator. Use when: verifying code after implementation, running quality gate before review, checking code health standalone."
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
- Full quality gate: lint → type-check → tests → circular imports.
23
+ ## Purpose
20
24
 
21
- **Position:** task-implementer → **code-verifier** → review
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
- ## Steps
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
- ## Gate
33
- - CRITICAL (type errors, test failures) or HIGH (lint errors, cycles) → GATE: FAIL
34
- - LOW only → GATE: PASS_WITH_WARNINGS
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
- checks: { lint, type_check, tests, circular_imports }
41
- findings: [{ severity, check, file, line, rule, message }]
42
- summary: "..."
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
- STATUS: DONE
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
- Full spec: `.metaproject/skills/gdskills/orchestration/code-verifier/SKILL.md`
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.