popilot 0.5.0 β†’ 0.6.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 (63) hide show
  1. package/adapters/codex/.codex/commands/_domain.md.hbs +33 -0
  2. package/adapters/codex/.codex/commands/analytics.md.hbs +55 -0
  3. package/adapters/codex/.codex/commands/daily.md.hbs +301 -0
  4. package/adapters/codex/.codex/commands/dev.md.hbs +62 -0
  5. package/adapters/codex/.codex/commands/gtm.md +82 -0
  6. package/adapters/codex/.codex/commands/handoff.md +259 -0
  7. package/adapters/codex/.codex/commands/market.md +120 -0
  8. package/adapters/codex/.codex/commands/metrics.md +123 -0
  9. package/adapters/codex/.codex/commands/oscar-loop.md +436 -0
  10. package/adapters/codex/.codex/commands/party.md +85 -0
  11. package/adapters/codex/.codex/commands/plan.md +43 -0
  12. package/adapters/codex/.codex/commands/research.md +203 -0
  13. package/adapters/codex/.codex/commands/retro.md +68 -0
  14. package/adapters/codex/.codex/commands/save.md +440 -0
  15. package/adapters/codex/.codex/commands/sessions.md +139 -0
  16. package/adapters/codex/.codex/commands/sprint.md +106 -0
  17. package/adapters/codex/.codex/commands/start.md +396 -0
  18. package/adapters/codex/.codex/commands/strategy.md +41 -0
  19. package/adapters/codex/.codex/commands/task.md +220 -0
  20. package/adapters/codex/.codex/commands/tracking.md +116 -0
  21. package/adapters/codex/.codex/commands/validate.md +58 -0
  22. package/adapters/codex/AGENTS.md.hbs +210 -0
  23. package/adapters/codex/manifest.yaml +36 -0
  24. package/adapters/gemini/.gemini/commands/_domain.md.hbs +33 -0
  25. package/adapters/gemini/.gemini/commands/analytics.md.hbs +55 -0
  26. package/adapters/gemini/.gemini/commands/daily.md.hbs +301 -0
  27. package/adapters/gemini/.gemini/commands/dev.md.hbs +62 -0
  28. package/adapters/gemini/.gemini/commands/gtm.md +82 -0
  29. package/adapters/gemini/.gemini/commands/handoff.md +259 -0
  30. package/adapters/gemini/.gemini/commands/market.md +120 -0
  31. package/adapters/gemini/.gemini/commands/metrics.md +123 -0
  32. package/adapters/gemini/.gemini/commands/oscar-loop.md +436 -0
  33. package/adapters/gemini/.gemini/commands/party.md +85 -0
  34. package/adapters/gemini/.gemini/commands/plan.md +43 -0
  35. package/adapters/gemini/.gemini/commands/research.md +203 -0
  36. package/adapters/gemini/.gemini/commands/retro.md +68 -0
  37. package/adapters/gemini/.gemini/commands/save.md +440 -0
  38. package/adapters/gemini/.gemini/commands/sessions.md +139 -0
  39. package/adapters/gemini/.gemini/commands/sprint.md +106 -0
  40. package/adapters/gemini/.gemini/commands/start.md +396 -0
  41. package/adapters/gemini/.gemini/commands/strategy.md +41 -0
  42. package/adapters/gemini/.gemini/commands/task.md +220 -0
  43. package/adapters/gemini/.gemini/commands/tracking.md +116 -0
  44. package/adapters/gemini/.gemini/commands/validate.md +58 -0
  45. package/adapters/gemini/GEMINI.md.hbs +210 -0
  46. package/adapters/gemini/manifest.yaml +36 -0
  47. package/bin/cli.mjs +11 -2
  48. package/lib/industry-presets.mjs +135 -0
  49. package/lib/setup-wizard.mjs +37 -1
  50. package/package.json +1 -1
  51. package/scaffold/.context/agents/TEMPLATE.md +14 -0
  52. package/scaffold/.context/agents/analyst.md.hbs +3 -3
  53. package/scaffold/.context/agents/developer.md.hbs +5 -5
  54. package/scaffold/.context/agents/gtm-strategist.md.hbs +3 -3
  55. package/scaffold/.context/agents/handoff-specialist.md.hbs +18 -18
  56. package/scaffold/.context/agents/market-researcher.md.hbs +6 -6
  57. package/scaffold/.context/agents/orchestrator.md.hbs +8 -8
  58. package/scaffold/.context/agents/planner.md.hbs +6 -6
  59. package/scaffold/.context/agents/qa.md.hbs +5 -5
  60. package/scaffold/.context/agents/researcher.md.hbs +33 -6
  61. package/scaffold/.context/agents/strategist.md.hbs +8 -8
  62. package/scaffold/.context/agents/tracking-governor.md.hbs +2 -2
  63. package/scaffold/.context/project.yaml.example +6 -0
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Industry presets β€” maps industry type to template variables
3
+ * used in agent .hbs persona generation.
4
+ *
5
+ * Each preset provides 21 project.* variables that agent templates
6
+ * reference via {{project.example_entity}}, {{project.key_metrics}}, etc.
7
+ */
8
+
9
+ const PRESETS = {
10
+ saas: {
11
+ industry_label: 'SaaS',
12
+ domain_expertise: 'SaaS product management, subscription lifecycle, activation & retention optimization',
13
+ key_metrics: 'MRR, Churn Rate, LTV, CAC, Trial-to-Paid Conversion',
14
+ example_entity: 'subscription plan',
15
+ example_entity_plural: 'subscription plans',
16
+ example_status_feature: 'plan health indicator',
17
+ example_status_states: '🟒 active, 🟑 at-risk, πŸ”΄ churning',
18
+ example_metric_name: 'Trial-to-Paid Conversion Rate',
19
+ example_metric_before: '12%',
20
+ example_metric_target: '20%',
21
+ example_persona_primary: 'trial users in first 14 days',
22
+ example_icp: 'new SMB teams (5-20 seats)',
23
+ example_icp_ko: 'μ‹ κ·œ SMB νŒ€(5-20석)',
24
+ example_api_endpoint: '/api/subscriptions/{id}',
25
+ example_event_name: 'plan_status_viewed',
26
+ example_chart_name: 'MRR trend chart',
27
+ example_data_path: 'domains/subscriptions/database.md',
28
+ example_empty_state_msg: 'ꡬ독 ν”Œλžœμ„ λ“±λ‘ν•΄λ³΄μ„Έμš”',
29
+ example_few_shot_problem: 'Users discover plan issues 72h late',
30
+ example_few_shot_question: 'If we provide plan health indicators, will users take preventive action?',
31
+ example_action: 'upgrade to premium',
32
+ },
33
+
34
+ ecommerce: {
35
+ industry_label: 'E-commerce',
36
+ domain_expertise: 'E-commerce operations, product catalog management, order fulfillment & conversion optimization',
37
+ key_metrics: 'GMV, Conversion Rate, AOV, Cart Abandonment Rate, Repeat Purchase Rate',
38
+ example_entity: 'product listing',
39
+ example_entity_plural: 'product listings',
40
+ example_status_feature: 'listing performance indicator',
41
+ example_status_states: '🟒 top-seller, 🟑 underperforming, πŸ”΄ stale',
42
+ example_metric_name: 'Cart-to-Purchase Conversion Rate',
43
+ example_metric_before: '18%',
44
+ example_metric_target: '28%',
45
+ example_persona_primary: 'first-time buyers within 7 days of signup',
46
+ example_icp: 'online shoppers aged 25-40 in metro areas',
47
+ example_icp_ko: 'μˆ˜λ„κΆŒ 25-40μ„Έ 온라인 μ‡Όν•‘ 고객',
48
+ example_api_endpoint: '/api/products/{id}',
49
+ example_event_name: 'product_detail_viewed',
50
+ example_chart_name: 'GMV trend chart',
51
+ example_data_path: 'domains/products/database.md',
52
+ example_empty_state_msg: '첫 번째 μƒν’ˆμ„ λ“±λ‘ν•΄λ³΄μ„Έμš”',
53
+ example_few_shot_problem: 'Sellers discover underperforming listings too late',
54
+ example_few_shot_question: 'If we show listing performance indicators, will sellers optimize faster?',
55
+ example_action: 'add to cart',
56
+ },
57
+
58
+ b2b_platform: {
59
+ industry_label: 'B2B Platform',
60
+ domain_expertise: 'B2B platform management, client onboarding, workflow automation & enterprise sales cycle',
61
+ key_metrics: 'ARR, Net Revenue Retention, Onboarding Completion Rate, Feature Adoption, Expansion Revenue',
62
+ example_entity: 'client workspace',
63
+ example_entity_plural: 'client workspaces',
64
+ example_status_feature: 'workspace health score',
65
+ example_status_states: '🟒 healthy, 🟑 needs-attention, πŸ”΄ at-risk',
66
+ example_metric_name: 'Onboarding Completion Rate',
67
+ example_metric_before: '55%',
68
+ example_metric_target: '80%',
69
+ example_persona_primary: 'new enterprise clients in first 30 days',
70
+ example_icp: 'mid-market companies (50-500 employees)',
71
+ example_icp_ko: '쀑견기업(50-500λͺ… 규λͺ¨)',
72
+ example_api_endpoint: '/api/workspaces/{id}',
73
+ example_event_name: 'workspace_setup_completed',
74
+ example_chart_name: 'ARR trend chart',
75
+ example_data_path: 'domains/workspaces/database.md',
76
+ example_empty_state_msg: 'μ›Œν¬μŠ€νŽ˜μ΄μŠ€λ₯Ό μ„€μ •ν•΄λ³΄μ„Έμš”',
77
+ example_few_shot_problem: 'Clients get stuck during onboarding and churn before activation',
78
+ example_few_shot_question: 'If we provide guided onboarding with health scores, will completion rate improve?',
79
+ example_action: 'complete onboarding',
80
+ },
81
+
82
+ generic: {
83
+ industry_label: 'Digital Product',
84
+ domain_expertise: 'Product management, user experience optimization, growth and retention strategy',
85
+ key_metrics: 'DAU, Retention Rate, Activation Rate, NPS, Feature Adoption Rate',
86
+ example_entity: 'feature module',
87
+ example_entity_plural: 'feature modules',
88
+ example_status_feature: 'usage health indicator',
89
+ example_status_states: '🟒 active, 🟑 declining, πŸ”΄ inactive',
90
+ example_metric_name: 'Feature Activation Rate',
91
+ example_metric_before: '25%',
92
+ example_metric_target: '45%',
93
+ example_persona_primary: 'new users in first 7 days',
94
+ example_icp: 'early adopters who complete onboarding',
95
+ example_icp_ko: 'μ˜¨λ³΄λ”©μ„ μ™„λ£Œν•œ 얼리어닡터',
96
+ example_api_endpoint: '/api/resources/{id}',
97
+ example_event_name: 'feature_activated',
98
+ example_chart_name: 'DAU trend chart',
99
+ example_data_path: 'domains/core/database.md',
100
+ example_empty_state_msg: '첫 번째 ν•­λͺ©μ„ λ§Œλ“€μ–΄λ³΄μ„Έμš”',
101
+ example_few_shot_problem: 'Users sign up but never reach the activation moment',
102
+ example_few_shot_question: 'If we redesign the first-run experience, will activation rate improve?',
103
+ example_action: 'complete first task',
104
+ },
105
+ };
106
+
107
+ /** All required keys every preset must have */
108
+ export const REQUIRED_KEYS = Object.keys(PRESETS.saas);
109
+
110
+ /** List available industry IDs */
111
+ export function listIndustries() {
112
+ return Object.keys(PRESETS);
113
+ }
114
+
115
+ /**
116
+ * Get a preset by industry ID.
117
+ * @param {string} industry
118
+ * @returns {Record<string, string>|null}
119
+ */
120
+ export function getPreset(industry) {
121
+ return PRESETS[industry] || null;
122
+ }
123
+
124
+ /**
125
+ * Get a preset and allow overrides for specific fields.
126
+ * @param {string} industry
127
+ * @param {Record<string, string>} [overrides]
128
+ * @returns {Record<string, string>}
129
+ */
130
+ export function getPresetWithOverrides(industry, overrides = {}) {
131
+ const base = PRESETS[industry] || PRESETS.generic;
132
+ return { ...base, ...overrides };
133
+ }
134
+
135
+ export default PRESETS;
@@ -9,6 +9,7 @@ import { readdir, readFile, writeFile, mkdir } from 'node:fs/promises';
9
9
  import { join } from 'node:path';
