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.
- package/LICENSE +21 -0
- package/README.md +202 -0
- package/core/agents/aaron.md +152 -0
- package/core/agents/bert.md +115 -0
- package/core/agents/isabelle.md +136 -0
- package/core/agents/jody.md +150 -0
- package/core/agents/leith.md +111 -0
- package/core/agents/marcelo.md +282 -0
- package/core/agents/melvin.md +101 -0
- package/core/agents/nyx.md +152 -0
- package/core/agents/otto.md +168 -0
- package/core/agents/patricia.md +283 -0
- package/core/commands/design-audit-local.md +155 -0
- package/core/commands/design-audit.md +235 -0
- package/core/commands/design-critique.md +96 -0
- package/core/commands/file-issue.md +22 -0
- package/core/commands/generate-project.md +45 -0
- package/core/commands/implement-issue.md +37 -0
- package/core/commands/implement-project.md +40 -0
- package/core/commands/naturalize.md +61 -0
- package/core/commands/pre-push.md +29 -0
- package/core/commands/prep-review-collect.md +130 -0
- package/core/commands/prep-review-finalize.md +121 -0
- package/core/commands/prep-review-publish.md +113 -0
- package/core/commands/prep-review.md +65 -0
- package/core/commands/project-closeout.md +25 -0
- package/core/skills/agentic-eval/SKILL.md +195 -0
- package/core/skills/chrome-devtools/SKILL.md +97 -0
- package/core/skills/code-review/SKILL.md +26 -0
- package/core/skills/gh-cli/SKILL.md +2202 -0
- package/core/skills/git-commit/SKILL.md +124 -0
- package/core/skills/git-workflow-agents/SKILL.md +462 -0
- package/core/skills/git-workflow-agents/reference.md +220 -0
- package/core/skills/github-actions/SKILL.md +190 -0
- package/core/skills/github-issues/SKILL.md +154 -0
- package/core/skills/llm-structured-outputs/SKILL.md +323 -0
- package/core/skills/llm-structured-outputs/references/provider-details.md +392 -0
- package/core/skills/pre-push/SKILL.md +115 -0
- package/core/skills/refactor/SKILL.md +645 -0
- package/core/skills/web-design-reviewer/SKILL.md +371 -0
- package/core/skills/webapp-testing/SKILL.md +127 -0
- package/core/skills/webapp-testing/test-helper.js +56 -0
- package/core/templates/CLAUDE.md.tmpl +98 -0
- package/core/templates/adr-template.md +67 -0
- package/core/templates/gh-issue-templates/bug.md +39 -0
- package/core/templates/gh-issue-templates/content.md +42 -0
- package/core/templates/gh-issue-templates/enhancement.md +36 -0
- package/core/templates/gh-issue-templates/feature.md +39 -0
- package/core/templates/gh-issue-templates/infrastructure.md +41 -0
- package/core/templates/post-edit-reminders.sh.tmpl +19 -0
- package/core/templates/settings.json.tmpl +90 -0
- package/core/templates/settings.local.json.tmpl +3 -0
- package/core/workflows/agent-implementation-workflow.md +346 -0
- package/core/workflows/generate-project.md +258 -0
- package/core/workflows/implement-project-workflow.md +190 -0
- package/core/workflows/issue-tracking.md +89 -0
- package/core/workflows/project-closeout-ceremony.md +77 -0
- package/core/workflows/review-workflow.md +266 -0
- package/engsys.config.example.yaml +46 -0
- package/install +202 -0
- package/lessons-library/README.md +80 -0
- package/lessons-library/async-callbacks-verify-liveness.md +15 -0
- package/lessons-library/change-isnt-done-until-every-surface-updated.md +15 -0
- package/lessons-library/claim-then-act-for-irreversible-ops.md +16 -0
- package/lessons-library/co-commit-entangled-work.md +15 -0
- package/lessons-library/dependabot-triage-playbook.md +17 -0
- package/lessons-library/deploy-by-digest-and-verify-the-running-revision.md +15 -0
- package/lessons-library/enforce-your-guarantee-at-your-boundary.md +16 -0
- package/lessons-library/gate-changes-on-measurement-not-vibes.md +15 -0
- package/lessons-library/iac-first-no-console-changes.md +15 -0
- package/lessons-library/independent-objective-review-gate.md +15 -0
- package/lessons-library/keep-an-immutable-source-of-truth.md +15 -0
- package/lessons-library/long-agent-runs-checkpoint-not-poll.md +15 -0
- package/lessons-library/model-identity-with-stable-ids-and-provenance.md +15 -0
- package/lessons-library/operator-choices-are-first-class.md +15 -0
- package/lessons-library/prefer-tool-enforced-structured-output.md +15 -0
- package/lessons-library/prove-causation-before-acting.md +15 -0
- package/lessons-library/re-read-state-before-acting.md +14 -0
- package/lessons-library/read-layer-tolerates-unbackfilled-rows.md +15 -0
- package/lessons-library/shell-safety-pipefail-and-validate-before-teardown.md +14 -0
- package/lessons-library/shift-correctness-left-and-distrust-false-greens.md +15 -0
- package/lessons-library/stray-control-bytes-hide-changes.md +14 -0
- package/lessons-library/tests-can-assert-the-bug.md +15 -0
- package/lessons-library/verify-ground-truth-not-reports.md +15 -0
- package/lessons-library/worktrees-need-bootstrap-from-origin-main.md +15 -0
- package/lib/commands.js +356 -0
- package/lib/generate-team-avatars.mjs +251 -0
- package/lib/manifest.js +155 -0
- package/lib/render.js +135 -0
- package/lib/selftest.js +90 -0
- package/lib/util.js +89 -0
- package/lib/yaml.js +156 -0
- package/optional-agents/gary.md +86 -0
- package/optional-agents/jos.md +136 -0
- package/optional-agents/sandy.md +101 -0
- package/optional-agents/steve.md +161 -0
- package/package.json +43 -0
- package/stacks/cloud/aws/claude.fragment.md +17 -0
- package/stacks/cloud/aws/settings.fragment.json +39 -0
- package/stacks/cloud/aws/skills/aws-deployment-preflight/SKILL.md +165 -0
- package/stacks/cloud/aws/skills/cloud-architecture-aws/SKILL.md +265 -0
- package/stacks/cloud/azure/claude.fragment.md +17 -0
- package/stacks/cloud/azure/settings.fragment.json +45 -0
- package/stacks/cloud/azure/skills/azure-deployment-preflight/SKILL.md +175 -0
- package/stacks/cloud/azure/skills/cloud-architecture-azure/SKILL.md +211 -0
- package/stacks/cloud/cloudflare/claude.fragment.md +21 -0
- package/stacks/cloud/cloudflare/settings.fragment.json +31 -0
- package/stacks/cloud/cloudflare/skills/cloud-architecture-cloudflare/SKILL.md +294 -0
- package/stacks/cloud/cloudflare/skills/cloudflare-deployment-preflight/SKILL.md +175 -0
- package/stacks/cloud/gcp/claude.fragment.md +17 -0
- package/stacks/cloud/gcp/settings.fragment.json +40 -0
- package/stacks/cloud/gcp/skills/cloud-architecture-gcp/SKILL.md +208 -0
- package/stacks/cloud/gcp/skills/gcp-deployment-preflight/SKILL.md +137 -0
- package/stacks/db/mongo/skills/mongo-conventions/SKILL.md +96 -0
- package/stacks/db/prisma/claude.fragment.md +49 -0
- package/stacks/db/prisma/skills/docker-database-package-copy/SKILL.md +44 -0
- package/stacks/db/prisma/skills/prisma-conventions/SKILL.md +37 -0
- package/stacks/domain/mobile-growth/skills/apple-ads/SKILL.md +184 -0
- package/stacks/domain/mobile-growth/skills/apple-ads/references/benchmark-notes.md +47 -0
- package/stacks/domain/mobile-growth/skills/apple-ads/references/official-links.md +53 -0
- package/stacks/domain/mobile-growth/skills/google-play-growth/SKILL.md +197 -0
- package/stacks/domain/mobile-growth/skills/google-play-growth/references/benchmark-notes.md +47 -0
- package/stacks/domain/mobile-growth/skills/google-play-growth/references/official-links.md +45 -0
- package/stacks/iac/bicep/claude.fragment.md +14 -0
- package/stacks/iac/bicep/settings.fragment.json +20 -0
- package/stacks/iac/bicep/skills/iac-bicep/SKILL.md +113 -0
- package/stacks/iac/cdk/claude.fragment.md +14 -0
- package/stacks/iac/cdk/settings.fragment.json +23 -0
- package/stacks/iac/cdk/skills/iac-cdk/SKILL.md +104 -0
- package/stacks/iac/terraform/claude.fragment.md +13 -0
- package/stacks/iac/terraform/settings.fragment.json +25 -0
- package/stacks/iac/terraform/skills/iac-terraform/SKILL.md +93 -0
- package/stacks/iac/terraform/skills/terraform-conventions/SKILL.md +87 -0
- package/stacks/lang/kotlin/skills/android-testing/SKILL.md +263 -0
- package/stacks/lang/kotlin/skills/jetpack-compose/SKILL.md +264 -0
- package/stacks/lang/kotlin/skills/kotlin-coroutines/SKILL.md +329 -0
- package/stacks/lang/python/skills/python-conventions/SKILL.md +61 -0
- package/stacks/lang/shell/skills/shell-scripting/SKILL.md +110 -0
- package/stacks/lang/swift/skills/swift-concurrency/SKILL.md +423 -0
- package/stacks/lang/swift/skills/swift-concurrency/references/approachable-concurrency.md +80 -0
- package/stacks/lang/swift/skills/swift-concurrency/references/concurrency-patterns.md +233 -0
- package/stacks/lang/swift/skills/swift-concurrency/references/swiftui-concurrency.md +187 -0
- package/stacks/lang/swift/skills/swift-concurrency/references/synchronization-primitives.md +341 -0
- package/stacks/lang/swift/skills/swift-testing/SKILL.md +497 -0
- package/stacks/lang/swift/skills/swift-testing/references/testing-advanced.md +106 -0
- package/stacks/lang/swift/skills/swift-testing/references/testing-patterns.md +504 -0
- package/stacks/lang/swift/skills/swiftdata/SKILL.md +334 -0
- package/stacks/lang/swift/skills/swiftdata/references/core-data-coexistence.md +504 -0
- package/stacks/lang/swift/skills/swiftdata/references/swiftdata-advanced.md +975 -0
- package/stacks/lang/swift/skills/swiftdata/references/swiftdata-queries.md +675 -0
- package/stacks/lang/swift/skills/swiftui-patterns/SKILL.md +371 -0
- package/stacks/lang/swift/skills/swiftui-patterns/references/architecture-patterns.md +486 -0
- package/stacks/lang/swift/skills/swiftui-patterns/references/deprecated-migration.md +1097 -0
- package/stacks/lang/swift/skills/swiftui-patterns/references/design-polish.md +780 -0
- package/stacks/lang/swift/skills/swiftui-patterns/references/platform-and-sharing.md +696 -0
- package/stacks/lang/typescript/skills/typescript-conventions/SKILL.md +91 -0
- package/stacks/platform/android/claude.fragment.md +40 -0
- package/stacks/platform/android/hooks/pre-push-gradle.sh +70 -0
- package/stacks/platform/android/settings.fragment.json +13 -0
- package/stacks/platform/android/skills/android-build-conventions/SKILL.md +247 -0
- package/stacks/platform/ios/claude.fragment.md +24 -0
- package/stacks/platform/ios/hooks/pre-push-xcodebuild.sh +82 -0
- package/stacks/platform/ios/settings.fragment.json +21 -0
- package/stacks/platform/ios/skills/xcodebuildmcp-simulator-logs/SKILL.md +76 -0
- package/stacks/platform/web/skills/frontend-testing/SKILL.md +246 -0
- package/stacks/platform/web/skills/react-conventions/SKILL.md +261 -0
- package/stacks/platform/web/skills/web-platform-conventions/SKILL.md +55 -0
- package/stacks/tooling/issue-tracker-github/claude.fragment.md +10 -0
- package/stacks/tooling/issue-tracker-github/settings.fragment.json +24 -0
- package/stacks/tooling/issue-tracker-github/skills/issue-tracker-github/SKILL.md +278 -0
- package/stacks/tooling/issue-tracker-linear/claude.fragment.md +17 -0
- package/stacks/tooling/issue-tracker-linear/settings.fragment.json +9 -0
- 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
|
+
}
|