@unified-product-graph/core 0.23.0 → 0.23.2

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.d.cts CHANGED
@@ -1476,6 +1476,7 @@ declare const UPG_EDGE_CATALOG: {
1476
1476
  classification: "hierarchy";
1477
1477
  source_type: string;
1478
1478
  target_type: string;
1479
+ cross_product_eligible: true;
1479
1480
  };
1480
1481
  epic_affected_by_bug: {
1481
1482
  forward_verb: string;
@@ -1483,6 +1484,7 @@ declare const UPG_EDGE_CATALOG: {
1483
1484
  classification: "hierarchy";
1484
1485
  source_type: string;
1485
1486
  target_type: string;
1487
+ cross_product_eligible: true;
1486
1488
  };
1487
1489
  task_has_subtask: {
1488
1490
  forward_verb: string;
@@ -7597,6 +7599,14 @@ declare const UPG_EDGE_CATALOG: {
7597
7599
  target_type: string;
7598
7600
  cross_product_eligible: true;
7599
7601
  };
7602
+ dependency_resolved_by_objective: {
7603
+ forward_verb: string;
7604
+ reverse_verb: string;
7605
+ classification: "cross-domain";
7606
+ source_type: string;
7607
+ target_type: string;
7608
+ cross_product_eligible: true;
7609
+ };
7600
7610
  objective_raises_strategic_question: {
7601
7611
  forward_verb: string;
7602
7612
  reverse_verb: string;
@@ -8202,7 +8212,7 @@ interface UPGPortfolioDocument {
8202
8212
  /**
8203
8213
  * Legacy product-stage aliases (UPG-509 Part 2).
8204
8214
  *
8205
- * Existing graphs (`entopo.upg`, `sanity.upg`, `maximum-minimum.upg`,
8215
+ * Existing graphs (`entopo.upg`, `nimbus.upg`, `maximum-minimum.upg`,
8206
8216
  * `notion-saturated.upg`, etc.) carry `product.stage` values that pre-date
8207
8217
  * the canonical `UPGProductStage` enum
8208
8218
  * (`concept | validation | build | beta | launch | growth | mature |
@@ -8645,7 +8655,7 @@ declare const UPG_DOMAINS: readonly [{
8645
8655
  }, {
8646
8656
  readonly id: "foundations";
8647
8657
  readonly label: "Foundations";
8648
- readonly description: "The shared specifications and foundational primitives a product organisation stewards or implements everywhere. Specifications are governed specs (query languages, protocols, data formats, encodings) like GROQ or Portable Text; primitives are the compositional units those specs define (a block, a reference, a query value). Both are registry-hostable canonicals that products implement, expose, or conform to. Distinct from a product feature: a specification has no single owner, no P&L, and no buyer; it is the rulebook many products point at.";
8658
+ readonly description: "The shared specifications and foundational primitives a product organisation stewards or implements everywhere. Specifications are governed specs (query languages, protocols, data formats, encodings) like NQL or Structured Text; primitives are the compositional units those specs define (a block, a reference, a query value). Both are registry-hostable canonicals that products implement, expose, or conform to. Distinct from a product feature: a specification has no single owner, no P&L, and no buyer; it is the rulebook many products point at.";
8649
8659
  readonly types: readonly ["specification", "primitive", "operating_lifecycle", "operating_stage"];
8650
8660
  }];
8651
8661
  /**
@@ -9839,7 +9849,7 @@ declare function migrateEdge<T extends {
9839
9849
  * type's lifecycle exists but the graph carries pre-canonical status values
9840
9850
  * the lifecycle never had.
9841
9851
  *
9842
- * Source: live drift in `.upg/entopo.upg`, `.upg/sanity.upg`, and
9852
+ * Source: live drift in `.upg/entopo.upg`, `.upg/nimbus.upg`, and
9843
9853
  * `.upg/inkling.upg` surveyed during the v0.5 launch train (UPG-527).
9844
9854
  * Highest single drift class: 173 `service` nodes with `status: "active"`
9845
9855
  * against the canonical `[development, staging, production, deprecated]`
@@ -11466,7 +11476,7 @@ interface CompetitorProperties {
11466
11476
  /**
11467
11477
  * Provenance: where this was observed. A changelog, pricing, or docs URL,
11468
11478
  * an analyst report, or a research note.
11469
- * @example "https://www.contentful.com/pricing/"
11479
+ * @example "https://docs.larch.example/pricing/"
11470
11480
  */
11471
11481
  source?: string;
11472
11482
  /**
@@ -11518,7 +11528,7 @@ interface CompetitorFeatureProperties {
11518
11528
  /**
11519
11529
  * Provenance: where this was observed. A changelog, pricing, or docs URL,
11520
11530
  * an analyst report, or a research note.
11521
- * @example "https://www.contentful.com/changelog/"
11531
+ * @example "https://docs.larch.example/changelog/"
11522
11532
  */
11523
11533
  source?: string;
11524
11534
  /**
@@ -11640,7 +11650,7 @@ interface CompetitiveAnalysisProperties {
11640
11650
  *
11641
11651
  * @example
11642
11652
  * [
11643
- * { axis_a_value_ref: 'val-git-based', axis_b_value_ref: 'val-portable-text',
11653
+ * { axis_a_value_ref: 'val-git-based', axis_b_value_ref: 'val-structured-text',
11644
11654
  * rationale_kind: 'opportunity',
11645
11655
  * rationale_md: 'No technical reason; only adoption inertia. Watching brief.' },
11646
11656
  * { axis_a_value_ref: 'val-composable', axis_b_value_ref: 'val-wysiwyg',
@@ -11658,7 +11668,7 @@ interface CompetitiveAnalysisProperties {
11658
11668
  /**
11659
11669
  * Provenance: where this was observed. A changelog, pricing, or docs URL,
11660
11670
  * an analyst report, or a research note.
11661
- * @example "https://www.contentful.com/changelog/"
11671
+ * @example "https://docs.larch.example/changelog/"
11662
11672
  */
11663
11673
  source?: string;
11664
11674
  /**
@@ -11737,7 +11747,7 @@ interface CompetitorSignalProperties {
11737
11747
  /**
11738
11748
  * Provenance: where this was observed. A changelog, pricing, or docs URL,
11739
11749
  * an analyst report, or a research note.
11740
- * @example "https://www.contentful.com/changelog/"
11750
+ * @example "https://docs.larch.example/changelog/"
11741
11751
  */
11742
11752
  source?: string;
11743
11753
  /**
@@ -11835,6 +11845,18 @@ interface EmptyCell {
11835
11845
  * const properties: ClassificationAxisProperties = {
11836
11846
  * axis_kind: 'categorical',
11837
11847
  * }
11848
+ *
11849
+ * @example
11850
+ * // Canonical governance axis `change_blast_radius` (ordinal): grade a change /
11851
+ * // feature / decision by how much risk it carries, so review ceremony and
11852
+ * // agent-autonomy gating scale with reach. Four ordered values —
11853
+ * // Trivial(0) < Standard(1) < Significant(2) < Critical(3) — classified via the
11854
+ * // polymorphic `node_classified_as_classification_value` edge. Report metrics
11855
+ * // WITHIN tier (pooling across tiers is Simpson's-paradox bait). See
11856
+ * // decisions/2026-07-15-change-blast-radius-axis.md.
11857
+ * const properties: ClassificationAxisProperties = {
11858
+ * axis_kind: 'ordinal',
11859
+ * }
11838
11860
  */
11839
11861
  interface ClassificationAxisProperties {
11840
11862
  /**
@@ -11865,14 +11887,14 @@ interface ClassificationAxisProperties {
11865
11887
  * @example
11866
11888
  * const properties: ClassificationValueProperties = {
11867
11889
  * rationale: 'Composable extends headless with three load-bearing commitments.',
11868
- * exemplars: ['Sanity', 'Contentful', 'Hygraph'],
11890
+ * exemplars: ['Nimbus', 'Larch', 'Prism'],
11869
11891
  * commitments: [
11870
11892
  * { name: 'Typed content graph', description: 'Schemas in code; references as edges.' },
11871
11893
  * { name: 'Real-time backend', description: 'Live queries, CRDT collaboration.' },
11872
11894
  * { name: 'Embeddable studio', description: 'Editor is a library hosted inside the team app.' },
11873
11895
  * ],
11874
11896
  * capabilities: [
11875
- * { surface: 'delivery', bullets: ['GROQ', 'GraphQL', 'REST', 'Live Content API'] },
11897
+ * { surface: 'delivery', bullets: ['NQL', 'GraphQL', 'REST', 'Live Sync API'] },
11876
11898
  * ],
11877
11899
  * }
11878
11900
  */
@@ -11885,7 +11907,7 @@ interface ClassificationValueProperties {
11885
11907
  /**
11886
11908
  * Free-text examples of products occupying this value.
11887
11909
  * For queryable occupancy, prefer `competitor` nodes with `classified_as` edges.
11888
- * @example ['Sanity', 'Contentful', 'Hygraph']
11910
+ * @example ['Nimbus', 'Larch', 'Prism']
11889
11911
  */
11890
11912
  exemplars?: string[];
11891
11913
  /**
@@ -11912,8 +11934,8 @@ interface ClassificationValueProperties {
11912
11934
  *
11913
11935
  * @example
11914
11936
  * [
11915
- * { surface: 'delivery', bullets: ['GROQ', 'GraphQL', 'REST', 'Live Content API', 'Asset CDN'] },
11916
- * { surface: 'extensibility', bullets: ['Custom input components', 'Studio plugins'] },
11937
+ * { surface: 'delivery', bullets: ['NQL', 'GraphQL', 'REST', 'Live Sync API', 'Asset CDN'] },
11938
+ * { surface: 'extensibility', bullets: ['Custom input components', 'editor plugins'] },
11917
11939
  * ]
11918
11940
  */
11919
11941
  capabilities?: Array<ClassificationCapability>;
@@ -18857,9 +18879,9 @@ interface FrameworkExerciseProperties {
18857
18879
  * kind: 'language',
18858
18880
  * language_flavor: 'query',
18859
18881
  * governance: 'open_spec_stewarded',
18860
- * steward: 'Sanity',
18882
+ * steward: 'Nimbus',
18861
18883
  * openness: 'open',
18862
- * spec_url: 'https://sanity.io/docs/groq',
18884
+ * spec_url: 'https://nimbus.example/docs/nql',
18863
18885
  * current_version: '1.0',
18864
18886
  * since: '2019',
18865
18887
  * }
@@ -18889,13 +18911,13 @@ interface SpecificationProperties {
18889
18911
  conformance?: string;
18890
18912
  }
18891
18913
  /** A foundational compositional unit a specification defines: the noun products
18892
- * pass around and compose with (a Portable Text block, a Sanity reference, a
18914
+ * pass around and compose with (a Structured Text block, a typed reference, a
18893
18915
  * Git commit, a Stripe PaymentIntent). Lifecycle-free, like `metric`.
18894
18916
  *
18895
18917
  * @example
18896
18918
  * const properties: PrimitiveProperties = {
18897
18919
  * primitive_kind: 'block',
18898
- * defined_by: 'specification/portable_text',
18920
+ * defined_by: 'specification/structured_text',
18899
18921
  * since: '2018',
18900
18922
  * }
18901
18923
  */
@@ -18908,7 +18930,7 @@ interface PrimitiveProperties {
18908
18930
  since?: string;
18909
18931
  }
18910
18932
  /** An operating_lifecycle: a canonical, ordered (often cyclic) operating process
18911
- * that many products' journey phases map onto — e.g. Sanity's content-operations
18933
+ * that many products' journey phases map onto — e.g. Nimbus's content-operations
18912
18934
  * lifecycle. Registry-hostable like a `specification`; the cross-product join key
18913
18935
  * that turns per-surface journeys into one operation. Distinct from the per-entity
18914
18936
  * status `lifecycle` grammar concept (this is an entity, not a state machine).
@@ -18916,13 +18938,13 @@ interface PrimitiveProperties {
18916
18938
  * @example
18917
18939
  * const properties: OperatingLifecycleProperties = {
18918
18940
  * cyclic: true,
18919
- * source: 'Sanity official 5-stage content-ops lifecycle',
18941
+ * source: 'a canonical 5-stage content-ops lifecycle',
18920
18942
  * }
18921
18943
  */
18922
18944
  interface OperatingLifecycleProperties {
18923
18945
  /** True if the process loops (e.g. Analyze → Extend → Plan). The sequence is fully expressed by the stages' `stage_order`; `cyclic` adds the wrap from the last stage back to the first. */
18924
18946
  cyclic?: boolean;
18925
- /** Origin of the canonical model (e.g. "Sanity official content-ops lifecycle"). Optional provenance; promote to an edge if it names a real `specification`/`document`. */
18947
+ /** Origin of the canonical model (e.g. "a published content-ops lifecycle"). Optional provenance; promote to an edge if it names a real `specification`/`document`. */
18926
18948
  source?: string;
18927
18949
  }
18928
18950
  /** An operating_stage: one ordered stage of an `operating_lifecycle`. A product's
@@ -22532,7 +22554,7 @@ declare function isCanonical(text: string): boolean;
22532
22554
  * it stamps the `upg_version` field of every `.upg` file written by the SDK.
22533
22555
  * The `check:version-lockstep` gate enforces this at release time.
22534
22556
  */
22535
- declare const UPG_VERSION: "0.23.0";
22557
+ declare const UPG_VERSION: "0.23.2";
22536
22558
  /**
22537
22559
  * The `.upg` JSON document format version. Written to the `upg_version` field.
22538
22560
  * Evolves independently from `UPG_VERSION` (the catalogue version).
package/dist/index.d.ts CHANGED
@@ -1476,6 +1476,7 @@ declare const UPG_EDGE_CATALOG: {
1476
1476
  classification: "hierarchy";
1477
1477
  source_type: string;
1478
1478
  target_type: string;
1479
+ cross_product_eligible: true;
1479
1480
  };
1480
1481
  epic_affected_by_bug: {
1481
1482
  forward_verb: string;
@@ -1483,6 +1484,7 @@ declare const UPG_EDGE_CATALOG: {
1483
1484
  classification: "hierarchy";
1484
1485
  source_type: string;
1485
1486
  target_type: string;
1487
+ cross_product_eligible: true;
1486
1488
  };
1487
1489
  task_has_subtask: {
1488
1490
  forward_verb: string;
@@ -7597,6 +7599,14 @@ declare const UPG_EDGE_CATALOG: {
7597
7599
  target_type: string;
7598
7600
  cross_product_eligible: true;
7599
7601
  };
7602
+ dependency_resolved_by_objective: {
7603
+ forward_verb: string;
7604
+ reverse_verb: string;
7605
+ classification: "cross-domain";
7606
+ source_type: string;
7607
+ target_type: string;
7608
+ cross_product_eligible: true;
7609
+ };
7600
7610
  objective_raises_strategic_question: {
7601
7611
  forward_verb: string;
7602
7612
  reverse_verb: string;
@@ -8202,7 +8212,7 @@ interface UPGPortfolioDocument {
8202
8212
  /**
8203
8213
  * Legacy product-stage aliases (UPG-509 Part 2).
8204
8214
  *
8205
- * Existing graphs (`entopo.upg`, `sanity.upg`, `maximum-minimum.upg`,
8215
+ * Existing graphs (`entopo.upg`, `nimbus.upg`, `maximum-minimum.upg`,
8206
8216
  * `notion-saturated.upg`, etc.) carry `product.stage` values that pre-date
8207
8217
  * the canonical `UPGProductStage` enum
8208
8218
  * (`concept | validation | build | beta | launch | growth | mature |
@@ -8645,7 +8655,7 @@ declare const UPG_DOMAINS: readonly [{
8645
8655
  }, {
8646
8656
  readonly id: "foundations";
8647
8657
  readonly label: "Foundations";
8648
- readonly description: "The shared specifications and foundational primitives a product organisation stewards or implements everywhere. Specifications are governed specs (query languages, protocols, data formats, encodings) like GROQ or Portable Text; primitives are the compositional units those specs define (a block, a reference, a query value). Both are registry-hostable canonicals that products implement, expose, or conform to. Distinct from a product feature: a specification has no single owner, no P&L, and no buyer; it is the rulebook many products point at.";
8658
+ readonly description: "The shared specifications and foundational primitives a product organisation stewards or implements everywhere. Specifications are governed specs (query languages, protocols, data formats, encodings) like NQL or Structured Text; primitives are the compositional units those specs define (a block, a reference, a query value). Both are registry-hostable canonicals that products implement, expose, or conform to. Distinct from a product feature: a specification has no single owner, no P&L, and no buyer; it is the rulebook many products point at.";
8649
8659
  readonly types: readonly ["specification", "primitive", "operating_lifecycle", "operating_stage"];
8650
8660
  }];
8651
8661
  /**
@@ -9839,7 +9849,7 @@ declare function migrateEdge<T extends {
9839
9849
  * type's lifecycle exists but the graph carries pre-canonical status values
9840
9850
  * the lifecycle never had.
9841
9851
  *
9842
- * Source: live drift in `.upg/entopo.upg`, `.upg/sanity.upg`, and
9852
+ * Source: live drift in `.upg/entopo.upg`, `.upg/nimbus.upg`, and
9843
9853
  * `.upg/inkling.upg` surveyed during the v0.5 launch train (UPG-527).
9844
9854
  * Highest single drift class: 173 `service` nodes with `status: "active"`
9845
9855
  * against the canonical `[development, staging, production, deprecated]`
@@ -11466,7 +11476,7 @@ interface CompetitorProperties {
11466
11476
  /**
11467
11477
  * Provenance: where this was observed. A changelog, pricing, or docs URL,
11468
11478
  * an analyst report, or a research note.
11469
- * @example "https://www.contentful.com/pricing/"
11479
+ * @example "https://docs.larch.example/pricing/"
11470
11480
  */
11471
11481
  source?: string;
11472
11482
  /**
@@ -11518,7 +11528,7 @@ interface CompetitorFeatureProperties {
11518
11528
  /**
11519
11529
  * Provenance: where this was observed. A changelog, pricing, or docs URL,
11520
11530
  * an analyst report, or a research note.
11521
- * @example "https://www.contentful.com/changelog/"
11531
+ * @example "https://docs.larch.example/changelog/"
11522
11532
  */
11523
11533
  source?: string;
11524
11534
  /**
@@ -11640,7 +11650,7 @@ interface CompetitiveAnalysisProperties {
11640
11650
  *
11641
11651
  * @example
11642
11652
  * [
11643
- * { axis_a_value_ref: 'val-git-based', axis_b_value_ref: 'val-portable-text',
11653
+ * { axis_a_value_ref: 'val-git-based', axis_b_value_ref: 'val-structured-text',
11644
11654
  * rationale_kind: 'opportunity',
11645
11655
  * rationale_md: 'No technical reason; only adoption inertia. Watching brief.' },
11646
11656
  * { axis_a_value_ref: 'val-composable', axis_b_value_ref: 'val-wysiwyg',
@@ -11658,7 +11668,7 @@ interface CompetitiveAnalysisProperties {
11658
11668
  /**
11659
11669
  * Provenance: where this was observed. A changelog, pricing, or docs URL,
11660
11670
  * an analyst report, or a research note.
11661
- * @example "https://www.contentful.com/changelog/"
11671
+ * @example "https://docs.larch.example/changelog/"
11662
11672
  */
11663
11673
  source?: string;
11664
11674
  /**
@@ -11737,7 +11747,7 @@ interface CompetitorSignalProperties {
11737
11747
  /**
11738
11748
  * Provenance: where this was observed. A changelog, pricing, or docs URL,
11739
11749
  * an analyst report, or a research note.
11740
- * @example "https://www.contentful.com/changelog/"
11750
+ * @example "https://docs.larch.example/changelog/"
11741
11751
  */
11742
11752
  source?: string;
11743
11753
  /**
@@ -11835,6 +11845,18 @@ interface EmptyCell {
11835
11845
  * const properties: ClassificationAxisProperties = {
11836
11846
  * axis_kind: 'categorical',
11837
11847
  * }
11848
+ *
11849
+ * @example
11850
+ * // Canonical governance axis `change_blast_radius` (ordinal): grade a change /
11851
+ * // feature / decision by how much risk it carries, so review ceremony and
11852
+ * // agent-autonomy gating scale with reach. Four ordered values —
11853
+ * // Trivial(0) < Standard(1) < Significant(2) < Critical(3) — classified via the
11854
+ * // polymorphic `node_classified_as_classification_value` edge. Report metrics
11855
+ * // WITHIN tier (pooling across tiers is Simpson's-paradox bait). See
11856
+ * // decisions/2026-07-15-change-blast-radius-axis.md.
11857
+ * const properties: ClassificationAxisProperties = {
11858
+ * axis_kind: 'ordinal',
11859
+ * }
11838
11860
  */
11839
11861
  interface ClassificationAxisProperties {
11840
11862
  /**
@@ -11865,14 +11887,14 @@ interface ClassificationAxisProperties {
11865
11887
  * @example
11866
11888
  * const properties: ClassificationValueProperties = {
11867
11889
  * rationale: 'Composable extends headless with three load-bearing commitments.',
11868
- * exemplars: ['Sanity', 'Contentful', 'Hygraph'],
11890
+ * exemplars: ['Nimbus', 'Larch', 'Prism'],
11869
11891
  * commitments: [
11870
11892
  * { name: 'Typed content graph', description: 'Schemas in code; references as edges.' },
11871
11893
  * { name: 'Real-time backend', description: 'Live queries, CRDT collaboration.' },
11872
11894
  * { name: 'Embeddable studio', description: 'Editor is a library hosted inside the team app.' },
11873
11895
  * ],
11874
11896
  * capabilities: [
11875
- * { surface: 'delivery', bullets: ['GROQ', 'GraphQL', 'REST', 'Live Content API'] },
11897
+ * { surface: 'delivery', bullets: ['NQL', 'GraphQL', 'REST', 'Live Sync API'] },
11876
11898
  * ],
11877
11899
  * }
11878
11900
  */
@@ -11885,7 +11907,7 @@ interface ClassificationValueProperties {
11885
11907
  /**
11886
11908
  * Free-text examples of products occupying this value.
11887
11909
  * For queryable occupancy, prefer `competitor` nodes with `classified_as` edges.
11888
- * @example ['Sanity', 'Contentful', 'Hygraph']
11910
+ * @example ['Nimbus', 'Larch', 'Prism']
11889
11911
  */
11890
11912
  exemplars?: string[];
11891
11913
  /**
@@ -11912,8 +11934,8 @@ interface ClassificationValueProperties {
11912
11934
  *
11913
11935
  * @example
11914
11936
  * [
11915
- * { surface: 'delivery', bullets: ['GROQ', 'GraphQL', 'REST', 'Live Content API', 'Asset CDN'] },
11916
- * { surface: 'extensibility', bullets: ['Custom input components', 'Studio plugins'] },
11937
+ * { surface: 'delivery', bullets: ['NQL', 'GraphQL', 'REST', 'Live Sync API', 'Asset CDN'] },
11938
+ * { surface: 'extensibility', bullets: ['Custom input components', 'editor plugins'] },
11917
11939
  * ]
11918
11940
  */
11919
11941
  capabilities?: Array<ClassificationCapability>;
@@ -18857,9 +18879,9 @@ interface FrameworkExerciseProperties {
18857
18879
  * kind: 'language',
18858
18880
  * language_flavor: 'query',
18859
18881
  * governance: 'open_spec_stewarded',
18860
- * steward: 'Sanity',
18882
+ * steward: 'Nimbus',
18861
18883
  * openness: 'open',
18862
- * spec_url: 'https://sanity.io/docs/groq',
18884
+ * spec_url: 'https://nimbus.example/docs/nql',
18863
18885
  * current_version: '1.0',
18864
18886
  * since: '2019',
18865
18887
  * }
@@ -18889,13 +18911,13 @@ interface SpecificationProperties {
18889
18911
  conformance?: string;
18890
18912
  }
18891
18913
  /** A foundational compositional unit a specification defines: the noun products
18892
- * pass around and compose with (a Portable Text block, a Sanity reference, a
18914
+ * pass around and compose with (a Structured Text block, a typed reference, a
18893
18915
  * Git commit, a Stripe PaymentIntent). Lifecycle-free, like `metric`.
18894
18916
  *
18895
18917
  * @example
18896
18918
  * const properties: PrimitiveProperties = {
18897
18919
  * primitive_kind: 'block',
18898
- * defined_by: 'specification/portable_text',
18920
+ * defined_by: 'specification/structured_text',
18899
18921
  * since: '2018',
18900
18922
  * }
18901
18923
  */
@@ -18908,7 +18930,7 @@ interface PrimitiveProperties {
18908
18930
  since?: string;
18909
18931
  }
18910
18932
  /** An operating_lifecycle: a canonical, ordered (often cyclic) operating process
18911
- * that many products' journey phases map onto — e.g. Sanity's content-operations
18933
+ * that many products' journey phases map onto — e.g. Nimbus's content-operations
18912
18934
  * lifecycle. Registry-hostable like a `specification`; the cross-product join key
18913
18935
  * that turns per-surface journeys into one operation. Distinct from the per-entity
18914
18936
  * status `lifecycle` grammar concept (this is an entity, not a state machine).
@@ -18916,13 +18938,13 @@ interface PrimitiveProperties {
18916
18938
  * @example
18917
18939
  * const properties: OperatingLifecycleProperties = {
18918
18940
  * cyclic: true,
18919
- * source: 'Sanity official 5-stage content-ops lifecycle',
18941
+ * source: 'a canonical 5-stage content-ops lifecycle',
18920
18942
  * }
18921
18943
  */
18922
18944
  interface OperatingLifecycleProperties {
18923
18945
  /** True if the process loops (e.g. Analyze → Extend → Plan). The sequence is fully expressed by the stages' `stage_order`; `cyclic` adds the wrap from the last stage back to the first. */
18924
18946
  cyclic?: boolean;
18925
- /** Origin of the canonical model (e.g. "Sanity official content-ops lifecycle"). Optional provenance; promote to an edge if it names a real `specification`/`document`. */
18947
+ /** Origin of the canonical model (e.g. "a published content-ops lifecycle"). Optional provenance; promote to an edge if it names a real `specification`/`document`. */
18926
18948
  source?: string;
18927
18949
  }
18928
18950
  /** An operating_stage: one ordered stage of an `operating_lifecycle`. A product's
@@ -22532,7 +22554,7 @@ declare function isCanonical(text: string): boolean;
22532
22554
  * it stamps the `upg_version` field of every `.upg` file written by the SDK.
22533
22555
  * The `check:version-lockstep` gate enforces this at release time.
22534
22556
  */
22535
- declare const UPG_VERSION: "0.23.0";
22557
+ declare const UPG_VERSION: "0.23.2";
22536
22558
  /**
22537
22559
  * The `.upg` JSON document format version. Written to the `upg_version` field.
22538
22560
  * Evolves independently from `UPG_VERSION` (the catalogue version).
package/dist/index.js CHANGED
@@ -495,7 +495,7 @@ var UPG_DOMAINS = [
495
495
  {
496
496
  id: "foundations",
497
497
  label: "Foundations",
498
- description: "The shared specifications and foundational primitives a product organisation stewards or implements everywhere. Specifications are governed specs (query languages, protocols, data formats, encodings) like GROQ or Portable Text; primitives are the compositional units those specs define (a block, a reference, a query value). Both are registry-hostable canonicals that products implement, expose, or conform to. Distinct from a product feature: a specification has no single owner, no P&L, and no buyer; it is the rulebook many products point at.",
498
+ description: "The shared specifications and foundational primitives a product organisation stewards or implements everywhere. Specifications are governed specs (query languages, protocols, data formats, encodings) like NQL or Structured Text; primitives are the compositional units those specs define (a block, a reference, a query value). Both are registry-hostable canonicals that products implement, expose, or conform to. Distinct from a product feature: a specification has no single owner, no P&L, and no buyer; it is the rulebook many products point at.",
499
499
  types: ["specification", "primitive", "operating_lifecycle", "operating_stage"]
500
500
  }
501
501
  ];
@@ -1438,8 +1438,14 @@ var UPG_EDGE_CATALOG = {
1438
1438
  // feature-level edges (same verbs/classification), so `pickCanonicalEdge` /
1439
1439
  // `resolveContainmentEdge('epic', 'task'|'bug')` and the adapter import path
1440
1440
  // resolve them with no further wiring.
1441
- epic_decomposes_into_task: { forward_verb: "decomposes_into", reverse_verb: "implements", classification: "hierarchy", source_type: "epic", target_type: "task" },
1442
- epic_affected_by_bug: { forward_verb: "affected_by", reverse_verb: "affects", classification: "hierarchy", source_type: "epic", target_type: "bug" },
1441
+ // cross_product_eligible (feedback 9a10be30): an epic is a cross-team planning
1442
+ // unit — its implementing task or affecting bug may live in a different
1443
+ // product's engineering substrate (e.g. a consumer product's epic whose
1444
+ // backend work is tracked in a separate platform/infra graph). Dual-registered
1445
+ // like the objective↔dependency edges: valid within a product AND across
1446
+ // products (endpoints referenced by qualified id).
1447
+ epic_decomposes_into_task: { forward_verb: "decomposes_into", reverse_verb: "implements", classification: "hierarchy", source_type: "epic", target_type: "task", cross_product_eligible: true },
1448
+ epic_affected_by_bug: { forward_verb: "affected_by", reverse_verb: "affects", classification: "hierarchy", source_type: "epic", target_type: "bug", cross_product_eligible: true },
1443
1449
  task_has_subtask: { forward_verb: "has_subtask", reverse_verb: "is_subtask_of", classification: "hierarchy", source_type: "task", target_type: "task" },
1444
1450
  // ── Planning cadence (0.20.0) ────────────────────────────────────────────────
1445
1451
  // The cadence axis. E1 self-nests the interval (a program-increment contains
@@ -3216,6 +3222,15 @@ var UPG_EDGE_CATALOG = {
3216
3222
  // by another team's graph within the portfolio (0.17.3 locked predicate).
3217
3223
  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 },
3218
3224
  dependency_blocks_objective: { forward_verb: "blocks", reverse_verb: "blocked_by", classification: "cross-domain", source_type: "dependency", target_type: "objective", cross_product_eligible: true },
3225
+ // The RESOLVING side, distinct from the two blocking edges above.
3226
+ // `dependency_blocks_objective` names an objective the dependency holds up (the
3227
+ // waiting side); this names the objective whose completion CLEARS the
3228
+ // dependency (the providing side). In a portfolio, a dependency in one
3229
+ // product's graph points at the objective in another product's graph that
3230
+ // delivers the awaited work, instead of recording it only in the free-text
3231
+ // `resolution` property. cross_product_eligible — the resolving objective
3232
+ // lives in another product's graph.
3233
+ dependency_resolved_by_objective: { forward_verb: "resolved_by", reverse_verb: "resolves", classification: "cross-domain", source_type: "dependency", target_type: "objective", cross_product_eligible: true },
3219
3234
  // objective / initiative → strategic_question. A planning doc's "Risks & Open
3220
3235
  // Questions" section names unresolved coordination questions the plan is
3221
3236
  // exposed to (who owns a capability across teams after a reorg). The
@@ -10476,9 +10491,9 @@ var UPG_PROPERTY_SCHEMA = {
10476
10491
  // ClassificationValueProperties: ClassificationValue: a value on a classification axis.
10477
10492
  classification_value: {
10478
10493
  rationale: { type: "string", description: "Short paragraph: why this value earns its own row/column. Longer narrative belongs in `summary_md` or attached `content_piece` nodes." },
10479
- exemplars: { type: "string[]", description: "Free-text examples of products occupying this value. For queryable occupancy, prefer `competitor` nodes with `classified_as` edges. @example ['Sanity', 'Contentful', 'Hygraph']" },
10494
+ exemplars: { type: "string[]", description: "Free-text examples of products occupying this value. For queryable occupancy, prefer `competitor` nodes with `classified_as` edges. @example ['Nimbus', 'Larch', 'Prism']" },
10480
10495
  commitments: { type: "object[]", description: "The N (typically 2\u20134) load-bearing commitments that define this category. Each commitment is a structural axis; removing it changes the category. Pairs with `capabilities`: commitments are the *load-bearing definition*; capabilities are the *surface offering*. @example [ { name: 'Typed content graph', description: 'Schemas in code; references as edges; content is structured data.' }, { name: 'Real-time backend', description: 'Live queries, CRDT collaboration, sub-second propagation.' }, { name: 'Embeddable studio', description: 'Editor is a library hosted inside the team app, not an external portal.' }, ]" },
10481
- capabilities: { type: "object[]", description: "Structured capability bullets across the six canonical surfaces. Each surface appears at most once per `classification_value`. Pairs with `commitments`: capabilities describe what the category *offers*; commitments describe what *defines* it. @example [ { surface: 'delivery', bullets: ['GROQ', 'GraphQL', 'REST', 'Live Content API', 'Asset CDN'] }, { surface: 'extensibility', bullets: ['Custom input components', 'Studio plugins'] }, ]" }
10496
+ capabilities: { type: "object[]", description: "Structured capability bullets across the six canonical surfaces. Each surface appears at most once per `classification_value`. Pairs with `commitments`: capabilities describe what the category *offers*; commitments describe what *defines* it. @example [ { surface: 'delivery', bullets: ['NQL', 'GraphQL', 'REST', 'Live Sync API', 'Asset CDN'] }, { surface: 'extensibility', bullets: ['Custom input components', 'editor plugins'] }, ]" }
10482
10497
  },
10483
10498
  // CodeRepositoryProperties: Code repository.
10484
10499
  code_repository: {
@@ -10513,9 +10528,9 @@ var UPG_PROPERTY_SCHEMA = {
10513
10528
  analysis_type: { type: "string", enum: ["feature_comparison", "positioning", "swot", "pricing"], description: "Type of analysis. `feature_comparison` = side-by-side matrix. `positioning` = competitor positioning relative to each other. `swot` = strengths, weaknesses, opportunities, threats. `pricing` = pricing structure comparison." },
10514
10529
  analysis_date: { type: "string", description: 'ISO date conducted. Competitive intelligence decays quickly; track snapshot age. @example "2026-03-15"' },
10515
10530
  framework_id: { type: "string", description: 'Framework ID (references `UPGFramework.id`). @example "porter-five-forces", "swot-analysis", "competitive-matrix"' },
10516
- empty_cells: { type: "object[]", description: "Empty cells in a 2-axis classification matrix that earn explicit commentary. Only the strategically interesting cells. Opportunity-kind cells are the most valuable; they identify unoccupied strategic space. Each entry references two `classification_value` nodes by id (one from each `classification_axis` child of this `competitive_analysis`). `validate_graph` enforces that the refs resolve to `classification_value` nodes whose parents are distinct `classification_axis` instances. See `ClassificationValueProperties.commitments` for the inverse \"occupied cell\" structural-definition shape. @example [ { axis_a_value_ref: 'val-git-based', axis_b_value_ref: 'val-portable-text', rationale_kind: 'opportunity', rationale_md: 'No technical reason; only adoption inertia. Watching brief.' }, { axis_a_value_ref: 'val-composable', axis_b_value_ref: 'val-wysiwyg', rationale_kind: 'structural', rationale_md: 'Composable rejects HTML blobs; WYSIWYG requires them.' }, ]" },
10531
+ empty_cells: { type: "object[]", description: "Empty cells in a 2-axis classification matrix that earn explicit commentary. Only the strategically interesting cells. Opportunity-kind cells are the most valuable; they identify unoccupied strategic space. Each entry references two `classification_value` nodes by id (one from each `classification_axis` child of this `competitive_analysis`). `validate_graph` enforces that the refs resolve to `classification_value` nodes whose parents are distinct `classification_axis` instances. See `ClassificationValueProperties.commitments` for the inverse \"occupied cell\" structural-definition shape. @example [ { axis_a_value_ref: 'val-git-based', axis_b_value_ref: 'val-structured-text', rationale_kind: 'opportunity', rationale_md: 'No technical reason; only adoption inertia. Watching brief.' }, { axis_a_value_ref: 'val-composable', axis_b_value_ref: 'val-wysiwyg', rationale_kind: 'structural', rationale_md: 'Composable rejects HTML blobs; WYSIWYG requires them.' }, ]" },
10517
10532
  last_updated: { type: "string", description: 'Provenance: ISO date-time this record was last observed or refreshed. Distinct from `analysis_date` (when the analysis was conducted). @example "2026-06-13"' },
10518
- source: { type: "string", description: 'Provenance: where this was observed. A changelog, pricing, or docs URL, an analyst report, or a research note. @example "https://www.contentful.com/changelog/"' },
10533
+ source: { type: "string", description: 'Provenance: where this was observed. A changelog, pricing, or docs URL, an analyst report, or a research note. @example "https://docs.larch.example/changelog/"' },
10519
10534
  confidence: {
10520
10535
  type: "assessment",
10521
10536
  scale_id: "confidence_5",
@@ -10543,7 +10558,7 @@ var UPG_PROPERTY_SCHEMA = {
10543
10558
  strengths: { type: "string[]", description: "Bulleted factual strengths. Each item is a short statement, not prose. @example ['Real-time multiplayer canvas', 'Generous free tier']" },
10544
10559
  weaknesses: { type: "string[]", description: "Bulleted factual weaknesses: gaps, friction, or capabilities materially below market. @example ['Weak API query capabilities', 'No mobile companion']" },
10545
10560
  last_updated: { type: "string", description: 'Provenance: ISO date-time this record was last observed or refreshed. Lets a stale record be told apart from a fresh one. @example "2026-06-13"' },
10546
- source: { type: "string", description: 'Provenance: where this was observed. A changelog, pricing, or docs URL, an analyst report, or a research note. @example "https://www.contentful.com/pricing/"' },
10561
+ source: { type: "string", description: 'Provenance: where this was observed. A changelog, pricing, or docs URL, an analyst report, or a research note. @example "https://docs.larch.example/pricing/"' },
10547
10562
  confidence: {
10548
10563
  type: "assessment",
10549
10564
  scale_id: "confidence_5",
@@ -10565,7 +10580,7 @@ var UPG_PROPERTY_SCHEMA = {
10565
10580
  quality: { type: "string", enum: ["better", "same", "worse", "missing"], description: "Quality comparison. `better` = ours is meaningfully superior. `same` = roughly equivalent. `worse` = theirs is meaningfully superior. `missing` = we have no equivalent." },
10566
10581
  parity_status: { type: "string", enum: ["ahead", "behind", "parity", "unique_to_us", "unique_to_them"], description: "Parity. More granular than `quality`; captures whether the gap is offensive or defensive. `ahead` = we lead. `behind` = they lead. `parity` = equivalent. `unique_to_us` / `unique_to_them` = only one side offers it." },
10567
10582
  last_updated: { type: "string", description: 'ISO date this assessment was last updated. Competitor feature landscapes change quickly. @example "2026-02-15"' },
10568
- source: { type: "string", description: 'Provenance: where this was observed. A changelog, pricing, or docs URL, an analyst report, or a research note. @example "https://www.contentful.com/changelog/"' },
10583
+ source: { type: "string", description: 'Provenance: where this was observed. A changelog, pricing, or docs URL, an analyst report, or a research note. @example "https://docs.larch.example/changelog/"' },
10569
10584
  confidence: {
10570
10585
  type: "assessment",
10571
10586
  scale_id: "confidence_5",
@@ -10591,7 +10606,7 @@ var UPG_PROPERTY_SCHEMA = {
10591
10606
  from_value: { type: "string", description: "Reclassification only. The prior `classification_value` id the competitor was classified as before this move (the superseded cell). Absent for a first-time classification (nothing was superseded)." },
10592
10607
  to_value: { type: "string", description: "Reclassification only. The new `classification_value` id the competitor is classified as after this move (the cell the new classify edge points at)." },
10593
10608
  last_updated: { type: "string", description: 'Provenance: ISO date-time this record was last observed or refreshed. @example "2026-06-13"' },
10594
- source: { type: "string", description: 'Provenance: where this was observed. A changelog, pricing, or docs URL, an analyst report, or a research note. @example "https://www.contentful.com/changelog/"' },
10609
+ source: { type: "string", description: 'Provenance: where this was observed. A changelog, pricing, or docs URL, an analyst report, or a research note. @example "https://docs.larch.example/changelog/"' },
10595
10610
  confidence: {
10596
10611
  type: "assessment",
10597
10612
  scale_id: "confidence_5",
@@ -12022,7 +12037,7 @@ var UPG_PROPERTY_SCHEMA = {
12022
12037
  // OperatingLifecycleProperties: An operating_lifecycle: a canonical, ordered (often cyclic) operating process
12023
12038
  operating_lifecycle: {
12024
12039
  cyclic: { type: "boolean", description: "True if the process loops (e.g. Analyze \u2192 Extend \u2192 Plan). The sequence is fully expressed by the stages' `stage_order`; `cyclic` adds the wrap from the last stage back to the first." },
12025
- source: { type: "string", description: 'Origin of the canonical model (e.g. "Sanity official content-ops lifecycle"). Optional provenance; promote to an edge if it names a real `specification`/`document`.' }
12040
+ source: { type: "string", description: 'Origin of the canonical model (e.g. "a published content-ops lifecycle"). Optional provenance; promote to an edge if it names a real `specification`/`document`.' }
12026
12041
  },
12027
12042
  // OperatingStageProperties: An operating_stage: one ordered stage of an `operating_lifecycle`. A product's
12028
12043
  operating_stage: {
@@ -29712,7 +29727,7 @@ function isCanonical(text) {
29712
29727
  }
29713
29728
 
29714
29729
  // src/index.ts
29715
- var UPG_VERSION = "0.23.0";
29730
+ var UPG_VERSION = "0.23.2";
29716
29731
  var UPG_FORMAT_VERSION = "0.4.0";
29717
29732
  var MARKDOWN_FORMAT_VERSION = "0.1";
29718
29733
  var UPG_TYPES = getTypes();