@unified-product-graph/core 0.37.0 → 0.39.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/dist/index.js CHANGED
@@ -1,3 +1,507 @@
1
+ // src/registry/entity-meta.ts
2
+ var UPG_ENTITY_META = [
3
+ // Foundations (0.9.12): shared specifications + the primitives they define.
4
+ { name: "specification", type_id: "ent_352", maturity: "proposed", since: "0.9.12", portfolio_shared: true },
5
+ { name: "primitive", type_id: "ent_353", maturity: "proposed", since: "0.9.12", portfolio_shared: true },
6
+ { name: "operating_lifecycle", type_id: "ent_355", maturity: "proposed", since: "0.11.6", portfolio_shared: true },
7
+ { name: "operating_stage", type_id: "ent_356", maturity: "proposed", since: "0.11.6", portfolio_shared: true },
8
+ // ── Strategic ──
9
+ { name: "product", type_id: "ent_001", maturity: "stable", since: "0.1.0" },
10
+ { name: "outcome", type_id: "ent_002", maturity: "stable", since: "0.1.0", portfolio_shared: true },
11
+ { name: "kpi", type_id: "ent_003", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "metric" },
12
+ { name: "objective", type_id: "ent_004", maturity: "stable", since: "0.1.0", portfolio_shared: true },
13
+ { name: "key_result", type_id: "ent_005", maturity: "stable", since: "0.1.0", portfolio_shared: true },
14
+ { name: "metric", type_id: "ent_006", maturity: "stable", since: "0.1.0", portfolio_shared: true },
15
+ // F7 (UPG-673): graduated proposed → stable at v0.9.x — proposed since 0.2.2,
16
+ // the metric-quality assessment artefact is settled with no open restructure.
17
+ { name: "metric_quality_assessment", type_id: "ent_339", maturity: "stable", since: "0.2.2" },
18
+ { name: "vision", type_id: "ent_007", maturity: "stable", since: "0.1.0", portfolio_shared: true },
19
+ { name: "mission", type_id: "ent_008", maturity: "stable", since: "0.1.0", portfolio_shared: true },
20
+ { name: "strategic_theme", type_id: "ent_009", maturity: "stable", since: "0.1.0", portfolio_shared: true },
21
+ { name: "initiative", type_id: "ent_010", maturity: "stable", since: "0.1.0", portfolio_shared: true },
22
+ { name: "capability", type_id: "ent_011", maturity: "stable", since: "0.1.0", portfolio_shared: true },
23
+ { name: "value_stream", type_id: "ent_012", maturity: "stable", since: "0.1.0" },
24
+ { name: "strategic_pillar", type_id: "ent_013", maturity: "stable", since: "0.1.0", portfolio_shared: true },
25
+ { name: "assumption", type_id: "ent_014", maturity: "stable", since: "0.1.0" },
26
+ { name: "decision", type_id: "ent_015", maturity: "stable", since: "0.1.0" },
27
+ { name: "constraint", type_id: "ent_348", maturity: "stable", since: "0.4.3" },
28
+ // (0.17.4) Strategy-domain sibling of research_question / design_question,
29
+ // completing the domain-question triad. An open coordination/ownership question
30
+ // a plan is exposed to (distinct from `assumption`, which the plan is built on).
31
+ { name: "strategic_question", type_id: "ent_357", maturity: "proposed", since: "0.17.4" },
32
+ // ── User ──
33
+ { name: "persona", type_id: "ent_016", maturity: "stable", since: "0.1.0" },
34
+ { name: "job", type_id: "ent_017", maturity: "stable", since: "0.1.0" },
35
+ { name: "jtbd", type_id: "ent_332", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "job" },
36
+ { name: "pain_point", type_id: "ent_018", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "need" },
37
+ { name: "desired_outcome", type_id: "ent_019", maturity: "stable", since: "0.1.0" },
38
+ { name: "job_step", type_id: "ent_020", maturity: "stable", since: "0.1.0" },
39
+ { name: "user_need", type_id: "ent_021", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "need" },
40
+ { name: "need", type_id: "ent_313", maturity: "stable", since: "0.1.0" },
41
+ { name: "switching_cost", type_id: "ent_022", maturity: "stable", since: "0.1.0" },
42
+ // ── Discovery ──
43
+ { name: "opportunity", type_id: "ent_023", maturity: "stable", since: "0.1.0", default_frameworks: ["opportunity-sizing", "rice-scoring"] },
44
+ { name: "solution", type_id: "ent_024", maturity: "stable", since: "0.1.0", default_frameworks: ["rice-scoring"] },
45
+ { name: "feasibility_study", type_id: "ent_025", maturity: "stable", since: "0.1.0" },
46
+ { name: "design_sprint", type_id: "ent_026", maturity: "stable", since: "0.1.0" },
47
+ // ── Validation ──
48
+ // (since v0.4.0) `hypothesis` re-promoted to canonical-stable. The
49
+ // v0.2.8 rename to `hypothesis_claim` was over-split: "claim" is implied
50
+ // by being a hypothesis. Canonical name reverts; HypothesisClaimProperties
51
+ // renamed to HypothesisProperties. `hypothesis_claim` is now deprecated
52
+ // (→ `hypothesis`). `hypothesis_evidence` deprecated (→ `evidence`): the
53
+ // dual evidence_type enum smell resolved by enriching canonical `evidence`
54
+ // with evidence_rigor + evidence_source axes. Edge pattern switches to
55
+ // `hypothesis_has_evidence` (neutral, direction on node).
56
+ { name: "hypothesis", type_id: "ent_027", maturity: "stable", since: "0.1.0" },
57
+ { name: "hypothesis_claim", type_id: "ent_344", maturity: "deprecated", since: "0.2.8", deprecated_in: "0.4.0", replacement: "hypothesis" },
58
+ { name: "hypothesis_evidence", type_id: "ent_345", maturity: "deprecated", since: "0.2.8", deprecated_in: "0.4.0", replacement: "evidence" },
59
+ // `experiment` is canonical (UPG-664). It has its own property schema
60
+ // (method, start_date, end_date, sample_size, expected_lift) and is the
61
+ // canonical unit of a structured test. The validation flow is
62
+ // `hypothesis → experiment_plan → experiment → experiment_run`: the plan is
63
+ // the validation design, the experiment is the structured test, the run is
64
+ // the optional multi-run/replication child.
65
+ { name: "experiment", type_id: "ent_028", maturity: "stable", since: "0.1.0" },
66
+ // experiment_plan graduated proposed → stable (UPG-664). It is the canonical
67
+ // validation PLAN type — it absorbed `test_plan`'s planning properties
68
+ // (method / success_criteria / sample_size) when `test_plan` re-homed to the
69
+ // QA/testing domain (UPG-678).
70
+ { name: "experiment_plan", type_id: "ent_340", maturity: "stable", since: "0.2.6" },
71
+ { name: "experiment_run", type_id: "ent_341", maturity: "stable", since: "0.2.6" },
72
+ { name: "learning", type_id: "ent_029", maturity: "stable", since: "0.1.0" },
73
+ // test_plan re-homed validation → testing/QA (UPG-678). It is the QA
74
+ // verification-procedure plan (test scope / environments / pass criteria);
75
+ // its former validation-planning role is carried by experiment_plan.
76
+ { name: "test_plan", type_id: "ent_030", maturity: "stable", since: "0.1.0" },
77
+ { name: "evidence", type_id: "ent_031", maturity: "stable", since: "0.1.0" },
78
+ { name: "research_plan", type_id: "ent_032", maturity: "stable", since: "0.1.0" },
79
+ // ── Market Intelligence ──
80
+ { name: "competitor", type_id: "ent_033", maturity: "stable", since: "0.1.0", portfolio_shared: true },
81
+ { name: "competitor_feature", type_id: "ent_034", maturity: "stable", since: "0.1.0", portfolio_shared: true },
82
+ { name: "competitor_signal", type_id: "ent_354", maturity: "proposed", since: "0.10.0", portfolio_shared: true },
83
+ { name: "market_trend", type_id: "ent_035", maturity: "stable", since: "0.1.0" },
84
+ { name: "market_segment", type_id: "ent_036", maturity: "stable", since: "0.1.0", portfolio_shared: true },
85
+ { name: "competitive_analysis", type_id: "ent_037", maturity: "stable", since: "0.1.0" },
86
+ // Classification taxonomy hosted by competitive_analysis.
87
+ // F7 (UPG-673): graduated proposed → stable at v0.9.x — two minor releases
88
+ // stable since 0.4.0, the taxonomy-axis/value pair backs the competitive-
89
+ // analysis classification spine with no open rename/restructure ticket.
90
+ { name: "classification_axis", type_id: "ent_346", maturity: "stable", since: "0.4.0", portfolio_shared: true },
91
+ { name: "classification_value", type_id: "ent_347", maturity: "stable", since: "0.4.0", portfolio_shared: true },
92
+ // ── UX Research ──
93
+ { name: "research_study", type_id: "ent_038", maturity: "stable", since: "0.1.0" },
94
+ { name: "research_insight", type_id: "ent_039", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "insight" },
95
+ { name: "insight", type_id: "ent_040", maturity: "stable", since: "0.1.0" },
96
+ { name: "participant", type_id: "ent_041", maturity: "stable", since: "0.1.0" },
97
+ { name: "observation", type_id: "ent_042", maturity: "stable", since: "0.1.0" },
98
+ { name: "quote", type_id: "ent_043", maturity: "stable", since: "0.1.0" },
99
+ { name: "affinity_cluster", type_id: "ent_044", maturity: "stable", since: "0.1.0" },
100
+ { name: "research_question", type_id: "ent_045", maturity: "stable", since: "0.1.0" },
101
+ { name: "interview_guide", type_id: "ent_046", maturity: "stable", since: "0.1.0" },
102
+ { name: "finding", type_id: "ent_047", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "insight" },
103
+ { name: "survey_response", type_id: "ent_048", maturity: "stable", since: "0.1.0" },
104
+ { name: "highlight", type_id: "ent_049", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "observation" },
105
+ // ── Design ──
106
+ { name: "user_journey", type_id: "ent_050", maturity: "stable", since: "0.1.0" },
107
+ { name: "journey_step", type_id: "ent_051", maturity: "stable", since: "0.1.0" },
108
+ { name: "ux_insight", type_id: "ent_052", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "insight" },
109
+ { name: "design_question", type_id: "ent_053", maturity: "stable", since: "0.1.0" },
110
+ { name: "how_might_we", type_id: "ent_333", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "design_question" },
111
+ { name: "design_concept", type_id: "ent_054", maturity: "stable", since: "0.1.0" },
112
+ { name: "prototype", type_id: "ent_055", maturity: "stable", since: "0.1.0" },
113
+ { name: "design_component", type_id: "ent_056", maturity: "stable", since: "0.1.0", portfolio_shared: true },
114
+ { name: "design_token", type_id: "ent_057", maturity: "stable", since: "0.1.0" },
115
+ { name: "brand_identity", type_id: "ent_058", maturity: "stable", since: "0.1.0", portfolio_shared: true },
116
+ { name: "brand_colour", type_id: "ent_059", maturity: "stable", since: "0.1.0" },
117
+ { name: "brand_typography", type_id: "ent_060", maturity: "stable", since: "0.1.0" },
118
+ { name: "brand_voice", type_id: "ent_061", maturity: "stable", since: "0.1.0" },
119
+ { name: "wireframe", type_id: "ent_062", maturity: "stable", since: "0.1.0" },
120
+ { name: "design_pattern", type_id: "ent_063", maturity: "stable", since: "0.1.0" },
121
+ { name: "design_guideline", type_id: "ent_064", maturity: "stable", since: "0.1.0" },
122
+ { name: "annotation", type_id: "ent_065", maturity: "stable", since: "0.1.0" },
123
+ { name: "interaction_spec", type_id: "ent_066", maturity: "stable", since: "0.1.0" },
124
+ { name: "design_system", type_id: "ent_067", maturity: "stable", since: "0.1.0", portfolio_shared: true },
125
+ { name: "user_flow", type_id: "ent_068", maturity: "stable", since: "0.1.0" },
126
+ { name: "screen", type_id: "ent_069", maturity: "stable", since: "0.1.0" },
127
+ { name: "screen_state", type_id: "ent_070", maturity: "stable", since: "0.1.0" },
128
+ // surface (0.27.0): the place inside a screen. `screen` is route-level
129
+ // (route / viewport / access_level); `surface` is the contested slot within
130
+ // it, carrying its occupants and the rule that arbitrates between them.
131
+ // Enters `proposed` per the maturity rubric (precedent: planning_cycle 0.20.0).
132
+ { name: "surface", type_id: "ent_359", maturity: "proposed", since: "0.27.0" },
133
+ { name: "configuration_axis", type_id: "ent_360", maturity: "proposed", since: "0.30.0" },
134
+ { name: "journey_phase", type_id: "ent_330", maturity: "proposed", since: "0.2.0" },
135
+ { name: "journey_action", type_id: "ent_331", maturity: "proposed", since: "0.2.0" },
136
+ { name: "design_decision", type_id: "ent_319", maturity: "deprecated", since: "0.2.0", deprecated_in: "0.2.0", replacement: "decision" },
137
+ // F7 (UPG-673): graduated proposed → stable at v0.9.x — proposed since 0.2.0,
138
+ // the brand-identity set (logo + imagery) is settled with no open rename.
139
+ { name: "brand_logo", type_id: "ent_321", maturity: "stable", since: "0.2.0" },
140
+ { name: "brand_imagery", type_id: "ent_322", maturity: "stable", since: "0.2.0" },
141
+ // ── Product Spec ──
142
+ { name: "feature_area", type_id: "ent_314", maturity: "stable", since: "0.1.0" },
143
+ { name: "feature", type_id: "ent_071", maturity: "stable", since: "0.1.0" },
144
+ { name: "epic", type_id: "ent_072", maturity: "stable", since: "0.1.0" },
145
+ // `user_story` is the templated "As X, I want Y so Z" promise: a stable,
146
+ // lifecycle-free design artefact (UCS pattern P5). The v0.2.7 split EXTRACTED
147
+ // the engineering work into a separate `task` (the lifecycle-bearing work-unit,
148
+ // linked via `task_implements_user_story`); the split was right. But the
149
+ // surviving statement half was renamed to the coined `story_statement`, which
150
+ // raised the adoption barrier. "user story" is the universally-recognised
151
+ // industry term for exactly this artefact. v0.7.0 (UPG-571) re-canonicalises
152
+ // the statement under `user_story`; `story_statement` becomes a deprecated
153
+ // alias. `story_task` (the original work half) was already collapsed into
154
+ // canonical `task` at v0.4.0. So the canonical shape is: user_story (statement)
155
+ // + task (work), linked by `task_implements_user_story`.
156
+ //
157
+ // F7 (UPG-673) — DEFERRED, deliberately kept `proposed`. The audit flagged
158
+ // user_story as a stable-spine candidate, but the v0.7.0 re-canon contract
159
+ // (UPG-571) freezes maturity at `proposed` until the re-canonicalised name
160
+ // has soaked across a full migration window. `user-story-split.test.ts`
161
+ // ("user_story is canonical again (ent_073, proposed, not deprecated)")
162
+ // asserts `proposed` as the post-re-canon invariant. Graduating here would
163
+ // break that contract; promotion is a separate, ticketed decision once the
164
+ // story_statement → user_story migration has fully aged out.
165
+ { name: "user_story", type_id: "ent_073", maturity: "stable", since: "0.1.0" },
166
+ { name: "story_statement", type_id: "ent_342", maturity: "deprecated", since: "0.2.7", deprecated_in: "0.7.0", replacement: "user_story" },
167
+ { name: "story_task", type_id: "ent_343", maturity: "deprecated", since: "0.2.7", deprecated_in: "0.4.0", replacement: "task" },
168
+ { name: "acceptance_criterion", type_id: "ent_074", maturity: "stable", since: "0.1.0" },
169
+ { name: "release", type_id: "ent_075", maturity: "stable", since: "0.1.0" },
170
+ { name: "task", type_id: "ent_076", maturity: "stable", since: "0.1.0" },
171
+ { name: "bug", type_id: "ent_077", maturity: "stable", since: "0.1.0" },
172
+ { name: "roadmap", type_id: "ent_078", maturity: "stable", since: "0.1.0" },
173
+ { name: "roadmap_item", type_id: "ent_079", maturity: "stable", since: "0.1.0" },
174
+ { name: "theme", type_id: "ent_080", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.9.0", replacement: "roadmap_theme" },
175
+ { name: "roadmap_theme", type_id: "ent_351", maturity: "stable", since: "0.1.0" },
176
+ { name: "changelog", type_id: "ent_081", maturity: "stable", since: "0.1.0" },
177
+ // (0.20.0) The cadence axis: a named, dated interval that work flows through
178
+ // and which nests (a program-increment contains iterations; a cycle contains
179
+ // its cooldown). One self-nesting type with a `cadence_kind` discriminator
180
+ // spans sprint / iteration / quarter / PI / cooldown rather than minting a
181
+ // type per methodology. `portfolio_shared` because a coarse cycle is an
182
+ // org-shared interval an objective in a rollup graph and a story in a product
183
+ // graph both schedule into.
184
+ { name: "planning_cycle", type_id: "ent_358", maturity: "proposed", since: "0.20.0", portfolio_shared: true },
185
+ // ── Engineering ──
186
+ { name: "bounded_context", type_id: "ent_082", maturity: "stable", since: "0.1.0" },
187
+ { name: "service", type_id: "ent_083", maturity: "stable", since: "0.1.0" },
188
+ { name: "domain_event", type_id: "ent_084", maturity: "stable", since: "0.1.0" },
189
+ { name: "api_contract", type_id: "ent_085", maturity: "stable", since: "0.1.0" },
190
+ { name: "architecture_decision", type_id: "ent_086", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "decision" },
191
+ { name: "technical_debt_item", type_id: "ent_087", maturity: "stable", since: "0.1.0" },
192
+ { name: "feature_flag", type_id: "ent_088", maturity: "stable", since: "0.1.0" },
193
+ { name: "deployment", type_id: "ent_089", maturity: "stable", since: "0.1.0" },
194
+ { name: "aggregate", type_id: "ent_090", maturity: "stable", since: "0.1.0" },
195
+ { name: "domain_entity", type_id: "ent_091", maturity: "stable", since: "0.1.0" },
196
+ { name: "value_object", type_id: "ent_092", maturity: "stable", since: "0.1.0" },
197
+ { name: "command", type_id: "ent_093", maturity: "stable", since: "0.1.0" },
198
+ { name: "read_model", type_id: "ent_094", maturity: "stable", since: "0.1.0" },
199
+ { name: "api_endpoint", type_id: "ent_095", maturity: "stable", since: "0.1.0" },
200
+ { name: "database_schema", type_id: "ent_096", maturity: "stable", since: "0.1.0" },
201
+ { name: "queue_topic", type_id: "ent_097", maturity: "stable", since: "0.1.0" },
202
+ { name: "build_artifact", type_id: "ent_098", maturity: "stable", since: "0.1.0" },
203
+ { name: "code_repository", type_id: "ent_099", maturity: "stable", since: "0.1.0" },
204
+ { name: "library_dependency", type_id: "ent_100", maturity: "stable", since: "0.1.0" },
205
+ { name: "integration_pattern", type_id: "ent_101", maturity: "stable", since: "0.1.0" },
206
+ { name: "external_api", type_id: "ent_102", maturity: "stable", since: "0.1.0" },
207
+ { name: "data_flow", type_id: "ent_103", maturity: "stable", since: "0.1.0" },
208
+ { name: "investigation", type_id: "ent_315", maturity: "stable", since: "0.2.0" },
209
+ { name: "root_cause", type_id: "ent_316", maturity: "stable", since: "0.2.0" },
210
+ { name: "symptom", type_id: "ent_317", maturity: "stable", since: "0.2.0" },
211
+ { name: "fix", type_id: "ent_318", maturity: "stable", since: "0.2.0" },
212
+ // ── Growth ──
213
+ { name: "north_star_metric", type_id: "ent_104", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "metric" },
214
+ { name: "input_metric", type_id: "ent_105", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "metric" },
215
+ { name: "funnel", type_id: "ent_106", maturity: "stable", since: "0.1.0" },
216
+ { name: "funnel_step", type_id: "ent_107", maturity: "stable", since: "0.1.0" },
217
+ { name: "acquisition_channel", type_id: "ent_108", maturity: "stable", since: "0.1.0" },
218
+ { name: "growth_campaign", type_id: "ent_109", maturity: "stable", since: "0.1.0" },
219
+ { name: "campaign", type_id: "ent_337", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "growth_campaign" },
220
+ { name: "cohort", type_id: "ent_110", maturity: "stable", since: "0.1.0" },
221
+ { name: "behavioral_segment", type_id: "ent_111", maturity: "stable", since: "0.1.0" },
222
+ { name: "segment", type_id: "ent_338", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "behavioral_segment" },
223
+ { name: "growth_loop", type_id: "ent_112", maturity: "stable", since: "0.1.0" },
224
+ { name: "growth_experiment", type_id: "ent_113", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "experiment" },
225
+ { name: "variant", type_id: "ent_114", maturity: "stable", since: "0.1.0" },
226
+ { name: "attribution_model", type_id: "ent_115", maturity: "stable", since: "0.1.0" },
227
+ // ── Business Model ──
228
+ { name: "business_model", type_id: "ent_116", maturity: "stable", since: "0.1.0" },
229
+ { name: "value_proposition", type_id: "ent_117", maturity: "stable", since: "0.1.0" },
230
+ { name: "revenue_stream", type_id: "ent_118", maturity: "stable", since: "0.1.0" },
231
+ { name: "pricing_tier", type_id: "ent_119", maturity: "stable", since: "0.1.0" },
232
+ { name: "cost_structure", type_id: "ent_120", maturity: "stable", since: "0.1.0" },
233
+ { name: "unit_economics", type_id: "ent_121", maturity: "stable", since: "0.1.0" },
234
+ { name: "partnership", type_id: "ent_122", maturity: "stable", since: "0.1.0" },
235
+ { name: "key_resource", type_id: "ent_123", maturity: "stable", since: "0.1.0" },
236
+ { name: "key_activity", type_id: "ent_124", maturity: "stable", since: "0.1.0" },
237
+ { name: "customer_segment_bm", type_id: "ent_125", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "market_segment" },
238
+ { name: "channel_bm", type_id: "ent_126", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "distribution_channel" },
239
+ { name: "target_customer_segment", type_id: "ent_329", maturity: "deprecated", since: "0.2.0", deprecated_in: "0.2.0", replacement: "market_segment" },
240
+ { name: "customer_relationship", type_id: "ent_127", maturity: "stable", since: "0.1.0" },
241
+ { name: "distribution_channel", type_id: "ent_128", maturity: "stable", since: "0.1.0" },
242
+ // ── Go-To-Market ──
243
+ { name: "gtm_strategy", type_id: "ent_129", maturity: "stable", since: "0.1.0" },
244
+ { name: "ideal_customer_profile", type_id: "ent_130", maturity: "stable", since: "0.1.0" },
245
+ { name: "positioning", type_id: "ent_131", maturity: "stable", since: "0.1.0" },
246
+ { name: "messaging", type_id: "ent_132", maturity: "stable", since: "0.1.0" },
247
+ { name: "launch", type_id: "ent_133", maturity: "stable", since: "0.1.0" },
248
+ { name: "content_strategy", type_id: "ent_134", maturity: "stable", since: "0.1.0" },
249
+ { name: "sales_motion", type_id: "ent_135", maturity: "stable", since: "0.1.0" },
250
+ { name: "competitive_battle_card", type_id: "ent_136", maturity: "stable", since: "0.1.0" },
251
+ { name: "demand_gen_program", type_id: "ent_137", maturity: "stable", since: "0.1.0" },
252
+ { name: "territory", type_id: "ent_138", maturity: "stable", since: "0.1.0" },
253
+ { name: "objection", type_id: "ent_139", maturity: "stable", since: "0.1.0" },
254
+ { name: "rebuttal", type_id: "ent_140", maturity: "stable", since: "0.1.0" },
255
+ { name: "proof_point", type_id: "ent_141", maturity: "stable", since: "0.1.0" },
256
+ // ── Team & Organisation ──
257
+ { name: "team", type_id: "ent_142", maturity: "stable", since: "0.1.0", portfolio_shared: true },
258
+ { name: "role", type_id: "ent_143", maturity: "stable", since: "0.1.0" },
259
+ { name: "stakeholder", type_id: "ent_144", maturity: "stable", since: "0.1.0" },
260
+ { name: "person", type_id: "ent_349", maturity: "stable", since: "0.5.0" },
261
+ { name: "product_decision", type_id: "ent_145", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "decision" },
262
+ { name: "team_okr", type_id: "ent_146", maturity: "stable", since: "0.1.0" },
263
+ { name: "retrospective", type_id: "ent_147", maturity: "stable", since: "0.1.0" },
264
+ { name: "dependency", type_id: "ent_148", maturity: "stable", since: "0.1.0", portfolio_shared: true },
265
+ { name: "department", type_id: "ent_149", maturity: "stable", since: "0.1.0", portfolio_shared: true },
266
+ { name: "skill", type_id: "ent_150", maturity: "stable", since: "0.1.0" },
267
+ { name: "ceremony", type_id: "ent_151", maturity: "stable", since: "0.1.0" },
268
+ { name: "capacity_plan", type_id: "ent_152", maturity: "stable", since: "0.1.0" },
269
+ // ── Data & Analytics ──
270
+ { name: "data_source", type_id: "ent_153", maturity: "stable", since: "0.1.0" },
271
+ { name: "metric_definition", type_id: "ent_154", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "metric" },
272
+ { name: "event_schema", type_id: "ent_155", maturity: "stable", since: "0.1.0" },
273
+ { name: "dashboard", type_id: "ent_156", maturity: "stable", since: "0.1.0" },
274
+ { name: "ab_test", type_id: "ent_157", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "experiment" },
275
+ { name: "data_model", type_id: "ent_158", maturity: "stable", since: "0.1.0" },
276
+ { name: "data_quality_rule", type_id: "ent_159", maturity: "stable", since: "0.1.0" },
277
+ { name: "data_product", type_id: "ent_160", maturity: "stable", since: "0.1.0" },
278
+ { name: "data_pipeline", type_id: "ent_161", maturity: "stable", since: "0.1.0" },
279
+ { name: "data_lineage", type_id: "ent_162", maturity: "stable", since: "0.1.0" },
280
+ { name: "glossary_term", type_id: "ent_163", maturity: "stable", since: "0.1.0" },
281
+ { name: "data_domain", type_id: "ent_164", maturity: "stable", since: "0.1.0" },
282
+ { name: "report", type_id: "ent_165", maturity: "stable", since: "0.1.0" },
283
+ // ── Content & Knowledge ──
284
+ { name: "content_piece", type_id: "ent_166", maturity: "stable", since: "0.1.0" },
285
+ { name: "knowledge_base_article", type_id: "ent_167", maturity: "stable", since: "0.1.0" },
286
+ { name: "brand_asset", type_id: "ent_168", maturity: "stable", since: "0.1.0" },
287
+ { name: "internal_doc", type_id: "ent_169", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "document" },
288
+ { name: "prompt_template", type_id: "ent_170", maturity: "stable", since: "0.1.0" },
289
+ { name: "content_calendar", type_id: "ent_171", maturity: "stable", since: "0.1.0" },
290
+ { name: "content_theme", type_id: "ent_172", maturity: "stable", since: "0.1.0" },
291
+ { name: "documentation_template", type_id: "ent_173", maturity: "stable", since: "0.1.0" },
292
+ { name: "document", type_id: "ent_320", maturity: "stable", since: "0.2.0" },
293
+ // ── Legal & Compliance ──
294
+ { name: "compliance_requirement", type_id: "ent_174", maturity: "stable", since: "0.1.0" },
295
+ { name: "risk", type_id: "ent_175", maturity: "stable", since: "0.1.0" },
296
+ { name: "data_contract", type_id: "ent_176", maturity: "stable", since: "0.1.0" },
297
+ { name: "legal_entity", type_id: "ent_177", maturity: "stable", since: "0.1.0" },
298
+ { name: "ip_asset", type_id: "ent_178", maturity: "stable", since: "0.1.0" },
299
+ { name: "audit_log_policy", type_id: "ent_179", maturity: "stable", since: "0.1.0" },
300
+ { name: "contract", type_id: "ent_180", maturity: "stable", since: "0.1.0" },
301
+ { name: "contract_clause", type_id: "ent_181", maturity: "stable", since: "0.1.0" },
302
+ { name: "privacy_policy", type_id: "ent_182", maturity: "stable", since: "0.1.0" },
303
+ { name: "compliance_framework", type_id: "ent_183", maturity: "stable", since: "0.1.0" },
304
+ { name: "security_audit", type_id: "ent_184", maturity: "stable", since: "0.1.0" },
305
+ // ── DevOps & Platform ──
306
+ { name: "service_level_indicator", type_id: "ent_185", maturity: "stable", since: "0.1.0" },
307
+ { name: "sli", type_id: "ent_334", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "service_level_indicator" },
308
+ { name: "service_level_objective", type_id: "ent_186", maturity: "stable", since: "0.1.0" },
309
+ { name: "slo", type_id: "ent_335", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "service_level_objective" },
310
+ { name: "error_budget", type_id: "ent_187", maturity: "stable", since: "0.1.0" },
311
+ { name: "incident", type_id: "ent_188", maturity: "stable", since: "0.1.0" },
312
+ { name: "postmortem", type_id: "ent_189", maturity: "stable", since: "0.1.0" },
313
+ { name: "runbook", type_id: "ent_190", maturity: "stable", since: "0.1.0" },
314
+ { name: "monitor", type_id: "ent_191", maturity: "stable", since: "0.1.0" },
315
+ { name: "alert_rule", type_id: "ent_192", maturity: "stable", since: "0.1.0" },
316
+ { name: "ci_pipeline", type_id: "ent_193", maturity: "stable", since: "0.1.0" },
317
+ { name: "release_strategy", type_id: "ent_194", maturity: "stable", since: "0.1.0" },
318
+ { name: "on_call_rotation", type_id: "ent_195", maturity: "stable", since: "0.1.0" },
319
+ { name: "infrastructure_component", type_id: "ent_196", maturity: "stable", since: "0.1.0" },
320
+ // ── Security ──
321
+ { name: "threat_model", type_id: "ent_197", maturity: "stable", since: "0.1.0" },
322
+ { name: "threat", type_id: "ent_198", maturity: "stable", since: "0.1.0" },
323
+ { name: "vulnerability", type_id: "ent_199", maturity: "stable", since: "0.1.0" },
324
+ { name: "security_control", type_id: "ent_200", maturity: "stable", since: "0.1.0" },
325
+ { name: "security_policy", type_id: "ent_201", maturity: "stable", since: "0.1.0" },
326
+ { name: "security_incident", type_id: "ent_202", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "incident" },
327
+ { name: "penetration_test", type_id: "ent_203", maturity: "stable", since: "0.1.0" },
328
+ { name: "security_review", type_id: "ent_204", maturity: "stable", since: "0.1.0" },
329
+ { name: "data_classification", type_id: "ent_205", maturity: "stable", since: "0.1.0" },
330
+ { name: "access_policy", type_id: "ent_206", maturity: "stable", since: "0.1.0" },
331
+ // ── Accessibility ──
332
+ { name: "a11y_standard", type_id: "ent_207", maturity: "stable", since: "0.1.0" },
333
+ { name: "a11y_guideline", type_id: "ent_208", maturity: "stable", since: "0.1.0" },
334
+ { name: "a11y_audit", type_id: "ent_209", maturity: "stable", since: "0.1.0" },
335
+ { name: "a11y_issue", type_id: "ent_210", maturity: "stable", since: "0.1.0" },
336
+ { name: "a11y_annotation", type_id: "ent_211", maturity: "stable", since: "0.1.0" },
337
+ // ── QA & Testing ──
338
+ { name: "test_suite", type_id: "ent_212", maturity: "stable", since: "0.1.0" },
339
+ { name: "test_case", type_id: "ent_213", maturity: "stable", since: "0.1.0" },
340
+ { name: "qa_session", type_id: "ent_214", maturity: "stable", since: "0.1.0" },
341
+ { name: "regression_test", type_id: "ent_215", maturity: "stable", since: "0.1.0" },
342
+ { name: "test_coverage_report", type_id: "ent_216", maturity: "stable", since: "0.1.0" },
343
+ { name: "test_environment", type_id: "ent_217", maturity: "stable", since: "0.1.0" },
344
+ { name: "defect_report", type_id: "ent_218", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "support_ticket" },
345
+ { name: "test_result", type_id: "ent_327", maturity: "proposed", since: "0.2.0" },
346
+ // ── Feedback & Voice of Customer ──
347
+ { name: "feedback_program", type_id: "ent_219", maturity: "stable", since: "0.1.0" },
348
+ { name: "feature_request", type_id: "ent_220", maturity: "stable", since: "0.1.0" },
349
+ { name: "feedback_vote", type_id: "ent_221", maturity: "stable", since: "0.1.0" },
350
+ { name: "nps_campaign", type_id: "ent_222", maturity: "stable", since: "0.1.0" },
351
+ { name: "user_advisory_board", type_id: "ent_223", maturity: "stable", since: "0.1.0" },
352
+ { name: "beta_program", type_id: "ent_224", maturity: "stable", since: "0.1.0" },
353
+ { name: "feedback_theme", type_id: "ent_225", maturity: "stable", since: "0.1.0" },
354
+ // ── Pricing & Packaging ──
355
+ { name: "pricing_strategy", type_id: "ent_226", maturity: "stable", since: "0.1.0" },
356
+ { name: "pricing_experiment", type_id: "ent_227", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "experiment" },
357
+ { name: "package", type_id: "ent_228", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "pricing_tier" },
358
+ { name: "discount_strategy", type_id: "ent_229", maturity: "stable", since: "0.1.0" },
359
+ { name: "trial_config", type_id: "ent_230", maturity: "stable", since: "0.1.0" },
360
+ { name: "paywall", type_id: "ent_231", maturity: "stable", since: "0.1.0" },
361
+ // ── AI/ML Operations ──
362
+ { name: "ai_model", type_id: "ent_232", maturity: "stable", since: "0.1.0" },
363
+ { name: "prompt_version", type_id: "ent_233", maturity: "stable", since: "0.1.0" },
364
+ { name: "eval_benchmark", type_id: "ent_234", maturity: "stable", since: "0.1.0" },
365
+ { name: "eval_run", type_id: "ent_235", maturity: "stable", since: "0.1.0" },
366
+ { name: "ai_cost_tracker", type_id: "ent_236", maturity: "stable", since: "0.1.0" },
367
+ { name: "hallucination_report", type_id: "ent_237", maturity: "stable", since: "0.1.0" },
368
+ { name: "ai_guardrail", type_id: "ent_238", maturity: "stable", since: "0.1.0" },
369
+ { name: "model_comparison", type_id: "ent_239", maturity: "stable", since: "0.1.0" },
370
+ { name: "ai_experiment", type_id: "ent_323", maturity: "proposed", since: "0.2.0" },
371
+ { name: "ai_dataset", type_id: "ent_324", maturity: "proposed", since: "0.2.0" },
372
+ { name: "ai_trace", type_id: "ent_325", maturity: "proposed", since: "0.2.0" },
373
+ // ── Agentic Workflows ──
374
+ { name: "workflow_template", type_id: "ent_240", maturity: "stable", since: "0.1.0" },
375
+ { name: "workflow_run", type_id: "ent_241", maturity: "stable", since: "0.1.0" },
376
+ { name: "agent_definition", type_id: "ent_242", maturity: "stable", since: "0.1.0" },
377
+ { name: "agent_session", type_id: "ent_243", maturity: "stable", since: "0.1.0" },
378
+ { name: "review_gate", type_id: "ent_244", maturity: "stable", since: "0.1.0" },
379
+ { name: "approval_record", type_id: "ent_245", maturity: "stable", since: "0.1.0" },
380
+ { name: "agent_skill", type_id: "ent_246", maturity: "stable", since: "0.1.0" },
381
+ { name: "agent_hook", type_id: "ent_247", maturity: "stable", since: "0.1.0" },
382
+ { name: "workflow_artifact", type_id: "ent_248", maturity: "stable", since: "0.1.0" },
383
+ { name: "agent_task", type_id: "ent_326", maturity: "proposed", since: "0.2.0" },
384
+ // ── Portfolio ──
385
+ { name: "organization", type_id: "ent_249", maturity: "stable", since: "0.1.0" },
386
+ { name: "portfolio", type_id: "ent_250", maturity: "stable", since: "0.1.0" },
387
+ { name: "product_area", type_id: "ent_251", maturity: "stable", since: "0.1.0" },
388
+ // ── Sales & Revenue ──
389
+ { name: "account", type_id: "ent_252", maturity: "stable", since: "0.1.0" },
390
+ { name: "contact", type_id: "ent_253", maturity: "stable", since: "0.1.0" },
391
+ { name: "lead", type_id: "ent_254", maturity: "stable", since: "0.1.0" },
392
+ { name: "deal", type_id: "ent_255", maturity: "stable", since: "0.1.0" },
393
+ { name: "pipeline_sales", type_id: "ent_256", maturity: "stable", since: "0.1.0" },
394
+ { name: "pipeline_stage", type_id: "ent_257", maturity: "stable", since: "0.1.0" },
395
+ { name: "quote_document", type_id: "ent_258", maturity: "stable", since: "0.1.0" },
396
+ { name: "subscription", type_id: "ent_259", maturity: "stable", since: "0.1.0" },
397
+ { name: "invoice", type_id: "ent_260", maturity: "stable", since: "0.1.0" },
398
+ { name: "forecast", type_id: "ent_261", maturity: "stable", since: "0.1.0" },
399
+ // ── Program Management ──
400
+ { name: "program", type_id: "ent_262", maturity: "stable", since: "0.1.0" },
401
+ { name: "project", type_id: "ent_263", maturity: "stable", since: "0.1.0" },
402
+ // `portfolio_shared` (0.25.1 feedback): a milestone is often a cross-team gate,
403
+ // not one project's checkpoint — an org-wide "Open Beta" that several products'
404
+ // projects must all satisfy. Shared tier lets `project_targets_milestone` (and
405
+ // the other milestone edges) pass the cross-scope gate as `provisional`, same
406
+ // as `project_implements_initiative`. Precedent: `planning_cycle` (0.20.0).
407
+ { name: "milestone", type_id: "ent_264", maturity: "stable", since: "0.1.0", portfolio_shared: true },
408
+ { name: "risk_register", type_id: "ent_265", maturity: "stable", since: "0.1.0" },
409
+ { name: "risk_item", type_id: "ent_266", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "risk" },
410
+ { name: "change_request", type_id: "ent_267", maturity: "stable", since: "0.1.0" },
411
+ { name: "deliverable", type_id: "ent_268", maturity: "stable", since: "0.1.0" },
412
+ { name: "resource_allocation", type_id: "ent_269", maturity: "stable", since: "0.1.0" },
413
+ { name: "status_report", type_id: "ent_270", maturity: "stable", since: "0.1.0" },
414
+ // ── Marketing Operations ──
415
+ { name: "marketing_strategy", type_id: "ent_271", maturity: "stable", since: "0.1.0" },
416
+ { name: "marketing_channel", type_id: "ent_272", maturity: "stable", since: "0.1.0" },
417
+ { name: "marketing_campaign_plan", type_id: "ent_273", maturity: "stable", since: "0.1.0" },
418
+ { name: "email_sequence", type_id: "ent_274", maturity: "stable", since: "0.1.0" },
419
+ { name: "social_post", type_id: "ent_275", maturity: "stable", since: "0.1.0" },
420
+ { name: "seo_keyword", type_id: "ent_276", maturity: "stable", since: "0.1.0" },
421
+ { name: "ad_creative", type_id: "ent_277", maturity: "stable", since: "0.1.0" },
422
+ { name: "press_release", type_id: "ent_278", maturity: "stable", since: "0.1.0" },
423
+ { name: "event", type_id: "ent_279", maturity: "stable", since: "0.1.0" },
424
+ { name: "community_initiative", type_id: "ent_280", maturity: "stable", since: "0.1.0" },
425
+ // ── Operations & Customer Success ──
426
+ { name: "support_ticket", type_id: "ent_281", maturity: "stable", since: "0.1.0" },
427
+ { name: "customer_feedback", type_id: "ent_282", maturity: "stable", since: "0.1.0" },
428
+ { name: "churn_reason", type_id: "ent_283", maturity: "stable", since: "0.1.0" },
429
+ { name: "onboarding_flow", type_id: "ent_284", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "user_flow" },
430
+ { name: "customer_health_score", type_id: "ent_285", maturity: "stable", since: "0.1.0" },
431
+ { name: "playbook", type_id: "ent_286", maturity: "stable", since: "0.1.0" },
432
+ { name: "service_level_agreement", type_id: "ent_287", maturity: "stable", since: "0.1.0" },
433
+ { name: "sla", type_id: "ent_336", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "service_level_agreement" },
434
+ { name: "customer_journey_stage", type_id: "ent_288", maturity: "stable", since: "0.1.0" },
435
+ { name: "touchpoint", type_id: "ent_289", maturity: "stable", since: "0.1.0" },
436
+ { name: "success_milestone", type_id: "ent_290", maturity: "stable", since: "0.1.0" },
437
+ { name: "service_blueprint", type_id: "ent_291", maturity: "stable", since: "0.1.0" },
438
+ { name: "nps_score", type_id: "ent_292", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "nps_campaign" },
439
+ // ── Localisation & i18n ──
440
+ { name: "locale", type_id: "ent_293", maturity: "stable", since: "0.1.0" },
441
+ { name: "translation_key", type_id: "ent_294", maturity: "stable", since: "0.1.0" },
442
+ { name: "translation_bundle", type_id: "ent_295", maturity: "stable", since: "0.1.0" },
443
+ { name: "locale_config", type_id: "ent_296", maturity: "stable", since: "0.1.0" },
444
+ { name: "cultural_adaptation", type_id: "ent_297", maturity: "stable", since: "0.1.0" },
445
+ { name: "regional_pricing", type_id: "ent_298", maturity: "stable", since: "0.1.0" },
446
+ // ── Customer Education ──
447
+ { name: "education_program", type_id: "ent_299", maturity: "stable", since: "0.1.0" },
448
+ { name: "tutorial", type_id: "ent_300", maturity: "stable", since: "0.1.0" },
449
+ { name: "walkthrough", type_id: "ent_301", maturity: "stable", since: "0.1.0" },
450
+ { name: "webinar", type_id: "ent_302", maturity: "stable", since: "0.1.0" },
451
+ { name: "certification", type_id: "ent_303", maturity: "stable", since: "0.1.0" },
452
+ { name: "help_video", type_id: "ent_304", maturity: "stable", since: "0.1.0" },
453
+ { name: "learning_path", type_id: "ent_305", maturity: "stable", since: "0.1.0" },
454
+ // ── Partners & Ecosystem ──
455
+ { name: "partner_program", type_id: "ent_306", maturity: "stable", since: "0.1.0" },
456
+ { name: "partner_tier", type_id: "ent_307", maturity: "stable", since: "0.1.0" },
457
+ { name: "api_ecosystem", type_id: "ent_308", maturity: "stable", since: "0.1.0" },
458
+ { name: "marketplace_listing", type_id: "ent_309", maturity: "stable", since: "0.1.0" },
459
+ { name: "developer_portal", type_id: "ent_310", maturity: "stable", since: "0.1.0" },
460
+ { name: "integration_partner", type_id: "ent_311", maturity: "stable", since: "0.1.0" },
461
+ { name: "partner_revenue_share", type_id: "ent_312", maturity: "stable", since: "0.1.0" },
462
+ // ── Workspace ──
463
+ { name: "workspace", type_id: "ent_328", maturity: "proposed", since: "0.2.0" },
464
+ { name: "framework_exercise", type_id: "ent_350", maturity: "proposed", since: "0.8.4" },
465
+ { name: "composition", type_id: "ent_361", maturity: "proposed", since: "0.31.0" },
466
+ // A dated, hashed rendition of a node that is already in the graph. Enters
467
+ // `proposed` per the maturity rubric (precedent: composition 0.31.0).
468
+ { name: "capture", type_id: "ent_362", maturity: "proposed", since: "0.32.0" }
469
+ ];
470
+ var DEFERRED_PROPOSED_BY_CONTRACT = {
471
+ // user_story (UPG-571) and experiment_run (UPG-664) graduated to stable in
472
+ // 0.12.6 — Captain lifted both freezes ("we are using them"). Their contracts
473
+ // are settled; they are now stable, not deferred.
474
+ ai_experiment: "UPG-665: AI prompt/model restructure (open ADR).",
475
+ ai_dataset: "UPG-665: AI prompt/model restructure (open ADR).",
476
+ ai_trace: "UPG-665: AI prompt/model restructure (open ADR)."
477
+ };
478
+ var UPG_ENTITY_META_BY_NAME = new Map(
479
+ UPG_ENTITY_META.map((m) => [m.name, m])
480
+ );
481
+ var UPG_ENTITY_META_BY_ID = new Map(
482
+ UPG_ENTITY_META.map((m) => [m.type_id, m])
483
+ );
484
+ var UPG_ACTIVE_TYPES = UPG_ENTITY_META.filter((m) => m.maturity === "stable" || m.maturity === "proposed").map((m) => m.name);
485
+ var UPG_DEPRECATED_TYPES = UPG_ENTITY_META.filter((m) => m.maturity === "deprecated").map((m) => m.name);
486
+ var UPG_PORTFOLIO_SHARED_TYPES = UPG_ENTITY_META.filter((m) => m.portfolio_shared === true).map((m) => m.name);
487
+ function isPortfolioSharedType(name) {
488
+ return UPG_ENTITY_META_BY_NAME.get(name)?.portfolio_shared === true;
489
+ }
490
+ function isDeprecatedType(name) {
491
+ const meta = UPG_ENTITY_META_BY_NAME.get(name);
492
+ return meta?.maturity === "deprecated";
493
+ }
494
+ function getReplacementType(name) {
495
+ const meta = UPG_ENTITY_META_BY_NAME.get(name);
496
+ return meta?.replacement;
497
+ }
498
+ function getTypeId(name) {
499
+ return UPG_ENTITY_META_BY_NAME.get(name)?.type_id;
500
+ }
501
+ function getTypeName(typeId) {
502
+ return UPG_ENTITY_META_BY_ID.get(typeId)?.name;
503
+ }
504
+
1
505
  // src/registry/domains.ts
2
506
  var UPG_DOMAINS = [
3
507
  {
@@ -509,516 +1013,23 @@ function getTypes() {
509
1013
  return UPG_DOMAINS.flatMap((d) => [...d.types]);
510
1014
  }
511
1015
  function getDomainForType(entityType) {
512
- return UPG_DOMAINS.find((d) => d.types.includes(entityType));
1016
+ const direct = UPG_DOMAINS.find((d) => d.types.includes(entityType));
1017
+ if (direct) return direct;
1018
+ let name = entityType;
1019
+ for (let hop = 0; hop < 3; hop++) {
1020
+ if (!isDeprecatedType(name)) return void 0;
1021
+ const replacement = getReplacementType(name);
1022
+ if (!replacement) return void 0;
1023
+ const viaReplacement = UPG_DOMAINS.find((d) => d.types.includes(replacement));
1024
+ if (viaReplacement) return viaReplacement;
1025
+ name = replacement;
1026
+ }
1027
+ return void 0;
513
1028
  }
514
1029
  function getDomainIdForType(entityType) {
515
1030
  return UPG_ENTITY_TO_DOMAIN[entityType];
516
1031
  }
517
1032
 
518
- // src/registry/entity-meta.ts
519
- var UPG_ENTITY_META = [
520
- // Foundations (0.9.12): shared specifications + the primitives they define.
521
- { name: "specification", type_id: "ent_352", maturity: "proposed", since: "0.9.12", portfolio_shared: true },
522
- { name: "primitive", type_id: "ent_353", maturity: "proposed", since: "0.9.12", portfolio_shared: true },
523
- { name: "operating_lifecycle", type_id: "ent_355", maturity: "proposed", since: "0.11.6", portfolio_shared: true },
524
- { name: "operating_stage", type_id: "ent_356", maturity: "proposed", since: "0.11.6", portfolio_shared: true },
525
- // ── Strategic ──
526
- { name: "product", type_id: "ent_001", maturity: "stable", since: "0.1.0" },
527
- { name: "outcome", type_id: "ent_002", maturity: "stable", since: "0.1.0", portfolio_shared: true },
528
- { name: "kpi", type_id: "ent_003", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "metric" },
529
- { name: "objective", type_id: "ent_004", maturity: "stable", since: "0.1.0", portfolio_shared: true },
530
- { name: "key_result", type_id: "ent_005", maturity: "stable", since: "0.1.0", portfolio_shared: true },
531
- { name: "metric", type_id: "ent_006", maturity: "stable", since: "0.1.0", portfolio_shared: true },
532
- // F7 (UPG-673): graduated proposed → stable at v0.9.x — proposed since 0.2.2,
533
- // the metric-quality assessment artefact is settled with no open restructure.
534
- { name: "metric_quality_assessment", type_id: "ent_339", maturity: "stable", since: "0.2.2" },
535
- { name: "vision", type_id: "ent_007", maturity: "stable", since: "0.1.0", portfolio_shared: true },
536
- { name: "mission", type_id: "ent_008", maturity: "stable", since: "0.1.0", portfolio_shared: true },
537
- { name: "strategic_theme", type_id: "ent_009", maturity: "stable", since: "0.1.0", portfolio_shared: true },
538
- { name: "initiative", type_id: "ent_010", maturity: "stable", since: "0.1.0", portfolio_shared: true },
539
- { name: "capability", type_id: "ent_011", maturity: "stable", since: "0.1.0", portfolio_shared: true },
540
- { name: "value_stream", type_id: "ent_012", maturity: "stable", since: "0.1.0" },
541
- { name: "strategic_pillar", type_id: "ent_013", maturity: "stable", since: "0.1.0", portfolio_shared: true },
542
- { name: "assumption", type_id: "ent_014", maturity: "stable", since: "0.1.0" },
543
- { name: "decision", type_id: "ent_015", maturity: "stable", since: "0.1.0" },
544
- { name: "constraint", type_id: "ent_348", maturity: "stable", since: "0.4.3" },
545
- // (0.17.4) Strategy-domain sibling of research_question / design_question,
546
- // completing the domain-question triad. An open coordination/ownership question
547
- // a plan is exposed to (distinct from `assumption`, which the plan is built on).
548
- { name: "strategic_question", type_id: "ent_357", maturity: "proposed", since: "0.17.4" },
549
- // ── User ──
550
- { name: "persona", type_id: "ent_016", maturity: "stable", since: "0.1.0" },
551
- { name: "job", type_id: "ent_017", maturity: "stable", since: "0.1.0" },
552
- { name: "jtbd", type_id: "ent_332", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "job" },
553
- { name: "pain_point", type_id: "ent_018", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "need" },
554
- { name: "desired_outcome", type_id: "ent_019", maturity: "stable", since: "0.1.0" },
555
- { name: "job_step", type_id: "ent_020", maturity: "stable", since: "0.1.0" },
556
- { name: "user_need", type_id: "ent_021", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "need" },
557
- { name: "need", type_id: "ent_313", maturity: "stable", since: "0.1.0" },
558
- { name: "switching_cost", type_id: "ent_022", maturity: "stable", since: "0.1.0" },
559
- // ── Discovery ──
560
- { name: "opportunity", type_id: "ent_023", maturity: "stable", since: "0.1.0", default_frameworks: ["opportunity-sizing", "rice-scoring"] },
561
- { name: "solution", type_id: "ent_024", maturity: "stable", since: "0.1.0", default_frameworks: ["rice-scoring"] },
562
- { name: "feasibility_study", type_id: "ent_025", maturity: "stable", since: "0.1.0" },
563
- { name: "design_sprint", type_id: "ent_026", maturity: "stable", since: "0.1.0" },
564
- // ── Validation ──
565
- // (since v0.4.0) `hypothesis` re-promoted to canonical-stable. The
566
- // v0.2.8 rename to `hypothesis_claim` was over-split: "claim" is implied
567
- // by being a hypothesis. Canonical name reverts; HypothesisClaimProperties
568
- // renamed to HypothesisProperties. `hypothesis_claim` is now deprecated
569
- // (→ `hypothesis`). `hypothesis_evidence` deprecated (→ `evidence`): the
570
- // dual evidence_type enum smell resolved by enriching canonical `evidence`
571
- // with evidence_rigor + evidence_source axes. Edge pattern switches to
572
- // `hypothesis_has_evidence` (neutral, direction on node).
573
- { name: "hypothesis", type_id: "ent_027", maturity: "stable", since: "0.1.0" },
574
- { name: "hypothesis_claim", type_id: "ent_344", maturity: "deprecated", since: "0.2.8", deprecated_in: "0.4.0", replacement: "hypothesis" },
575
- { name: "hypothesis_evidence", type_id: "ent_345", maturity: "deprecated", since: "0.2.8", deprecated_in: "0.4.0", replacement: "evidence" },
576
- // `experiment` is canonical (UPG-664). It has its own property schema
577
- // (method, start_date, end_date, sample_size, expected_lift) and is the
578
- // canonical unit of a structured test. The validation flow is
579
- // `hypothesis → experiment_plan → experiment → experiment_run`: the plan is
580
- // the validation design, the experiment is the structured test, the run is
581
- // the optional multi-run/replication child.
582
- { name: "experiment", type_id: "ent_028", maturity: "stable", since: "0.1.0" },
583
- // experiment_plan graduated proposed → stable (UPG-664). It is the canonical
584
- // validation PLAN type — it absorbed `test_plan`'s planning properties
585
- // (method / success_criteria / sample_size) when `test_plan` re-homed to the
586
- // QA/testing domain (UPG-678).
587
- { name: "experiment_plan", type_id: "ent_340", maturity: "stable", since: "0.2.6" },
588
- { name: "experiment_run", type_id: "ent_341", maturity: "stable", since: "0.2.6" },
589
- { name: "learning", type_id: "ent_029", maturity: "stable", since: "0.1.0" },
590
- // test_plan re-homed validation → testing/QA (UPG-678). It is the QA
591
- // verification-procedure plan (test scope / environments / pass criteria);
592
- // its former validation-planning role is carried by experiment_plan.
593
- { name: "test_plan", type_id: "ent_030", maturity: "stable", since: "0.1.0" },
594
- { name: "evidence", type_id: "ent_031", maturity: "stable", since: "0.1.0" },
595
- { name: "research_plan", type_id: "ent_032", maturity: "stable", since: "0.1.0" },
596
- // ── Market Intelligence ──
597
- { name: "competitor", type_id: "ent_033", maturity: "stable", since: "0.1.0", portfolio_shared: true },
598
- { name: "competitor_feature", type_id: "ent_034", maturity: "stable", since: "0.1.0", portfolio_shared: true },
599
- { name: "competitor_signal", type_id: "ent_354", maturity: "proposed", since: "0.10.0", portfolio_shared: true },
600
- { name: "market_trend", type_id: "ent_035", maturity: "stable", since: "0.1.0" },
601
- { name: "market_segment", type_id: "ent_036", maturity: "stable", since: "0.1.0", portfolio_shared: true },
602
- { name: "competitive_analysis", type_id: "ent_037", maturity: "stable", since: "0.1.0" },
603
- // Classification taxonomy hosted by competitive_analysis.
604
- // F7 (UPG-673): graduated proposed → stable at v0.9.x — two minor releases
605
- // stable since 0.4.0, the taxonomy-axis/value pair backs the competitive-
606
- // analysis classification spine with no open rename/restructure ticket.
607
- { name: "classification_axis", type_id: "ent_346", maturity: "stable", since: "0.4.0", portfolio_shared: true },
608
- { name: "classification_value", type_id: "ent_347", maturity: "stable", since: "0.4.0", portfolio_shared: true },
609
- // ── UX Research ──
610
- { name: "research_study", type_id: "ent_038", maturity: "stable", since: "0.1.0" },
611
- { name: "research_insight", type_id: "ent_039", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "insight" },
612
- { name: "insight", type_id: "ent_040", maturity: "stable", since: "0.1.0" },
613
- { name: "participant", type_id: "ent_041", maturity: "stable", since: "0.1.0" },
614
- { name: "observation", type_id: "ent_042", maturity: "stable", since: "0.1.0" },
615
- { name: "quote", type_id: "ent_043", maturity: "stable", since: "0.1.0" },
616
- { name: "affinity_cluster", type_id: "ent_044", maturity: "stable", since: "0.1.0" },
617
- { name: "research_question", type_id: "ent_045", maturity: "stable", since: "0.1.0" },
618
- { name: "interview_guide", type_id: "ent_046", maturity: "stable", since: "0.1.0" },
619
- { name: "finding", type_id: "ent_047", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "insight" },
620
- { name: "survey_response", type_id: "ent_048", maturity: "stable", since: "0.1.0" },
621
- { name: "highlight", type_id: "ent_049", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "observation" },
622
- // ── Design ──
623
- { name: "user_journey", type_id: "ent_050", maturity: "stable", since: "0.1.0" },
624
- { name: "journey_step", type_id: "ent_051", maturity: "stable", since: "0.1.0" },
625
- { name: "ux_insight", type_id: "ent_052", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "insight" },
626
- { name: "design_question", type_id: "ent_053", maturity: "stable", since: "0.1.0" },
627
- { name: "how_might_we", type_id: "ent_333", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "design_question" },
628
- { name: "design_concept", type_id: "ent_054", maturity: "stable", since: "0.1.0" },
629
- { name: "prototype", type_id: "ent_055", maturity: "stable", since: "0.1.0" },
630
- { name: "design_component", type_id: "ent_056", maturity: "stable", since: "0.1.0", portfolio_shared: true },
631
- { name: "design_token", type_id: "ent_057", maturity: "stable", since: "0.1.0" },
632
- { name: "brand_identity", type_id: "ent_058", maturity: "stable", since: "0.1.0", portfolio_shared: true },
633
- { name: "brand_colour", type_id: "ent_059", maturity: "stable", since: "0.1.0" },
634
- { name: "brand_typography", type_id: "ent_060", maturity: "stable", since: "0.1.0" },
635
- { name: "brand_voice", type_id: "ent_061", maturity: "stable", since: "0.1.0" },
636
- { name: "wireframe", type_id: "ent_062", maturity: "stable", since: "0.1.0" },
637
- { name: "design_pattern", type_id: "ent_063", maturity: "stable", since: "0.1.0" },
638
- { name: "design_guideline", type_id: "ent_064", maturity: "stable", since: "0.1.0" },
639
- { name: "annotation", type_id: "ent_065", maturity: "stable", since: "0.1.0" },
640
- { name: "interaction_spec", type_id: "ent_066", maturity: "stable", since: "0.1.0" },
641
- { name: "design_system", type_id: "ent_067", maturity: "stable", since: "0.1.0", portfolio_shared: true },
642
- { name: "user_flow", type_id: "ent_068", maturity: "stable", since: "0.1.0" },
643
- { name: "screen", type_id: "ent_069", maturity: "stable", since: "0.1.0" },
644
- { name: "screen_state", type_id: "ent_070", maturity: "stable", since: "0.1.0" },
645
- // surface (0.27.0): the place inside a screen. `screen` is route-level
646
- // (route / viewport / access_level); `surface` is the contested slot within
647
- // it, carrying its occupants and the rule that arbitrates between them.
648
- // Enters `proposed` per the maturity rubric (precedent: planning_cycle 0.20.0).
649
- { name: "surface", type_id: "ent_359", maturity: "proposed", since: "0.27.0" },
650
- { name: "configuration_axis", type_id: "ent_360", maturity: "proposed", since: "0.30.0" },
651
- { name: "journey_phase", type_id: "ent_330", maturity: "proposed", since: "0.2.0" },
652
- { name: "journey_action", type_id: "ent_331", maturity: "proposed", since: "0.2.0" },
653
- { name: "design_decision", type_id: "ent_319", maturity: "deprecated", since: "0.2.0", deprecated_in: "0.2.0", replacement: "decision" },
654
- // F7 (UPG-673): graduated proposed → stable at v0.9.x — proposed since 0.2.0,
655
- // the brand-identity set (logo + imagery) is settled with no open rename.
656
- { name: "brand_logo", type_id: "ent_321", maturity: "stable", since: "0.2.0" },
657
- { name: "brand_imagery", type_id: "ent_322", maturity: "stable", since: "0.2.0" },
658
- // ── Product Spec ──
659
- { name: "feature_area", type_id: "ent_314", maturity: "stable", since: "0.1.0" },
660
- { name: "feature", type_id: "ent_071", maturity: "stable", since: "0.1.0" },
661
- { name: "epic", type_id: "ent_072", maturity: "stable", since: "0.1.0" },
662
- // `user_story` is the templated "As X, I want Y so Z" promise: a stable,
663
- // lifecycle-free design artefact (UCS pattern P5). The v0.2.7 split EXTRACTED
664
- // the engineering work into a separate `task` (the lifecycle-bearing work-unit,
665
- // linked via `task_implements_user_story`); the split was right. But the
666
- // surviving statement half was renamed to the coined `story_statement`, which
667
- // raised the adoption barrier. "user story" is the universally-recognised
668
- // industry term for exactly this artefact. v0.7.0 (UPG-571) re-canonicalises
669
- // the statement under `user_story`; `story_statement` becomes a deprecated
670
- // alias. `story_task` (the original work half) was already collapsed into
671
- // canonical `task` at v0.4.0. So the canonical shape is: user_story (statement)
672
- // + task (work), linked by `task_implements_user_story`.
673
- //
674
- // F7 (UPG-673) — DEFERRED, deliberately kept `proposed`. The audit flagged
675
- // user_story as a stable-spine candidate, but the v0.7.0 re-canon contract
676
- // (UPG-571) freezes maturity at `proposed` until the re-canonicalised name
677
- // has soaked across a full migration window. `user-story-split.test.ts`
678
- // ("user_story is canonical again (ent_073, proposed, not deprecated)")
679
- // asserts `proposed` as the post-re-canon invariant. Graduating here would
680
- // break that contract; promotion is a separate, ticketed decision once the
681
- // story_statement → user_story migration has fully aged out.
682
- { name: "user_story", type_id: "ent_073", maturity: "stable", since: "0.1.0" },
683
- { name: "story_statement", type_id: "ent_342", maturity: "deprecated", since: "0.2.7", deprecated_in: "0.7.0", replacement: "user_story" },
684
- { name: "story_task", type_id: "ent_343", maturity: "deprecated", since: "0.2.7", deprecated_in: "0.4.0", replacement: "task" },
685
- { name: "acceptance_criterion", type_id: "ent_074", maturity: "stable", since: "0.1.0" },
686
- { name: "release", type_id: "ent_075", maturity: "stable", since: "0.1.0" },
687
- { name: "task", type_id: "ent_076", maturity: "stable", since: "0.1.0" },
688
- { name: "bug", type_id: "ent_077", maturity: "stable", since: "0.1.0" },
689
- { name: "roadmap", type_id: "ent_078", maturity: "stable", since: "0.1.0" },
690
- { name: "roadmap_item", type_id: "ent_079", maturity: "stable", since: "0.1.0" },
691
- { name: "theme", type_id: "ent_080", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.9.0", replacement: "roadmap_theme" },
692
- { name: "roadmap_theme", type_id: "ent_351", maturity: "stable", since: "0.1.0" },
693
- { name: "changelog", type_id: "ent_081", maturity: "stable", since: "0.1.0" },
694
- // (0.20.0) The cadence axis: a named, dated interval that work flows through
695
- // and which nests (a program-increment contains iterations; a cycle contains
696
- // its cooldown). One self-nesting type with a `cadence_kind` discriminator
697
- // spans sprint / iteration / quarter / PI / cooldown rather than minting a
698
- // type per methodology. `portfolio_shared` because a coarse cycle is an
699
- // org-shared interval an objective in a rollup graph and a story in a product
700
- // graph both schedule into.
701
- { name: "planning_cycle", type_id: "ent_358", maturity: "proposed", since: "0.20.0", portfolio_shared: true },
702
- // ── Engineering ──
703
- { name: "bounded_context", type_id: "ent_082", maturity: "stable", since: "0.1.0" },
704
- { name: "service", type_id: "ent_083", maturity: "stable", since: "0.1.0" },
705
- { name: "domain_event", type_id: "ent_084", maturity: "stable", since: "0.1.0" },
706
- { name: "api_contract", type_id: "ent_085", maturity: "stable", since: "0.1.0" },
707
- { name: "architecture_decision", type_id: "ent_086", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "decision" },
708
- { name: "technical_debt_item", type_id: "ent_087", maturity: "stable", since: "0.1.0" },
709
- { name: "feature_flag", type_id: "ent_088", maturity: "stable", since: "0.1.0" },
710
- { name: "deployment", type_id: "ent_089", maturity: "stable", since: "0.1.0" },
711
- { name: "aggregate", type_id: "ent_090", maturity: "stable", since: "0.1.0" },
712
- { name: "domain_entity", type_id: "ent_091", maturity: "stable", since: "0.1.0" },
713
- { name: "value_object", type_id: "ent_092", maturity: "stable", since: "0.1.0" },
714
- { name: "command", type_id: "ent_093", maturity: "stable", since: "0.1.0" },
715
- { name: "read_model", type_id: "ent_094", maturity: "stable", since: "0.1.0" },
716
- { name: "api_endpoint", type_id: "ent_095", maturity: "stable", since: "0.1.0" },
717
- { name: "database_schema", type_id: "ent_096", maturity: "stable", since: "0.1.0" },
718
- { name: "queue_topic", type_id: "ent_097", maturity: "stable", since: "0.1.0" },
719
- { name: "build_artifact", type_id: "ent_098", maturity: "stable", since: "0.1.0" },
720
- { name: "code_repository", type_id: "ent_099", maturity: "stable", since: "0.1.0" },
721
- { name: "library_dependency", type_id: "ent_100", maturity: "stable", since: "0.1.0" },
722
- { name: "integration_pattern", type_id: "ent_101", maturity: "stable", since: "0.1.0" },
723
- { name: "external_api", type_id: "ent_102", maturity: "stable", since: "0.1.0" },
724
- { name: "data_flow", type_id: "ent_103", maturity: "stable", since: "0.1.0" },
725
- { name: "investigation", type_id: "ent_315", maturity: "stable", since: "0.2.0" },
726
- { name: "root_cause", type_id: "ent_316", maturity: "stable", since: "0.2.0" },
727
- { name: "symptom", type_id: "ent_317", maturity: "stable", since: "0.2.0" },
728
- { name: "fix", type_id: "ent_318", maturity: "stable", since: "0.2.0" },
729
- // ── Growth ──
730
- { name: "north_star_metric", type_id: "ent_104", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "metric" },
731
- { name: "input_metric", type_id: "ent_105", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "metric" },
732
- { name: "funnel", type_id: "ent_106", maturity: "stable", since: "0.1.0" },
733
- { name: "funnel_step", type_id: "ent_107", maturity: "stable", since: "0.1.0" },
734
- { name: "acquisition_channel", type_id: "ent_108", maturity: "stable", since: "0.1.0" },
735
- { name: "growth_campaign", type_id: "ent_109", maturity: "stable", since: "0.1.0" },
736
- { name: "campaign", type_id: "ent_337", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "growth_campaign" },
737
- { name: "cohort", type_id: "ent_110", maturity: "stable", since: "0.1.0" },
738
- { name: "behavioral_segment", type_id: "ent_111", maturity: "stable", since: "0.1.0" },
739
- { name: "segment", type_id: "ent_338", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "behavioral_segment" },
740
- { name: "growth_loop", type_id: "ent_112", maturity: "stable", since: "0.1.0" },
741
- { name: "growth_experiment", type_id: "ent_113", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "experiment" },
742
- { name: "variant", type_id: "ent_114", maturity: "stable", since: "0.1.0" },
743
- { name: "attribution_model", type_id: "ent_115", maturity: "stable", since: "0.1.0" },
744
- // ── Business Model ──
745
- { name: "business_model", type_id: "ent_116", maturity: "stable", since: "0.1.0" },
746
- { name: "value_proposition", type_id: "ent_117", maturity: "stable", since: "0.1.0" },
747
- { name: "revenue_stream", type_id: "ent_118", maturity: "stable", since: "0.1.0" },
748
- { name: "pricing_tier", type_id: "ent_119", maturity: "stable", since: "0.1.0" },
749
- { name: "cost_structure", type_id: "ent_120", maturity: "stable", since: "0.1.0" },
750
- { name: "unit_economics", type_id: "ent_121", maturity: "stable", since: "0.1.0" },
751
- { name: "partnership", type_id: "ent_122", maturity: "stable", since: "0.1.0" },
752
- { name: "key_resource", type_id: "ent_123", maturity: "stable", since: "0.1.0" },
753
- { name: "key_activity", type_id: "ent_124", maturity: "stable", since: "0.1.0" },
754
- { name: "customer_segment_bm", type_id: "ent_125", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "market_segment" },
755
- { name: "channel_bm", type_id: "ent_126", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "distribution_channel" },
756
- { name: "target_customer_segment", type_id: "ent_329", maturity: "deprecated", since: "0.2.0", deprecated_in: "0.2.0", replacement: "market_segment" },
757
- { name: "customer_relationship", type_id: "ent_127", maturity: "stable", since: "0.1.0" },
758
- { name: "distribution_channel", type_id: "ent_128", maturity: "stable", since: "0.1.0" },
759
- // ── Go-To-Market ──
760
- { name: "gtm_strategy", type_id: "ent_129", maturity: "stable", since: "0.1.0" },
761
- { name: "ideal_customer_profile", type_id: "ent_130", maturity: "stable", since: "0.1.0" },
762
- { name: "positioning", type_id: "ent_131", maturity: "stable", since: "0.1.0" },
763
- { name: "messaging", type_id: "ent_132", maturity: "stable", since: "0.1.0" },
764
- { name: "launch", type_id: "ent_133", maturity: "stable", since: "0.1.0" },
765
- { name: "content_strategy", type_id: "ent_134", maturity: "stable", since: "0.1.0" },
766
- { name: "sales_motion", type_id: "ent_135", maturity: "stable", since: "0.1.0" },
767
- { name: "competitive_battle_card", type_id: "ent_136", maturity: "stable", since: "0.1.0" },
768
- { name: "demand_gen_program", type_id: "ent_137", maturity: "stable", since: "0.1.0" },
769
- { name: "territory", type_id: "ent_138", maturity: "stable", since: "0.1.0" },
770
- { name: "objection", type_id: "ent_139", maturity: "stable", since: "0.1.0" },
771
- { name: "rebuttal", type_id: "ent_140", maturity: "stable", since: "0.1.0" },
772
- { name: "proof_point", type_id: "ent_141", maturity: "stable", since: "0.1.0" },
773
- // ── Team & Organisation ──
774
- { name: "team", type_id: "ent_142", maturity: "stable", since: "0.1.0", portfolio_shared: true },
775
- { name: "role", type_id: "ent_143", maturity: "stable", since: "0.1.0" },
776
- { name: "stakeholder", type_id: "ent_144", maturity: "stable", since: "0.1.0" },
777
- { name: "person", type_id: "ent_349", maturity: "stable", since: "0.5.0" },
778
- { name: "product_decision", type_id: "ent_145", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "decision" },
779
- { name: "team_okr", type_id: "ent_146", maturity: "stable", since: "0.1.0" },
780
- { name: "retrospective", type_id: "ent_147", maturity: "stable", since: "0.1.0" },
781
- { name: "dependency", type_id: "ent_148", maturity: "stable", since: "0.1.0", portfolio_shared: true },
782
- { name: "department", type_id: "ent_149", maturity: "stable", since: "0.1.0", portfolio_shared: true },
783
- { name: "skill", type_id: "ent_150", maturity: "stable", since: "0.1.0" },
784
- { name: "ceremony", type_id: "ent_151", maturity: "stable", since: "0.1.0" },
785
- { name: "capacity_plan", type_id: "ent_152", maturity: "stable", since: "0.1.0" },
786
- // ── Data & Analytics ──
787
- { name: "data_source", type_id: "ent_153", maturity: "stable", since: "0.1.0" },
788
- { name: "metric_definition", type_id: "ent_154", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "metric" },
789
- { name: "event_schema", type_id: "ent_155", maturity: "stable", since: "0.1.0" },
790
- { name: "dashboard", type_id: "ent_156", maturity: "stable", since: "0.1.0" },
791
- { name: "ab_test", type_id: "ent_157", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "experiment" },
792
- { name: "data_model", type_id: "ent_158", maturity: "stable", since: "0.1.0" },
793
- { name: "data_quality_rule", type_id: "ent_159", maturity: "stable", since: "0.1.0" },
794
- { name: "data_product", type_id: "ent_160", maturity: "stable", since: "0.1.0" },
795
- { name: "data_pipeline", type_id: "ent_161", maturity: "stable", since: "0.1.0" },
796
- { name: "data_lineage", type_id: "ent_162", maturity: "stable", since: "0.1.0" },
797
- { name: "glossary_term", type_id: "ent_163", maturity: "stable", since: "0.1.0" },
798
- { name: "data_domain", type_id: "ent_164", maturity: "stable", since: "0.1.0" },
799
- { name: "report", type_id: "ent_165", maturity: "stable", since: "0.1.0" },
800
- // ── Content & Knowledge ──
801
- { name: "content_piece", type_id: "ent_166", maturity: "stable", since: "0.1.0" },
802
- { name: "knowledge_base_article", type_id: "ent_167", maturity: "stable", since: "0.1.0" },
803
- { name: "brand_asset", type_id: "ent_168", maturity: "stable", since: "0.1.0" },
804
- { name: "internal_doc", type_id: "ent_169", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "document" },
805
- { name: "prompt_template", type_id: "ent_170", maturity: "stable", since: "0.1.0" },
806
- { name: "content_calendar", type_id: "ent_171", maturity: "stable", since: "0.1.0" },
807
- { name: "content_theme", type_id: "ent_172", maturity: "stable", since: "0.1.0" },
808
- { name: "documentation_template", type_id: "ent_173", maturity: "stable", since: "0.1.0" },
809
- { name: "document", type_id: "ent_320", maturity: "stable", since: "0.2.0" },
810
- // ── Legal & Compliance ──
811
- { name: "compliance_requirement", type_id: "ent_174", maturity: "stable", since: "0.1.0" },
812
- { name: "risk", type_id: "ent_175", maturity: "stable", since: "0.1.0" },
813
- { name: "data_contract", type_id: "ent_176", maturity: "stable", since: "0.1.0" },
814
- { name: "legal_entity", type_id: "ent_177", maturity: "stable", since: "0.1.0" },
815
- { name: "ip_asset", type_id: "ent_178", maturity: "stable", since: "0.1.0" },
816
- { name: "audit_log_policy", type_id: "ent_179", maturity: "stable", since: "0.1.0" },
817
- { name: "contract", type_id: "ent_180", maturity: "stable", since: "0.1.0" },
818
- { name: "contract_clause", type_id: "ent_181", maturity: "stable", since: "0.1.0" },
819
- { name: "privacy_policy", type_id: "ent_182", maturity: "stable", since: "0.1.0" },
820
- { name: "compliance_framework", type_id: "ent_183", maturity: "stable", since: "0.1.0" },
821
- { name: "security_audit", type_id: "ent_184", maturity: "stable", since: "0.1.0" },
822
- // ── DevOps & Platform ──
823
- { name: "service_level_indicator", type_id: "ent_185", maturity: "stable", since: "0.1.0" },
824
- { name: "sli", type_id: "ent_334", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "service_level_indicator" },
825
- { name: "service_level_objective", type_id: "ent_186", maturity: "stable", since: "0.1.0" },
826
- { name: "slo", type_id: "ent_335", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "service_level_objective" },
827
- { name: "error_budget", type_id: "ent_187", maturity: "stable", since: "0.1.0" },
828
- { name: "incident", type_id: "ent_188", maturity: "stable", since: "0.1.0" },
829
- { name: "postmortem", type_id: "ent_189", maturity: "stable", since: "0.1.0" },
830
- { name: "runbook", type_id: "ent_190", maturity: "stable", since: "0.1.0" },
831
- { name: "monitor", type_id: "ent_191", maturity: "stable", since: "0.1.0" },
832
- { name: "alert_rule", type_id: "ent_192", maturity: "stable", since: "0.1.0" },
833
- { name: "ci_pipeline", type_id: "ent_193", maturity: "stable", since: "0.1.0" },
834
- { name: "release_strategy", type_id: "ent_194", maturity: "stable", since: "0.1.0" },
835
- { name: "on_call_rotation", type_id: "ent_195", maturity: "stable", since: "0.1.0" },
836
- { name: "infrastructure_component", type_id: "ent_196", maturity: "stable", since: "0.1.0" },
837
- // ── Security ──
838
- { name: "threat_model", type_id: "ent_197", maturity: "stable", since: "0.1.0" },
839
- { name: "threat", type_id: "ent_198", maturity: "stable", since: "0.1.0" },
840
- { name: "vulnerability", type_id: "ent_199", maturity: "stable", since: "0.1.0" },
841
- { name: "security_control", type_id: "ent_200", maturity: "stable", since: "0.1.0" },
842
- { name: "security_policy", type_id: "ent_201", maturity: "stable", since: "0.1.0" },
843
- { name: "security_incident", type_id: "ent_202", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "incident" },
844
- { name: "penetration_test", type_id: "ent_203", maturity: "stable", since: "0.1.0" },
845
- { name: "security_review", type_id: "ent_204", maturity: "stable", since: "0.1.0" },
846
- { name: "data_classification", type_id: "ent_205", maturity: "stable", since: "0.1.0" },
847
- { name: "access_policy", type_id: "ent_206", maturity: "stable", since: "0.1.0" },
848
- // ── Accessibility ──
849
- { name: "a11y_standard", type_id: "ent_207", maturity: "stable", since: "0.1.0" },
850
- { name: "a11y_guideline", type_id: "ent_208", maturity: "stable", since: "0.1.0" },
851
- { name: "a11y_audit", type_id: "ent_209", maturity: "stable", since: "0.1.0" },
852
- { name: "a11y_issue", type_id: "ent_210", maturity: "stable", since: "0.1.0" },
853
- { name: "a11y_annotation", type_id: "ent_211", maturity: "stable", since: "0.1.0" },
854
- // ── QA & Testing ──
855
- { name: "test_suite", type_id: "ent_212", maturity: "stable", since: "0.1.0" },
856
- { name: "test_case", type_id: "ent_213", maturity: "stable", since: "0.1.0" },
857
- { name: "qa_session", type_id: "ent_214", maturity: "stable", since: "0.1.0" },
858
- { name: "regression_test", type_id: "ent_215", maturity: "stable", since: "0.1.0" },
859
- { name: "test_coverage_report", type_id: "ent_216", maturity: "stable", since: "0.1.0" },
860
- { name: "test_environment", type_id: "ent_217", maturity: "stable", since: "0.1.0" },
861
- { name: "defect_report", type_id: "ent_218", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "support_ticket" },
862
- { name: "test_result", type_id: "ent_327", maturity: "proposed", since: "0.2.0" },
863
- // ── Feedback & Voice of Customer ──
864
- { name: "feedback_program", type_id: "ent_219", maturity: "stable", since: "0.1.0" },
865
- { name: "feature_request", type_id: "ent_220", maturity: "stable", since: "0.1.0" },
866
- { name: "feedback_vote", type_id: "ent_221", maturity: "stable", since: "0.1.0" },
867
- { name: "nps_campaign", type_id: "ent_222", maturity: "stable", since: "0.1.0" },
868
- { name: "user_advisory_board", type_id: "ent_223", maturity: "stable", since: "0.1.0" },
869
- { name: "beta_program", type_id: "ent_224", maturity: "stable", since: "0.1.0" },
870
- { name: "feedback_theme", type_id: "ent_225", maturity: "stable", since: "0.1.0" },
871
- // ── Pricing & Packaging ──
872
- { name: "pricing_strategy", type_id: "ent_226", maturity: "stable", since: "0.1.0" },
873
- { name: "pricing_experiment", type_id: "ent_227", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "experiment" },
874
- { name: "package", type_id: "ent_228", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "pricing_tier" },
875
- { name: "discount_strategy", type_id: "ent_229", maturity: "stable", since: "0.1.0" },
876
- { name: "trial_config", type_id: "ent_230", maturity: "stable", since: "0.1.0" },
877
- { name: "paywall", type_id: "ent_231", maturity: "stable", since: "0.1.0" },
878
- // ── AI/ML Operations ──
879
- { name: "ai_model", type_id: "ent_232", maturity: "stable", since: "0.1.0" },
880
- { name: "prompt_version", type_id: "ent_233", maturity: "stable", since: "0.1.0" },
881
- { name: "eval_benchmark", type_id: "ent_234", maturity: "stable", since: "0.1.0" },
882
- { name: "eval_run", type_id: "ent_235", maturity: "stable", since: "0.1.0" },
883
- { name: "ai_cost_tracker", type_id: "ent_236", maturity: "stable", since: "0.1.0" },
884
- { name: "hallucination_report", type_id: "ent_237", maturity: "stable", since: "0.1.0" },
885
- { name: "ai_guardrail", type_id: "ent_238", maturity: "stable", since: "0.1.0" },
886
- { name: "model_comparison", type_id: "ent_239", maturity: "stable", since: "0.1.0" },
887
- { name: "ai_experiment", type_id: "ent_323", maturity: "proposed", since: "0.2.0" },
888
- { name: "ai_dataset", type_id: "ent_324", maturity: "proposed", since: "0.2.0" },
889
- { name: "ai_trace", type_id: "ent_325", maturity: "proposed", since: "0.2.0" },
890
- // ── Agentic Workflows ──
891
- { name: "workflow_template", type_id: "ent_240", maturity: "stable", since: "0.1.0" },
892
- { name: "workflow_run", type_id: "ent_241", maturity: "stable", since: "0.1.0" },
893
- { name: "agent_definition", type_id: "ent_242", maturity: "stable", since: "0.1.0" },
894
- { name: "agent_session", type_id: "ent_243", maturity: "stable", since: "0.1.0" },
895
- { name: "review_gate", type_id: "ent_244", maturity: "stable", since: "0.1.0" },
896
- { name: "approval_record", type_id: "ent_245", maturity: "stable", since: "0.1.0" },
897
- { name: "agent_skill", type_id: "ent_246", maturity: "stable", since: "0.1.0" },
898
- { name: "agent_hook", type_id: "ent_247", maturity: "stable", since: "0.1.0" },
899
- { name: "workflow_artifact", type_id: "ent_248", maturity: "stable", since: "0.1.0" },
900
- { name: "agent_task", type_id: "ent_326", maturity: "proposed", since: "0.2.0" },
901
- // ── Portfolio ──
902
- { name: "organization", type_id: "ent_249", maturity: "stable", since: "0.1.0" },
903
- { name: "portfolio", type_id: "ent_250", maturity: "stable", since: "0.1.0" },
904
- { name: "product_area", type_id: "ent_251", maturity: "stable", since: "0.1.0" },
905
- // ── Sales & Revenue ──
906
- { name: "account", type_id: "ent_252", maturity: "stable", since: "0.1.0" },
907
- { name: "contact", type_id: "ent_253", maturity: "stable", since: "0.1.0" },
908
- { name: "lead", type_id: "ent_254", maturity: "stable", since: "0.1.0" },
909
- { name: "deal", type_id: "ent_255", maturity: "stable", since: "0.1.0" },
910
- { name: "pipeline_sales", type_id: "ent_256", maturity: "stable", since: "0.1.0" },
911
- { name: "pipeline_stage", type_id: "ent_257", maturity: "stable", since: "0.1.0" },
912
- { name: "quote_document", type_id: "ent_258", maturity: "stable", since: "0.1.0" },
913
- { name: "subscription", type_id: "ent_259", maturity: "stable", since: "0.1.0" },
914
- { name: "invoice", type_id: "ent_260", maturity: "stable", since: "0.1.0" },
915
- { name: "forecast", type_id: "ent_261", maturity: "stable", since: "0.1.0" },
916
- // ── Program Management ──
917
- { name: "program", type_id: "ent_262", maturity: "stable", since: "0.1.0" },
918
- { name: "project", type_id: "ent_263", maturity: "stable", since: "0.1.0" },
919
- // `portfolio_shared` (0.25.1 feedback): a milestone is often a cross-team gate,
920
- // not one project's checkpoint — an org-wide "Open Beta" that several products'
921
- // projects must all satisfy. Shared tier lets `project_targets_milestone` (and
922
- // the other milestone edges) pass the cross-scope gate as `provisional`, same
923
- // as `project_implements_initiative`. Precedent: `planning_cycle` (0.20.0).
924
- { name: "milestone", type_id: "ent_264", maturity: "stable", since: "0.1.0", portfolio_shared: true },
925
- { name: "risk_register", type_id: "ent_265", maturity: "stable", since: "0.1.0" },
926
- { name: "risk_item", type_id: "ent_266", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "risk" },
927
- { name: "change_request", type_id: "ent_267", maturity: "stable", since: "0.1.0" },
928
- { name: "deliverable", type_id: "ent_268", maturity: "stable", since: "0.1.0" },
929
- { name: "resource_allocation", type_id: "ent_269", maturity: "stable", since: "0.1.0" },
930
- { name: "status_report", type_id: "ent_270", maturity: "stable", since: "0.1.0" },
931
- // ── Marketing Operations ──
932
- { name: "marketing_strategy", type_id: "ent_271", maturity: "stable", since: "0.1.0" },
933
- { name: "marketing_channel", type_id: "ent_272", maturity: "stable", since: "0.1.0" },
934
- { name: "marketing_campaign_plan", type_id: "ent_273", maturity: "stable", since: "0.1.0" },
935
- { name: "email_sequence", type_id: "ent_274", maturity: "stable", since: "0.1.0" },
936
- { name: "social_post", type_id: "ent_275", maturity: "stable", since: "0.1.0" },
937
- { name: "seo_keyword", type_id: "ent_276", maturity: "stable", since: "0.1.0" },
938
- { name: "ad_creative", type_id: "ent_277", maturity: "stable", since: "0.1.0" },
939
- { name: "press_release", type_id: "ent_278", maturity: "stable", since: "0.1.0" },
940
- { name: "event", type_id: "ent_279", maturity: "stable", since: "0.1.0" },
941
- { name: "community_initiative", type_id: "ent_280", maturity: "stable", since: "0.1.0" },
942
- // ── Operations & Customer Success ──
943
- { name: "support_ticket", type_id: "ent_281", maturity: "stable", since: "0.1.0" },
944
- { name: "customer_feedback", type_id: "ent_282", maturity: "stable", since: "0.1.0" },
945
- { name: "churn_reason", type_id: "ent_283", maturity: "stable", since: "0.1.0" },
946
- { name: "onboarding_flow", type_id: "ent_284", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "user_flow" },
947
- { name: "customer_health_score", type_id: "ent_285", maturity: "stable", since: "0.1.0" },
948
- { name: "playbook", type_id: "ent_286", maturity: "stable", since: "0.1.0" },
949
- { name: "service_level_agreement", type_id: "ent_287", maturity: "stable", since: "0.1.0" },
950
- { name: "sla", type_id: "ent_336", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "service_level_agreement" },
951
- { name: "customer_journey_stage", type_id: "ent_288", maturity: "stable", since: "0.1.0" },
952
- { name: "touchpoint", type_id: "ent_289", maturity: "stable", since: "0.1.0" },
953
- { name: "success_milestone", type_id: "ent_290", maturity: "stable", since: "0.1.0" },
954
- { name: "service_blueprint", type_id: "ent_291", maturity: "stable", since: "0.1.0" },
955
- { name: "nps_score", type_id: "ent_292", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "nps_campaign" },
956
- // ── Localisation & i18n ──
957
- { name: "locale", type_id: "ent_293", maturity: "stable", since: "0.1.0" },
958
- { name: "translation_key", type_id: "ent_294", maturity: "stable", since: "0.1.0" },
959
- { name: "translation_bundle", type_id: "ent_295", maturity: "stable", since: "0.1.0" },
960
- { name: "locale_config", type_id: "ent_296", maturity: "stable", since: "0.1.0" },
961
- { name: "cultural_adaptation", type_id: "ent_297", maturity: "stable", since: "0.1.0" },
962
- { name: "regional_pricing", type_id: "ent_298", maturity: "stable", since: "0.1.0" },
963
- // ── Customer Education ──
964
- { name: "education_program", type_id: "ent_299", maturity: "stable", since: "0.1.0" },
965
- { name: "tutorial", type_id: "ent_300", maturity: "stable", since: "0.1.0" },
966
- { name: "walkthrough", type_id: "ent_301", maturity: "stable", since: "0.1.0" },
967
- { name: "webinar", type_id: "ent_302", maturity: "stable", since: "0.1.0" },
968
- { name: "certification", type_id: "ent_303", maturity: "stable", since: "0.1.0" },
969
- { name: "help_video", type_id: "ent_304", maturity: "stable", since: "0.1.0" },
970
- { name: "learning_path", type_id: "ent_305", maturity: "stable", since: "0.1.0" },
971
- // ── Partners & Ecosystem ──
972
- { name: "partner_program", type_id: "ent_306", maturity: "stable", since: "0.1.0" },
973
- { name: "partner_tier", type_id: "ent_307", maturity: "stable", since: "0.1.0" },
974
- { name: "api_ecosystem", type_id: "ent_308", maturity: "stable", since: "0.1.0" },
975
- { name: "marketplace_listing", type_id: "ent_309", maturity: "stable", since: "0.1.0" },
976
- { name: "developer_portal", type_id: "ent_310", maturity: "stable", since: "0.1.0" },
977
- { name: "integration_partner", type_id: "ent_311", maturity: "stable", since: "0.1.0" },
978
- { name: "partner_revenue_share", type_id: "ent_312", maturity: "stable", since: "0.1.0" },
979
- // ── Workspace ──
980
- { name: "workspace", type_id: "ent_328", maturity: "proposed", since: "0.2.0" },
981
- { name: "framework_exercise", type_id: "ent_350", maturity: "proposed", since: "0.8.4" },
982
- { name: "composition", type_id: "ent_361", maturity: "proposed", since: "0.31.0" },
983
- // A dated, hashed rendition of a node that is already in the graph. Enters
984
- // `proposed` per the maturity rubric (precedent: composition 0.31.0).
985
- { name: "capture", type_id: "ent_362", maturity: "proposed", since: "0.32.0" }
986
- ];
987
- var DEFERRED_PROPOSED_BY_CONTRACT = {
988
- // user_story (UPG-571) and experiment_run (UPG-664) graduated to stable in
989
- // 0.12.6 — Captain lifted both freezes ("we are using them"). Their contracts
990
- // are settled; they are now stable, not deferred.
991
- ai_experiment: "UPG-665: AI prompt/model restructure (open ADR).",
992
- ai_dataset: "UPG-665: AI prompt/model restructure (open ADR).",
993
- ai_trace: "UPG-665: AI prompt/model restructure (open ADR)."
994
- };
995
- var UPG_ENTITY_META_BY_NAME = new Map(
996
- UPG_ENTITY_META.map((m) => [m.name, m])
997
- );
998
- var UPG_ENTITY_META_BY_ID = new Map(
999
- UPG_ENTITY_META.map((m) => [m.type_id, m])
1000
- );
1001
- var UPG_ACTIVE_TYPES = UPG_ENTITY_META.filter((m) => m.maturity === "stable" || m.maturity === "proposed").map((m) => m.name);
1002
- var UPG_DEPRECATED_TYPES = UPG_ENTITY_META.filter((m) => m.maturity === "deprecated").map((m) => m.name);
1003
- var UPG_PORTFOLIO_SHARED_TYPES = UPG_ENTITY_META.filter((m) => m.portfolio_shared === true).map((m) => m.name);
1004
- function isPortfolioSharedType(name) {
1005
- return UPG_ENTITY_META_BY_NAME.get(name)?.portfolio_shared === true;
1006
- }
1007
- function isDeprecatedType(name) {
1008
- const meta = UPG_ENTITY_META_BY_NAME.get(name);
1009
- return meta?.maturity === "deprecated";
1010
- }
1011
- function getReplacementType(name) {
1012
- const meta = UPG_ENTITY_META_BY_NAME.get(name);
1013
- return meta?.replacement;
1014
- }
1015
- function getTypeId(name) {
1016
- return UPG_ENTITY_META_BY_NAME.get(name)?.type_id;
1017
- }
1018
- function getTypeName(typeId) {
1019
- return UPG_ENTITY_META_BY_ID.get(typeId)?.name;
1020
- }
1021
-
1022
1033
  // src/catalog/edge-catalog.ts
1023
1034
  var UPG_WILDCARD_ENDPOINT = "node";
1024
1035
  var CLASSIFICATION_EDGE_PROPERTY_SCHEMA = {
@@ -1483,6 +1494,15 @@ var UPG_EDGE_CATALOG = {
1483
1494
  product_categorises_by_roadmap_theme: { forward_verb: "categorises_by", reverse_verb: "categorises", classification: "hierarchy", source_type: "product", target_type: "roadmap_theme" },
1484
1495
  feature_area_contains_feature: { forward_verb: "contains", reverse_verb: "belongs_to", classification: "hierarchy", source_type: "feature_area", target_type: "feature" },
1485
1496
  feature_area_contains_feature_area: { forward_verb: "contains", reverse_verb: "belongs_to", classification: "hierarchy", source_type: "feature_area", target_type: "feature_area" },
1497
+ // (0.39.0, B4) Component catalogs group by area -- a storybook sidebar that
1498
+ // follows the source tree, a visual-coverage report -- and the graph had no
1499
+ // edge for it, so a measured estate tagged 133 components `area:<group>`
1500
+ // instead. `groups`, not `contains`: the area does not OWN the component
1501
+ // (a design_system or product does); it is a grouping view over components
1502
+ // owned elsewhere, the same non-owning relationship `journey_phase_spans_journey_step`
1503
+ // records. Multi-parent GRAMMAR with single per-instance parentage, the
1504
+ // `quote` precedent.
1505
+ feature_area_groups_design_component: { forward_verb: "groups", reverse_verb: "grouped_in", classification: "hierarchy", source_type: "feature_area", target_type: "design_component" },
1486
1506
  outcome_delivered_by_feature: { forward_verb: "delivered_by", reverse_verb: "delivers", classification: "cross-domain", source_type: "outcome", target_type: "feature" },
1487
1507
  outcome_delivered_via_feature_area: { forward_verb: "delivered_via", reverse_verb: "delivers_for", classification: "cross-domain", source_type: "outcome", target_type: "feature_area" },
1488
1508
  feature_decomposed_into_epic: { forward_verb: "decomposed_into", reverse_verb: "implements", classification: "hierarchy", source_type: "feature", target_type: "epic" },
@@ -1802,10 +1822,32 @@ var UPG_EDGE_CATALOG = {
1802
1822
  // decision records design choices about the system; not contained by it.
1803
1823
  design_system_decided_via_decision: { forward_verb: "decided_via", reverse_verb: "decided_for", classification: "semantic", source_type: "design_system", target_type: "decision" },
1804
1824
  design_component_styled_by_design_token: { forward_verb: "styled_by", reverse_verb: "styles", classification: "hierarchy", source_type: "design_component", target_type: "design_token" },
1825
+ // (0.39.0, B2) The alias tier. A modern token system is two or three tiers --
1826
+ // primitives (`--gray-100`) that semantic tokens alias
1827
+ // (`--background-high: light-dark(var(--gray-100), var(--gray-900))`) that
1828
+ // components consume -- and the spec could hold the ends but not the middle,
1829
+ // so a measured estate (163 DTCG primitives, 45 semantic aliases) kept its
1830
+ // alias chain in descriptions. `causal`, not `semantic`: the alias's VALUE is
1831
+ // computed from the primitive's, so the dependency is real and directional.
1832
+ // `cross_product_eligible` because the primitive tier is routinely its own
1833
+ // published package (its own graph) while the semantic tier lives with the
1834
+ // component library. Makes "which primitives does this component ultimately
1835
+ // depend on" and "which primitives are dead" traversals rather than scripts.
1836
+ design_token_derives_from_design_token: { forward_verb: "derives_from", reverse_verb: "derived_into", classification: "causal", source_type: "design_token", target_type: "design_token", cross_product_eligible: true },
1805
1837
  design_component_follows_design_pattern: { forward_verb: "follows", reverse_verb: "followed_by", classification: "hierarchy", source_type: "design_component", target_type: "design_pattern" },
1806
1838
  design_component_governed_by_design_guideline: { forward_verb: "governed_by", reverse_verb: "governs", classification: "hierarchy", source_type: "design_component", target_type: "design_guideline" },
1807
1839
  design_component_specified_by_interaction_spec: { forward_verb: "specified_by", reverse_verb: "specifies", classification: "hierarchy", source_type: "design_component", target_type: "interaction_spec" },
1808
- design_component_composes_design_component: { forward_verb: "composes", reverse_verb: "composed_in", classification: "hierarchy", source_type: "design_component", target_type: "design_component" },
1840
+ // (0.39.0, B1) `cross_product_eligible` because a design system and the
1841
+ // product that consumes it are two graphs: a Studio shadow component wrapping
1842
+ // the @sanity/ui primitive it is built on could not be stated, and 11 such
1843
+ // wrappers recorded the relationship in prose instead. Widened rather than
1844
+ // minting `design_component_wraps_design_component`: a wrap IS composition
1845
+ // read across a graph boundary, and a second verb for one relationship is the
1846
+ // shadow-pair shape Pattern D collapses. `design_component` is already
1847
+ // portfolio_shared, and the three sibling component edges
1848
+ // (surface_renders_, screen_renders_, feature_uses_) are already eligible;
1849
+ // this closes the last link between a product graph and its design system.
1850
+ design_component_composes_design_component: { forward_verb: "composes", reverse_verb: "composed_in", classification: "hierarchy", source_type: "design_component", target_type: "design_component", cross_product_eligible: true },
1809
1851
  prototype_annotated_with_annotation: { forward_verb: "annotated_with", reverse_verb: "annotates", classification: "hierarchy", source_type: "prototype", target_type: "annotation" },
1810
1852
  screen_renders_design_component: { forward_verb: "renders", reverse_verb: "rendered_on", classification: "hierarchy", source_type: "screen", target_type: "design_component", cross_product_eligible: true },
1811
1853
  // Marketing surface to product (0.12.7, UPG-696/698). A marketing/landing screen
@@ -7509,7 +7551,7 @@ var UPG_VALID_CHILDREN = {
7509
7551
  // parent. Same widening shape as the 0.23.0 epic twins: an existing leaf type
7510
7552
  // gains a second, SHALLOWER parent, verbs inherited from the deeper edge.
7511
7553
  feature: ["epic", "bug", "task", "user_story"],
7512
- feature_area: ["feature", "feature_area"],
7554
+ feature_area: ["feature", "feature_area", "design_component"],
7513
7555
  // epic owns user_story (the templated promise) and, mirroring feature, may
7514
7556
  // also directly contain bug/task — heterogeneous imported tickets that belong
7515
7557
  // to one epic rather than the feature as a whole (feedback df99026a).
@@ -13070,7 +13112,7 @@ var UPG_PROPERTY_SCHEMA = {
13070
13112
  },
13071
13113
  // DesignTokenProperties: Design token.
13072
13114
  design_token: {
13073
- category: { type: "string", enum: ["color", "spacing", "typography", "radius", "motion"], description: "Category" },
13115
+ category: { type: "string", enum: ["color", "spacing", "typography", "radius", "motion", "dimension", "fontFamily", "fontWeight", "duration", "cubicBezier", "number", "shadow", "gradient", "border", "transition", "strokeStyle", "opacity"], description: "What kind of value this token holds. Aligned to the Design Tokens Community Group `$type` vocabulary so a DTCG export maps across without translation; the five original UPG values are kept, `color` and `spacing` being the ones DTCG spells the same and `typography`, `radius`, `motion` being groupings a design system names in its own terms.", notes: "DTCG mapping for the values that are not one-to-one: a `radius` token is a DTCG `dimension`, a `motion` token is usually a `duration` or a `cubicBezier`, and a `typography` token is a composite over `fontFamily` / `fontWeight` / `dimension`. Both spellings are accepted: an estate that speaks DTCG writes the `$type` name, one that speaks UPG's original five keeps writing them, and neither has to translate at the boundary. Extended at 0.39.0 from a measured estate (163 DTCG primitives) whose `shadow`, `dimension` and `opacity` tokens had no category to land on. The enum was documented but unenforced then; `validate_graph`'s `property_enum_drift` class (same release) is what makes it real, which is why the vocabulary had to be right before the check arrived." },
13074
13116
  value: { type: "string", description: "Resolved value" },
13075
13117
  css_variable: { type: "string", description: "CSS custom property name" }
13076
13118
  },
@@ -33852,7 +33894,7 @@ function checkHeaderSealText(text) {
33852
33894
  }
33853
33895
 
33854
33896
  // src/index.ts
33855
- var UPG_VERSION = "0.37.0";
33897
+ var UPG_VERSION = "0.39.0";
33856
33898
  var UPG_FORMAT_VERSION = "0.4.0";
33857
33899
  var MARKDOWN_FORMAT_VERSION = "0.1";
33858
33900
  var UPG_TYPES = getTypes();