@mrciphersmith/keryx 0.2.72 → 0.2.74
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +33409 -32626
- package/package.json +2 -2
- package/src/gdskills/bundled/rules/core/gproject-contracts.mdc +1 -1
- package/src/gdskills/bundled/rules/core/jobs-documentation.mdc +1 -1
- package/src/gdskills/bundled/rules/core/subagent-context-construction.md +1 -1
- package/src/gdskills/bundled/skills/core/reviewer-skill-creator/SKILL.md +214 -0
- package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.codex.md +326 -20
- package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.cursor.md +320 -22
- package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.opencode.md +326 -12
- package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.zed.md +333 -9
- package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.codex.md +92 -4
- package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.cursor.md +92 -4
- package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.opencode.md +92 -4
- package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.zed.md +92 -4
- package/src/gdskills/bundled/skills/orchestration/context-collector/orchestrator-prompt.md +1 -1
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.codex.md +154 -1098
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.cursor.md +154 -1098
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.opencode.md +154 -1098
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.zed.md +154 -1098
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/orchestrator-prompt.md +1 -1
- package/src/gdskills/bundled/skills/orchestration/feature-dev/SKILL.codex.md +101 -41
- package/src/gdskills/bundled/skills/orchestration/feature-dev/SKILL.cursor.md +101 -41
- package/src/gdskills/bundled/skills/orchestration/flow-orchestrator/SKILL.md +48 -1
- package/src/gdskills/bundled/skills/orchestration/flow-orchestrator/input-contract.schema.json +70 -4
- package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.codex.md +115 -49
- package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.cursor.md +115 -49
- package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.opencode.md +115 -49
- package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.zed.md +115 -49
- package/src/gdskills/bundled/skills/orchestration/issue-analyzer/orchestrator-prompt.md +1 -1
- package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.codex.md +15 -6
- package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.cursor.md +15 -6
- package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.opencode.md +15 -6
- package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.zed.md +15 -6
- package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.codex.md +1 -1
- package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.cursor.md +1 -1
- package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.md +1 -1
- package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.opencode.md +1 -1
- package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.zed.md +1 -1
- package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.codex.md +300 -55
- package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.cursor.md +300 -55
- package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.md +120 -37
- package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.opencode.md +300 -55
- package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.zed.md +300 -55
- package/src/gdskills/bundled/skills/orchestration/task-implementer/input-contract.schema.json +56 -14
- package/src/gdskills/bundled/skills/orchestration/task-implementer/orchestrator-prompt.md +50 -23
- package/src/gdskills/bundled/skills/orchestration/task-implementer/output-contract.schema.json +6 -2
- package/src/gdskills/bundled/skills/orchestration/task-implementer/task-request.template.md +18 -12
- package/src/gdskills/bundled/skills/planning/brainstorm/SKILL.codex.md +1 -1
- package/src/gdskills/bundled/skills/planning/brainstorm/SKILL.cursor.md +1 -1
- package/src/gdskills/bundled/skills/planning/consistency-checker/SKILL.codex.md +169 -10
- package/src/gdskills/bundled/skills/planning/consistency-checker/SKILL.cursor.md +169 -10
- package/src/gdskills/bundled/skills/planning/consistency-checker/SKILL.md +1 -1
- package/src/gdskills/bundled/skills/planning/interview/SKILL.codex.md +7 -1
- package/src/gdskills/bundled/skills/planning/interview/SKILL.cursor.md +7 -1
- package/src/gdskills/bundled/skills/planning/interviewer/SKILL.codex.md +7 -1
- package/src/gdskills/bundled/skills/planning/interviewer/SKILL.cursor.md +7 -1
- package/src/gdskills/bundled/skills/planning/patterns-researcher/SKILL.codex.md +216 -10
- package/src/gdskills/bundled/skills/planning/patterns-researcher/SKILL.cursor.md +216 -10
- package/src/gdskills/bundled/skills/planning/patterns-researcher/SKILL.md +1 -1
- package/src/gdskills/bundled/skills/planning/planner/SKILL.codex.md +169 -10
- package/src/gdskills/bundled/skills/planning/planner/SKILL.cursor.md +169 -10
- package/src/gdskills/bundled/skills/planning/planner/SKILL.md +1 -1
- package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.codex.md +2 -2
- package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.cursor.md +2 -2
- package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.opencode.md +2 -2
- package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.zed.md +2 -2
- package/src/gdskills/bundled/skills/planning/problem-definer/SKILL.codex.md +134 -10
- package/src/gdskills/bundled/skills/planning/problem-definer/SKILL.cursor.md +134 -10
- package/src/gdskills/bundled/skills/planning/problem-definer/SKILL.md +1 -1
- package/src/gdskills/bundled/skills/planning/project-discovery/SKILL.codex.md +146 -10
- package/src/gdskills/bundled/skills/planning/project-discovery/SKILL.cursor.md +146 -10
- package/src/gdskills/bundled/skills/planning/project-discovery/SKILL.md +1 -1
- package/src/gdskills/bundled/skills/planning/spec-writer/SKILL.codex.md +211 -10
- package/src/gdskills/bundled/skills/planning/spec-writer/SKILL.cursor.md +211 -10
- package/src/gdskills/bundled/skills/planning/spec-writer/SKILL.md +1 -1
- package/src/gdskills/bundled/skills/planning/stack-advisor/SKILL.codex.md +162 -10
- package/src/gdskills/bundled/skills/planning/stack-advisor/SKILL.cursor.md +162 -10
- package/src/gdskills/bundled/skills/planning/stack-advisor/SKILL.md +1 -1
- package/src/gdskills/bundled/skills/platform/claude-md-management/SKILL.codex.md +1 -1
- package/src/gdskills/bundled/skills/platform/claude-md-management/SKILL.cursor.md +1 -1
- package/src/gdskills/bundled/skills/platform/hookify/SKILL.codex.md +1 -1
- package/src/gdskills/bundled/skills/platform/hookify/SKILL.cursor.md +1 -1
- package/src/gdskills/bundled/skills/quality/changelog/SKILL.codex.md +1 -1
- package/src/gdskills/bundled/skills/quality/changelog/SKILL.cursor.md +1 -1
- package/src/gdskills/bundled/skills/quality/commit/SKILL.codex.md +1 -1
- package/src/gdskills/bundled/skills/quality/commit/SKILL.cursor.md +1 -1
- package/src/gdskills/bundled/skills/quality/db-migrate/SKILL.codex.md +1 -1
- package/src/gdskills/bundled/skills/quality/db-migrate/SKILL.cursor.md +1 -1
- package/src/gdskills/bundled/skills/quality/dependency-update/SKILL.codex.md +1 -1
- package/src/gdskills/bundled/skills/quality/dependency-update/SKILL.cursor.md +1 -1
- package/src/gdskills/bundled/skills/quality/deploy/SKILL.codex.md +1 -1
- package/src/gdskills/bundled/skills/quality/deploy/SKILL.cursor.md +1 -1
- package/src/gdskills/bundled/skills/quality/perf-check/SKILL.codex.md +1 -1
- package/src/gdskills/bundled/skills/quality/perf-check/SKILL.cursor.md +1 -1
- package/src/gdskills/bundled/skills/quality/pr/SKILL.codex.md +1 -1
- package/src/gdskills/bundled/skills/quality/pr/SKILL.cursor.md +1 -1
- package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.codex.md +15 -1
- package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.cursor.md +248 -165
- package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.opencode.md +15 -1
- package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.zed.md +359 -19
- package/src/gdskills/bundled/skills/quality/push/SKILL.codex.md +1 -1
- package/src/gdskills/bundled/skills/quality/push/SKILL.cursor.md +1 -1
- package/src/gdskills/bundled/skills/quality/security-audit/SKILL.codex.md +1 -1
- package/src/gdskills/bundled/skills/quality/security-audit/SKILL.cursor.md +1 -1
- package/src/gdskills/bundled/skills/quality/test-gen/SKILL.codex.md +1 -1
- package/src/gdskills/bundled/skills/quality/test-gen/SKILL.cursor.md +1 -1
- package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.codex.md +299 -24
- package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.cursor.md +296 -31
- package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.opencode.md +309 -18
- package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.zed.md +312 -17
- package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.codex.md +29 -30
- package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.cursor.md +29 -30
- package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.opencode.md +29 -30
- package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.zed.md +29 -30
- package/src/gdskills/bundled/skills/review/code-learned-review/SKILL.codex.md +21 -30
- package/src/gdskills/bundled/skills/review/code-learned-review/SKILL.cursor.md +21 -30
- package/src/gdskills/bundled/skills/review/code-learned-review/SKILL.opencode.md +21 -30
- package/src/gdskills/bundled/skills/review/code-learned-review/SKILL.zed.md +21 -30
- package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.codex.md +19 -23
- package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.cursor.md +19 -23
- package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.opencode.md +19 -23
- package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.zed.md +19 -23
- package/src/gdskills/bundled/skills/review/code-style-review/SKILL.codex.md +17 -24
- package/src/gdskills/bundled/skills/review/code-style-review/SKILL.cursor.md +17 -24
- package/src/gdskills/bundled/skills/review/code-style-review/SKILL.opencode.md +17 -24
- package/src/gdskills/bundled/skills/review/code-style-review/SKILL.zed.md +17 -24
- package/src/gdskills/bundled/skills/review/review-clean-code/SKILL.md +33 -1
- package/src/gdskills/bundled/skills/review/review-layout/SKILL.md +217 -0
- package/src/gdskills/bundled/skills/review/review-logic/SKILL.md +26 -0
- package/src/gdskills/bundled/skills/review/review-orchestrator/SKILL.md +320 -5
- package/src/gdskills/bundled/skills/review/review-pr-feedback/SKILL.md +644 -113
- package/src/gdskills/bundled/skills/review/review-pr-feedback/input-contract.schema.json +79 -0
- package/src/gdskills/bundled/skills/review/review-pr-feedback/output-contract.schema.json +375 -0
- package/src/gdskills/bundled/skills/review/review-testing-practices/SKILL.md +111 -1
- package/src/gdskills/bundled/skills/review/review-verifier/SKILL.md +25 -1
- package/src/gdskills/bundled/skills/planning/brainstorm/SKILL.claude.md +0 -46
- package/src/gdskills/bundled/skills/planning/interviewer/SKILL.claude.md +0 -94
- package/src/gdskills/bundled/skills/quality/changelog/SKILL.claude.md +0 -45
- package/src/gdskills/bundled/skills/quality/db-migrate/SKILL.claude.md +0 -40
- package/src/gdskills/bundled/skills/quality/dependency-update/SKILL.claude.md +0 -45
- package/src/gdskills/bundled/skills/quality/deploy/SKILL.claude.md +0 -42
- package/src/gdskills/bundled/skills/quality/perf-check/SKILL.claude.md +0 -48
- package/src/gdskills/bundled/skills/quality/security-audit/SKILL.claude.md +0 -40
- package/src/gdskills/bundled/skills/quality/test-gen/SKILL.claude.md +0 -30
|
@@ -28,32 +28,11 @@ license: "MIT"
|
|
|
28
28
|
- Фидбек должен быть подробным: проблема -> почему это проблема -> где (файл/участок) -> что сделать -> пример исправления.
|
|
29
29
|
- Исправления предлагай в виде unified diff-патчей, не вноси изменения в код напрямую.
|
|
30
30
|
|
|
31
|
-
##
|
|
31
|
+
## Scope Detection
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
See shared script: `skills/shared/git-merge-base.md`
|
|
34
34
|
|
|
35
|
-
|
|
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
|
-
##
|
|
31
|
+
## Scope Detection
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
See shared script: `skills/shared/git-merge-base.md`
|
|
34
34
|
|
|
35
|
-
|
|
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 — **
|
|
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
|