@mrciphersmith/keryx 0.2.70 → 0.2.72

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 (192) hide show
  1. package/dist/cli.js +25237 -17483
  2. package/docs/README.md +54 -0
  3. package/docs/requirements/shared-agent-context/README.md +104 -0
  4. package/package.json +3 -2
  5. package/src/gdskills/bundled/rules/core/code-review-learned-profile.mdc +81 -0
  6. package/src/gdskills/bundled/rules/core/jobs-documentation.mdc +1 -1
  7. package/src/gdskills/bundled/rules/core/model-selection.mdc +184 -31
  8. package/src/gdskills/bundled/rules/core/review-strict-profile.mdc +8 -4
  9. package/src/gdskills/bundled/rules/core/skills-storage-workflow.mdc +36 -0
  10. package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.codex.md +1 -1
  11. package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.cursor.md +1 -1
  12. package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.md +2 -1
  13. package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.opencode.md +1 -1
  14. package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.zed.md +1 -1
  15. package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.codex.md +3 -3
  16. package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.cursor.md +3 -3
  17. package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.md +3 -3
  18. package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.opencode.md +3 -3
  19. package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.zed.md +3 -3
  20. package/src/gdskills/bundled/skills/orchestration/context-collector/orchestrator-prompt.md +2 -2
  21. package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.codex.md +4 -4
  22. package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.cursor.md +4 -4
  23. package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.md +4 -4
  24. package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.opencode.md +4 -4
  25. package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.zed.md +4 -4
  26. package/src/gdskills/bundled/skills/orchestration/feature-dev/SKILL.codex.md +2 -2
  27. package/src/gdskills/bundled/skills/orchestration/feature-dev/SKILL.cursor.md +2 -2
  28. package/src/gdskills/bundled/skills/orchestration/feature-dev/SKILL.md +3 -3
  29. package/src/gdskills/bundled/skills/orchestration/flow-orchestrator/SKILL.md +80 -21
  30. package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.codex.md +1 -1
  31. package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.cursor.md +1 -1
  32. package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.md +1 -1
  33. package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.opencode.md +1 -1
  34. package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.zed.md +1 -1
  35. package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.codex.md +2 -2
  36. package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.cursor.md +2 -2
  37. package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.md +3 -2
  38. package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.opencode.md +2 -2
  39. package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.zed.md +2 -2
  40. package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.codex.md +997 -509
  41. package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.cursor.md +997 -509
  42. package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.md +968 -513
  43. package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.opencode.md +997 -509
  44. package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.zed.md +997 -509
  45. package/src/gdskills/bundled/skills/orchestration/job-orchestrator/input-contract.schema.json +38 -28
  46. package/src/gdskills/bundled/skills/orchestration/job-orchestrator/orchestrator-prompt.md +98 -66
  47. package/src/gdskills/bundled/skills/orchestration/job-orchestrator/output-contract.schema.json +27 -5
  48. package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.codex.md +20 -2
  49. package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.cursor.md +20 -2
  50. package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.md +21 -2
  51. package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.opencode.md +20 -2
  52. package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.zed.md +20 -2
  53. package/src/gdskills/bundled/skills/orchestration/task-implementer/input-contract.schema.json +1 -1
  54. package/src/gdskills/bundled/skills/planning/autodoc-analyst/SKILL.md +2 -1
  55. package/src/gdskills/bundled/skills/planning/autodoc-architect/SKILL.md +3 -1
  56. package/src/gdskills/bundled/skills/planning/autodoc-assembler/SKILL.md +2 -1
  57. package/src/gdskills/bundled/skills/planning/autodoc-orchestrator/SKILL.md +2 -1
  58. package/src/gdskills/bundled/skills/planning/autodoc-scanner/SKILL.md +2 -1
  59. package/src/gdskills/bundled/skills/planning/autodoc-writer/SKILL.md +2 -1
  60. package/src/gdskills/bundled/skills/planning/brainstorm/SKILL.codex.md +1 -1
  61. package/src/gdskills/bundled/skills/planning/brainstorm/SKILL.cursor.md +1 -1
  62. package/src/gdskills/bundled/skills/planning/brainstorm/SKILL.md +1 -1
  63. package/src/gdskills/bundled/skills/planning/consistency-checker/SKILL.codex.md +1 -1
  64. package/src/gdskills/bundled/skills/planning/consistency-checker/SKILL.cursor.md +1 -1
  65. package/src/gdskills/bundled/skills/planning/consistency-checker/SKILL.md +2 -1
  66. package/src/gdskills/bundled/skills/planning/docpack-orchestrator/SKILL.md +1 -1
  67. package/src/gdskills/bundled/skills/planning/docpack-review/SKILL.md +1 -1
  68. package/src/gdskills/bundled/skills/planning/interview/SKILL.codex.md +1 -1
  69. package/src/gdskills/bundled/skills/planning/interview/SKILL.cursor.md +1 -1
  70. package/src/gdskills/bundled/skills/planning/interview/SKILL.md +1 -1
  71. package/src/gdskills/bundled/skills/planning/interviewer/SKILL.codex.md +1 -1
  72. package/src/gdskills/bundled/skills/planning/interviewer/SKILL.cursor.md +1 -1
  73. package/src/gdskills/bundled/skills/planning/interviewer/SKILL.md +1 -1
  74. package/src/gdskills/bundled/skills/planning/patterns-researcher/SKILL.codex.md +1 -1
  75. package/src/gdskills/bundled/skills/planning/patterns-researcher/SKILL.cursor.md +1 -1
  76. package/src/gdskills/bundled/skills/planning/patterns-researcher/SKILL.md +2 -1
  77. package/src/gdskills/bundled/skills/planning/planner/SKILL.codex.md +1 -1
  78. package/src/gdskills/bundled/skills/planning/planner/SKILL.cursor.md +1 -1
  79. package/src/gdskills/bundled/skills/planning/planner/SKILL.md +2 -1
  80. package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.codex.md +1 -1
  81. package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.cursor.md +1 -1
  82. package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.md +1 -1
  83. package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.opencode.md +1 -1
  84. package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.zed.md +1 -1
  85. package/src/gdskills/bundled/skills/planning/problem-definer/SKILL.codex.md +1 -1
  86. package/src/gdskills/bundled/skills/planning/problem-definer/SKILL.cursor.md +1 -1
  87. package/src/gdskills/bundled/skills/planning/problem-definer/SKILL.md +2 -1
  88. package/src/gdskills/bundled/skills/planning/project-discovery/SKILL.codex.md +1 -1
  89. package/src/gdskills/bundled/skills/planning/project-discovery/SKILL.cursor.md +1 -1
  90. package/src/gdskills/bundled/skills/planning/project-discovery/SKILL.md +2 -1
  91. package/src/gdskills/bundled/skills/planning/spec-writer/SKILL.codex.md +1 -1
  92. package/src/gdskills/bundled/skills/planning/spec-writer/SKILL.cursor.md +1 -1
  93. package/src/gdskills/bundled/skills/planning/spec-writer/SKILL.md +2 -1
  94. package/src/gdskills/bundled/skills/planning/stack-advisor/SKILL.codex.md +1 -1
  95. package/src/gdskills/bundled/skills/planning/stack-advisor/SKILL.cursor.md +1 -1
  96. package/src/gdskills/bundled/skills/planning/stack-advisor/SKILL.md +2 -1
  97. package/src/gdskills/bundled/skills/platform/claude-md-management/SKILL.codex.md +1 -1
  98. package/src/gdskills/bundled/skills/platform/claude-md-management/SKILL.cursor.md +1 -1
  99. package/src/gdskills/bundled/skills/platform/claude-md-management/SKILL.md +1 -1
  100. package/src/gdskills/bundled/skills/platform/hookify/SKILL.codex.md +1 -1
  101. package/src/gdskills/bundled/skills/platform/hookify/SKILL.cursor.md +1 -1
  102. package/src/gdskills/bundled/skills/platform/hookify/SKILL.md +1 -1
  103. package/src/gdskills/bundled/skills/quality/changelog/SKILL.codex.md +1 -1
  104. package/src/gdskills/bundled/skills/quality/changelog/SKILL.cursor.md +1 -1
  105. package/src/gdskills/bundled/skills/quality/changelog/SKILL.md +1 -1
  106. package/src/gdskills/bundled/skills/quality/commit/SKILL.codex.md +1 -1
  107. package/src/gdskills/bundled/skills/quality/commit/SKILL.cursor.md +1 -1
  108. package/src/gdskills/bundled/skills/quality/commit/SKILL.md +1 -1
  109. package/src/gdskills/bundled/skills/quality/db-migrate/SKILL.codex.md +1 -1
  110. package/src/gdskills/bundled/skills/quality/db-migrate/SKILL.cursor.md +1 -1
  111. package/src/gdskills/bundled/skills/quality/db-migrate/SKILL.md +1 -1
  112. package/src/gdskills/bundled/skills/quality/dependency-update/SKILL.codex.md +1 -1
  113. package/src/gdskills/bundled/skills/quality/dependency-update/SKILL.cursor.md +1 -1
  114. package/src/gdskills/bundled/skills/quality/dependency-update/SKILL.md +1 -1
  115. package/src/gdskills/bundled/skills/quality/deploy/SKILL.codex.md +1 -1
  116. package/src/gdskills/bundled/skills/quality/deploy/SKILL.cursor.md +1 -1
  117. package/src/gdskills/bundled/skills/quality/deploy/SKILL.md +1 -1
  118. package/src/gdskills/bundled/skills/quality/metaproject-security/SKILL.md +1 -1
  119. package/src/gdskills/bundled/skills/quality/perf-check/SKILL.codex.md +1 -1
  120. package/src/gdskills/bundled/skills/quality/perf-check/SKILL.cursor.md +1 -1
  121. package/src/gdskills/bundled/skills/quality/perf-check/SKILL.md +1 -1
  122. package/src/gdskills/bundled/skills/quality/pr/SKILL.codex.md +1 -1
  123. package/src/gdskills/bundled/skills/quality/pr/SKILL.cursor.md +1 -1
  124. package/src/gdskills/bundled/skills/quality/pr/SKILL.md +1 -1
  125. package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.codex.md +1 -1
  126. package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.cursor.md +1 -1
  127. package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.md +1 -1
  128. package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.opencode.md +1 -1
  129. package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.zed.md +1 -1
  130. package/src/gdskills/bundled/skills/quality/push/SKILL.codex.md +1 -1
  131. package/src/gdskills/bundled/skills/quality/push/SKILL.cursor.md +1 -1
  132. package/src/gdskills/bundled/skills/quality/push/SKILL.md +1 -1
  133. package/src/gdskills/bundled/skills/quality/security-audit/SKILL.codex.md +1 -1
  134. package/src/gdskills/bundled/skills/quality/security-audit/SKILL.cursor.md +1 -1
  135. package/src/gdskills/bundled/skills/quality/security-audit/SKILL.md +1 -1
  136. package/src/gdskills/bundled/skills/quality/test-gen/SKILL.codex.md +1 -1
  137. package/src/gdskills/bundled/skills/quality/test-gen/SKILL.cursor.md +1 -1
  138. package/src/gdskills/bundled/skills/quality/test-gen/SKILL.md +1 -1
  139. package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.codex.md +1 -1
  140. package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.cursor.md +1 -1
  141. package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.md +1 -1
  142. package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.opencode.md +1 -1
  143. package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.zed.md +1 -1
  144. package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.codex.md +1 -1
  145. package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.cursor.md +1 -1
  146. package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.md +3 -3
  147. package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.opencode.md +1 -1
  148. package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.zed.md +1 -1
  149. package/src/gdskills/bundled/skills/review/code-learned-review/SKILL.codex.md +252 -0
  150. package/src/gdskills/bundled/skills/review/code-learned-review/SKILL.cursor.md +252 -0
  151. package/src/gdskills/bundled/skills/review/code-learned-review/SKILL.md +243 -0
  152. package/src/gdskills/bundled/skills/review/code-learned-review/SKILL.opencode.md +252 -0
  153. package/src/gdskills/bundled/skills/review/code-learned-review/SKILL.zed.md +252 -0
  154. package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.codex.md +1 -1
  155. package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.cursor.md +1 -1
  156. package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.md +3 -2
  157. package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.opencode.md +1 -1
  158. package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.zed.md +1 -1
  159. package/src/gdskills/bundled/skills/review/code-style-review/SKILL.codex.md +1 -1
  160. package/src/gdskills/bundled/skills/review/code-style-review/SKILL.cursor.md +1 -1
  161. package/src/gdskills/bundled/skills/review/code-style-review/SKILL.md +2 -2
  162. package/src/gdskills/bundled/skills/review/code-style-review/SKILL.opencode.md +1 -1
  163. package/src/gdskills/bundled/skills/review/code-style-review/SKILL.zed.md +1 -1
  164. package/src/gdskills/bundled/skills/review/review-architecture/SKILL.md +38 -11
  165. package/src/gdskills/bundled/skills/review/review-backend/SKILL.md +49 -15
  166. package/src/gdskills/bundled/skills/review/review-clean-code/SKILL.md +50 -13
  167. package/src/gdskills/bundled/skills/review/review-core-boundaries/SKILL.md +35 -3
  168. package/src/gdskills/bundled/skills/review/review-flow-graph/SKILL.md +34 -3
  169. package/src/gdskills/bundled/skills/review/review-frontend/SKILL.md +71 -30
  170. package/src/gdskills/bundled/skills/review/review-frontend-conventions/SKILL.md +35 -4
  171. package/src/gdskills/bundled/skills/review/review-highload/SKILL.md +50 -16
  172. package/src/gdskills/bundled/skills/review/review-logic/SKILL.md +41 -13
  173. package/src/gdskills/bundled/skills/review/review-orchestrator/SKILL.md +599 -30
  174. package/src/gdskills/bundled/skills/review/review-orchestrator/reviewer-finding.schema.json +7 -0
  175. package/src/gdskills/bundled/skills/review/review-orchestrator/verification-claim.schema.json +78 -0
  176. package/src/gdskills/bundled/skills/review/review-performance/SKILL.md +44 -14
  177. package/src/gdskills/bundled/skills/review/review-pr-feedback/SKILL.md +44 -19
  178. package/src/gdskills/bundled/skills/review/review-regression/SKILL.md +185 -0
  179. package/src/gdskills/bundled/skills/review/review-security-code/SKILL.md +45 -14
  180. package/src/gdskills/bundled/skills/review/review-style/SKILL.md +27 -7
  181. package/src/gdskills/bundled/skills/review/review-testing-practices/SKILL.md +36 -4
  182. package/src/gdskills/bundled/skills/review/review-verifier/SKILL.md +276 -0
  183. package/src/gdskills/bundled/skills/shared/git-merge-base.md +1 -1
  184. package/src/gdskills/contracts/review-finding.schema.json +119 -1
  185. package/src/gdskills/contracts/subagent-dispatch.schema.json +59 -3
  186. package/src/gdskills/bundled/rules/core/code-review-b091-profile.mdc +0 -48
  187. package/src/gdskills/bundled/skills/review/code-b091-review/SKILL.codex.md +0 -209
  188. package/src/gdskills/bundled/skills/review/code-b091-review/SKILL.cursor.md +0 -209
  189. package/src/gdskills/bundled/skills/review/code-b091-review/SKILL.md +0 -208
  190. package/src/gdskills/bundled/skills/review/code-b091-review/SKILL.opencode.md +0 -209
  191. package/src/gdskills/bundled/skills/review/code-b091-review/SKILL.zed.md +0 -209
  192. package/src/gdskills/bundled/skills/review/review-strict/SKILL.md +0 -328
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  name: review-architecture
3
+ model_tier: deep
3
4
  description: |
