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.
- package/adapters/codex/.codex/commands/_domain.md.hbs +33 -0
- package/adapters/codex/.codex/commands/analytics.md.hbs +55 -0
- package/adapters/codex/.codex/commands/daily.md.hbs +301 -0
- package/adapters/codex/.codex/commands/dev.md.hbs +62 -0
- package/adapters/codex/.codex/commands/gtm.md +82 -0
- package/adapters/codex/.codex/commands/handoff.md +259 -0
- package/adapters/codex/.codex/commands/market.md +120 -0
- package/adapters/codex/.codex/commands/metrics.md +123 -0
- package/adapters/codex/.codex/commands/oscar-loop.md +436 -0
- package/adapters/codex/.codex/commands/party.md +85 -0
- package/adapters/codex/.codex/commands/plan.md +43 -0
- package/adapters/codex/.codex/commands/research.md +203 -0
- package/adapters/codex/.codex/commands/retro.md +68 -0
- package/adapters/codex/.codex/commands/save.md +440 -0
- package/adapters/codex/.codex/commands/sessions.md +139 -0
- package/adapters/codex/.codex/commands/sprint.md +106 -0
- package/adapters/codex/.codex/commands/start.md +396 -0
- package/adapters/codex/.codex/commands/strategy.md +41 -0
- package/adapters/codex/.codex/commands/task.md +220 -0
- package/adapters/codex/.codex/commands/tracking.md +116 -0
- package/adapters/codex/.codex/commands/validate.md +58 -0
- package/adapters/codex/AGENTS.md.hbs +210 -0
- package/adapters/codex/manifest.yaml +36 -0
- package/adapters/gemini/.gemini/commands/_domain.md.hbs +33 -0
- package/adapters/gemini/.gemini/commands/analytics.md.hbs +55 -0
- package/adapters/gemini/.gemini/commands/daily.md.hbs +301 -0
- package/adapters/gemini/.gemini/commands/dev.md.hbs +62 -0
- package/adapters/gemini/.gemini/commands/gtm.md +82 -0
- package/adapters/gemini/.gemini/commands/handoff.md +259 -0
- package/adapters/gemini/.gemini/commands/market.md +120 -0
- package/adapters/gemini/.gemini/commands/metrics.md +123 -0
- package/adapters/gemini/.gemini/commands/oscar-loop.md +436 -0
- package/adapters/gemini/.gemini/commands/party.md +85 -0
- package/adapters/gemini/.gemini/commands/plan.md +43 -0
- package/adapters/gemini/.gemini/commands/research.md +203 -0
- package/adapters/gemini/.gemini/commands/retro.md +68 -0
- package/adapters/gemini/.gemini/commands/save.md +440 -0
- package/adapters/gemini/.gemini/commands/sessions.md +139 -0
- package/adapters/gemini/.gemini/commands/sprint.md +106 -0
- package/adapters/gemini/.gemini/commands/start.md +396 -0
- package/adapters/gemini/.gemini/commands/strategy.md +41 -0
- package/adapters/gemini/.gemini/commands/task.md +220 -0
- package/adapters/gemini/.gemini/commands/tracking.md +116 -0
- package/adapters/gemini/.gemini/commands/validate.md +58 -0
- package/adapters/gemini/GEMINI.md.hbs +210 -0
- package/adapters/gemini/manifest.yaml +36 -0
- package/bin/cli.mjs +11 -2
- package/lib/industry-presets.mjs +135 -0
- package/lib/setup-wizard.mjs +37 -1
- package/package.json +1 -1
- package/scaffold/.context/agents/TEMPLATE.md +14 -0
- package/scaffold/.context/agents/analyst.md.hbs +3 -3
- package/scaffold/.context/agents/developer.md.hbs +5 -5
- package/scaffold/.context/agents/gtm-strategist.md.hbs +3 -3
- package/scaffold/.context/agents/handoff-specialist.md.hbs +18 -18
- package/scaffold/.context/agents/market-researcher.md.hbs +6 -6
- package/scaffold/.context/agents/orchestrator.md.hbs +8 -8
- package/scaffold/.context/agents/planner.md.hbs +6 -6
- package/scaffold/.context/agents/qa.md.hbs +5 -5
- package/scaffold/.context/agents/researcher.md.hbs +33 -6
- package/scaffold/.context/agents/strategist.md.hbs +8 -8
- package/scaffold/.context/agents/tracking-governor.md.hbs +2 -2
- 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;
|
package/lib/setup-wizard.mjs
CHANGED
|
@@ -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
|
@@ -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** | `
|
|
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 β
|
|
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*: `
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
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
|
-
-
|
|
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
|
|
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
|
|
182
|
-
- **GOOD**: "Display `
|
|
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
|
|
196
|
+
**Input**: "Create a screen spec for the {{project.example_status_feature}}"
|
|
197
197
|
|
|
198
198
|
**Output**:
|
|
199
199
|
```markdown
|
|
200
|
-
π Hank:
|
|
200
|
+
π Hank: {{project.example_status_feature}} screen spec.
|
|
201
201
|
|
|
202
202
|
## Level 1: Overview
|
|
203
|
-
- **Purpose**: Show
|
|
204
|
-
- **Entry point**:
|
|
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
|
|
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+
|
|
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
|
-
| `
|
|
220
|
-
| `badge_tapped` | User taps badge |
|
|
221
|
-
| `action_clicked` | User clicks action guide CTA |
|
|
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
|
|
224
|
+
- [ ] Badge color matches status ({{project.example_status_states}})
|
|
225
225
|
- [ ] Detail modal opens within 300ms of badge tap
|
|
226
|
-
- [ ] Empty state renders when
|
|
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
|
|
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
|
|
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
|
|
265
|
-
GOOD: "Display
|
|
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
|
|
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., "
|
|
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
|
|
197
|
+
**Input**: "Compare competitor tools for {{project.example_entity}} management"
|
|
198
198
|
|
|
199
199
|
**Output**:
|
|
200
200
|
```markdown
|
|
201
|
-
πΊοΈ Marco: Competitive comparison for
|
|
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
|
|
227
|
+
**Input**: "Compare competitor tools for {{project.example_entity}} management"
|
|
228
228
|
|
|
229
229
|
**Output**:
|
|
230
230
|
```
|
|
231
|
-
Competitor A is strong in
|
|
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
|
|
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
|
-
- **
|
|
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
|
|
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**: "
|
|
279
|
+
**Rationale**: "{{project.example_entity}} performance analysis" = data analysis (cohort/trend domain) β Danny
|
|
280
280
|
|
|
281
281
|
[Deployment]
|
|
282
|
-
β’ π Danny β
|
|
282
|
+
β’ π Danny β {{project.example_entity}} performance decline root cause analysis
|
|
283
283
|
- Period: last 4 weeks
|
|
284
|
-
- Metrics:
|
|
285
|
-
- Domain context:
|
|
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
|
|
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
|
|
293
|
-
- **GOOD**: "Given a user with 3 active
|
|
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
|
|
364
|
-
When the user views the
|
|
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
|
|
370
|
-
When the user views the
|
|
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**: "
|
|
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
|
|
307
|
+
**Input**: "Test the {{project.example_chart_name}} feature"
|
|
308
308
|
|
|
309
309
|
**Output**:
|
|
310
310
|
```markdown
|
|
311
|
-
π§ͺ Quinn: I'll proceed with
|
|
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 |
|
|
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
|
|
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
|
-
##
|
|
123
|
-
|
|
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
|
-
|
|
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
|
|
134
|
-
THEN "the numbers are different"
|
|
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
|
---
|