@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/README.md +1 -1
- package/dist/index.cjs +27 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +43 -21
- package/dist/index.d.ts +43 -21
- package/dist/index.js +27 -12
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/spec/examples/cms-field-guide.upg +24 -24
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`, `
|
|
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
|
|
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/
|
|
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://
|
|
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://
|
|
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-
|
|
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://
|
|
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://
|
|
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: ['
|
|
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: ['
|
|
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 ['
|
|
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: ['
|
|
11916
|
-
* { surface: 'extensibility', bullets: ['Custom input components', '
|
|
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: '
|
|
18882
|
+
* steward: 'Nimbus',
|
|
18861
18883
|
* openness: 'open',
|
|
18862
|
-
* spec_url: 'https://
|
|
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
|
|
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/
|
|
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.
|
|
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: '
|
|
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. "
|
|
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.
|
|
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`, `
|
|
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
|
|
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/
|
|
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://
|
|
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://
|
|
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-
|
|
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://
|
|
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://
|
|
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: ['
|
|
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: ['
|
|
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 ['
|
|
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: ['
|
|
11916
|
-
* { surface: 'extensibility', bullets: ['Custom input components', '
|
|
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: '
|
|
18882
|
+
* steward: 'Nimbus',
|
|
18861
18883
|
* openness: 'open',
|
|
18862
|
-
* spec_url: 'https://
|
|
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
|
|
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/
|
|
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.
|
|
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: '
|
|
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. "
|
|
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.
|
|
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
|
|
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
|
-
|
|
1442
|
-
|
|
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 ['
|
|
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: ['
|
|
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-
|
|
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://
|
|
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://
|
|
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://
|
|
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://
|
|
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. "
|
|
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.
|
|
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();
|