@mrciphersmith/keryx 0.2.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +351 -0
- package/dist/cli.js +48427 -0
- package/dist/proxy-worker.js +381 -0
- package/package.json +63 -0
- package/src/gdgraph/affected.test.ts +100 -0
- package/src/gdgraph/affected.ts +135 -0
- package/src/gdgraph/build-integrity.test.ts +193 -0
- package/src/gdgraph/build-lang.test.ts +399 -0
- package/src/gdgraph/build.test.ts +120 -0
- package/src/gdgraph/build.ts +804 -0
- package/src/gdgraph/config.test.ts +47 -0
- package/src/gdgraph/config.ts +113 -0
- package/src/gdgraph/core-sources.test.ts +99 -0
- package/src/gdgraph/core-sources.ts +20 -0
- package/src/gdgraph/enrich.ts +79 -0
- package/src/gdgraph/fallback.test.ts +153 -0
- package/src/gdgraph/find.test.ts +78 -0
- package/src/gdgraph/find.ts +107 -0
- package/src/gdgraph/pagerank.ts +129 -0
- package/src/gdgraph/path.test.ts +56 -0
- package/src/gdgraph/path.ts +112 -0
- package/src/gdgraph/query.ts +133 -0
- package/src/gdgraph/repomap.test.ts +110 -0
- package/src/gdgraph/repomap.ts +193 -0
- package/src/gdgraph/service.test.ts +59 -0
- package/src/gdgraph/service.ts +51 -0
- package/src/gdgraph/staleness.ts +20 -0
- package/src/gdgraph/symbol.test.ts +89 -0
- package/src/gdgraph/symbol.ts +123 -0
- package/src/gdgraph/symbols-capability.test.ts +41 -0
- package/src/gdgraph/symbols-capability.ts +49 -0
- package/src/gdgraph/target.ts +56 -0
- package/src/gdgraph/treesitter/adapter.test.ts +249 -0
- package/src/gdgraph/treesitter/adapter.ts +213 -0
- package/src/gdgraph/treesitter/extract.test.ts +278 -0
- package/src/gdgraph/treesitter/extract.ts +389 -0
- package/src/gdgraph/treesitter/grammars.ts +110 -0
- package/src/gdgraph/treesitter/no-treesitter-import.test.ts +51 -0
- package/src/gdgraph/treesitter/resolve-calls.test.ts +38 -0
- package/src/gdgraph/types.ts +63 -0
- package/src/gdskills/bundled/rules/core/api-contracts.mdc +148 -0
- package/src/gdskills/bundled/rules/core/async-patterns.mdc +185 -0
- package/src/gdskills/bundled/rules/core/clean-architecture.mdc +163 -0
- package/src/gdskills/bundled/rules/core/code-review-ai-assistant.mdc +49 -0
- package/src/gdskills/bundled/rules/core/code-review-b091-profile.mdc +48 -0
- package/src/gdskills/bundled/rules/core/code-style-patterns.mdc +54 -0
- package/src/gdskills/bundled/rules/core/commit-message-formatting.mdc +25 -0
- package/src/gdskills/bundled/rules/core/database-patterns.mdc +162 -0
- package/src/gdskills/bundled/rules/core/documentation-management.mdc +106 -0
- package/src/gdskills/bundled/rules/core/error-handling.mdc +163 -0
- package/src/gdskills/bundled/rules/core/execution-metrics.md +99 -0
- package/src/gdskills/bundled/rules/core/frontend-assistant.mdc +40 -0
- package/src/gdskills/bundled/rules/core/git-rules.mdc +37 -0
- package/src/gdskills/bundled/rules/core/gproject-contracts.mdc +198 -0
- package/src/gdskills/bundled/rules/core/implementation-doc-mandate.mdc +149 -0
- package/src/gdskills/bundled/rules/core/implementation-plans.mdc +58 -0
- package/src/gdskills/bundled/rules/core/jobs-documentation.mdc +221 -0
- package/src/gdskills/bundled/rules/core/mobx-store-template.mdc +561 -0
- package/src/gdskills/bundled/rules/core/model-selection.mdc +53 -0
- package/src/gdskills/bundled/rules/core/nestjs-dto.mdc +50 -0
- package/src/gdskills/bundled/rules/core/playwright-testing.mdc +321 -0
- package/src/gdskills/bundled/rules/core/requirements-management.mdc +35 -0
- package/src/gdskills/bundled/rules/core/requirements-package-standard.mdc +103 -0
- package/src/gdskills/bundled/rules/core/review-agent-profile.mdc +49 -0
- package/src/gdskills/bundled/rules/core/review-strict-profile.mdc +44 -0
- package/src/gdskills/bundled/rules/core/rule-management-workflow.mdc +62 -0
- package/src/gdskills/bundled/rules/core/security-baseline.mdc +155 -0
- package/src/gdskills/bundled/rules/core/shared-definitions.mdc +79 -0
- package/src/gdskills/bundled/rules/core/skill-lifecycle.mdc +55 -0
- package/src/gdskills/bundled/rules/core/skills-storage-workflow.mdc +88 -0
- package/src/gdskills/bundled/rules/core/solid-principles.mdc +149 -0
- package/src/gdskills/bundled/rules/core/storybook-guidelines.mdc +36 -0
- package/src/gdskills/bundled/rules/core/subagent-context-construction.md +107 -0
- package/src/gdskills/bundled/rules/core/subagent-status-protocol.md +169 -0
- package/src/gdskills/bundled/rules/core/tdd-workflow.mdc +96 -0
- package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.codex.md +47 -0
- package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.cursor.md +55 -0
- package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.md +352 -0
- package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.opencode.md +39 -0
- package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.zed.md +29 -0
- package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.codex.md +567 -0
- package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.cursor.md +567 -0
- package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.md +655 -0
- package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.opencode.md +567 -0
- package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.zed.md +567 -0
- package/src/gdskills/bundled/skills/orchestration/context-collector/input-contract.schema.json +134 -0
- package/src/gdskills/bundled/skills/orchestration/context-collector/orchestrator-prompt.md +183 -0
- package/src/gdskills/bundled/skills/orchestration/context-collector/output-contract.schema.json +208 -0
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.codex.md +1412 -0
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.cursor.md +1412 -0
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.detail.md +735 -0
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.md +468 -0
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.opencode.md +1412 -0
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.zed.md +1412 -0
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/analysis-request.md +62 -0
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/analysis-request.template.md +79 -0
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/input-contract.schema.json +247 -0
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/orchestrator-prompt.md +362 -0
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/output-contract.schema.json +87 -0
- package/src/gdskills/bundled/skills/orchestration/feature-dev/SKILL.codex.md +105 -0
- package/src/gdskills/bundled/skills/orchestration/feature-dev/SKILL.cursor.md +105 -0
- package/src/gdskills/bundled/skills/orchestration/feature-dev/SKILL.md +165 -0
- package/src/gdskills/bundled/skills/orchestration/flow-orchestrator/SKILL.md +379 -0
- package/src/gdskills/bundled/skills/orchestration/flow-orchestrator/input-contract.schema.json +33 -0
- package/src/gdskills/bundled/skills/orchestration/flow-orchestrator/output-contract.schema.json +41 -0
- package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.codex.md +307 -0
- package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.cursor.md +307 -0
- package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.md +373 -0
- package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.opencode.md +307 -0
- package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.zed.md +307 -0
- package/src/gdskills/bundled/skills/orchestration/issue-analyzer/input-contract.schema.json +130 -0
- package/src/gdskills/bundled/skills/orchestration/issue-analyzer/issue-request.template.md +50 -0
- package/src/gdskills/bundled/skills/orchestration/issue-analyzer/orchestrator-prompt.md +155 -0
- package/src/gdskills/bundled/skills/orchestration/issue-analyzer/output-contract.schema.json +61 -0
- package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.codex.md +365 -0
- package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.cursor.md +365 -0
- package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.md +373 -0
- package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.opencode.md +365 -0
- package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.zed.md +365 -0
- package/src/gdskills/bundled/skills/orchestration/job-documenter/input-contract.schema.json +55 -0
- package/src/gdskills/bundled/skills/orchestration/job-documenter/output-contract.schema.json +58 -0
- package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.codex.md +1701 -0
- package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.cursor.md +1701 -0
- package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.md +1734 -0
- package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.opencode.md +1701 -0
- package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.zed.md +1701 -0
- package/src/gdskills/bundled/skills/orchestration/job-orchestrator/input-contract.schema.json +188 -0
- package/src/gdskills/bundled/skills/orchestration/job-orchestrator/orchestrator-prompt.md +179 -0
- package/src/gdskills/bundled/skills/orchestration/job-orchestrator/output-contract.schema.json +103 -0
- package/src/gdskills/bundled/skills/orchestration/job-orchestrator/state.schema.json +164 -0
- package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.codex.md +395 -0
- package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.cursor.md +395 -0
- package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.md +556 -0
- package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.opencode.md +395 -0
- package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.zed.md +395 -0
- package/src/gdskills/bundled/skills/orchestration/task-implementer/input-contract.schema.json +204 -0
- package/src/gdskills/bundled/skills/orchestration/task-implementer/orchestrator-prompt.md +206 -0
- package/src/gdskills/bundled/skills/orchestration/task-implementer/output-contract.schema.json +51 -0
- package/src/gdskills/bundled/skills/orchestration/task-implementer/task-request.template.md +111 -0
- package/src/gdskills/bundled/skills/planning/autodoc-analyst/SKILL.md +163 -0
- package/src/gdskills/bundled/skills/planning/autodoc-architect/SKILL.md +161 -0
- package/src/gdskills/bundled/skills/planning/autodoc-assembler/SKILL.md +128 -0
- package/src/gdskills/bundled/skills/planning/autodoc-orchestrator/SKILL.md +321 -0
- package/src/gdskills/bundled/skills/planning/autodoc-scanner/SKILL.md +166 -0
- package/src/gdskills/bundled/skills/planning/autodoc-writer/SKILL.md +253 -0
- package/src/gdskills/bundled/skills/planning/brainstorm/SKILL.claude.md +46 -0
- package/src/gdskills/bundled/skills/planning/brainstorm/SKILL.codex.md +90 -0
- package/src/gdskills/bundled/skills/planning/brainstorm/SKILL.cursor.md +90 -0
- package/src/gdskills/bundled/skills/planning/brainstorm/SKILL.md +90 -0
- package/src/gdskills/bundled/skills/planning/consistency-checker/SKILL.codex.md +33 -0
- package/src/gdskills/bundled/skills/planning/consistency-checker/SKILL.cursor.md +33 -0
- package/src/gdskills/bundled/skills/planning/consistency-checker/SKILL.md +190 -0
- package/src/gdskills/bundled/skills/planning/docpack-orchestrator/SKILL.md +142 -0
- package/src/gdskills/bundled/skills/planning/docpack-orchestrator/input-contract.schema.json +31 -0
- package/src/gdskills/bundled/skills/planning/docpack-orchestrator/output-contract.schema.json +31 -0
- package/src/gdskills/bundled/skills/planning/docpack-review/SKILL.md +80 -0
- package/src/gdskills/bundled/skills/planning/docpack-review/input-contract.schema.json +20 -0
- package/src/gdskills/bundled/skills/planning/docpack-review/output-contract.schema.json +36 -0
- package/src/gdskills/bundled/skills/planning/interview/SKILL.codex.md +181 -0
- package/src/gdskills/bundled/skills/planning/interview/SKILL.cursor.md +181 -0
- package/src/gdskills/bundled/skills/planning/interview/SKILL.md +187 -0
- package/src/gdskills/bundled/skills/planning/interviewer/SKILL.claude.md +94 -0
- package/src/gdskills/bundled/skills/planning/interviewer/SKILL.codex.md +99 -0
- package/src/gdskills/bundled/skills/planning/interviewer/SKILL.cursor.md +99 -0
- package/src/gdskills/bundled/skills/planning/interviewer/SKILL.md +105 -0
- package/src/gdskills/bundled/skills/planning/patterns-researcher/SKILL.codex.md +33 -0
- package/src/gdskills/bundled/skills/planning/patterns-researcher/SKILL.cursor.md +33 -0
- package/src/gdskills/bundled/skills/planning/patterns-researcher/SKILL.md +237 -0
- package/src/gdskills/bundled/skills/planning/planner/SKILL.codex.md +33 -0
- package/src/gdskills/bundled/skills/planning/planner/SKILL.cursor.md +33 -0
- package/src/gdskills/bundled/skills/planning/planner/SKILL.md +190 -0
- package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.codex.md +193 -0
- package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.cursor.md +193 -0
- package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.md +193 -0
- package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.opencode.md +193 -0
- package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.zed.md +193 -0
- package/src/gdskills/bundled/skills/planning/prd-creator/input-contract.schema.json +63 -0
- package/src/gdskills/bundled/skills/planning/prd-creator/output-contract.schema.json +175 -0
- package/src/gdskills/bundled/skills/planning/problem-definer/SKILL.codex.md +31 -0
- package/src/gdskills/bundled/skills/planning/problem-definer/SKILL.cursor.md +31 -0
- package/src/gdskills/bundled/skills/planning/problem-definer/SKILL.md +153 -0
- package/src/gdskills/bundled/skills/planning/project-discovery/SKILL.codex.md +32 -0
- package/src/gdskills/bundled/skills/planning/project-discovery/SKILL.cursor.md +32 -0
- package/src/gdskills/bundled/skills/planning/project-discovery/SKILL.md +166 -0
- package/src/gdskills/bundled/skills/planning/spec-writer/SKILL.codex.md +44 -0
- package/src/gdskills/bundled/skills/planning/spec-writer/SKILL.cursor.md +44 -0
- package/src/gdskills/bundled/skills/planning/spec-writer/SKILL.md +243 -0
- package/src/gdskills/bundled/skills/planning/stack-advisor/SKILL.codex.md +43 -0
- package/src/gdskills/bundled/skills/planning/stack-advisor/SKILL.cursor.md +43 -0
- package/src/gdskills/bundled/skills/planning/stack-advisor/SKILL.md +193 -0
- package/src/gdskills/bundled/skills/platform/agent-entrypoint-distiller/SKILL.md +47 -0
- package/src/gdskills/bundled/skills/platform/claude-md-management/SKILL.codex.md +87 -0
- package/src/gdskills/bundled/skills/platform/claude-md-management/SKILL.cursor.md +87 -0
- package/src/gdskills/bundled/skills/platform/claude-md-management/SKILL.md +87 -0
- package/src/gdskills/bundled/skills/platform/hookify/SKILL.codex.md +100 -0
- package/src/gdskills/bundled/skills/platform/hookify/SKILL.cursor.md +100 -0
- package/src/gdskills/bundled/skills/platform/hookify/SKILL.md +100 -0
- package/src/gdskills/bundled/skills/quality/changelog/SKILL.claude.md +45 -0
- package/src/gdskills/bundled/skills/quality/changelog/SKILL.codex.md +84 -0
- package/src/gdskills/bundled/skills/quality/changelog/SKILL.cursor.md +84 -0
- package/src/gdskills/bundled/skills/quality/changelog/SKILL.md +84 -0
- package/src/gdskills/bundled/skills/quality/commit/SKILL.codex.md +66 -0
- package/src/gdskills/bundled/skills/quality/commit/SKILL.cursor.md +66 -0
- package/src/gdskills/bundled/skills/quality/commit/SKILL.md +66 -0
- package/src/gdskills/bundled/skills/quality/db-migrate/SKILL.claude.md +40 -0
- package/src/gdskills/bundled/skills/quality/db-migrate/SKILL.codex.md +66 -0
- package/src/gdskills/bundled/skills/quality/db-migrate/SKILL.cursor.md +66 -0
- package/src/gdskills/bundled/skills/quality/db-migrate/SKILL.md +66 -0
- package/src/gdskills/bundled/skills/quality/dependency-update/SKILL.claude.md +45 -0
- package/src/gdskills/bundled/skills/quality/dependency-update/SKILL.codex.md +81 -0
- package/src/gdskills/bundled/skills/quality/dependency-update/SKILL.cursor.md +81 -0
- package/src/gdskills/bundled/skills/quality/dependency-update/SKILL.md +81 -0
- package/src/gdskills/bundled/skills/quality/deploy/SKILL.claude.md +42 -0
- package/src/gdskills/bundled/skills/quality/deploy/SKILL.codex.md +70 -0
- package/src/gdskills/bundled/skills/quality/deploy/SKILL.cursor.md +70 -0
- package/src/gdskills/bundled/skills/quality/deploy/SKILL.md +70 -0
- package/src/gdskills/bundled/skills/quality/metaproject-security/SKILL.md +103 -0
- package/src/gdskills/bundled/skills/quality/perf-check/SKILL.claude.md +48 -0
- package/src/gdskills/bundled/skills/quality/perf-check/SKILL.codex.md +83 -0
- package/src/gdskills/bundled/skills/quality/perf-check/SKILL.cursor.md +83 -0
- package/src/gdskills/bundled/skills/quality/perf-check/SKILL.md +83 -0
- package/src/gdskills/bundled/skills/quality/pr/SKILL.codex.md +75 -0
- package/src/gdskills/bundled/skills/quality/pr/SKILL.cursor.md +75 -0
- package/src/gdskills/bundled/skills/quality/pr/SKILL.md +75 -0
- package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.codex.md +364 -0
- package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.cursor.md +295 -0
- package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.md +378 -0
- package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.opencode.md +364 -0
- package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.zed.md +38 -0
- package/src/gdskills/bundled/skills/quality/pr-issue-documenter/input-contract.schema.json +53 -0
- package/src/gdskills/bundled/skills/quality/pr-issue-documenter/output-contract.schema.json +46 -0
- package/src/gdskills/bundled/skills/quality/push/SKILL.codex.md +52 -0
- package/src/gdskills/bundled/skills/quality/push/SKILL.cursor.md +52 -0
- package/src/gdskills/bundled/skills/quality/push/SKILL.md +52 -0
- package/src/gdskills/bundled/skills/quality/security-audit/SKILL.claude.md +40 -0
- package/src/gdskills/bundled/skills/quality/security-audit/SKILL.codex.md +61 -0
- package/src/gdskills/bundled/skills/quality/security-audit/SKILL.cursor.md +61 -0
- package/src/gdskills/bundled/skills/quality/security-audit/SKILL.md +61 -0
- package/src/gdskills/bundled/skills/quality/test-gen/SKILL.claude.md +30 -0
- package/src/gdskills/bundled/skills/quality/test-gen/SKILL.codex.md +75 -0
- package/src/gdskills/bundled/skills/quality/test-gen/SKILL.cursor.md +75 -0
- package/src/gdskills/bundled/skills/quality/test-gen/SKILL.md +75 -0
- package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.codex.md +64 -0
- package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.cursor.md +74 -0
- package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.md +339 -0
- package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.opencode.md +48 -0
- package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.zed.md +44 -0
- package/src/gdskills/bundled/skills/quality/tests-creator/input-contract.schema.json +121 -0
- package/src/gdskills/bundled/skills/quality/tests-creator/output-contract.schema.json +127 -0
- package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.codex.md +204 -0
- package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.cursor.md +204 -0
- package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.md +203 -0
- package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.opencode.md +204 -0
- package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.zed.md +204 -0
- package/src/gdskills/bundled/skills/review/code-b091-review/SKILL.codex.md +209 -0
- package/src/gdskills/bundled/skills/review/code-b091-review/SKILL.cursor.md +209 -0
- package/src/gdskills/bundled/skills/review/code-b091-review/SKILL.md +208 -0
- package/src/gdskills/bundled/skills/review/code-b091-review/SKILL.opencode.md +209 -0
- package/src/gdskills/bundled/skills/review/code-b091-review/SKILL.zed.md +209 -0
- package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.codex.md +263 -0
- package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.cursor.md +263 -0
- package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.md +258 -0
- package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.opencode.md +263 -0
- package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.zed.md +263 -0
- package/src/gdskills/bundled/skills/review/code-style-review/SKILL.codex.md +175 -0
- package/src/gdskills/bundled/skills/review/code-style-review/SKILL.cursor.md +175 -0
- package/src/gdskills/bundled/skills/review/code-style-review/SKILL.md +168 -0
- package/src/gdskills/bundled/skills/review/code-style-review/SKILL.opencode.md +175 -0
- package/src/gdskills/bundled/skills/review/code-style-review/SKILL.zed.md +175 -0
- package/src/gdskills/bundled/skills/review/review-architecture/SKILL.md +360 -0
- package/src/gdskills/bundled/skills/review/review-backend/SKILL.md +337 -0
- package/src/gdskills/bundled/skills/review/review-clean-code/SKILL.md +477 -0
- package/src/gdskills/bundled/skills/review/review-core-boundaries/SKILL.md +93 -0
- package/src/gdskills/bundled/skills/review/review-flow-graph/SKILL.md +119 -0
- package/src/gdskills/bundled/skills/review/review-frontend/SKILL.md +595 -0
- package/src/gdskills/bundled/skills/review/review-frontend-conventions/SKILL.md +144 -0
- package/src/gdskills/bundled/skills/review/review-highload/SKILL.md +519 -0
- package/src/gdskills/bundled/skills/review/review-logic/SKILL.md +323 -0
- package/src/gdskills/bundled/skills/review/review-orchestrator/SKILL.md +927 -0
- package/src/gdskills/bundled/skills/review/review-orchestrator/input-contract.schema.json +153 -0
- package/src/gdskills/bundled/skills/review/review-orchestrator/output-contract.schema.json +77 -0
- package/src/gdskills/bundled/skills/review/review-orchestrator/review-context.schema.json +389 -0
- package/src/gdskills/bundled/skills/review/review-orchestrator/reviewer-finding.schema.json +189 -0
- package/src/gdskills/bundled/skills/review/review-orchestrator/reviewer-input.schema.json +241 -0
- package/src/gdskills/bundled/skills/review/review-performance/SKILL.md +344 -0
- package/src/gdskills/bundled/skills/review/review-pr-feedback/SKILL.md +327 -0
- package/src/gdskills/bundled/skills/review/review-security-code/SKILL.md +348 -0
- package/src/gdskills/bundled/skills/review/review-strict/SKILL.md +328 -0
- package/src/gdskills/bundled/skills/review/review-style/SKILL.md +343 -0
- package/src/gdskills/bundled/skills/review/review-testing-practices/SKILL.md +134 -0
- package/src/gdskills/bundled/skills/shared/git-merge-base.md +33 -0
- package/src/gdskills/contracts/agent-event.schema.json +32 -0
- package/src/gdskills/contracts/orchestrator-state.schema.json +58 -0
- package/src/gdskills/contracts/review-finding.schema.json +59 -0
- package/src/gdskills/contracts/subagent-dispatch.schema.json +123 -0
- package/src/gdskills/contracts/subagent-result.schema.json +136 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: review-frontend-conventions
|
|
3
|
+
description: |
|
|
4
|
+
Use when reviewing frontend code against repository-local conventions commonly
|
|
5
|
+
captured in CLAUDE.md or similar project guides: React/MobX boundaries,
|
|
6
|
+
TypeScript strictness, i18n placement, storage wrappers, error handling,
|
|
7
|
+
styling tokens, Storybook expectations, and local tooling rules. Dispatched
|
|
8
|
+
by review-orchestrator for --frontend-conventions, --project-conventions,
|
|
9
|
+
--all, or frontend src/**/*.ts(x) changes when local convention docs exist.
|
|
10
|
+
metadata:
|
|
11
|
+
author: "MrCipherSmith"
|
|
12
|
+
version: "1.0.0"
|
|
13
|
+
category: "review"
|
|
14
|
+
license: "MIT"
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
# Review — Frontend Conventions
|
|
18
|
+
|
|
19
|
+
Reviewer for frontend repository conventions that are more specific than generic React/MobX
|
|
20
|
+
correctness. Use it alongside `review-frontend`, `review-style`, `review-performance`, and
|
|
21
|
+
`review-logic`.
|
|
22
|
+
|
|
23
|
+
Before reviewing, read the nearest project guide files if they exist: root `CLAUDE.md`,
|
|
24
|
+
`AGENTS.md`, `.junie/guidelines.md`, `ARCHITECTURE.md`, and module-level `CLAUDE.md` files.
|
|
25
|
+
The checklist below is a neutral baseline; local project rules win when they are stricter.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Scope
|
|
30
|
+
|
|
31
|
+
Review changed frontend source, stories, tests, and UI wrapper files for local conventions.
|
|
32
|
+
Do not flag unrelated generic React/MobX issues unless they also violate a local convention or
|
|
33
|
+
the baseline below.
|
|
34
|
+
|
|
35
|
+
If no local convention document exists, run only the neutral baseline and state that no
|
|
36
|
+
project-specific guide was found.
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Checklist
|
|
41
|
+
|
|
42
|
+
### Styling and UI
|
|
43
|
+
|
|
44
|
+
- Prefer the repository's styling system consistently (Tailwind, CSS modules, design tokens, or
|
|
45
|
+
the established local framework).
|
|
46
|
+
- Avoid inline `style` except for genuinely dynamic positioning or third-party integration seams.
|
|
47
|
+
- Theme colors and spacing come from local tokens, not ad hoc literals.
|
|
48
|
+
- Use the established UI kit and wrapper layer; do not bypass shared wrappers without a reason.
|
|
49
|
+
- Reuse existing icons/assets before adding new ones.
|
|
50
|
+
|
|
51
|
+
### TypeScript
|
|
52
|
+
|
|
53
|
+
- Avoid `any` and broad `as` casts. Prefer type guards, discriminated unions, and precise types.
|
|
54
|
+
- Keep tests and stories typed unless intentionally exercising invalid edge cases.
|
|
55
|
+
- Follow local React type import conventions consistently.
|
|
56
|
+
- Write new code in the direction of stricter compiler settings.
|
|
57
|
+
|
|
58
|
+
### React Components
|
|
59
|
+
|
|
60
|
+
- Keep components thin: read state, bind events, render.
|
|
61
|
+
- Business logic, IO, validation, and data transformation belong in stores/services.
|
|
62
|
+
- Avoid React local state/memo/callback hooks where the local architecture expects observable or
|
|
63
|
+
computed state.
|
|
64
|
+
- Use effects only for lifecycle, subscriptions, and third-party integration; always clean up.
|
|
65
|
+
- Components reading observable state are wrapped in the repository's reactive wrapper.
|
|
66
|
+
- Props shape and file naming follow local conventions.
|
|
67
|
+
|
|
68
|
+
### State Stores
|
|
69
|
+
|
|
70
|
+
- Store classes follow local naming, file casing, context, and hook conventions.
|
|
71
|
+
- Observable classes initialize their reactivity in constructors.
|
|
72
|
+
- Member ordering follows local lint/member-ordering rules.
|
|
73
|
+
- UI-called actions preserve `this` binding.
|
|
74
|
+
- Async callbacks that mutate observable state re-enter an action boundary.
|
|
75
|
+
- Derived serializable state has a single source of truth such as `currentState` when that is the
|
|
76
|
+
local pattern.
|
|
77
|
+
|
|
78
|
+
### i18n, Storage, and Errors
|
|
79
|
+
|
|
80
|
+
- Translations happen at the view/render boundary unless local architecture says otherwise.
|
|
81
|
+
- Do not hide missing translations with inline fallbacks when the project expects JSON/catalog
|
|
82
|
+
entries.
|
|
83
|
+
- Browser storage goes through shared wrappers/adapters; direct `localStorage`/`sessionStorage`
|
|
84
|
+
access is a review finding when wrappers exist.
|
|
85
|
+
- Catch blocks normalize user-facing messages, preserve original errors for logging, and notify
|
|
86
|
+
through the established UI notification channel.
|
|
87
|
+
|
|
88
|
+
### Stories and Tooling
|
|
89
|
+
|
|
90
|
+
- New reusable UI surfaces have stories or examples matching local standards.
|
|
91
|
+
- Stories include representative default, empty/minimal, and stress/large states where useful.
|
|
92
|
+
- Wrapper components expose plain props for controls when the primary component is store-only.
|
|
93
|
+
- Treat unused-code tools as signals: preserve intentional public APIs with narrow ignores rather
|
|
94
|
+
than deleting documented runtime/story/test entrypoints.
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## Orchestrated Review Contract
|
|
99
|
+
|
|
100
|
+
When dispatched by `review-orchestrator`, follow the provided `reviewer-input.schema.json` payload. Return a `REVIEW_RESULT` object compatible with `skills/review-orchestrator/reviewer-finding.schema.json`, then a concise markdown summary. Keep findings evidence-based, include concrete `suggested_fix` for every blocker/major, and return `NEEDS_CONTEXT` instead of guessing when required context is missing.
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## Finding Format
|
|
105
|
+
|
|
106
|
+
### Class scope — required for `blocker` and `major`
|
|
107
|
+
|
|
108
|
+
Every `blocker` and `major` finding must carry `class_scope`: **every** site that
|
|
109
|
+
holds the shape you found, and **how you enumerated them** — the grep or query
|
|
110
|
+
you ran, or the guard that derives the set.
|
|
111
|
+
|
|
112
|
+
A finding anchored to one `file:line` is a claim about one site. The recorded
|
|
113
|
+
history of this repository is that a fix then repairs that site and leaves its
|
|
114
|
+
siblings: one writer of five, one operator instruction of four, six readers of
|
|
115
|
+
eight. Each was found by the *next* review round, which is why reviews here have
|
|
116
|
+
run to seven and four rounds instead of one.
|
|
117
|
+
|
|
118
|
+
```yaml
|
|
119
|
+
class_scope:
|
|
120
|
+
sites: ["src/lib/shell-config.ts:60", "src/session/store.ts:133"]
|
|
121
|
+
enumeration_method: "grep for the config-path resolvers; 7 writers, 2 unguarded"
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
"I checked the others" is not an enumeration method. A single-entry `sites` list
|
|
125
|
+
is a claim that the class has exactly one member — make it deliberately, because
|
|
126
|
+
`review-finding.schema.json` accepts it and the next round tests it.
|
|
127
|
+
|
|
128
|
+
`minor` and `info` may omit it: enumerating the class for every low-severity
|
|
129
|
+
observation is theatre, not rigour.
|
|
130
|
+
|
|
131
|
+
```markdown
|
|
132
|
+
### [F-NNN] Title
|
|
133
|
+
|
|
134
|
+
- **Severity**: blocker | major | minor | info
|
|
135
|
+
- **File**: path/to/file.ts:line
|
|
136
|
+
- **Problem**: what local frontend convention is violated
|
|
137
|
+
- **Why it matters**: runtime behavior, maintainability, CI, UX, or developer workflow impact
|
|
138
|
+
- **Fix**: concrete project-aligned change
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
Severity guidance: lost reactivity, direct storage quota risk, masked translation/error behavior,
|
|
142
|
+
and violations that break CI are `blocker`/`major`; naming/story coverage is usually `minor`
|
|
143
|
+
unless it breaks tooling or controls.
|
|
144
|
+
|
|
@@ -0,0 +1,519 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: review-highload
|
|
3
|
+
description: |
|
|
4
|
+
Use when: reviewing code that will run under high concurrency or high traffic —
|
|
5
|
+
race conditions, connection pool exhaustion, cache invalidation, missing indexes,
|
|
6
|
+
unbounded queues, missing backpressure, retry storms, idempotency gaps,
|
|
7
|
+
hot-path blocking I/O, and distributed systems anti-patterns.
|
|
8
|
+
Triggered by: "review highload", "review scalability", "highload review",
|
|
9
|
+
"review concurrency", "review --highload", or dispatched by review-orchestrator.
|
|
10
|
+
NOT for: frontend re-render performance (review-performance), general N+1 queries
|
|
11
|
+
(review-performance), clean code style (review-clean-code), or NestJS module structure
|
|
12
|
+
(review-architecture).
|
|
13
|
+
version: "1.0.0"
|
|
14
|
+
triggers:
|
|
15
|
+
- "review highload"
|
|
16
|
+
- "review scalability"
|
|
17
|
+
- "highload review"
|
|
18
|
+
- "review concurrency"
|
|
19
|
+
- "review distributed"
|
|
20
|
+
- "review --highload"
|
|
21
|
+
- dispatched by review-orchestrator
|
|
22
|
+
metadata:
|
|
23
|
+
author: "MrCipherSmith"
|
|
24
|
+
version: "1.0.0"
|
|
25
|
+
category: "review"
|
|
26
|
+
license: "MIT"
|
|
27
|
+
compatibility: "cursor,codex,zed,opencode,claude"
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
# Review: High-Load & Scalability
|
|
31
|
+
|
|
32
|
+
Specialized reviewer for **code that will run under significant concurrent load**.
|
|
33
|
+
Focuses on correctness under concurrency, resource contention, back-pressure, failure
|
|
34
|
+
modes at scale, and distributed systems invariants — not general performance profiling.
|
|
35
|
+
|
|
36
|
+
Reviews only changes introduced in the current branch (merge-base to HEAD).
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Workflow
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
High-Load Review Progress:
|
|
44
|
+
- [ ] Step 1: Read Job Context (if provided) — understand expected load profile
|
|
45
|
+
- [ ] Step 2: Determine git scope (merge-base)
|
|
46
|
+
- [ ] Step 3: Collect diff and changed file list
|
|
47
|
+
- [ ] Step 4: Concurrency and race condition check
|
|
48
|
+
- [ ] Step 5: Resource management check (connections, threads, file handles, memory)
|
|
49
|
+
- [ ] Step 6: Caching and cache invalidation check
|
|
50
|
+
- [ ] Step 7: Database access patterns under load
|
|
51
|
+
- [ ] Step 8: Async processing and queue patterns
|
|
52
|
+
- [ ] Step 9: Retry, timeout, and circuit breaker patterns
|
|
53
|
+
- [ ] Step 10: Idempotency and distributed invariants
|
|
54
|
+
- [ ] Step 11: Emit findings in unified format
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Input Contract
|
|
60
|
+
|
|
61
|
+
| Field | Type | Required | Description |
|
|
62
|
+
|-------|------|----------|-------------|
|
|
63
|
+
| `branch` | string | no | Branch to review. Defaults to current branch. |
|
|
64
|
+
| `commit_range` | string | no | Explicit hash or range. Overrides merge-base detection. |
|
|
65
|
+
| `context_doc` | string | no | Path to job context document. Read before reviewing to understand expected RPS, SLA, and load profile. |
|
|
66
|
+
| `load_profile` | string | no | Optional hint: expected RPS, concurrent users, or traffic pattern. Adjusts severity of findings. |
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## Scope Detection
|
|
71
|
+
|
|
72
|
+
See shared script: `skills/shared/git-merge-base.md`
|
|
73
|
+
|
|
74
|
+
Run the script to determine `BASE_SHA`, then collect the diff:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
git diff --name-status "${BASE_SHA}"
|
|
78
|
+
git diff "${BASE_SHA}"
|
|
79
|
+
git ls-files --others --exclude-standard
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Review scope: **changes introduced in the current branch since merge-base only**.
|
|
83
|
+
Pre-existing problems in unchanged lines are out of scope unless the diff makes them worse.
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## Iron Laws
|
|
88
|
+
|
|
89
|
+
1. **A race condition on shared mutable state is always a `blocker`.** There is no "it probably won't happen in practice" — race conditions manifest unpredictably under load.
|
|
90
|
+
2. **An unbounded resource (connection, goroutine, thread, queue, in-memory collection) that grows with request rate is always at least `major`.** Under load it will exhaust the resource.
|
|
91
|
+
3. **Missing retry idempotency is always a `blocker` where the operation has side effects.** A retried non-idempotent write is a data integrity bug.
|
|
92
|
+
4. **Blocking I/O on a thread/fiber that is shared with the event loop is always at least `major`.** One slow call blocks all concurrent requests on that thread.
|
|
93
|
+
5. **Architecture opinions without a named pattern violation and concrete load-related impact are `info` only.** State the failure mode, not just that "it could be better".
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## Review Checklist
|
|
98
|
+
|
|
99
|
+
### Part A: Concurrency and Race Conditions
|
|
100
|
+
|
|
101
|
+
#### A1. Shared Mutable State
|
|
102
|
+
|
|
103
|
+
- [ ] Shared in-memory state (module-level variables, singleton fields, static properties) mutated from concurrent requests without a lock, mutex, or atomic operation
|
|
104
|
+
- [ ] Read-modify-write operations on shared counters, maps, or lists not wrapped in an atomic or transaction
|
|
105
|
+
- [ ] `Map` / `Set` / plain objects used as in-process caches mutated from concurrent async operations
|
|
106
|
+
- [ ] NestJS `DEFAULT`-scoped (singleton) service holding per-request state (e.g., `this.currentUser = ...`)
|
|
107
|
+
|
|
108
|
+
Flags:
|
|
109
|
+
- Singleton service holding mutable per-request state — **blocker**
|
|
110
|
+
- Read-modify-write on shared map/counter without atomicity — **blocker**
|
|
111
|
+
- Module-level mutable variable mutated from async handlers — **major**
|
|
112
|
+
|
|
113
|
+
#### A2. Double-Check and TOCTOU
|
|
114
|
+
|
|
115
|
+
- [ ] Check-then-act patterns where the condition can change between check and action: `if (!exists) insert` without a unique constraint or lock
|
|
116
|
+
- [ ] Optimistic upsert without conflict handling (`INSERT ... ON CONFLICT DO NOTHING` with no retry)
|
|
117
|
+
- [ ] Token or resource validity checked before use but not at the moment of use (TOCTOU)
|
|
118
|
+
|
|
119
|
+
Flags:
|
|
120
|
+
- Check-then-act on a DB record with no uniqueness enforcement or lock — **blocker**
|
|
121
|
+
- Token validity checked only at entry, not at point of use after a long async chain — **major**
|
|
122
|
+
|
|
123
|
+
#### A3. Async/Await and Concurrency Primitives
|
|
124
|
+
|
|
125
|
+
- [ ] `Promise.all` used with an unbounded array of promises (can spawn thousands of concurrent operations)
|
|
126
|
+
- [ ] `for...of` with `await` inside where `Promise.all` would allow safe parallelism (sequential when parallel is intended)
|
|
127
|
+
- [ ] Missing concurrency limit: N parallel jobs where N = input size (use a concurrency limiter / semaphore for unbounded inputs)
|
|
128
|
+
- [ ] `async` function swallowing rejection via unhandled `.catch(() => {})` on a fire-and-forget
|
|
129
|
+
|
|
130
|
+
Flags:
|
|
131
|
+
- `Promise.all(items.map(...))` where `items` can be arbitrarily large — **major** (resource exhaustion)
|
|
132
|
+
- Fire-and-forget async call with no error handling and no queue backing — **major**
|
|
133
|
+
- Missing concurrency cap on parallel operations whose count scales with user input — **major**
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
### Part B: Resource Management
|
|
138
|
+
|
|
139
|
+
#### B1. Connection Pools
|
|
140
|
+
|
|
141
|
+
- [ ] Database / Redis / HTTP connection created per request instead of using a shared pool
|
|
142
|
+
- [ ] Connection pool size not configured — using default (often 5–10 connections), which will queue at scale
|
|
143
|
+
- [ ] Pool exhaustion handling: no timeout on `pool.connect()`, no error boundary — requests will hang silently
|
|
144
|
+
- [ ] Connection opened in a function that may throw before `.release()` or `.end()` without a `finally` block
|
|
145
|
+
|
|
146
|
+
Flags:
|
|
147
|
+
- `new Pool()` / `new Client()` / `createConnection()` inside a request handler — **blocker**
|
|
148
|
+
- No pool max size configured for a production service — **major**
|
|
149
|
+
- Connection acquired without guaranteed release in finally — **major**
|
|
150
|
+
- Pool timeout not configured (will queue indefinitely on exhaustion) — **minor**
|
|
151
|
+
|
|
152
|
+
#### B2. File Handles and Streams
|
|
153
|
+
|
|
154
|
+
- [ ] File opened with `fs.open` / `fs.createReadStream` without explicit close / destroy on error
|
|
155
|
+
- [ ] Readable stream not consumed (memory grows indefinitely until GC or crash)
|
|
156
|
+
- [ ] Large file read into memory at once (`fs.readFileSync` / `Buffer.concat` on unknown-size input) — use streams
|
|
157
|
+
|
|
158
|
+
Flags:
|
|
159
|
+
- File handle without guaranteed close — **major**
|
|
160
|
+
- `readFileSync` or full `Buffer.concat` on potentially large/user-supplied files — **major**
|
|
161
|
+
- Unhandled readable stream accumulating in memory — **major**
|
|
162
|
+
|
|
163
|
+
#### B3. Memory and Object Allocation
|
|
164
|
+
|
|
165
|
+
- [ ] Large objects allocated per-request that are not freed between requests
|
|
166
|
+
- [ ] In-process cache (plain `Map`) with no eviction policy — grows unboundedly
|
|
167
|
+
- [ ] Closure capturing a large object (e.g., full DB result set) in a long-lived data structure
|
|
168
|
+
|
|
169
|
+
Flags:
|
|
170
|
+
- In-process cache `Map` / `Record` with no TTL or max-size eviction — **major**
|
|
171
|
+
- Per-request object allocation in a hot path that could be pooled or reused — **minor**
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
### Part C: Caching
|
|
176
|
+
|
|
177
|
+
#### C1. Cache Invalidation
|
|
178
|
+
|
|
179
|
+
- [ ] Cache entry updated after a write but not invalidated for related keys (stale reads after update)
|
|
180
|
+
- [ ] Cache TTL set to 0 (effectively no caching) or missing on a frequently-read, rarely-written entity
|
|
181
|
+
- [ ] Cache key not namespaced — collision between tenants / environments
|
|
182
|
+
- [ ] Caching a response that contains per-user data without scoping the key to the user
|
|
183
|
+
|
|
184
|
+
Flags:
|
|
185
|
+
- Cached response containing user-specific data with no user-scoped key — **blocker** (data leak)
|
|
186
|
+
- Related cache entries not invalidated after a mutating operation — **major**
|
|
187
|
+
- Missing cache key namespace in a multi-tenant or multi-environment system — **major**
|
|
188
|
+
- TTL missing or set to a value that is clearly mismatched with data freshness requirements — **minor**
|
|
189
|
+
|
|
190
|
+
#### C2. Cache Stampede
|
|
191
|
+
|
|
192
|
+
- [ ] High-traffic key expires simultaneously for many callers — no lock-based or probabilistic early expiry to prevent stampede
|
|
193
|
+
- [ ] Thundering herd: cache miss triggers N concurrent DB reads for the same key with no deduplication (e.g., no mutex/semaphore on the first fetch)
|
|
194
|
+
|
|
195
|
+
Flags:
|
|
196
|
+
- Hot key (called >100 RPS) with no stampede protection — **major**
|
|
197
|
+
- Cache miss firing N simultaneous DB queries with no in-flight deduplication — **major**
|
|
198
|
+
|
|
199
|
+
#### C3. Cache Correctness
|
|
200
|
+
|
|
201
|
+
- [ ] Mutable value stored in cache by reference (not a deep copy) — mutation after storage corrupts the cache
|
|
202
|
+
- [ ] Cache key includes non-deterministic components (timestamp, random value, process ID)
|
|
203
|
+
|
|
204
|
+
Flags:
|
|
205
|
+
- Storing a mutable reference in cache (object not serialized/cloned) — **major**
|
|
206
|
+
- Non-deterministic cache key — **major**
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
### Part D: Database Access Under Load
|
|
211
|
+
|
|
212
|
+
#### D1. Missing Indexes
|
|
213
|
+
|
|
214
|
+
- [ ] Query filtering or ordering by a column not in an index on a large table
|
|
215
|
+
- [ ] JOIN on a column that lacks an index on at least one side
|
|
216
|
+
- [ ] Unique constraint missing on a column used in uniqueness checks
|
|
217
|
+
|
|
218
|
+
Flags:
|
|
219
|
+
- `WHERE` / `ORDER BY` on an un-indexed column on a high-traffic table — **major**
|
|
220
|
+
- Missing unique constraint where the application relies on uniqueness — **blocker**
|
|
221
|
+
|
|
222
|
+
#### D2. Lock Contention
|
|
223
|
+
|
|
224
|
+
- [ ] `SELECT ... FOR UPDATE` on a wide row range — locks more rows than needed
|
|
225
|
+
- [ ] Transaction holding a lock while performing external I/O (HTTP call, file read) — lock held far too long
|
|
226
|
+
- [ ] Nested transactions with locks — can deadlock under concurrent writers
|
|
227
|
+
- [ ] Long-running migration with a full-table lock on a live, high-traffic table
|
|
228
|
+
|
|
229
|
+
Flags:
|
|
230
|
+
- External I/O (HTTP, file) inside a database transaction — **blocker**
|
|
231
|
+
- `SELECT ... FOR UPDATE` with no LIMIT on a high-traffic table — **major**
|
|
232
|
+
- Schema migration adding NOT NULL column without a default on a live table — **major**
|
|
233
|
+
|
|
234
|
+
#### D3. N+1 and Unbounded Queries
|
|
235
|
+
|
|
236
|
+
- [ ] Query inside a loop where one batch query would suffice
|
|
237
|
+
- [ ] `findAll()` / `SELECT *` on a large table with no LIMIT/pagination
|
|
238
|
+
- [ ] Fetching full entity to check a single field
|
|
239
|
+
|
|
240
|
+
Flags:
|
|
241
|
+
- N+1 in a hot path — **major** (also flagged by `review-performance`, noted here for load context)
|
|
242
|
+
- Unbounded `findAll()` on a table that grows with usage — **major**
|
|
243
|
+
- Fetching full row just to read one column — **minor**
|
|
244
|
+
|
|
245
|
+
#### D4. Connection and Transaction Hygiene
|
|
246
|
+
|
|
247
|
+
- [ ] Transaction started but no explicit commit / rollback on all code paths (leak on exception)
|
|
248
|
+
- [ ] Long-lived transaction (spans multiple user interactions or HTTP calls)
|
|
249
|
+
- [ ] Mixing read replicas and write primary within the same business operation without awareness of replication lag
|
|
250
|
+
|
|
251
|
+
Flags:
|
|
252
|
+
- Transaction with no guaranteed commit/rollback on exception path — **major**
|
|
253
|
+
- Replication lag not accounted for (read-your-writes guarantee assumed on replica) — **major**
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
### Part E: Async Processing and Queues
|
|
258
|
+
|
|
259
|
+
#### E1. Queue Backpressure
|
|
260
|
+
|
|
261
|
+
- [ ] Producer adding to an in-memory queue with no max depth — under load the queue grows until OOM
|
|
262
|
+
- [ ] Consumer not acknowledging/nacking messages — messages redeliver indefinitely on crash
|
|
263
|
+
- [ ] Batch consumer with no upper bound on batch size — single batch can take arbitrarily long
|
|
264
|
+
|
|
265
|
+
Flags:
|
|
266
|
+
- Unbounded in-memory queue / channel — **blocker**
|
|
267
|
+
- Message consumer missing ack/nack — **major**
|
|
268
|
+
- Batch size not capped — **major**
|
|
269
|
+
|
|
270
|
+
#### E2. Dead Letter and Poison Pills
|
|
271
|
+
|
|
272
|
+
- [ ] No dead-letter queue for failed messages — poison pills block the consumer indefinitely
|
|
273
|
+
- [ ] Retry loop with no maximum retry count — failed message retried forever
|
|
274
|
+
- [ ] Consumer crashing on a single malformed message due to missing error handling around deserialization
|
|
275
|
+
|
|
276
|
+
Flags:
|
|
277
|
+
- No DLQ or max retry limit on a message consumer — **major**
|
|
278
|
+
- Deserialization error crashing the consumer process — **major**
|
|
279
|
+
|
|
280
|
+
#### E3. Ordering Guarantees
|
|
281
|
+
|
|
282
|
+
- [ ] Code assumes FIFO delivery on a queue that does not guarantee ordering (e.g., SQS standard)
|
|
283
|
+
- [ ] Parallel consumers writing to shared state where order matters
|
|
284
|
+
|
|
285
|
+
Flags:
|
|
286
|
+
- FIFO assumption on an at-least-once / unordered queue — **major**
|
|
287
|
+
|
|
288
|
+
---
|
|
289
|
+
|
|
290
|
+
### Part F: Retry, Timeout, and Circuit Breaker
|
|
291
|
+
|
|
292
|
+
#### F1. Retry Safety
|
|
293
|
+
|
|
294
|
+
- [ ] Non-idempotent operation retried without idempotency key (charge, send email, create record)
|
|
295
|
+
- [ ] Retry with fixed delay instead of exponential backoff — causes retry storms
|
|
296
|
+
- [ ] No maximum retry count — code retries indefinitely
|
|
297
|
+
- [ ] Missing jitter on exponential backoff — synchronized retries cause thundering herd
|
|
298
|
+
|
|
299
|
+
Flags:
|
|
300
|
+
- Non-idempotent write retried without idempotency key — **blocker** (data integrity)
|
|
301
|
+
- Fixed delay retry or no backoff — **major**
|
|
302
|
+
- No max retry count — **major**
|
|
303
|
+
- Exponential backoff without jitter — **minor**
|
|
304
|
+
|
|
305
|
+
#### F2. Timeouts
|
|
306
|
+
|
|
307
|
+
- [ ] HTTP client / DB call / queue operation with no timeout configured
|
|
308
|
+
- [ ] Single timeout for the full chain (outer timeout too long relative to the number of downstream calls)
|
|
309
|
+
- [ ] `setTimeout` as a timeout substitute for async operations that do not stop when the timer fires
|
|
310
|
+
|
|
311
|
+
Flags:
|
|
312
|
+
- External call with no timeout — **major**
|
|
313
|
+
- Using `setTimeout` as a "give up" timer without actually canceling the operation — **minor**
|
|
314
|
+
|
|
315
|
+
#### F3. Circuit Breaker
|
|
316
|
+
|
|
317
|
+
- [ ] Repeated calls to a known-failing downstream without a circuit breaker — floods the downstream and starves the thread pool
|
|
318
|
+
- [ ] Fallback returning stale/empty data not documented as intentional degradation
|
|
319
|
+
|
|
320
|
+
Flags:
|
|
321
|
+
- Unbounded retries to a failing downstream without circuit breaker — **major**
|
|
322
|
+
- No fallback or graceful degradation when downstream is unavailable — **minor**
|
|
323
|
+
|
|
324
|
+
---
|
|
325
|
+
|
|
326
|
+
### Part G: Idempotency and Distributed Invariants
|
|
327
|
+
|
|
328
|
+
#### G1. Idempotency
|
|
329
|
+
|
|
330
|
+
- [ ] Webhook / event handler has no deduplication — processing the same event twice produces duplicate side effects
|
|
331
|
+
- [ ] API endpoint that creates a resource not accepting or generating an idempotency key
|
|
332
|
+
- [ ] Distributed cron/scheduled job running on multiple instances simultaneously with no distributed lock
|
|
333
|
+
|
|
334
|
+
Flags:
|
|
335
|
+
- Event handler with no deduplication and non-idempotent side effects — **blocker**
|
|
336
|
+
- Distributed cron with no leader election or distributed lock — **blocker**
|
|
337
|
+
- Resource creation endpoint with no idempotency key support — **major**
|
|
338
|
+
|
|
339
|
+
#### G2. Distributed Consistency
|
|
340
|
+
|
|
341
|
+
- [ ] Assumption that two sequential operations form an atomic unit without a transaction or saga
|
|
342
|
+
- [ ] Cross-service write sequence with no compensation logic on partial failure
|
|
343
|
+
- [ ] Relying on eventual consistency while assuming immediate consistency (reading from cache/replica right after writing)
|
|
344
|
+
|
|
345
|
+
Flags:
|
|
346
|
+
- Multi-step cross-service operation with no rollback / saga — **major**
|
|
347
|
+
- Assumed immediate consistency where eventual consistency is the actual guarantee — **major**
|
|
348
|
+
|
|
349
|
+
#### G3. Clock and ID Assumptions
|
|
350
|
+
|
|
351
|
+
- [ ] Using `Date.now()` or `new Date()` for ordering events across distributed nodes — clocks drift
|
|
352
|
+
- [ ] Auto-increment integer IDs expected to be globally unique across sharded databases
|
|
353
|
+
- [ ] UUID v1 (time-based, exposable MAC address) used where UUID v4 (random) is safer
|
|
354
|
+
|
|
355
|
+
Flags:
|
|
356
|
+
- Event ordering based on wall-clock time in a distributed context — **major**
|
|
357
|
+
- Assumption of globally unique sequential IDs across shards — **major**
|
|
358
|
+
|
|
359
|
+
---
|
|
360
|
+
|
|
361
|
+
## Scope Boundaries
|
|
362
|
+
|
|
363
|
+
| Concern | This skill | Use instead |
|
|
364
|
+
|---------|-----------|-------------|
|
|
365
|
+
| Race conditions, shared mutable state, concurrent writes | YES | — |
|
|
366
|
+
| Connection pool exhaustion, resource leaks | YES | — |
|
|
367
|
+
| Cache invalidation, cache stampede, stale reads | YES | — |
|
|
368
|
+
| Lock contention, long transactions, missing indexes | YES | — |
|
|
369
|
+
| Queue backpressure, dead letters, ordering | YES | — |
|
|
370
|
+
| Retry storms, timeouts, circuit breakers | YES | — |
|
|
371
|
+
| Idempotency, distributed locks, distributed consistency | YES | — |
|
|
372
|
+
| Frontend re-render performance, bundle size | NO | `review-performance` |
|
|
373
|
+
| General N+1 queries (not load-specific) | NO | `review-performance` |
|
|
374
|
+
| NestJS module structure, layer violations | NO | `review-architecture` |
|
|
375
|
+
| Memory leaks in React components | NO | `review-performance` |
|
|
376
|
+
| Logic bugs unrelated to concurrency | NO | `review-logic` |
|
|
377
|
+
|
|
378
|
+
---
|
|
379
|
+
|
|
380
|
+
## Orchestrated Review Contract
|
|
381
|
+
|
|
382
|
+
When dispatched by `review-orchestrator`, follow the provided `reviewer-input.schema.json` payload. Return a `REVIEW_RESULT` object compatible with `skills/review-orchestrator/reviewer-finding.schema.json`, then a concise markdown summary. Keep findings evidence-based, include concrete `suggested_fix` for every blocker/major, and return `NEEDS_CONTEXT` instead of guessing when required context is missing.
|
|
383
|
+
|
|
384
|
+
---
|
|
385
|
+
|
|
386
|
+
## Finding Format
|
|
387
|
+
|
|
388
|
+
### Class scope — required for `blocker` and `major`
|
|
389
|
+
|
|
390
|
+
Every `blocker` and `major` finding must carry `class_scope`: **every** site that
|
|
391
|
+
holds the shape you found, and **how you enumerated them** — the grep or query
|
|
392
|
+
you ran, or the guard that derives the set.
|
|
393
|
+
|
|
394
|
+
A finding anchored to one `file:line` is a claim about one site. The recorded
|
|
395
|
+
history of this repository is that a fix then repairs that site and leaves its
|
|
396
|
+
siblings: one writer of five, one operator instruction of four, six readers of
|
|
397
|
+
eight. Each was found by the *next* review round, which is why reviews here have
|
|
398
|
+
run to seven and four rounds instead of one.
|
|
399
|
+
|
|
400
|
+
```yaml
|
|
401
|
+
class_scope:
|
|
402
|
+
sites: ["src/lib/shell-config.ts:60", "src/session/store.ts:133"]
|
|
403
|
+
enumeration_method: "grep for the config-path resolvers; 7 writers, 2 unguarded"
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
"I checked the others" is not an enumeration method. A single-entry `sites` list
|
|
407
|
+
is a claim that the class has exactly one member — make it deliberately, because
|
|
408
|
+
`review-finding.schema.json` accepts it and the next round tests it.
|
|
409
|
+
|
|
410
|
+
`minor` and `info` may omit it: enumerating the class for every low-severity
|
|
411
|
+
observation is theatre, not rigour.
|
|
412
|
+
|
|
413
|
+
```markdown
|
|
414
|
+
### [F-NNN] Title
|
|
415
|
+
|
|
416
|
+
- **Severity**: blocker | major | minor | info
|
|
417
|
+
- **File**: path/to/file.ts:line
|
|
418
|
+
- **Pattern**: Concurrency A1 — Shared Mutable State | Resource B1 — Connection Pool | etc.
|
|
419
|
+
- **Failure mode**: what specifically breaks under load and at what scale
|
|
420
|
+
- **Fix**: concrete change with reference pattern (exponential backoff, connection pool, distributed lock, etc.)
|
|
421
|
+
- **Patch** (optional): unified diff
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
The **Failure mode** line is mandatory for this reviewer — every finding must state the load-related consequence (OOM at 1k RPS, connection exhaustion at 500 concurrent users, duplicate charges on retry, etc.).
|
|
425
|
+
|
|
426
|
+
Severity guide:
|
|
427
|
+
|
|
428
|
+
| Severity | When to use |
|
|
429
|
+
|----------|------------|
|
|
430
|
+
| `blocker` | Race condition on shared state; non-idempotent retry; unbounded in-memory queue; distributed cron with no lock; transaction holding external I/O lock |
|
|
431
|
+
| `major` | Connection without pool; unbounded `Promise.all`; missing retry timeout/backoff; cache stampede on hot key; N+1 in hot path; long transaction; DLQ missing |
|
|
432
|
+
| `minor` | Backoff without jitter; TTL misconfigured; per-request allocation in hot path; full-row fetch for one field |
|
|
433
|
+
| `info` | Architectural note without concrete failure mode at current load |
|
|
434
|
+
|
|
435
|
+
---
|
|
436
|
+
|
|
437
|
+
## Output Contract
|
|
438
|
+
|
|
439
|
+
```
|
|
440
|
+
STATUS: DONE | DONE_WITH_CONCERNS | NEEDS_CONTEXT | BLOCKED
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
```markdown
|
|
444
|
+
## High-Load Review
|
|
445
|
+
|
|
446
|
+
### Review Scope
|
|
447
|
+
- Branch: `<BRANCH>`
|
|
448
|
+
- Parent ref: `<PARENT>`
|
|
449
|
+
- Merge-base: `<BASE_SHA>`
|
|
450
|
+
- Scope mode: `<default-with-uncommitted | explicit-hash-range>`
|
|
451
|
+
- Load profile: `<from context doc or "not provided">`
|
|
452
|
+
- Changed files reviewed: <N>
|
|
453
|
+
|
|
454
|
+
### Summary
|
|
455
|
+
<2-3 sentences: what changed, key high-load concerns, overall verdict at scale.>
|
|
456
|
+
|
|
457
|
+
### Stats
|
|
458
|
+
- blocker: N | major: N | minor: N | info: N
|
|
459
|
+
|
|
460
|
+
### Findings
|
|
461
|
+
|
|
462
|
+
#### Concurrency & Race Conditions
|
|
463
|
+
<[F-NNN] findings or "None detected.">
|
|
464
|
+
|
|
465
|
+
#### Resource Management
|
|
466
|
+
<[F-NNN] findings or "None detected.">
|
|
467
|
+
|
|
468
|
+
#### Caching
|
|
469
|
+
<[F-NNN] findings or "None detected.">
|
|
470
|
+
|
|
471
|
+
#### Database Under Load
|
|
472
|
+
<[F-NNN] findings or "None detected.">
|
|
473
|
+
|
|
474
|
+
#### Async / Queues
|
|
475
|
+
<[F-NNN] findings or "None detected.">
|
|
476
|
+
|
|
477
|
+
#### Retry / Timeout / Circuit Breaker
|
|
478
|
+
<[F-NNN] findings or "None detected.">
|
|
479
|
+
|
|
480
|
+
#### Idempotency & Distributed Invariants
|
|
481
|
+
<[F-NNN] findings or "None detected.">
|
|
482
|
+
|
|
483
|
+
### Clean Areas
|
|
484
|
+
[List checklist sections with no findings, confirming they were reviewed]
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
---
|
|
488
|
+
|
|
489
|
+
## Job Context Awareness
|
|
490
|
+
|
|
491
|
+
When dispatched by `review-orchestrator` or `job-orchestrator`, the prompt MAY include:
|
|
492
|
+
|
|
493
|
+
```
|
|
494
|
+
JOB_NAME: <job-name>
|
|
495
|
+
CONTEXT_PATH: <JOBS_ROOT>/<job-name>/ai/context.md
|
|
496
|
+
```
|
|
497
|
+
|
|
498
|
+
If provided and the file exists, read the context document before reviewing. Use it to:
|
|
499
|
+
- Understand the expected traffic profile (RPS, concurrent users, burst patterns)
|
|
500
|
+
- Know the infrastructure constraints (pool sizes, queue limits, replica topology)
|
|
501
|
+
- Identify intentional trade-offs already accepted (eventual consistency, at-least-once delivery)
|
|
502
|
+
- Avoid flagging documented acceptable degradation paths as violations
|
|
503
|
+
|
|
504
|
+
If absent, proceed normally — context is optional and non-blocking.
|
|
505
|
+
When load profile is unknown, note in findings that severity assumes "moderate-to-high traffic".
|
|
506
|
+
|
|
507
|
+
---
|
|
508
|
+
|
|
509
|
+
## Red Flags
|
|
510
|
+
|
|
511
|
+
| Rationalization | Why it is wrong |
|
|
512
|
+
|----------------|-----------------|
|
|
513
|
+
| "We don't have high traffic yet, so this is fine" | Correctness under concurrency does not depend on current traffic; a race condition exists at 1 RPS too |
|
|
514
|
+
| "The connection pool defaults are probably fine" | Default pools (5–10 connections) queue at a few hundred concurrent users; always verify |
|
|
515
|
+
| "Retrying this is safe because it's idempotent" | Verify it actually is — most `POST` endpoints are not idempotent by default |
|
|
516
|
+
| "We'll add a circuit breaker later" | "Later" is when the downstream is down; flag as minor now to create the record |
|
|
517
|
+
| "The cache invalidation is handled somewhere else" | "Somewhere else" means it will be missed — flag where the write happens with no corresponding invalidation |
|
|
518
|
+
| "This runs in a queue so race conditions don't apply" | Multiple consumer instances still race on shared DB rows unless explicitly serialized |
|
|
519
|
+
| "Using Date.now() for ordering is fine" | Clock skew across nodes makes wall-clock ordering unreliable; use logical clocks or DB sequences |
|