engsys 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 (173) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +202 -0
  3. package/core/agents/aaron.md +152 -0
  4. package/core/agents/bert.md +115 -0
  5. package/core/agents/isabelle.md +136 -0
  6. package/core/agents/jody.md +150 -0
  7. package/core/agents/leith.md +111 -0
  8. package/core/agents/marcelo.md +282 -0
  9. package/core/agents/melvin.md +101 -0
  10. package/core/agents/nyx.md +152 -0
  11. package/core/agents/otto.md +168 -0
  12. package/core/agents/patricia.md +283 -0
  13. package/core/commands/design-audit-local.md +155 -0
  14. package/core/commands/design-audit.md +235 -0
  15. package/core/commands/design-critique.md +96 -0
  16. package/core/commands/file-issue.md +22 -0
  17. package/core/commands/generate-project.md +45 -0
  18. package/core/commands/implement-issue.md +37 -0
  19. package/core/commands/implement-project.md +40 -0
  20. package/core/commands/naturalize.md +61 -0
  21. package/core/commands/pre-push.md +29 -0
  22. package/core/commands/prep-review-collect.md +130 -0
  23. package/core/commands/prep-review-finalize.md +121 -0
  24. package/core/commands/prep-review-publish.md +113 -0
  25. package/core/commands/prep-review.md +65 -0
  26. package/core/commands/project-closeout.md +25 -0
  27. package/core/skills/agentic-eval/SKILL.md +195 -0
  28. package/core/skills/chrome-devtools/SKILL.md +97 -0
  29. package/core/skills/code-review/SKILL.md +26 -0
  30. package/core/skills/gh-cli/SKILL.md +2202 -0
  31. package/core/skills/git-commit/SKILL.md +124 -0
  32. package/core/skills/git-workflow-agents/SKILL.md +462 -0
  33. package/core/skills/git-workflow-agents/reference.md +220 -0
  34. package/core/skills/github-actions/SKILL.md +190 -0
  35. package/core/skills/github-issues/SKILL.md +154 -0
  36. package/core/skills/llm-structured-outputs/SKILL.md +323 -0
  37. package/core/skills/llm-structured-outputs/references/provider-details.md +392 -0
  38. package/core/skills/pre-push/SKILL.md +115 -0
  39. package/core/skills/refactor/SKILL.md +645 -0
  40. package/core/skills/web-design-reviewer/SKILL.md +371 -0
  41. package/core/skills/webapp-testing/SKILL.md +127 -0
  42. package/core/skills/webapp-testing/test-helper.js +56 -0
  43. package/core/templates/CLAUDE.md.tmpl +98 -0
  44. package/core/templates/adr-template.md +67 -0
  45. package/core/templates/gh-issue-templates/bug.md +39 -0
  46. package/core/templates/gh-issue-templates/content.md +42 -0
  47. package/core/templates/gh-issue-templates/enhancement.md +36 -0
  48. package/core/templates/gh-issue-templates/feature.md +39 -0
  49. package/core/templates/gh-issue-templates/infrastructure.md +41 -0
  50. package/core/templates/post-edit-reminders.sh.tmpl +19 -0
  51. package/core/templates/settings.json.tmpl +90 -0
  52. package/core/templates/settings.local.json.tmpl +3 -0
  53. package/core/workflows/agent-implementation-workflow.md +346 -0
  54. package/core/workflows/generate-project.md +258 -0
  55. package/core/workflows/implement-project-workflow.md +190 -0
  56. package/core/workflows/issue-tracking.md +89 -0
  57. package/core/workflows/project-closeout-ceremony.md +77 -0
  58. package/core/workflows/review-workflow.md +266 -0
  59. package/engsys.config.example.yaml +46 -0
  60. package/install +202 -0
  61. package/lessons-library/README.md +80 -0
  62. package/lessons-library/async-callbacks-verify-liveness.md +15 -0
  63. package/lessons-library/change-isnt-done-until-every-surface-updated.md +15 -0
  64. package/lessons-library/claim-then-act-for-irreversible-ops.md +16 -0
  65. package/lessons-library/co-commit-entangled-work.md +15 -0
  66. package/lessons-library/dependabot-triage-playbook.md +17 -0
  67. package/lessons-library/deploy-by-digest-and-verify-the-running-revision.md +15 -0
  68. package/lessons-library/enforce-your-guarantee-at-your-boundary.md +16 -0
  69. package/lessons-library/gate-changes-on-measurement-not-vibes.md +15 -0
  70. package/lessons-library/iac-first-no-console-changes.md +15 -0
  71. package/lessons-library/independent-objective-review-gate.md +15 -0
  72. package/lessons-library/keep-an-immutable-source-of-truth.md +15 -0
  73. package/lessons-library/long-agent-runs-checkpoint-not-poll.md +15 -0
  74. package/lessons-library/model-identity-with-stable-ids-and-provenance.md +15 -0
  75. package/lessons-library/operator-choices-are-first-class.md +15 -0
  76. package/lessons-library/prefer-tool-enforced-structured-output.md +15 -0
  77. package/lessons-library/prove-causation-before-acting.md +15 -0
  78. package/lessons-library/re-read-state-before-acting.md +14 -0
  79. package/lessons-library/read-layer-tolerates-unbackfilled-rows.md +15 -0
  80. package/lessons-library/shell-safety-pipefail-and-validate-before-teardown.md +14 -0
  81. package/lessons-library/shift-correctness-left-and-distrust-false-greens.md +15 -0
  82. package/lessons-library/stray-control-bytes-hide-changes.md +14 -0
  83. package/lessons-library/tests-can-assert-the-bug.md +15 -0
  84. package/lessons-library/verify-ground-truth-not-reports.md +15 -0
  85. package/lessons-library/worktrees-need-bootstrap-from-origin-main.md +15 -0
  86. package/lib/commands.js +356 -0
  87. package/lib/generate-team-avatars.mjs +251 -0
  88. package/lib/manifest.js +155 -0
  89. package/lib/render.js +135 -0
  90. package/lib/selftest.js +90 -0
  91. package/lib/util.js +89 -0
  92. package/lib/yaml.js +156 -0
  93. package/optional-agents/gary.md +86 -0
  94. package/optional-agents/jos.md +136 -0
  95. package/optional-agents/sandy.md +101 -0
  96. package/optional-agents/steve.md +161 -0
  97. package/package.json +43 -0
  98. package/stacks/cloud/aws/claude.fragment.md +17 -0
  99. package/stacks/cloud/aws/settings.fragment.json +39 -0
  100. package/stacks/cloud/aws/skills/aws-deployment-preflight/SKILL.md +165 -0
  101. package/stacks/cloud/aws/skills/cloud-architecture-aws/SKILL.md +265 -0
  102. package/stacks/cloud/azure/claude.fragment.md +17 -0
  103. package/stacks/cloud/azure/settings.fragment.json +45 -0
  104. package/stacks/cloud/azure/skills/azure-deployment-preflight/SKILL.md +175 -0
  105. package/stacks/cloud/azure/skills/cloud-architecture-azure/SKILL.md +211 -0
  106. package/stacks/cloud/cloudflare/claude.fragment.md +21 -0
  107. package/stacks/cloud/cloudflare/settings.fragment.json +31 -0
  108. package/stacks/cloud/cloudflare/skills/cloud-architecture-cloudflare/SKILL.md +294 -0
  109. package/stacks/cloud/cloudflare/skills/cloudflare-deployment-preflight/SKILL.md +175 -0
  110. package/stacks/cloud/gcp/claude.fragment.md +17 -0
  111. package/stacks/cloud/gcp/settings.fragment.json +40 -0
  112. package/stacks/cloud/gcp/skills/cloud-architecture-gcp/SKILL.md +208 -0
  113. package/stacks/cloud/gcp/skills/gcp-deployment-preflight/SKILL.md +137 -0
  114. package/stacks/db/mongo/skills/mongo-conventions/SKILL.md +96 -0
  115. package/stacks/db/prisma/claude.fragment.md +49 -0
  116. package/stacks/db/prisma/skills/docker-database-package-copy/SKILL.md +44 -0
  117. package/stacks/db/prisma/skills/prisma-conventions/SKILL.md +37 -0
  118. package/stacks/domain/mobile-growth/skills/apple-ads/SKILL.md +184 -0
  119. package/stacks/domain/mobile-growth/skills/apple-ads/references/benchmark-notes.md +47 -0
  120. package/stacks/domain/mobile-growth/skills/apple-ads/references/official-links.md +53 -0
  121. package/stacks/domain/mobile-growth/skills/google-play-growth/SKILL.md +197 -0
  122. package/stacks/domain/mobile-growth/skills/google-play-growth/references/benchmark-notes.md +47 -0
  123. package/stacks/domain/mobile-growth/skills/google-play-growth/references/official-links.md +45 -0
  124. package/stacks/iac/bicep/claude.fragment.md +14 -0
  125. package/stacks/iac/bicep/settings.fragment.json +20 -0
  126. package/stacks/iac/bicep/skills/iac-bicep/SKILL.md +113 -0
  127. package/stacks/iac/cdk/claude.fragment.md +14 -0
  128. package/stacks/iac/cdk/settings.fragment.json +23 -0
  129. package/stacks/iac/cdk/skills/iac-cdk/SKILL.md +104 -0
  130. package/stacks/iac/terraform/claude.fragment.md +13 -0
  131. package/stacks/iac/terraform/settings.fragment.json +25 -0
  132. package/stacks/iac/terraform/skills/iac-terraform/SKILL.md +93 -0
  133. package/stacks/iac/terraform/skills/terraform-conventions/SKILL.md +87 -0
  134. package/stacks/lang/kotlin/skills/android-testing/SKILL.md +263 -0
  135. package/stacks/lang/kotlin/skills/jetpack-compose/SKILL.md +264 -0
  136. package/stacks/lang/kotlin/skills/kotlin-coroutines/SKILL.md +329 -0
  137. package/stacks/lang/python/skills/python-conventions/SKILL.md +61 -0
  138. package/stacks/lang/shell/skills/shell-scripting/SKILL.md +110 -0
  139. package/stacks/lang/swift/skills/swift-concurrency/SKILL.md +423 -0
  140. package/stacks/lang/swift/skills/swift-concurrency/references/approachable-concurrency.md +80 -0
  141. package/stacks/lang/swift/skills/swift-concurrency/references/concurrency-patterns.md +233 -0
  142. package/stacks/lang/swift/skills/swift-concurrency/references/swiftui-concurrency.md +187 -0
  143. package/stacks/lang/swift/skills/swift-concurrency/references/synchronization-primitives.md +341 -0
  144. package/stacks/lang/swift/skills/swift-testing/SKILL.md +497 -0
  145. package/stacks/lang/swift/skills/swift-testing/references/testing-advanced.md +106 -0
  146. package/stacks/lang/swift/skills/swift-testing/references/testing-patterns.md +504 -0
  147. package/stacks/lang/swift/skills/swiftdata/SKILL.md +334 -0
  148. package/stacks/lang/swift/skills/swiftdata/references/core-data-coexistence.md +504 -0
  149. package/stacks/lang/swift/skills/swiftdata/references/swiftdata-advanced.md +975 -0
  150. package/stacks/lang/swift/skills/swiftdata/references/swiftdata-queries.md +675 -0
  151. package/stacks/lang/swift/skills/swiftui-patterns/SKILL.md +371 -0
  152. package/stacks/lang/swift/skills/swiftui-patterns/references/architecture-patterns.md +486 -0
  153. package/stacks/lang/swift/skills/swiftui-patterns/references/deprecated-migration.md +1097 -0
  154. package/stacks/lang/swift/skills/swiftui-patterns/references/design-polish.md +780 -0
  155. package/stacks/lang/swift/skills/swiftui-patterns/references/platform-and-sharing.md +696 -0
  156. package/stacks/lang/typescript/skills/typescript-conventions/SKILL.md +91 -0
  157. package/stacks/platform/android/claude.fragment.md +40 -0
  158. package/stacks/platform/android/hooks/pre-push-gradle.sh +70 -0
  159. package/stacks/platform/android/settings.fragment.json +13 -0
  160. package/stacks/platform/android/skills/android-build-conventions/SKILL.md +247 -0
  161. package/stacks/platform/ios/claude.fragment.md +24 -0
  162. package/stacks/platform/ios/hooks/pre-push-xcodebuild.sh +82 -0
  163. package/stacks/platform/ios/settings.fragment.json +21 -0
  164. package/stacks/platform/ios/skills/xcodebuildmcp-simulator-logs/SKILL.md +76 -0
  165. package/stacks/platform/web/skills/frontend-testing/SKILL.md +246 -0
  166. package/stacks/platform/web/skills/react-conventions/SKILL.md +261 -0
  167. package/stacks/platform/web/skills/web-platform-conventions/SKILL.md +55 -0
  168. package/stacks/tooling/issue-tracker-github/claude.fragment.md +10 -0
  169. package/stacks/tooling/issue-tracker-github/settings.fragment.json +24 -0
  170. package/stacks/tooling/issue-tracker-github/skills/issue-tracker-github/SKILL.md +278 -0
  171. package/stacks/tooling/issue-tracker-linear/claude.fragment.md +17 -0
  172. package/stacks/tooling/issue-tracker-linear/settings.fragment.json +9 -0
  173. package/stacks/tooling/issue-tracker-linear/skills/issue-tracker-linear/SKILL.md +183 -0
