@mrciphersmith/keryx 0.2.97 → 0.2.99

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 (210) hide show
  1. package/dist/cli.js +4583 -2702
  2. package/dist/core.js +40 -2
  3. package/package.json +1 -1
  4. package/src/gdskills/bundled/rules/core/api-contracts.mdc +1 -0
  5. package/src/gdskills/bundled/rules/core/cli-interface-design.mdc +237 -0
  6. package/src/gdskills/bundled/rules/core/code-style-patterns.mdc +1 -0
  7. package/src/gdskills/bundled/rules/core/database-patterns.mdc +1 -0
  8. package/src/gdskills/bundled/rules/core/definition-of-done.mdc +116 -0
  9. package/src/gdskills/bundled/rules/core/documentation-management.mdc +33 -38
  10. package/src/gdskills/bundled/rules/core/error-handling.mdc +1 -11
  11. package/src/gdskills/bundled/rules/core/execution-metrics.md +1 -2
  12. package/src/gdskills/bundled/rules/core/frontend-assistant.mdc +1 -0
  13. package/src/gdskills/bundled/rules/core/git-concurrency.mdc +101 -0
  14. package/src/gdskills/bundled/rules/core/implementation-plans.mdc +23 -11
  15. package/src/gdskills/bundled/rules/core/mobx-store-template.mdc +1 -0
  16. package/src/gdskills/bundled/rules/core/nestjs-dto.mdc +1 -0
  17. package/src/gdskills/bundled/rules/core/playwright-testing.mdc +1 -0
  18. package/src/gdskills/bundled/rules/core/requirements-management.mdc +15 -11
  19. package/src/gdskills/bundled/rules/core/rule-management-workflow.mdc +29 -14
  20. package/src/gdskills/bundled/rules/core/shared-definitions.mdc +1 -1
  21. package/src/gdskills/bundled/rules/core/skill-lifecycle.mdc +9 -5
  22. package/src/gdskills/bundled/rules/core/skills-storage-workflow.mdc +156 -23
  23. package/src/gdskills/bundled/rules/core/storybook-guidelines.mdc +1 -0
  24. package/src/gdskills/bundled/rules/core/subagent-status-protocol.md +9 -2
  25. package/src/gdskills/bundled/skills/core/reviewer-skill-creator/SKILL.md +42 -5
  26. package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.md +67 -74
  27. package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.md +24 -8
  28. package/src/gdskills/bundled/skills/orchestration/context-collector/orchestrator-prompt.md +2 -2
  29. package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.detail.md +12 -22
  30. package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.md +44 -31
  31. package/src/gdskills/bundled/skills/orchestration/feature-analyzer/analysis-request.md +2 -2
  32. package/src/gdskills/bundled/skills/orchestration/feature-analyzer/analysis-request.template.md +1 -1
  33. package/src/gdskills/bundled/skills/orchestration/feature-analyzer/input-contract.schema.json +4 -4
  34. package/src/gdskills/bundled/skills/orchestration/feature-analyzer/orchestrator-prompt.md +2 -2
  35. package/src/gdskills/bundled/skills/orchestration/feature-dev/SKILL.md +20 -6
  36. package/src/gdskills/bundled/skills/orchestration/flow-orchestrator/SKILL.md +67 -9
  37. package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.md +6 -6
  38. package/src/gdskills/bundled/skills/orchestration/issue-analyzer/orchestrator-prompt.md +1 -1
  39. package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.md +45 -5
  40. package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.md +88 -32
  41. package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.md +52 -41
  42. package/src/gdskills/bundled/skills/orchestration/task-implementer/output-contract.schema.json +32 -1
  43. package/src/gdskills/bundled/skills/planning/autodoc-analyst/SKILL.md +16 -0
  44. package/src/gdskills/bundled/skills/planning/autodoc-architect/SKILL.md +16 -0
  45. package/src/gdskills/bundled/skills/planning/autodoc-assembler/SKILL.md +16 -0
  46. package/src/gdskills/bundled/skills/planning/autodoc-orchestrator/SKILL.md +17 -0
  47. package/src/gdskills/bundled/skills/planning/autodoc-scanner/SKILL.md +16 -0
  48. package/src/gdskills/bundled/skills/planning/autodoc-writer/SKILL.md +16 -0
  49. package/src/gdskills/bundled/skills/planning/brainstorm/SKILL.md +29 -4
  50. package/src/gdskills/bundled/skills/planning/consistency-checker/SKILL.codex.md +17 -0
  51. package/src/gdskills/bundled/skills/planning/consistency-checker/SKILL.cursor.md +17 -0
  52. package/src/gdskills/bundled/skills/planning/consistency-checker/SKILL.md +17 -0
  53. package/src/gdskills/bundled/skills/planning/docpack-orchestrator/SKILL.md +32 -2
  54. package/src/gdskills/bundled/skills/planning/docpack-review/SKILL.md +14 -2
  55. package/src/gdskills/bundled/skills/planning/interview/SKILL.md +30 -8
  56. package/src/gdskills/bundled/skills/planning/interviewer/SKILL.md +33 -7
  57. package/src/gdskills/bundled/skills/planning/patterns-researcher/SKILL.codex.md +16 -0
  58. package/src/gdskills/bundled/skills/planning/patterns-researcher/SKILL.cursor.md +16 -0
  59. package/src/gdskills/bundled/skills/planning/patterns-researcher/SKILL.md +16 -0
  60. package/src/gdskills/bundled/skills/planning/planner/SKILL.codex.md +17 -0
  61. package/src/gdskills/bundled/skills/planning/planner/SKILL.cursor.md +17 -0
  62. package/src/gdskills/bundled/skills/planning/planner/SKILL.md +17 -0
  63. package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.md +27 -10
  64. package/src/gdskills/bundled/skills/planning/problem-definer/SKILL.codex.md +16 -0
  65. package/src/gdskills/bundled/skills/planning/problem-definer/SKILL.cursor.md +16 -0
  66. package/src/gdskills/bundled/skills/planning/problem-definer/SKILL.md +16 -0
  67. package/src/gdskills/bundled/skills/planning/project-discovery/SKILL.codex.md +16 -0
  68. package/src/gdskills/bundled/skills/planning/project-discovery/SKILL.cursor.md +16 -0
  69. package/src/gdskills/bundled/skills/planning/project-discovery/SKILL.md +16 -0
  70. package/src/gdskills/bundled/skills/planning/spec-writer/SKILL.codex.md +4 -0
  71. package/src/gdskills/bundled/skills/planning/spec-writer/SKILL.cursor.md +4 -0
  72. package/src/gdskills/bundled/skills/planning/spec-writer/SKILL.md +4 -0
  73. package/src/gdskills/bundled/skills/planning/stack-advisor/SKILL.codex.md +4 -0
  74. package/src/gdskills/bundled/skills/planning/stack-advisor/SKILL.cursor.md +4 -0
  75. package/src/gdskills/bundled/skills/planning/stack-advisor/SKILL.md +4 -0
  76. package/src/gdskills/bundled/skills/platform/agent-entrypoint-distiller/SKILL.md +31 -4
  77. package/src/gdskills/bundled/skills/platform/claude-md-management/SKILL.md +27 -3
  78. package/src/gdskills/bundled/skills/platform/hookify/SKILL.md +29 -4
  79. package/src/gdskills/bundled/skills/quality/api-truth/SKILL.md +226 -0
  80. package/src/gdskills/bundled/skills/quality/changelog/SKILL.md +25 -5
  81. package/src/gdskills/bundled/skills/quality/commit/SKILL.md +26 -5
  82. package/src/gdskills/bundled/skills/quality/db-migrate/SKILL.md +25 -4
  83. package/src/gdskills/bundled/skills/quality/dependency-update/SKILL.md +26 -5
  84. package/src/gdskills/bundled/skills/quality/deploy/SKILL.md +27 -4
  85. package/src/gdskills/bundled/skills/quality/deprecation-path/SKILL.md +268 -0
  86. package/src/gdskills/bundled/skills/quality/fresh-eyes/SKILL.md +190 -0
  87. package/src/gdskills/bundled/skills/quality/metaproject-security/SKILL.md +24 -3
  88. package/src/gdskills/bundled/skills/quality/perf-check/SKILL.md +30 -9
  89. package/src/gdskills/bundled/skills/quality/pr/SKILL.md +25 -5
  90. package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.md +27 -4
  91. package/src/gdskills/bundled/skills/quality/push/SKILL.md +25 -4
  92. package/src/gdskills/bundled/skills/quality/root-cause/SKILL.md +204 -0
  93. package/src/gdskills/bundled/skills/quality/security-audit/SKILL.md +25 -4
  94. package/src/gdskills/bundled/skills/quality/test-gen/SKILL.md +31 -5
  95. package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.md +32 -11
  96. package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.md +42 -7
  97. package/src/gdskills/bundled/skills/review/code-learned-review/SKILL.md +43 -3
  98. package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.md +46 -4
  99. package/src/gdskills/bundled/skills/review/code-style-review/SKILL.md +46 -6
  100. package/src/gdskills/bundled/skills/review/review-architecture/SKILL.md +5 -5
  101. package/src/gdskills/bundled/skills/review/review-backend/SKILL.md +5 -6
  102. package/src/gdskills/bundled/skills/review/review-clean-code/SKILL.md +6 -6
  103. package/src/gdskills/bundled/skills/review/review-core-boundaries/SKILL.md +37 -3
  104. package/src/gdskills/bundled/skills/review/review-flow-graph/SKILL.md +38 -4
  105. package/src/gdskills/bundled/skills/review/review-frontend/SKILL.md +4 -6
  106. package/src/gdskills/bundled/skills/review/review-frontend-conventions/SKILL.md +37 -3
  107. package/src/gdskills/bundled/skills/review/review-highload/SKILL.md +5 -7
  108. package/src/gdskills/bundled/skills/review/review-layout/SKILL.md +24 -3
  109. package/src/gdskills/bundled/skills/review/review-logic/SKILL.md +5 -5
  110. package/src/gdskills/bundled/skills/review/review-orchestrator/SKILL.md +49 -64
  111. package/src/gdskills/bundled/skills/review/review-orchestrator/input-contract.schema.json +1 -2
  112. package/src/gdskills/bundled/skills/review/review-orchestrator/review-context.schema.json +1 -5
  113. package/src/gdskills/bundled/skills/review/review-orchestrator/reviewer-input.schema.json +53 -9
  114. package/src/gdskills/bundled/skills/review/review-performance/SKILL.md +11 -11
  115. package/src/gdskills/bundled/skills/review/review-pr-feedback/SKILL.md +9 -8
  116. package/src/gdskills/bundled/skills/review/review-regression/SKILL.md +33 -2
  117. package/src/gdskills/bundled/skills/review/review-security-code/SKILL.md +6 -4
  118. package/src/gdskills/bundled/skills/review/review-style/SKILL.md +5 -5
  119. package/src/gdskills/bundled/skills/review/review-testing-practices/SKILL.md +41 -3
  120. package/src/gdskills/bundled/skills/review/review-verifier/SKILL.md +2 -2
  121. package/src/gdskills/bundled/rules/core/review-agent-profile.mdc +0 -49
  122. package/src/gdskills/bundled/rules/core/review-strict-profile.mdc +0 -48
  123. package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.codex.md +0 -353
  124. package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.cursor.md +0 -353
  125. package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.opencode.md +0 -353
  126. package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.zed.md +0 -353
  127. package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.codex.md +0 -655
  128. package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.cursor.md +0 -655
  129. package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.opencode.md +0 -655
  130. package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.zed.md +0 -655
  131. package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.codex.md +0 -434
  132. package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.cursor.md +0 -434
  133. package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.opencode.md +0 -434
  134. package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.zed.md +0 -434
  135. package/src/gdskills/bundled/skills/orchestration/feature-dev/SKILL.codex.md +0 -163
  136. package/src/gdskills/bundled/skills/orchestration/feature-dev/SKILL.cursor.md +0 -163
  137. package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.codex.md +0 -373
  138. package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.cursor.md +0 -373
  139. package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.opencode.md +0 -373
  140. package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.zed.md +0 -373
  141. package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.codex.md +0 -374
  142. package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.cursor.md +0 -374
  143. package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.opencode.md +0 -374
  144. package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.zed.md +0 -374
  145. package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.codex.md +0 -2190
  146. package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.cursor.md +0 -2190
  147. package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.opencode.md +0 -2190
  148. package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.zed.md +0 -2190
  149. package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.codex.md +0 -659
  150. package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.cursor.md +0 -659
  151. package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.opencode.md +0 -659
  152. package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.zed.md +0 -659
  153. package/src/gdskills/bundled/skills/planning/brainstorm/SKILL.codex.md +0 -90
  154. package/src/gdskills/bundled/skills/planning/brainstorm/SKILL.cursor.md +0 -90
  155. package/src/gdskills/bundled/skills/planning/interview/SKILL.codex.md +0 -187
  156. package/src/gdskills/bundled/skills/planning/interview/SKILL.cursor.md +0 -187
  157. package/src/gdskills/bundled/skills/planning/interviewer/SKILL.codex.md +0 -105
  158. package/src/gdskills/bundled/skills/planning/interviewer/SKILL.cursor.md +0 -105
  159. package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.codex.md +0 -193
  160. package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.cursor.md +0 -193
  161. package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.opencode.md +0 -193
  162. package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.zed.md +0 -193
  163. package/src/gdskills/bundled/skills/platform/claude-md-management/SKILL.codex.md +0 -87
  164. package/src/gdskills/bundled/skills/platform/claude-md-management/SKILL.cursor.md +0 -87
  165. package/src/gdskills/bundled/skills/platform/hookify/SKILL.codex.md +0 -100
  166. package/src/gdskills/bundled/skills/platform/hookify/SKILL.cursor.md +0 -100
  167. package/src/gdskills/bundled/skills/quality/changelog/SKILL.codex.md +0 -84
  168. package/src/gdskills/bundled/skills/quality/changelog/SKILL.cursor.md +0 -84
  169. package/src/gdskills/bundled/skills/quality/commit/SKILL.codex.md +0 -66
  170. package/src/gdskills/bundled/skills/quality/commit/SKILL.cursor.md +0 -66
  171. package/src/gdskills/bundled/skills/quality/db-migrate/SKILL.codex.md +0 -66
  172. package/src/gdskills/bundled/skills/quality/db-migrate/SKILL.cursor.md +0 -66
  173. package/src/gdskills/bundled/skills/quality/dependency-update/SKILL.codex.md +0 -81
  174. package/src/gdskills/bundled/skills/quality/dependency-update/SKILL.cursor.md +0 -81
  175. package/src/gdskills/bundled/skills/quality/deploy/SKILL.codex.md +0 -70
  176. package/src/gdskills/bundled/skills/quality/deploy/SKILL.cursor.md +0 -70
  177. package/src/gdskills/bundled/skills/quality/perf-check/SKILL.codex.md +0 -83
  178. package/src/gdskills/bundled/skills/quality/perf-check/SKILL.cursor.md +0 -83
  179. package/src/gdskills/bundled/skills/quality/pr/SKILL.codex.md +0 -75
  180. package/src/gdskills/bundled/skills/quality/pr/SKILL.cursor.md +0 -75
  181. package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.codex.md +0 -378
  182. package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.cursor.md +0 -378
  183. package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.opencode.md +0 -378
  184. package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.zed.md +0 -378
  185. package/src/gdskills/bundled/skills/quality/push/SKILL.codex.md +0 -52
  186. package/src/gdskills/bundled/skills/quality/push/SKILL.cursor.md +0 -52
  187. package/src/gdskills/bundled/skills/quality/security-audit/SKILL.codex.md +0 -108
  188. package/src/gdskills/bundled/skills/quality/security-audit/SKILL.cursor.md +0 -108
  189. package/src/gdskills/bundled/skills/quality/test-gen/SKILL.codex.md +0 -75
  190. package/src/gdskills/bundled/skills/quality/test-gen/SKILL.cursor.md +0 -75
  191. package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.codex.md +0 -339
  192. package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.cursor.md +0 -339
  193. package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.opencode.md +0 -339
  194. package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.zed.md +0 -339
  195. package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.codex.md +0 -203
  196. package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.cursor.md +0 -203
  197. package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.opencode.md +0 -203
  198. package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.zed.md +0 -203
  199. package/src/gdskills/bundled/skills/review/code-learned-review/SKILL.codex.md +0 -243
  200. package/src/gdskills/bundled/skills/review/code-learned-review/SKILL.cursor.md +0 -243
  201. package/src/gdskills/bundled/skills/review/code-learned-review/SKILL.opencode.md +0 -243
  202. package/src/gdskills/bundled/skills/review/code-learned-review/SKILL.zed.md +0 -243
  203. package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.codex.md +0 -259
  204. package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.cursor.md +0 -259
  205. package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.opencode.md +0 -259
  206. package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.zed.md +0 -259
  207. package/src/gdskills/bundled/skills/review/code-style-review/SKILL.codex.md +0 -168
  208. package/src/gdskills/bundled/skills/review/code-style-review/SKILL.cursor.md +0 -168
  209. package/src/gdskills/bundled/skills/review/code-style-review/SKILL.opencode.md +0 -168
  210. package/src/gdskills/bundled/skills/review/code-style-review/SKILL.zed.md +0 -168
