@unified-product-graph/core 0.9.12 → 0.9.14
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 +35 -0
- package/dist/index.cjs +709 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +50 -6
- package/dist/index.d.ts +50 -6
- package/dist/index.js +707 -4
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -25,8 +25,10 @@ __export(index_exports, {
|
|
|
25
25
|
BUSINESS_GTM_GROWTH_PLAYBOOK: () => BUSINESS_GTM_GROWTH_PLAYBOOK,
|
|
26
26
|
BUSINESS_MARKETING_AUDIENCE_FIRST_PLAYBOOK: () => BUSINESS_MARKETING_AUDIENCE_FIRST_PLAYBOOK,
|
|
27
27
|
CONTENT_DEPTH_WARNING_RULES: () => CONTENT_DEPTH_WARNING_RULES,
|
|
28
|
+
DEFAULT_ENTITY_EMOJI: () => DEFAULT_ENTITY_EMOJI,
|
|
28
29
|
DISCOVERY_RESEARCH_VALIDATION_PLAYBOOK: () => DISCOVERY_RESEARCH_VALIDATION_PLAYBOOK,
|
|
29
30
|
ENGINEERING_PLATFORM_PLAYBOOK: () => ENGINEERING_PLATFORM_PLAYBOOK,
|
|
31
|
+
ENTITY_EMOJI: () => ENTITY_EMOJI,
|
|
30
32
|
EXPERIENCE_DESIGN_BRAND_PLAYBOOK: () => EXPERIENCE_DESIGN_BRAND_PLAYBOOK,
|
|
31
33
|
FOUNDATIONS_PLAYBOOK: () => FOUNDATIONS_PLAYBOOK,
|
|
32
34
|
LEGACY_PRODUCT_STAGES: () => LEGACY_PRODUCT_STAGES,
|
|
@@ -3137,7 +3139,9 @@ var UPG_EDGE_CATALOG = {
|
|
|
3137
3139
|
specification_extends_specification: { forward_verb: "extends", reverse_verb: "extended_by", classification: "hierarchy", source_type: "specification", target_type: "specification" },
|
|
3138
3140
|
specification_competes_with_specification: { forward_verb: "competes_with", reverse_verb: "competes_with", classification: "semantic", source_type: "specification", target_type: "specification" },
|
|
3139
3141
|
primitive_defined_by_specification: { forward_verb: "defined_by", reverse_verb: "defines", classification: "semantic", source_type: "primitive", target_type: "specification" },
|
|
3140
|
-
primitive_composes_primitive: { forward_verb: "composes", reverse_verb: "composed_by", classification: "hierarchy", source_type: "primitive", target_type: "primitive" }
|
|
3142
|
+
primitive_composes_primitive: { forward_verb: "composes", reverse_verb: "composed_by", classification: "hierarchy", source_type: "primitive", target_type: "primitive" },
|
|
3143
|
+
// Stewardship: a registry specification is governed by a (registry-hostable) organization (0.9.13).
|
|
3144
|
+
specification_governed_by_organization: { forward_verb: "governed_by", reverse_verb: "governs", classification: "semantic", source_type: "specification", target_type: "organization" }
|
|
3141
3145
|
};
|
|
3142
3146
|
var UPG_POLYMORPHIC_EDGE_KEYS = [
|
|
3143
3147
|
// Universal semantic verbs
|
|
@@ -7419,6 +7423,22 @@ function getDeprecatedTypes() {
|
|
|
7419
7423
|
return deprecated;
|
|
7420
7424
|
}
|
|
7421
7425
|
var UPG_PROPERTY_MIGRATIONS = {
|
|
7426
|
+
// ── v0.9.14: drop the key_result kr_status / status twin (A2) ──────────────
|
|
7427
|
+
//
|
|
7428
|
+
// key_result carried BOTH a lifecycle `status` and a `kr_status` property with
|
|
7429
|
+
// the identical four-value enum (on_track | at_risk | behind | achieved) ==
|
|
7430
|
+
// the KEY_RESULT_LIFECYCLE phases. Two fields, same values: an authoring trap.
|
|
7431
|
+
// The redundant property is removed; the authored health value lifts to the
|
|
7432
|
+
// canonical `UPGBaseNode.status` so a graph that set `kr_status` stays correct.
|
|
7433
|
+
"0.9.14": [
|
|
7434
|
+
{
|
|
7435
|
+
kind: "lift_property_to_top_level",
|
|
7436
|
+
type: "key_result",
|
|
7437
|
+
from_property: "kr_status",
|
|
7438
|
+
to: "status",
|
|
7439
|
+
reason: "A2 (0.9.14). key_result.kr_status duplicated the lifecycle `status` with the identical enum (on_track | at_risk | behind | achieved). The twin is removed; the authored health value lifts to `UPGBaseNode.status` verbatim."
|
|
7440
|
+
}
|
|
7441
|
+
],
|
|
7422
7442
|
// ── v0.9.12: technical-domain enum widening + data_flow orientation split ──
|
|
7423
7443
|
//
|
|
7424
7444
|
// Real authoring outgrew four engineering-domain enums. 0.9.12 widens them
|
|
@@ -10872,8 +10892,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10872
10892
|
key_result: {
|
|
10873
10893
|
current_value: { type: "number", description: "Most recent observed value" },
|
|
10874
10894
|
target_value: { type: "number", description: "Value for full achievement" },
|
|
10875
|
-
unit: { type: "string", description: 'Display unit (e.g. "%", "users", "\xA3")' }
|
|
10876
|
-
kr_status: { type: "string", enum: ["on_track", "at_risk", "behind", "achieved"], description: "Delivery health" }
|
|
10895
|
+
unit: { type: "string", description: 'Display unit (e.g. "%", "users", "\xA3")' }
|
|
10877
10896
|
},
|
|
10878
10897
|
// KnowledgeBaseArticleProperties: Knowledge base article.
|
|
10879
10898
|
knowledge_base_article: {
|
|
@@ -17785,6 +17804,324 @@ var UPG_FRAMEWORKS = [
|
|
|
17785
17804
|
"Time pressure makes a deeper trace expensive and the first-order call is good enough"
|
|
17786
17805
|
]
|
|
17787
17806
|
}
|
|
17807
|
+
},
|
|
17808
|
+
{
|
|
17809
|
+
"id": "value-vs-effort",
|
|
17810
|
+
"approach_ids": [
|
|
17811
|
+
"prioritise"
|
|
17812
|
+
],
|
|
17813
|
+
"name": "Value vs Effort",
|
|
17814
|
+
"version": "1.0.0",
|
|
17815
|
+
"description": "Plot features on a 2x2 matrix of value against effort. Quick wins (high value, low effort) get prioritised first.",
|
|
17816
|
+
"category": "prioritization",
|
|
17817
|
+
"origin": {
|
|
17818
|
+
"type": "practitioner",
|
|
17819
|
+
"description": "Common product management prioritisation tool. A simplified form of cost-benefit analysis.",
|
|
17820
|
+
"license": "cc_by"
|
|
17821
|
+
},
|
|
17822
|
+
"tags": [
|
|
17823
|
+
"prioritization",
|
|
17824
|
+
"quadrant"
|
|
17825
|
+
],
|
|
17826
|
+
"slots": [
|
|
17827
|
+
{
|
|
17828
|
+
"label": "Quick Wins",
|
|
17829
|
+
"entityTypeId": "feature",
|
|
17830
|
+
"role": "quick_win",
|
|
17831
|
+
"description": "High value, low effort: do first"
|
|
17832
|
+
},
|
|
17833
|
+
{
|
|
17834
|
+
"label": "Big Bets",
|
|
17835
|
+
"entityTypeId": "feature",
|
|
17836
|
+
"role": "big_bet",
|
|
17837
|
+
"description": "High value, high effort: plan carefully"
|
|
17838
|
+
},
|
|
17839
|
+
{
|
|
17840
|
+
"label": "Fill-ins",
|
|
17841
|
+
"entityTypeId": "feature",
|
|
17842
|
+
"role": "fill_in",
|
|
17843
|
+
"description": "Low value, low effort: do when idle"
|
|
17844
|
+
},
|
|
17845
|
+
{
|
|
17846
|
+
"label": "Avoid",
|
|
17847
|
+
"entityTypeId": "feature",
|
|
17848
|
+
"role": "money_pit",
|
|
17849
|
+
"description": "Low value, high effort: deprioritise"
|
|
17850
|
+
}
|
|
17851
|
+
],
|
|
17852
|
+
"data": {
|
|
17853
|
+
"entity_types": [
|
|
17854
|
+
{
|
|
17855
|
+
"type": "feature",
|
|
17856
|
+
"role": "item"
|
|
17857
|
+
}
|
|
17858
|
+
],
|
|
17859
|
+
"required_properties": {
|
|
17860
|
+
"feature": [
|
|
17861
|
+
{
|
|
17862
|
+
"property": "value",
|
|
17863
|
+
"type": "number",
|
|
17864
|
+
"required": true,
|
|
17865
|
+
"label": "Value",
|
|
17866
|
+
"description": "Expected business value (1-10)"
|
|
17867
|
+
},
|
|
17868
|
+
{
|
|
17869
|
+
"property": "effort",
|
|
17870
|
+
"type": "number",
|
|
17871
|
+
"required": true,
|
|
17872
|
+
"label": "Effort",
|
|
17873
|
+
"description": "Implementation effort (1-10)"
|
|
17874
|
+
}
|
|
17875
|
+
]
|
|
17876
|
+
},
|
|
17877
|
+
"computed_properties": [
|
|
17878
|
+
{
|
|
17879
|
+
"property": "value_effort_ratio",
|
|
17880
|
+
"expression": "value / effort",
|
|
17881
|
+
"entity_type": "feature",
|
|
17882
|
+
"label": "Value/Effort Ratio",
|
|
17883
|
+
"format": "number"
|
|
17884
|
+
}
|
|
17885
|
+
]
|
|
17886
|
+
},
|
|
17887
|
+
"structure": {
|
|
17888
|
+
"pattern": "quadrant"
|
|
17889
|
+
},
|
|
17890
|
+
"presentation": {
|
|
17891
|
+
"layout": {
|
|
17892
|
+
"type": "quadrant",
|
|
17893
|
+
"x_axis": "impact",
|
|
17894
|
+
"y_axis": "effort",
|
|
17895
|
+
"x_label": "Quick Wins",
|
|
17896
|
+
"y_label": "Big Bets"
|
|
17897
|
+
},
|
|
17898
|
+
"colour_by": "group",
|
|
17899
|
+
"card_fields": [
|
|
17900
|
+
"title",
|
|
17901
|
+
"description"
|
|
17902
|
+
]
|
|
17903
|
+
},
|
|
17904
|
+
"education": {
|
|
17905
|
+
"purpose": "Plot features on a value/effort matrix to identify quick wins (high value, low effort) and avoid resource traps (low value, high effort).",
|
|
17906
|
+
"core_question": "Which features give us the best return on engineering investment, and which are traps disguised as good ideas?",
|
|
17907
|
+
"when_to_use": [
|
|
17908
|
+
"You have more ideas or features than capacity to build them",
|
|
17909
|
+
"Stakeholders disagree on what to build next",
|
|
17910
|
+
"You need a transparent, defensible prioritisation process"
|
|
17911
|
+
],
|
|
17912
|
+
"when_not_to_use": [
|
|
17913
|
+
"You have a single obvious next step with no contention",
|
|
17914
|
+
"The backlog is small enough to sequence intuitively"
|
|
17915
|
+
]
|
|
17916
|
+
}
|
|
17917
|
+
},
|
|
17918
|
+
{
|
|
17919
|
+
"id": "eisenhower-matrix",
|
|
17920
|
+
"approach_ids": [
|
|
17921
|
+
"prioritise"
|
|
17922
|
+
],
|
|
17923
|
+
"name": "Eisenhower Matrix",
|
|
17924
|
+
"version": "1.0.0",
|
|
17925
|
+
"description": "Classify tasks by urgency and importance into four quadrants: do, schedule, delegate, or eliminate.",
|
|
17926
|
+
"category": "prioritization",
|
|
17927
|
+
"origin": {
|
|
17928
|
+
"type": "practitioner",
|
|
17929
|
+
"attribution": "Dwight D. Eisenhower",
|
|
17930
|
+
"description": "Based on a quote attributed to Eisenhower: 'What is important is seldom urgent and what is urgent is seldom important.' Popularised by Stephen Covey.",
|
|
17931
|
+
"license": "public_domain"
|
|
17932
|
+
},
|
|
17933
|
+
"tags": [
|
|
17934
|
+
"prioritization",
|
|
17935
|
+
"quadrant"
|
|
17936
|
+
],
|
|
17937
|
+
"slots": [
|
|
17938
|
+
{
|
|
17939
|
+
"label": "Do First",
|
|
17940
|
+
"entityTypeId": "feature",
|
|
17941
|
+
"role": "do_first",
|
|
17942
|
+
"description": "Urgent and important: act immediately"
|
|
17943
|
+
},
|
|
17944
|
+
{
|
|
17945
|
+
"label": "Schedule",
|
|
17946
|
+
"entityTypeId": "feature",
|
|
17947
|
+
"role": "schedule",
|
|
17948
|
+
"description": "Important but not urgent: plan it"
|
|
17949
|
+
},
|
|
17950
|
+
{
|
|
17951
|
+
"label": "Delegate",
|
|
17952
|
+
"entityTypeId": "feature",
|
|
17953
|
+
"role": "delegate",
|
|
17954
|
+
"description": "Urgent but not important: hand off"
|
|
17955
|
+
},
|
|
17956
|
+
{
|
|
17957
|
+
"label": "Eliminate",
|
|
17958
|
+
"entityTypeId": "feature",
|
|
17959
|
+
"role": "eliminate",
|
|
17960
|
+
"description": "Neither urgent nor important: drop it"
|
|
17961
|
+
}
|
|
17962
|
+
],
|
|
17963
|
+
"data": {
|
|
17964
|
+
"entity_types": [
|
|
17965
|
+
{
|
|
17966
|
+
"type": "feature",
|
|
17967
|
+
"role": "item"
|
|
17968
|
+
}
|
|
17969
|
+
],
|
|
17970
|
+
"required_properties": {
|
|
17971
|
+
"feature": [
|
|
17972
|
+
{
|
|
17973
|
+
"property": "urgency",
|
|
17974
|
+
"type": "number",
|
|
17975
|
+
"required": true,
|
|
17976
|
+
"label": "Urgency",
|
|
17977
|
+
"description": "How time-sensitive is this? (1-5)"
|
|
17978
|
+
},
|
|
17979
|
+
{
|
|
17980
|
+
"property": "importance",
|
|
17981
|
+
"type": "number",
|
|
17982
|
+
"required": true,
|
|
17983
|
+
"label": "Importance",
|
|
17984
|
+
"description": "How important is this to goals? (1-5)"
|
|
17985
|
+
}
|
|
17986
|
+
]
|
|
17987
|
+
},
|
|
17988
|
+
"computed_properties": [
|
|
17989
|
+
{
|
|
17990
|
+
"property": "priority_score",
|
|
17991
|
+
"expression": "(urgency * 2) + importance",
|
|
17992
|
+
"entity_type": "feature",
|
|
17993
|
+
"label": "Priority Score",
|
|
17994
|
+
"format": "number"
|
|
17995
|
+
}
|
|
17996
|
+
]
|
|
17997
|
+
},
|
|
17998
|
+
"structure": {
|
|
17999
|
+
"pattern": "quadrant"
|
|
18000
|
+
},
|
|
18001
|
+
"presentation": {
|
|
18002
|
+
"layout": {
|
|
18003
|
+
"type": "quadrant",
|
|
18004
|
+
"x_axis": "impact",
|
|
18005
|
+
"y_axis": "effort",
|
|
18006
|
+
"x_label": "Do First",
|
|
18007
|
+
"y_label": "Schedule"
|
|
18008
|
+
},
|
|
18009
|
+
"colour_by": "group",
|
|
18010
|
+
"card_fields": [
|
|
18011
|
+
"title",
|
|
18012
|
+
"description"
|
|
18013
|
+
]
|
|
18014
|
+
},
|
|
18015
|
+
"education": {
|
|
18016
|
+
"purpose": "Sort tasks by urgency and importance into four quadrants, making it clear what to do now, schedule, delegate, or eliminate.",
|
|
18017
|
+
"core_question": "Am I spending my time on what matters most, or am I trapped in the urgent-but-unimportant quadrant?",
|
|
18018
|
+
"when_to_use": [
|
|
18019
|
+
"You have more ideas or features than capacity to build them",
|
|
18020
|
+
"Stakeholders disagree on what to build next",
|
|
18021
|
+
"You need a transparent, defensible prioritisation process"
|
|
18022
|
+
],
|
|
18023
|
+
"when_not_to_use": [
|
|
18024
|
+
"You have a single obvious next step with no contention",
|
|
18025
|
+
"The backlog is small enough to sequence intuitively"
|
|
18026
|
+
]
|
|
18027
|
+
}
|
|
18028
|
+
},
|
|
18029
|
+
{
|
|
18030
|
+
"id": "four-forces-of-progress",
|
|
18031
|
+
"approach_ids": [
|
|
18032
|
+
"reflect"
|
|
18033
|
+
],
|
|
18034
|
+
"name": "Four Forces of Progress",
|
|
18035
|
+
"version": "1.0.0",
|
|
18036
|
+
"description": "Analyse the four forces that drive or inhibit customers switching to a new solution: Push, Pull, Anxiety, and Habit.",
|
|
18037
|
+
"category": "discovery",
|
|
18038
|
+
"origin": {
|
|
18039
|
+
"type": "practitioner",
|
|
18040
|
+
"attribution": "Bob Moesta",
|
|
18041
|
+
"description": "Demand-Side Sales 101",
|
|
18042
|
+
"url": "https://jobstobedone.org/",
|
|
18043
|
+
"year": 2014,
|
|
18044
|
+
"license": "published_methodology"
|
|
18045
|
+
},
|
|
18046
|
+
"tags": [
|
|
18047
|
+
"discovery",
|
|
18048
|
+
"matrix"
|
|
18049
|
+
],
|
|
18050
|
+
"slots": [
|
|
18051
|
+
{
|
|
18052
|
+
"label": "Push of Current Situation",
|
|
18053
|
+
"entityTypeId": "need",
|
|
18054
|
+
"role": "push",
|
|
18055
|
+
"description": "Place need entities in the Push of Current Situation position of the matrix"
|
|
18056
|
+
},
|
|
18057
|
+
{
|
|
18058
|
+
"label": "Pull of New Solution",
|
|
18059
|
+
"entityTypeId": "desired_outcome",
|
|
18060
|
+
"role": "pull",
|
|
18061
|
+
"description": "Place desired outcome entities in the Pull of New Solution position of the matrix"
|
|
18062
|
+
},
|
|
18063
|
+
{
|
|
18064
|
+
"label": "Anxiety of New Solution",
|
|
18065
|
+
"entityTypeId": "switching_cost",
|
|
18066
|
+
"role": "anxiety",
|
|
18067
|
+
"description": "Place switching cost entities in the Anxiety of New Solution position of the matrix"
|
|
18068
|
+
},
|
|
18069
|
+
{
|
|
18070
|
+
"label": "Habit of Current Situation",
|
|
18071
|
+
"entityTypeId": "switching_cost",
|
|
18072
|
+
"role": "habit",
|
|
18073
|
+
"description": "Place switching cost entities in the Habit of Current Situation position of the matrix"
|
|
18074
|
+
}
|
|
18075
|
+
],
|
|
18076
|
+
"data": {
|
|
18077
|
+
"entity_types": [
|
|
18078
|
+
{
|
|
18079
|
+
"type": "need",
|
|
18080
|
+
"role": "bucket"
|
|
18081
|
+
},
|
|
18082
|
+
{
|
|
18083
|
+
"type": "switching_cost",
|
|
18084
|
+
"role": "bucket"
|
|
18085
|
+
},
|
|
18086
|
+
{
|
|
18087
|
+
"type": "desired_outcome",
|
|
18088
|
+
"role": "bucket"
|
|
18089
|
+
}
|
|
18090
|
+
],
|
|
18091
|
+
"required_properties": {}
|
|
18092
|
+
},
|
|
18093
|
+
"structure": {
|
|
18094
|
+
"pattern": "matrix"
|
|
18095
|
+
},
|
|
18096
|
+
"presentation": {
|
|
18097
|
+
"layout": {
|
|
18098
|
+
"type": "matrix",
|
|
18099
|
+
"rows": 2,
|
|
18100
|
+
"cols": 2
|
|
18101
|
+
},
|
|
18102
|
+
"sort_by": {
|
|
18103
|
+
"property": "title",
|
|
18104
|
+
"direction": "asc"
|
|
18105
|
+
},
|
|
18106
|
+
"colour_by": "group",
|
|
18107
|
+
"card_fields": [
|
|
18108
|
+
"title",
|
|
18109
|
+
"description"
|
|
18110
|
+
]
|
|
18111
|
+
},
|
|
18112
|
+
"education": {
|
|
18113
|
+
"purpose": "Map the four forces that drive or resist a customer's switch to a new solution (Push, Pull, Anxiety, Habit) to understand why people change (or don't).",
|
|
18114
|
+
"core_question": "Are the push and pull forces strong enough to overcome the anxiety of the new and the comfort of the familiar?",
|
|
18115
|
+
"when_to_use": [
|
|
18116
|
+
"You need to understand unmet user needs before committing to solutions",
|
|
18117
|
+
"The problem space is ambiguous and requires structured exploration",
|
|
18118
|
+
"You want to reduce the risk of building the wrong thing"
|
|
18119
|
+
],
|
|
18120
|
+
"when_not_to_use": [
|
|
18121
|
+
"The solution is well-understood and validated",
|
|
18122
|
+
"You are in a delivery phase with clear requirements"
|
|
18123
|
+
]
|
|
18124
|
+
}
|
|
17788
18125
|
}
|
|
17789
18126
|
];
|
|
17790
18127
|
var UPG_FRAMEWORKS_BY_ID = Object.fromEntries(
|
|
@@ -18231,6 +18568,326 @@ function isUPGDocument(doc) {
|
|
|
18231
18568
|
return validateUPGDocument(doc).valid;
|
|
18232
18569
|
}
|
|
18233
18570
|
|
|
18571
|
+
// src/presentation/entity-emoji.ts
|
|
18572
|
+
var DEFAULT_ENTITY_EMOJI = "\u{1F4E6}";
|
|
18573
|
+
var ENTITY_EMOJI = {
|
|
18574
|
+
a11y_annotation: "\u{1F9BB}",
|
|
18575
|
+
a11y_audit: "\u267F",
|
|
18576
|
+
a11y_guideline: "\u{1F9AF}",
|
|
18577
|
+
a11y_issue: "\u{1F6AB}",
|
|
18578
|
+
a11y_standard: "\u{1F4CF}",
|
|
18579
|
+
acceptance_criterion: "\u2705",
|
|
18580
|
+
access_policy: "\u{1F511}",
|
|
18581
|
+
account: "\u{1F3E6}",
|
|
18582
|
+
acquisition_channel: "\u{1F3A3}",
|
|
18583
|
+
ad_creative: "\u{1F58C}\uFE0F",
|
|
18584
|
+
affinity_cluster: "\u{1F9F2}",
|
|
18585
|
+
agent_definition: "\u{1F9BE}",
|
|
18586
|
+
agent_hook: "\u{1F9F7}",
|
|
18587
|
+
agent_session: "\u{1F9D1}\u200D\u{1F4BB}",
|
|
18588
|
+
agent_skill: "\u{1FA84}",
|
|
18589
|
+
agent_task: "\u{1F3AB}",
|
|
18590
|
+
aggregate: "\u{1FAD9}",
|
|
18591
|
+
ai_cost_tracker: "\u{1F4B8}",
|
|
18592
|
+
ai_dataset: "\u{1FA86}",
|
|
18593
|
+
ai_experiment: "\u{1F47E}",
|
|
18594
|
+
ai_guardrail: "\u{1F6A6}",
|
|
18595
|
+
ai_model: "\u{1F916}",
|
|
18596
|
+
ai_trace: "\u{1FAA1}",
|
|
18597
|
+
alert_rule: "\u{1F6CE}\uFE0F",
|
|
18598
|
+
annotation: "\u{1F5EF}\uFE0F",
|
|
18599
|
+
api_contract: "\u{1F91D}",
|
|
18600
|
+
api_ecosystem: "\u{1F578}\uFE0F",
|
|
18601
|
+
api_endpoint: "\u{1F50C}",
|
|
18602
|
+
approval_record: "\u{1F50F}",
|
|
18603
|
+
assumption: "\u{1F914}",
|
|
18604
|
+
attribution_model: "\u{1F575}\uFE0F",
|
|
18605
|
+
audit_log_policy: "\u{1FAB5}",
|
|
18606
|
+
behavioral_segment: "\u{1F43E}",
|
|
18607
|
+
beta_program: "\u{1F423}",
|
|
18608
|
+
bounded_context: "\u{1F532}",
|
|
18609
|
+
brand_asset: "\u{1F5C2}\uFE0F",
|
|
18610
|
+
brand_colour: "\u{1F308}",
|
|
18611
|
+
brand_identity: "\u{1F4A0}",
|
|
18612
|
+
brand_imagery: "\u{1F5BC}\uFE0F",
|
|
18613
|
+
brand_logo: "\u{1F537}",
|
|
18614
|
+
brand_typography: "\u{1F524}",
|
|
18615
|
+
brand_voice: "\u{1F399}\uFE0F",
|
|
18616
|
+
bug: "\u{1F41B}",
|
|
18617
|
+
build_artifact: "\u{1F3FA}",
|
|
18618
|
+
business_model: "\u{1F4B0}",
|
|
18619
|
+
capability: "\u{1F4AA}",
|
|
18620
|
+
capacity_plan: "\u{1F5D3}\uFE0F",
|
|
18621
|
+
ceremony: "\u{1F514}",
|
|
18622
|
+
certification: "\u{1F3F5}\uFE0F",
|
|
18623
|
+
change_request: "\u270F\uFE0F",
|
|
18624
|
+
changelog: "\u{1F570}\uFE0F",
|
|
18625
|
+
churn_reason: "\u{1F494}",
|
|
18626
|
+
ci_pipeline: "\u{1F687}",
|
|
18627
|
+
classification_axis: "\u2194\uFE0F",
|
|
18628
|
+
classification_value: "\u{1F4CD}",
|
|
18629
|
+
code_repository: "\u{1F4BE}",
|
|
18630
|
+
cohort: "\u{1F465}",
|
|
18631
|
+
command: "\u2328\uFE0F",
|
|
18632
|
+
community_initiative: "\u{1F30D}",
|
|
18633
|
+
competitive_analysis: "\u{1F4CA}",
|
|
18634
|
+
competitive_battle_card: "\u2694\uFE0F",
|
|
18635
|
+
competitor: "\u{1F94A}",
|
|
18636
|
+
competitor_feature: "\u{1F52C}",
|
|
18637
|
+
compliance_framework: "\u{1F3DF}\uFE0F",
|
|
18638
|
+
compliance_requirement: "\u26F2",
|
|
18639
|
+
constraint: "\u{1F512}",
|
|
18640
|
+
contact: "\u{1F4C7}",
|
|
18641
|
+
content_calendar: "\u{1F4C5}",
|
|
18642
|
+
content_piece: "\u{1F5D2}\uFE0F",
|
|
18643
|
+
content_strategy: "\u270D\uFE0F",
|
|
18644
|
+
content_theme: "\u{1F4A1}",
|
|
18645
|
+
contract: "\u{1F4D1}",
|
|
18646
|
+
contract_clause: "\xA7",
|
|
18647
|
+
cost_structure: "\u{1F9EE}",
|
|
18648
|
+
cultural_adaptation: "\u{1F30F}",
|
|
18649
|
+
customer_feedback: "\u{1F536}",
|
|
18650
|
+
customer_health_score: "\u{1F49A}",
|
|
18651
|
+
customer_journey_stage: "\u{1F68F}",
|
|
18652
|
+
customer_relationship: "\u{1FAF6}",
|
|
18653
|
+
dashboard: "\u{1F39B}\uFE0F",
|
|
18654
|
+
data_classification: "\u{1F343}",
|
|
18655
|
+
data_contract: "\u{1F523}",
|
|
18656
|
+
data_domain: "\u{1F3F7}\uFE0F",
|
|
18657
|
+
data_flow: "\u2195\uFE0F",
|
|
18658
|
+
data_lineage: "\u{1F333}",
|
|
18659
|
+
data_model: "\u{1F5C3}\uFE0F",
|
|
18660
|
+
data_pipeline: "\u{1FAA3}",
|
|
18661
|
+
data_product: "\u{1F381}",
|
|
18662
|
+
data_quality_rule: "\u{1F9F9}",
|
|
18663
|
+
data_source: "\u{1F6E2}\uFE0F",
|
|
18664
|
+
database_schema: "\u{1F5C4}\uFE0F",
|
|
18665
|
+
deal: "\u{1F4BC}",
|
|
18666
|
+
decision: "\u2696\uFE0F",
|
|
18667
|
+
deliverable: "\u{1F380}",
|
|
18668
|
+
demand_gen_program: "\u{1F4E3}",
|
|
18669
|
+
department: "\u{1F3EC}",
|
|
18670
|
+
dependency: "\u26D3\uFE0F",
|
|
18671
|
+
deployment: "\u{1F4E4}",
|
|
18672
|
+
design_component: "\u{1F9F1}",
|
|
18673
|
+
design_concept: "\u{1F331}",
|
|
18674
|
+
design_guideline: "\u{1F4CC}",
|
|
18675
|
+
design_pattern: "\u{1F9E9}",
|
|
18676
|
+
design_question: "\u{1F4AD}",
|
|
18677
|
+
design_sprint: "\u{1F3C3}",
|
|
18678
|
+
design_system: "\u{1F9F0}",
|
|
18679
|
+
design_token: "\u{1FA99}",
|
|
18680
|
+
desired_outcome: "\u{1F31F}",
|
|
18681
|
+
developer_portal: "\u{1F391}",
|
|
18682
|
+
discount_strategy: "\u2702\uFE0F",
|
|
18683
|
+
distribution_channel: "\u{1F69A}",
|
|
18684
|
+
document: "\u{1F4C3}",
|
|
18685
|
+
documentation_template: "\u{1F58A}\uFE0F",
|
|
18686
|
+
domain_entity: "\u{1F4E6}",
|
|
18687
|
+
domain_event: "\u{1F4E1}",
|
|
18688
|
+
education_program: "\u{1F3EB}",
|
|
18689
|
+
email_sequence: "\u{1F4E7}",
|
|
18690
|
+
epic: "\u{1F4DC}",
|
|
18691
|
+
error_budget: "\u23F3",
|
|
18692
|
+
eval_benchmark: "\u{1F396}\uFE0F",
|
|
18693
|
+
eval_run: "\u{1F39F}\uFE0F",
|
|
18694
|
+
event: "\u{1F388}",
|
|
18695
|
+
event_schema: "\u{1F520}",
|
|
18696
|
+
evidence: "\u{1F50E}",
|
|
18697
|
+
experiment: "\u{1F9EB}",
|
|
18698
|
+
experiment_plan: "\u{1F4D0}",
|
|
18699
|
+
experiment_run: "\u25B6\uFE0F",
|
|
18700
|
+
external_api: "\u{1F310}",
|
|
18701
|
+
feasibility_study: "\u{1F3D7}\uFE0F",
|
|
18702
|
+
feature: "\u2B50",
|
|
18703
|
+
feature_area: "\u{1F4C1}",
|
|
18704
|
+
feature_flag: "\u{1F38C}",
|
|
18705
|
+
feature_request: "\u{1F64F}",
|
|
18706
|
+
feedback_program: "\u{1F3A4}",
|
|
18707
|
+
feedback_theme: "\u{1F4CE}",
|
|
18708
|
+
feedback_vote: "\u{1F44D}",
|
|
18709
|
+
fix: "\u{1FA9B}",
|
|
18710
|
+
forecast: "\u{1F52E}",
|
|
18711
|
+
framework_exercise: "\u{1F4CB}",
|
|
18712
|
+
funnel: "\u2B07\uFE0F",
|
|
18713
|
+
funnel_step: "\u{1F53D}",
|
|
18714
|
+
glossary_term: "\u{1F4D6}",
|
|
18715
|
+
growth_campaign: "\u{1F4E2}",
|
|
18716
|
+
growth_loop: "\u267E\uFE0F",
|
|
18717
|
+
gtm_strategy: "\u{1F3F9}",
|
|
18718
|
+
hallucination_report: "\u{1F47B}",
|
|
18719
|
+
help_video: "\u{1F3AC}",
|
|
18720
|
+
hypothesis: "\u{1F9EA}",
|
|
18721
|
+
ideal_customer_profile: "\u{1F464}",
|
|
18722
|
+
incident: "\u{1F6A8}",
|
|
18723
|
+
infrastructure_component: "\u{1F5A7}",
|
|
18724
|
+
initiative: "\u{1F680}",
|
|
18725
|
+
insight: "\u{1F526}",
|
|
18726
|
+
integration_partner: "\u{1F5FF}",
|
|
18727
|
+
integration_pattern: "\u{1F517}",
|
|
18728
|
+
interaction_spec: "\u{1F5B1}\uFE0F",
|
|
18729
|
+
interview_guide: "\u{1F4CB}",
|
|
18730
|
+
investigation: "\u{1F50D}",
|
|
18731
|
+
invoice: "\u{1F4B3}",
|
|
18732
|
+
ip_asset: "\xA9\uFE0F",
|
|
18733
|
+
job: "\u{1F528}",
|
|
18734
|
+
job_step: "\u{1F463}",
|
|
18735
|
+
journey_action: "\u26A1",
|
|
18736
|
+
journey_phase: "\u{1F516}",
|
|
18737
|
+
journey_step: "\u{1FA9C}",
|
|
18738
|
+
key_activity: "\u{1F6E0}\uFE0F",
|
|
18739
|
+
key_resource: "\u{1F3ED}",
|
|
18740
|
+
key_result: "\u{1F4C8}",
|
|
18741
|
+
knowledge_base_article: "\u{1F4D3}",
|
|
18742
|
+
launch: "\u{1F6F8}",
|
|
18743
|
+
lead: "\u{1F33F}",
|
|
18744
|
+
learning: "\u{1F9E0}",
|
|
18745
|
+
learning_path: "\u{1F97E}",
|
|
18746
|
+
legal_entity: "\u{1F3E2}",
|
|
18747
|
+
library_dependency: "\u{1F4DA}",
|
|
18748
|
+
locale: "\u{1F30E}",
|
|
18749
|
+
locale_config: "\u{1F5FE}",
|
|
18750
|
+
market_segment: "\u{1F3AF}",
|
|
18751
|
+
market_trend: "\u{1F4C9}",
|
|
18752
|
+
marketing_campaign_plan: "\u{1F4C6}",
|
|
18753
|
+
marketing_channel: "\u{1F4FB}",
|
|
18754
|
+
marketing_strategy: "\u{1F531}",
|
|
18755
|
+
marketplace_listing: "\u{1F6D2}",
|
|
18756
|
+
messaging: "\u2709\uFE0F",
|
|
18757
|
+
metric: "\u{1F522}",
|
|
18758
|
+
metric_quality_assessment: "\u{1FA7A}",
|
|
18759
|
+
milestone: "\u26F3",
|
|
18760
|
+
mission: "\u{1F9ED}",
|
|
18761
|
+
model_comparison: "\u{1F504}",
|
|
18762
|
+
monitor: "\u{1F4FA}",
|
|
18763
|
+
need: "\u{1FAC0}",
|
|
18764
|
+
nps_campaign: "\u{1F60A}",
|
|
18765
|
+
objection: "\u{1F6A7}",
|
|
18766
|
+
objective: "\u{1F3C1}",
|
|
18767
|
+
observation: "\u{1F441}\uFE0F",
|
|
18768
|
+
on_call_rotation: "\u{1F3D5}\uFE0F",
|
|
18769
|
+
opportunity: "\u{1F6AA}",
|
|
18770
|
+
organization: "\u{1F3D9}\uFE0F",
|
|
18771
|
+
outcome: "\u{1F3C6}",
|
|
18772
|
+
participant: "\u{1F64B}",
|
|
18773
|
+
partner_program: "\u{1F397}\uFE0F",
|
|
18774
|
+
partner_revenue_share: "\u{1F932}",
|
|
18775
|
+
partner_tier: "\u{1F948}",
|
|
18776
|
+
partnership: "\u{1FAF1}\u{1F3FB}\u200D\u{1FAF2}\u{1F3FC}",
|
|
18777
|
+
paywall: "\u{1F6C2}",
|
|
18778
|
+
penetration_test: "\u{1F5E1}\uFE0F",
|
|
18779
|
+
person: "\u{1F9D1}",
|
|
18780
|
+
persona: "\u{1F3AD}",
|
|
18781
|
+
pipeline_sales: "\u{1FA88}",
|
|
18782
|
+
pipeline_stage: "\u{1F9FD}",
|
|
18783
|
+
playbook: "\u{1F4D2}",
|
|
18784
|
+
portfolio: "\u{1F9F8}",
|
|
18785
|
+
positioning: "\u{1F3AA}",
|
|
18786
|
+
postmortem: "\u{1FA7B}",
|
|
18787
|
+
press_release: "\u{1F5DE}\uFE0F",
|
|
18788
|
+
pricing_strategy: "\u{1F4B1}",
|
|
18789
|
+
pricing_tier: "\u{1F949}",
|
|
18790
|
+
primitive: "\u{1F4CB}",
|
|
18791
|
+
privacy_policy: "\u{1F6E1}\uFE0F",
|
|
18792
|
+
product: "\u{1F9EC}",
|
|
18793
|
+
product_area: "\u{1FA80}",
|
|
18794
|
+
program: "\u{1F6CB}\uFE0F",
|
|
18795
|
+
project: "\u{1F9F3}",
|
|
18796
|
+
prompt_template: "\u2712\uFE0F",
|
|
18797
|
+
prompt_version: "\u{1F5E8}\uFE0F",
|
|
18798
|
+
proof_point: "\u{1F9FE}",
|
|
18799
|
+
prototype: "\u{1F4F1}",
|
|
18800
|
+
qa_session: "\u{1F41E}",
|
|
18801
|
+
queue_topic: "\u{1F4EC}",
|
|
18802
|
+
quote: "\u{1F5E3}\uFE0F",
|
|
18803
|
+
quote_document: "\u{1F4B2}",
|
|
18804
|
+
read_model: "\u{1FA9F}",
|
|
18805
|
+
rebuttal: "\u21A9\uFE0F",
|
|
18806
|
+
regional_pricing: "\u{1F4B4}",
|
|
18807
|
+
regression_test: "\u267B\uFE0F",
|
|
18808
|
+
release: "\u{1F6A2}",
|
|
18809
|
+
release_strategy: "\u{1FA82}",
|
|
18810
|
+
report: "\u{1F4F0}",
|
|
18811
|
+
research_plan: "\u{1F5FA}\uFE0F",
|
|
18812
|
+
research_question: "\u2753",
|
|
18813
|
+
research_study: "\u{1F9D1}\u200D\u{1F52C}",
|
|
18814
|
+
resource_allocation: "\u{1F967}",
|
|
18815
|
+
retrospective: "\u{1FA9E}",
|
|
18816
|
+
revenue_stream: "\u{1F4B5}",
|
|
18817
|
+
review_gate: "\u{1F6A5}",
|
|
18818
|
+
risk: "\u{1F3B2}",
|
|
18819
|
+
risk_register: "\u{1F9EF}",
|
|
18820
|
+
roadmap: "\u{1F6E3}\uFE0F",
|
|
18821
|
+
roadmap_item: "\u{1F6A9}",
|
|
18822
|
+
roadmap_theme: "\u{1F3A8}",
|
|
18823
|
+
role: "\u{1FAAA}",
|
|
18824
|
+
root_cause: "\u{1FA9D}",
|
|
18825
|
+
runbook: "\u{1F4D8}",
|
|
18826
|
+
sales_motion: "\u{1F501}",
|
|
18827
|
+
screen: "\u{1F5A5}\uFE0F",
|
|
18828
|
+
screen_state: "\u{1F533}",
|
|
18829
|
+
security_audit: "\u{1F6C3}",
|
|
18830
|
+
security_control: "\u{1F39A}\uFE0F",
|
|
18831
|
+
security_policy: "\u{1F510}",
|
|
18832
|
+
security_review: "\u{1F9D0}",
|
|
18833
|
+
seo_keyword: "#\uFE0F\u20E3",
|
|
18834
|
+
service: "\u2699\uFE0F",
|
|
18835
|
+
service_blueprint: "\u{1F7E3}",
|
|
18836
|
+
service_level_agreement: "\u23F1\uFE0F",
|
|
18837
|
+
service_level_indicator: "\u{1F321}\uFE0F",
|
|
18838
|
+
service_level_objective: "\u{1F945}",
|
|
18839
|
+
skill: "\u{1F393}",
|
|
18840
|
+
social_post: "\u{1F426}",
|
|
18841
|
+
solution: "\u{1F527}",
|
|
18842
|
+
specification: "\u{1F4CB}",
|
|
18843
|
+
stakeholder: "\u{1F9D1}\u200D\u{1F4BC}",
|
|
18844
|
+
status_report: "\u{1F4C4}",
|
|
18845
|
+
strategic_pillar: "\u{1F3DB}\uFE0F",
|
|
18846
|
+
strategic_theme: "\u{1F9F5}",
|
|
18847
|
+
subscription: "\u{1F502}",
|
|
18848
|
+
success_milestone: "\u{1F389}",
|
|
18849
|
+
support_ticket: "\u{1F198}",
|
|
18850
|
+
survey_response: "\u{1F4E8}",
|
|
18851
|
+
switching_cost: "\u2693",
|
|
18852
|
+
symptom: "\u26A0\uFE0F",
|
|
18853
|
+
task: "\u2611\uFE0F",
|
|
18854
|
+
team: "\u{1FAC2}",
|
|
18855
|
+
team_okr: "\u{1F3C5}",
|
|
18856
|
+
technical_debt_item: "\u{1FAA4}",
|
|
18857
|
+
territory: "\u{1F3F4}",
|
|
18858
|
+
test_case: "\u{1F335}",
|
|
18859
|
+
test_coverage_report: "\u{1F38F}",
|
|
18860
|
+
test_environment: "\u2697\uFE0F",
|
|
18861
|
+
test_plan: "\u{1F4DD}",
|
|
18862
|
+
test_result: "\u{1F3B0}",
|
|
18863
|
+
test_suite: "\u{1F4C2}",
|
|
18864
|
+
threat: "\u2620\uFE0F",
|
|
18865
|
+
threat_model: "\u{1F3F4}\u200D\u2620\uFE0F",
|
|
18866
|
+
touchpoint: "\u{1F446}",
|
|
18867
|
+
translation_bundle: "\u{1F202}\uFE0F",
|
|
18868
|
+
translation_key: "\u{1F5DD}\uFE0F",
|
|
18869
|
+
trial_config: "\u{1F193}",
|
|
18870
|
+
tutorial: "\u{1F9D1}\u200D\u{1F3EB}",
|
|
18871
|
+
unit_economics: "\u{1F4B9}",
|
|
18872
|
+
user_advisory_board: "\u{1FAF5}",
|
|
18873
|
+
user_flow: "\u{1F500}",
|
|
18874
|
+
user_journey: "\u{1F6E4}\uFE0F",
|
|
18875
|
+
user_story: "\u{1F4AC}",
|
|
18876
|
+
value_object: "\u{1F48E}",
|
|
18877
|
+
value_proposition: "\u2728",
|
|
18878
|
+
value_stream: "\u{1F30A}",
|
|
18879
|
+
variant: "\u{1F18E}",
|
|
18880
|
+
vision: "\u{1F52D}",
|
|
18881
|
+
vulnerability: "\u{1F513}",
|
|
18882
|
+
walkthrough: "\u{1F6B6}",
|
|
18883
|
+
webinar: "\u{1F3A5}",
|
|
18884
|
+
wireframe: "\u25AD",
|
|
18885
|
+
workflow_artifact: "\u{1F5F3}\uFE0F",
|
|
18886
|
+
workflow_run: "\u23EF\uFE0F",
|
|
18887
|
+
workflow_template: "\u{1F3BB}",
|
|
18888
|
+
workspace: "\u{1F3E0}"
|
|
18889
|
+
};
|
|
18890
|
+
|
|
18234
18891
|
// src/presentation/labels.ts
|
|
18235
18892
|
var PRIORITY_LABELS = [
|
|
18236
18893
|
// ── need (CONSOLIDATED: replaces pain_point + user_need) ─────────────────────
|
|
@@ -19144,6 +19801,7 @@ var UPG_TYPE_LABELS = UPG_ACTIVE_TYPES.map((typeName) => {
|
|
|
19144
19801
|
};
|
|
19145
19802
|
return {
|
|
19146
19803
|
...priority,
|
|
19804
|
+
emoji: ENTITY_EMOJI[typeName] ?? DEFAULT_ENTITY_EMOJI,
|
|
19147
19805
|
alt_labels: [...priority.alt_labels, ...newAliases, ...slotAliases2],
|
|
19148
19806
|
framework_labels: mergedFrameworkLabels
|
|
19149
19807
|
};
|
|
@@ -19156,6 +19814,7 @@ var UPG_TYPE_LABELS = UPG_ACTIVE_TYPES.map((typeName) => {
|
|
|
19156
19814
|
return {
|
|
19157
19815
|
id: typeName,
|
|
19158
19816
|
canonical_label: toTitleCase(typeName),
|
|
19817
|
+
emoji: ENTITY_EMOJI[typeName] ?? DEFAULT_ENTITY_EMOJI,
|
|
19159
19818
|
alt_labels: [...standard.alt_labels, ...newAliases, ...slotAliases2],
|
|
19160
19819
|
framework_labels: generated?.framework_labels ?? {}
|
|
19161
19820
|
};
|
|
@@ -19164,6 +19823,7 @@ var UPG_TYPE_LABELS = UPG_ACTIVE_TYPES.map((typeName) => {
|
|
|
19164
19823
|
return {
|
|
19165
19824
|
id: typeName,
|
|
19166
19825
|
canonical_label: toTitleCase(typeName),
|
|
19826
|
+
emoji: ENTITY_EMOJI[typeName] ?? DEFAULT_ENTITY_EMOJI,
|
|
19167
19827
|
alt_labels: [...migrationAliases, ...slotAliases],
|
|
19168
19828
|
framework_labels: generated?.framework_labels ?? {}
|
|
19169
19829
|
};
|
|
@@ -24373,6 +25033,47 @@ var UPG_ANTI_PATTERNS = [
|
|
|
24373
25033
|
stages: ["beta", "launch", "growth", "mature"],
|
|
24374
25034
|
severity: "medium",
|
|
24375
25035
|
source: { kind: "practitioner", attribution: "Marty Cagan, Inspired (product discovery)" }
|
|
25036
|
+
},
|
|
25037
|
+
// ── Foundations layer (0.9.13): portfolio-scoped, registry-aware ──────────
|
|
25038
|
+
// These read the shared registry + cross-product edges, so they are evaluated
|
|
25039
|
+
// by portfolio_validate, not the single-graph evaluator. They carry no
|
|
25040
|
+
// structured_condition (the detector is cross-product, not a single-graph
|
|
25041
|
+
// IntelligenceCondition).
|
|
25042
|
+
{
|
|
25043
|
+
id: "specification-without-implementer",
|
|
25044
|
+
since: "0.9.13",
|
|
25045
|
+
scope: "portfolio",
|
|
25046
|
+
name: "Specification without implementer",
|
|
25047
|
+
description: "A specification in the shared registry has no product, feature, or api_contract implementing or conforming to it anywhere in the portfolio. A specification nobody implements is a document, not a contract: it states an intent the portfolio never honours.",
|
|
25048
|
+
why_it_matters: "An unimplemented specification carries authority it has not earned. Teams cite it as a standard while no surface actually conforms, so conformance claims cannot be trusted or traced.",
|
|
25049
|
+
remediation: "Link at least one product, feature, or api_contract to the specification via `product_implements_specification`, `product_exposes_specification`, `feature_conforms_to_specification`, or `api_contract_speaks_specification`; or retire the specification from the registry.",
|
|
25050
|
+
stages: ["validation", "build", "beta", "launch", "growth", "mature"],
|
|
25051
|
+
severity: "medium",
|
|
25052
|
+
source: { kind: "fundamental" }
|
|
25053
|
+
},
|
|
25054
|
+
{
|
|
25055
|
+
id: "primitive-scattered-without-canonical",
|
|
25056
|
+
since: "0.9.13",
|
|
25057
|
+
scope: "portfolio",
|
|
25058
|
+
name: "Primitive scattered without a canonical",
|
|
25059
|
+
description: "The same primitive concept appears as a product-local node in two or more products, but no canonical primitive in the shared registry unifies them. Each product redefines the building block on its own terms, so the portfolio carries several drifting copies of one shared idea instead of a single authoritative definition.",
|
|
25060
|
+
why_it_matters: "Scattered primitives drift apart in name, shape, and meaning. Cross-product reasoning breaks because the same concept reads as several unrelated entities, and a change to the shared building block has no single place to land.",
|
|
25061
|
+
remediation: "Define the shared primitive once in the registry with `define_canonical_entity`, then link each product copy via `register_instance` so the building block has one authoritative definition.",
|
|
25062
|
+
stages: ["build", "beta", "launch", "growth", "mature"],
|
|
25063
|
+
severity: "medium",
|
|
25064
|
+
source: { kind: "fundamental" }
|
|
25065
|
+
},
|
|
25066
|
+
{
|
|
25067
|
+
id: "product-reimplements-specification",
|
|
25068
|
+
since: "0.9.13",
|
|
25069
|
+
scope: "portfolio",
|
|
25070
|
+
name: "Specification reimplemented across products",
|
|
25071
|
+
description: "Two or more products independently implement the same registry specification rather than one depending on a shared implementation. Parallel implementations of a single contract multiply the surface that must stay in sync and usually signal a missing shared library or service.",
|
|
25072
|
+
why_it_matters: "Every independent reimplementation of a specification is another place a conformance bug can hide and another copy that drifts from the contract. The cost of a spec change scales with the number of reimplementers.",
|
|
25073
|
+
remediation: "Consolidate onto one implementation that the others depend on (`depends_on_product` / `hosts`), or confirm the duplication is deliberate and record why. Capture the stewarding organization with `create_registry_edge` so the contract has an owner.",
|
|
25074
|
+
stages: ["build", "beta", "launch", "growth", "mature"],
|
|
25075
|
+
severity: "low",
|
|
25076
|
+
source: { kind: "fundamental" }
|
|
24376
25077
|
}
|
|
24377
25078
|
];
|
|
24378
25079
|
function getAntiPatternById(id) {
|
|
@@ -24396,6 +25097,7 @@ function evaluateAntiPatterns(inputs, options) {
|
|
|
24396
25097
|
const idFilter = options?.anti_pattern_ids ? new Set(options.anti_pattern_ids) : void 0;
|
|
24397
25098
|
const fires = [];
|
|
24398
25099
|
for (const ap of UPG_ANTI_PATTERNS) {
|
|
25100
|
+
if (ap.scope === "portfolio" || !ap.structured_condition) continue;
|
|
24399
25101
|
if (severityFilter && ap.severity !== severityFilter) continue;
|
|
24400
25102
|
if (idFilter && !idFilter.has(ap.id)) continue;
|
|
24401
25103
|
if (inputs.productStage && !ap.stages.includes(inputs.productStage)) {
|
|
@@ -24556,6 +25258,7 @@ function buildViolation(ap) {
|
|
|
24556
25258
|
}
|
|
24557
25259
|
function collectTargetEntities(cond) {
|
|
24558
25260
|
const types = /* @__PURE__ */ new Set();
|
|
25261
|
+
if (!cond) return [];
|
|
24559
25262
|
walk(cond);
|
|
24560
25263
|
return [...types].sort();
|
|
24561
25264
|
function walk(c) {
|
|
@@ -27432,7 +28135,7 @@ function isCanonical(text) {
|
|
|
27432
28135
|
}
|
|
27433
28136
|
|
|
27434
28137
|
// src/index.ts
|
|
27435
|
-
var UPG_VERSION = "0.9.
|
|
28138
|
+
var UPG_VERSION = "0.9.14";
|
|
27436
28139
|
var UPG_FORMAT_VERSION = "0.4.0";
|
|
27437
28140
|
var MARKDOWN_FORMAT_VERSION = "0.1";
|
|
27438
28141
|
var UPG_TYPES = getTypes();
|
|
@@ -27502,8 +28205,10 @@ var UPG_META_COUNT = UPG_ENTITY_META.length;
|
|
|
27502
28205
|
BUSINESS_GTM_GROWTH_PLAYBOOK,
|
|
27503
28206
|
BUSINESS_MARKETING_AUDIENCE_FIRST_PLAYBOOK,
|
|
27504
28207
|
CONTENT_DEPTH_WARNING_RULES,
|
|
28208
|
+
DEFAULT_ENTITY_EMOJI,
|
|
27505
28209
|
DISCOVERY_RESEARCH_VALIDATION_PLAYBOOK,
|
|
27506
28210
|
ENGINEERING_PLATFORM_PLAYBOOK,
|
|
28211
|
+
ENTITY_EMOJI,
|
|
27507
28212
|
EXPERIENCE_DESIGN_BRAND_PLAYBOOK,
|
|
27508
28213
|
FOUNDATIONS_PLAYBOOK,
|
|
27509
28214
|
LEGACY_PRODUCT_STAGES,
|