@mrciphersmith/keryx 0.2.72 → 0.2.74

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/dist/cli.js +33409 -32626
  2. package/package.json +2 -2
  3. package/src/gdskills/bundled/rules/core/gproject-contracts.mdc +1 -1
  4. package/src/gdskills/bundled/rules/core/jobs-documentation.mdc +1 -1
  5. package/src/gdskills/bundled/rules/core/subagent-context-construction.md +1 -1
  6. package/src/gdskills/bundled/skills/core/reviewer-skill-creator/SKILL.md +214 -0
  7. package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.codex.md +326 -20
  8. package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.cursor.md +320 -22
  9. package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.opencode.md +326 -12
  10. package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.zed.md +333 -9
  11. package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.codex.md +92 -4
  12. package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.cursor.md +92 -4
  13. package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.opencode.md +92 -4
  14. package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.zed.md +92 -4
  15. package/src/gdskills/bundled/skills/orchestration/context-collector/orchestrator-prompt.md +1 -1
  16. package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.codex.md +154 -1098
  17. package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.cursor.md +154 -1098
  18. package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.opencode.md +154 -1098
  19. package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.zed.md +154 -1098
  20. package/src/gdskills/bundled/skills/orchestration/feature-analyzer/orchestrator-prompt.md +1 -1
  21. package/src/gdskills/bundled/skills/orchestration/feature-dev/SKILL.codex.md +101 -41
  22. package/src/gdskills/bundled/skills/orchestration/feature-dev/SKILL.cursor.md +101 -41
  23. package/src/gdskills/bundled/skills/orchestration/flow-orchestrator/SKILL.md +48 -1
  24. package/src/gdskills/bundled/skills/orchestration/flow-orchestrator/input-contract.schema.json +70 -4
  25. package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.codex.md +115 -49
  26. package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.cursor.md +115 -49
  27. package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.opencode.md +115 -49
  28. package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.zed.md +115 -49
  29. package/src/gdskills/bundled/skills/orchestration/issue-analyzer/orchestrator-prompt.md +1 -1
  30. package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.codex.md +15 -6
  31. package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.cursor.md +15 -6
  32. package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.opencode.md +15 -6
  33. package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.zed.md +15 -6
  34. package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.codex.md +1 -1
  35. package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.cursor.md +1 -1
  36. package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.md +1 -1
  37. package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.opencode.md +1 -1
  38. package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.zed.md +1 -1
  39. package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.codex.md +300 -55
  40. package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.cursor.md +300 -55
  41. package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.md +120 -37
  42. package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.opencode.md +300 -55
  43. package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.zed.md +300 -55
  44. package/src/gdskills/bundled/skills/orchestration/task-implementer/input-contract.schema.json +56 -14
  45. package/src/gdskills/bundled/skills/orchestration/task-implementer/orchestrator-prompt.md +50 -23
  46. package/src/gdskills/bundled/skills/orchestration/task-implementer/output-contract.schema.json +6 -2
  47. package/src/gdskills/bundled/skills/orchestration/task-implementer/task-request.template.md +18 -12
  48. package/src/gdskills/bundled/skills/planning/brainstorm/SKILL.codex.md +1 -1
  49. package/src/gdskills/bundled/skills/planning/brainstorm/SKILL.cursor.md +1 -1
  50. package/src/gdskills/bundled/skills/planning/consistency-checker/SKILL.codex.md +169 -10
  51. package/src/gdskills/bundled/skills/planning/consistency-checker/SKILL.cursor.md +169 -10
  52. package/src/gdskills/bundled/skills/planning/consistency-checker/SKILL.md +1 -1
  53. package/src/gdskills/bundled/skills/planning/interview/SKILL.codex.md +7 -1
  54. package/src/gdskills/bundled/skills/planning/interview/SKILL.cursor.md +7 -1
  55. package/src/gdskills/bundled/skills/planning/interviewer/SKILL.codex.md +7 -1
  56. package/src/gdskills/bundled/skills/planning/interviewer/SKILL.cursor.md +7 -1
  57. package/src/gdskills/bundled/skills/planning/patterns-researcher/SKILL.codex.md +216 -10
  58. package/src/gdskills/bundled/skills/planning/patterns-researcher/SKILL.cursor.md +216 -10
  59. package/src/gdskills/bundled/skills/planning/patterns-researcher/SKILL.md +1 -1
  60. package/src/gdskills/bundled/skills/planning/planner/SKILL.codex.md +169 -10
  61. package/src/gdskills/bundled/skills/planning/planner/SKILL.cursor.md +169 -10
  62. package/src/gdskills/bundled/skills/planning/planner/SKILL.md +1 -1
  63. package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.codex.md +2 -2
  64. package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.cursor.md +2 -2
  65. package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.opencode.md +2 -2
  66. package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.zed.md +2 -2
  67. package/src/gdskills/bundled/skills/planning/problem-definer/SKILL.codex.md +134 -10
  68. package/src/gdskills/bundled/skills/planning/problem-definer/SKILL.cursor.md +134 -10
  69. package/src/gdskills/bundled/skills/planning/problem-definer/SKILL.md +1 -1
  70. package/src/gdskills/bundled/skills/planning/project-discovery/SKILL.codex.md +146 -10
  71. package/src/gdskills/bundled/skills/planning/project-discovery/SKILL.cursor.md +146 -10
  72. package/src/gdskills/bundled/skills/planning/project-discovery/SKILL.md +1 -1
  73. package/src/gdskills/bundled/skills/planning/spec-writer/SKILL.codex.md +211 -10
  74. package/src/gdskills/bundled/skills/planning/spec-writer/SKILL.cursor.md +211 -10
  75. package/src/gdskills/bundled/skills/planning/spec-writer/SKILL.md +1 -1
  76. package/src/gdskills/bundled/skills/planning/stack-advisor/SKILL.codex.md +162 -10
  77. package/src/gdskills/bundled/skills/planning/stack-advisor/SKILL.cursor.md +162 -10
  78. package/src/gdskills/bundled/skills/planning/stack-advisor/SKILL.md +1 -1
  79. package/src/gdskills/bundled/skills/platform/claude-md-management/SKILL.codex.md +1 -1
  80. package/src/gdskills/bundled/skills/platform/claude-md-management/SKILL.cursor.md +1 -1
  81. package/src/gdskills/bundled/skills/platform/hookify/SKILL.codex.md +1 -1
  82. package/src/gdskills/bundled/skills/platform/hookify/SKILL.cursor.md +1 -1
  83. package/src/gdskills/bundled/skills/quality/changelog/SKILL.codex.md +1 -1
  84. package/src/gdskills/bundled/skills/quality/changelog/SKILL.cursor.md +1 -1
  85. package/src/gdskills/bundled/skills/quality/commit/SKILL.codex.md +1 -1
  86. package/src/gdskills/bundled/skills/quality/commit/SKILL.cursor.md +1 -1
  87. package/src/gdskills/bundled/skills/quality/db-migrate/SKILL.codex.md +1 -1
  88. package/src/gdskills/bundled/skills/quality/db-migrate/SKILL.cursor.md +1 -1
  89. package/src/gdskills/bundled/skills/quality/dependency-update/SKILL.codex.md +1 -1
  90. package/src/gdskills/bundled/skills/quality/dependency-update/SKILL.cursor.md +1 -1
  91. package/src/gdskills/bundled/skills/quality/deploy/SKILL.codex.md +1 -1
  92. package/src/gdskills/bundled/skills/quality/deploy/SKILL.cursor.md +1 -1
  93. package/src/gdskills/bundled/skills/quality/perf-check/SKILL.codex.md +1 -1
  94. package/src/gdskills/bundled/skills/quality/perf-check/SKILL.cursor.md +1 -1
  95. package/src/gdskills/bundled/skills/quality/pr/SKILL.codex.md +1 -1
  96. package/src/gdskills/bundled/skills/quality/pr/SKILL.cursor.md +1 -1
  97. package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.codex.md +15 -1
  98. package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.cursor.md +248 -165
  99. package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.opencode.md +15 -1
  100. package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.zed.md +359 -19
  101. package/src/gdskills/bundled/skills/quality/push/SKILL.codex.md +1 -1
  102. package/src/gdskills/bundled/skills/quality/push/SKILL.cursor.md +1 -1
  103. package/src/gdskills/bundled/skills/quality/security-audit/SKILL.codex.md +1 -1
  104. package/src/gdskills/bundled/skills/quality/security-audit/SKILL.cursor.md +1 -1
  105. package/src/gdskills/bundled/skills/quality/test-gen/SKILL.codex.md +1 -1
  106. package/src/gdskills/bundled/skills/quality/test-gen/SKILL.cursor.md +1 -1
  107. package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.codex.md +299 -24
  108. package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.cursor.md +296 -31
  109. package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.opencode.md +309 -18
  110. package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.zed.md +312 -17
  111. package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.codex.md +29 -30
  112. package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.cursor.md +29 -30
  113. package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.opencode.md +29 -30
  114. package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.zed.md +29 -30
  115. package/src/gdskills/bundled/skills/review/code-learned-review/SKILL.codex.md +21 -30
  116. package/src/gdskills/bundled/skills/review/code-learned-review/SKILL.cursor.md +21 -30
  117. package/src/gdskills/bundled/skills/review/code-learned-review/SKILL.opencode.md +21 -30
  118. package/src/gdskills/bundled/skills/review/code-learned-review/SKILL.zed.md +21 -30
  119. package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.codex.md +19 -23
  120. package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.cursor.md +19 -23
  121. package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.opencode.md +19 -23
  122. package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.zed.md +19 -23
  123. package/src/gdskills/bundled/skills/review/code-style-review/SKILL.codex.md +17 -24
  124. package/src/gdskills/bundled/skills/review/code-style-review/SKILL.cursor.md +17 -24
  125. package/src/gdskills/bundled/skills/review/code-style-review/SKILL.opencode.md +17 -24
  126. package/src/gdskills/bundled/skills/review/code-style-review/SKILL.zed.md +17 -24
  127. package/src/gdskills/bundled/skills/review/review-clean-code/SKILL.md +33 -1
  128. package/src/gdskills/bundled/skills/review/review-layout/SKILL.md +217 -0
  129. package/src/gdskills/bundled/skills/review/review-logic/SKILL.md +26 -0
  130. package/src/gdskills/bundled/skills/review/review-orchestrator/SKILL.md +320 -5
  131. package/src/gdskills/bundled/skills/review/review-pr-feedback/SKILL.md +644 -113
  132. package/src/gdskills/bundled/skills/review/review-pr-feedback/input-contract.schema.json +79 -0
  133. package/src/gdskills/bundled/skills/review/review-pr-feedback/output-contract.schema.json +375 -0
  134. package/src/gdskills/bundled/skills/review/review-testing-practices/SKILL.md +111 -1
  135. package/src/gdskills/bundled/skills/review/review-verifier/SKILL.md +25 -1
  136. package/src/gdskills/bundled/skills/planning/brainstorm/SKILL.claude.md +0 -46
  137. package/src/gdskills/bundled/skills/planning/interviewer/SKILL.claude.md +0 -94
  138. package/src/gdskills/bundled/skills/quality/changelog/SKILL.claude.md +0 -45
  139. package/src/gdskills/bundled/skills/quality/db-migrate/SKILL.claude.md +0 -40
  140. package/src/gdskills/bundled/skills/quality/dependency-update/SKILL.claude.md +0 -45
  141. package/src/gdskills/bundled/skills/quality/deploy/SKILL.claude.md +0 -42
  142. package/src/gdskills/bundled/skills/quality/perf-check/SKILL.claude.md +0 -48
  143. package/src/gdskills/bundled/skills/quality/security-audit/SKILL.claude.md +0 -40
  144. package/src/gdskills/bundled/skills/quality/test-gen/SKILL.claude.md +0 -30
