@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,707 @@
1
+ ---
2
+ name: cloud-build
3
+ description: "Build or debug Cloud Build pipelines for Cloud Run: cloudbuild.yaml, triggers, Artifact Registry, builds, migrations, deploys, secrets, VPC, notifications. Use cloud-deploy for staged promotion. NOT for GitHub Actions PR checks (github-actions)."
4
+ release-version: 0.36.0
5
+ ---
6
+ **Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
7
+ # Cloud Build Direct Deploy to Cloud Run
8
+
9
+ ## Related Skills
10
+
11
+ - [google-cloud](../google-cloud/SKILL.md) - Centralized GCP operations
12
+ - [IAM patterns](../google-cloud/references/iam.md) - Service accounts, roles, IAP, token minting
13
+ - [VPC configuration](../google-cloud/references/vpc.md) - Networks, subnets, Cloud Run with VPC
14
+ - [Secrets Manager](../google-cloud/references/secrets.md) - Secret setup, access, Cloud Run integration
15
+ - [cloud-deploy](../cloud-deploy/SKILL.md) - Complex deployments with Cloud Deploy + Skaffold
16
+ - [cloud-debug](../cloud-debug/SKILL.md) - Debugging Cloud Build/Deploy failures
17
+
18
+ ## When to Use
19
+
20
+ - Single container deployments
21
+ - Services handling own migrations (e.g., Airflow standalone)
22
+ - No need for staged promotion with verification
23
+
24
+ For complex deployments with migrations and verification, use `cloud-deploy` skill.
25
+
26
+ ## Architecture
27
+
28
+ **GitFlow (default)** — a long-lived integration branch plus a production branch:
29
+
30
+ ```
31
+ dev push ────→ Cloud Build ────→ Cloud Run (dev)
32
+ PR to master ─→ Cloud Build ────→ Cloud Run (staging)
33
+ v*-rc.* tag ──→ Cloud Build ────→ Cloud Run (prod, 0% traffic candidate)
34
+ ```
35
+
36
+ **GitHub Flow** — one long-lived branch; see [GitHub Flow variant](#github-flow-variant) for the trigger set and what changes:
37
+
38
+ ```
39
+ PR opened ─────→ Cloud Build ────→ build + test only, no deploy
40
+ merge to main ─→ Cloud Build ────→ Cloud Run (staging, 100% traffic)
41
+ v*-rc.* tag ───→ Cloud Build ────→ Cloud Run (prod, 0% traffic candidate)
42
+ ```
43
+
44
+ **The prod fork is identical in both.** It keys off the rc tag, not off a branch — which is the practical payoff of triggering production on a tag: the release path stops caring what the branching model is.
45
+
46
+ ## Environment Configuration
47
+
48
+ ### Triggers
49
+
50
+ - **Dev**: `dev` branch push — active development
51
+ - **Staging**: PR to `master` — PR validation
52
+ - **Prod**: `v*-rc.*` tag push — builds a candidate revision at 0% traffic; the release lane verifies it and shifts traffic
53
+
54
+ ### Database
55
+
56
+ - **Dev**: Dedicated dev DB — migrations skipped for faster iteration
57
+ - **Staging**: Dedicated staging DB — runs migrations + test seeds
58
+ - **Prod**: Production DB — runs migrations + prod seeds
59
+
60
+ Dev skips migrations/seeds during build for speed. Cloud Run Jobs are still configured so they can be triggered manually when needed.
61
+
62
+ **For Cloud SQL connection patterns, see [google-cloud skill VPC reference](../google-cloud/references/vpc.md) — Cloud SQL Connection Standard.**
63
+
64
+ ### Build Steps
65
+
66
+ All environments run: **setup env → build → update job → deploy → test**
67
+
68
+ Staging + Prod additionally run: **migrate → seed**
69
+
70
+ Step descriptions:
71
+ - **setup env**: Initialize environment-specific variables (VPC, secrets)
72
+ - **build**: Build and push Docker image to Artifact Registry
73
+ - **update job**: Configure Cloud Run Jobs (for migrate/seed) — does not execute them
74
+ - **migrate**: Execute database migration job
75
+ - **deploy**: Deploy to Cloud Run service
76
+ - **seed**: Execute database seed job
77
+ - **test**: Run integration tests against deployed service
78
+
79
+ ### Migration Best Practice: Skip When Schema Inputs Are Unchanged
80
+
81
+ If migrations run through Cloud Build, prefer a single combined **migrate-if-needed** step rather than separate "check", "update job", and "execute job" steps. The step should:
82
+
83
+ 1. Hash only the files that define database shape
84
+ 2. Compare that hash to the last applied hash stored outside the build workspace
85
+ 3. Skip migration image build, job update, and job execution when the hash is unchanged
86
+
87
+ Use a persistent marker such as a GCS object:
88
+
89
+ ```text
90
+ gs://$PROJECT_ID_cloudbuild/migrate-markers/{service}-${_ENV}.digest
91
+ ```
92
+
93
+ Why:
94
+ - Avoids slow no-op migration runs on every deploy
95
+ - Works with Cloud Build's shallow clone and source mirror limitations
96
+ - Keeps migration execution tied to actual schema changes rather than every app change
97
+
98
+ Do not hash the whole repo. Hash only migration-relevant inputs for the ORM in use.
99
+
100
+ Practical rules:
101
+ - Do **not** gate migrations with `git diff HEAD^ HEAD`. Merge commits, shallow clones, and repository-event checkouts can compare against the wrong parent and produce false positives.
102
+ - The **first** build after adopting digest-based gating should usually run migrations once, because there is no previous marker yet. That is expected marker seeding, not a failure of the gate.
103
+ - After a successful migration job, write the new digest marker even if the job only reports "database schema is up to date". Otherwise every later build will look like a first run.
104
+ - Prefer `gcr.io/google.com/cloudsdktool/cloud-sdk:slim` and keep the skip path to a single always-started SDK step. A split "decide" + "maybe-run" pattern is usually slower for the common unchanged-schema case.
105
+ - If Cloud Build UI still shows a migration step, check whether it truly executed a Cloud Run Job or only started a step that exited early. Those are different.
106
+
107
+ ### Prisma Example
108
+
109
+ For Prisma, prefer hashing:
110
+ - `prisma/schema.prisma`
111
+ - `prisma/migrations/**`
112
+
113
+ If the digest is unchanged, skip all migration job work. A pragmatic pattern is a single slim SDK step that:
114
+ - computes the digest
115
+ - compares it with the stored marker
116
+ - exits immediately when unchanged
117
+ - otherwise deploys and executes the migration job
118
+ - writes the new digest back to GCS after success
119
+
120
+ Example:
121
+
122
+ ```yaml
123
+ - name: gcr.io/google.com/cloudsdktool/cloud-sdk:slim
124
+ id: migrate-if-needed
125
+ entrypoint: bash
126
+ args:
127
+ - -ceu
128
+ - |
129
+ digest_file="/workspace/migration-digest.txt"
130
+ marker="gs://${PROJECT_ID}_cloudbuild/migrate-markers/{service}-${_ENV}.digest"
131
+ current_digest="$$( \
132
+ { \
133
+ printf '%s\0' prisma/schema.prisma; \
134
+ find prisma/migrations -type f -print0; \
135
+ } | sort -z | xargs -0 sha256sum | sha256sum | cut -d' ' -f1 \
136
+ )"
137
+ previous_digest="$$(gcloud storage cat "$${marker}" 2>/dev/null || true)"
138
+
139
+ if [[ -n "$${previous_digest}" && "$${previous_digest}" == "$${current_digest}" ]]; then
140
+ echo "Prisma schema unchanged; skipping migrate job."
141
+ exit 0
142
+ fi
143
+
144
+ printf '%s' "$${current_digest}" > "$${digest_file}"
145
+
146
+ migration_script="$$(cat <<'EOF'
147
+ status_output=$$(pnpm prisma migrate status 2>&1 || true)
148
+ echo "$${status_output}"
149
+ if grep -qi "Database schema is up to date" <<<"$${status_output}"; then
150
+ echo "Database already up to date"
151
+ exit 0
152
+ fi
153
+ if grep -qi "Following migration" <<<"$${status_output}" || grep -qi "have not yet been applied" <<<"$${status_output}"; then
154
+ pnpm prisma migrate deploy
155
+ exit 0
156
+ fi
157
+ echo "Unexpected prisma migrate status output"
158
+ exit 1
159
+ EOF
160
+ )"
161
+
162
+ gcloud run jobs deploy {service}-${_ENV}-migrate \
163
+ --image=$LOCATION-docker.pkg.dev/$PROJECT_ID/{repo}/{service}:$COMMIT_SHA \
164
+ --region=$LOCATION \
165
+ --command=bash \
166
+ --args=-ceu \
167
+ --args="$${migration_script}"
168
+
169
+ gcloud run jobs execute {service}-${_ENV}-migrate --region=$LOCATION --wait --format=none
170
+ gcloud storage cp "$${digest_file}" "$${marker}"
171
+ ```
172
+
173
+ ### Tortoise ORM + Aerich Example
174
+
175
+ For Tortoise ORM, there is no single canonical schema file like Prisma. Hash:
176
+ - `aerich.ini` or equivalent Aerich config
177
+ - `migrations/**` or `aerich/**` migration files
178
+ - the model packages that define Tortoise tables
179
+
180
+ The same preference applies here: a combined digest-check + migrate-if-needed step is usually better than separate decision and execution steps unless the pipeline has a strong reason to split them.
181
+
182
+ Example:
183
+
184
+ ```yaml
185
+ - name: gcr.io/google.com/cloudsdktool/cloud-sdk:slim
186
+ id: check-migrations
187
+ entrypoint: bash
188
+ args:
189
+ - -ceu
190
+ - |
191
+ marker="gs://${PROJECT_ID}_cloudbuild/migrate-markers/{service}-${_ENV}.digest"
192
+ current_digest="$$( \
193
+ { \
194
+ printf '%s\0' aerich.ini; \
195
+ find migrations -type f -print0 2>/dev/null || true; \
196
+ find app/models -type f \\( -name '*.py' -o -name '*.sql' \\) -print0; \
197
+ } \
198
+ | sort -z \
199
+ | xargs -0 sha256sum \
200
+ | sha256sum \
201
+ | cut -d' ' -f1)"
202
+ previous_digest="$$(gcloud storage cat "$${marker}" 2>/dev/null || true)"
203
+
204
+ if [[ -n "$${previous_digest}" && "$${previous_digest}" == "$${current_digest}" ]]; then
205
+ echo "Aerich inputs unchanged; skipping migrate job."
206
+ exit 0
207
+ fi
208
+
209
+ touch /workspace/.migrate-needed
210
+ printf '%s' "$${current_digest}" > /workspace/.new-migration-digest
211
+ ```
212
+
213
+ For Aerich, keep the migration command deterministic inside the Cloud Run Job:
214
+
215
+ ```bash
216
+ aerich upgrade
217
+ ```
218
+
219
+ If you generate migrations in CI, treat that as a separate workflow with tighter review controls. For normal deploys, prefer committing generated migration files and only applying them in Cloud Build.
220
+
221
+ ## cloudbuild.yaml
222
+
223
+ ```yaml
224
+ substitutions:
225
+ _ENV: dev
226
+ _MIN_INSTANCES: '0'
227
+ _DATABASE_URL_SECRET: {service}-database-url-${_ENV}
228
+ _SECRET_KEY: {service}-secret-key
229
+ # VPC configuration per environment
230
+ _VPC_NETWORK_DEV: 'default'
231
+ _VPC_SUBNET_DEV: 'default'
232
+ _VPC_NETWORK_STAGING: 'default'
233
+ _VPC_SUBNET_STAGING: 'default'
234
+ _VPC_NETWORK_PROD: 'prod'
235
+ _VPC_SUBNET_PROD: 'prod'
236
+
237
+ steps:
238
+ # Initialize environment-specific variables
239
+ - name: 'bash'
240
+ env:
241
+ - '_ENV=${_ENV}'
242
+ - '_VPC_NETWORK_DEV=${_VPC_NETWORK_DEV}'
243
+ - '_VPC_NETWORK_STAGING=${_VPC_NETWORK_STAGING}'
244
+ - '_VPC_NETWORK_PROD=${_VPC_NETWORK_PROD}'
245
+ - '_VPC_SUBNET_DEV=${_VPC_SUBNET_DEV}'
246
+ - '_VPC_SUBNET_STAGING=${_VPC_SUBNET_STAGING}'
247
+ - '_VPC_SUBNET_PROD=${_VPC_SUBNET_PROD}'
248
+ args:
249
+ - '-c'
250
+ - |
251
+ ENV_UPPER=$$(echo "$$_ENV" | tr '[:lower:]' '[:upper:]')
252
+ NETWORK_VAR="_VPC_NETWORK_$$ENV_UPPER"
253
+ SUBNET_VAR="_VPC_SUBNET_$$ENV_UPPER"
254
+ VPC_NETWORK="$${!NETWORK_VAR}"
255
+ VPC_SUBNET="$${!SUBNET_VAR}"
256
+ echo "VPC_NETWORK=$$VPC_NETWORK" > /workspace/env.sh
257
+ echo "VPC_SUBNET=$$VPC_SUBNET" >> /workspace/env.sh
258
+ echo "Initialized: VPC network=$$VPC_NETWORK, subnet=$$VPC_SUBNET"
259
+
260
+ # Build the Docker image
261
+ - name: 'gcr.io/cloud-builders/docker'
262
+ args:
263
+ - 'build'
264
+ - '-t'
265
+ - '$LOCATION-docker.pkg.dev/$PROJECT_ID/{repo}/{service}:$COMMIT_SHA'
266
+ - '-t'
267
+ - '$LOCATION-docker.pkg.dev/$PROJECT_ID/{repo}/{service}:latest'
268
+ - '.'
269
+
270
+ # Push to Artifact Registry
271
+ - name: 'gcr.io/cloud-builders/docker'
272
+ args:
273
+ - 'push'
274
+ - '--all-tags'
275
+ - '$LOCATION-docker.pkg.dev/$PROJECT_ID/{repo}/{service}'
276
+
277
+ # Deploy to Cloud Run
278
+ - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
279
+ entrypoint: bash
280
+ args:
281
+ - '-c'
282
+ - |
283
+ source /workspace/env.sh
284
+ gcloud run deploy {service}-${_ENV} \
285
+ --image=$LOCATION-docker.pkg.dev/$PROJECT_ID/{repo}/{service}:$COMMIT_SHA \
286
+ --region=$LOCATION \
287
+ --platform=managed \
288
+ --min-instances=${_MIN_INSTANCES} \
289
+ --max-instances=1 \
290
+ --memory=2Gi \
291
+ --cpu=1 \
292
+ --port=8080 \
293
+ --cpu-boost \
294
+ --no-cpu-throttling \
295
+ --timeout=300 \
296
+ --set-secrets=DATABASE_URL=${_DATABASE_URL_SECRET}:latest,SECRET_KEY=${_SECRET_KEY}:latest \
297
+ --network=$${VPC_NETWORK} \
298
+ --subnet=$${VPC_SUBNET}
299
+
300
+ options:
301
+ logging: CLOUD_LOGGING_ONLY
302
+ machineType: E2_HIGHCPU_8
303
+ ```
304
+
305
+ ## Infrastructure Configuration
306
+
307
+ For IAM, VPC, Secrets, and IAP patterns, see the [google-cloud](../google-cloud/SKILL.md) skill:
308
+
309
+ - **VPC**: [google-cloud/vpc.md](../google-cloud/references/vpc.md) - Network/subnet setup for Cloud Run
310
+ - **Secrets**: [google-cloud/secrets.md](../google-cloud/references/secrets.md) - Secret Manager setup and Cloud Run integration
311
+ - **IAM/IAP**: [google-cloud/iam.md](../google-cloud/references/iam.md) - Service accounts, roles, IAP access, token minting
312
+
313
+ ### Build Triggers
314
+
315
+ ```bash
316
+ # Dev
317
+ gcloud builds triggers create github --name="{service}-dev" \
318
+ --repo-name="REPO" --repo-owner="OWNER" --branch-pattern="^dev$" \
319
+ --build-config="cloudbuild.yaml" --substitutions="_ENV=dev,_MIN_INSTANCES=0"
320
+
321
+ # Staging
322
+ gcloud builds triggers create github --name="{service}-staging" \
323
+ --repo-name="REPO" --repo-owner="OWNER" --pull-request-pattern="^master$" \
324
+ --build-config="cloudbuild.yaml" --substitutions="_ENV=staging,_MIN_INSTANCES=0"
325
+
326
+ # Prod — fires on release-candidate tags minted by the release lane, not on branch push
327
+ gcloud builds triggers create github --name="{service}-prod" \
328
+ --repo-name="REPO" --repo-owner="OWNER" --tag-pattern="^v[0-9]+\.[0-9]+\.[0-9]+-rc\.[0-9]+$" \
329
+ --build-config="cloudbuild.yaml" --substitutions="_ENV=prod,_MIN_INSTANCES=1"
330
+ ```
331
+
332
+ **Footgun: the prod tag pattern must not match the final `v<version>` tag.** The release lane mints `v1.4.0-rc.1` to produce a candidate, and then — after the candidate verifies ALIVE and traffic is at 100% — mints `v1.4.0`. A loose pattern like `^v.*$` matches both, so the final tag fires a second production build that rebuilds and redeploys an already-live release at 0% traffic for no reason. Anchor the `-rc.<n>` suffix, as above, and check the pattern against both tag shapes before creating the trigger.
333
+
334
+ Dev and staging triggers are unchanged: `dev` still builds on branch push, staging still builds on PRs to `master`.
335
+
336
+ ### GitHub Flow variant
337
+
338
+ One long-lived branch (`main`), short-lived feature branches, no `dev`. Three triggers, the same `cloudbuild.yaml`:
339
+
340
+ ```bash
341
+ # PR — build and test only. No deploy: a PR is not an environment.
342
+ gcloud builds triggers create github --name="{service}-pr" \
343
+ --repo-name="REPO" --repo-owner="OWNER" --pull-request-pattern="^main$" \
344
+ --build-config="cloudbuild.yaml" --substitutions="_ENV=ci"
345
+
346
+ # Staging — every merge to main deploys at 100% and records the SHA-keyed verdict
347
+ gcloud builds triggers create github --name="{service}-staging" \
348
+ --repo-name="REPO" --repo-owner="OWNER" --branch-pattern="^main$" \
349
+ --build-config="cloudbuild.yaml" --substitutions="_ENV=staging,_MIN_INSTANCES=0"
350
+
351
+ # Prod — byte-identical to the GitFlow prod trigger
352
+ gcloud builds triggers create github --name="{service}-prod" \
353
+ --repo-name="REPO" --repo-owner="OWNER" --tag-pattern="^v[0-9]+\.[0-9]+\.[0-9]+-rc\.[0-9]+$" \
354
+ --build-config="cloudbuild.yaml" --substitutions="_ENV=prod,_MIN_INSTANCES=1"
355
+ ```
356
+
357
+ **`_ENV=staging` takes the dev fork's behavior, not the GitFlow staging behavior.** It deploys at 100% and runs the smoke as a **non-blocking recorder** publishing a `dev-smoke`-style commit status — because under GitHub Flow this environment *is* the integration environment. Reuse the [dev fork step](#integration-dev-deploy-100-record-the-verdict-never-fail-the-build) verbatim, matching on `staging` instead of `dev`. Everything else — build, migrations, seeds, the prod fork — is unchanged.
358
+
359
+ **What the recorded verdict means here is weaker, and that is the one thing to understand.** In GitFlow, the promoted SHA and the validated SHA are the same commit: `dev` is validated, and the promotion fast-forwards it into `main`. Under GitHub Flow there is only one branch, so the release lane cuts `release/<version>` at a validated SHA, merges it back into `main`, and the **shipped SHA is that merge commit** — which also carries anything else that landed on `main` meanwhile. Those commits never earned a verdict.
360
+
361
+ So under GitHub Flow the SHA-keyed staging verdict is a **pre-filter, not the release gate**. The gate is the prod candidate at 0% traffic, which validates the *exact shipped SHA* on real infrastructure before any user reaches it. That is sound precisely because of the 0%-candidate design — under a deploy-then-smoke pipeline the same topology would ship unvalidated commits straight to users.
362
+
363
+ **Order is forced: merge first, then tag.** The release tag must name a SHA on the production branch, so the release branch cannot be rc-tagged before it lands on `main`. Merge the release PR, then mint the rc on the merge commit. `rush-release` owns this sequencing.
364
+
365
+ ## Build Notifications
366
+
367
+ Build notifications can be routed via Cloud Build Pub/Sub topic to external services (Slack, Discord, webhooks). Configure the notification sink at the project level.
368
+
369
+ **Critical:** Do NOT set `options.pubsubTopic` in `cloudbuild.yaml` — it overrides the built-in topic and can break your notification pipeline.
370
+
371
+ ## Post-deploy smoke gate (Cloud Run)
372
+
373
+ A "deploy SUCCESS" only proves the revision is `Ready` — not that the real built image, with real secrets/env, actually works. The bug class this catches lives *only* in the deployed artifact (a secret with a trailing newline, an env substitution like `_ENV` stripped at deploy, a file not `COPY`ed into the image, a `redirect_uri` from the container bind origin, traffic pinned to a stale revision). No PR-lane or `next dev` test sees it. Run a curated **smoke gate** against the deployed revision — the canonical doctrine, the manifest format, and the `--target` semantics live in the **`smoke` skill** (`skills/engineering/smoke`); this section is only the Cloud Run/Cloud Build *placement*.
374
+
375
+ **The pipeline owns artifacts. The release lane owns exposure.** That seam decides what each fork of the build is allowed to do. The build's job ends at producing something verifiable — an image, a revision, a verdict. Deciding that users should see it is the release lane's job, not a build step's.
376
+
377
+ **Where it blocks depends on who the environment serves.** The blocking placement protects *users*, so it belongs on the **production** path. An integration environment (`dev`) has no users to protect — there, a blocking smoke only converts small bugs and infra flakes into failed builds and full rebuild cycles. So the same seam cuts differently per fork, and each fork's contract output is different:
378
+
379
+ - **`dev` output: a SHA-keyed verdict.** Deploy at 100%, smoke as a non-blocking recorder, and publish the verdict as a commit status. When configured as required CI, it helps `rush-release` select the newest green trunk SHA; the production candidate smoke remains the definitive release gate.
380
+ - **prod output: a 0%-traffic candidate revision.** Deploy with `--no-traffic`, surface the revision name and candidate URL, and **stop**. The build does not smoke it and does not shift traffic — `rush-release` does both.
381
+
382
+ **Why the prod gate moved out of the build.** The gate did not disappear; it moved to where it can be operated:
383
+
384
+ - **Validation becomes retryable without a rebuild.** A red smoke inside the build means re-triggering the whole build to retry a config or secret fix. Against an already-deployed candidate URL it is a re-run measured in seconds.
385
+ - **The traffic shift sits behind a human authorization point.** A build step promoting traffic is an automatic decision made by whoever pushed a tag. In the release lane it is an explicit act with a person and a version behind it.
386
+ - **The pipeline can change without the release doctrine changing.** `cloudbuild.yaml` is free to change builders, regions, or step order; the release contract is still "give me a candidate at 0%."
387
+
388
+ ### Production: build a candidate, stop before traffic
389
+
390
+ The prod fork's entire contract is three facts:
391
+
392
+ - **In:** a tag push matching `v*-rc.*` — release-candidate tags, minted by the release lane.
393
+ - **Out:** a candidate revision deployed at **0% traffic**, with its revision name and candidate URL discoverable by the caller.
394
+ - **Never:** it does not validate, and it does not shift traffic.
395
+
396
+ ```
397
+ tag v*-rc.* → build → deploy --no-traffic --tag candidate → publish {revision, url} → END
398
+ │
399
+ rush-release: golden-path prod-preview (read-only) ──────┤
400
+ ALIVE → update-traffic 100%, tag v<version>
401
+ DEAD → delete the 0% revision (traffic never moved)
402
+ ```
403
+
404
+ Because traffic never moved, a DEAD verdict is not a rollback and has no user impact — the candidate revision is simply deleted.
405
+
406
+ ```yaml
407
+ # Prod fork: deploy the candidate at 0% traffic, then stop.
408
+ - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
409
+ id: deploy-candidate
410
+ entrypoint: bash
411
+ args:
412
+ - '-c'
413
+ - |
414
+ [[ "${_ENV}" == "prod" ]] || exit 0
415
+ source /workspace/env.sh
416
+ gcloud run deploy {service}-${_ENV} \
417
+ --image=$LOCATION-docker.pkg.dev/$PROJECT_ID/{repo}/{service}:$COMMIT_SHA \
418
+ --region=$LOCATION \
419
+ --platform=managed \
420
+ --min-instances=${_MIN_INSTANCES} \
421
+ --max-instances=1 \
422
+ --memory=2Gi \
423
+ --cpu=1 \
424
+ --port=8080 \
425
+ --cpu-boost \
426
+ --no-cpu-throttling \
427
+ --timeout=300 \
428
+ --set-secrets=DATABASE_URL=${_DATABASE_URL_SECRET}:latest,SECRET_KEY=${_SECRET_KEY}:latest \
429
+ --network=$${VPC_NETWORK} \
430
+ --subnet=$${VPC_SUBNET} \
431
+ --no-traffic \
432
+ --tag=candidate
433
+
434
+ # Publish the candidate coordinates for the release lane. Build ends here.
435
+ - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
436
+ id: publish-candidate
437
+ entrypoint: bash
438
+ args:
439
+ - '-c'
440
+ - |
441
+ [[ "${_ENV}" == "prod" ]] || exit 0
442
+ svc="$$(gcloud run services describe {service}-${_ENV} --region=$LOCATION --format=json)"
443
+
444
+ # Read BOTH coordinates off the same `candidate` traffic entry. Do not reach for
445
+ # .status.latestCreatedRevisionName: "latest" and "the one I just tagged" are the
446
+ # same thing only when nothing else is deploying, and the case where they diverge
447
+ # is exactly the case you need this to be right — a concurrent build would hand the
448
+ # release lane one revision's name beside another revision's URL.
449
+ revision="$$(jq -r '.status.traffic[] | select(.tag=="candidate") | .revisionName' <<<"$${svc}")"
450
+ url="$$(jq -r '.status.traffic[] | select(.tag=="candidate") | .url' <<<"$${svc}")"
451
+ [[ -n "$${url}" && "$${url}" != "null" ]] || { echo "no candidate tag URL"; exit 1; }
452
+ [[ -n "$${revision}" && "$${revision}" != "null" ]] || { echo "no candidate revision"; exit 1; }
453
+
454
+ # Prove the tagged revision runs THIS build's image before publishing it as the
455
+ # candidate. Without this, a failed deploy that left the previous candidate in place
456
+ # publishes stale coordinates the release lane would validate and promote.
457
+ running="$$(gcloud run revisions describe "$${revision}" --region=$LOCATION \
458
+ --format='value(spec.containers[0].image)')"
459
+ [[ "$${running}" == *":$COMMIT_SHA" ]] || {
460
+ echo "candidate $${revision} runs $${running}, not $COMMIT_SHA"; exit 1; }
461
+
462
+ jq -n --arg r "$${revision}" --arg u "$${url}" --arg s "$COMMIT_SHA" --arg t "$TAG_NAME" \
463
+ '{revision:$$r, candidate_url:$$u, commit_sha:$$s, rc_tag:$$t}' \
464
+ > /workspace/candidate.json
465
+ gcloud storage cp /workspace/candidate.json \
466
+ "gs://$${PROJECT_ID}_cloudbuild/candidates/{service}-$TAG_NAME.json"
467
+ cat /workspace/candidate.json
468
+ ```
469
+
470
+ **The `candidate` tag moves; the revision name does not.** Each prod build re-points `--tag=candidate` at its own new revision, so the tag URL always means "the newest candidate," not "the candidate I built." That is why the published JSON carries the **revision name** and why the release lane deletes a failed candidate **by name**. `rush-release` therefore refuses a second release in flight: its moving URL would silently point the earlier release at the later build.
471
+
472
+ **Surface the coordinates as a GCS object keyed by the RC tag, not as log output.** The release lane already knows the tag it pushed, so it can fetch `candidates/{service}-<rc-tag>.json` without knowing the build ID — no build lookup, no log scraping, and the object outlives log retention. The `cat` at the end is a convenience for humans reading the build, not the interface. Derive the URL from `gcloud run services describe` rather than from `gcloud run deploy` output: the tag URL lives in `status.traffic[]`, and describing the service after the deploy also proves the tag actually landed (the guard above fails the build if it did not).
473
+
474
+ **Verification-time policy belongs to the release lane.** Against production, the release lane runs smoke under a **read-only production Validation Profile** (`prod-preview`/`prod-active`); the profile's semantics are the `golden-path` skill's to document, not this file's.
475
+
476
+ **Notification.** A prod build that fails now means the *candidate was never produced* — it flows into the **existing Cloud Build → Pub/Sub notification** above, no new sink. The smoke verdict is no longer a build event at all; it belongs to the release lane.
477
+
478
+ **Debug-loop tip.** Moving validation out of the build is exactly what makes retrying it cheap — this used to be an optional "split it into a second trigger" refinement, and it is now the default. Re-running smoke against the already-deployed candidate URL costs seconds and needs no rebuild. (For staged multi-environment promotion, prefer `cloud-deploy`'s verify phase, which gates promotion and is likewise retryable without a rebuild.)
479
+
480
+ ### Integration (`dev`): deploy 100%, record the verdict, never fail the build
481
+
482
+ `dev` deploys straight to **100% traffic** on build success — no `--no-traffic` staging, no smoke step that can fail the build. Smoke still runs, as a **recorder**:
483
+
484
+ ```
485
+ build → deploy (100% traffic) → smoke → publish SHA-keyed verdict (never fails the build)
486
+ ```
487
+
488
+ ```yaml
489
+ # Dev fork: deploy at 100% traffic (the standard deploy step above), then record a verdict.
490
+ - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
491
+ id: record-smoke-verdict
492
+ entrypoint: bash
493
+ secretEnv: ['GITHUB_TOKEN']
494
+ args:
495
+ - '-c'
496
+ - |
497
+ [[ "${_ENV}" == "dev" ]] || exit 0
498
+ post_status() { # $1=state $2=description
499
+ curl -sS -X POST \
500
+ -H "Authorization: Bearer $${GITHUB_TOKEN}" \
501
+ -H "Accept: application/vnd.github+json" \
502
+ "https://api.github.com/repos/OWNER/REPO/statuses/$COMMIT_SHA" \
503
+ -d "$$(jq -n --arg s "$$1" --arg d "$$2" \
504
+ '{state:$$s, context:"dev-smoke", description:$$d}')"
505
+ }
506
+
507
+ svc="$$(gcloud run services describe {service}-${_ENV} --region=$LOCATION --format=json)"
508
+ serving="$$(jq -r '.status.traffic[] | select(.percent==100) | .revisionName' <<<"$${svc}")"
509
+ url="$$(jq -r '.status.url' <<<"$${svc}")"
510
+
511
+ # Identify the serving revision by the IMAGE it runs, not by its name: revision
512
+ # names are Cloud Run's own counter (`{service}-dev-00042-abc`) and carry no SHA.
513
+ # The image tag is the only thing that ties the running code to this commit.
514
+ running="$$(gcloud run revisions describe "$${serving}" --region=$LOCATION \
515
+ --format='value(spec.containers[0].image)')"
516
+ if [[ "$${running}" != *":$COMMIT_SHA" ]]; then
517
+ # Traffic is pinned to a stale revision. Smoking now would test OLD code and
518
+ # publish a green verdict against THIS SHA — a false ALIVE that the release lane
519
+ # would later read as authorization to promote. Fail the status, run nothing.
520
+ post_status failure "traffic on $${serving} running $${running##*:} — not this SHA; no verdict earned"
521
+ exit 0
522
+ fi
523
+
524
+ command -v node || { apt-get update -qq && apt-get install -yqq nodejs; }; gp="node scripts/golden-paths/golden-path.mjs"
525
+ $$gp run --profile dev-active --target "$${url}" --expect-sha "$COMMIT_SHA"
526
+ $$gp verdict --profile dev-active --target "$${url}" && state=success || state=failure
527
+ post_status "$${state}" "golden-path $${state}"
528
+
529
+ exit 0 # never fail the dev build on a DEAD verdict
530
+
531
+ availableSecrets:
532
+ secretManager:
533
+ - versionName: projects/$PROJECT_ID/secrets/github-status-token/versions/latest
534
+ env: GITHUB_TOKEN
535
+ ```
536
+
537
+ - After traffic shifts, **confirm the serving revision is running this commit's image**, then run smoke against the live service URL. Capture the exit code instead of letting it fail the step. Compare **images, not revision names** — Cloud Run names revisions from its own counter, so a name-based check silently never matches and degrades to no check at all. On a mismatch, publish `failure` and **run no smoke**: traffic is on older code, so any verdict it produced would be a green light keyed to a SHA that never served.
538
+ - **Publish the verdict as a commit status on the SHA** (context `dev-smoke`, state `success`/`failure`, description naming the broken path on DEAD). When branch protection requires that status, it is part of the green CI set from which `rush-release` selects its trunk SHA. The image for a SHA is immutable, so the recorded verdict stays useful after `dev` moves on; production still gets its own `prod-preview` gate.
539
+ - The step then **exits 0 regardless of verdict**: a DEAD verdict marks the SHA unpromotable; it must not block the next dev iteration.
540
+ - **Non-blocking must not mean silent.** On DEAD, still notify (a Pub/Sub message from the step, or a webhook on the `dev-smoke` status change) so a broken dev is known in minutes, not discovered at release time.
541
+
542
+ ## Rules
543
+
544
+ ### Entrypoint Fail-Fast
545
+
546
+ All `entrypoint.sh` scripts that use case statements MUST fail on unknown or missing commands. Never silently default to starting a server or executing arbitrary commands.
547
+
548
+ ```bash
549
+ # WRONG - silently starts server on unknown command
550
+ *)
551
+ exec python -m app.main
552
+ ;;
553
+
554
+ # WRONG - executes arbitrary commands
555
+ *)
556
+ exec "$@"
557
+ ;;
558
+
559
+ # CORRECT - fail fast with clear error
560
+ "")
561
+ echo "Error: No command specified."
562
+ echo "Usage: entrypoint.sh {migrate|seed|test|serve}"
563
+ exit 1
564
+ ;;
565
+ *)
566
+ echo "Error: Unknown command '$1'"
567
+ echo "Usage: entrypoint.sh {migrate|seed|test|serve}"
568
+ exit 1
569
+ ;;
570
+ ```
571
+
572
+ **Why:** Silent defaults cause Cloud Run Jobs to hang indefinitely when passed unrecognized commands (e.g., a `seed` command that doesn't exist). The job appears stuck because it started a server instead of failing immediately.
573
+
574
+ ### Debug Master Branch Issues by Comparing to Dev
575
+
576
+ When debugging and fixing issues on the master branch, always ask: **"Why didn't this occur on the dev branch?"**
577
+
578
+ This question helps identify:
579
+ - **Environment differences**: VPC, secrets, min instances, database configuration
580
+ - **Missing build steps**: Dev skips migrations/seeds - did this mask an issue?
581
+ - **Trigger differences**: Dev triggers on branch push, staging on PR, prod on a `v*-rc.*` tag push
582
+ - **Data differences**: Dev may have different seed data or database state
583
+
584
+ If the issue only manifests on master/prod:
585
+ 1. Compare the cloudbuild.yaml substitutions between environments
586
+ 2. Check if migrations ran correctly (dev skips them)
587
+ 3. Verify secrets are correctly configured for the environment
588
+ 4. Confirm VPC/network settings match expectations
589
+
590
+ **Why:** Issues that appear only in production often stem from environment-specific configuration that was never tested because dev has different settings. Systematically comparing environments catches configuration drift early.
591
+
592
+ ## Key Patterns
593
+
594
+ - **Substitutions**: `${_ENV}` for Cloud Build substitutions
595
+ - **Bash escaping**: `$$VAR` for bash variables (becomes `$VAR`)
596
+ - **Env file**: `/workspace/env.sh` persists variables across steps
597
+ - **Min instances**: 0 dev/staging, 1 prod
598
+ - **Machine type**: `E2_HIGHCPU_8` for faster builds
599
+ - **Startup flags**: `--cpu-boost --no-cpu-throttling --timeout=300` for slow-starting containers
600
+ - **Entrypoint**: Always fail fast on unknown commands (see Rules)
601
+
602
+ For VPC, Secrets, and IAM patterns, see [google-cloud](../google-cloud/SKILL.md) and its reference files.
603
+
604
+ ## Debug
605
+
606
+ ```bash
607
+ # List recent builds
608
+ gcloud builds list --region=$LOCATION --limit=5
609
+
610
+ # Find builds for a specific branch
611
+ gcloud builds list --filter="trigger.branchName=YOUR_BRANCH" --region=$LOCATION
612
+
613
+ # Builds on main branch that failed
614
+ gcloud builds list --filter="trigger.branchName=main AND status=FAILURE" --region=$LOCATION
615
+
616
+ # Detailed output with branch and commit info
617
+ gcloud builds list --filter="trigger.branchName=dev" --region=$LOCATION --limit=10 \
618
+ --format="table(id,startTime,status,trigger.branchName,substitutions.SHORT_SHA)"
619
+
620
+ # View logs for a specific build
621
+ gcloud builds log BUILD_ID --region=$LOCATION
622
+
623
+ # Describe build status
624
+ gcloud builds describe BUILD_ID --region=$LOCATION
625
+
626
+ # Check Cloud Run service status
627
+ gcloud run services describe {svc}-{env} --region=$LOCATION
628
+ ```
629
+
630
+ ## Best Practices
631
+
632
+ ### Enable IAP Protection on Cloud Run
633
+
634
+ See [google-cloud/iam.md](../google-cloud/references/iam.md#cloud-run-native-iap) for:
635
+ - Enabling IAP on Cloud Run with `--no-allow-unauthenticated` and `--iap`
636
+ - Granting access to domain users, individual users, and service accounts
637
+ - IAP in Cloud Build pipelines
638
+
639
+ For programmatic access to IAP-protected resources, see [google-cloud/iam.md#service-account-authentication-jwt-pattern](../google-cloud/references/iam.md#service-account-authentication-jwt-pattern) for:
640
+ - Service account JWT authentication pattern for E2E tests, CI/CD runners, and inter-service calls
641
+
642
+ ## Closed-Loop Execution (Monitor → Debug → Fix → Monitor)
643
+
644
+ **Goal:** Never stop after `gcloud builds log --stream`. Always declare the next step and continue until DONE criteria are met or escalated.
645
+
646
+ ### DONE / Exit Criteria
647
+ - **Cloud Build:** Build status is `SUCCESS` and all steps complete without errors.
648
+ - **Cloud Run Deploy:** Service revision is updated and `Ready` with desired traffic.
649
+ - **Verification:** Basic smoke check passes (health endpoint or minimal request) and no new errors in service logs for a short window.
650
+
651
+ ### Timeboxed Monitoring
652
+ 1. **Stream build logs** for 5-10 minutes:
653
+ ```bash
654
+ gcloud builds log BUILD_ID --region=$LOCATION --stream
655
+ ```
656
+ 2. **If still running**, describe build to pinpoint the current step:
657
+ ```bash
658
+ gcloud builds describe BUILD_ID --region=$LOCATION
659
+ ```
660
+ 3. **If failing**, identify the failing step (by step name/ID), then drill into its logs or related service/job logs.
661
+
662
+ ### FAILURE vs SUCCESS (Next Commands)
663
+
664
+ **On FAILURE:**
665
+ - Declare next step: "Next step: inspect failing step `<step-name>` logs and related Cloud Run/Job logs."
666
+ - Run:
667
+ ```bash
668
+ gcloud builds describe BUILD_ID --region=$LOCATION
669
+ gcloud builds log BUILD_ID --region=$LOCATION
670
+ gcloud run services describe {svc}-{env} --region=$LOCATION
671
+ ```
672
+ - Apply fix (config/code), then **re-run build**, and loop back to monitoring.
673
+
674
+ **On SUCCESS:**
675
+ - Declare next step: "Next step: verify deployment and check service logs."
676
+ - Run:
677
+ ```bash
678
+ gcloud run services describe {svc}-{env} --region=$LOCATION
679
+ gcloud run services logs read {svc}-{env} --region=$LOCATION --limit=50
680
+ ```
681
+ - Perform a minimal verification (health endpoint or basic request). If clean, declare DONE.
682
+
683
+ ### Next Step Declaration Rule
684
+ After any log stream or describe command, **explicitly state the next step** before taking it. This prevents stalls after log streaming.
685
+
686
+ ### Escalation / Ask-Confirmation Boundary (Risky Ops)
687
+ Ask for confirmation **before** any of the following:
688
+ - Database migrations or seeds in prod
689
+ - Rolling back to a prior revision
690
+ - Changing IAM, VPC, or secrets
691
+ - Deleting resources or data
692
+
693
+ ### Incident Checklist (Copy/Paste)
694
+
695
+ ```
696
+ [ ] Identify build ID and region
697
+ [ ] Stream build logs (5-10 min)
698
+ [ ] Describe build to find current/failing step
699
+ [ ] If failing: capture step name and error
700
+ [ ] Inspect related Cloud Run service/job logs
701
+ [ ] Declare next step explicitly
702
+ [ ] Apply fix and re-run build
703
+ [ ] Verify Cloud Run revision is Ready + traffic
704
+ [ ] Smoke check endpoint
705
+ [ ] Confirm no new errors in logs (short window)
706
+ [ ] Declare DONE or escalate with reason
707
+ ```