4
5
  Use when: reviewing code for architectural violations — layer violations, dependency direction
5
6
  mistakes, module boundary coupling, SOLID principle breaches, NestJS module/provider structure,
@@ -7,7 +8,6 @@ description: |
7
8
  Triggered by: "review architecture", "check architecture", "architectural review",
8
9
  or dispatched by review-orchestrator with --architecture or --backend.
9
10
  NOT for: style/naming preferences, logic correctness bugs, or security vulnerabilities.
10
- version: "1.0.0"
11
11
  triggers:
12
12
  - "review architecture"
13
13
  - "check architecture"
@@ -19,8 +19,8 @@ metadata:
19
19
  author: "MrCipherSmith"
20
20
  version: "1.0.0"
21
21
  category: "review"
22
+ compatible_harnesses: "cursor,codex,zed,opencode,claude"
22
23
  license: "MIT"
23
- compatibility: "cursor,codex,zed,opencode,claude"
24
24
  ---
25
25
 
26
26
  # Review Architecture
@@ -211,7 +211,7 @@ Focus on **SRP** and **DIP** — the two most commonly violated in practice.
211
211
 
212
212
  ## Orchestrated Review Contract
213
213
 
214
- When dispatched by `review-orchestrator`, follow the provided `reviewer-input.schema.json` payload. Return a `REVIEW_RESULT` object compatible with `skills/review-orchestrator/reviewer-finding.schema.json`, then a concise markdown summary. Keep findings evidence-based, include concrete `suggested_fix` for every blocker/major, and return `NEEDS_CONTEXT` instead of guessing when required context is missing.
214
+ When dispatched by `review-orchestrator`, follow the provided `reviewer-input.schema.json` payload. Return a `REVIEW_RESULT` object compatible with `skills/review/review-orchestrator/reviewer-finding.schema.json`, then a concise markdown summary. Keep findings evidence-based, include concrete `suggested_fix` for every blocker/major, and return `NEEDS_CONTEXT` instead of guessing when required context is missing.
215
215
 
