@unified-product-graph/core 0.17.3 → 0.17.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -20,7 +20,8 @@ var UPG_DOMAINS = [
20
20
  "strategic_pillar",
21
21
  "assumption",
22
22
  "decision",
23
- "constraint"
23
+ "constraint",
24
+ "strategic_question"
24
25
  ]
25
26
  },
26
27
  {
@@ -539,6 +540,10 @@ var UPG_ENTITY_META = [
539
540
  { name: "assumption", type_id: "ent_014", maturity: "stable", since: "0.1.0" },
540
541
  { name: "decision", type_id: "ent_015", maturity: "stable", since: "0.1.0" },
541
542
  { name: "constraint", type_id: "ent_348", maturity: "stable", since: "0.4.3" },
543
+ // (0.17.4) Strategy-domain sibling of research_question / design_question,
544
+ // completing the domain-question triad. An open coordination/ownership question
545
+ // a plan is exposed to (distinct from `assumption`, which the plan is built on).
546
+ { name: "strategic_question", type_id: "ent_357", maturity: "proposed", since: "0.17.4" },
542
547
  // ── User ──
543
548
  { name: "persona", type_id: "ent_016", maturity: "stable", since: "0.1.0" },
544
549
  { name: "job", type_id: "ent_017", maturity: "stable", since: "0.1.0" },
@@ -1013,6 +1018,12 @@ var CLASSIFICATION_EDGE_PROPERTY_SCHEMA = {
1013
1018
  description: "Optional. A source URL, or a competitor_signal / evidence node id backing the classification. Mirrors feature_rivals_competitor_feature.evidence (free text or a node id)."
1014
1019
  }
1015
1020
  };
1021
+ var DEFER_EDGE_PROPERTY_SCHEMA = {
1022
+ deferred_to: {
1023
+ type: "string",
1024
+ description: 'Target period the parked work is deferred to. Freeform, mirroring strategic_theme.time_horizon. @example "Q4 2026", "FY27", "next release".'
1025
+ }
1026
+ };
1016
1027
  var UPG_EDGE_CATALOG = {
1017
1028
  // ── Part 1: Core Narrative Spine (Ring 1) ──────────────────────────────────
1018
1029
  // 1.1 User Domain
@@ -2043,6 +2054,11 @@ var UPG_EDGE_CATALOG = {
2043
2054
  document_describes_positioning: { forward_verb: "describes", reverse_verb: "described_by", classification: "semantic", source_type: "document", target_type: "positioning" },
2044
2055
  document_describes_decision: { forward_verb: "describes", reverse_verb: "described_by", classification: "semantic", source_type: "document", target_type: "decision" },
2045
2056
  document_contains_insight: { forward_verb: "contains", reverse_verb: "contained_in", classification: "semantic", source_type: "document", target_type: "insight" },
2057
+ // Research-provenance containment (0.17.5): a synthesis document is walkable
2058
+ // to the evidence it sourced. Within-graph containment (the document and the
2059
+ // evidence co-reside), so NOT cross_product_eligible.
2060
+ document_contains_quote: { forward_verb: "contains", reverse_verb: "contained_in", classification: "semantic", source_type: "document", target_type: "quote" },
2061
+ document_contains_observation: { forward_verb: "contains", reverse_verb: "contained_in", classification: "semantic", source_type: "document", target_type: "observation" },
2046
2062
  // 5.3 Customer Education & Training Domain
2047
2063
  product_educates_via_education_program: { forward_verb: "educates_via", reverse_verb: "educates", classification: "hierarchy", source_type: "product", target_type: "education_program" },
2048
2064
  education_program_teaches_via_tutorial: { forward_verb: "teaches_via", reverse_verb: "teaches", classification: "hierarchy", source_type: "education_program", target_type: "tutorial" },
@@ -3087,7 +3103,45 @@ var UPG_EDGE_CATALOG = {
3087
3103
  // Operating-lifecycle cross-edges (0.11.6): a product's journey phase realises a canonical
3088
3104
  // operating stage (the cross-surface join key); a stage is measured by a rollup metric (loop close).
3089
3105
  journey_phase_realises_operating_stage: { forward_verb: "realises", reverse_verb: "realised_by", classification: "cross-domain", source_type: "journey_phase", target_type: "operating_stage", cross_product_eligible: true },
3090
- operating_stage_measured_by_metric: { forward_verb: "measured_by", reverse_verb: "measures", classification: "cross-domain", source_type: "operating_stage", target_type: "metric" }
3106
+ operating_stage_measured_by_metric: { forward_verb: "measured_by", reverse_verb: "measures", classification: "cross-domain", source_type: "operating_stage", target_type: "metric" },
3107
+ // ── OKR planning coverage (0.17.4) ──────────────────────────────────────────
3108
+ // Reconciling the strategy graph against a live planning doc surfaced texture
3109
+ // the objective — the node every OKR doc organises itself around — could not
3110
+ // reach: cross-team dependencies and deferred (out-of-scope) work.
3111
+ // objective ↔ dependency. Every OKR in the source doc carries a dependency
3112
+ // table ("which other team's work this depends on"). `dependency` (team_org)
3113
+ // already carries dependency_type / criticality / target_date; it was
3114
+ // reachable only from `team`. An objective DEPENDS ON a dependency; the
3115
+ // dependency BLOCKS the objective (explicit mirror, not left implicit).
3116
+ // Cross-domain, not hierarchy: a dependency is parented under its owning team,
3117
+ // so an objective references it laterally rather than containing it. Both are
3118
+ // cross_product_eligible — a Studio objective can depend on a dependency owned
3119
+ // by another team's graph within the portfolio (0.17.3 locked predicate).
3120
+ objective_depends_on_dependency: { forward_verb: "depends_on", reverse_verb: "dependency_of", classification: "cross-domain", source_type: "objective", target_type: "dependency", cross_product_eligible: true },
3121
+ dependency_blocks_objective: { forward_verb: "blocks", reverse_verb: "blocked_by", classification: "cross-domain", source_type: "dependency", target_type: "objective", cross_product_eligible: true },
3122
+ // objective / initiative → strategic_question. A planning doc's "Risks & Open
3123
+ // Questions" section names unresolved coordination questions the plan is
3124
+ // exposed to (who owns a capability across teams after a reorg). The
3125
+ // strategy-domain sibling of research_question / design_question. The question
3126
+ // is raised under (contained by) the objective or initiative that surfaces it,
3127
+ // so hierarchy — mirroring initiative_assumes_assumption. Within-graph: the
3128
+ // question node is authored alongside its objective, so NOT
3129
+ // cross_product_eligible (the cross-team nature lives in the question text, not
3130
+ // in a cross-graph edge).
3131
+ objective_raises_strategic_question: { forward_verb: "raises", reverse_verb: "raised_by", classification: "hierarchy", source_type: "objective", target_type: "strategic_question" },
3132
+ initiative_raises_strategic_question: { forward_verb: "raises", reverse_verb: "raised_by", classification: "hierarchy", source_type: "initiative", target_type: "strategic_question" },
3133
+ // objective → feature / capability (the defer / out-of-scope edge). Every OKR
3134
+ // in the source doc carries an explicit "Out of scope" list, load-bearing for
3135
+ // keeping a quarter from silently expanding (localization deferred to Q4,
3136
+ // another team's feature work parked). Modelled as an edge to the real feature
3137
+ // or capability parked for later, not a scalar exclusion string, so the parked
3138
+ // work stays queryable and connected. The `deferred_to` edge property carries
3139
+ // the temporal target. feature is product_spec (cross-domain); capability is
3140
+ // intra-strategy (semantic). Both cross_product_eligible: deferring another
3141
+ // product's feature or capability, authored in a different graph within the
3142
+ // portfolio, fits the 0.17.3 locked predicate.
3143
+ objective_defers_feature: { forward_verb: "defers", reverse_verb: "deferred_by", classification: "cross-domain", source_type: "objective", target_type: "feature", carries_properties: true, property_schema: DEFER_EDGE_PROPERTY_SCHEMA, cross_product_eligible: true, deliberate_only: true },
3144
+ objective_defers_capability: { forward_verb: "defers", reverse_verb: "deferred_by", classification: "semantic", source_type: "objective", target_type: "capability", carries_properties: true, property_schema: DEFER_EDGE_PROPERTY_SCHEMA, cross_product_eligible: true, deliberate_only: true }
3091
3145
  };
3092
3146
  var UPG_CROSS_ELIGIBLE_CATALOG_EDGE_TYPES = Object.keys(UPG_EDGE_CATALOG).filter(
3093
3147
  (k) => UPG_EDGE_CATALOG[k].cross_product_eligible === true
@@ -3096,6 +3150,13 @@ function isCrossProductEligible(type) {
3096
3150
  const def = UPG_EDGE_CATALOG[type];
3097
3151
  return def?.cross_product_eligible === true;
3098
3152
  }
3153
+ var UPG_DELIBERATE_ONLY_EDGE_TYPES = Object.keys(UPG_EDGE_CATALOG).filter(
3154
+ (k) => UPG_EDGE_CATALOG[k].deliberate_only === true
3155
+ );
3156
+ function isDeliberateOnlyEdge(type) {
3157
+ const def = UPG_EDGE_CATALOG[type];
3158
+ return def?.deliberate_only === true;
3159
+ }
3099
3160
  var UPG_POLYMORPHIC_EDGE_KEYS = [
3100
3161
  // Universal semantic verbs
3101
3162
  "node_informs_node",
@@ -3463,7 +3524,9 @@ var UPG_VALID_CHILDREN = {
3463
3524
  // where self-nesting genuinely lives, not on `experiment`).
3464
3525
  experiment_run: ["learning", "evidence", "metric", "experiment_run"],
3465
3526
  // ── OKR hierarchy ──────────────────────────────────────────────────────────
3466
- objective: ["key_result", "metric"],
3527
+ // strategic_question (0.17.4): an open coordination question raised under an
3528
+ // objective (objective_raises_strategic_question, hierarchy).
3529
+ objective: ["key_result", "metric", "strategic_question"],
3467
3530
  key_result: ["metric"],
3468
3531
  // ── Strategic cascade: vision → mission → strategic_pillar → strategic_theme →
3469
3532
  // { initiative, objective } ───────────────────────────────────────────────
@@ -3488,7 +3551,7 @@ var UPG_VALID_CHILDREN = {
3488
3551
  // catalog (hierarchy, strategic_theme → objective, reverse_verb: rolls_up_to;
3489
3552
  // renamed from objective_rolls_up_to_strategic_theme in UPG-676).
3490
3553
  strategic_theme: ["initiative", "objective"],
3491
- initiative: ["assumption"],
3554
+ initiative: ["assumption", "strategic_question"],
3492
3555
  // v0.5.2 (UPG-528): capability decomposes into sub-capabilities (Wardley
3493
3556
  // value-chain spine) and is realised by user-facing features. Pairs with
3494
3557
  // `capability_depends_on_capability` and `capability_implemented_by_feature`
@@ -4561,6 +4624,15 @@ var ASSUMPTION_LIFECYCLE = {
4561
4624
  }
4562
4625
  ]
4563
4626
  };
4627
+ var STRATEGIC_QUESTION_LIFECYCLE = {
4628
+ entity_type: "strategic_question",
4629
+ initial_phase: "open",
4630
+ terminal_phases: ["resolved"],
4631
+ phases: [
4632
+ { id: "open", label: "Open", description: "The question has been raised but not yet answered. The plan is exposed to it.", transitions_to: ["resolved"] },
4633
+ { id: "resolved", label: "Resolved", description: "The question has been answered; the resolution is captured. The plan is no longer exposed to it. May reopen if the answer unravels.", transitions_to: ["open"] }
4634
+ ]
4635
+ };
4564
4636
  var OUTCOME_LIFECYCLE = {
4565
4637
  entity_type: "outcome",
4566
4638
  initial_phase: "identified",
@@ -6238,6 +6310,7 @@ var UPG_LIFECYCLES = [
6238
6310
  INITIATIVE_LIFECYCLE,
6239
6311
  STRATEGIC_PILLAR_LIFECYCLE,
6240
6312
  ASSUMPTION_LIFECYCLE,
6313
+ STRATEGIC_QUESTION_LIFECYCLE,
6241
6314
  FEATURE_AREA_LIFECYCLE,
6242
6315
  FEATURE_LIFECYCLE,
6243
6316
  EPIC_LIFECYCLE,
@@ -12032,7 +12105,8 @@ var UPG_PROPERTY_SCHEMA = {
12032
12105
  session_ref: { type: "string", description: "Capturing session reference. Convenience field; the canonical relationship to study/session is an edge per P14. Retained as a lightweight context anchor for AI inference." },
12033
12106
  is_highlighted: { type: "boolean", description: "Flagged as a highlight. Absorbed from the deprecated Highlight entity." },
12034
12107
  highlight_tag: { type: "string", description: 'Free-form highlight type tag. @example "pain", "delight", "behaviour", "moment of clarity"' },
12035
- sentiment: { type: "string", enum: ["positive", "neutral", "negative", "mixed"], description: "Structured sentiment. Tools like Dovetail and EnjoyHQ converge on these four values. More precise than `highlight_tag` for aggregation." }
12108
+ sentiment: { type: "string", enum: ["positive", "neutral", "negative", "mixed"], description: "Structured sentiment. Tools like Dovetail and EnjoyHQ converge on these four values. More precise than `highlight_tag` for aggregation." },
12109
+ source_url: { type: "string", description: "Stable deep-link to the exact moment this observation was captured in the originating recording or transcript. A per-moment locator, not a study-level link. Distinct from `session_ref`, which holds an opaque session ID.", modifier: "volatile" }
12036
12110
  },
12037
12111
  // OnCallRotationProperties: On-call rotation.
12038
12112
  on_call_rotation: {
@@ -12076,7 +12150,8 @@ var UPG_PROPERTY_SCHEMA = {
12076
12150
  participant: {
12077
12151
  alias: { type: "string", description: 'Anonymous alias for privacy (e.g. "P01")' },
12078
12152
  recruit_source: { type: "string", description: "How the participant was recruited" },
12079
- consent_status: { type: "string", enum: ["pending", "given", "withdrawn"], description: "Current consent status for data usage" }
12153
+ consent_status: { type: "string", enum: ["pending", "given", "withdrawn"], description: "Current consent status for data usage" },
12154
+ source_url: { type: "string", description: "Stable deep-link to the exact moment this participant appears in the originating recording or transcript. A per-moment locator, not a study-level link.", modifier: "volatile" }
12080
12155
  },
12081
12156
  // PartnerProgramProperties: Partner program.
12082
12157
  partner_program: {
@@ -12299,7 +12374,8 @@ var UPG_PROPERTY_SCHEMA = {
12299
12374
  // QuoteProperties: Verbatim quote from a participant.
12300
12375
  quote: {
12301
12376
  text: { type: "string", description: "Quoted text" },
12302
- timestamp: { type: "string", description: "When said (ISO timestamp or session offset)" }
12377
+ timestamp: { type: "string", description: "When said (ISO timestamp or session offset)" },
12378
+ source_url: { type: "string", description: "Stable deep-link to the exact moment this quote was spoken in the originating recording or transcript. A per-moment locator, not a study-level link.", modifier: "volatile" }
12303
12379
  },
12304
12380
  // QuoteDocumentProperties: Quote document.
12305
12381
  quote_document: {
@@ -12714,6 +12790,15 @@ var UPG_PROPERTY_SCHEMA = {
12714
12790
  time_horizon: { type: "string", description: 'Standing / multi-year horizon, often open-ended (a pillar is durable). @example "3 years", "2026-2028", "ongoing"' },
12715
12791
  success_indicator: { type: "string", description: "How the business knows this durable pillar is on track. Narrative, not a metric edge. A strategic_theme deliberately has no success_indicator: it is measured through its child objectives, not on its own." }
12716
12792
  },
12793
+ // StrategicQuestionProperties: StrategicQuestion entity. An open coordination or
12794
+ // ownership question a plan is exposed to (strategy sibling of research_question /
12795
+ // design_question). `status` is the node lifecycle (open -> resolved).
12796
+ strategic_question: {
12797
+ question: { type: "string", description: "The question itself. Primary content." },
12798
+ context: { type: "string", description: "Context that surfaced the question: the reorg, the boundary, the unowned area." },
12799
+ resolution: { type: "string", description: "The answer, captured when the question moves to `resolved`." },
12800
+ priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Importance to resolve relative to other open questions." }
12801
+ },
12717
12802
  // StrategicThemeProperties: StrategicTheme entity. A time-bound thrust WITHIN a
12718
12803
  // strategic_pillar (distinct cascade level, UPG-692 T3.3) — measured through its
12719
12804
  // child objectives, so it carries no success_indicator of its own.
@@ -19742,6 +19827,7 @@ var ENTITY_EMOJI = {
19742
19827
  stakeholder: "\u{1F9D1}\u200D\u{1F4BC}",
19743
19828
  status_report: "\u{1F4C4}",
19744
19829
  strategic_pillar: "\u{1F3DB}\uFE0F",
19830
+ strategic_question: "\u2754",
19745
19831
  strategic_theme: "\u{1F9F5}",
19746
19832
  subscription: "\u{1F502}",
19747
19833
  success_milestone: "\u{1F389}",
@@ -20299,6 +20385,7 @@ var STANDARD_LABELS = {
20299
20385
  value_stream: { alt_labels: ["value chain", "stream"] },
20300
20386
  strategic_pillar: { alt_labels: ["pillar", "foundation"] },
20301
20387
  assumption: { alt_labels: ["belief", "working assumption", "premise"] },
20388
+ strategic_question: { alt_labels: ["open question", "coordination question", "ownership question"] },
20302
20389
  // User layer
20303
20390
  job_step: { alt_labels: ["job stage", "job phase", "job map step"] },
20304
20391
  switching_cost: { alt_labels: ["lock-in", "migration cost", "switching barrier"] },
@@ -22728,7 +22815,13 @@ var USER_RESEARCH_GUIDE = {
22728
22815
  anti_patterns: [
22729
22816
  { description: "Insights without evidence: every insight must trace back to observations and quotes" },
22730
22817
  { description: "Orphan quotes: quotes should belong to observations, not float independently" },
22731
- { description: "Research studies without questions: always define what you want to learn before starting" }
22818
+ { description: "Research studies without questions: always define what you want to learn before starting" },
22819
+ {
22820
+ name: "Study conflation",
22821
+ affected_entity: "research_study",
22822
+ description: "Do not merge multiple research rounds with different stated goals into one `research_study` (or one participant pool) just because they were synthesized into the same downstream document. If two rounds have different research questions, they are different `research_study` nodes, even if an analyst wrote them up together.",
22823
+ remediation: "Verify against the *original* recording or session metadata, not the synthesis doc's grouping."
22824
+ }
22732
22825
  ]
22733
22826
  };
22734
22827
  var MARKET_INTELLIGENCE_GUIDE = {
@@ -22843,7 +22936,7 @@ var STRATEGY_GUIDE = {
22843
22936
  // entries are later additions appended in chronological-introduction
22844
22937
  // order. Placement reflects the order in which they would naturally be
22845
22938
  // authored after the canonical strategy spine.
22846
- creation_sequence: ["product", "vision", "mission", "outcome", "objective", "key_result", "metric", "metric_quality_assessment", "strategic_theme", "strategic_pillar", "initiative", "capability", "value_stream", "assumption", "decision", "constraint"],
22939
+ creation_sequence: ["product", "vision", "mission", "outcome", "objective", "key_result", "metric", "metric_quality_assessment", "strategic_theme", "strategic_pillar", "initiative", "capability", "value_stream", "assumption", "strategic_question", "decision", "constraint"],
22847
22940
  patterns: [
22848
22941
  {
22849
22942
  name: "Strategic Cascade",
@@ -22861,13 +22954,16 @@ var STRATEGY_GUIDE = {
22861
22954
  required_bridges: [
22862
22955
  { edge_type: "outcome_reveals_opportunity", target_domain: "discovery", when: "Outcomes should connect to the opportunities that deliver them" },
22863
22956
  { edge_type: "outcome_delivered_by_feature", target_domain: "product_spec", when: "Strategic outcomes should decompose into shipped features" },
22864
- { edge_type: "assumption_becomes_hypothesis", target_domain: "validation", when: "Risky assumptions should become testable hypotheses" }
22957
+ { edge_type: "assumption_becomes_hypothesis", target_domain: "validation", when: "Risky assumptions should become testable hypotheses" },
22958
+ { edge_type: "objective_depends_on_dependency", target_domain: "team_org", when: "An objective that hinges on cross-team work should name the dependency it is exposed to" },
22959
+ { edge_type: "objective_defers_feature", target_domain: "product_spec", when: "Work an objective explicitly puts out of scope for now should point at the deferred feature with a deferred_to period, not silently vanish from the quarter" }
22865
22960
  ],
22866
22961
  anti_patterns: [
22867
22962
  { description: "Outcomes without metrics. Measurement is the signal an outcome happened." },
22868
22963
  { description: "Objectives without key results: an objective without measurement is a wish" },
22869
22964
  { description: "Too many strategic themes: focus beats breadth, aim for 2-4 active themes" },
22870
- { description: "Constraints without an origin: a qualitative guardrail lives on a constraint, so set constraint_origin to say where it comes from. internal marks a self-imposed principle or operating tenet the team commits to; external marks a limit, requirement, or ceiling imposed from outside (a regulation, a budget cap, a platform bound)." }
22965
+ { description: "Constraints without an origin: a qualitative guardrail lives on a constraint, so set constraint_origin to say where it comes from. internal marks a self-imposed principle or operating tenet the team commits to; external marks a limit, requirement, or ceiling imposed from outside (a regulation, a budget cap, a platform bound)." },
22966
+ { description: "Overloading assumption for open questions: an assumption is a premise the plan is built on and resolves by being tested (assumption_becomes_hypothesis). An unresolved coordination or ownership question the plan is exposed to (who owns a capability across teams, where a boundary falls after a reorg) is a strategic_question, raised under the objective or initiative it hangs off. Do not force one into the other." }
22871
22967
  ]
22872
22968
  };
22873
22969
  var PRODUCT_SPEC_GUIDE = {
@@ -26920,6 +27016,10 @@ var UPG_REGIONS = [
26920
27016
  type: "assumption",
26921
27017
  role: "leaf"
26922
27018
  },
27019
+ {
27020
+ type: "strategic_question",
27021
+ role: "leaf"
27022
+ },
26923
27023
  {
26924
27024
  type: "constraint",
26925
27025
  role: "leaf"
@@ -26945,6 +27045,8 @@ var UPG_REGIONS = [
26945
27045
  "strategic_pillar_decided_via_decision",
26946
27046
  "strategic_theme_pursues_initiative",
26947
27047
  "initiative_assumes_assumption",
27048
+ "objective_raises_strategic_question",
27049
+ "initiative_raises_strategic_question",
26948
27050
  "initiative_drives_outcome",
26949
27051
  "objective_achieved_through_key_result",
26950
27052
  "objective_measured_by_metric",
@@ -29629,7 +29731,7 @@ function isCanonical(text) {
29629
29731
  }
29630
29732
 
29631
29733
  // src/index.ts
29632
- var UPG_VERSION = "0.17.3";
29734
+ var UPG_VERSION = "0.17.5";
29633
29735
  var UPG_FORMAT_VERSION = "0.4.0";
29634
29736
  var MARKDOWN_FORMAT_VERSION = "0.1";
29635
29737
  var UPG_TYPES = getTypes();
@@ -29702,6 +29804,7 @@ export {
29702
29804
  COVERAGE_ANTI_PATTERNS,
29703
29805
  DEFAULT_ENTITY_EMOJI,
29704
29806
  DEFERRED_PROPOSED_BY_CONTRACT,
29807
+ DEFER_EDGE_PROPERTY_SCHEMA,
29705
29808
  DISCOVERY_RESEARCH_VALIDATION_PLAYBOOK,
29706
29809
  ENGINEERING_PLATFORM_PLAYBOOK,
29707
29810
  ENTITY_EMOJI,
@@ -29733,6 +29836,7 @@ export {
29733
29836
  UPG_CROSS_EDGE_TYPES,
29734
29837
  UPG_CROSS_ELIGIBLE_CATALOG_EDGE_TYPES,
29735
29838
  UPG_CROSS_ONLY_EDGE_TYPES,
29839
+ UPG_DELIBERATE_ONLY_EDGE_TYPES,
29736
29840
  UPG_DEPRECATED_TYPES,
29737
29841
  UPG_DOMAINS,
29738
29842
  UPG_DOMAIN_ACTIVATION,
@@ -29864,6 +29968,7 @@ export {
29864
29968
  isCanonicalProductStage,
29865
29969
  isContainmentFreeType,
29866
29970
  isCrossProductEligible,
29971
+ isDeliberateOnlyEdge,
29867
29972
  isDeprecatedType,
29868
29973
  isDomainGuideStep,
29869
29974
  isEntitySequenceStep,