@mrciphersmith/keryx 0.3.119 → 0.3.121

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 (42) hide show
  1. package/dist/cli.js +9730 -5314
  2. package/dist/core.js +1162 -812
  3. package/package.json +1 -1
  4. package/src/gdskills/bundled/install-manifest.json +2 -1
  5. package/src/gdskills/bundled/rules/core/session-plan-bridge.mdc +1 -1
  6. package/src/gdskills/bundled/skills/orchestration/feature-dev/SKILL.md +4 -4
  7. package/src/gdskills/bundled/skills/orchestration/flow-orchestrator/SKILL.md +47 -59
  8. package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.detail.md +70 -0
  9. package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.md +42 -79
  10. package/src/gdskills/bundled/skills/orchestration/job-orchestrator/orchestrator-prompt.md +1 -1
  11. package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.md +12 -18
  12. package/src/gdskills/bundled/skills/orchestration/task-implementer/input-contract.schema.json +25 -2
  13. package/src/gdskills/bundled/skills/orchestration/task-implementer/output-contract.schema.json +19 -0
  14. package/src/gdskills/bundled/skills/review/review-architecture/SKILL.md +6 -11
  15. package/src/gdskills/bundled/skills/review/review-backend/SKILL.md +6 -11
  16. package/src/gdskills/bundled/skills/review/review-clean-code/SKILL.md +6 -11
  17. package/src/gdskills/bundled/skills/review/review-core-boundaries/SKILL.md +5 -10
  18. package/src/gdskills/bundled/skills/review/review-flow-graph/SKILL.md +5 -10
  19. package/src/gdskills/bundled/skills/review/review-frontend/SKILL.md +8 -17
  20. package/src/gdskills/bundled/skills/review/review-frontend-conventions/SKILL.md +8 -15
  21. package/src/gdskills/bundled/skills/review/review-highload/SKILL.md +6 -11
  22. package/src/gdskills/bundled/skills/review/review-jev-comments/SKILL.md +4 -9
  23. package/src/gdskills/bundled/skills/review/review-jev-contract/SKILL.md +4 -9
  24. package/src/gdskills/bundled/skills/review/review-jev-docs/SKILL.md +4 -9
  25. package/src/gdskills/bundled/skills/review/review-jev-risk/SKILL.md +4 -9
  26. package/src/gdskills/bundled/skills/review/review-jev-rules/SKILL.md +4 -9
  27. package/src/gdskills/bundled/skills/review/review-jev-scenarios/SKILL.md +4 -9
  28. package/src/gdskills/bundled/skills/review/review-layout/SKILL.md +8 -9
  29. package/src/gdskills/bundled/skills/review/review-logic/SKILL.md +7 -12
  30. package/src/gdskills/bundled/skills/review/review-orchestrator/SKILL.detail.md +39 -2
  31. package/src/gdskills/bundled/skills/review/review-orchestrator/SKILL.md +49 -92
  32. package/src/gdskills/bundled/skills/review/review-orchestrator/reviewer-finding.schema.json +13 -0
  33. package/src/gdskills/bundled/skills/review/review-orchestrator/reviewer-input.schema.json +38 -0
  34. package/src/gdskills/bundled/skills/review/review-performance/SKILL.md +6 -11
  35. package/src/gdskills/bundled/skills/review/review-pr-contract/SKILL.md +2 -2
  36. package/src/gdskills/bundled/skills/review/review-pr-feedback/SKILL.md +8 -10
  37. package/src/gdskills/bundled/skills/review/review-premise/SKILL.md +180 -0
  38. package/src/gdskills/bundled/skills/review/review-regression/SKILL.md +4 -4
  39. package/src/gdskills/bundled/skills/review/review-security-code/SKILL.md +6 -11
  40. package/src/gdskills/bundled/skills/review/review-style/SKILL.md +6 -11
  41. package/src/gdskills/bundled/skills/review/review-testing-practices/SKILL.md +2 -2
  42. package/src/gdskills/contracts/review-finding.schema.json +88 -0
@@ -98,11 +98,13 @@ For a description-based task, omit `issue_number` and issue references in commit
98
98
 
99
99
  ```
100
100
  FIX_CONTEXT:
101
- review_feedback: structured findings from reviewer (file, line, severity, message)
101
+ review_feedback: structured findings from reviewer (id, file, line, severity, message, suggested_fix); the one statement of the premise fields (flow 459): `premise_verdict` on each item review-premise judged, and `premise_answer: "uphold"` on a held one (challenged, owner-decision) the operator upheld; an item with a held `premise_verdict` and no `premise_answer: "uphold"` is refused, not fixed
102
102
  original_task_ids: the tasks that introduced the findings (array)
103
103
  iteration: fix iteration number, 1..3 — the same repair bound as 5.4
104
104
  ```
105
105
 
106
+ **A reviewer's `suggested_fix` is a hypothesis, not an instruction.** Per finding: reproduce it first — a test or probe that fails on the current head (red); check the suggested fix against the plan's state × event matrix (`plan.md`, when it has one) and every caller the change reaches; then fix and show the probe green. A finding that does not reproduce is reported, not fixed. Record each divergence in `notes`: `suggested_fix diverged: <id> — <what you did instead and why>` or `did not reproduce: <id>`.
107
+
106
108
  **1.4 Validate the request against the contract:**
107
109
 
108
110
  Write the request you were handed to a file and run:
@@ -143,7 +145,7 @@ git -C "<codebase_path>" rev-parse --abbrev-ref HEAD # must equal <branch>
143
145
 
144
146
  **1.5 TDD Check (if `test_case_specs` is present):**
145
147
 
146
- If the task object contains `test_case_specs` (provided by `tests-creator`):
148
+ If the task object contains `test_case_specs` (provided by `tests-creator`, or in a fix round the reviewers' red probes):
147
149
  1. Read each test file listed in `test_case_specs.test_files`
148
150
  2. Run the tests using `test_case_specs.run_command` — confirm they FAIL
149
151
  3. If tests pass already → report `DONE_WITH_CONCERNS` (tests may not be testing the right thing)
@@ -427,6 +429,7 @@ Write full JSON to `<JOBS_ROOT>/<JOB_NAME>/results/<task_id>.json`:
427
429
  "skill_drift": "<none | stale: <module>/<skill> — <what diverged> | missing: <module> should have a project-skill>",
428
430
  "noticed_not_touched": [{ "what": "<problem>", "where": "<path|symbol>" }],
429
431
  "assumptions": ["<what you assumed where the task did not say>"],
432
+ "behavior_changes": [{ "description": "<what now behaves differently>", "user_visible": true, "needs_operator": true, "alternatives": ["<option you did not take>"] }],
430
433
  "not_touched": [{ "path": "src/path/file.ts", "reason": "<why left alone>" }],
431
434
  "notes": "<any warnings, blockers, or additional context>"
432
435
  }
