@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.
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 +204 -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 +75 -0
  29. package/skills/app-dev/data-catalog/references/field-definitions.md +116 -0
  30. package/skills/app-dev/data-catalog/references/format.md +121 -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 +1392 -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 +571 -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,159 @@
1
+ # Auth Flows (login, signup, forgot-password)
2
+
3
+ > Read when: testing authentication surfaces — login, signup, password reset, magic link, OAuth callback. These span three tiers and cross an external boundary (email/SMS), which is why they are the most commonly mis-tested feature in a codebase.
4
+
5
+ Auth is special on two counts, both easy to get wrong:
6
+
7
+ 1. **It spans all three tiers** — the same feature owes a render-health test, functional negatives, *and* a real journey. Confusing them produces a test that looks like a journey but proves nothing.
8
+ 2. **It crosses an external boundary you don't own** — reset/verification email. The token round-trip is the whole point, and must be proven without calling a live provider.
9
+
10
+ ## The anti-pattern this exists to kill
11
+
12
+ A test tagged `@level journey` that only checks *a form element is visible*:
13
+
14
+ ```typescript
15
+ // ✗ A smoke test wearing a journey label. Proves nothing; can't fail the way the
16
+ // name promises. When the form fails to render at all (e.g. a seed/cache race),
17
+ // the disjunction just goes falsy with no specific signal.
18
+ test('Customer login page loads and renders login form', async ({ page }) => {
19
+ const response = await page.goto(`/${MERCHANT}/account/login`);
20
+ expect(response?.ok()).toBeTruthy();
21
+ const hasEmail = await page.getByLabel(/email/i).isVisible().catch(() => false);
22
+ const hasPassword = await page.getByLabel(/password/i).isVisible().catch(() => false);
23
+ const hasButton = await page.getByRole('button', { name: /login/i }).isVisible().catch(() => false);
24
+ expect(hasEmail || hasPassword || hasButton).toBeTruthy(); // weak disjunction
25
+ });
26
+ ```
27
+
28
+ Two syntactic tells — `.catch(() => false)` (swallows a locator throw, defeating web-first retry) and `expect(a || b || c).toBeTruthy()` (passes if *any* branch holds) — are flagged as leads for the reviewer (`swallowed-assertion`, `weak-assertion`). Writing them means a vacuous check, not a journey — replace with a real journey below.
29
+
30
+ ## Login
31
+
32
+ Separate two jobs that get conflated:
33
+
34
+ ### 1. Proving the login flow itself
35
+
36
+ A Tier-3 journey drives credentials to an **authenticated outcome** (not form presence), backed by Tier-2 functional negatives where most real bugs live.
37
+
38
+ ```typescript
39
+ // @covers /[merchant]/account/login
40
+ // @level journey
41
+ test('customer logs in and lands authenticated', async ({ page }) => {
42
+ const user = await factory.customer({ password: 'Correct-horse-9' }); // seed real state
43
+ await page.goto(`/${MERCHANT}/account/login`);
44
+ await page.getByLabel(/email/i).fill(user.email);
45
+ await page.getByLabel(/password/i).fill('Correct-horse-9');
46
+ await page.getByRole('button', { name: /log in|sign in/i }).click();
47
+ // Assert a CONCRETE post-login signal — redirect + authed-only content:
48
+ await expect(page).toHaveURL(new RegExp(`/${MERCHANT}/account$`));
49
+ await expect(page.getByRole('heading', { name: /my account/i })).toBeVisible();
50
+ });
51
+ ```
52
+
53
+ Back it with **Tier-2 functional negatives** where most real bugs live — e.g. `@level functional` "wrong password shows error and stays unauthenticated": fill a bad password, assert the error text is visible *and* `toHaveURL(/login/)` (did NOT get in).
54
+
55
+ Rules:
56
+
57
+ - **Seed the user** with a factory/seed script — never depend on ambient data. Missing state is the test's *arrange* step, never a skip reason.
58
+ - **Name every seeded account with the `e2e-` prefix** (see [the naming convention](#the-e2e--account-naming-convention) below) — the factory should emit it by default, not leave it to each call site.
59
+ - **Assert authenticated state**, not form presence: a redirect to an authed route, an authed-only element, or the session cookie. "A button is visible" is Tier-1 render-health.
60
+ - **Don't mock first-party auth endpoints** in the journey — real DB, real session. Intercepting `/api/auth/*` makes it `Over-mocked` (`ensure-coverage` → `references/depth/mock-policy.md`).
61
+
62
+ ### 2. Login as a precondition for other journeys
63
+
64
+ Don't re-type credentials in every test. Log in once and reuse the session via a shared auth fixture (`storageState`) or `E2E_AUTH_BYPASS`; other journeys start already-authed and only the login spec proves login itself. The cure for "no session" is to seed it, never skip.
65
+
66
+ ## A session fixture asserts its own preconditions, and throws
67
+
68
+ A minted session the app then rejects is the worst failure mode in this file: the request fails closed, nothing renders, and the spec dies on an **undiagnostic timeout**. Nothing in the diff looks wrong — there is no assertion against a 404 to spot, because the assertion was never reached. The lane goes on reporting green-or-flaky while proving nothing.
69
+
70
+ The recurring cause is a value the **app and the harness each default independently**: a tenant/org slug, an auth secret, a base URL, an API version. They agree until one side's default moves.
71
+
72
+ **Rules, in the order they close the hole:**
73
+
74
+ - **One owner per shared value.** A single constant mirrors the app's own resolver (`getRequiredOrgSlug()`, not a re-typed `?? "skyee"`), and the Playwright config sets the env var *from that constant* — in `webServer.env` **and** any inline command string, which drift apart otherwise.
75
+ - **Make the wrong value inexpressible.** Identities come from constructor functions (`authorizedIdentity()`, `denyOnlyIdentity()`) that fill the shared value themselves. If no call site can state it, no call site can state it wrongly — a rule prose cannot enforce, structure can.
76
+ - **Assert at mint time and throw with a diagnosis.** The fixture checks the value as it mints and, on mismatch, throws naming the identity id, *both* values, and the owning constant's file path. A loud throw is the entire difference between a five-minute fix and a five-round one; a timeout names nothing.
77
+ - **Close the vacuous-pass hole in deny fixtures.** A fixture that deliberately uses a wrong value opts in explicitly (`{ allowWrongOrg: true }`), and that flag is **rejected on a right-value identity** — otherwise a denial assertion passes for the wrong reason, and the negative test is as vacuous as the positive one.
78
+
79
+ The first two rules are what make this stick: a value no call site can express is a value no call site can get wrong. (Named incident: skyee-ai-risk #1144, where a tenant slug defaulted independently in four files kept authorized lanes green for five review rounds while exercising nothing.)
80
+
81
+ ## The `e2e-*` account naming convention
82
+
83
+ Every account, email, and tenant a test seeds carries an **`e2e-` prefix**:
84
+
85
+ ```
86
+ account e2e-<role>-<runid>@<test-domain> e2e-customer-x7f2@example.test
87
+ tenant e2e-<name> e2e-synthetic
88
+ username e2e-<role>-<runid> e2e-admin-x7f2
89
+ ```
90
+
91
+ Bake it into the **factory default** — `factory.customer()` emits a conforming email without the call site asking — so the convention can't erode one test at a time. Why a naming convention and not just "use seeded data":
92
+
93
+ - **Identifiable at a glance.** In a DB dump, log line, admin UI, or bug report, `e2e-` says "test artifact" with no lookup.
94
+ - **Bulk-cleanable.** `DELETE FROM users WHERE email LIKE 'e2e-%'` is a safe janitor job; without the prefix, cleanup needs a bookkeeping table that drifts.
95
+ - **Mechanically guarded.** The app/monitoring can special-case the prefix (exclude from analytics/emails/billing), and `golden-path`'s deployed-target rule builds on it: a mutating golden path off-`local` runs only against a declared synthetic tenant, and `golden-path validate` warns when a tenant is not `e2e-`-prefixed. (Production is governed by the stricter **read-only production profile** (`prod-preview`/`prod-active`), where a tenant grants nothing — this convention is what makes *staging* runs safe, not prod ones.)
96
+ - **Unambiguous in shared environments.** On staging/preview where real-ish data coexists, the prefix keeps a cleanup script or mutating smoke run from touching anything live.
97
+
98
+ Use a **run-scoped suffix** (a short random id per run) so parallel workers and repeated CI runs never collide on unique columns — never a fixed `e2e-test@example.com` singleton, which serializes workers and flakes on re-runs.
99
+
100
+ ## Forgot password — the email boundary is the whole flow
101
+
102
+ Email/SMS is an **external boundary you don't own** → *real internals, faked externals, nothing in between* (`ensure-coverage/references/depth/mock-policy.md`).
103
+
104
+ - ✗ Don't call a live email provider in CI (non-deterministic, flaky, leaks keys).
105
+ - ✗ Don't skip it because "email is external" — the exact rationalization the no-skip policy forbids; **sandbox the boundary** instead.
106
+ - ✗ Don't assert "the form renders" and call it a journey.
107
+
108
+ ✓ Fake the mail adapter so the app writes to a test outbox, then drive the **full durable-state** round-trip:
109
+
110
+ ```typescript
111
+ // @covers /[merchant]/account/forgot-password
112
+ // @level journey
113
+ test('reset password end to end', async ({ page }) => {
114
+ const user = await factory.customer({ password: 'old-pass-1' });
115
+
116
+ // 1. Request reset
117
+ await page.goto(`/${MERCHANT}/account/forgot-password`);
118
+ await page.getByLabel(/email/i).fill(user.email);
119
+ await page.getByRole('button', { name: /reset|send/i }).click();
120
+ await expect(page.getByText(/check your (email|inbox)/i)).toBeVisible();
121
+
122
+ // 2. Read the token from the FAKE outbox (or directly from the DB token table —
123
+ // both are real internals; live SMTP is the banned outward reach)
124
+ const link = await fakeMail.lastResetLink(user.email);
125
+
126
+ // 3. Complete the reset
127
+ await page.goto(link);
128
+ await page.getByLabel(/new password/i).fill('new-pass-2');
129
+ await page.getByRole('button', { name: /set|update/i }).click();
130
+
131
+ // 4. Prove the durable change: new password works
132
+ await login(page, { email: user.email, password: 'new-pass-2' });
133
+ await expect(page.getByRole('heading', { name: /my account/i })).toBeVisible();
134
+ });
135
+ ```
136
+
137
+ - Reading the token from the **fake outbox** also proves the send wiring; reading it from the **DB token table** proves only the token logic. Either is real-internal and valid — pick based on whether email dispatch is part of the contract you're proving.
138
+ - Cover the negatives as Tier-2 functional against the real DB: **expired token**, **already-used token**, **unknown email** (should not reveal account existence).
139
+
140
+ ## CI wiring
141
+
142
+ | Concern | Practice |
143
+ |---|---|
144
+ | **Where they run** | The **blocking** E2E lane. Once email is faked, both flows are fully hermetic — *no quarantine*. Quarantine is only for genuinely un-sandboxable externals (e.g. a real-provider deliverability check), which is a separate secret-gated test with a dedicated mailbox ([ci-integration.md](../ci-integration.md) → Quarantine lane). |
145
+ | **Seed timing** | Migrate → seed → **start servers** → run. Seed the user/tenant *before* servers boot, or bypass caches for E2E (e.g. an `ALLOW_E2E_ROUTES` flag). A freshly-seeded row a cached read can't yet see is a classic auth-journey flake. |
146
+ | **Email adapter** | Inject a fake/in-memory mail adapter via env in CI; never real keys, never a live provider. |
147
+ | **Presentation** | The presentation sweep ([presentation-sweep.md](../presentation-sweep.md)) catches "the form didn't render at all" — the bug a green functional run sails past. It is a **separate run**; the journey assertion is not a substitute. |
148
+ | **Getting to green** | Never weaken assertions or skip to pass — the reviewer's manufactured-green check and the `weak-assertion`/`swallowed-assertion` leads flag exactly that. |
149
+
150
+ ## Checklist
151
+
152
+ - [ ] Login journey asserts **authenticated state** (redirect / authed element / session cookie), not form presence.
153
+ - [ ] User/session **seeded** before server boot; caches bypassed for E2E.
154
+ - [ ] Values the app and harness share (tenant/org, secret, base URL) have **one owner**, and the session fixture **throws** on mismatch rather than letting the lane time out.
155
+ - [ ] Seeded accounts/tenants carry the **`e2e-` prefix** with a run-scoped suffix (factory default, not per-call-site).
156
+ - [ ] Forgot-password drives the **full reset → new-password-works** loop with a **faked mail boundary**.
157
+ - [ ] Negatives (wrong password, expired/used token, unknown email) are **Tier-2 functional** against the real DB.
158
+ - [ ] No first-party `page.route`/MSW interception in the journeys; no `.catch(() => false)`; no disjunctive `toBeTruthy()`.
159
+ - [ ] No skips; the presentation sweep runs separately from the journeys.
@@ -0,0 +1,73 @@
1
+ # Playwright Config
2
+
3
+ > Read when: creating or tuning `playwright.config.ts`, or dropping the E2E rules into a repo's AGENTS.md.
4
+
5
+ ```typescript
6
+ import { defineConfig, devices } from '@playwright/test';
7
+
8
+ export default defineConfig({
9
+ testDir: './e2e',
10
+ // Timeout convention: 15s for any single action/assertion — a real state change
11
+ // arrives in seconds; anything slower is a bug the test should surface, not wait out.
12
+ // The per-test ceiling stays higher (a journey is many 15s-bounded steps).
13
+ timeout: 60_000,
14
+ expect: { timeout: 15_000 },
15
+ fullyParallel: true,
16
+ forbidOnly: !!process.env.CI,
17
+ retries: process.env.CI ? 2 : 0,
18
+ // Parallel in CI too — wall clock ≈ slowest spec, not the sum. E2E_WORKERS is the
19
+ // CI-side knob (see ../ci-playwright-container.md → Resource Envelope and Workers);
20
+ // 4 fits a 4 CPU / 16 GB job. Drop to 2 only on OOM/browser crashes.
21
+ workers: process.env.CI ? Number(process.env.E2E_WORKERS) || 4 : undefined,
22
+ reporter: process.env.CI
23
+ ? [['github'], ['json', { outputFile: 'e2e-results.json' }], ['html', { open: 'never' }]]
24
+ : [['list'], ['html', { open: 'never' }]],
25
+ use: {
26
+ baseURL: process.env.BASE_URL || 'http://localhost:3000',
27
+ actionTimeout: 15_000,
28
+ navigationTimeout: 15_000,
29
+ trace: 'retain-on-failure',
30
+ screenshot: 'only-on-failure',
31
+ ignoreHTTPSErrors: true,
32
+ },
33
+ projects: [{ name: 'chromium', use: { ...devices['Desktop Chrome'] } }],
34
+ webServer: {
35
+ command: 'npm run dev',
36
+ url: process.env.BASE_URL || 'http://localhost:3000',
37
+ timeout: 120_000,
38
+ reuseExistingServer: !process.env.CI,
39
+ },
40
+ });
41
+ ```
42
+
43
+ ## AGENTS.md section
44
+
45
+ Drop into each repo's AGENTS.md or CLAUDE.md:
46
+
47
+ ```markdown
48
+ ## E2E Testing
49
+
50
+ ### Rules
51
+ 1. Every new route/endpoint MUST be added to `e2e/route-manifest.json` (the coverage audit will fail otherwise)
52
+ 2. Every new route needs at least a Tier 1 render-health test
53
+ 3. Interactive routes need Tier 2 functional tests (success + error + edge cases)
54
+ 4. Core business flows need Tier 3 journey tests — the golden paths (multi-step, real API); tag the do-not-ship subset `@golden-path`
55
+ 5. Directory: `render/`, `functional/`, `journeys/`
56
+ 6. Use `getByRole`/`getByLabel`/`getByText` -- not CSS selectors
57
+ 7. No `waitForTimeout()` -- wait for real state
58
+ 8. Run route discovery and reachability analysis before E2E coverage audits; do not audit from memory, sampling, or file enumeration alone
59
+ 9. Never skip a test: seed the state, route by project, quarantine with a dated exit (`@quarantine(until=…, issue=#…)`), or delete it
60
+ 10. Auth in shared fixtures (`e2e/fixtures/auth.ts`); test accounts and synthetic tenants carry the `e2e-` prefix (e.g. `e2e-customer-x1@example.test`, tenant `e2e-synthetic`)
61
+ 11. Timeouts: 15s per action/assertion (`actionTimeout`/`expect.timeout`); no per-test timeout raises without justification
62
+
63
+ ### Checks before a PR
64
+ - Run route detection -- a page/endpoint without a manifest entry is a gap
65
+ - Run the presentation sweep -- a route that throws on render is a bug even when a functional spec passes
66
+ - Reviewer will block PRs with uncovered interactive routes without justification
67
+
68
+ ### CI
69
+ - Curated golden-path smoke is the sole CI gate
70
+ - Smoke drives the real app with deterministic seeded state and no first-party interception
71
+ - the job passes only on an ALIVE verdict (DEAD, CANNOT-RUN, and EMPTY fail it)
72
+ - Reviewer will block uncovered interactive routes based on the audit evidence, not CI wiring
73
+ ```
@@ -0,0 +1,144 @@
1
+ # Playwright Patterns
2
+
3
+ > Read when: writing a spec: locators, waits, tier examples, and how to call the presentation instruments.
4
+
5
+ ## Locators
6
+
7
+ ```typescript
8
+ // Prefer semantic locators
9
+ page.getByRole('button', { name: 'Submit' })
10
+ page.getByLabel('Email')
11
+ page.getByText(/success/i)
12
+
13
+ // Avoid CSS selectors
14
+ page.locator('.btn-primary.text-red-500') // breaks on style changes
15
+ ```
16
+
17
+ ## Waiting
18
+
19
+ ```typescript
20
+ // Wait for real state
21
+ await page.getByRole('button', { name: 'Save' }).click();
22
+ await expect(page.getByText('Saved')).toBeVisible();
23
+
24
+ // No fixed sleeps
25
+ await page.waitForTimeout(3000); // flaky
26
+ ```
27
+
28
+ ## Assertions
29
+
30
+ ```typescript
31
+ // Assert on behavior
32
+ await expect(page.getByText(/invalid.*range/i)).toBeVisible();
33
+
34
+ // Don't assert CSS classes
35
+ await expect(page.locator('.text-red-500')).toBeVisible(); // implementation detail
36
+ ```
37
+
38
+ ## No skips
39
+
40
+ Seed the missing state, route by Playwright project, quarantine with a dated exit, or delete. `if (!order) return` is the worst form: it reports passed and asserts nothing. Policy: `ensure-coverage/references/process/test-strategy.md`.
41
+
42
+ ## Tier Examples
43
+
44
+ ### Tier 1 — Render-health
45
+
46
+ One test per route: navigate, verify no crash.
47
+
48
+ ```typescript
49
+ test.describe('Render-health: all routes load', () => {
50
+ for (const route of ['/', '/login', '/dashboard', '/settings']) {
51
+ test(`${route} loads`, async ({ page }) => {
52
+ const errors: string[] = [];
53
+ page.on('pageerror', (err) => errors.push(err.message));
54
+ await page.goto(route);
55
+ await expect(page.locator('body')).toBeVisible();
56
+ expect(errors).toEqual([]);
57
+ });
58
+ }
59
+ });
60
+ ```
61
+
62
+ ### Tier 2 — Functional
63
+
64
+ Cover success + failure + edge cases per feature.
65
+
66
+ ```typescript
67
+ test.describe('Date Range Filter', () => {
68
+ test('applies range and updates data', async ({ page }) => {
69
+ await page.goto('/dashboard');
70
+ await page.getByLabel('From').fill('2026-01-01');
71
+ await page.getByRole('button', { name: 'Apply' }).click();
72
+ await expect(page.getByTestId('data-table')).toBeVisible();
73
+ });
74
+
75
+ test('shows error for invalid range', async ({ page }) => {
76
+ await page.goto('/dashboard');
77
+ await page.getByLabel('From').fill('2026-12-31');
78
+ await page.getByLabel('To').fill('2026-01-01');
79
+ await page.getByRole('button', { name: 'Apply' }).click();
80
+ await expect(page.getByText(/invalid.*range/i)).toBeVisible();
81
+ });
82
+ });
83
+ ```
84
+
85
+ ### Tier 3 — Journey (golden paths)
86
+
87
+ Multi-step flow, real API calls. Mock only external third-party APIs. These are the golden paths; the do-not-ship subset is tagged `@golden-path` for the golden-path gate.
88
+
89
+ ```typescript
90
+ test('login then view dashboard then filter', async ({ page }) => {
91
+ await page.goto('/login');
92
+ await page.getByLabel('Token').fill(process.env.E2E_TOKEN!);
93
+ await page.getByRole('button', { name: 'Login' }).click();
94
+ await expect(page.getByRole('heading', { name: /dashboard/i })).toBeVisible();
95
+ await page.getByRole('button', { name: '7d' }).click();
96
+ const resp = await page.waitForResponse('**/api/data*');
97
+ expect(resp.status()).toBe(200);
98
+ });
99
+ ```
100
+
101
+ ## Route Mocking (Tier 2 only)
102
+
103
+ ```typescript
104
+ await page.route('**/api/data*', (route) => {
105
+ void route.fulfill({ status: 500, contentType: 'application/json',
106
+ body: JSON.stringify({ error: 'SERVER_ERROR', message: 'boom' }) });
107
+ });
108
+ await page.goto('/dashboard');
109
+ await expect(page.getByText(/failed to fetch/i)).toBeVisible();
110
+ ```
111
+
112
+ ## Presentation checks
113
+
114
+ A functional journey proves the page *works*; it does not prove a human can *see and use* it. The instruments in `scripts/` add per-route checks against the real page. Tag the spec with the level so the ledger resolves it; a DOM-only or JSDOM equivalent grades `Over-mocked`.
115
+
116
+ ```typescript
117
+ // @covers /dashboard
118
+ // @level browser-journey
119
+ // @level presentation:spatial
120
+ import { assertNoHorizontalOverflow, assertNoOverlap } from '<skill-dir>/scripts/presentation-checks.mjs';
121
+ import { assertContrast } from '<skill-dir>/scripts/presentation-perceivability.mjs';
122
+ import { assertTargetSizes, assertFocusVisible } from '<skill-dir>/scripts/presentation-reachability.mjs';
123
+ import { assertNoFirstPartyShift } from '<skill-dir>/scripts/presentation-temporal.mjs';
124
+
125
+ test('dashboard is laid out, perceivable, actionable, and still', async ({ page }) => {
126
+ await page.goto('/dashboard');
127
+ await expect(page.getByRole('heading', { name: /dashboard/i })).toBeVisible();
128
+ await assertNoHorizontalOverflow(page); // spatial, at 375 + 1280
129
+ await assertNoOverlap(page, { allowlist: [{ match: 'carousel', category: 'decorative', reason: 'z-stacked slides' }] });
130
+ await assertContrast(page); // perceivability; throws AbstainError on an axe abstain (`Unverified`)
131
+ await assertTargetSizes(page); // reachability: >=44px targets
132
+ await assertFocusVisible(page, page.getByRole('button', { name: 'Save' }));
133
+ await assertNoFirstPartyShift(page, { // temporal: hermetic, gated on a stable condition, never a sleep
134
+ trigger: () => page.getByRole('button', { name: 'Load more' }).click(),
135
+ settle: page.getByTestId('row-50'),
136
+ });
137
+ });
138
+ ```
139
+
140
+ - Each level is a separate obligation; a journey alone satisfies none of them.
141
+ - Suppress intentional overflow or overlap only through the gated allowlist (`category` + `reason`); an entry that would hide an overlap on an interactive control is rejected.
142
+ - Disabled controls are WCAG-exempt and skipped by `assertContrast`, not false-flagged.
143
+ - `assertNoNavOrphans(page, manifestRoutes, { ignore: [...] })` runs once per app: every manifest route must be reachable by crawling nav from `/`.
144
+ - Third-party payfields (`assertNoThirdPartyShift`) touch a provider sandbox iframe, so that check lives in the quarantine lane, never the blocking one.
@@ -0,0 +1,25 @@
1
+ # CI Integration
2
+
3
+ Read only when the user has asked to wire gates. **Gates are added by humans only**: do not add, recommend, or audit CI gates on your own. The only supported CI shape is ensure-coverage's smoke-only contract (`ensure-coverage/references/enforcement/ci-contract.md`). The ledger, route inventory, presentation sweep, broad suite, lint, and quarantine checks are local or review-time evidence, not CI gates.
4
+
5
+ ## Wire golden-path smoke
6
+
7
+ - **GitHub Actions:** the `golden-path` skill generates `.github/workflows/golden-paths.yml` from the repo's `golden-paths.json` (`golden-path init --write`); its `check` step fails CI when the workflow drifts from the contract.
8
+ - **Cloud Build:** copy [`assets/ci-gates.cloudbuild.yaml`](../assets/ci-gates.cloudbuild.yaml) and fill the `<…>` placeholders. It calls the engine copy `golden-path init` puts in the repo (`scripts/golden-paths/golden-path.mjs`), so the runner needs no skills tree.
9
+
10
+ Then verify that the golden-path verdict is present and blocking:
11
+
12
+ ```bash
13
+ node <ensure-coverage>/scripts/ci-audit.mjs --files <your ci configs>
14
+ ```
15
+
16
+ ## Smoke job rules
17
+
18
+ - Run the curated do-not-ship journeys against the real application and deterministic seeded state.
19
+ - Do not intercept first-party requests or replace owned storage and services.
20
+ - Keep the job blocking; do not use `continue-on-error`, `allowFailure`, `|| true`, `--warn-only`, or `set +e`.
21
+ - Fail the job unless the verdict is ALIVE (`fail` is DEAD; `blocked`, `cannot-run`, or `missing` is CANNOT-RUN).
22
+ - Keep the contract small enough for the PR lane. Parallelize paths rather than deleting them.
23
+ - Use provider test credentials, never live credentials.
24
+
25
+ The full presentation sweep and broad E2E suite may still be run by developers, reviewers, scheduled diagnostics, or another owner-defined workflow. This skill does not require or audit them as CI gates.