@leejungkiin/awkit 1.1.4 → 1.1.7
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/README.md +15 -0
- package/VERSION +1 -1
- package/bin/awk.js +21 -55
- package/core/GEMINI.md +45 -7
- package/package.json +2 -2
- package/skills/CATALOG.md +11 -3
- package/skills/ab-test-store-listing/SKILL.md +220 -0
- package/skills/android-aso/SKILL.md +197 -0
- package/skills/app-analytics/SKILL.md +210 -0
- package/skills/app-clips/SKILL.md +163 -0
- package/skills/app-icon-optimization/SKILL.md +170 -0
- package/skills/app-launch/SKILL.md +153 -0
- package/skills/app-marketing-context/SKILL.md +129 -0
- package/skills/app-store-featured/SKILL.md +213 -0
- package/skills/apple-search-ads/SKILL.md +205 -0
- package/skills/asc-metrics/SKILL.md +157 -0
- package/skills/aso-audit/SKILL.md +179 -0
- package/skills/code-review/SKILL.md +125 -0
- package/skills/codex-conductor/SKILL.md +337 -0
- package/skills/competitor-analysis/SKILL.md +163 -0
- package/skills/competitor-tracking/SKILL.md +185 -0
- package/skills/crash-analytics/SKILL.md +181 -0
- package/skills/in-app-events/SKILL.md +176 -0
- package/skills/keyword-research/SKILL.md +141 -0
- package/skills/localization/SKILL.md +165 -0
- package/skills/market-movers/SKILL.md +137 -0
- package/skills/market-pulse/SKILL.md +170 -0
- package/skills/metadata-optimization/SKILL.md +170 -0
- package/skills/monetization-strategy/SKILL.md +175 -0
- package/skills/onboarding-optimization/SKILL.md +194 -0
- package/skills/orchestrator/SKILL.md +297 -25
- package/skills/press-and-pr/SKILL.md +204 -0
- package/skills/rating-prompt-strategy/SKILL.md +184 -0
- package/skills/retention-optimization/SKILL.md +165 -0
- package/skills/review-management/SKILL.md +154 -0
- package/skills/screenshot-optimization/SKILL.md +167 -0
- package/skills/seasonal-aso/SKILL.md +141 -0
- package/skills/spec-gate/SKILL.md +312 -0
- package/skills/subscription-lifecycle/SKILL.md +206 -0
- package/skills/swiftui-pro/references/design.md +44 -0
- package/skills/symphony-enforcer/SKILL.md +101 -9
- package/skills/systematic-debugging/SKILL.md +199 -0
- package/skills/ua-campaign/SKILL.md +207 -0
- package/skills/verification-gate/SKILL.md +151 -0
- package/skills/writing-skills/SKILL.md +110 -0
- package/workflows/conductor-codex.md +125 -0
- package/workflows/lifecycle/code.md +28 -1
- package/workflows/lifecycle/debug.md +34 -14
|
@@ -29,3 +29,47 @@ Prefer to place standard fonts, sizes, colors, stack spacing, padding, rounding,
|
|
|
29
29
|
- Avoid hard-coded values for padding and stack spacing unless specifically requested.
|
|
30
30
|
- Avoid UIKit colors (`UIColor`) in SwiftUI code; use SwiftUI `Color` or asset catalog colors.
|
|
31
31
|
- The font size `.caption2` is extremely small, and is generally best avoided. Even the font size `.caption` is on the small side, and should be used carefully.
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
## Dark Mode Color Safety Rules
|
|
35
|
+
|
|
36
|
+
These rules prevent common dark mode bugs that are invisible in light mode development.
|
|
37
|
+
|
|
38
|
+
### 1. Never use hardcoded `Color.white` or `Color.black` for backgrounds or fills
|
|
39
|
+
- **Bad**: `.fill(Color.white)`, `.background(Color.black)`
|
|
40
|
+
- **Good**: `.fill(ColorPalette.darkCard)`, `.background(ColorPalette.backgroundPrimary)`
|
|
41
|
+
- **Exception**: White/black on a NON-adaptive surface (e.g., white icon on a camera viewfinder that is always dark, or text on a green gradient button where the gradient is the same in both modes).
|
|
42
|
+
|
|
43
|
+
### 2. Never pair `.foregroundColor(.white)` with an adaptive fill
|
|
44
|
+
- If a button uses an adaptive fill like `ColorPalette.textPrimary` (which flips between dark/light), the text MUST also use an adaptive color that provides contrast in BOTH modes.
|
|
45
|
+
- **Bad**: `.fill(ColorPalette.textPrimary)` + `.foregroundColor(.white)` — in dark mode, textPrimary ≈ #EDEDED and .white = #FFFFFF → invisible text!
|
|
46
|
+
- **Good**: `.fill(ColorPalette.textPrimary)` + `.foregroundColor(ColorPalette.backgroundPrimary)` — backgroundPrimary is always the opposite of textPrimary.
|
|
47
|
+
- **Rule of thumb**: If fill is adaptive, text color MUST be its inverse adaptive token.
|
|
48
|
+
|
|
49
|
+
### 3. Static background images (PNG/JPG) don't adapt to dark mode
|
|
50
|
+
- Background images with light themes (e.g., food illustrations on white/cream) will always render light, breaking dark mode.
|
|
51
|
+
- **Fix options**:
|
|
52
|
+
- Provide dark variants in the Asset catalog and use `@Environment(\.colorScheme)` to switch.
|
|
53
|
+
- Reduce opacity in dark mode: `.opacity(colorScheme == .dark ? 0.08 : 1.0)`.
|
|
54
|
+
- Apply a dark overlay or color multiply blend.
|
|
55
|
+
- **Exception**: Screenshot/mockup images displayed inside a dark phone frame (the frame provides context).
|
|
56
|
+
|
|
57
|
+
### 4. Always verify contrast between text and its immediate background
|
|
58
|
+
- When reading code, mentally resolve what every color token becomes in BOTH modes.
|
|
59
|
+
- Common trap: Card background = `#272727` (dark gray in dark mode), button fill = `#EDEDED` (light in dark mode), text on button = `.white` → barely visible.
|
|
60
|
+
- **Paired tokens for high contrast**:
|
|
61
|
+
- Fill: `textPrimary` ↔ Text: `backgroundPrimary`
|
|
62
|
+
- Fill: `darkCard` ↔ Text: `textPrimary`
|
|
63
|
+
- Fill: `primaryGreen` ↔ Text: `.white` (green is always green)
|
|
64
|
+
|
|
65
|
+
### 5. Shadow colors must be adaptive
|
|
66
|
+
- **Bad**: `.shadow(color: Color.black.opacity(0.1), ...)`
|
|
67
|
+
- **Good**: `.shadow(color: ColorPalette.shadowLight, ...)` or `.shadow(color: ColorPalette.textPrimary.opacity(0.08), ...)`
|
|
68
|
+
- In dark mode, black shadows on dark backgrounds are invisible; use lighter shadow tokens or skip shadows entirely.
|
|
69
|
+
|
|
70
|
+
### 6. Quick dark mode audit checklist
|
|
71
|
+
When writing or reviewing any SwiftUI view:
|
|
72
|
+
1. `grep -n 'Color\.white\|Color\.black\|\.white\b' FileName.swift` — find all hardcoded colors.
|
|
73
|
+
2. For each hit, ask: "Does this element sit on an adaptive background?" If yes → replace with adaptive token.
|
|
74
|
+
3. Check all `Image("asset_name")` — are any light-themed images used as backgrounds? If yes → add dark mode handling.
|
|
75
|
+
4. For every button: verify fill color + text color provide 4.5:1 contrast ratio in BOTH modes.
|
|
@@ -4,10 +4,10 @@ description: |
|
|
|
4
4
|
Mandatory Symphony checkpoint system. Ensures AI never forgets to create,
|
|
5
5
|
update, or complete tasks in Symphony. Enforces progress reporting at every
|
|
6
6
|
milestone and auto-detects task completion without waiting for user confirmation.
|
|
7
|
-
v3.
|
|
7
|
+
v3.3: Completion Status Protocol, Search-Before-Building, Boil-the-Lake.
|
|
8
8
|
metadata:
|
|
9
9
|
stage: core
|
|
10
|
-
version: "3.
|
|
10
|
+
version: "3.3"
|
|
11
11
|
replaces: "v2.0"
|
|
12
12
|
requires: symphony-orchestrator
|
|
13
13
|
tags: [symphony, enforcement, checkpoint, task-lifecycle, core, spec-first, auto-next]
|
|
@@ -24,14 +24,16 @@ invocation-type: auto
|
|
|
24
24
|
priority: 1
|
|
25
25
|
---
|
|
26
26
|
|
|
27
|
-
# Symphony Enforcer v3.
|
|
27
|
+
# Symphony Enforcer v3.3 — Completion Status Protocol + Gstack Principles
|
|
28
28
|
|
|
29
29
|
> **Purpose:** Đảm bảo AI KHÔNG BAO GIỜ quên cập nhật Symphony.
|
|
30
|
-
> **Key Changes v3.
|
|
30
|
+
> **Key Changes v3.3:**
|
|
31
|
+
> - **Completion Status Protocol**: 4-status (DONE/DONE_WITH_CONCERNS/BLOCKED/NEEDS_CONTEXT)
|
|
32
|
+
> - **Design Compliance (TP1.5)**: Đối chiếu schema changes vs approved design doc
|
|
31
33
|
> - **Pre-Plan Gate**: Đọc spec trước khi plan, hỏi user về constraints
|
|
32
34
|
> - **Auto-Lifecycle**: Liên kết task_boundary ↔ Symphony tự động
|
|
33
35
|
> - **Auto-Next**: BẮT BUỘC gợi ý next steps sau mỗi task done
|
|
34
|
-
> - **Atomic Git Commits**: Tự động commit sau mỗi task done
|
|
36
|
+
> - **Atomic Git Commits**: Tự động commit sau mỗi task done
|
|
35
37
|
> **Principle:** AI tự detect completion — user KHÔNG CẦN nói "xong".
|
|
36
38
|
|
|
37
39
|
---
|
|
@@ -168,7 +170,48 @@ symphony_report_progress(
|
|
|
168
170
|
|
|
169
171
|
---
|
|
170
172
|
|
|
171
|
-
###
|
|
173
|
+
### TP1.5: Design Compliance Check (NEW v3.2 — Gate 4 Enforcement)
|
|
174
|
+
|
|
175
|
+
**Khi nào:** Mỗi khi AI sửa file liên quan đến DB/Model/Schema trong EXECUTION mode.
|
|
176
|
+
|
|
177
|
+
**Trigger signals:**
|
|
178
|
+
```
|
|
179
|
+
File patterns:
|
|
180
|
+
- **/models/**, **/entities/**, **/schemas/**
|
|
181
|
+
- **Migration*, **Schema*, **Model*
|
|
182
|
+
- *.entity.*, *.model.*, *.schema.*
|
|
183
|
+
- Database.swift, AppDatabase.swift, schema.prisma, etc.
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
**Action:**
|
|
187
|
+
```
|
|
188
|
+
1. Kiểm tra: docs/architecture/<feature>_design.md tồn tại?
|
|
189
|
+
→ KHÔNG → ⚠️ Warning: "Đang sửa model file nhưng chưa có approved design.
|
|
190
|
+
Recommend chạy spec-gate trước."
|
|
191
|
+
→ Nếu COMPLEX task → ⛔ DỪNG, enforce Gate 2
|
|
192
|
+
→ Nếu TRIVIAL/MODERATE → Warning only, tiếp tục
|
|
193
|
+
|
|
194
|
+
2. Đối chiếu thay đổi vs approved design:
|
|
195
|
+
→ Thêm field KHÔNG có trong design? → ⛔ DỪNG
|
|
196
|
+
→ Đổi type khác design? → ⛔ DỪNG
|
|
197
|
+
→ Xóa field trong design? → ⛔ DỪNG
|
|
198
|
+
→ Thêm field CÓ trong design? → ✅ OK
|
|
199
|
+
|
|
200
|
+
3. Khi DỪNG:
|
|
201
|
+
→ Thông báo: "Schema change ngoài approved design detected.
|
|
202
|
+
[field_name] không có trong docs/architecture/<feature>_design.md.
|
|
203
|
+
Quay lại Gate 2 để update design trước nhé."
|
|
204
|
+
→ Kích hoạt spec-gate skill để update design doc
|
|
205
|
+
→ Sau khi re-approve → tiếp tục code
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
**Enforcement:**
|
|
209
|
+
- ❌ KHÔNG tự ý thêm cột/bảng ngoài approved design cho COMPLEX tasks
|
|
210
|
+
- ✅ NÊN ghi lại mọi deviation attempt vào NeuralMemory cho future reference
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
### TP2: Task Complete — Completion Status Protocol
|
|
172
215
|
|
|
173
216
|
**Khi nào:** AI detect ≥2/4 completion signals:
|
|
174
217
|
|
|
@@ -179,13 +222,62 @@ Signal 3: Tất cả checklist items trong task.md đã [x]
|
|
|
179
222
|
Signal 4: Verification pass (tests OK, build OK)
|
|
180
223
|
```
|
|
181
224
|
|
|
182
|
-
**
|
|
225
|
+
**Completion Status Protocol (4 statuses):**
|
|
226
|
+
|
|
227
|
+
```
|
|
228
|
+
DONE:
|
|
229
|
+
Điều kiện: Verification pass, không caveats.
|
|
230
|
+
Action: symphony_complete_task với evidence.
|
|
231
|
+
Format: "✅ DONE — {summary}. Build: ✅. Tests: ✅ N/N."
|
|
232
|
+
|
|
233
|
+
DONE_WITH_CONCERNS:
|
|
234
|
+
Điều kiện: Code hoạt động nhưng có caveats/risks cần biết.
|
|
235
|
+
Action: Complete task NHƯNG ghi rõ concerns.
|
|
236
|
+
Format: "⚠️ DONE_WITH_CONCERNS — {summary}.
|
|
237
|
+
Concerns: [list cụ thể]
|
|
238
|
+
Risk: [mức độ ảnh hưởng]
|
|
239
|
+
Recommendation: [đề xuất xử lý]"
|
|
240
|
+
Ví dụ: "Feature works nhưng chưa handle offline mode."
|
|
241
|
+
Ví dụ: "API call thành công nhưng chưa có retry logic."
|
|
242
|
+
|
|
243
|
+
BLOCKED:
|
|
244
|
+
Điều kiện: Không thể tiếp tục vì external dependency/blocker.
|
|
245
|
+
Action: KHÔNG complete task. Report + list attempts.
|
|
246
|
+
Format: "🚫 BLOCKED — {reason}.
|
|
247
|
+
Attempted: [list things đã thử]
|
|
248
|
+
Needs: [what's needed to unblock]"
|
|
249
|
+
Ví dụ: "API endpoint return 500, đã retry 3 lần."
|
|
250
|
+
|
|
251
|
+
NEEDS_CONTEXT:
|
|
252
|
+
Điều kiện: Thiếu thông tin từ user để tiếp tục.
|
|
253
|
+
Action: KHÔNG complete task. Hỏi user cụ thể.
|
|
254
|
+
Format: "❓ NEEDS_CONTEXT — {what's missing}.
|
|
255
|
+
Question: [câu hỏi cụ thể]
|
|
256
|
+
Options: [list options nếu có]"
|
|
257
|
+
Ví dụ: "Cần user clarify: offline-first hay online-only?"
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
⛔ **KHÔNG BAO GIỜ report DONE nếu thực tế là DONE_WITH_CONCERNS hoặc BLOCKED.**
|
|
261
|
+
|
|
262
|
+
**Action (cho DONE status):**
|
|
183
263
|
```
|
|
264
|
+
0. ⚡ VERIFICATION GATE (BẮT BUỘC — Iron Law):
|
|
265
|
+
- IDENTIFY: What command proves this task is done?
|
|
266
|
+
- RUN: Execute verification (build, test, lint)
|
|
267
|
+
- READ: Full output, check exit code
|
|
268
|
+
- VERIFY: Does output confirm completion?
|
|
269
|
+
- If NO → FIX trước, KHÔNG complete task
|
|
270
|
+
- If YES → Proceed with evidence
|
|
271
|
+
⛔ Skip verification = VI PHẠM (xem verification-gate skill)
|
|
272
|
+
|
|
184
273
|
1. symphony_complete_task(
|
|
185
274
|
task_id=current_task,
|
|
186
|
-
summary="mô tả ngắn
|
|
275
|
+
summary="mô tả ngắn + STATUS + VERIFICATION EVIDENCE"
|
|
276
|
+
// ✅ "DONE — Implemented X. Build: ✅ exit 0. Tests: ✅ 47/47."
|
|
277
|
+
// ✅ "DONE_WITH_CONCERNS — Implemented X. Build: ✅. Concerns: no offline support."
|
|
278
|
+
// ❌ "Implemented X" (không status, không evidence)
|
|
187
279
|
)
|
|
188
|
-
2. Hiển thị: "✅ SYM #sym-XYZ —
|
|
280
|
+
2. Hiển thị: "✅ SYM #sym-XYZ — {STATUS}"
|
|
189
281
|
3. → TRIGGER TP2.5 (Atomic Git Commit)
|
|
190
282
|
4. → TRIGGER TP4 (Auto-Next) NGAY LẬP TỨC
|
|
191
283
|
```
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: systematic-debugging
|
|
3
|
+
description: Use for ANY technical issue - bugs, test failures, build errors, crashes. Enforces 4-phase root cause process before any fix attempts. Auto-triggers on /debug, error detection, test failures.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Systematic Debugging
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
Random fixes waste time and create new bugs. Quick patches mask underlying issues.
|
|
11
|
+
|
|
12
|
+
**Core principle:** ALWAYS find root cause before attempting fixes. Symptom fixes are failure.
|
|
13
|
+
|
|
14
|
+
## The Iron Law
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
NO FIXES WITHOUT ROOT CAUSE INVESTIGATION FIRST
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
If you haven't completed Phase 1, you CANNOT propose fixes.
|
|
21
|
+
|
|
22
|
+
## When to Use
|
|
23
|
+
|
|
24
|
+
Use for ANY technical issue:
|
|
25
|
+
- Test failures
|
|
26
|
+
- Runtime crashes / EXC_BAD_ACCESS / ANR
|
|
27
|
+
- Unexpected behavior
|
|
28
|
+
- Performance problems
|
|
29
|
+
- Build failures (Xcode, Gradle, npm)
|
|
30
|
+
- Integration issues (API, SDK, Firebase)
|
|
31
|
+
|
|
32
|
+
**Use this ESPECIALLY when:**
|
|
33
|
+
- Under time pressure (emergencies make guessing tempting)
|
|
34
|
+
- "Just one quick fix" seems obvious
|
|
35
|
+
- You've already tried multiple fixes
|
|
36
|
+
- Previous fix didn't work
|
|
37
|
+
- You don't fully understand the issue
|
|
38
|
+
|
|
39
|
+
## The Four Phases
|
|
40
|
+
|
|
41
|
+
You MUST complete each phase before proceeding to the next.
|
|
42
|
+
|
|
43
|
+
### Phase 1: Root Cause Investigation (BEFORE ANY FIX)
|
|
44
|
+
|
|
45
|
+
1. **Read Error Messages Carefully**
|
|
46
|
+
- Don't skip past errors or warnings
|
|
47
|
+
- Read stack traces COMPLETELY — they often contain the exact answer
|
|
48
|
+
- Note line numbers, file paths, error codes
|
|
49
|
+
- For iOS: read the full crash log, not just the top frame
|
|
50
|
+
- For Android: read logcat with proper filters
|
|
51
|
+
|
|
52
|
+
2. **Reproduce Consistently**
|
|
53
|
+
- Can you trigger it reliably? What are the exact steps?
|
|
54
|
+
- If not reproducible → gather more data, DON'T guess
|
|
55
|
+
- For intermittent: add diagnostic logging at component boundaries
|
|
56
|
+
|
|
57
|
+
3. **Check Recent Changes**
|
|
58
|
+
- `git diff` — what changed?
|
|
59
|
+
- Recent commits, new dependencies, config changes
|
|
60
|
+
- Environmental differences (device, OS version, network)
|
|
61
|
+
|
|
62
|
+
4. **Gather Evidence in Multi-Component Systems**
|
|
63
|
+
```
|
|
64
|
+
For EACH component boundary:
|
|
65
|
+
- Log what data enters component
|
|
66
|
+
- Log what data exits component
|
|
67
|
+
- Verify environment/config propagation
|
|
68
|
+
- Check state at each layer
|
|
69
|
+
|
|
70
|
+
Run once to gather evidence showing WHERE it breaks
|
|
71
|
+
THEN analyze evidence to identify failing component
|
|
72
|
+
THEN investigate that specific component
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
5. **Trace Data Flow**
|
|
76
|
+
- Where does the bad value originate?
|
|
77
|
+
- What called this with the bad value?
|
|
78
|
+
- Keep tracing UP until you find the source
|
|
79
|
+
- **Fix at source, not at symptom**
|
|
80
|
+
|
|
81
|
+
### Phase 2: Pattern Analysis
|
|
82
|
+
|
|
83
|
+
1. **Find Working Examples** — Locate similar working code in same codebase
|
|
84
|
+
2. **Compare Against References** — Read reference implementation COMPLETELY (don't skim)
|
|
85
|
+
3. **Identify Differences** — List EVERY difference, however small
|
|
86
|
+
4. **Understand Dependencies** — What components, settings, config does this need?
|
|
87
|
+
|
|
88
|
+
### Phase 3: Hypothesis & Testing
|
|
89
|
+
|
|
90
|
+
1. **Form Single Hypothesis** — "I think X is the root cause because Y"
|
|
91
|
+
2. **Test Minimally** — SMALLEST possible change. One variable at a time
|
|
92
|
+
3. **Verify Before Continuing** — Worked? → Phase 4. Didn't? → NEW hypothesis
|
|
93
|
+
4. **When You Don't Know** — Say "I don't understand X". Don't pretend. Research more
|
|
94
|
+
|
|
95
|
+
### Phase 4: Implementation
|
|
96
|
+
|
|
97
|
+
1. **Create Failing Test Case** — Simplest possible reproduction. MUST have before fixing
|
|
98
|
+
2. **Implement Single Fix** — ONE change at a time. No "while I'm here" improvements
|
|
99
|
+
3. **Verify Fix** — Test passes? No other tests broken? Issue actually resolved?
|
|
100
|
+
|
|
101
|
+
## The 3-Strike Escalation Protocol
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
If 3+ fixes have FAILED → STOP. ESCALATE. NO EXCEPTIONS.
|
|
105
|
+
|
|
106
|
+
This is NOT a failed hypothesis.
|
|
107
|
+
This is a WRONG ARCHITECTURE.
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
**Escalation Protocol (BẮT BUỘC sau 3 failed attempts):**
|
|
111
|
+
|
|
112
|
+
```
|
|
113
|
+
1. STOP — Không thử fix thứ 4.
|
|
114
|
+
2. REPORT full context cho user:
|
|
115
|
+
🚫 ESCALATION — 3 fix attempts failed
|
|
116
|
+
─────────────────────────────────────
|
|
117
|
+
Attempt 1: {what tried} → {why failed}
|
|
118
|
+
Attempt 2: {what tried} → {why failed}
|
|
119
|
+
Attempt 3: {what tried} → {why failed}
|
|
120
|
+
|
|
121
|
+
Root Cause Hypothesis: {current best guess}
|
|
122
|
+
Architectural Concern: {pattern detected}
|
|
123
|
+
|
|
124
|
+
Recommended: [refactor approach | seek expert | alternative solution]
|
|
125
|
+
─────────────────────────────────────
|
|
126
|
+
3. WAIT for user decision — do NOT proceed autonomously.
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
**Pattern indicating architectural problem:**
|
|
130
|
+
- Each fix reveals new shared state/coupling
|
|
131
|
+
- Fixes require "massive refactoring" to implement
|
|
132
|
+
- Each fix creates new symptoms elsewhere
|
|
133
|
+
|
|
134
|
+
## Scope Freeze During Debug
|
|
135
|
+
|
|
136
|
+
```
|
|
137
|
+
Khi đang debug một issue:
|
|
138
|
+
- KHÔNG sửa bug khác "tiện tay"
|
|
139
|
+
- KHÔNG refactor code xung quanh
|
|
140
|
+
- KHÔNG thêm feature "nhân tiện"
|
|
141
|
+
- CHỈ tập trung vào root cause hiện tại
|
|
142
|
+
|
|
143
|
+
Violation → revert side changes, focus on current scope
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## Red Flags — STOP and Return to Phase 1
|
|
147
|
+
|
|
148
|
+
If you catch yourself thinking:
|
|
149
|
+
- "Quick fix for now, investigate later"
|
|
150
|
+
- "Just try changing X and see if it works"
|
|
151
|
+
- "It's probably X, let me fix that"
|
|
152
|
+
- "I don't fully understand but this might work"
|
|
153
|
+
- "Here are the main problems: [lists fixes without investigation]"
|
|
154
|
+
- Proposing solutions before tracing data flow
|
|
155
|
+
- **"One more fix attempt" (when already tried 2+)**
|
|
156
|
+
- **Each fix reveals new problem in different place**
|
|
157
|
+
|
|
158
|
+
**ALL of these mean: STOP. Return to Phase 1.**
|
|
159
|
+
|
|
160
|
+
## Anti-Rationalization Table
|
|
161
|
+
|
|
162
|
+
| Excuse | Reality |
|
|
163
|
+
|--------|---------|
|
|
164
|
+
| "Issue is simple, don't need process" | Simple issues have root causes too. Process is fast for simple bugs |
|
|
165
|
+
| "Emergency, no time for process" | Systematic debugging is FASTER than guess-and-check |
|
|
166
|
+
| "Just try this first, then investigate" | First fix sets the pattern. Do it right from the start |
|
|
167
|
+
| "I'll write test after confirming fix" | Untested fixes don't stick. Test first proves it |
|
|
168
|
+
| "Multiple fixes at once saves time" | Can't isolate what worked. Causes new bugs |
|
|
169
|
+
| "I see the problem, let me fix it" | Seeing symptoms ≠ understanding root cause |
|
|
170
|
+
| "One more fix attempt" (after 2+) | 3+ failures = architectural problem. Question pattern |
|
|
171
|
+
| "Reference too long, I'll adapt" | Partial understanding guarantees bugs. Read completely |
|
|
172
|
+
|
|
173
|
+
## Quick Reference
|
|
174
|
+
|
|
175
|
+
| Phase | Key Activities | Success Criteria |
|
|
176
|
+
|-------|---------------|------------------|
|
|
177
|
+
| **1. Root Cause** | Read errors, reproduce, check changes, gather evidence | Understand WHAT and WHY |
|
|
178
|
+
| **2. Pattern** | Find working examples, compare | Identify differences |
|
|
179
|
+
| **3. Hypothesis** | Form theory, test minimally | Confirmed or new hypothesis |
|
|
180
|
+
| **4. Implementation** | Create test, fix, verify | Bug resolved, tests pass |
|
|
181
|
+
|
|
182
|
+
## NeuralMemory Integration
|
|
183
|
+
|
|
184
|
+
After fixing a bug:
|
|
185
|
+
1. `nmem_remember` the root cause, fix, and pattern — tag with projectId
|
|
186
|
+
2. Before debugging NEW bugs: `nmem_recall` for similar past issues
|
|
187
|
+
3. Saves hours on recurring patterns
|
|
188
|
+
|
|
189
|
+
## Integration
|
|
190
|
+
|
|
191
|
+
**Related skills:**
|
|
192
|
+
- **verification-gate** — Verify fix worked before claiming success
|
|
193
|
+
- **single-flow-task-execution** — For structured task execution
|
|
194
|
+
- **symphony-enforcer** — Report debug progress to Symphony
|
|
195
|
+
|
|
196
|
+
**Related workflows:**
|
|
197
|
+
- `/debug` — Primary trigger workflow
|
|
198
|
+
- `/bug-hunter` — Automated bug hunting
|
|
199
|
+
- `/hotfix` — Production emergency (still follows 4-phase!)
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ua-campaign
|
|
3
|
+
description: When the user wants to plan or optimize paid user acquisition campaigns. Also use when the user mentions "Apple Search Ads", "user acquisition", "paid ads", "UA", "ad campaign", "install campaign", "Facebook ads for apps", "TikTok ads", or "cost per install". For organic growth, see aso-audit. For launch-specific UA, see app-launch.
|
|
4
|
+
metadata:
|
|
5
|
+
version: 1.0.0
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# User Acquisition Campaigns
|
|
9
|
+
|
|
10
|
+
You are an expert in mobile app user acquisition across all major ad platforms. Your goal is to help the user plan, launch, and optimize paid campaigns that drive profitable installs.
|
|
11
|
+
|
|
12
|
+
## Initial Assessment
|
|
13
|
+
|
|
14
|
+
1. Check for `app-marketing-context.md` — read it for context
|
|
15
|
+
2. Ask for **monthly UA budget** (this determines channel strategy)
|
|
16
|
+
3. Ask for **target CPI** (cost per install) or **target ROAS**
|
|
17
|
+
4. Ask for **current LTV** (lifetime value per user)
|
|
18
|
+
5. Ask for **target audience** (demographics, interests, behaviors)
|
|
19
|
+
6. Ask for **target countries**
|
|
20
|
+
7. Ask for **app category** (affects channel selection)
|
|
21
|
+
|
|
22
|
+
## Channel Selection
|
|
23
|
+
|
|
24
|
+
### Budget-Based Recommendations
|
|
25
|
+
|
|
26
|
+
| Monthly Budget | Recommended Channels |
|
|
27
|
+
|---------------|---------------------|
|
|
28
|
+
| < $1K | Apple Search Ads (Basic) only |
|
|
29
|
+
| $1K-$5K | Apple Search Ads (Advanced) + 1 social channel |
|
|
30
|
+
| $5K-$20K | ASA + Meta + Google UAC |
|
|
31
|
+
| $20K-$100K | ASA + Meta + Google + TikTok + testing new channels |
|
|
32
|
+
| $100K+ | All channels + programmatic + influencer |
|
|
33
|
+
|
|
34
|
+
### Channel Comparison
|
|
35
|
+
|
|
36
|
+
| Channel | Avg CPI | Intent | Best For | Complexity |
|
|
37
|
+
|---------|---------|--------|----------|------------|
|
|
38
|
+
| **Apple Search Ads** | $1-3 | Very High | All iOS apps | Low |
|
|
39
|
+
| **Google UAC** | $0.5-2 | Medium | Android + broad reach | Medium |
|
|
40
|
+
| **Meta (FB/IG)** | $1-4 | Low-Medium | Consumer, social, e-commerce | High |
|
|
41
|
+
| **TikTok** | $0.5-3 | Low | Young demographics, games | Medium |
|
|
42
|
+
| **Snapchat** | $0.5-2 | Low | Gen Z, AR apps | Medium |
|
|
43
|
+
| **Twitter/X** | $2-5 | Low | News, tech, finance | Medium |
|
|
44
|
+
| **Reddit** | $1-3 | Medium | Niche communities | Low |
|
|
45
|
+
|
|
46
|
+
## Apple Search Ads (Priority Channel)
|
|
47
|
+
|
|
48
|
+
### Why Start Here
|
|
49
|
+
- Highest intent (user is actively searching)
|
|
50
|
+
- Best conversion rates (30-50% tap-to-install)
|
|
51
|
+
- Direct App Store integration
|
|
52
|
+
- Works for any budget
|
|
53
|
+
|
|
54
|
+
### Campaign Structure
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
Account
|
|
58
|
+
├── Brand Campaign (exact match)
|
|
59
|
+
│ ├── [your app name]
|
|
60
|
+
│ └── [common misspellings]
|
|
61
|
+
├── Category Campaign (broad + exact)
|
|
62
|
+
│ ├── [category terms]
|
|
63
|
+
│ └── [feature terms]
|
|
64
|
+
├── Competitor Campaign (exact match)
|
|
65
|
+
│ ├── [competitor name 1]
|
|
66
|
+
│ └── [competitor name 2]
|
|
67
|
+
└── Discovery Campaign (Search Match)
|
|
68
|
+
└── Auto-targeting (find new keywords)
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Bidding Strategy
|
|
72
|
+
|
|
73
|
+
| Campaign Type | Bid Strategy | Target CPA |
|
|
74
|
+
|--------------|-------------|------------|
|
|
75
|
+
| Brand | Low bids, high volume | < $0.50 |
|
|
76
|
+
| Category | Medium bids | $1-3 |
|
|
77
|
+
| Competitor | Higher bids, lower volume | $2-5 |
|
|
78
|
+
| Discovery | Low bids, broad | $1-3 |
|
|
79
|
+
|
|
80
|
+
### Optimization Checklist
|
|
81
|
+
|
|
82
|
+
- [ ] Add negative keywords from Discovery to prevent waste
|
|
83
|
+
- [ ] Move winning Discovery keywords to exact match campaigns
|
|
84
|
+
- [ ] Pause keywords with CPA > 2x target
|
|
85
|
+
- [ ] Increase bids on keywords with CPA < target
|
|
86
|
+
- [ ] Test Custom Product Pages for different keyword intents
|
|
87
|
+
- [ ] Review Search Match terms weekly
|
|
88
|
+
- [ ] Adjust bids by day of week and time
|
|
89
|
+
|
|
90
|
+
## Meta (Facebook/Instagram) Campaigns
|
|
91
|
+
|
|
92
|
+
### Campaign Structure
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
Campaign: App Installs
|
|
96
|
+
├── Ad Set 1: Lookalike (1%) of paying users
|
|
97
|
+
│ ├── Ad: Video (15s feature demo)
|
|
98
|
+
│ ├── Ad: Carousel (feature highlights)
|
|
99
|
+
│ └── Ad: Static (benefit headline)
|
|
100
|
+
├── Ad Set 2: Interest-based targeting
|
|
101
|
+
│ ├── Ad: Video (problem/solution)
|
|
102
|
+
│ └── Ad: UGC-style testimonial
|
|
103
|
+
└── Ad Set 3: Broad targeting (let Meta optimize)
|
|
104
|
+
├── Ad: Best performing from above
|
|
105
|
+
└── Ad: New creative test
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Creative Best Practices
|
|
109
|
+
|
|
110
|
+
**Video ads (highest performance):**
|
|
111
|
+
- Hook in first 3 seconds
|
|
112
|
+
- Show the app in action
|
|
113
|
+
- 15-30 seconds optimal
|
|
114
|
+
- Works without sound (captions)
|
|
115
|
+
- End with clear CTA and App Store badge
|
|
116
|
+
|
|
117
|
+
**Static ads:**
|
|
118
|
+
- Bold headline with key benefit
|
|
119
|
+
- App screenshot or mockup
|
|
120
|
+
- Social proof (rating, user count)
|
|
121
|
+
- Clear "Download Free" CTA
|
|
122
|
+
|
|
123
|
+
### Audience Strategy
|
|
124
|
+
|
|
125
|
+
1. **Seed:** Upload paying user emails → create Lookalike
|
|
126
|
+
2. **Expand:** Lookalike 1% → 3% → 5% as you scale
|
|
127
|
+
3. **Layer:** Interest targeting for specific segments
|
|
128
|
+
4. **Broad:** Let Meta's algorithm find users (works at scale)
|
|
129
|
+
|
|
130
|
+
## Google UAC (Universal App Campaigns)
|
|
131
|
+
|
|
132
|
+
### Setup
|
|
133
|
+
- Provide 4 text ideas, 20 images, 5 videos
|
|
134
|
+
- Set target CPI or target CPA
|
|
135
|
+
- Google automatically creates and tests ad combinations
|
|
136
|
+
- Runs across Search, Display, YouTube, and Play Store
|
|
137
|
+
|
|
138
|
+
### Optimization
|
|
139
|
+
- Focus on creative quality (Google does the targeting)
|
|
140
|
+
- Test different value propositions in text
|
|
141
|
+
- Provide diverse creative assets
|
|
142
|
+
- Set realistic CPA targets (start high, lower gradually)
|
|
143
|
+
|
|
144
|
+
## Key Metrics & Optimization
|
|
145
|
+
|
|
146
|
+
### Funnel Metrics
|
|
147
|
+
|
|
148
|
+
```
|
|
149
|
+
Impressions → Taps → Installs → Activations → Purchases
|
|
150
|
+
CTR CVR CPI CPA ROAS
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
| Metric | Formula | Target |
|
|
154
|
+
|--------|---------|--------|
|
|
155
|
+
| CTR | Taps / Impressions | > 5% (ASA), > 1% (social) |
|
|
156
|
+
| CVR | Installs / Taps | > 30% (ASA), > 10% (social) |
|
|
157
|
+
| CPI | Spend / Installs | < LTV / 3 |
|
|
158
|
+
| CPA | Spend / Purchases | < LTV |
|
|
159
|
+
| ROAS | Revenue / Spend | > 1.0 (break even), > 2.0 (good) |
|
|
160
|
+
| D7 ROAS | Day 7 Revenue / Spend | Predict long-term ROAS |
|
|
161
|
+
|
|
162
|
+
### Optimization Cadence
|
|
163
|
+
|
|
164
|
+
| Frequency | Action |
|
|
165
|
+
|-----------|--------|
|
|
166
|
+
| Daily | Check spend pacing, pause overspending |
|
|
167
|
+
| Weekly | Review CPI/CPA by keyword/ad set, adjust bids |
|
|
168
|
+
| Bi-weekly | Refresh creative (ad fatigue after 2-3 weeks) |
|
|
169
|
+
| Monthly | Review channel mix, reallocate budget to winners |
|
|
170
|
+
| Quarterly | Strategic review, test new channels |
|
|
171
|
+
|
|
172
|
+
## Output Format
|
|
173
|
+
|
|
174
|
+
### UA Plan
|
|
175
|
+
|
|
176
|
+
```
|
|
177
|
+
Monthly Budget: $[X]
|
|
178
|
+
Target CPI: $[X]
|
|
179
|
+
Target Monthly Installs: [N]
|
|
180
|
+
|
|
181
|
+
Channel Allocation:
|
|
182
|
+
- Apple Search Ads: [X]% ($[X])
|
|
183
|
+
- Meta: [X]% ($[X])
|
|
184
|
+
- Google UAC: [X]% ($[X])
|
|
185
|
+
- Testing: [X]% ($[X])
|
|
186
|
+
|
|
187
|
+
Week 1: [setup tasks]
|
|
188
|
+
Week 2: [launch tasks]
|
|
189
|
+
Week 3-4: [optimization tasks]
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### Campaign Briefs
|
|
193
|
+
|
|
194
|
+
For each channel, provide:
|
|
195
|
+
- Campaign structure
|
|
196
|
+
- Targeting strategy
|
|
197
|
+
- Creative requirements
|
|
198
|
+
- Budget and bid recommendations
|
|
199
|
+
- KPI targets
|
|
200
|
+
|
|
201
|
+
## Related Skills
|
|
202
|
+
|
|
203
|
+
- `app-launch` — UA strategy for launch
|
|
204
|
+
- `monetization-strategy` — LTV calculation for CPI targets
|
|
205
|
+
- `app-analytics` — Attribution and funnel tracking
|
|
206
|
+
- `competitor-analysis` — Competitive ad intelligence
|
|
207
|
+
- `ab-test-store-listing` — Improve organic conversion (lowers effective CPI)
|