@@ -28,32 +28,11 @@ license: "MIT"
28
28
  - Фидбек должен быть подробным: проблема -> почему это проблема -> где (файл/участок) -> что сделать -> пример исправления.
29
29
  - Исправления предлагай в виде unified diff-патчей, не вноси изменения в код напрямую.
30
30
 
31
- ## Git workflow (вычислить базу и diff)
31
+ ## Scope Detection
32
32
 
33
- Определи parent ref и вычисли merge-base:
33
+ See shared script: `skills/shared/git-merge-base.md`
34
34
 
35
- ```bash
36
- BRANCH="$(git rev-parse --abbrev-ref HEAD)"
37
- UPSTREAM_REF="$(git rev-parse --abbrev-ref --symbolic-full-name @{upstream} 2>/dev/null || true)"
38
-
39
- PARENT=""
40
- if git rev-parse --verify -q "origin/main" >/dev/null; then
41
- PARENT="origin/main"
42
- elif git rev-parse --verify -q "origin/master" >/dev/null; then
43
- PARENT="origin/master"
44
- elif git rev-parse --verify -q "main" >/dev/null; then
45
- PARENT="main"
46
- elif git rev-parse --verify -q "master" >/dev/null; then
47
- PARENT="master"
48
- elif [ -n "$UPSTREAM_REF" ] && [ "$UPSTREAM_REF" != "$BRANCH" ] && [ "$UPSTREAM_REF" != "origin/$BRANCH" ]; then
49
- PARENT="@{upstream}"
50
- else
51
- echo "Cannot determine parent ref" >&2
52
- exit 1
53
- fi
54
-
55
- BASE_SHA="$(git merge-base HEAD "$PARENT")"
56
- ```
35
+ Run the script from that file to determine MERGE_BASE and SCOPE before proceeding with the review.
57
36
 
