@mrciphersmith/keryx 0.2.69 → 0.2.71

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 (183) hide show
  1. package/dist/cli.js +11136 -4863
  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/gdgraph/build-lang.test.ts +10 -3
  6. package/src/gdgraph/build.ts +54 -9
  7. package/src/gdgraph/import-kind.test.ts +205 -0
  8. package/src/gdgraph/query.ts +6 -1
  9. package/src/gdgraph/types.ts +34 -0
  10. package/src/gdskills/bundled/rules/core/model-selection.mdc +184 -31
  11. package/src/gdskills/bundled/rules/core/skills-storage-workflow.mdc +36 -0
  12. package/src/gdskills/bundled/rules/core/subagent-status-protocol.md +27 -1
  13. package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.codex.md +1 -1
  14. package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.cursor.md +1 -1
  15. package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.md +2 -1
  16. package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.opencode.md +1 -1
  17. package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.zed.md +1 -1
  18. package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.codex.md +1 -1
  19. package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.cursor.md +1 -1
  20. package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.md +1 -1
  21. package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.opencode.md +1 -1
  22. package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.zed.md +1 -1
  23. package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.codex.md +1 -1
  24. package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.cursor.md +1 -1
  25. package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.md +1 -1
  26. package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.opencode.md +1 -1
  27. package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.zed.md +1 -1
  28. package/src/gdskills/bundled/skills/orchestration/feature-dev/SKILL.codex.md +1 -1
  29. package/src/gdskills/bundled/skills/orchestration/feature-dev/SKILL.cursor.md +1 -1
  30. package/src/gdskills/bundled/skills/orchestration/feature-dev/SKILL.md +1 -1
  31. package/src/gdskills/bundled/skills/orchestration/flow-orchestrator/SKILL.md +159 -20
  32. package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.codex.md +1 -1
  33. package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.cursor.md +1 -1
  34. package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.md +1 -1
  35. package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.opencode.md +1 -1
  36. package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.zed.md +1 -1
  37. package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.codex.md +1 -1
  38. package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.cursor.md +1 -1
  39. package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.md +2 -1
  40. package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.opencode.md +1 -1
  41. package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.zed.md +1 -1
  42. package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.codex.md +28 -3
  43. package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.cursor.md +28 -3
  44. package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.md +28 -3
  45. package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.opencode.md +28 -3
  46. package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.zed.md +28 -3
  47. package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.codex.md +20 -2
  48. package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.cursor.md +20 -2
  49. package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.md +22 -3
  50. package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.opencode.md +20 -2
  51. package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.zed.md +20 -2
  52. package/src/gdskills/bundled/skills/planning/autodoc-analyst/SKILL.md +2 -1
  53. package/src/gdskills/bundled/skills/planning/autodoc-architect/SKILL.md +3 -1
  54. package/src/gdskills/bundled/skills/planning/autodoc-assembler/SKILL.md +2 -1
  55. package/src/gdskills/bundled/skills/planning/autodoc-orchestrator/SKILL.md +2 -1
  56. package/src/gdskills/bundled/skills/planning/autodoc-scanner/SKILL.md +2 -1
  57. package/src/gdskills/bundled/skills/planning/autodoc-writer/SKILL.md +2 -1
  58. package/src/gdskills/bundled/skills/planning/brainstorm/SKILL.codex.md +1 -1
  59. package/src/gdskills/bundled/skills/planning/brainstorm/SKILL.cursor.md +1 -1
  60. package/src/gdskills/bundled/skills/planning/brainstorm/SKILL.md +1 -1
  61. package/src/gdskills/bundled/skills/planning/consistency-checker/SKILL.codex.md +1 -1
  62. package/src/gdskills/bundled/skills/planning/consistency-checker/SKILL.cursor.md +1 -1
  63. package/src/gdskills/bundled/skills/planning/consistency-checker/SKILL.md +2 -1
  64. package/src/gdskills/bundled/skills/planning/docpack-orchestrator/SKILL.md +1 -1
  65. package/src/gdskills/bundled/skills/planning/docpack-review/SKILL.md +1 -1
  66. package/src/gdskills/bundled/skills/planning/interview/SKILL.codex.md +1 -1
  67. package/src/gdskills/bundled/skills/planning/interview/SKILL.cursor.md +1 -1
  68. package/src/gdskills/bundled/skills/planning/interview/SKILL.md +1 -1
  69. package/src/gdskills/bundled/skills/planning/interviewer/SKILL.codex.md +1 -1
  70. package/src/gdskills/bundled/skills/planning/interviewer/SKILL.cursor.md +1 -1
  71. package/src/gdskills/bundled/skills/planning/interviewer/SKILL.md +1 -1
  72. package/src/gdskills/bundled/skills/planning/patterns-researcher/SKILL.codex.md +1 -1
  73. package/src/gdskills/bundled/skills/planning/patterns-researcher/SKILL.cursor.md +1 -1
  74. package/src/gdskills/bundled/skills/planning/patterns-researcher/SKILL.md +2 -1
  75. package/src/gdskills/bundled/skills/planning/planner/SKILL.codex.md +1 -1
  76. package/src/gdskills/bundled/skills/planning/planner/SKILL.cursor.md +1 -1
  77. package/src/gdskills/bundled/skills/planning/planner/SKILL.md +2 -1
  78. package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.codex.md +1 -1
  79. package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.cursor.md +1 -1
  80. package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.md +1 -1
  81. package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.opencode.md +1 -1
  82. package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.zed.md +1 -1
  83. package/src/gdskills/bundled/skills/planning/problem-definer/SKILL.codex.md +1 -1
  84. package/src/gdskills/bundled/skills/planning/problem-definer/SKILL.cursor.md +1 -1
  85. package/src/gdskills/bundled/skills/planning/problem-definer/SKILL.md +2 -1
  86. package/src/gdskills/bundled/skills/planning/project-discovery/SKILL.codex.md +1 -1
  87. package/src/gdskills/bundled/skills/planning/project-discovery/SKILL.cursor.md +1 -1
  88. package/src/gdskills/bundled/skills/planning/project-discovery/SKILL.md +2 -1
  89. package/src/gdskills/bundled/skills/planning/spec-writer/SKILL.codex.md +1 -1
  90. package/src/gdskills/bundled/skills/planning/spec-writer/SKILL.cursor.md +1 -1
  91. package/src/gdskills/bundled/skills/planning/spec-writer/SKILL.md +2 -1
  92. package/src/gdskills/bundled/skills/planning/stack-advisor/SKILL.codex.md +1 -1
  93. package/src/gdskills/bundled/skills/planning/stack-advisor/SKILL.cursor.md +1 -1
  94. package/src/gdskills/bundled/skills/planning/stack-advisor/SKILL.md +2 -1
  95. package/src/gdskills/bundled/skills/platform/claude-md-management/SKILL.codex.md +1 -1
  96. package/src/gdskills/bundled/skills/platform/claude-md-management/SKILL.cursor.md +1 -1
  97. package/src/gdskills/bundled/skills/platform/claude-md-management/SKILL.md +1 -1
  98. package/src/gdskills/bundled/skills/platform/hookify/SKILL.codex.md +1 -1
  99. package/src/gdskills/bundled/skills/platform/hookify/SKILL.cursor.md +1 -1
  100. package/src/gdskills/bundled/skills/platform/hookify/SKILL.md +1 -1
  101. package/src/gdskills/bundled/skills/quality/changelog/SKILL.codex.md +1 -1
  102. package/src/gdskills/bundled/skills/quality/changelog/SKILL.cursor.md +1 -1
  103. package/src/gdskills/bundled/skills/quality/changelog/SKILL.md +1 -1
  104. package/src/gdskills/bundled/skills/quality/commit/SKILL.codex.md +1 -1
  105. package/src/gdskills/bundled/skills/quality/commit/SKILL.cursor.md +1 -1
  106. package/src/gdskills/bundled/skills/quality/commit/SKILL.md +1 -1
  107. package/src/gdskills/bundled/skills/quality/db-migrate/SKILL.codex.md +1 -1
  108. package/src/gdskills/bundled/skills/quality/db-migrate/SKILL.cursor.md +1 -1
  109. package/src/gdskills/bundled/skills/quality/db-migrate/SKILL.md +1 -1
  110. package/src/gdskills/bundled/skills/quality/dependency-update/SKILL.codex.md +1 -1
  111. package/src/gdskills/bundled/skills/quality/dependency-update/SKILL.cursor.md +1 -1
  112. package/src/gdskills/bundled/skills/quality/dependency-update/SKILL.md +1 -1
  113. package/src/gdskills/bundled/skills/quality/deploy/SKILL.codex.md +1 -1
  114. package/src/gdskills/bundled/skills/quality/deploy/SKILL.cursor.md +1 -1
  115. package/src/gdskills/bundled/skills/quality/deploy/SKILL.md +1 -1
  116. package/src/gdskills/bundled/skills/quality/metaproject-security/SKILL.md +1 -1
  117. package/src/gdskills/bundled/skills/quality/perf-check/SKILL.codex.md +1 -1
  118. package/src/gdskills/bundled/skills/quality/perf-check/SKILL.cursor.md +1 -1
  119. package/src/gdskills/bundled/skills/quality/perf-check/SKILL.md +1 -1
  120. package/src/gdskills/bundled/skills/quality/pr/SKILL.codex.md +1 -1
  121. package/src/gdskills/bundled/skills/quality/pr/SKILL.cursor.md +1 -1
  122. package/src/gdskills/bundled/skills/quality/pr/SKILL.md +1 -1
  123. package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.codex.md +1 -1
  124. package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.cursor.md +1 -1
  125. package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.md +1 -1
  126. package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.opencode.md +1 -1
  127. package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.zed.md +1 -1
  128. package/src/gdskills/bundled/skills/quality/push/SKILL.codex.md +1 -1
  129. package/src/gdskills/bundled/skills/quality/push/SKILL.cursor.md +1 -1
  130. package/src/gdskills/bundled/skills/quality/push/SKILL.md +1 -1
  131. package/src/gdskills/bundled/skills/quality/security-audit/SKILL.codex.md +1 -1
  132. package/src/gdskills/bundled/skills/quality/security-audit/SKILL.cursor.md +1 -1
  133. package/src/gdskills/bundled/skills/quality/security-audit/SKILL.md +1 -1
  134. package/src/gdskills/bundled/skills/quality/test-gen/SKILL.codex.md +1 -1
  135. package/src/gdskills/bundled/skills/quality/test-gen/SKILL.cursor.md +1 -1
  136. package/src/gdskills/bundled/skills/quality/test-gen/SKILL.md +1 -1
  137. package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.codex.md +1 -1
  138. package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.cursor.md +1 -1
  139. package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.md +1 -1
  140. package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.opencode.md +1 -1
  141. package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.zed.md +1 -1
  142. package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.codex.md +1 -1
  143. package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.cursor.md +1 -1
  144. package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.md +1 -1
  145. package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.opencode.md +1 -1
  146. package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.zed.md +1 -1
  147. package/src/gdskills/bundled/skills/review/code-b091-review/SKILL.codex.md +1 -1
  148. package/src/gdskills/bundled/skills/review/code-b091-review/SKILL.cursor.md +1 -1
  149. package/src/gdskills/bundled/skills/review/code-b091-review/SKILL.md +1 -1
  150. package/src/gdskills/bundled/skills/review/code-b091-review/SKILL.opencode.md +1 -1
  151. package/src/gdskills/bundled/skills/review/code-b091-review/SKILL.zed.md +1 -1
  152. package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.codex.md +1 -1
  153. package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.cursor.md +1 -1
  154. package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.md +2 -1
  155. package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.opencode.md +1 -1
  156. package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.zed.md +1 -1
  157. package/src/gdskills/bundled/skills/review/code-style-review/SKILL.codex.md +1 -1
  158. package/src/gdskills/bundled/skills/review/code-style-review/SKILL.cursor.md +1 -1
  159. package/src/gdskills/bundled/skills/review/code-style-review/SKILL.md +1 -1
  160. package/src/gdskills/bundled/skills/review/code-style-review/SKILL.opencode.md +1 -1
  161. package/src/gdskills/bundled/skills/review/code-style-review/SKILL.zed.md +1 -1
  162. package/src/gdskills/bundled/skills/review/review-architecture/SKILL.md +37 -10
  163. package/src/gdskills/bundled/skills/review/review-backend/SKILL.md +48 -14
  164. package/src/gdskills/bundled/skills/review/review-clean-code/SKILL.md +49 -12
  165. package/src/gdskills/bundled/skills/review/review-core-boundaries/SKILL.md +34 -2
  166. package/src/gdskills/bundled/skills/review/review-flow-graph/SKILL.md +33 -2
  167. package/src/gdskills/bundled/skills/review/review-frontend/SKILL.md +70 -29
  168. package/src/gdskills/bundled/skills/review/review-frontend-conventions/SKILL.md +34 -3
  169. package/src/gdskills/bundled/skills/review/review-highload/SKILL.md +49 -15
  170. package/src/gdskills/bundled/skills/review/review-logic/SKILL.md +39 -11
  171. package/src/gdskills/bundled/skills/review/review-orchestrator/SKILL.md +659 -64
  172. package/src/gdskills/bundled/skills/review/review-orchestrator/reviewer-finding.schema.json +7 -0
  173. package/src/gdskills/bundled/skills/review/review-orchestrator/verification-claim.schema.json +78 -0
  174. package/src/gdskills/bundled/skills/review/review-performance/SKILL.md +43 -13
  175. package/src/gdskills/bundled/skills/review/review-pr-feedback/SKILL.md +8 -2
  176. package/src/gdskills/bundled/skills/review/review-regression/SKILL.md +185 -0
  177. package/src/gdskills/bundled/skills/review/review-security-code/SKILL.md +44 -13
  178. package/src/gdskills/bundled/skills/review/review-style/SKILL.md +26 -6
  179. package/src/gdskills/bundled/skills/review/review-testing-practices/SKILL.md +35 -3
  180. package/src/gdskills/bundled/skills/review/review-verifier/SKILL.md +276 -0
  181. package/src/gdskills/contracts/review-finding.schema.json +119 -1
  182. package/src/gdskills/contracts/subagent-dispatch.schema.json +59 -3
  183. package/src/gdskills/bundled/skills/review/review-strict/SKILL.md +0 -328