@@ -1,16 +1,16 @@
1
1
  ---
2
2
  name: pr
3
- description: "Use when opening a pull request for the current branch."
3
+ description: "Use when opening a pull request for the current branch. NOT for rewriting the body of a pull request that already exists or its linked issue (use `pr-issue-documenter`)."
4
4
  triggers:
5
- - "/pr"
6
- - "Create PR"
5
+ - "open PR"
6
+ - "create pull request"
7
+ - "draft PR"
7
8
  - "Open pull request"
8
- - "Create pull request"
9
9
  - "Make PR"
10
10
  metadata:
11
11
  author: "MrCipherSmith"
12
12
  version: "1.0.0"
13
- category: "workflow"
13
+ category: "quality"
14
14
  compatible_harnesses: "cursor,codex,zed,opencode,claude"
15
15
  license: "MIT"
16
16
  ---
@@ -73,3 +73,23 @@ Return the PR URL to the user.
73
73
  - Always analyze ALL commits, not just the last one
74
74
  - If the branch has linked GitHub issues, reference them in the body
75
75
  - Ask user for confirmation before creating if there are 10+ commits
76
+
77
+ ## Red Flags
78
+
79
+ | Rationalization | Why it is wrong |
80
+ |---|---|
81
+ | "The last commit message already summarizes the work, use it as the body" | A PR is the whole branch, not its tip. Read `main...HEAD`; the earliest commits are usually where the design decision a reviewer needs actually happened |
82
+ | "The branch isn't pushed, but `gh pr create` will sort that out" | It either fails or opens a PR against a stale remote head, so the diff a reviewer sees is not the diff you analyzed. Push with `-u origin <branch>` first |
83
+ | "The tree is dirty, but the commits are what get reviewed anyway" | Exactly — which means the uncommitted half of the change quietly does not exist in the PR, and the reviewer approves something incomplete. Ask before opening over a dirty tree |
84
+ | "There's an open issue that sounds like this work, I'll write `Closes #N`" | `Closes` shuts an issue on merge. Reference only issues the branch or its commits actually link to; a guess closes someone else's ticket |
85
+ | "The user asked for a PR, so 40 commits is still just 'create the PR'" | 10+ commits gets a confirmation first. A branch that large is usually two PRs, and saying so is cheaper before the PR exists than after review starts |
86
+
87
+ ## Verification
88
+
89
+ Do not report the PR as done until all of the following hold:
90
+
91
+ - `gh pr view --json url,title,body` returns the created PR, with a non-empty body carrying Summary, Changes and Test plan
92
+ - The title is under 70 chars and describes the branch, not the last commit
93
+ - Every commit in `git log <base>..HEAD` is represented somewhere in the body — no area of the diff goes unmentioned
94
+ - The branch has an upstream and the remote head equals local `HEAD`
95
+ - The PR URL is returned to the user
@@ -1,19 +1,21 @@
1
1
  ---
