@unified-product-graph/core 0.8.15 → 0.9.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 +42 -0
- package/dist/index.cjs +315 -41
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +77 -26
- package/dist/index.d.ts +77 -26
- package/dist/index.js +315 -41
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -91,7 +91,7 @@ var UPG_DOMAINS = [
|
|
|
91
91
|
{
|
|
92
92
|
id: "product_spec",
|
|
93
93
|
label: "Product Specification",
|
|
94
|
-
description: "What you are building and shipping. Feature areas group related capabilities. Features, epics, and user stories break work down. Acceptance criteria define done. Tasks and bugs track execution. Releases and changelogs mark what shipped. Roadmaps and roadmap items plan what comes next.
|
|
94
|
+
description: "What you are building and shipping. Feature areas group related capabilities. Features, epics, and user stories break work down. Acceptance criteria define done. Tasks and bugs track execution. Releases and changelogs mark what shipped. Roadmaps and roadmap items plan what comes next. Roadmap themes group roadmap work around the customer problem it solves, one level down from the strategic themes in Strategy. Translates Strategy into Engineering and tracks delivery through Program Management.",
|
|
95
95
|
types: [
|
|
96
96
|
"feature",
|
|
97
97
|
"feature_area",
|
|
@@ -103,7 +103,7 @@ var UPG_DOMAINS = [
|
|
|
103
103
|
"bug",
|
|
104
104
|
"roadmap",
|
|
105
105
|
"roadmap_item",
|
|
106
|
-
"
|
|
106
|
+
"roadmap_theme",
|
|
107
107
|
"changelog"
|
|
108
108
|
]
|
|
109
109
|
},
|
|
@@ -536,8 +536,8 @@ var UPG_ENTITY_META = [
|
|
|
536
536
|
{ name: "need", type_id: "ent_313", maturity: "stable", since: "0.1.0" },
|
|
537
537
|
{ name: "switching_cost", type_id: "ent_022", maturity: "stable", since: "0.1.0" },
|
|
538
538
|
// ── Discovery ──
|
|
539
|
-
{ name: "opportunity", type_id: "ent_023", maturity: "stable", since: "0.1.0" },
|
|
540
|
-
{ name: "solution", type_id: "ent_024", maturity: "stable", since: "0.1.0" },
|
|
539
|
+
{ name: "opportunity", type_id: "ent_023", maturity: "stable", since: "0.1.0", default_frameworks: ["opportunity-sizing", "rice-scoring"] },
|
|
540
|
+
{ name: "solution", type_id: "ent_024", maturity: "stable", since: "0.1.0", default_frameworks: ["rice-scoring"] },
|
|
541
541
|
{ name: "feasibility_study", type_id: "ent_025", maturity: "stable", since: "0.1.0" },
|
|
542
542
|
{ name: "design_sprint", type_id: "ent_026", maturity: "stable", since: "0.1.0" },
|
|
543
543
|
// ── Validation ──
|
|
@@ -638,7 +638,8 @@ var UPG_ENTITY_META = [
|
|
|
638
638
|
{ name: "bug", type_id: "ent_077", maturity: "stable", since: "0.1.0" },
|
|
639
639
|
{ name: "roadmap", type_id: "ent_078", maturity: "stable", since: "0.1.0" },
|
|
640
640
|
{ name: "roadmap_item", type_id: "ent_079", maturity: "stable", since: "0.1.0" },
|
|
641
|
-
{ name: "theme", type_id: "ent_080", maturity: "
|
|
641
|
+
{ name: "theme", type_id: "ent_080", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.9.0", replacement: "roadmap_theme" },
|
|
642
|
+
{ name: "roadmap_theme", type_id: "ent_351", maturity: "stable", since: "0.1.0" },
|
|
642
643
|
{ name: "changelog", type_id: "ent_081", maturity: "stable", since: "0.1.0" },
|
|
643
644
|
// ── Engineering ──
|
|
644
645
|
{ name: "bounded_context", type_id: "ent_082", maturity: "stable", since: "0.1.0" },
|
|
@@ -1154,6 +1155,12 @@ var UPG_EDGE_CATALOG = {
|
|
|
1154
1155
|
strategic_pillar_delivers_value_stream: { forward_verb: "delivers", reverse_verb: "delivered_by", classification: "hierarchy", source_type: "strategic_pillar", target_type: "value_stream" },
|
|
1155
1156
|
strategic_pillar_decided_via_decision: { forward_verb: "decided_via", reverse_verb: "decided_for", classification: "hierarchy", source_type: "strategic_pillar", target_type: "decision" },
|
|
1156
1157
|
strategic_theme_pursues_initiative: { forward_verb: "pursues", reverse_verb: "pursued_under", classification: "hierarchy", source_type: "strategic_theme", target_type: "initiative" },
|
|
1158
|
+
// v0.9.0 (UPG-660): the soft bridge from the annual strategy focus area to the
|
|
1159
|
+
// roadmap grouping that realises it. Semantic, NOT hierarchy: strategic_theme and
|
|
1160
|
+
// roadmap_theme sit on different spines (strategy cascade vs roadmap cascade), so
|
|
1161
|
+
// this is a cross-reference, not containment. Pairs with the theme → roadmap_theme
|
|
1162
|
+
// rename that removed the bare-'theme' collision (N6/UPG-652 lineage).
|
|
1163
|
+
strategic_theme_realised_by_roadmap_theme: { forward_verb: "realised_by", reverse_verb: "realises", classification: "semantic", source_type: "strategic_theme", target_type: "roadmap_theme" },
|
|
1157
1164
|
// v0.5.4 (UPG-511): three edges that lift strategic_theme from structural
|
|
1158
1165
|
// isolation to a conceptually central strategy node.
|
|
1159
1166
|
//
|
|
@@ -1211,7 +1218,7 @@ var UPG_EDGE_CATALOG = {
|
|
|
1211
1218
|
product_builds_feature: { forward_verb: "builds", reverse_verb: "built_by", classification: "hierarchy", source_type: "product", target_type: "feature" },
|
|
1212
1219
|
product_ships_via_release: { forward_verb: "ships_via", reverse_verb: "ships", classification: "hierarchy", source_type: "product", target_type: "release" },
|
|
1213
1220
|
product_plans_via_roadmap: { forward_verb: "plans_via", reverse_verb: "plans_for", classification: "hierarchy", source_type: "product", target_type: "roadmap" },
|
|
1214
|
-
|
|
1221
|
+
product_categorises_by_roadmap_theme: { forward_verb: "categorises_by", reverse_verb: "categorises", classification: "hierarchy", source_type: "product", target_type: "roadmap_theme" },
|
|
1215
1222
|
feature_area_contains_feature: { forward_verb: "contains", reverse_verb: "belongs_to", classification: "hierarchy", source_type: "feature_area", target_type: "feature" },
|
|
1216
1223
|
feature_area_contains_feature_area: { forward_verb: "contains", reverse_verb: "belongs_to", classification: "hierarchy", source_type: "feature_area", target_type: "feature_area" },
|
|
1217
1224
|
outcome_delivered_by_feature: { forward_verb: "delivered_by", reverse_verb: "delivers", classification: "cross-domain", source_type: "outcome", target_type: "feature" },
|
|
@@ -1235,12 +1242,12 @@ var UPG_EDGE_CATALOG = {
|
|
|
1235
1242
|
release_contains_bug: { forward_verb: "contains", reverse_verb: "belongs_to", classification: "hierarchy", source_type: "release", target_type: "bug" },
|
|
1236
1243
|
release_documented_in_changelog: { forward_verb: "documented_in", reverse_verb: "documents", classification: "hierarchy", source_type: "release", target_type: "changelog" },
|
|
1237
1244
|
roadmap_contains_roadmap_item: { forward_verb: "contains", reverse_verb: "belongs_to", classification: "hierarchy", source_type: "roadmap", target_type: "roadmap_item" },
|
|
1238
|
-
|
|
1245
|
+
roadmap_categorised_by_roadmap_theme: { forward_verb: "categorised_by", reverse_verb: "categorises", classification: "hierarchy", source_type: "roadmap", target_type: "roadmap_theme" },
|
|
1239
1246
|
roadmap_schedules_release: { forward_verb: "schedules", reverse_verb: "scheduled_in", classification: "hierarchy", source_type: "roadmap", target_type: "release" },
|
|
1240
|
-
|
|
1241
|
-
// feature_area is not contained by
|
|
1247
|
+
roadmap_theme_groups_feature: { forward_verb: "groups", reverse_verb: "grouped_in", classification: "hierarchy", source_type: "roadmap_theme", target_type: "feature" },
|
|
1248
|
+
// feature_area is not contained by roadmap_theme; roadmap themes span multiple
|
|
1242
1249
|
// areas cross-cuttingly. Containment path: product → feature_area.
|
|
1243
|
-
|
|
1250
|
+
roadmap_theme_spans_feature_area: { forward_verb: "spans", reverse_verb: "spanned_by", classification: "semantic", source_type: "roadmap_theme", target_type: "feature_area" },
|
|
1244
1251
|
// The legacy `story_task` collapsed into `task` (v0.4.0), so the implements
|
|
1245
1252
|
// relationship is the canonical `task_implements_user_story` above; there is
|
|
1246
1253
|
// no separate story_task edge. (v0.2.7 introduced the Statement/Implementation
|
|
@@ -2751,7 +2758,8 @@ var UPG_CROSS_EDGE_TYPES = [
|
|
|
2751
2758
|
"shares_metric",
|
|
2752
2759
|
"depends_on_product",
|
|
2753
2760
|
"cannibalises",
|
|
2754
|
-
"succeeds"
|
|
2761
|
+
"succeeds",
|
|
2762
|
+
"hosts"
|
|
2755
2763
|
];
|
|
2756
2764
|
|
|
2757
2765
|
// src/registry/entity-type-resolution.ts
|
|
@@ -2849,7 +2857,7 @@ var UPG_VALID_CHILDREN = {
|
|
|
2849
2857
|
"feature_area",
|
|
2850
2858
|
"release",
|
|
2851
2859
|
"roadmap",
|
|
2852
|
-
"
|
|
2860
|
+
"roadmap_theme",
|
|
2853
2861
|
// Engineering
|
|
2854
2862
|
"bounded_context",
|
|
2855
2863
|
"code_repository",
|
|
@@ -3245,8 +3253,8 @@ var UPG_VALID_CHILDREN = {
|
|
|
3245
3253
|
a11y_standard: ["a11y_guideline", "a11y_audit", "a11y_annotation"],
|
|
3246
3254
|
a11y_audit: ["a11y_issue"],
|
|
3247
3255
|
// ── Product Specification expansion ─────────────────────────────────────────
|
|
3248
|
-
roadmap: ["roadmap_item", "
|
|
3249
|
-
|
|
3256
|
+
roadmap: ["roadmap_item", "roadmap_theme", "release"],
|
|
3257
|
+
roadmap_theme: ["feature"],
|
|
3250
3258
|
// ── Unified Context Layer hierarchy ─────────────────────────────────────────
|
|
3251
3259
|
design_system: [
|
|
3252
3260
|
"design_component",
|
|
@@ -5859,7 +5867,7 @@ var UPG_LIFECYCLE_FREE_TYPES = /* @__PURE__ */ new Set([
|
|
|
5859
5867
|
// v0.7.0/UPG-571. ─
|
|
5860
5868
|
"acceptance_criterion",
|
|
5861
5869
|
"changelog",
|
|
5862
|
-
"
|
|
5870
|
+
"roadmap_theme",
|
|
5863
5871
|
"user_story",
|
|
5864
5872
|
// ── Strategy: metric is a measurement definition; metric_quality_assessment
|
|
5865
5873
|
// is a point-in-time snapshot; value_stream is a mapped flow;
|
|
@@ -6539,6 +6547,21 @@ function getEnumValueMeta(scaleName, value) {
|
|
|
6539
6547
|
|
|
6540
6548
|
// src/grammar/migrations.ts
|
|
6541
6549
|
var UPG_MIGRATIONS = {
|
|
6550
|
+
"0.9.0": [
|
|
6551
|
+
// (since v0.9.0, UPG-660) theme → roadmap_theme. `theme` was the only bare,
|
|
6552
|
+
// unqualified theme among four domain-prefixed siblings (strategic_theme,
|
|
6553
|
+
// content_theme, feedback_theme); it claimed the unqualified word and read as
|
|
6554
|
+
// interchangeable with strategic_theme (the N6/UPG-652 confusion). Renamed to
|
|
6555
|
+
// roadmap_theme so all four read consistently and the customer-problem roadmap
|
|
6556
|
+
// grouping is explicit. Lifecycle-free, identical property surface (theme_scope
|
|
6557
|
+
// / priority); no property migration required. Paired edge renames live in
|
|
6558
|
+
// UPG_EDGE_MIGRATIONS['0.9.0'].
|
|
6559
|
+
{
|
|
6560
|
+
from: "theme",
|
|
6561
|
+
to: "roadmap_theme",
|
|
6562
|
+
reason: 'theme renamed to roadmap_theme (UPG-660). The bare "theme" was the only domain-unprefixed theme among strategic_theme / content_theme / feedback_theme; it grabbed the unqualified word and read as interchangeable with strategic_theme. roadmap_theme makes the customer-problem roadmap grouping explicit and consistent across the four. Same property surface (theme_scope / priority); no property migration needed.'
|
|
6563
|
+
}
|
|
6564
|
+
],
|
|
6542
6565
|
"0.7.0": [
|
|
6543
6566
|
// (since v0.7.0, UPG-571) story_statement → user_story. The v0.2.7 split
|
|
6544
6567
|
// correctly separated the templated promise from the engineering work
|
|
@@ -7581,6 +7604,17 @@ function getSplitMigrations(fromVersion, toVersion) {
|
|
|
7581
7604
|
return result;
|
|
7582
7605
|
}
|
|
7583
7606
|
var UPG_EDGE_MIGRATIONS = {
|
|
7607
|
+
"0.9.0": [
|
|
7608
|
+
// (since v0.9.0, UPG-660) theme → roadmap_theme. The four canonical edges that
|
|
7609
|
+
// touch the roadmap theme are renamed to the roadmap_theme form. Endpoint guards
|
|
7610
|
+
// reference the POST-migration (roadmap_theme) types; edge migration runs after
|
|
7611
|
+
// node migration, so by the time these rules apply the node has already been
|
|
7612
|
+
// renamed theme → roadmap_theme (UPG_MIGRATIONS['0.9.0']).
|
|
7613
|
+
{ kind: "rename", from: "product_categorises_by_theme", to: "product_categorises_by_roadmap_theme", requires_source_type: "product", requires_target_type: "roadmap_theme", reason: "theme \u2192 roadmap_theme (UPG-660). Product categorises by the roadmap theme; edge key updated to the renamed target type." },
|
|
7614
|
+
{ kind: "rename", from: "roadmap_categorised_by_theme", to: "roadmap_categorised_by_roadmap_theme", requires_source_type: "roadmap", requires_target_type: "roadmap_theme", reason: "theme \u2192 roadmap_theme (UPG-660). Roadmap is categorised by the roadmap theme; edge key updated to the renamed target type." },
|
|
7615
|
+
{ kind: "rename", from: "theme_groups_feature", to: "roadmap_theme_groups_feature", requires_source_type: "roadmap_theme", requires_target_type: "feature", reason: "theme \u2192 roadmap_theme (UPG-660). The roadmap theme groups features; edge key updated to the renamed source type." },
|
|
7616
|
+
{ kind: "rename", from: "theme_spans_feature_area", to: "roadmap_theme_spans_feature_area", requires_source_type: "roadmap_theme", requires_target_type: "feature_area", reason: "theme \u2192 roadmap_theme (UPG-660). The roadmap theme spans feature areas; edge key updated to the renamed source type." }
|
|
7617
|
+
],
|
|
7584
7618
|
"0.7.0": [
|
|
7585
7619
|
// (since v0.7.0, UPG-571) story_statement → user_story re-canon. The four
|
|
7586
7620
|
// canonical edges that touch the statement are renamed to the user_story
|
|
@@ -10477,7 +10511,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10477
10511
|
reach: {
|
|
10478
10512
|
type: "assessment",
|
|
10479
10513
|
scale_id: "reach_5",
|
|
10480
|
-
description: "How many users experience this problem",
|
|
10514
|
+
description: "How many users experience this problem. @deprecated 0.9.0:a framework-scoped scoring input, not an intrinsic property. Apply the `opportunity-sizing` framework; the value lives on the framework_exercise includes-edge. Removed in 0.9.1.",
|
|
10481
10515
|
properties: {
|
|
10482
10516
|
value: { type: "number", description: "The numeric value, used for computation." },
|
|
10483
10517
|
label: { type: "string", description: "The qualitative label (what the assessor meant)." },
|
|
@@ -10489,7 +10523,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10489
10523
|
frequency: {
|
|
10490
10524
|
type: "assessment",
|
|
10491
10525
|
scale_id: "frequency_5",
|
|
10492
|
-
description: "How often users experience this problem",
|
|
10526
|
+
description: "How often users experience this problem. @deprecated 0.9.0:framework-scoped (opportunity-sizing). Removed in 0.9.1.",
|
|
10493
10527
|
properties: {
|
|
10494
10528
|
value: { type: "number", description: "The numeric value, used for computation." },
|
|
10495
10529
|
label: { type: "string", description: "The qualitative label (what the assessor meant)." },
|
|
@@ -10501,7 +10535,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10501
10535
|
pain: {
|
|
10502
10536
|
type: "assessment",
|
|
10503
10537
|
scale_id: "pain_5",
|
|
10504
|
-
description: "How painful it is when unaddressed",
|
|
10538
|
+
description: "How painful it is when unaddressed. @deprecated 0.9.0:framework-scoped (opportunity-sizing). Removed in 0.9.1.",
|
|
10505
10539
|
properties: {
|
|
10506
10540
|
value: { type: "number", description: "The numeric value, used for computation." },
|
|
10507
10541
|
label: { type: "string", description: "The qualitative label (what the assessor meant)." },
|
|
@@ -10510,7 +10544,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10510
10544
|
},
|
|
10511
10545
|
required: ["value", "label"]
|
|
10512
10546
|
},
|
|
10513
|
-
opportunity_score: { type: "number", description: "Computed: normalized_reach x normalized_frequency x normalized_pain (0-1)" }
|
|
10547
|
+
opportunity_score: { type: "number", description: "Computed: normalized_reach x normalized_frequency x normalized_pain (0-1). @deprecated 0.9.0:computed by the `opportunity-sizing` framework on its application edge, not stored on the entity. Removed in 0.9.1." }
|
|
10514
10548
|
},
|
|
10515
10549
|
// OrganizationProperties: Organization entity.
|
|
10516
10550
|
organization: {
|
|
@@ -10924,6 +10958,11 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10924
10958
|
start_date: { type: "string", description: "ISO date work begins. More precise than `quarter` for continuous planning." },
|
|
10925
10959
|
target_date: { type: "string", description: "ISO date completion is expected. For shipped items, the actual completion date." }
|
|
10926
10960
|
},
|
|
10961
|
+
// RoadmapThemeProperties: Thematic grouping of roadmap work, around the customer problem it solves.
|
|
10962
|
+
roadmap_theme: {
|
|
10963
|
+
theme_scope: { type: "string", description: "Scope description" },
|
|
10964
|
+
priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Priority" }
|
|
10965
|
+
},
|
|
10927
10966
|
// RoleProperties: Role entity.
|
|
10928
10967
|
role: {
|
|
10929
10968
|
responsibilities: { type: "string[]", description: "Key responsibilities of the role" },
|
|
@@ -11109,7 +11148,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
11109
11148
|
reach: {
|
|
11110
11149
|
type: "assessment",
|
|
11111
11150
|
scale_id: "reach_5",
|
|
11112
|
-
description: "How many users this solution reaches (1 = few, 5 = most)",
|
|
11151
|
+
description: "How many users this solution reaches (1 = few, 5 = most). @deprecated 0.9.0:a framework-scoped scoring input, not an intrinsic property. Apply the `rice-scoring` framework; the value lives on the framework_exercise includes-edge. Removed in 0.9.1.",
|
|
11113
11152
|
properties: {
|
|
11114
11153
|
value: { type: "number", description: "The numeric value, used for computation." },
|
|
11115
11154
|
label: { type: "string", description: "The qualitative label (what the assessor meant)." },
|
|
@@ -11121,7 +11160,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
11121
11160
|
impact: {
|
|
11122
11161
|
type: "assessment",
|
|
11123
11162
|
scale_id: "impact_5",
|
|
11124
|
-
description: "Expected impact on the target outcome (1 = minimal, 5 = transformative)",
|
|
11163
|
+
description: "Expected impact on the target outcome (1 = minimal, 5 = transformative). @deprecated 0.9.0:framework-scoped (rice-scoring). Removed in 0.9.1.",
|
|
11125
11164
|
properties: {
|
|
11126
11165
|
value: { type: "number", description: "The numeric value, used for computation." },
|
|
11127
11166
|
label: { type: "string", description: "The qualitative label (what the assessor meant)." },
|
|
@@ -11133,7 +11172,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
11133
11172
|
confidence: {
|
|
11134
11173
|
type: "assessment",
|
|
11135
11174
|
scale_id: "confidence_5",
|
|
11136
|
-
description: "How confident the team is in this solution (1 = speculative, 5 = proven)",
|
|
11175
|
+
description: "How confident the team is in this solution (1 = speculative, 5 = proven). @deprecated 0.9.0:framework-scoped (rice-scoring). Removed in 0.9.1.",
|
|
11137
11176
|
properties: {
|
|
11138
11177
|
value: { type: "number", description: "The numeric value, used for computation." },
|
|
11139
11178
|
label: { type: "string", description: "The qualitative label (what the assessor meant)." },
|
|
@@ -11145,7 +11184,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
11145
11184
|
effort: {
|
|
11146
11185
|
type: "assessment",
|
|
11147
11186
|
scale_id: "effort_5",
|
|
11148
|
-
description: "Level of effort required to implement (1 = trivial, 5 = very large)",
|
|
11187
|
+
description: "Level of effort required to implement (1 = trivial, 5 = very large). @deprecated 0.9.0:effort is a framework-scoped scoring input (it varies by assessor and method), not an intrinsic property. Removed in 0.9.1.",
|
|
11149
11188
|
properties: {
|
|
11150
11189
|
value: { type: "number", description: "The numeric value, used for computation." },
|
|
11151
11190
|
label: { type: "string", description: "The qualitative label (what the assessor meant)." },
|
|
@@ -11154,7 +11193,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
11154
11193
|
},
|
|
11155
11194
|
required: ["value", "label"]
|
|
11156
11195
|
},
|
|
11157
|
-
rice_score: { type: "number", description: "Computed: (reach \xD7 impact \xD7 confidence) / effort" }
|
|
11196
|
+
rice_score: { type: "number", description: "Computed: (reach \xD7 impact \xD7 confidence) / effort. @deprecated 0.9.0:computed by the `rice-scoring` framework on its application edge, not stored on the entity. Removed in 0.9.1." }
|
|
11158
11197
|
},
|
|
11159
11198
|
// StakeholderProperties: Stakeholder entity.
|
|
11160
11199
|
stakeholder: {
|
|
@@ -11401,11 +11440,6 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
11401
11440
|
skipped_count: { type: "number", description: "Number of tests that were skipped in the last run" },
|
|
11402
11441
|
flaky_count: { type: "number", description: "Number of tests that passed only on retry (flaky) in the last run" }
|
|
11403
11442
|
},
|
|
11404
|
-
// ThemeProperties: Thematic grouping of work.
|
|
11405
|
-
theme: {
|
|
11406
|
-
theme_scope: { type: "string", description: "Scope description" },
|
|
11407
|
-
priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Priority" }
|
|
11408
|
-
},
|
|
11409
11443
|
// ThreatProperties: Threat.
|
|
11410
11444
|
threat: {
|
|
11411
11445
|
category: { type: "string", description: 'Attack or threat scenario. @example "injection", "misconfiguration", "social engineering", "supply chain"' },
|
|
@@ -11636,6 +11670,188 @@ function getPropertySchema(entityType) {
|
|
|
11636
11670
|
|
|
11637
11671
|
// src/frameworks/canonical.ts
|
|
11638
11672
|
var UPG_FRAMEWORKS = [
|
|
11673
|
+
{
|
|
11674
|
+
"id": "opportunity-sizing",
|
|
11675
|
+
"approach_ids": [
|
|
11676
|
+
"prioritise"
|
|
11677
|
+
],
|
|
11678
|
+
"name": "Opportunity Sizing",
|
|
11679
|
+
"version": "1.0.0",
|
|
11680
|
+
"description": "Size opportunities by Reach, Frequency, and Pain to rank which problems are most worth solving before committing to solutions.",
|
|
11681
|
+
"category": "prioritization",
|
|
11682
|
+
"origin": {
|
|
11683
|
+
"type": "practitioner",
|
|
11684
|
+
"attribution": "Continuous discovery practice",
|
|
11685
|
+
"description": "A lightweight discovery-prioritisation method: weigh how many users hit a problem, how often, and how much it hurts, to rank opportunities before investing in solutions.",
|
|
11686
|
+
"url": "https://www.producttalk.org/2016/08/opportunity-solution-tree/",
|
|
11687
|
+
"year": 2016,
|
|
11688
|
+
"license": "open_attribution"
|
|
11689
|
+
},
|
|
11690
|
+
"tags": [
|
|
11691
|
+
"prioritization",
|
|
11692
|
+
"discovery",
|
|
11693
|
+
"table"
|
|
11694
|
+
],
|
|
11695
|
+
"slots": [
|
|
11696
|
+
{
|
|
11697
|
+
"label": "Opportunities to size",
|
|
11698
|
+
"entityTypeId": "opportunity",
|
|
11699
|
+
"description": "Opportunities scored on Reach, Frequency, and Pain."
|
|
11700
|
+
}
|
|
11701
|
+
],
|
|
11702
|
+
"data": {
|
|
11703
|
+
"entity_types": [
|
|
11704
|
+
{
|
|
11705
|
+
"type": "opportunity",
|
|
11706
|
+
"role": "scored_item"
|
|
11707
|
+
}
|
|
11708
|
+
],
|
|
11709
|
+
"required_properties": {
|
|
11710
|
+
"opportunity": [
|
|
11711
|
+
{
|
|
11712
|
+
"property": "reach",
|
|
11713
|
+
"type": "assessment",
|
|
11714
|
+
"scale_id": "reach_5",
|
|
11715
|
+
"required": true,
|
|
11716
|
+
"scope": "framework",
|
|
11717
|
+
"label": "Reach",
|
|
11718
|
+
"description": "How many users experience this problem?"
|
|
11719
|
+
},
|
|
11720
|
+
{
|
|
11721
|
+
"property": "frequency",
|
|
11722
|
+
"type": "assessment",
|
|
11723
|
+
"scale_id": "frequency_5",
|
|
11724
|
+
"required": true,
|
|
11725
|
+
"scope": "framework",
|
|
11726
|
+
"label": "Frequency",
|
|
11727
|
+
"description": "How often do they run into it?"
|
|
11728
|
+
},
|
|
11729
|
+
{
|
|
11730
|
+
"property": "pain",
|
|
11731
|
+
"type": "assessment",
|
|
11732
|
+
"scale_id": "pain_5",
|
|
11733
|
+
"required": true,
|
|
11734
|
+
"scope": "framework",
|
|
11735
|
+
"label": "Pain",
|
|
11736
|
+
"description": "How painful is it when left unaddressed?"
|
|
11737
|
+
}
|
|
11738
|
+
]
|
|
11739
|
+
},
|
|
11740
|
+
"computed_properties": [
|
|
11741
|
+
{
|
|
11742
|
+
"property": "opportunity_score",
|
|
11743
|
+
"expression": "reach * frequency * pain",
|
|
11744
|
+
"entity_type": "opportunity",
|
|
11745
|
+
"label": "Opportunity Score",
|
|
11746
|
+
"format": "number"
|
|
11747
|
+
}
|
|
11748
|
+
],
|
|
11749
|
+
"scoring_method": {
|
|
11750
|
+
"applies_to": [
|
|
11751
|
+
"opportunity"
|
|
11752
|
+
],
|
|
11753
|
+
"inputs": [
|
|
11754
|
+
{
|
|
11755
|
+
"property": "reach",
|
|
11756
|
+
"type": "assessment",
|
|
11757
|
+
"scale_id": "reach_5",
|
|
11758
|
+
"required": true,
|
|
11759
|
+
"scope": "framework",
|
|
11760
|
+
"label": "Reach",
|
|
11761
|
+
"description": "How many users experience this problem?"
|
|
11762
|
+
},
|
|
11763
|
+
{
|
|
11764
|
+
"property": "frequency",
|
|
11765
|
+
"type": "assessment",
|
|
11766
|
+
"scale_id": "frequency_5",
|
|
11767
|
+
"required": true,
|
|
11768
|
+
"scope": "framework",
|
|
11769
|
+
"label": "Frequency",
|
|
11770
|
+
"description": "How often do they run into it?"
|
|
11771
|
+
},
|
|
11772
|
+
{
|
|
11773
|
+
"property": "pain",
|
|
11774
|
+
"type": "assessment",
|
|
11775
|
+
"scale_id": "pain_5",
|
|
11776
|
+
"required": true,
|
|
11777
|
+
"scope": "framework",
|
|
11778
|
+
"label": "Pain",
|
|
11779
|
+
"description": "How painful is it when left unaddressed?"
|
|
11780
|
+
}
|
|
11781
|
+
],
|
|
11782
|
+
"computed": [
|
|
11783
|
+
{
|
|
11784
|
+
"property": "opportunity_score",
|
|
11785
|
+
"expression": "reach * frequency * pain",
|
|
11786
|
+
"label": "Opportunity Score",
|
|
11787
|
+
"format": "number"
|
|
11788
|
+
}
|
|
11789
|
+
]
|
|
11790
|
+
}
|
|
11791
|
+
},
|
|
11792
|
+
"structure": {
|
|
11793
|
+
"pattern": "table"
|
|
11794
|
+
},
|
|
11795
|
+
"presentation": {
|
|
11796
|
+
"layout": {
|
|
11797
|
+
"type": "table",
|
|
11798
|
+
"columns": [
|
|
11799
|
+
{
|
|
11800
|
+
"property": "title",
|
|
11801
|
+
"label": "Opportunities to size",
|
|
11802
|
+
"sortable": true
|
|
11803
|
+
},
|
|
11804
|
+
{
|
|
11805
|
+
"property": "reach",
|
|
11806
|
+
"label": "Reach",
|
|
11807
|
+
"sortable": true,
|
|
11808
|
+
"format": "number"
|
|
11809
|
+
},
|
|
11810
|
+
{
|
|
11811
|
+
"property": "frequency",
|
|
11812
|
+
"label": "Frequency",
|
|
11813
|
+
"sortable": true,
|
|
11814
|
+
"format": "number"
|
|
11815
|
+
},
|
|
11816
|
+
{
|
|
11817
|
+
"property": "pain",
|
|
11818
|
+
"label": "Pain",
|
|
11819
|
+
"sortable": true,
|
|
11820
|
+
"format": "number"
|
|
11821
|
+
},
|
|
11822
|
+
{
|
|
11823
|
+
"property": "opportunity_score",
|
|
11824
|
+
"label": "Opportunity Score",
|
|
11825
|
+
"sortable": true,
|
|
11826
|
+
"format": "score_pill"
|
|
11827
|
+
}
|
|
11828
|
+
]
|
|
11829
|
+
},
|
|
11830
|
+
"sort_by": {
|
|
11831
|
+
"property": "opportunity_score",
|
|
11832
|
+
"direction": "desc"
|
|
11833
|
+
},
|
|
11834
|
+
"colour_by": "score",
|
|
11835
|
+
"card_fields": [
|
|
11836
|
+
"title",
|
|
11837
|
+
"description",
|
|
11838
|
+
"status"
|
|
11839
|
+
]
|
|
11840
|
+
},
|
|
11841
|
+
"education": {
|
|
11842
|
+
"purpose": "Rank opportunities by how widely, how often, and how painfully a problem is felt, so discovery effort flows to the problems most worth solving.",
|
|
11843
|
+
"core_question": "Of the problems we could pursue, which affect the most users, most often, with the most pain?",
|
|
11844
|
+
"when_to_use": [
|
|
11845
|
+
"You have more opportunities than you can pursue",
|
|
11846
|
+
"You need to compare problems before committing to solutions",
|
|
11847
|
+
"You want a defensible, transparent way to choose what to explore"
|
|
11848
|
+
],
|
|
11849
|
+
"when_not_to_use": [
|
|
11850
|
+
"A single opportunity is already validated and obvious",
|
|
11851
|
+
"You have no signal yet on reach, frequency, or pain"
|
|
11852
|
+
]
|
|
11853
|
+
}
|
|
11854
|
+
},
|
|
11639
11855
|
{
|
|
11640
11856
|
"id": "opportunity-solution-tree",
|
|
11641
11857
|
"approach_ids": [
|
|
@@ -12892,7 +13108,7 @@ var UPG_FRAMEWORKS = [
|
|
|
12892
13108
|
],
|
|
12893
13109
|
"name": "RICE Scoring",
|
|
12894
13110
|
"version": "1.0.0",
|
|
12895
|
-
"description": "Score features, opportunities, and needs by Reach, Impact, Confidence, and Effort to produce a ranked priority list.",
|
|
13111
|
+
"description": "Score features, solutions, opportunities, and needs by Reach, Impact, Confidence, and Effort to produce a ranked priority list.",
|
|
12896
13112
|
"category": "prioritization",
|
|
12897
13113
|
"origin": {
|
|
12898
13114
|
"type": "practitioner",
|
|
@@ -12917,6 +13133,11 @@ var UPG_FRAMEWORKS = [
|
|
|
12917
13133
|
"entityTypeId": "opportunity",
|
|
12918
13134
|
"description": "Opportunities scored on the same RICE Scoring inputs as features."
|
|
12919
13135
|
},
|
|
13136
|
+
{
|
|
13137
|
+
"label": "Solutions to score",
|
|
13138
|
+
"entityTypeId": "solution",
|
|
13139
|
+
"description": "Solutions scored on the same RICE Scoring inputs as features."
|
|
13140
|
+
},
|
|
12920
13141
|
{
|
|
12921
13142
|
"label": "Needs to score",
|
|
12922
13143
|
"entityTypeId": "need",
|
|
@@ -12933,6 +13154,10 @@ var UPG_FRAMEWORKS = [
|
|
|
12933
13154
|
"type": "opportunity",
|
|
12934
13155
|
"role": "scored_item"
|
|
12935
13156
|
},
|
|
13157
|
+
{
|
|
13158
|
+
"type": "solution",
|
|
13159
|
+
"role": "scored_item"
|
|
13160
|
+
},
|
|
12936
13161
|
{
|
|
12937
13162
|
"type": "need",
|
|
12938
13163
|
"role": "scored_item"
|
|
@@ -13015,6 +13240,44 @@ var UPG_FRAMEWORKS = [
|
|
|
13015
13240
|
"description": "How much work is required to build and ship this, on the effort scale?"
|
|
13016
13241
|
}
|
|
13017
13242
|
],
|
|
13243
|
+
"solution": [
|
|
13244
|
+
{
|
|
13245
|
+
"property": "reach",
|
|
13246
|
+
"type": "assessment",
|
|
13247
|
+
"scale_id": "reach_5",
|
|
13248
|
+
"required": true,
|
|
13249
|
+
"scope": "framework",
|
|
13250
|
+
"label": "Reach",
|
|
13251
|
+
"description": "How many users will this impact per quarter?"
|
|
13252
|
+
},
|
|
13253
|
+
{
|
|
13254
|
+
"property": "impact",
|
|
13255
|
+
"type": "assessment",
|
|
13256
|
+
"scale_id": "impact_5",
|
|
13257
|
+
"required": true,
|
|
13258
|
+
"scope": "framework",
|
|
13259
|
+
"label": "Impact",
|
|
13260
|
+
"description": "How much will this impact each user, on the impact scale?"
|
|
13261
|
+
},
|
|
13262
|
+
{
|
|
13263
|
+
"property": "confidence",
|
|
13264
|
+
"type": "assessment",
|
|
13265
|
+
"scale_id": "confidence_5",
|
|
13266
|
+
"required": true,
|
|
13267
|
+
"scope": "framework",
|
|
13268
|
+
"label": "Confidence",
|
|
13269
|
+
"description": "How confident are you in the reach, impact, and effort estimates?"
|
|
13270
|
+
},
|
|
13271
|
+
{
|
|
13272
|
+
"property": "effort",
|
|
13273
|
+
"type": "assessment",
|
|
13274
|
+
"scale_id": "effort_5",
|
|
13275
|
+
"required": true,
|
|
13276
|
+
"scope": "framework",
|
|
13277
|
+
"label": "Effort",
|
|
13278
|
+
"description": "How much work is required to build and ship this, on the effort scale?"
|
|
13279
|
+
}
|
|
13280
|
+
],
|
|
13018
13281
|
"need": [
|
|
13019
13282
|
{
|
|
13020
13283
|
"property": "reach",
|
|
@@ -13069,6 +13332,13 @@ var UPG_FRAMEWORKS = [
|
|
|
13069
13332
|
"label": "RICE Score",
|
|
13070
13333
|
"format": "number"
|
|
13071
13334
|
},
|
|
13335
|
+
{
|
|
13336
|
+
"property": "rice_score",
|
|
13337
|
+
"expression": "(reach * impact * confidence) / effort",
|
|
13338
|
+
"entity_type": "solution",
|
|
13339
|
+
"label": "RICE Score",
|
|
13340
|
+
"format": "number"
|
|
13341
|
+
},
|
|
13072
13342
|
{
|
|
13073
13343
|
"property": "rice_score",
|
|
13074
13344
|
"expression": "(reach * impact * confidence) / effort",
|
|
@@ -13081,6 +13351,7 @@ var UPG_FRAMEWORKS = [
|
|
|
13081
13351
|
"applies_to": [
|
|
13082
13352
|
"feature",
|
|
13083
13353
|
"opportunity",
|
|
13354
|
+
"solution",
|
|
13084
13355
|
"need"
|
|
13085
13356
|
],
|
|
13086
13357
|
"inputs": [
|
|
@@ -17763,7 +18034,8 @@ var STANDARD_LABELS = {
|
|
|
17763
18034
|
product: { alt_labels: ["offering", "app", "service", "platform"] },
|
|
17764
18035
|
vision: { alt_labels: ["product vision", "north star vision", "long-term vision"] },
|
|
17765
18036
|
mission: { alt_labels: ["mission statement", "purpose"] },
|
|
17766
|
-
strategic_theme: { alt_labels: ["
|
|
18037
|
+
strategic_theme: { alt_labels: ["focus area", "strategic focus area"] },
|
|
18038
|
+
// N6: not 'theme'/'strategic pillar' (own types)
|
|
17767
18039
|
initiative: { alt_labels: ["strategic initiative", "program initiative", "workstream"] },
|
|
17768
18040
|
capability: { alt_labels: ["business capability", "organizational capability"] },
|
|
17769
18041
|
value_stream: { alt_labels: ["value chain", "stream"] },
|
|
@@ -17825,7 +18097,8 @@ var STANDARD_LABELS = {
|
|
|
17825
18097
|
fix: { alt_labels: ["bugfix", "patch", "remediation"] },
|
|
17826
18098
|
roadmap: { alt_labels: ["product roadmap", "release plan", "timeline"] },
|
|
17827
18099
|
roadmap_item: { alt_labels: ["roadmap entry", "planned item"] },
|
|
17828
|
-
|
|
18100
|
+
roadmap_theme: { alt_labels: ["product theme", "roadmap theme"] },
|
|
18101
|
+
// UPG-660: renamed from bare 'theme' (N6 lineage)
|
|
17829
18102
|
// Engineering layer
|
|
17830
18103
|
bounded_context: { alt_labels: ["context", "domain boundary", "module boundary"] },
|
|
17831
18104
|
service: { alt_labels: ["microservice", "backend service", "api service"] },
|
|
@@ -18024,7 +18297,8 @@ var STANDARD_LABELS = {
|
|
|
18024
18297
|
feedback_vote: { alt_labels: ["upvote", "vote", "user vote"] },
|
|
18025
18298
|
user_advisory_board: { alt_labels: ["cab", "customer advisory board", "advisory council"] },
|
|
18026
18299
|
beta_program: { alt_labels: ["beta", "early access", "preview program"] },
|
|
18027
|
-
feedback_theme: { alt_labels: ["feedback cluster", "
|
|
18300
|
+
feedback_theme: { alt_labels: ["feedback cluster", "feedback category"] },
|
|
18301
|
+
// N6: not bare 'theme'
|
|
18028
18302
|
// Pricing & Packaging layer
|
|
18029
18303
|
pricing_strategy: { alt_labels: ["pricing model", "monetization strategy"] },
|
|
18030
18304
|
package: { alt_labels: ["product package", "bundle", "sku"] },
|
|
@@ -18530,9 +18804,9 @@ var PRODUCT_DELIVERY_PLAYBOOK = {
|
|
|
18530
18804
|
),
|
|
18531
18805
|
seqStep(
|
|
18532
18806
|
6,
|
|
18533
|
-
"Themes & Changelog",
|
|
18534
|
-
["
|
|
18535
|
-
"Group
|
|
18807
|
+
"Roadmap Themes & Changelog",
|
|
18808
|
+
["roadmap_theme", "changelog"],
|
|
18809
|
+
"Group roadmap work into roadmap themes around the customer problem. Maintain a changelog the team and customers can read together."
|
|
18536
18810
|
)
|
|
18537
18811
|
]
|
|
18538
18812
|
};
|
|
@@ -19837,7 +20111,7 @@ var PRODUCT_SPEC_GUIDE = {
|
|
|
19837
20111
|
// registered to product_spec but missing from the navigation order).
|
|
19838
20112
|
// `changelog` lives here because it is a structural product-shipping
|
|
19839
20113
|
// artefact; content domain references it only via cross-domain bridges.
|
|
19840
|
-
creation_sequence: ["feature_area", "feature", "epic", "user_story", "acceptance_criterion", "task", "bug", "release", "roadmap", "roadmap_item", "
|
|
20114
|
+
creation_sequence: ["feature_area", "feature", "epic", "user_story", "acceptance_criterion", "task", "bug", "release", "roadmap", "roadmap_item", "roadmap_theme", "changelog"],
|
|
19841
20115
|
patterns: [
|
|
19842
20116
|
{
|
|
19843
20117
|
name: "Feature Decomposition",
|
|
@@ -24319,7 +24593,7 @@ var UPG_REGIONS = [
|
|
|
24319
24593
|
role: "leaf"
|
|
24320
24594
|
},
|
|
24321
24595
|
{
|
|
24322
|
-
type: "
|
|
24596
|
+
type: "roadmap_theme",
|
|
24323
24597
|
role: "container",
|
|
24324
24598
|
notes: "semantic spanner, not containment"
|
|
24325
24599
|
},
|
|
@@ -24355,10 +24629,10 @@ var UPG_REGIONS = [
|
|
|
24355
24629
|
"user_story_verified_by_acceptance_criterion",
|
|
24356
24630
|
"task_implements_user_story",
|
|
24357
24631
|
"roadmap_contains_roadmap_item",
|
|
24358
|
-
"
|
|
24632
|
+
"roadmap_categorised_by_roadmap_theme",
|
|
24359
24633
|
"roadmap_schedules_release",
|
|
24360
24634
|
"release_documented_in_changelog",
|
|
24361
|
-
"
|
|
24635
|
+
"roadmap_theme_spans_feature_area",
|
|
24362
24636
|
"milestone_gates_release",
|
|
24363
24637
|
"roadmap_item_references_feature",
|
|
24364
24638
|
"feature_request_voted_on_by_feedback_vote"
|
|
@@ -25679,7 +25953,7 @@ function isCanonical(text) {
|
|
|
25679
25953
|
}
|
|
25680
25954
|
|
|
25681
25955
|
// src/index.ts
|
|
25682
|
-
var UPG_VERSION = "0.
|
|
25956
|
+
var UPG_VERSION = "0.9.0";
|
|
25683
25957
|
var UPG_FORMAT_VERSION = "0.4.0";
|
|
25684
25958
|
var MARKDOWN_FORMAT_VERSION = "0.1";
|
|
25685
25959
|
var UPG_TYPES = getTypes();
|