216
216
  ---
217
217
 
@@ -257,16 +257,43 @@ observation is theatre, not rigour.
257
257
  ```
258
258
  ```
259
259
 
260
- Severity guide for this reviewer:
260
+ Severity comes from **Severity (canonical)** in `review-orchestrator/SKILL.md`.
261
+ This reviewer keeps no table of its own; what follows is where its recurring
262
+ conditions land under that rubric, not a second rubric.
261
263
 
262
- | Severity | When to use |
263
- |----------|------------|
264
- | `blocker` | Circular dependency causing runtime failure; NestJS module scope mismatch causing incorrect behavior; domain importing infrastructure breaking testability entirely |
265
- | `major` | Clear layer violation (API call in component, business logic in controller); broken DIP; cross-module boundary coupling that will cause maintainability failures |
266
- | `minor` | SRP smell with clear separation path; ISP violation; component using multiple raw observables instead of computed |
267
- | `info` | Architectural opinion without clear violation; pattern that could be improved but works correctly |
264
+ | Condition | Severity | Why, under the canonical rubric |
265
+ |---|---|---|
266
+ | Circular dependency that fails at runtime (an import resolves to `undefined` on a path the change reaches) | `blocker` | Crash |
267
+ | Module scope mismatch that produces wrong data across requests | `blocker` | Data corruption |
268
+ | Layer violation — API/IO call in a component, business logic in a controller, domain importing infrastructure | `major` | A named trigger and a named outcome, but structural: not a crash, data loss, vulnerability, or missing acceptance criterion. Identical to `review-frontend`'s rule for the same condition |
269
+ | Broken DIP; cross-module coupling with a named consequence | `major` | Same |
270
+ | SRP smell with a clear separation path; ISP violation; a component reading several raw observables instead of a computed | `minor` | The code is correct; the cost is to whoever restructures it next |
271
+ | Architectural opinion with no named violation | `info` | Shared laws 1 and 2 |
272
+
273
+ A circular import that resolves cleanly is not a `blocker` — it is `minor`, and
274
+ if the concern is purely readability it belongs to `review-style`.
275
+
276
+ ## Iron Laws
277
+
278
+ ### Shared laws (every reviewer)
279
+
280
+ 1. **A claim of runtime harm with no reproducible path is `info`.** If you cannot
281
+ name the input, call, or condition that reaches the code, you have an
282
+ observation, not a finding. Report it as `info` and say what would settle it.
283
+ 2. **Never flag the theoretical.** The path you describe must exist in the code
284
+ under review. Do not report a safe API because it could be misused, or a
285
+ pattern because it is often wrong elsewhere.
286
+ 3. **One finding per class, not one per occurrence.** When the same shape appears
287
+ at several sites, report it once and list every site. Ten findings that are one
288
+ finding hide the other nine problems.
289
+
290
+ Severity levels are defined once, in `review-orchestrator/SKILL.md` →
291
+ **Severity (canonical)**. This reviewer does not restate them: `blocker` is the
292
+ four merge-blocking shapes named there and nothing else, and the `major`/`minor`
293
+ boundary is the trigger-and-outcome test.
294
+
295
+ ### Architecture laws
268
296
 
269
- Iron laws:
270
297
  - Only flag actual violations found **in the diff**, not pre-existing issues untouched by the change.
271
298
  - Every finding MUST cite a specific `file:line` from the diff.
272
299
  - Architecture opinions without a clear, named violation (layer, SOLID principle, pattern misuse) are `info` only — never `blocker` or `major`.
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  name: review-backend
3
+ model_tier: standard
3
4
  description: |
4
5
  Use when: reviewing NestJS backend changes — API design, service layer, DTO validation,
5
6
  database patterns, and TypeScript correctness. Covers "review backend", "backend review",
