@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.cjs CHANGED
@@ -293,6 +293,510 @@ __export(index_exports, {
293
293
  });
294
294
  module.exports = __toCommonJS(index_exports);
295
295
 
296
+ // src/registry/entity-meta.ts
297
+ var UPG_ENTITY_META = [
298
+ // Foundations (0.9.12): shared specifications + the primitives they define.
299
+ { name: "specification", type_id: "ent_352", maturity: "proposed", since: "0.9.12", portfolio_shared: true },
300
+ { name: "primitive", type_id: "ent_353", maturity: "proposed", since: "0.9.12", portfolio_shared: true },
301
+ { name: "operating_lifecycle", type_id: "ent_355", maturity: "proposed", since: "0.11.6", portfolio_shared: true },
302
+ { name: "operating_stage", type_id: "ent_356", maturity: "proposed", since: "0.11.6", portfolio_shared: true },
303
+ // ── Strategic ──
304
+ { name: "product", type_id: "ent_001", maturity: "stable", since: "0.1.0" },
305
+ { name: "outcome", type_id: "ent_002", maturity: "stable", since: "0.1.0", portfolio_shared: true },
306
+ { name: "kpi", type_id: "ent_003", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "metric" },
307
+ { name: "objective", type_id: "ent_004", maturity: "stable", since: "0.1.0", portfolio_shared: true },
308
+ { name: "key_result", type_id: "ent_005", maturity: "stable", since: "0.1.0", portfolio_shared: true },
309
+ { name: "metric", type_id: "ent_006", maturity: "stable", since: "0.1.0", portfolio_shared: true },
310
+ // F7 (UPG-673): graduated proposed → stable at v0.9.x — proposed since 0.2.2,
311
+ // the metric-quality assessment artefact is settled with no open restructure.
312
+ { name: "metric_quality_assessment", type_id: "ent_339", maturity: "stable", since: "0.2.2" },
313
+ { name: "vision", type_id: "ent_007", maturity: "stable", since: "0.1.0", portfolio_shared: true },
314
+ { name: "mission", type_id: "ent_008", maturity: "stable", since: "0.1.0", portfolio_shared: true },
315
+ { name: "strategic_theme", type_id: "ent_009", maturity: "stable", since: "0.1.0", portfolio_shared: true },
316
+ { name: "initiative", type_id: "ent_010", maturity: "stable", since: "0.1.0", portfolio_shared: true },
317
+ { name: "capability", type_id: "ent_011", maturity: "stable", since: "0.1.0", portfolio_shared: true },
318
+ { name: "value_stream", type_id: "ent_012", maturity: "stable", since: "0.1.0" },
319
+ { name: "strategic_pillar", type_id: "ent_013", maturity: "stable", since: "0.1.0", portfolio_shared: true },
320
+ { name: "assumption", type_id: "ent_014", maturity: "stable", since: "0.1.0" },
321
+ { name: "decision", type_id: "ent_015", maturity: "stable", since: "0.1.0" },
322
+ { name: "constraint", type_id: "ent_348", maturity: "stable", since: "0.4.3" },
323
+ // (0.17.4) Strategy-domain sibling of research_question / design_question,
324
+ // completing the domain-question triad. An open coordination/ownership question
325
+ // a plan is exposed to (distinct from `assumption`, which the plan is built on).
326
+ { name: "strategic_question", type_id: "ent_357", maturity: "proposed", since: "0.17.4" },
327
+ // ── User ──
328
+ { name: "persona", type_id: "ent_016", maturity: "stable", since: "0.1.0" },
329
+ { name: "job", type_id: "ent_017", maturity: "stable", since: "0.1.0" },
330
+ { name: "jtbd", type_id: "ent_332", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "job" },
331
+ { name: "pain_point", type_id: "ent_018", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "need" },
332
+ { name: "desired_outcome", type_id: "ent_019", maturity: "stable", since: "0.1.0" },
333
+ { name: "job_step", type_id: "ent_020", maturity: "stable", since: "0.1.0" },
334
+ { name: "user_need", type_id: "ent_021", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "need" },
335
+ { name: "need", type_id: "ent_313", maturity: "stable", since: "0.1.0" },
336
+ { name: "switching_cost", type_id: "ent_022", maturity: "stable", since: "0.1.0" },
337
+ // ── Discovery ──
338
+ { name: "opportunity", type_id: "ent_023", maturity: "stable", since: "0.1.0", default_frameworks: ["opportunity-sizing", "rice-scoring"] },
339
+ { name: "solution", type_id: "ent_024", maturity: "stable", since: "0.1.0", default_frameworks: ["rice-scoring"] },
340
+ { name: "feasibility_study", type_id: "ent_025", maturity: "stable", since: "0.1.0" },
341
+ { name: "design_sprint", type_id: "ent_026", maturity: "stable", since: "0.1.0" },
342
+ // ── Validation ──
343
+ // (since v0.4.0) `hypothesis` re-promoted to canonical-stable. The
344
+ // v0.2.8 rename to `hypothesis_claim` was over-split: "claim" is implied
345
+ // by being a hypothesis. Canonical name reverts; HypothesisClaimProperties
346
+ // renamed to HypothesisProperties. `hypothesis_claim` is now deprecated
347
+ // (→ `hypothesis`). `hypothesis_evidence` deprecated (→ `evidence`): the
348
+ // dual evidence_type enum smell resolved by enriching canonical `evidence`
349
+ // with evidence_rigor + evidence_source axes. Edge pattern switches to
350
+ // `hypothesis_has_evidence` (neutral, direction on node).
351
+ { name: "hypothesis", type_id: "ent_027", maturity: "stable", since: "0.1.0" },
352
+ { name: "hypothesis_claim", type_id: "ent_344", maturity: "deprecated", since: "0.2.8", deprecated_in: "0.4.0", replacement: "hypothesis" },
353
+ { name: "hypothesis_evidence", type_id: "ent_345", maturity: "deprecated", since: "0.2.8", deprecated_in: "0.4.0", replacement: "evidence" },
354
+ // `experiment` is canonical (UPG-664). It has its own property schema
355
+ // (method, start_date, end_date, sample_size, expected_lift) and is the
356
+ // canonical unit of a structured test. The validation flow is
357
+ // `hypothesis → experiment_plan → experiment → experiment_run`: the plan is
358
+ // the validation design, the experiment is the structured test, the run is
359
+ // the optional multi-run/replication child.
360
+ { name: "experiment", type_id: "ent_028", maturity: "stable", since: "0.1.0" },
361
+ // experiment_plan graduated proposed → stable (UPG-664). It is the canonical
362
+ // validation PLAN type — it absorbed `test_plan`'s planning properties
363
+ // (method / success_criteria / sample_size) when `test_plan` re-homed to the
364
+ // QA/testing domain (UPG-678).
365
+ { name: "experiment_plan", type_id: "ent_340", maturity: "stable", since: "0.2.6" },
366
+ { name: "experiment_run", type_id: "ent_341", maturity: "stable", since: "0.2.6" },
367
+ { name: "learning", type_id: "ent_029", maturity: "stable", since: "0.1.0" },
368
+ // test_plan re-homed validation → testing/QA (UPG-678). It is the QA
369
+ // verification-procedure plan (test scope / environments / pass criteria);
370
+ // its former validation-planning role is carried by experiment_plan.
371
+ { name: "test_plan", type_id: "ent_030", maturity: "stable", since: "0.1.0" },
372
+ { name: "evidence", type_id: "ent_031", maturity: "stable", since: "0.1.0" },
373
+ { name: "research_plan", type_id: "ent_032", maturity: "stable", since: "0.1.0" },
374
+ // ── Market Intelligence ──
375
+ { name: "competitor", type_id: "ent_033", maturity: "stable", since: "0.1.0", portfolio_shared: true },
376
+ { name: "competitor_feature", type_id: "ent_034", maturity: "stable", since: "0.1.0", portfolio_shared: true },
377
+ { name: "competitor_signal", type_id: "ent_354", maturity: "proposed", since: "0.10.0", portfolio_shared: true },
378
+ { name: "market_trend", type_id: "ent_035", maturity: "stable", since: "0.1.0" },
379
+ { name: "market_segment", type_id: "ent_036", maturity: "stable", since: "0.1.0", portfolio_shared: true },
380
+ { name: "competitive_analysis", type_id: "ent_037", maturity: "stable", since: "0.1.0" },
381
+ // Classification taxonomy hosted by competitive_analysis.
382
+ // F7 (UPG-673): graduated proposed → stable at v0.9.x — two minor releases
383
+ // stable since 0.4.0, the taxonomy-axis/value pair backs the competitive-
384
+ // analysis classification spine with no open rename/restructure ticket.
385
+ { name: "classification_axis", type_id: "ent_346", maturity: "stable", since: "0.4.0", portfolio_shared: true },
386
+ { name: "classification_value", type_id: "ent_347", maturity: "stable", since: "0.4.0", portfolio_shared: true },
387
+ // ── UX Research ──
388
+ { name: "research_study", type_id: "ent_038", maturity: "stable", since: "0.1.0" },
389
+ { name: "research_insight", type_id: "ent_039", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "insight" },
390
+ { name: "insight", type_id: "ent_040", maturity: "stable", since: "0.1.0" },
391
+ { name: "participant", type_id: "ent_041", maturity: "stable", since: "0.1.0" },
392
+ { name: "observation", type_id: "ent_042", maturity: "stable", since: "0.1.0" },
393
+ { name: "quote", type_id: "ent_043", maturity: "stable", since: "0.1.0" },
394
+ { name: "affinity_cluster", type_id: "ent_044", maturity: "stable", since: "0.1.0" },
395
+ { name: "research_question", type_id: "ent_045", maturity: "stable", since: "0.1.0" },
396
+ { name: "interview_guide", type_id: "ent_046", maturity: "stable", since: "0.1.0" },
397
+ { name: "finding", type_id: "ent_047", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "insight" },
398
+ { name: "survey_response", type_id: "ent_048", maturity: "stable", since: "0.1.0" },
399
+ { name: "highlight", type_id: "ent_049", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "observation" },
400
+ // ── Design ──
401
+ { name: "user_journey", type_id: "ent_050", maturity: "stable", since: "0.1.0" },
402
+ { name: "journey_step", type_id: "ent_051", maturity: "stable", since: "0.1.0" },
403
+ { name: "ux_insight", type_id: "ent_052", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "insight" },
404
+ { name: "design_question", type_id: "ent_053", maturity: "stable", since: "0.1.0" },
405
+ { name: "how_might_we", type_id: "ent_333", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "design_question" },
406
+ { name: "design_concept", type_id: "ent_054", maturity: "stable", since: "0.1.0" },
407
+ { name: "prototype", type_id: "ent_055", maturity: "stable", since: "0.1.0" },
408
+ { name: "design_component", type_id: "ent_056", maturity: "stable", since: "0.1.0", portfolio_shared: true },
409
+ { name: "design_token", type_id: "ent_057", maturity: "stable", since: "0.1.0" },
410
+ { name: "brand_identity", type_id: "ent_058", maturity: "stable", since: "0.1.0", portfolio_shared: true },
411
+ { name: "brand_colour", type_id: "ent_059", maturity: "stable", since: "0.1.0" },
412
+ { name: "brand_typography", type_id: "ent_060", maturity: "stable", since: "0.1.0" },
413
+ { name: "brand_voice", type_id: "ent_061", maturity: "stable", since: "0.1.0" },
414
+ { name: "wireframe", type_id: "ent_062", maturity: "stable", since: "0.1.0" },
415
+ { name: "design_pattern", type_id: "ent_063", maturity: "stable", since: "0.1.0" },
416
+ { name: "design_guideline", type_id: "ent_064", maturity: "stable", since: "0.1.0" },
417
+ { name: "annotation", type_id: "ent_065", maturity: "stable", since: "0.1.0" },
418
+ { name: "interaction_spec", type_id: "ent_066", maturity: "stable", since: "0.1.0" },
419
+ { name: "design_system", type_id: "ent_067", maturity: "stable", since: "0.1.0", portfolio_shared: true },
420
+ { name: "user_flow", type_id: "ent_068", maturity: "stable", since: "0.1.0" },
421
+ { name: "screen", type_id: "ent_069", maturity: "stable", since: "0.1.0" },
422
+ { name: "screen_state", type_id: "ent_070", maturity: "stable", since: "0.1.0" },
423
+ // surface (0.27.0): the place inside a screen. `screen` is route-level
424
+ // (route / viewport / access_level); `surface` is the contested slot within
425
+ // it, carrying its occupants and the rule that arbitrates between them.
426
+ // Enters `proposed` per the maturity rubric (precedent: planning_cycle 0.20.0).
427
+ { name: "surface", type_id: "ent_359", maturity: "proposed", since: "0.27.0" },
428
+ { name: "configuration_axis", type_id: "ent_360", maturity: "proposed", since: "0.30.0" },
429
+ { name: "journey_phase", type_id: "ent_330", maturity: "proposed", since: "0.2.0" },
430
+ { name: "journey_action", type_id: "ent_331", maturity: "proposed", since: "0.2.0" },
431
+ { name: "design_decision", type_id: "ent_319", maturity: "deprecated", since: "0.2.0", deprecated_in: "0.2.0", replacement: "decision" },
432
+ // F7 (UPG-673): graduated proposed → stable at v0.9.x — proposed since 0.2.0,
433
+ // the brand-identity set (logo + imagery) is settled with no open rename.
434
+ { name: "brand_logo", type_id: "ent_321", maturity: "stable", since: "0.2.0" },
435
+ { name: "brand_imagery", type_id: "ent_322", maturity: "stable", since: "0.2.0" },
436
+ // ── Product Spec ──
437
+ { name: "feature_area", type_id: "ent_314", maturity: "stable", since: "0.1.0" },
438
+ { name: "feature", type_id: "ent_071", maturity: "stable", since: "0.1.0" },
439
+ { name: "epic", type_id: "ent_072", maturity: "stable", since: "0.1.0" },
440
+ // `user_story` is the templated "As X, I want Y so Z" promise: a stable,
441
+ // lifecycle-free design artefact (UCS pattern P5). The v0.2.7 split EXTRACTED
442
+ // the engineering work into a separate `task` (the lifecycle-bearing work-unit,
443
+ // linked via `task_implements_user_story`); the split was right. But the
444
+ // surviving statement half was renamed to the coined `story_statement`, which
445
+ // raised the adoption barrier. "user story" is the universally-recognised
446
+ // industry term for exactly this artefact. v0.7.0 (UPG-571) re-canonicalises
447
+ // the statement under `user_story`; `story_statement` becomes a deprecated
448
+ // alias. `story_task` (the original work half) was already collapsed into
449
+ // canonical `task` at v0.4.0. So the canonical shape is: user_story (statement)
450
+ // + task (work), linked by `task_implements_user_story`.
451
+ //
452
+ // F7 (UPG-673) — DEFERRED, deliberately kept `proposed`. The audit flagged
453
+ // user_story as a stable-spine candidate, but the v0.7.0 re-canon contract
454
+ // (UPG-571) freezes maturity at `proposed` until the re-canonicalised name
455
+ // has soaked across a full migration window. `user-story-split.test.ts`
456
+ // ("user_story is canonical again (ent_073, proposed, not deprecated)")
457
+ // asserts `proposed` as the post-re-canon invariant. Graduating here would
458
+ // break that contract; promotion is a separate, ticketed decision once the
459
+ // story_statement → user_story migration has fully aged out.
460
+ { name: "user_story", type_id: "ent_073", maturity: "stable", since: "0.1.0" },
461
+ { name: "story_statement", type_id: "ent_342", maturity: "deprecated", since: "0.2.7", deprecated_in: "0.7.0", replacement: "user_story" },
462
+ { name: "story_task", type_id: "ent_343", maturity: "deprecated", since: "0.2.7", deprecated_in: "0.4.0", replacement: "task" },
463
+ { name: "acceptance_criterion", type_id: "ent_074", maturity: "stable", since: "0.1.0" },
464
+ { name: "release", type_id: "ent_075", maturity: "stable", since: "0.1.0" },
465
+ { name: "task", type_id: "ent_076", maturity: "stable", since: "0.1.0" },
466
+ { name: "bug", type_id: "ent_077", maturity: "stable", since: "0.1.0" },
467
+ { name: "roadmap", type_id: "ent_078", maturity: "stable", since: "0.1.0" },
468
+ { name: "roadmap_item", type_id: "ent_079", maturity: "stable", since: "0.1.0" },
469
+ { name: "theme", type_id: "ent_080", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.9.0", replacement: "roadmap_theme" },
470
+ { name: "roadmap_theme", type_id: "ent_351", maturity: "stable", since: "0.1.0" },
471
+ { name: "changelog", type_id: "ent_081", maturity: "stable", since: "0.1.0" },
472
+ // (0.20.0) The cadence axis: a named, dated interval that work flows through
473
+ // and which nests (a program-increment contains iterations; a cycle contains
474
+ // its cooldown). One self-nesting type with a `cadence_kind` discriminator
475
+ // spans sprint / iteration / quarter / PI / cooldown rather than minting a
476
+ // type per methodology. `portfolio_shared` because a coarse cycle is an
477
+ // org-shared interval an objective in a rollup graph and a story in a product
478
+ // graph both schedule into.
479
+ { name: "planning_cycle", type_id: "ent_358", maturity: "proposed", since: "0.20.0", portfolio_shared: true },
480
+ // ── Engineering ──
481
+ { name: "bounded_context", type_id: "ent_082", maturity: "stable", since: "0.1.0" },
482
+ { name: "service", type_id: "ent_083", maturity: "stable", since: "0.1.0" },
483
+ { name: "domain_event", type_id: "ent_084", maturity: "stable", since: "0.1.0" },
484
+ { name: "api_contract", type_id: "ent_085", maturity: "stable", since: "0.1.0" },
485
+ { name: "architecture_decision", type_id: "ent_086", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "decision" },
486
+ { name: "technical_debt_item", type_id: "ent_087", maturity: "stable", since: "0.1.0" },
487
+ { name: "feature_flag", type_id: "ent_088", maturity: "stable", since: "0.1.0" },
488
+ { name: "deployment", type_id: "ent_089", maturity: "stable", since: "0.1.0" },
489
+ { name: "aggregate", type_id: "ent_090", maturity: "stable", since: "0.1.0" },
490
+ { name: "domain_entity", type_id: "ent_091", maturity: "stable", since: "0.1.0" },
491
+ { name: "value_object", type_id: "ent_092", maturity: "stable", since: "0.1.0" },
492
+ { name: "command", type_id: "ent_093", maturity: "stable", since: "0.1.0" },
493
+ { name: "read_model", type_id: "ent_094", maturity: "stable", since: "0.1.0" },
494
+ { name: "api_endpoint", type_id: "ent_095", maturity: "stable", since: "0.1.0" },
495
+ { name: "database_schema", type_id: "ent_096", maturity: "stable", since: "0.1.0" },
496
+ { name: "queue_topic", type_id: "ent_097", maturity: "stable", since: "0.1.0" },
497
+ { name: "build_artifact", type_id: "ent_098", maturity: "stable", since: "0.1.0" },
498
+ { name: "code_repository", type_id: "ent_099", maturity: "stable", since: "0.1.0" },
499
+ { name: "library_dependency", type_id: "ent_100", maturity: "stable", since: "0.1.0" },
500
+ { name: "integration_pattern", type_id: "ent_101", maturity: "stable", since: "0.1.0" },
501
+ { name: "external_api", type_id: "ent_102", maturity: "stable", since: "0.1.0" },
502
+ { name: "data_flow", type_id: "ent_103", maturity: "stable", since: "0.1.0" },
503
+ { name: "investigation", type_id: "ent_315", maturity: "stable", since: "0.2.0" },
504
+ { name: "root_cause", type_id: "ent_316", maturity: "stable", since: "0.2.0" },
505
+ { name: "symptom", type_id: "ent_317", maturity: "stable", since: "0.2.0" },
506
+ { name: "fix", type_id: "ent_318", maturity: "stable", since: "0.2.0" },
507
+ // ── Growth ──
508
+ { name: "north_star_metric", type_id: "ent_104", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "metric" },
509
+ { name: "input_metric", type_id: "ent_105", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "metric" },
510
+ { name: "funnel", type_id: "ent_106", maturity: "stable", since: "0.1.0" },
511
+ { name: "funnel_step", type_id: "ent_107", maturity: "stable", since: "0.1.0" },
512
+ { name: "acquisition_channel", type_id: "ent_108", maturity: "stable", since: "0.1.0" },
513
+ { name: "growth_campaign", type_id: "ent_109", maturity: "stable", since: "0.1.0" },
514
+ { name: "campaign", type_id: "ent_337", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "growth_campaign" },
515
+ { name: "cohort", type_id: "ent_110", maturity: "stable", since: "0.1.0" },
516
+ { name: "behavioral_segment", type_id: "ent_111", maturity: "stable", since: "0.1.0" },
517
+ { name: "segment", type_id: "ent_338", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "behavioral_segment" },
518
+ { name: "growth_loop", type_id: "ent_112", maturity: "stable", since: "0.1.0" },
519
+ { name: "growth_experiment", type_id: "ent_113", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "experiment" },
520
+ { name: "variant", type_id: "ent_114", maturity: "stable", since: "0.1.0" },
521
+ { name: "attribution_model", type_id: "ent_115", maturity: "stable", since: "0.1.0" },
522
+ // ── Business Model ──
523
+ { name: "business_model", type_id: "ent_116", maturity: "stable", since: "0.1.0" },
524
+ { name: "value_proposition", type_id: "ent_117", maturity: "stable", since: "0.1.0" },
525
+ { name: "revenue_stream", type_id: "ent_118", maturity: "stable", since: "0.1.0" },
526
+ { name: "pricing_tier", type_id: "ent_119", maturity: "stable", since: "0.1.0" },
527
+ { name: "cost_structure", type_id: "ent_120", maturity: "stable", since: "0.1.0" },
528
+ { name: "unit_economics", type_id: "ent_121", maturity: "stable", since: "0.1.0" },
529
+ { name: "partnership", type_id: "ent_122", maturity: "stable", since: "0.1.0" },
530
+ { name: "key_resource", type_id: "ent_123", maturity: "stable", since: "0.1.0" },
531
+ { name: "key_activity", type_id: "ent_124", maturity: "stable", since: "0.1.0" },
532
+ { name: "customer_segment_bm", type_id: "ent_125", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "market_segment" },
533
+ { name: "channel_bm", type_id: "ent_126", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "distribution_channel" },
534
+ { name: "target_customer_segment", type_id: "ent_329", maturity: "deprecated", since: "0.2.0", deprecated_in: "0.2.0", replacement: "market_segment" },
535
+ { name: "customer_relationship", type_id: "ent_127", maturity: "stable", since: "0.1.0" },
536
+ { name: "distribution_channel", type_id: "ent_128", maturity: "stable", since: "0.1.0" },
537
+ // ── Go-To-Market ──
538
+ { name: "gtm_strategy", type_id: "ent_129", maturity: "stable", since: "0.1.0" },
539
+ { name: "ideal_customer_profile", type_id: "ent_130", maturity: "stable", since: "0.1.0" },
540
+ { name: "positioning", type_id: "ent_131", maturity: "stable", since: "0.1.0" },
541
+ { name: "messaging", type_id: "ent_132", maturity: "stable", since: "0.1.0" },
542
+ { name: "launch", type_id: "ent_133", maturity: "stable", since: "0.1.0" },
543
+ { name: "content_strategy", type_id: "ent_134", maturity: "stable", since: "0.1.0" },
544
+ { name: "sales_motion", type_id: "ent_135", maturity: "stable", since: "0.1.0" },
545
+ { name: "competitive_battle_card", type_id: "ent_136", maturity: "stable", since: "0.1.0" },
546
+ { name: "demand_gen_program", type_id: "ent_137", maturity: "stable", since: "0.1.0" },
547
+ { name: "territory", type_id: "ent_138", maturity: "stable", since: "0.1.0" },
548
+ { name: "objection", type_id: "ent_139", maturity: "stable", since: "0.1.0" },
549
+ { name: "rebuttal", type_id: "ent_140", maturity: "stable", since: "0.1.0" },
550
+ { name: "proof_point", type_id: "ent_141", maturity: "stable", since: "0.1.0" },
551
+ // ── Team & Organisation ──
552
+ { name: "team", type_id: "ent_142", maturity: "stable", since: "0.1.0", portfolio_shared: true },
553
+ { name: "role", type_id: "ent_143", maturity: "stable", since: "0.1.0" },
554
+ { name: "stakeholder", type_id: "ent_144", maturity: "stable", since: "0.1.0" },
555
+ { name: "person", type_id: "ent_349", maturity: "stable", since: "0.5.0" },
556
+ { name: "product_decision", type_id: "ent_145", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "decision" },
557
+ { name: "team_okr", type_id: "ent_146", maturity: "stable", since: "0.1.0" },
558
+ { name: "retrospective", type_id: "ent_147", maturity: "stable", since: "0.1.0" },
559
+ { name: "dependency", type_id: "ent_148", maturity: "stable", since: "0.1.0", portfolio_shared: true },
560
+ { name: "department", type_id: "ent_149", maturity: "stable", since: "0.1.0", portfolio_shared: true },
561
+ { name: "skill", type_id: "ent_150", maturity: "stable", since: "0.1.0" },
562
+ { name: "ceremony", type_id: "ent_151", maturity: "stable", since: "0.1.0" },
563
+ { name: "capacity_plan", type_id: "ent_152", maturity: "stable", since: "0.1.0" },
564
+ // ── Data & Analytics ──
565
+ { name: "data_source", type_id: "ent_153", maturity: "stable", since: "0.1.0" },
566
+ { name: "metric_definition", type_id: "ent_154", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "metric" },
567
+ { name: "event_schema", type_id: "ent_155", maturity: "stable", since: "0.1.0" },
568
+ { name: "dashboard", type_id: "ent_156", maturity: "stable", since: "0.1.0" },
569
+ { name: "ab_test", type_id: "ent_157", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "experiment" },
570
+ { name: "data_model", type_id: "ent_158", maturity: "stable", since: "0.1.0" },
571
+ { name: "data_quality_rule", type_id: "ent_159", maturity: "stable", since: "0.1.0" },
572
+ { name: "data_product", type_id: "ent_160", maturity: "stable", since: "0.1.0" },
573
+ { name: "data_pipeline", type_id: "ent_161", maturity: "stable", since: "0.1.0" },
574
+ { name: "data_lineage", type_id: "ent_162", maturity: "stable", since: "0.1.0" },
575
+ { name: "glossary_term", type_id: "ent_163", maturity: "stable", since: "0.1.0" },
576
+ { name: "data_domain", type_id: "ent_164", maturity: "stable", since: "0.1.0" },
577
+ { name: "report", type_id: "ent_165", maturity: "stable", since: "0.1.0" },
578
+ // ── Content & Knowledge ──
579
+ { name: "content_piece", type_id: "ent_166", maturity: "stable", since: "0.1.0" },
580
+ { name: "knowledge_base_article", type_id: "ent_167", maturity: "stable", since: "0.1.0" },
581
+ { name: "brand_asset", type_id: "ent_168", maturity: "stable", since: "0.1.0" },
582
+ { name: "internal_doc", type_id: "ent_169", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "document" },
583
+ { name: "prompt_template", type_id: "ent_170", maturity: "stable", since: "0.1.0" },
584
+ { name: "content_calendar", type_id: "ent_171", maturity: "stable", since: "0.1.0" },
585
+ { name: "content_theme", type_id: "ent_172", maturity: "stable", since: "0.1.0" },
586
+ { name: "documentation_template", type_id: "ent_173", maturity: "stable", since: "0.1.0" },
587
+ { name: "document", type_id: "ent_320", maturity: "stable", since: "0.2.0" },
588
+ // ── Legal & Compliance ──
589
+ { name: "compliance_requirement", type_id: "ent_174", maturity: "stable", since: "0.1.0" },
590
+ { name: "risk", type_id: "ent_175", maturity: "stable", since: "0.1.0" },
591
+ { name: "data_contract", type_id: "ent_176", maturity: "stable", since: "0.1.0" },
592
+ { name: "legal_entity", type_id: "ent_177", maturity: "stable", since: "0.1.0" },
593
+ { name: "ip_asset", type_id: "ent_178", maturity: "stable", since: "0.1.0" },
594
+ { name: "audit_log_policy", type_id: "ent_179", maturity: "stable", since: "0.1.0" },
595
+ { name: "contract", type_id: "ent_180", maturity: "stable", since: "0.1.0" },
596
+ { name: "contract_clause", type_id: "ent_181", maturity: "stable", since: "0.1.0" },
597
+ { name: "privacy_policy", type_id: "ent_182", maturity: "stable", since: "0.1.0" },
598
+ { name: "compliance_framework", type_id: "ent_183", maturity: "stable", since: "0.1.0" },
599
+ { name: "security_audit", type_id: "ent_184", maturity: "stable", since: "0.1.0" },
600
+ // ── DevOps & Platform ──
601
+ { name: "service_level_indicator", type_id: "ent_185", maturity: "stable", since: "0.1.0" },
602
+ { name: "sli", type_id: "ent_334", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "service_level_indicator" },
603
+ { name: "service_level_objective", type_id: "ent_186", maturity: "stable", since: "0.1.0" },
604
+ { name: "slo", type_id: "ent_335", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "service_level_objective" },
605
+ { name: "error_budget", type_id: "ent_187", maturity: "stable", since: "0.1.0" },
606
+ { name: "incident", type_id: "ent_188", maturity: "stable", since: "0.1.0" },
607
+ { name: "postmortem", type_id: "ent_189", maturity: "stable", since: "0.1.0" },
608
+ { name: "runbook", type_id: "ent_190", maturity: "stable", since: "0.1.0" },
609
+ { name: "monitor", type_id: "ent_191", maturity: "stable", since: "0.1.0" },
610
+ { name: "alert_rule", type_id: "ent_192", maturity: "stable", since: "0.1.0" },
611
+ { name: "ci_pipeline", type_id: "ent_193", maturity: "stable", since: "0.1.0" },
612
+ { name: "release_strategy", type_id: "ent_194", maturity: "stable", since: "0.1.0" },
613
+ { name: "on_call_rotation", type_id: "ent_195", maturity: "stable", since: "0.1.0" },
614
+ { name: "infrastructure_component", type_id: "ent_196", maturity: "stable", since: "0.1.0" },
615
+ // ── Security ──
616
+ { name: "threat_model", type_id: "ent_197", maturity: "stable", since: "0.1.0" },
617
+ { name: "threat", type_id: "ent_198", maturity: "stable", since: "0.1.0" },
618
+ { name: "vulnerability", type_id: "ent_199", maturity: "stable", since: "0.1.0" },
619
+ { name: "security_control", type_id: "ent_200", maturity: "stable", since: "0.1.0" },
620
+ { name: "security_policy", type_id: "ent_201", maturity: "stable", since: "0.1.0" },
621
+ { name: "security_incident", type_id: "ent_202", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "incident" },
622
+ { name: "penetration_test", type_id: "ent_203", maturity: "stable", since: "0.1.0" },
623
+ { name: "security_review", type_id: "ent_204", maturity: "stable", since: "0.1.0" },
624
+ { name: "data_classification", type_id: "ent_205", maturity: "stable", since: "0.1.0" },
625
+ { name: "access_policy", type_id: "ent_206", maturity: "stable", since: "0.1.0" },
626
+ // ── Accessibility ──
627
+ { name: "a11y_standard", type_id: "ent_207", maturity: "stable", since: "0.1.0" },
628
+ { name: "a11y_guideline", type_id: "ent_208", maturity: "stable", since: "0.1.0" },
629
+ { name: "a11y_audit", type_id: "ent_209", maturity: "stable", since: "0.1.0" },
630
+ { name: "a11y_issue", type_id: "ent_210", maturity: "stable", since: "0.1.0" },
631
+ { name: "a11y_annotation", type_id: "ent_211", maturity: "stable", since: "0.1.0" },
632
+ // ── QA & Testing ──
633
+ { name: "test_suite", type_id: "ent_212", maturity: "stable", since: "0.1.0" },
634
+ { name: "test_case", type_id: "ent_213", maturity: "stable", since: "0.1.0" },
635
+ { name: "qa_session", type_id: "ent_214", maturity: "stable", since: "0.1.0" },
636
+ { name: "regression_test", type_id: "ent_215", maturity: "stable", since: "0.1.0" },
637
+ { name: "test_coverage_report", type_id: "ent_216", maturity: "stable", since: "0.1.0" },
638
+ { name: "test_environment", type_id: "ent_217", maturity: "stable", since: "0.1.0" },
639
+ { name: "defect_report", type_id: "ent_218", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "support_ticket" },
640
+ { name: "test_result", type_id: "ent_327", maturity: "proposed", since: "0.2.0" },
641
+ // ── Feedback & Voice of Customer ──
642
+ { name: "feedback_program", type_id: "ent_219", maturity: "stable", since: "0.1.0" },
643
+ { name: "feature_request", type_id: "ent_220", maturity: "stable", since: "0.1.0" },
644
+ { name: "feedback_vote", type_id: "ent_221", maturity: "stable", since: "0.1.0" },
645
+ { name: "nps_campaign", type_id: "ent_222", maturity: "stable", since: "0.1.0" },
646
+ { name: "user_advisory_board", type_id: "ent_223", maturity: "stable", since: "0.1.0" },
647
+ { name: "beta_program", type_id: "ent_224", maturity: "stable", since: "0.1.0" },
648
+ { name: "feedback_theme", type_id: "ent_225", maturity: "stable", since: "0.1.0" },
649
+ // ── Pricing & Packaging ──
650
+ { name: "pricing_strategy", type_id: "ent_226", maturity: "stable", since: "0.1.0" },
651
+ { name: "pricing_experiment", type_id: "ent_227", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "experiment" },
652
+ { name: "package", type_id: "ent_228", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "pricing_tier" },
653
+ { name: "discount_strategy", type_id: "ent_229", maturity: "stable", since: "0.1.0" },
654
+ { name: "trial_config", type_id: "ent_230", maturity: "stable", since: "0.1.0" },
655
+ { name: "paywall", type_id: "ent_231", maturity: "stable", since: "0.1.0" },
656
+ // ── AI/ML Operations ──
657
+ { name: "ai_model", type_id: "ent_232", maturity: "stable", since: "0.1.0" },
658
+ { name: "prompt_version", type_id: "ent_233", maturity: "stable", since: "0.1.0" },
659
+ { name: "eval_benchmark", type_id: "ent_234", maturity: "stable", since: "0.1.0" },
660
+ { name: "eval_run", type_id: "ent_235", maturity: "stable", since: "0.1.0" },
661
+ { name: "ai_cost_tracker", type_id: "ent_236", maturity: "stable", since: "0.1.0" },
662
+ { name: "hallucination_report", type_id: "ent_237", maturity: "stable", since: "0.1.0" },
663
+ { name: "ai_guardrail", type_id: "ent_238", maturity: "stable", since: "0.1.0" },
664
+ { name: "model_comparison", type_id: "ent_239", maturity: "stable", since: "0.1.0" },
665
+ { name: "ai_experiment", type_id: "ent_323", maturity: "proposed", since: "0.2.0" },
666
+ { name: "ai_dataset", type_id: "ent_324", maturity: "proposed", since: "0.2.0" },
667
+ { name: "ai_trace", type_id: "ent_325", maturity: "proposed", since: "0.2.0" },
668
+ // ── Agentic Workflows ──
669
+ { name: "workflow_template", type_id: "ent_240", maturity: "stable", since: "0.1.0" },
670
+ { name: "workflow_run", type_id: "ent_241", maturity: "stable", since: "0.1.0" },
671
+ { name: "agent_definition", type_id: "ent_242", maturity: "stable", since: "0.1.0" },
672
+ { name: "agent_session", type_id: "ent_243", maturity: "stable", since: "0.1.0" },
673
+ { name: "review_gate", type_id: "ent_244", maturity: "stable", since: "0.1.0" },
674
+ { name: "approval_record", type_id: "ent_245", maturity: "stable", since: "0.1.0" },
675
+ { name: "agent_skill", type_id: "ent_246", maturity: "stable", since: "0.1.0" },
676
+ { name: "agent_hook", type_id: "ent_247", maturity: "stable", since: "0.1.0" },
677
+ { name: "workflow_artifact", type_id: "ent_248", maturity: "stable", since: "0.1.0" },
678
+ { name: "agent_task", type_id: "ent_326", maturity: "proposed", since: "0.2.0" },
679
+ // ── Portfolio ──
680
+ { name: "organization", type_id: "ent_249", maturity: "stable", since: "0.1.0" },
681
+ { name: "portfolio", type_id: "ent_250", maturity: "stable", since: "0.1.0" },
682
+ { name: "product_area", type_id: "ent_251", maturity: "stable", since: "0.1.0" },
683
+ // ── Sales & Revenue ──
684
+ { name: "account", type_id: "ent_252", maturity: "stable", since: "0.1.0" },
685
+ { name: "contact", type_id: "ent_253", maturity: "stable", since: "0.1.0" },
686
+ { name: "lead", type_id: "ent_254", maturity: "stable", since: "0.1.0" },
687
+ { name: "deal", type_id: "ent_255", maturity: "stable", since: "0.1.0" },
688
+ { name: "pipeline_sales", type_id: "ent_256", maturity: "stable", since: "0.1.0" },
689
+ { name: "pipeline_stage", type_id: "ent_257", maturity: "stable", since: "0.1.0" },
690
+ { name: "quote_document", type_id: "ent_258", maturity: "stable", since: "0.1.0" },
691
+ { name: "subscription", type_id: "ent_259", maturity: "stable", since: "0.1.0" },
692
+ { name: "invoice", type_id: "ent_260", maturity: "stable", since: "0.1.0" },
693
+ { name: "forecast", type_id: "ent_261", maturity: "stable", since: "0.1.0" },
694
+ // ── Program Management ──
695
+ { name: "program", type_id: "ent_262", maturity: "stable", since: "0.1.0" },
696
+ { name: "project", type_id: "ent_263", maturity: "stable", since: "0.1.0" },
697
+ // `portfolio_shared` (0.25.1 feedback): a milestone is often a cross-team gate,
698
+ // not one project's checkpoint — an org-wide "Open Beta" that several products'
699
+ // projects must all satisfy. Shared tier lets `project_targets_milestone` (and
700
+ // the other milestone edges) pass the cross-scope gate as `provisional`, same
701
+ // as `project_implements_initiative`. Precedent: `planning_cycle` (0.20.0).
702
+ { name: "milestone", type_id: "ent_264", maturity: "stable", since: "0.1.0", portfolio_shared: true },
703
+ { name: "risk_register", type_id: "ent_265", maturity: "stable", since: "0.1.0" },
704
+ { name: "risk_item", type_id: "ent_266", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "risk" },
705
+ { name: "change_request", type_id: "ent_267", maturity: "stable", since: "0.1.0" },
706
+ { name: "deliverable", type_id: "ent_268", maturity: "stable", since: "0.1.0" },
707
+ { name: "resource_allocation", type_id: "ent_269", maturity: "stable", since: "0.1.0" },
708
+ { name: "status_report", type_id: "ent_270", maturity: "stable", since: "0.1.0" },
709
+ // ── Marketing Operations ──
710
+ { name: "marketing_strategy", type_id: "ent_271", maturity: "stable", since: "0.1.0" },
711
+ { name: "marketing_channel", type_id: "ent_272", maturity: "stable", since: "0.1.0" },
712
+ { name: "marketing_campaign_plan", type_id: "ent_273", maturity: "stable", since: "0.1.0" },
713
+ { name: "email_sequence", type_id: "ent_274", maturity: "stable", since: "0.1.0" },
714
+ { name: "social_post", type_id: "ent_275", maturity: "stable", since: "0.1.0" },
715
+ { name: "seo_keyword", type_id: "ent_276", maturity: "stable", since: "0.1.0" },
716
+ { name: "ad_creative", type_id: "ent_277", maturity: "stable", since: "0.1.0" },
717
+ { name: "press_release", type_id: "ent_278", maturity: "stable", since: "0.1.0" },
718
+ { name: "event", type_id: "ent_279", maturity: "stable", since: "0.1.0" },
719
+ { name: "community_initiative", type_id: "ent_280", maturity: "stable", since: "0.1.0" },
720
+ // ── Operations & Customer Success ──
721
+ { name: "support_ticket", type_id: "ent_281", maturity: "stable", since: "0.1.0" },
722
+ { name: "customer_feedback", type_id: "ent_282", maturity: "stable", since: "0.1.0" },
723
+ { name: "churn_reason", type_id: "ent_283", maturity: "stable", since: "0.1.0" },
724
+ { name: "onboarding_flow", type_id: "ent_284", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "user_flow" },
725
+ { name: "customer_health_score", type_id: "ent_285", maturity: "stable", since: "0.1.0" },
726
+ { name: "playbook", type_id: "ent_286", maturity: "stable", since: "0.1.0" },
727
+ { name: "service_level_agreement", type_id: "ent_287", maturity: "stable", since: "0.1.0" },
728
+ { name: "sla", type_id: "ent_336", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "service_level_agreement" },
729
+ { name: "customer_journey_stage", type_id: "ent_288", maturity: "stable", since: "0.1.0" },
730
+ { name: "touchpoint", type_id: "ent_289", maturity: "stable", since: "0.1.0" },
731
+ { name: "success_milestone", type_id: "ent_290", maturity: "stable", since: "0.1.0" },
732
+ { name: "service_blueprint", type_id: "ent_291", maturity: "stable", since: "0.1.0" },
733
+ { name: "nps_score", type_id: "ent_292", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "nps_campaign" },
734
+ // ── Localisation & i18n ──
735
+ { name: "locale", type_id: "ent_293", maturity: "stable", since: "0.1.0" },
736
+ { name: "translation_key", type_id: "ent_294", maturity: "stable", since: "0.1.0" },
737
+ { name: "translation_bundle", type_id: "ent_295", maturity: "stable", since: "0.1.0" },
738
+ { name: "locale_config", type_id: "ent_296", maturity: "stable", since: "0.1.0" },
739
+ { name: "cultural_adaptation", type_id: "ent_297", maturity: "stable", since: "0.1.0" },
740
+ { name: "regional_pricing", type_id: "ent_298", maturity: "stable", since: "0.1.0" },
741
+ // ── Customer Education ──
742
+ { name: "education_program", type_id: "ent_299", maturity: "stable", since: "0.1.0" },
743
+ { name: "tutorial", type_id: "ent_300", maturity: "stable", since: "0.1.0" },
744
+ { name: "walkthrough", type_id: "ent_301", maturity: "stable", since: "0.1.0" },
745
+ { name: "webinar", type_id: "ent_302", maturity: "stable", since: "0.1.0" },
746
+ { name: "certification", type_id: "ent_303", maturity: "stable", since: "0.1.0" },
747
+ { name: "help_video", type_id: "ent_304", maturity: "stable", since: "0.1.0" },
748
+ { name: "learning_path", type_id: "ent_305", maturity: "stable", since: "0.1.0" },
749
+ // ── Partners & Ecosystem ──
750
+ { name: "partner_program", type_id: "ent_306", maturity: "stable", since: "0.1.0" },
751
+ { name: "partner_tier", type_id: "ent_307", maturity: "stable", since: "0.1.0" },
752
+ { name: "api_ecosystem", type_id: "ent_308", maturity: "stable", since: "0.1.0" },
753
+ { name: "marketplace_listing", type_id: "ent_309", maturity: "stable", since: "0.1.0" },
754
+ { name: "developer_portal", type_id: "ent_310", maturity: "stable", since: "0.1.0" },
755
+ { name: "integration_partner", type_id: "ent_311", maturity: "stable", since: "0.1.0" },
756
+ { name: "partner_revenue_share", type_id: "ent_312", maturity: "stable", since: "0.1.0" },
757
+ // ── Workspace ──
758
+ { name: "workspace", type_id: "ent_328", maturity: "proposed", since: "0.2.0" },
759
+ { name: "framework_exercise", type_id: "ent_350", maturity: "proposed", since: "0.8.4" },
760
+ { name: "composition", type_id: "ent_361", maturity: "proposed", since: "0.31.0" },
761
+ // A dated, hashed rendition of a node that is already in the graph. Enters
762
+ // `proposed` per the maturity rubric (precedent: composition 0.31.0).
763
+ { name: "capture", type_id: "ent_362", maturity: "proposed", since: "0.32.0" }
764
+ ];
765
+ var DEFERRED_PROPOSED_BY_CONTRACT = {
766
+ // user_story (UPG-571) and experiment_run (UPG-664) graduated to stable in
767
+ // 0.12.6 — Captain lifted both freezes ("we are using them"). Their contracts
768
+ // are settled; they are now stable, not deferred.
769
+ ai_experiment: "UPG-665: AI prompt/model restructure (open ADR).",
770
+ ai_dataset: "UPG-665: AI prompt/model restructure (open ADR).",
771
+ ai_trace: "UPG-665: AI prompt/model restructure (open ADR)."
772
+ };
773
+ var UPG_ENTITY_META_BY_NAME = new Map(
774
+ UPG_ENTITY_META.map((m) => [m.name, m])
775
+ );
776
+ var UPG_ENTITY_META_BY_ID = new Map(
777
+ UPG_ENTITY_META.map((m) => [m.type_id, m])
778
+ );
779
+ var UPG_ACTIVE_TYPES = UPG_ENTITY_META.filter((m) => m.maturity === "stable" || m.maturity === "proposed").map((m) => m.name);
780
+ var UPG_DEPRECATED_TYPES = UPG_ENTITY_META.filter((m) => m.maturity === "deprecated").map((m) => m.name);
781
+ var UPG_PORTFOLIO_SHARED_TYPES = UPG_ENTITY_META.filter((m) => m.portfolio_shared === true).map((m) => m.name);
782
+ function isPortfolioSharedType(name) {
783
+ return UPG_ENTITY_META_BY_NAME.get(name)?.portfolio_shared === true;
784
+ }
785
+ function isDeprecatedType(name) {
786
+ const meta = UPG_ENTITY_META_BY_NAME.get(name);
787
+ return meta?.maturity === "deprecated";
788
+ }
789
+ function getReplacementType(name) {
790
+ const meta = UPG_ENTITY_META_BY_NAME.get(name);
791
+ return meta?.replacement;
792
+ }
793
+ function getTypeId(name) {
794
+ return UPG_ENTITY_META_BY_NAME.get(name)?.type_id;
795
+ }
796
+ function getTypeName(typeId) {
797
+ return UPG_ENTITY_META_BY_ID.get(typeId)?.name;
798
+ }
799
+
296
800
  // src/registry/domains.ts
297
801
  var UPG_DOMAINS = [
298
802
  {
@@ -804,516 +1308,23 @@ function getTypes() {
804
1308
  return UPG_DOMAINS.flatMap((d) => [...d.types]);
805
1309
  }
806
1310
  function getDomainForType(entityType) {
807
- return UPG_DOMAINS.find((d) => d.types.includes(entityType));
1311
+ const direct = UPG_DOMAINS.find((d) => d.types.includes(entityType));
1312
+ if (direct) return direct;
1313
+ let name = entityType;
1314
+ for (let hop = 0; hop < 3; hop++) {
1315
+ if (!isDeprecatedType(name)) return void 0;
1316
+ const replacement = getReplacementType(name);
1317
+ if (!replacement) return void 0;
1318
+ const viaReplacement = UPG_DOMAINS.find((d) => d.types.includes(replacement));
1319
+ if (viaReplacement) return viaReplacement;
1320
+ name = replacement;
1321
+ }
1322
+ return void 0;
808
1323
  }
809
1324
  function getDomainIdForType(entityType) {
810
1325
  return UPG_ENTITY_TO_DOMAIN[entityType];
811
1326
  }
812
1327
 
813
- // src/registry/entity-meta.ts
814
- var UPG_ENTITY_META = [
815
- // Foundations (0.9.12): shared specifications + the primitives they define.
816
- { name: "specification", type_id: "ent_352", maturity: "proposed", since: "0.9.12", portfolio_shared: true },
817
- { name: "primitive", type_id: "ent_353", maturity: "proposed", since: "0.9.12", portfolio_shared: true },
818
- { name: "operating_lifecycle", type_id: "ent_355", maturity: "proposed", since: "0.11.6", portfolio_shared: true },
819
- { name: "operating_stage", type_id: "ent_356", maturity: "proposed", since: "0.11.6", portfolio_shared: true },
820
- // ── Strategic ──
821
- { name: "product", type_id: "ent_001", maturity: "stable", since: "0.1.0" },
822
- { name: "outcome", type_id: "ent_002", maturity: "stable", since: "0.1.0", portfolio_shared: true },
823
- { name: "kpi", type_id: "ent_003", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "metric" },
824
- { name: "objective", type_id: "ent_004", maturity: "stable", since: "0.1.0", portfolio_shared: true },
825
- { name: "key_result", type_id: "ent_005", maturity: "stable", since: "0.1.0", portfolio_shared: true },
826
- { name: "metric", type_id: "ent_006", maturity: "stable", since: "0.1.0", portfolio_shared: true },
827
- // F7 (UPG-673): graduated proposed → stable at v0.9.x — proposed since 0.2.2,
828
- // the metric-quality assessment artefact is settled with no open restructure.
829
- { name: "metric_quality_assessment", type_id: "ent_339", maturity: "stable", since: "0.2.2" },
830
- { name: "vision", type_id: "ent_007", maturity: "stable", since: "0.1.0", portfolio_shared: true },
831
- { name: "mission", type_id: "ent_008", maturity: "stable", since: "0.1.0", portfolio_shared: true },
832
- { name: "strategic_theme", type_id: "ent_009", maturity: "stable", since: "0.1.0", portfolio_shared: true },
833
- { name: "initiative", type_id: "ent_010", maturity: "stable", since: "0.1.0", portfolio_shared: true },
834
- { name: "capability", type_id: "ent_011", maturity: "stable", since: "0.1.0", portfolio_shared: true },
835
- { name: "value_stream", type_id: "ent_012", maturity: "stable", since: "0.1.0" },
836
- { name: "strategic_pillar", type_id: "ent_013", maturity: "stable", since: "0.1.0", portfolio_shared: true },
837
- { name: "assumption", type_id: "ent_014", maturity: "stable", since: "0.1.0" },
838
- { name: "decision", type_id: "ent_015", maturity: "stable", since: "0.1.0" },
839
- { name: "constraint", type_id: "ent_348", maturity: "stable", since: "0.4.3" },
840
- // (0.17.4) Strategy-domain sibling of research_question / design_question,
841
- // completing the domain-question triad. An open coordination/ownership question
842
- // a plan is exposed to (distinct from `assumption`, which the plan is built on).
843
- { name: "strategic_question", type_id: "ent_357", maturity: "proposed", since: "0.17.4" },
844
- // ── User ──
845
- { name: "persona", type_id: "ent_016", maturity: "stable", since: "0.1.0" },
846
- { name: "job", type_id: "ent_017", maturity: "stable", since: "0.1.0" },
847
- { name: "jtbd", type_id: "ent_332", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "job" },
848
- { name: "pain_point", type_id: "ent_018", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "need" },
849
- { name: "desired_outcome", type_id: "ent_019", maturity: "stable", since: "0.1.0" },
850
- { name: "job_step", type_id: "ent_020", maturity: "stable", since: "0.1.0" },
851
- { name: "user_need", type_id: "ent_021", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "need" },
852
- { name: "need", type_id: "ent_313", maturity: "stable", since: "0.1.0" },
853
- { name: "switching_cost", type_id: "ent_022", maturity: "stable", since: "0.1.0" },
854
- // ── Discovery ──
855
- { name: "opportunity", type_id: "ent_023", maturity: "stable", since: "0.1.0", default_frameworks: ["opportunity-sizing", "rice-scoring"] },
856
- { name: "solution", type_id: "ent_024", maturity: "stable", since: "0.1.0", default_frameworks: ["rice-scoring"] },
857
- { name: "feasibility_study", type_id: "ent_025", maturity: "stable", since: "0.1.0" },
858
- { name: "design_sprint", type_id: "ent_026", maturity: "stable", since: "0.1.0" },
859
- // ── Validation ──
860
- // (since v0.4.0) `hypothesis` re-promoted to canonical-stable. The
861
- // v0.2.8 rename to `hypothesis_claim` was over-split: "claim" is implied
862
- // by being a hypothesis. Canonical name reverts; HypothesisClaimProperties
863
- // renamed to HypothesisProperties. `hypothesis_claim` is now deprecated
864
- // (→ `hypothesis`). `hypothesis_evidence` deprecated (→ `evidence`): the
865
- // dual evidence_type enum smell resolved by enriching canonical `evidence`
866
- // with evidence_rigor + evidence_source axes. Edge pattern switches to
867
- // `hypothesis_has_evidence` (neutral, direction on node).
868
- { name: "hypothesis", type_id: "ent_027", maturity: "stable", since: "0.1.0" },
869
- { name: "hypothesis_claim", type_id: "ent_344", maturity: "deprecated", since: "0.2.8", deprecated_in: "0.4.0", replacement: "hypothesis" },
870
- { name: "hypothesis_evidence", type_id: "ent_345", maturity: "deprecated", since: "0.2.8", deprecated_in: "0.4.0", replacement: "evidence" },
871
- // `experiment` is canonical (UPG-664). It has its own property schema
872
- // (method, start_date, end_date, sample_size, expected_lift) and is the
873
- // canonical unit of a structured test. The validation flow is
874
- // `hypothesis → experiment_plan → experiment → experiment_run`: the plan is
875
- // the validation design, the experiment is the structured test, the run is
876
- // the optional multi-run/replication child.
877
- { name: "experiment", type_id: "ent_028", maturity: "stable", since: "0.1.0" },
878
- // experiment_plan graduated proposed → stable (UPG-664). It is the canonical
879
- // validation PLAN type — it absorbed `test_plan`'s planning properties
880
- // (method / success_criteria / sample_size) when `test_plan` re-homed to the
881
- // QA/testing domain (UPG-678).
882
- { name: "experiment_plan", type_id: "ent_340", maturity: "stable", since: "0.2.6" },
883
- { name: "experiment_run", type_id: "ent_341", maturity: "stable", since: "0.2.6" },
884
- { name: "learning", type_id: "ent_029", maturity: "stable", since: "0.1.0" },
885
- // test_plan re-homed validation → testing/QA (UPG-678). It is the QA
886
- // verification-procedure plan (test scope / environments / pass criteria);
887
- // its former validation-planning role is carried by experiment_plan.
888
- { name: "test_plan", type_id: "ent_030", maturity: "stable", since: "0.1.0" },
889
- { name: "evidence", type_id: "ent_031", maturity: "stable", since: "0.1.0" },
890
- { name: "research_plan", type_id: "ent_032", maturity: "stable", since: "0.1.0" },
891
- // ── Market Intelligence ──
892
- { name: "competitor", type_id: "ent_033", maturity: "stable", since: "0.1.0", portfolio_shared: true },
893
- { name: "competitor_feature", type_id: "ent_034", maturity: "stable", since: "0.1.0", portfolio_shared: true },
894
- { name: "competitor_signal", type_id: "ent_354", maturity: "proposed", since: "0.10.0", portfolio_shared: true },
895
- { name: "market_trend", type_id: "ent_035", maturity: "stable", since: "0.1.0" },
896
- { name: "market_segment", type_id: "ent_036", maturity: "stable", since: "0.1.0", portfolio_shared: true },
897
- { name: "competitive_analysis", type_id: "ent_037", maturity: "stable", since: "0.1.0" },
898
- // Classification taxonomy hosted by competitive_analysis.
899
- // F7 (UPG-673): graduated proposed → stable at v0.9.x — two minor releases
900
- // stable since 0.4.0, the taxonomy-axis/value pair backs the competitive-
901
- // analysis classification spine with no open rename/restructure ticket.
902
- { name: "classification_axis", type_id: "ent_346", maturity: "stable", since: "0.4.0", portfolio_shared: true },
903
- { name: "classification_value", type_id: "ent_347", maturity: "stable", since: "0.4.0", portfolio_shared: true },
904
- // ── UX Research ──
905
- { name: "research_study", type_id: "ent_038", maturity: "stable", since: "0.1.0" },
906
- { name: "research_insight", type_id: "ent_039", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "insight" },
907
- { name: "insight", type_id: "ent_040", maturity: "stable", since: "0.1.0" },
908
- { name: "participant", type_id: "ent_041", maturity: "stable", since: "0.1.0" },
909
- { name: "observation", type_id: "ent_042", maturity: "stable", since: "0.1.0" },
910
- { name: "quote", type_id: "ent_043", maturity: "stable", since: "0.1.0" },
911
- { name: "affinity_cluster", type_id: "ent_044", maturity: "stable", since: "0.1.0" },
912
- { name: "research_question", type_id: "ent_045", maturity: "stable", since: "0.1.0" },
913
- { name: "interview_guide", type_id: "ent_046", maturity: "stable", since: "0.1.0" },
914
- { name: "finding", type_id: "ent_047", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "insight" },
915
- { name: "survey_response", type_id: "ent_048", maturity: "stable", since: "0.1.0" },
916
- { name: "highlight", type_id: "ent_049", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "observation" },
917
- // ── Design ──
918
- { name: "user_journey", type_id: "ent_050", maturity: "stable", since: "0.1.0" },
919
- { name: "journey_step", type_id: "ent_051", maturity: "stable", since: "0.1.0" },
920
- { name: "ux_insight", type_id: "ent_052", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "insight" },
921
- { name: "design_question", type_id: "ent_053", maturity: "stable", since: "0.1.0" },
922
- { name: "how_might_we", type_id: "ent_333", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "design_question" },
923
- { name: "design_concept", type_id: "ent_054", maturity: "stable", since: "0.1.0" },
924
- { name: "prototype", type_id: "ent_055", maturity: "stable", since: "0.1.0" },
925
- { name: "design_component", type_id: "ent_056", maturity: "stable", since: "0.1.0", portfolio_shared: true },
926
- { name: "design_token", type_id: "ent_057", maturity: "stable", since: "0.1.0" },
927
- { name: "brand_identity", type_id: "ent_058", maturity: "stable", since: "0.1.0", portfolio_shared: true },
928
- { name: "brand_colour", type_id: "ent_059", maturity: "stable", since: "0.1.0" },
929
- { name: "brand_typography", type_id: "ent_060", maturity: "stable", since: "0.1.0" },
930
- { name: "brand_voice", type_id: "ent_061", maturity: "stable", since: "0.1.0" },
931
- { name: "wireframe", type_id: "ent_062", maturity: "stable", since: "0.1.0" },
932
- { name: "design_pattern", type_id: "ent_063", maturity: "stable", since: "0.1.0" },
933
- { name: "design_guideline", type_id: "ent_064", maturity: "stable", since: "0.1.0" },
934
- { name: "annotation", type_id: "ent_065", maturity: "stable", since: "0.1.0" },
935
- { name: "interaction_spec", type_id: "ent_066", maturity: "stable", since: "0.1.0" },
936
- { name: "design_system", type_id: "ent_067", maturity: "stable", since: "0.1.0", portfolio_shared: true },
937
- { name: "user_flow", type_id: "ent_068", maturity: "stable", since: "0.1.0" },
938
- { name: "screen", type_id: "ent_069", maturity: "stable", since: "0.1.0" },
939
- { name: "screen_state", type_id: "ent_070", maturity: "stable", since: "0.1.0" },
940
- // surface (0.27.0): the place inside a screen. `screen` is route-level
941
- // (route / viewport / access_level); `surface` is the contested slot within
942
- // it, carrying its occupants and the rule that arbitrates between them.
943
- // Enters `proposed` per the maturity rubric (precedent: planning_cycle 0.20.0).
944
- { name: "surface", type_id: "ent_359", maturity: "proposed", since: "0.27.0" },
945
- { name: "configuration_axis", type_id: "ent_360", maturity: "proposed", since: "0.30.0" },
946
- { name: "journey_phase", type_id: "ent_330", maturity: "proposed", since: "0.2.0" },
947
- { name: "journey_action", type_id: "ent_331", maturity: "proposed", since: "0.2.0" },
948
- { name: "design_decision", type_id: "ent_319", maturity: "deprecated", since: "0.2.0", deprecated_in: "0.2.0", replacement: "decision" },
949
- // F7 (UPG-673): graduated proposed → stable at v0.9.x — proposed since 0.2.0,
950
- // the brand-identity set (logo + imagery) is settled with no open rename.
951
- { name: "brand_logo", type_id: "ent_321", maturity: "stable", since: "0.2.0" },
952
- { name: "brand_imagery", type_id: "ent_322", maturity: "stable", since: "0.2.0" },
953
- // ── Product Spec ──
954
- { name: "feature_area", type_id: "ent_314", maturity: "stable", since: "0.1.0" },
955
- { name: "feature", type_id: "ent_071", maturity: "stable", since: "0.1.0" },
956
- { name: "epic", type_id: "ent_072", maturity: "stable", since: "0.1.0" },
957
- // `user_story` is the templated "As X, I want Y so Z" promise: a stable,
958
- // lifecycle-free design artefact (UCS pattern P5). The v0.2.7 split EXTRACTED
959
- // the engineering work into a separate `task` (the lifecycle-bearing work-unit,
960
- // linked via `task_implements_user_story`); the split was right. But the
961
- // surviving statement half was renamed to the coined `story_statement`, which
962
- // raised the adoption barrier. "user story" is the universally-recognised
963
- // industry term for exactly this artefact. v0.7.0 (UPG-571) re-canonicalises
964
- // the statement under `user_story`; `story_statement` becomes a deprecated
965
- // alias. `story_task` (the original work half) was already collapsed into
966
- // canonical `task` at v0.4.0. So the canonical shape is: user_story (statement)
967
- // + task (work), linked by `task_implements_user_story`.
968
- //
969
- // F7 (UPG-673) — DEFERRED, deliberately kept `proposed`. The audit flagged
970
- // user_story as a stable-spine candidate, but the v0.7.0 re-canon contract
971
- // (UPG-571) freezes maturity at `proposed` until the re-canonicalised name
972
- // has soaked across a full migration window. `user-story-split.test.ts`
973
- // ("user_story is canonical again (ent_073, proposed, not deprecated)")
974
- // asserts `proposed` as the post-re-canon invariant. Graduating here would
975
- // break that contract; promotion is a separate, ticketed decision once the
976
- // story_statement → user_story migration has fully aged out.
977
- { name: "user_story", type_id: "ent_073", maturity: "stable", since: "0.1.0" },
978
- { name: "story_statement", type_id: "ent_342", maturity: "deprecated", since: "0.2.7", deprecated_in: "0.7.0", replacement: "user_story" },
979
- { name: "story_task", type_id: "ent_343", maturity: "deprecated", since: "0.2.7", deprecated_in: "0.4.0", replacement: "task" },
980
- { name: "acceptance_criterion", type_id: "ent_074", maturity: "stable", since: "0.1.0" },
981
- { name: "release", type_id: "ent_075", maturity: "stable", since: "0.1.0" },
982
- { name: "task", type_id: "ent_076", maturity: "stable", since: "0.1.0" },
983
- { name: "bug", type_id: "ent_077", maturity: "stable", since: "0.1.0" },
984
- { name: "roadmap", type_id: "ent_078", maturity: "stable", since: "0.1.0" },
985
- { name: "roadmap_item", type_id: "ent_079", maturity: "stable", since: "0.1.0" },
986
- { name: "theme", type_id: "ent_080", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.9.0", replacement: "roadmap_theme" },
987
- { name: "roadmap_theme", type_id: "ent_351", maturity: "stable", since: "0.1.0" },
988
- { name: "changelog", type_id: "ent_081", maturity: "stable", since: "0.1.0" },
989
- // (0.20.0) The cadence axis: a named, dated interval that work flows through
990
- // and which nests (a program-increment contains iterations; a cycle contains
991
- // its cooldown). One self-nesting type with a `cadence_kind` discriminator
992
- // spans sprint / iteration / quarter / PI / cooldown rather than minting a
993
- // type per methodology. `portfolio_shared` because a coarse cycle is an
994
- // org-shared interval an objective in a rollup graph and a story in a product
995
- // graph both schedule into.
996
- { name: "planning_cycle", type_id: "ent_358", maturity: "proposed", since: "0.20.0", portfolio_shared: true },
997
- // ── Engineering ──
998
- { name: "bounded_context", type_id: "ent_082", maturity: "stable", since: "0.1.0" },
999
- { name: "service", type_id: "ent_083", maturity: "stable", since: "0.1.0" },
1000
- { name: "domain_event", type_id: "ent_084", maturity: "stable", since: "0.1.0" },
1001
- { name: "api_contract", type_id: "ent_085", maturity: "stable", since: "0.1.0" },
1002
- { name: "architecture_decision", type_id: "ent_086", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "decision" },
1003
- { name: "technical_debt_item", type_id: "ent_087", maturity: "stable", since: "0.1.0" },
1004
- { name: "feature_flag", type_id: "ent_088", maturity: "stable", since: "0.1.0" },
1005
- { name: "deployment", type_id: "ent_089", maturity: "stable", since: "0.1.0" },
1006
- { name: "aggregate", type_id: "ent_090", maturity: "stable", since: "0.1.0" },
1007
- { name: "domain_entity", type_id: "ent_091", maturity: "stable", since: "0.1.0" },
1008
- { name: "value_object", type_id: "ent_092", maturity: "stable", since: "0.1.0" },
1009
- { name: "command", type_id: "ent_093", maturity: "stable", since: "0.1.0" },
1010
- { name: "read_model", type_id: "ent_094", maturity: "stable", since: "0.1.0" },
1011
- { name: "api_endpoint", type_id: "ent_095", maturity: "stable", since: "0.1.0" },
1012
- { name: "database_schema", type_id: "ent_096", maturity: "stable", since: "0.1.0" },
1013
- { name: "queue_topic", type_id: "ent_097", maturity: "stable", since: "0.1.0" },
1014
- { name: "build_artifact", type_id: "ent_098", maturity: "stable", since: "0.1.0" },
1015
- { name: "code_repository", type_id: "ent_099", maturity: "stable", since: "0.1.0" },
1016
- { name: "library_dependency", type_id: "ent_100", maturity: "stable", since: "0.1.0" },
1017
- { name: "integration_pattern", type_id: "ent_101", maturity: "stable", since: "0.1.0" },
1018
- { name: "external_api", type_id: "ent_102", maturity: "stable", since: "0.1.0" },
1019
- { name: "data_flow", type_id: "ent_103", maturity: "stable", since: "0.1.0" },
1020
- { name: "investigation", type_id: "ent_315", maturity: "stable", since: "0.2.0" },
1021
- { name: "root_cause", type_id: "ent_316", maturity: "stable", since: "0.2.0" },
1022
- { name: "symptom", type_id: "ent_317", maturity: "stable", since: "0.2.0" },
1023
- { name: "fix", type_id: "ent_318", maturity: "stable", since: "0.2.0" },
1024
- // ── Growth ──
1025
- { name: "north_star_metric", type_id: "ent_104", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "metric" },
1026
- { name: "input_metric", type_id: "ent_105", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "metric" },
1027
- { name: "funnel", type_id: "ent_106", maturity: "stable", since: "0.1.0" },
1028
- { name: "funnel_step", type_id: "ent_107", maturity: "stable", since: "0.1.0" },
1029
- { name: "acquisition_channel", type_id: "ent_108", maturity: "stable", since: "0.1.0" },
1030
- { name: "growth_campaign", type_id: "ent_109", maturity: "stable", since: "0.1.0" },
1031
- { name: "campaign", type_id: "ent_337", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "growth_campaign" },
1032
- { name: "cohort", type_id: "ent_110", maturity: "stable", since: "0.1.0" },
1033
- { name: "behavioral_segment", type_id: "ent_111", maturity: "stable", since: "0.1.0" },
1034
- { name: "segment", type_id: "ent_338", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "behavioral_segment" },
1035
- { name: "growth_loop", type_id: "ent_112", maturity: "stable", since: "0.1.0" },
1036
- { name: "growth_experiment", type_id: "ent_113", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "experiment" },
1037
- { name: "variant", type_id: "ent_114", maturity: "stable", since: "0.1.0" },
1038
- { name: "attribution_model", type_id: "ent_115", maturity: "stable", since: "0.1.0" },
1039
- // ── Business Model ──
1040
- { name: "business_model", type_id: "ent_116", maturity: "stable", since: "0.1.0" },
1041
- { name: "value_proposition", type_id: "ent_117", maturity: "stable", since: "0.1.0" },
1042
- { name: "revenue_stream", type_id: "ent_118", maturity: "stable", since: "0.1.0" },
1043
- { name: "pricing_tier", type_id: "ent_119", maturity: "stable", since: "0.1.0" },
1044
- { name: "cost_structure", type_id: "ent_120", maturity: "stable", since: "0.1.0" },
1045
- { name: "unit_economics", type_id: "ent_121", maturity: "stable", since: "0.1.0" },
1046
- { name: "partnership", type_id: "ent_122", maturity: "stable", since: "0.1.0" },
1047
- { name: "key_resource", type_id: "ent_123", maturity: "stable", since: "0.1.0" },
1048
- { name: "key_activity", type_id: "ent_124", maturity: "stable", since: "0.1.0" },
1049
- { name: "customer_segment_bm", type_id: "ent_125", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "market_segment" },
1050
- { name: "channel_bm", type_id: "ent_126", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "distribution_channel" },
1051
- { name: "target_customer_segment", type_id: "ent_329", maturity: "deprecated", since: "0.2.0", deprecated_in: "0.2.0", replacement: "market_segment" },
1052
- { name: "customer_relationship", type_id: "ent_127", maturity: "stable", since: "0.1.0" },
1053
- { name: "distribution_channel", type_id: "ent_128", maturity: "stable", since: "0.1.0" },
1054
- // ── Go-To-Market ──
1055
- { name: "gtm_strategy", type_id: "ent_129", maturity: "stable", since: "0.1.0" },
1056
- { name: "ideal_customer_profile", type_id: "ent_130", maturity: "stable", since: "0.1.0" },
1057
- { name: "positioning", type_id: "ent_131", maturity: "stable", since: "0.1.0" },
1058
- { name: "messaging", type_id: "ent_132", maturity: "stable", since: "0.1.0" },
1059
- { name: "launch", type_id: "ent_133", maturity: "stable", since: "0.1.0" },
1060
- { name: "content_strategy", type_id: "ent_134", maturity: "stable", since: "0.1.0" },
1061
- { name: "sales_motion", type_id: "ent_135", maturity: "stable", since: "0.1.0" },
1062
- { name: "competitive_battle_card", type_id: "ent_136", maturity: "stable", since: "0.1.0" },
1063
- { name: "demand_gen_program", type_id: "ent_137", maturity: "stable", since: "0.1.0" },
1064
- { name: "territory", type_id: "ent_138", maturity: "stable", since: "0.1.0" },
1065
- { name: "objection", type_id: "ent_139", maturity: "stable", since: "0.1.0" },
1066
- { name: "rebuttal", type_id: "ent_140", maturity: "stable", since: "0.1.0" },
1067
- { name: "proof_point", type_id: "ent_141", maturity: "stable", since: "0.1.0" },
1068
- // ── Team & Organisation ──
1069
- { name: "team", type_id: "ent_142", maturity: "stable", since: "0.1.0", portfolio_shared: true },
1070
- { name: "role", type_id: "ent_143", maturity: "stable", since: "0.1.0" },
1071
- { name: "stakeholder", type_id: "ent_144", maturity: "stable", since: "0.1.0" },
1072
- { name: "person", type_id: "ent_349", maturity: "stable", since: "0.5.0" },
1073
- { name: "product_decision", type_id: "ent_145", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "decision" },
1074
- { name: "team_okr", type_id: "ent_146", maturity: "stable", since: "0.1.0" },
1075
- { name: "retrospective", type_id: "ent_147", maturity: "stable", since: "0.1.0" },
1076
- { name: "dependency", type_id: "ent_148", maturity: "stable", since: "0.1.0", portfolio_shared: true },
1077
- { name: "department", type_id: "ent_149", maturity: "stable", since: "0.1.0", portfolio_shared: true },
1078
- { name: "skill", type_id: "ent_150", maturity: "stable", since: "0.1.0" },
1079
- { name: "ceremony", type_id: "ent_151", maturity: "stable", since: "0.1.0" },
1080
- { name: "capacity_plan", type_id: "ent_152", maturity: "stable", since: "0.1.0" },
1081
- // ── Data & Analytics ──
1082
- { name: "data_source", type_id: "ent_153", maturity: "stable", since: "0.1.0" },
1083
- { name: "metric_definition", type_id: "ent_154", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "metric" },
1084
- { name: "event_schema", type_id: "ent_155", maturity: "stable", since: "0.1.0" },
1085
- { name: "dashboard", type_id: "ent_156", maturity: "stable", since: "0.1.0" },
1086
- { name: "ab_test", type_id: "ent_157", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "experiment" },
1087
- { name: "data_model", type_id: "ent_158", maturity: "stable", since: "0.1.0" },
1088
- { name: "data_quality_rule", type_id: "ent_159", maturity: "stable", since: "0.1.0" },
1089
- { name: "data_product", type_id: "ent_160", maturity: "stable", since: "0.1.0" },
1090
- { name: "data_pipeline", type_id: "ent_161", maturity: "stable", since: "0.1.0" },
1091
- { name: "data_lineage", type_id: "ent_162", maturity: "stable", since: "0.1.0" },
1092
- { name: "glossary_term", type_id: "ent_163", maturity: "stable", since: "0.1.0" },
1093
- { name: "data_domain", type_id: "ent_164", maturity: "stable", since: "0.1.0" },
1094
- { name: "report", type_id: "ent_165", maturity: "stable", since: "0.1.0" },
1095
- // ── Content & Knowledge ──
1096
- { name: "content_piece", type_id: "ent_166", maturity: "stable", since: "0.1.0" },
1097
- { name: "knowledge_base_article", type_id: "ent_167", maturity: "stable", since: "0.1.0" },
1098
- { name: "brand_asset", type_id: "ent_168", maturity: "stable", since: "0.1.0" },
1099
- { name: "internal_doc", type_id: "ent_169", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "document" },
1100
- { name: "prompt_template", type_id: "ent_170", maturity: "stable", since: "0.1.0" },
1101
- { name: "content_calendar", type_id: "ent_171", maturity: "stable", since: "0.1.0" },
1102
- { name: "content_theme", type_id: "ent_172", maturity: "stable", since: "0.1.0" },
1103
- { name: "documentation_template", type_id: "ent_173", maturity: "stable", since: "0.1.0" },
1104
- { name: "document", type_id: "ent_320", maturity: "stable", since: "0.2.0" },
1105
- // ── Legal & Compliance ──
1106
- { name: "compliance_requirement", type_id: "ent_174", maturity: "stable", since: "0.1.0" },
1107
- { name: "risk", type_id: "ent_175", maturity: "stable", since: "0.1.0" },
1108
- { name: "data_contract", type_id: "ent_176", maturity: "stable", since: "0.1.0" },
1109
- { name: "legal_entity", type_id: "ent_177", maturity: "stable", since: "0.1.0" },
1110
- { name: "ip_asset", type_id: "ent_178", maturity: "stable", since: "0.1.0" },
1111
- { name: "audit_log_policy", type_id: "ent_179", maturity: "stable", since: "0.1.0" },
1112
- { name: "contract", type_id: "ent_180", maturity: "stable", since: "0.1.0" },
1113
- { name: "contract_clause", type_id: "ent_181", maturity: "stable", since: "0.1.0" },
1114
- { name: "privacy_policy", type_id: "ent_182", maturity: "stable", since: "0.1.0" },
1115
- { name: "compliance_framework", type_id: "ent_183", maturity: "stable", since: "0.1.0" },
1116
- { name: "security_audit", type_id: "ent_184", maturity: "stable", since: "0.1.0" },
1117
- // ── DevOps & Platform ──
1118
- { name: "service_level_indicator", type_id: "ent_185", maturity: "stable", since: "0.1.0" },
1119
- { name: "sli", type_id: "ent_334", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "service_level_indicator" },
1120
- { name: "service_level_objective", type_id: "ent_186", maturity: "stable", since: "0.1.0" },
1121
- { name: "slo", type_id: "ent_335", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "service_level_objective" },
1122
- { name: "error_budget", type_id: "ent_187", maturity: "stable", since: "0.1.0" },
1123
- { name: "incident", type_id: "ent_188", maturity: "stable", since: "0.1.0" },
1124
- { name: "postmortem", type_id: "ent_189", maturity: "stable", since: "0.1.0" },
1125
- { name: "runbook", type_id: "ent_190", maturity: "stable", since: "0.1.0" },
1126
- { name: "monitor", type_id: "ent_191", maturity: "stable", since: "0.1.0" },
1127
- { name: "alert_rule", type_id: "ent_192", maturity: "stable", since: "0.1.0" },
1128
- { name: "ci_pipeline", type_id: "ent_193", maturity: "stable", since: "0.1.0" },
1129
- { name: "release_strategy", type_id: "ent_194", maturity: "stable", since: "0.1.0" },
1130
- { name: "on_call_rotation", type_id: "ent_195", maturity: "stable", since: "0.1.0" },
1131
- { name: "infrastructure_component", type_id: "ent_196", maturity: "stable", since: "0.1.0" },
1132
- // ── Security ──
1133
- { name: "threat_model", type_id: "ent_197", maturity: "stable", since: "0.1.0" },
1134
- { name: "threat", type_id: "ent_198", maturity: "stable", since: "0.1.0" },
1135
- { name: "vulnerability", type_id: "ent_199", maturity: "stable", since: "0.1.0" },
1136
- { name: "security_control", type_id: "ent_200", maturity: "stable", since: "0.1.0" },
1137
- { name: "security_policy", type_id: "ent_201", maturity: "stable", since: "0.1.0" },
1138
- { name: "security_incident", type_id: "ent_202", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "incident" },
1139
- { name: "penetration_test", type_id: "ent_203", maturity: "stable", since: "0.1.0" },
1140
- { name: "security_review", type_id: "ent_204", maturity: "stable", since: "0.1.0" },
1141
- { name: "data_classification", type_id: "ent_205", maturity: "stable", since: "0.1.0" },
1142
- { name: "access_policy", type_id: "ent_206", maturity: "stable", since: "0.1.0" },
1143
- // ── Accessibility ──
1144
- { name: "a11y_standard", type_id: "ent_207", maturity: "stable", since: "0.1.0" },
1145
- { name: "a11y_guideline", type_id: "ent_208", maturity: "stable", since: "0.1.0" },
1146
- { name: "a11y_audit", type_id: "ent_209", maturity: "stable", since: "0.1.0" },
1147
- { name: "a11y_issue", type_id: "ent_210", maturity: "stable", since: "0.1.0" },
1148
- { name: "a11y_annotation", type_id: "ent_211", maturity: "stable", since: "0.1.0" },
1149
- // ── QA & Testing ──
1150
- { name: "test_suite", type_id: "ent_212", maturity: "stable", since: "0.1.0" },
1151
- { name: "test_case", type_id: "ent_213", maturity: "stable", since: "0.1.0" },
1152
- { name: "qa_session", type_id: "ent_214", maturity: "stable", since: "0.1.0" },
1153
- { name: "regression_test", type_id: "ent_215", maturity: "stable", since: "0.1.0" },
1154
- { name: "test_coverage_report", type_id: "ent_216", maturity: "stable", since: "0.1.0" },
1155
- { name: "test_environment", type_id: "ent_217", maturity: "stable", since: "0.1.0" },
1156
- { name: "defect_report", type_id: "ent_218", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "support_ticket" },
1157
- { name: "test_result", type_id: "ent_327", maturity: "proposed", since: "0.2.0" },
1158
- // ── Feedback & Voice of Customer ──
1159
- { name: "feedback_program", type_id: "ent_219", maturity: "stable", since: "0.1.0" },
1160
- { name: "feature_request", type_id: "ent_220", maturity: "stable", since: "0.1.0" },
1161
- { name: "feedback_vote", type_id: "ent_221", maturity: "stable", since: "0.1.0" },
1162
- { name: "nps_campaign", type_id: "ent_222", maturity: "stable", since: "0.1.0" },
1163
- { name: "user_advisory_board", type_id: "ent_223", maturity: "stable", since: "0.1.0" },
1164
- { name: "beta_program", type_id: "ent_224", maturity: "stable", since: "0.1.0" },
1165
- { name: "feedback_theme", type_id: "ent_225", maturity: "stable", since: "0.1.0" },
1166
- // ── Pricing & Packaging ──
1167
- { name: "pricing_strategy", type_id: "ent_226", maturity: "stable", since: "0.1.0" },
1168
- { name: "pricing_experiment", type_id: "ent_227", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "experiment" },
1169
- { name: "package", type_id: "ent_228", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "pricing_tier" },
1170
- { name: "discount_strategy", type_id: "ent_229", maturity: "stable", since: "0.1.0" },
1171
- { name: "trial_config", type_id: "ent_230", maturity: "stable", since: "0.1.0" },
1172
- { name: "paywall", type_id: "ent_231", maturity: "stable", since: "0.1.0" },
1173
- // ── AI/ML Operations ──
1174
- { name: "ai_model", type_id: "ent_232", maturity: "stable", since: "0.1.0" },
1175
- { name: "prompt_version", type_id: "ent_233", maturity: "stable", since: "0.1.0" },
1176
- { name: "eval_benchmark", type_id: "ent_234", maturity: "stable", since: "0.1.0" },
1177
- { name: "eval_run", type_id: "ent_235", maturity: "stable", since: "0.1.0" },
1178
- { name: "ai_cost_tracker", type_id: "ent_236", maturity: "stable", since: "0.1.0" },
1179
- { name: "hallucination_report", type_id: "ent_237", maturity: "stable", since: "0.1.0" },
1180
- { name: "ai_guardrail", type_id: "ent_238", maturity: "stable", since: "0.1.0" },
1181
- { name: "model_comparison", type_id: "ent_239", maturity: "stable", since: "0.1.0" },
1182
- { name: "ai_experiment", type_id: "ent_323", maturity: "proposed", since: "0.2.0" },
1183
- { name: "ai_dataset", type_id: "ent_324", maturity: "proposed", since: "0.2.0" },
1184
- { name: "ai_trace", type_id: "ent_325", maturity: "proposed", since: "0.2.0" },
1185
- // ── Agentic Workflows ──
1186
- { name: "workflow_template", type_id: "ent_240", maturity: "stable", since: "0.1.0" },
1187
- { name: "workflow_run", type_id: "ent_241", maturity: "stable", since: "0.1.0" },
1188
- { name: "agent_definition", type_id: "ent_242", maturity: "stable", since: "0.1.0" },
1189
- { name: "agent_session", type_id: "ent_243", maturity: "stable", since: "0.1.0" },
1190
- { name: "review_gate", type_id: "ent_244", maturity: "stable", since: "0.1.0" },
1191
- { name: "approval_record", type_id: "ent_245", maturity: "stable", since: "0.1.0" },
1192
- { name: "agent_skill", type_id: "ent_246", maturity: "stable", since: "0.1.0" },
1193
- { name: "agent_hook", type_id: "ent_247", maturity: "stable", since: "0.1.0" },
1194
- { name: "workflow_artifact", type_id: "ent_248", maturity: "stable", since: "0.1.0" },
1195
- { name: "agent_task", type_id: "ent_326", maturity: "proposed", since: "0.2.0" },
1196
- // ── Portfolio ──
1197
- { name: "organization", type_id: "ent_249", maturity: "stable", since: "0.1.0" },
1198
- { name: "portfolio", type_id: "ent_250", maturity: "stable", since: "0.1.0" },
1199
- { name: "product_area", type_id: "ent_251", maturity: "stable", since: "0.1.0" },
1200
- // ── Sales & Revenue ──
1201
- { name: "account", type_id: "ent_252", maturity: "stable", since: "0.1.0" },
1202
- { name: "contact", type_id: "ent_253", maturity: "stable", since: "0.1.0" },
1203
- { name: "lead", type_id: "ent_254", maturity: "stable", since: "0.1.0" },
1204
- { name: "deal", type_id: "ent_255", maturity: "stable", since: "0.1.0" },
1205
- { name: "pipeline_sales", type_id: "ent_256", maturity: "stable", since: "0.1.0" },
1206
- { name: "pipeline_stage", type_id: "ent_257", maturity: "stable", since: "0.1.0" },
1207
- { name: "quote_document", type_id: "ent_258", maturity: "stable", since: "0.1.0" },
1208
- { name: "subscription", type_id: "ent_259", maturity: "stable", since: "0.1.0" },
1209
- { name: "invoice", type_id: "ent_260", maturity: "stable", since: "0.1.0" },
1210
- { name: "forecast", type_id: "ent_261", maturity: "stable", since: "0.1.0" },
1211
- // ── Program Management ──
1212
- { name: "program", type_id: "ent_262", maturity: "stable", since: "0.1.0" },
1213
- { name: "project", type_id: "ent_263", maturity: "stable", since: "0.1.0" },
1214
- // `portfolio_shared` (0.25.1 feedback): a milestone is often a cross-team gate,
1215
- // not one project's checkpoint — an org-wide "Open Beta" that several products'
1216
- // projects must all satisfy. Shared tier lets `project_targets_milestone` (and
1217
- // the other milestone edges) pass the cross-scope gate as `provisional`, same
1218
- // as `project_implements_initiative`. Precedent: `planning_cycle` (0.20.0).
1219
- { name: "milestone", type_id: "ent_264", maturity: "stable", since: "0.1.0", portfolio_shared: true },
1220
- { name: "risk_register", type_id: "ent_265", maturity: "stable", since: "0.1.0" },
1221
- { name: "risk_item", type_id: "ent_266", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "risk" },
1222
- { name: "change_request", type_id: "ent_267", maturity: "stable", since: "0.1.0" },
1223
- { name: "deliverable", type_id: "ent_268", maturity: "stable", since: "0.1.0" },
1224
- { name: "resource_allocation", type_id: "ent_269", maturity: "stable", since: "0.1.0" },
1225
- { name: "status_report", type_id: "ent_270", maturity: "stable", since: "0.1.0" },
1226
- // ── Marketing Operations ──
1227
- { name: "marketing_strategy", type_id: "ent_271", maturity: "stable", since: "0.1.0" },
1228
- { name: "marketing_channel", type_id: "ent_272", maturity: "stable", since: "0.1.0" },
1229
- { name: "marketing_campaign_plan", type_id: "ent_273", maturity: "stable", since: "0.1.0" },
1230
- { name: "email_sequence", type_id: "ent_274", maturity: "stable", since: "0.1.0" },
1231
- { name: "social_post", type_id: "ent_275", maturity: "stable", since: "0.1.0" },
1232
- { name: "seo_keyword", type_id: "ent_276", maturity: "stable", since: "0.1.0" },
1233
- { name: "ad_creative", type_id: "ent_277", maturity: "stable", since: "0.1.0" },
1234
- { name: "press_release", type_id: "ent_278", maturity: "stable", since: "0.1.0" },
1235
- { name: "event", type_id: "ent_279", maturity: "stable", since: "0.1.0" },
1236
- { name: "community_initiative", type_id: "ent_280", maturity: "stable", since: "0.1.0" },
1237
- // ── Operations & Customer Success ──
1238
- { name: "support_ticket", type_id: "ent_281", maturity: "stable", since: "0.1.0" },
1239
- { name: "customer_feedback", type_id: "ent_282", maturity: "stable", since: "0.1.0" },
1240
- { name: "churn_reason", type_id: "ent_283", maturity: "stable", since: "0.1.0" },
1241
- { name: "onboarding_flow", type_id: "ent_284", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "user_flow" },
1242
- { name: "customer_health_score", type_id: "ent_285", maturity: "stable", since: "0.1.0" },
1243
- { name: "playbook", type_id: "ent_286", maturity: "stable", since: "0.1.0" },
1244
- { name: "service_level_agreement", type_id: "ent_287", maturity: "stable", since: "0.1.0" },
1245
- { name: "sla", type_id: "ent_336", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "service_level_agreement" },
1246
- { name: "customer_journey_stage", type_id: "ent_288", maturity: "stable", since: "0.1.0" },
1247
- { name: "touchpoint", type_id: "ent_289", maturity: "stable", since: "0.1.0" },
1248
- { name: "success_milestone", type_id: "ent_290", maturity: "stable", since: "0.1.0" },
1249
- { name: "service_blueprint", type_id: "ent_291", maturity: "stable", since: "0.1.0" },
1250
- { name: "nps_score", type_id: "ent_292", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "nps_campaign" },
1251
- // ── Localisation & i18n ──
1252
- { name: "locale", type_id: "ent_293", maturity: "stable", since: "0.1.0" },
1253
- { name: "translation_key", type_id: "ent_294", maturity: "stable", since: "0.1.0" },
1254
- { name: "translation_bundle", type_id: "ent_295", maturity: "stable", since: "0.1.0" },
1255
- { name: "locale_config", type_id: "ent_296", maturity: "stable", since: "0.1.0" },
1256
- { name: "cultural_adaptation", type_id: "ent_297", maturity: "stable", since: "0.1.0" },
1257
- { name: "regional_pricing", type_id: "ent_298", maturity: "stable", since: "0.1.0" },
1258
- // ── Customer Education ──
1259
- { name: "education_program", type_id: "ent_299", maturity: "stable", since: "0.1.0" },
1260
- { name: "tutorial", type_id: "ent_300", maturity: "stable", since: "0.1.0" },
1261
- { name: "walkthrough", type_id: "ent_301", maturity: "stable", since: "0.1.0" },
1262
- { name: "webinar", type_id: "ent_302", maturity: "stable", since: "0.1.0" },
1263
- { name: "certification", type_id: "ent_303", maturity: "stable", since: "0.1.0" },
1264
- { name: "help_video", type_id: "ent_304", maturity: "stable", since: "0.1.0" },
1265
- { name: "learning_path", type_id: "ent_305", maturity: "stable", since: "0.1.0" },
1266
- // ── Partners & Ecosystem ──
1267
- { name: "partner_program", type_id: "ent_306", maturity: "stable", since: "0.1.0" },
1268
- { name: "partner_tier", type_id: "ent_307", maturity: "stable", since: "0.1.0" },
1269
- { name: "api_ecosystem", type_id: "ent_308", maturity: "stable", since: "0.1.0" },
1270
- { name: "marketplace_listing", type_id: "ent_309", maturity: "stable", since: "0.1.0" },
1271
- { name: "developer_portal", type_id: "ent_310", maturity: "stable", since: "0.1.0" },
1272
- { name: "integration_partner", type_id: "ent_311", maturity: "stable", since: "0.1.0" },
1273
- { name: "partner_revenue_share", type_id: "ent_312", maturity: "stable", since: "0.1.0" },
1274
- // ── Workspace ──
1275
- { name: "workspace", type_id: "ent_328", maturity: "proposed", since: "0.2.0" },
1276
- { name: "framework_exercise", type_id: "ent_350", maturity: "proposed", since: "0.8.4" },
1277
- { name: "composition", type_id: "ent_361", maturity: "proposed", since: "0.31.0" },
1278
- // A dated, hashed rendition of a node that is already in the graph. Enters
1279
- // `proposed` per the maturity rubric (precedent: composition 0.31.0).
1280
- { name: "capture", type_id: "ent_362", maturity: "proposed", since: "0.32.0" }
1281
- ];
1282
- var DEFERRED_PROPOSED_BY_CONTRACT = {
1283
- // user_story (UPG-571) and experiment_run (UPG-664) graduated to stable in
1284
- // 0.12.6 — Captain lifted both freezes ("we are using them"). Their contracts
1285
- // are settled; they are now stable, not deferred.
1286
- ai_experiment: "UPG-665: AI prompt/model restructure (open ADR).",
1287
- ai_dataset: "UPG-665: AI prompt/model restructure (open ADR).",
1288
- ai_trace: "UPG-665: AI prompt/model restructure (open ADR)."
1289
- };
1290
- var UPG_ENTITY_META_BY_NAME = new Map(
1291
- UPG_ENTITY_META.map((m) => [m.name, m])
1292
- );
1293
- var UPG_ENTITY_META_BY_ID = new Map(
1294
- UPG_ENTITY_META.map((m) => [m.type_id, m])
1295
- );
1296
- var UPG_ACTIVE_TYPES = UPG_ENTITY_META.filter((m) => m.maturity === "stable" || m.maturity === "proposed").map((m) => m.name);
1297
- var UPG_DEPRECATED_TYPES = UPG_ENTITY_META.filter((m) => m.maturity === "deprecated").map((m) => m.name);
1298
- var UPG_PORTFOLIO_SHARED_TYPES = UPG_ENTITY_META.filter((m) => m.portfolio_shared === true).map((m) => m.name);
1299
- function isPortfolioSharedType(name) {
1300
- return UPG_ENTITY_META_BY_NAME.get(name)?.portfolio_shared === true;
1301
- }
1302
- function isDeprecatedType(name) {
1303
- const meta = UPG_ENTITY_META_BY_NAME.get(name);
1304
- return meta?.maturity === "deprecated";
1305
- }
1306
- function getReplacementType(name) {
1307
- const meta = UPG_ENTITY_META_BY_NAME.get(name);
1308
- return meta?.replacement;
1309
- }
1310
- function getTypeId(name) {
1311
- return UPG_ENTITY_META_BY_NAME.get(name)?.type_id;
1312
- }
1313
- function getTypeName(typeId) {
1314
- return UPG_ENTITY_META_BY_ID.get(typeId)?.name;
1315
- }
1316
-
1317
1328
  // src/catalog/edge-catalog.ts
1318
1329
  var UPG_WILDCARD_ENDPOINT = "node";
1319
1330
  var CLASSIFICATION_EDGE_PROPERTY_SCHEMA = {
@@ -1778,6 +1789,15 @@ var UPG_EDGE_CATALOG = {
1778
1789
  product_categorises_by_roadmap_theme: { forward_verb: "categorises_by", reverse_verb: "categorises", classification: "hierarchy", source_type: "product", target_type: "roadmap_theme" },
1779
1790
  feature_area_contains_feature: { forward_verb: "contains", reverse_verb: "belongs_to", classification: "hierarchy", source_type: "feature_area", target_type: "feature" },
1780
1791
  feature_area_contains_feature_area: { forward_verb: "contains", reverse_verb: "belongs_to", classification: "hierarchy", source_type: "feature_area", target_type: "feature_area" },
1792
+ // (0.39.0, B4) Component catalogs group by area -- a storybook sidebar that
1793
+ // follows the source tree, a visual-coverage report -- and the graph had no
1794
+ // edge for it, so a measured estate tagged 133 components `area:<group>`
1795
+ // instead. `groups`, not `contains`: the area does not OWN the component
1796
+ // (a design_system or product does); it is a grouping view over components
1797
+ // owned elsewhere, the same non-owning relationship `journey_phase_spans_journey_step`
1798
+ // records. Multi-parent GRAMMAR with single per-instance parentage, the
1799
+ // `quote` precedent.
1800
+ feature_area_groups_design_component: { forward_verb: "groups", reverse_verb: "grouped_in", classification: "hierarchy", source_type: "feature_area", target_type: "design_component" },
1781
1801
  outcome_delivered_by_feature: { forward_verb: "delivered_by", reverse_verb: "delivers", classification: "cross-domain", source_type: "outcome", target_type: "feature" },
1782
1802
  outcome_delivered_via_feature_area: { forward_verb: "delivered_via", reverse_verb: "delivers_for", classification: "cross-domain", source_type: "outcome", target_type: "feature_area" },
1783
1803
  feature_decomposed_into_epic: { forward_verb: "decomposed_into", reverse_verb: "implements", classification: "hierarchy", source_type: "feature", target_type: "epic" },
@@ -2097,10 +2117,32 @@ var UPG_EDGE_CATALOG = {
2097
2117
  // decision records design choices about the system; not contained by it.
2098
2118
  design_system_decided_via_decision: { forward_verb: "decided_via", reverse_verb: "decided_for", classification: "semantic", source_type: "design_system", target_type: "decision" },
2099
2119
  design_component_styled_by_design_token: { forward_verb: "styled_by", reverse_verb: "styles", classification: "hierarchy", source_type: "design_component", target_type: "design_token" },
2120
+ // (0.39.0, B2) The alias tier. A modern token system is two or three tiers --
2121
+ // primitives (`--gray-100`) that semantic tokens alias
2122
+ // (`--background-high: light-dark(var(--gray-100), var(--gray-900))`) that
2123
+ // components consume -- and the spec could hold the ends but not the middle,
2124
+ // so a measured estate (163 DTCG primitives, 45 semantic aliases) kept its
2125
+ // alias chain in descriptions. `causal`, not `semantic`: the alias's VALUE is
2126
+ // computed from the primitive's, so the dependency is real and directional.
2127
+ // `cross_product_eligible` because the primitive tier is routinely its own
2128
+ // published package (its own graph) while the semantic tier lives with the
2129
+ // component library. Makes "which primitives does this component ultimately
2130
+ // depend on" and "which primitives are dead" traversals rather than scripts.
2131
+ 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 },
2100
2132
  design_component_follows_design_pattern: { forward_verb: "follows", reverse_verb: "followed_by", classification: "hierarchy", source_type: "design_component", target_type: "design_pattern" },
2101
2133
  design_component_governed_by_design_guideline: { forward_verb: "governed_by", reverse_verb: "governs", classification: "hierarchy", source_type: "design_component", target_type: "design_guideline" },
2102
2134
  design_component_specified_by_interaction_spec: { forward_verb: "specified_by", reverse_verb: "specifies", classification: "hierarchy", source_type: "design_component", target_type: "interaction_spec" },
2103
- design_component_composes_design_component: { forward_verb: "composes", reverse_verb: "composed_in", classification: "hierarchy", source_type: "design_component", target_type: "design_component" },
2135
+ // (0.39.0, B1) `cross_product_eligible` because a design system and the
2136
+ // product that consumes it are two graphs: a Studio shadow component wrapping
2137
+ // the @sanity/ui primitive it is built on could not be stated, and 11 such
2138
+ // wrappers recorded the relationship in prose instead. Widened rather than
2139
+ // minting `design_component_wraps_design_component`: a wrap IS composition
2140
+ // read across a graph boundary, and a second verb for one relationship is the
2141
+ // shadow-pair shape Pattern D collapses. `design_component` is already
2142
+ // portfolio_shared, and the three sibling component edges
2143
+ // (surface_renders_, screen_renders_, feature_uses_) are already eligible;
2144
+ // this closes the last link between a product graph and its design system.
2145
+ 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 },
2104
2146
  prototype_annotated_with_annotation: { forward_verb: "annotated_with", reverse_verb: "annotates", classification: "hierarchy", source_type: "prototype", target_type: "annotation" },
2105
2147
  screen_renders_design_component: { forward_verb: "renders", reverse_verb: "rendered_on", classification: "hierarchy", source_type: "screen", target_type: "design_component", cross_product_eligible: true },
2106
2148
  // Marketing surface to product (0.12.7, UPG-696/698). A marketing/landing screen
@@ -7804,7 +7846,7 @@ var UPG_VALID_CHILDREN = {
7804
7846
  // parent. Same widening shape as the 0.23.0 epic twins: an existing leaf type
7805
7847
  // gains a second, SHALLOWER parent, verbs inherited from the deeper edge.
7806
7848
  feature: ["epic", "bug", "task", "user_story"],
7807
- feature_area: ["feature", "feature_area"],
7849
+ feature_area: ["feature", "feature_area", "design_component"],
7808
7850
  // epic owns user_story (the templated promise) and, mirroring feature, may
7809
7851
  // also directly contain bug/task — heterogeneous imported tickets that belong
7810
7852
  // to one epic rather than the feature as a whole (feedback df99026a).
@@ -13365,7 +13407,7 @@ var UPG_PROPERTY_SCHEMA = {
13365
13407
  },
13366
13408
  // DesignTokenProperties: Design token.
13367
13409
  design_token: {
13368
- category: { type: "string", enum: ["color", "spacing", "typography", "radius", "motion"], description: "Category" },
13410
+ 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." },
13369
13411
  value: { type: "string", description: "Resolved value" },
13370
13412
  css_variable: { type: "string", description: "CSS custom property name" }
13371
13413
  },
@@ -34147,7 +34189,7 @@ function checkHeaderSealText(text) {
34147
34189
  }
34148
34190
 
34149
34191
  // src/index.ts
34150
- var UPG_VERSION = "0.37.0";
34192
+ var UPG_VERSION = "0.39.0";
34151
34193
  var UPG_FORMAT_VERSION = "0.4.0";
34152
34194
  var MARKDOWN_FORMAT_VERSION = "0.1";
34153
34195
  var UPG_TYPES = getTypes();