@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,189 @@
|
|
|
1
|
+
# Risk decision
|
|
2
|
+
|
|
3
|
+
After currency-amount-pair detection and same-descriptor baseline comparison,
|
|
4
|
+
assign investigation-priority risk tiers. This is prioritization, not a finding
|
|
5
|
+
that transaction laundering occurred.
|
|
6
|
+
|
|
7
|
+
## Eligibility versus risk
|
|
8
|
+
|
|
9
|
+
The cluster gate (at least three theoretical levels, fixed 2x adjacency, at
|
|
10
|
+
least 100 exact-member attempts) determines which currency-amount pairs enter
|
|
11
|
+
the result. Passing that gate does not by itself determine High, Medium, or Low
|
|
12
|
+
risk.
|
|
13
|
+
|
|
14
|
+
Risk uses independent post-membership evidence:
|
|
15
|
+
|
|
16
|
+
- structural strength beyond the minimum, such as a fourth or later level
|
|
17
|
+
- cluster share of its descriptor
|
|
18
|
+
- authorization-success and suspected-fraud differences versus the same-
|
|
19
|
+
descriptor baseline
|
|
20
|
+
- issuing-bank differences versus that baseline
|
|
21
|
+
- transaction-date and BIN-country-local-hour differences versus that baseline
|
|
22
|
+
- externally evidenced MCC or merchant-business mismatch; never infer this
|
|
23
|
+
from a suggestive descriptor name alone
|
|
24
|
+
- payment-pattern evidence from [streams.md](streams.md), treated as separate
|
|
25
|
+
observations with known coverage and inference limits: unexpected inferred
|
|
26
|
+
pricing currency, tested source-to-top-up rate stability, low repeat-card or
|
|
27
|
+
decline-retry activity, and concentrated dates/hours. Do not count a business
|
|
28
|
+
hypothesis itself or correlated measurements as independent corroboration.
|
|
29
|
+
|
|
30
|
+
Declare portfolio-specific thresholds for a materially different rate,
|
|
31
|
+
distribution, or descriptor share in the run methodology before assigning
|
|
32
|
+
risk. Do not invent universal cutoffs after seeing the results.
|
|
33
|
+
|
|
34
|
+
## BIN-country evidence
|
|
35
|
+
|
|
36
|
+
BIN country is post-membership evidence, not a partition, membership key, or
|
|
37
|
+
veto. Pattern inference can use country to propose pricing currencies but
|
|
38
|
+
cannot filter canonical members. Measure any canonical single-country
|
|
39
|
+
concentration on the complete descriptor/currency/amount membership, never
|
|
40
|
+
on a country-selected pattern slice as independent risk evidence. `Mixed` is neutral and must never reduce a risk tier by itself.
|
|
41
|
+
|
|
42
|
+
For every Top 3 cluster BIN country, report both conditional views:
|
|
43
|
+
|
|
44
|
+
```text
|
|
45
|
+
cluster composition = cluster attempts in country / all cluster attempts
|
|
46
|
+
country-slice coverage = cluster attempts in country /
|
|
47
|
+
all attempts in the same descriptor and country
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
An exact **100% single-BIN-country cluster** is a standout characteristic in the canonical original-currency run. In the BIN-country base-currency sensitivity, BIN country constructs the target currency and is therefore not independent evidence; report 100% concentration descriptively but do not use it to raise the FX risk tier.
|
|
51
|
+
Country-slice coverage explains how large that concentration is inside the
|
|
52
|
+
descriptor-country population, but it has no fixed threshold and contributes
|
|
53
|
+
no independent risk points. Values such as 20% or 33.8% are descriptive, not
|
|
54
|
+
self-interpreting risk signals. Any value below 100% is not promoted merely
|
|
55
|
+
because it is numerically high.
|
|
56
|
+
|
|
57
|
+
## Risk tiers
|
|
58
|
+
|
|
59
|
+
Assign exactly one tier to every identified currency-amount pair:
|
|
60
|
+
|
|
61
|
+
| Tier | Use when |
|
|
62
|
+
|---|---|
|
|
63
|
+
| High | In the canonical run, an exact 100% single-country standout has at least one independent corroborating risk characteristic, or several independently strong non-country characteristics converge; FX concentration cannot raise tier |
|
|
64
|
+
| Medium | At least two independent characteristics materially differ from the same-descriptor baseline, but High is not justified |
|
|
65
|
+
| Low | The structural cluster gate is met, but observed corroborating evidence is limited or not material |
|
|
66
|
+
|
|
67
|
+
Do not use a generic 0–100 score unless the business has approved and calibrated
|
|
68
|
+
its weights and cutoffs. Missing fields reduce confidence and must be disclosed;
|
|
69
|
+
they are not evidence that risk is Low.
|
|
70
|
+
|
|
71
|
+
Sort report results `High → Medium → Low`. Within a tier, sort by the number and
|
|
72
|
+
magnitude of independently supported characteristics, then by exact-member
|
|
73
|
+
attempts. Preserve stable cluster IDs when sorting an existing result.
|
|
74
|
+
|
|
75
|
+
## Reader-facing conclusion
|
|
76
|
+
|
|
77
|
+
Write for a payment-risk operator, not the detector's implementer. The reader
|
|
78
|
+
must understand who to review first, why, what remains unknown, and what to
|
|
79
|
+
check next without opening the methodology or decoding cluster IDs.
|
|
80
|
+
|
|
81
|
+
Begin each main report with one short decision summary, followed by Main
|
|
82
|
+
findings and Next checks. Do not repeat a closing Verdict. Keep exhaustive
|
|
83
|
+
cluster profiles and exposure tables in linked evidence. Use the same
|
|
84
|
+
evidence-first approach in the final chat handoff.
|
|
85
|
+
|
|
86
|
+
The summary is at most three short sentences, each with one main point.
|
|
87
|
+
Prioritize evidence, not descriptor volume alone; if no defensible priority
|
|
88
|
+
exists, say so instead of forcing a target. Pattern labels are hypotheses:
|
|
89
|
+
|
|
90
|
+
1. Name the first investigation target and the relevant time window; state
|
|
91
|
+
the highest detected-cluster tier when one exists. Use the exact descriptor
|
|
92
|
+
to locate the activity, not as proof of a verified merchant identity.
|
|
93
|
+
2. Give the strongest observed reason in plain language, using only one or
|
|
94
|
+
two essential figures. Explain why that observation warrants review.
|
|
95
|
+
3. State what the data cannot establish, including that investigation priority
|
|
96
|
+
is not confirmation of transaction laundering.
|
|
97
|
+
|
|
98
|
+
The three-sentence limit applies to the summary, not the entire report.
|
|
99
|
+
For a Chinese summary, keep each sentence within 80 characters and use at
|
|
100
|
+
most two numerical facts across the whole summary, excluding its date window
|
|
101
|
+
and identifiers. Move amounts, percentages,
|
|
102
|
+
source/target currencies, thresholds, and technical labels to the explanation
|
|
103
|
+
unless essential to the immediate business takeaway. Do not join many clauses
|
|
104
|
+
with semicolons to squeeze a data inventory into it. Keep full anchor lists,
|
|
105
|
+
cluster IDs, and by-tier exposure in supporting tables.
|
|
106
|
+
|
|
107
|
+
Preserve the supplied fact scope: bind every figure to its stated descriptor,
|
|
108
|
+
period, numerator, denominator, and metric. If any is missing, mark it unknown;
|
|
109
|
+
do not resolve ambiguity by borrowing a nearby period or population. Never
|
|
110
|
+
translate an authorization decline as a chargeback (`拒付`). Small samples
|
|
111
|
+
limit generalization; their observed rates still describe those samples and
|
|
112
|
+
must not be dismissed as meaningless. `Other pattern` can mean insufficient
|
|
113
|
+
evidence: do not assert that a menu or e-commerce test failed, or that fields
|
|
114
|
+
are missing, unless the run actually records that reason.
|
|
115
|
+
|
|
116
|
+
### Supporting explanation
|
|
117
|
+
|
|
118
|
+
Use Main findings and Next checks for the supporting explanation. Within each
|
|
119
|
+
finding, present observed evidence first, then the supported pattern hypothesis
|
|
120
|
+
and uncertainty, then its relationship to formal amount clusters. Only give
|
|
121
|
+
intersection counts supported by saved row-level reconciliation. A preset menu
|
|
122
|
+
can contain non-doubling prices; the three-level, fixed-2x, 100-attempt gate
|
|
123
|
+
belongs to formal clusters, not to every top-up hypothesis.
|
|
124
|
+
|
|
125
|
+
Use short subsections or bullets as needed:
|
|
126
|
+
|
|
127
|
+
- **Who and why:** pair each prioritized descriptor's concrete observation
|
|
128
|
+
with its business meaning and an unresolved question. Different amount or
|
|
129
|
+
card-country patterns can justify checking whether several businesses share
|
|
130
|
+
a billing name; they do not prove that they do.
|
|
131
|
+
- **What detection found:** report qualifying clusters and exact-member exposure
|
|
132
|
+
by tier with explicit denominators, or zero qualifying clusters and zero
|
|
133
|
+
identified-cluster exposure. Explain the tested pattern in ordinary words:
|
|
134
|
+
repeated amounts with a fixed doubling relationship and sufficient attempts.
|
|
135
|
+
Explain stream observations separately; the exact-amount test is not the
|
|
136
|
+
whole analysis.
|
|
137
|
+
- **What to check next:** name specific observed orders or activity to reconcile
|
|
138
|
+
with products, websites, actual sellers, or fulfillment records. These are
|
|
139
|
+
bounded evidence-gathering suggestions, not findings or enforcement commands.
|
|
140
|
+
Do not claim those records were inspected when they were not.
|
|
141
|
+
|
|
142
|
+
Use only evidence already established in the report. If evidence cannot support
|
|
143
|
+
prioritizing a target or naming a useful follow-up, say so rather than inventing
|
|
144
|
+
one. Do not recommend filing a SAR, terminating a merchant, or correcting an MCC.
|
|
145
|
+
|
|
146
|
+
### No qualifying cluster and period focus
|
|
147
|
+
|
|
148
|
+
No qualifying cluster means the tested pattern did not meet this run's gates,
|
|
149
|
+
not that the merchant is safe or all suspicious activity was excluded. State
|
|
150
|
+
this plainly, especially below 100 attempts. Keep descriptor-level investigation
|
|
151
|
+
leads separate from formal cluster tiers and cluster exposure; do not assign
|
|
152
|
+
a High/Medium/Low cluster tier to an unqualified lead. Missing fields and small
|
|
153
|
+
samples constrain interpretation; they are not evidence of Low risk.
|
|
154
|
+
Do not reclassify e-commerce or other-pattern rows as top-ups merely by obtaining
|
|
155
|
+
their charge currency. Direct versus FX-converted is a subtype distinction only
|
|
156
|
+
after a supported preset-menu hypothesis exists for those rows.
|
|
157
|
+
|
|
158
|
+
For a month or active-merchant focus, lead with activity observed in that window.
|
|
159
|
+
Separate historical findings, historical members' current-period slices, and
|
|
160
|
+
independent current-period detection. No observed activity in the supplied files
|
|
161
|
+
does not prove a business stopped operating. Never carry historical tier or
|
|
162
|
+
exposure into the current period without current-period evidence. Keep canonical
|
|
163
|
+
and FX findings separate.
|
|
164
|
+
|
|
165
|
+
### Chinese readability
|
|
166
|
+
|
|
167
|
+
Introduce a descriptor as `账单名称`, retaining its exact value. Explain BIN
|
|
168
|
+
country as where the card was issued, not customer location. Explain suspected-
|
|
169
|
+
fraud rates as the share of authorization attempts declined with a suspected-
|
|
170
|
+
fraud response, not confirmed fraud. Define the baseline as the relevant remaining
|
|
171
|
+
attempts using the same-descriptor scope. A pattern-only comparison must be
|
|
172
|
+
labeled separately and cannot replace the canonical cluster baseline.
|
|
173
|
+
|
|
174
|
+
Do not use `敞口`, `精确成员`, `canonical`, `FXC*`, `menu-12 frozen`, or
|
|
175
|
+
`standout` as a substitute for explaining the conclusion. Keep technical labels
|
|
176
|
+
in supporting tables and methods. Explain the relevance of selected statistics;
|
|
177
|
+
keep hypotheses as questions, not facts.
|
|
178
|
+
|
|
179
|
+
Use the approved payment-pattern names from [terminology.md](terminology.md).
|
|
180
|
+
Direct/FX-converted top-up and e-commerce names remain hypotheses, not verified
|
|
181
|
+
business facts. Explain inferred top-up versus actual charge currencies; fixed
|
|
182
|
+
amounts are supplementary, not a separate business class.
|
|
183
|
+
|
|
184
|
+
Read back the conclusion without its tables. If who to review, why, and what
|
|
185
|
+
is unknown are still unclear, rewrite during `editorial-review`, before `polish-cn`.
|
|
186
|
+
Polishing cannot repair missing analytical explanation.
|
|
187
|
+
|
|
188
|
+
First use of TLD is “transaction laundering (TLD)”. Proofread with
|
|
189
|
+
[terminology.md](terminology.md).
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
# BIN-country base-currency FX sensitivity
|
|
2
|
+
|
|
3
|
+
Use this supplemental path when the user asks to convert transaction amounts
|
|
4
|
+
to the card-origin currency, or when daily FX drift may conceal fixed local-
|
|
5
|
+
currency anchors. Run it after canonical original-currency membership is
|
|
6
|
+
complete. It is sensitivity evidence, not a replacement clustering universe.
|
|
7
|
+
|
|
8
|
+
## Separation contract
|
|
9
|
+
|
|
10
|
+
- Reuse the canonical cleaned authorization rows and descriptor normalization.
|
|
11
|
+
- Keep canonical `C*` results unchanged.
|
|
12
|
+
- Name supplemental families `FXC1`, `FXC2`, ... and publish separate files
|
|
13
|
+
such as `<scope>_bin_base_currency_clusters.md` and
|
|
14
|
+
`<scope>_bin_base_currency_methodology.md`.
|
|
15
|
+
- Do not combine `C*` and `FXC*` attempts into one exposure total because the
|
|
16
|
+
same authorization may belong to both views.
|
|
17
|
+
|
|
18
|
+
## Target currency
|
|
19
|
+
|
|
20
|
+
Map normalized BIN country to the legal tender in effect on the transaction
|
|
21
|
+
date. Use the ISO 4217 Maintenance Agency's current and historic lists as the
|
|
22
|
+
preferred source for currency and minor unit, and record the complete run-
|
|
23
|
+
specific country-to-currency map and source.
|
|
24
|
+
Do not infer currency from language, descriptor, terminal country, shopper IP,
|
|
25
|
+
or transaction currency. For countries with several legal tenders or a
|
|
26
|
+
currency transition during the window, declare and justify the dated mapping;
|
|
27
|
+
exclude ambiguous rows rather than silently choosing one.
|
|
28
|
+
|
|
29
|
+
Missing BIN country remains in the canonical run but cannot be assigned a BIN-
|
|
30
|
+
origin currency. Count it as an FX exclusion under
|
|
31
|
+
`missing country-currency mapping`.
|
|
32
|
+
|
|
33
|
+
## Frankfurter v2 rates and cache contract
|
|
34
|
+
|
|
35
|
+
Frankfurter v2 is mandatory for this sensitivity. Its public API requires no
|
|
36
|
+
API key or other authentication. Before retrieval, choose and disclose either
|
|
37
|
+
`default blended` or one or more named provider keys. The default blend is a
|
|
38
|
+
real provider-selection decision: omit the `providers` filter from the URL and
|
|
39
|
+
state that Frankfurter blended all eligible providers. For a named selection,
|
|
40
|
+
append `&providers=<comma-separated-provider-keys>` and record those exact
|
|
41
|
+
filter keys. In both modes, `expand=providers` is mandatory so the response
|
|
42
|
+
identifies the providers that actually contributed to each non-peg row.
|
|
43
|
+
|
|
44
|
+
Every request uses this exact endpoint and includes all five required query
|
|
45
|
+
parameters, even for a one-day window. A named-provider request also includes
|
|
46
|
+
the optional `providers` filter:
|
|
47
|
+
|
|
48
|
+
```text
|
|
49
|
+
GET https://api.frankfurter.dev/v2/rates?from=<YYYY-MM-DD>&to=<YYYY-MM-DD>&base=<P>"es=<comma-separated-currencies>&expand=providers
|
|
50
|
+
GET https://api.frankfurter.dev/v2/rates?from=<YYYY-MM-DD>&to=<YYYY-MM-DD>&base=<P>"es=<comma-separated-currencies>&expand=providers&providers=<comma-separated-provider-keys>
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
`from` and `to` are the inclusive UTC transaction-date bounds, `base` is the
|
|
54
|
+
declared pivot currency `P`, and `quotes` is the sorted, deduplicated set of
|
|
55
|
+
source and target currencies needed by the run. `expand=providers` requests
|
|
56
|
+
row-level contributing-provider keys; it does not select a provider and does
|
|
57
|
+
not replace the optional `providers` filter. Do not use the v1 nested response,
|
|
58
|
+
`/latest`, or an implicit latest date. A returned row means that its `rate` is
|
|
59
|
+
quote-currency units per one unit of its `base` currency: with `base=P`,
|
|
60
|
+
`rate(d, P→Q)` is units of `Q` per one unit of pivot `P`.
|
|
61
|
+
|
|
62
|
+
Write the response to
|
|
63
|
+
`reports/tld-detection/<scope>_frankfurter_v2_rates.cache.json`. Create this
|
|
64
|
+
run-specific cache once, do not overwrite it, and record its SHA-256 in the
|
|
65
|
+
methodology. The cache schema is versioned and contains at least:
|
|
66
|
+
|
|
67
|
+
```json
|
|
68
|
+
{
|
|
69
|
+
"schema_version": 1,
|
|
70
|
+
"api": "Frankfurter",
|
|
71
|
+
"api_version": "v2",
|
|
72
|
+
"endpoint": "https://api.frankfurter.dev/v2/rates",
|
|
73
|
+
"cache_created_at_utc": "<ISO-8601 UTC timestamp ending Z>",
|
|
74
|
+
"requests": [
|
|
75
|
+
{
|
|
76
|
+
"request_url": "<complete run-specific request URL>",
|
|
77
|
+
"retrieved_at_utc": "<ISO-8601 UTC timestamp ending Z>",
|
|
78
|
+
"provider_selection": {"mode": "default blended", "providers": []},
|
|
79
|
+
"query": {"from": "<date>", "to": "<date>", "base": "<P>", "quotes": ["<Q>"], "expand": ["providers"]},
|
|
80
|
+
"returned_facts": [
|
|
81
|
+
{"date": "<date>", "base": "<P>", "quote": "<Q>", "rate": "<positive decimal>", "providers": ["<contributing-provider-key>"]}
|
|
82
|
+
]
|
|
83
|
+
}
|
|
84
|
+
]
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Preserve every returned `date`, `base`, `quote`, and unrounded `rate` fact and,
|
|
89
|
+
when Frankfurter returns it, the complete `providers` key array exactly as
|
|
90
|
+
returned. An omitted `providers` member means Frankfurter marked that fact as
|
|
91
|
+
peg-derived; it is not unknown provenance. Preserve the omission rather than
|
|
92
|
+
writing `[]`, `null`, a guessed provider, or the request's selected providers.
|
|
93
|
+
For named-provider requests, `provider_selection` and the optional URL/query
|
|
94
|
+
filter record what was requested; add `"providers": ["<provider-key>"]` to the
|
|
95
|
+
cached `query`. Each fact's `providers` array records which of those providers
|
|
96
|
+
actually contributed; peg-derived facts still omit the member. The methodology
|
|
97
|
+
repeats the cache path, complete request URL or
|
|
98
|
+
URLs, UTC retrieval timestamp or timestamps, provider selection, query
|
|
99
|
+
bounds/pivot/quotes/expansion, row-level provider identities and peg-derived
|
|
100
|
+
omissions, schema version, and cache SHA-256. Never rely on a later live refetch
|
|
101
|
+
to reproduce a run.
|
|
102
|
+
|
|
103
|
+
Fail closed before conversion when the cache is missing; `schema_version` is
|
|
104
|
+
missing or unsupported; a legacy/v1 cache is supplied; required metadata or a
|
|
105
|
+
`date`/`base`/`quote`/`rate` fact is absent; the endpoint, complete URL, parsed
|
|
106
|
+
query (including `expand=providers` and any provider filter), provider
|
|
107
|
+
selection, retrieval timestamp, requested window, pivot, or quotes do not match
|
|
108
|
+
the run; a present fact-level `providers` member is not an array of provider
|
|
109
|
+
keys; a returned provider key was not preserved; a rate is non-positive; or
|
|
110
|
+
duplicate facts conflict. Do not repair a cache mismatch by refetching during
|
|
111
|
+
analysis and do not treat an invalid cache as ordinary row-level FX exclusions.
|
|
112
|
+
|
|
113
|
+
## Conversion
|
|
114
|
+
|
|
115
|
+
For each authorization on UTC transaction date `d`, with source currency `S`,
|
|
116
|
+
target BIN-origin currency `T`, source amount `a`, and API quotes expressed as
|
|
117
|
+
currency units per pivot currency `P`:
|
|
118
|
+
|
|
119
|
+
```text
|
|
120
|
+
base_amount = a / rate(d, P→S) × rate(d, P→T)
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Use `1` when `S = P` or `T = P`. If either required non-identity quote has no
|
|
124
|
+
returned fact whose `date` is exactly `d`, exclude that authorization. Never
|
|
125
|
+
fill weekends or missing dates with a prior-business-day, monthly average,
|
|
126
|
+
latest, or next-day rate.
|
|
127
|
+
|
|
128
|
+
Count exclusions by reason, date, and currency. Report:
|
|
129
|
+
|
|
130
|
+
```text
|
|
131
|
+
canonical cleaned attempts → exact-date converted attempts → FX exclusions
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## Converted partition universe
|
|
135
|
+
|
|
136
|
+
For each frozen canonical descriptor partition `D`, define:
|
|
137
|
+
|
|
138
|
+
```text
|
|
139
|
+
P_FX(D) = authorization attempts in D successfully converted using exact-date
|
|
140
|
+
Frankfurter v2 facts under the validated cache contract
|
|
141
|
+
|P_FX| = the attempt count of P_FX(D) for the current descriptor partition
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
Identity legs valued at `1` remain exact-date conversions; every non-identity
|
|
145
|
+
leg must have the matching returned date/base/quote/rate fact. Rows excluded
|
|
146
|
+
for mapping, quote, or conversion reasons are not in `P_FX`.
|
|
147
|
+
|
|
148
|
+
Compute FX candidate counts and both FX thresholds only from `P_FX` in the
|
|
149
|
+
current descriptor:
|
|
150
|
+
|
|
151
|
+
| Set | FX membership |
|
|
152
|
+
|---|---|
|
|
153
|
+
| High-count (seeds) | union of (a) FX pairs with count ≥ `max(30, 0.5% of \|P_FX\|)`, (b) the `P_FX` partition top 25 FX pairs by count, and (c) per target currency in `P_FX`, the top 10 FX pairs with count ≥30 |
|
|
154
|
+
| Rung pool | FX pairs with count ≥ `max(5, 0.1% of \|P_FX\|)` |
|
|
155
|
+
|
|
156
|
+
State the resulting thresholds per descriptor. FX-excluded rows never enter
|
|
157
|
+
these denominators, rankings, rung pools, families, baselines, or cluster
|
|
158
|
+
metrics. They remain only in exclusion coverage and reconciliation back to
|
|
159
|
+
canonical `U`:
|
|
160
|
+
|
|
161
|
+
```text
|
|
162
|
+
|U_D| = |P_FX(D)| + |FX exclusions in D|
|
|
163
|
+
|U| = sum_D |P_FX(D)| + all FX exclusions
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
## Rounding and keys
|
|
167
|
+
|
|
168
|
+
Round converted values once, half-up, to the target currency's ISO 4217 minor
|
|
169
|
+
unit in effect on the transaction date. Record the exponent table actually
|
|
170
|
+
used. Do not round rates before conversion.
|
|
171
|
+
|
|
172
|
+
Inside each frozen descriptor partition, define the supplemental key as:
|
|
173
|
+
|
|
174
|
+
```text
|
|
175
|
+
(target BIN-origin currency, rounded base_amount)
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
Apply the fixed 2x, three-level, multi-anchor support, disjointness, and ≥100
|
|
179
|
+
exact-member gates as the canonical detector after applying the `P_FX`-only
|
|
180
|
+
high-count and rung-pool thresholds above. Final FX membership is exact
|
|
181
|
+
equality on descriptor, target currency, and rounded base amount; tolerance is
|
|
182
|
+
discovery-only.
|
|
183
|
+
|
|
184
|
+
Scale absolute residual caps in target-currency minor units. A defensible
|
|
185
|
+
starting sensitivity grid is 1, 2, and 5 minor units, retaining the smallest
|
|
186
|
+
cap under which material paths are stable. Report currency-specific cluster
|
|
187
|
+
counts and covered attempts; do not repeat the portfolio-wide total on every
|
|
188
|
+
currency row.
|
|
189
|
+
|
|
190
|
+
## Baseline, risk, and reporting
|
|
191
|
+
|
|
192
|
+
For each `FXC*` family, the comparison baseline uses only `P_FX` for the same
|
|
193
|
+
frozen canonical descriptor and removes that family's exact FX keys. FX-
|
|
194
|
+
excluded rows cannot enter the same-descriptor baseline. Show exposure against
|
|
195
|
+
both the converted universe and all canonical cleaned authorization attempts.
|
|
196
|
+
Reconcile identified FX attempts + converted baseline + FX exclusions to the
|
|
197
|
+
canonical cleaned universe.
|
|
198
|
+
|
|
199
|
+
BIN country causally determines target currency in this view. Therefore:
|
|
200
|
+
|
|
201
|
+
- show BIN-country composition and descriptor-country slice coverage;
|
|
202
|
+
- caption exact 100% single-country concentration as descriptive and
|
|
203
|
+
constructed by the target-currency mapping;
|
|
204
|
+
- do not count country concentration as independent risk evidence;
|
|
205
|
+
- do not raise the FX tier because of country concentration;
|
|
206
|
+
- assign High/Medium/Low using only structural and other independent
|
|
207
|
+
`P_FX` same-descriptor characteristics.
|
|
208
|
+
|
|
209
|
+
Use the three-section main report, complete linked evidence, and methodology
|
|
210
|
+
layout in [report-template.md](report-template.md), with separate FX filenames
|
|
211
|
+
and revision-qualified paths. Put the consolidated per-cluster table in FX
|
|
212
|
+
evidence, not the concise main report.
|
|
213
|
+
Keep the anchor table and BIN-country attribution table separate because they
|
|
214
|
+
are one-to-many detail, not duplicate cluster facts. Include the same four
|
|
215
|
+
charts as the canonical report and label converted anchors with their target
|
|
216
|
+
base currency.
|
|
217
|
+
|
|
218
|
+
## FX audit checklist
|
|
219
|
+
|
|
220
|
+
- [ ] Canonical cleaned universe and `C*` results were frozen first
|
|
221
|
+
- [ ] As-of-date country-to-legal-tender mapping and minor units are recorded
|
|
222
|
+
- [ ] Frankfurter `/v2/rates` uses explicit `from`, `to`, `base`, `quotes`, and `expand=providers`; authentication is not required
|
|
223
|
+
- [ ] Provider selection/default blend, complete request URL, UTC retrieval time, returned facts with contributing provider keys or documented peg-derived omission, cache path/SHA-256, and supported cache schema version are recorded
|
|
224
|
+
- [ ] Missing, mismatched, incomplete, or legacy cache facts fail closed before conversion
|
|
225
|
+
- [ ] Formula supports non-pivot source currencies
|
|
226
|
+
- [ ] Exact-date no-fill coverage and every exclusion are reconciled
|
|
227
|
+
- [ ] Per descriptor, `|P_FX|` is only exact-date-converted attempts; thresholds and same-descriptor baselines use only `P_FX`
|
|
228
|
+
- [ ] `FXC*` membership uses exact descriptor + target currency + rounded amount
|
|
229
|
+
- [ ] Caps and sensitivity are expressed per currency in minor units
|
|
230
|
+
- [ ] Country concentration is descriptive and excluded from FX risk evidence
|
|
231
|
+
- [ ] Converted and all-authorization exposure denominators are both shown
|
|
232
|
+
- [ ] `C*` and `FXC*` exposure are never added together
|