2
2
  name: pr-issue-documenter
3
- description: "Use when documenting PR changes, adding a PR description, creating a linked issue for a PR, or updating an existing issue body."
3
+ description: "Use when documenting PR changes, adding a PR description, creating a linked issue for a PR, or updating an existing issue body. NOT for opening the pull request in the first place (use `pr`)."
4
4
  triggers:
5
+ - "document PR"
6
+ - "PR description"
7
+ - "create issue for PR"
5
8
  - "Add PR description"
6
9
  - "Document PR changes"
7
10
  - "Describe what was done in PR"
8
- - "Create issue for PR"
9
11
  - "Update PR and issue"
10
12
  - "Add description to PR"
11
13
  - "Write PR summary"
12
14
  metadata:
13
15
  author: "MrCipherSmith"
14
16
  version: "1.0.0"
15
- category: "documentation"
16
- compatible_harnesses: "cursor,codex,zed,opencode"
17
+ category: "quality"
18
+ compatible_harnesses: "cursor,codex,zed,opencode,claude"
17
19
  license: "MIT"
18
20
  ---
19
21
 
@@ -363,6 +365,27 @@ Always present contradictions to user before making changes.
363
365
  9. **DO NOT** modify PR title unless explicitly asked
364
366
  10. **DO NOT** write comments on GitHub PRs/issues (only edit body)
