@unified-product-graph/mcp-server 0.8.1 → 0.8.4

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 (61) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +1 -1
  3. package/TOOLS.md +79 -16
  4. package/dist/index.js +1440 -290
  5. package/dist/index.js.map +1 -1
  6. package/dist/tools-manifest.json +197 -82
  7. package/package.json +1 -1
  8. package/scripts/claudemd-snippet.md +7 -7
  9. package/scripts/install-skills.sh +2 -2
  10. package/skills/upg/SKILL.md +41 -41
  11. package/skills/{upg-gaps → upg-check-gaps}/SKILL.md +40 -43
  12. package/skills/{upg-schema-health → upg-check-schema}/SKILL.md +7 -7
  13. package/skills/{upg-schema-evolve → upg-check-schema-coverage}/SKILL.md +12 -12
  14. package/skills/{upg-schema-edges → upg-check-schema-edges}/SKILL.md +3 -3
  15. package/skills/{upg-schema-consolidate → upg-check-schema-merge}/SKILL.md +5 -5
  16. package/skills/upg-context/SKILL.md +96 -72
  17. package/skills/upg-context-intelligence/SKILL.md +23 -27
  18. package/skills/upg-design-system/SKILL.md +21 -26
  19. package/skills/{upg-verify → upg-find-untracked}/SKILL.md +7 -12
  20. package/skills/{upg-rollback → upg-fix-rollback}/SKILL.md +6 -12
  21. package/skills/{upg-migrate → upg-fix-types}/SKILL.md +5 -9
  22. package/skills/upg-link/SKILL.md +125 -0
  23. package/skills/{upg-discover → upg-new-discovery}/SKILL.md +42 -58
  24. package/skills/{upg-capture → upg-new-from-session}/SKILL.md +13 -15
  25. package/skills/{upg-template → upg-new-from-template}/SKILL.md +8 -12
  26. package/skills/{upg-init → upg-new-graph}/SKILL.md +50 -82
  27. package/skills/{upg-hypothesis → upg-new-hypothesis}/SKILL.md +27 -36
  28. package/skills/{upg-launch → upg-new-launch}/SKILL-DETAIL.md +36 -92
  29. package/skills/{upg-launch → upg-new-launch}/SKILL.md +8 -18
  30. package/skills/{upg-okr → upg-new-okr}/SKILL-DETAIL.md +28 -46
  31. package/skills/{upg-okr → upg-new-okr}/SKILL.md +3 -3
  32. package/skills/{upg-persona → upg-new-persona}/SKILL.md +35 -67
  33. package/skills/{upg-research → upg-new-research}/SKILL.md +25 -33
  34. package/skills/{upg-schema-update → upg-new-schema-type}/SKILL.md +2 -2
  35. package/skills/{upg-strategy → upg-new-strategy}/SKILL.md +21 -27
  36. package/skills/upg-prioritise/SKILL.md +4 -4
  37. package/skills/upg-reflect/SKILL.md +7 -7
  38. package/skills/{upg-feedback → upg-send-feedback}/SKILL.md +30 -51
  39. package/skills/{upg-diff → upg-show-diff}/SKILL.md +6 -12
  40. package/skills/{upg-inspect → upg-show-entity}/SKILL.md +7 -9
  41. package/skills/{upg-impact → upg-show-impact}/SKILL.md +11 -15
  42. package/skills/{upg-journey → upg-show-journey}/SKILL.md +31 -32
  43. package/skills/{upg-analytics → upg-show-metrics}/SKILL.md +9 -12
  44. package/skills/{upg-schema-changelog → upg-show-schema-changelog}/SKILL.md +5 -5
  45. package/skills/{upg-status → upg-show-status}/SKILL.md +39 -40
  46. package/skills/{upg-tree → upg-show-tree}/SKILL.md +15 -15
  47. package/skills/{upg-export → upg-sync-export}/SKILL.md +10 -13
  48. package/skills/{upg-import → upg-sync-import}/SKILL.md +7 -13
  49. package/skills/{upg-pull → upg-sync-pull}/SKILL-DETAIL.md +13 -17
  50. package/skills/{upg-pull → upg-sync-pull}/SKILL.md +3 -3
  51. package/skills/{upg-push → upg-sync-push}/SKILL-DETAIL.md +4 -10
  52. package/skills/{upg-push → upg-sync-push}/SKILL.md +4 -4
  53. package/skills/{upg-snapshot → upg-sync-snapshot}/SKILL.md +2 -6
  54. package/skills/upg-trace/SKILL.md +7 -7
  55. package/skills/{upg-workspace → upg-use-workspace}/SKILL.md +8 -14
  56. package/skills/{upg-run → upg-walk-playbook}/SKILL.md +10 -10
  57. package/skills/upg-walk-region/SKILL-DETAIL.md +320 -0
  58. package/skills/upg-walk-region/SKILL.md +89 -0
  59. package/skills/upg-connect/SKILL.md +0 -167
  60. package/skills/upg-explore/SKILL-DETAIL.md +0 -481
  61. package/skills/upg-explore/SKILL.md +0 -297