@@ -434,23 +437,14 @@ Write full JSON to `<JOBS_ROOT>/<JOB_NAME>/results/<task_id>.json`:
434
437
 
435
438
  Set `skill_drift` from Phase 2.0b: if the project-skill you used was not `fresh`, or the code you wrote diverged from what a skill documents, name the skill and the divergence. The orchestrator uses this to decide whether to trigger `skills learn` (do NOT run `learn` yourself — it is a mutating step the orchestrator dispatches; see `rules/core/skill-lifecycle.mdc`).
436
439
 
437
- Three of those fields have a bar, and a field that collects noise trains the
438
- reader to skim all three. Omit one rather than pad it. The trio is adapted (MIT;
439
- see THIRD_PARTY_NOTICES.md) as contract fields rather than a free-text template; the bars below are ours.
440
+ Four of those fields have a bar, and a field that collects noise trains the reader to skim all of them. Omit one rather than pad it. The first three are adapted (MIT; see THIRD_PARTY_NOTICES.md) as contract fields rather than a free-text template; the bars below are ours.
440
441
 
441
- - `assumptions` — what you assumed where the task was silent AND acted on. If
442
- the assumption being wrong would not change a line you wrote, it is a hedge,
443
- not an assumption; leave it out.
444
- - `noticed_not_touched` — a problem in code you actually read, stated so a
445
- follow-up task could be written from it alone, with `where` it lives. Not a
446
- dumping ground for every smell seen in passing, and not style opinion.
447
- - `not_touched` — of the files this task was aimed at (`target_files`), the ones
448
- absent from `files_modified`/`files_created`/`files_deleted`, each with why.
449
- It answers that one question and no other: a reader subtracts those lists and
450
- this one from `target_files`, and flags the remainder as an unexplained omission.
442
+ - `assumptions` — what you assumed where the task was silent AND acted on. If the assumption being wrong would not change a line you wrote, it is a hedge, not an assumption; leave it out.
443
+ - `noticed_not_touched` — a problem in code you actually read, stated so a follow-up task could be written from it alone, with `where` it lives. Not a dumping ground for every smell seen in passing, and not style opinion.
444
+ - `not_touched` — of the files this task was aimed at (`target_files`), the ones absent from `files_modified`/`files_created`/`files_deleted`, each with why. It answers that one question and no other: a reader subtracts those lists and this one from `target_files`, and flags the remainder as an unexplained omission.
445
+ - `behavior_changes` — behavior you chose where the task and the plan's state × event matrix did not decide it. **Every user-visible tradeoff goes here with `user_visible: true, needs_operator: true`** and the `alternatives` you rejected: message wording, where an error appears, which state resets or survives a switch, retry or reload. Never only in `assumptions`, `notes` or a journal line — the orchestrator asks the operator before it accepts a result carrying one, and a tradeoff it cannot see is accepted unasked.
451
446
 
452
- Then check the shape and record the file — two commands, both of which refuse
453
- rather than warn:
447
+ Then check the shape and record the file — two commands, both of which refuse rather than warn:
454
448
 
455
449
  ```bash
456
450
  keryx skills contracts validate <JOBS_ROOT>/<JOB_NAME>/results/<task_id>.json \
@@ -489,7 +483,7 @@ The step's own status is the orchestrator's to write (`keryx job step <JOB_NAME>
489
483
 
490
484
  Return a compact STATUS response following `rules/core/subagent-status-protocol.md`.
491
485
  **Do NOT include the full JSON block inline** — the orchestrator reads the result file when it needs details.
492
- The inline response must contain only: STATUS line + Completed bullets + Files changed + Verification summary.
486
+ The inline response must contain only: STATUS line + Completed bullets + Files changed + Verification summary + a `## Behavior changes` list (each entry's description, `user_visible`, `needs_operator`, alternatives) whenever `behavior_changes` is non-empty — a flow dispatch writes no result file, so this list is the only copy the orchestrator reads. Any `needs_operator: true` entry makes the status at best `DONE_WITH_CONCERNS`, never `DONE`.
493
487
 
494
488
  **Status classification:**
495
489
  - `success` → `STATUS: DONE`, or `DONE_WITH_CONCERNS` when work that cleared the
@@ -149,6 +149,14 @@
149
149
  "additionalProperties": false,
150
150
  "required": ["file", "severity", "message"],
151
151
  "properties": {
152
+ "id": {
153
+ "type": "string",
154
+ "description": "The finding's id in the review package, cited back in the result's `notes` when the fix diverged from `suggested_fix` or the finding did not reproduce"
155
+ },
156
+ "suggested_fix": {
157
+ "type": "string",
158
+ "description": "The reviewer's proposed fix. A hypothesis, not an instruction: SKILL.md 1.3 reproduces the finding first and checks this against the plan's state × event matrix before applying anything"
159
+ },
152
160
  "file": {
153
161
  "type": "string",
154
162
  "description": "File path where the issue was found"
@@ -170,10 +178,25 @@
170
178
  "type": "string",
171
179
  "description": "Which review skill found this",
172
180
  "examples": ["code-ai-review", "code-learned-review", "code-style-review"]
181
+ },
182
+ "premise_verdict": {
183
+ "type": "string",
184
+ "enum": ["upheld", "downgraded", "challenged", "owner-decision"],
185
+ "description": "What review-premise found, when it judged this finding (flow 459). `challenged` and `owner-decision` HOLD the finding: such an item is valid only with `premise_answer: uphold`, so a held finding that reached a fixer without the operator's answer fails this contract instead of being fixed."
186
+ },
187
+ "premise_answer": {
188
+ "type": "string",
189
+ "enum": ["uphold"],
190
+ "description": "The operator's answer to a held finding, recorded with `keryx review decide-premise` (or the `review_decide_premise` card). Only `uphold` returns a finding to the fix; a dismissed one is never dispatched."
173
191
  }
174
- }
192
+ },
193
+ "if": {
194
+ "required": ["premise_verdict"],
195
+ "properties": { "premise_verdict": { "enum": ["challenged", "owner-decision"] } }
196
+ },
197
+ "then": { "required": ["premise_answer"] }
175
198
  },
