@unified-product-graph/core 0.11.6 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +299 -34
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +208 -69
- package/dist/index.d.ts +208 -69
- package/dist/index.js +297 -34
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -2184,6 +2184,32 @@ var UPG_EDGE_CATALOG = {
|
|
|
2184
2184
|
// owned by feature_area / theme / product. Relationship is semantic.
|
|
2185
2185
|
changelog_includes_feature: { forward_verb: "includes", reverse_verb: "included_in", classification: "semantic", source_type: "changelog", target_type: "feature" },
|
|
2186
2186
|
ai_trace_spawns_ai_trace: { forward_verb: "spawns", reverse_verb: "spawned_by", classification: "hierarchy", source_type: "ai_trace", target_type: "ai_trace" },
|
|
2187
|
+
// ── P14 conformance edges (0.12.0) — promote orphan entity-reference scalars ──
|
|
2188
|
+
// Each replaces a string property that named a first-class entity. The matching
|
|
2189
|
+
// `UPGScalarToEdgeMigration['0.12.0']` rule losslessly mints/links + drops the
|
|
2190
|
+
// scalar. See the P14 string-reference sweep.
|
|
2191
|
+
business_model_guided_by_metric: { forward_verb: "guided_by", reverse_verb: "guides", classification: "cross-domain", source_type: "business_model", target_type: "metric" },
|
|
2192
|
+
vision_anchored_by_metric: { forward_verb: "anchored_by", reverse_verb: "anchors", classification: "cross-domain", source_type: "vision", target_type: "metric" },
|
|
2193
|
+
metric_fed_by_data_source: { forward_verb: "fed_by", reverse_verb: "feeds", classification: "cross-domain", source_type: "metric", target_type: "data_source" },
|
|
2194
|
+
hallucination_report_has_root_cause: { forward_verb: "has_root_cause", reverse_verb: "root_cause_of", classification: "causal", source_type: "hallucination_report", target_type: "root_cause" },
|
|
2195
|
+
model_comparison_compares_ai_model: { forward_verb: "compares", reverse_verb: "compared_in", classification: "semantic", source_type: "model_comparison", target_type: "ai_model" },
|
|
2196
|
+
launch_measured_by_metric: { forward_verb: "measured_by", reverse_verb: "measures", classification: "cross-domain", source_type: "launch", target_type: "metric" },
|
|
2197
|
+
wireframe_depicts_screen: { forward_verb: "depicts", reverse_verb: "depicted_by", classification: "semantic", source_type: "wireframe", target_type: "screen" },
|
|
2198
|
+
service_level_indicator_measures_metric: { forward_verb: "measures", reverse_verb: "measured_by", classification: "cross-domain", source_type: "service_level_indicator", target_type: "metric" },
|
|
2199
|
+
agent_definition_uses_ai_model: { forward_verb: "uses", reverse_verb: "used_by", classification: "semantic", source_type: "agent_definition", target_type: "ai_model" },
|
|
2200
|
+
privacy_policy_governs_compliance_requirement: { forward_verb: "governs", reverse_verb: "governed_by", classification: "semantic", source_type: "privacy_policy", target_type: "compliance_requirement" },
|
|
2201
|
+
a11y_annotation_targets_design_component: { forward_verb: "targets", reverse_verb: "targeted_by", classification: "cross-domain", source_type: "a11y_annotation", target_type: "design_component" },
|
|
2202
|
+
metric_quality_assessment_considers_proxy_metric: { forward_verb: "considers_proxy", reverse_verb: "proxy_for", classification: "semantic", source_type: "metric_quality_assessment", target_type: "metric" },
|
|
2203
|
+
ai_experiment_based_on_ai_model: { forward_verb: "based_on", reverse_verb: "basis_for", classification: "semantic", source_type: "ai_experiment", target_type: "ai_model" },
|
|
2204
|
+
rebuttal_supported_by_evidence: { forward_verb: "supported_by", reverse_verb: "supports", classification: "cross-domain", source_type: "rebuttal", target_type: "evidence" },
|
|
2205
|
+
bug_observed_in_release: { forward_verb: "observed_in", reverse_verb: "exhibits", classification: "semantic", source_type: "bug", target_type: "release" },
|
|
2206
|
+
vulnerability_affects_library_dependency: { forward_verb: "affects", reverse_verb: "affected_by", classification: "cross-domain", source_type: "vulnerability", target_type: "library_dependency" },
|
|
2207
|
+
a11y_issue_found_in_screen: { forward_verb: "found_in", reverse_verb: "site_of", classification: "cross-domain", source_type: "a11y_issue", target_type: "screen" },
|
|
2208
|
+
team_okr_cascades_from_team_okr: { forward_verb: "cascades_from", reverse_verb: "cascades_to", classification: "semantic", source_type: "team_okr", target_type: "team_okr" },
|
|
2209
|
+
agent_session_invoked_agent_skill: { forward_verb: "invoked", reverse_verb: "invoked_by", classification: "semantic", source_type: "agent_session", target_type: "agent_skill" },
|
|
2210
|
+
agent_task_uses_agent_skill: { forward_verb: "uses", reverse_verb: "used_by", classification: "semantic", source_type: "agent_task", target_type: "agent_skill" },
|
|
2211
|
+
participant_belongs_to_behavioral_segment: { forward_verb: "belongs_to", reverse_verb: "includes", classification: "cross-domain", source_type: "participant", target_type: "behavioral_segment" },
|
|
2212
|
+
classification_axis_owned_by_product: { forward_verb: "owned_by", reverse_verb: "owns", classification: "cross-domain", source_type: "classification_axis", target_type: "product" },
|
|
2187
2213
|
// ── Part 9: Cross-Layer Influence Edges ────────────────────────────────────
|
|
2188
2214
|
product_expressed_as_design_component: { forward_verb: "expressed_as", reverse_verb: "expresses", classification: "cross-domain", source_type: "product", target_type: "design_component" },
|
|
2189
2215
|
product_manifests_in_design_component: { forward_verb: "manifests_in", reverse_verb: "manifested_by", classification: "cross-domain", source_type: "product", target_type: "design_component" },
|
|
@@ -7322,6 +7348,25 @@ function getDeprecatedTypes() {
|
|
|
7322
7348
|
return deprecated;
|
|
7323
7349
|
}
|
|
7324
7350
|
var UPG_PROPERTY_MIGRATIONS = {
|
|
7351
|
+
// ── v0.12.0: P14 Bucket C — drop the one non-derived denormalized aggregate ──
|
|
7352
|
+
//
|
|
7353
|
+
// The count caches (feature_count, evidence_count, workflow step_count /
|
|
7354
|
+
// agent_count) are KEPT — 0.11.6 marked them `modifier:'derived'` (the
|
|
7355
|
+
// sanctioned "derived cache" reframe), so tooling knows to recompute rather
|
|
7356
|
+
// than removing them. `business_model.monetisation_basis` is NOT a count: it's
|
|
7357
|
+
// a categorical rollup of the model's revenue_stream.billing_model children, so
|
|
7358
|
+
// it drops here. `pattern` stays (a chosen archetype, not a rollup).
|
|
7359
|
+
// (customer_health_score.metrics — a metric→value map — is deferred: dropping
|
|
7360
|
+
// it is lossy until the per-metric values move onto the composed_of_metric
|
|
7361
|
+
// edges; tracked as a follow-up.)
|
|
7362
|
+
"0.12.0": [
|
|
7363
|
+
{
|
|
7364
|
+
kind: "drop_props",
|
|
7365
|
+
type: "business_model",
|
|
7366
|
+
drop_props: ["monetisation_basis"],
|
|
7367
|
+
reason: "P14 Bucket C: monetisation_basis is a categorical rollup of the model\u2019s revenue_stream.billing_model children, not a first-class attribute. Drop it; KEEP `pattern` (a chosen archetype)."
|
|
7368
|
+
}
|
|
7369
|
+
],
|
|
7325
7370
|
// ── v0.10.2: market_intelligence number -> assessment reshape ──────────────
|
|
7326
7371
|
//
|
|
7327
7372
|
// The v0.10.0 property-registry generator fix (#43) corrected several property
|
|
@@ -8151,6 +8196,245 @@ function getSplitMigrations(fromVersion, toVersion) {
|
|
|
8151
8196
|
}
|
|
8152
8197
|
return result;
|
|
8153
8198
|
}
|
|
8199
|
+
var UPG_SCALAR_TO_EDGE_MIGRATIONS = {
|
|
8200
|
+
"0.12.0": [
|
|
8201
|
+
// ── Bucket A1 — orphan scalars (no edge existed): add edge + migrate + drop ──
|
|
8202
|
+
{
|
|
8203
|
+
from_type: "business_model",
|
|
8204
|
+
scalar_property: "north_star_metric",
|
|
8205
|
+
target_type: "metric",
|
|
8206
|
+
edge_type: "business_model_guided_by_metric",
|
|
8207
|
+
target_match: "title",
|
|
8208
|
+
target_defaults: { designation: "north_star" },
|
|
8209
|
+
drop_scalar: true,
|
|
8210
|
+
reason: 'P14: the optimised metric is a first-class entity you query across business models ("which models optimise for this metric"), not a label. Mint metric{designation:north_star} + link via business_model_guided_by_metric; drop the orphan string.'
|
|
8211
|
+
},
|
|
8212
|
+
// NOTE: revenue_stream.forecast is NOT promoted — its JSDoc ("Free-text
|
|
8213
|
+
// forecast or projection") is narrative prose, not a ref to a forecast
|
|
8214
|
+
// entity. The additive revenue_stream_projected_by_forecast edge exists for
|
|
8215
|
+
// an explicit stream→forecast link; the free-text field stays.
|
|
8216
|
+
{
|
|
8217
|
+
from_type: "metric",
|
|
8218
|
+
scalar_property: "data_source",
|
|
8219
|
+
target_type: "data_source",
|
|
8220
|
+
edge_type: "metric_fed_by_data_source",
|
|
8221
|
+
drop_scalar: true,
|
|
8222
|
+
reason: 'P14: the data source feeding a metric is queryable across metrics ("everything fed by this source"); promote the string to a metric_fed_by_data_source edge.'
|
|
8223
|
+
},
|
|
8224
|
+
{
|
|
8225
|
+
from_type: "hallucination_report",
|
|
8226
|
+
scalar_property: "root_cause",
|
|
8227
|
+
target_type: "root_cause",
|
|
8228
|
+
edge_type: "hallucination_report_has_root_cause",
|
|
8229
|
+
drop_scalar: true,
|
|
8230
|
+
reason: "P14: a root_cause is a first-class entity reused across reports; link it rather than restating the cause as a string."
|
|
8231
|
+
},
|
|
8232
|
+
// NOTE: prompt_version.template is NOT promoted — its JSDoc ("Template body
|
|
8233
|
+
// with variable placeholders") is the prompt CONTENT, not a ref to a
|
|
8234
|
+
// prompt_template entity. The additive prompt_version_child_of_prompt_template
|
|
8235
|
+
// edge exists for an explicit version→template link; the content field stays.
|
|
8236
|
+
{
|
|
8237
|
+
from_type: "model_comparison",
|
|
8238
|
+
scalar_property: "model_ids",
|
|
8239
|
+
target_type: "ai_model",
|
|
8240
|
+
edge_type: "model_comparison_compares_ai_model",
|
|
8241
|
+
multi: true,
|
|
8242
|
+
drop_scalar: true,
|
|
8243
|
+
reason: "P14: the models being compared are first-class ai_model entities; one compares edge per model replaces the id-string list."
|
|
8244
|
+
},
|
|
8245
|
+
{
|
|
8246
|
+
from_type: "launch",
|
|
8247
|
+
scalar_property: "success_metrics",
|
|
8248
|
+
target_type: "metric",
|
|
8249
|
+
edge_type: "launch_measured_by_metric",
|
|
8250
|
+
multi: true,
|
|
8251
|
+
drop_scalar: true,
|
|
8252
|
+
reason: "P14: success metrics are first-class metric entities measured across launches; one measured_by edge per metric replaces the string list."
|
|
8253
|
+
},
|
|
8254
|
+
// NOTE: user_story.as_a is NOT promoted — it is a load-bearing field of the
|
|
8255
|
+
// user_story → story_statement split (the "As a <persona>" templated promise),
|
|
8256
|
+
// and the value is often a role descriptor, not a persona node. Left in place.
|
|
8257
|
+
{
|
|
8258
|
+
from_type: "wireframe",
|
|
8259
|
+
scalar_property: "screen_name",
|
|
8260
|
+
target_type: "screen",
|
|
8261
|
+
edge_type: "wireframe_depicts_screen",
|
|
8262
|
+
drop_scalar: true,
|
|
8263
|
+
reason: "P14: the depicted screen is a first-class entity; link it via wireframe_depicts_screen rather than naming it in a string."
|
|
8264
|
+
},
|
|
8265
|
+
{
|
|
8266
|
+
from_type: "service_level_indicator",
|
|
8267
|
+
scalar_property: "metric_name",
|
|
8268
|
+
target_type: "metric",
|
|
8269
|
+
edge_type: "service_level_indicator_measures_metric",
|
|
8270
|
+
drop_scalar: true,
|
|
8271
|
+
reason: "P14: the SLI\u2019s metric is a first-class entity; link it via service_level_indicator_measures_metric rather than naming it in a string."
|
|
8272
|
+
},
|
|
8273
|
+
{
|
|
8274
|
+
from_type: "agent_definition",
|
|
8275
|
+
scalar_property: "model_ref",
|
|
8276
|
+
target_type: "ai_model",
|
|
8277
|
+
edge_type: "agent_definition_uses_ai_model",
|
|
8278
|
+
drop_scalar: true,
|
|
8279
|
+
reason: 'P14: the model an agent uses is a first-class ai_model entity ("every agent on this model"); promote the ref string to a uses edge.'
|
|
8280
|
+
},
|
|
8281
|
+
{
|
|
8282
|
+
from_type: "privacy_policy",
|
|
8283
|
+
scalar_property: "regulations",
|
|
8284
|
+
target_type: "compliance_requirement",
|
|
8285
|
+
edge_type: "privacy_policy_governs_compliance_requirement",
|
|
8286
|
+
multi: true,
|
|
8287
|
+
drop_scalar: true,
|
|
8288
|
+
reason: "P14: each regulation is a first-class compliance_requirement entity tracked across policies; one governs edge per requirement replaces the string list."
|
|
8289
|
+
},
|
|
8290
|
+
{
|
|
8291
|
+
from_type: "a11y_annotation",
|
|
8292
|
+
scalar_property: "target_component",
|
|
8293
|
+
target_type: "design_component",
|
|
8294
|
+
edge_type: "a11y_annotation_targets_design_component",
|
|
8295
|
+
drop_scalar: true,
|
|
8296
|
+
reason: "P14: the annotated component is a real design_component entity; link it so accessibility coverage rolls up by component."
|
|
8297
|
+
},
|
|
8298
|
+
{
|
|
8299
|
+
from_type: "metric_quality_assessment",
|
|
8300
|
+
scalar_property: "proxy_alternatives",
|
|
8301
|
+
target_type: "metric",
|
|
8302
|
+
edge_type: "metric_quality_assessment_considers_proxy_metric",
|
|
8303
|
+
multi: true,
|
|
8304
|
+
drop_scalar: true,
|
|
8305
|
+
reason: "P14: proxy alternatives are first-class metric entities; one considers_proxy edge per metric replaces the name list."
|
|
8306
|
+
},
|
|
8307
|
+
{
|
|
8308
|
+
from_type: "ai_experiment",
|
|
8309
|
+
scalar_property: "foundation_model",
|
|
8310
|
+
target_type: "ai_model",
|
|
8311
|
+
edge_type: "ai_experiment_based_on_ai_model",
|
|
8312
|
+
drop_scalar: true,
|
|
8313
|
+
reason: "P14: the foundation model is a first-class ai_model entity reused across experiments; promote the string to a based_on edge."
|
|
8314
|
+
},
|
|
8315
|
+
{
|
|
8316
|
+
from_type: "rebuttal",
|
|
8317
|
+
scalar_property: "evidence_refs",
|
|
8318
|
+
target_type: "evidence",
|
|
8319
|
+
edge_type: "rebuttal_supported_by_evidence",
|
|
8320
|
+
multi: true,
|
|
8321
|
+
drop_scalar: true,
|
|
8322
|
+
reason: "P14: each evidence ref is a first-class evidence entity; one supported_by edge per item replaces the ref-string list."
|
|
8323
|
+
},
|
|
8324
|
+
{
|
|
8325
|
+
from_type: "bug",
|
|
8326
|
+
scalar_property: "affected_version",
|
|
8327
|
+
target_type: "release",
|
|
8328
|
+
edge_type: "bug_observed_in_release",
|
|
8329
|
+
drop_scalar: true,
|
|
8330
|
+
reason: 'P14: the affected version is a first-class release entity ("every bug in this release"); promote the version string to an observed_in edge.'
|
|
8331
|
+
},
|
|
8332
|
+
{
|
|
8333
|
+
from_type: "vulnerability",
|
|
8334
|
+
scalar_property: "affected_package",
|
|
8335
|
+
target_type: "library_dependency",
|
|
8336
|
+
edge_type: "vulnerability_affects_library_dependency",
|
|
8337
|
+
drop_scalar: true,
|
|
8338
|
+
reason: "P14: the affected package is a first-class library_dependency entity; link it so vulnerabilities roll up by dependency."
|
|
8339
|
+
},
|
|
8340
|
+
{
|
|
8341
|
+
from_type: "a11y_issue",
|
|
8342
|
+
scalar_property: "discovered_in",
|
|
8343
|
+
target_type: "screen",
|
|
8344
|
+
edge_type: "a11y_issue_found_in_screen",
|
|
8345
|
+
drop_scalar: true,
|
|
8346
|
+
reason: "P14: the screen an issue was found in is a real screen entity; link it so issues roll up by screen rather than naming it in a string."
|
|
8347
|
+
},
|
|
8348
|
+
{
|
|
8349
|
+
from_type: "team_okr",
|
|
8350
|
+
scalar_property: "cascade_from",
|
|
8351
|
+
target_type: "team_okr",
|
|
8352
|
+
edge_type: "team_okr_cascades_from_team_okr",
|
|
8353
|
+
drop_scalar: true,
|
|
8354
|
+
reason: "P14: a cascaded OKR points at its parent OKR (a real entity); the cascade is a self-referential edge, not a name string."
|
|
8355
|
+
},
|
|
8356
|
+
{
|
|
8357
|
+
from_type: "agent_session",
|
|
8358
|
+
scalar_property: "tools_invoked",
|
|
8359
|
+
target_type: "agent_skill",
|
|
8360
|
+
edge_type: "agent_session_invoked_agent_skill",
|
|
8361
|
+
multi: true,
|
|
8362
|
+
drop_scalar: true,
|
|
8363
|
+
reason: "P14: invoked tools are first-class agent_skill entities tracked across sessions; one invoked edge per skill replaces the string list."
|
|
8364
|
+
},
|
|
8365
|
+
{
|
|
8366
|
+
from_type: "agent_task",
|
|
8367
|
+
scalar_property: "tools",
|
|
8368
|
+
target_type: "agent_skill",
|
|
8369
|
+
edge_type: "agent_task_uses_agent_skill",
|
|
8370
|
+
multi: true,
|
|
8371
|
+
drop_scalar: true,
|
|
8372
|
+
reason: "P14: the tools a task uses are first-class agent_skill entities; one uses edge per skill replaces the string list."
|
|
8373
|
+
},
|
|
8374
|
+
{
|
|
8375
|
+
from_type: "participant",
|
|
8376
|
+
scalar_property: "segment",
|
|
8377
|
+
target_type: "behavioral_segment",
|
|
8378
|
+
edge_type: "participant_belongs_to_behavioral_segment",
|
|
8379
|
+
drop_scalar: true,
|
|
8380
|
+
reason: "P14: a participant\u2019s segment is a first-class behavioral_segment entity queried across studies; promote the string to a belongs_to edge."
|
|
8381
|
+
},
|
|
8382
|
+
{
|
|
8383
|
+
from_type: "classification_axis",
|
|
8384
|
+
scalar_property: "owner_product",
|
|
8385
|
+
target_type: "product",
|
|
8386
|
+
edge_type: "classification_axis_owned_by_product",
|
|
8387
|
+
target_match: "id",
|
|
8388
|
+
drop_scalar: true,
|
|
8389
|
+
reason: "P14: the product that owns an axis is a first-class entity; link it via classification_axis_owned_by_product. The scalar holds a product id, so match by id (no mint)."
|
|
8390
|
+
},
|
|
8391
|
+
// ── Bucket A2 — shadow scalars (the canonical edge ALREADY exists): backfill + drop ──
|
|
8392
|
+
{
|
|
8393
|
+
from_type: "growth_campaign",
|
|
8394
|
+
scalar_property: "channels_targeted",
|
|
8395
|
+
target_type: "acquisition_channel",
|
|
8396
|
+
edge_type: "acquisition_channel_runs_growth_campaign",
|
|
8397
|
+
reverse: true,
|
|
8398
|
+
multi: true,
|
|
8399
|
+
drop_scalar: true,
|
|
8400
|
+
reason: "P14 shadow: the acquisition_channel_runs_growth_campaign edge already exists (channel\u2192campaign). Backfill any string-only channels as edges, then drop the drift-prone list."
|
|
8401
|
+
},
|
|
8402
|
+
{
|
|
8403
|
+
from_type: "journey_step",
|
|
8404
|
+
scalar_property: "touchpoint",
|
|
8405
|
+
target_type: "touchpoint",
|
|
8406
|
+
edge_type: "touchpoint_occurs_in_journey_step",
|
|
8407
|
+
reverse: true,
|
|
8408
|
+
drop_scalar: true,
|
|
8409
|
+
reason: "P14 shadow: the touchpoint_occurs_in_journey_step edge already exists (touchpoint\u2192journey_step) and the field was @deprecated 0.9.9. Backfill + finish the drop."
|
|
8410
|
+
},
|
|
8411
|
+
{
|
|
8412
|
+
from_type: "decision",
|
|
8413
|
+
scalar_property: "superseded_by",
|
|
8414
|
+
target_type: "decision",
|
|
8415
|
+
edge_type: "decision_superseded_by_decision",
|
|
8416
|
+
drop_scalar: true,
|
|
8417
|
+
reason: "P14 shadow: the decision_superseded_by_decision edge already exists. Backfill the superseding decision as an edge, then drop the reference string."
|
|
8418
|
+
},
|
|
8419
|
+
{
|
|
8420
|
+
from_type: "subscription",
|
|
8421
|
+
scalar_property: "plan_name",
|
|
8422
|
+
target_type: "pricing_tier",
|
|
8423
|
+
edge_type: "subscription_subscribes_to_pricing_tier",
|
|
8424
|
+
drop_scalar: true,
|
|
8425
|
+
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."
|
|
8426
|
+
}
|
|
8427
|
+
]
|
|
8428
|
+
};
|
|
8429
|
+
function getScalarToEdgeMigrations(fromVersion, toVersion) {
|
|
8430
|
+
const result = [];
|
|
8431
|
+
for (const [version, migrations] of Object.entries(UPG_SCALAR_TO_EDGE_MIGRATIONS)) {
|
|
8432
|
+
if (versionInRange(version, fromVersion, toVersion)) {
|
|
8433
|
+
result.push(...migrations);
|
|
8434
|
+
}
|
|
8435
|
+
}
|
|
8436
|
+
return result;
|
|
8437
|
+
}
|
|
8154
8438
|
var UPG_EDGE_MIGRATIONS = {
|
|
8155
8439
|
"0.9.9": [
|
|
8156
8440
|
// (since v0.9.9, UPG-664/UPG-678) Validation experiment-model + test_plan
|
|
@@ -9139,7 +9423,6 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
9139
9423
|
// A11yAnnotationProperties: Accessibility annotation.
|
|
9140
9424
|
a11y_annotation: {
|
|
9141
9425
|
category: { type: "string", enum: ["focus_order", "alt_text", "heading_level", "aria_label", "colour_contrast", "keyboard_nav", "screen_reader", "motion_preference", "other"], description: "Category of accessibility annotation. Expanded from the original 5-value enum to cover the full range of a11y annotation types." },
|
|
9142
|
-
target_component: { type: "string", description: "Component or element this annotation applies to" },
|
|
9143
9426
|
requirement: { type: "string", description: "Specific accessibility requirement described" },
|
|
9144
9427
|
wcag_criterion: { type: "string", description: "WCAG success criterion this annotation relates to" },
|
|
9145
9428
|
annotation_priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Priority for implementing this annotation" },
|
|
@@ -9188,8 +9471,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
9188
9471
|
html_snippet: { type: "string", description: "HTML snippet containing the violation" },
|
|
9189
9472
|
tags: { type: "string[]", description: 'Tags from the audit tool (e.g. "wcag2aa", "cat.color")' },
|
|
9190
9473
|
remediation: { type: "string", description: "Recommended fix for the issue" },
|
|
9191
|
-
impact_description: { type: "string", description: "Description of the user impact" }
|
|
9192
|
-
discovered_in: { type: "string", description: "Page or component where the issue was found" }
|
|
9474
|
+
impact_description: { type: "string", description: "Description of the user impact" }
|
|
9193
9475
|
},
|
|
9194
9476
|
// A11yStandardProperties: Accessibility standard.
|
|
9195
9477
|
a11y_standard: {
|
|
@@ -9255,7 +9537,6 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
9255
9537
|
agent_scope: { type: "string", description: "Boundaries of what this agent can act on" },
|
|
9256
9538
|
goal: { type: "string", description: "Primary objective the agent is trying to achieve" },
|
|
9257
9539
|
backstory: { type: "string", description: "Context or persona narrative for the agent" },
|
|
9258
|
-
model_ref: { type: "string", description: "Reference to the AI model powering this agent" },
|
|
9259
9540
|
allow_delegation: { type: "boolean", description: "Whether the agent can delegate tasks to other agents" },
|
|
9260
9541
|
memory_enabled: { type: "boolean", description: "Whether the agent retains memory across sessions" },
|
|
9261
9542
|
max_iterations: { type: "number", description: "Maximum number of reasoning iterations allowed" },
|
|
@@ -9279,7 +9560,6 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
9279
9560
|
turns: { type: "number", description: "Number of conversational turns in the session" },
|
|
9280
9561
|
tokens_used: { type: "number", description: "Total tokens consumed during the session" },
|
|
9281
9562
|
cost: { type: "number", description: "Total monetary cost of the session" },
|
|
9282
|
-
tools_invoked: { type: "string[]", description: "List of tools invoked during the session" },
|
|
9283
9563
|
error_count: { type: "number", description: "Number of errors encountered during the session" },
|
|
9284
9564
|
session_status: { type: "string", enum: ["active", "completed", "errored", "timed_out"], description: "Current status of the session" },
|
|
9285
9565
|
output_summary: { type: "string", description: "Brief summary of the session's output" }
|
|
@@ -9295,7 +9575,6 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
9295
9575
|
description: { type: "string", description: "What the agent should accomplish" },
|
|
9296
9576
|
expected_output: { type: "string", description: "Description of the expected output format or content" },
|
|
9297
9577
|
context: { type: "string", description: "Additional context provided to the agent for this task" },
|
|
9298
|
-
tools: { type: "string[]", description: "Tools the agent may use for this task" },
|
|
9299
9578
|
output_file: { type: "string", description: "File path where the agent should write output" },
|
|
9300
9579
|
blocking: { type: "boolean", description: "Whether this task blocks downstream tasks" },
|
|
9301
9580
|
priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Relative priority of this task" }
|
|
@@ -9337,7 +9616,6 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
9337
9616
|
summary_metrics: { type: "string", description: "Key-metric summary" },
|
|
9338
9617
|
started_at: { type: "string", description: "ISO timestamp started" },
|
|
9339
9618
|
completed_at: { type: "string", description: "ISO timestamp completed" },
|
|
9340
|
-
foundation_model: { type: "string", description: "Foundation starting model" },
|
|
9341
9619
|
training_steps: { type: "number", description: "Training steps or epochs completed" },
|
|
9342
9620
|
artifact_uri: { type: "string", description: "Produced artifact URI" },
|
|
9343
9621
|
notes: { type: "string", description: "Free-text notes" },
|
|
@@ -9568,7 +9846,6 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
9568
9846
|
environment: { type: "string", description: 'Observed environment (e.g. "prod", "staging", "iOS 17.4")' },
|
|
9569
9847
|
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)." },
|
|
9570
9848
|
assignee: { type: "string", description: "Assigned person" },
|
|
9571
|
-
affected_version: { type: "string", description: "Product version where first observed. Helps triage regressions." },
|
|
9572
9849
|
due_date: { type: "string", description: "ISO date due. Often tied to a release gate or SLA." },
|
|
9573
9850
|
labels: { type: "string[]", description: "Free-form classification tags. Applied uniformly across work item types." }
|
|
9574
9851
|
},
|
|
@@ -9584,9 +9861,9 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
9584
9861
|
business_model: {
|
|
9585
9862
|
framework_id: { type: "string", description: "Framework ID (references `UPGFramework.id`)" },
|
|
9586
9863
|
stage: { type: "string", enum: ["draft", "validated", "active"], description: "Maturity" },
|
|
9587
|
-
pattern: { type: "string", enum: ["freemium", "marketplace", "saas", "subscription", "transactional", "advertising", "licensing", "hybrid"], description: "Canonical pattern. Useful for benchmarking against peer businesses with the same shape." }
|
|
9588
|
-
monetisation_basis
|
|
9589
|
-
north_star_metric
|
|
9864
|
+
pattern: { type: "string", enum: ["freemium", "marketplace", "saas", "subscription", "transactional", "advertising", "licensing", "hybrid"], description: "Canonical pattern. Useful for benchmarking against peer businesses with the same shape." }
|
|
9865
|
+
// monetisation_basis removed in 0.12.0 (P14 Bucket C) — categorical rollup of revenue_stream.billing_model.
|
|
9866
|
+
// north_star_metric removed in 0.12.0 (P14) → `business_model_guided_by_metric` edge.
|
|
9590
9867
|
},
|
|
9591
9868
|
// CapabilityProperties: Capability entity.
|
|
9592
9869
|
capability: {
|
|
@@ -9654,8 +9931,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
9654
9931
|
// ClassificationAxisProperties: ClassificationAxis: a dimension along which subjects are classified.
|
|
9655
9932
|
classification_axis: {
|
|
9656
9933
|
axis_kind: { type: "string", enum: ["categorical", "ordinal", "continuous"], description: "Structural kind of values on this axis. `categorical` = discrete, unordered (most common; CMS architectures). `ordinal` = discrete, ordered (maturity tiers, T-shirt sizes). `continuous` = numeric range (latency budget, price points)." },
|
|
9657
|
-
cardinality: { type: "string", enum: ["single", "multi"], description: 'How many values a subject may hold on this axis at once (UPG 0.11.3). `single` (default) = a subject sits at exactly one value; a re-classification to a new value SUPERSEDES the prior one (the classify writer retires the old same-axis edge and records the move in the reclassification history). `multi` = a subject may legitimately hold several values at once (e.g. an axis like "supported frameworks"); re-classifying ADDS a value and does not supersede. A separate axis from `axis_kind`: an axis can be `categorical` (unordered) yet `single`-select, or `categorical` yet `multi`-select.' }
|
|
9658
|
-
owner_product: { type: "string", description: "Product id when product-specific. Axes are usually product-agnostic; leave empty for shared taxonomies." }
|
|
9934
|
+
cardinality: { type: "string", enum: ["single", "multi"], description: 'How many values a subject may hold on this axis at once (UPG 0.11.3). `single` (default) = a subject sits at exactly one value; a re-classification to a new value SUPERSEDES the prior one (the classify writer retires the old same-axis edge and records the move in the reclassification history). `multi` = a subject may legitimately hold several values at once (e.g. an axis like "supported frameworks"); re-classifying ADDS a value and does not supersede. A separate axis from `axis_kind`: an axis can be `categorical` (unordered) yet `single`-select, or `categorical` yet `multi`-select.' }
|
|
9659
9935
|
},
|
|
9660
9936
|
// ClassificationValueProperties: ClassificationValue: a value on a classification axis.
|
|
9661
9937
|
classification_value: {
|
|
@@ -10024,8 +10300,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10024
10300
|
decision_outcome: { type: "string", description: "Outcome text. What was decided. Separate from `rationale` (which explains why)." },
|
|
10025
10301
|
consequences: { type: "string", description: `Known positive and negative consequences. Mirrors MADR's "Consequences" section.` },
|
|
10026
10302
|
decision_makers: { type: "string[]", description: `People who made the decision. Mirrors MADR's "Deciders" field.` },
|
|
10027
|
-
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"]` }
|
|
10028
|
-
superseded_by: { type: "string", description: "Reference to the superseding decision, if any." }
|
|
10303
|
+
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"]` }
|
|
10029
10304
|
},
|
|
10030
10305
|
// DeliverableProperties: Deliverable.
|
|
10031
10306
|
deliverable: {
|
|
@@ -10559,7 +10834,6 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10559
10834
|
end_date: { type: "string", description: "ISO end date" },
|
|
10560
10835
|
budget_amount: { type: "number", description: "Total allocated budget. Use with `budget_currency`." },
|
|
10561
10836
|
budget_currency: { type: "string", description: 'ISO 4217 currency code (e.g. "USD", "EUR", "GBP")' },
|
|
10562
|
-
channels_targeted: { type: "string[]", description: 'Channels the campaign runs across. Free-form so partner channels and ad networks both fit (e.g. "google_ads", "linkedin", "podcast_sponsorship").' },
|
|
10563
10837
|
primary_kpi: { type: "string", description: 'Primary KPI optimised for (e.g. "qualified_signups", "MQL_volume", "activated_teams")' },
|
|
10564
10838
|
kpi_target: { type: "number", description: "Numeric target for `primary_kpi` over the campaign window" },
|
|
10565
10839
|
utm_parameters: { type: "string", description: "UTM tracking parameters for this campaign" },
|
|
@@ -10593,7 +10867,6 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10593
10867
|
required: ["value", "label"]
|
|
10594
10868
|
},
|
|
10595
10869
|
user_facing: { type: "boolean", description: "Visible to end users" },
|
|
10596
|
-
root_cause: { type: "string", description: "Identified cause" },
|
|
10597
10870
|
remediation: { type: "string", description: "Remediation steps" }
|
|
10598
10871
|
},
|
|
10599
10872
|
// HelpVideoProperties: Help video.
|
|
@@ -10847,7 +11120,6 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10847
11120
|
// JourneyStepProperties: Single step within a user journey. A user-moment on the journey's single
|
|
10848
11121
|
journey_step: {
|
|
10849
11122
|
step_order: { type: "number", description: "Display order within the journey's step timeline (0-indexed). The scalar ordering convention shared with `journey_phase.phase_order` and `journey_action.action_order` (UPG-663). For branching journeys, the explicit `journey_step_precedes_journey_step` edge captures the chain." },
|
|
10850
|
-
touchpoint: { type: "string", description: "@deprecated since v0.9.9 (UPG-675). Touchpoints are modelled in two places, neither of which is this string: the `touchpoint` *entity* is the cross-channel customer-success layer (`touchpoint_occurs_in_journey_step`), and `journey_action` is the in-product blueprint layer (the finest band of a `journey_step`). Use one of those rather than a free-text string here. Removed in a future major." },
|
|
10851
11123
|
channel: { type: "string", description: 'Channel (e.g. "web", "email", "in-store")' },
|
|
10852
11124
|
emotion_score: {
|
|
10853
11125
|
type: "assessment",
|
|
@@ -10920,8 +11192,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10920
11192
|
// LaunchProperties: Launch entity.
|
|
10921
11193
|
launch: {
|
|
10922
11194
|
launch_type: { type: "string", enum: ["soft", "beta", "public", "feature"], description: "Scale and audience of the launch" },
|
|
10923
|
-
target_date: { type: "string", description: "Planned launch date (ISO format)" }
|
|
10924
|
-
success_metrics: { type: "string[]", description: "Metrics that define launch success" }
|
|
11195
|
+
target_date: { type: "string", description: "Planned launch date (ISO format)" }
|
|
10925
11196
|
},
|
|
10926
11197
|
// LeadProperties: Lead.
|
|
10927
11198
|
lead: {
|
|
@@ -11081,7 +11352,6 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
11081
11352
|
range_min: { type: "number", description: "Minimum expected or baseline value" },
|
|
11082
11353
|
range_max: { type: "number", description: "Maximum expected or ceiling value" },
|
|
11083
11354
|
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." },
|
|
11084
|
-
data_source: { type: "string", description: 'Data source or tool that feeds this metric (e.g. "PostHog", "Stripe")' },
|
|
11085
11355
|
owner: { type: "string", description: "Person or team responsible for tracking this metric" },
|
|
11086
11356
|
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`)." },
|
|
11087
11357
|
guardrail_threshold_min: { type: "number", description: "Lower bound for guardrail safety (below this = breach)" },
|
|
@@ -11099,8 +11369,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
11099
11369
|
quality_related: { type: "boolean", description: "Quality signal: metric relates to other key metrics in the system" },
|
|
11100
11370
|
quality_score: { type: "number", description: "Computed quality score across all quality signals (0\u20135)" },
|
|
11101
11371
|
proxy_reason: { type: "string", enum: ["qualitative", "no_direct_measure", "not_yet_instrumented", "too_expensive"], description: "Why this metric is used as a proxy instead of measuring directly" },
|
|
11102
|
-
proxy_confidence: { type: "string", enum: ["strong", "moderate", "weak"], description: "How strongly this metric predicts the direct measure" }
|
|
11103
|
-
proxy_alternatives: { type: "string[]", description: "Other metrics considered as proxy candidates" }
|
|
11372
|
+
proxy_confidence: { type: "string", enum: ["strong", "moderate", "weak"], description: "How strongly this metric predicts the direct measure" }
|
|
11104
11373
|
},
|
|
11105
11374
|
// MilestoneProperties: Milestone.
|
|
11106
11375
|
milestone: {
|
|
@@ -11116,7 +11385,6 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
11116
11385
|
},
|
|
11117
11386
|
// ModelComparisonProperties: Model comparison.
|
|
11118
11387
|
model_comparison: {
|
|
11119
|
-
model_ids: { type: "string[]", description: "Compared model identifiers" },
|
|
11120
11388
|
comparison_criteria: { type: "string[]", description: 'Comparison dimensions (e.g. "accuracy", "cost", "latency")' },
|
|
11121
11389
|
comparison_date: { type: "string", description: "ISO conduct date" }
|
|
11122
11390
|
},
|
|
@@ -11293,7 +11561,6 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
11293
11561
|
// ParticipantProperties: Research participant.
|
|
11294
11562
|
participant: {
|
|
11295
11563
|
alias: { type: "string", description: 'Anonymous alias for privacy (e.g. "P01")' },
|
|
11296
|
-
segment: { type: "string", description: "User segment this participant belongs to" },
|
|
11297
11564
|
recruit_source: { type: "string", description: "How the participant was recruited" },
|
|
11298
11565
|
consent_status: { type: "string", enum: ["pending", "given", "withdrawn"], description: "Current consent status for data usage" }
|
|
11299
11566
|
},
|
|
@@ -11449,8 +11716,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
11449
11716
|
version: { type: "string", description: "Version identifier of the policy" },
|
|
11450
11717
|
last_updated: { type: "string", description: "Date the policy was last updated (ISO format)" },
|
|
11451
11718
|
effective_date: { type: "string", description: "Date the policy takes effect (ISO format)" },
|
|
11452
|
-
url: { type: "string", description: "URL where the policy is published" }
|
|
11453
|
-
regulations: { type: "string[]", description: 'Regulations this policy addresses (e.g. "GDPR", "CCPA")' }
|
|
11719
|
+
url: { type: "string", description: "URL where the policy is published" }
|
|
11454
11720
|
},
|
|
11455
11721
|
// ProductProperties: The product being created. Root of the graph.
|
|
11456
11722
|
product: {
|
|
@@ -11842,7 +12108,6 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
11842
12108
|
},
|
|
11843
12109
|
// ServiceLevelIndicatorProperties: Service Level Indicator.
|
|
11844
12110
|
service_level_indicator: {
|
|
11845
|
-
metric_name: { type: "string", description: 'Indicator metric name. @example "Request latency p99", "Error rate", "Availability"' },
|
|
11846
12111
|
threshold: { type: "number", description: 'Threshold that defines a "good" event. @example 200 (ms latency), 0.01 (1% error rate), 99.9 (% availability)' },
|
|
11847
12112
|
current_value: { type: "number", description: "Current observed value. Compared against `threshold` for SLO compliance. @example 150 (ms), 0.003 (0.3% error rate)", modifier: "snapshot" },
|
|
11848
12113
|
unit: { type: "string", description: 'Unit of measurement. Required to interpret `threshold` and `current_value`. @example "ms", "%", "req/s", "errors/min"' },
|
|
@@ -12000,7 +12265,6 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
12000
12265
|
},
|
|
12001
12266
|
// SubscriptionProperties: Subscription.
|
|
12002
12267
|
subscription: {
|
|
12003
|
-
plan_name: { type: "string", description: "Name of the subscribed plan" },
|
|
12004
12268
|
monthly_recurring_revenue: { type: "number", description: "Monthly recurring revenue from this subscription" },
|
|
12005
12269
|
start_date: { type: "string", description: "Subscription start date (ISO format)" },
|
|
12006
12270
|
renewal_date: { type: "string", description: "Next renewal date (ISO format)" },
|
|
@@ -12093,8 +12357,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
12093
12357
|
team_okr: {
|
|
12094
12358
|
period: { type: "string", description: 'Time period for the OKR (e.g. "Q2 2026")' },
|
|
12095
12359
|
progress: { type: "number", description: "Overall progress toward the objective (0-100%)" },
|
|
12096
|
-
objective_statement: { type: "string", description: "The team-level objective statement (key results live in child entities)" }
|
|
12097
|
-
cascade_from: { type: "string", description: "Higher-level objective this OKR cascades from (company or department OKR)" }
|
|
12360
|
+
objective_statement: { type: "string", description: "The team-level objective statement (key results live in child entities)" }
|
|
12098
12361
|
},
|
|
12099
12362
|
// TechnicalDebtItemProperties: Technical debt item.
|
|
12100
12363
|
technical_debt_item: {
|
|
@@ -12347,7 +12610,6 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
12347
12610
|
},
|
|
12348
12611
|
cvss_version: { type: "string", enum: ["v3.1", "v4.0"], description: 'CVSS scoring version. v3.1 and v4.0 differ significantly for the same vulnerability. @example "v4.0" for vulnerabilities scored after the v4.0 release in 2023' },
|
|
12349
12612
|
affected_component: { type: "string", description: 'Affected component, library, or system. @example "lodash", "openssl", "login service"' },
|
|
12350
|
-
affected_package: { type: "string", description: 'Affected package with version. More precise than `affected_component`. @example "lodash@4.17.20", "openssl@1.1.1q"' },
|
|
12351
12613
|
exploit_maturity: { type: "string", enum: ["no_known_exploit", "proof_of_concept", "functional_exploit", "active_exploitation"], description: 'Exploit maturity. Primary prioritisation factor after severity. `no_known_exploit` = theoretical. `proof_of_concept` = exploit code exists, not weaponised. `functional_exploit` = working exploit available. `active_exploitation` = active in the wild. @example "active_exploitation" demands immediate response regardless of severity score' },
|
|
12352
12614
|
fix_available: { type: "boolean", description: "Patch availability. Common triage question after severity. @example false for a zero-day with no available patch" },
|
|
12353
12615
|
disclosed_at: { type: "string", description: 'ISO date publicly disclosed. Time since disclosure matters for SLA. @example "2024-03-15"' },
|
|
@@ -12372,7 +12634,6 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
12372
12634
|
// WireframeProperties: Wireframe.
|
|
12373
12635
|
wireframe: {
|
|
12374
12636
|
fidelity: { type: "string", enum: ["low", "medium", "high"], description: "Detail level" },
|
|
12375
|
-
screen_name: { type: "string", description: "Represented screen name" },
|
|
12376
12637
|
version: { type: "string", description: 'Version or iteration (e.g. "v2", "2026-04-B")' },
|
|
12377
12638
|
tool: { type: "string", description: 'Authoring tool. @example "Figma", "Balsamiq", "pen and paper"' },
|
|
12378
12639
|
review_status: { type: "string", enum: ["draft", "in_review", "approved", "rejected"], description: "Review gate status" },
|
|
@@ -28659,7 +28920,7 @@ function isCanonical(text) {
|
|
|
28659
28920
|
}
|
|
28660
28921
|
|
|
28661
28922
|
// src/index.ts
|
|
28662
|
-
var UPG_VERSION = "0.
|
|
28923
|
+
var UPG_VERSION = "0.12.0";
|
|
28663
28924
|
var UPG_FORMAT_VERSION = "0.4.0";
|
|
28664
28925
|
var MARKDOWN_FORMAT_VERSION = "0.1";
|
|
28665
28926
|
var UPG_TYPES = getTypes();
|
|
@@ -28793,6 +29054,7 @@ export {
|
|
|
28793
29054
|
UPG_REGION_COUNT,
|
|
28794
29055
|
UPG_REGION_MAP,
|
|
28795
29056
|
UPG_RELATIONSHIP_BENCHMARKS,
|
|
29057
|
+
UPG_SCALAR_TO_EDGE_MIGRATIONS,
|
|
28796
29058
|
UPG_SCALES,
|
|
28797
29059
|
UPG_SPLIT_MIGRATIONS,
|
|
28798
29060
|
UPG_STATUS_MIGRATIONS,
|
|
@@ -28861,6 +29123,7 @@ export {
|
|
|
28861
29123
|
getRegionForEntityType,
|
|
28862
29124
|
getReplacementType,
|
|
28863
29125
|
getRingForDomain,
|
|
29126
|
+
getScalarToEdgeMigrations,
|
|
28864
29127
|
getScale,
|
|
28865
29128
|
getSplitMigrations,
|
|
28866
29129
|
getTreePattern,
|