@unified-product-graph/mcp-server 0.7.1 → 0.7.3
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/TOOLS.md +11 -11
- package/dist/index.js +930 -911
- package/dist/index.js.map +1 -1
- package/dist/preflight.js +1 -1
- package/dist/preflight.js.map +1 -1
- package/dist/tools-manifest.json +11 -11
- package/package.json +1 -1
- package/skills/upg/SKILL.md +30 -30
- package/skills/upg-analytics/SKILL.md +11 -11
- package/skills/upg-capture/SKILL.md +19 -19
- package/skills/upg-connect/SKILL.md +6 -6
- package/skills/upg-context/SKILL.md +51 -51
- package/skills/upg-context-intelligence/SKILL.md +43 -43
- package/skills/upg-design-system/SKILL.md +21 -21
- package/skills/upg-diff/SKILL.md +12 -12
- package/skills/upg-discover/SKILL.md +10 -10
- package/skills/upg-explore/SKILL-DETAIL.md +9 -9
- package/skills/upg-explore/SKILL.md +14 -14
- package/skills/upg-export/SKILL.md +34 -34
- package/skills/upg-feedback/SKILL.md +17 -17
- package/skills/upg-gaps/SKILL.md +31 -31
- package/skills/upg-hypothesis/SKILL.md +10 -10
- package/skills/upg-impact/SKILL.md +30 -30
- package/skills/upg-import/SKILL.md +14 -14
- package/skills/upg-init/SKILL.md +40 -40
- package/skills/upg-inspect/SKILL.md +9 -9
- package/skills/upg-journey/SKILL.md +21 -21
- package/skills/upg-launch/SKILL-DETAIL.md +71 -71
- package/skills/upg-launch/SKILL.md +16 -16
- package/skills/upg-migrate/SKILL.md +19 -19
- package/skills/upg-okr/SKILL-DETAIL.md +27 -27
- package/skills/upg-okr/SKILL.md +10 -10
- package/skills/upg-persona/SKILL.md +20 -20
- package/skills/upg-prioritise/SKILL.md +19 -19
- package/skills/upg-pull/SKILL-DETAIL.md +21 -21
- package/skills/upg-pull/SKILL.md +5 -5
- package/skills/upg-push/SKILL-DETAIL.md +23 -23
- package/skills/upg-push/SKILL.md +6 -6
- package/skills/upg-reflect/SKILL.md +20 -20
- package/skills/upg-research/SKILL.md +37 -37
- package/skills/upg-rollback/SKILL.md +19 -19
- package/skills/upg-run/SKILL.md +14 -14
- package/skills/upg-schema-changelog/SKILL.md +29 -29
- package/skills/upg-schema-consolidate/SKILL.md +18 -18
- package/skills/upg-schema-edges/SKILL.md +12 -12
- package/skills/upg-schema-evolve/SKILL.md +16 -16
- package/skills/upg-schema-health/SKILL.md +22 -22
- package/skills/upg-schema-update/SKILL.md +24 -24
- package/skills/upg-snapshot/SKILL.md +8 -8
- package/skills/upg-status/SKILL.md +31 -31
- package/skills/upg-strategy/SKILL.md +26 -26
- package/skills/upg-template/SKILL.md +21 -21
- package/skills/upg-trace/SKILL.md +22 -22
- package/skills/upg-tree/SKILL.md +18 -18
- package/skills/upg-verify/SKILL.md +42 -42
- package/skills/upg-workspace/SKILL.md +12 -12
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: upg-schema-consolidate
|
|
3
|
-
description: "Evaluate whether entity types should merge
|
|
3
|
+
description: "Evaluate whether entity types should merge: shared properties, structural analysis, migration path"
|
|
4
4
|
user-invocable: false
|
|
5
5
|
audience: advanced
|
|
6
6
|
argument-hint: "[type_a] [type_b] or [domain]"
|
|
7
7
|
category: schema
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
-
> ⚠️ **Advanced skill
|
|
10
|
+
> ⚠️ **Advanced skill**: intended for UPG contributors and power users who understand the spec internals. Not for general use. Running mutation skills (schema-update, schema-consolidate, schema-evolve) without understanding the cascade can corrupt your graph.
|
|
11
11
|
|
|
12
|
-
# /upg-schema-consolidate
|
|
12
|
+
# /upg-schema-consolidate: Entity Type Consolidation
|
|
13
13
|
|
|
14
|
-
You are a schema analyst. Your job is to evaluate whether two or more entity types should be consolidated into a single type with a discriminator property, or kept separate. You do this through structured analysis
|
|
14
|
+
You are a schema analyst. Your job is to evaluate whether two or more entity types should be consolidated into a single type with a discriminator property, or kept separate. You do this through structured analysis, not gut feeling.
|
|
15
15
|
|
|
16
16
|
**This is an internal development skill for schema governance.**
|
|
17
17
|
|
|
@@ -60,7 +60,7 @@ Overlap: X/Y properties shared (Z%)
|
|
|
60
60
|
|
|
61
61
|
This is the critical test. Check 4 structural dimensions:
|
|
62
62
|
|
|
63
|
-
**2a. Parent types
|
|
63
|
+
**2a. Parent types**: Do they have the same canonical parent?
|
|
64
64
|
```
|
|
65
65
|
Read UPG_VALID_CHILDREN in grammar/hierarchy.ts
|
|
66
66
|
- type_a parent: bounded_context
|
|
@@ -68,7 +68,7 @@ Read UPG_VALID_CHILDREN in grammar/hierarchy.ts
|
|
|
68
68
|
→ DIFFERENT parents = structural divergence
|
|
69
69
|
```
|
|
70
70
|
|
|
71
|
-
**2b. Child types
|
|
71
|
+
**2b. Child types**: Do they have the same children?
|
|
72
72
|
```
|
|
73
73
|
Search UPG_VALID_CHILDREN for entries where value = type_a or type_b
|
|
74
74
|
- type_a children: technical_debt_item
|
|
@@ -76,7 +76,7 @@ Search UPG_VALID_CHILDREN for entries where value = type_a or type_b
|
|
|
76
76
|
→ DIFFERENT children = structural divergence
|
|
77
77
|
```
|
|
78
78
|
|
|
79
|
-
**2c. Edge types
|
|
79
|
+
**2c. Edge types**: Do they participate in the same relationships?
|
|
80
80
|
```
|
|
81
81
|
Search UPG_EDGE_CATALOG in catalog/edge-catalog.ts for both types
|
|
82
82
|
- type_a edges: context_has_decision, decision_has_technical_debt_item
|
|
@@ -84,7 +84,7 @@ Search UPG_EDGE_CATALOG in catalog/edge-catalog.ts for both types
|
|
|
84
84
|
→ DIFFERENT edges = semantic divergence
|
|
85
85
|
```
|
|
86
86
|
|
|
87
|
-
**2d. Domain membership
|
|
87
|
+
**2d. Domain membership**: Are they in the same domain?
|
|
88
88
|
```
|
|
89
89
|
Check registry/domains.ts
|
|
90
90
|
- type_a: engineering
|
|
@@ -102,15 +102,15 @@ Check registry/domains.ts
|
|
|
102
102
|
|
|
103
103
|
Check how each type is used in practice:
|
|
104
104
|
|
|
105
|
-
**3a. Skill references
|
|
105
|
+
**3a. Skill references**: Which skills create/reference each type?
|
|
106
106
|
```
|
|
107
107
|
grep -r "type_a\|type_b" packages/upg-mcp-server/skills/
|
|
108
108
|
```
|
|
109
109
|
|
|
110
|
-
**3b. Lens relevance
|
|
110
|
+
**3b. Lens relevance**: Do they appear in different lenses?
|
|
111
111
|
If type_a is surfaced in the engineering lens and type_b in the design lens, consolidation would muddy lens clarity.
|
|
112
112
|
|
|
113
|
-
**3c. Real-world mental models
|
|
113
|
+
**3c. Real-world mental models**: Would users think of these as "the same thing with a label" or "fundamentally different activities"?
|
|
114
114
|
|
|
115
115
|
This is where you engage the human. Ask:
|
|
116
116
|
|
|
@@ -134,7 +134,7 @@ Usage context: [SAME/DIFFERENT]
|
|
|
134
134
|
Recommendation: [explanation]
|
|
135
135
|
```
|
|
136
136
|
|
|
137
|
-
### Step 5: If Consolidating
|
|
137
|
+
### Step 5: If Consolidating: Migration Design
|
|
138
138
|
|
|
139
139
|
If the decision is to consolidate:
|
|
140
140
|
|
|
@@ -170,7 +170,7 @@ Parent migration:
|
|
|
170
170
|
|
|
171
171
|
**5d. Cascade the change** using `/upg-schema-update`
|
|
172
172
|
|
|
173
|
-
### Step 5 (Alternative): If Keeping Separate
|
|
173
|
+
### Step 5 (Alternative): If Keeping Separate: Document Why
|
|
174
174
|
|
|
175
175
|
If the decision is to keep separate, create a brief decision record:
|
|
176
176
|
|
|
@@ -222,14 +222,14 @@ These consolidations have already happened in UPG and can be referenced as patte
|
|
|
222
222
|
| `risk_item` | `risk` | `risk_domain: 'program'` | 0.1.0 |
|
|
223
223
|
| `architecture_decision`, `design_decision`, `product_decision` | `decision` | `layer: 'engineering' \| 'design' \| 'product'` | 0.2.0 |
|
|
224
224
|
| `jtbd` | `job` | (renamed, no discriminator) | 0.2.0 |
|
|
225
|
-
| `how_might_we` | `design_question` | (renamed
|
|
225
|
+
| `how_might_we` | `design_question` | (renamed; framework-neutral) | 0.2.0 |
|
|
226
226
|
| `sli`, `slo`, `sla` | `service_level_indicator`, `service_level_objective`, `service_level_agreement` | (acronyms expanded) | 0.2.0 |
|
|
227
|
-
| `customer_segment_bm`, `target_customer_segment` | `market_segment` |
|
|
228
|
-
| `channel_bm` | `distribution_channel` |
|
|
227
|
+
| `customer_segment_bm`, `target_customer_segment` | `market_segment` | | 0.2.0 |
|
|
228
|
+
| `channel_bm` | `distribution_channel` | | 0.2.0 |
|
|
229
229
|
| `campaign` | `growth_campaign` | (disambiguated from marketing_campaign_plan) | 0.2.0 |
|
|
230
230
|
| `segment` | `behavioral_segment` | (disambiguated from market_segment) | 0.2.0 |
|
|
231
|
-
| `package` | `pricing_tier` |
|
|
232
|
-
| `internal_doc` | `document` | `document_type
|
|
231
|
+
| `package` | `pricing_tier` | | 0.2.0 |
|
|
232
|
+
| `internal_doc` | `document` | `document_type`; audience=internal | 0.2.0 |
|
|
233
233
|
|
|
234
234
|
## Key Principles
|
|
235
235
|
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: upg-schema-edges
|
|
3
|
-
description: "Edge design advisor
|
|
3
|
+
description: "Edge design advisor: when to add an edge, naming, direction, edge vs hierarchy vs entity"
|
|
4
4
|
user-invocable: false
|
|
5
5
|
audience: advanced
|
|
6
6
|
argument-hint: "[source_type] [target_type] or [relationship description]"
|
|
7
7
|
category: schema
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
-
> ⚠️ **Advanced skill
|
|
10
|
+
> ⚠️ **Advanced skill**: intended for UPG contributors and power users who understand the spec internals. Not for general use. Running mutation skills (schema-update, schema-consolidate, schema-evolve) without understanding the cascade can corrupt your graph.
|
|
11
11
|
|
|
12
|
-
# /upg-schema-edges
|
|
12
|
+
# /upg-schema-edges: Edge Design Advisor
|
|
13
13
|
|
|
14
|
-
You are an edge design advisor. Your job is to help decide whether a relationship between entities should be an edge, a parent-child hierarchy link, or a relationship entity
|
|
14
|
+
You are an edge design advisor. Your job is to help decide whether a relationship between entities should be an edge, a parent-child hierarchy link, or a relationship entity, and if it's an edge, how to name and direct it.
|
|
15
15
|
|
|
16
16
|
**This is an internal development skill for schema governance.**
|
|
17
17
|
|
|
@@ -34,7 +34,7 @@ Every relationship between entities in UPG can be expressed as one of three thin
|
|
|
34
34
|
**When to use:**
|
|
35
35
|
- The child is a **component** of the parent (journey_step inside user_journey)
|
|
36
36
|
- The child is a **decomposition** of the parent (epic inside feature)
|
|
37
|
-
- The child's **lifecycle** is bound to the parent
|
|
37
|
+
- The child's **lifecycle** is bound to the parent; delete the parent, delete the children
|
|
38
38
|
- There's a clear **containment** relationship (acceptance_criterion inside user_story)
|
|
39
39
|
|
|
40
40
|
**Test:** "Would you delete all [children] if you deleted the [parent]?"
|
|
@@ -53,10 +53,10 @@ Every relationship between entities in UPG can be expressed as one of three thin
|
|
|
53
53
|
**What it is:** A semantic relationship between two independent entities. Defined in `UPG_EDGE_CATALOG` (in `catalog/edge-catalog.ts`). Both entities can exist without the other.
|
|
54
54
|
|
|
55
55
|
**When to use:**
|
|
56
|
-
- The entities are **independent
|
|
56
|
+
- The entities are **independent**: either can exist alone
|
|
57
57
|
- The relationship is **cross-domain** (design → engineering)
|
|
58
58
|
- There are **multiple valid** relationships between the same pair (a service can both `powers` and `has_technical_debt`)
|
|
59
|
-
- The relationship is **discovery-dependent
|
|
59
|
+
- The relationship is **discovery-dependent**: you might not know it exists when entities are first created
|
|
60
60
|
|
|
61
61
|
**Test:** "Can [source] and [target] each exist meaningfully on their own?"
|
|
62
62
|
- Yes → edge
|
|
@@ -129,7 +129,7 @@ The source entity is the actor, the target is the receiver:
|
|
|
129
129
|
```
|
|
130
130
|
✅ debt_blocks_feature (debt is blocking the feature)
|
|
131
131
|
✅ fix_resolved_bug (fix resolved the bug)
|
|
132
|
-
❌ feature_blocked_by_debt (inverted
|
|
132
|
+
❌ feature_blocked_by_debt (inverted; make debt the source)
|
|
133
133
|
```
|
|
134
134
|
|
|
135
135
|
**Rule 3: Specific over generic**
|
|
@@ -203,8 +203,8 @@ grep "SOURCE_.*_TARGET" packages/upg-spec/src/catalog/edge-catalog.ts
|
|
|
203
203
|
|
|
204
204
|
**If a pair already has an edge**, consider whether you need a second edge or if the existing one covers your semantics. Two edges between the same pair should represent genuinely different relationships:
|
|
205
205
|
```
|
|
206
|
-
✅ service:feature has both 'service_powers_feature' AND 'service_has_feature'
|
|
207
|
-
❌ service:feature having 'service_connects_to_feature' AND 'service_links_to_feature'
|
|
206
|
+
✅ service:feature has both 'service_powers_feature' AND 'service_has_feature'; different semantics
|
|
207
|
+
❌ service:feature having 'service_connects_to_feature' AND 'service_links_to_feature'; same thing
|
|
208
208
|
```
|
|
209
209
|
|
|
210
210
|
## Edge Map Hygiene Audit
|
|
@@ -234,7 +234,7 @@ DUPLICATE SEMANTICS
|
|
|
234
234
|
```
|
|
235
235
|
|
|
236
236
|
### Check 3: Missing Reverse Lookups
|
|
237
|
-
Important edges that only go one direction but should be queryable both ways. Not proposing reverse edges
|
|
237
|
+
Important edges that only go one direction but should be queryable both ways. Not proposing reverse edges; just flagging that queries might need to follow edges backwards:
|
|
238
238
|
```
|
|
239
239
|
ONE-WAY EDGES (consider if reverse queries are needed)
|
|
240
240
|
| Edge | Direction | Reverse query use case |
|
|
@@ -279,7 +279,7 @@ Value: { source_type: '[source_type]', target_type: '[target_type]', description
|
|
|
279
279
|
|
|
280
280
|
- **Hierarchy is structural, edges are semantic.** Parent-child says "X contains Y." Edges say "X relates to Y in this specific way."
|
|
281
281
|
- **When in doubt, prefer an edge.** Hierarchy is harder to change later. Edges can be added and removed without restructuring the graph.
|
|
282
|
-
- **800+ edges is fine if each is distinct.** The problem isn't quantity
|
|
282
|
+
- **800+ edges is fine if each is distinct.** The problem isn't quantity; it's duplicates, orphans, and vague naming.
|
|
283
283
|
- **Direction matters for queries.** Think about how users will traverse: "show me what blocks this feature" requires debt → feature, not feature → debt.
|
|
284
284
|
- **Edges are cheap, relationship entities are expensive.** Only create a relationship entity when the relationship itself has a lifecycle and multiple properties.
|
|
285
285
|
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: upg-schema-evolve
|
|
3
|
-
description: "Domain deep-dive
|
|
3
|
+
description: "Domain deep-dive: audit entity coverage, surface gaps, design new types from real needs"
|
|
4
4
|
user-invocable: false
|
|
5
5
|
audience: advanced
|
|
6
6
|
argument-hint: "[domain] or [feedback/requirement description]"
|
|
7
7
|
category: schema
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
-
> ⚠️ **Advanced skill
|
|
10
|
+
> ⚠️ **Advanced skill**: intended for UPG contributors and power users who understand the spec internals. Not for general use. Running mutation skills (schema-update, schema-consolidate, schema-evolve) without understanding the cascade can corrupt your graph.
|
|
11
11
|
|
|
12
|
-
# /upg-schema-evolve
|
|
12
|
+
# /upg-schema-evolve: Schema Evolution Through Domain Analysis
|
|
13
13
|
|
|
14
|
-
You are a schema evolution advisor. Your job is to help the UPG schema grow thoughtfully
|
|
14
|
+
You are a schema evolution advisor. Your job is to help the UPG schema grow thoughtfully, not by adding types speculatively, but by analysing real domains, real user feedback, and real cross-domain requirements to determine what's genuinely missing.
|
|
15
15
|
|
|
16
16
|
**This is an internal development skill for schema governance.**
|
|
17
17
|
|
|
@@ -21,7 +21,7 @@ You are a schema evolution advisor. Your job is to help the UPG schema grow thou
|
|
|
21
21
|
- User feedback reveals a concept that doesn't map to any existing type
|
|
22
22
|
- A new use case surfaces that existing types can't model
|
|
23
23
|
- Cross-domain requirements emerge (e.g., "design handoff to engineering needs a bridge entity")
|
|
24
|
-
- Before a batch of new types
|
|
24
|
+
- Before a batch of new types; to think first, add second
|
|
25
25
|
|
|
26
26
|
## Input Modes
|
|
27
27
|
|
|
@@ -79,8 +79,8 @@ Map the domain against the real-world activities it should support. Use industry
|
|
|
79
79
|
- Testing (→ qa_testing domain)
|
|
80
80
|
- Security (→ security domain)
|
|
81
81
|
- Observability & monitoring (→ devops domain)
|
|
82
|
-
- Performance (?
|
|
83
|
-
- Documentation (?
|
|
82
|
+
- Performance (? gap?)
|
|
83
|
+
- Documentation (? partial, documentation_template in content domain)
|
|
84
84
|
|
|
85
85
|
**Design domain reference activities:**
|
|
86
86
|
- User research (→ ux_research domain)
|
|
@@ -93,7 +93,7 @@ Map the domain against the real-world activities it should support. Use industry
|
|
|
93
93
|
- Interaction design (interaction_spec ✓)
|
|
94
94
|
- Accessibility (→ accessibility domain)
|
|
95
95
|
- Content design (→ content domain)
|
|
96
|
-
- Handoff to engineering (?
|
|
96
|
+
- Handoff to engineering (? gap? screen_implements_feature edge exists but no handoff entity)
|
|
97
97
|
|
|
98
98
|
Present gaps as opportunities:
|
|
99
99
|
|
|
@@ -125,7 +125,7 @@ Option A: New type `performance_benchmark`
|
|
|
125
125
|
+ Has unique properties (target_metric, current_value, threshold)
|
|
126
126
|
+ Would parent to service or api_endpoint
|
|
127
127
|
+ Edge: benchmark_measures_endpoint
|
|
128
|
-
- Only 1-2 instances per service
|
|
128
|
+
- Only 1-2 instances per service; low cardinality
|
|
129
129
|
- Overlaps with `metric` (which already has value tracking)
|
|
130
130
|
|
|
131
131
|
Option B: Use `metric` with tag `performance`
|
|
@@ -171,7 +171,7 @@ MISSING BRIDGES
|
|
|
171
171
|
|
|
172
172
|
### 2c. Bridging Entity Candidates
|
|
173
173
|
|
|
174
|
-
Sometimes the gap isn't an edge
|
|
174
|
+
Sometimes the gap isn't an edge; it's a missing entity that lives at the boundary:
|
|
175
175
|
|
|
176
176
|
```
|
|
177
177
|
BOUNDARY ENTITY CANDIDATES
|
|
@@ -228,10 +228,10 @@ Options:
|
|
|
228
228
|
B) Edge with properties: team_adopts_design_system (with adoption_rate on the edge)
|
|
229
229
|
C) Use metric type with tags: metric { tags: ['adoption'], linked to team + design_system }
|
|
230
230
|
|
|
231
|
-
→ RECOMMENDATION: Option C
|
|
231
|
+
→ RECOMMENDATION: Option C; adoption is a measurement, not a thing. Use metric.
|
|
232
232
|
```
|
|
233
233
|
|
|
234
|
-
### 3b. If New Type Needed
|
|
234
|
+
### 3b. If New Type Needed: Design It
|
|
235
235
|
|
|
236
236
|
Follow this template:
|
|
237
237
|
|
|
@@ -257,14 +257,14 @@ Lens relevance: Engineering (primary), DevOps (secondary)
|
|
|
257
257
|
Skill: Would be created by `/upg-explore engineering` (or a new `/upg-explore performance` playbook if the domain emerges as separate).
|
|
258
258
|
|
|
259
259
|
Similar existing types:
|
|
260
|
-
- metric
|
|
261
|
-
- service_level_indicator / service_level_objective
|
|
260
|
+
- metric: but lacks SLA/threshold semantics
|
|
261
|
+
- service_level_indicator / service_level_objective: in DevOps domain, more operational than development-focused
|
|
262
262
|
|
|
263
263
|
Decision: [ADD / DEFER / USE EXISTING]
|
|
264
264
|
Reason: [why]
|
|
265
265
|
```
|
|
266
266
|
|
|
267
|
-
### 3c. Before Adding
|
|
267
|
+
### 3c. Before Adding: Consolidation Check
|
|
268
268
|
|
|
269
269
|
Before approving any new type, run a quick consolidation check:
|
|
270
270
|
|
|
@@ -294,7 +294,7 @@ EVOLUTION SUMMARY
|
|
|
294
294
|
✅ Covered by existing schema: [list]
|
|
295
295
|
🆕 New types recommended: [list with reasons]
|
|
296
296
|
🔗 New edges recommended: [list]
|
|
297
|
-
🔀 Consolidation candidates: [list
|
|
297
|
+
🔀 Consolidation candidates: [list; run /upg-schema-consolidate]
|
|
298
298
|
⏸️ Deferred: [list with revisit conditions]
|
|
299
299
|
|
|
300
300
|
Next: /upg-schema-update [type] to implement approved additions
|
|
@@ -1,27 +1,27 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: upg-schema-health
|
|
3
|
-
description: "Schema usage audit
|
|
3
|
+
description: "Schema usage audit: dead types, empty properties, orphan patterns, real vs theoretical"
|
|
4
4
|
user-invocable: false
|
|
5
5
|
audience: advanced
|
|
6
6
|
argument-hint: "[path to .upg file] or [domain]"
|
|
7
7
|
category: schema
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
-
> ⚠️ **Advanced skill
|
|
10
|
+
> ⚠️ **Advanced skill**: intended for UPG contributors and power users who understand the spec internals. Not for general use. Running mutation skills (schema-update, schema-consolidate, schema-evolve) without understanding the cascade can corrupt your graph.
|
|
11
11
|
|
|
12
|
-
# /upg-schema-health
|
|
12
|
+
# /upg-schema-health: Schema Usage Audit
|
|
13
13
|
|
|
14
|
-
You are a schema health auditor. Your job is to compare what the UPG schema defines against what real graphs actually contain
|
|
14
|
+
You are a schema health auditor. Your job is to compare what the UPG schema defines against what real graphs actually contain; surfacing dead types, empty properties, unused edges, and patterns the schema didn't anticipate.
|
|
15
15
|
|
|
16
16
|
**This is the feedback loop for schema governance.** Without it, we add types speculatively and never learn if they were right.
|
|
17
17
|
|
|
18
18
|
## When to Use
|
|
19
19
|
|
|
20
|
-
- After adding new entity types
|
|
21
|
-
- Before a major schema evolution
|
|
22
|
-
- When a user reports confusion
|
|
23
|
-
- Periodically (quarterly)
|
|
24
|
-
- When onboarding a new domain (e.g., Felix bringing engineering)
|
|
20
|
+
- After adding new entity types; are they being used?
|
|
21
|
+
- Before a major schema evolution; what's dead weight?
|
|
22
|
+
- When a user reports confusion; is the schema matching their mental model?
|
|
23
|
+
- Periodically (quarterly): schema hygiene check
|
|
24
|
+
- When onboarding a new domain (e.g., Felix bringing engineering); what does their graph actually contain?
|
|
25
25
|
|
|
26
26
|
## Input Modes
|
|
27
27
|
|
|
@@ -102,10 +102,10 @@ Design (22 of 22 unused):
|
|
|
102
102
|
```
|
|
103
103
|
|
|
104
104
|
**Classify each dead type:**
|
|
105
|
-
- **Too new
|
|
106
|
-
- **Too specialised
|
|
107
|
-
- **Wrong abstraction
|
|
108
|
-
- **Genuinely unnecessary
|
|
105
|
+
- **Too new**: added recently, hasn't had time to be used (check `since` in entity-meta)
|
|
106
|
+
- **Too specialised**: only relevant at scale-up/enterprise tier (check tier classification)
|
|
107
|
+
- **Wrong abstraction**: the concept exists in the user's world but the type doesn't match their mental model
|
|
108
|
+
- **Genuinely unnecessary**: deprecation candidate
|
|
109
109
|
|
|
110
110
|
### 2c. Surprise Types
|
|
111
111
|
|
|
@@ -120,7 +120,7 @@ SURPRISE TYPES (in graph but not in schema)
|
|
|
120
120
|
| "tech_spike" | 2 | upg-capture | → Candidate for new type? Or map to 'investigation'? |
|
|
121
121
|
```
|
|
122
122
|
|
|
123
|
-
These are gold
|
|
123
|
+
These are gold; they tell you what users actually need that the schema doesn't provide.
|
|
124
124
|
|
|
125
125
|
## Phase 3: Property Usage Analysis
|
|
126
126
|
|
|
@@ -138,7 +138,7 @@ PROPERTY FILL RATES
|
|
|
138
138
|
| service | 3 | 2/8 (25%) | tech_stack, repo_url, ci_status, health_check, team_owner, status |
|
|
139
139
|
```
|
|
140
140
|
|
|
141
|
-
**Flag types with <30% fill rate
|
|
141
|
+
**Flag types with <30% fill rate**: the properties might be:
|
|
142
142
|
- Too granular for the user's stage
|
|
143
143
|
- Named confusingly (user doesn't recognise the field)
|
|
144
144
|
- Better suited as optional future enrichment than required at creation
|
|
@@ -157,7 +157,7 @@ UNSCHEMATISED PROPERTIES
|
|
|
157
157
|
| persona | "company_size" | 3 | "startup", "enterprise" |
|
|
158
158
|
```
|
|
159
159
|
|
|
160
|
-
These are candidates for adding to the property interfaces
|
|
160
|
+
These are candidates for adding to the property interfaces; the user is already using them.
|
|
161
161
|
|
|
162
162
|
## Phase 4: Edge Usage Analysis
|
|
163
163
|
|
|
@@ -208,7 +208,7 @@ ORPHAN ANALYSIS
|
|
|
208
208
|
|------|-------|----------|-------------|---------|
|
|
209
209
|
| feature | 12 | 2 | 17% | 🟡 2 features with no parent or children |
|
|
210
210
|
| hypothesis | 8 | 5 | 63% | 🔴 Most hypotheses disconnected |
|
|
211
|
-
| task | 6 | 6 | 100% | 🔴 All tasks are orphans
|
|
211
|
+
| task | 6 | 6 | 100% | 🔴 All tasks are orphans; wrong parent? |
|
|
212
212
|
```
|
|
213
213
|
|
|
214
214
|
**High orphan rates suggest:**
|
|
@@ -252,9 +252,9 @@ Graph: [name] · [N] nodes · [M] edges · [T] types used
|
|
|
252
252
|
- [list things that need fixing]
|
|
253
253
|
|
|
254
254
|
RECOMMENDATIONS:
|
|
255
|
-
1. [Most impactful action]
|
|
256
|
-
2. [Second action]
|
|
257
|
-
3. [Third action]
|
|
255
|
+
1. [Most impactful action]; /upg-schema-evolve [domain]
|
|
256
|
+
2. [Second action]; /upg-schema-consolidate [types]
|
|
257
|
+
3. [Third action]; consider deprecating [types]
|
|
258
258
|
|
|
259
259
|
DEAD TYPE CANDIDATES FOR DEPRECATION:
|
|
260
260
|
- [types with 0 usage across all audited graphs AND >6 months old]
|
|
@@ -268,9 +268,9 @@ SURPRISE TYPES TO INVESTIGATE:
|
|
|
268
268
|
|
|
269
269
|
## Key Principles
|
|
270
270
|
|
|
271
|
-
- **Real data over theory.** A type with 0 instances isn't wrong
|
|
271
|
+
- **Real data over theory.** A type with 0 instances isn't wrong; it might be too new, too specialised, or genuinely unnecessary. The data tells you which.
|
|
272
272
|
- **Surprise types are the most valuable signal.** When users create types the schema doesn't have, that's direct feedback on what's missing.
|
|
273
|
-
- **Property fill rates reveal UX problems.** A 25% fill rate doesn't mean the properties are wrong
|
|
273
|
+
- **Property fill rates reveal UX problems.** A 25% fill rate doesn't mean the properties are wrong; it might mean the creation skill doesn't ask for them.
|
|
274
274
|
- **Orphan rate reveals hierarchy problems.** 100% orphan rate on a type means the parent-child model is wrong for how users think about that concept.
|
|
275
275
|
- **Run this before and after schema changes.** The "before" establishes a baseline; the "after" tells you if the change helped.
|
|
276
276
|
- **Cross-graph analysis is more valuable than single-graph.** One graph's habits aren't representative. Compare multiple graphs to separate user preference from schema design issues.
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: upg-schema-update
|
|
3
|
-
description: "Add or update UPG entity types, edge types, or properties
|
|
3
|
+
description: "Add or update UPG entity types, edge types, or properties: cascades through the full codebase"
|
|
4
4
|
user-invocable: false
|
|
5
5
|
audience: advanced
|
|
6
6
|
argument-hint: "[entity type name or description of change]"
|
|
7
7
|
category: schema
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
-
> ⚠️ **Advanced skill
|
|
10
|
+
> ⚠️ **Advanced skill**: intended for UPG contributors and power users who understand the spec internals. Not for general use. Running mutation skills (schema-update, schema-consolidate, schema-evolve) without understanding the cascade can corrupt your graph.
|
|
11
11
|
|
|
12
|
-
# /upg-schema-update
|
|
12
|
+
# /upg-schema-update: UPG Schema Update Cascade
|
|
13
13
|
|
|
14
|
-
You are a schema update operator. When new entity types, edge types, or properties need to be added to the UPG specification, you cascade the change through every registration point in the codebase
|
|
14
|
+
You are a schema update operator. When new entity types, edge types, or properties need to be added to the UPG specification, you cascade the change through every registration point in the codebase; from spec to MCP server to Graph UI to cloud server.
|
|
15
15
|
|
|
16
16
|
**This is an internal development skill, not a user-facing UPG skill.**
|
|
17
17
|
|
|
@@ -38,9 +38,9 @@ The source of truth. All changes start here.
|
|
|
38
38
|
| `registry/domains.ts` | Add to domain's `types` array | Find the domain by `id` in `UPG_DOMAINS`, add to its `types` array |
|
|
39
39
|
| `properties/domains/<domain>.ts` | Add property interface | Create `export interface XxxProperties { ... }` with typed fields. Use existing interfaces as templates. |
|
|
40
40
|
| `catalog/edge-catalog.ts` | Add edge types to `UPG_EDGE_CATALOG` | Format: `edge_name: { source_type, target_type, description, cardinality }`. The `UPG_EDGE_PAIR_MAP` is derived automatically. |
|
|
41
|
-
| `shapes/edges.ts` / `shapes/base-node.ts` | If modifying UPGEdge / UPGBaseNode | Rarely needed
|
|
41
|
+
| `shapes/edges.ts` / `shapes/base-node.ts` | If modifying UPGEdge / UPGBaseNode | Rarely needed; most additions go in catalog and property interfaces |
|
|
42
42
|
|
|
43
|
-
**Verify:** `cd packages/upg-spec && npm run build
|
|
43
|
+
**Verify:** `cd packages/upg-spec && npm run build`; must compile clean.
|
|
44
44
|
|
|
45
45
|
### Layer 2: `upg-mcp-server` (packages/upg-mcp-server/)
|
|
46
46
|
|
|
@@ -48,17 +48,17 @@ The MCP server that reads/writes `.upg` files.
|
|
|
48
48
|
|
|
49
49
|
| What to check | When it matters |
|
|
50
50
|
|---------------|----------------|
|
|
51
|
-
| `src/server.ts
|
|
52
|
-
| `src/lib/tools.ts
|
|
53
|
-
| `skills
|
|
51
|
+
| `src/server.ts`; tool handlers | If new types need special handling in `get_product_context`, `get_graph_digest`, or lens-aware sections |
|
|
52
|
+
| `src/lib/tools.ts`; digest computation | If new types should appear in health metrics |
|
|
53
|
+
| `skills/`; skill markdown files | If any skill references entity types that changed |
|
|
54
54
|
| `src/lib/edge-inference.ts` | If new edge types need inference rules |
|
|
55
55
|
| `src/classification.ts` | If tier classification changes |
|
|
56
56
|
|
|
57
|
-
**Verify:** `cd packages/upg-mcp-server && npm run build
|
|
57
|
+
**Verify:** `cd packages/upg-mcp-server && npm run build`; JS must build (DTS error in preflight.ts is pre-existing, ignore it).
|
|
58
58
|
|
|
59
59
|
### Layer 3: `apps/graph` (apps/graph/src/)
|
|
60
60
|
|
|
61
|
-
The Graph UI. This is the most tedious layer
|
|
61
|
+
The Graph UI. This is the most tedious layer; one monolithic file with ~10 registries that ALL need every type.
|
|
62
62
|
|
|
63
63
|
**Main file:** `apps/graph/src/lib/entity-metadata.ts` (~6300 lines)
|
|
64
64
|
|
|
@@ -91,7 +91,7 @@ The Graph UI. This is the most tedious layer — one monolithic file with ~10 re
|
|
|
91
91
|
2. For each registry, search for that template type and add the new type nearby
|
|
92
92
|
3. Follow alphabetical or domain ordering within each registry
|
|
93
93
|
|
|
94
|
-
**Verify:** `cd apps/graph && npx tsc --noEmit
|
|
94
|
+
**Verify:** `cd apps/graph && npx tsc --noEmit`; the `Record<NodeType, ...>` pattern will catch any missing entries at compile time.
|
|
95
95
|
|
|
96
96
|
### Layer 4: `upg-cloud-server` (packages/upg-cloud-server/)
|
|
97
97
|
|
|
@@ -99,11 +99,11 @@ The cloud API server with PostgreSQL storage.
|
|
|
99
99
|
|
|
100
100
|
| What to check | When it matters |
|
|
101
101
|
|---------------|----------------|
|
|
102
|
-
| `src/store/pg-store.ts
|
|
103
|
-
| `src/store/pg-store.ts
|
|
102
|
+
| `src/store/pg-store.ts`; `rowToEdge()` | If new fields were added to UPGEdge (e.g., `confidence`, `note`); need column or JSONB field |
|
|
103
|
+
| `src/store/pg-store.ts`; `rowToNode()` | If new fields were added to UPGBaseNode |
|
|
104
104
|
| Database migrations | If new columns needed for new edge/node properties |
|
|
105
105
|
|
|
106
|
-
**Usually no changes needed** for additive entity types
|
|
106
|
+
**Usually no changes needed** for additive entity types; the cloud server stores types as strings and properties as JSONB. But check edge/node serialisation if interface shapes changed.
|
|
107
107
|
|
|
108
108
|
### Layer 5: `apps/upg-site` (apps/upg-site/)
|
|
109
109
|
|
|
@@ -115,19 +115,19 @@ The documentation site.
|
|
|
115
115
|
| Sanity CMS content | If framework docs reference entity types |
|
|
116
116
|
| Domain/layer overview pages | If domain composition changed |
|
|
117
117
|
|
|
118
|
-
**Usually deferred
|
|
118
|
+
**Usually deferred**: docs update is a separate task.
|
|
119
119
|
|
|
120
120
|
## Workflow
|
|
121
121
|
|
|
122
122
|
### Step 1: Gather Requirements
|
|
123
123
|
|
|
124
124
|
Ask for or determine:
|
|
125
|
-
- **Entity type name(s)
|
|
126
|
-
- **Domain
|
|
127
|
-
- **Properties
|
|
128
|
-
- **Parent type
|
|
129
|
-
- **Edge types
|
|
130
|
-
- **Display metadata
|
|
125
|
+
- **Entity type name(s)**: snake_case, singular (e.g., `root_cause`)
|
|
126
|
+
- **Domain**: which domain does it belong to? (e.g., `engineering`)
|
|
127
|
+
- **Properties**: what typed fields does it have?
|
|
128
|
+
- **Parent type**: what's its canonical parent in the hierarchy?
|
|
129
|
+
- **Edge types**: what relationships does it have with other types?
|
|
130
|
+
- **Display metadata**: label, plural, icon, description, layer name
|
|
131
131
|
|
|
132
132
|
### Step 2: Execute the Cascade
|
|
133
133
|
|
|
@@ -154,7 +154,7 @@ cd apps/graph && npx tsc --noEmit
|
|
|
154
154
|
cd packages/upg-cloud-server && npm run build
|
|
155
155
|
```
|
|
156
156
|
|
|
157
|
-
**The `Record<NodeType, ...>` pattern in Layer 3 is your best friend
|
|
157
|
+
**The `Record<NodeType, ...>` pattern in Layer 3 is your best friend**: TypeScript will error on every registry that's missing the new type. Let the compiler find what you missed.
|
|
158
158
|
|
|
159
159
|
### Step 4: Commit
|
|
160
160
|
|
|
@@ -176,7 +176,7 @@ Cascade: spec → mcp-server → graph → cloud-server
|
|
|
176
176
|
|
|
177
177
|
- Edges live in `UPG_EDGE_CATALOG` in `catalog/edge-catalog.ts`
|
|
178
178
|
- Format: `edge_name: { source_type, target_type, description, cardinality }`
|
|
179
|
-
- `UPG_EDGE_PAIR_MAP` (`source_type:target_type` → edge key) is derived automatically
|
|
179
|
+
- `UPG_EDGE_PAIR_MAP` (`source_type:target_type` → edge key) is derived automatically; don't edit it
|
|
180
180
|
- Check for duplicates before adding: search for the pair in the catalog
|
|
181
181
|
- Edge names should be verb-based: `causes`, `blocks`, `enables`, `implements`, `specifies`
|
|
182
182
|
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: upg-snapshot
|
|
3
|
-
description: "Save a named checkpoint of your product graph
|
|
3
|
+
description: "Save a named checkpoint of your product graph: version your thinking"
|
|
4
4
|
user-invocable: true
|
|
5
5
|
argument-hint: "[message]"
|
|
6
6
|
category: tooling
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
# /upg-snapshot
|
|
9
|
+
# /upg-snapshot: Version Your Thinking
|
|
10
10
|
|
|
11
|
-
You are a Unified Product Graph versioning tool. Your job is to save a named checkpoint of the product graph
|
|
11
|
+
You are a Unified Product Graph versioning tool. Your job is to save a named checkpoint of the product graph; a git commit plus version metadata in the .upg file. Fast, no questions beyond the message.
|
|
12
12
|
|
|
13
13
|
**Before producing any output, read the design system:** /upg-context for emoji mappings, formatting rules, and shared interaction patterns.
|
|
14
14
|
|
|
@@ -77,7 +77,7 @@ If git fails (not a repo, nothing to commit), report the error briefly and still
|
|
|
77
77
|
Show confirmation using this exact format:
|
|
78
78
|
|
|
79
79
|
```
|
|
80
|
-
<checkmark> Snapshot saved
|
|
80
|
+
<checkmark> Snapshot saved; version <N>: "<message>"
|
|
81
81
|
<node_count> entities · <edge_count> edges
|
|
82
82
|
|
|
83
83
|
Rollback: git checkout HEAD~1 -- <filename>.upg
|
|
@@ -88,7 +88,7 @@ Use the checkmark symbol, entity/edge counts from Step 1, and the actual .upg fi
|
|
|
88
88
|
## Example Output
|
|
89
89
|
|
|
90
90
|
```
|
|
91
|
-
✓ Snapshot saved
|
|
91
|
+
✓ Snapshot saved; version 5: "Added pricing strategy"
|
|
92
92
|
47 entities · 38 edges
|
|
93
93
|
|
|
94
94
|
Rollback: git checkout HEAD~1 -- product.upg
|
|
@@ -98,11 +98,11 @@ Rollback: git checkout HEAD~1 -- product.upg
|
|
|
98
98
|
|
|
99
99
|
- **Fast.** No preamble, no dashboard, no health check. ~10 seconds.
|
|
100
100
|
- **One question max.** Only ask for the message if not provided.
|
|
101
|
-
- **Git-native.** The .upg file is diffable
|
|
101
|
+
- **Git-native.** The .upg file is diffable; git is the version history.
|
|
102
102
|
- **Silent on success.** Don't explain what versioning is. Just confirm.
|
|
103
103
|
- **Graceful on failure.** If git isn't available, still patch the version and say so.
|
|
104
|
-
- **No graph entity mutations.** This skill versions the file
|
|
104
|
+
- **No graph entity mutations.** This skill versions the file; it does not create or modify graph entities.
|
|
105
105
|
|
|
106
106
|
┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
|
|
107
|
-
Your `.upg` file is yours
|
|
107
|
+
Your `.upg` file is yours: open standard, portable, git-friendly.
|
|
108
108
|
unifiedproductgraph.org
|