176
- "description": "Structured findings from review skills"
199
+ "description": "Structured findings from review skills, to fix. Never carries a finding held by review-premise (verdict challenged or owner-decision) until the operator upholds it with `keryx review decide-premise`; the caller filters held findings out before dispatch, and an item that names a held verdict without `premise_answer: uphold` is refused by this contract."
177
200
  },
178
201
  "original_task_ids": {
179
202
  "type": "array",
@@ -65,6 +65,25 @@
65
65
  "description": "What was assumed where the task did not say. A wrong assumption is the usual cause of a rejected result, so these are the first thing a reviewer should check. Read only by a human — nothing in the result or the request can confirm an assumption, so this is deliberately an array of sentences rather than a structure that would imply a check nobody performs.",
66
66
  "items": { "type": "string", "minLength": 1 }
67
67
  },
68
+ "behavior_changes": {
69
+ "type": "array",
70
+ "description": "Behavior the implementer chose where the task and the plan's state × event matrix did not decide it. Every user-visible tradeoff (message wording, error placement, which state resets or survives) is listed with `user_visible: true, needs_operator: true`; flow-orchestrator Phase 2 asks the operator before accepting a result carrying such an entry, so a tradeoff recorded only in `assumptions` or `notes` is one nobody decided.",
71
+ "items": {
72
+ "type": "object",
73
+ "additionalProperties": false,
74
+ "required": ["description", "user_visible", "needs_operator"],
75
+ "properties": {
76
+ "description": { "type": "string", "minLength": 1, "description": "What now behaves differently, stated as the user or caller would observe it" },
77
+ "user_visible": { "type": "boolean", "description": "A user of the product can see the difference" },
78
+ "needs_operator": { "type": "boolean", "description": "The choice is a product decision the operator must confirm before the result is accepted" },
79
+ "alternatives": {
80
+ "type": "array",
81
+ "description": "The options not taken, so the operator chooses between real alternatives rather than approving the one shown",
82
+ "items": { "type": "string", "minLength": 1 }
83
+ }
84
+ }
85
+ }
86
+ },
68
87
  "not_touched": {
69
88
  "type": "array",
70
89
  "description": "Files a reader would expect in `files_modified` and will not find there, each with the reason. `path` is a separate field because this is machine-checkable: a reader holding the request can subtract `files_modified`/`files_created`/`files_deleted` and this list from `task.target_files` and flag whatever is left as an unexplained omission.",
@@ -26,7 +26,7 @@ license: "MIT"
26
26
 
27
27
  Specialized reviewer for **architectural patterns and structural decisions**.
28
28
  Reviews only changes introduced in the current branch (merge-base to HEAD).
29
- Focuses exclusively on verifiable structural violations — not style opinions or hypothetical concerns. Its inputs are the reviewer payload only; session memory and earlier conversation are not inputs.
29
+ Focuses exclusively on verifiable structural violations — not style opinions or hypothetical concerns. Its inputs are the reviewer payload only; session memory and earlier conversation are not inputs. It runs no command unless its payload's `allowed_tools` says `run-tests`, except the read-only `git log`, `git blame` and `git show` where its host gives a read-only child git (keryx shell does not: there the payload supplies the history).
30
30
 
31
31
  ---
32
32
 
@@ -66,7 +66,7 @@ See shared script: `.metaproject/skills/gdskills/shared/git-merge-base.md`
66
66
  Review scope: **changes introduced in the current branch since merge-base only**.
67
67
  Do not review pre-existing architectural problems unless they are directly touched by the diff.
68
68
 
69
- **Supplied text first.** When the payload carries `slices`, `context_files`, `diff` or `file_contents`, review exactly that text: a read-only child has no shell, so run no git command and never rebuild the diff. Only with none supplied, collect it:
69
+ **Supplied text first.** When the payload carries `slices`, `context_files`, `diff` or `file_contents`, review exactly that text and never rebuild the diff. A choice's history (law 4) is read with `git log`, `git blame` and `git show` only where the host gives a read-only child git; on keryx shell a read-only child has no shell and no git tool, so read the `git log -L`/`git blame` excerpts the payload supplies, or say the history was not read. Only with none supplied, collect it:
70
70
  ```bash
71
71
  git diff --name-status "${BASE_SHA}" && git diff "${BASE_SHA}" && git ls-files --others --exclude-standard
72
72
  # explicit range: <FROM_SHA>..<TO_SHA> in place of "${BASE_SHA}"
@@ -269,15 +269,10 @@ if the concern is purely readability it belongs to `review-style`.
269
269
 
270
270
  ### Shared laws (every reviewer)
271
271
 
272
- 1. **A claim of runtime harm with no reproducible path is `info`.** If you cannot
273
- name the input, call, or condition that reaches the code, you have an
274
- observation, not a finding. Report it as `info` and say what would settle it.
275
- 2. **Never flag the theoretical.** The path you describe must exist in the code
276
- under review. Do not report a safe API because it could be misused, or a
277
- pattern because it is often wrong elsewhere.
278
- 3. **One finding per class, not one per occurrence.** When the same shape appears
279
- at several sites, report it once and list every site. Ten findings that are one
280
- finding hide the other nine problems.
272
+ 1. **A claim of runtime harm with no reproducible path is `info`.** If you cannot name the input, call, or condition that reaches the code, you have an observation, not a finding. Report it as `info` and say what would settle it.
273
+ 2. **Never flag the theoretical.** The path you describe must exist in the code under review. Do not report a safe API because it could be misused, or a pattern because it is often wrong elsewhere.
274
+ 3. **One finding per class, not one per occurrence.** When the same shape appears at several sites, report it once and list every site. Ten findings that are one finding hide the other nine problems.
275
+ 4. **A deliberate choice is not a defect until its reason is read and shown wrong.** An explicit override, suppression or exemption, a comment or commit giving a reason, or a sibling doing the same is a decision: read its reason (the comment, `git log -L` or `git blame`, the sibling) before you report it, and report it only when you can show that reason wrong. A project rule is checked against accepted platform practice and its known exceptions before a deviation from it is reported.
281
276
 
282
277
  Severity levels are defined once, in `review-orchestrator/SKILL.md` →
283
278
  **Severity (canonical)**. This reviewer does not restate them: `blocker` is the
@@ -26,7 +26,7 @@ license: "MIT"
26
26
 
27
27
  Focused backend reviewer covering NestJS patterns, REST API design, database access patterns,
28
28
  and TypeScript correctness for service-layer code. This skill does NOT duplicate security or
29
- performance checks — those belong to `review-security-code` and `review-performance`. Its inputs are the reviewer payload only; session memory and earlier conversation are not inputs.
29
+ performance checks — those belong to `review-security-code` and `review-performance`. Its inputs are the reviewer payload only; session memory and earlier conversation are not inputs. It runs no command unless its payload's `allowed_tools` says `run-tests`, except the read-only `git log`, `git blame` and `git show` where its host gives a read-only child git (keryx shell does not: there the payload supplies the history).
30
30
 
31
31
  ---
32
32
 
@@ -65,7 +65,7 @@ Run that script to determine `BASE_SHA` before collecting the diff.
65
65
 
66
66
  Only review files changed in scope. Do not comment on legacy code outside the diff.
67
67
 
68
- **Supplied text first.** When the payload carries `slices`, `context_files`, `diff` or `file_contents`, review exactly that text: a read-only child has no shell, so run no git command and never rebuild the diff. Only with none supplied, collect it:
68
+ **Supplied text first.** When the payload carries `slices`, `context_files`, `diff` or `file_contents`, review exactly that text and never rebuild the diff. A choice's history (law 4) is read with `git log`, `git blame` and `git show` only where the host gives a read-only child git; on keryx shell a read-only child has no shell and no git tool, so read the `git log -L`/`git blame` excerpts the payload supplies, or say the history was not read. Only with none supplied, collect it:
69
69
  ```bash
70
70
  git diff --name-status "${BASE_SHA}" && git diff "${BASE_SHA}" && git ls-files --others --exclude-standard
71
71
  # explicit range: <FROM_SHA>..<TO_SHA> in place of "${BASE_SHA}"
@@ -187,15 +187,10 @@ git diff --name-status "${BASE_SHA}" && git diff "${BASE_SHA}" && git ls-files -
187
187
 
188
188
  ### Shared laws (every reviewer)
189
189
 
190
- 1. **A claim of runtime harm with no reproducible path is `info`.** If you cannot
191
- name the input, call, or condition that reaches the code, you have an
192
- observation, not a finding. Report it as `info` and say what would settle it.
193
- 2. **Never flag the theoretical.** The path you describe must exist in the code
194
- under review. Do not report a safe API because it could be misused, or a
195
- pattern because it is often wrong elsewhere.
196
- 3. **One finding per class, not one per occurrence.** When the same shape appears
197
- at several sites, report it once and list every site. Ten findings that are one
198
- finding hide the other nine problems.
190
+ 1. **A claim of runtime harm with no reproducible path is `info`.** If you cannot name the input, call, or condition that reaches the code, you have an observation, not a finding. Report it as `info` and say what would settle it.
191
+ 2. **Never flag the theoretical.** The path you describe must exist in the code under review. Do not report a safe API because it could be misused, or a pattern because it is often wrong elsewhere.
192
+ 3. **One finding per class, not one per occurrence.** When the same shape appears at several sites, report it once and list every site. Ten findings that are one finding hide the other nine problems.
193
+ 4. **A deliberate choice is not a defect until its reason is read and shown wrong.** An explicit override, suppression or exemption, a comment or commit giving a reason, or a sibling doing the same is a decision: read its reason (the comment, `git log -L` or `git blame`, the sibling) before you report it, and report it only when you can show that reason wrong. A project rule is checked against accepted platform practice and its known exceptions before a deviation from it is reported.
199
194
 
200
195
  Severity levels are defined once, in `review-orchestrator/SKILL.md` →
201
196
  **Severity (canonical)**. This reviewer does not restate them: `blocker` is the
@@ -27,7 +27,7 @@ license: "MIT"
27
27
  # Review: Clean Code + SOLID
28
28
 
29
29
  Specialized reviewer for **Clean Code principles** (Robert C. Martin) and **SOLID** at the
30
- function and class level. Focuses on code in the current branch diff only. Its inputs are the reviewer payload only; session memory and earlier conversation are not inputs.
30
+ function and class level. Focuses on code in the current branch diff only. Its inputs are the reviewer payload only; session memory and earlier conversation are not inputs. It runs no command unless its payload's `allowed_tools` says `run-tests`, except the read-only `git log`, `git blame` and `git show` where its host gives a read-only child git (keryx shell does not: there the payload supplies the history).
31
31
 
32
32
  The goal is not stylistic nitpicking — every finding here points to a concrete
33
33
  maintainability, readability, or extensibility problem that will cause friction
@@ -71,7 +71,7 @@ Review scope: **only code introduced or modified in this branch since merge-base
71
71
  Pre-existing problems in unchanged lines are out of scope unless a change directly
72
72
  worsens them.
73
73
 
74
- **Supplied text first.** When the payload carries `slices`, `context_files`, `diff` or `file_contents`, review exactly that text: a read-only child has no shell, so run no git command and never rebuild the diff. Only with none supplied, collect it:
74
+ **Supplied text first.** When the payload carries `slices`, `context_files`, `diff` or `file_contents`, review exactly that text and never rebuild the diff. A choice's history (law 4) is read with `git log`, `git blame` and `git show` only where the host gives a read-only child git; on keryx shell a read-only child has no shell and no git tool, so read the `git log -L`/`git blame` excerpts the payload supplies, or say the history was not read. Only with none supplied, collect it:
75
75
  ```bash
76
76
  git diff --name-status "${BASE_SHA}" && git diff "${BASE_SHA}" && git ls-files --others --exclude-standard
77
77
  # explicit range: <FROM_SHA>..<TO_SHA> in place of "${BASE_SHA}"
@@ -83,15 +83,10 @@ git diff --name-status "${BASE_SHA}" && git diff "${BASE_SHA}" && git ls-files -
83
83
 
84
84
  ### Shared laws (every reviewer)
85
85
 
86
- 1. **A claim of runtime harm with no reproducible path is `info`.** If you cannot
87
- name the input, call, or condition that reaches the code, you have an
88
- observation, not a finding. Report it as `info` and say what would settle it.
89
- 2. **Never flag the theoretical.** The path you describe must exist in the code
90
- under review. Do not report a safe API because it could be misused, or a
91
- pattern because it is often wrong elsewhere.
92
- 3. **One finding per class, not one per occurrence.** When the same shape appears
93
- at several sites, report it once and list every site. Ten findings that are one
94
- finding hide the other nine problems.
86
+ 1. **A claim of runtime harm with no reproducible path is `info`.** If you cannot name the input, call, or condition that reaches the code, you have an observation, not a finding. Report it as `info` and say what would settle it.
87
+ 2. **Never flag the theoretical.** The path you describe must exist in the code under review. Do not report a safe API because it could be misused, or a pattern because it is often wrong elsewhere.
88
+ 3. **One finding per class, not one per occurrence.** When the same shape appears at several sites, report it once and list every site. Ten findings that are one finding hide the other nine problems.
89
+ 4. **A deliberate choice is not a defect until its reason is read and shown wrong.** An explicit override, suppression or exemption, a comment or commit giving a reason, or a sibling doing the same is a decision: read its reason (the comment, `git log -L` or `git blame`, the sibling) before you report it, and report it only when you can show that reason wrong. A project rule is checked against accepted platform practice and its known exceptions before a deviation from it is reported.
95
90
 
96
91
  Severity levels are defined once, in `review-orchestrator/SKILL.md` →
97
92
  **Severity (canonical)**. This reviewer does not restate them: `blocker` is the
@@ -24,7 +24,7 @@ license: "MIT"
24
24
  # Review — Core Boundaries
25
25
 
26
26
  Reviewer for shared infrastructure modules. A core module should provide stable foundations
27
- used by feature modules; it should not accumulate feature-specific behaviour. Its inputs are the reviewer payload only; session memory and earlier conversation are not inputs.
27
+ used by feature modules; it should not accumulate feature-specific behaviour. Its inputs are the reviewer payload only; session memory and earlier conversation are not inputs. It runs no command unless its payload's `allowed_tools` says `run-tests`, except the read-only `git log`, `git blame` and `git show` where its host gives a read-only child git (keryx shell does not: there the payload supplies the history).
28
28
 
29
29
  ---
30
30
 
@@ -58,15 +58,10 @@ If a more specific module reviewer also applies, run both.
58
58
 
59
59
  ### Shared laws (every reviewer)
60
60
 
61
- 1. **A claim of runtime harm with no reproducible path is `info`.** If you cannot
62
- name the input, call, or condition that reaches the code, you have an
63
- observation, not a finding. Report it as `info` and say what would settle it.
64
- 2. **Never flag the theoretical.** The path you describe must exist in the code
65
- under review. Do not report a safe API because it could be misused, or a
66
- pattern because it is often wrong elsewhere.
67
- 3. **One finding per class, not one per occurrence.** When the same shape appears
68
- at several sites, report it once and list every site. Ten findings that are one
69
- finding hide the other nine problems.
61
+ 1. **A claim of runtime harm with no reproducible path is `info`.** If you cannot name the input, call, or condition that reaches the code, you have an observation, not a finding. Report it as `info` and say what would settle it.
62
+ 2. **Never flag the theoretical.** The path you describe must exist in the code under review. Do not report a safe API because it could be misused, or a pattern because it is often wrong elsewhere.
63
+ 3. **One finding per class, not one per occurrence.** When the same shape appears at several sites, report it once and list every site. Ten findings that are one finding hide the other nine problems.
64
+ 4. **A deliberate choice is not a defect until its reason is read and shown wrong.** An explicit override, suppression or exemption, a comment or commit giving a reason, or a sibling doing the same is a decision: read its reason (the comment, `git log -L` or `git blame`, the sibling) before you report it, and report it only when you can show that reason wrong. A project rule is checked against accepted platform practice and its known exceptions before a deviation from it is reported.
70
65
 
71
66
  Severity levels are defined once, in `review-orchestrator/SKILL.md` →
72
67
  **Severity (canonical)**. This reviewer does not restate them: `blocker` is the
@@ -24,7 +24,7 @@ license: "MIT"
24
24
  # Review — Flow Graph Abstractions
25
25
 
26
26
  Reviewer for reusable ReactFlow/graph integration layers. Use it when a repository has a shared
27
- graph surface consumed by domain modules. Its inputs are the reviewer payload only; session memory and earlier conversation are not inputs.
27
+ graph surface consumed by domain modules. Its inputs are the reviewer payload only; session memory and earlier conversation are not inputs. It runs no command unless its payload's `allowed_tools` says `run-tests`, except the read-only `git log`, `git blame` and `git show` where its host gives a read-only child git (keryx shell does not: there the payload supplies the history).
28
28
 
29
29
  ---
30
30
 
@@ -83,15 +83,10 @@ baseline.
83
83
 
84
84
  ### Shared laws (every reviewer)
85
85
 
86
- 1. **A claim of runtime harm with no reproducible path is `info`.** If you cannot
87
- name the input, call, or condition that reaches the code, you have an
88
- observation, not a finding. Report it as `info` and say what would settle it.
89
- 2. **Never flag the theoretical.** The path you describe must exist in the code
90
- under review. Do not report a safe API because it could be misused, or a
91
- pattern because it is often wrong elsewhere.
92
- 3. **One finding per class, not one per occurrence.** When the same shape appears
93
- at several sites, report it once and list every site. Ten findings that are one
94
- finding hide the other nine problems.
86
+ 1. **A claim of runtime harm with no reproducible path is `info`.** If you cannot name the input, call, or condition that reaches the code, you have an observation, not a finding. Report it as `info` and say what would settle it.
87
+ 2. **Never flag the theoretical.** The path you describe must exist in the code under review. Do not report a safe API because it could be misused, or a pattern because it is often wrong elsewhere.
88
+ 3. **One finding per class, not one per occurrence.** When the same shape appears at several sites, report it once and list every site. Ten findings that are one finding hide the other nine problems.
89
+ 4. **A deliberate choice is not a defect until its reason is read and shown wrong.** An explicit override, suppression or exemption, a comment or commit giving a reason, or a sibling doing the same is a decision: read its reason (the comment, `git log -L` or `git blame`, the sibling) before you report it, and report it only when you can show that reason wrong. A project rule is checked against accepted platform practice and its known exceptions before a deviation from it is reported.
95
90
 
96
91
  Severity levels are defined once, in `review-orchestrator/SKILL.md` →
97
92
  **Severity (canonical)**. This reviewer does not restate them: `blocker` is the
@@ -2,18 +2,14 @@
2
2
  name: review-frontend
3
3
  model_tier: standard
4
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."
5
- triggers:
6
- - "frontend review"
7
- - "component review"
8
- - "ui review"
9
- - "review React"
10
- - "review components"
5
+ triggers: ["frontend review", "component review", "ui review", "review React", "review components"]
11
6
  metadata:
12
7
  author: "MrCipherSmith"
13
8
  version: "1.1.0"
14
9
  category: "review"
15
10
  compatible_harnesses: "cursor,codex,zed,opencode,claude"
16
11
  stack_requires: "react,mobx"
12
+ overlap_group: "frontend"
17
13
  license: "MIT"
18
14
  ---
19
15
 
@@ -21,7 +17,7 @@ license: "MIT"
21
17
 
22
18
  ## Purpose
23
19
 
24
- Validates frontend-specific patterns in the changed code of the current branch. Covers React component correctness (observer wrapping, MVVM boundary, useEffect misuse, accessibility basics, key props), full MobX store patterns (structure, member ordering, accessibility modifiers, observable collections, reactions, async actions, bidirectional sync, lifecycle, API placement), and TypeScript safety. Its inputs are the reviewer payload only; session memory and earlier conversation are not inputs.
20
+ Validates frontend-specific patterns in the changed code of the current branch. Covers React component correctness (observer wrapping, MVVM boundary, useEffect misuse, accessibility basics, key props), full MobX store patterns (structure, member ordering, accessibility modifiers, observable collections, reactions, async actions, bidirectional sync, lifecycle, API placement), and TypeScript safety. Its inputs are the reviewer payload only; session memory and earlier conversation are not inputs. It runs no command unless its payload's `allowed_tools` says `run-tests`, except the read-only `git log`, `git blame` and `git show` where its host gives a read-only child git (keryx shell does not: there the payload supplies the history).
25
21
 
26
22
  This skill consolidates what was previously split between `code-style-review` (frontend parts) and `code-mobx-store-review`. It supersedes both for frontend changes.
27
23
 
@@ -59,15 +55,10 @@ This skill consolidates what was previously split between `code-style-review` (f
59
55
 
60
56
  ### Shared laws (every reviewer)
61
57
 
62
- 1. **A claim of runtime harm with no reproducible path is `info`.** If you cannot
63
- name the input, call, or condition that reaches the code, you have an
64
- observation, not a finding. Report it as `info` and say what would settle it.
65
- 2. **Never flag the theoretical.** The path you describe must exist in the code
66
- under review. Do not report a safe API because it could be misused, or a
67
- pattern because it is often wrong elsewhere.
68
- 3. **One finding per class, not one per occurrence.** When the same shape appears
69
- at several sites, report it once and list every site. Ten findings that are one
70
- finding hide the other nine problems.
58
+ 1. **A claim of runtime harm with no reproducible path is `info`.** If you cannot name the input, call, or condition that reaches the code, you have an observation, not a finding. Report it as `info` and say what would settle it.
59
+ 2. **Never flag the theoretical.** The path you describe must exist in the code under review. Do not report a safe API because it could be misused, or a pattern because it is often wrong elsewhere.
60
+ 3. **One finding per class, not one per occurrence.** When the same shape appears at several sites, report it once and list every site. Ten findings that are one finding hide the other nine problems.
61
+ 4. **A deliberate choice is not a defect until its reason is read and shown wrong.** An explicit override, suppression or exemption, a comment or commit giving a reason, or a sibling doing the same is a decision: read its reason (the comment, `git log -L` or `git blame`, the sibling) before you report it, and report it only when you can show that reason wrong. A project rule is checked against accepted platform practice and its known exceptions before a deviation from it is reported.
71
62
 
72
63
  Severity levels are defined once, in `review-orchestrator/SKILL.md` →
73
64
  **Severity (canonical)**. This reviewer does not restate them: `blocker` is the
@@ -102,7 +93,7 @@ See shared script: `.metaproject/skills/gdskills/shared/git-merge-base.md`
102
93
 
103
94
  Run the script from that file to determine `MERGE_BASE` (`BASE_SHA`) and `SCOPE` before proceeding.
104
95
 
105
- **Supplied text first.** When the payload carries `slices`, `context_files`, `diff` or `file_contents`, review exactly that text: a read-only child has no shell, so run no git command and never rebuild the diff. Only with none supplied, collect it:
96
+ **Supplied text first.** When the payload carries `slices`, `context_files`, `diff` or `file_contents`, review exactly that text and never rebuild the diff. A choice's history (law 4) is read with `git log`, `git blame` and `git show` only where the host gives a read-only child git; on keryx shell a read-only child has no shell and no git tool, so read the `git log -L`/`git blame` excerpts the payload supplies, or say the history was not read. Only with none supplied, collect it:
106
97
  ```bash
107
98
  git diff --name-status "${BASE_SHA}" && git diff "${BASE_SHA}" && git ls-files --others --exclude-standard
108
99
  # explicit range: <FROM_SHA>..<TO_SHA> in place of "${BASE_SHA}"
@@ -11,16 +11,14 @@ description: |
11
11
  NOT for: generic React and MobX correctness with no local rule behind it
12
12
  (review-frontend), what the CSS actually renders (review-layout), or naming and
13
13
  readability as a matter of taste (review-style).
14
- triggers:
15
- - "frontend conventions"
16
- - "local frontend rules"
17
- - "CLAUDE frontend"
18
- - "review frontend conventions"
14
+ triggers: ["frontend conventions", "local frontend rules", "CLAUDE frontend", "review frontend conventions"]
19
15
  metadata:
20
16
  author: "MrCipherSmith"
21
17
  version: "1.0.0"
22
18
  category: "review"
23
19
  stack_requires: "react,mobx"
20
+ overlap_group: "frontend"
21
+ overlap_rank: "generic"
24
22
  license: "MIT"
25
23
  ---
26
24
 
@@ -28,7 +26,7 @@ license: "MIT"
28
26
 
29
27
  Reviewer for frontend repository conventions that are more specific than generic React/MobX
30
28
  correctness. Use it alongside `review-frontend`, `review-style`, `review-performance`, and
31
- `review-logic`. Its inputs are the reviewer payload only; session memory and earlier conversation are not inputs.
29
+ `review-logic`. Its inputs are the reviewer payload only; session memory and earlier conversation are not inputs. It runs no command unless its payload's `allowed_tools` says `run-tests`, except the read-only `git log`, `git blame` and `git show` where its host gives a read-only child git (keryx shell does not: there the payload supplies the history).
32
30
 
33
31
  Before reviewing, read the nearest project guide files if they exist: root `CLAUDE.md`,
34
32
  `AGENTS.md`, `.junie/guidelines.md`, `ARCHITECTURE.md`, and module-level `CLAUDE.md` files.
@@ -109,15 +107,10 @@ project-specific guide was found.
109
107
 
110
108
  ### Shared laws (every reviewer)
111
109
 
112
- 1. **A claim of runtime harm with no reproducible path is `info`.** If you cannot
113
- name the input, call, or condition that reaches the code, you have an
114
- observation, not a finding. Report it as `info` and say what would settle it.
115
- 2. **Never flag the theoretical.** The path you describe must exist in the code
116
- under review. Do not report a safe API because it could be misused, or a
117
- pattern because it is often wrong elsewhere.
118
- 3. **One finding per class, not one per occurrence.** When the same shape appears
119
- at several sites, report it once and list every site. Ten findings that are one
120
- finding hide the other nine problems.
110
+ 1. **A claim of runtime harm with no reproducible path is `info`.** If you cannot name the input, call, or condition that reaches the code, you have an observation, not a finding. Report it as `info` and say what would settle it.
111
+ 2. **Never flag the theoretical.** The path you describe must exist in the code under review. Do not report a safe API because it could be misused, or a pattern because it is often wrong elsewhere.
112
+ 3. **One finding per class, not one per occurrence.** When the same shape appears at several sites, report it once and list every site. Ten findings that are one finding hide the other nine problems.
113
+ 4. **A deliberate choice is not a defect until its reason is read and shown wrong.** An explicit override, suppression or exemption, a comment or commit giving a reason, or a sibling doing the same is a decision: read its reason (the comment, `git log -L` or `git blame`, the sibling) before you report it, and report it only when you can show that reason wrong. A project rule is checked against accepted platform practice and its known exceptions before a deviation from it is reported.
121
114
 
122
115
  Severity levels are defined once, in `review-orchestrator/SKILL.md` →
123
116
  **Severity (canonical)**. This reviewer does not restate them: `blocker` is the
@@ -28,7 +28,7 @@ license: "MIT"
28
28
 
29
29
  Specialized reviewer for **code that will run under significant concurrent load**.
30
30
  Focuses on correctness under concurrency, resource contention, back-pressure, failure
31
- modes at scale, and distributed systems invariants — not general performance profiling. Its inputs are the reviewer payload only; session memory and earlier conversation are not inputs.
31
+ modes at scale, and distributed systems invariants — not general performance profiling. Its inputs are the reviewer payload only; session memory and earlier conversation are not inputs. It runs no command unless its payload's `allowed_tools` says `run-tests`, except the read-only `git log`, `git blame` and `git show` where its host gives a read-only child git (keryx shell does not: there the payload supplies the history).
32
32
 
33
33
  Reviews only changes introduced in the current branch (merge-base to HEAD).
34
34
 
@@ -71,7 +71,7 @@ See shared script: `.metaproject/skills/gdskills/shared/git-merge-base.md`
71
71
  Review scope: **changes introduced in the current branch since merge-base only**.
72
72
  Pre-existing problems in unchanged lines are out of scope unless the diff makes them worse.
73
73
 
74
- **Supplied text first.** When the payload carries `slices`, `context_files`, `diff` or `file_contents`, review exactly that text: a read-only child has no shell, so run no git command and never rebuild the diff. Only with none supplied, collect it:
74
+ **Supplied text first.** When the payload carries `slices`, `context_files`, `diff` or `file_contents`, review exactly that text and never rebuild the diff. A choice's history (law 4) is read with `git log`, `git blame` and `git show` only where the host gives a read-only child git; on keryx shell a read-only child has no shell and no git tool, so read the `git log -L`/`git blame` excerpts the payload supplies, or say the history was not read. Only with none supplied, collect it:
75
75
  ```bash
76
76
  git diff --name-status "${BASE_SHA}" && git diff "${BASE_SHA}" && git ls-files --others --exclude-standard
77
77
  # explicit range: <FROM_SHA>..<TO_SHA> in place of "${BASE_SHA}"
@@ -83,15 +83,10 @@ git diff --name-status "${BASE_SHA}" && git diff "${BASE_SHA}" && git ls-files -
83
83
 
84
84
  ### Shared laws (every reviewer)
85
85
 
86
- 1. **A claim of runtime harm with no reproducible path is `info`.** If you cannot
87
- name the input, call, or condition that reaches the code, you have an
88
- observation, not a finding. Report it as `info` and say what would settle it.
89
- 2. **Never flag the theoretical.** The path you describe must exist in the code
90
- under review. Do not report a safe API because it could be misused, or a
91
- pattern because it is often wrong elsewhere.
92
- 3. **One finding per class, not one per occurrence.** When the same shape appears
93
- at several sites, report it once and list every site. Ten findings that are one
94
- finding hide the other nine problems.
86
+ 1. **A claim of runtime harm with no reproducible path is `info`.** If you cannot name the input, call, or condition that reaches the code, you have an observation, not a finding. Report it as `info` and say what would settle it.
87
+ 2. **Never flag the theoretical.** The path you describe must exist in the code under review. Do not report a safe API because it could be misused, or a pattern because it is often wrong elsewhere.
88
+ 3. **One finding per class, not one per occurrence.** When the same shape appears at several sites, report it once and list every site. Ten findings that are one finding hide the other nine problems.
89
+ 4. **A deliberate choice is not a defect until its reason is read and shown wrong.** An explicit override, suppression or exemption, a comment or commit giving a reason, or a sibling doing the same is a decision: read its reason (the comment, `git log -L` or `git blame`, the sibling) before you report it, and report it only when you can show that reason wrong. A project rule is checked against accepted platform practice and its known exceptions before a deviation from it is reported.
95
90
 
96
91
  Severity levels are defined once, in `review-orchestrator/SKILL.md` →
97
92
  **Severity (canonical)**. This reviewer does not restate them: `blocker` is the
@@ -157,15 +157,10 @@ Before trusting a run's findings:
157
157
 
158
158
  ### Shared laws (every reviewer)
159
159
 
160
- 1. **A claim of runtime harm with no reproducible path is `info`.** If you cannot
161
- name the input, call, or condition that reaches the code, you have an
162
- observation, not a finding. Report it as `info` and say what would settle it.
163
- 2. **Never flag the theoretical.** The path you describe must exist in the code
164
- under review. Do not report a safe API because it could be misused, or a
165
- pattern because it is often wrong elsewhere.
166
- 3. **One finding per class, not one per occurrence.** When the same shape appears
167
- at several sites, report it once and list every site. Ten findings that are one
168
- finding hide the other nine problems.
160
+ 1. **A claim of runtime harm with no reproducible path is `info`.** If you cannot name the input, call, or condition that reaches the code, you have an observation, not a finding. Report it as `info` and say what would settle it.
161
+ 2. **Never flag the theoretical.** The path you describe must exist in the code under review. Do not report a safe API because it could be misused, or a pattern because it is often wrong elsewhere.
162
+ 3. **One finding per class, not one per occurrence.** When the same shape appears at several sites, report it once and list every site. Ten findings that are one finding hide the other nine problems.
163
+ 4. **A deliberate choice is not a defect until its reason is read and shown wrong.** An explicit override, suppression or exemption, a comment or commit giving a reason, or a sibling doing the same is a decision: read its reason (the comment, `git log -L` or `git blame`, the sibling) before you report it, and report it only when you can show that reason wrong. A project rule is checked against accepted platform practice and its known exceptions before a deviation from it is reported.
169
164
 
170
165
  Severity levels are defined once, in `review-orchestrator/SKILL.md` →
171
166
  **Severity (canonical)**. This reviewer does not restate them: it emits only
@@ -136,15 +136,10 @@ object (`sites`, `enumeration_method`) — never a bare label.
136
136
 
137
137
  ### Shared laws (every reviewer)
138
138
 
139
- 1. **A claim of runtime harm with no reproducible path is `info`.** If you cannot
140
- name the input, call, or condition that reaches the code, you have an
141
- observation, not a finding. Report it as `info` and say what would settle it.
142
- 2. **Never flag the theoretical.** The path you describe must exist in the code
143
- under review. Do not report a safe API because it could be misused, or a
144
- pattern because it is often wrong elsewhere.
145
- 3. **One finding per class, not one per occurrence.** When the same shape appears
146
- at several sites, report it once and list every site. Ten findings that are one
147
- finding hide the other nine problems.
139
+ 1. **A claim of runtime harm with no reproducible path is `info`.** If you cannot name the input, call, or condition that reaches the code, you have an observation, not a finding. Report it as `info` and say what would settle it.
140
+ 2. **Never flag the theoretical.** The path you describe must exist in the code under review. Do not report a safe API because it could be misused, or a pattern because it is often wrong elsewhere.
141
+ 3. **One finding per class, not one per occurrence.** When the same shape appears at several sites, report it once and list every site. Ten findings that are one finding hide the other nine problems.
142
+ 4. **A deliberate choice is not a defect until its reason is read and shown wrong.** An explicit override, suppression or exemption, a comment or commit giving a reason, or a sibling doing the same is a decision: read its reason (the comment, `git log -L` or `git blame`, the sibling) before you report it, and report it only when you can show that reason wrong. A project rule is checked against accepted platform practice and its known exceptions before a deviation from it is reported.
148
143
 
149
144
  This reviewer satisfies all three by construction: `evidence` always names the
150
145
  matched artefacts/facts and the claim text (never an unreproducible claim); a
@@ -162,15 +162,10 @@ Before trusting a run's findings:
162
162
 
163
163
  ### Shared laws (every reviewer)
164
164
 
165
- 1. **A claim of runtime harm with no reproducible path is `info`.** If you cannot
166
- name the input, call, or condition that reaches the code, you have an
167
- observation, not a finding. Report it as `info` and say what would settle it.
168
- 2. **Never flag the theoretical.** The path you describe must exist in the code
169
- under review. Do not report a safe API because it could be misused, or a
170
- pattern because it is often wrong elsewhere.
171
- 3. **One finding per class, not one per occurrence.** When the same shape appears
172
- at several sites, report it once and list every site. Ten findings that are one
173
- finding hide the other nine problems.
165
+ 1. **A claim of runtime harm with no reproducible path is `info`.** If you cannot name the input, call, or condition that reaches the code, you have an observation, not a finding. Report it as `info` and say what would settle it.
166
+ 2. **Never flag the theoretical.** The path you describe must exist in the code under review. Do not report a safe API because it could be misused, or a pattern because it is often wrong elsewhere.
167
+ 3. **One finding per class, not one per occurrence.** When the same shape appears at several sites, report it once and list every site. Ten findings that are one finding hide the other nine problems.
168
+ 4. **A deliberate choice is not a defect until its reason is read and shown wrong.** An explicit override, suppression or exemption, a comment or commit giving a reason, or a sibling doing the same is a decision: read its reason (the comment, `git log -L` or `git blame`, the sibling) before you report it, and report it only when you can show that reason wrong. A project rule is checked against accepted platform practice and its known exceptions before a deviation from it is reported.
174
169
 
175
170
  Severity levels are defined once, in `review-orchestrator/SKILL.md` →
176
171
  **Severity (canonical)**. This reviewer does not restate them — it only ever
@@ -131,15 +131,10 @@ Gate, same dedup, same Wave C verification.
131
131
 
132
132
  ### Shared laws (every reviewer)
133
133
 
134
- 1. **A claim of runtime harm with no reproducible path is `info`.** If you cannot
135
- name the input, call, or condition that reaches the code, you have an
136
- observation, not a finding. Report it as `info` and say what would settle it.
137
- 2. **Never flag the theoretical.** The path you describe must exist in the code
138
- under review. Do not report a safe API because it could be misused, or a
139
- pattern because it is often wrong elsewhere.
140
- 3. **One finding per class, not one per occurrence.** When the same shape appears
141
- at several sites, report it once and list every site. Ten findings that are one
142
- finding hide the other nine problems.
134
+ 1. **A claim of runtime harm with no reproducible path is `info`.** If you cannot name the input, call, or condition that reaches the code, you have an observation, not a finding. Report it as `info` and say what would settle it.
135
+ 2. **Never flag the theoretical.** The path you describe must exist in the code under review. Do not report a safe API because it could be misused, or a pattern because it is often wrong elsewhere.
136
+ 3. **One finding per class, not one per occurrence.** When the same shape appears at several sites, report it once and list every site. Ten findings that are one finding hide the other nine problems.
137
+ 4. **A deliberate choice is not a defect until its reason is read and shown wrong.** An explicit override, suppression or exemption, a comment or commit giving a reason, or a sibling doing the same is a decision: read its reason (the comment, `git log -L` or `git blame`, the sibling) before you report it, and report it only when you can show that reason wrong. A project rule is checked against accepted platform practice and its known exceptions before a deviation from it is reported.
143
138
 
144
139
  This reviewer satisfies all three by construction: `evidence` always names the
145
140
  hunk location, quotes the changed line, and states every dimension's