365
367
 
368
+ ## Red Flags
369
+
370
+ | Rationalization | Why it is wrong |
371
+ |---|---|
372
+ | "The existing issue body is stale and mine is better — replace it" | That body is someone's written record, and the parts you think are stale may be the parts they argued for. Present the contradictions, offer the three choices in Step 5.1, apply what the user picks |
373
+ | "The diff is huge; the commit messages describe it well enough" | Commit subjects and the diff disagree constantly — a rename half-finished, a "refactor" that changed behavior. Never write a change you have not seen in `gh pr diff` |
374
+ | "No issue is linked and this clearly deserves one, so I'll create it" | Issue creation needs the user's confirmation every time (Rule 8). An unasked-for issue is noise someone else has to triage and close |
375
+ | "The PR title is wrong too — fixing it while I'm in here is a favour" | Title changes are out of scope unless asked (Rule 9). The author chose it, and a silent retitle is invisible in the notification a reviewer gets |
376
+ | "Leaving a comment is less destructive than editing the body" | This skill edits bodies and never comments (Rule 10). A comment is a notification to every subscriber and does not update the description anyone reads first |
377
+ | "The diff has a hardcoded value, but that's the author's business" | Temporary and hardcoded values get marked for follow-up in the description — that is where the next reader looks, and where it otherwise disappears |
378
+
379
+ ## Verification
380
+
381
+ Do not report done until all of the following hold:
382
+
383
+ - `gh pr view {number} --json body` returns the new body, with Summary, Changes and Key Files present, plus `Closes #N` when an issue is linked
384
+ - Every statement in the body maps to something visible in `gh pr diff {number}` — nothing invented, nothing carried over from a stale description
385
+ - If an issue was created or updated, `gh issue view {number} --json body` shows it; if it is a sub-issue, the parent issue body now contains its link
386
+ - Every contradiction found in Step 5.1 was presented to the user and resolved by their choice — none resolved silently
387
+ - The final report lists every PR and issue URL touched, as in Step 7
388
+
366
389
  ## Job Context Awareness
367
390
 
368
391
  If called within an orchestrator job context, check for job context before starting:
@@ -1,15 +1,16 @@
1
1
  ---
2
2
  name: push
3
- description: "Use when pushing the current branch to the remote, especially when upstream tracking or safety checks are needed."
3
+ description: "Use when pushing the current branch to the remote, especially when upstream tracking or safety checks are needed. NOT for creating the commits themselves (use `commit`) or opening a pull request afterwards (use `pr`)."
4
4
  triggers:
5
- - "/push"
5
+ - "push branch"
6
+ - "git push"
7
+ - "publish branch"
6
8
  - "Push changes"
7
9
  - "Push to remote"
8
- - "Push branch"
9
10
  metadata:
10
11
  author: "MrCipherSmith"
11
12
  version: "1.0.0"
12
- category: "workflow"
13
+ category: "quality"
13
14
  compatible_harnesses: "cursor,codex,zed,opencode,claude"
14
15
  license: "MIT"
15
16
  ---
@@ -50,3 +51,23 @@ Show result: confirm push success with commit count.
50
51
  - NEVER force push to main/master without double confirmation
51
52
  - NEVER use `--no-verify`
52
53
  - If push is rejected (non-fast-forward), suggest `git pull --rebase` first
