@1aboveio/skills 0.0.0-stage → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (633) hide show
  1. package/README.md +30 -2
  2. package/bin/cli.mjs +14 -0
  3. package/bin/select-core.mjs +172 -0
  4. package/package.json +146 -4
  5. package/skills/app-dev/airflow/LICENSE +3 -0
  6. package/skills/app-dev/airflow/SKILL.md +199 -0
  7. package/skills/app-dev/airflow/release-check.mjs +93 -0
  8. package/skills/app-dev/android-foundation/LICENSE +3 -0
  9. package/skills/app-dev/android-foundation/SKILL.md +192 -0
  10. package/skills/app-dev/android-foundation/assets/android-ci-job.yml +217 -0
  11. package/skills/app-dev/android-foundation/references/ci.md +87 -0
  12. package/skills/app-dev/android-foundation/references/gotchas.md +221 -0
  13. package/skills/app-dev/android-foundation/references/setup.md +164 -0
  14. package/skills/app-dev/android-foundation/release-check.mjs +93 -0
  15. package/skills/app-dev/android-foundation/scripts/device-run.sh +176 -0
  16. package/skills/app-dev/android-foundation/scripts/device-run.test.mjs +172 -0
  17. package/skills/app-dev/app-debug/LICENSE +3 -0
  18. package/skills/app-dev/app-debug/SKILL.md +110 -0
  19. package/skills/app-dev/app-debug/references/common-errors.md +128 -0
  20. package/skills/app-dev/app-debug/release-check.mjs +93 -0
  21. package/skills/app-dev/better-auth/LICENSE +3 -0
  22. package/skills/app-dev/better-auth/SKILL.md +598 -0
  23. package/skills/app-dev/better-auth/references/feishu-api.md +270 -0
  24. package/skills/app-dev/better-auth/release-check.mjs +93 -0
  25. package/skills/app-dev/data-catalog/LICENSE +3 -0
  26. package/skills/app-dev/data-catalog/SKILL.md +207 -0
  27. package/skills/app-dev/data-catalog/agents/openai.yaml +3 -0
  28. package/skills/app-dev/data-catalog/references/data-catalog-conventions.md +76 -0
  29. package/skills/app-dev/data-catalog/references/field-definitions.md +123 -0
  30. package/skills/app-dev/data-catalog/references/format.md +130 -0
  31. package/skills/app-dev/data-catalog/release-check.mjs +93 -0
  32. package/skills/app-dev/data-catalog/scripts/data-catalog.test.mjs +36 -0
  33. package/skills/app-dev/data-catalog/scripts/data_catalog.py +1435 -0
  34. package/skills/app-dev/data-catalog/scripts/persist-conventions-core.mjs +117 -0
  35. package/skills/app-dev/data-catalog/scripts/persist-conventions.mjs +17 -0
  36. package/skills/app-dev/data-catalog/scripts/test_data_catalog.py +603 -0
  37. package/skills/app-dev/ios-foundation/LICENSE +3 -0
  38. package/skills/app-dev/ios-foundation/SKILL.md +184 -0
  39. package/skills/app-dev/ios-foundation/references/setup.md +243 -0
  40. package/skills/app-dev/ios-foundation/release-check.mjs +93 -0
  41. package/skills/app-dev/monorepo/LICENSE +3 -0
  42. package/skills/app-dev/monorepo/SKILL.md +462 -0
  43. package/skills/app-dev/monorepo/release-check.mjs +93 -0
  44. package/skills/app-dev/nextjs-fullstack/LICENSE +3 -0
  45. package/skills/app-dev/nextjs-fullstack/SKILL.md +211 -0
  46. package/skills/app-dev/nextjs-fullstack/conventions.md +318 -0
  47. package/skills/app-dev/nextjs-fullstack/frontend-conventions.md +61 -0
  48. package/skills/app-dev/nextjs-fullstack/nextjs16.md +287 -0
  49. package/skills/app-dev/nextjs-fullstack/release-check.mjs +93 -0
  50. package/skills/app-dev/nextjs-fullstack/server-actions.md +409 -0
  51. package/skills/app-dev/prisma-setup/LICENSE +3 -0
  52. package/skills/app-dev/prisma-setup/SKILL.md +181 -0
  53. package/skills/app-dev/prisma-setup/nextjs.md +258 -0
  54. package/skills/app-dev/prisma-setup/release-check.mjs +93 -0
  55. package/skills/app-dev/prisma-setup/turborepo.md +301 -0
  56. package/skills/app-dev/pyspark/LICENSE +3 -0
  57. package/skills/app-dev/pyspark/SKILL.md +127 -0
  58. package/skills/app-dev/pyspark/assets/templates/etl.py +748 -0
  59. package/skills/app-dev/pyspark/assets/templates/utils/__init__.py +1 -0
  60. package/skills/app-dev/pyspark/assets/templates/utils/hudi_metadata.py +14 -0
  61. package/skills/app-dev/pyspark/references/diagnosis-and-profiling.md +169 -0
  62. package/skills/app-dev/pyspark/references/etl-contract.md +129 -0
  63. package/skills/app-dev/pyspark/references/production-validation.md +131 -0
  64. package/skills/app-dev/pyspark/references/reconciliation.md +38 -0
  65. package/skills/app-dev/pyspark/references/transformation-design.md +190 -0
  66. package/skills/app-dev/pyspark/references/velocity-feature-calculation.md +193 -0
  67. package/skills/app-dev/pyspark/release-check.mjs +93 -0
  68. package/skills/app-dev/pyspark/scripts/spark_eventlog_summary.py +223 -0
  69. package/skills/app-dev/python-backend/LICENSE +3 -0
  70. package/skills/app-dev/python-backend/SKILL.md +325 -0
  71. package/skills/app-dev/python-backend/assets/uv-install.sh +48 -0
  72. package/skills/app-dev/python-backend/references/uv-installs.md +83 -0
  73. package/skills/app-dev/python-backend/release-check.mjs +93 -0
  74. package/skills/app-dev/shadcn/LICENSE +3 -0
  75. package/skills/app-dev/shadcn/SKILL.md +120 -0
  76. package/skills/app-dev/shadcn/assets/shadcn-small.png +0 -0
  77. package/skills/app-dev/shadcn/assets/shadcn.png +0 -0
  78. package/skills/app-dev/shadcn/cli.md +411 -0
  79. package/skills/app-dev/shadcn/customization.md +224 -0
  80. package/skills/app-dev/shadcn/mcp.md +101 -0
  81. package/skills/app-dev/shadcn/release-check.mjs +93 -0
  82. package/skills/app-dev/shadcn/rules/base-vs-radix.md +323 -0
  83. package/skills/app-dev/shadcn/rules/component-selection.md +67 -0
  84. package/skills/app-dev/shadcn/rules/composition.md +195 -0
  85. package/skills/app-dev/shadcn/rules/data-table.md +201 -0
  86. package/skills/app-dev/shadcn/rules/forms.md +255 -0
  87. package/skills/app-dev/shadcn/rules/icons.md +103 -0
  88. package/skills/app-dev/shadcn/rules/styling.md +167 -0
  89. package/skills/app-dev/zod-v4/LICENSE +3 -0
  90. package/skills/app-dev/zod-v4/SKILL.md +286 -0
  91. package/skills/app-dev/zod-v4/release-check.mjs +93 -0
  92. package/skills/cicd/cloud-build/LICENSE +3 -0
  93. package/skills/cicd/cloud-build/SKILL.md +707 -0
  94. package/skills/cicd/cloud-build/release-check.mjs +93 -0
  95. package/skills/cicd/cloud-debug/LICENSE +3 -0
  96. package/skills/cicd/cloud-debug/SKILL.md +315 -0
  97. package/skills/cicd/cloud-debug/references/build-failures.md +238 -0
  98. package/skills/cicd/cloud-debug/references/deploy-failures.md +376 -0
  99. package/skills/cicd/cloud-debug/references/pipeline-failures.md +378 -0
  100. package/skills/cicd/cloud-debug/release-check.mjs +93 -0
  101. package/skills/cicd/cloud-deploy/LICENSE +3 -0
  102. package/skills/cicd/cloud-deploy/SKILL.md +230 -0
  103. package/skills/cicd/cloud-deploy/references/config-templates.md +257 -0
  104. package/skills/cicd/cloud-deploy/release-check.mjs +93 -0
  105. package/skills/cicd/docker/LICENSE +3 -0
  106. package/skills/cicd/docker/SKILL.md +151 -0
  107. package/skills/cicd/docker/release-check.mjs +93 -0
  108. package/skills/cicd/github-actions/LICENSE +3 -0
  109. package/skills/cicd/github-actions/SKILL.md +111 -0
  110. package/skills/cicd/github-actions/references/audit-profile-optimize.md +150 -0
  111. package/skills/cicd/github-actions/references/ci-case-studies.md +141 -0
  112. package/skills/cicd/github-actions/references/conditional-ci.md +214 -0
  113. package/skills/cicd/github-actions/references/debugging.md +13 -0
  114. package/skills/cicd/github-actions/references/pipeline.md +87 -0
  115. package/skills/cicd/github-actions/references/post-deploy-and-publishing.md +33 -0
  116. package/skills/cicd/github-actions/references/runners.md +253 -0
  117. package/skills/cicd/github-actions/references/security.md +29 -0
  118. package/skills/cicd/github-actions/references/speed-and-audit.md +115 -0
  119. package/skills/cicd/github-actions/references/two-pass-reading.md +92 -0
  120. package/skills/cicd/github-actions/release-check.mjs +93 -0
  121. package/skills/cicd/github-actions/scripts/ci-run-audit-core.mjs +612 -0
  122. package/skills/cicd/github-actions/scripts/ci-run-audit.mjs +4 -0
  123. package/skills/cicd/github-actions/scripts/ci-run-audit.test.mjs +637 -0
  124. package/skills/cicd/github-flow/LICENSE +3 -0
  125. package/skills/cicd/github-flow/SKILL.md +123 -0
  126. package/skills/cicd/github-flow/references/ci-conventions.md +14 -0
  127. package/skills/cicd/github-flow/release-check.mjs +93 -0
  128. package/skills/cicd/github-flow/scripts/flow-core.mjs +105 -0
  129. package/skills/cicd/github-flow/scripts/flow.mjs +81 -0
  130. package/skills/cicd/github-flow/scripts/flow.test.mjs +114 -0
  131. package/skills/cicd/github-flow/scripts/persist-conventions-core.mjs +117 -0
  132. package/skills/cicd/github-flow/scripts/persist-conventions.mjs +49 -0
  133. package/skills/cicd/github-flow/scripts/persist-conventions.test.mjs +108 -0
  134. package/skills/cicd/google-cloud/LICENSE +3 -0
  135. package/skills/cicd/google-cloud/SKILL.md +119 -0
  136. package/skills/cicd/google-cloud/references/gcs.md +469 -0
  137. package/skills/cicd/google-cloud/references/iam.md +451 -0
  138. package/skills/cicd/google-cloud/references/project.md +349 -0
  139. package/skills/cicd/google-cloud/references/secrets.md +336 -0
  140. package/skills/cicd/google-cloud/references/vpc.md +312 -0
  141. package/skills/cicd/google-cloud/release-check.mjs +93 -0
  142. package/skills/cicd/google-cloud/scripts/create-sa.sh +36 -0
  143. package/skills/cicd/google-cloud/scripts/gcp-config.sh +31 -0
  144. package/skills/cicd/google-cloud/scripts/grant-iap.sh +41 -0
  145. package/skills/cicd/google-cloud/scripts/setup-secrets.sh +48 -0
  146. package/skills/cicd/mergify/LICENSE +3 -0
  147. package/skills/cicd/mergify/SKILL.md +102 -0
  148. package/skills/cicd/mergify/assets/templates/mergify.yml +215 -0
  149. package/skills/cicd/mergify/assets/templates/ruleset.json +46 -0
  150. package/skills/cicd/mergify/references/branch-protection.md +282 -0
  151. package/skills/cicd/mergify/references/configuration.md +274 -0
  152. package/skills/cicd/mergify/references/diagnosis.md +109 -0
  153. package/skills/cicd/mergify/references/stacks.md +84 -0
  154. package/skills/cicd/mergify/references/traps.md +119 -0
  155. package/skills/cicd/mergify/references/watch-contract.md +274 -0
  156. package/skills/cicd/mergify/release-check.mjs +93 -0
  157. package/skills/cicd/mergify/scripts/audit-core.mjs +208 -0
  158. package/skills/cicd/mergify/scripts/audit.mjs +4 -0
  159. package/skills/cicd/mergify/scripts/audit.test.mjs +201 -0
  160. package/skills/cicd/mergify/scripts/entrypoints.test.mjs +106 -0
  161. package/skills/cicd/mergify/scripts/pr-620-mergify-comments.fixture.json +30 -0
  162. package/skills/cicd/mergify/scripts/stack-push-core.mjs +258 -0
  163. package/skills/cicd/mergify/scripts/stack-push.mjs +4 -0
  164. package/skills/cicd/mergify/scripts/stack-push.test.mjs +233 -0
  165. package/skills/cicd/mergify/scripts/watch-pr-delivery-core.mjs +1065 -0
  166. package/skills/cicd/mergify/scripts/watch-pr-delivery.mjs +4 -0
  167. package/skills/cicd/mergify/scripts/watch-pr-delivery.test.mjs +1826 -0
  168. package/skills/cicd/podman/LICENSE +3 -0
  169. package/skills/cicd/podman/SKILL.md +71 -0
  170. package/skills/cicd/podman/agents/openai.yaml +4 -0
  171. package/skills/cicd/podman/assets/templates/podman-compose-socket-directory.yml +6 -0
  172. package/skills/cicd/podman/assets/templates/podman-service-override.conf +3 -0
  173. package/skills/cicd/podman/references/compose-compatibility.md +70 -0
  174. package/skills/cicd/podman/references/networking-and-ports.md +74 -0
  175. package/skills/cicd/podman/references/rootless-services-and-sockets.md +156 -0
  176. package/skills/cicd/podman/references/troubleshooting.md +98 -0
  177. package/skills/cicd/podman/release-check.mjs +93 -0
  178. package/skills/content/article-review/LICENSE +3 -0
  179. package/skills/content/article-review/SKILL.md +66 -0
  180. package/skills/content/article-review/references/report-format.md +68 -0
  181. package/skills/content/article-review/references/template-guide.md +79 -0
  182. package/skills/content/article-review/references/template-wechat-payments.md +125 -0
  183. package/skills/content/article-review/release-check.mjs +93 -0
  184. package/skills/content/article-to-image/LICENSE +3 -0
  185. package/skills/content/article-to-image/SKILL.md +91 -0
  186. package/skills/content/article-to-image/references/formats.md +53 -0
  187. package/skills/content/article-to-image/release-check.mjs +93 -0
  188. package/skills/content/flowchart-svg/LICENSE +3 -0
  189. package/skills/content/flowchart-svg/SKILL.md +43 -0
  190. package/skills/content/flowchart-svg/release-check.mjs +93 -0
  191. package/skills/content/flowchart-svg/scripts/export_png.sh +8 -0
  192. package/skills/content/image-gen/LICENSE +3 -0
  193. package/skills/content/image-gen/SKILL.md +192 -0
  194. package/skills/content/image-gen/release-check.mjs +93 -0
  195. package/skills/content/image-gen/scripts/credentials.mjs +217 -0
  196. package/skills/content/image-gen/scripts/credentials.test.mjs +212 -0
  197. package/skills/content/image-gen/scripts/generate.mjs +240 -0
  198. package/skills/content/image-gen/scripts/options.mjs +293 -0
  199. package/skills/content/image-gen/scripts/options.test.mjs +245 -0
  200. package/skills/content/mermaid/LICENSE +3 -0
  201. package/skills/content/mermaid/SKILL.md +635 -0
  202. package/skills/content/mermaid/release-check.mjs +93 -0
  203. package/skills/content/wechat-article-writer/LICENSE +3 -0
  204. package/skills/content/wechat-article-writer/SKILL.md +92 -0
  205. package/skills/content/wechat-article-writer/references/style-selector.md +133 -0
  206. package/skills/content/wechat-article-writer/references/writing-rules.md +152 -0
  207. package/skills/content/wechat-article-writer/release-check.mjs +93 -0
  208. package/skills/content/wechat-article-writer/templates/wechat-comparison.md +52 -0
  209. package/skills/content/wechat-article-writer/templates/wechat-howto.md +51 -0
  210. package/skills/content/wechat-article-writer/templates/wechat-insight.md +50 -0
  211. package/skills/content/wechat-article-writer/templates/wechat-pitfall.md +52 -0
  212. package/skills/content/wechat-publisher/LICENSE +3 -0
  213. package/skills/content/wechat-publisher/SKILL.md +171 -0
  214. package/skills/content/wechat-publisher/references/api.md +105 -0
  215. package/skills/content/wechat-publisher/references/layout-rules.md +57 -0
  216. package/skills/content/wechat-publisher/references/wechat-safe-template.html +86 -0
  217. package/skills/content/wechat-publisher/release-check.mjs +93 -0
  218. package/skills/content/wechat-publisher/scripts/md_to_wechat_html.py +194 -0
  219. package/skills/content/wechat-publisher/scripts/publish.py +239 -0
  220. package/skills/content/wechat-search/LICENSE +3 -0
  221. package/skills/content/wechat-search/SKILL.md +211 -0
  222. package/skills/content/wechat-search/release-check.mjs +93 -0
  223. package/skills/content/wechat-search/scripts/start-chrome.sh +83 -0
  224. package/skills/content/xai-search/LICENSE +3 -0
  225. package/skills/content/xai-search/SKILL.md +79 -0
  226. package/skills/content/xai-search/release-check.mjs +93 -0
  227. package/skills/content/xai-search/scripts/xai_search.sh +187 -0
  228. package/skills/content/xai-search/tests/smoke_test.sh +36 -0
  229. package/skills/core/distill-writing/LICENSE +3 -0
  230. package/skills/core/distill-writing/SKILL.md +74 -0
  231. package/skills/core/distill-writing/references/extraction.md +95 -0
  232. package/skills/core/distill-writing/references/updating.md +46 -0
  233. package/skills/core/distill-writing/release-check.mjs +93 -0
  234. package/skills/core/doc-to-md/LICENSE +3 -0
  235. package/skills/core/doc-to-md/SKILL.md +78 -0
  236. package/skills/core/doc-to-md/release-check.mjs +93 -0
  237. package/skills/core/doc-to-md/scripts/convert.py +157 -0
  238. package/skills/core/editorial-review/LICENSE +3 -0
  239. package/skills/core/editorial-review/SKILL.md +79 -0
  240. package/skills/core/editorial-review/references/checklist.md +94 -0
  241. package/skills/core/editorial-review/release-check.mjs +93 -0
  242. package/skills/core/house-style/LICENSE +3 -0
  243. package/skills/core/house-style/SKILL.md +33 -0
  244. package/skills/core/house-style/references/defaults.md +66 -0
  245. package/skills/core/house-style/references/rules.md +267 -0
  246. package/skills/core/house-style/references/sources.md +27 -0
  247. package/skills/core/house-style/references/style-en.md +131 -0
  248. package/skills/core/house-style/references/style-zh.md +141 -0
  249. package/skills/core/house-style/references/terminology-zh.md +223 -0
  250. package/skills/core/house-style/release-check.mjs +93 -0
  251. package/skills/core/house-style/templates/brd.md +103 -0
  252. package/skills/core/house-style/templates/commercial-proposal.md +93 -0
  253. package/skills/core/house-style/templates/compliance-policy.md +109 -0
  254. package/skills/core/house-style/templates/gap-analysis.md +105 -0
  255. package/skills/core/house-style/templates/general.md +63 -0
  256. package/skills/core/house-style/templates/integration-guide.md +98 -0
  257. package/skills/core/house-style/templates/prd.md +81 -0
  258. package/skills/core/house-style/templates/risk-operations-procedure.md +94 -0
  259. package/skills/core/house-style/templates/technical-spec.md +96 -0
  260. package/skills/core/polish-cn/LICENSE +3 -0
  261. package/skills/core/polish-cn/SKILL.md +102 -0
  262. package/skills/core/polish-cn/references/brief.md +93 -0
  263. package/skills/core/polish-cn/references/models.md +76 -0
  264. package/skills/core/polish-cn/release-check.mjs +93 -0
  265. package/skills/core/polish-cn/scripts/polish-cn.test.mjs +244 -0
  266. package/skills/core/polish-cn/scripts/polish_blocks.py +489 -0
  267. package/skills/core/reg-parser/LICENSE +3 -0
  268. package/skills/core/reg-parser/SKILL.md +212 -0
  269. package/skills/core/reg-parser/references/checklist-schema.md +223 -0
  270. package/skills/core/reg-parser/references/checklists/hk-amlo-checklist.json +1306 -0
  271. package/skills/core/reg-parser/references/checklists/hk-amlo-checklist.md +469 -0
  272. package/skills/core/reg-parser/references/checklists/hk-fi-corporate-onboarding-cdd-checklist.json +634 -0
  273. package/skills/core/reg-parser/references/checklists/hk-fi-corporate-onboarding-cdd-checklist.md +233 -0
  274. package/skills/core/reg-parser/references/checklists/hk-mso-guideline-checklist.json +2194 -0
  275. package/skills/core/reg-parser/references/checklists/hk-mso-guideline-checklist.md +771 -0
  276. package/skills/core/reg-parser/references/checklists/kyc-aml-checklist.md +258 -0
  277. package/skills/core/reg-parser/references/checklists/visa-vars-checklist.md +1058 -0
  278. package/skills/core/reg-parser/references/mandates/hk-amlo-cap615.md +389 -0
  279. package/skills/core/reg-parser/references/mandates/visa-vars.md +205 -0
  280. package/skills/core/reg-parser/release-check.mjs +93 -0
  281. package/skills/core/reg-parser/scripts/compare_checklist.py +230 -0
  282. package/skills/core/reg-parser/scripts/dump_checklist.py +361 -0
  283. package/skills/core/reg-parser/scripts/preprocess-mandate.sh +187 -0
  284. package/skills/core/reg-parser/scripts/reg-parser.test.mjs +165 -0
  285. package/skills/core/reg-parser/scripts/test_quarantine.sh +105 -0
  286. package/skills/core/reg-parser/scripts/validate_checklist.py +563 -0
  287. package/skills/core/reg-parser/scripts/validate_mandate.py +273 -0
  288. package/skills/core/terminology/LICENSE +3 -0
  289. package/skills/core/terminology/SKILL.md +62 -0
  290. package/skills/core/terminology/references/format.md +50 -0
  291. package/skills/core/terminology/references/init.md +32 -0
  292. package/skills/core/terminology/release-check.mjs +93 -0
  293. package/skills/core/write-doc/LICENSE +3 -0
  294. package/skills/core/write-doc/SKILL.md +141 -0
  295. package/skills/core/write-doc/references/bilingual.md +60 -0
  296. package/skills/core/write-doc/release-check.mjs +93 -0
  297. package/skills/engineering/better-review/LICENSE +3 -0
  298. package/skills/engineering/better-review/SKILL.md +249 -0
  299. package/skills/engineering/better-review/agents/openai.yaml +9 -0
  300. package/skills/engineering/better-review/references/domain-hazards.md +53 -0
  301. package/skills/engineering/better-review/references/passes.md +147 -0
  302. package/skills/engineering/better-review/references/result.md +151 -0
  303. package/skills/engineering/better-review/release-check.mjs +93 -0
  304. package/skills/engineering/better-review/scripts/pr-context.mjs +212 -0
  305. package/skills/engineering/better-review/scripts/pr-context.test.mjs +168 -0
  306. package/skills/engineering/better-review/scripts/rereview-scope.mjs +503 -0
  307. package/skills/engineering/better-review/scripts/rereview-scope.test.mjs +587 -0
  308. package/skills/engineering/better-review/scripts/scan-diff.mjs +365 -0
  309. package/skills/engineering/better-review/scripts/scan-diff.test.mjs +414 -0
  310. package/skills/engineering/better-review/scripts/vendor-sync.test.mjs +96 -0
  311. package/skills/engineering/e2e-test/LICENSE +3 -0
  312. package/skills/engineering/e2e-test/SKILL.md +98 -0
  313. package/skills/engineering/e2e-test/assets/ci-gates.cloudbuild.yaml +24 -0
  314. package/skills/engineering/e2e-test/references/authoring/auth-flows.md +159 -0
  315. package/skills/engineering/e2e-test/references/authoring/playwright-config.md +73 -0
  316. package/skills/engineering/e2e-test/references/authoring/playwright-patterns.md +144 -0
  317. package/skills/engineering/e2e-test/references/ci-integration.md +25 -0
  318. package/skills/engineering/e2e-test/references/ci-playwright-container.md +290 -0
  319. package/skills/engineering/e2e-test/references/presentation-sweep.md +104 -0
  320. package/skills/engineering/e2e-test/references/reviewing.md +41 -0
  321. package/skills/engineering/e2e-test/references/route-manifest.md +51 -0
  322. package/skills/engineering/e2e-test/release-check.mjs +93 -0
  323. package/skills/engineering/e2e-test/scripts/detect-routes-nextjs.mjs +200 -0
  324. package/skills/engineering/e2e-test/scripts/presentation-checks.mjs +171 -0
  325. package/skills/engineering/e2e-test/scripts/presentation-checks.test.mjs +106 -0
  326. package/skills/engineering/e2e-test/scripts/presentation-perceivability.mjs +179 -0
  327. package/skills/engineering/e2e-test/scripts/presentation-perceivability.test.mjs +117 -0
  328. package/skills/engineering/e2e-test/scripts/presentation-reachability.mjs +154 -0
  329. package/skills/engineering/e2e-test/scripts/presentation-reachability.test.mjs +69 -0
  330. package/skills/engineering/e2e-test/scripts/presentation-render-health.mjs +141 -0
  331. package/skills/engineering/e2e-test/scripts/presentation-render-health.test.mjs +98 -0
  332. package/skills/engineering/e2e-test/scripts/presentation-sweep.mjs +147 -0
  333. package/skills/engineering/e2e-test/scripts/presentation-sweep.test.mjs +71 -0
  334. package/skills/engineering/e2e-test/scripts/presentation-temporal.mjs +127 -0
  335. package/skills/engineering/e2e-test/scripts/presentation-temporal.test.mjs +59 -0
  336. package/skills/engineering/e2e-test/scripts/project-route-manifest.mjs +82 -0
  337. package/skills/engineering/e2e-test/scripts/project-route-manifest.test.mjs +76 -0
  338. package/skills/engineering/e2e-test/scripts/validate-manifest.mjs +106 -0
  339. package/skills/engineering/engineering-runtime/LICENSE +3 -0
  340. package/skills/engineering/engineering-runtime/SKILL.md +11 -0
  341. package/skills/engineering/engineering-runtime/agents/openai.yaml +6 -0
  342. package/skills/engineering/engineering-runtime/coherence/workflow.json +597 -0
  343. package/skills/engineering/engineering-runtime/engineering-runtime.test.mjs +68 -0
  344. package/skills/engineering/engineering-runtime/release-check.mjs +93 -0
  345. package/skills/engineering/engineering-runtime/scripts/exact-head-artifact.mjs +131 -0
  346. package/skills/engineering/engineering-runtime/scripts/head-check-set.mjs +398 -0
  347. package/skills/engineering/engineering-runtime/scripts/invocation-policy.mjs +187 -0
  348. package/skills/engineering/engineering-runtime/scripts/invocation-policy.test.mjs +95 -0
  349. package/skills/engineering/engineering-runtime/scripts/main-module.mjs +79 -0
  350. package/skills/engineering/engineering-runtime/scripts/main-module.test.mjs +288 -0
  351. package/skills/engineering/engineering-runtime/scripts/mergify-yaml.mjs +11 -0
  352. package/skills/engineering/engineering-runtime/scripts/package-lock.json +43 -0
  353. package/skills/engineering/engineering-runtime/scripts/package.json +10 -0
  354. package/skills/engineering/engineering-runtime/scripts/required-check-plan.mjs +223 -0
  355. package/skills/engineering/engineering-runtime/scripts/required-check-plan.test.mjs +96 -0
  356. package/skills/engineering/engineering-runtime/scripts/review-completion.mjs +56 -0
  357. package/skills/engineering/engineering-runtime/scripts/workflow-coherence.mjs +595 -0
  358. package/skills/engineering/engineering-runtime/scripts/workflow-policy.mjs +189 -0
  359. package/skills/engineering/engineering-runtime/scripts/yaml-mapping.mjs +18 -0
  360. package/skills/engineering/ensure-coverage/LICENSE +3 -0
  361. package/skills/engineering/ensure-coverage/SKILL.md +129 -0
  362. package/skills/engineering/ensure-coverage/references/breadth/coverage-ledger.md +92 -0
  363. package/skills/engineering/ensure-coverage/references/breadth/inventory-contract.md +85 -0
  364. package/skills/engineering/ensure-coverage/references/breadth/surface-baseline.md +44 -0
  365. package/skills/engineering/ensure-coverage/references/breadth/surface-discovery.md +16 -0
  366. package/skills/engineering/ensure-coverage/references/depth/characterization.md +68 -0
  367. package/skills/engineering/ensure-coverage/references/depth/coverage.config.example.json +19 -0
  368. package/skills/engineering/ensure-coverage/references/depth/grading.md +35 -0
  369. package/skills/engineering/ensure-coverage/references/depth/mock-policy.md +57 -0
  370. package/skills/engineering/ensure-coverage/references/depth/test-smells.md +39 -0
  371. package/skills/engineering/ensure-coverage/references/enforcement/ci-contract.md +44 -0
  372. package/skills/engineering/ensure-coverage/references/examples/coverage-ledger.md +110 -0
  373. package/skills/engineering/ensure-coverage/references/examples/refund-flow.md +35 -0
  374. package/skills/engineering/ensure-coverage/references/presentation/axis.md +64 -0
  375. package/skills/engineering/ensure-coverage/references/process/audit-mode.md +27 -0
  376. package/skills/engineering/ensure-coverage/references/process/output-template.md +139 -0
  377. package/skills/engineering/ensure-coverage/references/process/test-strategy.md +56 -0
  378. package/skills/engineering/ensure-coverage/release-check.mjs +93 -0
  379. package/skills/engineering/ensure-coverage/schemas/coverage-config.schema.json +67 -0
  380. package/skills/engineering/ensure-coverage/schemas/coverage-file.schema.json +140 -0
  381. package/skills/engineering/ensure-coverage/scripts/README.md +99 -0
  382. package/skills/engineering/ensure-coverage/scripts/adapters/nextjs-inventory.mjs +182 -0
  383. package/skills/engineering/ensure-coverage/scripts/adapters/nextjs-inventory.test.mjs +96 -0
  384. package/skills/engineering/ensure-coverage/scripts/check-quarantine-expiry.mjs +105 -0
  385. package/skills/engineering/ensure-coverage/scripts/check-quarantine-expiry.test.mjs +47 -0
  386. package/skills/engineering/ensure-coverage/scripts/ci-audit.mjs +137 -0
  387. package/skills/engineering/ensure-coverage/scripts/ci-audit.test.mjs +86 -0
  388. package/skills/engineering/ensure-coverage/scripts/coverage-ledger.mjs +674 -0
  389. package/skills/engineering/ensure-coverage/scripts/coverage-ledger.test.mjs +447 -0
  390. package/skills/engineering/ensure-coverage/scripts/design-parity.mjs +591 -0
  391. package/skills/engineering/ensure-coverage/scripts/design-parity.test.mjs +552 -0
  392. package/skills/engineering/ensure-coverage/scripts/lint-tests.mjs +282 -0
  393. package/skills/engineering/ensure-coverage/scripts/lint-tests.test.mjs +289 -0
  394. package/skills/engineering/ensure-coverage/scripts/mock-policy-config.mjs +176 -0
  395. package/skills/engineering/ensure-coverage/scripts/mock-policy-config.test.mjs +119 -0
  396. package/skills/engineering/ensure-coverage/scripts/package.json +19 -0
  397. package/skills/engineering/golden-path/LICENSE +3 -0
  398. package/skills/engineering/golden-path/SKILL.md +230 -0
  399. package/skills/engineering/golden-path/agents/openai.yaml +3 -0
  400. package/skills/engineering/golden-path/assets/golden-paths.example.json +57 -0
  401. package/skills/engineering/golden-path/references/contract.md +239 -0
  402. package/skills/engineering/golden-path/references/migration.md +111 -0
  403. package/skills/engineering/golden-path/release-check.mjs +93 -0
  404. package/skills/engineering/golden-path/scripts/golden-path-core.mjs +1779 -0
  405. package/skills/engineering/golden-path/scripts/golden-path.mjs +6 -0
  406. package/skills/engineering/golden-path/scripts/golden-path.test.mjs +1457 -0
  407. package/skills/engineering/harness-runtime/LICENSE +3 -0
  408. package/skills/engineering/harness-runtime/SKILL.md +19 -0
  409. package/skills/engineering/harness-runtime/agents/openai.yaml +6 -0
  410. package/skills/engineering/harness-runtime/bin/discover-models.mjs +4 -0
  411. package/skills/engineering/harness-runtime/bin/model-catalog.mjs +4 -0
  412. package/skills/engineering/harness-runtime/contracts.md +15 -0
  413. package/skills/engineering/harness-runtime/discover-models.mjs +392 -0
  414. package/skills/engineering/harness-runtime/discover-models.test.mjs +363 -0
  415. package/skills/engineering/harness-runtime/fixtures/native-question-schemas.json +33 -0
  416. package/skills/engineering/harness-runtime/fixtures/question-responses.json +54 -0
  417. package/skills/engineering/harness-runtime/harness-runtime.test.mjs +967 -0
  418. package/skills/engineering/harness-runtime/index.mjs +767 -0
  419. package/skills/engineering/harness-runtime/model-catalog-seed.test.mjs +829 -0
  420. package/skills/engineering/harness-runtime/model-catalog.mjs +787 -0
  421. package/skills/engineering/harness-runtime/model-catalog.test.mjs +366 -0
  422. package/skills/engineering/harness-runtime/native-question-contracts.md +37 -0
  423. package/skills/engineering/harness-runtime/references/model-catalog-seed.json +408 -0
  424. package/skills/engineering/harness-runtime/references/model-catalog.md +57 -0
  425. package/skills/engineering/harness-runtime/release-check.mjs +93 -0
  426. package/skills/engineering/resolve-issues/LICENSE +3 -0
  427. package/skills/engineering/resolve-issues/SKILL.md +250 -0
  428. package/skills/engineering/resolve-issues/agents/openai.yaml +9 -0
  429. package/skills/engineering/resolve-issues/plugin-hooks.json +17 -0
  430. package/skills/engineering/resolve-issues/references/canary.md +28 -0
  431. package/skills/engineering/resolve-issues/references/ci.md +105 -0
  432. package/skills/engineering/resolve-issues/references/done.md +25 -0
  433. package/skills/engineering/resolve-issues/references/dropbox.md +90 -0
  434. package/skills/engineering/resolve-issues/references/expire.md +318 -0
  435. package/skills/engineering/resolve-issues/references/exploration.md +202 -0
  436. package/skills/engineering/resolve-issues/references/implementation.md +303 -0
  437. package/skills/engineering/resolve-issues/references/preflight.md +445 -0
  438. package/skills/engineering/resolve-issues/references/review.md +228 -0
  439. package/skills/engineering/resolve-issues/references/shared-modules.md +44 -0
  440. package/skills/engineering/resolve-issues/references/task-plan.md +264 -0
  441. package/skills/engineering/resolve-issues/release-check.mjs +93 -0
  442. package/skills/engineering/resolve-issues/scripts/cleanup-runs.mjs +364 -0
  443. package/skills/engineering/resolve-issues/scripts/cleanup-runs.test.mjs +280 -0
  444. package/skills/engineering/resolve-issues/scripts/discover-models.mjs +9 -0
  445. package/skills/engineering/resolve-issues/scripts/dropbox.mjs +473 -0
  446. package/skills/engineering/resolve-issues/scripts/dropbox.test.mjs +346 -0
  447. package/skills/engineering/resolve-issues/scripts/findings-reuse.mjs +98 -0
  448. package/skills/engineering/resolve-issues/scripts/findings-reuse.test.mjs +88 -0
  449. package/skills/engineering/resolve-issues/scripts/github-reviews.mjs +384 -0
  450. package/skills/engineering/resolve-issues/scripts/github-reviews.test.mjs +264 -0
  451. package/skills/engineering/resolve-issues/scripts/install-hooks.mjs +135 -0
  452. package/skills/engineering/resolve-issues/scripts/install-hooks.test.mjs +79 -0
  453. package/skills/engineering/resolve-issues/scripts/issue-tree.mjs +162 -0
  454. package/skills/engineering/resolve-issues/scripts/issue-tree.test.mjs +107 -0
  455. package/skills/engineering/resolve-issues/scripts/manual-invocation.test.mjs +14 -0
  456. package/skills/engineering/resolve-issues/scripts/model-catalog.mjs +9 -0
  457. package/skills/engineering/resolve-issues/scripts/next-actions-capacity.test.mjs +149 -0
  458. package/skills/engineering/resolve-issues/scripts/next-actions.mjs +856 -0
  459. package/skills/engineering/resolve-issues/scripts/next-actions.test.mjs +915 -0
  460. package/skills/engineering/resolve-issues/scripts/plan-sync.mjs +269 -0
  461. package/skills/engineering/resolve-issues/scripts/plan-sync.test.mjs +156 -0
  462. package/skills/engineering/resolve-issues/scripts/preflight-models.mjs +736 -0
  463. package/skills/engineering/resolve-issues/scripts/preflight-models.test.mjs +448 -0
  464. package/skills/engineering/resolve-issues/scripts/ready-check.mjs +185 -0
  465. package/skills/engineering/resolve-issues/scripts/ready-check.test.mjs +217 -0
  466. package/skills/engineering/resolve-issues/scripts/rehydrate.mjs +98 -0
  467. package/skills/engineering/resolve-issues/scripts/rehydrate.test.mjs +91 -0
  468. package/skills/engineering/resolve-issues/scripts/review-verdict.mjs +509 -0
  469. package/skills/engineering/resolve-issues/scripts/review-verdict.test.mjs +1060 -0
  470. package/skills/engineering/resolve-issues/scripts/size-check.mjs +492 -0
  471. package/skills/engineering/resolve-issues/scripts/size-check.test.mjs +458 -0
  472. package/skills/engineering/resolve-release/LICENSE +3 -0
  473. package/skills/engineering/resolve-release/SKILL.md +215 -0
  474. package/skills/engineering/resolve-release/agents/openai.yaml +8 -0
  475. package/skills/engineering/resolve-release/flows/cloud-run-canary.md +13 -0
  476. package/skills/engineering/resolve-release/flows/cloud-run.md +7 -0
  477. package/skills/engineering/resolve-release/flows/root-tag-npm.md +13 -0
  478. package/skills/engineering/resolve-release/flows/workspace-npm.md +22 -0
  479. package/skills/engineering/resolve-release/references/canary.md +51 -0
  480. package/skills/engineering/resolve-release/references/candidate.md +41 -0
  481. package/skills/engineering/resolve-release/references/cut.md +131 -0
  482. package/skills/engineering/resolve-release/references/dark-launch.md +66 -0
  483. package/skills/engineering/resolve-release/references/flows.md +150 -0
  484. package/skills/engineering/resolve-release/references/preflight.md +154 -0
  485. package/skills/engineering/resolve-release/references/prepared-metadata.md +260 -0
  486. package/skills/engineering/resolve-release/references/promotion.md +82 -0
  487. package/skills/engineering/resolve-release/references/publish.md +232 -0
  488. package/skills/engineering/resolve-release/references/workspace-npm.md +103 -0
  489. package/skills/engineering/resolve-release/release-check.mjs +93 -0
  490. package/skills/engineering/resolve-release/scripts/apply.mjs +212 -0
  491. package/skills/engineering/resolve-release/scripts/apply.test.mjs +99 -0
  492. package/skills/engineering/resolve-release/scripts/dark-flags.mjs +134 -0
  493. package/skills/engineering/resolve-release/scripts/dark-flags.test.mjs +100 -0
  494. package/skills/engineering/resolve-release/scripts/flow.mjs +500 -0
  495. package/skills/engineering/resolve-release/scripts/flow.test.mjs +340 -0
  496. package/skills/engineering/resolve-release/scripts/green-head.mjs +231 -0
  497. package/skills/engineering/resolve-release/scripts/green-head.test.mjs +101 -0
  498. package/skills/engineering/resolve-release/scripts/npm-version-absence.mjs +138 -0
  499. package/skills/engineering/resolve-release/scripts/npm-version-absence.test.mjs +426 -0
  500. package/skills/engineering/resolve-release/scripts/plan-npm.test.mjs +659 -0
  501. package/skills/engineering/resolve-release/scripts/plan-toml-boundary.test.mjs +317 -0
  502. package/skills/engineering/resolve-release/scripts/plan-uv.test.mjs +291 -0
  503. package/skills/engineering/resolve-release/scripts/plan.mjs +806 -0
  504. package/skills/engineering/resolve-release/scripts/plan.test.mjs +428 -0
  505. package/skills/engineering/rush-issues/LICENSE +3 -0
  506. package/skills/engineering/rush-issues/SKILL.md +58 -0
  507. package/skills/engineering/rush-issues/agents/openai.yaml +8 -0
  508. package/skills/engineering/rush-issues/rehydrate.mjs +10 -0
  509. package/skills/engineering/rush-issues/release-check.mjs +93 -0
  510. package/skills/engineering/rush-release/LICENSE +3 -0
  511. package/skills/engineering/rush-release/SKILL.md +35 -0
  512. package/skills/engineering/rush-release/agents/openai.yaml +8 -0
  513. package/skills/engineering/rush-release/release-check.mjs +93 -0
  514. package/skills/engineering/test-quality/LICENSE +3 -0
  515. package/skills/engineering/test-quality/SKILL.md +79 -0
  516. package/skills/engineering/test-quality/references/audit.md +80 -0
  517. package/skills/engineering/test-quality/references/lint.md +24 -0
  518. package/skills/engineering/test-quality/references/principles.md +143 -0
  519. package/skills/engineering/test-quality/references/testing-conventions.md +9 -0
  520. package/skills/engineering/test-quality/release-check.mjs +93 -0
  521. package/skills/engineering/test-quality/scripts/lint-tests.mjs +574 -0
  522. package/skills/engineering/test-quality/scripts/lint-tests.test.mjs +591 -0
  523. package/skills/engineering/test-quality/scripts/mock-policy-config.mjs +176 -0
  524. package/skills/engineering/test-quality/scripts/mock-policy-config.test.mjs +119 -0
  525. package/skills/engineering/test-quality/scripts/persist-conventions-core.mjs +117 -0
  526. package/skills/engineering/test-quality/scripts/persist-conventions.mjs +17 -0
  527. package/skills/engineering/test-quality/scripts/persist-conventions.test.mjs +104 -0
  528. package/skills/risk-compliance/compliance-audit/LICENSE +3 -0
  529. package/skills/risk-compliance/compliance-audit/SKILL.md +439 -0
  530. package/skills/risk-compliance/compliance-audit/references/findings-schema.md +293 -0
  531. package/skills/risk-compliance/compliance-audit/references/normalization-rules.md +45 -0
  532. package/skills/risk-compliance/compliance-audit/references/vars-checklist.md +1068 -0
  533. package/skills/risk-compliance/compliance-audit/references/vars-findings-schema.md +398 -0
  534. package/skills/risk-compliance/compliance-audit/release-check.mjs +93 -0
  535. package/skills/risk-compliance/compliance-audit/scripts/compliance-audit.test.mjs +14 -0
  536. package/skills/risk-compliance/compliance-audit/scripts/export_tracker_xlsx.py +221 -0
  537. package/skills/risk-compliance/compliance-audit/scripts/reconcile_tracker.py +458 -0
  538. package/skills/risk-compliance/compliance-audit/scripts/test_export_tracker_xlsx.py +97 -0
  539. package/skills/risk-compliance/compliance-audit/scripts/test_validate_tracker.py +157 -0
  540. package/skills/risk-compliance/compliance-audit/scripts/validate_tracker.py +829 -0
  541. package/skills/risk-compliance/contract-compare/LICENSE +3 -0
  542. package/skills/risk-compliance/contract-compare/SKILL.md +199 -0
  543. package/skills/risk-compliance/contract-compare/references/comparison-dimensions.md +209 -0
  544. package/skills/risk-compliance/contract-compare/release-check.mjs +93 -0
  545. package/skills/risk-compliance/contract-review/LICENSE +3 -0
  546. package/skills/risk-compliance/contract-review/SKILL.md +240 -0
  547. package/skills/risk-compliance/contract-review/references/review-criteria.md +223 -0
  548. package/skills/risk-compliance/contract-review/release-check.mjs +93 -0
  549. package/skills/risk-compliance/doc-authenticity/LICENSE +3 -0
  550. package/skills/risk-compliance/doc-authenticity/SKILL.md +160 -0
  551. package/skills/risk-compliance/doc-authenticity/agents/openai.yaml +8 -0
  552. package/skills/risk-compliance/doc-authenticity/manual-invocation.test.mjs +12 -0
  553. package/skills/risk-compliance/doc-authenticity/references/agreement.md +66 -0
  554. package/skills/risk-compliance/doc-authenticity/references/bank-statement.md +150 -0
  555. package/skills/risk-compliance/doc-authenticity/references/forensic-signals.md +157 -0
  556. package/skills/risk-compliance/doc-authenticity/references/image-signals.md +114 -0
  557. package/skills/risk-compliance/doc-authenticity/references/invoice.md +66 -0
  558. package/skills/risk-compliance/doc-authenticity/references/issuer-profiles.md +86 -0
  559. package/skills/risk-compliance/doc-authenticity/references/verdict-and-report.md +95 -0
  560. package/skills/risk-compliance/doc-authenticity/references/verdict.schema.json +81 -0
  561. package/skills/risk-compliance/doc-authenticity/release-check.mjs +93 -0
  562. package/skills/risk-compliance/doc-authenticity/scripts/image_forensics.py +294 -0
  563. package/skills/risk-compliance/doc-authenticity/scripts/pdf_forensics.py +401 -0
  564. package/skills/risk-compliance/doc-authenticity/scripts/validate_codes.py +224 -0
  565. package/skills/risk-compliance/doc-authenticity/scripts/validate_verdict.py +308 -0
  566. package/skills/risk-compliance/doc-authenticity/scripts/validate_verdict.test.mjs +212 -0
  567. package/skills/risk-compliance/fraud-analysis/LICENSE +3 -0
  568. package/skills/risk-compliance/fraud-analysis/SKILL.md +114 -0
  569. package/skills/risk-compliance/fraud-analysis/references/archetypes/authorized-payment-scam.md +41 -0
  570. package/skills/risk-compliance/fraud-analysis/references/archetypes/first-party-fraud.md +44 -0
  571. package/skills/risk-compliance/fraud-analysis/references/archetypes/third-party-fraud.md +27 -0
  572. package/skills/risk-compliance/fraud-analysis/references/contexts/bank-transfer.md +24 -0
  573. package/skills/risk-compliance/fraud-analysis/references/contexts/card-payment.md +30 -0
  574. package/skills/risk-compliance/fraud-analysis/references/contexts/payment-collection.md +20 -0
  575. package/skills/risk-compliance/fraud-analysis/references/contexts/payout.md +20 -0
  576. package/skills/risk-compliance/fraud-analysis/references/feature-engineering.md +158 -0
  577. package/skills/risk-compliance/fraud-analysis/references/mechanisms/account-takeover.md +36 -0
  578. package/skills/risk-compliance/fraud-analysis/references/report-rationale.md +45 -0
  579. package/skills/risk-compliance/fraud-analysis/references/report-template.md +190 -0
  580. package/skills/risk-compliance/fraud-analysis/references/review-checklist.md +175 -0
  581. package/skills/risk-compliance/fraud-analysis/references/taxonomy.md +79 -0
  582. package/skills/risk-compliance/fraud-analysis/references/terminology.md +108 -0
  583. package/skills/risk-compliance/fraud-analysis/references/workflow.md +175 -0
  584. package/skills/risk-compliance/fraud-analysis/release-check.mjs +93 -0
  585. package/skills/risk-compliance/payment-analysis/LICENSE +3 -0
  586. package/skills/risk-compliance/payment-analysis/SKILL.md +180 -0
  587. package/skills/risk-compliance/payment-analysis/references/auth-rate-actions.md +30 -0
  588. package/skills/risk-compliance/payment-analysis/references/chargebacks.md +208 -0
  589. package/skills/risk-compliance/payment-analysis/references/chinese-polish.md +51 -0
  590. package/skills/risk-compliance/payment-analysis/references/event-layers.md +127 -0
  591. package/skills/risk-compliance/payment-analysis/references/fx.md +59 -0
  592. package/skills/risk-compliance/payment-analysis/references/journey.md +79 -0
  593. package/skills/risk-compliance/payment-analysis/references/metrics.md +67 -0
  594. package/skills/risk-compliance/payment-analysis/references/report-template.md +119 -0
  595. package/skills/risk-compliance/payment-analysis/references/terminology.md +95 -0
  596. package/skills/risk-compliance/payment-analysis/references/visualization.md +56 -0
  597. package/skills/risk-compliance/payment-analysis/release-check.mjs +93 -0
  598. package/skills/risk-compliance/report-writing/LICENSE +3 -0
  599. package/skills/risk-compliance/report-writing/SKILL.md +220 -0
  600. package/skills/risk-compliance/report-writing/references/audit-report-template.md +121 -0
  601. package/skills/risk-compliance/report-writing/references/external-assessment-template.md +167 -0
  602. package/skills/risk-compliance/report-writing/references/management-report-template.md +145 -0
  603. package/skills/risk-compliance/report-writing/references/vars-report-template.md +224 -0
  604. package/skills/risk-compliance/report-writing/release-check.mjs +93 -0
  605. package/skills/risk-compliance/similar-domain/LICENSE +3 -0
  606. package/skills/risk-compliance/similar-domain/SKILL.md +203 -0
  607. package/skills/risk-compliance/similar-domain/references/entities.md +67 -0
  608. package/skills/risk-compliance/similar-domain/references/fingerprints.md +134 -0
  609. package/skills/risk-compliance/similar-domain/references/pivots.md +82 -0
  610. package/skills/risk-compliance/similar-domain/references/report-template.md +93 -0
  611. package/skills/risk-compliance/similar-domain/references/scoring.md +130 -0
  612. package/skills/risk-compliance/similar-domain/references/terminology.md +41 -0
  613. package/skills/risk-compliance/similar-domain/references/workflow.md +85 -0
  614. package/skills/risk-compliance/similar-domain/release-check.mjs +93 -0
  615. package/skills/risk-compliance/tld-detection/LICENSE +3 -0
  616. package/skills/risk-compliance/tld-detection/SKILL.md +245 -0
  617. package/skills/risk-compliance/tld-detection/agents/openai.yaml +9 -0
  618. package/skills/risk-compliance/tld-detection/references/chinese-polish.md +55 -0
  619. package/skills/risk-compliance/tld-detection/references/clean.md +51 -0
  620. package/skills/risk-compliance/tld-detection/references/clustering.md +235 -0
  621. package/skills/risk-compliance/tld-detection/references/decision.md +189 -0
  622. package/skills/risk-compliance/tld-detection/references/fx-conversion.md +232 -0
  623. package/skills/risk-compliance/tld-detection/references/report-template.md +272 -0
  624. package/skills/risk-compliance/tld-detection/references/streams.md +141 -0
  625. package/skills/risk-compliance/tld-detection/references/terminology.md +95 -0
  626. package/skills/risk-compliance/tld-detection/references/workflow.md +95 -0
  627. package/skills/risk-compliance/tld-detection/release-check.mjs +93 -0
  628. package/skills/risk-compliance/tld-detection/scripts/detect_ladders.py +390 -0
  629. package/skills/risk-compliance/tld-detection/scripts/detect_ladders.test.mjs +14 -0
  630. package/skills/risk-compliance/tld-detection/scripts/detect_streams.py +650 -0
  631. package/skills/risk-compliance/tld-detection/scripts/detect_streams.test.mjs +14 -0
  632. package/skills/risk-compliance/tld-detection/tests/test_detect_ladders.py +134 -0
  633. package/skills/risk-compliance/tld-detection/tests/test_detect_streams.py +520 -0