@@ -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 |
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  name: review-frontend-conventions
3
+ model_tier: standard
3
4
  description: |
4
5
  Use when reviewing frontend code against repository-local conventions commonly
5
6
  captured in CLAUDE.md or similar project guides: React/MobX boundaries,
@@ -11,6 +12,7 @@ metadata:
11
12
  author: "MrCipherSmith"
12
13
  version: "1.0.0"
13
14
  category: "review"
15
+ stack_requires: "react,mobx"
14
16
  license: "MIT"
15
17
  ---
16
18
 
@@ -95,6 +97,27 @@ project-specific guide was found.
95
97
 
96
98
  ---
97
99
 
100
+ ## Iron Laws
101
+
102
+ ### Shared laws (every reviewer)
103
+
104
+ 1. **A claim of runtime harm with no reproducible path is `info`.** If you cannot
105
+ name the input, call, or condition that reaches the code, you have an
106
+ observation, not a finding. Report it as `info` and say what would settle it.
107
+ 2. **Never flag the theoretical.** The path you describe must exist in the code
108
+ under review. Do not report a safe API because it could be misused, or a
109
+ pattern because it is often wrong elsewhere.
110
+ 3. **One finding per class, not one per occurrence.** When the same shape appears
111
+ at several sites, report it once and list every site. Ten findings that are one
112
+ finding hide the other nine problems.
113
+
114
+ Severity levels are defined once, in `review-orchestrator/SKILL.md` →
115
+ **Severity (canonical)**. This reviewer does not restate them: `blocker` is the
116
+ four merge-blocking shapes named there and nothing else, and the `major`/`minor`
117
+ boundary is the trigger-and-outcome test.
118
+
119
+ ---
120
+
98
121
  ## Orchestrated Review Contract