@@ -1,167 +0,0 @@
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
- ```
@@ -1,481 +0,0 @@
1
- ---
2
- name: upg-explore-detail
3
- description: "Full property schemas and edge type reference for /upg-explore"
4
- ---
5
-
6
- # /upg-explore: Property Schemas & Edge Types (Detail)
7
-
8
- This file contains the full property schemas and edge type reference for entity creation. It is loaded on demand by /upg-explore when the agent needs to know the specific properties or valid connections for an entity type.
9
-
10
- ## Full Property Schemas
11
-
12
- When creating an entity, actively prompt for the key properties. Do not just set title and description.
13
-
14
- ### outcome
15
- ```json
16
- {
17
- "timeline": "When this should be achieved"
18
- }
19
- ```
20
- Ask: "What's the timeline for this outcome?"
21
-
22
- ### metric (KPI)
23
- ```json
24
- {
25
- "designation": "kpi",
26
- "current_value": 0,
27
- "target_value": 100,
28
- "unit": "%, users, seconds, etc.",
29
- "range_min": 0,
30
- "range_max": 100
31
- }
32
- ```
33
- Ask: "What's the current value? What's the target? What unit?" (KPIs are `metric` nodes with `designation: "kpi"`; the `kpi` type was consolidated into `metric` in v0.1.0.)
34
-
35
- ### objective
36
- ```json
37
- {
38
- "timeframe": "Q1 2026, H2 2026, etc.",
39
- "status": "active | achieved | deferred"
40
- }
41
- ```
42
-
43
- ### key_result
44
- ```json
45
- {
46
- "current_value": 0,
47
- "target_value": 100,
48
- "unit": "metric unit",
49
- "status": "on_track | at_risk | behind | achieved"
50
- }
51
- ```
52
-
53
- ### opportunity
54
- ```json
55
- {
56
- "status": "identified | validated | deferred | closed",
57
- "reach": 1-5,
58
- "frequency": 1-5,
59
- "pain": 1-5
60
- }
61
- ```
62
- Ask: "How many people does this affect (reach 1-5)? How often (frequency 1-5)? How painful (1-5)?"
63
-
64
- ### solution
65
- ```json
66
- {
67
- "status": "proposed | in_progress | shipped | deferred",
68
- "reach": 1-5,
69
- "impact": 1-5,
70
- "confidence": 1-5,
71
- "effort": 1-5,
72
- "rice_score": "(reach x impact x confidence) / effort"
73
- }
74
- ```
75
- Ask: "Let's RICE-score this. Reach (1-5)? Impact (1-5)? Confidence (1-5)? Effort (1-5)?"
76
-
77
- ### experiment
78
- ```json
79
- {
80
- "method": "Description of the test method",
81
- "status": "planned | running | analysing | complete",
82
- "start_date": "ISO date",
83
- "end_date": "ISO date"
84
- }
85
- ```
86
-
87
- ### learning
88
- ```json
89
- {
90
- "result": "What happened",
91
- "metric": "What was measured",
92
- "result_value": 0,
93
- "confidence_impact": "strengthens | weakens | neutral"
94
- }
95
- ```
96
-
97
- ### competitor
98
- ```json
99
- {
100
- "positioning": "How they position themselves",
101
- "pricing_model": "Their pricing approach",
102
- "strengths": ["What they do well"],
103
- "weaknesses": ["Where they fall short"],
104
- "website": "URL"
105
- }
106
- ```
107
-
108
- ### feature
109
- ```json
110
- {
111
- "status": "planned | in_progress | shipped | deprecated"
112
- }
113
- ```
114
-
115
- ### user_story
116
- ```json
117
- {
118
- "as_a": "persona name",
119
- "i_want_to": "action",
120
- "so_that": "outcome",
121
- "status": "backlog | in_progress | done",
122
- "effort": 0
123
- }
124
- ```
125
-
126
- ### need
127
- ```json
128
- {
129
- "valence": "pain | gap | desire | constraint",
130
- "frequency": 1-5,
131
- "severity": 1-5
132
- }
133
- ```
134
- Ask: "How often does this happen (1-5)? How bad is it (1-5)? Is this a pain, gap, desire, or constraint?" (The old `pain_point` type was consolidated into `need` with `valence: "pain"` in v0.1.0.)
135
-
136
- ### research_study
137
- ```json
138
- {
139
- "method": "interview | usability_test | survey | diary_study | field_study | other",
140
- "status": "planned | in_progress | analysing | complete",
141
- "participant_count": 0
142
- }
143
- ```
144
-
145
- ### insight (research insight)
146
- ```json
147
- {
148
- "source_domain": "research | ux | product | support",
149
- "insight_level": "observation | finding | insight",
150
- "confidence": "low | medium | high",
151
- "evidence_count": 0
152
- }
153
- ```
154
- (The old `research_insight`, `finding`, and `ux_insight` types were all consolidated into `insight` in v0.1.0.)
155
-
156
- ### business_model
157
- ```json
158
- {
159
- "canvas_type": "lean | bmc | custom",
160
- "customer_segments": ["Who you serve"],
161
- "channels": ["How you reach them"],
162
- "key_activities": ["What you do"],
163
- "key_resources": ["What you need"],
164
- "key_partners": ["Who helps you"],
165
- "status": "draft | validated | active | pivoting"
166
- }
167
- ```
168
- Ask: "What type of canvas is this; lean, BMC, or custom? Who are the customer segments? What are the key activities?"
169
-
170
- ### value_proposition
171
- ```json
172
- {
173
- "for_segment": "Which customer segment this serves",
174
- "gains": ["What gains you create"],
175
- "pain_relievers": ["What pains you relieve"],
176
- "products_and_services": ["What you offer"],
177
- "differentiator": "Why this is unique vs. alternatives",
178
- "status": "draft | testing | validated"
179
- }
180
- ```
181
- Ask: "Which customer segment is this for? What gains does it create? What pains does it relieve? What makes it different from alternatives?"
182
-
183
- ### gtm_strategy
184
- ```json
185
- {
186
- "target_market": "Primary market",
187
- "motion": "product_led | sales_led | community_led | hybrid",
188
- "channels": ["Distribution channels"],
189
- "timeline": "Launch timeline",
190
- "success_metrics": ["How you'll measure success"],
191
- "status": "draft | in_progress | launched | iterating"
192
- }
193
- ```
194
- Ask: "What's the target market? Is this product-led, sales-led, or community-led? What channels will you use?"
195
-
196
- ### ideal_customer_profile
197
- ```json
198
- {
199
- "company_size": "1-10 | 11-50 | 51-200 | 201-1000 | 1000+",
200
- "industry": "Target industry",
201
- "budget_range": "Typical budget",
202
- "buying_triggers": ["What causes them to look for a solution"],
203
- "disqualifiers": ["Red flags; who is NOT a fit"],
204
- "decision_makers": ["Roles involved in the buying decision"]
205
- }
206
- ```
207
- Ask: "What size company is the ideal fit? What industry? What triggers them to start looking for a solution like yours?"
208
-
209
- ### positioning
210
- ```json
211
- {
212
- "for_whom": "Target audience",
213
- "who_need": "Their primary need",
214
- "our_product_is": "Category or frame",
215
- "that_provides": "Key benefit",
216
- "unlike": "Primary alternative",
217
- "we_differentiate_by": "Unique differentiator",
218
- "framework": "april_dunford | moore | custom"
219
- }
220
- ```
221
- Ask: "Let's use a positioning statement. For whom? Who need what? What category is your product? How do you differentiate?"
222
-
223
- ### user_journey
224
- ```json
225
- {
226
- "persona": "Which persona takes this journey",
227
- "scenario": "The specific context or trigger",
228
- "stages": ["awareness", "consideration", "decision", "onboarding", "retention"],
229
- "emotional_arc": "How feelings change across stages",
230
- "status": "draft | mapped | validated"
231
- }
232
- ```
233
- Ask: "Which persona takes this journey? What's the scenario? What stages does it cover?"
234
-
235
- ### decision (architecture / design / product)
236
- ```json
237
- {
238
- "layer": "engineering | design | product",
239
- "context": "Why this decision was needed",
240
- "decision": "What was decided",
241
- "alternatives_considered": ["What else was evaluated"],
242
- "consequences": ["Trade-offs and implications"],
243
- "status": "proposed | accepted | deprecated | superseded",
244
- "decided_by": "Who made the decision",
245
- "decided_on": "ISO date"
246
- }
247
- ```
248
- Ask: "What's the context; why was this decision needed? What was decided? What alternatives were considered? Which layer does this belong to; engineering, design, or product?" (`architecture_decision`, `design_decision`, and `product_decision` were consolidated into the single `decision` type with a `layer` property in v0.2.0.)
249
-
250
- ### growth_loop
251
- ```json
252
- {
253
- "loop_type": "viral | content | paid | product",
254
- "trigger": "What starts the loop",
255
- "action": "What the user does",
256
- "output": "What the action produces",
257
- "reinvestment": "How the output feeds back into the trigger",
258
- "time_to_complete": "How long one cycle takes",
259
- "status": "theoretical | testing | proven | scaling"
260
- }
261
- ```
262
- Ask: "What type of loop; viral, content, paid, or product? What triggers it? What action does the user take? How does the output feed back into the trigger?"
263
-
264
- ### pricing_strategy
265
- ```json
266
- {
267
- "model": "freemium | free_trial | usage_based | flat_rate | per_seat | tiered | custom",
268
- "anchor_price": "Primary price point",
269
- "willingness_to_pay": "Researched WTP range",
270
- "competitive_position": "cheaper | parity | premium",
271
- "tiers": ["Tier names"],
272
- "status": "research | testing | launched | iterating"
273
- }
274
- ```
275
- Ask: "What pricing model; freemium, usage-based, per-seat, etc.? What's the anchor price? How does this compare to competitors; cheaper, parity, or premium?"
276
-
277
- ### ai_model
278
- ```json
279
- {
280
- "model_type": "llm | classifier | recommender | generative | embedding | custom",
281
- "provider": "openai | anthropic | google | huggingface | self_hosted | other",
282
- "use_case": "What this model does in the product",
283
- "input_type": "text | image | audio | structured | multimodal",
284
- "output_type": "text | classification | embedding | structured | multimodal",
285
- "latency_target": "Target response time",
286
- "cost_per_call": "Estimated cost",
287
- "status": "prototyping | evaluating | staging | production | deprecated"
288
- }
289
- ```
290
- Ask: "What type of model; LLM, classifier, recommender? Which provider? What's its use case in the product?"
291
-
292
- ## Edge Types: Valid Connections
293
-
294
- After creating an entity, search for related entities and suggest connections. Use these valid edge types:
295
-
296
- ### Core Product Graph
297
-
298
- | Edge Type | From | To |
299
- |---|---|---|
300
- | `product_has_outcome` | product | outcome |
301
- | `product_has_objective` | product | objective |
302
- | `product_has_competitor` | product | competitor |
303
- | `product_has_feature` | product | feature |
304
- | `product_has_release` | product | release |
305
- | `product_has_research_study` | product | research_study |
306
- | `product_has_persona` | product | persona |
307
- | `product_has_business_model` | product | business_model |
308
- | `product_has_gtm_strategy` | product | gtm_strategy |
309
- | `product_has_pricing_strategy` | product | pricing_strategy |
310
- | `product_has_ai_model` | product | ai_model |
311
- | `outcome_has_metric` | outcome | metric |
312
- | `outcome_has_opportunity` | outcome | opportunity |
313
- | `objective_has_key_result` | objective | key_result |
314
- | `persona_pursues_job` | persona | job |
315
- | `job_has_need` | job | need |
316
- | `opportunity_has_solution` | opportunity | solution |
317
- | `solution_has_hypothesis` | solution | hypothesis |
318
- | `hypothesis_has_experiment` | hypothesis | experiment |
319
- | `experiment_produces_learning` | experiment | learning |
320
- | `feature_has_epic` | feature | epic |
321
- | `epic_has_user_story` | epic | user_story |
322
- | `research_study_has_insight` | research_study | insight |
323
- | `insight_informs_opportunity` | insight | opportunity |
324
-
325
- ### Market Intelligence
326
-
327
- | Edge Type | From | To |
328
- |---|---|---|
329
- | `competitor_has_competitor_feature` | competitor | competitor_feature |
330
- | `market_segment_has_persona` | market_segment | persona |
331
- | `competitive_analysis_has_competitor` | competitive_analysis | competitor |
332
- | `market_trend_informs_opportunity` | market_trend | opportunity |
333
-
334
- ### UX Research
335
-
336
- | Edge Type | From | To |
337
- |---|---|---|
338
- | `research_study_has_participant` | research_study | participant |
339
- | `research_study_has_interview_guide` | research_study | interview_guide |
340
- | `participant_has_observation` | participant | observation |
341
- | `observation_yields_insight` | observation | insight |
342
- | `insight_refines_insight` | insight | insight |
343
-
344
- ### Design
345
-
346
- | Edge Type | From | To |
347
- |---|---|---|
348
- | `persona_has_user_journey` | persona | user_journey |
349
- | `user_journey_has_journey_step` | user_journey | journey_step |
350
- | `user_flow_has_screen` | user_flow | screen |
351
- | `screen_has_design_component` | screen | design_component |
352
- | `design_component_has_design_token` | design_component | design_token |
353
- | `feature_has_wireframe` | feature | wireframe |
354
- | `wireframe_has_prototype` | wireframe | prototype |
355
- | `feature_has_user_flow` | feature | user_flow |
356
-
357
- ### Engineering
358
-
359
- | Edge Type | From | To |
360
- |---|---|---|
361
- | `feature_has_service` | feature | service |
362
- | `service_has_api_contract` | service | api_contract |
363
- | `service_has_database_schema` | service | database_schema |
364
- | `service_has_library_dependency` | service | library_dependency |
365
- | `feature_has_feature_flag` | feature | feature_flag |
366
- | `service_has_decision` | service | decision (with `layer: "engineering"`) |
367
- | `service_has_technical_debt_item` | service | technical_debt_item |
368
-
369
- ### Growth
370
-
371
- | Edge Type | From | To |
372
- |---|---|---|
373
- | `funnel_has_funnel_step` | funnel | funnel_step |
374
- | `acquisition_channel_feeds_funnel` | acquisition_channel | funnel |
375
- | `growth_campaign_targets_acquisition_channel` | growth_campaign | acquisition_channel |
376
- | `cohort_measured_by_metric` | cohort | metric |
377
- | `growth_loop_has_experiment` | growth_loop | experiment (with `experiment_type: "growth"`) |
378
- | `experiment_produces_learning` | experiment | learning |
379
-
380
- ### Business Model
381
-
382
- | Edge Type | From | To |
383
- |---|---|---|
384
- | `business_model_has_value_proposition` | business_model | value_proposition |
385
- | `business_model_has_revenue_stream` | business_model | revenue_stream |
386
- | `business_model_has_cost_structure` | business_model | cost_structure |
387
- | `business_model_has_partnership` | business_model | partnership |
388
- | `value_proposition_targets_persona` | value_proposition | persona |
389
- | `revenue_stream_has_pricing_tier` | revenue_stream | pricing_tier |
390
- | `pricing_tier_has_unit_economics` | pricing_tier | unit_economics |
391
-
392
- ### Go-To-Market
393
-
394
- | Edge Type | From | To |
395
- |---|---|---|
396
- | `gtm_strategy_has_ideal_customer_profile` | gtm_strategy | ideal_customer_profile |
397
- | `gtm_strategy_has_positioning` | gtm_strategy | positioning |
398
- | `gtm_strategy_has_messaging` | gtm_strategy | messaging |
399
- | `gtm_strategy_has_launch` | gtm_strategy | launch |
400
- | `launch_has_release` | launch | release |
401
- | `positioning_has_competitive_battle_card` | positioning | competitive_battle_card |
402
- | `competitive_battle_card_references_competitor` | competitive_battle_card | competitor |
403
-
404
- ### Team & Organisation
405
-
406
- | Edge Type | From | To |
407
- |---|---|---|
408
- | `team_has_role` | team | role |
409
- | `team_has_stakeholder` | team | stakeholder |
410
- | `team_has_retrospective` | team | retrospective |
411
- | `team_has_dependency` | team | dependency |
412
-
413
- ### Data & Analytics
414
-
415
- | Edge Type | From | To |
416
- |---|---|---|
417
- | `metric_drives_metric` | metric (KPI) | metric (definition) |
418
- | `data_source_defines_metric` | data_source | metric |
419
- | `metric_has_event_schema` | metric | event_schema |
420
- | `dashboard_tracks_metric` | dashboard | metric |
421
- | `experiment_produces_learning` | experiment (with `experiment_type: "ab_test"`) | learning |
422
-
423
- ### DevOps & Platform
424
-
425
- | Edge Type | From | To |
426
- |---|---|---|
427
- | `service_has_service_level_indicator` | service | service_level_indicator |
428
- | `service_level_objective_measured_by_service_level_indicator` | service_level_objective | service_level_indicator |
429
- | `service_has_monitor` | service | monitor |
430
- | `incident_has_postmortem` | incident | postmortem |
431
- | `postmortem_produces_runbook` | postmortem | runbook |
432
-
433
- ### Security
434
-
435
- | Edge Type | From | To |
436
- |---|---|---|
437
- | `service_has_threat_model` | service | threat_model |
438
- | `threat_model_has_vulnerability` | threat_model | vulnerability |
439
- | `vulnerability_has_security_control` | vulnerability | security_control |
440
-
441
- ### QA & Testing
442
-
443
- | Edge Type | From | To |
444
- |---|---|---|
445
- | `feature_has_test_suite` | feature | test_suite |
446
- | `test_suite_has_test_case` | test_suite | test_case |
447
- | `release_has_qa_session` | release | qa_session |
448
-
449
- ### Feedback & VoC
450
-
451
- | Edge Type | From | To |
452
- |---|---|---|
453
- | `feature_request_informs_opportunity` | feature_request | opportunity |
454
- | `feedback_theme_has_feature_request` | feedback_theme | feature_request |
455
- | `nps_campaign_produces_feedback_theme` | nps_campaign | feedback_theme |
456
- | `beta_program_produces_learning` | beta_program | learning |
457
-
458
- ### Pricing & Packaging
459
-
460
- | Edge Type | From | To |
461
- |---|---|---|
462
- | `pricing_strategy_has_experiment` | pricing_strategy | experiment (with `experiment_type: "pricing"`) |
463
- | `pricing_strategy_has_pricing_tier` | pricing_strategy | pricing_tier |
464
- | `pricing_tier_has_trial_config` | pricing_tier | trial_config |
465
-
466
- ### AI/ML Operations
467
-
468
- | Edge Type | From | To |
469
- |---|---|---|
470
- | `ai_model_has_prompt_version` | ai_model | prompt_version |
471
- | `ai_model_has_eval_benchmark` | ai_model | eval_benchmark |
472
- | `eval_benchmark_produces_learning` | eval_benchmark | learning |
473
-
474
- ### Portfolio
475
-
476
- | Edge Type | From | To |
477
- |---|---|---|
478
- | `organization_has_portfolio` | organization | portfolio |
479
- | `portfolio_has_product_area` | portfolio | product_area |
480
- | `product_area_has_product` | product_area | product |
481
-