@@ -0,0 +1,197 @@
1
+ ---
2
+ name: google-play-growth
3
+ description: "Understand Google Play growth and Google Ads app acquisition. Use when evaluating Android app growth strategy, Google Ads App campaigns, Google Play store listing optimization, store listing experiments, custom store listings, web-to-app flows, Android app-growth cost planning such as CPI, CPA, tCPA, tROAS, and the measurement realities around Google Ads, GAID, Firebase, and modern attribution."
4
+ ---
5
+
6
+ # Google Play Growth
7
+
8
+ Use this skill when reasoning about Android app growth across **Google Ads App
9
+ Campaigns** and **Google Play Console** growth surfaces.
10
+
11
+ ## When to Use This Skill
12
+
13
+ - The user asks about Android app acquisition or Google Play growth.
14
+ - You need to explain Google Ads App Campaigns or bidding strategies.
15
+ - You need to reason about store listing experiments, custom store listings, or
16
+ Google Play conversion improvements.
17
+ - You need Android CPI / CPA / tCPA / tROAS guidance.
18
+ - You need to refresh official docs for Google Ads or Play Console growth tools.
19
+
20
+ ## What Exists in the Google Play Growth Stack
21
+
22
+ As of 2025-2026, the practical Google ecosystem for app growth is:
23
+
24
+ - **Google Ads App Campaigns for installs**.
25
+ - **Google Ads App Campaigns for engagement / re-engagement**.
26
+ - **Pre-registration campaigns** for Android launches.
27
+ - **Google Play search, browse, charts, editorial, and related-app discovery**.
28
+ - **Store Listing Experiments** for native A/B testing.
29
+ - **Custom Store Listings** for keyword, audience, or regional variants.
30
+ - **Promotional content and in-app event merchandising** inside Google Play.
31
+ - **Firebase + Google Ads measurement** for post-install signals and value.
32
+ - **Web-to-App Connect** and deep links to reduce mobile web friction.
33
+
34
+ ## How Google Ads App Campaigns Work
35
+
36
+ ### Asset-Based Automation
37
+
38
+ - App Campaigns are not traditional keyword-managed search campaigns.
39
+ - You provide **text, images, videos, and app metadata**.
40
+ - Google automatically mixes assets and serves them across:
41
+ - Search,
42
+ - Google Play,
43
+ - YouTube,
44
+ - Display,
45
+ - Discover,
46
+ - other eligible Google inventory.
47
+
48
+ This means your job is to set the **right objective**, provide the **right
49
+ assets**, and judge success by **business outcome**, not by trying to manually
50
+ micromanage every placement.
51
+
52
+ ### Campaign Types
53
+
54
+ - **Install campaigns**: drive new installs.
55
+ - **Action-optimized install campaigns**: still acquire new users, but bias
56
+ toward users likely to complete an in-app action.
57
+ - **Engagement campaigns**: re-engage existing users to complete valuable
58
+ actions.
59
+ - **Pre-registration campaigns**: build launch demand for Android apps before
60
+ release.
61
+
62
+ ### Bidding Modes That Matter
63
+
64
+ - **tCPI**: target cost per install.
65
+ - **tCPA**: target cost per action.
66
+ - **tROAS**: target return on ad spend; useful when you have revenue/value
67
+ tracking.
68
+ - **Maximize Conversions / Conversion Value**: useful when you have enough data
69
+ and want the system to optimize around volume or value.
70
+
71
+ ### Practical Budget Rules of Thumb
72
+
73
+ Use these as operating heuristics, not as hard platform laws unless Google says
74
+ otherwise in current documentation.
75
+
76
+ - Install campaigns need enough daily budget to generate meaningful conversion
77
+ volume.
78
+ - Action-based campaigns need even more room because the optimized event is
79
+ deeper and rarer.
80
+ - If the campaign is underfunded relative to the target bid, the algorithm may
81
+ never leave learning cleanly.
82
+
83
+ ## How Google Play Optimization Works
84
+
85
+ ### Metadata
86
+
87
+ - **Title**: highest-weight metadata field.
88
+ - **Short description**: crucial both for ranking and for above-the-fold
89
+ conversion.
90
+ - **Long description**: lower weight than title and short description, but still
91
+ matters for semantic relevance.
92
+ - **Category and tags**: influence where the app is eligible to appear.
93
+
94
+ ### Conversion Assets
95
+
96
+ - **Icon**: your most repeated brand signal.
97
+ - **Feature graphic**: critical for conversion on Play surfaces.
98
+ - **Screenshots**: major conversion lever.
99
+ - **Preview video**: especially useful when the product benefits from visual
100
+ explanation.
101
+
102
+ ### Native Growth Tools
103
+
104
+ - **Store Listing Experiments**: A/B test listing assets in Play Console.
105
+ - **Custom Store Listings**: tailor listings to different geographies, queries,
106
+ or acquisition contexts.
107
+ - **Promotional content / events**: keep the listing active and relevant.
108
+ - **Acquisition reporting**: inspect store visitors, acquisitions, conversion
109
+ rate, and source mix.
110
+
111
+ ## Cost Model and Planning Concepts
112
+
113
+ ### Core Buying Logic
114
+
115
+ - Google Ads is an **auction**.
116
+ - App Campaigns rely on machine learning, not manual keyword-by-keyword control.
117
+ - Your actual economics are shaped by:
118
+ - bid target,
119
+ - budget,
120
+ - asset quality,
121
+ - optimization event quality,
122
+ - category competition,
123
+ - region,
124
+ - downstream monetization.
125
+
126
+ ### Practical Metrics
127
+
128
+ - **CPI**: install cost; useful, but not enough by itself.
129
+ - **CPA**: action cost; better when the app monetizes post-install.
130
+ - **tCPA**: your target action cost.
131
+ - **ROAS / tROAS**: required once revenue quality matters.
132
+ - **CVR**: store-listing or post-click conversion rate.
133
+ - **Retention and payer quality**: what stops cheap installs from fooling you.
134
+
135
+ ### Directional Cost Expectations
136
+
137
+ - Android installs are usually cheaper than iOS installs.
138
+ - Install-only campaigns can look efficient while bringing in poor users.
139
+ - Higher-value bidding targets usually cost more per acquisition but can improve
140
+ payback and gross profit quality.
141
+
142
+ Use [references/benchmark-notes.md](references/benchmark-notes.md) for safe
143
+ benchmark framing.
144
+
145
+ ## Measurement and Attribution Reality
146
+
147
+ - Android remains more measurable than iOS, but you should still plan for more
148
+ modeled and privacy-constrained reporting over time.
149
+ - Use **Firebase** and first-party event design well; poor event design ruins
150
+ App Campaign optimization.
151
+ - Use **Web-to-App Connect** and correctly configured deep links when the user
152
+ journey starts on web.
153
+ - Treat Google Ads attribution as useful, not infallible.
154
+ - Validate big spend decisions with cohort performance and, when possible,
155
+ lift-style testing rather than trusting platform-reported success blindly.
156
+
157
+ ## Operational Advice
158
+
159
+ - Start with the business goal, not the ad format.
160
+ - If monetization depends on a deeper in-app event, optimize toward that event
161
+ as soon as data volume supports it.
162
+ - Separate Android from iOS planning; they do not behave the same economically.
163
+ - Keep creative volume high enough for the system to actually learn.
164
+ - Treat Play listing optimization and paid growth as one loop, not two teams
165
+ pretending not to affect each other.
166
+ - Use Store Listing Experiments continuously; do not guess at conversion assets.
167
+ - Reassess bids and budgets after the learning phase, not every day during it.
168
+
169
+ ## Common Mistakes
170
+
171
+ - Optimizing for installs when the real goal is purchases or subscriptions.
172
+ - Underfunding campaigns and then blaming the channel.
173
+ - Uploading too few assets for the algorithm to test.
174
+ - Treating Play Console conversion rate as a design vanity metric instead of a
175
+ ranking input.
176
+ - Mixing brand demand and non-brand demand without understanding the difference.
177
+ - Taking Google recommendations at face value without checking incremental value
178
+ or payback.
179
+ - Ignoring web-to-app deep links and then wondering why mobile web converts
180
+ poorly.
181
+
182
+ ## Refresh Workflow
183
+
184
+ When this skill may be stale:
185
+
186
+ 1. Read [references/official-links.md](references/official-links.md).
187
+ 2. Re-check Google Ads help pages for App Campaign setup, bidding, and app deep
188
+ link behavior.
189
+ 3. Re-check Play Console docs for experiments, custom store listings, and
190
+ acquisition reporting.
191
+ 4. Re-check Firebase guidance if event or value measurement is in scope.
192
+ 5. Use third-party benchmarks only as directional priors.
193
+
194
+ ## References
195
+
196
+ - [Official links](references/official-links.md)
197
+ - [Benchmark notes](references/benchmark-notes.md)
@@ -0,0 +1,47 @@
1
+ # Google Play Growth Benchmark Notes
2
+
3
+ Google does not publish universally applicable CPI, CPA, or ROAS benchmarks for
4
+ your category. Use benchmark sources to sanity-check plans, not to pretend you
5
+ have certainty.
6
+
7
+ ## Practical Benchmark Heuristics
8
+
9
+ - Android installs are usually cheaper than iOS installs.
10
+ - Install-only campaigns often produce cheaper traffic than action-optimized
11
+ campaigns, but that traffic can be materially worse.
12
+ - Competitive categories, high-income geographies, and purchase-heavy apps cost
13
+ more.
14
+ - Search-led intent usually performs better than broad, entertainment-style
15
+ reach placements.
16
+
17
+ ## Common Directional Ranges Seen in 2025-2026 Reporting
18
+
19
+ - Global Android CPI is often reported in the low-single-dollar range.
20
+ - iOS CPI is often reported at a multiple of Android CPI.
21
+ - Search CPCs across Google properties rose year over year in many 2025-2026
22
+ benchmark reports.
23
+ - Smart bidding usually outperforms manual control once enough conversion data
24
+ exists.
25
+
26
+ Use those as priors only.
27
+
28
+ ## Recommended Third-Party Refresh Sources
29
+
30
+ - Business of Apps: https://www.businessofapps.com/
31
+ - Adjust benchmark resources: https://www.adjust.com/resources/
32
+ - AppsFlyer performance / benchmark resources: https://www.appsflyer.com/resources/
33
+ - App Radar Google Play optimization guides: https://appradar.com/academy/google-play-optimization
34
+ - WordStream Google Ads benchmarks: https://www.wordstream.com/blog
35
+
36
+ ## How to Use Benchmarks Safely
37
+
38
+ - Build **base / upside / downside** models for Android separately from iOS.
39
+ - Benchmark against your own:
40
+ - store conversion rate,
41
+ - D1 / D7 / D30 retention,
42
+ - payer conversion,
43
+ - trial-to-paid rate,
44
+ - ARPU / LTV,
45
+ - CAC payback.
46
+ - If a benchmark makes your model look amazing, pressure-test harder rather than
47
+ celebrating earlier.
@@ -0,0 +1,45 @@
1
+ # Google Play Growth Official Links
2
+
3
+ Use these first when refreshing the skill.
4
+
5
+ ## Google Ads App Campaigns
6
+
7
+ - App campaigns overview: https://support.google.com/google-ads/answer/6247380?hl=en
8
+ - Create App campaigns: https://support.google.com/google-ads/answer/6167162?hl=en
9
+ - App campaign asset guidance: https://support.google.com/google-ads/answer/6167158?hl=en
10
+ - App campaign bidding strategy guidance: https://support.google.com/google-ads/answer/12073727?hl=en
11
+ - App engagement campaigns: https://support.google.com/google-ads/answer/14104492?hl=en
12
+ - App pre-registration campaigns: https://support.google.com/google-ads/answer/9441180?hl=en
13
+ - Pre-registration campaign details: https://support.google.com/google-ads/answer/9441344?hl=en
14
+
15
+ ## Web-to-App and Deep Links
16
+
17
+ - Web-to-App Connect / app deep links: https://support.google.com/google-ads/answer/10024200?hl=en
18
+ - App deep link requirements: https://support.google.com/google-ads/answer/16413616?hl=en
19
+
20
+ ## Google Play Console Growth Surfaces
21
+
22
+ - Acquisition reporting: https://play.google.com/console/about/acquisitionreporting/
23
+ - Acquisition report help: https://support.google.com/googleplay/android-developer/answer/9859173?hl=en
24
+ - Store Listing Experiments: https://play.google.com/console/about/store-listing-experiments/
25
+
26
+ ## APIs and Developer Docs
27
+
28
+ - Google Ads API App campaigns overview: https://developers.google.com/google-ads/api/docs/app-campaigns/overview
29
+ - Google Ads API create App campaign: https://developers.google.com/google-ads/api/docs/app-campaigns/create-campaign
30
+ - Firebase docs: https://firebase.google.com/docs
31
+ - Firebase iOS on-device ads measurement tutorial: https://firebase.google.com/docs/tutorials/ads-ios-on-device-measurement/step-3
32
+
33
+ ## Product and Ecosystem Updates
34
+
35
+ - Google Ads & Commerce blog: https://blog.google/products/ads-commerce/
36
+ - Android Developers blog / Google Play growth updates: https://developer.android.com/blog
37
+ - Think with Google / business strategy: https://business.google.com/think/
38
+
39
+ ## Notes
40
+
41
+ - Prefer Google support and developer docs over growth blogs when checking
42
+ feature availability or policy behavior.
43
+ - Re-check bidding docs before using old tCPI / tCPA rules of thumb.
44
+ - Re-check privacy and measurement docs before assuming anything about future
45
+ Android identifier policy.
@@ -0,0 +1,14 @@
1
+ ## IaC stack
2
+
3
+ - **Active IaC tool: Bicep.** Infrastructure changes go through Bicep; Aaron loads the
4
+ `iac-bicep` skill pack.
5
+ - **Workflow gate:** `bicep build` (syntax) → `az deployment group validate` →
6
+ `what-if` (review) → deploy. `bicep build` alone is not the gate — validate + what-if
7
+ are. Fix failures locally; don't let CI discover them.
8
+ - Run the `azure-deployment-preflight` skill before deploying for stale-deployment
9
+ cleanup, globally-unique naming, and SKU/tier checks.
10
+ - Read-only CLI (`bicep build`, `validate`, `what-if`, `azd provision --preview`) is
11
+ allowed; `deployment create` / `azd up` are gated.
12
+
13
+ <!-- naturalize: confirm the infrastructure/ layout, resource group(s), and per-env
14
+ .bicepparam files. -->
@@ -0,0 +1,20 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(bicep build:*)",
5
+ "Bash(az bicep build:*)",
6
+ "Bash(bicep --version:*)",
7
+ "Bash(az deployment group validate:*)",
8
+ "Bash(az deployment group what-if:*)",
9
+ "Bash(az deployment sub what-if:*)",
10
+ "Bash(az deployment group list:*)",
11
+ "Bash(azd provision --preview:*)"
12
+ ],
13
+ "deny": [
14
+ "Bash(az deployment group create:*)",
15
+ "Bash(az deployment sub create:*)",
16
+ "Bash(azd up:*)"
17
+ ]
18
+ },
19
+ "mcpServers": {}
20
+ }
@@ -0,0 +1,113 @@
1
+ ---
2
+ name: iac-bicep
3
+ description: Bicep / ARM discipline for any project where Bicep is the active IaC tool — modules/environments/main.bicep layout, parameter files (.bicepparam), the az validate → what-if flow, deployment scopes, and the hard-won Azure Bicep gotchas (globally-unique names, ACR SKU, PgBouncer Burstable limit, alert module location, KQL interpolation, metric names). Activate when working on *.bicep / *.bicepparam files, az deployment / azd provision, ARM deployment failures, or diagnosing Bicep validation and drift.
4
+ ---
5
+
6
+ # Bicep / ARM Discipline
7
+
8
+ The operational discipline for Bicep as the active IaC tool (Azure). Pairs with the
9
+ `cloud-architecture-azure` pack (service-level detail) and the
10
+ `azure-deployment-preflight` skill (the pre-deploy gate). Project file layout and
11
+ resource-group/subscription facts come from `CLAUDE.md`.
12
+
13
+ ## Core stance
14
+
15
+ - **Infrastructure is software.** If it only works once, it doesn't work. "Just deploy it
16
+ again" is not a strategy — understand *why* it failed.
17
+ - **`bicep build` only checks syntax.** It does NOT catch invalid property combinations,
18
+ metric names, KQL scope, secret-ref mismatches, or naming collisions. The real gate is
19
+ `az deployment group validate` + `what-if` (see `azure-deployment-preflight`).
20
+ - **Batch your fixes.** Each push triggers a long CI run — read the whole failing module,
21
+ fix every issue, push once. One run per problem cluster, not one per error message.
22
+
23
+ ## Project layout
24
+
25
+ A conventional, recreatable structure (confirm exact paths in `CLAUDE.md`):
26
+
27
+ ```
28
+ infrastructure/
29
+ main.bicep # orchestration: wires modules together, declares params
30
+ modules/ # reusable modules, one concern each (db, acr, alerts, …)
31
+ <concern>.bicep
32
+ environments/
33
+ dev.bicepparam # per-env parameter files (preferred over .parameters.json)
34
+ staging.bicepparam
35
+ prod.bicepparam
36
+ scripts/ # helper scripts (e.g. seed-keyvault.sh)
37
+ ```
38
+
39
+ - **`main.bicep`** is the orchestrator: declare `param`s, set defaults, instantiate
40
+ modules with explicit dependencies, expose `output`s.
41
+ - **Modules** group related resources with a narrow, typed interface (`param` +
42
+ `@description`). Don't wrap a single resource unless it earns reuse.
43
+ - **`.bicepparam`** files (typed, support expressions and `getSecret()`) are preferred
44
+ over JSON parameter files. Keep one per environment; never hard-code per-env values in
45
+ `main.bicep`.
46
+
47
+ ## Deployment scopes
48
+
49
+ The `targetScope` declaration picks the deploy/validate command:
50
+
51
+ | `targetScope` | command family |
52
+ | --- | --- |
53
+ | `resourceGroup` (default) | `az deployment group ...` |
54
+ | `subscription` | `az deployment sub ... --location <loc>` |
55
+ | `managementGroup` | `az deployment mg ... --management-group-id <id> --location <loc>` |
56
+ | `tenant` | `az deployment tenant ... --location <loc>` |
57
+
58
+ ## The validate → what-if flow (run before every deploy)
59
+
60
+ ```bash
61
+ cd infrastructure
62
+ bicep build main.bicep --stdout # 1. syntax only
63
+
64
+ az deployment group validate \ # 2. real deploy-time validation
65
+ --resource-group <rg> \
66
+ --template-file main.bicep \
67
+ --parameters environments/<env>.bicepparam \
68
+ --parameters postgresAdminPassword="dummy" --parameters postgresAdminUsername="dummy"
69
+
70
+ az deployment group what-if \ # 3. the preview (creates/modifies/DELETES)
71
+ --resource-group <rg> \
72
+ --template-file main.bicep \
73
+ --parameters environments/<env>.bicepparam \
74
+ --validation-level Provider # fall back to ProviderNoRbac on RBAC errors
75
+ ```
76
+
77
+ **If it fails locally, fix it locally.** Don't push and let CI discover it. Review the
78
+ what-if for **deletes/replacements of stateful resources** (PostgreSQL, Key Vault,
79
+ storage). See `azure-deployment-preflight` for stale-deployment cleanup and the full gate.
80
+
81
+ ## Secrets
82
+
83
+ - No secrets in templates or param files. Reference **Key Vault** from `.bicepparam` via
84
+ `getSecret()` and from app resources as secret references.
85
+ - Prefer **managed identities** for resource-to-resource auth over connection strings.
86
+
87
+ ## Hard-won Bicep gotchas (don't rediscover the expensive way)
88
+
89
+ - **Globally-unique names** (Key Vault, storage, ACR, Redis, Front Door) collide or are
90
+ soft-deleted from prior attempts. Parameterize the name (`param keyVaultName` etc.) and
91
+ override in `*.bicepparam` with a short unique suffix — don't hard-code the bare default.
92
+ If a helper script (Key Vault seeder) defaults the name internally, **pass the override
93
+ explicitly** and ensure every workflow step uses the same resolved name.
94
+ - **ACR SKU:** `Basic` may be unavailable on some subscriptions; `Standard` works but
95
+ `retentionPolicy` requires `Premium` — remove it from dev/staging. If a failed deploy
96
+ left a broken ACR, create it manually and let Bicep treat it as no-change.
97
+ - **PgBouncer not on Burstable:** Burstable (`Standard_B*`) PostgreSQL can't run PgBouncer
98
+ (needs GeneralPurpose+). Guard with `= if (currentSku.tier != 'Burstable') { ... }`.
99
+ - **Alert module location:** `metricAlerts` → `location: 'global'`; `scheduledQueryRules`
100
+ → real region (NOT `global`), and they must scope to the **Log Analytics workspace ID**,
101
+ not the App Insights ID (the `AppRequests` table lives in the workspace).
102
+ - **KQL in verbatim strings doesn't interpolate:** `${vars}` inside `'''...'''` are NOT
103
+ substituted — build the query with string-concatenation variables.
104
+ - **Metric names:** PostgreSQL Flexible Server uses `active_connections`, not
105
+ `connection_percent` (that's Azure SQL).
106
+
107
+ ## Drift & troubleshooting
108
+
109
+ - ARM tracks deployments by name; a **failed sub-deployment blocks re-deploy**
110
+ (`DeploymentActive`) even while `Failed` — clean it up (see preflight Step 4).
111
+ - Bicep/ARM is declarative-incremental by default (Complete mode deletes anything not in
112
+ the template — use with care). What-if before every deploy surfaces out-of-band drift.
113
+ - No click-ops in production; manual changes create snowflakes that the next deploy fights.
@@ -0,0 +1,14 @@
1
+ ## IaC stack
2
+
3
+ - **Active IaC tool: AWS CDK.** Infrastructure changes go through CDK (synthesizes
4
+ CloudFormation); Aaron loads the `iac-cdk` skill pack.
5
+ - **Workflow gate:** `cdk synth` → `cdk diff` (review resource + IAM changes) →
6
+ `cdk deploy`. Never deploy without reading the diff; review security/replacement
7
+ deltas deliberately.
8
+ - Run the `aws-deployment-preflight` skill before deploying for stale-stack cleanup
9
+ (`ROLLBACK_COMPLETE`), globally-unique naming (S3/ECR), and quota checks.
10
+ - Read-only CLI (`cdk synth`, `cdk diff`, `cdk list`) is allowed; `cdk deploy` /
11
+ `cdk destroy` are gated.
12
+
13
+ <!-- naturalize: confirm the CDK app entry (bin/), stack separation, target account +
14
+ region, and whether the account is bootstrapped. -->
@@ -0,0 +1,23 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(cdk synth:*)",
5
+ "Bash(cdk diff:*)",
6
+ "Bash(cdk list:*)",
7
+ "Bash(cdk ls:*)",
8
+ "Bash(cdk doctor:*)",
9
+ "Bash(cdk context:*)",
10
+ "Bash(npx cdk synth:*)",
11
+ "Bash(npx cdk diff:*)",
12
+ "Bash(npx cdk list:*)"
13
+ ],
14
+ "deny": [
15
+ "Bash(cdk deploy:*)",
16
+ "Bash(cdk destroy:*)",
17
+ "Bash(cdk bootstrap:*)",
18
+ "Bash(npx cdk deploy:*)",
19
+ "Bash(npx cdk destroy:*)"
20
+ ]
21
+ },
22
+ "mcpServers": {}
23
+ }
@@ -0,0 +1,104 @@
1
+ ---
2
+ name: iac-cdk
3
+ description: AWS CDK discipline for any project where CDK is the active IaC tool — app/stack structure, constructs (L1/L2/L3), synth/diff/deploy flow, stack separation, context and environment config, asset bundling, and bootstrapping. Activate when working on CDK code (bin/ + lib/ TypeScript or app.py), cdk synth/diff/deploy, construct design, or diagnosing CDK/CloudFormation deploy failures.
4
+ ---
5
+
6
+ # AWS CDK Discipline
7
+
8
+ The operational discipline for AWS CDK as the active IaC tool. CDK synthesizes
9
+ CloudFormation, so it inherits CloudFormation's behavior. Pairs with the
10
+ `cloud-architecture-aws` pack (service-level detail) and the `aws-deployment-preflight`
11
+ skill (the pre-deploy gate). Project file layout and account/region facts come from
12
+ `CLAUDE.md`.
13
+
14
+ ## Core stance
15
+
16
+ - **Infrastructure is software** — and CDK makes that literal: it's real TypeScript/
17
+ Python. Apply the same discipline (types, tests, no copy-paste, narrow interfaces) you'd
18
+ apply to app code. Resist the temptation to be "clever" in synth-time logic.
19
+ - **CDK is a CloudFormation generator.** What deploys is the synthesized template. When in
20
+ doubt, read `cdk synth` output — the abstraction is convenient, not magic.
21
+ - **`cdk diff` is the contract.** Never `deploy` without reading the diff. It shows
22
+ resource changes *and* IAM/security changes (the `--require-approval` gate) — review
23
+ security deltas deliberately, never rubber-stamp.
24
+
25
+ ## App & stack structure
26
+
27
+ ```
28
+ bin/<app>.ts # the App: instantiates stacks, sets env (account/region)
29
+ lib/
30
+ <x>-stack.ts # one stack per deployment unit / lifecycle boundary
31
+ constructs/ # reusable L3 constructs (your own abstractions)
32
+ cdk.json # app entry + context
33
+ ```
34
+
35
+ - **Separate stacks by lifecycle and blast radius** — e.g. network / data / compute /
36
+ edge / security. A stateful stack (databases, buckets) should be independently
37
+ deployable from churny app stacks so a compute redeploy can't threaten data.
38
+ - Stacks have a **500-resource CloudFormation limit** — split before you hit it. Nested
39
+ stacks help but complicate diffs; prefer multiple top-level stacks with cross-stack
40
+ references via `Stack` props (passing constructs) over brittle string exports/imports.
41
+ - **Set `env` explicitly** (account + region) on stacks — environment-agnostic stacks
42
+ silently use ambient credentials and can deploy to the wrong account.
43
+
44
+ ## Constructs (L1 / L2 / L3)
45
+
46
+ - **L1 (`Cfn*`)** — raw CloudFormation, 1:1 with resources. Escape hatch for properties
47
+ L2 doesn't expose yet (`addPropertyOverride`). Verbose, no defaults.
48
+ - **L2** — curated constructs with sane defaults, IAM grants (`grantRead`, etc.), and
49
+ helper methods. **The default choice** — prefer them; they encode best practice.
50
+ - **L3 (patterns / your own)** — opinionated multi-resource compositions. Write your own
51
+ for genuinely-repeated patterns; don't over-abstract a one-off.
52
+ - Use the **`grant*` methods** for IAM rather than hand-writing policies — least-privilege
53
+ by construction, and they wire the right principal.
54
+
55
+ ## The synth → diff → deploy flow
56
+
57
+ ```bash
58
+ cdk synth # generate the template; fails on construct/TS errors first
59
+ cdk diff # the what-if: resource + IAM changes vs the deployed stack
60
+ cdk deploy <stack> # apply (CI: behind approval for prod)
61
+ ```
62
+
63
+ - **Bootstrap once per account+region:** `cdk bootstrap` creates the CDKToolkit stack
64
+ (asset bucket, ECR repo, deploy roles). A missing bootstrap is a common first-deploy
65
+ failure.
66
+ - **Review the diff for replacements** — a property change that forces a replacement on a
67
+ stateful resource (RDS, DynamoDB, S3) is a data-loss event. Use `RemovalPolicy.RETAIN`
68
+ on precious resources; know that RETAIN-ed resources then block stack deletion until
69
+ cleared manually (see preflight).
70
+ - Deploy stacks in dependency order (CDK handles this within one `deploy '*'`, but explicit
71
+ ordering in CI is clearer).
72
+
73
+ ## Context & configuration
74
+
75
+ - **`cdk.json` context** + `cdk.context.json` (cached lookups like AZs, AMIs, VPCs).
76
+ Cached context can go stale — `cdk context --clear` to refresh. Commit `cdk.context.json`
77
+ so synth is deterministic across machines/CI.
78
+ - Pass per-environment config via **stack props / construct parameters**, not via
79
+ scattered `tryGetContext` reads. Keep env selection explicit (e.g. `-c env=prod` →
80
+ typed config object), not implicit.
81
+ - Pin the CDK library + construct-library versions; CDK moves fast and minor versions
82
+ change synthesized output.
83
+
84
+ ## Assets & bundling
85
+
86
+ - Lambda/container assets are bundled and uploaded to the bootstrap bucket/ECR on deploy.
87
+ Keep bundles small (esbuild for Node, layers/`--platform` for native deps) — bundle size
88
+ drives cold start (see `cloud-architecture-aws`). Docker is required for some bundling
89
+ modes.
90
+
91
+ ## Troubleshooting
92
+
93
+ - **`ROLLBACK_COMPLETE`** stack can't be updated — delete and recreate (`cdk destroy` then
94
+ deploy). Read the **first** failed CloudFormation event, not the rollback cascade.
95
+ - **Drift:** out-of-band console changes diverge from the template; `cdk diff` won't show
96
+ console drift directly — use CloudFormation drift detection. No click-ops in prod.
97
+ - **Cross-stack deadlock:** a hard export that another stack imports can't be changed/
98
+ deleted until the consumer stops importing it — refactor cross-stack refs deliberately.
99
+
100
+ ## Preflight
101
+
102
+ Before deploying, run the `aws-deployment-preflight` skill — it covers
103
+ `cdk synth`/`cdk diff` validation, stale/failed-stack cleanup (`ROLLBACK_COMPLETE`),
104
+ globally-unique naming (S3/ECR), and service-quota checks that the diff alone won't surface.
@@ -0,0 +1,13 @@
1
+ ## IaC stack
2
+
3
+ - **Active IaC tool: Terraform.** Infrastructure changes go through Terraform; Aaron
4
+ loads the `iac-terraform` and `terraform-conventions` skill packs.
5
+ - **Workflow gate:** `terraform fmt` → `validate` → `plan` (review) → `apply`. Never
6
+ `apply` without reading the `plan`; plan on PR, apply on merge (approval for prod).
7
+ - Run the active cloud's `*-deployment-preflight` skill before applying for the
8
+ cloud-specific checks (naming, quotas, stale state) `plan` won't surface.
9
+ - Read-only CLI (`fmt`, `validate`, `plan`, `state list`, `show`) is allowed; `apply`
10
+ and `destroy` are gated.
11
+
12
+ <!-- naturalize: confirm the IaC directory, backend config location, and per-environment
13
+ state layout. -->
@@ -0,0 +1,25 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(terraform fmt:*)",
5
+ "Bash(terraform validate:*)",
6
+ "Bash(terraform plan:*)",
7
+ "Bash(terraform show:*)",
8
+ "Bash(terraform state list:*)",
9
+ "Bash(terraform output:*)",
10
+ "Bash(terraform version:*)",
11
+ "Bash(terraform providers:*)",
12
+ "Bash(tflint:*)",
13
+ "Bash(tfsec:*)",
14
+ "Bash(checkov:*)"
15
+ ],
16
+ "deny": [
17
+ "Bash(terraform apply:*)",
18
+ "Bash(terraform destroy:*)",
19
+ "Bash(terraform state rm:*)",
20
+ "Bash(terraform state mv:*)",
21
+ "Bash(terraform import:*)"
22
+ ]
23
+ },
24
+ "mcpServers": {}
25
+ }