99
122
 
100
123
  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.
@@ -138,7 +161,15 @@ observation is theatre, not rigour.
138
161
  - **Fix**: concrete project-aligned change
139
162
  ```
140
163
 
141
- Severity guidance: lost reactivity, direct storage quota risk, masked translation/error behavior,
142
- and violations that break CI are `blocker`/`major`; naming/story coverage is usually `minor`
143
- unless it breaks tooling or controls.
164
+ Severity comes from **Severity (canonical)** in `review-orchestrator/SKILL.md`.
165
+ This reviewer keeps no rubric of its own; what follows is where its recurring
166
+ conditions land under that rubric.
167
+
168
+ | Condition | Severity | Why, under the canonical rubric |
169
+ |---|---|---|
170
+ | Unguarded direct storage writes that can throw on quota | `blocker` | Crash on a reachable input |
171
+ | Lost reactivity; masked translation or error behaviour | `major` | Named trigger and named outcome. Identical to `review-frontend`'s rating for lost reactivity, deliberately |
172
+ | A convention violation the linter or CI already fails on | `minor` | The machine catches it; a reviewer restating it is not a merge gate |
173
+ | Naming, story coverage, file placement | `minor` | Correct today; the cost is to the next editor |
174
+ | A convention preference with no named consequence | `info` | Shared laws 1 and 2 |
144
175
 
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  name: review-highload
3
+ model_tier: deep
3
4
  description: |
4
5
  Use when: reviewing code that will run under high concurrency or high traffic —
5
6
  race conditions, connection pool exhaustion, cache invalidation, missing indexes,
@@ -10,7 +11,6 @@ description: |
10
11
  NOT for: frontend re-render performance (review-performance), general N+1 queries
11
12
  (review-performance), clean code style (review-clean-code), or NestJS module structure
12
13
  (review-architecture).
13
- version: "1.0.0"
14
14
  triggers:
15
15
  - "review highload"
16
16
  - "review scalability"
@@ -23,8 +23,8 @@ metadata:
23
23
  author: "MrCipherSmith"
24
24
  version: "1.0.0"
25
25
  category: "review"
26
+ compatible_harnesses: "cursor,codex,zed,opencode,claude"
26
27
  license: "MIT"
27
- compatibility: "cursor,codex,zed,opencode,claude"
28
28
  ---
29
29
 
30
30
  # Review: High-Load & Scalability
@@ -86,11 +86,38 @@ Pre-existing problems in unchanged lines are out of scope unless the diff makes
86
86
 
87
87
  ## Iron Laws
88
88
 
89
- 1. **A race condition on shared mutable state is always a `blocker`.** There is no "it probably won't happen in practice" — race conditions manifest unpredictably under load.
90
- 2. **An unbounded resource (connection, goroutine, thread, queue, in-memory collection) that grows with request rate is always at least `major`.** Under load it will exhaust the resource.
91
- 3. **Missing retry idempotency is always a `blocker` where the operation has side effects.** A retried non-idempotent write is a data integrity bug.
92
- 4. **Blocking I/O on a thread/fiber that is shared with the event loop is always at least `major`.** One slow call blocks all concurrent requests on that thread.
93
- 5. **Architecture opinions without a named pattern violation and concrete load-related impact are `info` only.** State the failure mode, not just that "it could be better".
89
+ ### Shared laws (every reviewer)
90
+
91
+ 1. **A claim of runtime harm with no reproducible path is `info`.** If you cannot
92
+ name the input, call, or condition that reaches the code, you have an
93
+ observation, not a finding. Report it as `info` and say what would settle it.
94
+ 2. **Never flag the theoretical.** The path you describe must exist in the code
95
+ under review. Do not report a safe API because it could be misused, or a
96
+ pattern because it is often wrong elsewhere.
97
+ 3. **One finding per class, not one per occurrence.** When the same shape appears
98
+ at several sites, report it once and list every site. Ten findings that are one
99
+ finding hide the other nine problems.
100
+
101
+ Severity levels are defined once, in `review-orchestrator/SKILL.md` →
102
+ **Severity (canonical)**. This reviewer does not restate them: `blocker` is the
103
+ four merge-blocking shapes named there and nothing else, and the `major`/`minor`
104
+ boundary is the trigger-and-outcome test.
105
+
106
+ ### High-load laws
107
+
108
+ 1. **Every finding states its failure mode: what breaks, and at what load.** "OOM
109
+ at ~1k RPS", "pool exhausted at 500 concurrent users", "duplicate charge on the
110
+ first retry". This is what shared law 1 asks of a load finding — a load level
111
+ is the trigger.
112
+ 2. **A race condition on shared mutable state is never dismissed as unlikely.**
113
+ "It probably won't happen in practice" is not an argument; races manifest
114
+ unpredictably under load. Its *severity* still comes from its outcome — see the
115
+ conditions table below — but it is never dropped for improbability.
116
+ 3. **An unbounded resource that grows with request rate is never `minor`.**
117
+ Connections, threads, queues, in-memory collections: under load it exhausts.
118
+ 4. **Architecture opinions without a named pattern violation and a load-related
119
+ failure mode are `info` only.** State the failure mode, not just that "it could
120
+ be better".
94
121
 
95
122
  ---
96
123
 
@@ -423,14 +450,21 @@ observation is theatre, not rigour.
423
450
 
424
451
  The **Failure mode** line is mandatory for this reviewer — every finding must state the load-related consequence (OOM at 1k RPS, connection exhaustion at 500 concurrent users, duplicate charges on retry, etc.).
425
452
 
426
- Severity guide:
427
-
428
- | Severity | When to use |
429
- |----------|------------|
430
- | `blocker` | Race condition on shared state; non-idempotent retry; unbounded in-memory queue; distributed cron with no lock; transaction holding external I/O lock |
431
- | `major` | Connection without pool; unbounded `Promise.all`; missing retry timeout/backoff; cache stampede on hot key; N+1 in hot path; long transaction; DLQ missing |
432
- | `minor` | Backoff without jitter; TTL misconfigured; per-request allocation in hot path; full-row fetch for one field |
433
- | `info` | Architectural note without concrete failure mode at current load |
453
+ Severity comes from **Severity (canonical)** in `review-orchestrator/SKILL.md`.
454
+ This reviewer keeps no table of its own; what follows is where its recurring
455
+ conditions land under that rubric, not a second rubric.
456
+
457
+ | Condition | Severity | Why, under the canonical rubric |
458
+ |---|---|---|
459
+ | Race condition on shared mutable state | `blocker` **if** the interleaving can corrupt or lose data; otherwise `major` | Same wording as `review-logic`, deliberately: the outcome decides, not the word "race" |
460
+ | Non-idempotent retry of an operation with side effects | `blocker` | A retried write duplicates or corrupts persisted state |
461
+ | Unbounded in-memory queue or collection growing with request rate | `blocker` | OOM is a crash; state the rate that reaches it |
462
+ | Distributed cron or job with no lock | `blocker` | Concurrent runs duplicate side effects |
463
+ | Transaction held open across external I/O | `blocker` | Pool exhaustion takes the service down |
464
+ | Blocking I/O on a thread or fiber shared with the event loop | `major` | Named trigger: a request served on that thread. Named outcome: every concurrent request on it stalls behind the one slow call. Restored — the per-reviewer rubric that carried this floor was deleted and the conditions table did not pick it up, leaving the skill's own description advertising hot-path blocking I/O with no rule assigning it a severity |
465
+ | Connection without a pool; unbounded `Promise.all`; missing retry timeout or backoff; cache stampede on a hot key; N+1 on a hot path; long transaction; missing DLQ | `major` | Named trigger (a load level) and named outcome, but the outcome is degradation, not one of the four shapes |
466
+ | Backoff without jitter; TTL misconfigured; per-request allocation on a hot path; full-row fetch for one field | `minor` | Correct under load; the cost is to whoever tunes it next |
467
+ | Architectural note with no failure mode at a stated load | `info` | Shared law 1 |
434
468
 
435
469
  ---
436
470
 
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  name: review-logic
3
+ model_tier: standard
3
4
  description: |
4
5
  Use when: reviewing code for logic correctness, algorithmic bugs, missing error handling,
5
6
  async/await mistakes, null/undefined risks, race conditions, type contract violations,
@@ -7,7 +8,6 @@ description: |
7
8
  Also invoked directly: "review logic", "check correctness", "are there any bugs here".
8
9
  NOT for: security vulnerabilities, performance profiling, style/naming preferences,
9
10
  or architectural pattern concerns — those belong in their respective specialized reviewers.
10
- version: "1.0.0"
11
11
  triggers:
12
12
  - "review logic"
13
13
  - "check correctness"
@@ -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 Logic
@@ -220,16 +220,44 @@ observation is theatre, not rigour.
220
220
  ```