@@ -7,7 +8,6 @@ description: |
7
8
  NOT for: frontend patterns, MobX, React components, general security vulnerabilities
8
9
  (use review-security-code for XSS/injection/auth-bypass), or performance profiling
9
10
  (use review-performance).
10
- version: "1.0.0"
11
11
  triggers:
12
12
  - "review backend"
13
13
  - "backend review"
@@ -18,8 +18,9 @@ metadata:
18
18
  author: "MrCipherSmith"
19
19
  version: "1.0.0"
20
20
  category: "review"
21
+ compatible_harnesses: "cursor,codex,zed,opencode,claude"
22
+ stack_requires: "nestjs,prisma"
21
23
  license: "MIT"
22
- compatibility: "cursor,codex,zed,opencode,claude"
23
24
  ---
24
25
 
25
26
  # Review — Backend (NestJS / API / DB)
@@ -175,28 +176,61 @@ Only review files changed in scope. Do not comment on legacy code outside the di
175
176
  - No `as any` or unsafe casts (`as unknown as T`) without a comment explaining why
176
177
  - `@ts-ignore` / `@ts-expect-error` without explanation comment — flag as `minor`
177
178
 
179
+ **This is the one severity for this condition, repo-wide.** It was previously
180
+ `minor` here and `major` in `review-strict`, which is deleted. `minor` is what
181
+ the canonical rubric returns: a suppressed compiler error names no trigger and
182
+ no observable wrong outcome — the code does exactly what it did before the
183
+ comment was added. What it costs is the next reader, who cannot tell what was
184
+ suppressed or whether it is still needed. That is the definition of `minor`.
185
+ It becomes `major` only when you can name the input the suppressed error was
186
+ hiding and the wrong value it produces — at which point the finding is about
187
+ that bug, not about the comment.
188
+
178
189
  ---
179
190
 
180
191
  ## Iron Laws
181
192
 
182
- | Condition | Severity |
183
- |-----------|----------|
184
- | Missing DTO validation on an endpoint accepting user input | **blocker** |
185
- | `REQUEST`-scoped provider injected into `Singleton` | **blocker** |
186
- | Leaking stack trace / raw ORM error to API response | **blocker** |
187
- | Unhandled promise rejection in controller method | **blocker** |
188
- | String interpolation in raw SQL query | **blocker** |
189
- | N+1 query (relation loaded in a loop) | **major** (minimum) |
190
- | Missing transaction on multi-step atomic mutation | **major** |
191
- | Business logic in controller | **major** |
192
- | Missing pagination on unbounded list endpoint | **major** |
193
- | `NOT NULL` column added without default to populated table (migration) | **blocker** |
193
+ ### Shared laws (every reviewer)
194
+
195
+ 1. **A claim of runtime harm with no reproducible path is `info`.** If you cannot
196
+ name the input, call, or condition that reaches the code, you have an
197
+ observation, not a finding. Report it as `info` and say what would settle it.
198
+ 2. **Never flag the theoretical.** The path you describe must exist in the code
199
+ under review. Do not report a safe API because it could be misused, or a
200
+ pattern because it is often wrong elsewhere.
201
+ 3. **One finding per class, not one per occurrence.** When the same shape appears
202
+ at several sites, report it once and list every site. Ten findings that are one
203
+ finding hide the other nine problems.
204
+
205
+ Severity levels are defined once, in `review-orchestrator/SKILL.md` →
206
+ **Severity (canonical)**. This reviewer does not restate them: `blocker` is the
207
+ four merge-blocking shapes named there and nothing else, and the `major`/`minor`
208
+ boundary is the trigger-and-outcome test.
209
+
210
+ ### Backend conditions
211
+
212
+ Where this reviewer's recurring conditions land under the canonical rubric. Not a
213
+ second rubric — each `blocker` names which of the four merge-blocking shapes it
214
+ is, and a condition that cannot name one is not a `blocker`.
215
+
216
+ | Condition | Severity | Shape |
217
+ |---|---|---|
218
+ | Missing DTO validation on an endpoint accepting user input | `blocker` | Exploitable vulnerability |
219
+ | String interpolation in raw SQL query | `blocker` | Exploitable vulnerability |
220
+ | Leaking stack trace / raw ORM error to API response | `blocker` | Exploitable vulnerability (information disclosure) |
221
+ | `REQUEST`-scoped provider injected into a `Singleton` | `blocker` | Data corruption — one request's state is served to another |
222
+ | Unhandled promise rejection in a controller method | `blocker` | Crash |
223
+ | `NOT NULL` column added without a default to a populated table | `blocker` | Data loss — the migration fails or truncates |
224
+ | N+1 query (relation loaded in a loop) | `major` (minimum) | Named trigger and outcome; degradation, not an outage. Same rating as `review-highload` |
225
+ | Missing transaction on a multi-step atomic mutation | `major` — `blocker` where a partial write corrupts persisted state | The outcome decides |
226
+ | Business logic in a controller | `major` | Layer violation. Same rating as `review-architecture` |
227
+ | Missing pagination on an unbounded list endpoint | `major` — `blocker` where an attacker-reachable request exhausts memory | Degradation vs. crash/DoS |
194
228
 
195
229
  ---
196
230
 
197
231
  ## Orchestrated Review Contract
198
232
 
199
- When dispatched by `review-orchestrator`, follow the provided `reviewer-input.schema.json` payload. Return a `REVIEW_RESULT` object compatible with `skills/review-orchestrator/reviewer-finding.schema.json`, then a concise markdown summary. Keep findings evidence-based, include concrete `suggested_fix` for every blocker/major, and return `NEEDS_CONTEXT` instead of guessing when required context is missing.
233
+ When dispatched by `review-orchestrator`, follow the provided `reviewer-input.schema.json` payload. Return a `REVIEW_RESULT` object compatible with `skills/review/review-orchestrator/reviewer-finding.schema.json`, then a concise markdown summary. Keep findings evidence-based, include concrete `suggested_fix` for every blocker/major, and return `NEEDS_CONTEXT` instead of guessing when required context is missing.
200
234
 
201
235
  ---
202
236
 
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  name: review-clean-code
3
+ model_tier: standard
3
4
  description: |
4
5
  Use when: reviewing code against Clean Code principles (Uncle Bob) and SOLID at the
5
6
  function/class level — meaningful names, small functions, single level of abstraction,
@@ -9,7 +10,6 @@ description: |
9
10
  "review --clean-code", or dispatched by review-orchestrator.
10
11
  NOT for: architectural layer violations (review-architecture), naming convention formatting
11
12
  (review-style), logic correctness bugs (review-logic), or security (review-security-code).
12
- version: "1.0.0"
13
13
  triggers:
14
14
  - "review clean code"
15
15
  - "check clean code"
@@ -21,8 +21,8 @@ metadata:
21
21
  author: "MrCipherSmith"
22
22
  version: "1.0.0"
23
23
  category: "review"
24
+ compatible_harnesses: "cursor,codex,zed,opencode,claude"
24
25
  license: "MIT"
25
- compatibility: "cursor,codex,zed,opencode,claude"
26
26
  ---
27
27
 
28
28
  # Review: Clean Code + SOLID
@@ -84,9 +84,35 @@ worsens them.
84
84
 
85
85
  ## Iron Laws
