@unified-product-graph/core 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +699 -0
- package/LICENSE +21 -0
- package/README.md +59 -0
- package/dist/index.cjs +23719 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +20001 -0
- package/dist/index.d.ts +20001 -0
- package/dist/index.js +23527 -0
- package/dist/index.js.map +1 -0
- package/package.json +54 -0
- package/spec/UPG-MARKDOWN-v0.1.md +437 -0
- package/spec/examples/cms-field-guide.upg +290 -0
- package/spec/examples/enterprise-pilot-results.upg.md +107 -0
- package/spec/examples/enterprise-pilot.upg +375 -0
- package/spec/examples/feature-decision.upg.md +61 -0
- package/spec/examples/metric-tracking.upg.md +75 -0
- package/spec/examples/persona-minimal.upg.md +22 -0
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
{
|
|
2
|
+
"upg_version": "0.4.0",
|
|
3
|
+
"exported_at": "2026-05-11T17:00:00Z",
|
|
4
|
+
"source": {
|
|
5
|
+
"tool": "upg-spec",
|
|
6
|
+
"tool_version": "0.4.0",
|
|
7
|
+
"workspace_id": "spec_examples"
|
|
8
|
+
},
|
|
9
|
+
"product": {
|
|
10
|
+
"id": "cms-field-guide",
|
|
11
|
+
"title": "CMS Editor Paradigms — A Studio PM Field Guide",
|
|
12
|
+
"description": "Proof-of-spec fixture for the classification model. Models the CMS Field Editor Guide end-to-end using only canonical UPG entities: a single competitive_analysis dimensioned by two classification_axis children, with five classification_value children per axis, two exemplar competitor nodes classified against axis values, three empty_cells covering all rationale_kind values, and a persona with an anti_fit_for edge.",
|
|
13
|
+
"stage": "mvp"
|
|
14
|
+
},
|
|
15
|
+
"nodes": [
|
|
16
|
+
{
|
|
17
|
+
"id": "comp-analysis-cms",
|
|
18
|
+
"type": "competitive_analysis",
|
|
19
|
+
"title": "CMS Field Editor Guide",
|
|
20
|
+
"description": "Two-axis paradigm matrix: CMS Architecture × Editing Paradigm.",
|
|
21
|
+
"properties": {
|
|
22
|
+
"analysis_type": "positioning",
|
|
23
|
+
"analysis_date": "2026-05-11",
|
|
24
|
+
"empty_cells": [
|
|
25
|
+
{
|
|
26
|
+
"axis_a_value_ref": "val-composable",
|
|
27
|
+
"axis_b_value_ref": "val-wysiwyg",
|
|
28
|
+
"rationale_kind": "structural",
|
|
29
|
+
"rationale_md": "Composable rejects HTML blobs; WYSIWYG requires them. The two paradigms are structurally incompatible — you can't simultaneously commit to a typed content graph and to a free-form HTML editor."
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"axis_a_value_ref": "val-git-based",
|
|
33
|
+
"axis_b_value_ref": "val-portable-text",
|
|
34
|
+
"rationale_kind": "opportunity",
|
|
35
|
+
"rationale_md": "No technical reason — only adoption inertia. Watching brief: anyone shipping a starter that drops .md into Portable Text JSON could change the row."
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"axis_a_value_ref": "val-monolithic",
|
|
39
|
+
"axis_b_value_ref": "val-portable-text",
|
|
40
|
+
"rationale_kind": "ideological",
|
|
41
|
+
"rationale_md": "Monolithic CMSs treat content as page-bound HTML. Portable Text's structured-block model contradicts the page-as-unit assumption that monolithic vendors compete on."
|
|
42
|
+
}
|
|
43
|
+
]
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
|
|
47
|
+
{
|
|
48
|
+
"id": "axis-architecture",
|
|
49
|
+
"type": "classification_axis",
|
|
50
|
+
"title": "CMS Architecture",
|
|
51
|
+
"description": "Axis 1: the structural shape of the content system.",
|
|
52
|
+
"parent_id": "comp-analysis-cms",
|
|
53
|
+
"properties": {
|
|
54
|
+
"axis_kind": "categorical"
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"id": "axis-editing",
|
|
59
|
+
"type": "classification_axis",
|
|
60
|
+
"title": "Editing Paradigm",
|
|
61
|
+
"description": "Axis 2: the interaction model offered to content editors.",
|
|
62
|
+
"parent_id": "comp-analysis-cms",
|
|
63
|
+
"properties": {
|
|
64
|
+
"axis_kind": "categorical"
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
|
|
68
|
+
{
|
|
69
|
+
"id": "val-composable",
|
|
70
|
+
"type": "classification_value",
|
|
71
|
+
"title": "Composable Structured-Content",
|
|
72
|
+
"description": "Headless + typed content graph + real-time backend + embeddable studio.",
|
|
73
|
+
"parent_id": "axis-architecture",
|
|
74
|
+
"properties": {
|
|
75
|
+
"rationale": "Composable extends headless with three load-bearing commitments. Remove any one and you have headless, not composable.",
|
|
76
|
+
"exemplars": ["Sanity", "Contentful", "Hygraph"],
|
|
77
|
+
"commitments": [
|
|
78
|
+
{
|
|
79
|
+
"name": "Typed content graph",
|
|
80
|
+
"description": "Schemas in code; references as edges; content is structured data, not HTML blobs."
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"name": "Real-time backend",
|
|
84
|
+
"description": "Live queries, CRDT collaboration, sub-second propagation."
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"name": "Embeddable studio",
|
|
88
|
+
"description": "Editor is a library hosted inside the team's app, not an external SaaS portal."
|
|
89
|
+
}
|
|
90
|
+
],
|
|
91
|
+
"capabilities": [
|
|
92
|
+
{ "surface": "delivery", "bullets": ["GROQ projection-first queries", "Generated GraphQL", "REST patch-based mutations", "Live Content API push subscriptions", "Asset CDN with URL transforms", "Edge-cached reads"] },
|
|
93
|
+
{ "surface": "extensibility", "bullets": ["Custom input components", "Studio plugins", "Action hooks", "Reference filters"] },
|
|
94
|
+
{ "surface": "collaboration", "bullets": ["CRDT multiplayer", "Presence", "Inline comments", "Workflow states"] },
|
|
95
|
+
{ "surface": "preview", "bullets": ["Visual editing overlays", "Click-to-edit deep links", "Branch-aware preview"] },
|
|
96
|
+
{ "surface": "localization", "bullets": ["Document-level translations", "Field-level translations", "Releases (scheduled atomic publishes)"] },
|
|
97
|
+
{ "surface": "developer_experience", "bullets": ["Schema-as-code", "Typegen from schemas", "Cli-first project setup"] }
|
|
98
|
+
]
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"id": "val-headless",
|
|
103
|
+
"type": "classification_value",
|
|
104
|
+
"title": "Headless API-First",
|
|
105
|
+
"description": "Decouples content storage from presentation; serves content via an API.",
|
|
106
|
+
"parent_id": "axis-architecture",
|
|
107
|
+
"properties": {
|
|
108
|
+
"rationale": "Headless without the composable extensions — APIs over content but no typed graph guarantee, often without real-time, often with hosted-only editor.",
|
|
109
|
+
"exemplars": ["Contentstack", "Storyblok", "Strapi"],
|
|
110
|
+
"commitments": [
|
|
111
|
+
{ "name": "API-only delivery", "description": "No coupled rendering layer; consumers pull content via REST/GraphQL." },
|
|
112
|
+
{ "name": "Hosted editor", "description": "Studio is the vendor's SaaS surface, not an embeddable library." }
|
|
113
|
+
],
|
|
114
|
+
"capabilities": [
|
|
115
|
+
{ "surface": "delivery", "bullets": ["REST", "GraphQL", "Webhook events"] },
|
|
116
|
+
{ "surface": "developer_experience", "bullets": ["SDKs per language", "Web UI for schema authoring"] }
|
|
117
|
+
]
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
"id": "val-hybrid",
|
|
122
|
+
"type": "classification_value",
|
|
123
|
+
"title": "Hybrid Architecture (DXP-flavored)",
|
|
124
|
+
"description": "API delivery plus optional coupled rendering; vendor-managed personalization layer.",
|
|
125
|
+
"parent_id": "axis-architecture",
|
|
126
|
+
"properties": {
|
|
127
|
+
"rationale": "Splits the difference between headless and monolithic — typically enterprise DXP vendors layering API delivery on top of their incumbent page-bound stack.",
|
|
128
|
+
"exemplars": ["Optimizely", "Sitecore XM Cloud"]
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
"id": "val-monolithic",
|
|
133
|
+
"type": "classification_value",
|
|
134
|
+
"title": "Monolithic Coupled",
|
|
135
|
+
"description": "Content authoring, storage, and presentation live in one runtime.",
|
|
136
|
+
"parent_id": "axis-architecture",
|
|
137
|
+
"properties": {
|
|
138
|
+
"rationale": "The legacy CMS shape: WordPress, Drupal, Joomla. One stack owns everything from DB to theme.",
|
|
139
|
+
"exemplars": ["WordPress", "Drupal"]
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
"id": "val-git-based",
|
|
144
|
+
"type": "classification_value",
|
|
145
|
+
"title": "Git-Based Repo-as-Database",
|
|
146
|
+
"description": "Content lives in a git repository as flat files; the repo is the source of truth.",
|
|
147
|
+
"parent_id": "axis-architecture",
|
|
148
|
+
"properties": {
|
|
149
|
+
"rationale": "Treats content edits as commits. Optimizes for developer audit, branching, and code-style review at the cost of editor ergonomics.",
|
|
150
|
+
"exemplars": ["Keystatic", "TinaCMS", "Decap CMS"]
|
|
151
|
+
}
|
|
152
|
+
},
|
|
153
|
+
|
|
154
|
+
{
|
|
155
|
+
"id": "val-wysiwyg",
|
|
156
|
+
"type": "classification_value",
|
|
157
|
+
"title": "WYSIWYG Page-Document Editors",
|
|
158
|
+
"description": "Editors manipulate a rendered page directly; output is HTML.",
|
|
159
|
+
"parent_id": "axis-editing",
|
|
160
|
+
"properties": {
|
|
161
|
+
"rationale": "Optimizes for marketing-team self-service; ships HTML as the source of truth.",
|
|
162
|
+
"exemplars": ["WordPress Classic Editor"]
|
|
163
|
+
}
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
"id": "val-block",
|
|
167
|
+
"type": "classification_value",
|
|
168
|
+
"title": "Block-Based Editors",
|
|
169
|
+
"description": "Pages composed from discrete blocks; each block is structured but pages remain page-shaped.",
|
|
170
|
+
"parent_id": "axis-editing",
|
|
171
|
+
"properties": {
|
|
172
|
+
"rationale": "Bridges WYSIWYG and structured editing. Each block has a typed schema but the assembly is still a page.",
|
|
173
|
+
"exemplars": ["WordPress Gutenberg", "Notion"]
|
|
174
|
+
}
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
"id": "val-form",
|
|
178
|
+
"type": "classification_value",
|
|
179
|
+
"title": "Form-Based Structured Editors",
|
|
180
|
+
"description": "Schema-driven forms; editors fill typed fields, never see rendered output inline.",
|
|
181
|
+
"parent_id": "axis-editing",
|
|
182
|
+
"properties": {
|
|
183
|
+
"rationale": "Trades preview fidelity for structure guarantees. The form is the source of truth; preview is downstream.",
|
|
184
|
+
"exemplars": ["Strapi", "Contentful classic"]
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
"id": "val-portable-text",
|
|
189
|
+
"type": "classification_value",
|
|
190
|
+
"title": "Structured Content + Portable Text",
|
|
191
|
+
"description": "Long-form content as a typed array of typed blocks; rich text without HTML.",
|
|
192
|
+
"parent_id": "axis-editing",
|
|
193
|
+
"properties": {
|
|
194
|
+
"rationale": "Sanity's signature shape — long-form authoring without surrendering type guarantees. Each paragraph/heading/quote is a typed block; embedded references are first-class.",
|
|
195
|
+
"exemplars": ["Sanity Studio"],
|
|
196
|
+
"commitments": [
|
|
197
|
+
{ "name": "Typed blocks", "description": "Every paragraph, heading, list, quote is a typed JSON block with stable schema." },
|
|
198
|
+
{ "name": "References as blocks", "description": "Embedded entities (images, products, callouts) are typed references, not HTML." }
|
|
199
|
+
],
|
|
200
|
+
"capabilities": [
|
|
201
|
+
{ "surface": "extensibility", "bullets": ["Custom block types", "Custom marks", "Custom annotations"] },
|
|
202
|
+
{ "surface": "preview", "bullets": ["Schema-aware Portable Text renderer per platform"] }
|
|
203
|
+
]
|
|
204
|
+
}
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
"id": "val-visual-builder",
|
|
208
|
+
"type": "classification_value",
|
|
209
|
+
"title": "Visual Page-Builder",
|
|
210
|
+
"description": "Drag-and-drop page assembly with live rendered canvas.",
|
|
211
|
+
"parent_id": "axis-editing",
|
|
212
|
+
"properties": {
|
|
213
|
+
"rationale": "Marketing-led; prioritizes visual control. Output is typically component-tree JSON or HTML.",
|
|
214
|
+
"exemplars": ["Webflow CMS", "Framer"]
|
|
215
|
+
}
|
|
216
|
+
},
|
|
217
|
+
|
|
218
|
+
{
|
|
219
|
+
"id": "competitor-sanity",
|
|
220
|
+
"type": "competitor",
|
|
221
|
+
"title": "Sanity",
|
|
222
|
+
"description": "The reference implementation of composable + Portable Text editing.",
|
|
223
|
+
"properties": {
|
|
224
|
+
"positioning": "Composable content platform with embeddable studio and real-time backend.",
|
|
225
|
+
"pricing_model": "Usage-based + per-seat",
|
|
226
|
+
"website": "https://sanity.io",
|
|
227
|
+
"strengths": [
|
|
228
|
+
"Typed content graph with GROQ query language",
|
|
229
|
+
"Real-time CRDT collaboration out of the box",
|
|
230
|
+
"Embeddable studio — owned inside the team's repo"
|
|
231
|
+
],
|
|
232
|
+
"weaknesses": [
|
|
233
|
+
"Steeper learning curve than form-based headless CMSs",
|
|
234
|
+
"Portable Text renderers must be authored per output platform"
|
|
235
|
+
]
|
|
236
|
+
}
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
"id": "competitor-wordpress",
|
|
240
|
+
"type": "competitor",
|
|
241
|
+
"title": "WordPress",
|
|
242
|
+
"description": "The reference monolithic + page-document CMS.",
|
|
243
|
+
"properties": {
|
|
244
|
+
"positioning": "Open-source CMS powering ~40% of the web; monolithic by default, plugin-extensible.",
|
|
245
|
+
"pricing_model": "Free + paid hosting (WP Engine, Pressable, …)",
|
|
246
|
+
"website": "https://wordpress.org",
|
|
247
|
+
"strengths": [
|
|
248
|
+
"Ubiquitous plugin and theme ecosystem",
|
|
249
|
+
"Familiar to marketing teams worldwide"
|
|
250
|
+
],
|
|
251
|
+
"weaknesses": [
|
|
252
|
+
"HTML-blob content model resists structured reuse",
|
|
253
|
+
"Coupled architecture complicates omnichannel delivery"
|
|
254
|
+
]
|
|
255
|
+
}
|
|
256
|
+
},
|
|
257
|
+
|
|
258
|
+
{
|
|
259
|
+
"id": "persona-small-marketing-team",
|
|
260
|
+
"type": "persona",
|
|
261
|
+
"title": "Small marketing team with no engineering capacity",
|
|
262
|
+
"description": "A 2-3 person marketing org running a brochure site. Wants a single vendor, single throat to choke, fast onboarding."
|
|
263
|
+
}
|
|
264
|
+
],
|
|
265
|
+
|
|
266
|
+
"edges": [
|
|
267
|
+
{ "id": "e-axis-arch", "type": "competitive_analysis_dimensioned_by_classification_axis", "source": "comp-analysis-cms", "target": "axis-architecture" },
|
|
268
|
+
{ "id": "e-axis-edit", "type": "competitive_analysis_dimensioned_by_classification_axis", "source": "comp-analysis-cms", "target": "axis-editing" },
|
|
269
|
+
|
|
270
|
+
{ "id": "e-v-composable", "type": "classification_axis_includes_classification_value", "source": "axis-architecture", "target": "val-composable" },
|
|
271
|
+
{ "id": "e-v-headless", "type": "classification_axis_includes_classification_value", "source": "axis-architecture", "target": "val-headless" },
|
|
272
|
+
{ "id": "e-v-hybrid", "type": "classification_axis_includes_classification_value", "source": "axis-architecture", "target": "val-hybrid" },
|
|
273
|
+
{ "id": "e-v-monolithic", "type": "classification_axis_includes_classification_value", "source": "axis-architecture", "target": "val-monolithic" },
|
|
274
|
+
{ "id": "e-v-git", "type": "classification_axis_includes_classification_value", "source": "axis-architecture", "target": "val-git-based" },
|
|
275
|
+
|
|
276
|
+
{ "id": "e-v-wysiwyg", "type": "classification_axis_includes_classification_value", "source": "axis-editing", "target": "val-wysiwyg" },
|
|
277
|
+
{ "id": "e-v-block", "type": "classification_axis_includes_classification_value", "source": "axis-editing", "target": "val-block" },
|
|
278
|
+
{ "id": "e-v-form", "type": "classification_axis_includes_classification_value", "source": "axis-editing", "target": "val-form" },
|
|
279
|
+
{ "id": "e-v-pt", "type": "classification_axis_includes_classification_value", "source": "axis-editing", "target": "val-portable-text" },
|
|
280
|
+
{ "id": "e-v-builder", "type": "classification_axis_includes_classification_value", "source": "axis-editing", "target": "val-visual-builder" },
|
|
281
|
+
|
|
282
|
+
{ "id": "e-sanity-composable", "type": "competitor_classified_as_classification_value", "source": "competitor-sanity", "target": "val-composable" },
|
|
283
|
+
{ "id": "e-sanity-pt", "type": "competitor_classified_as_classification_value", "source": "competitor-sanity", "target": "val-portable-text" },
|
|
284
|
+
{ "id": "e-wp-monolithic", "type": "competitor_classified_as_classification_value", "source": "competitor-wordpress", "target": "val-monolithic" },
|
|
285
|
+
{ "id": "e-wp-wysiwyg", "type": "competitor_classified_as_classification_value", "source": "competitor-wordpress", "target": "val-wysiwyg" },
|
|
286
|
+
|
|
287
|
+
{ "id": "e-anti-fit-composable", "type": "persona_anti_fit_for_classification_value", "source": "persona-small-marketing-team", "target": "val-composable" },
|
|
288
|
+
{ "id": "e-anti-fit-pt", "type": "persona_anti_fit_for_classification_value", "source": "persona-small-marketing-team", "target": "val-portable-text" }
|
|
289
|
+
]
|
|
290
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Enterprise Pilot Results — Q2 2026"
|
|
3
|
+
upg_product: entopo
|
|
4
|
+
upg_version: "0.4.0"
|
|
5
|
+
entity_type: document
|
|
6
|
+
entity_id: doc_pilot_results_q2
|
|
7
|
+
author: Jordan Park
|
|
8
|
+
created_at: 2026-04-07
|
|
9
|
+
tags: [experiment, validation, pilot]
|
|
10
|
+
status: published
|
|
11
|
+
composition_pattern: experiment_report
|
|
12
|
+
graph_source: enterprise-pilot.upg
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Enterprise Pilot Results — Q2 2026
|
|
16
|
+
|
|
17
|
+
## Background
|
|
18
|
+
|
|
19
|
+
Our primary persona [[persona:alex-senior-pm]] faces a critical need:
|
|
20
|
+
[[need:no-single-source-of-truth|valence:pain|severity:Significant]].
|
|
21
|
+
|
|
22
|
+
This was identified through research that surfaced a key insight:
|
|
23
|
+
{{insight:tool-fragmentation → opportunity:unified-knowledge|informs}} —
|
|
24
|
+
our strongest evidence chain from user research to strategic opportunity.
|
|
25
|
+
|
|
26
|
+
[[persona:alex-senior-pm|"Alex"]] leads a 12-person team and
|
|
27
|
+
{{persona:alex-senior-pm -> job:keep-team-aligned|pursues}} alignment as
|
|
28
|
+
a core job — but today that job is underserved.
|
|
29
|
+
|
|
30
|
+
## What We Tested
|
|
31
|
+
|
|
32
|
+
[[hypothesis:structured-knowledge-reduces-planning|"The planning time
|
|
33
|
+
hypothesis"]] predicted that adopting
|
|
34
|
+
[[solution:unified-product-graph]] would reduce quarterly planning time
|
|
35
|
+
by 30%.
|
|
36
|
+
|
|
37
|
+
The chain from need to hypothesis:
|
|
38
|
+
- [[need:no-single-source-of-truth]] grounds
|
|
39
|
+
[[opportunity:unified-knowledge|score:0.42]]
|
|
40
|
+
- The opportunity drives [[solution:unified-product-graph|rice:0.5]]
|
|
41
|
+
- The solution proposes
|
|
42
|
+
[[hypothesis:structured-knowledge-reduces-planning]]
|
|
43
|
+
|
|
44
|
+
We ran [[experiment:enterprise-pilot-q2]] — a controlled pilot with 5
|
|
45
|
+
enterprise teams over 8 weeks.
|
|
46
|
+
|
|
47
|
+
## Results
|
|
48
|
+
|
|
49
|
+
{{experiment:enterprise-pilot-q2 → learning:planning-time-reduction|produces}}
|
|
50
|
+
|
|
51
|
+
[[learning:planning-time-reduction|"The key learning"]]: teams reduced
|
|
52
|
+
planning time by 22% — below the 30% target but statistically
|
|
53
|
+
significant. 3 of 5 teams exceeded the 20% threshold.
|
|
54
|
+
|
|
55
|
+
[[metric:planning-time|current:22%|target:30%]] is trending positive.
|
|
56
|
+
|
|
57
|
+
| Measure | Target | Actual | Status |
|
|
58
|
+
|---------|--------|--------|--------|
|
|
59
|
+
| Planning time reduction | 30% | 22% | Below target, significant |
|
|
60
|
+
| Teams above threshold | 5 of 5 | 3 of 5 | Partial |
|
|
61
|
+
| Statistical significance | Yes | Yes | Confirmed |
|
|
62
|
+
|
|
63
|
+
## New Discovery
|
|
64
|
+
|
|
65
|
+
During the pilot, we discovered a previously unknown pain point:
|
|
66
|
+
[[+need:context-loss-between-sprints|valence:pain|severity:3|"Teams lose
|
|
67
|
+
product context between sprint boundaries"]].
|
|
68
|
+
|
|
69
|
+
This was mentioned by 4 of 5 pilot teams and warrants dedicated research.
|
|
70
|
+
The discovery came from the experiment itself:
|
|
71
|
+
{{experiment:enterprise-pilot-q2 -> need:context-loss-between-sprints|surfaces}}.
|
|
72
|
+
|
|
73
|
+
## Implications
|
|
74
|
+
|
|
75
|
+
1. **Proceed with investment.** [[solution:unified-product-graph]] is
|
|
76
|
+
validated. The 22% result, while below target, is directionally
|
|
77
|
+
strong and statistically significant.
|
|
78
|
+
|
|
79
|
+
2. **Adjust the target.** [[metric:planning-time]] target should move
|
|
80
|
+
from 30% to 25% — more realistic based on pilot data.
|
|
81
|
+
|
|
82
|
+
3. **Investigate the new need.**
|
|
83
|
+
[[need:context-loss-between-sprints]] is a potential second
|
|
84
|
+
opportunity worth sizing.
|
|
85
|
+
|
|
86
|
+
4. **North star remains.**
|
|
87
|
+
[[objective:reduce-context-switching]] is the right objective —
|
|
88
|
+
the pilot confirms the direction.
|
|
89
|
+
|
|
90
|
+
## Full Evidence Chain
|
|
91
|
+
|
|
92
|
+
For reference, the complete traversal from persona to learning:
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
[[persona:alex-senior-pm]]
|
|
96
|
+
→ pursues → [[job:keep-team-aligned]]
|
|
97
|
+
→ surfaces → [[need:no-single-source-of-truth]]
|
|
98
|
+
→ grounds → [[opportunity:unified-knowledge]]
|
|
99
|
+
→ drives → [[solution:unified-product-graph]]
|
|
100
|
+
→ proposes → [[hypothesis:structured-knowledge-reduces-planning]]
|
|
101
|
+
→ requires → [[experiment:enterprise-pilot-q2]]
|
|
102
|
+
→ produces → [[learning:planning-time-reduction]]
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Every link in this chain is a typed edge in the product graph. Every
|
|
106
|
+
node is a first-class entity with properties, lifecycle status, and
|
|
107
|
+
provenance. This is what structured product knowledge looks like.
|