221
221
  ```
222
222
 
223
- Severity guide for this reviewer:
223
+ Severity comes from **Severity (canonical)** in `review-orchestrator/SKILL.md`.
224
+ This reviewer keeps no table of its own; what follows is where its recurring
225
+ conditions land under that rubric, not a second rubric.
226
+
227
+ | Condition | Severity | Why, under the canonical rubric |
228
+ |---|---|---|
229
+ | Unhandled promise rejection reaching the process | `blocker` | Crash |
230
+ | Corrupted or lost persisted/returned data | `blocker` | Data loss or corruption |
231
+ | Unimplemented acceptance criterion | `blocker` | Named shape 4 |
232
+ | Race condition on shared mutable state | `blocker` **if** the interleaving can corrupt or lose data; otherwise `major` | The outcome decides, not the word "race" |
233
+ | Silent wrong result on a named input | `major` | Trigger and outcome are both named |
234
+ | Swallowed error that hides a failed operation | `major` — `blocker` only if the caller then persists or returns wrong data | Silent failure is wrong behaviour; corruption is a different shape |
235
+ | Type contract broken (declared type is not what is returned) | `major` | Callers observe the wrong value |
236
+ | Edge case not handled, no input that reaches it named | `minor` | No trigger; the cost is to the next editor |
237
+ | Non-null assertion without a comment | `minor` | Behaves correctly today; the cost is to the reader |
238
+ | "Could be more defensive", no observable defect | `info` | Neither trigger nor maintenance cost named |
239
+
240
+ ## Iron Laws
241
+
242
+ ### Shared laws (every reviewer)
243
+
244
+ 1. **A claim of runtime harm with no reproducible path is `info`.** If you cannot
245
+ name the input, call, or condition that reaches the code, you have an
246
+ observation, not a finding. Report it as `info` and say what would settle it.
247
+ 2. **Never flag the theoretical.** The path you describe must exist in the code
248
+ under review. Do not report a safe API because it could be misused, or a
249
+ pattern because it is often wrong elsewhere.
250
+ 3. **One finding per class, not one per occurrence.** When the same shape appears
251
+ at several sites, report it once and list every site. Ten findings that are one
252
+ finding hide the other nine problems.
253
+
254
+ Severity levels are defined once, in `review-orchestrator/SKILL.md` →
255
+ **Severity (canonical)**. This reviewer does not restate them: `blocker` is the
256
+ four merge-blocking shapes named there and nothing else, and the `major`/`minor`
257
+ boundary is the trigger-and-outcome test.
258
+
259
+ ### Logic laws
224
260
 
225
- | Severity | When to use |
226
- |----------|------------|
227
- | `blocker` | Crash, data corruption, unimplemented acceptance criterion, unhandled promise rejection in critical path |
228
- | `major` | Silent wrong result, race condition, swallowed error, type contract broken |
229
- | `minor` | Edge case not handled but unlikely in practice, non-null assertion without comment |
230
- | `info` | Suggestion to make code more defensive, no current observable defect |
231
-
232
- Iron laws:
233
261
  - Every `blocker` MUST include a concrete reproduction scenario or a spec reference.
234
262
  - NEVER flag a style preference (naming, formatting) as a logic bug.
235
263
  - If in doubt between `major` and `blocker`, use `major` — overstating severity loses credibility.