58
37
  Собери входные данные:
59
38
 
@@ -158,6 +137,20 @@ git diff --find-renames <FROM_SHA>..<TO_SHA>
158
137
 
159
138
  ---
160
139
 
140
+ ## Scope Boundaries
141
+
142
+ This skill covers **code style and architecture patterns** — naming, organization, TypeScript usage, pattern compliance per `code-style-patterns.mdc`.
143
+
144
+ | Concern | This skill | Use instead |
145
+ |---------|-----------|-------------|
146
+ | Naming conventions, file organization, import order | ✅ YES | — |
147
+ | TypeScript patterns, component/hook structure | ✅ YES | — |
148
+ | Architecture pattern compliance | ✅ YES | — |
149
+ | Logic correctness, type safety deep dives | ❌ NO | `code-ai-review` or `code-learned-review` |
150
+ | MobX store internals | ❌ NO | `code-mobx-store-review` |
151
+
152
+ ---
153
+
161
154
  ## Job Context Awareness
162
155
 
163
156
  When dispatched by `job-orchestrator` as part of a job pipeline, the prompt MAY include:
@@ -28,32 +28,11 @@ license: "MIT"
28
28
  - Фидбек должен быть подробным: проблема -> почему это проблема -> где (файл/участок) -> что сделать -> пример исправления.