86
86
 
87
+ ### Shared laws (every reviewer)
88
+
89
+ 1. **A claim of runtime harm with no reproducible path is `info`.** If you cannot
90
+ name the input, call, or condition that reaches the code, you have an
91
+ observation, not a finding. Report it as `info` and say what would settle it.
92
+ 2. **Never flag the theoretical.** The path you describe must exist in the code
93
+ under review. Do not report a safe API because it could be misused, or a
94
+ pattern because it is often wrong elsewhere.
95
+ 3. **One finding per class, not one per occurrence.** When the same shape appears
96
+ at several sites, report it once and list every site. Ten findings that are one
97
+ finding hide the other nine problems.
98
+
99
+ Severity levels are defined once, in `review-orchestrator/SKILL.md` →
100
+ **Severity (canonical)**. This reviewer does not restate them: `blocker` is the
101
+ four merge-blocking shapes named there and nothing else, and the `major`/`minor`
102
+ boundary is the trigger-and-outcome test.
103
+
104
+ ### Clean Code laws
105
+
87
106
  1. **Findings without a specific `file:line` from the diff are not valid findings.** Never cite general observations about the codebase.
88
- 2. **Max severity for a naming issue is `major`.** Pure naming never rises to `blocker` — reserved for issues that break correctness.
89
- 3. **DRY violations require at least 3 repetitions before becoming `major`.** Two occurrences can be accidental; three is a pattern.
107
+ 2. **A naming issue is `minor`.** It reaches `major` only when the name has
108
+ already produced an observable wrong outcome at a call site you can name — a
109
+ caller misusing the API because of what it is called. "A future reader might
110
+ misread it" is the maintenance cost that makes it `minor`, not a trigger.
111
+ Naming is never a `blocker`. (`review-style` carries the identical rule.)
112
+ 3. **DRY violations need at least 3 repetitions before they are worth reporting,
113
+ and they are `minor`.** Two occurrences can be accidental; three is a pattern.
114
+ Duplication is a cost to whoever edits it next, which is `minor` by the
115
+ canonical test — report it once, listing every site, per shared law 3.
90
116
  4. **SOLID opinions without a named principle and a concrete violation description are `info` only.** State the principle (e.g., SRP), the two responsibilities, and the impact.
91
117
  5. **Do not flag language idioms or framework conventions as Clean Code violations.** If it is the standard way to do something in TypeScript / NestJS / React, it is not a violation.
92
118
 
@@ -341,7 +367,7 @@ Flags:
341
367
 
342
368
  ## Orchestrated Review Contract
343
369
 
344
- When dispatched by `review-orchestrator`, follow the provided `reviewer-input.schema.json` payload. Return a `REVIEW_RESULT` object compatible with `skills/review-orchestrator/reviewer-finding.schema.json`, then a concise markdown summary. Keep findings evidence-based, include concrete `suggested_fix` for every blocker/major, and return `NEEDS_CONTEXT` instead of guessing when required context is missing.
370
+ When dispatched by `review-orchestrator`, follow the provided `reviewer-input.schema.json` payload. Return a `REVIEW_RESULT` object compatible with `skills/review/review-orchestrator/reviewer-finding.schema.json`, then a concise markdown summary. Keep findings evidence-based, include concrete `suggested_fix` for every blocker/major, and return `NEEDS_CONTEXT` instead of guessing when required context is missing.
345
371
 
346
372
  ---
347
373
 
@@ -387,14 +413,25 @@ observation is theatre, not rigour.
387
413
  ```
388
414
  ```
389
415
 
390
- Severity guide for this reviewer:
391
-
392
- | Severity | When to use |
393
- |----------|------------|
394
- | `blocker` | Swallowed exception (silent failure); constructor performing I/O that prevents testing; LSP violation breaking substitutability at runtime |
395
- | `major` | Function >40 lines; ≥4 parameters without options object; boolean flag arg; class with two distinct responsibilities; `new ConcreteService()` bypassing DI |
396
- | `minor` | Poor naming; redundant comment; magic number; 20–40 line function; minor OCP/ISP smell; log+rethrow |
397
- | `info` | Stylistic opinion; potential future issue with no current concrete violation |
416
+ Severity comes from **Severity (canonical)** in `review-orchestrator/SKILL.md`.
417
+ This reviewer keeps no table of its own; what follows is where its recurring
418
+ conditions land under that rubric, not a second rubric.
419
+
420
+ | Condition | Severity | Why, under the canonical rubric |
421
+ |---|---|---|
422
+ | Swallowed exception hiding a failed operation | `major` — `blocker` only if the caller then persists or returns wrong data | Same wording as `review-logic`, deliberately. Silent failure is wrong behaviour; corruption is a different shape |
423
+ | LSP violation that produces a wrong result or a crash at a named call site | `major`, or `blocker` on the crash/corruption outcome | The outcome decides, not the principle's name |
424
+ | Constructor performing I/O | `major` | Named trigger (constructing it) and named outcome (the I/O runs); untestable is not one of the four shapes |
425
+ | Function > 40 lines; ≥ 4 parameters without an options object; boolean flag argument; class with two distinct responsibilities; `new ConcreteService()` bypassing DI | `minor` | The code is correct. The cost is to whoever reads or edits it next — that is exactly `minor` |
426
+ | Poor naming; redundant comment; magic number; 20–40 line function; OCP/ISP smell; log-and-rethrow | `minor` | Same |
427
+ | Stylistic opinion; a future issue with no current violation | `info` | Neither trigger nor a named maintenance cost |
428
+
429
+ **Clean Code findings are `minor` by default.** A long function with a named
430
+ responsibility split is a maintenance cost, not observable wrong behaviour, and
431
+ `major` is reserved for findings that name a trigger and an outcome. This
432
+ reviewer previously called a 41-line function `major` and thereby forced
433
+ `REQUEST_CHANGES` on it; that is the exact mis-ranking the canonical rubric
434
+ exists to stop.
398
435
 
399
436
  ---
400
437
 
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  name: review-core-boundaries
3
+ model_tier: deep
3
4
  description: |
4
5
  Use when reviewing shared core/infrastructure module changes for dependency
5
6
  direction, feature-boundary leakage, abstraction stability, composition,
@@ -45,9 +46,30 @@ If a more specific module reviewer also applies, run both.
45
46
 
46
47
  ---
47
48
 
49
+ ## Iron Laws
50
+
51
+ ### Shared laws (every reviewer)
52
+
53
+ 1. **A claim of runtime harm with no reproducible path is `info`.** If you cannot
54
+ name the input, call, or condition that reaches the code, you have an
55
+ observation, not a finding. Report it as `info` and say what would settle it.
56
+ 2. **Never flag the theoretical.** The path you describe must exist in the code
57
+ under review. Do not report a safe API because it could be misused, or a
58
+ pattern because it is often wrong elsewhere.
59
+ 3. **One finding per class, not one per occurrence.** When the same shape appears
60
+ at several sites, report it once and list every site. Ten findings that are one
61
+ finding hide the other nine problems.
62
+
63
+ Severity levels are defined once, in `review-orchestrator/SKILL.md` →
64
+ **Severity (canonical)**. This reviewer does not restate them: `blocker` is the
65
+ four merge-blocking shapes named there and nothing else, and the `major`/`minor`
66
+ boundary is the trigger-and-outcome test.
67
+
68
+ ---
69
+
48
70
  ## Orchestrated Review Contract