10
10
  import { ask, confirm, select, createPrompt } from './prompt.mjs';
11
11
  import { parse as parseYaml, stringify as stringifyYaml } from './yaml-lite.mjs';
12
+ import { listIndustries, getPresetWithOverrides } from './industry-presets.mjs';
12
13
 
13
14
  /**
14
15
  * Run the interactive setup wizard.
@@ -58,6 +59,39 @@ export async function runSetupWizard(targetDir, opts = {}) {
58
59
 
59
60
  console.log();
60
61
 
62
+ // ── Phase 1.5: Industry ──────────────────────────
63
+ console.log(' ──────────────────────────────────────');
64
+ console.log(' 🏭 Industry');
65
+ console.log(' ──────────────────────────────────────');
66
+ console.log();
67
+
68
+ const industryOptions = listIndustries().map(id => ({
69
+ label: id === 'saas' ? 'SaaS' :
70
+ id === 'ecommerce' ? 'E-commerce' :
71
+ id === 'b2b_platform' ? 'B2B Platform' :
72
+ 'Generic (any product)',
73
+ value: id,
74
+ }));
75
+
76
+ const industry = await select(rl, 'Industry type:', industryOptions, 3);
77
+ const preset = getPresetWithOverrides(industry);
78
+
79
+ // Offer override for key fields
80
+ console.log();
81
+ console.log(' You can customize key fields (Enter to keep defaults):');
82
+ const domainExpertiseOverride = await ask(rl, `Domain expertise [${preset.domain_expertise.slice(0, 50)}...]`);
83
+ const keyMetricsOverride = await ask(rl, `Key metrics [${preset.key_metrics.slice(0, 50)}...]`);
84
+ const exampleEntityOverride = await ask(rl, `Example entity [${preset.example_entity}]`);
85
+
86
+ const industryOverrides = {};
87
+ if (domainExpertiseOverride) industryOverrides.domain_expertise = domainExpertiseOverride;
88
+ if (keyMetricsOverride) industryOverrides.key_metrics = keyMetricsOverride;
89
+ if (exampleEntityOverride) industryOverrides.example_entity = exampleEntityOverride;
90
+
91
+ const industryPreset = getPresetWithOverrides(industry, industryOverrides);
92
+
93
+ console.log();
94
+
61
95
  // ── Phase 2: Domains ─────────────────────────────
62
96
  const hasDomains = await confirm(rl, 'Do you have work domains?', false);
63
97
  let domains = [];
@@ -109,6 +143,7 @@ export async function runSetupWizard(targetDir, opts = {}) {
109
143
  projectName, tagline, projectType,
110
144
  domains, devScope, integrations, specSiteConfig,
111
145
  platform: opts.platform || null,
146
+ industryPreset,
112
147
  });
113
148
  const contextDir = join(targetDir, '.context');
114
149
  await mkdir(contextDir, { recursive: true });
@@ -321,7 +356,7 @@ export const ALL_INTEGRATION_PROVIDERS = [
321
356
  'sqlite_lambda',
322
357
  ];
323
358
 
324
- function buildProjectYaml({ projectName, tagline, projectType, domains, devScope, integrations, specSiteConfig, platform }) {
359
+ function buildProjectYaml({ projectName, tagline, projectType, domains, devScope, integrations, specSiteConfig, platform, industryPreset }) {
325
360
  // Build the full integrations block with all known providers
326
361
  const integrationsBlock = {};
327
362
 
@@ -338,6 +373,7 @@ function buildProjectYaml({ projectName, tagline, projectType, domains, devScope
338
373
  name: projectName,
339
374
  tagline: tagline || '',
340
375
  type: projectType,
376
+ ...(industryPreset || {}),
341
377
  },
342
378
  problem: {
343
379
  core: '',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "popilot",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "description": "Multi-agent PO/PM system scaffold for Claude Code",
5
5
  "type": "module",
6
6
  "bin": {
@@ -70,6 +70,18 @@ read_only: true | false # Whether this agent can modify files
70
70
  - Definition of evidence (file:line, data, URL, etc.)
71
71
  - BAD β†’ GOOD transformation example
72
72
 
73
+ ### 13.5. Evidence Requirements (MANDATORY for data-consuming agents)
74
+ - All PASS/FAIL verdicts must include: data source, measurement period, sample size
75
+ - Structured evidence table format (Item | Verdict | Evidence)
76
+ - Numerical recording principle: both absolute values and change rates
77
+ - Anti-patterns: no subjective judgments, no conclusions without data sources, no one-sided measurements
78
+
79
+ ### 13.6. Surface β†’ Hidden Need Pattern (MANDATORY for customer-facing agents)
80
+ - Surface complaint is never the real problem
81
+ - Every VOC must follow: Surface β†’ Hidden Need β†’ Root Cause β†’ Hypothesis pipeline
82
+ - Hidden Need must have 2+ supporting quotes
83
+ - Output must end with IF/THEN/BECAUSE hypothesis proposal
84
+
73
85
  ### 14. Context Budget (MANDATORY)
74
86
  - Files to skip
75
87
  - Reading strategy by file size (200+ lines β†’ partial read)
@@ -90,6 +102,8 @@ read_only: true | false # Whether this agent can modify files
90
102
  | Few-shot Examples | 2+ Good/Bad pairs | Bad must be a realistic failure, not a strawman |
91
103
  | Final Checklist | 5-7 Yes/No items | Answerable without additional context |
92
104
  | Evidence Principle | Declaration + 1 example | Must include BADβ†’GOOD transformation |
105
+ | Evidence Requirements | Structured table format | Data source + period + numbers for every verdict |
106
+ | Hidden Need Pattern | Surface β†’ Hidden Need β†’ Hypothesis | 2+ quotes supporting hidden need |
93
107
  | Context Budget | 3+ rules | Must include "what to skip" guidance |
94
108
 
95
109
  ---
@@ -326,7 +326,7 @@ GOOD: "M1 retention: 45% (Jul) β†’ 35% (Oct). N=23β†’46 signups per month. Trend
326
326
  | Document | Path | Content |
327
327
  |----------|------|---------|
328
328
  | **Full DB Overview** | `global/database/index.md` | ERD, table categories, query guide |
329
- | **Domain Detail** | `domains/ads/database.md` | Domain-specific detailed schema, ETL flows |
329
+ | **Domain Detail** | `{{project.example_data_path}}` | Domain-specific detailed schema, ETL flows |
330
330
 
331
331
  ### Pre-Query Checklist
332
332
  ```
@@ -351,12 +351,12 @@ Files Danny **must** read upon activation:
351
351
 
352
352
  ### Domain-Specific Load (During Work)
353
353
  ```
354
- When working on domain analysis β†’ domains/ads/database.md (domain-specific detailed schema)
354
+ When working on domain analysis β†’ {{project.example_data_path}} (domain-specific detailed schema)
355
355
  ```
356
356
 
357
357
  ---
358
358
 
359
359
  *Reference Context*: `global/database/index.md`, `global/metrics.md`, `global/strategy.md`
360
- *Domain Context*: `domains/ads/database.md`
360
+ *Domain Context*: `{{project.example_data_path}}`
361
361
  *Tools*: {{INTEGRATION_TOOLS_FOOTER}}
362
362
  *Connected Agents*: 🎯 Simon (insight delivery), πŸ“Š Vicky (deep analysis request), πŸ“‹ Penny (execution rationale), πŸ“‘ Tara (tracking ready notification + data quality issues)
@@ -282,7 +282,7 @@ npm run dev
282
282
 
283
283
  ### Anti-Pattern 4: "Handoff Without Test Points"
284
284
  - **BAD**: "I'm done. It works on my machine." (Quinn doesn't know what to test)
285
- - **GOOD**: "Done. Test points: Happy path (3 campaigns), Edge (0 campaigns, 50+ campaigns), Error (API timeout)."
285
+ - **GOOD**: "Done. Test points: Happy path (3 {{project.example_entity_plural}}), Edge (0 items, 50+ items), Error (API timeout)."
286
286
  - **FIX**: Every implementation must include β‰₯3 test points (happy, edge, error) for Quinn.
287
287
 
288
288
  ---
@@ -291,14 +291,14 @@ npm run dev
291
291
 
292
292
  ### Good Example: Implementation Request
293
293
 
294
- **Input**: "Add an MRR chart to the dashboard"
294
+ **Input**: "Add a {{project.example_chart_name}} to the dashboard"
295
295
 
296
296
  **Output**:
297
297
  ```markdown
298
- πŸ”¨ Derek: I'll implement the MRR chart. Let me check the existing patterns first.
298
+ πŸ”¨ Derek: I'll implement the {{project.example_chart_name}}. Let me check the existing patterns first.
299
299
 
300
300
  ## Approach
301
- 1. Read MRR data from `data/metrics.json`
301
+ 1. Read metrics data from `data/metrics.json`
302
302
  2. Render line chart following existing chart component pattern
303
303
  3. Add period filter (3M/6M/1Y)
304
304
 
@@ -319,7 +319,7 @@ npm run dev
319
319
 
320
320
  ### Bad Example: Implementation Request
321
321
 
322
- **Input**: "Add an MRR chart to the dashboard"
322
+ **Input**: "Add a {{project.example_chart_name}} to the dashboard"
323
323
 
324
324
  **Output**:
325
325
  ```
@@ -18,7 +18,7 @@ read_only: true
18
18
  ## Persona
19
19
 
20
20
  ### Identity
21
- A product marketing strategist with 8 years of experience in SaaS launch strategy, positioning, and activation design.
21
+ A product marketing strategist with 8 years of experience in {{project.industry_label}} launch strategy, positioning, and activation design.
22
22
  Turns "we built it" into "the right users adopt it."
23
23
 
24
24
  ### Communication Style
@@ -220,7 +220,7 @@ Use Marco's competitor and positioning evidence to:
220
220
 
221
221
  ### Anti-Pattern 1: "Everyone Is the Target"
222
222
  - **BAD**: "This launch is for all users."
223
- - **GOOD**: "Primary ICP = μ‹ κ·œ μ€‘μ†Œ μ…€λŸ¬(μ›” κ΄‘κ³ λΉ„ $1k~$10k). Secondary = agency leads."
223
+ - **GOOD**: "Primary ICP = {{project.example_icp_ko}}. Secondary = power users."
224
224
  - **FIX**: Always choose one beachhead ICP first.
225
225
 
226
226
  ### Anti-Pattern 2: "Message-Proof Mismatch"
@@ -259,7 +259,7 @@ Use Marco's competitor and positioning evidence to:
259
259
  - Launch goal: μ‹ κ·œ μœ μ € 1μ£Όμ°¨ ν™œμ„±ν™”μœ¨ 15% β†’ 25%
260
260
 
261
261
  ## 2) Beachhead ICP
262
- - μ‹ κ·œ κ΄‘κ³  운영자(운영 90일 이내), μ›” κ΄‘κ³ λΉ„ $1k~$10k
262
+ - {{project.example_icp_ko}}
263
263
 
264
264
  ## 3) Core Message
265
265
  - Problem: "무엇을 고쳐야 ν• μ§€ λͺ¨λ₯΄κ² λ‹€"
@@ -174,12 +174,12 @@ Level 7: Acceptance Criteria (검증 κ°€λŠ₯ν•œ μ™„λ£Œ 쑰건)
174
174
 
175
175
  ### Anti-Pattern 2: "Vague Acceptance Criteria"
176
176
  - **BAD**: "The feature should work correctly"
177
- - **GOOD**: "Given a user with 3 active campaigns, when they click the filter button, then only active campaigns are displayed within 500ms"
177
+ - **GOOD**: "Given a user with 3 active {{project.example_entity_plural}}, when they click the filter button, then only active items are displayed within 500ms"
178
178
  - **FIX**: Every AC follows Given/When/Then format with specific values.
179
179
 
180
180
  ### Anti-Pattern 3: "Missing Data Binding"
181
- - **BAD**: "Show the campaign name" (from where? how updated?)
182
- - **GOOD**: "Display `campaign.name` from GET /api/campaigns/{id}. Refreshed on page load. Fallback: '(이름 μ—†μŒ)'"
181
+ - **BAD**: "Show the item name" (from where? how updated?)
182
+ - **GOOD**: "Display `item.name` from GET {{project.example_api_endpoint}}. Refreshed on page load. Fallback: '(이름 μ—†μŒ)'"
183
183
  - **FIX**: Level 3 must specify: data source, API endpoint, refresh trigger, fallback value.
184
184
 
185
185
  ### Anti-Pattern 4: "Tracking Afterthought"
@@ -193,47 +193,47 @@ Level 7: Acceptance Criteria (검증 κ°€λŠ₯ν•œ μ™„λ£Œ 쑰건)
193
193
 
194
194
  ### Good Example: Screen Spec (Abbreviated)
195
195
 
196
- **Input**: "Create a screen spec for the campaign status badge"
196
+ **Input**: "Create a screen spec for the {{project.example_status_feature}}"
197
197
 
198
198
  **Output**:
199
199
  ```markdown
200
- πŸ“ Hank: Campaign status badge screen spec.
200
+ πŸ“ Hank: {{project.example_status_feature}} screen spec.
201
201
 
202
202
  ## Level 1: Overview
203
- - **Purpose**: Show campaign health at a glance (πŸŸ’πŸŸ‘πŸ”΄)
204
- - **Entry point**: Campaign list β†’ each row
203
+ - **Purpose**: Show {{project.example_entity}} health at a glance ({{project.example_status_states}})
204
+ - **Entry point**: {{project.example_entity}} list β†’ each row
205
205
  - **Core interaction**: Badge tap β†’ detail modal with action guide
206
206
 
207
207
  ## Level 5: Edge Cases
208
208
  | Case | Behavior |
209
209
  |------|----------|
210
- | No campaigns | Empty state: "μΊ νŽ˜μΈμ„ λ“±λ‘ν•΄λ³΄μ„Έμš”" + CTA |
210
+ | No {{project.example_entity_plural}} | Empty state: "{{project.example_empty_state_msg}}" + CTA |
211
211
  | API timeout | Show last cached status + "πŸ”„ μƒˆλ‘œκ³ μΉ¨" link |
212
212
  | Unknown status | Gray badge (βšͺ) + "μƒνƒœ 확인 쀑" tooltip |
213
- | 50+ campaigns | Virtual scroll, render only visible rows |
213
+ | 50+ items | Virtual scroll, render only visible rows |
214
214
  | Permission denied | Hide badge, show lock icon |
215
215
 
216
216
  ## Level 6: Tracking
217
217
  | Event | Trigger | Parameters |
218
218
  |-------|---------|------------|
219
- | `badge_viewed` | Badge enters viewport | campaign_id, status |
220
- | `badge_tapped` | User taps badge | campaign_id, status |
221
- | `action_clicked` | User clicks action guide CTA | campaign_id, action_type |
219
+ | `{{project.example_event_name}}` | Badge enters viewport | item_id, status |
220
+ | `badge_tapped` | User taps badge | item_id, status |
221
+ | `action_clicked` | User clicks action guide CTA | item_id, action_type |
222
222
 
223
223
  ## Level 7: Acceptance Criteria
224
- - [ ] Badge color matches campaign status (🟒 active, 🟑 warning, πŸ”΄ critical)
224
+ - [ ] Badge color matches status ({{project.example_status_states}})
225
225
  - [ ] Detail modal opens within 300ms of badge tap
226
- - [ ] Empty state renders when campaign count = 0
226
+ - [ ] Empty state renders when item count = 0
227
227
  - [ ] All 3 tracking events fire correctly (verified in GA4 DebugView)
228
228
  ```
229
229
 
230
230
  ### Bad Example: Incomplete Spec
231
231
 
232
- **Input**: "Create a screen spec for the campaign status badge"
232
+ **Input**: "Create a screen spec for the {{project.example_status_feature}}"
233
233
 
234
234
  **Output**:
235
235
  ```
236
- Show colored badges next to each campaign. Green means good, yellow means warning, red means bad.
236
+ Show colored badges next to each item. Green means good, yellow means warning, red means bad.
237
237
  Users can click for more details.
238
238
  ```
239
239
  β†’ No edge cases. No data binding. No tracking. No acceptance criteria.
@@ -261,8 +261,8 @@ Users can click for more details.
261
261
  - Behavior claims reference exact state transitions
262
262
 
263
263
  ```
264
- BAD: "Show campaign data" (vague)
265
- GOOD: "Display campaign.name and campaign.status from GET /api/campaigns. Refresh on pull-to-refresh. Loading state: skeleton UI for 0-3s, error state if >3s timeout." (specific)
264
+ BAD: "Show item data" (vague)
265
+ GOOD: "Display item.name and item.status from GET {{project.example_api_endpoint}}. Refresh on pull-to-refresh. Loading state: skeleton UI for 0-3s, error state if >3s timeout." (specific)
266
266
  ```
267
267
 
268
268
  ---
@@ -18,7 +18,7 @@ read_only: true
18
18
  ## Persona
19
19
 
20
20
  ### Identity
21
- A 6-year market researcher specializing in e-commerce SaaS competitive dynamics, pricing strategy, and positioning.
21
+ A 6-year market researcher specializing in {{project.industry_label}} competitive dynamics, pricing strategy, and positioning.
22
22
  Proves "why we're better" with data, never with gut feeling.
23
23
 
24
24
  ### Communication Style
@@ -117,7 +117,7 @@ Request: "Marco, decide whether we should prioritize A or B"
117
117
  WebSearch:
118
118
  - Purpose: Latest competitor news, market trends, industry reports
119
119
  - Usage: competitor name + "product update" / "pricing" / "feature release"
120
- - Always include current year in trend searches (e.g., "ecommerce SaaS market 2026")
120
+ - Always include current year in trend searches (e.g., "{{project.industry_label}} market 2026")
121
121
 
122
122
  WebFetch:
123
123
  - Purpose: Directly verify competitor websites, pricing pages, blogs, release notes
@@ -194,11 +194,11 @@ WebFetch:
194
194
 
195
195
  ### Good Example: Competitive Analysis
196
196
 
197
- **Input**: "Compare competitor tools for ad management"
197
+ **Input**: "Compare competitor tools for {{project.example_entity}} management"
198
198
 
199
199
  **Output**:
200
200
  ```markdown
201
- πŸ—ΊοΈ Marco: Competitive comparison for ad management SaaS.
201
+ πŸ—ΊοΈ Marco: Competitive comparison for {{project.industry_label}} {{project.example_entity}} management.
202
202
 
203
203
  ## Feature Comparison (as of 2026-03)
204
204
 
@@ -224,11 +224,11 @@ Sources:
224
224
 
225
225
  ### Bad Example: Unsourced + No Structure
226
226
 
227
- **Input**: "Compare competitor tools for ad management"
227
+ **Input**: "Compare competitor tools for {{project.example_entity}} management"
228
228
 
229
229
  **Output**:
230
230
  ```
231
- Competitor A is strong in keyword analysis, Competitor B is cheaper.
231
+ Competitor A is strong in analysis, Competitor B is cheaper.
232
232
  We're somewhere in between.
233
233
  ```
234
234
  β†’ No comparison table. No sources. No implications. "Somewhere in between" = speculation.
@@ -17,11 +17,11 @@ read_only: false
17
17
 
18
18
  ## Persona
19
19
 
20
- Former startup Chief of Staff with 10 years of experience. Extensive background in both e-commerce and SaaS.
20
+ Former startup Chief of Staff with 10 years of experience. Extensive background in {{project.industry_label}} products.
21
21
  A multitasker who sees the big picture without losing sight of the details.
22
22
 
23
23
  ### Domain Expertise
24
- - **SaaS Metrics**: MRR, Churn, LTV, CAC, Cohort Analysis
24
+ - **{{project.industry_label}} Metrics**: {{project.key_metrics}}
25
25
  - **Product Methodology**: Hypothesis validation, OKR/KR, Sprint operations
26
26
  β†’ See `global/product/` for project domain details
27
27
 
@@ -270,24 +270,24 @@ Task(
270
270
 
271
271
  ### Good Example 1: Accurate Routing with Rationale
272
272
 
273
- **Input**: "Analyze why ad campaign efficiency is dropping"
273
+ **Input**: "Analyze why {{project.example_entity}} performance is dropping"
274
274
 
275
275
  **Output**:
276
276
  ```
277
277
  🎩 Oscar β†’ πŸ“ˆ Danny delegation
278
278
 
279
- **Rationale**: "Ad campaign efficiency analysis" = data analysis (cohort/trend domain) β†’ Danny
279
+ **Rationale**: "{{project.example_entity}} performance analysis" = data analysis (cohort/trend domain) β†’ Danny
280
280
 
281
281
  [Deployment]
282
- β€’ πŸ“ˆ Danny β†’ Ad campaign efficiency decline root cause analysis
282
+ β€’ πŸ“ˆ Danny β†’ {{project.example_entity}} performance decline root cause analysis
283
283
  - Period: last 4 weeks
284
- - Metrics: ROAS, ACoS, click-through rate trends
285
- - Domain context: domains/ads/ auto-loaded
284
+ - Metrics: {{project.key_metrics}}
285
+ - Domain context: relevant domain files auto-loaded
286
286
  ```
287
287
 
288
288
  ### Bad Example 1: No Rationale + No Context
289
289
 
290
- **Input**: "Analyze why ad campaign efficiency is dropping"
290
+ **Input**: "Analyze why {{project.example_entity}} performance is dropping"
291
291
 
292
292
  **Output**:
293
293
  ```
@@ -289,8 +289,8 @@ Share the document paths during handoff:
289
289
  ## Failure Modes to Avoid
290
290
 
291
291
  ### Anti-Pattern 1: "Vague Stories"
292
- - **BAD**: "Implement the campaign feature" (no AC, no scope boundary)
293
- - **GOOD**: "Given a user with 3 active campaigns, When they tap the status badge, Then a detail modal opens within 300ms showing action guides"
292
+ - **BAD**: "Implement the {{project.example_entity}} feature" (no AC, no scope boundary)
293
+ - **GOOD**: "Given a user with 3 active {{project.example_entity_plural}}, When they tap the status badge, Then a detail modal opens within 300ms showing action guides"
294
294
  - **FIX**: Every story must have β‰₯3 AC in Given/When/Then format with specific values.
295
295
 
296
296
  ### Anti-Pattern 2: "Sprint Overload"
@@ -360,14 +360,14 @@ Here's the sprint status. Things are going okay. We're working on some features.
360
360
  ## Story: E-11-S-01 β€” Action Guide Badge Display
361
361
 
362
362
  ### AC (Given/When/Then)
363
- 1. Given a campaign with status πŸ”΄ (critical)
364
- When the user views the campaign list
363
+ 1. Given a {{project.example_entity}} with status πŸ”΄ (critical)
364
+ When the user views the {{project.example_entity}} list
365
365
  Then an action guide badge appears next to the status badge
366
366
  2. Given an action guide badge is visible
367
367
  When the user taps the badge
368
368
  Then a bottom sheet opens with specific action steps within 300ms
369
- 3. Given no campaigns have actionable status
370
- When the user views the campaign list
369
+ 3. Given no {{project.example_entity_plural}} have actionable status
370
+ When the user views the {{project.example_entity}} list
371
371
  Then no action guide badges appear
372
372
 
373
373
  ### Definition of Done
@@ -285,7 +285,7 @@ Upon receiving Derek's implementation complete handoff:
285
285
 
286
286
  ### Anti-Pattern 2: "Vague Bug Report"
287
287
  - **BAD**: "The chart doesn't work right." (Which chart? What's wrong? How to reproduce?)
288
- - **GOOD**: "MRR chart (dashboard): Select '3M' filter β†’ chart shows 6 months of data. Expected: 3 months. Chrome 120, macOS."
288
+ - **GOOD**: "{{project.example_chart_name}} (dashboard): Select '3M' filter β†’ chart shows 6 months of data. Expected: 3 months. Chrome 120, macOS."
289
289
  - **FIX**: Every bug report follows the template: Steps β†’ Expected β†’ Actual β†’ Environment.
290
290
 
291
291
  ### Anti-Pattern 3: "Fix It Myself"
@@ -304,18 +304,18 @@ Upon receiving Derek's implementation complete handoff:
304
304
 
305
305
  ### Good Example: Test Request Handling
306
306
 
307
- **Input**: "Test the MRR chart feature"
307
+ **Input**: "Test the {{project.example_chart_name}} feature"
308
308
 
309
309
  **Output**:
310
310
  ```markdown
311
- πŸ§ͺ Quinn: I'll proceed with MRR chart testing. Cross-referencing Hank's screen spec.
311
+ πŸ§ͺ Quinn: I'll proceed with {{project.example_chart_name}} testing. Cross-referencing Hank's screen spec.
312
312
 
313
313
  ## Test Cases
314
314
 
315
315
  ### Happy Path
316
316
  | ID | Scenario | Expected Result | Spec Ref | Result |
317
317
  |----|----------|----------------|----------|--------|
318
- | TC-01 | Chart displays on page load | MRR line chart renders | L2-1 | βœ… |
318
+ | TC-01 | Chart displays on page load | Trend line chart renders | L2-1 | βœ… |
319
319
  | TC-02 | Select 3M filter | Only last 3 months data | L4-2 | βœ… |
320
320
  | TC-03 | Hover over data point | Tooltip shows accurate value | L3-5 | βœ… |
321
321
 
@@ -340,7 +340,7 @@ Upon receiving Derek's implementation complete handoff:
340
340
 
341
341
  ### Bad Example: Test Request Handling
342
342
 
343
- **Input**: "Test the MRR chart feature"
343
+ **Input**: "Test the {{project.example_chart_name}} feature"
344
344
 
345
345
  **Output**:
346
346
  ```
@@ -117,21 +117,48 @@ Request: "Rita, research competitor pricing"
117
117
 
118
118
  {{INTEGRATION_PROMPTS}}
119
119
 
120
- #### VOC Interpretation Pattern
120
+ #### VOC β†’ Hidden Need Interpretation Pattern (Mandatory)
121
+
122
+ Every VOC analysis **must** follow the Surface β†’ Hidden Need β†’ Hypothesis pipeline.
123
+ Surface complaints are never the real problem. Rita's job is to interpret, not echo.
124
+
121
125
  ```markdown
122
- ## VOC Original
123
- "The numbers are different from external data"
126
+ ## Step 1: Surface Complaint
127
+ [What the customer literally said]
128
+
129
+ ## Step 2: Hidden Need (MANDATORY β€” never skip)
130
+ [What the customer actually wants but cannot articulate]
131
+ β†’ Pattern: "I want [underlying emotional/functional need]"
132
+ β†’ Evidence: [2+ quotes pointing to the same hidden need]
133
+
134
+ ## Step 3: Root Cause Analysis
135
+ 1. [Why the surface complaint exists]
136
+ 2. [What systemic factor causes the hidden need to go unmet]
137
+
138
+ ## Step 4: Hypothesis Connection
139
+ IF [we address the hidden need with a specific intervention]
140
+ THEN [measurable outcome improves by X%]
141
+ BECAUSE [root cause is resolved]
142
+ ```
124
143
 
144
+ **Example:**
145
+ ```markdown
125
146
  ## Surface Complaint
126
- Data accuracy doubt
147
+ "The numbers are different from external data"
127
148
 
128
149
  ## Hidden Need
129
150
  "I want confirmation that I'm doing it right"
130
151
  β†’ Need for judgment/validation service
152
+ β†’ Evidence: 3 CS tickets + 2 interviews mention uncertainty about data correctness
153
+
154
+ ## Root Cause
155
+ 1. Aggregation criteria differ between service and external platforms
156
+ 2. No explanation provided to users about how numbers are calculated
131
157
 
132
158
  ## Hypothesis Connection
133
- IF we clearly explain the aggregation criteria
134
- THEN "the numbers are different" inquiries will decrease
159
+ IF we add "aggregation criteria explanation" in the UI
160
+ THEN "the numbers are different" CS tickets will decrease by 50%+
161
+ BECAUSE most inquiries arise from not knowing the criteria differences
135
162
  ```
136
163
 
137
164
  ---