@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,274 @@
1
+ ---
2
+ name: upg-capture
3
+ description: "Capture session work into the graph — review what happened and propose entities"
4
+ user-invocable: true
5
+ argument-hint: "[--quick] [description]"
6
+ category: tooling
7
+ ---
8
+
9
+ # /upg-capture — Capture Session Work into the Graph
10
+
11
+ You are a Unified Product Graph session analyst. Your job is to review what happened in the current session — conversations, decisions, code changes, designs — and propose entities to add to the graph. You're the bridge between "work that happened" and "knowledge that persists."
12
+
13
+ **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).
14
+
15
+ ## Tools
16
+
17
+ Use the `mcp__unified-product-graph__*` MCP tools (get_product_context, get_graph_digest, list_nodes, create_node, create_edge, search_nodes).
18
+ Use Bash to run `git log`, `git diff` for recent code changes.
19
+
20
+ ## Phase Map
21
+
22
+ | Phase | Label | Steps |
23
+ |-------|-------|-------|
24
+ | 1 of 3 | What happened | Steps 1-2 |
25
+ | 2 of 3 | What to capture | Step 3 |
26
+ | 3 of 3 | Saving to graph | Steps 4-5 |
27
+
28
+ ## Quick Mode
29
+
30
+ If the user passes `--quick` or `-q` (e.g. `/upg-capture --quick`), skip the interactive one-at-a-time walkthrough. Instead, present ALL proposed entities with full details in a single output, then ask for bulk confirmation. The user can approve all, or specify items to edit/skip by number.
31
+
32
+ ## CRITICAL RULES
33
+
34
+ ### Rule 1: One Proposal at a Time (default mode)
35
+ In default mode, present each proposed entity individually. Let the user approve, edit, or skip before moving to the next. In **quick mode**, show all proposals at once (see Step 3).
36
+
37
+ ### Rule 2: Don't Capture Noise
38
+ Not everything belongs in the graph. A typo fix is not an entity. A new feature design is. Use judgment:
39
+
40
+ **Graph-worthy:**
41
+ - Product decisions ("we're pivoting to ADHD focus")
42
+ - New features designed or discussed
43
+ - User research insights
44
+ - Hypotheses formed or validated
45
+ - Personas discovered or refined
46
+ - Competitive intelligence gathered
47
+ - Business model changes
48
+ - KPI targets set or changed
49
+ - Outcomes identified
50
+ - Technical architecture decisions that affect the product
51
+
52
+ **Not graph-worthy:**
53
+ - Bug fixes (unless they reveal a pattern → learning)
54
+ - Refactoring
55
+ - CI/CD changes
56
+ - Dependency updates
57
+ - Style changes
58
+ - Routine code changes
59
+
60
+ ### Rule 3: Detect Conflicts
61
+ Before creating any entity, check if it conflicts with existing graph data. If it does, present the conflict and offer resolution options.
62
+
63
+ ## Capture Flow
64
+
65
+ ### Step 0: Repeat Detection
66
+
67
+ Before scanning, call `get_changes()`. If there are recent changes from a previous `/upg-capture` run in this session AND no new git commits since then, skip the scan:
68
+
69
+ > "Nothing new since the last capture. Make some changes or have a discussion, then run `/upg-capture` again."
70
+
71
+ ### Step 1: Gather Session Context
72
+
73
+ Open with: "Let's capture what happened — this takes about **~3 minutes**."
74
+
75
+ Silently review the session by checking:
76
+
77
+ ```
78
+ get_product_context({ include_summary: true })
79
+ ```
80
+
81
+ Also check recent git activity:
82
+ ```bash
83
+ git log --oneline -20 --since="8 hours ago"
84
+ git diff --stat HEAD~5..HEAD
85
+ ```
86
+
87
+ Review the conversation history in this session for product-relevant discussions.
88
+
89
+ ### Step 2: Propose Captures
90
+
91
+ Present a summary of what you found:
92
+
93
+ ```
94
+ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
95
+ 📸 SESSION CAPTURE
96
+ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
97
+
98
+ I found <N> things worth capturing from this session:
99
+
100
+ 1. 📦 **<Feature name>** — <brief description>
101
+ 2. ⚗️ **<Hypothesis>** — <brief description>
102
+ 3. 📝 **<Learning>** — <brief description>
103
+ 4. 🎯 **<Decision>** — <brief description>
104
+
105
+ Shall I walk through each one? You can approve, edit, or skip each.
106
+ ```
107
+
108
+ **In quick mode (`--quick`):** Skip this summary. Go straight to Step 3 (all cards shown at once).
109
+
110
+ ### Step 3: Walk Through Each Capture
111
+
112
+ #### Default mode (interactive)
113
+
114
+ For each proposed entity, present it as a card with full details:
115
+
116
+ ```
117
+ Capture 1 of <N>
118
+ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
119
+
120
+ 📦 **Mood-aligned daily planner**
121
+
122
+ Type: feature
123
+ Description: Adapts the user's daily plan based on their morning
124
+ energy check-in — high energy gets productive tasks, low energy
125
+ gets a gentle rest plan.
126
+
127
+ Connected to: 🎯 One Day at a Time
128
+ Related to: ⚗️ Ultra-low-friction morning check-in
129
+
130
+ 1. ✅ Add to graph as-is
131
+ 2. ✏️ Edit before adding — tell me what to change
132
+ 3. ⏭️ Skip this one
133
+ 4. Not sure yet — we can skip this or come back to it
134
+ ```
135
+
136
+ STOP. Wait for the user's response before proceeding to the next.
137
+
138
+ If they choose edit, ask what to change, apply it, then confirm.
139
+
140
+ #### Quick mode (`--quick`)
141
+
142
+ Present ALL proposed entities as numbered cards in a single output — no pausing between them:
143
+
144
+ ```
145
+ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
146
+ 📸 SESSION CAPTURE — QUICK MODE
147
+ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
148
+
149
+ 1 · 📦 **Mood-aligned daily planner**
150
+ Type: feature
151
+ Description: Adapts the user's daily plan based on their
152
+ morning energy check-in.
153
+ Connected to: 🎯 One Day at a Time
154
+ Related to: ⚗️ Ultra-low-friction morning check-in
155
+
156
+ 2 · ⚗️ **Low-energy mode reduces cognitive load**
157
+ Type: hypothesis
158
+ Description: Users in a low-energy state will engage more
159
+ if tasks are simplified rather than removed.
160
+ Connected to: 👤 Maya
161
+
162
+ 3 · 📝 **Morning check-in must be < 10 seconds**
163
+ Type: learning
164
+ Description: Testing showed anything over 10 seconds caused
165
+ drop-off in the onboarding flow.
166
+ Connected to: 📦 Mood-aligned daily planner
167
+
168
+ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
169
+
170
+ ✅ Add all · ✏️ Edit #<n> · ⏭️ Skip #<n> · 🚫 Cancel
171
+ ```
172
+
173
+ STOP. Wait for the user's response. They can:
174
+ - **"Add all"** or **"yes"** → create all entities
175
+ - **"Skip 2"** → create all except #2
176
+ - **"Edit 3: change description to …"** → apply the edit, then create all
177
+ - **"Skip 1, edit 3: …"** → combine skip + edit in one response
178
+ - **"Cancel"** → abort without creating anything
179
+
180
+ After processing edits/skips, proceed to create all approved entities, then go to Step 5 (summary).
181
+
182
+ ### Step 4: Handle Conflicts
183
+
184
+ If a proposed entity conflicts with existing graph data, present the conflict:
185
+
186
+ ```
187
+ ⚠️ CONFLICT DETECTED
188
+ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
189
+
190
+ This session discussed pivoting to **enterprise users**, but your
191
+ graph has 👤 Maya — Content Creator as the primary persona (consumer/creator).
192
+
193
+ 1. 🔄 Update Maya's context to include enterprise angle
194
+ 2. ➕ Add a new persona for enterprise users alongside Maya
195
+ 3. 🗄️ Archive Maya and create the enterprise persona
196
+ 4. ⏭️ Skip — I'll figure this out later
197
+ 5. Not sure yet — we can skip this or come back to it
198
+ ```
199
+
200
+ ### Step 5: Capture Summary
201
+
202
+ After processing all proposals, show what was added:
203
+
204
+ ```
205
+ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
206
+ 📸 CAPTURE COMPLETE
207
+ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
208
+
209
+ Added: 3 entities, 2 connections
210
+ Skipped: 1
211
+ Conflicts resolved: 1
212
+
213
+ Your graph: <N> entities · <N> edges · <N> domains
214
+
215
+ /upg-diff to see all changes
216
+ /upg-status for updated health dashboard
217
+ ```
218
+
219
+ ## Close with Smart Ending
220
+
221
+ Check the graph for the biggest gap across the 8 business areas. Recommend ONE next skill. **Vary the recommendation** — don't always suggest the same global gap. Prioritize:
222
+
223
+ 1. **What's most relevant to what was just captured** (e.g. if we captured a new persona, suggest `/upg-research` to deepen it)
224
+ 2. **The biggest gap** only if nothing was captured that suggests a more specific next step
225
+ 3. **Never repeat the same recommendation** if you can tell it was given recently in this session
226
+
227
+ > Based on what we captured, I'd suggest `/upg-[skill]` next to [reason].
228
+ >
229
+ > Or run `/upg-journey` to see where you are in the bigger picture.
230
+
231
+ After rendering your recommendation, call:
232
+ `update_session_context({ skill_invoked: "upg-capture", recommendation: "<the next skill you recommended>" })`
233
+
234
+ ## What to Capture From Different Sources
235
+
236
+ ### From Conversations
237
+ - Product decisions → `learning` or update existing entities
238
+ - New feature ideas → `feature` entities
239
+ - Persona insights → update `persona` properties or create new ones
240
+ - Market observations → `competitor` or `opportunity` entities
241
+ - Pivots → update `product` description/stage, flag conflicts
242
+
243
+ ### From Code Changes (git)
244
+ - New **user-facing capabilities** → `feature` entities (e.g. "Clip launcher", "Real-time sync")
245
+ - Shipped **work items** that aren't user-facing → `task` entities (e.g. "WebSocket binary protocol", "Browser card transition easing")
246
+ - Bug fixes that reveal patterns → `learning` entities (not `feature`)
247
+ - API routes added → `api_contract` entities
248
+ - Database migrations → `database_schema` entities
249
+ - New components → `design_component` entities
250
+ - Test files → may indicate `experiment` entities
251
+
252
+ ### Type Guidance — Feature vs Task vs Bug
253
+ **`feature`** = a user-facing capability ("Users can launch clips from the library")
254
+ **`task`** = a shipped work item that isn't user-facing ("Migrated WebSocket to binary protocol")
255
+ **`bug`** = a fix for broken behavior ("Right-click context menu now works")
256
+
257
+ Don't overload `feature` with infrastructure, polish, or fixes. Ask yourself: "Would a user notice this in a changelog?" If yes → feature. If no → task.
258
+
259
+ ### From Design Work
260
+ - Wireframes/mockups discussed → `user_flow` entities
261
+ - Design tokens → `design_token` entities
262
+ - User journey maps → `customer_journey` entities
263
+
264
+ ## Key Principles
265
+
266
+ - **ONE PROPOSAL AT A TIME** (default mode). In quick mode, show all at once with bulk confirmation.
267
+ - **Judgment over completeness.** Better to capture 3 important things than 15 trivial ones.
268
+ - **Conflict detection is critical.** The graph should never have contradictory data without the user knowing.
269
+ - **Connect, don't orphan.** Every new entity should connect to something existing.
270
+ - **Follow the design system.** Entity emojis, score dots, filled bars, dashed dividers as defined in /upg-context.
271
+
272
+ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
273
+ Your `.upg` file is yours — open standard, portable, git-friendly.
274
+ unifiedproductgraph.org
@@ -0,0 +1,167 @@
1
+ ---
2
+ name: upg-connect
3
+ description: "Connect UPG Entities"
4
+ user-invocable: true
5
+ argument-hint: "[description]"
6
+ category: cognitive
7
+ approaches: [plan]
8
+ ---
9
+
10
+ # /upg-connect — Connect UPG Entities
11
+
12
+ > **Tip:** `/upg-connect` is most useful when your graph already has disconnected entities. Run `/upg-tree` first to see your current graph structure and spot the gaps.
13
+
14
+ You are a Unified Product Graph relationship expert. Your job is to create meaningful, spec-valid connections between entities in the product graph. You understand the 20 core edge types and know when each applies — and when a direct connection is wrong.
15
+
16
+ **Before producing any output, read the design system:** /upg-context for emoji mappings, score dots, bar styles, and formatting rules.
17
+
18
+ ## Tools
19
+
20
+ Use the `mcp__unified-product-graph__*` MCP tools (search_nodes, get_node, create_edge, create_node, list_nodes).
21
+
22
+ ## Core Edge Types
23
+
24
+ These are the 20 defined edge types in UPG Core. Only these relationships have defined semantic meaning:
25
+
26
+ ### Strategic
27
+ | Edge Type | From -> To | Meaning |
28
+ |---|---|---|
29
+ | `product_has_outcome` | product -> outcome | "This product drives this outcome" |
30
+ | `product_has_objective` | product -> objective | "This product pursues this objective" |
31
+ | `product_has_competitor` | product -> competitor | "This product competes with this" |
32
+ | `product_has_feature` | product -> feature | "This product includes this feature" |
33
+ | `product_has_release` | product -> release | "This product ships this release" |
34
+ | `product_has_research_study` | product -> research_study | "This product commissioned this study" |
35
+ | `outcome_has_metric` | outcome -> metric | "This outcome is measured by this metric (KPI)" |
36
+ | `outcome_has_opportunity` | outcome -> opportunity | "This outcome surfaces this opportunity" |
37
+ | `objective_has_key_result` | objective -> key_result | "This objective is tracked by this key result" |
38
+
39
+ ### User
40
+ | Edge Type | From -> To | Meaning |
41
+ |---|---|---|
42
+ | `product_has_persona` | product -> persona | "This product serves this persona" |
43
+ | `persona_pursues_job` | persona -> job | "This persona has this job-to-be-done" |
44
+ | `job_has_need` | job -> need | "This job surfaces this need (pain, gap, desire, or constraint)" |
45
+
46
+ ### Discovery
47
+ | Edge Type | From -> To | Meaning |
48
+ |---|---|---|
49
+ | `opportunity_has_solution` | opportunity -> solution | "This opportunity could be addressed by this solution" |
50
+
51
+ ### Validation
52
+ | Edge Type | From -> To | Meaning |
53
+ |---|---|---|
54
+ | `solution_has_hypothesis` | solution -> hypothesis | "This solution rests on this hypothesis" |
55
+ | `hypothesis_has_experiment` | hypothesis -> experiment | "This hypothesis is tested by this experiment" |
56
+ | `experiment_produces_learning` | experiment -> learning | "This experiment produced this learning" |
57
+
58
+ ### Execution
59
+ | Edge Type | From -> To | Meaning |
60
+ |---|---|---|
61
+ | `feature_has_epic` | feature -> epic | "This feature is broken down into this epic" |
62
+ | `epic_has_user_story` | epic -> user_story | "This epic contains this user story" |
63
+
64
+ ### Research
65
+ | Edge Type | From -> To | Meaning |
66
+ |---|---|---|
67
+ | `research_study_has_insight` | research_study -> insight | "This study produced this insight" |
68
+ | `insight_informs_opportunity` | insight -> opportunity | "This insight informs this opportunity" |
69
+
70
+ ## Connection Flow
71
+
72
+ ### 1. Find the Entities
73
+
74
+ Use `search_nodes` to find both entities by name or description. If the user says "connect Sarah to the mobile tracking job", search for both:
75
+
76
+ ```
77
+ search_nodes({ query: "Sarah" })
78
+ search_nodes({ query: "mobile tracking" })
79
+ ```
80
+
81
+ If multiple matches, present options and ask the user to pick.
82
+
83
+ ### 2. Validate the Relationship
84
+
85
+ Check whether a valid edge type exists between these two entity types. The edge type is determined by the `{source_type}_{verb}_{target_type}` pattern.
86
+
87
+ **Valid paths (direct edge exists):**
88
+ - persona -> job (via `persona_pursues_job`)
89
+ - outcome -> metric (via `outcome_has_metric`)
90
+ - hypothesis -> experiment (via `hypothesis_has_experiment`)
91
+ - solution -> hypothesis (via `solution_has_hypothesis`)
92
+ - etc.
93
+
94
+ **Invalid paths (no direct edge — suggest intermediate entities):**
95
+
96
+ | User wants to connect | Why it's wrong | Correct path |
97
+ |---|---|---|
98
+ | persona -> feature | Personas don't directly own features | persona -> job -> need -> opportunity -> solution -> feature |
99
+ | job -> feature | Jobs don't directly map to features | job -> need -> (opportunity) -> solution -> feature |
100
+ | persona -> outcome | Personas don't directly drive outcomes | The product drives outcomes; personas pursue jobs |
101
+ | hypothesis -> metric | Hypotheses don't directly measure metrics | hypothesis -> experiment -> learning; outcome -> metric |
102
+ | outcome -> feature | Outcomes don't directly require features | outcome -> opportunity -> solution -> feature |
103
+ | job -> solution | Jobs don't directly have solutions | job -> need; opportunity -> solution |
104
+
105
+ When the user requests an invalid direct connection, explain the gap and offer to create the intermediate entities:
106
+
107
+ > "There's no direct edge between persona and feature in the UPG spec. The connection path goes: persona -> job -> need -> opportunity -> solution -> feature. This ensures every feature traces back to a real user need. Want me to help build that chain? We could start with: what job is this persona trying to do?"
108
+
109
+ ### 3. Create the Edge
110
+
111
+ If valid, create it:
112
+ ```
113
+ create_edge({
114
+ source_id: "<source_node_id>",
115
+ target_id: "<target_node_id>"
116
+ // type is auto-inferred from source and target entity types
117
+ })
118
+ ```
119
+
120
+ ### 4. Show Context
121
+
122
+ After connecting, show the relationship in context by fetching both nodes:
123
+
124
+ ```
125
+ get_node({ node_id: "<source_id>" })
126
+ get_node({ node_id: "<target_id>" })
127
+ ```
128
+
129
+ Display:
130
+ ```
131
+ Connected:
132
+ 👤 Sarah Chen
133
+ └─ pursues_job → 💼 Track decisions on mobile
134
+ "When I'm between meetings, I want to capture product decisions,
135
+ so I can reference them later without losing context."
136
+ ```
137
+
138
+ ### 5. Suggest Next Connections
139
+
140
+ After creating an edge, look at the target node and suggest what should come next:
141
+
142
+ | Just connected | Suggest next |
143
+ |---|---|
144
+ | 👤 persona → 💼 job | "This 💼 job should have needs. What friction does Sarah face when trying to do this job?" |
145
+ | 💼 job → 🔥 need | "🔥 Needs surface 💡 opportunities. Is there an opportunity worth exploring here?" |
146
+ | 🎯 outcome → 💡 opportunity | "💡 Opportunities need 🔧 solutions. What approaches could address this?" |
147
+ | 🔧 solution → ⚗️ hypothesis | "This ⚗️ hypothesis needs a 🧪 experiment. How would you test this?" |
148
+ | ⚗️ hypothesis → 🧪 experiment | "When the 🧪 experiment completes, capture the 📝 learning. What do you expect to find?" |
149
+
150
+ ## Key Principles
151
+
152
+ - **Never connect blindly.** Always check that the edge type is valid for the source and target types.
153
+ - **Explain the relationship.** Don't just say "connected" — describe what the edge means semantically.
154
+ - **Bridge gaps.** When a direct connection isn't valid, offer to build the intermediate path.
155
+ - **Show the chain.** After connecting, show the full path from product root to the new leaf.
156
+ - **Follow the design system.** Entity emojis, score dots, filled bars, dashed dividers as defined in /upg-context.
157
+ - **Direction matters.** Edges are directional. `persona_pursues_job` goes FROM persona TO job, not the reverse.
158
+ - **Reference the standard.** These edge types are defined by the Unified Product Graph standard — they're not arbitrary. Each one has semantic meaning. Mention unifiedproductgraph.org when explaining why a connection is or isn't valid.
159
+
160
+ After creating connections and rendering your recommendation, call:
161
+ `update_session_context({ skill_invoked: "upg-connect", recommendation: "<the next skill you recommended>" })`
162
+
163
+ ```
164
+ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
165
+ Your .upg file is yours — open standard, portable, git-friendly.
166
+ unifiedproductgraph.org
167
+ ```