49
71
 
50
- When dispatched by `review-orchestrator`, follow the provided `reviewer-input.schema.json` payload. Return a `REVIEW_RESULT` object compatible with `skills/review-orchestrator/reviewer-finding.schema.json`, then a concise markdown summary. Keep findings evidence-based, include concrete `suggested_fix` for every blocker/major, and return `NEEDS_CONTEXT` instead of guessing when required context is missing.
72
+ When dispatched by `review-orchestrator`, follow the provided `reviewer-input.schema.json` payload. Return a `REVIEW_RESULT` object compatible with `skills/review/review-orchestrator/reviewer-finding.schema.json`, then a concise markdown summary. Keep findings evidence-based, include concrete `suggested_fix` for every blocker/major, and return `NEEDS_CONTEXT` instead of guessing when required context is missing.
51
73
 
52
74
  ---
53
75
 
@@ -88,6 +110,16 @@ observation is theatre, not rigour.
88
110
  - **Fix**: move to domain module, invert dependency, or extract a truly shared abstraction
89
111
  ```
90
112
 
91
- Severity guidance: importing feature code into core or adding feature-specific public API is
92
- usually `major`; broad shared API breakage can be `blocker`.
113
+ Severity comes from **Severity (canonical)** in `review-orchestrator/SKILL.md`.
114
+ This reviewer keeps no rubric of its own; what follows is where its recurring
115
+ conditions land under that rubric.
116
+
117
+ | Condition | Severity | Why, under the canonical rubric |
118
+ |---|---|---|
119
+ | A core API change that breaks a named consumer at runtime | `blocker` | Crash at a named call site |
120
+ | Importing feature code into core; adding feature-specific public API to core; inverted dependency | `major` | Named trigger (the import) and named outcome (the cycle or the leak), but structural — not one of the four shapes |
121
+ | A generic helper whose names or types lean on one feature's language | `minor` | Works today; the cost is to the next module that needs it |
122
+ | A blast-radius concern with no named consumer | `info` | Shared law 1 |
123
+
124
+ "Broad blast radius" is not by itself a `blocker`. Name the consumer that breaks.
93
125
 
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  name: review-flow-graph
3
+ model_tier: standard
3
4
  description: |
4
5
  Use when reviewing generic ReactFlow or graph-surface abstraction changes:
5
6
  public graph surface, store subclassing, layout lifecycle, internal helper
@@ -71,9 +72,30 @@ baseline.
71
72
 
72
73
  ---
73
74
 
75
+ ## Iron Laws
76
+
77
+ ### Shared laws (every reviewer)
78
+
79
+ 1. **A claim of runtime harm with no reproducible path is `info`.** If you cannot
80
+ name the input, call, or condition that reaches the code, you have an
81
+ observation, not a finding. Report it as `info` and say what would settle it.
82
+ 2. **Never flag the theoretical.** The path you describe must exist in the code
83
+ under review. Do not report a safe API because it could be misused, or a
84
+ pattern because it is often wrong elsewhere.
85
+ 3. **One finding per class, not one per occurrence.** When the same shape appears
86
+ at several sites, report it once and list every site. Ten findings that are one
87
+ finding hide the other nine problems.
88
+
89
+ Severity levels are defined once, in `review-orchestrator/SKILL.md` →
90
+ **Severity (canonical)**. This reviewer does not restate them: `blocker` is the
91
+ four merge-blocking shapes named there and nothing else, and the `major`/`minor`
92
+ boundary is the trigger-and-outcome test.
93
+
94
+ ---
95
+
74
96
  ## Orchestrated Review Contract
75
97
 
76
- When dispatched by `review-orchestrator`, follow the provided `reviewer-input.schema.json` payload. Return a `REVIEW_RESULT` object compatible with `skills/review-orchestrator/reviewer-finding.schema.json`, then a concise markdown summary. Keep findings evidence-based, include concrete `suggested_fix` for every blocker/major, and return `NEEDS_CONTEXT` instead of guessing when required context is missing.
98
+ When dispatched by `review-orchestrator`, follow the provided `reviewer-input.schema.json` payload. Return a `REVIEW_RESULT` object compatible with `skills/review/review-orchestrator/reviewer-finding.schema.json`, then a concise markdown summary. Keep findings evidence-based, include concrete `suggested_fix` for every blocker/major, and return `NEEDS_CONTEXT` instead of guessing when required context is missing.
77
99
 
78
100
  ---
79
101
 
@@ -114,6 +136,15 @@ observation is theatre, not rigour.
114
136
  - **Fix**: concrete change aligned with the shared graph surface
115
137
  ```
116
138
 
117
- Severity guidance: breaking the public surface or bypassing base selection/layout lifecycle is
118
- usually `major`; performance regressions on large graphs can be `major` or `blocker`.
139
+ Severity comes from **Severity (canonical)** in `review-orchestrator/SKILL.md`.
140
+ This reviewer keeps no rubric of its own; what follows is where its recurring
141
+ conditions land under that rubric.
142
+
143
+ | Condition | Severity | Why, under the canonical rubric |
144
+ |---|---|---|
145
+ | A graph operation that hangs or exhausts memory at a stated node/edge count | `blocker` | Crash |
146
+ | Breaking the public graph surface; bypassing base selection or layout lifecycle | `major` | Named trigger and outcome; a broken contract is not one of the four shapes |
147
+ | A performance regression on large graphs, with the size that makes it a cost | `major` | Degradation, not an outage — see `review-performance` for the same boundary |
148
+ | Internal helper reaching across a boundary with no observable consequence | `minor` | Correct today; the cost is to the next editor |
149
+ | Surface concern with no named caller | `info` | Shared law 1 |
119
150
 
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  name: review-frontend
3
+ model_tier: standard
3
4
  description: "Use when a frontend review is requested, checking React component patterns, MobX state management (observer, actions, computed, reactions, lifecycle), View-Store boundaries, and TypeScript safety in changed frontend code. NOT for backend patterns, security vulnerabilities, performance bottlenecks, or cross-layer architecture."
4
5
  triggers:
5
6
  - "review frontend"
@@ -13,8 +14,9 @@ metadata:
13
14
  author: "MrCipherSmith"
14
15
  version: "1.1.0"
15
16
  category: "review"
17
+ compatible_harnesses: "cursor,codex,zed,opencode,claude"
18
+ stack_requires: "react,mobx"
16
19
  license: "MIT"
17
- compatibility: "cursor,codex,zed,opencode,claude"
18
20
  ---
19
21
 
20
22
  # Review: Frontend (React + MobX + TypeScript)
