@unified-product-graph/core 0.12.3 → 0.12.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.cjs +329 -37
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +52 -40
- package/dist/index.d.ts +52 -40
- package/dist/index.js +328 -37
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -27,6 +27,7 @@ __export(index_exports, {
|
|
|
27
27
|
CLASSIFICATION_EDGE_PROPERTY_SCHEMA: () => CLASSIFICATION_EDGE_PROPERTY_SCHEMA,
|
|
28
28
|
CONTENT_DEPTH_WARNING_RULES: () => CONTENT_DEPTH_WARNING_RULES,
|
|
29
29
|
DEFAULT_ENTITY_EMOJI: () => DEFAULT_ENTITY_EMOJI,
|
|
30
|
+
DEFERRED_PROPOSED_BY_CONTRACT: () => DEFERRED_PROPOSED_BY_CONTRACT,
|
|
30
31
|
DISCOVERY_RESEARCH_VALIDATION_PLAYBOOK: () => DISCOVERY_RESEARCH_VALIDATION_PLAYBOOK,
|
|
31
32
|
ENGINEERING_PLATFORM_PLAYBOOK: () => ENGINEERING_PLATFORM_PLAYBOOK,
|
|
32
33
|
ENTITY_EMOJI: () => ENTITY_EMOJI,
|
|
@@ -1168,6 +1169,13 @@ var UPG_ENTITY_META = [
|
|
|
1168
1169
|
{ name: "workspace", type_id: "ent_328", maturity: "proposed", since: "0.2.0" },
|
|
1169
1170
|
{ name: "framework_exercise", type_id: "ent_350", maturity: "proposed", since: "0.8.4" }
|
|
1170
1171
|
];
|
|
1172
|
+
var DEFERRED_PROPOSED_BY_CONTRACT = {
|
|
1173
|
+
user_story: "UPG-571: frozen proposed by the v0.7.0 re-canon contract (story_statement to user_story); user-story-split.test.ts asserts the invariant.",
|
|
1174
|
+
experiment_run: "UPG-664: the optional multi-run / replication child; experiment_plan graduated to stable, the run stays proposed.",
|
|
1175
|
+
ai_experiment: "UPG-665: AI prompt/model restructure (open ADR).",
|
|
1176
|
+
ai_dataset: "UPG-665: AI prompt/model restructure (open ADR).",
|
|
1177
|
+
ai_trace: "UPG-665: AI prompt/model restructure (open ADR)."
|
|
1178
|
+
};
|
|
1171
1179
|
var UPG_ENTITY_META_BY_NAME = new Map(
|
|
1172
1180
|
UPG_ENTITY_META.map((m) => [m.name, m])
|
|
1173
1181
|
);
|
|
@@ -3338,7 +3346,8 @@ var UPG_CROSS_EDGE_TYPES = [
|
|
|
3338
3346
|
"competitor_signal_surfaces_opportunity",
|
|
3339
3347
|
"competitor_classified_as_classification_value",
|
|
3340
3348
|
"node_classified_as_classification_value",
|
|
3341
|
-
"journey_phase_realises_operating_stage"
|
|
3349
|
+
"journey_phase_realises_operating_stage",
|
|
3350
|
+
"screen_markets_product"
|
|
3342
3351
|
];
|
|
3343
3352
|
var REGISTRY_PRODUCT_ID = "registry";
|
|
3344
3353
|
|
|
@@ -8642,6 +8651,288 @@ var UPG_SCALAR_TO_EDGE_MIGRATIONS = {
|
|
|
8642
8651
|
drop_scalar: true,
|
|
8643
8652
|
reason: "P14 shadow: the subscription_subscribes_to_pricing_tier edge already exists. Backfill the plan as a pricing_tier edge, then drop the name string."
|
|
8644
8653
|
}
|
|
8654
|
+
],
|
|
8655
|
+
"0.12.4": [
|
|
8656
|
+
// ── Bucket B — actor-as-string (ADDITIVE: add the ownership edge, KEEP the display string) ──
|
|
8657
|
+
// Per the scalar-vs-edge ADR display-cache rule (2026-06-16) and T3.1 (reuse the
|
|
8658
|
+
// polymorphic node_owned_by_* family; do NOT mint typed actor edges). `drop_scalar`
|
|
8659
|
+
// is FALSE for every entry: the string stays as a human-readable display-cache, and
|
|
8660
|
+
// the edge makes "everything owned by X" queryable across instances. OPT-IN — consumers
|
|
8661
|
+
// run promote_scalars_to_edges when they want the edges; nothing is forced on upgrade.
|
|
8662
|
+
// person-vs-team is the field-level call (ratified 2026-06-16): org units + durable
|
|
8663
|
+
// platform/components → team (9); work items, authored artifacts, and DRIs → person.
|
|
8664
|
+
// Two single-string participant fields (threat_model.participants, ceremony.participants)
|
|
8665
|
+
// are intentionally NOT here: a free-text name list cannot be promoted to one edge
|
|
8666
|
+
// without guessing — they are re-doc'd as display-cache only.
|
|
8667
|
+
// ── owned by a team (org units + durable platform/components) ──
|
|
8668
|
+
{
|
|
8669
|
+
from_type: "feature_area",
|
|
8670
|
+
scalar_property: "owner",
|
|
8671
|
+
target_type: "team",
|
|
8672
|
+
edge_type: "node_owned_by_team",
|
|
8673
|
+
drop_scalar: false,
|
|
8674
|
+
reason: 'P14 actor: a feature area is owned by a team; link node_owned_by_team so "everything this team owns" is queryable. Display string kept as a cache.'
|
|
8675
|
+
},
|
|
8676
|
+
{
|
|
8677
|
+
from_type: "bounded_context",
|
|
8678
|
+
scalar_property: "team_owner",
|
|
8679
|
+
target_type: "team",
|
|
8680
|
+
edge_type: "node_owned_by_team",
|
|
8681
|
+
drop_scalar: false,
|
|
8682
|
+
reason: "P14 actor: the owning team is a first-class entity; link node_owned_by_team. Display string kept as a cache."
|
|
8683
|
+
},
|
|
8684
|
+
{
|
|
8685
|
+
from_type: "service",
|
|
8686
|
+
scalar_property: "owner",
|
|
8687
|
+
target_type: "team",
|
|
8688
|
+
edge_type: "node_owned_by_team",
|
|
8689
|
+
drop_scalar: false,
|
|
8690
|
+
reason: "P14 actor: Backstage-style service ownership rolls up by team; link node_owned_by_team. Display string kept as a cache."
|
|
8691
|
+
},
|
|
8692
|
+
{
|
|
8693
|
+
from_type: "product_area",
|
|
8694
|
+
scalar_property: "owner",
|
|
8695
|
+
target_type: "team",
|
|
8696
|
+
edge_type: "node_owned_by_team",
|
|
8697
|
+
drop_scalar: false,
|
|
8698
|
+
reason: "P14 actor: a product area is an org unit owned by a team; link node_owned_by_team. Display string kept as a cache."
|
|
8699
|
+
},
|
|
8700
|
+
{
|
|
8701
|
+
from_type: "api_contract",
|
|
8702
|
+
scalar_property: "owner",
|
|
8703
|
+
target_type: "team",
|
|
8704
|
+
edge_type: "node_owned_by_team",
|
|
8705
|
+
drop_scalar: false,
|
|
8706
|
+
reason: "P14 actor: an API contract is a service-interface component owned by the team that owns the service (Backstage); link node_owned_by_team. Display string kept as a cache."
|
|
8707
|
+
},
|
|
8708
|
+
{
|
|
8709
|
+
from_type: "database_schema",
|
|
8710
|
+
scalar_property: "owner",
|
|
8711
|
+
target_type: "team",
|
|
8712
|
+
edge_type: "node_owned_by_team",
|
|
8713
|
+
drop_scalar: false,
|
|
8714
|
+
reason: "P14 actor: a database schema is a data component owned by the team responsible for it; link node_owned_by_team. Display string kept as a cache."
|
|
8715
|
+
},
|
|
8716
|
+
{
|
|
8717
|
+
from_type: "design_system",
|
|
8718
|
+
scalar_property: "maintainer",
|
|
8719
|
+
target_type: "team",
|
|
8720
|
+
edge_type: "node_owned_by_team",
|
|
8721
|
+
drop_scalar: false,
|
|
8722
|
+
reason: "P14 actor: a design system is a shared platform maintained by a team; link node_owned_by_team. Display string kept as a cache."
|
|
8723
|
+
},
|
|
8724
|
+
{
|
|
8725
|
+
from_type: "service_level_agreement",
|
|
8726
|
+
scalar_property: "owner",
|
|
8727
|
+
target_type: "team",
|
|
8728
|
+
edge_type: "node_owned_by_team",
|
|
8729
|
+
drop_scalar: false,
|
|
8730
|
+
reason: "P14 actor: an SLA is a service-provider-side commitment owned by a team; link node_owned_by_team. Display string kept as a cache."
|
|
8731
|
+
},
|
|
8732
|
+
{
|
|
8733
|
+
from_type: "key_activity",
|
|
8734
|
+
scalar_property: "operational_owner",
|
|
8735
|
+
target_type: "team",
|
|
8736
|
+
edge_type: "node_owned_by_team",
|
|
8737
|
+
drop_scalar: false,
|
|
8738
|
+
reason: "P14 actor: the operationally accountable owner of a recurring activity is a team; link node_owned_by_team. Display string kept as a cache."
|
|
8739
|
+
},
|
|
8740
|
+
// ── owned by a person (DRIs, work items, authored artifacts; the string is a name, handle, or email) ──
|
|
8741
|
+
{
|
|
8742
|
+
from_type: "strategic_theme",
|
|
8743
|
+
scalar_property: "owner",
|
|
8744
|
+
target_type: "person",
|
|
8745
|
+
edge_type: "node_owned_by_person",
|
|
8746
|
+
drop_scalar: false,
|
|
8747
|
+
reason: "P14 actor: the theme owner is a first-class person; link node_owned_by_person so cross-theme ownership is queryable. Display string kept."
|
|
8748
|
+
},
|
|
8749
|
+
{
|
|
8750
|
+
from_type: "initiative",
|
|
8751
|
+
scalar_property: "owner",
|
|
8752
|
+
target_type: "person",
|
|
8753
|
+
edge_type: "node_owned_by_person",
|
|
8754
|
+
drop_scalar: false,
|
|
8755
|
+
reason: "P14 actor: the initiative owner is a first-class person; link node_owned_by_person. Display string kept."
|
|
8756
|
+
},
|
|
8757
|
+
{
|
|
8758
|
+
from_type: "strategic_pillar",
|
|
8759
|
+
scalar_property: "owner",
|
|
8760
|
+
target_type: "person",
|
|
8761
|
+
edge_type: "node_owned_by_person",
|
|
8762
|
+
drop_scalar: false,
|
|
8763
|
+
reason: "P14 actor: the pillar owner is a first-class person; link node_owned_by_person. Display string kept."
|
|
8764
|
+
},
|
|
8765
|
+
{
|
|
8766
|
+
from_type: "metric",
|
|
8767
|
+
scalar_property: "owner",
|
|
8768
|
+
target_type: "person",
|
|
8769
|
+
edge_type: "node_owned_by_person",
|
|
8770
|
+
drop_scalar: false,
|
|
8771
|
+
reason: 'P14 actor: the metric owner is a first-class person ("every metric this person owns"); link node_owned_by_person. Display string kept.'
|
|
8772
|
+
},
|
|
8773
|
+
{
|
|
8774
|
+
from_type: "data_domain",
|
|
8775
|
+
scalar_property: "steward",
|
|
8776
|
+
target_type: "person",
|
|
8777
|
+
edge_type: "node_owned_by_person",
|
|
8778
|
+
drop_scalar: false,
|
|
8779
|
+
reason: "P14 actor: the data steward is a first-class person; link node_owned_by_person. Display string kept."
|
|
8780
|
+
},
|
|
8781
|
+
{
|
|
8782
|
+
from_type: "partnership",
|
|
8783
|
+
scalar_property: "owner",
|
|
8784
|
+
target_type: "person",
|
|
8785
|
+
edge_type: "node_owned_by_person",
|
|
8786
|
+
drop_scalar: false,
|
|
8787
|
+
reason: "P14 actor: the partnership owner is a first-class person; link node_owned_by_person. Display string kept."
|
|
8788
|
+
},
|
|
8789
|
+
{
|
|
8790
|
+
from_type: "key_resource",
|
|
8791
|
+
scalar_property: "owner",
|
|
8792
|
+
target_type: "person",
|
|
8793
|
+
edge_type: "node_owned_by_person",
|
|
8794
|
+
drop_scalar: false,
|
|
8795
|
+
reason: "P14 actor: the resource owner is a first-class person; link node_owned_by_person. Display string kept."
|
|
8796
|
+
},
|
|
8797
|
+
{
|
|
8798
|
+
from_type: "document",
|
|
8799
|
+
scalar_property: "author",
|
|
8800
|
+
target_type: "person",
|
|
8801
|
+
edge_type: "node_owned_by_person",
|
|
8802
|
+
drop_scalar: false,
|
|
8803
|
+
reason: 'P14 actor: the author is a first-class person ("every document by this author"); link node_owned_by_person. Display string kept.'
|
|
8804
|
+
},
|
|
8805
|
+
{
|
|
8806
|
+
from_type: "outcome",
|
|
8807
|
+
scalar_property: "owner",
|
|
8808
|
+
target_type: "person",
|
|
8809
|
+
edge_type: "node_owned_by_person",
|
|
8810
|
+
drop_scalar: false,
|
|
8811
|
+
reason: "P14 actor: the outcome owner is a first-class person; link node_owned_by_person. Display string kept."
|
|
8812
|
+
},
|
|
8813
|
+
{
|
|
8814
|
+
from_type: "feature",
|
|
8815
|
+
scalar_property: "owner",
|
|
8816
|
+
target_type: "person",
|
|
8817
|
+
edge_type: "node_owned_by_person",
|
|
8818
|
+
drop_scalar: false,
|
|
8819
|
+
reason: "P14 actor: the feature owner is a first-class person; link node_owned_by_person. Display string kept."
|
|
8820
|
+
},
|
|
8821
|
+
{
|
|
8822
|
+
from_type: "epic",
|
|
8823
|
+
scalar_property: "owner",
|
|
8824
|
+
target_type: "person",
|
|
8825
|
+
edge_type: "node_owned_by_person",
|
|
8826
|
+
drop_scalar: false,
|
|
8827
|
+
reason: "P14 actor: the epic owner is a first-class person; link node_owned_by_person. Display string kept."
|
|
8828
|
+
},
|
|
8829
|
+
{
|
|
8830
|
+
from_type: "release",
|
|
8831
|
+
scalar_property: "owner",
|
|
8832
|
+
target_type: "person",
|
|
8833
|
+
edge_type: "node_owned_by_person",
|
|
8834
|
+
drop_scalar: false,
|
|
8835
|
+
reason: "P14 actor: the release owner is a first-class person; link node_owned_by_person. Display string kept."
|
|
8836
|
+
},
|
|
8837
|
+
{
|
|
8838
|
+
from_type: "task",
|
|
8839
|
+
scalar_property: "assignee",
|
|
8840
|
+
target_type: "person",
|
|
8841
|
+
edge_type: "node_owned_by_person",
|
|
8842
|
+
drop_scalar: false,
|
|
8843
|
+
reason: 'P14 actor: the assignee is a first-class person ("every task assigned to this person"); link node_owned_by_person. Display string kept.'
|
|
8844
|
+
},
|
|
8845
|
+
{
|
|
8846
|
+
from_type: "bug",
|
|
8847
|
+
scalar_property: "assignee",
|
|
8848
|
+
target_type: "person",
|
|
8849
|
+
edge_type: "node_owned_by_person",
|
|
8850
|
+
drop_scalar: false,
|
|
8851
|
+
reason: "P14 actor: the assignee is a first-class person; link node_owned_by_person. Display string kept."
|
|
8852
|
+
},
|
|
8853
|
+
{
|
|
8854
|
+
from_type: "roadmap",
|
|
8855
|
+
scalar_property: "owner",
|
|
8856
|
+
target_type: "person",
|
|
8857
|
+
edge_type: "node_owned_by_person",
|
|
8858
|
+
drop_scalar: false,
|
|
8859
|
+
reason: "P14 actor: the roadmap owner is a first-class person; link node_owned_by_person. Display string kept."
|
|
8860
|
+
},
|
|
8861
|
+
{
|
|
8862
|
+
from_type: "journey_step",
|
|
8863
|
+
scalar_property: "owner",
|
|
8864
|
+
target_type: "person",
|
|
8865
|
+
edge_type: "node_owned_by_person",
|
|
8866
|
+
drop_scalar: false,
|
|
8867
|
+
reason: "P14 actor: the journey-step owner is a first-class person; link node_owned_by_person. Display string kept."
|
|
8868
|
+
},
|
|
8869
|
+
{
|
|
8870
|
+
from_type: "design_concept",
|
|
8871
|
+
scalar_property: "owner",
|
|
8872
|
+
target_type: "person",
|
|
8873
|
+
edge_type: "node_owned_by_person",
|
|
8874
|
+
drop_scalar: false,
|
|
8875
|
+
reason: "P14 actor: the design-concept owner is a first-class person; link node_owned_by_person. Display string kept."
|
|
8876
|
+
},
|
|
8877
|
+
{
|
|
8878
|
+
from_type: "technical_debt_item",
|
|
8879
|
+
scalar_property: "owner",
|
|
8880
|
+
target_type: "person",
|
|
8881
|
+
edge_type: "node_owned_by_person",
|
|
8882
|
+
drop_scalar: false,
|
|
8883
|
+
reason: "P14 actor: the debt-item owner is a first-class person; link node_owned_by_person. Display string kept."
|
|
8884
|
+
},
|
|
8885
|
+
{
|
|
8886
|
+
from_type: "feature_flag",
|
|
8887
|
+
scalar_property: "owner",
|
|
8888
|
+
target_type: "person",
|
|
8889
|
+
edge_type: "node_owned_by_person",
|
|
8890
|
+
drop_scalar: false,
|
|
8891
|
+
reason: "P14 actor: the flag owner is a first-class person; link node_owned_by_person. Display string kept."
|
|
8892
|
+
},
|
|
8893
|
+
{
|
|
8894
|
+
from_type: "deployment",
|
|
8895
|
+
scalar_property: "deployer",
|
|
8896
|
+
target_type: "person",
|
|
8897
|
+
edge_type: "node_owned_by_person",
|
|
8898
|
+
drop_scalar: false,
|
|
8899
|
+
reason: 'P14 actor: the deployer is a first-class person ("every deployment by this person"); link node_owned_by_person. Display string kept.'
|
|
8900
|
+
},
|
|
8901
|
+
{
|
|
8902
|
+
from_type: "investigation",
|
|
8903
|
+
scalar_property: "lead_investigator",
|
|
8904
|
+
target_type: "person",
|
|
8905
|
+
edge_type: "node_owned_by_person",
|
|
8906
|
+
drop_scalar: false,
|
|
8907
|
+
reason: "P14 actor: the lead investigator is a first-class person; link node_owned_by_person. Display string kept."
|
|
8908
|
+
},
|
|
8909
|
+
{
|
|
8910
|
+
from_type: "department",
|
|
8911
|
+
scalar_property: "leader",
|
|
8912
|
+
target_type: "person",
|
|
8913
|
+
edge_type: "node_owned_by_person",
|
|
8914
|
+
drop_scalar: false,
|
|
8915
|
+
reason: "P14 actor: the department leader is a first-class person; link node_owned_by_person. Display string kept."
|
|
8916
|
+
},
|
|
8917
|
+
// ── owned by people (multi: string[] of names) ──
|
|
8918
|
+
{
|
|
8919
|
+
from_type: "decision",
|
|
8920
|
+
scalar_property: "decision_makers",
|
|
8921
|
+
target_type: "person",
|
|
8922
|
+
edge_type: "node_owned_by_person",
|
|
8923
|
+
multi: true,
|
|
8924
|
+
drop_scalar: false,
|
|
8925
|
+
reason: "P14 actor: each decision-maker is a first-class person; one node_owned_by_person edge per name. Display list kept as a cache."
|
|
8926
|
+
},
|
|
8927
|
+
{
|
|
8928
|
+
from_type: "review_gate",
|
|
8929
|
+
scalar_property: "required_approvers",
|
|
8930
|
+
target_type: "person",
|
|
8931
|
+
edge_type: "node_owned_by_person",
|
|
8932
|
+
multi: true,
|
|
8933
|
+
drop_scalar: false,
|
|
8934
|
+
reason: "P14 actor: each required approver is a first-class person; one node_owned_by_person edge per name. Display list kept as a cache."
|
|
8935
|
+
}
|
|
8645
8936
|
]
|
|
8646
8937
|
};
|
|
8647
8938
|
function getScalarToEdgeMigrations(fromVersion, toVersion) {
|
|
@@ -9893,7 +10184,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
9893
10184
|
spec_url: { type: "string", description: "URL of the specification document" },
|
|
9894
10185
|
protocol: { type: "string", enum: ["REST", "GraphQL", "gRPC", "AsyncAPI", "SOAP", "WebSocket", "MQTT", "SSE", "other"], description: "Communication protocol. `SSE` (server-sent events) added in 0.9.12." },
|
|
9895
10186
|
version: { type: "string", description: "API version" },
|
|
9896
|
-
owner: { type: "string", description: "Maintaining person or team." }
|
|
10187
|
+
owner: { type: "string", description: "Maintaining person or team. Promote to a `node_owned_by_team` edge if ownership must be queryable." }
|
|
9897
10188
|
},
|
|
9898
10189
|
// ApiEcosystemProperties: API ecosystem.
|
|
9899
10190
|
api_ecosystem: {
|
|
@@ -9974,7 +10265,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
9974
10265
|
},
|
|
9975
10266
|
// BoundedContextProperties: DDD bounded context.
|
|
9976
10267
|
bounded_context: {
|
|
9977
|
-
team_owner: { type: "string", description: "Owning team" },
|
|
10268
|
+
team_owner: { type: "string", description: "Owning team. Promote to a `node_owned_by_team` edge if ownership must be queryable." },
|
|
9978
10269
|
tech_stack: { type: "string[]", description: "Technologies used within this context" },
|
|
9979
10270
|
ubiquitous_language: { type: "string", description: "Key terms and their definitions" }
|
|
9980
10271
|
},
|
|
@@ -10063,7 +10354,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10063
10354
|
steps_to_reproduce: { type: "string", description: "Step-by-step reproduction" },
|
|
10064
10355
|
environment: { type: "string", description: 'Observed environment (e.g. "prod", "staging", "iOS 17.4")' },
|
|
10065
10356
|
priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Urgency relative to other work. Independent of `bug_severity` (a critical bug can have low priority if rare)." },
|
|
10066
|
-
assignee: { type: "string", description: "Assigned person" },
|
|
10357
|
+
assignee: { type: "string", description: "Assigned person. Promote to a `node_owned_by_person` edge if ownership must be queryable." },
|
|
10067
10358
|
due_date: { type: "string", description: "ISO date due. Often tied to a release gate or SLA." },
|
|
10068
10359
|
labels: { type: "string[]", description: "Free-form classification tags. Applied uniformly across work item types." }
|
|
10069
10360
|
},
|
|
@@ -10103,7 +10394,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10103
10394
|
ceremony_type: { type: "string", enum: ["standup", "planning", "review", "retro", "sync", "demo", "other"], description: "Kind of recurring meeting" },
|
|
10104
10395
|
cadence: { type: "string", enum: ["continuous", "hourly", "daily", "weekly", "monthly", "quarterly", "yearly", "on_demand", "other"], description: "How often the ceremony occurs. Uses the shared `Cadence` scale." },
|
|
10105
10396
|
duration_minutes: { type: "number", description: "Typical duration of the meeting in minutes" },
|
|
10106
|
-
participants: { type: "string", description: "People or roles who attend" }
|
|
10397
|
+
participants: { type: "string", description: "People or roles who attend. Promote individuals to `node_owned_by_person` edges if participation must be queryable." }
|
|
10107
10398
|
},
|
|
10108
10399
|
// CertificationProperties: Certification.
|
|
10109
10400
|
certification: {
|
|
@@ -10433,7 +10724,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10433
10724
|
},
|
|
10434
10725
|
// DataDomainProperties: DataDomain. A coarse-grained grouping of related data assets (sources,
|
|
10435
10726
|
data_domain: {
|
|
10436
|
-
steward: { type: "string", description: "Accountable person or team" },
|
|
10727
|
+
steward: { type: "string", description: "Accountable person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable." },
|
|
10437
10728
|
domain_type: { type: "string", enum: ["master", "operational", "analytical", "reference"], description: "Domain contents classification. `master` = canonical entity data (customers, products). `operational` = live transactional data. `analytical` = warehouse / BI data. `reference` = slow-changing lookup data." },
|
|
10438
10729
|
sensitivity: { type: "string", enum: ["public", "internal", "confidential", "restricted"], description: "Sensitivity band applied across the domain" }
|
|
10439
10730
|
},
|
|
@@ -10499,7 +10790,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10499
10790
|
db_type: { type: "string", enum: ["postgres", "mysql", "mongodb", "redis", "other"], description: "Engine" },
|
|
10500
10791
|
schema_version: { type: "string", description: "Current schema version" },
|
|
10501
10792
|
migration_status: { type: "string", enum: ["current", "pending", "failed"], description: "Pending-migration status" },
|
|
10502
|
-
owner: { type: "string", description: "Owning person or team responsible for design and migrations." },
|
|
10793
|
+
owner: { type: "string", description: "Owning person or team responsible for design and migrations. Promote to a `node_owned_by_team` edge if ownership must be queryable." },
|
|
10503
10794
|
table_count: { type: "number", description: "Tables or collections in this schema. Useful for migration scope estimation." }
|
|
10504
10795
|
},
|
|
10505
10796
|
// DealProperties: Deal.
|
|
@@ -10517,7 +10808,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10517
10808
|
date: { type: "string", description: "ISO date the decision was made or last meaningfully updated." },
|
|
10518
10809
|
decision_outcome: { type: "string", description: "Outcome text. What was decided. Separate from `rationale` (which explains why)." },
|
|
10519
10810
|
consequences: { type: "string", description: `Known positive and negative consequences. Mirrors MADR's "Consequences" section.` },
|
|
10520
|
-
decision_makers: { type: "string[]", description:
|
|
10811
|
+
decision_makers: { type: "string[]", description: 'People who made the decision. Mirrors MADR\'s "Deciders" field. Promote to `node_owned_by_person` edges (one per name) if ownership must be queryable.' },
|
|
10521
10812
|
decision_drivers: { type: "string[]", description: `Forces, constraints, and goals that shaped the decision. Mirrors MADR's "Decision Drivers" section. @example ["must work offline", "team has no Go expertise", "cost < $500/mo"]` }
|
|
10522
10813
|
},
|
|
10523
10814
|
// DeliverableProperties: Deliverable.
|
|
@@ -10538,7 +10829,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10538
10829
|
headcount: { type: "number", description: "Total number of people in the department" },
|
|
10539
10830
|
budget: { type: "number", description: "Annual budget allocated to the department" },
|
|
10540
10831
|
department_mission: { type: "string", description: "Charter / purpose statement for the department" },
|
|
10541
|
-
leader: { type: "string", description: "Department leader (person or role reference)" },
|
|
10832
|
+
leader: { type: "string", description: "Department leader (person or role reference). Promote to a `node_owned_by_person` edge if ownership must be queryable." },
|
|
10542
10833
|
fiscal_year: { type: "string", description: "Fiscal year the headcount / budget numbers apply to" }
|
|
10543
10834
|
},
|
|
10544
10835
|
// DependencyProperties: Dependency entity.
|
|
@@ -10556,7 +10847,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10556
10847
|
deploy_status: { type: "string", enum: ["success", "failure", "rolling"], description: "Current status" },
|
|
10557
10848
|
sha: { type: "string", description: "Git SHA of the deployed commit" },
|
|
10558
10849
|
duration_seconds: { type: "number", description: "Wall-clock duration in seconds. Tracks deployment speed trends." },
|
|
10559
|
-
deployer: { type: "string", description: "Triggering person or system." }
|
|
10850
|
+
deployer: { type: "string", description: "Triggering person or system. Promote to a `node_owned_by_person` edge if ownership must be queryable." }
|
|
10560
10851
|
},
|
|
10561
10852
|
// DesignComponentProperties: Design system component.
|
|
10562
10853
|
design_component: {
|
|
@@ -10573,7 +10864,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10573
10864
|
rationale: { type: "string", description: "Selection or rejection rationale" },
|
|
10574
10865
|
concept_status: { type: "string", enum: ["exploring", "validated", "selected", "rejected"], description: "Current selection status" },
|
|
10575
10866
|
maturity: { type: "string", enum: ["sketch", "refined", "final"], description: "Development stage, from rough idea to presentation-ready" },
|
|
10576
|
-
owner: { type: "string", description: "Shepherding designer or researcher" }
|
|
10867
|
+
owner: { type: "string", description: "Shepherding designer or researcher. Promote to a `node_owned_by_person` edge if ownership must be queryable." }
|
|
10577
10868
|
},
|
|
10578
10869
|
// DesignGuidelineProperties: Design guideline.
|
|
10579
10870
|
design_guideline: {
|
|
@@ -10624,7 +10915,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10624
10915
|
design_system: {
|
|
10625
10916
|
version: { type: "string", description: "Current version" },
|
|
10626
10917
|
repo_path: { type: "string", description: "Code repository or package path" },
|
|
10627
|
-
maintainer: { type: "string", description: "Maintaining person or team" },
|
|
10918
|
+
maintainer: { type: "string", description: "Maintaining person or team. Promote to a `node_owned_by_team` edge if ownership must be queryable." },
|
|
10628
10919
|
license: { type: "string", description: "Open-source license, if public" },
|
|
10629
10920
|
homepage_url: { type: "string", description: "Documentation homepage. Public-facing entry point." }
|
|
10630
10921
|
},
|
|
@@ -10687,7 +10978,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10687
10978
|
source_url: { type: "string", description: "Canonical retrievable URL" },
|
|
10688
10979
|
platform: { type: "string", enum: ["markdown", "notion", "figma", "google_docs", "confluence", "github", "linear", "other"], description: "Hosting platform" },
|
|
10689
10980
|
document_type: { type: "string", enum: ["vision", "plan", "decision", "research", "spec", "audit", "session", "feedback", "case-study", "narrative", "bug-report", "archive-collection", "rfc", "runbook", "guide", "onboarding", "brief", "report", "reference"], description: "Purpose classification" },
|
|
10690
|
-
author: { type: "string", description: "Author (free-form: name, email, or handle)" },
|
|
10981
|
+
author: { type: "string", description: "Author (free-form: name, email, or handle). Promote to a `node_owned_by_person` edge if ownership must be queryable." },
|
|
10691
10982
|
last_updated: { type: "string", description: "ISO 8601 last-meaningful-update" },
|
|
10692
10983
|
word_count: { type: "number", description: "Approximate word count. Useful for planning, indexing, summarisation." },
|
|
10693
10984
|
content_summary: { type: "string", description: "1\u20133 sentence summary. Drives previews, search snippets, embedding context." },
|
|
@@ -10725,7 +11016,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10725
11016
|
epic: {
|
|
10726
11017
|
estimate: { type: "string", description: 'Rough size estimate (e.g. "3 sprints", "L", "13 points")' },
|
|
10727
11018
|
priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Task-level priority" },
|
|
10728
|
-
owner: { type: "string", description: "Responsible person or team" },
|
|
11019
|
+
owner: { type: "string", description: "Responsible person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable." },
|
|
10729
11020
|
start_date: { type: "string", description: "ISO date work begins" },
|
|
10730
11021
|
target_date: { type: "string", description: "ISO date work completes" }
|
|
10731
11022
|
},
|
|
@@ -10905,7 +11196,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10905
11196
|
// FeatureProperties: A discrete, user-facing capability of the product.
|
|
10906
11197
|
feature: {
|
|
10907
11198
|
priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Task-level priority" },
|
|
10908
|
-
owner: { type: "string", description: "Responsible person or team" },
|
|
11199
|
+
owner: { type: "string", description: "Responsible person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable." },
|
|
10909
11200
|
start_date: { type: "string", description: "ISO date work begins" },
|
|
10910
11201
|
target_date: { type: "string", description: "ISO date work completes" },
|
|
10911
11202
|
health: { type: "string", enum: ["on_track", "at_risk", "off_track"], description: "Delivery health" }
|
|
@@ -10915,7 +11206,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10915
11206
|
scope_summary: { type: "string", description: "One-line scope description. Disambiguates from sibling areas at a glance." },
|
|
10916
11207
|
owning_team: { type: "string", description: "Team identifier or slug. Free-form display. Canonical relationship is the `team_owns_feature_area` edge." },
|
|
10917
11208
|
feature_count: { type: "number", description: "Approximate feature count under this area. Snapshot; `feature_area_contains_feature` edges are the source of truth.", modifier: "derived" },
|
|
10918
|
-
owner: { type: "string", description: "Area owner (handle or email)" },
|
|
11209
|
+
owner: { type: "string", description: "Area owner (handle or email). Promote to a `node_owned_by_team` edge if ownership must be queryable." },
|
|
10919
11210
|
priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Importance to the product overall" },
|
|
10920
11211
|
maturity: { type: "string", enum: ["nascent", "growing", "mature", "legacy"], description: "Maturity. `nascent` = newly-formed grouping. `mature` = established surface. `legacy` = being phased out for a successor." },
|
|
10921
11212
|
area_status: { type: "string", enum: ["active", "planned", "deprecated"], description: "Status in the product structure" }
|
|
@@ -10926,7 +11217,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10926
11217
|
flag_status: { type: "string", enum: ["on", "off", "rollout"], description: "Activation state. `on` = enabled for all. `off` = disabled for all. `rollout` = partial via targeting_rules." },
|
|
10927
11218
|
rollout_pct: { type: "number", description: "Percentage enabled (0\u2013100). Meaningful when `flag_status === 'rollout'`." },
|
|
10928
11219
|
targeting_rules: { type: "string", description: "Human-readable targeting rules. Full rule evaluation happens in the flag service." },
|
|
10929
|
-
owner: { type: "string", description: "Owning person or team responsible for the flag's lifecycle." },
|
|
11220
|
+
owner: { type: "string", description: "Owning person or team responsible for the flag's lifecycle. Promote to a `node_owned_by_person` edge if ownership must be queryable." },
|
|
10930
11221
|
flag_type: { type: "string", enum: ["temporary", "permanent", "experiment"], description: "Lifecycle classification. `temporary` = should be removed after rollout (kill switch, gradual rollout). `permanent` = long-lived feature gate (entitlement flag). `experiment` = A/B test with a defined end condition." },
|
|
10931
11222
|
expiry_date: { type: "string", description: "ISO date after which this flag should be cleaned up. A temporary flag without an `expiry_date` is a code smell." },
|
|
10932
11223
|
created_date: { type: "string", description: "Creation date. Useful for flag age and stale-flag detection." }
|
|
@@ -11165,7 +11456,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
11165
11456
|
start_date: { type: "string", description: 'ISO start date. @example "2026-04-01"' },
|
|
11166
11457
|
end_date: { type: "string", description: 'ISO end date. @example "2026-09-30"' },
|
|
11167
11458
|
budget: { type: "number", description: "Budget allocated (base currency units)" },
|
|
11168
|
-
owner: { type: "string", description: "Owning person or team" }
|
|
11459
|
+
owner: { type: "string", description: "Owning person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable." }
|
|
11169
11460
|
},
|
|
11170
11461
|
// InsightProperties: Unified insight, synthesised from evidence and observations.
|
|
11171
11462
|
insight: {
|
|
@@ -11234,7 +11525,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
11234
11525
|
findings: { type: "string", description: "Findings discovered so far" },
|
|
11235
11526
|
started_at: { type: "string", description: "ISO timestamp the investigation began" },
|
|
11236
11527
|
resolved_at: { type: "string", description: "ISO timestamp the investigation was concluded. Pairs with `status === 'resolved' | 'abandoned'`." },
|
|
11237
|
-
lead_investigator: { type: "string", description: "Lead investigator (email or handle). Distinct from the team owning the affected service." },
|
|
11528
|
+
lead_investigator: { type: "string", description: "Lead investigator (email or handle). Distinct from the team owning the affected service. Promote to a `node_owned_by_person` edge if ownership must be queryable." },
|
|
11238
11529
|
session_id: { type: "string", description: "Originating session" },
|
|
11239
11530
|
category: { type: "string", enum: ["performance", "security", "data_quality", "reliability", "cost", "compliance", "other"], description: "Kind of issue under investigation. Distinct from `RootCauseProperties.cause_category`, which captures *why something went wrong*." }
|
|
11240
11531
|
},
|
|
@@ -11364,7 +11655,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
11364
11655
|
required: ["value", "label"]
|
|
11365
11656
|
},
|
|
11366
11657
|
thought: { type: "string", description: "What the user is thinking" },
|
|
11367
|
-
owner: { type: "string", description: "Responsible owner" }
|
|
11658
|
+
owner: { type: "string", description: "Responsible owner. Promote to a `node_owned_by_person` edge if ownership must be queryable." }
|
|
11368
11659
|
},
|
|
11369
11660
|
// KeyActivityProperties: KeyActivity.
|
|
11370
11661
|
key_activity: {
|
|
@@ -11373,7 +11664,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
11373
11664
|
frequency_count: { type: "number", description: "Exact count of runs in the period. Pairs with `frequency_period`." },
|
|
11374
11665
|
frequency_period: { type: "string", description: "Recurrence period (ISO-8601 `Duration`, e.g. `'P7D'`)" },
|
|
11375
11666
|
frequency_rating: { type: "string", enum: ["constant", "regular", "occasional", "rare", "other"], description: "Qualitative tier. Use when an exact rate is unknown." },
|
|
11376
|
-
operational_owner: { type: "string", description: "Operationally accountable team or individual" },
|
|
11667
|
+
operational_owner: { type: "string", description: "Operationally accountable team or individual. Promote to a `node_owned_by_team` edge if ownership must be queryable." },
|
|
11377
11668
|
capacity_constraint: { type: "string", description: "Bottleneck or scaling constraint" },
|
|
11378
11669
|
automation_level: { type: "string", enum: ["manual", "assisted", "automated"], description: "How much runs without human intervention" }
|
|
11379
11670
|
},
|
|
@@ -11381,7 +11672,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
11381
11672
|
key_resource: {
|
|
11382
11673
|
resource_type: { type: "string", enum: ["physical", "intellectual", "human", "financial"], description: "Category" },
|
|
11383
11674
|
criticality: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Criticality to the business model" },
|
|
11384
|
-
owner: { type: "string", description: "Accountable person or team" },
|
|
11675
|
+
owner: { type: "string", description: "Accountable person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable." },
|
|
11385
11676
|
scarcity_risk: {
|
|
11386
11677
|
type: "assessment",
|
|
11387
11678
|
scale_id: "severity_5",
|
|
@@ -11570,7 +11861,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
11570
11861
|
range_min: { type: "number", description: "Minimum expected or baseline value" },
|
|
11571
11862
|
range_max: { type: "number", description: "Maximum expected or ceiling value" },
|
|
11572
11863
|
cadence: { type: "string", enum: ["continuous", "hourly", "daily", "weekly", "monthly", "quarterly", "yearly", "on_demand", "other"], description: "Measurement cadence. Canonical `Cadence` since v0.4.0. `'realtime'` migrates to `'continuous'`; all other values 1:1." },
|
|
11573
|
-
owner: { type: "string", description: "Person or team responsible for tracking this metric" },
|
|
11864
|
+
owner: { type: "string", description: "Person or team responsible for tracking this metric. Promote to a `node_owned_by_person` edge if ownership must be queryable." },
|
|
11574
11865
|
metric_health: { type: "string", enum: ["healthy", "at_risk", "unhealthy", "unknown"], description: "Universal health rollup. Orthogonal to lifecycle and `guardrail_status`. Applies to every metric regardless of `designation`. `healthy` = trending well against target / inside safe range. `at_risk` = drifting, approaching breach or target shortfall. `unhealthy` = missed target or breached; action needed. `unknown` = no current reading or not yet measured. For guardrails specifically, `guardrail_status` remains the breach-specific signal (`safe`/`warning`/`breached`)." },
|
|
11575
11866
|
guardrail_threshold_min: { type: "number", description: "Lower bound for guardrail safety (below this = breach)" },
|
|
11576
11867
|
guardrail_threshold_max: { type: "number", description: "Upper bound for guardrail safety (above this = breach)" },
|
|
@@ -11757,7 +12048,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
11757
12048
|
// OutcomeProperties: A measurable change in user or business state the product drives.
|
|
11758
12049
|
outcome: {
|
|
11759
12050
|
timeline: { type: "string", description: 'Target timeframe (e.g. "Q2 2026", "12 months")' },
|
|
11760
|
-
owner: { type: "string", description: "Accountable person or team" },
|
|
12051
|
+
owner: { type: "string", description: "Accountable person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable." },
|
|
11761
12052
|
success_criteria: { type: "string", description: 'What "achieved" looks like, concretely. Pairs with `measurement_method`. @example "30-day retention above 40% for new signups"' },
|
|
11762
12053
|
measurement_method: { type: "string", enum: ["quantitative", "qualitative", "mixed"], description: "Assessment approach. `quantitative` = metrics drive the call. `qualitative` = observation / interviews. `mixed` = both, weighted case-by-case." },
|
|
11763
12054
|
current_state: { type: "string", description: "Baseline or latest read" },
|
|
@@ -11816,7 +12107,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
11816
12107
|
},
|
|
11817
12108
|
required: ["value", "label"]
|
|
11818
12109
|
},
|
|
11819
|
-
owner: { type: "string", description: "Internal owner" },
|
|
12110
|
+
owner: { type: "string", description: "Internal owner. Promote to a `node_owned_by_person` edge if ownership must be queryable." },
|
|
11820
12111
|
start_date: { type: "string", description: "Date the partnership became effective (ISO 8601)" }
|
|
11821
12112
|
},
|
|
11822
12113
|
// PaywallProperties: Paywall.
|
|
@@ -11944,7 +12235,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
11944
12235
|
product_area: {
|
|
11945
12236
|
strategic_priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Strategic priority assigned to this area" },
|
|
11946
12237
|
description: { type: "string", description: "Narrative description of what this area covers" },
|
|
11947
|
-
owner: { type: "string", description: "Person or team that owns this area" }
|
|
12238
|
+
owner: { type: "string", description: "Person or team that owns this area. Promote to a `node_owned_by_team` edge if ownership must be queryable." }
|
|
11948
12239
|
},
|
|
11949
12240
|
// ProgramProperties: Program.
|
|
11950
12241
|
program: {
|
|
@@ -12055,7 +12346,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
12055
12346
|
release_date: { type: "string", description: "Scheduled or actual release date (ISO)" },
|
|
12056
12347
|
version: { type: "string", description: 'Semver or named version (e.g. "v2.1.0", "Beta 3")' },
|
|
12057
12348
|
start_date: { type: "string", description: "ISO date work begins" },
|
|
12058
|
-
owner: { type: "string", description: "Responsible person or team" }
|
|
12349
|
+
owner: { type: "string", description: "Responsible person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable." }
|
|
12059
12350
|
},
|
|
12060
12351
|
// ReleaseStrategyProperties: Release strategy.
|
|
12061
12352
|
release_strategy: {
|
|
@@ -12116,7 +12407,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
12116
12407
|
// ReviewGateProperties: Review gate.
|
|
12117
12408
|
review_gate: {
|
|
12118
12409
|
gate_type: { type: "string", enum: ["human_review", "automated_check", "approval"], description: "Kind of review required at this gate" },
|
|
12119
|
-
required_approvers: { type: "string[]", description: "People or roles that must approve" },
|
|
12410
|
+
required_approvers: { type: "string[]", description: "People or roles that must approve. Promote to `node_owned_by_person` edges (one per name) if ownership must be queryable." },
|
|
12120
12411
|
gate_status: { type: "string", enum: ["pending", "approved", "rejected", "bypassed"], description: "Current approval status of the gate" }
|
|
12121
12412
|
},
|
|
12122
12413
|
// RiskProperties: Risk.
|
|
@@ -12156,7 +12447,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
12156
12447
|
roadmap: {
|
|
12157
12448
|
roadmap_type: { type: "string", enum: ["now_next_later", "quarterly", "release_based", "theme_based"], description: "Structure" },
|
|
12158
12449
|
timeframe: { type: "string", description: "Covered timeframe" },
|
|
12159
|
-
owner: { type: "string", description: "Owning person or team" }
|
|
12450
|
+
owner: { type: "string", description: "Owning person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable." }
|
|
12160
12451
|
},
|
|
12161
12452
|
// RoadmapItemProperties: Roadmap item.
|
|
12162
12453
|
roadmap_item: {
|
|
@@ -12296,7 +12587,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
12296
12587
|
service: {
|
|
12297
12588
|
service_type: { type: "string", enum: ["web", "api", "worker", "db", "queue", "library", "mobile", "docs", "lambda", "cli"], description: "Functional classification. Expanded from Backstage's component type vocabulary. `cli` added in 0.9.12." },
|
|
12298
12589
|
tech_stack: { type: "string[]", description: 'Technologies used (e.g. ["TypeScript", "Postgres", "Redis"])' },
|
|
12299
|
-
owner: { type: "string", description: "Owning person or team. Backstage marks this required; strongly recommended." },
|
|
12590
|
+
owner: { type: "string", description: "Owning person or team. Backstage marks this required; strongly recommended. Promote to a `node_owned_by_team` edge if ownership must be queryable." },
|
|
12300
12591
|
lifecycle: { type: "string", enum: ["experimental", "production", "deprecated"], description: 'Service maturity. Answers "how mature is it?". `experimental` = early-stage. `production` = battle-tested. `deprecated` = being phased out.' },
|
|
12301
12592
|
tags: { type: "string[]", description: 'Free-form filter tags (e.g. ["payments", "critical-path", "team-alpha"]).' },
|
|
12302
12593
|
links: { type: "object[]", description: "Named URLs for documentation, dashboards, runbooks." }
|
|
@@ -12317,7 +12608,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
12317
12608
|
agreement_term: { type: "string", description: 'Effective term of the agreement (e.g. "12 months", "auto-renewing annual")' },
|
|
12318
12609
|
effective_date: { type: "string", description: "ISO date effective" },
|
|
12319
12610
|
expiry_date: { type: "string", description: "ISO date expires. Pairs with `agreement_term` for renewal logic." },
|
|
12320
|
-
owner: { type: "string", description: "Party accountable on the service provider side" },
|
|
12611
|
+
owner: { type: "string", description: "Party accountable on the service provider side. Promote to a `node_owned_by_team` edge if ownership must be queryable." },
|
|
12321
12612
|
consequence_of_breach: { type: "string", description: "What happens if the SLA is breached (credits, penalties, escalation path)" }
|
|
12322
12613
|
},
|
|
12323
12614
|
// ServiceLevelIndicatorProperties: Service Level Indicator.
|
|
@@ -12464,7 +12755,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
12464
12755
|
},
|
|
12465
12756
|
// StrategicPillarProperties: StrategicPillar entity. Durable multi-year direction the product commits to.
|
|
12466
12757
|
strategic_pillar: {
|
|
12467
|
-
owner: { type: "string", description: "Owning person or team" },
|
|
12758
|
+
owner: { type: "string", description: "Owning person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable." },
|
|
12468
12759
|
description: { type: "string", description: "Narrative of the pillar's intent" },
|
|
12469
12760
|
scope: { type: "string", description: "What this pillar covers" },
|
|
12470
12761
|
time_horizon: { type: "string", description: 'Planning horizon. Typically multi-year. @example "3 years", "2026-2028"' },
|
|
@@ -12472,7 +12763,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
12472
12763
|
},
|
|
12473
12764
|
// StrategicThemeProperties: StrategicTheme entity.
|
|
12474
12765
|
strategic_theme: {
|
|
12475
|
-
owner: { type: "string", description: "Owning person or team" },
|
|
12766
|
+
owner: { type: "string", description: "Owning person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable." },
|
|
12476
12767
|
time_horizon: { type: "string", description: 'Planning horizon. @example "Q1 2026", "FY26"' },
|
|
12477
12768
|
description: { type: "string", description: "Short narrative of what the theme is about" },
|
|
12478
12769
|
scope: { type: "string", description: "What the theme explicitly includes or excludes" }
|
|
@@ -12565,7 +12856,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
12565
12856
|
},
|
|
12566
12857
|
// TaskProperties: Task: a discrete unit of work, smaller than a story.
|
|
12567
12858
|
task: {
|
|
12568
|
-
assignee: { type: "string", description: "Assigned person" },
|
|
12859
|
+
assignee: { type: "string", description: "Assigned person. Promote to a `node_owned_by_person` edge if ownership must be queryable." },
|
|
12569
12860
|
effort: { type: "string", description: 'Effort estimate (e.g. "2h", "1d", "3 points"). Use a consistent unit within your team.' },
|
|
12570
12861
|
priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Relative importance against other tasks" },
|
|
12571
12862
|
due_date: { type: "string", description: "ISO date due. Typically bounded by the containing story's due date." },
|
|
@@ -12611,7 +12902,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
12611
12902
|
},
|
|
12612
12903
|
required: ["value", "label"]
|
|
12613
12904
|
},
|
|
12614
|
-
owner: { type: "string", description: "Owning person or team responsible for paydown." },
|
|
12905
|
+
owner: { type: "string", description: "Owning person or team responsible for paydown. Promote to a `node_owned_by_person` edge if ownership must be queryable." },
|
|
12615
12906
|
affected_area: { type: "string", description: 'Codebase location, service, or module. @example "apps/graph/src/canvas/", "UserService", "auth module"' },
|
|
12616
12907
|
interest: { type: "string", description: 'Ongoing cost of leaving it unresolved (the "interest" in the financial metaphor). @example "~2h/sprint of workarounds", "blocks type-safe refactor of checkout"' },
|
|
12617
12908
|
intentionality: { type: "string", enum: ["deliberate", "inadvertent"], description: "Origin of the debt. `deliberate` = conscious decision to ship something imperfect (prudent or reckless). `inadvertent` = discovered after the fact. Based on Fowler's Technical Debt Quadrant." }
|
|
@@ -12719,7 +13010,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
12719
13010
|
methodology: { type: "string", enum: ["stride", "dread", "pasta", "attack_tree", "other"], description: 'Methodology. `stride` = Spoofing, Tampering, Repudiation, Information Disclosure, DoS, Elevation of Privilege (OWASP standard). `dread` = Damage, Reproducibility, Exploitability, Affected users, Discoverability (numeric scoring). `pasta` = Process for Attack Simulation and Threat Analysis (7-stage). `attack_tree` = hierarchical tree of attack paths. @example "stride" is the most widely used methodology for web applications' },
|
|
12720
13011
|
scope: { type: "string", description: 'What system, feature, or data flow is being analysed. @example "user authentication", "payment processing", "admin API"' },
|
|
12721
13012
|
last_reviewed: { type: "string", description: 'ISO date last reviewed. Models become stale as systems evolve. @example "2026-03-01"' },
|
|
12722
|
-
participants: { type: "string", description: 'Participants in the exercise. @example "Alice Chen (security lead), Bob Park (backend engineer), Carol Liu (architect)"' },
|
|
13013
|
+
participants: { type: "string", description: 'Participants in the exercise. @example "Alice Chen (security lead), Bob Park (backend engineer), Carol Liu (architect)". Promote individuals to `node_owned_by_person` edges if participation must be queryable.' },
|
|
12723
13014
|
threat_count: { type: "number", description: "Threats identified. Key metric for scope and completeness. @example 12" }
|
|
12724
13015
|
},
|
|
12725
13016
|
// TouchpointProperties: Customer touchpoint.
|
|
@@ -29146,7 +29437,7 @@ function isCanonical(text) {
|
|
|
29146
29437
|
}
|
|
29147
29438
|
|
|
29148
29439
|
// src/index.ts
|
|
29149
|
-
var UPG_VERSION = "0.12.
|
|
29440
|
+
var UPG_VERSION = "0.12.5";
|
|
29150
29441
|
var UPG_FORMAT_VERSION = "0.4.0";
|
|
29151
29442
|
var MARKDOWN_FORMAT_VERSION = "0.1";
|
|
29152
29443
|
var UPG_TYPES = getTypes();
|
|
@@ -29218,6 +29509,7 @@ var UPG_META_COUNT = UPG_ENTITY_META.length;
|
|
|
29218
29509
|
CLASSIFICATION_EDGE_PROPERTY_SCHEMA,
|
|
29219
29510
|
CONTENT_DEPTH_WARNING_RULES,
|
|
29220
29511
|
DEFAULT_ENTITY_EMOJI,
|
|
29512
|
+
DEFERRED_PROPOSED_BY_CONTRACT,
|
|
29221
29513
|
DISCOVERY_RESEARCH_VALIDATION_PLAYBOOK,
|
|
29222
29514
|
ENGINEERING_PLATFORM_PLAYBOOK,
|
|
29223
29515
|
ENTITY_EMOJI,
|