54
+
55
+ ## Red Flags
56
+
57
+ | Rationalization | Why it is wrong |
58
+ |---|---|
59
+ | "It was rejected, but `--force-with-lease` is safe enough here" | The lease only compares against the ref you last fetched. A teammate's push that landed since then is still discarded, silently. Rebase and push normally, or ask |
60
+ | "It's my own feature branch, so a force push hurts nobody" | Open PRs, CI runs, review threads and other worktrees read that ref. Rewriting it invalidates all of them. Force only when the user says "force push" in this conversation |
61
+ | "There are uncommitted changes, but they're unrelated to what I'm pushing" | The push ships what is committed, so unrelated work silently stays behind while the branch looks complete to a reviewer. Warn and ask before pushing over a dirty tree |
62
+ | "No upstream is set, so `git push origin HEAD` will do" | That leaves the branch untracked, and every later `git status` / `git push` has to guess. Use `git push -u origin <branch>` so the tracking is recorded once |
63
+ | "The pre-push hook is slow and this is a tiny change" | `--no-verify` is never the answer here — a tiny change is exactly what an unrun hook lets through |
64
+
65
+ ## Verification
66
+
67
+ Do not report the push as done until all of the following hold:
68
+
69
+ - `git status` reports the branch up to date with its upstream
70
+ - `git branch -vv` shows an upstream for the current branch (set with `-u` if it had none)
71
+ - `git log @{upstream}..HEAD --oneline` is empty — nothing left unpushed
72
+ - The report states the commit count pushed and the remote/branch they landed on
73
+ - `--force` was used only if the user asked for it in this conversation, and never against main/master without double confirmation
@@ -0,0 +1,204 @@
1
+ ---
2
+ name: root-cause
3
+ model_tier: deep
4
+ description: |
5
+ Use when a defect exists and nobody can yet say what produces it — a crash, a
6
+ wrong result, a failure a user hits and the suite never sees. The order is
7
+ fixed: reproduce it and write down how, localize before editing anything,
8
+ reduce to the smallest failing case, repair the mechanism rather than the
9
+ symptom, and leave behind a guard that was WATCHED failing without the repair.
10
+ Covers the case the defect refuses to appear: which evidence is admissible,
11
+ when to stop looking, and what to report in place of a fix.
12
+ NOT for: a defect already pinned to a line and a mechanism, where nothing
13
+ remains but writing the patch and its guard.
14
+ triggers:
15
+ - "root cause"
16
+ - "why does this fail"
17
+ - "cannot reproduce"
18
+ - "track down the bug"
19
+ - "debugging"
20
+ - "bisect"
21
+ metadata:
22
+ author: "MrCipherSmith"
23
+ version: "1.0.0"
24
+ category: "quality"
25
+ compatible_harnesses: "cursor,codex,zed,opencode,claude"
26
+ license: "MIT"
27
+ ---
28
+
29
+ # Root Cause
30
+
31
+ A defect exists and nobody knows why. Your job is **not** to make the symptom
32
+ stop. It is to name the mechanism that produces it, change that, and leave
33
+ something behind that fails if it ever comes back.
34
+
35
+ The five steps below are an order, not a menu. Every one of them is skipped by
36
+ agents in the same way — forward, into the edit — and each skip costs the step
37
+ after it.
38
+
39
+ ## 1. Reproduce, and write the reproduction down
40
+
41
+ Before any code is read: the exact command, the input, the environment, what you
42
+ expected, what happened, and **how often** — `10/10` and `3/10` are different
43
+ defects with different causes.
44
+
45
+ A fix produced without a reproduction is a guess with a diff attached. It cannot
46
+ be verified, because there is nothing that was failing to stop failing.
47
+
48
+ If the reproduction needs setup (a seeded row, a cleared cache, a second
49
+ process), that setup is part of it. Write it as commands someone else can run.
50
+
51
+ ## 2. Localize before you edit
52
+
53
+ Reading a file top to bottom is not localization; it is hoping. Localization is
54
+ a **search that halves**:
55
+
56
+ - over history — `git bisect` between a known-good and known-bad revision;
57
+ - over the call path — `keryx gdgraph affected <file>` for what reaches the
58
+ site, then a probe at the midpoint of the path;
59
+ - over the input — cut the payload in half, keep the failing half;
60
+ - over the environment — one variable, one flag, one version at a time.
61
+
62
+ Two rules hold for the whole step. **Change one thing and record what happened.**
63
+ And **an edit made "to see what happens" is not a fix** — it either goes away or
64
+ it gets named in the diff as instrumentation.
65
+
66
+ Long output (a bisect run, a failing suite, a log) goes through
67
+ `keryx ctx run -- <cmd>` rather than into the reading window whole.
68
+
69
+ ## 3. Reduce to the smallest failing case
70
+
71
+ Delete everything that can be deleted while it still fails. Each removal that
72
+ keeps the failure is evidence about what does **not** matter, and the residue is
73
+ usually the cause stated in the shortest possible form.
74
+
75
+ A reduced case is also the guard from step 5, already written.
76
+
77
+ ## 4. Name the cause, then repair it
78
+
79
+ Say it in one sentence carrying a **mechanism**, not a location: "the cache key
80
+ omits the tenant id, so the second tenant reads the first tenant's row". "It is
81
+ in `store.ts`" is a location. "It is a race" is a category. Neither is a cause.
82
+
83
+ Then check the repair against that sentence:
84
+
85
+ | The repair | What it actually is |
86
+ |---|---|
87
+ | A guard that returns early when the value is missing | The missing value is the defect; you hid the only thing reporting it |
88
+ | A retry, a longer timeout, a `sleep` | The mechanism is untouched and now it is slower and intermittent |
89
+ | A widened type, a cast, an `any` | The compiler was right; the wrong value is still produced |
90
+ | A changed assertion or an expectation loosened to match | The test was the last thing telling the truth here |
91
+
92
+ Every row above makes the symptom go away. None of them is this skill's output.
93
+
94
+ ## 5. Leave a guard that was seen failing
95
+
96
+ A test written after a fix and never observed red proves the test runs. It does
97
+ not prove it catches anything.
98
+
99
+ So: run the new test against the **unfixed** code and watch it fail. If the fix
100
+ is already applied, undo it in place (never `git stash` — a scoped stash takes
101
+ other people's uncommitted work with it), watch the test fail, restore the fix,
102
+ watch it pass. Record both observations.
103
+
104
+ If the defect cannot be reached from a test — it needs a device, a customer's
105
+ data, real concurrency — say so, and say what the guard would be instead: an
106
+ assertion, a counter, a log line at the decision point.
107
+
108
+ ---
109
+
110
+ ## When it does not reproduce
111
+
112
+ This is the case handled worst, and it is handled worst in one specific way: the
113
+ search for the defect quietly becomes a search for *something wrong*, and a
114
+ plausible-looking repair is shipped for a failure nobody ever saw.
115
+
116
+ ### What is admissible
117
+
118
+ In descending strength:
119
+
120
+ 1. **A failure you produced yourself.** Nothing else is in this class.
121
+ 2. **An artifact of the original failure** — a stack trace, a log line with a
122
+ timestamp, a CI run id, an error string quoted by the reporter, a dump.
123
+ 3. **A path you can show reaches the reported state**, with the input that
124
+ drives it *named and shown to exist*.
125
+ 4. **A measured environment delta** — a version, a locale, a timezone, a clock
126
+ skew, an ordering, a concurrency level you actually varied and observed.
127
+
128
+ Not admissible, at any strength: this looks wrong; this pattern is usually a
129
+ bug; this is the kind of thing that causes that; two readings of the same file
130
+ agreeing. Reading harder produces no new evidence — the file says the same thing
131
+ the third time.
132
+
133
+ ### Widen the attempt before you give up
134
+
135
+ One axis at a time, each attempt and its result recorded: input, environment and
136
+ versions, ordering and concurrency, persisted state (cache, DB, temp files),
137
+ clock and timezone, isolation (the single test vs the whole suite), random seed.
138
+
139
+ For anything intermittent, a count replaces a verdict. Run it 50 times and
140
+ report `1/50`. "It passed when I re-ran it" is not a result.
141
+
142
+ ### When to stop
143
+
144
+ Stop when any of these is true, and stop deliberately rather than by drifting
145
+ into a fix:
146
+
147
+ - the next axis is one you cannot control — production data, a customer's
148
+ machine, hardware you do not have;
149
+ - the budget the task set for reproduction is spent;
150
+ - going further requires changing the code under investigation to see anything
151
+ at all. That is instrumentation, and landing it is a separate decision the
152
+ requester gets to make.
153
+
154
+ ### Report instead of a fix
155
+
156
+ Not reproducing is a result, and it is reportable. What it is not is permission
157
+ to ship a change. The report carries:
158
+
159
+ - every reproduction attempt, one line each, with what happened;
160
+ - the strongest evidence held, labelled with its class from the list above;
161
+ - the hypotheses that survive that evidence — two or three, each with **the
162
+ observation that would kill it**;
163
+ - the instrumentation that would settle it, and where it goes;
164
+ - what was left unchanged.
165
+
166
+ Landing instrumentation alone and stopping is legitimate work. Landing a
167
+ speculative repair and closing the issue is not: if no experiment can tell your
168
+ change from a no-op, nothing was fixed, and the next person's bisect now
169
+ straddles a commit that did nothing.
170
+
171
+ ## Red Flags
172
+
173
+ | Rationalization | Why it is wrong |
174
+ |---|---|
175
+ | "It never reproduced, but I found something that looks wrong — I will fix that." | A smell you found and a defect you never saw are different objects. Repairing the smell closes the ticket with the reported failure still live, and the next report now arrives against code you changed for unrelated reasons. |
176
+ | "It passed when I ran it again, so it is flaky / it is gone." | A single pass is not evidence of absence for a failure that was observed. Run it 50 times and report the rate; `1/50` is a finding, "it passed" is a sentence about one run. |
177
+ | "The stack trace names this line, so this line is the cause." | The trace names where the bad value surfaced, not where it was produced. The throwing frame is usually innocent; walk back to where the value was created and prove it was already wrong there. |
178
+ | "A null check here makes the crash go away." | The crash was the only thing reporting that the value was missing. A guard moves the failure somewhere later, quieter, and further from its cause — and the next report will not mention this file. |
179
+ | "I fixed it and the test I added passes." | A guard never watched failing proves the test executes. Run it against the unfixed code first; if it passes there, it is testing something other than the defect. |
180
+ | "I changed three things and now it works." | You have a working tree and no cause. One of the three was the fix and two are unexplained edits nobody can review. Revert to one change at a time, or the repair is folklore. |
181
+ | "It only breaks in CI, so it is an infrastructure problem." | "Only in CI" is an environment difference you have not named yet — ordering, concurrency, a clock, a locale, a missing file, a cold cache. Name the difference before assigning the defect to somebody else. |
182
+ | "It is obviously a race condition." | "Race" is a category, not a cause. Which two operations, over which piece of state, in which interleaving? Without those three, the word ends the investigation instead of advancing it. |
183
+ | "The reproduction takes too long to write down; I have it in my head." | The reproduction is the artifact the fix is verified against. Unwritten, it cannot be re-run after the change, and "it works now" becomes unfalsifiable. |
184
+
185
+ ## Verification
186
+
187
+ Report the defect fixed only when all of these hold:
188
+
189
+ - The reproduction is written down as commands plus expected/observed, and it
190
+ failed before the change.
191
+ - The cause is one sentence naming a mechanism, not a file and not a category.
192
+ - The change alters that mechanism. No symptom was suppressed by a guard, a
193
+ retry, a widened type, or a loosened assertion.
194
+ - A guard exists and was **watched failing** against the unfixed code; the
195
+ report says where that was observed.
196
+ - Everything added to investigate — logging, timeouts, skipped tests, scratch
197
+ edits — is either removed or deliberately kept and named in the diff.
198
+ - If it never reproduced, no fix is claimed: the report carries the attempts,
199
+ the evidence and its class, the surviving hypotheses with their killing
200
+ observations, and the instrumentation that would settle it.
201
+
202
+ Credit: [addyosmani/agent-skills](https://github.com/addyosmani/agent-skills)
203
+ (MIT) is why this set carries a debugging skill at all; the step order, the
204
+ evidence classes and the non-reproduction protocol were written here, not taken.
@@ -1,10 +1,10 @@
1
1
  ---
2
2
  name: security-audit
3
- description: "Use when checking for dependency vulnerabilities, accidentally committed secrets, or security issues in Docker images."
3
+ description: "Use when checking for dependency vulnerabilities, accidentally committed secrets, or security issues in Docker images. NOT for Metaproject security policy — prompt-injection, redaction and memory/wiki/report writes belong to `metaproject-security` — and NOT for performing the upgrades a finding calls for (use `dependency-update`)."
4
4
  triggers:
5
- - "Security audit"
6
- - "Check vulnerabilities"
7
- - "Audit dependencies"
5
+ - "security audit"
6
+ - "audit dependencies"
7
+ - "scan secrets"
8
8
  - "Security scan"
9
9
  - "Check for CVEs"
10
10
  - "npm audit"
@@ -106,3 +106,24 @@ Otherwise report `container-scan: NOT RUN — <no Dockerfile | docker unavailabl
106
106
  selected, could not run, or returned no vulnerability data. Report `not
107
107
  measured` and name the reason. In a security report, silence read as "clean"
108
108
  is the most expensive defect available.
109
+
110
+ ## Red Flags
111
+
112
+ | Rationalization | Why it is wrong |
113
+ |---|---|
114
+ | "The advisory is informational / low severity — ship it" | This skill reports severity, it does not filter it. Accepting a known CVE is the caller's decision to make explicitly, not one you make for them by omission |
115
+ | "`npm audit` returned JSON with no vulnerabilities in it, so the project is clean" | Check for the `vulnerabilities` / `advisories` key before grouping. `ENOLOCK` is ~240 bytes of error that groups to zero in every severity — indistinguishable from clean, and that is the whole point of Step 1 |
116
+ | "No lockfile row matched, but `npm audit` is the usual one" | Falling through to another package manager's audit is a guess dressed as a result. The outcome is `dependency-audit: NOT RUN — no recognised lockfile`, with no totals attached |
117
+ | "There's no Dockerfile, so container scan: 0 issues" | "No Dockerfile" and "scanned, found nothing" are different results and only one of them is evidence. Report `container-scan: NOT RUN — no Dockerfile` |
118
+ | "`npm audit fix --force` clears the whole list" | `--force` installs semver-major upgrades across the tree. Never recommend it without stating which packages it would move and by how much |
119
+ | "That key looks like a test fixture, not a real secret" | A committed credential gets reported with its path and rotated first; whether it was live is decided afterwards, by someone who can check. Never print its value in the report |
120
+
121
+ ## Verification
122
+
123
+ Do not report the audit as done until all of the following hold:
124
+
125
+ - Every step carries `RAN` or `NOT RUN — <reason>`, and no step marked NOT RUN carries a numeric total
126
+ - Severity totals appear only for steps that ran; everywhere else the report reads `not measured`, never `0`
127
+ - Every critical/high entry names a CVE or advisory id, the package, and the version range that pulls it in
128
+ - No raw secret value appears anywhere in the report — only path, line, and a redacted preview
129
+ - The report names the package manager and lockfile detected in Step 1, so a reader can tell which tree was audited
@@ -1,16 +1,17 @@
1
1
  ---
2
2
  name: test-gen
3
- description: "Use when unit or integration tests need to be written for a specific file or module."
3
+ description: "Use when unit or integration tests need to be written for a specific file or module that already exists. NOT for writing failing test stubs ahead of the implementation (use `tests-creator`)."
4
4
  triggers:
5
- - "/test-gen"
6
- - "Generate tests"
5
+ - "generate tests"
6
+ - "write tests"
7
+ - "add coverage"
7
8
  - "Write tests for"
8
9
  - "Add tests"
9
10
  - "Create test file"
10
11
  metadata:
11
12
  author: "MrCipherSmith"
12
13
  version: "1.0.0"
13
- category: "testing"
14
+ category: "quality"
14
15
  compatible_harnesses: "cursor,codex,zed,opencode,claude"
15
16
  license: "MIT"
16
17
  ---
@@ -56,8 +57,13 @@ Auto-generate tests for specified files or modules.
56
57
 
57
58
  ### Step 5: Verify
58
59
  ```bash
59
- npx jest <test-file> --no-coverage
60
+ keryx test run --changed --strict
60
61
  ```
62
+ `src/testing/service.ts` detects the project's own test runner from its
63
+ lockfile/scripts and builds the invocation — do not hard-code a test runner
64
+ or binary here. On a project with no keryx testing config, run the project's
65
+ own configured test command instead (discovered, not hardcoded).
66
+
61
67
  Fix failing tests (max 3 iterations) — fix the test, not the source.
62
68
 
63
69
  ### Step 6: Report
@@ -73,3 +79,23 @@ Fix failing tests (max 3 iterations) — fix the test, not the source.
73
79
  - Mock external dependencies, not internal modules
74
80
  - Meaningful test descriptions
75
81
  - If no test framework detected, suggest installing one
82
+
83
+ ## Red Flags
84
+
85
+ | Rationalization | Why it is wrong |
86
+ |---|---|
87
+ | "The test fails because the source has a bug — I'll fix the source" | This skill writes test files only. A source change buried inside a test-generation run is an unreviewed fix, and it also hides the bug the new test just found. Report the failure instead |
88
+ | "Still failing on iteration four; I'll loosen the assertion until it's green" | A test that asserts nothing covers nothing while reporting coverage — strictly worse than no test. After 3 iterations, stop and report the failing case |
89
+ | "No test framework here, so I'll install vitest and a config" | Choosing a test framework is a project decision with config, CI and convention consequences. Suggest one; do not add it |
90
+ | "Mocking the neighbouring module is easier than building its input" | Mock external dependencies, not internal ones. A test whose collaborators are all mocked asserts that your mocks agree with each other |
91
+ | "One test that exercises the whole file covers more per line written" | It reports one failure for any of a dozen causes, so nobody can tell what broke. One behaviour per test, and let the description name it |
92
+
93
+ ## Verification
94
+
95
+ Do not report generation as done until all of the following hold:
96
+
97
+ - The test file sits at the project's own convention path, with the import style, describe/it structure and assertion style of the neighbouring tests read in Step 2
98
+ - `keryx test run --changed --strict` — or, with no keryx testing config, the project's own discovered test command — exits 0 with every generated test passing
99
+ - `git status` shows only test files added or modified; no source file changed
100
+ - Every exported function, component, endpoint or class identified in Step 1 has at least one test, or the report says why it does not
101
+ - The Step 6 report states the file path and the test-case count, and that count matches what the runner reported
@@ -1,8 +1,10 @@
1
1
  ---
2
2
  name: tests-creator
3
- description: "Use when writing test cases BEFORE implementation — converts acceptance criteria into failing test stubs that task-implementer will make pass. Mandatory step in the TDD pipeline between issue-analyzer and task-implementer."
3
+ description: "Use when writing test cases BEFORE implementation — converts acceptance criteria into failing test stubs that task-implementer will make pass. Mandatory step in the TDD pipeline between issue-analyzer and task-implementer. NOT for adding tests to code that already exists (use `test-gen`)."
4
4
  triggers:
5
- - "Create tests"
5
+ - "create tests first"
6
+ - "test scenarios"
7
+ - "tdd"
6
8
  - "Write tests first"
7
9
  - "Generate test specs"
8
10
  - "Tests before implementation"
@@ -11,9 +13,9 @@ triggers:
11
13
  metadata:
12
14
  author: "MrCipherSmith"
13
15
  version: "1.0.0"
14
- category: "testing"
16
+ category: "quality"
15
17
  agent_worthy: true
16
- compatible_harnesses: "cursor,codex,zed,opencode"
18
+ compatible_harnesses: "cursor,codex,zed,opencode,claude"
17
19
  license: "MIT"
18
20
  ---
19
21
 
@@ -63,17 +65,23 @@ Identify the test framework and conventions used in the project.
63
65
  **1.1 Detect framework:**
64
66
 
65
67
  ```bash
66
- # Check package.json for test dependencies
67
- cat <codebase_path>/package.json | grep -E '"(jest|vitest|mocha|jasmine|bun:test|pytest|go test)"'
68
+ keryx test analyze
69
+ ```
68
70
 
69
- # Check for config files
70
- ls <codebase_path>/{vitest.config.*,jest.config.*,pytest.ini,setup.cfg}
71
+ Discovers the framework, test scripts, config files, and existing test file
72
+ paths in one pass — do NOT `cat`/`grep` `package.json`, `ls` config globs, or
73
+ `find` for test files; that is exactly what `keryx test analyze` already
74
+ walks the project for. Read the result compactly:
71
75
 
72
- # Check existing test files for imports
73
- find <codebase_path>/src -name "*.test.*" -o -name "*.spec.*" | head -5
76
+ ```bash
77
+ keryx ctx read .metaproject/data/testing/context.md
74
78
  ```
75
79
 
76
- **1.2 Read 2-3 existing test files** to understand:
80
+ On a project with no keryx testing config, fall back to the project's own
81
+ configured way of finding its test framework and existing tests (discovered,
82
+ not a hardcoded `cat`/`ls`/`find` invocation).
83
+
84
+ **1.2 Read 2-3 existing test files** (from the `context.md` test file list) to understand:
77
85
  - Import style (`import { describe, it, expect } from 'vitest'` vs global)
78
86
  - Test file location (co-located `*.test.ts` vs `__tests__/` directory)
79
87
  - Describe/it/test nesting patterns
@@ -324,6 +332,19 @@ This ensures the TDD cycle is maintained end-to-end.
324
332
 
325
333
  ---
326
334
 
335
+ ## Red Flags
336
+
337
+ | Rationalization | Why it is wrong |
338
+ |---|---|
339
+ | "The module doesn't exist, so the import breaks the whole suite — I'll create a stub module first" | That stub is implementation code, and it is exactly what Rule 1 forbids. A failing import IS the RED phase; `task-implementer` creates the module |
340
+ | "A placeholder like `expect(true).toBe(true)` gets the file committed and the pipeline moving" | A test that passes before implementation proves nothing and goes green forever after. RED means failing (Rule 2) — use `it.todo`, or the forward-declared assertion from 3.3 |
341
+ | "I know how this will be built, so I'll assert it calls the repository method" | That tests HOW, not WHAT (Rule 3), and it fails the moment the implementer picks a different — valid — structure. Assert observable behaviour |
342
+ | "This acceptance criterion is too vague to test, so I'll skip it" | Every criterion needs at least one test (Rule 4). Derive from the task description, log the warning, and say in `notes` what you assumed — an untested criterion silently leaves the pipeline |
343
+ | "`verify_red` shows the test passing already; close enough, report DONE" | A test green before implementation is a wrong test, not an early win. Fix the assertion, or report it as a concern — do not pass it downstream as covered |
344
+ | "I'll leave the stubs uncommitted and let `task-implementer` commit everything together" | The handoff assumes committed RED files (Rule 6): the implementer's first step is to run them and confirm they fail. Uncommitted stubs make that step unverifiable |
345
+
346
+ ---
347
+
327
348
  ## Job Context Awareness
328
349
 
329
350
  When dispatched by `job-orchestrator`:
@@ -1,16 +1,15 @@
1
1
  ---
2
2
  name: code-ai-review
3
- description: "Performs strict AI code review following code-review-ai-assistant.mdc standards. Reviews current branch changes from merge-base by default, including both committed and local uncommitted changes. Use when: code review requested, checking branch changes, reviewing implementation quality."
3
+ description: "Use when the legacy strict AI review profile (code-review-ai-assistant.mdc) is asked for by name — reviews the current branch from its merge-base, committed and uncommitted changes together. NOT for: a code review request that names no profile (review-orchestrator)."
4
4
  triggers:
5
- - "Code review"
6
- - "Review my changes"
7
- - "Check this code"
8
- - "Review code"
5
+ - "code-ai-review"
6
+ - "AI review baseline"
7
+ - "strict AI review"
9
8
  metadata:
10
9
  author: "MrCipherSmith"
11
10
  version: "1.0.0"
12
11
  category: "review"
13
- compatible_harnesses: "cursor,codex,zed,opencode"
12
+ compatible_harnesses: "cursor,codex,zed,opencode,claude"
14
13
  license: "MIT"
15
14
  ---
16
15
 
@@ -56,7 +55,7 @@ This skill does NOT duplicate:
56
55
 
57
56
  ## Scope Detection
58
57
 
59
- See shared script: `skills/shared/git-merge-base.md`
58
+ See shared script: `.metaproject/skills/gdskills/shared/git-merge-base.md`
60
59
 
61
60
  Run the script from that file to determine MERGE_BASE and SCOPE before proceeding with the review.
62
61
 
@@ -201,3 +200,39 @@ If provided and the file exists, read the context document before starting the r
201
200
  - Reference context when justifying suggestions
202
201
 
203
202
  If the file does not exist or is not provided, proceed normally — context is optional and non-blocking.
203
+
204
+ ---
205
+
206
+ ## Red Flags
207
+
208
+ This profile is a thin wrapper around `code-review-ai-assistant.mdc`, and it
209
+ predates everything the review domain standardised afterwards. The rows below are
210
+ the ways that gap makes it misfire.
211
+
212
+ | Rationalization | Why it is wrong |
213
+ |----------------|-----------------|
214
+ | "A review was requested, so I will run this profile." | It is a legacy opt-in profile, reached by name or through `review --legacy-profiles`. An unqualified review request belongs to `review-orchestrator`; running this one instead silently drops every specialised lane along with the finding schema. |
215
+ | "The output template has a Severity field, so my report is a review result." | It is not. This profile predates `reviewer-finding.schema.json`: it emits free prose with no machine-readable finding and no class enumeration, so nothing downstream can screen, verify or deduplicate it. Hand the report to a person, never to `keryx review ingest`. |
216
+ | "Half these instructions are in Russian, so the report should be in Russian." | The mixed language is an artefact of when this file was written, not an instruction about the report. Write the report in the language the requester used. |
217
+ | "I noticed a store problem and a naming problem, so I will include them here." | The Scope Boundaries table above routes those to `code-mobx-store-review` and `code-style-review`. A finding filed under the wrong profile is a finding the requester did not ask this profile for, and it arrives without the checks that lane would have applied. |
218
+ | "One entry per occurrence is more thorough." | It is longer, not more thorough. Where one shape repeats, report it once and list every site — ten entries that are one problem hide the other nine. |
219
+ | "I cannot reach the code path, but the pattern is usually wrong." | Then it is an observation, not a finding. Say what input, call or condition would reach it, and let the reader decide. |
220
+
221
+ ---
222
+
223
+ ## Verification
224
+
225
+ Report done only once all of these hold:
226
+
227
+ - The requester asked for this profile by name, or through
228
+ `review --legacy-profiles`. If they asked for "a review", stop and hand the
229
+ request to `review-orchestrator` instead.
230
+ - The scope block carries the real branch, parent ref, merge-base and scope mode —
231
+ not the template placeholders.
232
+ - Every finding carries Severity, Location (path plus the lines from the diff),
233
+ Problem, Why it matters and a concrete Suggested fix; a patch where the fix is
234
+ a line or two.
235
+ - Every finding is anchored to a line the branch slice actually changed. Nothing
236
+ outside `merge-base..worktree` is discussed.
237
+ - The report is free prose by design, so it is delivered to a person and is not
238
+ fed into the managed-review pipeline.