@1aboveio/skills 0.0.0-stage → 1.0.0
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/README.md +30 -2
- package/bin/cli.mjs +14 -0
- package/bin/select-core.mjs +172 -0
- package/package.json +146 -4
- package/skills/app-dev/airflow/LICENSE +3 -0
- package/skills/app-dev/airflow/SKILL.md +199 -0
- package/skills/app-dev/airflow/release-check.mjs +93 -0
- package/skills/app-dev/android-foundation/LICENSE +3 -0
- package/skills/app-dev/android-foundation/SKILL.md +192 -0
- package/skills/app-dev/android-foundation/assets/android-ci-job.yml +217 -0
- package/skills/app-dev/android-foundation/references/ci.md +87 -0
- package/skills/app-dev/android-foundation/references/gotchas.md +221 -0
- package/skills/app-dev/android-foundation/references/setup.md +164 -0
- package/skills/app-dev/android-foundation/release-check.mjs +93 -0
- package/skills/app-dev/android-foundation/scripts/device-run.sh +176 -0
- package/skills/app-dev/android-foundation/scripts/device-run.test.mjs +172 -0
- package/skills/app-dev/app-debug/LICENSE +3 -0
- package/skills/app-dev/app-debug/SKILL.md +110 -0
- package/skills/app-dev/app-debug/references/common-errors.md +128 -0
- package/skills/app-dev/app-debug/release-check.mjs +93 -0
- package/skills/app-dev/better-auth/LICENSE +3 -0
- package/skills/app-dev/better-auth/SKILL.md +598 -0
- package/skills/app-dev/better-auth/references/feishu-api.md +270 -0
- package/skills/app-dev/better-auth/release-check.mjs +93 -0
- package/skills/app-dev/data-catalog/LICENSE +3 -0
- package/skills/app-dev/data-catalog/SKILL.md +204 -0
- package/skills/app-dev/data-catalog/agents/openai.yaml +3 -0
- package/skills/app-dev/data-catalog/references/data-catalog-conventions.md +75 -0
- package/skills/app-dev/data-catalog/references/field-definitions.md +116 -0
- package/skills/app-dev/data-catalog/references/format.md +121 -0
- package/skills/app-dev/data-catalog/release-check.mjs +93 -0
- package/skills/app-dev/data-catalog/scripts/data-catalog.test.mjs +36 -0
- package/skills/app-dev/data-catalog/scripts/data_catalog.py +1392 -0
- package/skills/app-dev/data-catalog/scripts/persist-conventions-core.mjs +117 -0
- package/skills/app-dev/data-catalog/scripts/persist-conventions.mjs +17 -0
- package/skills/app-dev/data-catalog/scripts/test_data_catalog.py +571 -0
- package/skills/app-dev/ios-foundation/LICENSE +3 -0
- package/skills/app-dev/ios-foundation/SKILL.md +184 -0
- package/skills/app-dev/ios-foundation/references/setup.md +243 -0
- package/skills/app-dev/ios-foundation/release-check.mjs +93 -0
- package/skills/app-dev/monorepo/LICENSE +3 -0
- package/skills/app-dev/monorepo/SKILL.md +462 -0
- package/skills/app-dev/monorepo/release-check.mjs +93 -0
- package/skills/app-dev/nextjs-fullstack/LICENSE +3 -0
- package/skills/app-dev/nextjs-fullstack/SKILL.md +211 -0
- package/skills/app-dev/nextjs-fullstack/conventions.md +318 -0
- package/skills/app-dev/nextjs-fullstack/frontend-conventions.md +61 -0
- package/skills/app-dev/nextjs-fullstack/nextjs16.md +287 -0
- package/skills/app-dev/nextjs-fullstack/release-check.mjs +93 -0
- package/skills/app-dev/nextjs-fullstack/server-actions.md +409 -0
- package/skills/app-dev/prisma-setup/LICENSE +3 -0
- package/skills/app-dev/prisma-setup/SKILL.md +181 -0
- package/skills/app-dev/prisma-setup/nextjs.md +258 -0
- package/skills/app-dev/prisma-setup/release-check.mjs +93 -0
- package/skills/app-dev/prisma-setup/turborepo.md +301 -0
- package/skills/app-dev/pyspark/LICENSE +3 -0
- package/skills/app-dev/pyspark/SKILL.md +127 -0
- package/skills/app-dev/pyspark/assets/templates/etl.py +748 -0
- package/skills/app-dev/pyspark/assets/templates/utils/__init__.py +1 -0
- package/skills/app-dev/pyspark/assets/templates/utils/hudi_metadata.py +14 -0
- package/skills/app-dev/pyspark/references/diagnosis-and-profiling.md +169 -0
- package/skills/app-dev/pyspark/references/etl-contract.md +129 -0
- package/skills/app-dev/pyspark/references/production-validation.md +131 -0
- package/skills/app-dev/pyspark/references/reconciliation.md +38 -0
- package/skills/app-dev/pyspark/references/transformation-design.md +190 -0
- package/skills/app-dev/pyspark/references/velocity-feature-calculation.md +193 -0
- package/skills/app-dev/pyspark/release-check.mjs +93 -0
- package/skills/app-dev/pyspark/scripts/spark_eventlog_summary.py +223 -0
- package/skills/app-dev/python-backend/LICENSE +3 -0
- package/skills/app-dev/python-backend/SKILL.md +325 -0
- package/skills/app-dev/python-backend/assets/uv-install.sh +48 -0
- package/skills/app-dev/python-backend/references/uv-installs.md +83 -0
- package/skills/app-dev/python-backend/release-check.mjs +93 -0
- package/skills/app-dev/shadcn/LICENSE +3 -0
- package/skills/app-dev/shadcn/SKILL.md +120 -0
- package/skills/app-dev/shadcn/assets/shadcn-small.png +0 -0
- package/skills/app-dev/shadcn/assets/shadcn.png +0 -0
- package/skills/app-dev/shadcn/cli.md +411 -0
- package/skills/app-dev/shadcn/customization.md +224 -0
- package/skills/app-dev/shadcn/mcp.md +101 -0
- package/skills/app-dev/shadcn/release-check.mjs +93 -0
- package/skills/app-dev/shadcn/rules/base-vs-radix.md +323 -0
- package/skills/app-dev/shadcn/rules/component-selection.md +67 -0
- package/skills/app-dev/shadcn/rules/composition.md +195 -0
- package/skills/app-dev/shadcn/rules/data-table.md +201 -0
- package/skills/app-dev/shadcn/rules/forms.md +255 -0
- package/skills/app-dev/shadcn/rules/icons.md +103 -0
- package/skills/app-dev/shadcn/rules/styling.md +167 -0
- package/skills/app-dev/zod-v4/LICENSE +3 -0
- package/skills/app-dev/zod-v4/SKILL.md +286 -0
- package/skills/app-dev/zod-v4/release-check.mjs +93 -0
- package/skills/cicd/cloud-build/LICENSE +3 -0
- package/skills/cicd/cloud-build/SKILL.md +707 -0
- package/skills/cicd/cloud-build/release-check.mjs +93 -0
- package/skills/cicd/cloud-debug/LICENSE +3 -0
- package/skills/cicd/cloud-debug/SKILL.md +315 -0
- package/skills/cicd/cloud-debug/references/build-failures.md +238 -0
- package/skills/cicd/cloud-debug/references/deploy-failures.md +376 -0
- package/skills/cicd/cloud-debug/references/pipeline-failures.md +378 -0
- package/skills/cicd/cloud-debug/release-check.mjs +93 -0
- package/skills/cicd/cloud-deploy/LICENSE +3 -0
- package/skills/cicd/cloud-deploy/SKILL.md +230 -0
- package/skills/cicd/cloud-deploy/references/config-templates.md +257 -0
- package/skills/cicd/cloud-deploy/release-check.mjs +93 -0
- package/skills/cicd/docker/LICENSE +3 -0
- package/skills/cicd/docker/SKILL.md +151 -0
- package/skills/cicd/docker/release-check.mjs +93 -0
- package/skills/cicd/github-actions/LICENSE +3 -0
- package/skills/cicd/github-actions/SKILL.md +111 -0
- package/skills/cicd/github-actions/references/audit-profile-optimize.md +150 -0
- package/skills/cicd/github-actions/references/ci-case-studies.md +141 -0
- package/skills/cicd/github-actions/references/conditional-ci.md +214 -0
- package/skills/cicd/github-actions/references/debugging.md +13 -0
- package/skills/cicd/github-actions/references/pipeline.md +87 -0
- package/skills/cicd/github-actions/references/post-deploy-and-publishing.md +33 -0
- package/skills/cicd/github-actions/references/runners.md +253 -0
- package/skills/cicd/github-actions/references/security.md +29 -0
- package/skills/cicd/github-actions/references/speed-and-audit.md +115 -0
- package/skills/cicd/github-actions/references/two-pass-reading.md +92 -0
- package/skills/cicd/github-actions/release-check.mjs +93 -0
- package/skills/cicd/github-actions/scripts/ci-run-audit-core.mjs +612 -0
- package/skills/cicd/github-actions/scripts/ci-run-audit.mjs +4 -0
- package/skills/cicd/github-actions/scripts/ci-run-audit.test.mjs +637 -0
- package/skills/cicd/github-flow/LICENSE +3 -0
- package/skills/cicd/github-flow/SKILL.md +123 -0
- package/skills/cicd/github-flow/references/ci-conventions.md +14 -0
- package/skills/cicd/github-flow/release-check.mjs +93 -0
- package/skills/cicd/github-flow/scripts/flow-core.mjs +105 -0
- package/skills/cicd/github-flow/scripts/flow.mjs +81 -0
- package/skills/cicd/github-flow/scripts/flow.test.mjs +114 -0
- package/skills/cicd/github-flow/scripts/persist-conventions-core.mjs +117 -0
- package/skills/cicd/github-flow/scripts/persist-conventions.mjs +49 -0
- package/skills/cicd/github-flow/scripts/persist-conventions.test.mjs +108 -0
- package/skills/cicd/google-cloud/LICENSE +3 -0
- package/skills/cicd/google-cloud/SKILL.md +119 -0
- package/skills/cicd/google-cloud/references/gcs.md +469 -0
- package/skills/cicd/google-cloud/references/iam.md +451 -0
- package/skills/cicd/google-cloud/references/project.md +349 -0
- package/skills/cicd/google-cloud/references/secrets.md +336 -0
- package/skills/cicd/google-cloud/references/vpc.md +312 -0
- package/skills/cicd/google-cloud/release-check.mjs +93 -0
- package/skills/cicd/google-cloud/scripts/create-sa.sh +36 -0
- package/skills/cicd/google-cloud/scripts/gcp-config.sh +31 -0
- package/skills/cicd/google-cloud/scripts/grant-iap.sh +41 -0
- package/skills/cicd/google-cloud/scripts/setup-secrets.sh +48 -0
- package/skills/cicd/mergify/LICENSE +3 -0
- package/skills/cicd/mergify/SKILL.md +102 -0
- package/skills/cicd/mergify/assets/templates/mergify.yml +215 -0
- package/skills/cicd/mergify/assets/templates/ruleset.json +46 -0
- package/skills/cicd/mergify/references/branch-protection.md +282 -0
- package/skills/cicd/mergify/references/configuration.md +274 -0
- package/skills/cicd/mergify/references/diagnosis.md +109 -0
- package/skills/cicd/mergify/references/stacks.md +84 -0
- package/skills/cicd/mergify/references/traps.md +119 -0
- package/skills/cicd/mergify/references/watch-contract.md +274 -0
- package/skills/cicd/mergify/release-check.mjs +93 -0
- package/skills/cicd/mergify/scripts/audit-core.mjs +208 -0
- package/skills/cicd/mergify/scripts/audit.mjs +4 -0
- package/skills/cicd/mergify/scripts/audit.test.mjs +201 -0
- package/skills/cicd/mergify/scripts/entrypoints.test.mjs +106 -0
- package/skills/cicd/mergify/scripts/pr-620-mergify-comments.fixture.json +30 -0
- package/skills/cicd/mergify/scripts/stack-push-core.mjs +258 -0
- package/skills/cicd/mergify/scripts/stack-push.mjs +4 -0
- package/skills/cicd/mergify/scripts/stack-push.test.mjs +233 -0
- package/skills/cicd/mergify/scripts/watch-pr-delivery-core.mjs +1065 -0
- package/skills/cicd/mergify/scripts/watch-pr-delivery.mjs +4 -0
- package/skills/cicd/mergify/scripts/watch-pr-delivery.test.mjs +1826 -0
- package/skills/cicd/podman/LICENSE +3 -0
- package/skills/cicd/podman/SKILL.md +71 -0
- package/skills/cicd/podman/agents/openai.yaml +4 -0
- package/skills/cicd/podman/assets/templates/podman-compose-socket-directory.yml +6 -0
- package/skills/cicd/podman/assets/templates/podman-service-override.conf +3 -0
- package/skills/cicd/podman/references/compose-compatibility.md +70 -0
- package/skills/cicd/podman/references/networking-and-ports.md +74 -0
- package/skills/cicd/podman/references/rootless-services-and-sockets.md +156 -0
- package/skills/cicd/podman/references/troubleshooting.md +98 -0
- package/skills/cicd/podman/release-check.mjs +93 -0
- package/skills/content/article-review/LICENSE +3 -0
- package/skills/content/article-review/SKILL.md +66 -0
- package/skills/content/article-review/references/report-format.md +68 -0
- package/skills/content/article-review/references/template-guide.md +79 -0
- package/skills/content/article-review/references/template-wechat-payments.md +125 -0
- package/skills/content/article-review/release-check.mjs +93 -0
- package/skills/content/article-to-image/LICENSE +3 -0
- package/skills/content/article-to-image/SKILL.md +91 -0
- package/skills/content/article-to-image/references/formats.md +53 -0
- package/skills/content/article-to-image/release-check.mjs +93 -0
- package/skills/content/flowchart-svg/LICENSE +3 -0
- package/skills/content/flowchart-svg/SKILL.md +43 -0
- package/skills/content/flowchart-svg/release-check.mjs +93 -0
- package/skills/content/flowchart-svg/scripts/export_png.sh +8 -0
- package/skills/content/image-gen/LICENSE +3 -0
- package/skills/content/image-gen/SKILL.md +192 -0
- package/skills/content/image-gen/release-check.mjs +93 -0
- package/skills/content/image-gen/scripts/credentials.mjs +217 -0
- package/skills/content/image-gen/scripts/credentials.test.mjs +212 -0
- package/skills/content/image-gen/scripts/generate.mjs +240 -0
- package/skills/content/image-gen/scripts/options.mjs +293 -0
- package/skills/content/image-gen/scripts/options.test.mjs +245 -0
- package/skills/content/mermaid/LICENSE +3 -0
- package/skills/content/mermaid/SKILL.md +635 -0
- package/skills/content/mermaid/release-check.mjs +93 -0
- package/skills/content/wechat-article-writer/LICENSE +3 -0
- package/skills/content/wechat-article-writer/SKILL.md +92 -0
- package/skills/content/wechat-article-writer/references/style-selector.md +133 -0
- package/skills/content/wechat-article-writer/references/writing-rules.md +152 -0
- package/skills/content/wechat-article-writer/release-check.mjs +93 -0
- package/skills/content/wechat-article-writer/templates/wechat-comparison.md +52 -0
- package/skills/content/wechat-article-writer/templates/wechat-howto.md +51 -0
- package/skills/content/wechat-article-writer/templates/wechat-insight.md +50 -0
- package/skills/content/wechat-article-writer/templates/wechat-pitfall.md +52 -0
- package/skills/content/wechat-publisher/LICENSE +3 -0
- package/skills/content/wechat-publisher/SKILL.md +171 -0
- package/skills/content/wechat-publisher/references/api.md +105 -0
- package/skills/content/wechat-publisher/references/layout-rules.md +57 -0
- package/skills/content/wechat-publisher/references/wechat-safe-template.html +86 -0
- package/skills/content/wechat-publisher/release-check.mjs +93 -0
- package/skills/content/wechat-publisher/scripts/md_to_wechat_html.py +194 -0
- package/skills/content/wechat-publisher/scripts/publish.py +239 -0
- package/skills/content/wechat-search/LICENSE +3 -0
- package/skills/content/wechat-search/SKILL.md +211 -0
- package/skills/content/wechat-search/release-check.mjs +93 -0
- package/skills/content/wechat-search/scripts/start-chrome.sh +83 -0
- package/skills/content/xai-search/LICENSE +3 -0
- package/skills/content/xai-search/SKILL.md +79 -0
- package/skills/content/xai-search/release-check.mjs +93 -0
- package/skills/content/xai-search/scripts/xai_search.sh +187 -0
- package/skills/content/xai-search/tests/smoke_test.sh +36 -0
- package/skills/core/distill-writing/LICENSE +3 -0
- package/skills/core/distill-writing/SKILL.md +74 -0
- package/skills/core/distill-writing/references/extraction.md +95 -0
- package/skills/core/distill-writing/references/updating.md +46 -0
- package/skills/core/distill-writing/release-check.mjs +93 -0
- package/skills/core/doc-to-md/LICENSE +3 -0
- package/skills/core/doc-to-md/SKILL.md +78 -0
- package/skills/core/doc-to-md/release-check.mjs +93 -0
- package/skills/core/doc-to-md/scripts/convert.py +157 -0
- package/skills/core/editorial-review/LICENSE +3 -0
- package/skills/core/editorial-review/SKILL.md +79 -0
- package/skills/core/editorial-review/references/checklist.md +94 -0
- package/skills/core/editorial-review/release-check.mjs +93 -0
- package/skills/core/house-style/LICENSE +3 -0
- package/skills/core/house-style/SKILL.md +33 -0
- package/skills/core/house-style/references/defaults.md +66 -0
- package/skills/core/house-style/references/rules.md +267 -0
- package/skills/core/house-style/references/sources.md +27 -0
- package/skills/core/house-style/references/style-en.md +131 -0
- package/skills/core/house-style/references/style-zh.md +141 -0
- package/skills/core/house-style/references/terminology-zh.md +223 -0
- package/skills/core/house-style/release-check.mjs +93 -0
- package/skills/core/house-style/templates/brd.md +103 -0
- package/skills/core/house-style/templates/commercial-proposal.md +93 -0
- package/skills/core/house-style/templates/compliance-policy.md +109 -0
- package/skills/core/house-style/templates/gap-analysis.md +105 -0
- package/skills/core/house-style/templates/general.md +63 -0
- package/skills/core/house-style/templates/integration-guide.md +98 -0
- package/skills/core/house-style/templates/prd.md +81 -0
- package/skills/core/house-style/templates/risk-operations-procedure.md +94 -0
- package/skills/core/house-style/templates/technical-spec.md +96 -0
- package/skills/core/polish-cn/LICENSE +3 -0
- package/skills/core/polish-cn/SKILL.md +102 -0
- package/skills/core/polish-cn/references/brief.md +93 -0
- package/skills/core/polish-cn/references/models.md +76 -0
- package/skills/core/polish-cn/release-check.mjs +93 -0
- package/skills/core/polish-cn/scripts/polish-cn.test.mjs +244 -0
- package/skills/core/polish-cn/scripts/polish_blocks.py +489 -0
- package/skills/core/reg-parser/LICENSE +3 -0
- package/skills/core/reg-parser/SKILL.md +212 -0
- package/skills/core/reg-parser/references/checklist-schema.md +223 -0
- package/skills/core/reg-parser/references/checklists/hk-amlo-checklist.json +1306 -0
- package/skills/core/reg-parser/references/checklists/hk-amlo-checklist.md +469 -0
- package/skills/core/reg-parser/references/checklists/hk-fi-corporate-onboarding-cdd-checklist.json +634 -0
- package/skills/core/reg-parser/references/checklists/hk-fi-corporate-onboarding-cdd-checklist.md +233 -0
- package/skills/core/reg-parser/references/checklists/hk-mso-guideline-checklist.json +2194 -0
- package/skills/core/reg-parser/references/checklists/hk-mso-guideline-checklist.md +771 -0
- package/skills/core/reg-parser/references/checklists/kyc-aml-checklist.md +258 -0
- package/skills/core/reg-parser/references/checklists/visa-vars-checklist.md +1058 -0
- package/skills/core/reg-parser/references/mandates/hk-amlo-cap615.md +389 -0
- package/skills/core/reg-parser/references/mandates/visa-vars.md +205 -0
- package/skills/core/reg-parser/release-check.mjs +93 -0
- package/skills/core/reg-parser/scripts/compare_checklist.py +230 -0
- package/skills/core/reg-parser/scripts/dump_checklist.py +361 -0
- package/skills/core/reg-parser/scripts/preprocess-mandate.sh +187 -0
- package/skills/core/reg-parser/scripts/reg-parser.test.mjs +165 -0
- package/skills/core/reg-parser/scripts/test_quarantine.sh +105 -0
- package/skills/core/reg-parser/scripts/validate_checklist.py +563 -0
- package/skills/core/reg-parser/scripts/validate_mandate.py +273 -0
- package/skills/core/terminology/LICENSE +3 -0
- package/skills/core/terminology/SKILL.md +62 -0
- package/skills/core/terminology/references/format.md +50 -0
- package/skills/core/terminology/references/init.md +32 -0
- package/skills/core/terminology/release-check.mjs +93 -0
- package/skills/core/write-doc/LICENSE +3 -0
- package/skills/core/write-doc/SKILL.md +141 -0
- package/skills/core/write-doc/references/bilingual.md +60 -0
- package/skills/core/write-doc/release-check.mjs +93 -0
- package/skills/engineering/better-review/LICENSE +3 -0
- package/skills/engineering/better-review/SKILL.md +249 -0
- package/skills/engineering/better-review/agents/openai.yaml +9 -0
- package/skills/engineering/better-review/references/domain-hazards.md +53 -0
- package/skills/engineering/better-review/references/passes.md +147 -0
- package/skills/engineering/better-review/references/result.md +151 -0
- package/skills/engineering/better-review/release-check.mjs +93 -0
- package/skills/engineering/better-review/scripts/pr-context.mjs +212 -0
- package/skills/engineering/better-review/scripts/pr-context.test.mjs +168 -0
- package/skills/engineering/better-review/scripts/rereview-scope.mjs +503 -0
- package/skills/engineering/better-review/scripts/rereview-scope.test.mjs +587 -0
- package/skills/engineering/better-review/scripts/scan-diff.mjs +365 -0
- package/skills/engineering/better-review/scripts/scan-diff.test.mjs +414 -0
- package/skills/engineering/better-review/scripts/vendor-sync.test.mjs +96 -0
- package/skills/engineering/e2e-test/LICENSE +3 -0
- package/skills/engineering/e2e-test/SKILL.md +98 -0
- package/skills/engineering/e2e-test/assets/ci-gates.cloudbuild.yaml +24 -0
- package/skills/engineering/e2e-test/references/authoring/auth-flows.md +159 -0
- package/skills/engineering/e2e-test/references/authoring/playwright-config.md +73 -0
- package/skills/engineering/e2e-test/references/authoring/playwright-patterns.md +144 -0
- package/skills/engineering/e2e-test/references/ci-integration.md +25 -0
- package/skills/engineering/e2e-test/references/ci-playwright-container.md +290 -0
- package/skills/engineering/e2e-test/references/presentation-sweep.md +104 -0
- package/skills/engineering/e2e-test/references/reviewing.md +41 -0
- package/skills/engineering/e2e-test/references/route-manifest.md +51 -0
- package/skills/engineering/e2e-test/release-check.mjs +93 -0
- package/skills/engineering/e2e-test/scripts/detect-routes-nextjs.mjs +200 -0
- package/skills/engineering/e2e-test/scripts/presentation-checks.mjs +171 -0
- package/skills/engineering/e2e-test/scripts/presentation-checks.test.mjs +106 -0
- package/skills/engineering/e2e-test/scripts/presentation-perceivability.mjs +179 -0
- package/skills/engineering/e2e-test/scripts/presentation-perceivability.test.mjs +117 -0
- package/skills/engineering/e2e-test/scripts/presentation-reachability.mjs +154 -0
- package/skills/engineering/e2e-test/scripts/presentation-reachability.test.mjs +69 -0
- package/skills/engineering/e2e-test/scripts/presentation-render-health.mjs +141 -0
- package/skills/engineering/e2e-test/scripts/presentation-render-health.test.mjs +98 -0
- package/skills/engineering/e2e-test/scripts/presentation-sweep.mjs +147 -0
- package/skills/engineering/e2e-test/scripts/presentation-sweep.test.mjs +71 -0
- package/skills/engineering/e2e-test/scripts/presentation-temporal.mjs +127 -0
- package/skills/engineering/e2e-test/scripts/presentation-temporal.test.mjs +59 -0
- package/skills/engineering/e2e-test/scripts/project-route-manifest.mjs +82 -0
- package/skills/engineering/e2e-test/scripts/project-route-manifest.test.mjs +76 -0
- package/skills/engineering/e2e-test/scripts/validate-manifest.mjs +106 -0
- package/skills/engineering/engineering-runtime/LICENSE +3 -0
- package/skills/engineering/engineering-runtime/SKILL.md +11 -0
- package/skills/engineering/engineering-runtime/agents/openai.yaml +6 -0
- package/skills/engineering/engineering-runtime/coherence/workflow.json +597 -0
- package/skills/engineering/engineering-runtime/engineering-runtime.test.mjs +68 -0
- package/skills/engineering/engineering-runtime/release-check.mjs +93 -0
- package/skills/engineering/engineering-runtime/scripts/exact-head-artifact.mjs +131 -0
- package/skills/engineering/engineering-runtime/scripts/head-check-set.mjs +398 -0
- package/skills/engineering/engineering-runtime/scripts/invocation-policy.mjs +187 -0
- package/skills/engineering/engineering-runtime/scripts/invocation-policy.test.mjs +95 -0
- package/skills/engineering/engineering-runtime/scripts/main-module.mjs +79 -0
- package/skills/engineering/engineering-runtime/scripts/main-module.test.mjs +288 -0
- package/skills/engineering/engineering-runtime/scripts/mergify-yaml.mjs +11 -0
- package/skills/engineering/engineering-runtime/scripts/package-lock.json +43 -0
- package/skills/engineering/engineering-runtime/scripts/package.json +10 -0
- package/skills/engineering/engineering-runtime/scripts/required-check-plan.mjs +223 -0
- package/skills/engineering/engineering-runtime/scripts/required-check-plan.test.mjs +96 -0
- package/skills/engineering/engineering-runtime/scripts/review-completion.mjs +56 -0
- package/skills/engineering/engineering-runtime/scripts/workflow-coherence.mjs +595 -0
- package/skills/engineering/engineering-runtime/scripts/workflow-policy.mjs +189 -0
- package/skills/engineering/engineering-runtime/scripts/yaml-mapping.mjs +18 -0
- package/skills/engineering/ensure-coverage/LICENSE +3 -0
- package/skills/engineering/ensure-coverage/SKILL.md +129 -0
- package/skills/engineering/ensure-coverage/references/breadth/coverage-ledger.md +92 -0
- package/skills/engineering/ensure-coverage/references/breadth/inventory-contract.md +85 -0
- package/skills/engineering/ensure-coverage/references/breadth/surface-baseline.md +44 -0
- package/skills/engineering/ensure-coverage/references/breadth/surface-discovery.md +16 -0
- package/skills/engineering/ensure-coverage/references/depth/characterization.md +68 -0
- package/skills/engineering/ensure-coverage/references/depth/coverage.config.example.json +19 -0
- package/skills/engineering/ensure-coverage/references/depth/grading.md +35 -0
- package/skills/engineering/ensure-coverage/references/depth/mock-policy.md +57 -0
- package/skills/engineering/ensure-coverage/references/depth/test-smells.md +39 -0
- package/skills/engineering/ensure-coverage/references/enforcement/ci-contract.md +44 -0
- package/skills/engineering/ensure-coverage/references/examples/coverage-ledger.md +110 -0
- package/skills/engineering/ensure-coverage/references/examples/refund-flow.md +35 -0
- package/skills/engineering/ensure-coverage/references/presentation/axis.md +64 -0
- package/skills/engineering/ensure-coverage/references/process/audit-mode.md +27 -0
- package/skills/engineering/ensure-coverage/references/process/output-template.md +139 -0
- package/skills/engineering/ensure-coverage/references/process/test-strategy.md +56 -0
- package/skills/engineering/ensure-coverage/release-check.mjs +93 -0
- package/skills/engineering/ensure-coverage/schemas/coverage-config.schema.json +67 -0
- package/skills/engineering/ensure-coverage/schemas/coverage-file.schema.json +140 -0
- package/skills/engineering/ensure-coverage/scripts/README.md +99 -0
- package/skills/engineering/ensure-coverage/scripts/adapters/nextjs-inventory.mjs +182 -0
- package/skills/engineering/ensure-coverage/scripts/adapters/nextjs-inventory.test.mjs +96 -0
- package/skills/engineering/ensure-coverage/scripts/check-quarantine-expiry.mjs +105 -0
- package/skills/engineering/ensure-coverage/scripts/check-quarantine-expiry.test.mjs +47 -0
- package/skills/engineering/ensure-coverage/scripts/ci-audit.mjs +137 -0
- package/skills/engineering/ensure-coverage/scripts/ci-audit.test.mjs +86 -0
- package/skills/engineering/ensure-coverage/scripts/coverage-ledger.mjs +674 -0
- package/skills/engineering/ensure-coverage/scripts/coverage-ledger.test.mjs +447 -0
- package/skills/engineering/ensure-coverage/scripts/design-parity.mjs +591 -0
- package/skills/engineering/ensure-coverage/scripts/design-parity.test.mjs +552 -0
- package/skills/engineering/ensure-coverage/scripts/lint-tests.mjs +282 -0
- package/skills/engineering/ensure-coverage/scripts/lint-tests.test.mjs +289 -0
- package/skills/engineering/ensure-coverage/scripts/mock-policy-config.mjs +176 -0
- package/skills/engineering/ensure-coverage/scripts/mock-policy-config.test.mjs +119 -0
- package/skills/engineering/ensure-coverage/scripts/package.json +19 -0
- package/skills/engineering/golden-path/LICENSE +3 -0
- package/skills/engineering/golden-path/SKILL.md +230 -0
- package/skills/engineering/golden-path/agents/openai.yaml +3 -0
- package/skills/engineering/golden-path/assets/golden-paths.example.json +57 -0
- package/skills/engineering/golden-path/references/contract.md +239 -0
- package/skills/engineering/golden-path/references/migration.md +111 -0
- package/skills/engineering/golden-path/release-check.mjs +93 -0
- package/skills/engineering/golden-path/scripts/golden-path-core.mjs +1779 -0
- package/skills/engineering/golden-path/scripts/golden-path.mjs +6 -0
- package/skills/engineering/golden-path/scripts/golden-path.test.mjs +1457 -0
- package/skills/engineering/harness-runtime/LICENSE +3 -0
- package/skills/engineering/harness-runtime/SKILL.md +19 -0
- package/skills/engineering/harness-runtime/agents/openai.yaml +6 -0
- package/skills/engineering/harness-runtime/bin/discover-models.mjs +4 -0
- package/skills/engineering/harness-runtime/bin/model-catalog.mjs +4 -0
- package/skills/engineering/harness-runtime/contracts.md +15 -0
- package/skills/engineering/harness-runtime/discover-models.mjs +392 -0
- package/skills/engineering/harness-runtime/discover-models.test.mjs +363 -0
- package/skills/engineering/harness-runtime/fixtures/native-question-schemas.json +33 -0
- package/skills/engineering/harness-runtime/fixtures/question-responses.json +54 -0
- package/skills/engineering/harness-runtime/harness-runtime.test.mjs +967 -0
- package/skills/engineering/harness-runtime/index.mjs +767 -0
- package/skills/engineering/harness-runtime/model-catalog-seed.test.mjs +829 -0
- package/skills/engineering/harness-runtime/model-catalog.mjs +787 -0
- package/skills/engineering/harness-runtime/model-catalog.test.mjs +366 -0
- package/skills/engineering/harness-runtime/native-question-contracts.md +37 -0
- package/skills/engineering/harness-runtime/references/model-catalog-seed.json +408 -0
- package/skills/engineering/harness-runtime/references/model-catalog.md +57 -0
- package/skills/engineering/harness-runtime/release-check.mjs +93 -0
- package/skills/engineering/resolve-issues/LICENSE +3 -0
- package/skills/engineering/resolve-issues/SKILL.md +250 -0
- package/skills/engineering/resolve-issues/agents/openai.yaml +9 -0
- package/skills/engineering/resolve-issues/plugin-hooks.json +17 -0
- package/skills/engineering/resolve-issues/references/canary.md +28 -0
- package/skills/engineering/resolve-issues/references/ci.md +105 -0
- package/skills/engineering/resolve-issues/references/done.md +25 -0
- package/skills/engineering/resolve-issues/references/dropbox.md +90 -0
- package/skills/engineering/resolve-issues/references/expire.md +318 -0
- package/skills/engineering/resolve-issues/references/exploration.md +202 -0
- package/skills/engineering/resolve-issues/references/implementation.md +303 -0
- package/skills/engineering/resolve-issues/references/preflight.md +445 -0
- package/skills/engineering/resolve-issues/references/review.md +228 -0
- package/skills/engineering/resolve-issues/references/shared-modules.md +44 -0
- package/skills/engineering/resolve-issues/references/task-plan.md +264 -0
- package/skills/engineering/resolve-issues/release-check.mjs +93 -0
- package/skills/engineering/resolve-issues/scripts/cleanup-runs.mjs +364 -0
- package/skills/engineering/resolve-issues/scripts/cleanup-runs.test.mjs +280 -0
- package/skills/engineering/resolve-issues/scripts/discover-models.mjs +9 -0
- package/skills/engineering/resolve-issues/scripts/dropbox.mjs +473 -0
- package/skills/engineering/resolve-issues/scripts/dropbox.test.mjs +346 -0
- package/skills/engineering/resolve-issues/scripts/findings-reuse.mjs +98 -0
- package/skills/engineering/resolve-issues/scripts/findings-reuse.test.mjs +88 -0
- package/skills/engineering/resolve-issues/scripts/github-reviews.mjs +384 -0
- package/skills/engineering/resolve-issues/scripts/github-reviews.test.mjs +264 -0
- package/skills/engineering/resolve-issues/scripts/install-hooks.mjs +135 -0
- package/skills/engineering/resolve-issues/scripts/install-hooks.test.mjs +79 -0
- package/skills/engineering/resolve-issues/scripts/issue-tree.mjs +162 -0
- package/skills/engineering/resolve-issues/scripts/issue-tree.test.mjs +107 -0
- package/skills/engineering/resolve-issues/scripts/manual-invocation.test.mjs +14 -0
- package/skills/engineering/resolve-issues/scripts/model-catalog.mjs +9 -0
- package/skills/engineering/resolve-issues/scripts/next-actions-capacity.test.mjs +149 -0
- package/skills/engineering/resolve-issues/scripts/next-actions.mjs +856 -0
- package/skills/engineering/resolve-issues/scripts/next-actions.test.mjs +915 -0
- package/skills/engineering/resolve-issues/scripts/plan-sync.mjs +269 -0
- package/skills/engineering/resolve-issues/scripts/plan-sync.test.mjs +156 -0
- package/skills/engineering/resolve-issues/scripts/preflight-models.mjs +736 -0
- package/skills/engineering/resolve-issues/scripts/preflight-models.test.mjs +448 -0
- package/skills/engineering/resolve-issues/scripts/ready-check.mjs +185 -0
- package/skills/engineering/resolve-issues/scripts/ready-check.test.mjs +217 -0
- package/skills/engineering/resolve-issues/scripts/rehydrate.mjs +98 -0
- package/skills/engineering/resolve-issues/scripts/rehydrate.test.mjs +91 -0
- package/skills/engineering/resolve-issues/scripts/review-verdict.mjs +509 -0
- package/skills/engineering/resolve-issues/scripts/review-verdict.test.mjs +1060 -0
- package/skills/engineering/resolve-issues/scripts/size-check.mjs +492 -0
- package/skills/engineering/resolve-issues/scripts/size-check.test.mjs +458 -0
- package/skills/engineering/resolve-release/LICENSE +3 -0
- package/skills/engineering/resolve-release/SKILL.md +215 -0
- package/skills/engineering/resolve-release/agents/openai.yaml +8 -0
- package/skills/engineering/resolve-release/flows/cloud-run-canary.md +13 -0
- package/skills/engineering/resolve-release/flows/cloud-run.md +7 -0
- package/skills/engineering/resolve-release/flows/root-tag-npm.md +13 -0
- package/skills/engineering/resolve-release/flows/workspace-npm.md +22 -0
- package/skills/engineering/resolve-release/references/canary.md +51 -0
- package/skills/engineering/resolve-release/references/candidate.md +41 -0
- package/skills/engineering/resolve-release/references/cut.md +131 -0
- package/skills/engineering/resolve-release/references/dark-launch.md +66 -0
- package/skills/engineering/resolve-release/references/flows.md +150 -0
- package/skills/engineering/resolve-release/references/preflight.md +154 -0
- package/skills/engineering/resolve-release/references/prepared-metadata.md +260 -0
- package/skills/engineering/resolve-release/references/promotion.md +82 -0
- package/skills/engineering/resolve-release/references/publish.md +232 -0
- package/skills/engineering/resolve-release/references/workspace-npm.md +103 -0
- package/skills/engineering/resolve-release/release-check.mjs +93 -0
- package/skills/engineering/resolve-release/scripts/apply.mjs +212 -0
- package/skills/engineering/resolve-release/scripts/apply.test.mjs +99 -0
- package/skills/engineering/resolve-release/scripts/dark-flags.mjs +134 -0
- package/skills/engineering/resolve-release/scripts/dark-flags.test.mjs +100 -0
- package/skills/engineering/resolve-release/scripts/flow.mjs +500 -0
- package/skills/engineering/resolve-release/scripts/flow.test.mjs +340 -0
- package/skills/engineering/resolve-release/scripts/green-head.mjs +231 -0
- package/skills/engineering/resolve-release/scripts/green-head.test.mjs +101 -0
- package/skills/engineering/resolve-release/scripts/npm-version-absence.mjs +138 -0
- package/skills/engineering/resolve-release/scripts/npm-version-absence.test.mjs +426 -0
- package/skills/engineering/resolve-release/scripts/plan-npm.test.mjs +659 -0
- package/skills/engineering/resolve-release/scripts/plan-toml-boundary.test.mjs +317 -0
- package/skills/engineering/resolve-release/scripts/plan-uv.test.mjs +291 -0
- package/skills/engineering/resolve-release/scripts/plan.mjs +806 -0
- package/skills/engineering/resolve-release/scripts/plan.test.mjs +428 -0
- package/skills/engineering/rush-issues/LICENSE +3 -0
- package/skills/engineering/rush-issues/SKILL.md +58 -0
- package/skills/engineering/rush-issues/agents/openai.yaml +8 -0
- package/skills/engineering/rush-issues/rehydrate.mjs +10 -0
- package/skills/engineering/rush-issues/release-check.mjs +93 -0
- package/skills/engineering/rush-release/LICENSE +3 -0
- package/skills/engineering/rush-release/SKILL.md +35 -0
- package/skills/engineering/rush-release/agents/openai.yaml +8 -0
- package/skills/engineering/rush-release/release-check.mjs +93 -0
- package/skills/engineering/test-quality/LICENSE +3 -0
- package/skills/engineering/test-quality/SKILL.md +79 -0
- package/skills/engineering/test-quality/references/audit.md +80 -0
- package/skills/engineering/test-quality/references/lint.md +24 -0
- package/skills/engineering/test-quality/references/principles.md +143 -0
- package/skills/engineering/test-quality/references/testing-conventions.md +9 -0
- package/skills/engineering/test-quality/release-check.mjs +93 -0
- package/skills/engineering/test-quality/scripts/lint-tests.mjs +574 -0
- package/skills/engineering/test-quality/scripts/lint-tests.test.mjs +591 -0
- package/skills/engineering/test-quality/scripts/mock-policy-config.mjs +176 -0
- package/skills/engineering/test-quality/scripts/mock-policy-config.test.mjs +119 -0
- package/skills/engineering/test-quality/scripts/persist-conventions-core.mjs +117 -0
- package/skills/engineering/test-quality/scripts/persist-conventions.mjs +17 -0
- package/skills/engineering/test-quality/scripts/persist-conventions.test.mjs +104 -0
- package/skills/risk-compliance/compliance-audit/LICENSE +3 -0
- package/skills/risk-compliance/compliance-audit/SKILL.md +439 -0
- package/skills/risk-compliance/compliance-audit/references/findings-schema.md +293 -0
- package/skills/risk-compliance/compliance-audit/references/normalization-rules.md +45 -0
- package/skills/risk-compliance/compliance-audit/references/vars-checklist.md +1068 -0
- package/skills/risk-compliance/compliance-audit/references/vars-findings-schema.md +398 -0
- package/skills/risk-compliance/compliance-audit/release-check.mjs +93 -0
- package/skills/risk-compliance/compliance-audit/scripts/compliance-audit.test.mjs +14 -0
- package/skills/risk-compliance/compliance-audit/scripts/export_tracker_xlsx.py +221 -0
- package/skills/risk-compliance/compliance-audit/scripts/reconcile_tracker.py +458 -0
- package/skills/risk-compliance/compliance-audit/scripts/test_export_tracker_xlsx.py +97 -0
- package/skills/risk-compliance/compliance-audit/scripts/test_validate_tracker.py +157 -0
- package/skills/risk-compliance/compliance-audit/scripts/validate_tracker.py +829 -0
- package/skills/risk-compliance/contract-compare/LICENSE +3 -0
- package/skills/risk-compliance/contract-compare/SKILL.md +199 -0
- package/skills/risk-compliance/contract-compare/references/comparison-dimensions.md +209 -0
- package/skills/risk-compliance/contract-compare/release-check.mjs +93 -0
- package/skills/risk-compliance/contract-review/LICENSE +3 -0
- package/skills/risk-compliance/contract-review/SKILL.md +240 -0
- package/skills/risk-compliance/contract-review/references/review-criteria.md +223 -0
- package/skills/risk-compliance/contract-review/release-check.mjs +93 -0
- package/skills/risk-compliance/doc-authenticity/LICENSE +3 -0
- package/skills/risk-compliance/doc-authenticity/SKILL.md +160 -0
- package/skills/risk-compliance/doc-authenticity/agents/openai.yaml +8 -0
- package/skills/risk-compliance/doc-authenticity/manual-invocation.test.mjs +12 -0
- package/skills/risk-compliance/doc-authenticity/references/agreement.md +66 -0
- package/skills/risk-compliance/doc-authenticity/references/bank-statement.md +150 -0
- package/skills/risk-compliance/doc-authenticity/references/forensic-signals.md +157 -0
- package/skills/risk-compliance/doc-authenticity/references/image-signals.md +114 -0
- package/skills/risk-compliance/doc-authenticity/references/invoice.md +66 -0
- package/skills/risk-compliance/doc-authenticity/references/issuer-profiles.md +86 -0
- package/skills/risk-compliance/doc-authenticity/references/verdict-and-report.md +95 -0
- package/skills/risk-compliance/doc-authenticity/references/verdict.schema.json +81 -0
- package/skills/risk-compliance/doc-authenticity/release-check.mjs +93 -0
- package/skills/risk-compliance/doc-authenticity/scripts/image_forensics.py +294 -0
- package/skills/risk-compliance/doc-authenticity/scripts/pdf_forensics.py +401 -0
- package/skills/risk-compliance/doc-authenticity/scripts/validate_codes.py +224 -0
- package/skills/risk-compliance/doc-authenticity/scripts/validate_verdict.py +308 -0
- package/skills/risk-compliance/doc-authenticity/scripts/validate_verdict.test.mjs +212 -0
- package/skills/risk-compliance/fraud-analysis/LICENSE +3 -0
- package/skills/risk-compliance/fraud-analysis/SKILL.md +114 -0
- package/skills/risk-compliance/fraud-analysis/references/archetypes/authorized-payment-scam.md +41 -0
- package/skills/risk-compliance/fraud-analysis/references/archetypes/first-party-fraud.md +44 -0
- package/skills/risk-compliance/fraud-analysis/references/archetypes/third-party-fraud.md +27 -0
- package/skills/risk-compliance/fraud-analysis/references/contexts/bank-transfer.md +24 -0
- package/skills/risk-compliance/fraud-analysis/references/contexts/card-payment.md +30 -0
- package/skills/risk-compliance/fraud-analysis/references/contexts/payment-collection.md +20 -0
- package/skills/risk-compliance/fraud-analysis/references/contexts/payout.md +20 -0
- package/skills/risk-compliance/fraud-analysis/references/feature-engineering.md +158 -0
- package/skills/risk-compliance/fraud-analysis/references/mechanisms/account-takeover.md +36 -0
- package/skills/risk-compliance/fraud-analysis/references/report-rationale.md +45 -0
- package/skills/risk-compliance/fraud-analysis/references/report-template.md +190 -0
- package/skills/risk-compliance/fraud-analysis/references/review-checklist.md +175 -0
- package/skills/risk-compliance/fraud-analysis/references/taxonomy.md +79 -0
- package/skills/risk-compliance/fraud-analysis/references/terminology.md +108 -0
- package/skills/risk-compliance/fraud-analysis/references/workflow.md +175 -0
- package/skills/risk-compliance/fraud-analysis/release-check.mjs +93 -0
- package/skills/risk-compliance/payment-analysis/LICENSE +3 -0
- package/skills/risk-compliance/payment-analysis/SKILL.md +180 -0
- package/skills/risk-compliance/payment-analysis/references/auth-rate-actions.md +30 -0
- package/skills/risk-compliance/payment-analysis/references/chargebacks.md +208 -0
- package/skills/risk-compliance/payment-analysis/references/chinese-polish.md +51 -0
- package/skills/risk-compliance/payment-analysis/references/event-layers.md +127 -0
- package/skills/risk-compliance/payment-analysis/references/fx.md +59 -0
- package/skills/risk-compliance/payment-analysis/references/journey.md +79 -0
- package/skills/risk-compliance/payment-analysis/references/metrics.md +67 -0
- package/skills/risk-compliance/payment-analysis/references/report-template.md +119 -0
- package/skills/risk-compliance/payment-analysis/references/terminology.md +95 -0
- package/skills/risk-compliance/payment-analysis/references/visualization.md +56 -0
- package/skills/risk-compliance/payment-analysis/release-check.mjs +93 -0
- package/skills/risk-compliance/report-writing/LICENSE +3 -0
- package/skills/risk-compliance/report-writing/SKILL.md +220 -0
- package/skills/risk-compliance/report-writing/references/audit-report-template.md +121 -0
- package/skills/risk-compliance/report-writing/references/external-assessment-template.md +167 -0
- package/skills/risk-compliance/report-writing/references/management-report-template.md +145 -0
- package/skills/risk-compliance/report-writing/references/vars-report-template.md +224 -0
- package/skills/risk-compliance/report-writing/release-check.mjs +93 -0
- package/skills/risk-compliance/similar-domain/LICENSE +3 -0
- package/skills/risk-compliance/similar-domain/SKILL.md +203 -0
- package/skills/risk-compliance/similar-domain/references/entities.md +67 -0
- package/skills/risk-compliance/similar-domain/references/fingerprints.md +134 -0
- package/skills/risk-compliance/similar-domain/references/pivots.md +82 -0
- package/skills/risk-compliance/similar-domain/references/report-template.md +93 -0
- package/skills/risk-compliance/similar-domain/references/scoring.md +130 -0
- package/skills/risk-compliance/similar-domain/references/terminology.md +41 -0
- package/skills/risk-compliance/similar-domain/references/workflow.md +85 -0
- package/skills/risk-compliance/similar-domain/release-check.mjs +93 -0
- package/skills/risk-compliance/tld-detection/LICENSE +3 -0
- package/skills/risk-compliance/tld-detection/SKILL.md +245 -0
- package/skills/risk-compliance/tld-detection/agents/openai.yaml +9 -0
- package/skills/risk-compliance/tld-detection/references/chinese-polish.md +55 -0
- package/skills/risk-compliance/tld-detection/references/clean.md +51 -0
- package/skills/risk-compliance/tld-detection/references/clustering.md +235 -0
- package/skills/risk-compliance/tld-detection/references/decision.md +189 -0
- package/skills/risk-compliance/tld-detection/references/fx-conversion.md +232 -0
- package/skills/risk-compliance/tld-detection/references/report-template.md +272 -0
- package/skills/risk-compliance/tld-detection/references/streams.md +141 -0
- package/skills/risk-compliance/tld-detection/references/terminology.md +95 -0
- package/skills/risk-compliance/tld-detection/references/workflow.md +95 -0
- package/skills/risk-compliance/tld-detection/release-check.mjs +93 -0
- package/skills/risk-compliance/tld-detection/scripts/detect_ladders.py +390 -0
- package/skills/risk-compliance/tld-detection/scripts/detect_ladders.test.mjs +14 -0
- package/skills/risk-compliance/tld-detection/scripts/detect_streams.py +650 -0
- package/skills/risk-compliance/tld-detection/scripts/detect_streams.test.mjs +14 -0
- package/skills/risk-compliance/tld-detection/tests/test_detect_ladders.py +134 -0
- package/skills/risk-compliance/tld-detection/tests/test_detect_streams.py +520 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Chinese and bilingual mode
|
|
2
|
+
|
|
3
|
+
Language is a setting that works with every template. There is no Chinese-only or bilingual
|
|
4
|
+
template.
|
|
5
|
+
|
|
6
|
+
## Pick the mode
|
|
7
|
+
|
|
8
|
+
Choose it as in [SKILL.md step 1](../SKILL.md#write-a-new-document). The modes:
|
|
9
|
+
|
|
10
|
+
- **English** or **Chinese**: one version.
|
|
11
|
+
- **Bilingual, separate versions**: two files, `<name>.en.md` and `<name>.zh.md`, same headings in
|
|
12
|
+
the same order.
|
|
13
|
+
- **Bilingual, paired paragraphs**: one file; each English paragraph followed by its Chinese
|
|
14
|
+
paragraph. Headings carry both: `## Scope 范围`. Tables keep one table, with paired cells only
|
|
15
|
+
when WRITING.md asks for it; otherwise one table per language.
|
|
16
|
+
|
|
17
|
+
## Write
|
|
18
|
+
|
|
19
|
+
Chinese-only mode: write and review the document in Chinese, apply [中文风格](../../house-style/references/style-zh.md),
|
|
20
|
+
then go to step 5. Bilingual modes: steps 1 to 5.
|
|
21
|
+
|
|
22
|
+
1. Write and review the whole document in the source language: the one the brief names, else
|
|
23
|
+
WRITING.md's Language section, else English. Do not draft both languages at once.
|
|
24
|
+
2. Produce the second version from the reviewed source. Use TERMINOLOGY.md for every term it
|
|
25
|
+
lists. Translate every other term, including role and team names. Keep a term in the
|
|
26
|
+
source language only when TERMINOLOGY.md says so, or it is a product name, code or an
|
|
27
|
+
abbreviation the reader uses daily. Example: the table keeps "MLRO" in English; "Head of
|
|
28
|
+
Compliance" becomes 合规主管 (繁體:合規主管). Add each new non-obvious translation to TERMINOLOGY.md as
|
|
29
|
+
`proposed`, and list it in the delivery note.
|
|
30
|
+
3. Write the second version as a native writer would. Restructure sentences freely; do not keep the
|
|
31
|
+
source's word order. Apply the [English style](../../house-style/references/style-en.md) or
|
|
32
|
+
[中文风格](../../house-style/references/style-zh.md) guide to each version.
|
|
33
|
+
4. Run the equivalence check below. Fix every difference in the version that is wrong.
|
|
34
|
+
5. Polish the Chinese version with `polish-cn` when installed (bilingual: after the equivalence
|
|
35
|
+
check passes).
|
|
36
|
+
Not installed: say so in the delivery note.
|
|
37
|
+
|
|
38
|
+
## Equivalence check
|
|
39
|
+
|
|
40
|
+
Compare the two versions section by section. They must match on:
|
|
41
|
+
|
|
42
|
+
- Names of people, organizations, products and systems.
|
|
43
|
+
- Numbers, amounts, currencies, percentages, units, dates and deadlines.
|
|
44
|
+
- Conditions and scope: "if", "unless", "only", "at least", thresholds.
|
|
45
|
+
- Obligation strength: must / must not / should / may ↔ 必须 / 不得 / 应当 / 可以 (Traditional:
|
|
46
|
+
必須 / 不得 / 應當 / 可以), unless WRITING.md maps them otherwise; "will" never becomes "may", and
|
|
47
|
+
将 / 將 never becomes 可能.
|
|
48
|
+
- Uncertainty and caveats: a hedge in one version is a hedge in the other.
|
|
49
|
+
- Recommendations, decisions, owners and next steps.
|
|
50
|
+
- Structure: headings, list items, table rows and columns, links and anchors, code, field names,
|
|
51
|
+
every gap marker in either form, including bare `TBD` / `待确认` / `待確認` table cells (one for
|
|
52
|
+
one).
|
|
53
|
+
|
|
54
|
+
Neither version may contain a fact, claim, example or caveat the other lacks. A sentence that only
|
|
55
|
+
reads well in one language is rewritten in both, or cut from both.
|
|
56
|
+
|
|
57
|
+
## Corrections
|
|
58
|
+
|
|
59
|
+
A correction applies to this document only ([who edits what](../../house-style/references/rules.md#who-edits-what)); mention
|
|
60
|
+
`/distill-writing` once in the delivery note.
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { spawnSync } from 'node:child_process';
|
|
3
|
+
import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
4
|
+
import { homedir } from 'node:os';
|
|
5
|
+
import { dirname, join } from 'node:path';
|
|
6
|
+
import { fileURLToPath } from 'node:url';
|
|
7
|
+
|
|
8
|
+
const DAY_MS = 24 * 60 * 60 * 1000;
|
|
9
|
+
const WEEK_MS = 7 * DAY_MS;
|
|
10
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
11
|
+
|
|
12
|
+
function readJson(path, fallback = {}) {
|
|
13
|
+
try { return JSON.parse(readFileSync(path, 'utf8')); } catch { return fallback; }
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function frontmatterValue(text, key) {
|
|
17
|
+
const frontmatter = /^---\n([\s\S]*?)\n---/.exec(text)?.[1] ?? '';
|
|
18
|
+
const match = new RegExp('^' + key + ':\\s*([^\\n]+)$', 'm').exec(frontmatter);
|
|
19
|
+
return match?.[1].trim().replace(/^['"]|['"]$/g, '') ?? null;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function repositoryOf(source) {
|
|
23
|
+
const value = String(source ?? '').trim();
|
|
24
|
+
const match = /^(?:git@github\.com:|https:\/\/github\.com\/)?([A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+?)(?:\.git)?$/.exec(value);
|
|
25
|
+
return match?.[1] ?? null;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function stableVersion(value) {
|
|
29
|
+
const match = /^v?(\d+)\.(\d+)\.(\d+)$/.exec(String(value ?? '').trim());
|
|
30
|
+
return match ? match.slice(1).map(Number) : null;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function newer(left, right) {
|
|
34
|
+
for (let index = 0; index < 3; index += 1) {
|
|
35
|
+
if (left[index] !== right[index]) return left[index] > right[index];
|
|
36
|
+
}
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function writeCache(path, value) {
|
|
41
|
+
try {
|
|
42
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
43
|
+
writeFileSync(path, JSON.stringify(value));
|
|
44
|
+
} catch { /* A read-only cache must not block skill use. */ }
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function main(now = Date.now()) {
|
|
48
|
+
if (process.env.ONEABOVEIO_NO_UPDATE_CHECK) return;
|
|
49
|
+
const skill = readFileSync(join(here, 'SKILL.md'), 'utf8');
|
|
50
|
+
const name = frontmatterValue(skill, 'name');
|
|
51
|
+
const localVersion = stableVersion(frontmatterValue(skill, 'release-version'));
|
|
52
|
+
if (!name || !localVersion) return;
|
|
53
|
+
|
|
54
|
+
const lock = readJson(join(process.env.HOME || homedir(), '.agents', '.skill-lock.json'));
|
|
55
|
+
const entry = lock.skills?.[name];
|
|
56
|
+
const repository = repositoryOf(entry?.sourceUrl || entry?.source);
|
|
57
|
+
if (!repository) return;
|
|
58
|
+
|
|
59
|
+
const cacheRoot = process.env.XDG_CACHE_HOME || join(process.env.HOME || homedir(), '.cache');
|
|
60
|
+
const cachePath = join(cacheRoot, '1aboveio-skills', 'release-check.json');
|
|
61
|
+
const all = readJson(cachePath);
|
|
62
|
+
const cache = all[repository] && typeof all[repository] === 'object' ? all[repository] : {};
|
|
63
|
+
|
|
64
|
+
if (!cache.lastCheck || now - cache.lastCheck >= DAY_MS) {
|
|
65
|
+
const result = spawnSync('gh', ['api', 'repos/' + repository + '/releases/latest', '--jq', '.tag_name'], {
|
|
66
|
+
encoding: 'utf8',
|
|
67
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
68
|
+
timeout: 1500,
|
|
69
|
+
});
|
|
70
|
+
cache.lastCheck = now;
|
|
71
|
+
if (result.status === 0 && stableVersion(result.stdout)) cache.latestTag = result.stdout.trim();
|
|
72
|
+
else delete cache.latestTag;
|
|
73
|
+
all[repository] = cache;
|
|
74
|
+
writeCache(cachePath, all);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const latestVersion = stableVersion(cache.latestTag);
|
|
78
|
+
if (!latestVersion || !newer(latestVersion, localVersion)) return;
|
|
79
|
+
if (cache.notifiedTag === cache.latestTag && cache.notifiedAt && now - cache.notifiedAt < WEEK_MS) return;
|
|
80
|
+
|
|
81
|
+
cache.notifiedTag = cache.latestTag;
|
|
82
|
+
cache.notifiedAt = now;
|
|
83
|
+
all[repository] = cache;
|
|
84
|
+
writeCache(cachePath, all);
|
|
85
|
+
const command = `npx skills@1.5.23 add '${repository}#${cache.latestTag}' --global --agent universal claude-code --skill ${name} --yes`;
|
|
86
|
+
process.stdout.write(
|
|
87
|
+
`UPDATE_AVAILABLE: A newer 1AboveIO skills release (${cache.latestTag}) is available; this skill is `
|
|
88
|
+
+ `v${localVersion.join('.')}. Ask once whether to refresh ${name}. On approval run \`${command}\`. `
|
|
89
|
+
+ 'The refreshed instructions apply next session. Either way, continue the current task and do not ask again this session.\n',
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
try { main(); } catch { /* Update checks are advisory and always fail silent. */ }
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: better-review
|
|
3
|
+
description: "Slash/explicit-only (/better-review). Single-agent adversarial review of a branch or PR diff, under 10 minutes for a normal-sized change: Spec, Correctness, Test honesty, and Standards passes run in order in one context (no subagents), each finding proven by a file:line and the input that breaks it, rated P0-P2 (P3 cleanup is never reported), with the checks behind it actually run. Use when the user wants a branch, PR, or work-in-progress diff reviewed, asks to \"review since X\", or a delivery workflow needs an independent review, including re-reviews after fixes. Do not auto-select. NOT judging a test suite on its own (test-quality) or defining what must be tested (ensure-coverage)."
|
|
4
|
+
disable-model-invocation: true
|
|
5
|
+
dependencies:
|
|
6
|
+
- engineering-runtime
|
|
7
|
+
release-version: 0.36.0
|
|
8
|
+
---
|
|
9
|
+
**Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
|
|
10
|
+
# Better Review
|
|
11
|
+
|
|
12
|
+
One reviewer, one context, four passes over the net diff, done in **under 10 minutes**: separate
|
|
13
|
+
Spec and Standards axes and an adversarial method, with no sub-agents and no contract paperwork.
|
|
14
|
+
|
|
15
|
+
**Find your task, read that row, then follow [The run](#the-run).**
|
|
16
|
+
|
|
17
|
+
| Task | Read |
|
|
18
|
+
|---|---|
|
|
19
|
+
| Run a review end to end | [Review the rule, not the instance](#review-the-rule-not-the-instance), then [The run](#the-run) below |
|
|
20
|
+
| How to do each pass: the adversarial techniques, the sweeps, what not to flag | [references/passes.md](references/passes.md) |
|
|
21
|
+
| The diff touches auth, money, tenancy, or a migration | [references/domain-hazards.md](references/domain-hazards.md) |
|
|
22
|
+
| Write the result for a caller (JSON shape, severities, follow-ups) | [references/result.md](references/result.md) |
|
|
23
|
+
| Which tier a new HEAD gets: skip, delta, or full | [Review tiers](#review-tiers) below |
|
|
24
|
+
| Review round 2 or later (after fixes or a rebase) | [Re-review](#re-review) below |
|
|
25
|
+
|
|
26
|
+
## Rules that do not move
|
|
27
|
+
|
|
28
|
+
1. **Do every pass yourself. Never spawn a subagent and never invoke `code-review`.** The caller
|
|
29
|
+
runs with a small agent cap; one review is one slot.
|
|
30
|
+
2. **The subject is the net diff** `git diff <merge-base>...HEAD` (three-dot). What was already
|
|
31
|
+
there at the merge-base is a P2 note when serious, else left out. Read unchanged code freely,
|
|
32
|
+
but only to prove a finding the diff causes.
|
|
33
|
+
3. **Judge against the spec and the repo's written rules, nothing else.** Example: the spec says
|
|
34
|
+
"persist per installation", so per-user storage is P1; an audit log the spec never asks for is
|
|
35
|
+
P2 at most.
|
|
36
|
+
4. **Produce the counterexample, not an opinion.** A P0/P1 needs a `file:line` and the concrete
|
|
37
|
+
input, state, or sequence that breaks it. The line is in the diff, or for missing behavior, the
|
|
38
|
+
place the behavior should live plus the spec line asking for it. No trigger means P2 at most.
|
|
39
|
+
Example: "P1: a retry reuses the single-use JWT; the second call returns 401" blocks; "could
|
|
40
|
+
use more tests here" is P2 at most.
|
|
41
|
+
5. **Verify against the tree, never the narration.** PR body, commit messages, test names, logs,
|
|
42
|
+
and "CI is green" are claims: run or read the thing. Never ask the author for evidence documents.
|
|
43
|
+
6. **Not being able to run a check is not a finding.** List it under `notRun` with its command and
|
|
44
|
+
error verbatim; never turn "I could not run it" into "it is missing". Example: no emulator is
|
|
45
|
+
available, so list the emulator journey as not run; do not rate the code P1 for it.
|
|
46
|
+
7. **Run the changed files' tests and the check behind each blocker; nothing broader.** Example:
|
|
47
|
+
you claim a refund rounding bug, so run the refund tests and the test that shows it; do not
|
|
48
|
+
rerun the full suite for reassurance.
|
|
49
|
+
8. **Every round covers the whole diff:** in full, or by the [tier](#review-tiers)
|
|
50
|
+
`rereview-scope.mjs` picks. A sampled or timed-out pass is unfinished, not done.
|
|
51
|
+
|
|
52
|
+
## Review the rule, not the instance
|
|
53
|
+
|
|
54
|
+
**Every P0/P1 is a broken rule with all its paths, one id every round:** apply the six
|
|
55
|
+
[principles](references/passes.md#review-the-rule-not-the-instance) to each P0/P1 candidate. Example: "a refund never exceeds
|
|
56
|
+
the captured amount" is the finding; "a second partial refund succeeds" is one path.
|
|
57
|
+
|
|
58
|
+
## Review tiers
|
|
59
|
+
|
|
60
|
+
Every HEAD sent for review gets one tier. The first review is always full; from round 2, `rereview-scope.mjs`
|
|
61
|
+
picks the tier from the previous result. Widen a tier when you must, never narrow one.
|
|
62
|
+
|
|
63
|
+
| Tier | When | What is reviewed | Checks |
|
|
64
|
+
|---|---|---|---|
|
|
65
|
+
| **skip** | The previous review passed (no open P0/P1) and the PR's own changes are unchanged: the same HEAD (whose approval already holds), the same patch over a base that moved only outside the PR's files, or the same changed lines at the same places in every file the base moved under (a conflict resolved by keeping both sides counts) | Nothing: no reviewer runs. `--write-skip` writes the record that carries the approval to this HEAD | None. CI on this HEAD is the proof |
|
|
66
|
+
| **delta** | Fix commits since the last round, a rebase that changed or moved the PR's own lines in a file the base moved under, or any new HEAD while a P0/P1 is open; and no full trigger | The fix diff and merge diff at full depth; carried files only at their `callSites` | Tests whose inputs changed, every check a P0/P1 rests on |
|
|
67
|
+
| **full** | The first review, or any full trigger below | The whole diff, every pass | [Step 5](#5-run-the-checks-and-report-2-min) |
|
|
68
|
+
|
|
69
|
+
**Full triggers.** The script names each one in `reasons`; the round number and a previous delta never force full:
|
|
70
|
+
|
|
71
|
+
- the previous round was incomplete or oversize;
|
|
72
|
+
- fixes and base changes since the last full review touch more than half the PR's lines;
|
|
73
|
+
- the impact of a base change on the PR's own lines cannot be bounded;
|
|
74
|
+
- the previous HEAD is gone and the patch changed, or its `patchFingerprint` is missing;
|
|
75
|
+
- the previous merge-base is missing from the repository;
|
|
76
|
+
- the previous result lacks `head`, `mergeBase`, or `round`;
|
|
77
|
+
- the PR's previously reviewed changes were removed.
|
|
78
|
+
|
|
79
|
+
**Never carry a blocker.** A previous review with an open P0/P1 never yields skip, even on an
|
|
80
|
+
unchanged HEAD or after a rebase: the blocker is fixed, then reviewed as a delta.
|
|
81
|
+
|
|
82
|
+
Examples:
|
|
83
|
+
- Round 3 changed one function to fix R1: **delta** over it, its callers, and any merge diff.
|
|
84
|
+
- A rebase onto main that only moved `docs/`, after a passing review: **skip**.
|
|
85
|
+
- Main changed `b.ts`, which the PR also edits, and the PR's own lines there are unchanged at the same places (a conflict resolved by keeping both sides included): **skip**.
|
|
86
|
+
- A conflict resolution rewrote three PR lines in `b.ts`: **delta** over those hunks, their
|
|
87
|
+
callers and shared invariants. If they reach a lock order the whole module relies on and you
|
|
88
|
+
cannot bound it, widen to **full** and name why.
|
|
89
|
+
|
|
90
|
+
## The run
|
|
91
|
+
|
|
92
|
+
Time targets add up to 10 minutes for a normal-sized change: finish a pass that runs long and
|
|
93
|
+
tighten the next; an oversize change takes longer.
|
|
94
|
+
|
|
95
|
+
### 0. Setup (≤1 min)
|
|
96
|
+
|
|
97
|
+
Resolve `SKILL_DIR` to the directory you read this file from (never your working directory, never
|
|
98
|
+
a `find` over `$HOME`).
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
node "$SKILL_DIR/scripts/pr-context.mjs" --base <target-branch> # JSON: mergeBase, files, diffstat
|
|
102
|
+
git diff <mergeBase>...HEAD | node "$SKILL_DIR/scripts/scan-diff.mjs"
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Read both outputs where they print; a read-only sandbox is fine.
|
|
106
|
+
|
|
107
|
+
- The target is what the caller or user named, else the PR's base (`gh pr view --json baseRefName`),
|
|
108
|
+
else the default branch, as a fetched remote ref (`origin/main`). Fail on a bad ref or empty diff.
|
|
109
|
+
- `scan-diff` prints **leads** (places to look; never findings by themselves) and **findings**
|
|
110
|
+
(`over-mock-internal-seam`: a first-party mock, rated in pass 3).
|
|
111
|
+
- If `pr-context` reports `promotion: true`, this is a release merge of already-reviewed commits,
|
|
112
|
+
not a feature review: report whether it fast-forwards (`fastForwardable`, and any
|
|
113
|
+
`commitsOnBaseNotInHead` it would revert), and stop.
|
|
114
|
+
- **Oversize:** more than ~1,500 changed lines or 40 files (generated and lock files excluded).
|
|
115
|
+
Still review all of it, highest-risk files first, set `oversize: true` in the result, and say
|
|
116
|
+
in the summary that the change should be split.
|
|
117
|
+
- Collect the inputs: the spec (the caller's, else issue refs in commits and the PR body, else a
|
|
118
|
+
matching file under `docs/`, `specs/`, `.scratch/`) and the repo's written standards
|
|
119
|
+
(`CONTRIBUTING.md`, `AGENTS.md`/`CLAUDE.md`, and the style docs or ADRs the diff touches).
|
|
120
|
+
Missing spec: run code-only and say "no spec found". Do not stop to ask. Leave the hazards
|
|
121
|
+
files for pass 2, which reads them only when the diff needs them.
|
|
122
|
+
|
|
123
|
+
### 1. Spec (≤2 min)
|
|
124
|
+
|
|
125
|
+
Skip with "no spec found" when there is none. Otherwise list **every** acceptance criterion and
|
|
126
|
+
judge each on its own row:
|
|
127
|
+
|
|
128
|
+
- **Met** only when the result for the real runtime input is right (not just the right call or
|
|
129
|
+
constant present) and a test asserting it would go red if the behavior were removed.
|
|
130
|
+
- **Unmet or wrong** is P1. **Unverified** (implemented, but no test that would fail if it were
|
|
131
|
+
removed) is P1 too: an acceptance criterion with no such test is not proven.
|
|
132
|
+
- Behavior nobody asked for (scope creep) is P2, or P1 if it changes a contract code relies on.
|
|
133
|
+
|
|
134
|
+
### 2. Correctness, adversarial (≤3 min)
|
|
135
|
+
|
|
136
|
+
Try to prove the change is broken. For each changed function or rule, run the four techniques (and
|
|
137
|
+
check the shapes) in [passes.md](references/passes.md#adversarial-techniques): diff it against its siblings, break its
|
|
138
|
+
patterns with boundary inputs, hold its async steps open, and name the test for each new branch:
|
|
139
|
+
|
|
140
|
+
- **Every regex, glob, parser, or validator the diff adds or changes:** list it and the inputs you
|
|
141
|
+
tried against it (prefix and substring leakage, empty, case, escaping, a malformed value it
|
|
142
|
+
should reject), and record them under `boundaries` in the result. Writing the inputs down is
|
|
143
|
+
what stops this check being skipped when a pattern looks fine at a glance.
|
|
144
|
+
- **Every async step the change relies on** (sign-out, revoke, refresh, cancel, save, upload):
|
|
145
|
+
hold it pending and settle it each way (success, refusal, error, timeout) against the events
|
|
146
|
+
[principle 3](references/passes.md#review-the-rule-not-the-instance) scopes. Rule a cell out by code, or in one line when
|
|
147
|
+
the program cannot produce the event; record it under `windows`.
|
|
148
|
+
- **Callers and sibling paths:** follow each changed contract to every place that uses it or must
|
|
149
|
+
apply the same rule.
|
|
150
|
+
- **High-risk surface** (auth/token/session, money/tax, tenancy/org scope, migration): hunt it
|
|
151
|
+
against [domain-hazards.md](references/domain-hazards.md) and the repo's own hazards file
|
|
152
|
+
(`docs/domain-hazards.md`, or wherever `AGENTS.md`/`CLAUDE.md` points). An
|
|
153
|
+
exploitable security, auth, money, tenancy, or data-loss defect is P0/P1.
|
|
154
|
+
- **A rule that must hold in several places** (a validator, a guard, a behavior the diff changes): run
|
|
155
|
+
the [enforcement-point sweep](references/passes.md#enforcement-point-sweep). Every unenforced
|
|
156
|
+
point is an open `paths` row of the rule's finding this round; a guard copied to each point
|
|
157
|
+
gets one owner as the fix ([principle 5](references/passes.md#review-the-rule-not-the-instance)). One place only: say so in one line.
|
|
158
|
+
- **Narration drift:** a comment, `--help`, doc, or PR claim that contradicts the code. P1 where
|
|
159
|
+
the prose is what agents or users act on; otherwise skip it.
|
|
160
|
+
|
|
161
|
+
### 3. Test honesty (≤1 min)
|
|
162
|
+
|
|
163
|
+
The tests in the diff are evidence only if they can fail. Each of these is P1 when the test is
|
|
164
|
+
cited as proof of a requirement or fix, otherwise P2:
|
|
165
|
+
|
|
166
|
+
- a mock of a first-party module (`scan-diff`'s finding channel): it proves only wiring. Faking
|
|
167
|
+
an external (third-party API, clock, randomness) is fine. The fix is a real test, a fake of
|
|
168
|
+
only the external, or deleting the test;
|
|
169
|
+
- an added skip, `.only`, `xit`/`xfail`/`fixme`, fixed sleep, empty body, or an assertion weakened
|
|
170
|
+
to pass on an error, empty, or 404 page;
|
|
171
|
+
- an assertion that cannot fail (a swallowed rejection, a try/catch that re-passes, a check
|
|
172
|
+
against a stub);
|
|
173
|
+
- a bug fix with no test that would have been red on the pre-fix tree;
|
|
174
|
+
- a test that awaits an async step to completion, cited as proof of the pending state (unverified).
|
|
175
|
+
|
|
176
|
+
### 4. Standards (≤1 min)
|
|
177
|
+
|
|
178
|
+
Last on purpose, so style never steers the passes above. Cite the documented rule (file and rule)
|
|
179
|
+
for each violation; skip what tooling already enforces. A rule the repo marks required (must, gate)
|
|
180
|
+
is P1; other documented rules P2. Skip undocumented cleanup: naming, smells, cosmetics, and
|
|
181
|
+
architecture opinions would be P3, and this review never reports P3.
|
|
182
|
+
|
|
183
|
+
### 5. Run the checks and report (≤2 min)
|
|
184
|
+
|
|
185
|
+
- Run the tests for the changed files, plus lint or typecheck when cheap. Rerun any check a
|
|
186
|
+
P0/P1 rests on. Record each exact command in `commands`; never accept a producer's log instead.
|
|
187
|
+
`commands` lists checks run against the code only, never this skill's update check or scripts.
|
|
188
|
+
- Apply the [finding bar](references/passes.md#the-finding-bar) before reporting: a few strong
|
|
189
|
+
findings beat many weak ones, and "no blocking issues" is a valid result.
|
|
190
|
+
- **Caller gave a result path:** write the JSON in [result.md](references/result.md), including
|
|
191
|
+
the sweeps you ran (a later round re-checks them), and file the follow-ups the caller asks for.
|
|
192
|
+
- **Otherwise** report in chat: one section per pass in run order, then one line with the count
|
|
193
|
+
per pass and the worst finding in each. Do not merge or rerank findings across passes.
|
|
194
|
+
|
|
195
|
+
Write each pass's findings down before starting the next, and never re-rate an earlier pass's
|
|
196
|
+
severities because of a later one: that keeps the passes independent without extra agents.
|
|
197
|
+
|
|
198
|
+
## Re-review
|
|
199
|
+
|
|
200
|
+
From round 2 the caller gives you the previous round's result file and its open P0/P1 findings.
|
|
201
|
+
**No previous result file** (for example, a user says "I fixed it, review again"): do a full run,
|
|
202
|
+
then check each finding you were told about as in Re-review step 3 below.
|
|
203
|
+
|
|
204
|
+
1. **Let the script pick the [tier](#review-tiers)**, and run it before reading anything else,
|
|
205
|
+
including the files the caller attached: its output already contains what you need from them.
|
|
206
|
+
|
|
207
|
+
```bash
|
|
208
|
+
node "$SKILL_DIR/scripts/rereview-scope.mjs" --prior <previous-result.json> --base <target-branch>
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
- `skip`: review nothing. With a result path from the caller, run the same command again
|
|
212
|
+
with `--head <the sha the caller named> --write-skip <result path>`: the record it writes is your result. Tell the caller the
|
|
213
|
+
tier and stop. (`--write-skip` writes nothing on delta or full.)
|
|
214
|
+
- `full`: run [The run](#the-run) on the whole diff, then step 3 below.
|
|
215
|
+
- `delta`: continue with step 2. `integrationFiles` names PR files whose own changes were
|
|
216
|
+
rewritten over a moved base; `mergeFiles`, those it moved under cleanly. Review their
|
|
217
|
+
resolved hunks, callers and shared invariants. `baseDiffCommand` shows every base change,
|
|
218
|
+
including dependencies outside PR files; check the relevant ones.
|
|
219
|
+
|
|
220
|
+
Copy `fixRound` from the output into the result: it is the caller's fix counter, and the tier
|
|
221
|
+
never changes it.
|
|
222
|
+
2. **On `delta`, its output is your setup.** Skip step 0 entirely: no update check, no
|
|
223
|
+
`pr-context`, no whole-diff scan, and no re-reading repo docs or `references/` unless the fix
|
|
224
|
+
diff needs one (it touches a hazard surface, adds an async step, or adds a multi-place rule).
|
|
225
|
+
The output holds `fixDiff` (the fix diff itself; `null` when too large, then run
|
|
226
|
+
`fixDiffCommand`), `openFindings` (full; read the [principles](references/passes.md#review-the-rule-not-the-instance) when one is open), `sweepRecheck` (previous sweep points in touched
|
|
227
|
+
files), `changedSymbols`, `callSites` (every line in a carried file that uses a changed name),
|
|
228
|
+
and `fixScan` (leads and findings for the fix diff alone). Each tool call costs seconds, so a
|
|
229
|
+
delta round is mostly about making few of them.
|
|
230
|
+
3. **Each open finding** is resolved only when every `paths` row, re-derived from the tree
|
|
231
|
+
([principles 2, 4, 6](references/passes.md#review-the-rule-not-the-instance)), is closed at a `file:line`; a new
|
|
232
|
+
witness of its rule is an open row under its old id at its old severity. A previous P2 is
|
|
233
|
+
closed: raise it again only when it is now P1.
|
|
234
|
+
4. **The fix diff** (`fixDiff`): run passes 1-4 on it at full depth, including `boundaries` and
|
|
235
|
+
`windows` for any pattern or async step it adds or changes; re-check each `sweepRecheck` point.
|
|
236
|
+
5. **The carried files:** re-check correctness at the `callSites` lines and every open `paths`
|
|
237
|
+
row, reading enough around each to judge it. If `callSites.truncated` is true, search the
|
|
238
|
+
rest yourself. Spec rows and standards findings carry over, except open P0/P1 rows (step 3).
|
|
239
|
+
6. **Checks:** run the tests whose inputs changed, every check a current P0/P1 rests on,
|
|
240
|
+
and affected required checks (generated artifacts, lint). Carry unaffected passing
|
|
241
|
+
results forward with their reviewed HEAD; do not report them as freshly executed.
|
|
242
|
+
Record actual code checks, such as `git diff --check`, in `commands`; never copy old
|
|
243
|
+
commands as if they ran this attempt.
|
|
244
|
+
7. **Write the result** with `tier: "delta"`, `passes` covering this attempt, `mergeBase`,
|
|
245
|
+
`patchId`, `patchFingerprint`, `fixRound` and `fixLinesSinceFull` from the script's
|
|
246
|
+
output, and the previous `sweeps`, `windows` and `boundaries` carried forward with
|
|
247
|
+
the touched points updated. `findings` holds the prior findings still open, under
|
|
248
|
+
their old ids, plus any new ones; resolved findings are left out. A delta round should take a
|
|
249
|
+
few minutes at most.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
interface:
|
|
2
|
+
display_name: "Better Review"
|
|
3
|
+
short_description: "Slash/explicit-only single-agent adversarial review of a branch or PR diff, with skip, delta, or full re-reviews"
|
|
4
|
+
|
|
5
|
+
policy:
|
|
6
|
+
# Codex counterpart to SKILL.md disable-model-invocation: true.
|
|
7
|
+
# Keeps $better-review / explicit invoke (and delivery workflows reading it by path)
|
|
8
|
+
# while blocking description-based selection.
|
|
9
|
+
allow_implicit_invocation: false
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Domain hazards: the high-risk hunt list
|
|
2
|
+
|
|
3
|
+
The bug classes that a happy-path implementation ships and CI passes green, on the surfaces whose
|
|
4
|
+
contract is hardest to pin down: auth, money, tenancy, and migrations. Read when the diff touches
|
|
5
|
+
one of them, and hunt the matching section. An unhandled item is a finding, P0/P1 when exploitable
|
|
6
|
+
or contract-breaking ([result.md](result.md#severity)).
|
|
7
|
+
|
|
8
|
+
This is the generic shape. The repo's own values (its issuer, currencies, tenant column, migration
|
|
9
|
+
tool) live in its hazards file: follow the `Domain hazards` heading in `AGENTS.md`/`CLAUDE.md`, else
|
|
10
|
+
read `docs/domain-hazards.md`, else there is none. Hunt against both. You are read-only: when a
|
|
11
|
+
blocking finding deserves a new row in that file, say so in the finding's summary.
|
|
12
|
+
|
|
13
|
+
The rule behind every class: **decide by a positive allow-list, default to deny, and prove the
|
|
14
|
+
result for the value the app actually produces at runtime, not a convenient fixture.**
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 1. Auth / authz / token / session
|
|
19
|
+
|
|
20
|
+
| Hazard | Failure mode (real cases) | What to prove |
|
|
21
|
+
|---|---|---|
|
|
22
|
+
| **Fail-open guard/verifier** | On error / unknown input / unmatched branch, the code *allows* instead of denying. A signature verifier with an HMAC catch-all fallback; a country/eligibility check that skips the gate for unrecognized spellings. | Every error and `else` path **denies**. The default is deny. Add a test that feeds the unrecognized/garbage input and asserts refusal. |
|
|
23
|
+
| **Token/assertion validation** | Wrong issuer, wrong/defaulted `client_id`, missing audience check, unpinned algorithm (accepts `none` or HMAC where RS/ES expected). POSTing to the wrong endpoint (broker vs OIDC issuer). | `iss` / `aud` / `scope` / `exp` / signature-alg each asserted against the **real IdP contract**, not a literal default. Alg pinned. Target endpoint is the issuer, verified against the discovery doc. |
|
|
24
|
+
| **Replay / single-use / idempotency** | A one-time code (nonce, `jti`, `device_code`, OTP) accepted twice; no brute-force limit. | The code is consumed **atomically** and a second use is rejected; a replay test proves it; sensitive endpoints are rate-limited. |
|
|
25
|
+
| **Clock skew** | Assertion/token lifetime unbounded or with no skew tolerance; `iat`/`nbf`/`exp` mishandled. | Lifetime is clamped to a bounded window; skew tolerance is explicit; a token just inside/outside the window is tested both ways. |
|
|
26
|
+
| **Open redirect / dropped `returnTo`** | Redirect target derived from user input without an allow-list; a centralizing auth refactor drops the deep-link `returnTo` and lands the user on a default page. | Redirect targets pass a **positive allow-list** (`^/(?![/\\])` or exact known routes), and `returnTo` survives the whole flow (characterization test on the deep-link path). |
|
|
27
|
+
| **Revocation during a pause** | Sign-out or access loss that arrives while the app is backgrounded, hidden, or a check is in flight takes the temporary-pause path, so private data or a session outlives the revocation until the pending call settles (a downloaded document kept for as long as a hanging logout request runs). | Revocation acts when it starts, not when it settles. A test holds the revocation pending in each paused state and asserts the private data is gone. |
|
|
28
|
+
| **Privilege on switch** | Org-switch / impersonation / role change doesn't re-scope the session or leaves stale elevated state. | The switch re-derives authorization; a test asserts the post-switch scope, not just that the switch succeeded. |
|
|
29
|
+
|
|
30
|
+
## 2. Money / tax / pricing
|
|
31
|
+
|
|
32
|
+
| Hazard | Failure mode (real cases) | What to prove |
|
|
33
|
+
|---|---|---|
|
|
34
|
+
| **Conversion direction** | Divide-vs-multiply inverted; response keyed to the base currency (USD) when the caller asked for the quote currency; daily vs realtime endpoint confused. | Direction asserted with a **known rate and a known expected result**; the response is keyed to the currency actually requested; the endpoint matches the contract. |
|
|
35
|
+
| **Precision & storage range** | Minor-unit integer column too small for the validated max — validation passes, the INSERT overflows and 500s (INT4 column vs a `1e11` Zod cap). | Storage type holds the max plausible value; the validation cap is **≤** the storage range; a max-size input is tested end-to-end through the write, not just through validation. |
|
|
36
|
+
| **Rounding** | Undefined or inconsistent rounding (half-up vs banker's); rounding applied at the wrong step; tax computed on the wrong base. | Rounding mode and step are explicit and tested at the boundary; tax base/order matches the spec. |
|
|
37
|
+
| **Immutability & state** | An issued invoice/number/ledger entry is mutable; a paid/void transition isn't guarded. | Post-issue mutation is rejected; state transitions go through one authoritative guard; the guard is tested for the illegal transition. |
|
|
38
|
+
|
|
39
|
+
## 3. Tenancy / org-scope / isolation
|
|
40
|
+
|
|
41
|
+
| Hazard | Failure mode (real cases) | What to prove |
|
|
42
|
+
|---|---|---|
|
|
43
|
+
| **Cross-org leakage** | A read or write not filtered by tenant/org; lineage or join that crosses orgs (cross-org TaskRun lineage leak). | **Every** query is scoped by tenant by default (scoping is not opt-in); a two-org test asserts org A cannot see/mutate org B's rows. |
|
|
44
|
+
| **Authorization scope drift** | Ad-hoc role-string compares that a centralized detector misses (alias forms like `const role = …; return role === 'admin'`); checks in an app the audit doesn't cover. | Authorization is centralized; no inline role-string equality; the detector/audit covers every app, and a real instance is caught by a test. |
|
|
45
|
+
|
|
46
|
+
## 4. DB migration / schema
|
|
47
|
+
|
|
48
|
+
| Hazard | Failure mode (real cases) | What to prove |
|
|
49
|
+
|---|---|---|
|
|
50
|
+
| **Type/range vs validation** | Column type can't hold the value the app validates as legal (see money precision). | Column range ≥ the app's accepted range; asserted with a boundary write. |
|
|
51
|
+
| **Migration scope creep** | A migration bundles unrelated changes or an unintended column/table drop; schema drifts from the intended migration. | One concern per migration; the diff contains **only** the intended change; drift is reconciled, not silently regenerated. |
|
|
52
|
+
| **Backfill / nullability / locks** | Adding a NOT NULL column without a default or backfill; a migration that locks a hot table. | New columns are nullable-or-defaulted with a backfill plan; lock-heavy changes are called out; the migration is reversible or the irreversibility is declared. |
|
|
53
|
+
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
# How to run each pass
|
|
2
|
+
|
|
3
|
+
The method behind [SKILL.md](../SKILL.md)'s passes. Read the section the run points you to.
|
|
4
|
+
|
|
5
|
+
## Review the rule, not the instance
|
|
6
|
+
|
|
7
|
+
Apply these to each P0/P1 candidate, in every pass and every round, and record the result in the
|
|
8
|
+
finding's `rule` and `paths` ([result.md](result.md)). Below a P0/P1, skip them.
|
|
9
|
+
|
|
10
|
+
1. **A finding is a broken rule; its trigger is one witness.** State the rule in one sentence;
|
|
11
|
+
the finding closes only when the rule holds on every path, not when the witness is fixed.
|
|
12
|
+
Example: "a refund never exceeds the captured amount" is the finding; "a second partial
|
|
13
|
+
refund of 60 on a 100 charge succeeds" is one witness.
|
|
14
|
+
2. **Find the paths in the code, never from memory.** Search the tree for every writer of the
|
|
15
|
+
state the rule guards, or every caller of the contract the diff adds, changes, or relies on;
|
|
16
|
+
record each as a `paths` row. A broken path the diff neither causes nor worsens is not a row:
|
|
17
|
+
it is a P2 follow-up. On a delta, search again only when the fix diff adds or moves a writer.
|
|
18
|
+
Example: grep every call that changes a balance: the refund route, the batch refund job, and
|
|
19
|
+
the chargeback webhook are three rows, not the one the trigger used.
|
|
20
|
+
3. **Check every path against one shared list of conditions, including its own failure.** For
|
|
21
|
+
a path that guards a session, credentials, money, or a deletion, settle it each way
|
|
22
|
+
(success, refusal, error, timeout) against the same list of events for every path; for other
|
|
23
|
+
paths, the events that can reach it. An event the program cannot produce is ruled out in one
|
|
24
|
+
line; one guard that rules out a whole row of events closes every cell in it.
|
|
25
|
+
Example: an org switch was tried against "offline" and "a second tab", never against "the
|
|
26
|
+
role lookup times out after the switch", and that cell granted the old org's role.
|
|
27
|
+
4. **One rule, one finding, one id, every round.** A new witness that breaks the same guarded
|
|
28
|
+
state or contract is an open row under the old id, whatever its wording; widen the `rule`
|
|
29
|
+
sentence under the same id when it was too narrow. A different guarded state is a new id;
|
|
30
|
+
an id resolved in an earlier round that breaks again is a new id whose summary names it.
|
|
31
|
+
Example: a cache-invalidation finding fixed for writes is still open when a bulk import
|
|
32
|
+
leaves the cache stale: same id, one more open row.
|
|
33
|
+
5. **Name one owner as the fix.** Prefer the place every path passes through: a guard copied to
|
|
34
|
+
each path misses the next one. Copied guards that close every row still resolve the
|
|
35
|
+
finding; when no such place exists, say so, and the rows are the fix.
|
|
36
|
+
Example: three handlers each re-check the tenant; the owner is the repository method all
|
|
37
|
+
three call.
|
|
38
|
+
6. **A rule that breaks again after a fix means the approach is wrong.** Say so in the
|
|
39
|
+
finding, name the owner (5), and re-derive every path (2); never review the next patch as if
|
|
40
|
+
it were the first. Example: the refund cap is open after two fixes, each adding a check to
|
|
41
|
+
one route: the finding names the balance service as the owner and lists every writer.
|
|
42
|
+
|
|
43
|
+
## Adversarial techniques
|
|
44
|
+
|
|
45
|
+
"Be adversarial" means nothing without a method. The one move behind all four: **build the
|
|
46
|
+
specific artifact that would fail, and cite it.** A finding with no concrete trigger is a hunch.
|
|
47
|
+
|
|
48
|
+
- **Diff each new or changed function against its siblings.** Find its family: the same module,
|
|
49
|
+
naming pattern, or role (a set of `detect*`, `validate*`, `parse*`, or route handlers). Compare
|
|
50
|
+
the logic line by line. A function that handles a case differently, uses a looser or tighter
|
|
51
|
+
pattern, orders its guards differently, or lacks a branch all its siblings have is a defect until
|
|
52
|
+
the difference is justified. Name the sibling and the exact divergence, for example:
|
|
53
|
+
"`detectOverMockedEvidence` matches `route.fulfill` but its sibling `detectTier1UiOnlyEvidence`
|
|
54
|
+
also matches `page.route(`, so the first misses that vector."
|
|
55
|
+
- **Break patterns with boundary inputs.** For each regex, glob, string match, or parser the diff
|
|
56
|
+
adds or changes, write the input that breaks it before you trust it: prefix or substring leakage
|
|
57
|
+
(does `/foo` also match `/foobar`? is it anchored?), empty or whitespace, case, escaping and
|
|
58
|
+
metacharacters, unicode, very long input. Put the failing string in the finding.
|
|
59
|
+
- **Hold each async step open.** For every async step the change relies on (sign-out, revoke,
|
|
60
|
+
refresh, cancel, save, upload), ask what the code does *while it is pending*, and settle it
|
|
61
|
+
each way (success, refusal, error, timeout) against every event that can coincide:
|
|
62
|
+
backgrounded or hidden, offline, a second request, a retry, a sign-in as the same or a
|
|
63
|
+
different subject, sign-out, expiry ([principle 3](#review-the-rule-not-the-instance) scopes
|
|
64
|
+
the list). Write the sequence that interleaves them. Rule a cell out only by code that prevents
|
|
65
|
+
it (a guard, a lock, a state check), never by how you expect the step to be reached: list every
|
|
66
|
+
caller of the step, including timers, push events, expiry, and error handlers, not just the
|
|
67
|
+
button a user presses. A test that awaits the step to completion never runs this window, so it
|
|
68
|
+
proves nothing about it. Example: "export a report to a temp
|
|
69
|
+
file, put the app in the background, then log out and leave the logout request hanging: the
|
|
70
|
+
cleanup waits for logout to finish, so the exported file outlives the session."
|
|
71
|
+
- **Name a test for each new branch.** For every conditional, `else`, early return, switch case,
|
|
72
|
+
and error path in the diff, find the test that drives it. A branch whose failure would be
|
|
73
|
+
observable and has no test is a gap; line coverage is not branch coverage.
|
|
74
|
+
|
|
75
|
+
Shapes to look for while doing this:
|
|
76
|
+
|
|
77
|
+
- **Default-allow.** On an error, unknown input, or unmatched branch, does the code allow instead of
|
|
78
|
+
deny, or fall back to a permissive default? Feed it the garbage input.
|
|
79
|
+
- **Read before lock.** A value read to compute a write must be read inside the lock that guards
|
|
80
|
+
that write. Pair each locked write with a second writer of the same row: if the read happens
|
|
81
|
+
before the lock, the second writer's commit is overwritten.
|
|
82
|
+
- **A control the server refuses.** When the diff newly shows or enables an action for a state
|
|
83
|
+
(pending, archived, partial), trace that exact control's call path with that state: the page's
|
|
84
|
+
server action or route, every layer it passes through, and the service at the bottom. Each layer
|
|
85
|
+
can pin its own expected state, so the service accepting it proves nothing about the action the
|
|
86
|
+
button calls.
|
|
87
|
+
- **A permanent event routed through a temporary path.** Code that handles "paused, hidden,
|
|
88
|
+
checking" and "revoked, signed out, deleted" in one branch keeps data or access alive after it
|
|
89
|
+
should be gone. Check each permanent event arriving during each temporary state, and record it
|
|
90
|
+
under `windows` (see "Revocation during a pause" in [domain-hazards.md](domain-hazards.md)).
|
|
91
|
+
- **Centralizing drops an edge.** A refactor that moves a cross-cutting concern into one place (an
|
|
92
|
+
auth redirect into a layout, error handling into a shared hook) silently loses edges the old
|
|
93
|
+
paths handled. Check that the old edges are pinned by a test that existed before the move.
|
|
94
|
+
|
|
95
|
+
## Enforcement-point sweep
|
|
96
|
+
|
|
97
|
+
For a rule that must hold in more than one place: an all-or-none field contract, a canonical
|
|
98
|
+
format for a wire value, a validation rule, an admission or promotion check, or **a behavior the
|
|
99
|
+
diff changes** (a redirect target, a default, a guard). For a changed behavior, the places are
|
|
100
|
+
every existing test, caller, and doc that still relies on the old one: search for the old value
|
|
101
|
+
(the old URL, default, or message), not just the new code.
|
|
102
|
+
|
|
103
|
+
1. **Write the rule as one sentence**, in the form the code must satisfy.
|
|
104
|
+
2. **Search the whole tree, not just the diff,** for every place that must enforce it: producers,
|
|
105
|
+
serializers and exporters, validators, request-path guards, admission checks, the schema on the
|
|
106
|
+
far side of the wire, and the tests that pin each. The diff shows where the author enforced it;
|
|
107
|
+
the tree shows where it must be enforced.
|
|
108
|
+
3. **Record one row per place:** location, enforced or not, evidence.
|
|
109
|
+
4. **Report every unenforced place this round, as an open `paths` row of the rule's finding.**
|
|
110
|
+
Never "and similar issues may exist elsewhere": that is a sample dressed up as a sweep, and
|
|
111
|
+
each place you skip costs the caller another fix-and-review round.
|
|
112
|
+
|
|
113
|
+
When the code under review *is* the enforcement (a verifier, a gate, a checker), the places are the
|
|
114
|
+
checks inside it and the rule is almost always "fail closed on any drift". For each thing it
|
|
115
|
+
inspects, ask what value makes it pass when it should fail.
|
|
116
|
+
|
|
117
|
+
A serial test suite stops at its first failure, so a red run shows only the first stale place and
|
|
118
|
+
says nothing about the cases after it. Never read "one failure" as "one place": find the rest by
|
|
119
|
+
searching for the old value, not by rerunning the suite.
|
|
120
|
+
|
|
121
|
+
## The finding bar
|
|
122
|
+
|
|
123
|
+
Search hard; then report only what survives this bar.
|
|
124
|
+
|
|
125
|
+
- **Provable.** Every finding cites the diff hunk, and for a ripple effect the code it provably
|
|
126
|
+
breaks. Label any inference.
|
|
127
|
+
- **One finding per broken rule.** Say the rule, every open path in `paths`, and the one owner
|
|
128
|
+
that fixes it. Example: four places miss the generation check: one finding with four open
|
|
129
|
+
rows, not four findings and not one row.
|
|
130
|
+
- **The author would fix it.** Do not flag intended changes or rely on guesses about intent.
|
|
131
|
+
- **Rigor in proportion.** Hold the code to the bar the surrounding code already holds.
|
|
132
|
+
- **Few and strong.** Order by severity. If the change is safe, say so and report nothing.
|
|
133
|
+
|
|
134
|
+
Do not raise:
|
|
135
|
+
|
|
136
|
+
- a sibling divergence that is justified by a genuinely different case;
|
|
137
|
+
- an unanchored pattern whose inputs come from a closed, validated set;
|
|
138
|
+
- an "untested" branch already driven by an integration or E2E test, or whose failure is harmless;
|
|
139
|
+
- a fake of a real external boundary (third-party API, clock, email, randomness);
|
|
140
|
+
- a pre-existing issue the diff neither depends on nor worsens as a blocker (P2 at most);
|
|
141
|
+
- style the surrounding code does not hold either;
|
|
142
|
+
- cleanup, naming, smells, cosmetics, or an architecture opinion with no documented rule behind
|
|
143
|
+
it: that is P3, and P3 is never reported.
|
|
144
|
+
|
|
145
|
+
When unsure, lower the severity and say what you could not rule out. Never inflate a candidate that
|
|
146
|
+
trips one of these guards into a blocker: in the caller's loop every P0/P1 buys a full fix, review,
|
|
147
|
+
and CI round.
|