@unified-product-graph/core 0.13.0 → 0.13.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1466,6 +1466,25 @@ var UPG_EDGE_CATALOG = {
1466
1466
  // the common case where the product lives in another graph; this catalog entry is
1467
1467
  // the within-graph degenerate case (a product's own landing page).
1468
1468
  screen_markets_product: { forward_verb: "markets", reverse_verb: "marketed_by", classification: "semantic", source_type: "screen", target_type: "product" },
1469
+ // Connective cross-product references (0.13.1, Data's connective-layer brief).
1470
+ // Dual-registered (also in UPG_CROSS_EDGE_TYPES) for the common cross-graph case;
1471
+ // these catalog entries are the within-graph degenerate case.
1472
+ // - screen_targets_competitor: a comparison / "vs" / positioning screen targets a
1473
+ // competitor (the competitor typically lives in a watched competitor-intel graph).
1474
+ // - feature_surfaces_product: a feature surfaces / embeds another product (a "Canvas"
1475
+ // feature that IS the Canvas product embedded). The feature-granular sibling of
1476
+ // depends_on_product; wires the portfolio from islands into a mesh.
1477
+ // - feature_uses_design_component: a feature consumes a shared design_component (the
1478
+ // feature sibling of screen_renders_design_component; the component lives in the
1479
+ // design-system product graph).
1480
+ // - product_implements_design_system: a product adopts / implements the shared design
1481
+ // system (the adoption semantic, mirroring product_implements_specification). Distinct
1482
+ // from the hierarchy `product_systematised_in_design_system` (structural containment):
1483
+ // same pattern as brand (branded_as = hierarchy, expresses = semantic).
1484
+ screen_targets_competitor: { forward_verb: "targets", reverse_verb: "targeted_by", classification: "semantic", source_type: "screen", target_type: "competitor" },
1485
+ feature_surfaces_product: { forward_verb: "surfaces", reverse_verb: "surfaced_by", classification: "semantic", source_type: "feature", target_type: "product" },
1486
+ feature_uses_design_component: { forward_verb: "uses", reverse_verb: "used_by", classification: "semantic", source_type: "feature", target_type: "design_component" },
1487
+ product_implements_design_system: { forward_verb: "implements", reverse_verb: "implemented_by", classification: "semantic", source_type: "product", target_type: "design_system" },
1469
1488
  screen_navigates_to_screen: { forward_verb: "navigates_to", reverse_verb: "navigated_from", classification: "hierarchy", source_type: "screen", target_type: "screen" },
1470
1489
  screen_surfaces_feature: { forward_verb: "surfaces", reverse_verb: "surfaced_on", classification: "cross-domain", source_type: "screen", target_type: "feature" },
1471
1490
  screen_wireframed_as_wireframe: { forward_verb: "wireframed_as", reverse_verb: "wireframes", classification: "hierarchy", source_type: "screen", target_type: "wireframe" },
@@ -3147,7 +3166,15 @@ var UPG_CROSS_EDGE_TYPES = [
3147
3166
  "journey_phase_realises_operating_stage",
3148
3167
  "screen_markets_product",
3149
3168
  "screen_renders_design_component",
3150
- "product_expresses_brand_identity"
3169
+ "product_expresses_brand_identity",
3170
+ // Connective cross-product layer (0.13.1) — see UPGCrossEdgeType above.
3171
+ "shares_job",
3172
+ "shares_need",
3173
+ "persona_delegates_to_persona",
3174
+ "screen_targets_competitor",
3175
+ "feature_surfaces_product",
3176
+ "feature_uses_design_component",
3177
+ "product_implements_design_system"
3151
3178
  ];
3152
3179
  var REGISTRY_PRODUCT_ID = "registry";
3153
3180
 
@@ -9722,9 +9749,9 @@ var UPG_PROPERTY_SCHEMA = {
9722
9749
  method: { type: "string", enum: ["automated", "manual", "assistive_tech", "expert"], description: "How the audit was conducted" },
9723
9750
  scope: { type: "string", description: 'What was audited (e.g. "homepage", "checkout flow")' },
9724
9751
  conformance_result: { type: "string", enum: ["pass", "partial", "fail"], description: "Overall conformance result" },
9725
- violations_count: { type: "number", description: "Number of accessibility violations found" },
9726
- passes_count: { type: "number", description: "Number of checks that passed" },
9727
- incomplete_count: { type: "number", description: "Number of checks that could not be completed" },
9752
+ violations_count: { type: "number", description: "Number of accessibility violations found", modifier: "derived" },
9753
+ passes_count: { type: "number", description: "Number of checks that passed", modifier: "derived" },
9754
+ incomplete_count: { type: "number", description: "Number of checks that could not be completed", modifier: "derived" },
9728
9755
  score: { type: "number", description: "Aggregate accessibility score (0-100)" },
9729
9756
  tool: { type: "string", enum: ["axe-core", "lighthouse", "wave", "manual", "other"], description: "Tool used to perform the audit" },
9730
9757
  tool_version: { type: "string", description: "Version of the audit tool" },
@@ -9784,14 +9811,14 @@ var UPG_PROPERTY_SCHEMA = {
9784
9811
  account: {
9785
9812
  account_type: { type: "string", enum: ["prospect", "customer", "partner", "churned"], description: "Relationship status of this account" },
9786
9813
  industry: { type: "string", description: "Industry vertical the account operates in" },
9787
- employee_count: { type: "number", description: "Number of employees at the account" },
9814
+ employee_count: { type: "number", description: "Number of employees at the account", modifier: "snapshot" },
9788
9815
  annual_revenue: { type: "number", description: "Annual revenue of the account" }
9789
9816
  },
9790
9817
  // AcquisitionChannelProperties: AcquisitionChannel entity.
9791
9818
  acquisition_channel: {
9792
9819
  channel_type: { type: "string", enum: ["seo", "paid", "social", "referral", "direct", "content"], description: "Category of the acquisition channel" },
9793
9820
  customer_acquisition_cost: { type: "number", description: "Customer acquisition cost for this channel" },
9794
- monthly_volume: { type: "number", description: "Monthly volume of new users from this channel" }
9821
+ monthly_volume: { type: "number", description: "Monthly volume of new users from this channel", modifier: "snapshot" }
9795
9822
  },
9796
9823
  // AdCreativeProperties: Ad creative.
9797
9824
  ad_creative: {
@@ -9806,7 +9833,7 @@ var UPG_PROPERTY_SCHEMA = {
9806
9833
  // AffinityClusterProperties: Affinity cluster grouping observations.
9807
9834
  affinity_cluster: {
9808
9835
  theme: { type: "string", description: "Emergent theme label" },
9809
- child_observation_count: { type: "number", description: "Observations in this cluster" },
9836
+ child_observation_count: { type: "number", description: "Observations in this cluster", modifier: "derived" },
9810
9837
  confidence: {
9811
9838
  type: "assessment",
9812
9839
  scale_id: "confidence_5",
@@ -9840,7 +9867,7 @@ var UPG_PROPERTY_SCHEMA = {
9840
9867
  hook_event: { type: "string", description: "Event that triggers this hook" },
9841
9868
  hook_action: { type: "string", description: "Action performed when the hook fires" },
9842
9869
  hook_status: { type: "string", enum: ["active", "disabled", "error"], description: "Operational status of the hook" },
9843
- execution_count: { type: "number", description: "Number of times this hook has fired" }
9870
+ execution_count: { type: "number", description: "Number of times this hook has fired", modifier: "snapshot" }
9844
9871
  },
9845
9872
  // AgentSessionProperties: Agent session.
9846
9873
  agent_session: {
@@ -9857,7 +9884,7 @@ var UPG_PROPERTY_SCHEMA = {
9857
9884
  agent_skill: {
9858
9885
  skill_trigger: { type: "string", description: "Event or command that activates this skill" },
9859
9886
  skill_description: { type: "string", description: "Human-readable description of what the skill does" },
9860
- invocation_count: { type: "number", description: "Number of times this skill has been invoked" }
9887
+ invocation_count: { type: "number", description: "Number of times this skill has been invoked", modifier: "snapshot" }
9861
9888
  },
9862
9889
  // AgentTaskProperties: Agent task. A discrete task assigned to an agent.
9863
9890
  agent_task: {
@@ -9889,7 +9916,7 @@ var UPG_PROPERTY_SCHEMA = {
9889
9916
  ai_dataset: {
9890
9917
  dataset_type: { type: "string", enum: ["training", "evaluation", "fine_tuning", "rlhf", "synthetic"], description: "Purpose" },
9891
9918
  version: { type: "string", description: "Version" },
9892
- record_count: { type: "number", description: "Records" },
9919
+ record_count: { type: "number", description: "Records", modifier: "snapshot" },
9893
9920
  format: { type: "string", description: 'Format (e.g. "jsonl", "csv", "parquet")' },
9894
9921
  storage_uri: { type: "string", description: "Storage URI" },
9895
9922
  checksum: { type: "string", description: "Integrity hash" },
@@ -9914,7 +9941,7 @@ var UPG_PROPERTY_SCHEMA = {
9914
9941
  ai_guardrail: {
9915
9942
  guardrail_type: { type: "string", enum: ["content_filter", "rate_limit", "token_limit", "safety", "custom"], description: "Protection category" },
9916
9943
  enforcement: { type: "string", enum: ["block", "warn", "log"], description: "Action when triggered" },
9917
- trigger_count: { type: "number", description: "Times triggered" }
9944
+ trigger_count: { type: "number", description: "Times triggered", modifier: "snapshot" }
9918
9945
  },
9919
9946
  // AiModelProperties: AI model.
9920
9947
  ai_model: {
@@ -9922,10 +9949,10 @@ var UPG_PROPERTY_SCHEMA = {
9922
9949
  model_id: { type: "string", description: 'Unique model identifier (e.g. "claude-sonnet-4-20250514")' },
9923
9950
  model_version: { type: "string", description: "Specific version" },
9924
9951
  model_purpose: { type: "string", description: "Intended use case" },
9925
- cost_per_1k_tokens: { type: "number", description: "Cost per 1,000 tokens" },
9952
+ cost_per_1k_tokens: { type: "number", description: "Cost per 1,000 tokens", modifier: "snapshot" },
9926
9953
  context_window: { type: "number", description: "Maximum context window (tokens)" },
9927
- latency_p50_ms: { type: "number", description: "Median latency (p50, ms)" },
9928
- latency_p99_ms: { type: "number", description: "Tail latency (p99, ms)" },
9954
+ latency_p50_ms: { type: "number", description: "Median latency (p50, ms)", modifier: "snapshot" },
9955
+ latency_p99_ms: { type: "number", description: "Tail latency (p99, ms)", modifier: "snapshot" },
9929
9956
  input_schema: { type: "string", description: "Expected input format or schema" },
9930
9957
  output_schema: { type: "string", description: "Expected output format or schema" },
9931
9958
  aliases: { type: "string[]", description: "Alternative names" },
@@ -9969,8 +9996,8 @@ var UPG_PROPERTY_SCHEMA = {
9969
9996
  // ApiEcosystemProperties: API ecosystem.
9970
9997
  api_ecosystem: {
9971
9998
  api_style: { type: "string", enum: ["rest", "graphql", "grpc", "webhook", "mixed"], description: "Primary API architecture style" },
9972
- developer_count: { type: "number", description: "Number of registered developers" },
9973
- app_count: { type: "number", description: "Number of apps built on the API" }
9999
+ developer_count: { type: "number", description: "Number of registered developers", modifier: "snapshot" },
10000
+ app_count: { type: "number", description: "Number of apps built on the API", modifier: "derived" }
9974
10001
  },
9975
10002
  // ApiEndpointProperties: API endpoint.
9976
10003
  api_endpoint: {
@@ -10041,7 +10068,7 @@ var UPG_PROPERTY_SCHEMA = {
10041
10068
  // BetaProgramProperties: Beta program.
10042
10069
  beta_program: {
10043
10070
  beta_type: { type: "string", enum: ["closed", "open", "invite_only"], description: "Access model for the beta" },
10044
- participant_count: { type: "number", description: "Number of users participating in the beta" }
10071
+ participant_count: { type: "number", description: "Number of users participating in the beta", modifier: "snapshot" }
10045
10072
  },
10046
10073
  // BoundedContextProperties: DDD bounded context.
10047
10074
  bounded_context: {
@@ -10199,7 +10226,7 @@ var UPG_PROPERTY_SCHEMA = {
10199
10226
  // ChurnReasonProperties: Churn reason.
10200
10227
  churn_reason: {
10201
10228
  category: { type: "string", description: "High-level category of the churn reason" },
10202
- frequency_count: { type: "number", description: "Exact count of times this reason has been cited in `frequency_period`" },
10229
+ frequency_count: { type: "number", description: "Exact count of times this reason has been cited in `frequency_period`", modifier: "snapshot" },
10203
10230
  frequency_period: { type: "string", description: "The recurrence period the count is measured over (ISO-8601 `Duration`, e.g. `'P30D'`)" },
10204
10231
  frequency_rating: { type: "string", enum: ["constant", "regular", "occasional", "rare", "other"], description: "Qualitative frequency tier when an exact count is not known" },
10205
10232
  contributing_factors: { type: "string[]", description: "Other factors that contributed to the churn" },
@@ -10214,8 +10241,8 @@ var UPG_PROPERTY_SCHEMA = {
10214
10241
  avg_duration: { type: "string", description: 'Average run duration across recent executions. @example "4m 30s", "12 minutes"' },
10215
10242
  last_run_status: { type: "string", enum: ["success", "failure", "cancelled", "skipped", "in_progress"], description: "Result of the most recent run. Current health indicator." },
10216
10243
  target_branch: { type: "string", description: 'Primary branch. The branch that triggers production deployments. @example "main", "release/*"' },
10217
- run_count: { type: "number", description: "Total runs since creation. Indicates activity level. @example 1452" },
10218
- success_rate: { type: "number", description: "Reliability metric for the pipeline itself: % of runs that succeed. @example 94.3" }
10244
+ run_count: { type: "number", description: "Total runs since creation. Indicates activity level. @example 1452", modifier: "snapshot" },
10245
+ success_rate: { type: "number", description: "Reliability metric for the pipeline itself: % of runs that succeed. @example 94.3", modifier: "snapshot" }
10219
10246
  },
10220
10247
  // ClassificationAxisProperties: ClassificationAxis: a dimension along which subjects are classified.
10221
10248
  classification_axis: {
@@ -10254,8 +10281,8 @@ var UPG_PROPERTY_SCHEMA = {
10254
10281
  // CommunityInitiativeProperties: Community initiative.
10255
10282
  community_initiative: {
10256
10283
  initiative_type: { type: "string", enum: ["forum", "discord", "slack", "meetup", "ambassador", "other"], description: "Platform or format for the community" },
10257
- member_count: { type: "number", description: "Current number of community members" },
10258
- engagement_rate: { type: "number", description: "Percentage of members actively participating" }
10284
+ member_count: { type: "number", description: "Current number of community members", modifier: "snapshot" },
10285
+ engagement_rate: { type: "number", description: "Percentage of members actively participating", modifier: "snapshot" }
10259
10286
  },
10260
10287
  // CompetitiveAnalysisProperties: Competitive analysis exercise or snapshot.
10261
10288
  competitive_analysis: {
@@ -10281,7 +10308,7 @@ var UPG_PROPERTY_SCHEMA = {
10281
10308
  },
10282
10309
  // CompetitiveBattleCardProperties: CompetitiveBattleCard entity.
10283
10310
  competitive_battle_card: {
10284
- win_rate: { type: "number", description: "Historical win rate against this competitor (0-100%)" },
10311
+ win_rate: { type: "number", description: "Historical win rate against this competitor (0-100%)", modifier: "snapshot" },
10285
10312
  key_differentiators: { type: "string", description: "Summary of key differentiators versus this competitor" }
10286
10313
  },
10287
10314
  // CompetitorProperties: A product or approach competing for the same user need.
@@ -10385,7 +10412,7 @@ var UPG_PROPERTY_SCHEMA = {
10385
10412
  content_calendar: {
10386
10413
  calendar_period: { type: "string", description: 'Covered period (e.g. "Q2 2026")' },
10387
10414
  publish_cadence: { type: "string", enum: ["continuous", "hourly", "daily", "weekly", "monthly", "quarterly", "yearly", "on_demand", "other"], description: "Publishing cadence (canonical `Cadence` since v0.4.0). Retyped from the legacy free-form `publish_cadence: string`. For exact rates (\"3 per week\"), set `frequency_count` + `frequency_period`. BREAKING in v0.4.0: previous string values like `\"3x/week\"` no longer type-check. Map to `'weekly'` + `frequency_count: 3` + `frequency_period: 'P7D'`." },
10388
- frequency_count: { type: "number", description: "Exact count in the period. Pairs with `frequency_period`." },
10415
+ frequency_count: { type: "number", description: "Exact count in the period. Pairs with `frequency_period`.", modifier: "snapshot" },
10389
10416
  frequency_period: { type: "string", description: "Recurrence period (ISO-8601 `Duration`, e.g. `'P7D'`)" },
10390
10417
  frequency_rating: { type: "string", enum: ["constant", "regular", "occasional", "rare", "other"], description: "Qualitative rate tier when an exact rate is unknown" }
10391
10418
  },
@@ -10400,7 +10427,7 @@ var UPG_PROPERTY_SCHEMA = {
10400
10427
  content_types: { type: "string[]", description: "Types of content to produce" },
10401
10428
  distribution_channels: { type: "string[]", description: "Channels where content will be distributed" },
10402
10429
  cadence: { type: "string", enum: ["continuous", "hourly", "daily", "weekly", "monthly", "quarterly", "yearly", "on_demand", "other"], description: "Publishing cadence (canonical `Cadence` since v0.4.0). Retyped from the legacy free-form `cadence: string` (e.g. \"2x/week\"). For exact rates, set `frequency_count` + `frequency_period`. BREAKING in v0.4.0: previous string values like `\"2x/week\"` no longer type-check. Map to `'weekly'` + `frequency_count: 2` + `frequency_period: 'P7D'`." },
10403
- frequency_count: { type: "number", description: "Exact count of publications in the period. Pairs with `frequency_period`." },
10430
+ frequency_count: { type: "number", description: "Exact count of publications in the period. Pairs with `frequency_period`.", modifier: "snapshot" },
10404
10431
  frequency_period: { type: "string", description: "Recurrence period (ISO-8601 `Duration`, e.g. `'P7D'`)" },
10405
10432
  frequency_rating: { type: "string", enum: ["constant", "regular", "occasional", "rare", "other"], description: "Qualitative rate tier when an exact rate is unknown" }
10406
10433
  },
@@ -10471,7 +10498,7 @@ var UPG_PROPERTY_SCHEMA = {
10471
10498
  stage_type: { type: "string", enum: ["awareness", "acquisition", "activation", "retention", "revenue", "referral"], description: "Which pirate metric (AAARRR) this stage maps to" },
10472
10499
  stage_order: { type: "number", description: "Display order along the lifecycle timeline (0-indexed). The `*_order` convention shared with `journey_phase.phase_order` and `journey_step.step_order` (UPG-675 / CS-8), so two same-`stage_type` stages are orderable." },
10473
10500
  avg_duration: { type: "string", description: "Average time a customer spends in this stage" },
10474
- conversion_rate: { type: "number", description: "Percentage of customers who advance to the next stage" }
10501
+ conversion_rate: { type: "number", description: "Percentage of customers who advance to the next stage", modifier: "snapshot" }
10475
10502
  },
10476
10503
  // CustomerRelationshipProperties: CustomerRelationship.
10477
10504
  customer_relationship: {
@@ -10484,9 +10511,9 @@ var UPG_PROPERTY_SCHEMA = {
10484
10511
  tool: { type: "string", enum: ["looker", "amplitude", "mixpanel", "posthog", "custom"], description: "Analytics tool hosting this dashboard" },
10485
10512
  url: { type: "string", description: "URL to the live dashboard" },
10486
10513
  audience: { type: "string", description: "Intended audience for this dashboard" },
10487
- element_count: { type: "number", description: "Number of widgets or panels on the dashboard" },
10514
+ element_count: { type: "number", description: "Number of widgets or panels on the dashboard", modifier: "derived" },
10488
10515
  refresh_cadence: { type: "string", enum: ["continuous", "hourly", "daily", "weekly", "monthly", "quarterly", "yearly", "on_demand", "other"], description: "How often the dashboard data refreshes. Uses the shared `Cadence` scale." },
10489
- filter_count: { type: "number", description: "Number of user-configurable filters" }
10516
+ filter_count: { type: "number", description: "Number of user-configurable filters", modifier: "derived" }
10490
10517
  },
10491
10518
  // DataClassificationProperties: Data classification.
10492
10519
  data_classification: {
@@ -10524,9 +10551,9 @@ var UPG_PROPERTY_SCHEMA = {
10524
10551
  data_model: {
10525
10552
  schema_name: { type: "string", description: "Name of the schema this model belongs to" },
10526
10553
  database_name: { type: "string", description: "Name of the database containing this model" },
10527
- table_count: { type: "number", description: "Number of tables in the model" },
10528
- column_count: { type: "number", description: "Total number of columns across all tables" },
10529
- test_count: { type: "number", description: "Number of data tests defined for this model" },
10554
+ table_count: { type: "number", description: "Number of tables in the model", modifier: "derived" },
10555
+ column_count: { type: "number", description: "Total number of columns across all tables", modifier: "derived" },
10556
+ test_count: { type: "number", description: "Number of data tests defined for this model", modifier: "derived" },
10530
10557
  model_type: { type: "string", enum: ["relational", "document", "graph", "time_series"], description: "Database paradigm used" },
10531
10558
  materialization: { type: "string", enum: ["view", "table", "incremental", "ephemeral", "materialized_view"], description: "How the model is materialised in the warehouse" },
10532
10559
  meta: { type: "object", description: "Arbitrary metadata key-value pairs" },
@@ -10538,7 +10565,7 @@ var UPG_PROPERTY_SCHEMA = {
10538
10565
  schedule: { type: "string", description: "Cron or scheduling expression" },
10539
10566
  avg_runtime: { type: "string", description: "Average wall-clock runtime per execution" },
10540
10567
  orchestrator: { type: "string", description: 'Orchestration tool (e.g. "Airflow", "Dagster", "dbt Cloud")' },
10541
- retry_count: { type: "number", description: "Number of automatic retries on failure" },
10568
+ retry_count: { type: "number", description: "Number of automatic retries on failure", modifier: "snapshot" },
10542
10569
  retry_delay_seconds: { type: "number", description: "Delay between retries in seconds" },
10543
10570
  timeout_seconds: { type: "number", description: "Maximum allowed runtime in seconds before timeout" },
10544
10571
  trigger_rule: { type: "string", description: "Rule that determines when this pipeline triggers" },
@@ -10571,7 +10598,7 @@ var UPG_PROPERTY_SCHEMA = {
10571
10598
  schema_version: { type: "string", description: "Current schema version" },
10572
10599
  migration_status: { type: "string", enum: ["current", "pending", "failed"], description: "Pending-migration status" },
10573
10600
  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." },
10574
- table_count: { type: "number", description: "Tables or collections in this schema. Useful for migration scope estimation." }
10601
+ table_count: { type: "number", description: "Tables or collections in this schema. Useful for migration scope estimation.", modifier: "derived" }
10575
10602
  },
10576
10603
  // DealProperties: Deal.
10577
10604
  deal: {
@@ -10606,7 +10633,7 @@ var UPG_PROPERTY_SCHEMA = {
10606
10633
  },
10607
10634
  // DepartmentProperties: Department entity.
10608
10635
  department: {
10609
- headcount: { type: "number", description: "Total number of people in the department" },
10636
+ headcount: { type: "number", description: "Total number of people in the department", modifier: "snapshot" },
10610
10637
  budget: { type: "number", description: "Annual budget allocated to the department" },
10611
10638
  department_mission: { type: "string", description: "Charter / purpose statement for the department" },
10612
10639
  leader: { type: "string", description: "Department leader (person or role reference). Promote to a `node_owned_by_person` edge if ownership must be queryable." },
@@ -10736,7 +10763,7 @@ var UPG_PROPERTY_SCHEMA = {
10736
10763
  // DeveloperPortalProperties: Developer portal.
10737
10764
  developer_portal: {
10738
10765
  portal_url: { type: "string", description: "URL of the developer portal" },
10739
- doc_count: { type: "number", description: "Number of documentation pages" },
10766
+ doc_count: { type: "number", description: "Number of documentation pages", modifier: "derived" },
10740
10767
  sandbox_available: { type: "boolean", description: "Whether a sandbox environment is available" }
10741
10768
  },
10742
10769
  // DiscountStrategyProperties: Discount strategy.
@@ -10744,7 +10771,7 @@ var UPG_PROPERTY_SCHEMA = {
10744
10771
  discount_type: { type: "string", enum: ["percentage", "fixed", "tiered", "bundle"], description: "How the discount is applied" },
10745
10772
  discount_percentage: { type: "number", description: "Discount amount as a percentage (0-100)" },
10746
10773
  valid_until: { type: "string", description: "Expiration date of the discount (ISO format)" },
10747
- redemption_count: { type: "number", description: "Number of times this discount has been redeemed" }
10774
+ redemption_count: { type: "number", description: "Number of times this discount has been redeemed", modifier: "snapshot" }
10748
10775
  },
10749
10776
  // DistributionChannelProperties: DistributionChannel.
10750
10777
  distribution_channel: {
@@ -10760,7 +10787,7 @@ var UPG_PROPERTY_SCHEMA = {
10760
10787
  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" },
10761
10788
  author: { type: "string", description: "Author (free-form: name, email, or handle). Promote to a `node_owned_by_person` edge if ownership must be queryable." },
10762
10789
  last_updated: { type: "string", description: "ISO 8601 last-meaningful-update" },
10763
- word_count: { type: "number", description: "Approximate word count. Useful for planning, indexing, summarisation." },
10790
+ word_count: { type: "number", description: "Approximate word count. Useful for planning, indexing, summarisation.", modifier: "snapshot" },
10764
10791
  content_summary: { type: "string", description: "1\u20133 sentence summary. Drives previews, search snippets, embedding context." },
10765
10792
  language: { type: "string", description: 'Primary language (BCP 47 tag, e.g. "en", "en-GB", "fr")' }
10766
10793
  },
@@ -10788,9 +10815,9 @@ var UPG_PROPERTY_SCHEMA = {
10788
10815
  // EmailSequenceProperties: Email sequence.
10789
10816
  email_sequence: {
10790
10817
  sequence_type: { type: "string", enum: ["onboarding", "nurture", "re_engagement", "sales", "other"], description: "Purpose of the email sequence" },
10791
- email_count: { type: "number", description: "Number of emails in the sequence" },
10792
- open_rate: { type: "number", description: "Average open rate across the sequence (0-1)" },
10793
- click_rate: { type: "number", description: "Average click-through rate across the sequence (0-1)" }
10818
+ email_count: { type: "number", description: "Number of emails in the sequence", modifier: "derived" },
10819
+ open_rate: { type: "number", description: "Average open rate across the sequence (0-1)", modifier: "snapshot" },
10820
+ click_rate: { type: "number", description: "Average click-through rate across the sequence (0-1)", modifier: "snapshot" }
10794
10821
  },
10795
10822
  // EpicProperties: A collection of related user stories that delivers a feature or capability.
10796
10823
  epic: {
@@ -10802,15 +10829,15 @@ var UPG_PROPERTY_SCHEMA = {
10802
10829
  },
10803
10830
  // ErrorBudgetProperties: Error budget.
10804
10831
  error_budget: {
10805
- budget_remaining: { type: "number", description: "Remaining budget percentage (0\u2013100). @example 45.2 (45.2% remaining, 54.8% used)" },
10806
- burn_rate: { type: "number", description: "Consumption rate as a multiplier against sustainable burn. 1.0 = on track. 2.5 = consuming 2.5x faster than sustainable." },
10832
+ budget_remaining: { type: "number", description: "Remaining budget percentage (0\u2013100). @example 45.2 (45.2% remaining, 54.8% used)", modifier: "snapshot" },
10833
+ burn_rate: { type: "number", description: "Consumption rate as a multiplier against sustainable burn. 1.0 = on track. 2.5 = consuming 2.5x faster than sustainable.", modifier: "snapshot" },
10807
10834
  policy: { type: "string", description: 'Policy when the budget hits 0%. @example "Freeze all non-reliability deploys", "Page engineering lead immediately"' },
10808
10835
  budget_window: { type: "string", description: 'Budget window. Defines reset cadence. @example "30 days", "rolling 28 days"' }
10809
10836
  },
10810
10837
  // EvalBenchmarkProperties: Evaluation benchmark.
10811
10838
  eval_benchmark: {
10812
10839
  benchmark_type: { type: "string", enum: ["accuracy", "latency", "cost", "safety", "custom"], description: "Measured dimension" },
10813
- test_case_count: { type: "number", description: "Test cases in the suite" },
10840
+ test_case_count: { type: "number", description: "Test cases in the suite", modifier: "derived" },
10814
10841
  passing_threshold: { type: "number", description: "Minimum passing score" },
10815
10842
  last_run: { type: "string", description: "ISO date of the most recent run" }
10816
10843
  },
@@ -10832,7 +10859,7 @@ var UPG_PROPERTY_SCHEMA = {
10832
10859
  event_type: { type: "string", enum: ["conference", "webinar", "meetup", "workshop", "trade_show", "other"], description: "Format of the event" },
10833
10860
  event_date: { type: "string", description: "Date of the event (ISO format)" },
10834
10861
  location: { type: "string", description: "Venue or virtual platform" },
10835
- attendee_count: { type: "number", description: "Number of attendees" }
10862
+ attendee_count: { type: "number", description: "Number of attendees", modifier: "snapshot" }
10836
10863
  },
10837
10864
  // EventSchemaProperties: EventSchema entity.
10838
10865
  event_schema: {
@@ -10995,7 +11022,7 @@ var UPG_PROPERTY_SCHEMA = {
10995
11022
  feature_flag: {
10996
11023
  key: { type: "string", description: 'Required. Stable flag key used in code (e.g. "new-checkout-flow").' },
10997
11024
  flag_status: { type: "string", enum: ["on", "off", "rollout"], description: "Activation state. `on` = enabled for all. `off` = disabled for all. `rollout` = partial via targeting_rules." },
10998
- rollout_pct: { type: "number", description: "Percentage enabled (0\u2013100). Meaningful when `flag_status === 'rollout'`." },
11025
+ rollout_pct: { type: "number", description: "Percentage enabled (0\u2013100). Meaningful when `flag_status === 'rollout'`.", modifier: "snapshot" },
10999
11026
  targeting_rules: { type: "string", description: "Human-readable targeting rules. Full rule evaluation happens in the flag service." },
11000
11027
  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." },
11001
11028
  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." },
@@ -11005,7 +11032,7 @@ var UPG_PROPERTY_SCHEMA = {
11005
11032
  // FeatureRequestProperties: Feature request raised by customer, prospect, or internal stakeholder.
11006
11033
  feature_request: {
11007
11034
  request_source: { type: "string", enum: ["customer", "internal", "prospect", "support", "community"], description: "Where the request originated" },
11008
- vote_count: { type: "number", description: "Number of votes or upvotes from users" },
11035
+ vote_count: { type: "number", description: "Number of votes or upvotes from users", modifier: "snapshot" },
11009
11036
  signal_sentiment: { type: "string", enum: ["positive", "neutral", "negative", "mixed"], description: "Detected sentiment of the request" },
11010
11037
  signal_channel: { type: "string", description: "Channel through which the request was received" },
11011
11038
  signal_urgency: { type: "string", enum: ["low", "medium", "high", "critical"], description: "Perceived urgency of the request" },
@@ -11063,7 +11090,7 @@ var UPG_PROPERTY_SCHEMA = {
11063
11090
  },
11064
11091
  // FeedbackVoteProperties: Feedback vote.
11065
11092
  feedback_vote: {
11066
- vote_count: { type: "number", description: "Total number of votes cast" },
11093
+ vote_count: { type: "number", description: "Total number of votes cast", modifier: "snapshot" },
11067
11094
  mrr_impact: { type: "number", description: "Combined MRR of voting accounts" }
11068
11095
  },
11069
11096
  // FixProperties: Specific change that resolved an issue.
@@ -11103,13 +11130,13 @@ var UPG_PROPERTY_SCHEMA = {
11103
11130
  funnel: {
11104
11131
  funnel_type: { type: "string", enum: ["acquisition", "activation", "retention", "revenue", "referral", "custom"], description: "Which stage of the customer lifecycle this funnel measures" },
11105
11132
  step_count: { type: "number", description: "Number of steps in the funnel", modifier: "derived" },
11106
- overall_conversion_rate: { type: "number", description: "End-to-end conversion rate through the funnel (0-1)" }
11133
+ overall_conversion_rate: { type: "number", description: "End-to-end conversion rate through the funnel (0-1)", modifier: "snapshot" }
11107
11134
  },
11108
11135
  // FunnelStepProperties: FunnelStep entity.
11109
11136
  funnel_step: {
11110
11137
  step_index: { type: "number", description: "Position of this step in the funnel (0-indexed)" },
11111
- conversion_rate: { type: "number", description: "Percentage of users who advance from this step" },
11112
- drop_off_rate: { type: "number", description: "Percentage of users who leave at this step" }
11138
+ conversion_rate: { type: "number", description: "Percentage of users who advance from this step", modifier: "snapshot" },
11139
+ drop_off_rate: { type: "number", description: "Percentage of users who leave at this step", modifier: "snapshot" }
11113
11140
  },
11114
11141
  // GlossaryTermProperties: GlossaryTerm entity.
11115
11142
  glossary_term: {
@@ -11284,7 +11311,7 @@ var UPG_PROPERTY_SCHEMA = {
11284
11311
  // InterviewGuideProperties: Interview guide document.
11285
11312
  interview_guide: {
11286
11313
  guide_type: { type: "string", enum: ["structured", "semi_structured", "unstructured"], description: "Format structure" },
11287
- question_count: { type: "number", description: "Total questions" },
11314
+ question_count: { type: "number", description: "Total questions", modifier: "derived" },
11288
11315
  duration_minutes: { type: "number", description: "Expected length (minutes)" }
11289
11316
  },
11290
11317
  // InvestigationProperties: Active thread of inquiry: debugging, architecture exploration, RCA.
@@ -11441,7 +11468,7 @@ var UPG_PROPERTY_SCHEMA = {
11441
11468
  key_activity: {
11442
11469
  activity_type: { type: "string", enum: ["production", "problem_solving", "platform", "network"], description: "Activity nature" },
11443
11470
  cadence: { type: "string", enum: ["continuous", "hourly", "daily", "weekly", "monthly", "quarterly", "yearly", "on_demand", "other"], description: 'Canonical `Cadence`. Replaces the legacy free-form `frequency: string` in v0.4.0. For exact rates (e.g. "3 times per week") set `frequency_count` + `frequency_period`. For qualitative tiers ("rare" \u2192 "constant") use `frequency_rating`.' },
11444
- frequency_count: { type: "number", description: "Exact count of runs in the period. Pairs with `frequency_period`." },
11471
+ frequency_count: { type: "number", description: "Exact count of runs in the period. Pairs with `frequency_period`.", modifier: "snapshot" },
11445
11472
  frequency_period: { type: "string", description: "Recurrence period (ISO-8601 `Duration`, e.g. `'P7D'`)" },
11446
11473
  frequency_rating: { type: "string", enum: ["constant", "regular", "occasional", "rare", "other"], description: "Qualitative tier. Use when an exact rate is unknown." },
11447
11474
  operational_owner: { type: "string", description: "Operationally accountable team or individual. Promote to a `node_owned_by_team` edge if ownership must be queryable." },
@@ -11469,7 +11496,7 @@ var UPG_PROPERTY_SCHEMA = {
11469
11496
  },
11470
11497
  // KeyResultProperties: A measurable result under an objective. The KR in OKR.
11471
11498
  key_result: {
11472
- current_value: { type: "number", description: "Most recent observed value" },
11499
+ current_value: { type: "number", description: "Most recent observed value", modifier: "snapshot" },
11473
11500
  target_value: { type: "number", description: "Value for full achievement" },
11474
11501
  unit: { type: "string", description: 'Display unit (e.g. "%", "users", "\xA3")' }
11475
11502
  },
@@ -11502,9 +11529,9 @@ var UPG_PROPERTY_SCHEMA = {
11502
11529
  learning_path: {
11503
11530
  path_order: { type: "number", description: "Display order of this path within a curriculum or program (0-indexed). The scalar ordering convention shared with `journey_step.step_order` and `journey_action.action_order` (UPG-663 / UPG-674). Makes a learning_path a deterministically orderable sequence among sibling paths rather than a star." },
11504
11531
  path_difficulty: { type: "string", enum: ["beginner", "intermediate", "advanced"], description: "Overall difficulty level of the learning path" },
11505
- item_count: { type: "number", description: "Number of items (tutorials, videos, etc.) in the path" },
11532
+ item_count: { type: "number", description: "Number of items (tutorials, videos, etc.) in the path", modifier: "derived" },
11506
11533
  estimated_hours: { type: "number", description: "Estimated total hours to complete the path" },
11507
- completion_rate: { type: "number", description: "Percentage of users who complete the full path" }
11534
+ completion_rate: { type: "number", description: "Percentage of users who complete the full path", modifier: "snapshot" }
11508
11535
  },
11509
11536
  // LegalEntityProperties: Legal entity.
11510
11537
  legal_entity: {
@@ -11522,7 +11549,7 @@ var UPG_PROPERTY_SCHEMA = {
11522
11549
  dep_type: { type: "string", enum: ["runtime", "dev", "peer", "optional"], description: "Dependency classification" },
11523
11550
  license: { type: "string", description: "SPDX license identifier" },
11524
11551
  is_outdated: { type: "boolean", description: "Whether a newer version is available" },
11525
- vulnerability_count: { type: "number", description: "Known vulnerabilities in the installed version. Populated from npm audit, Snyk, etc." }
11552
+ vulnerability_count: { type: "number", description: "Known vulnerabilities in the installed version. Populated from npm audit, Snyk, etc.", modifier: "snapshot" }
11526
11553
  },
11527
11554
  // LocaleProperties: Locale.
11528
11555
  locale: {
@@ -11542,7 +11569,7 @@ var UPG_PROPERTY_SCHEMA = {
11542
11569
  // MarketSegmentProperties: MarketSegment entity.
11543
11570
  market_segment: {
11544
11571
  segment_size: { type: "number", description: "Potential customers in this segment" },
11545
- growth_rate: { type: "number", description: "YoY growth rate as a decimal. @example 0.15 represents 15%" },
11572
+ growth_rate: { type: "number", description: "YoY growth rate as a decimal. @example 0.15 represents 15%", modifier: "snapshot" },
11546
11573
  tam: { type: "number", description: "Total Addressable Market (currency units)" },
11547
11574
  sam: { type: "number", description: "Serviceable Addressable Market (currency units)" }
11548
11575
  },
@@ -11600,7 +11627,7 @@ var UPG_PROPERTY_SCHEMA = {
11600
11627
  // MarketingChannelProperties: Marketing channel.
11601
11628
  marketing_channel: {
11602
11629
  channel_type: { type: "string", enum: ["social", "email", "seo", "sem", "content", "events", "other"], description: "Category of marketing channel" },
11603
- monthly_budget: { type: "number", description: "Monthly spend allocated to this channel" },
11630
+ monthly_budget: { type: "number", description: "Monthly spend allocated to this channel", modifier: "snapshot" },
11604
11631
  roi: { type: "number", description: "Return on investment ratio" },
11605
11632
  channel_status: { type: "string", enum: ["active", "paused", "deprecated"], description: "Operational status of the channel" }
11606
11633
  },
@@ -11635,7 +11662,7 @@ var UPG_PROPERTY_SCHEMA = {
11635
11662
  impact_level: { type: "string", enum: ["impact", "outcome", "output"], description: "Where this metric sits in the impact hierarchy" },
11636
11663
  indicator_direction: { type: "string", enum: ["leading", "lagging"], description: "Whether this metric leads or lags the behaviour it measures" },
11637
11664
  metric_category: { type: "string", enum: ["acquisition", "activation", "retention", "referral", "revenue", "engagement", "happiness", "task_success", "adoption", "other"], description: "AARRR or HEART category this metric belongs to" },
11638
- current_value: { type: "number", description: "Most recent observed value" },
11665
+ current_value: { type: "number", description: "Most recent observed value", modifier: "snapshot" },
11639
11666
  target_value: { type: "number", description: "Value we are aiming to reach" },
11640
11667
  unit: { type: "string", description: 'Display unit for the metric value (e.g. "%", "ms", "\xA3")' },
11641
11668
  range_min: { type: "number", description: "Minimum expected or baseline value" },
@@ -11733,11 +11760,11 @@ var UPG_PROPERTY_SCHEMA = {
11733
11760
  nps_campaign: {
11734
11761
  campaign_type: { type: "string", enum: ["relationship", "transactional", "feature"], description: "What triggers the NPS survey" },
11735
11762
  send_date: { type: "string", description: "Date the survey was sent (ISO format)" },
11736
- response_count: { type: "number", description: "Number of responses received" },
11737
- response_rate: { type: "number", description: "Percentage of recipients who responded" },
11763
+ response_count: { type: "number", description: "Number of responses received", modifier: "snapshot" },
11764
+ response_rate: { type: "number", description: "Percentage of recipients who responded", modifier: "snapshot" },
11738
11765
  score: { type: "number", description: "Net Promoter Score (-100 to 100)" },
11739
- promoters_pct: { type: "number", description: "Percentage of respondents who are promoters (9-10)" },
11740
- detractors_pct: { type: "number", description: "Percentage of respondents who are detractors (0-6)" }
11766
+ promoters_pct: { type: "number", description: "Percentage of respondents who are promoters (9-10)", modifier: "snapshot" },
11767
+ detractors_pct: { type: "number", description: "Percentage of respondents who are detractors (0-6)", modifier: "snapshot" }
11741
11768
  },
11742
11769
  // ObjectionProperties: Objection entity.
11743
11770
  objection: {
@@ -11894,14 +11921,14 @@ var UPG_PROPERTY_SCHEMA = {
11894
11921
  paywall: {
11895
11922
  paywall_type: { type: "string", enum: ["hard", "soft", "metered", "freemium_gate"], description: "How restrictive the paywall is" },
11896
11923
  trigger: { type: "string", description: "User action or threshold that triggers the paywall" },
11897
- conversion_rate: { type: "number", description: "Percentage of users who convert at this paywall" }
11924
+ conversion_rate: { type: "number", description: "Percentage of users who convert at this paywall", modifier: "snapshot" }
11898
11925
  },
11899
11926
  // PenetrationTestProperties: Penetration test.
11900
11927
  penetration_test: {
11901
11928
  category: { type: "string", enum: ["external", "internal", "web_app", "api", "mobile"], description: "Test type" },
11902
11929
  scope: { type: "string", description: "Systems or features in scope" },
11903
- findings_count: { type: "number", description: "Total findings" },
11904
- critical_count: { type: "number", description: "Critical-severity findings" },
11930
+ findings_count: { type: "number", description: "Total findings", modifier: "derived" },
11931
+ critical_count: { type: "number", description: "Critical-severity findings", modifier: "derived" },
11905
11932
  start_date: { type: "string", description: "ISO start date" },
11906
11933
  end_date: { type: "string", description: "ISO end date" },
11907
11934
  report_url: { type: "string", description: "Full report URL" },
@@ -11932,7 +11959,7 @@ var UPG_PROPERTY_SCHEMA = {
11932
11959
  // PipelineStageProperties: Pipeline stage.
11933
11960
  pipeline_stage: {
11934
11961
  stage_order: { type: "number", description: "Position of this stage in the pipeline sequence" },
11935
- conversion_rate: { type: "number", description: "Percentage of deals that advance from this stage" },
11962
+ conversion_rate: { type: "number", description: "Percentage of deals that advance from this stage", modifier: "snapshot" },
11936
11963
  avg_days_in_stage: { type: "number", description: "Average number of days deals spend in this stage" }
11937
11964
  },
11938
11965
  // PlaybookProperties: Customer success playbook.
@@ -12157,7 +12184,7 @@ var UPG_PROPERTY_SCHEMA = {
12157
12184
  // ResearchStudyProperties: Structured user research activity.
12158
12185
  research_study: {
12159
12186
  method: { type: "string", enum: ["interview", "usability", "survey", "diary", "analytics"], description: "Research method used to conduct the study" },
12160
- participant_count: { type: "number", description: "Number of participants recruited or observed" },
12187
+ participant_count: { type: "number", description: "Number of participants recruited or observed", modifier: "snapshot" },
12161
12188
  start_date: { type: "string", description: "ISO date when the study starts" },
12162
12189
  end_date: { type: "string", description: "ISO date when the study ends" }
12163
12190
  },
@@ -12181,7 +12208,7 @@ var UPG_PROPERTY_SCHEMA = {
12181
12208
  recurring_revenue: { type: "number", description: "Monthly or annual recurring revenue from this stream" },
12182
12209
  billing_model: { type: "string", enum: ["subscription", "usage", "one_time", "tiered", "freemium", "other"], description: "Billing mechanics. May differ from `stream_type`." },
12183
12210
  recognition_basis: { type: "string", enum: ["accrual", "cash", "deferred"], description: "Accounting basis for revenue recognition" },
12184
- arr_contribution_pct: { type: "number", description: "Share of total ARR contributed (0\u2013100)" },
12211
+ arr_contribution_pct: { type: "number", description: "Share of total ARR contributed (0\u2013100)", modifier: "snapshot" },
12185
12212
  forecast: { type: "string", description: "Free-text forecast or projection" }
12186
12213
  },
12187
12214
  // ReviewGateProperties: Review gate.
@@ -12315,7 +12342,7 @@ var UPG_PROPERTY_SCHEMA = {
12315
12342
  security_audit: {
12316
12343
  audit_scope: { type: "string", description: "Systems or processes covered by the audit" },
12317
12344
  audit_status: { type: "string", enum: ["scheduled", "in_progress", "completed"], description: "Current progress of the audit" },
12318
- findings_count: { type: "number", description: "Total number of findings" },
12345
+ findings_count: { type: "number", description: "Total number of findings", modifier: "derived" },
12319
12346
  critical_findings: { type: "number", description: "Number of critical-severity findings" }
12320
12347
  },
12321
12348
  // SecurityControlProperties: Security control.
@@ -12360,7 +12387,7 @@ var UPG_PROPERTY_SCHEMA = {
12360
12387
  search_volume: { type: "number", description: "Estimated monthly search volume" },
12361
12388
  difficulty: { type: "number", description: "Keyword difficulty score (0-100)" },
12362
12389
  intent: { type: "string", enum: ["informational", "navigational", "commercial", "transactional"], description: "Search intent behind the keyword" },
12363
- current_rank: { type: "number", description: "Current SERP ranking position" },
12390
+ current_rank: { type: "number", description: "Current SERP ranking position", modifier: "snapshot" },
12364
12391
  target_rank: { type: "number", description: "Desired ranking position" }
12365
12392
  },
12366
12393
  // ServiceProperties: Service or microservice.
@@ -12404,7 +12431,7 @@ var UPG_PROPERTY_SCHEMA = {
12404
12431
  service_level_objective: {
12405
12432
  target_percentage: { type: "number", description: "Target percentage. The reliability commitment. @example 99.9 (three nines), 99.95, 99.99 (four nines)" },
12406
12433
  window: { type: "string", description: 'Evaluation window. @example "30 days", "rolling 28 days", "calendar quarter"' },
12407
- current_percentage: { type: "number", description: "Current achieved percentage. Compared against `target_percentage` for health. @example 99.92 (above a 99.9 target)" },
12434
+ current_percentage: { type: "number", description: "Current achieved percentage. Compared against `target_percentage` for health. @example 99.92 (above a 99.9 target)", modifier: "snapshot" },
12408
12435
  slo_type: { type: "string", enum: ["metric", "monitor", "time_slice"], description: "Measurement mechanism. `metric` = ratio (good/total). `monitor` = monitor-based. `time_slice` = uptime windows." },
12409
12436
  warning_threshold: { type: "number", description: "Soft alert threshold before the target breaches. Gives teams time to act. @example 99.95 (warn at 99.95% when target is 99.9%)" }
12410
12437
  },
@@ -12552,7 +12579,7 @@ var UPG_PROPERTY_SCHEMA = {
12552
12579
  },
12553
12580
  // SubscriptionProperties: Subscription.
12554
12581
  subscription: {
12555
- monthly_recurring_revenue: { type: "number", description: "Monthly recurring revenue from this subscription" },
12582
+ monthly_recurring_revenue: { type: "number", description: "Monthly recurring revenue from this subscription", modifier: "snapshot" },
12556
12583
  start_date: { type: "string", description: "Subscription start date (ISO format)" },
12557
12584
  renewal_date: { type: "string", description: "Next renewal date (ISO format)" },
12558
12585
  subscription_status: { type: "string", enum: ["active", "trialing", "past_due", "cancelled", "paused"], description: "Current status of the subscription" }
@@ -12586,8 +12613,8 @@ var UPG_PROPERTY_SCHEMA = {
12586
12613
  },
12587
12614
  // SurveyResponseProperties: Aggregated survey response data.
12588
12615
  survey_response: {
12589
- response_count: { type: "number", description: "Total responses" },
12590
- completion_rate: { type: "number", description: "Completion (0\u20131)" },
12616
+ response_count: { type: "number", description: "Total responses", modifier: "snapshot" },
12617
+ completion_rate: { type: "number", description: "Completion (0\u20131)", modifier: "snapshot" },
12591
12618
  method: { type: "string", enum: ["email", "in_app", "phone", "other"], description: "Distribution method" }
12592
12619
  },
12593
12620
  // SwitchingCostProperties: SwitchingCost entity.
@@ -12623,7 +12650,7 @@ var UPG_PROPERTY_SCHEMA = {
12623
12650
  },
12624
12651
  required: ["value", "label"]
12625
12652
  },
12626
- frequency_count: { type: "number", description: "Exact observation count in the period. Pairs with `frequency_period` for a precise rate." },
12653
+ frequency_count: { type: "number", description: "Exact observation count in the period. Pairs with `frequency_period` for a precise rate.", modifier: "snapshot" },
12627
12654
  frequency_period: { type: "string", description: "Recurrence period (ISO-8601 `Duration`). @example 'P7D' (per week), 'P1D' (per day), 'PT1H' (per hour)" },
12628
12655
  frequency_rating: { type: "string", enum: ["constant", "regular", "occasional", "rare", "other"], description: "Qualitative frequency tier. Canonical replacement for the legacy `'once' | 'sporadic' | 'frequent' | 'constant' | string` shape. Use when an exact rate is unknown. Migration: `once \u2192 rare`, `sporadic \u2192 occasional`, `frequent \u2192 regular`, `constant \u2192 constant`." },
12629
12656
  affected_users_estimate: { type: "number", description: "Approximate count of users affected. Snapshot estimate." },
@@ -12747,13 +12774,13 @@ var UPG_PROPERTY_SCHEMA = {
12747
12774
  // TestSuiteProperties: Test suite.
12748
12775
  test_suite: {
12749
12776
  suite_type: { type: "string", enum: ["unit", "integration", "e2e", "performance", "security", "accessibility"], description: "Category of test suite" },
12750
- test_count: { type: "number", description: "Number of tests in the suite" },
12751
- pass_rate: { type: "number", description: "Percentage of tests passing (0-100)" },
12777
+ test_count: { type: "number", description: "Number of tests in the suite", modifier: "derived" },
12778
+ pass_rate: { type: "number", description: "Percentage of tests passing (0-100)", modifier: "snapshot" },
12752
12779
  last_run: { type: "string", description: "ISO date of last execution" },
12753
12780
  total_duration_ms: { type: "number", description: "Total execution time for the last run, in milliseconds" },
12754
- failed_count: { type: "number", description: "Number of tests that failed in the last run" },
12755
- skipped_count: { type: "number", description: "Number of tests that were skipped in the last run" },
12756
- flaky_count: { type: "number", description: "Number of tests that passed only on retry (flaky) in the last run" }
12781
+ failed_count: { type: "number", description: "Number of tests that failed in the last run", modifier: "snapshot" },
12782
+ skipped_count: { type: "number", description: "Number of tests that were skipped in the last run", modifier: "snapshot" },
12783
+ flaky_count: { type: "number", description: "Number of tests that passed only on retry (flaky) in the last run", modifier: "snapshot" }
12757
12784
  },
12758
12785
  // ThreatProperties: Threat.
12759
12786
  threat: {
@@ -12793,7 +12820,7 @@ var UPG_PROPERTY_SCHEMA = {
12793
12820
  scope: { type: "string", description: 'What system, feature, or data flow is being analysed. @example "user authentication", "payment processing", "admin API"' },
12794
12821
  last_reviewed: { type: "string", description: 'ISO date last reviewed. Models become stale as systems evolve. @example "2026-03-01"' },
12795
12822
  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.' },
12796
- threat_count: { type: "number", description: "Threats identified. Key metric for scope and completeness. @example 12" }
12823
+ threat_count: { type: "number", description: "Threats identified. Key metric for scope and completeness. @example 12", modifier: "derived" }
12797
12824
  },
12798
12825
  // TouchpointProperties: Customer touchpoint.
12799
12826
  touchpoint: {
@@ -12817,14 +12844,14 @@ var UPG_PROPERTY_SCHEMA = {
12817
12844
  trial_config: {
12818
12845
  trial_type: { type: "string", enum: ["time_limited", "feature_limited", "usage_limited", "reverse"], description: "How the trial is limited" },
12819
12846
  duration_days: { type: "number", description: "Length of the trial period in days" },
12820
- conversion_rate: { type: "number", description: "Percentage of trial users who convert to paid" }
12847
+ conversion_rate: { type: "number", description: "Percentage of trial users who convert to paid", modifier: "snapshot" }
12821
12848
  },
12822
12849
  // TutorialProperties: Tutorial.
12823
12850
  tutorial: {
12824
12851
  tutorial_format: { type: "string", enum: ["written", "video", "interactive", "code_along"], description: "Delivery format of the tutorial" },
12825
12852
  difficulty: { type: "string", enum: ["beginner", "intermediate", "advanced"], description: "Skill level required to follow the tutorial" },
12826
12853
  duration_minutes: { type: "number", description: "Estimated time to complete in minutes" },
12827
- completion_rate: { type: "number", description: "Percentage of users who complete the tutorial" }
12854
+ completion_rate: { type: "number", description: "Percentage of users who complete the tutorial", modifier: "snapshot" }
12828
12855
  },
12829
12856
  // UnitEconomicsProperties: UnitEconomics.
12830
12857
  unit_economics: {
@@ -12835,7 +12862,7 @@ var UPG_PROPERTY_SCHEMA = {
12835
12862
  },
12836
12863
  // UserAdvisoryBoardProperties: User advisory board.
12837
12864
  user_advisory_board: {
12838
- member_count: { type: "number", description: "Number of members on the board" },
12865
+ member_count: { type: "number", description: "Number of members on the board", modifier: "snapshot" },
12839
12866
  meeting_cadence: { type: "string", enum: ["continuous", "hourly", "daily", "weekly", "monthly", "quarterly", "yearly", "on_demand", "other"], description: "How often the board meets. Uses the shared `Cadence` scale." },
12840
12867
  board_focus: { type: "string", description: "Primary topic or area the board advises on" }
12841
12868
  },
@@ -12917,9 +12944,9 @@ var UPG_PROPERTY_SCHEMA = {
12917
12944
  // WalkthroughProperties: Product walkthrough.
12918
12945
  walkthrough: {
12919
12946
  walkthrough_type: { type: "string", enum: ["product_tour", "feature_intro", "tooltip_sequence", "checklist"], description: "Format of the in-product walkthrough" },
12920
- step_count: { type: "number", description: "Number of steps in the walkthrough" },
12947
+ step_count: { type: "number", description: "Number of steps in the walkthrough", modifier: "derived" },
12921
12948
  trigger: { type: "string", description: "User action or event that starts the walkthrough" },
12922
- completion_rate: { type: "number", description: "Percentage of users who complete the walkthrough" }
12949
+ completion_rate: { type: "number", description: "Percentage of users who complete the walkthrough", modifier: "snapshot" }
12923
12950
  },
12924
12951
  // WebinarProperties: Webinar.
12925
12952
  webinar: {
@@ -12972,7 +12999,7 @@ var UPG_PROPERTY_SCHEMA = {
12972
12999
  purpose: { type: "string", description: "Free-text description. Pairs with the closed-enum `workspace_purpose`." },
12973
13000
  workspace_purpose: { type: "string", enum: ["discovery", "planning", "retrospective", "design", "research", "strategy", "general"], description: "Closed-enum classifier. Drives template suggestions and surfaces in workspace browsers. `discovery` = persona/job/opportunity exploration. `planning` = roadmap and decision sessions. `retrospective` = reflection on shipped work. `design` = experience or UI exploration. `research` = organising study data and synthesis. `strategy` = high-level direction setting. `general` = catch-all." },
12974
13001
  owner: { type: "string", description: "Workspace owner (handle or email). Display label; canonical owner is `team_owns_workspace` or `persona_owns_workspace`." },
12975
- member_count: { type: "number", description: "Snapshot count. `team_works_in_workspace` edges are the source of truth." },
13002
+ member_count: { type: "number", description: "Snapshot count. `team_works_in_workspace` edges are the source of truth.", modifier: "derived" },
12976
13003
  archived: { type: "boolean", description: "Archived. Archived workspaces remain queryable but hidden from default views." },
12977
13004
  archived_at: { type: "string", description: "ISO timestamp archived. Pairs with `archived === true`." },
12978
13005
  icon: { type: "string", description: "Display icon (emoji or icon name)" }
@@ -29293,7 +29320,7 @@ function isCanonical(text) {
29293
29320
  }
29294
29321
 
29295
29322
  // src/index.ts
29296
- var UPG_VERSION = "0.13.0";
29323
+ var UPG_VERSION = "0.13.2";
29297
29324
  var UPG_FORMAT_VERSION = "0.4.0";
29298
29325
  var MARKDOWN_FORMAT_VERSION = "0.1";
29299
29326
  var UPG_TYPES = getTypes();