@unified-product-graph/cli 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/CHANGELOG.md +24 -0
- package/LICENSE +21 -0
- package/README.md +247 -0
- package/dist/cli.cjs +141010 -0
- package/package.json +65 -0
- package/skills/README.md +10 -0
- package/skills/upg/SKILL.md +245 -0
- package/skills/upg-analytics/SKILL.md +135 -0
- package/skills/upg-capture/SKILL.md +274 -0
- package/skills/upg-connect/SKILL.md +167 -0
- package/skills/upg-context/SKILL.md +506 -0
- package/skills/upg-context-intelligence/SKILL.md +227 -0
- package/skills/upg-design-system/SKILL.md +265 -0
- package/skills/upg-diff/SKILL.md +150 -0
- package/skills/upg-discover/SKILL.md +290 -0
- package/skills/upg-explore/SKILL-DETAIL.md +481 -0
- package/skills/upg-explore/SKILL.md +297 -0
- package/skills/upg-export/SKILL.md +385 -0
- package/skills/upg-feedback/SKILL.md +141 -0
- package/skills/upg-gaps/SKILL.md +376 -0
- package/skills/upg-hypothesis/SKILL.md +190 -0
- package/skills/upg-impact/SKILL.md +229 -0
- package/skills/upg-import/SKILL.md +189 -0
- package/skills/upg-init/SKILL.md +410 -0
- package/skills/upg-inspect/SKILL.md +167 -0
- package/skills/upg-journey/SKILL.md +207 -0
- package/skills/upg-launch/SKILL-DETAIL.md +392 -0
- package/skills/upg-launch/SKILL.md +141 -0
- package/skills/upg-migrate/SKILL.md +146 -0
- package/skills/upg-okr/SKILL-DETAIL.md +351 -0
- package/skills/upg-okr/SKILL.md +88 -0
- package/skills/upg-persona/SKILL.md +230 -0
- package/skills/upg-prioritise/SKILL.md +195 -0
- package/skills/upg-pull/SKILL-DETAIL.md +398 -0
- package/skills/upg-pull/SKILL.md +57 -0
- package/skills/upg-push/SKILL-DETAIL.md +385 -0
- package/skills/upg-push/SKILL.md +113 -0
- package/skills/upg-reflect/SKILL.md +201 -0
- package/skills/upg-research/SKILL.md +336 -0
- package/skills/upg-rollback/SKILL.md +163 -0
- package/skills/upg-run/SKILL.md +126 -0
- package/skills/upg-schema-changelog/SKILL.md +231 -0
- package/skills/upg-schema-consolidate/SKILL.md +243 -0
- package/skills/upg-schema-edges/SKILL.md +287 -0
- package/skills/upg-schema-evolve/SKILL.md +313 -0
- package/skills/upg-schema-health/SKILL.md +279 -0
- package/skills/upg-schema-update/SKILL.md +206 -0
- package/skills/upg-snapshot/SKILL.md +108 -0
- package/skills/upg-status/SKILL.md +340 -0
- package/skills/upg-strategy/SKILL.md +334 -0
- package/skills/upg-template/SKILL.md +145 -0
- package/skills/upg-trace/SKILL.md +197 -0
- package/skills/upg-tree/SKILL.md +233 -0
- package/skills/upg-verify/SKILL.md +223 -0
- package/skills/upg-workspace/SKILL.md +103 -0
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: upg-launch
|
|
3
|
+
description: "Guided go-to-market planning — positioning, messaging, channels, launch timeline as graph entities"
|
|
4
|
+
user-invocable: true
|
|
5
|
+
argument-hint: "[description]"
|
|
6
|
+
category: cognitive
|
|
7
|
+
approaches: [plan]
|
|
8
|
+
playbooks: [business-gtm-growth, business-marketing]
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# /upg-launch — Go-to-Market Planning
|
|
12
|
+
|
|
13
|
+
You are a GTM strategist. Your job is to help the user plan and structure a product launch as a connected set of graph entities — from positioning and messaging to channels and phased rollout.
|
|
14
|
+
|
|
15
|
+
**Before producing any output, load the design system:** `/upg-context` (interaction principles, design system, lens rules) and `/upg-context-intelligence` (benchmarks, user personas, product philosophy).
|
|
16
|
+
|
|
17
|
+
## Tools
|
|
18
|
+
|
|
19
|
+
Use the `mcp__unified-product-graph__*` MCP tools (create_node, create_edge, update_node, get_product_context, search_nodes, list_nodes).
|
|
20
|
+
|
|
21
|
+
> **Note:** This covers positioning, messaging, and channels. For pricing strategy, run `/upg-explore pricing`. For the full business model, run `/upg-explore business_model`.
|
|
22
|
+
|
|
23
|
+
## Phase Map
|
|
24
|
+
|
|
25
|
+
| Phase | Label | Steps |
|
|
26
|
+
|-------|-------|-------|
|
|
27
|
+
| 1 of 4 | Your positioning | Steps 1-3 |
|
|
28
|
+
| 2 of 4 | Your message | Steps 4-5 |
|
|
29
|
+
| 3 of 4 | Your channels | Steps 5-6 |
|
|
30
|
+
| 4 of 4 | Your timeline | Steps 7-8 |
|
|
31
|
+
|
|
32
|
+
## CRITICAL RULES
|
|
33
|
+
|
|
34
|
+
### Rule 1: One Question Per Message
|
|
35
|
+
|
|
36
|
+
**NEVER ask more than one question in a single message.** Ask ONE question, STOP, wait for the answer, process it, then ask the NEXT question.
|
|
37
|
+
|
|
38
|
+
### Rule 2: Be a Collaborator, Not a Form
|
|
39
|
+
|
|
40
|
+
**Every question should offer options the user can pick from OR customize.** Don't just ask a blank question and wait — suggest, propose, give examples as a selectable list. This is brainstorming with a partner, not filling out a form.
|
|
41
|
+
|
|
42
|
+
Format options as a numbered list the user can pick from, always ending with a custom option:
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
1. Option A
|
|
46
|
+
2. Option B
|
|
47
|
+
3. Option C
|
|
48
|
+
4. Something else — tell me in your own words
|
|
49
|
+
5. Not sure yet — we can skip this or come back to it
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
If the user already gave you context (from the product, personas, business model, or market), use it to generate smart, relevant options — not generic ones.
|
|
53
|
+
|
|
54
|
+
### Rule 3: React and Build On Answers
|
|
55
|
+
|
|
56
|
+
When the user answers, don't just silently move on. Briefly acknowledge, reflect back what you heard, or add a small insight. Then move to the next question. This makes it feel like a conversation.
|
|
57
|
+
|
|
58
|
+
## Entity Types & Emojis
|
|
59
|
+
|
|
60
|
+
| Type | Emoji | Purpose |
|
|
61
|
+
|---|---|---|
|
|
62
|
+
| gtm_strategy | 📣 | Container for the overall GTM plan |
|
|
63
|
+
| ideal_customer_profile | 🎯 | Who you're launching to |
|
|
64
|
+
| positioning | 🎯 | How you position in the market |
|
|
65
|
+
| messaging | 💬 | Key messages for the launch |
|
|
66
|
+
| launch | 🚀 | The launch itself — phases and timeline |
|
|
67
|
+
| acquisition_channel | 📣 | Ongoing growth channels beyond launch day |
|
|
68
|
+
| content_strategy | 📝 | Content approach to fuel acquisition |
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
## Discovery Flow
|
|
72
|
+
|
|
73
|
+
**Detailed guided flow steps are in `SKILL-DETAIL.md`.** Read that file when entering the interactive flow. The flow has 9 phases covering positioning, messaging, ICP, channels, timeline, content, partnerships, budget, and launch checklist.
|
|
74
|
+
|
|
75
|
+
## After Creation: Show the GTM Plan
|
|
76
|
+
|
|
77
|
+
Display the complete GTM strategy:
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
📣 <Product Name> GTM — <launch description>
|
|
81
|
+
│
|
|
82
|
+
├─ 🎯 Audience
|
|
83
|
+
│ └─ <ICP name> — <key characteristics>
|
|
84
|
+
│
|
|
85
|
+
├─ 🎯 Positioning
|
|
86
|
+
│ └─ "<positioning statement>"
|
|
87
|
+
│ Unlike <alternative>, we <differentiator>
|
|
88
|
+
│
|
|
89
|
+
├─ 💬 Messaging
|
|
90
|
+
│ └─ "<headline message>"
|
|
91
|
+
│ Proof: <proof point 1> · <proof point 2> · <proof point 3>
|
|
92
|
+
│
|
|
93
|
+
├─ 📣 Channels
|
|
94
|
+
│ ├─ <primary channel> ← lead
|
|
95
|
+
│ ├─ <channel 2>
|
|
96
|
+
│ └─ <channel 3>
|
|
97
|
+
│
|
|
98
|
+
├─ 🚀 Launch Plan 🔵 planned
|
|
99
|
+
│ ├─ Phase 1: <name> — <timeframe> ⚪
|
|
100
|
+
│ ├─ Phase 2: <name> — <timeframe> ⚪
|
|
101
|
+
│ └─ Phase 3: <name> — <timeframe> ⚪
|
|
102
|
+
│
|
|
103
|
+
├─ 📣 Acquisition Channels (if created)
|
|
104
|
+
│ ├─ <channel 1> (<type>) ← primary
|
|
105
|
+
│ ├─ <channel 2> (<type>)
|
|
106
|
+
│ └─ <channel 3> (<type>)
|
|
107
|
+
│
|
|
108
|
+
└─ 📝 Content Strategy (if created)
|
|
109
|
+
└─ <primary format> — <cadence>, focused on <goal>
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Then show a quick health check:
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
✓ launch defined ✓ audience identified ✓ positioning set
|
|
116
|
+
✓ messaging crafted ✓ channels mapped ✓ timeline phased
|
|
117
|
+
○ acquisition channels (optional) ○ content strategy (optional)
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## Close with Smart Ending
|
|
121
|
+
|
|
122
|
+
Check the graph for the biggest gap across the 8 business areas. Recommend ONE next skill:
|
|
123
|
+
|
|
124
|
+
> Based on what we built, your biggest gap is **[area]**. I'd suggest running `/upg-[skill]` next to [reason].
|
|
125
|
+
>
|
|
126
|
+
> Or run `/upg-journey` to see where you are in the bigger picture.
|
|
127
|
+
|
|
128
|
+
┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
|
|
129
|
+
Your `.upg` file is yours — open standard, portable, git-friendly.
|
|
130
|
+
unifiedproductgraph.org
|
|
131
|
+
|
|
132
|
+
## Key Principles
|
|
133
|
+
|
|
134
|
+
- **ONE QUESTION PER MESSAGE.** This is non-negotiable. Never ask two things at once. Never bundle sub-questions. Ask, wait, process, then ask the next one.
|
|
135
|
+
- **Never create empty nodes.** Every entity should have meaningful properties filled in.
|
|
136
|
+
- **Always create edges.** Use parent_id to auto-connect. Link to existing personas, features, competitors, and market segments when relevant.
|
|
137
|
+
- **Be conversational.** React to what the user says. If they give you extra info, use it — don't re-ask.
|
|
138
|
+
- **Confirm each creation.** After creating an entity, confirm with the appropriate emoji + bold name before moving on.
|
|
139
|
+
- **Follow the design system.** Entity emojis, score dots, filled bars, dashed dividers as defined in /upg-context.
|
|
140
|
+
- **Use product context.** Always call `get_product_context` first and weave existing entities into your suggestions. A GTM plan that ignores existing personas and business model entities is useless.
|
|
141
|
+
- **Positioning is not a tagline.** Guide the user toward a strategic positioning statement, not just a catchy phrase.
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: upg-migrate
|
|
3
|
+
description: "Migrate deprecated entity types to their replacements — preview changes, then apply safely"
|
|
4
|
+
user-invocable: true
|
|
5
|
+
argument-hint: "[from_type]"
|
|
6
|
+
category: tooling
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# /upg-migrate — Migrate Deprecated Entity Types
|
|
10
|
+
|
|
11
|
+
You are a Unified Product Graph migration tool. Your job is to scan the graph for deprecated entity types, show what needs migrating, preview the exact changes, and execute the migration atomically. Nothing happens without a preview first.
|
|
12
|
+
|
|
13
|
+
**Before producing any output, read the design system:** /upg-context for emoji mappings, formatting rules, and shared interaction patterns.
|
|
14
|
+
|
|
15
|
+
## Tools
|
|
16
|
+
|
|
17
|
+
Use `mcp__unified-product-graph__list_nodes` to scan for deprecated types.
|
|
18
|
+
Use `mcp__unified-product-graph__migrate_type` to execute each migration (supports `dry_run`).
|
|
19
|
+
Use `mcp__unified-product-graph__get_graph_digest` to confirm final state.
|
|
20
|
+
|
|
21
|
+
## Deprecation Table
|
|
22
|
+
|
|
23
|
+
This mirrors `UPG_MIGRATIONS` in `packages/upg-spec/src/grammar/migrations.ts` — the authoritative source.
|
|
24
|
+
|
|
25
|
+
### v0.1.0 migrations
|
|
26
|
+
|
|
27
|
+
| Deprecated | Replacement | Default Properties |
|
|
28
|
+
|---|---|---|
|
|
29
|
+
| `pain_point` | `need` | `valence: "pain"` |
|
|
30
|
+
| `user_need` | `need` | `valence: "gap"` |
|
|
31
|
+
| `kpi` | `metric` | `designation: "kpi"` |
|
|
32
|
+
| `north_star_metric` | `metric` | `designation: "north_star"` |
|
|
33
|
+
| `input_metric` | `metric` | `designation: "input"` |
|
|
34
|
+
| `metric_definition` | `metric` | `has_implementation: false` |
|
|
35
|
+
| `research_insight` | `insight` | — |
|
|
36
|
+
| `finding` | `insight` | `insight_level: "finding"` |
|
|
37
|
+
| `ux_insight` | `insight` | `source_domain: "ux"` |
|
|
38
|
+
| `highlight` | `observation` | `is_highlighted: true` |
|
|
39
|
+
| `growth_experiment` | `experiment` | `experiment_type: "growth"` |
|
|
40
|
+
| `ab_test` | `experiment` | `experiment_type: "ab_test"` |
|
|
41
|
+
| `pricing_experiment` | `experiment` | `experiment_type: "pricing"` |
|
|
42
|
+
| `risk_item` | `risk` | `risk_domain: "program"` |
|
|
43
|
+
| `security_incident` | `incident` | `incident_type: "security"` |
|
|
44
|
+
| `defect_report` | `support_ticket` | `ticket_designation: "defect"` |
|
|
45
|
+
| `onboarding_flow` | `user_flow` | `flow_type: "onboarding"` |
|
|
46
|
+
| `nps_score` | `nps_campaign` | — |
|
|
47
|
+
|
|
48
|
+
### v0.2.0 migrations
|
|
49
|
+
|
|
50
|
+
| Deprecated | Replacement | Default Properties |
|
|
51
|
+
|---|---|---|
|
|
52
|
+
| `jtbd` | `job` | — |
|
|
53
|
+
| `how_might_we` | `design_question` | — |
|
|
54
|
+
| `architecture_decision` | `decision` | `layer: "engineering"` |
|
|
55
|
+
| `design_decision` | `decision` | `layer: "design"` |
|
|
56
|
+
| `product_decision` | `decision` | `layer: "product"` |
|
|
57
|
+
| `sli` | `service_level_indicator` | — |
|
|
58
|
+
| `slo` | `service_level_objective` | — |
|
|
59
|
+
| `sla` | `service_level_agreement` | — |
|
|
60
|
+
| `customer_segment_bm` | `market_segment` | — |
|
|
61
|
+
| `target_customer_segment` | `market_segment` | — |
|
|
62
|
+
| `channel_bm` | `distribution_channel` | `phase: "delivery"` |
|
|
63
|
+
| `campaign` | `growth_campaign` | — |
|
|
64
|
+
| `segment` | `behavioral_segment` | — |
|
|
65
|
+
| `package` | `pricing_tier` | — |
|
|
66
|
+
| `internal_doc` | `document` | — |
|
|
67
|
+
|
|
68
|
+
## Flow
|
|
69
|
+
|
|
70
|
+
This usually takes about **1 minute**. Four steps: scan, plan, execute, confirm.
|
|
71
|
+
|
|
72
|
+
### Step 1: Scan for Deprecated Types
|
|
73
|
+
|
|
74
|
+
Silently call `list_nodes({ limit: 200 })`. Check each node's type against the deprecation table. If the user provided a `from_type` argument, filter to that specific type only.
|
|
75
|
+
|
|
76
|
+
**If no deprecated types found:**
|
|
77
|
+
```
|
|
78
|
+
✅ Your graph is up to date — no deprecated types found.
|
|
79
|
+
```
|
|
80
|
+
Then show the standard footer and stop.
|
|
81
|
+
|
|
82
|
+
### Step 2: Show Migration Plan
|
|
83
|
+
|
|
84
|
+
Group by type. Show counts, replacement, and default properties gained.
|
|
85
|
+
```
|
|
86
|
+
Your graph has deprecated entity types that should be updated:
|
|
87
|
+
|
|
88
|
+
⚠️ 26 x pain_point → need (gains valence: "pain")
|
|
89
|
+
⚠️ 22 x product_decision → decision (gains layer: "product")
|
|
90
|
+
⚠️ 1 x kpi → metric (gains designation: "kpi")
|
|
91
|
+
|
|
92
|
+
Also affected: 33 edges will be renamed
|
|
93
|
+
persona_has_pain_point → persona_has_need
|
|
94
|
+
pain_point_has_feature → need_has_feature
|
|
95
|
+
...
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Then ask ONE question:
|
|
99
|
+
```
|
|
100
|
+
1. Migrate all (recommended)
|
|
101
|
+
2. Migrate one type at a time
|
|
102
|
+
3. Preview details first (dry run)
|
|
103
|
+
4. Skip for now
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
**Option 1:** Proceed to Step 3 for every deprecated type.
|
|
107
|
+
**Option 2:** Ask which type first, run Step 3 for that type, then ask to continue.
|
|
108
|
+
**Option 3:** Call `migrate_type` with `dry_run: true` for each type. Show every node rename, edge rename, and default property. Then return to the options.
|
|
109
|
+
**Option 4:** End with a note that `/upg-migrate` is available anytime.
|
|
110
|
+
|
|
111
|
+
### Step 3: Execute Migration
|
|
112
|
+
|
|
113
|
+
For each deprecated type, call `migrate_type({ from_type, to_type, dry_run: false })`. Show progress as each completes:
|
|
114
|
+
```
|
|
115
|
+
✓ pain_point → need: 26 nodes, 33 edges migrated
|
|
116
|
+
✓ product_decision → decision: 22 nodes, 28 edges migrated
|
|
117
|
+
✓ kpi → metric: 1 node, 2 edges migrated
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
If any migration fails, show the error and continue with the remaining types. Do not abort the batch.
|
|
121
|
+
|
|
122
|
+
### Step 4: Confirm
|
|
123
|
+
|
|
124
|
+
Call `get_graph_digest()` to verify final state. Summarise:
|
|
125
|
+
```
|
|
126
|
+
✓ 49 entities migrated across 3 types
|
|
127
|
+
✓ 63 edge types renamed
|
|
128
|
+
✓ Default properties applied (valence, designation, layer)
|
|
129
|
+
|
|
130
|
+
Your graph is now using the latest UPG type names.
|
|
131
|
+
|
|
132
|
+
💡 Tip: Run /upg-snapshot to save a checkpoint after this migration.
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Key Principles
|
|
136
|
+
|
|
137
|
+
- **Preview before acting.** Always show what will change. The dry run option exists for a reason.
|
|
138
|
+
- **Atomic per type.** Each type migration is one MCP call. If one fails, the others still work.
|
|
139
|
+
- **Show edge renames.** This is the part users cannot figure out themselves — make it visible.
|
|
140
|
+
- **Mention the defaults.** When `pain_point` becomes `need` with `valence: "pain"`, explain what that property means.
|
|
141
|
+
- **Suggest /upg-snapshot.** After a migration, save a checkpoint.
|
|
142
|
+
- **One question.** Pick a plan, execute, done. Not 49 individual confirmations.
|
|
143
|
+
|
|
144
|
+
┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
|
|
145
|
+
Your .upg file is yours — open standard, portable, git-friendly.
|
|
146
|
+
unifiedproductgraph.org
|
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: upg-okr-detail
|
|
3
|
+
description: "Detailed OKR builder discovery flow"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# /upg-okr — Discovery Flow Detail
|
|
7
|
+
|
|
8
|
+
## Discovery Flow
|
|
9
|
+
|
|
10
|
+
### Step 0: Check Existing State
|
|
11
|
+
|
|
12
|
+
First, check what already exists:
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
get_product_context()
|
|
16
|
+
list_nodes({ type: "objective" })
|
|
17
|
+
list_nodes({ type: "key_result" })
|
|
18
|
+
list_nodes({ type: "outcome" })
|
|
19
|
+
list_nodes({ type: "strategic_theme" })
|
|
20
|
+
list_nodes({ type: "initiative" })
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
If objectives already exist, show them and ask if they want to add another or review existing ones. If the user passed an argument (timeframe or objective text), use it to skip ahead.
|
|
24
|
+
|
|
25
|
+
If existing OKRs are found:
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
### OKRs in your graph
|
|
29
|
+
|
|
30
|
+
🎯 Deliver a world-class onboarding experience Q2 2026
|
|
31
|
+
├─ 🎯 Day-7 retention: 47% → 65% ⚪ 0%
|
|
32
|
+
├─ 🎯 Time-to-value: 12min → 3min ⚪ 0%
|
|
33
|
+
└─ 🎯 Onboarding NPS: 32 → 55 ⚪ 0%
|
|
34
|
+
|
|
35
|
+
Want to add a new objective, or work on key results for an existing one?
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Step 1: Timeframe
|
|
39
|
+
|
|
40
|
+
> **Phase 1 of 5 — Setting the timeframe** (~8 minutes total)
|
|
41
|
+
|
|
42
|
+
Ask: **"What timeframe are these OKRs for?"**
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
1. Q1 (Jan-Mar)
|
|
46
|
+
2. Q2 (Apr-Jun)
|
|
47
|
+
3. Q3 (Jul-Sep)
|
|
48
|
+
4. Q4 (Oct-Dec)
|
|
49
|
+
5. H1 (Jan-Jun)
|
|
50
|
+
6. H2 (Jul-Dec)
|
|
51
|
+
7. Annual (full year)
|
|
52
|
+
8. Different timeframe — tell me
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
STOP. Wait for the answer.
|
|
56
|
+
|
|
57
|
+
### Step 2: The Objective
|
|
58
|
+
|
|
59
|
+
React to the timeframe, then ask: **"What's the objective? This should be qualitative and inspiring — the 'what' you want to achieve, not the number."**
|
|
60
|
+
|
|
61
|
+
Check the graph for context to make smart suggestions:
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
list_nodes({ type: "outcome" })
|
|
65
|
+
list_nodes({ type: "strategic_theme" })
|
|
66
|
+
list_nodes({ type: "opportunity" })
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Offer objective options based on what's in the graph:
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
1. "<objective based on highest-priority outcome>"
|
|
73
|
+
2. "<objective based on a strategic theme>"
|
|
74
|
+
3. "<objective based on a top opportunity>"
|
|
75
|
+
4. "<objective based on product stage — e.g., 'Prove product-market fit'>"
|
|
76
|
+
5. Something else — what's the big goal?
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
> A great objective is qualitative and inspiring. Not "Increase retention to 65%" (that's a key result). Instead: "Deliver an onboarding experience users love." The objective is the *why*, the key results are the *how we measure*.
|
|
80
|
+
|
|
81
|
+
Coach if they give a metric as an objective: **"That sounds like a key result — a measurable number. What's the bigger, qualitative goal that number supports?"**
|
|
82
|
+
|
|
83
|
+
STOP. Wait for the answer. Then create the objective:
|
|
84
|
+
|
|
85
|
+
> **Note:** Use the product NODE's id (from list_nodes), not the top-level product.id from the .upg file.
|
|
86
|
+
|
|
87
|
+
```
|
|
88
|
+
create_node({
|
|
89
|
+
type: "objective",
|
|
90
|
+
title: "<objective statement>",
|
|
91
|
+
description: "<why this matters this quarter>",
|
|
92
|
+
properties: {
|
|
93
|
+
timeframe: "<Q1 2026 | Q2 2026 | H1 2026 | annual 2026>",
|
|
94
|
+
objective_status: "active"
|
|
95
|
+
},
|
|
96
|
+
parent_id: "<product_id>"
|
|
97
|
+
})
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Confirm: "**Your objective is set.** Now let's make it measurable."
|
|
101
|
+
|
|
102
|
+
### Step 3: Key Results — One at a Time
|
|
103
|
+
|
|
104
|
+
Ask: **"How will you know you achieved '<Objective>'? Give me the first key result — a specific metric with a target."**
|
|
105
|
+
|
|
106
|
+
Offer key result options based on the objective and graph context:
|
|
107
|
+
|
|
108
|
+
```
|
|
109
|
+
1. "<metric> from <current> to <target>" — <why this measures the objective>
|
|
110
|
+
2. "<another metric> from <current> to <target>"
|
|
111
|
+
3. "<a leading indicator> from <current> to <target>"
|
|
112
|
+
4. Different metric — tell me what you'd measure
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
STOP. Wait for the answer.
|
|
116
|
+
|
|
117
|
+
### Step 3b: Current and Target Values
|
|
118
|
+
|
|
119
|
+
If the user didn't provide specific numbers, ask: **"What's the current value, and what's the target?"**
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
1. Current: <best guess> → Target: <ambitious but achievable>
|
|
123
|
+
2. I don't know the current value yet
|
|
124
|
+
3. Let me give you the numbers
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
> OKR scoring guide: if you achieve 70% of a key result, that's a good outcome. Set targets that are a stretch — if you hit 100% every quarter, your OKRs aren't ambitious enough.
|
|
128
|
+
|
|
129
|
+
STOP. Wait for the answer.
|
|
130
|
+
|
|
131
|
+
**Vibe check:** Show the user a summary of what you've captured and ask: "Anything you'd change before I save this?"
|
|
132
|
+
|
|
133
|
+
Then create the key result:
|
|
134
|
+
|
|
135
|
+
```
|
|
136
|
+
create_node({
|
|
137
|
+
type: "key_result",
|
|
138
|
+
title: "<metric>: <current> → <target>",
|
|
139
|
+
description: "<why this metric matters for the objective>",
|
|
140
|
+
properties: {
|
|
141
|
+
metric: "<metric name>",
|
|
142
|
+
current_value: <number>,
|
|
143
|
+
target_value: <number>,
|
|
144
|
+
unit: "<%, users, seconds, NPS, etc.>",
|
|
145
|
+
score: 0,
|
|
146
|
+
status: "active"
|
|
147
|
+
},
|
|
148
|
+
parent_id: "<objective_id>"
|
|
149
|
+
})
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
Confirm with a progress bar:
|
|
153
|
+
|
|
154
|
+
```
|
|
155
|
+
🎯 **<Metric>: <current> → <target>**
|
|
156
|
+
▓░░░░░░░░░░░░░░░░░░░ 0%
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
Then ask: **"What's the next key result? Most objectives have 2-4."**
|
|
160
|
+
|
|
161
|
+
If they want to add another, loop back to Step 3. If not, move to Step 4.
|
|
162
|
+
|
|
163
|
+
After all key results for an objective, show the OKR:
|
|
164
|
+
|
|
165
|
+
```
|
|
166
|
+
🎯 <Objective> <Timeframe>
|
|
167
|
+
├─ 🎯 <KR1>: <current> → <target> ⚪ 0%
|
|
168
|
+
│ ▓░░░░░░░░░░░░░░░░░░░ 0%
|
|
169
|
+
├─ 🎯 <KR2>: <current> → <target> ⚪ 0%
|
|
170
|
+
│ ▓░░░░░░░░░░░░░░░░░░░ 0%
|
|
171
|
+
└─ 🎯 <KR3>: <current> → <target> ⚪ 0%
|
|
172
|
+
▓░░░░░░░░░░░░░░░░░░░ 0%
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### Step 4: Link Initiatives
|
|
176
|
+
|
|
177
|
+
Ask: **"What initiatives will drive '<Key Result>'? These are the projects, features, or efforts that move the needle."**
|
|
178
|
+
|
|
179
|
+
Check for existing initiatives and features:
|
|
180
|
+
|
|
181
|
+
```
|
|
182
|
+
list_nodes({ type: "initiative" })
|
|
183
|
+
list_nodes({ type: "feature" })
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
If related entities exist:
|
|
187
|
+
|
|
188
|
+
```
|
|
189
|
+
You have initiatives and features in your graph that might drive this:
|
|
190
|
+
|
|
191
|
+
1. 🎯 <Existing initiative> — link it to this key result
|
|
192
|
+
2. 📦 <Existing feature> — link it to this key result
|
|
193
|
+
3. Create a new initiative
|
|
194
|
+
4. Skip — I'll connect initiatives later
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
If creating a new initiative:
|
|
198
|
+
|
|
199
|
+
```
|
|
200
|
+
create_node({
|
|
201
|
+
type: "initiative",
|
|
202
|
+
title: "<initiative name>",
|
|
203
|
+
description: "<how this drives the key result>",
|
|
204
|
+
properties: {
|
|
205
|
+
status: "planned"
|
|
206
|
+
},
|
|
207
|
+
parent_id: "<key_result_id>"
|
|
208
|
+
})
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
If linking to an existing entity, use the canonical edge for the source type:
|
|
212
|
+
|
|
213
|
+
```
|
|
214
|
+
// For a feature → key_result link, use the canonical edge:
|
|
215
|
+
create_edge({
|
|
216
|
+
source_id: "<feature_id>",
|
|
217
|
+
target_id: "<key_result_id>",
|
|
218
|
+
type: "feature_drives_key_result"
|
|
219
|
+
})
|
|
220
|
+
|
|
221
|
+
// For an initiative → outcome link, use:
|
|
222
|
+
// create_edge({ source_id: "<initiative_id>", target_id: "<outcome_id>",
|
|
223
|
+
// type: "initiative_drives_outcome" })
|
|
224
|
+
// (initiatives currently connect to outcomes; key_result quantifies the
|
|
225
|
+
// outcome via objective_achieved_through_key_result + metric_measures_key_result)
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
### Step 5: Additional Metrics (optional)
|
|
229
|
+
|
|
230
|
+
After all key results and initiatives are linked for an objective, ask: **"Any other metrics you want to track alongside these KRs? Think input metrics, guardrail metrics, or health metrics that aren't key results but are important to watch."**
|
|
231
|
+
|
|
232
|
+
```
|
|
233
|
+
1. Yes — I have metrics to add
|
|
234
|
+
2. No — the key results cover it
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
STOP. Wait for the answer. If they say no, skip to Step 6.
|
|
238
|
+
|
|
239
|
+
If yes, ask: **"What metric do you want to track?"**
|
|
240
|
+
|
|
241
|
+
Offer metric options based on the objective and key results:
|
|
242
|
+
|
|
243
|
+
```
|
|
244
|
+
1. 📊 <input metric> — a leading indicator that feeds into <KR>
|
|
245
|
+
2. 📊 <guardrail metric> — guardrail metrics (things that should NOT get worse while you pursue the objective)
|
|
246
|
+
3. 📊 <health metric> — overall product/team health signal
|
|
247
|
+
4. 📊 <counter-metric> — counter-metrics (the opposite signal — if this moves, something went wrong)
|
|
248
|
+
5. Different metric — tell me what you want to track
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
STOP. Wait for the answer.
|
|
252
|
+
|
|
253
|
+
Create the `metric` entity:
|
|
254
|
+
|
|
255
|
+
```
|
|
256
|
+
create_node({
|
|
257
|
+
type: "metric",
|
|
258
|
+
title: "<metric name>",
|
|
259
|
+
description: "<what this metric measures and why it matters>",
|
|
260
|
+
properties: {
|
|
261
|
+
designation: "<input | guardrail | health | counter | vanity | north_star>",
|
|
262
|
+
metric_category: "<aarrr or heart category>",
|
|
263
|
+
current_value: <number if known>,
|
|
264
|
+
unit: "<%, count, seconds, score, etc.>",
|
|
265
|
+
indicator_direction: "<leading | lagging>"
|
|
266
|
+
// Note: connect this metric to the related key_result via the
|
|
267
|
+
// `metric_measures_key_result` edge below instead of a free-text property.
|
|
268
|
+
},
|
|
269
|
+
parent_id: "<objective_id>"
|
|
270
|
+
})
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
Connect to the relevant key result:
|
|
274
|
+
|
|
275
|
+
```
|
|
276
|
+
create_edge({
|
|
277
|
+
source_id: "<metric_id>",
|
|
278
|
+
target_id: "<key_result_id>",
|
|
279
|
+
type: "metric_measures_key_result"
|
|
280
|
+
})
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
Confirm: "📊 **<Metric Name>** added as a <metric type> metric."
|
|
284
|
+
|
|
285
|
+
Ask: **"Any more metrics to track?"** If yes, repeat. If no, move to Step 6.
|
|
286
|
+
|
|
287
|
+
### Step 6: Another Objective?
|
|
288
|
+
|
|
289
|
+
Ask: **"Want to add another objective for <timeframe>? Most teams have 2-4 per quarter."**
|
|
290
|
+
|
|
291
|
+
```
|
|
292
|
+
1. Yes — I have another objective
|
|
293
|
+
2. That's enough — show me the full OKR set
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
If yes, loop back to Step 2. If no, proceed to the summary.
|
|
297
|
+
|
|
298
|
+
### Step 7: Show the Full OKR Tree
|
|
299
|
+
|
|
300
|
+
Display the complete OKR set with grade-ability assessment:
|
|
301
|
+
|
|
302
|
+
```
|
|
303
|
+
### OKRs — <Timeframe> <Year>
|
|
304
|
+
|
|
305
|
+
🎯 <Objective 1>
|
|
306
|
+
├─ 🎯 <KR 1.1>: <current> → <target> ⚪ 0%
|
|
307
|
+
│ ▓░░░░░░░░░░░░░░░░░░░ 0%
|
|
308
|
+
│ └─ 🎯 <Initiative> 🔵 planned
|
|
309
|
+
├─ 🎯 <KR 1.2>: <current> → <target> ⚪ 0%
|
|
310
|
+
│ ▓░░░░░░░░░░░░░░░░░░░ 0%
|
|
311
|
+
├─ 🎯 <KR 1.3>: <current> → <target> ⚪ 0%
|
|
312
|
+
│ ▓░░░░░░░░░░░░░░░░░░░ 0%
|
|
313
|
+
│ └─ 🎯 <Initiative> 🔵 planned
|
|
314
|
+
│
|
|
315
|
+
└─ 📊 Tracked Metrics (if created)
|
|
316
|
+
├─ 📊 <input metric> — <direction> <unit> (input)
|
|
317
|
+
└─ 📊 <guardrail metric> — <direction> <unit> (guardrail)
|
|
318
|
+
|
|
319
|
+
🎯 <Objective 2>
|
|
320
|
+
├─ 🎯 <KR 2.1>: <current> → <target> ⚪ 0%
|
|
321
|
+
│ ▓░░░░░░░░░░░░░░░░░░░ 0%
|
|
322
|
+
└─ 🎯 <KR 2.2>: <current> → <target> ⚪ 0%
|
|
323
|
+
▓░░░░░░░░░░░░░░░░░░░ 0%
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
### Grade-ability Assessment
|
|
327
|
+
|
|
328
|
+
Show how well-formed the OKRs are:
|
|
329
|
+
|
|
330
|
+
```
|
|
331
|
+
┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
|
|
332
|
+
### Grade-ability Check
|
|
333
|
+
|
|
334
|
+
✓ Objectives are qualitative and inspiring
|
|
335
|
+
✓ Key results have current + target values
|
|
336
|
+
<check: unit specified, baseline known, stretch target>
|
|
337
|
+
✓ Each objective has 2-4 key results
|
|
338
|
+
<check: initiatives linked>
|
|
339
|
+
<check: supporting/guardrail metrics tracked>
|
|
340
|
+
|
|
341
|
+
Overall: X of Y key results are fully grade-able
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
### Step 8: Close with Smart Ending
|
|
345
|
+
|
|
346
|
+
Check the graph for the biggest gap across the 8 business areas. Recommend ONE next skill:
|
|
347
|
+
|
|
348
|
+
> Based on what we built, your biggest gap is **[area]**. I'd suggest running `/upg-[skill]` next to [reason].
|
|
349
|
+
>
|
|
350
|
+
> Or run `/upg-journey` to see where you are in the bigger picture.
|
|
351
|
+
|