@unified-product-graph/mcp-server 0.8.0 → 0.8.2
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 +11 -0
- package/README.md +1 -1
- package/TOOLS.md +20 -14
- package/dist/index.js +1289 -485
- package/dist/index.js.map +1 -1
- package/dist/tools-manifest.json +95 -76
- package/package.json +1 -1
- package/scripts/claudemd-snippet.md +7 -7
- package/scripts/install-skills.sh +2 -2
- package/skills/upg/SKILL.md +41 -41
- package/skills/{upg-gaps → upg-check-gaps}/SKILL.md +40 -43
- package/skills/{upg-schema-health → upg-check-schema}/SKILL.md +7 -7
- package/skills/{upg-schema-evolve → upg-check-schema-coverage}/SKILL.md +12 -12
- package/skills/{upg-schema-edges → upg-check-schema-edges}/SKILL.md +3 -3
- package/skills/{upg-schema-consolidate → upg-check-schema-merge}/SKILL.md +5 -5
- package/skills/upg-context/SKILL.md +96 -72
- package/skills/upg-context-intelligence/SKILL.md +23 -27
- package/skills/upg-design-system/SKILL.md +21 -26
- package/skills/{upg-verify → upg-find-untracked}/SKILL.md +7 -12
- package/skills/{upg-rollback → upg-fix-rollback}/SKILL.md +6 -12
- package/skills/{upg-migrate → upg-fix-types}/SKILL.md +5 -9
- package/skills/upg-link/SKILL.md +125 -0
- package/skills/{upg-discover → upg-new-discovery}/SKILL.md +42 -58
- package/skills/{upg-capture → upg-new-from-session}/SKILL.md +13 -15
- package/skills/{upg-template → upg-new-from-template}/SKILL.md +8 -12
- package/skills/{upg-init → upg-new-graph}/SKILL.md +50 -82
- package/skills/{upg-hypothesis → upg-new-hypothesis}/SKILL.md +27 -36
- package/skills/{upg-launch → upg-new-launch}/SKILL-DETAIL.md +36 -92
- package/skills/{upg-launch → upg-new-launch}/SKILL.md +8 -18
- package/skills/{upg-okr → upg-new-okr}/SKILL-DETAIL.md +28 -46
- package/skills/{upg-okr → upg-new-okr}/SKILL.md +3 -3
- package/skills/{upg-persona → upg-new-persona}/SKILL.md +35 -67
- package/skills/{upg-research → upg-new-research}/SKILL.md +25 -33
- package/skills/{upg-schema-update → upg-new-schema-type}/SKILL.md +2 -2
- package/skills/{upg-strategy → upg-new-strategy}/SKILL.md +21 -27
- package/skills/upg-prioritise/SKILL.md +4 -4
- package/skills/upg-reflect/SKILL.md +7 -7
- package/skills/{upg-feedback → upg-send-feedback}/SKILL.md +30 -51
- package/skills/{upg-diff → upg-show-diff}/SKILL.md +6 -12
- package/skills/{upg-inspect → upg-show-entity}/SKILL.md +7 -9
- package/skills/{upg-impact → upg-show-impact}/SKILL.md +11 -15
- package/skills/{upg-journey → upg-show-journey}/SKILL.md +31 -32
- package/skills/{upg-analytics → upg-show-metrics}/SKILL.md +9 -12
- package/skills/{upg-schema-changelog → upg-show-schema-changelog}/SKILL.md +5 -5
- package/skills/{upg-status → upg-show-status}/SKILL.md +39 -40
- package/skills/{upg-tree → upg-show-tree}/SKILL.md +15 -15
- package/skills/{upg-export → upg-sync-export}/SKILL.md +10 -13
- package/skills/{upg-import → upg-sync-import}/SKILL.md +7 -13
- package/skills/{upg-pull → upg-sync-pull}/SKILL-DETAIL.md +13 -17
- package/skills/{upg-pull → upg-sync-pull}/SKILL.md +3 -3
- package/skills/{upg-push → upg-sync-push}/SKILL-DETAIL.md +4 -10
- package/skills/{upg-push → upg-sync-push}/SKILL.md +4 -4
- package/skills/{upg-snapshot → upg-sync-snapshot}/SKILL.md +2 -6
- package/skills/upg-trace/SKILL.md +7 -7
- package/skills/{upg-workspace → upg-use-workspace}/SKILL.md +8 -14
- package/skills/{upg-run → upg-walk-playbook}/SKILL.md +14 -14
- package/skills/upg-walk-region/SKILL-DETAIL.md +320 -0
- package/skills/upg-walk-region/SKILL.md +89 -0
- package/skills/upg-connect/SKILL.md +0 -167
- package/skills/upg-explore/SKILL-DETAIL.md +0 -481
- 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
|
-
|