@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.
Files changed (55) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/LICENSE +21 -0
  3. package/README.md +247 -0
  4. package/dist/cli.cjs +141010 -0
  5. package/package.json +65 -0
  6. package/skills/README.md +10 -0
  7. package/skills/upg/SKILL.md +245 -0
  8. package/skills/upg-analytics/SKILL.md +135 -0
  9. package/skills/upg-capture/SKILL.md +274 -0
  10. package/skills/upg-connect/SKILL.md +167 -0
  11. package/skills/upg-context/SKILL.md +506 -0
  12. package/skills/upg-context-intelligence/SKILL.md +227 -0
  13. package/skills/upg-design-system/SKILL.md +265 -0
  14. package/skills/upg-diff/SKILL.md +150 -0
  15. package/skills/upg-discover/SKILL.md +290 -0
  16. package/skills/upg-explore/SKILL-DETAIL.md +481 -0
  17. package/skills/upg-explore/SKILL.md +297 -0
  18. package/skills/upg-export/SKILL.md +385 -0
  19. package/skills/upg-feedback/SKILL.md +141 -0
  20. package/skills/upg-gaps/SKILL.md +376 -0
  21. package/skills/upg-hypothesis/SKILL.md +190 -0
  22. package/skills/upg-impact/SKILL.md +229 -0
  23. package/skills/upg-import/SKILL.md +189 -0
  24. package/skills/upg-init/SKILL.md +410 -0
  25. package/skills/upg-inspect/SKILL.md +167 -0
  26. package/skills/upg-journey/SKILL.md +207 -0
  27. package/skills/upg-launch/SKILL-DETAIL.md +392 -0
  28. package/skills/upg-launch/SKILL.md +141 -0
  29. package/skills/upg-migrate/SKILL.md +146 -0
  30. package/skills/upg-okr/SKILL-DETAIL.md +351 -0
  31. package/skills/upg-okr/SKILL.md +88 -0
  32. package/skills/upg-persona/SKILL.md +230 -0
  33. package/skills/upg-prioritise/SKILL.md +195 -0
  34. package/skills/upg-pull/SKILL-DETAIL.md +398 -0
  35. package/skills/upg-pull/SKILL.md +57 -0
  36. package/skills/upg-push/SKILL-DETAIL.md +385 -0
  37. package/skills/upg-push/SKILL.md +113 -0
  38. package/skills/upg-reflect/SKILL.md +201 -0
  39. package/skills/upg-research/SKILL.md +336 -0
  40. package/skills/upg-rollback/SKILL.md +163 -0
  41. package/skills/upg-run/SKILL.md +126 -0
  42. package/skills/upg-schema-changelog/SKILL.md +231 -0
  43. package/skills/upg-schema-consolidate/SKILL.md +243 -0
  44. package/skills/upg-schema-edges/SKILL.md +287 -0
  45. package/skills/upg-schema-evolve/SKILL.md +313 -0
  46. package/skills/upg-schema-health/SKILL.md +279 -0
  47. package/skills/upg-schema-update/SKILL.md +206 -0
  48. package/skills/upg-snapshot/SKILL.md +108 -0
  49. package/skills/upg-status/SKILL.md +340 -0
  50. package/skills/upg-strategy/SKILL.md +334 -0
  51. package/skills/upg-template/SKILL.md +145 -0
  52. package/skills/upg-trace/SKILL.md +197 -0
  53. package/skills/upg-tree/SKILL.md +233 -0
  54. package/skills/upg-verify/SKILL.md +223 -0
  55. 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
+