@@ -57,11 +59,42 @@ This skill consolidates what was previously split between `code-style-review` (f
57
59
 
58
60
  ## Iron Laws
59
61
 
60
- 1. **Every observable mutation outside an action or `runInAction` is at minimum a `major` finding.** No exception for "small stores" or "simple assignments".
61
- 2. **Missing `observer()` on a component that reads MobX observables is always a `blocker`.** The component will not react to state changes — this is a silent, runtime correctness bug.
62
- 3. **An API call in a component is always a `blocker`.** API/IO belongs in private store methods, not in JSX, hooks, or event handlers within the component file.
63
- 4. **`public` keyword on any class member is always an error.** The ESLint rule `@typescript-eslint/explicit-member-accessibility` with `"no-public"` forbids it.
64
- 5. **Inter-store callbacks (`onChangeX`, `handleX`, `syncX`) without `private` are always a `major`.** Ask: "Is this called from JSX?" If no — it must be `private`.
62
+ ### Shared laws (every reviewer)
63
+
64
+ 1. **A claim of runtime harm with no reproducible path is `info`.** If you cannot
65
+ name the input, call, or condition that reaches the code, you have an
66
+ observation, not a finding. Report it as `info` and say what would settle it.
67
+ 2. **Never flag the theoretical.** The path you describe must exist in the code
68
+ under review. Do not report a safe API because it could be misused, or a
69
+ pattern because it is often wrong elsewhere.
70
+ 3. **One finding per class, not one per occurrence.** When the same shape appears
71
+ at several sites, report it once and list every site. Ten findings that are one
72
+ finding hide the other nine problems.
73
+
74
+ Severity levels are defined once, in `review-orchestrator/SKILL.md` →
75
+ **Severity (canonical)**. This reviewer does not restate them: `blocker` is the
76
+ four merge-blocking shapes named there and nothing else, and the `major`/`minor`
77
+ boundary is the trigger-and-outcome test.
78
+
79
+ ### Frontend / MobX laws
80
+
81
+ These say what is **always reported**. What severity each carries is the
82
+ conditions table under Finding Format, and it is the canonical rubric applied —
83
+ not a second opinion.
84
+
85
+ 1. **Every observable mutation outside an action or `runInAction` is reported.**
86
+ No exception for "small stores" or "simple assignments".
87
+ 2. **Missing `observer()` on a component that reads MobX observables is
88
+ reported.** The component will not react to state changes — a silent runtime
89
+ correctness bug, and silence is exactly why nobody else will find it.
90
+ 3. **An API call in a component is reported.** API/IO belongs in private store
91
+ methods, not in JSX, hooks, or event handlers within the component file.
92
+ 4. **`public` on a class member is reported.** The ESLint rule
93
+ `@typescript-eslint/explicit-member-accessibility` with `"no-public"` forbids
94
+ it — so the machine already catches it, which is why it is `minor` here rather
95
+ than a merge gate.
96
+ 5. **Inter-store callbacks (`onChangeX`, `handleX`, `syncX`) without `private` are
97
+ reported.** Ask: "Is this called from JSX?" If no — it must be `private`.
65
98
 
66
99
  ---
67
100
 
@@ -114,7 +147,7 @@ Extract and note:
114
147
  - Any patterns explicitly declared as project standard — follow them, do NOT flag as violations
115
148
  - Any patterns explicitly declared as anti-patterns — flag them even if not in this skill's generic checklist
116
149
 
117
- **Resolution rule:** When a project CLAUDE.md pattern conflicts with this skill's generic checklist, the CLAUDE.md pattern wins — unless it violates an Iron Law.
150
+ **Resolution rule:** When a project CLAUDE.md pattern conflicts with this skill's generic checklist, the CLAUDE.md pattern wins — unless it violates an Iron Law. It never overrides the canonical severity rubric: a project convention decides what is reported, not how merge-blocking it is.
118
151
 
119
152
  If no CLAUDE.md is found, proceed normally. CLAUDE.md is optional and non-blocking.
120
153
 
@@ -132,7 +165,7 @@ If no CLAUDE.md is found, proceed normally. CLAUDE.md is optional and non-blocki
132
165
  - [ ] Conditional reading of observables is still observable access — `if (store.isLoaded)` triggers tracking; wrapper is required regardless of conditionality
133
166
 
134
167
  Flags:
135
- - Component reads `store.*` or `useLocalObservable` result but is not wrapped in `observer` — **blocker**
168
+ - Component reads `store.*` or `useLocalObservable` result but is not wrapped in `observer` — **major** (stale UI; not one of the four merge-blocking shapes)
136
169
  - `observer` applied inside another HOC wrapper instead of outside — **major**
137
170
 
138
171
  #### A2. MVVM Boundary (Business Logic in Store, Not Component)
@@ -143,7 +176,7 @@ Flags:
143
176
  - [ ] Computed/derived values MUST be `@computed` getters in the store, not inline derivations in the component body
144
177
 
145
178
  Flags:
146
- - `fetch()` / `axios` / `httpClient` call directly in component (hook or handler) — **blocker**
179
+ - `fetch()` / `axios` / `httpClient` call directly in component (hook or handler) — **major** (layer violation; `review-architecture` rates the same condition `major`)
147
180
  - Business logic (conditionals, transformations, validation) inside a component event handler instead of a store method — **major**
148
181
  - Derived value computed inline in component that could be a `@computed` getter — **minor**
149
182
 
@@ -157,7 +190,7 @@ Flags:
157
190
 
158
191
  Flags:
159
192
  - `useEffect` calls `store.init()` or `store.loadX()` — **major**
160
- - `useEffect` contains `fetch()` or IO — **blocker** (API in component)
193
+ - `useEffect` contains `fetch()` or IO — **major** (API in component)
161
194
  - `useEffect` contains business logic / state derivation — **major**
162
195
  - `useEffect` creates a subscription/timer/listener with no cleanup return — **major** (memory leak)
163
196
 
@@ -196,8 +229,8 @@ Flags:
196
229
  - [ ] `@observable.ref` is preferred for large external objects or objects that manage their own reactivity
197
230
 
198
231
  Flags:
199
- - `makeObservable(this)` missing from constructor — **blocker**
200
- - Observable state missing `@observable` decorator — **blocker**
232
+ - `makeObservable(this)` missing from constructor — **major** (nothing is reactive; stale UI, not corrupted state)
233
+ - Observable state missing `@observable` decorator — **major**
201
234
  - Derived value in plain method instead of `@computed` — **minor**
202
235
 
203
236
  #### B2. Member Ordering
@@ -229,7 +262,7 @@ Correct accessibility:
229
262
  Decision rule for inter-store callbacks: ask "Is this called from JSX or a React event handler?" If NO — it is `private`.
230
263
 
231
264
  Flags:
232
- - `public` keyword on any member — **blocker** (ESLint error)
265
+ - `public` keyword on any member — **minor** (ESLint `no-public` already fails CI; a reviewer restating a lint rule is not a merge gate)
233
266
  - `onChangeX`, `onFireX`, `handleX`, `syncX` without `private` — **major**
234
267
  - Missing `private` on internal state or helper methods — **major**
235
268
  - Missing `private readonly` on injected dependencies — **minor**
@@ -243,7 +276,7 @@ Flags:
243
276
  Flags:
244
277
  - `IObservableArray` field reassigned instead of using `.replace()` — **major**
245
278
  - `ObservableMap` field reassigned instead of `.replace()` or `.merge()` — **major**
246
- - Observable mutation outside `runInAction` in async context — **blocker** (Iron Law 1)
279
+ - Observable mutation outside `runInAction` in async context — **major**, or **blocker** where the interleaving can corrupt persisted state (frontend law 1)
247
280
 
248
281
  #### B5. Reactions and Disposers
249
282
 
@@ -276,7 +309,7 @@ Flags:
276
309
  - Public UI method missing `@action.bound` — **major**
277
310
  - Public helper method marked `@action.bound` but does not mutate state — **minor**
278
311
  - Public async action doing API/IO directly instead of delegating to private — **major**
279
- - State mutation after `await` outside `runInAction` — **blocker** (Iron Law 1)
312
+ - State mutation after `await` outside `runInAction` — **major**, or **blocker** where the interleaving can corrupt persisted state (frontend law 1)
280
313
  - Missing `try/catch/finally` on private async method owning loading flags — **major**
281
314
  - `catch (err: any)` instead of `catch (err: unknown)` — **minor**
282
315
 
@@ -303,7 +336,7 @@ Flags:
303
336
  When two stores synchronize state in both directions, at least one direction MUST have an equality guard (`if (newValue !== currentValue)`) before writing to the other store. Without this, changes bounce indefinitely.
304
337
 
305
338
  Flags:
306
- - Bidirectional store sync without equality guard — **blocker**
339
+ - Bidirectional store sync without equality guard — **blocker** (unbounded update loop: the render hangs)
307
340
  - Store A writes to Store B in a callback from Store B without `!==` check — **blocker**
308
341
  - Truthy guard (`if (value)`) on optional/nullable field instead of equality check in sync logic — **major**
309
342
 
@@ -315,7 +348,7 @@ Flags:
315
348
 
316
349
  Flags:
317
350
  - API call inside a public `@action.bound` method body — **major**
318
- - API call in a component (hook, handler, useEffect) — **blocker** (Iron Law 3)
351
+ - API call in a component (hook, handler, useEffect) — **major** (frontend law 3)
319
352
 
320
353
  #### B10. Lifecycle Initialization and Disposal
321
354
 
@@ -540,14 +573,22 @@ STATUS: DONE_WITH_CONCERNS
540
573
  [List checklist sections with no findings, confirming they were checked]
541
574
  ```
542
575
 
543
- ### Severity definitions
576
+ ### Where frontend conditions land
544
577
 
545
- | Severity | Meaning |
546
- |----------|---------|
547
- | `blocker` | Silent correctness bug or Iron Law violation; component will not behave correctly or store will corrupt state |
548
- | `major` | Pattern violation that will cause bugs under realistic usage or future changes |
549
- | `minor` | Convention deviation or defensive gap; does not cause immediate bugs but reduces maintainability |
550
- | `info` | Observation worth noting; no concrete bug in current code |
578
+ Severity comes from **Severity (canonical)** in `review-orchestrator/SKILL.md`.
579
+ This reviewer keeps no table of its own; what follows is where its recurring
580
+ conditions land under that rubric, not a second rubric.
581
+
582
+ | Condition | Severity | Why, under the canonical rubric |
583
+ |---|---|---|
584
+ | A store mutation that corrupts or loses persisted state | `blocker` | Data corruption |
585
+ | A render path that throws on an input the change admits | `blocker` | Crash |
586
+ | Missing `observer()` on a component that reads observables | `major` | Named trigger (the observable changes) and named outcome (the UI does not update). Stale UI is not a crash, data loss, vulnerability, or missing acceptance criterion |
587
+ | Observable mutation outside an action or `runInAction` | `major` — `blocker` only where the interleaving can corrupt persisted state | Same wording as `review-logic` and `review-highload` for a race: the outcome decides |
588
+ | API/IO call in a component | `major` | Layer violation. Identical to `review-architecture`'s rule for the same condition, which previously called it `major` while this file called it `blocker` |
589
+ | `useState` for store-managed state; `useMemo` for a derived store value; a store constructed in the component body | `major` | Named trigger (a re-render) and named outcome (state lost or recreated) |
590
+ | `public` on a class member; `useCallback` around a store method; a store created with `useMemo` instead of `useLocalObservable`; an unprivate inter-store callback | `minor` | The code behaves correctly. A lint rule that fails CI is caught by the machine, not by a reviewer, and the cost is to the next editor |
591
+ | Observation with no concrete bug | `info` | Shared laws 1 and 2 |
551
592
 
552
593
  ---
553
594
 
@@ -557,11 +598,11 @@ Stop and re-read these rules if you are thinking:
557
598
 
558
599
  | Rationalization | Why it's wrong |
559
600
  |---|---|
560
- | "The store is small, no need for full observer wrapping" | Missing observer() is a blocker regardless of store size — Iron Law 2 |
561
- | "The mutation happens in a non-async method, so runInAction isn't needed" | Mutations outside action/runInAction are always at least major — Iron Law 1 |
562
- | "I'll mark the API call in component as minor to avoid friction" | API in component is always a blocker — Iron Law 3 |
563
- | "The `public` keyword is just a style issue, I'll call it minor" | It's an ESLint error that will fail CI — it is a blocker |
564
- | "This inter-store callback works fine as public" | Iron Law 5: if it's not called from JSX, it must be private |
601
+ | "The store is small, no need for full observer wrapping" | Missing `observer()` is reported regardless of store size — frontend law 2. It is `major`, not `blocker`: stale UI is not one of the four shapes |
602
+ | "The mutation happens in a non-async method, so runInAction isn't needed" | Mutations outside action/runInAction are always at least `major` — frontend law 1 |
603
+ | "I'll mark the API call in component as minor to avoid friction" | API in a component is `major`, never `minor` — frontend law 3, and the same severity `review-architecture` gives it |
604
+ | "The `public` keyword is just a style issue, I'll call it minor" | It is `minor` — but still reported. The linter fails CI on it, which is why a reviewer does not need to block merge on it too |
605
+ | "This inter-store callback works fine as public" | Frontend law 5: if it is not called from JSX, it must be `private` |
565
606
  | "No spec compliance check needed for this skill" | Correct — this skill covers Stage 2 (code quality) only; spec compliance is handled by the orchestrator or review-logic |
566
607
  | "I can suggest adding useCallback everywhere for safety" | With MobX+observer, useCallback is rarely needed and adds noise; only flag when concretely justified |
567
608
  | "The bidirectional sync looks fine, no equality guard needed" | Bidirectional sync without equality guard is a blocker — infinite loop risk |
@@ -589,7 +630,7 @@ If the file does not exist or is not provided, proceed normally — context is o
589
630
 
590
631
  ## Orchestrated Review Contract
591
632
 
592
- When dispatched by `review-orchestrator`, follow the provided `reviewer-input.schema.json` payload. Return a `REVIEW_RESULT` object compatible with `skills/review-orchestrator/reviewer-finding.schema.json`, then a concise markdown summary. Keep findings evidence-based, include concrete `suggested_fix` for every blocker/major, and return `NEEDS_CONTEXT` instead of guessing when required context is missing.
633
+ When dispatched by `review-orchestrator`, follow the provided `reviewer-input.schema.json` payload. Return a `REVIEW_RESULT` object compatible with `skills/review/review-orchestrator/reviewer-finding.schema.json`, then a concise markdown summary. Keep findings evidence-based, include concrete `suggested_fix` for every blocker/major, and return `NEEDS_CONTEXT` instead of guessing when required context is missing.
593
634
 
594
635
  ---
595
636