29
29
  - Исправления предлагай в виде unified diff-патчей, не вноси изменения в код напрямую.
30
30
 
31
- ## Git workflow (вычислить базу и diff)
31
+ ## Scope Detection
32
32
 
33
- Определи parent ref и вычисли merge-base:
33
+ See shared script: `skills/shared/git-merge-base.md`
34
34
 
35
- ```bash
36
- BRANCH="$(git rev-parse --abbrev-ref HEAD)"
37
- UPSTREAM_REF="$(git rev-parse --abbrev-ref --symbolic-full-name @{upstream} 2>/dev/null || true)"
38
-
39
- PARENT=""
40
- if git rev-parse --verify -q "origin/main" >/dev/null; then
41
- PARENT="origin/main"
42
- elif git rev-parse --verify -q "origin/master" >/dev/null; then
43
- PARENT="origin/master"
44
- elif git rev-parse --verify -q "main" >/dev/null; then
45
- PARENT="main"
46
- elif git rev-parse --verify -q "master" >/dev/null; then
47
- PARENT="master"
48
- elif [ -n "$UPSTREAM_REF" ] && [ "$UPSTREAM_REF" != "$BRANCH" ] && [ "$UPSTREAM_REF" != "origin/$BRANCH" ]; then
49
- PARENT="@{upstream}"
50
- else
51
- echo "Cannot determine parent ref" >&2
52
- exit 1
53
- fi
54
-
55
- BASE_SHA="$(git merge-base HEAD "$PARENT")"
56
- ```
35
+ Run the script from that file to determine MERGE_BASE and SCOPE before proceeding with the review.
57
36
 