@@ -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,3 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 1AboveIO
@@ -0,0 +1,203 @@
1
+ ---
2
+ name: similar-domain
3
+ description: >
4
+ Explicit-only. The domains, mirrors, and operating entities related to one
5
+ or more seed domains: platform-tenancy test, operator-level fingerprints
6
+ (analytics, tenant and payment account IDs, support-email domains,
7
+ templates, DNS, mail, certificates, registration), reverse pivots, scored
8
+ links, an entity chain, and a watchlist for the operator's next domains.
9
+ Not transaction data (tld-detection) or fraud rules (fraud-analysis).
10
+ disable-model-invocation: true
11
+ release-version: 0.38.0
12
+ ---
13
+ **Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
14
+ # Similar Domain
15
+
16
+ Start from a seed domain and find every other domain that the same people run.
17
+ A cluster is defined by **shared operator-level fingerprints**: accounts,
18
+ code, and registrations that one operator controls. Shared branding,
19
+ shared industry, and infrastructure that a CDN or hosted platform hands to
20
+ all its customers do not define one. Corporate records (operator, licence,
21
+ affiliate program) confirm and name the cluster; they do not create it on
22
+ their own.
23
+
24
+ The method is a loop: read fingerprints off a domain, ask "who else has this?"
25
+ for each fingerprint, score what comes back, and feed every new domain back
26
+ into the loop.
27
+
28
+ **Produce:** a scored cluster with an evidence matrix, the entity chain behind
29
+ it, and a ≤3-sentence verdict, under `reports/similar-domain/`.
30
+ **Do not produce:** an ownership claim with no corporate evidence, a cluster
31
+ built from one weak signal, or a list of every site on the same CDN or
32
+ hosted platform.
33
+
34
+ Paths under `references/` are relative to this skill.
35
+
36
+ ## Workflow
37
+
38
+ Follow these steps in order. Detail:
39
+ [references/workflow.md](references/workflow.md).
40
+
41
+ | Step | Do | Gate |
42
+ |---|---|---|
43
+ | 0 Pre-flight | Seeds, question, jurisdiction, access limits | Stop if there is no resolvable domain; note geo-blocks and challenge pages |
44
+ | 1 Fingerprint | Decide platform tenancy; record every non-brand identifier on each domain; check split delivery when the site is reached through ads | Every fingerprint has a source and a timestamp; local resolver artefacts are flagged; each fingerprint is tagged operator-level or platform-level |
45
+ | 2 Pivot | Reverse-search each fingerprint for other domains | Each pivot is logged with source class and hit count; high-noise pivots are filtered by a second fingerprint |
46
+ | 3 Expand names | Enumerate mirror and numbering variants of every brand found | Candidates are only kept if they share a fingerprint from step 1 |
47
+ | 4 Entity | Operator, company record and officers, licence, address, affiliate program, terms page | Each entity fact cites a page; conflicting operator names are kept, not resolved by guess; registered-agent addresses are noise |
48
+ | 5 Score | Weight every link; label each domain | Labels follow the rules in scoring.md; platform-level signals never lift a label above Possible, however many there are |
49
+ | 6 Loop | Send every new Confirmed or Probable domain back to step 1 | Every pass has rows in the pivot log; stop when a full pass adds no new domain, or report the cluster open |
50
+ | 7 Report | Verdict, cluster table, evidence matrix, entity chain, outliers, watchlist, pivot log | ≤3-sentence verdict; no ownership wording without an entity citation; watchlist names the fingerprints that will catch the next domain |
51
+
52
+ ### 0 — Pre-flight
53
+
54
+ Record the seed domains, what the user actually wants to know (same
55
+ operator? mirrors? merchant background?), and any jurisdiction or time limits.
56
+ Note what you cannot see: geo-blocks, bot challenges, private WHOIS. A blocked
57
+ site still yields a block page, DNS, certificates, and history, so blocking is
58
+ a finding, not a dead end. Grain and limits:
59
+ [workflow.md](references/workflow.md).
60
+
61
+ ### 1 — Fingerprint
62
+
63
+ [references/fingerprints.md](references/fingerprints.md). First decide
64
+ whether the domain is a tenant on a hosted platform (storefront builder,
65
+ website builder, white-label casino or broker platform). On a tenant, the
66
+ hosting address, template, asset hosts, certificate, and bundled registrar
67
+ come from the platform and link every customer it has; only the
68
+ operator's own accounts inside the platform identify the operator.
69
+
70
+ Then collect everything about the domain that is not the brand name:
71
+ registration facts, DNS and mail records, certificate history, analytics
72
+ and pixel IDs, tenant and payment account IDs, the block-page or
73
+ error-page template, support-address domain, hard-coded partner hosts,
74
+ and naming scheme. Record each with where it came from and tag it
75
+ operator-level or platform-level. When the site is reached through ads or
76
+ short links, request it as several visitors and compare; a hidden page is
77
+ a new seed. Fingerprint the seed fully before pivoting; a half-collected
78
+ profile makes later pivots look independent when they are not.
79
+
80
+ ### 2 — Pivot
81
+
82
+ [references/pivots.md](references/pivots.md). For each fingerprint, query the
83
+ source class that can answer "who else has this": page-source indexes for
84
+ analytics IDs and templates, passive DNS for nameservers and mail records,
85
+ certificate transparency for subdomains and naming schemes, reverse WHOIS for
86
+ registration batches. Ordinary web search does not index page source; do not
87
+ treat an empty web-search result as a negative. Filter noisy pivots
88
+ (shared CDN nameservers, common mail includes) by requiring a second
89
+ fingerprint before a hit becomes a candidate.
90
+
91
+ ### 3 — Expand names
92
+
93
+ Brands that rotate mirrors follow a scheme: numbered suffixes, hyphenated
94
+ digits, double-dash prefixes, country TLDs. Enumerate the scheme for every
95
+ brand found and keep only the variants that share a step-1 fingerprint.
96
+ A name match alone is a candidate, never a member.
97
+
98
+ ### 4 — Entity
99
+
100
+ [references/entities.md](references/entities.md). Once a brand name exists,
101
+ collect the legal entity, its company-register record and officers, any
102
+ licence number, address, and affiliate program from the site's own terms
103
+ page, the company register, regulator enforcement notices, and review
104
+ aggregators, then reverse each of
105
+ those: officers appear on other companies, licence registers list every
106
+ domain under one licence, affiliate programs list every brand they pay
107
+ for, entity names appear in other sites' terms pages. Registered-agent and
108
+ company-secretary addresses are shared by hundreds of companies; they link
109
+ nothing. Keep conflicting operator names side by side with dates; operators
110
+ migrate and the conflict is often the history.
111
+
112
+ ### 5 — Score
113
+
114
+ [references/scoring.md](references/scoring.md). Weight each link by how hard
115
+ it is to share by accident. One analytics account or one custom template is
116
+ very strong; one registrar or one CDN nameserver pair is medium. Two signals
117
+ from the same vendor account count once. On platform tenants, a shared IP,
118
+ theme, and bundled registrar are one platform-level signal, not three.
119
+ Label each domain Confirmed, Probable, Possible, or Unrelated, and keep the
120
+ reasoning visible in the evidence matrix.
121
+
122
+ ### 6 — Loop
123
+
124
+ Every Confirmed or Probable domain becomes a new seed and goes through steps 1
125
+ to 5. Possible domains are parked with the fingerprint that would promote them.
126
+ New fingerprints found on new members (a new support-email domain, a new
127
+ company, a new account ID) get pivoted in the same pass. Stop when a
128
+ complete pass finds nothing new, or when the user's question is answered
129
+ and further expansion would only add mirrors; otherwise the cluster is
130
+ open and the report lists the unrun pivots.
131
+
132
+ ### 7 — Report
133
+
134
+ [references/report-template.md](references/report-template.md). Terms:
135
+ [references/terminology.md](references/terminology.md).
136
+
137
+ ```text
138
+ reports/similar-domain/<seed>_cluster.md
139
+ ```
140
+
141
+ Lead with the verdict, then the cluster table sorted Confirmed → Probable →
142
+ Possible, the evidence matrix (domain × fingerprint), the entity chain with
143
+ dates, outliers that were checked and rejected, the watchlist of
144
+ fingerprints that will catch the operator's next domain, coverage caveats,
145
+ and the pivot log. Grep banned strings after writing.
146
+
147
+ ## Progress
148
+
149
+ Track a task plan. One item is `in_progress` at a time.
150
+
151
+ 1. Pass pre-flight
152
+ 2. Decide platform tenancy and fingerprint every seed
153
+ 3. Run and log pivots
154
+ 4. Expand naming schemes
155
+ 5. Collect entity chain
156
+ 6. Score and label
157
+ 7. Loop until no new domain
158
+ 8. Write report with watchlist and proofread
159
+
160
+ ## Boundary
161
+
162
+ | Need | Skill |
163
+ |---|---|
164
+ | Related domains, mirrors, sister sites, who runs a website, merchant-site background | `similar-domain` |
165
+ | Anything inside a transaction file: upstream streams behind a descriptor, wallet currency, preset menus, frozen-rate batches, retail constants, currency-amount ladders | `tld-detection` (`scripts/detect_streams.py`, then the ladder run) |
166
+ | Supervised fraud labels, holdout precision/recall, rule packages | `fraud-analysis` |
167
+ | Volume, journey, auth rate, decline mix | `payment-analysis` |
168
+
169
+ A domain cluster from this skill can feed a merchant-risk decision; it is not
170
+ itself a fraud finding. When the user also has authorization data for the
171
+ merchant, hand that part to `tld-detection`: this skill stops at the websites,
172
+ mirrors and operators.
173
+
174
+ ## Reference index
175
+
176
+ | Need | Read |
177
+ |---|---|
178
+ | Inputs, limits, order that must not move | [workflow.md](references/workflow.md) |
179
+ | Platform tenancy test, what to collect per domain and why it identifies an operator, split-delivery check | [fingerprints.md](references/fingerprints.md) |
180
+ | Which source class answers each "who else" question, and the traps | [pivots.md](references/pivots.md) |
181
+ | Operator, company register and officers, licence, affiliate, terms-page pivots | [entities.md](references/entities.md) |
182
+ | Link weights, independence, labels, registration batches, shared IDs on many brands, indirect links, worked example | [scoring.md](references/scoring.md) |
183
+ | Report chapters | [report-template.md](references/report-template.md) |
184
+ | Language and banned strings | [terminology.md](references/terminology.md) |
185
+
186
+ ## Sanity check
187
+
188
+ - [ ] Seeds, question, and access limits are stated; blocked sites are still fingerprinted
189
+ - [ ] Platform tenancy is decided for every hosting address, and the test is in the pivot log
190
+ - [ ] Every fingerprint has a source and a timestamp; local resolver artefacts are excluded
191
+ - [ ] No label above Possible rests on platform-level signals (shared platform IP, theme, asset host, bundled registrar)
192
+ - [ ] Ad-reached sites were requested as several visitors; the identities tried are listed
193
+ - [ ] Every pivot is logged with source class, query, and hit count, including empty ones
194
+ - [ ] Noisy pivots (CDN nameservers, common mail includes) never add a domain on their own
195
+ - [ ] Name-scheme candidates are kept only when they share a fingerprint
196
+ - [ ] Entity facts cite the page they came from; conflicting operator names are dated, not merged
197
+ - [ ] Every shared address counted as a link was searched first and is not a secretary or registered-agent address
198
+ - [ ] Two signals from one vendor account are counted once
199
+ - [ ] Every cluster member has a label and the matrix shows why
200
+ - [ ] Loop ran until a full pass added nothing, or the stop reason is stated; every pass has pivot-log rows
201
+ - [ ] Watchlist lists each durable operator-level fingerprint and where to watch it
202
+ - [ ] Verdict is ≤3 sentences; no "owned by" without an entity citation
203
+ - [ ] Outliers checked and rejected are listed with the reason
@@ -0,0 +1,67 @@
1
+ # Entities
2
+
3
+ Step 4 names and dates the cluster. It runs after at least one brand name
4
+ is known and after the technical links exist; it explains the cluster, it
5
+ does not replace the evidence.
6
+
7
+ ## What to collect per brand
8
+
9
+ | Fact | Where it usually is |
10
+ |---|---|
11
+ | Legal operator name and company number | Site footer, terms and conditions, "about" page, review aggregators |
12
+ | Company record: incorporation date, officers, secretary or registered agent | Company register of the stated jurisdiction |
13
+ | Licence authority and number (regulated sites only) | Footer seal, validator link, regulator register |
14
+ | Regulator enforcement notices and blocked-site lists | Regulators of the markets the site serves; they often name the operator for the exact domain, including mirrors |
15
+ | Registered address | Terms page, company register, regulator register |
16
+ | Launch year and relaunches | Review aggregators, archives, certificate history |
17
+ | Affiliate program | Footer "Affiliates" link, affiliate directories |
18
+ | Platform vendor | Footer, script hosts, review sites |
19
+ | Previous operators | Older reviews, forum threads, archive snapshots |
20
+ | Complaint patterns | Review aggregators, complaint forums |
21
+
22
+ Record each fact with its page and the date the page was written or
23
+ captured. Review aggregators disagree with each other because operators
24
+ migrate; keep every version with its date rather than picking one.
25
+
26
+ ## Entity pivots
27
+
28
+ | Have | Reverse into | Yields |
29
+ |---|---|---|
30
+ | Operator name | Aggregator "owner" pages, licence register, web search of terms-page text | Brand list under that operator |
31
+ | Licence number | Regulator register | Every licensed domain, including ones with no technical link yet |
32
+ | Affiliate program | Affiliate directories and forums | Brands marketed together |
33
+ | Address | Web search, company register | Other entities at the address. Before counting a shared address, search it and log how many unrelated companies use it; a secretary or registered-agent address links nothing |
34
+ | Domain or brand name | Regulator enforcement notices and blocked-site lists | The operator named for that exact domain, dated |
35
+ | Officers | Company register | Other companies the same people run; nominee directors are noise |
36
+ | Platform vendor | Vendor's client list, review sites | Vendor-level neighbours; filter, do not add |
37
+ | Previous operator | Same as operator name | The migration path (for example Curaçao entity → transitional entity → Anjouan entity) |
38
+
39
+ ## Migration patterns worth expecting
40
+
41
+ Offshore operators reorganise often. Common shapes:
42
+
43
+ - **Entity swap, same platform** — the brand keeps its template and
44
+ tokens; only the footer entity and licence change. Technical evidence
45
+ stays continuous; corporate evidence shows a break.
46
+ - **Brand acquisition** — an old, once-reputable domain is bought and
47
+ relaunched on a new operator's platform. Registration date is old;
48
+ everything else matches the new cluster. Weight the technical evidence.
49
+ - **Mirror farms** — numbered or hyphenated domains registered in batches,
50
+ each redirecting or serving the parent brand. They inherit every
51
+ fingerprint and are usually Confirmed on the first pass.
52
+ - **Platform tenants** — several unrelated operators on one hosted
53
+ platform (white-label casino, storefront builder, website builder)
54
+ share its address, theme, and often its registrar, but not
55
+ operator-level fingerprints. This is the main source of false clusters;
56
+ the tenancy test is in [fingerprints.md](fingerprints.md).
57
+ - **Shell rotation** — one operator puts each batch of sites under a new
58
+ company, often formed through the same secretary. The company names
59
+ differ; the operator-level fingerprints and the officers do not.
60
+
61
+ ## Adding a domain from entity evidence alone
62
+
63
+ Allowed only when the source is authoritative for domain membership: a
64
+ regulator's licence register, or the operator's own terms page listing its
65
+ domains. Label such domains Probable until a technical fingerprint
66
+ confirms them. Aggregator sister-site lists are hypotheses to test, not
67
+ grounds for membership.
@@ -0,0 +1,134 @@
1
+ # Fingerprints
2
+
3
+ What to record for each domain, and why each item identifies the people
4
+ behind it rather than the industry it sits in. Record the value, the source
5
+ you read it from, and the time. Categories are ordered by how much they
6
+ usually pay off. The examples cover several kinds of site (online shops,
7
+ casinos, brokers, content sites); use the rows that fit the seed.
8
+
9
+ ## Platform tenancy (decide first)
10
+
11
+ Many sites are tenants on a hosted platform: a storefront or website
12
+ builder, a white-label casino or broker platform, a blog host, or a
13
+ vendor that builds and hosts sites for many clients behind a CDN. The
14
+ platform serves every customer from the same addresses, with the same
15
+ theme skeleton, asset hosts, cookies, and often a bundled registrar. Those
16
+ values link the platform's customers, not one operator.
17
+
18
+ Test every hosting address before scoring anything on it:
19
+
20
+ | Test | Tenant if |
21
+ |---|---|
22
+ | Request the address with a made-up host name | It answers with a branded "store not found" or platform page instead of a connection error or a bare default page |
23
+ | Reverse-IP or passive-DNS neighbour count | Many names in unrelated niches or unrelated brands share it |
24
+ | Page source and cookies | Platform asset hosts, platform session cookies, and URL routes that recur unchanged on the platform's other stores |
25
+ | CNAME or nameserver target | Points at the platform's own hostname |
26
+ | Registrar | The platform's domain-reseller registrar, the same for most of its customers; judge this from stores outside the suspect set, not from the suspect's IP neighbours |
27
+ | Account IDs on sites outside the suspect set | Other sites of the same vendor or hosting carry the same analytics or tag ID, so the vendor inserts it |
28
+
29
+ If the domain is a tenant, tag these as **platform-level**: hosting
30
+ address and ASN, theme and template skeleton, platform asset hosts and
31
+ cookies, the platform's certificates, and the bundled registrar. Then
32
+ look for **operator-level** values inside the platform: the tenant or
33
+ store ID, payment account IDs, analytics and pixel IDs, a support-email
34
+ domain the operator registered, custom code, and uploaded asset hashes.
35
+ Record the tenancy test and its result in the pivot log.
36
+
37
+ ## Page and tag fingerprints (strongest)
38
+
39
+ These live inside the served HTML. They are set once by whoever configures
40
+ the site and copied across every site that person manages.
41
+
42
+ | Fingerprint | Why it identifies an operator |
43
+ |---|---|
44
+ | Analytics tokens (Cloudflare Web Analytics, Google Analytics / GTM container, Matomo, Yandex) | One account per operator; sharing it across brands is deliberate |
45
+ | Ad and tracking pixels (Meta, TikTok, Snap, affiliate-network pixels) | Tied to a paying advertiser account |
46
+ | Error-monitoring and session-replay keys (Sentry, Hotjar, Clarity, Smartlook) | Per-project keys from one engineering team |
47
+ | Tenant, store, or seller ID inside a hosted platform (in page config, API calls, upload paths) | One platform account; operator-level even when everything around it is platform-level |
48
+ | Payment account IDs: payment-processor publishable keys, wallet or PayPal merchant and client IDs, a checkout endpoint carrying an account | The account that receives the money; operators change domains far more often than payment accounts |
49
+ | Support-email domain the operator registered (`service@<company-domain>`, not `support@<brand>`) | A domain bought for the business; several brands pointing at it are one operator |
50
+ | Block-page or error-page template: HTML skeleton, CSS reset, odd literal values (a specific outline colour, a min-width), font stack | A shared codebase; brands change the logo and palette, not the skeleton |
51
+ | Support-address pattern (`support@<brand>`) and the domain it points at | A mirror's support address names the parent brand |
52
+ | Hard-coded partner hosts: CDN paths, API hosts, game or payment providers, chat widgets | Platform vendor and integration account |
53
+ | Favicon and logo asset hashes | Reused assets across mirrors |
54
+ | JavaScript bundle names and hashes | Same build pipeline |
55
+ | Cookie names and consent-banner vendor IDs | Same front-end stack |
56
+
57
+ Distinguish **operator-level** identifiers (analytics account, custom
58
+ template, tenant ID, payment account) from **vendor-level** ones (a game
59
+ provider, a chat widget, a hosted platform's theme). Vendor-level
60
+ identifiers narrow the field but are shared across many unrelated
61
+ operators. On a platform tenant, the template row is vendor-level unless
62
+ it carries custom literals the platform's other customers lack.
63
+
64
+ ## Mail fingerprints (strong)
65
+
66
+ | Fingerprint | Why |
67
+ |---|---|
68
+ | Exact SPF string, including the order of includes | The combination of mail vendors is chosen per operator; a byte-identical string across brands is rarely coincidence |
69
+ | DKIM selectors | Per-sending-account |
70
+ | MX target (Google, Microsoft 365, Zoho, self-hosted) | Splits clusters: an operator rarely runs two mail platforms |
71
+ | Verification TXT records (Microsoft tenant ID, vendor verifications) | Tenant IDs identify one organisation; Google site-verification tokens are per-domain and do not pivot |
72
+ | Mail-related subdomains from certificates (`mailer.`, `click.`, `email.updates.`) | Marketing-mail vendor and its account |
73
+
74
+ ## Registration fingerprints (medium to strong)
75
+
76
+ | Fingerprint | Why |
77
+ |---|---|
78
+ | Registrar plus privacy-proxy service | Operators keep one registrar account per portfolio |
79
+ | Creation and last-updated timestamps | Same-hour timestamps across domains mean one batch action |
80
+ | Status-lock set (the exact combination of prohibited flags) | Set by registrar account defaults |
81
+ | Registrant fields when not private (organisation, country, state) | Direct |
82
+ | Expiry alignment | Renewed together |
83
+
84
+ ## DNS and hosting fingerprints (medium)
85
+
86
+ | Fingerprint | Why |
87
+ |---|---|
88
+ | Nameserver pair | CDN providers assign pairs per account, but reuse pairs across many accounts; strong only combined with something else |
89
+ | Hosting address and ASN when not behind a CDN | Direct only for a dedicated origin; shared hosting is common and a platform ingress links every tenant |
90
+ | CNAME targets for `www`, `api`, `cdn`, `m` | Names the platform vendor and sometimes the tenant |
91
+ | Subdomain naming from certificate transparency | Platform-specific patterns (`api.`, `cl.`, `evolutiongaming.`) and mirror schemes (`dd20--brand`) |
92
+ | Wildcard certificate issuer and issuance cadence | Same automation |
93
+
94
+ ## Brand and naming fingerprints (candidate generators, not evidence)
95
+
96
+ | Fingerprint | Use |
97
+ |---|---|
98
+ | Name stem and numbering scheme (`brand3`, `brand-9884`, `xx00--brand`) | Enumerate variants in step 3 |
99
+ | Licence seal number and validator link (regulated sites: gambling, brokers, payments) | Pivot into the licence register in step 4 |
100
+ | Legal entity, company number, address, and licence text on the terms page | Entity pivot in step 4 |
101
+ | Affiliate program name | Brand-list pivot in step 4 |
102
+ | Platform named in the footer or source (sportsbook platform, storefront builder) | Vendor-level filter |
103
+
104
+ ## Behaviour fingerprints (supporting)
105
+
106
+ | Fingerprint | Use |
107
+ |---|---|
108
+ | Geo-block behaviour: which countries, what status code, challenge or branded page | Same edge configuration |
109
+ | Redirect chain (`www` to apex, mirror to parent, country path) | Reveals the parent brand |
110
+ | Response headers beyond the CDN defaults | Same origin stack |
111
+
112
+ ## Split-delivery check (sites reached through ads or short links)
113
+
114
+ Cloaking shows reviewers and crawlers one page and real visitors another.
115
+ The hidden page is often on another domain, and that domain is a new
116
+ seed. Request the landing URL and one deeper page (product or checkout)
117
+ as several visitors, strip session tokens and timestamps, and compare:
118
+
119
+ | Vary | Values to try |
120
+ |---|---|
121
+ | Device | Desktop browser, mobile browser |
122
+ | Crawler | Search crawler, ad-platform or social crawler, empty user agent |
123
+ | Arrival | No referrer, search referrer, social referrer, an ad-click parameter (`gclid`, `fbclid`, `ttclid`) on the URL |
124
+ | Location | The analyst's location and the target market, when an exit there is available |
125
+
126
+ Record the identities tried. "No split observed" covers only those
127
+ identities; untried ones go in coverage caveats.
128
+
129
+ ## Recording rule
130
+
131
+ Every fingerprint row carries: domain, category, value, level
132
+ (operator or platform), source (page, DNS, certificate log, WHOIS,
133
+ archive, company register, review site), and observed-at time.
134
+ A fingerprint without a source cannot be re-checked and cannot be scored.
@@ -0,0 +1,82 @@
1
+ # Pivots
2
+
3
+ A pivot turns a fingerprint into the question "which other domains have
4
+ this value?" and sends it to a source class that can answer. This file
5
+ says which source class fits which fingerprint, what a hit means, and where
6
+ the false positives come from. It does not prescribe tools or commands.
7
+
8
+ ## Source classes
9
+
10
+ | Source class | Answers | Examples of the class |
11
+ |---|---|---|
12
+ | Page-source index | Which pages contain this string (token, CSS literal, hostname) | Code-search engines for HTML, URL scanners with body search, internet-scan datasets with HTTP bodies |
13
+ | Passive DNS | Which domains have or had this nameserver, MX, TXT, CNAME, or address | Commercial passive-DNS services, historical DNS archives |
14
+ | Certificate transparency | Which names appear on certificates, and when | Public CT log search |
15
+ | Reverse WHOIS | Which domains share registrant fields, registrar, or timestamps | Reverse-WHOIS services, registrar-side history |
16
+ | Web archive | What the site served before it was blocked or rebranded | Public web archives, cached copies |
17
+ | Review aggregators | Operator, licence, launch year, affiliate program, complaints | Casino / merchant review directories, complaint forums |
18
+ | Licence register | Every domain licensed under one number or entity | Regulator's public register |
19
+ | Regulator enforcement record | The operator named for a domain the regulator acted on | Warnings, blocked-site lists, enforcement notices |
20
+ | Company register | Incorporation date, officers, secretary or registered agent, other companies of the same officers | National or state company registries and their mirrors |
21
+ | Affiliate directory | Every brand an affiliate program pays for | Affiliate-program brand lists, affiliate forums |
22
+ | Ordinary web search | Brand reviews, news, forum threads | General search — note it does not index page source |
23
+
24
+ ## Fingerprint to pivot map
25
+
26
+ | Fingerprint | Pivot to | Hit means | Trap |
27
+ |---|---|---|---|
28
+ | Analytics or pixel token | Page-source index | Same account configured both sites | A token can be scraped and pasted by an affiliate site; check the hit is the brand's own domain, not a review page |
29
+ | Block-page template literal | Page-source index | Same codebase | Framework defaults produce the same reset; pick a literal that is not in any public template |
30
+ | Support-address pattern | Page-source index, web search | Mirror names its parent | None significant |
31
+ | Support-email domain the operator registered | Page-source index, web search; then fingerprint that domain itself (registration, MX, site) | Brands run from one mailbox domain | A webmail or platform-issued domain links nothing |
32
+ | Tenant, store, or seller ID | Page-source index | Same platform account | Confirm the value is per-tenant: it must differ across the platform's unrelated stores |
33
+ | Payment account ID | Page-source index, archives | Same receiving account | Platform-wide keys (one key for every tenant) are vendor-level; confirm a different tenant shows a different value |
34
+ | Exact SPF string | Passive DNS | Same mail-vendor set | Single common includes (a lone Google or Microsoft include) match millions of domains; pivot on the full string |
35
+ | Microsoft tenant or vendor verification TXT | Passive DNS | Same organisation tenant | Google site-verification tokens are per domain; they do not pivot |
36
+ | Nameserver pair | Passive DNS | Same CDN account, probably | CDN pairs are reused across accounts; always require a second fingerprint |
37
+ | Hosting address / ASN | Passive DNS, internet-scan dataset | Same origin, only if the address is dedicated | Shared hosting; CDN fronting hides the origin; a platform ingress returns every tenant of the platform, so run the tenancy test first |
38
+ | CNAME target | Passive DNS | Same platform tenant | Vendor-level unless the target embeds a tenant name |
39
+ | Subdomain naming scheme | Certificate transparency | Same platform or mirror generator | Scheme may belong to the platform vendor, shared by its unrelated tenants |
40
+ | Registrar + proxy + timestamp | Reverse WHOIS | Same registration batch | Popular registrar-proxy combinations are common; timestamps within minutes are the real signal |
41
+ | Brand name stem | Certificate transparency, web search | Candidate mirror | A name match is a candidate only; confirm with a fingerprint |
42
+ | Licence number | Licence register | Every domain under the licence | Registers lag; a delisted domain is history, not a false link |
43
+ | Legal entity or address | Web search, page-source index (terms pages), company register | Same operator on paper | Corporate-service and registered-agent addresses are shared by hundreds of unrelated companies |
44
+ | Company officers (directors, shareholders when public) | Company register | Other companies the same people run, then their sites | Nominee directors serve many unrelated companies |
45
+ | Affiliate program | Affiliate directory | Same marketing arm | Some programs serve several operators |
46
+
47
+ ## Running a pivot
48
+
49
+ 1. State the fingerprint, the source class, and the exact query.
50
+ 2. Record the hit count, even if zero. Zero from a source that cannot see
51
+ the fingerprint (web search for a token) is "not observable", not
52
+ "absent".
53
+ 3. For each hit, note which fingerprint produced it. A domain reached by
54
+ two independent pivots is already close to Confirmed.
55
+ 4. Filter high-noise pivots (nameserver pair, registrar, single mail
56
+ include) by intersecting with the set of hits from a strong pivot before
57
+ any of them becomes a candidate.
58
+ 5. Prefer pivots whose hit count is small. A pivot returning thousands of
59
+ domains is not evidence until narrowed.
60
+ 6. Tag each log row with its loop pass. A pass that added members but has
61
+ no rows pivoting their new fingerprints is not finished.
62
+ 7. When a source is blocked (bot challenge, login, timeout), try another
63
+ source of the same class before logging the pivot "not observable",
64
+ and log each source tried.
65
+ 8. When an authoritative page (regulator notice, register entry) can be
66
+ read only through a search snippet, an archive copy, or a third-party
67
+ quote, cite it as such. It can name the entity in the entity chain,
68
+ but it does not count as an authoritative listing for scoring until
69
+ the page itself is read.
70
+
71
+ ## Blocked-site pivots
72
+
73
+ When the live site is unreachable:
74
+
75
+ - Pivot on the block page itself (template, token, support address).
76
+ - Use certificate history for subdomains and mirror schemes.
77
+ - Use web archives for the pre-block or pre-rebrand HTML, which usually
78
+ still carries the same tokens.
79
+ - Use mirrors that are reachable from the analyst's location; they share
80
+ the parent's fingerprints by design.
81
+ - Use review aggregators for the entity chain; they visited the site from
82
+ an allowed location.