58
37
  Собери входные данные:
59
38
 
@@ -158,6 +137,20 @@ git diff --find-renames <FROM_SHA>..<TO_SHA>
158
137
 
159
138
  ---
160
139
 
140
+ ## Scope Boundaries
141
+
142
+ This skill covers **code style and architecture patterns** — naming, organization, TypeScript usage, pattern compliance per `code-style-patterns.mdc`.
143
+
144
+ | Concern | This skill | Use instead |
145
+ |---------|-----------|-------------|
146
+ | Naming conventions, file organization, import order | ✅ YES | — |
147
+ | TypeScript patterns, component/hook structure | ✅ YES | — |
148
+ | Architecture pattern compliance | ✅ YES | — |
149
+ | Logic correctness, type safety deep dives | ❌ NO | `code-ai-review` or `code-learned-review` |
150
+ | MobX store internals | ❌ NO | `code-mobx-store-review` |
151
+
152
+ ---
153
+
161
154
  ## Job Context Awareness
162
155
 
163
156
  When dispatched by `job-orchestrator` as part of a job pipeline, the prompt MAY include:
@@ -211,9 +211,41 @@ Flags:
211
211
 
212
212
  Flags:
213
213
  - Redundant comment restating the code — **minor**
214
- - Stale comment contradicting the code — **major** (actively misleads readers)
214
+ - Stale comment contradicting the code — **minor** (misleads the next reader; it
215
+ names no runtime trigger, so the canonical rubric puts it here. It was
216
+ **major** in this file until that was reconciled against
217
+ `review-orchestrator/SKILL.md` → **Severity (canonical)**, which reviewers may
218
+ not override. If the comment's inaccuracy *causes* a defect — someone relied on
219
+ it and the code does otherwise — that defect is the finding, at its own severity)
215
220
  - Commented-out code block — **minor** (use git history, not comments, to preserve old code)
216
221
 
222
+ #### C1a. Documentation drift — the shapes worth searching for
223
+
224
+ Stale comments are not found by reading comments; they are found by reading each
225
+ comment **against the statement it sits above**. Three shapes recur, and they are
226
+ the cheapest real findings in a multi-round review:
227
+
228
+ - **A doc describing the rule a later round replaced.** A prop's JSDoc says the
229
+ tooltip drops the split "unless both are known"; the live rule is that both must
230
+ be greater than zero. The behaviour changed, the sentence did not. Check every
231
+ doc comment on every symbol the diff touched, not only the ones the diff edited.
232
+ - **A comment detached from its statement.** A `const` gets inserted between a
233
+ comment and the expression it explained, so the comment now reads as an
234
+ explanation of the insertion. The text is unchanged and is now wrong. Look for
235
+ this wherever the diff adds a line inside an existing block.
236
+ - **Two files documenting one field oppositely.** One says a cell is the valid
237
+ percentage, another computes `100 - cell` and calls it the invalid percentage.
238
+ Only one is right, and the diff just made the field load-bearing.
239
+
240
+ Where an issue or PR is cited, check that it is the right one and still says what
241
+ the comment claims — a closed *issue* cited in place of the *PR* that shipped the
242
+ work sends the next reader to the wrong page.
243
+
244
+ A comment that describes a behaviour with **no code path at all** — including one
245
+ left behind by a review finding that was later withdrawn — is the same class: it
246
+ should state the defensiveness it actually provides, not assert a path that does
247
+ not exist.
248
+
217
249
  #### C2. Comments That Compensate for Bad Names
218
250
 
219
251
  A comment whose entire purpose is to explain a poorly-named identifier is a sign to improve the name, not add a comment.
@@ -0,0 +1,217 @@
1
+ ---
2
+ name: review-layout
3
+ model_tier: standard
4
+ description: |
5
+ Use when reviewing changes to rendered layout: flex and grid sizing, intrinsic vs
6
+ extrinsic sizing, overflow and collapse, logical properties and RTL, and sensitivity
7
+ to translated text length. Every finding is measured in a real layout engine, never
8
+ reasoned from class names in a DOM stub. Dispatched by review-orchestrator for
9
+ --layout, --all, or when the diff touches sizing/spacing utilities on a rendered
10
+ element.
11
+ NOT for: whether a class exists or comes from the theme (review-frontend-conventions),
12
+ naming and readability (review-style), re-render cost (review-performance), React or
13
+ MobX structure (review-frontend).
14
+ triggers:
15
+ - "review layout"
16
+ - "layout review"
17
+ - "does this render correctly"
18
+ - "dispatched by review-orchestrator"
19
+ metadata:
20
+ author: "MrCipherSmith"
21
+ version: "1.0.0"
22
+ category: "review"
23
+ compatible_harnesses: "cursor,codex,zed,opencode,claude"
24
+ license: "MIT"
25
+ ---
26
+
27
+ # Review — Layout
28
+
29
+ Reviewer for what the CSS actually renders.
30
+
31
+ This lane exists because nobody else owns it. `review-frontend` owns React and
32
+ MobX structure; `review-style` explicitly excludes everything but naming and
33
+ readability; `review-frontend-conventions` owns whether a class is allowed;
34
+ `review-performance` owns re-render cost. **None of them answers whether the box
35
+ is the size the author thinks it is** — which is why a bar that collapses to 0px
36
+ and a score that sits 12px off centre both shipped through a full review round.
37
+
38
+ Every finding here is a claim about pixels, so every finding here is measured or
39
+ it is not filed.
40
+
41
+ ---
42
+
43
+ ## Scope
44
+
45
+ Dispatched when scope A touches, on a **rendered** element:
46
+
47
+ - sizing: `w-*`, `h-*`, `min-w-*`, `max-w-*`, `basis-*`, `flex-*`, `grid-cols-*`,
48
+ `w-fit`, `min-w-0`, `truncate`, `line-clamp-*`
49
+ - spacing that participates in centring or the box model: `p*`, `m*`, `gap-*`, and
50
+ their logical forms `ps-*`, `pe-*`, `ms-*`, `me-*`
51
+ - `overflow-*`, `position`, `z-*`, `aspect-*`
52
+ - inline `style` carrying a computed dimension
53
+ - any container whose children render translated text
54
+
55
+ Out of scope: whether a class exists or comes from the theme, and whether it is
56
+ well named.
57
+
58
+ ---
59
+
60
+ ## The one method that makes this lane real
61
+
62
+ **A DOM stub loads no stylesheet.** Under happy-dom or jsdom,
63
+ `toHaveClass("w-fit")` observes a string and never a pixel, and
64
+ `getBoundingClientRect` returns zeros for everything. A layout claim reasoned from
65
+ class names is worth nothing, and filing one is how this lane degenerates into a
66
+ class-name spellchecker.
67
+
68
+ Verify one of two ways, and put the numbers in the finding:
69
+
70
+ 1. The project's real-CSS tier — the Storybook / Playwright / component-visual
71
+ suite. Find its script in `package.json` rather than assuming a name.
72
+ 2. A direct probe that mounts the component in a real engine and reads computed
73
+ CSS off the node.
74
+
75
+ Report a table of measurements, not an adjective. `117.6px` is a finding; "the bar
76
+ may be too short" is not.
77
+
78
+ ```
79
+ host width longest label bar width
80
+ 560px "Controls" 256.0px
81
+ 560px <longest ar-AE> 182.6px
82
+ 280px "Controls" 0.0px <- collapses
83
+ ```
84
+
85
+ **If you cannot measure, you cannot file.** Say which command you tried, what
86
+ stopped you, and what would settle it. An unmeasured layout observation is `info`,
87
+ marked unverified — that is the correct outcome, not a reason to reach for a class
88
+ name instead.
89
+
90
+ ---
91
+
92
+ ## Checklist
93
+
94
+ ### Intrinsic sizing traps
95
+
96
+ - [ ] A `flex-1` / `basis-0` column inside a `w-fit` (or `max-content`) parent has
97
+ **no basis of its own**: its width is whatever the siblings' content leaves.
98
+ Measure it, then measure it again with the longest translated label the
99
+ catalog contains.
100
+ - [ ] `min-w-0` removes the automatic minimum that stops a flex item shrinking past
101
+ its content. Combined with a content-sized parent it permits **0px**. Find the
102
+ host width at which the element reaches zero and state it.
103
+ - [ ] `w-fit` + `max-w-full` is an overflow fix, not a sizing floor. Replacing a
104
+ removed `min-w-*` with `min-w-0` trades an overflow bug for a collapse bug.
105
+ - [ ] A `min-w-*` on a child plus `w-fit` at the call sites gives the card a hard
106
+ floor. Compute it, and check it against the narrowest supported host.
107
+
108
+ ### Box model and centring
109
+
110
+ - [ ] Padding inside a fixed-width box shifts centred content by half the asymmetric
111
+ padding. `w-48` (192px) with `pe-6` (24px) centres in 168px — 12px toward the
112
+ inline start.
113
+ - [ ] Directional padding that is a gutter in one state is an uncompensated offset in
114
+ the state where the neighbour is absent. Check **every** conditional render of
115
+ that sibling, including the empty and never-run states.
116
+
117
+ ### Logical properties and RTL
118
+
119
+ - [ ] `ps-*` / `pe-*` / `ms-*` / `me-*` flip under RTL: an offset toward the start in
120
+ LTR is toward the end in RTL. State both.
121
+ - [ ] A physical gradient, shadow, or transform in a component that otherwise uses
122
+ logical properties does **not** flip. Name the direction it points in each.
123
+ - [ ] Text length differs by locale. A component sized by its own labels renders
124
+ **different geometry for identical data** across locales. Measure with the
125
+ longest real translation in the catalog, never the English one.
126
+
127
+ ### Truncation and overflow
128
+
129
+ - [ ] `truncate` / `line-clamp` needs a constrained width to do anything at all.
130
+ - [ ] `overflow-hidden` on a container with a percentage-width child silently clips
131
+ rather than scrolls.
132
+
133
+ ---
134
+
135
+ ## Iron Laws
136
+
137
+ ### This reviewer's own
138
+
139
+ 1. **A layout finding without a measurement is `info`.** Name the host width, the
140
+ element width or the offset in pixels, and the command or probe that produced it.
141
+ 2. **Measure the worst real case, not the convenient one.** The longest translation
142
+ in the catalog, the narrowest supported host, the state where the sibling is
143
+ absent, the locale that flips direction.
144
+ 3. **Never flag a theoretical narrow viewport.** If no supported host reaches the
145
+ collapse width, the finding is `info` and says what would settle it. A breakpoint
146
+ nobody ships is not a trigger.
147
+
148
+ ### Shared laws (every reviewer)
149
+
150
+ 1. **A claim of runtime harm with no reproducible path is `info`.** If you cannot
151
+ name the input, call, or condition that reaches the code, you have an
152
+ observation, not a finding. Report it as `info` and say what would settle it.
153
+ 2. **Never flag the theoretical.** The path you describe must exist in the code
154
+ under review. Do not report a safe API because it could be misused, or a
155
+ pattern because it is often wrong elsewhere.
156
+ 3. **One finding per class, not one per occurrence.** When the same shape appears
157
+ at several sites, report it once and list every site. Ten findings that are one
158
+ finding hide the other nine problems.
159
+
160
+ Severity levels are defined once, in `review-orchestrator/SKILL.md` →
161
+ **Severity (canonical)**. This reviewer keeps no rubric of its own; below is only
162
+ where its recurring conditions land under that one.
163
+
164
+ | Condition | Severity | Why, under the canonical rubric |
165
+ |---|---|---|
166
+ | An element renders at 0px while its label shows, at a supported host width | `major` | Named trigger (that width), named outcome (the control is invisible) |
167
+ | Identical data renders different geometry per locale | `major` | Named trigger (the locale), named outcome (a different picture of the same number) |
168
+ | Content clipped, or the page forced to scroll horizontally, at a supported width | `major` | Named trigger and outcome |
169
+ | A cosmetic offset a user would not notice — a few px off centre | `minor` | The code behaves correctly; the cost is aesthetic |
170
+ | A measured-but-unreachable collapse, or any claim you could not measure | `info` | Shared law 1 |
171
+
172
+ ---
173
+
174
+ ## Orchestrated Review Contract
175
+
176
+ When dispatched by `review-orchestrator`, follow the provided
177
+ `reviewer-input.schema.json` payload. Return a `REVIEW_RESULT` object compatible
178
+ with `skills/review/review-orchestrator/reviewer-finding.schema.json`, then a
179
+ concise markdown summary. Prefix finding ids `LY-`.
180
+
181
+ ### Class scope — required for `blocker` and `major`
182
+
183
+ Every `blocker` and `major` carries `class_scope`: **every** element with the same
184
+ sizing shape, and **how you enumerated them** — the search you ran, or the
185
+ component whose call sites derive the set.
186
+
187
+ ```yaml
188
+ class_scope:
189
+ sites: ["src/dq/components/DqScoreCard.tsx:111", "src/dq/components/DqTrendCard.tsx:88"]
190
+ enumeration_method: "grep for `min-w-0 flex-1` under a w-fit ancestor; 4 cards, 2 collapse"
191
+ ```
192
+
193
+ "I checked the others" is not an enumeration method. A single-entry `sites` list is
194
+ a claim that the class has exactly one member — make it deliberately.
195
+
196
+ ```markdown
197
+ ### [LY-NNN] Title
198
+
199
+ - **Severity**: blocker | major | minor | info
200
+ - **File**: path/to/Component.tsx:line
201
+ - **Problem**: what the box does
202
+ - **Measurement**: host width, element width or offset, and the command or probe
203
+ - **Why it matters**: what the user sees, in which state and which locale
204
+ - **Fix**: the concrete sizing change
205
+ ```
206
+
207
+ ---
208
+
209
+ ## Red Flags
210
+
211
+ | Rationalization | Why it is wrong |
212
+ |----------------|-----------------|
213
+ | "`toHaveClass('w-fit')` passes, so the width is right." | The stub loads no CSS. That assertion cannot fail on a layout bug. |
214
+ | "This will obviously overflow on mobile." | Measure it, or name the supported host that reaches it. Otherwise `info`. |
215
+ | "The class names look fine." | This lane does not review class names. That is `review-frontend-conventions`. |
216
+ | "I could not run the visual tier, so I reasoned it out." | Then it is `info`, marked unverified. Reasoning does not become measurement by being careful. |
217
+ | "RTL is handled, the component uses logical properties." | Check the gradients, shadows and transforms too. Those are the ones that do not flip. |
@@ -107,6 +107,32 @@ Do not review unrelated files.
107
107
  - [ ] Incorrect boolean logic (double negation, De Morgan's law violations)
108
108
  - [ ] Unreachable branches or dead code that hides a bug
109
109
 
110
+ ### The Change That Does Nothing
111
+
112
+ The diff adds a prop, guard, field or branch, and nothing can reach it. The code is
113
+ correct — which is why every reviewer asking "is this correct" passes it — and the
114
+ work the change was written to do is not done.
115
+
116
+ - [ ] A prop passed to a component that cannot act on it: the parent unmounts the
117
+ child rather than disabling it, or the render site the prop guards is gated by
118
+ a condition that is false whenever the prop is true.
119
+ - [ ] A field added to a type, a `Pick`, or a payload and never read. Search for the
120
+ reads before accepting it as plumbing for a later change; if it is, say so.
121
+ - [ ] A guard against a value its producer cannot emit — `=== undefined` against a
122
+ backend that stamps `0`, a status the producer writes in one place the route
123
+ never reaches.
124
+ - [ ] State set on one path and cleared on none, or cleared only on paths the
125
+ triggering interaction cannot take.
126
+ - [ ] A branch whose condition is unsatisfiable given the call sites in this repo.
127
+
128
+ Prove it by **negative enumeration**: name the complete candidate set and why each
129
+ member fails to apply, in `class_scope.enumeration_method` with `sites: []`. See
130
+ **Negative enumeration** in `review-orchestrator/SKILL.md` → Finding Format.
131
+
132
+ `minor` when the change is merely dead. `major` when its deadness means the defect
133
+ it was written to fix is still live — the usual case when the change answers an
134
+ earlier review round, because there the finding is recorded as closed and is not.
135
+
110
136
  ### Null / Undefined / Optional Chaining
111
137
 
112
138
  - [ ] Accessing property on value that can be `null` or `undefined` without guard