@unified-product-graph/core 0.13.1 → 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
@@ -9749,9 +9749,9 @@ var UPG_PROPERTY_SCHEMA = {
9749
9749
  method: { type: "string", enum: ["automated", "manual", "assistive_tech", "expert"], description: "How the audit was conducted" },
9750
9750
  scope: { type: "string", description: 'What was audited (e.g. "homepage", "checkout flow")' },
9751
9751
  conformance_result: { type: "string", enum: ["pass", "partial", "fail"], description: "Overall conformance result" },
9752
- violations_count: { type: "number", description: "Number of accessibility violations found" },
9753
- passes_count: { type: "number", description: "Number of checks that passed" },
9754
- 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" },
9755
9755
  score: { type: "number", description: "Aggregate accessibility score (0-100)" },
9756
9756
  tool: { type: "string", enum: ["axe-core", "lighthouse", "wave", "manual", "other"], description: "Tool used to perform the audit" },
9757
9757
  tool_version: { type: "string", description: "Version of the audit tool" },
@@ -9811,14 +9811,14 @@ var UPG_PROPERTY_SCHEMA = {
9811
9811
  account: {
9812
9812
  account_type: { type: "string", enum: ["prospect", "customer", "partner", "churned"], description: "Relationship status of this account" },
9813
9813
  industry: { type: "string", description: "Industry vertical the account operates in" },
9814
- 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" },
9815
9815
  annual_revenue: { type: "number", description: "Annual revenue of the account" }
9816
9816
  },
9817
9817
  // AcquisitionChannelProperties: AcquisitionChannel entity.
9818
9818
  acquisition_channel: {
9819
9819
  channel_type: { type: "string", enum: ["seo", "paid", "social", "referral", "direct", "content"], description: "Category of the acquisition channel" },
9820
9820
  customer_acquisition_cost: { type: "number", description: "Customer acquisition cost for this channel" },
9821
- 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" }
9822
9822
  },
9823
9823
  // AdCreativeProperties: Ad creative.
9824
9824
  ad_creative: {
@@ -9833,7 +9833,7 @@ var UPG_PROPERTY_SCHEMA = {
9833
9833
  // AffinityClusterProperties: Affinity cluster grouping observations.
9834
9834
  affinity_cluster: {
9835
9835
  theme: { type: "string", description: "Emergent theme label" },
9836
- child_observation_count: { type: "number", description: "Observations in this cluster" },
9836
+ child_observation_count: { type: "number", description: "Observations in this cluster", modifier: "derived" },
9837
9837
  confidence: {
9838
9838
  type: "assessment",
9839
9839
  scale_id: "confidence_5",
@@ -9867,7 +9867,7 @@ var UPG_PROPERTY_SCHEMA = {
9867
9867
  hook_event: { type: "string", description: "Event that triggers this hook" },
9868
9868
  hook_action: { type: "string", description: "Action performed when the hook fires" },
9869
9869
  hook_status: { type: "string", enum: ["active", "disabled", "error"], description: "Operational status of the hook" },
9870
- 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" }
9871
9871
  },
9872
9872
  // AgentSessionProperties: Agent session.
9873
9873
  agent_session: {
@@ -9884,7 +9884,7 @@ var UPG_PROPERTY_SCHEMA = {
9884
9884
  agent_skill: {
9885
9885
  skill_trigger: { type: "string", description: "Event or command that activates this skill" },
9886
9886
  skill_description: { type: "string", description: "Human-readable description of what the skill does" },
9887
- 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" }
9888
9888
  },
9889
9889
  // AgentTaskProperties: Agent task. A discrete task assigned to an agent.
9890
9890
  agent_task: {
@@ -9916,7 +9916,7 @@ var UPG_PROPERTY_SCHEMA = {
9916
9916
  ai_dataset: {
9917
9917
  dataset_type: { type: "string", enum: ["training", "evaluation", "fine_tuning", "rlhf", "synthetic"], description: "Purpose" },
9918
9918
  version: { type: "string", description: "Version" },
9919
- record_count: { type: "number", description: "Records" },
9919
+ record_count: { type: "number", description: "Records", modifier: "snapshot" },
9920
9920
  format: { type: "string", description: 'Format (e.g. "jsonl", "csv", "parquet")' },
9921
9921
  storage_uri: { type: "string", description: "Storage URI" },
9922
9922
  checksum: { type: "string", description: "Integrity hash" },
@@ -9941,7 +9941,7 @@ var UPG_PROPERTY_SCHEMA = {
9941
9941
  ai_guardrail: {
9942
9942
  guardrail_type: { type: "string", enum: ["content_filter", "rate_limit", "token_limit", "safety", "custom"], description: "Protection category" },
9943
9943
  enforcement: { type: "string", enum: ["block", "warn", "log"], description: "Action when triggered" },
9944
- trigger_count: { type: "number", description: "Times triggered" }
9944
+ trigger_count: { type: "number", description: "Times triggered", modifier: "snapshot" }
9945
9945
  },
9946
9946
  // AiModelProperties: AI model.
9947
9947
  ai_model: {
@@ -9949,10 +9949,10 @@ var UPG_PROPERTY_SCHEMA = {
9949
9949
  model_id: { type: "string", description: 'Unique model identifier (e.g. "claude-sonnet-4-20250514")' },
9950
9950
  model_version: { type: "string", description: "Specific version" },
9951
9951
  model_purpose: { type: "string", description: "Intended use case" },
9952
- 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" },
9953
9953
  context_window: { type: "number", description: "Maximum context window (tokens)" },
9954
- latency_p50_ms: { type: "number", description: "Median latency (p50, ms)" },
9955
- 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" },
9956
9956
  input_schema: { type: "string", description: "Expected input format or schema" },
9957
9957
  output_schema: { type: "string", description: "Expected output format or schema" },
9958
9958
  aliases: { type: "string[]", description: "Alternative names" },
@@ -9996,8 +9996,8 @@ var UPG_PROPERTY_SCHEMA = {
9996
9996
  // ApiEcosystemProperties: API ecosystem.
9997
9997
  api_ecosystem: {
9998
9998
  api_style: { type: "string", enum: ["rest", "graphql", "grpc", "webhook", "mixed"], description: "Primary API architecture style" },
9999
- developer_count: { type: "number", description: "Number of registered developers" },
10000
- 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" }
10001
10001
  },
10002
10002
  // ApiEndpointProperties: API endpoint.
10003
10003
  api_endpoint: {
@@ -10068,7 +10068,7 @@ var UPG_PROPERTY_SCHEMA = {
10068
10068
  // BetaProgramProperties: Beta program.
10069
10069
  beta_program: {
10070
10070
  beta_type: { type: "string", enum: ["closed", "open", "invite_only"], description: "Access model for the beta" },
10071
- 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" }
10072
10072
  },
10073
10073
  // BoundedContextProperties: DDD bounded context.
10074
10074
  bounded_context: {
@@ -10226,7 +10226,7 @@ var UPG_PROPERTY_SCHEMA = {
10226
10226
  // ChurnReasonProperties: Churn reason.
10227
10227
  churn_reason: {
10228
10228
  category: { type: "string", description: "High-level category of the churn reason" },
10229
- 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" },
10230
10230
  frequency_period: { type: "string", description: "The recurrence period the count is measured over (ISO-8601 `Duration`, e.g. `'P30D'`)" },
10231
10231
  frequency_rating: { type: "string", enum: ["constant", "regular", "occasional", "rare", "other"], description: "Qualitative frequency tier when an exact count is not known" },
10232
10232
  contributing_factors: { type: "string[]", description: "Other factors that contributed to the churn" },
@@ -10241,8 +10241,8 @@ var UPG_PROPERTY_SCHEMA = {
10241
10241
  avg_duration: { type: "string", description: 'Average run duration across recent executions. @example "4m 30s", "12 minutes"' },
10242
10242
  last_run_status: { type: "string", enum: ["success", "failure", "cancelled", "skipped", "in_progress"], description: "Result of the most recent run. Current health indicator." },
10243
10243
  target_branch: { type: "string", description: 'Primary branch. The branch that triggers production deployments. @example "main", "release/*"' },
10244
- run_count: { type: "number", description: "Total runs since creation. Indicates activity level. @example 1452" },
10245
- 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" }
10246
10246
  },
10247
10247
  // ClassificationAxisProperties: ClassificationAxis: a dimension along which subjects are classified.
10248
10248
  classification_axis: {
@@ -10281,8 +10281,8 @@ var UPG_PROPERTY_SCHEMA = {
10281
10281
  // CommunityInitiativeProperties: Community initiative.
10282
10282
  community_initiative: {
10283
10283
  initiative_type: { type: "string", enum: ["forum", "discord", "slack", "meetup", "ambassador", "other"], description: "Platform or format for the community" },
10284
- member_count: { type: "number", description: "Current number of community members" },
10285
- 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" }
10286
10286
  },
10287
10287
  // CompetitiveAnalysisProperties: Competitive analysis exercise or snapshot.
10288
10288
  competitive_analysis: {
@@ -10308,7 +10308,7 @@ var UPG_PROPERTY_SCHEMA = {
10308
10308
  },
10309
10309
  // CompetitiveBattleCardProperties: CompetitiveBattleCard entity.
10310
10310
  competitive_battle_card: {
10311
- 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" },
10312
10312
  key_differentiators: { type: "string", description: "Summary of key differentiators versus this competitor" }
10313
10313
  },
10314
10314
  // CompetitorProperties: A product or approach competing for the same user need.
@@ -10412,7 +10412,7 @@ var UPG_PROPERTY_SCHEMA = {
10412
10412
  content_calendar: {
10413
10413
  calendar_period: { type: "string", description: 'Covered period (e.g. "Q2 2026")' },
10414
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'`." },
10415
- 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" },
10416
10416
  frequency_period: { type: "string", description: "Recurrence period (ISO-8601 `Duration`, e.g. `'P7D'`)" },
10417
10417
  frequency_rating: { type: "string", enum: ["constant", "regular", "occasional", "rare", "other"], description: "Qualitative rate tier when an exact rate is unknown" }
10418
10418
  },
@@ -10427,7 +10427,7 @@ var UPG_PROPERTY_SCHEMA = {
10427
10427
  content_types: { type: "string[]", description: "Types of content to produce" },
10428
10428
  distribution_channels: { type: "string[]", description: "Channels where content will be distributed" },
10429
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'`." },
10430
- 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" },
10431
10431
  frequency_period: { type: "string", description: "Recurrence period (ISO-8601 `Duration`, e.g. `'P7D'`)" },
10432
10432
  frequency_rating: { type: "string", enum: ["constant", "regular", "occasional", "rare", "other"], description: "Qualitative rate tier when an exact rate is unknown" }
10433
10433
  },
@@ -10498,7 +10498,7 @@ var UPG_PROPERTY_SCHEMA = {
10498
10498
  stage_type: { type: "string", enum: ["awareness", "acquisition", "activation", "retention", "revenue", "referral"], description: "Which pirate metric (AAARRR) this stage maps to" },
10499
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." },
10500
10500
  avg_duration: { type: "string", description: "Average time a customer spends in this stage" },
10501
- 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" }
10502
10502
  },
10503
10503
  // CustomerRelationshipProperties: CustomerRelationship.
10504
10504
  customer_relationship: {
@@ -10511,9 +10511,9 @@ var UPG_PROPERTY_SCHEMA = {
10511
10511
  tool: { type: "string", enum: ["looker", "amplitude", "mixpanel", "posthog", "custom"], description: "Analytics tool hosting this dashboard" },
10512
10512
  url: { type: "string", description: "URL to the live dashboard" },
10513
10513
  audience: { type: "string", description: "Intended audience for this dashboard" },
10514
- 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" },
10515
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." },
10516
- filter_count: { type: "number", description: "Number of user-configurable filters" }
10516
+ filter_count: { type: "number", description: "Number of user-configurable filters", modifier: "derived" }
10517
10517
  },
10518
10518
  // DataClassificationProperties: Data classification.
10519
10519
  data_classification: {
@@ -10551,9 +10551,9 @@ var UPG_PROPERTY_SCHEMA = {
10551
10551
  data_model: {
10552
10552
  schema_name: { type: "string", description: "Name of the schema this model belongs to" },
10553
10553
  database_name: { type: "string", description: "Name of the database containing this model" },
10554
- table_count: { type: "number", description: "Number of tables in the model" },
10555
- column_count: { type: "number", description: "Total number of columns across all tables" },
10556
- 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" },
10557
10557
  model_type: { type: "string", enum: ["relational", "document", "graph", "time_series"], description: "Database paradigm used" },
10558
10558
  materialization: { type: "string", enum: ["view", "table", "incremental", "ephemeral", "materialized_view"], description: "How the model is materialised in the warehouse" },
10559
10559
  meta: { type: "object", description: "Arbitrary metadata key-value pairs" },
@@ -10565,7 +10565,7 @@ var UPG_PROPERTY_SCHEMA = {
10565
10565
  schedule: { type: "string", description: "Cron or scheduling expression" },
10566
10566
  avg_runtime: { type: "string", description: "Average wall-clock runtime per execution" },
10567
10567
  orchestrator: { type: "string", description: 'Orchestration tool (e.g. "Airflow", "Dagster", "dbt Cloud")' },
10568
- 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" },
10569
10569
  retry_delay_seconds: { type: "number", description: "Delay between retries in seconds" },
10570
10570
  timeout_seconds: { type: "number", description: "Maximum allowed runtime in seconds before timeout" },
10571
10571
  trigger_rule: { type: "string", description: "Rule that determines when this pipeline triggers" },
@@ -10598,7 +10598,7 @@ var UPG_PROPERTY_SCHEMA = {
10598
10598
  schema_version: { type: "string", description: "Current schema version" },
10599
10599
  migration_status: { type: "string", enum: ["current", "pending", "failed"], description: "Pending-migration status" },
10600
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." },
10601
- 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" }
10602
10602
  },
10603
10603
  // DealProperties: Deal.
10604
10604
  deal: {
@@ -10633,7 +10633,7 @@ var UPG_PROPERTY_SCHEMA = {
10633
10633
  },
10634
10634
  // DepartmentProperties: Department entity.
10635
10635
  department: {
10636
- 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" },
10637
10637
  budget: { type: "number", description: "Annual budget allocated to the department" },
10638
10638
  department_mission: { type: "string", description: "Charter / purpose statement for the department" },
10639
10639
  leader: { type: "string", description: "Department leader (person or role reference). Promote to a `node_owned_by_person` edge if ownership must be queryable." },
@@ -10763,7 +10763,7 @@ var UPG_PROPERTY_SCHEMA = {
10763
10763
  // DeveloperPortalProperties: Developer portal.
10764
10764
  developer_portal: {
10765
10765
  portal_url: { type: "string", description: "URL of the developer portal" },
10766
- doc_count: { type: "number", description: "Number of documentation pages" },
10766
+ doc_count: { type: "number", description: "Number of documentation pages", modifier: "derived" },
10767
10767
  sandbox_available: { type: "boolean", description: "Whether a sandbox environment is available" }
10768
10768
  },
10769
10769
  // DiscountStrategyProperties: Discount strategy.
@@ -10771,7 +10771,7 @@ var UPG_PROPERTY_SCHEMA = {
10771
10771
  discount_type: { type: "string", enum: ["percentage", "fixed", "tiered", "bundle"], description: "How the discount is applied" },
10772
10772
  discount_percentage: { type: "number", description: "Discount amount as a percentage (0-100)" },
10773
10773
  valid_until: { type: "string", description: "Expiration date of the discount (ISO format)" },
10774
- 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" }
10775
10775
  },
10776
10776
  // DistributionChannelProperties: DistributionChannel.
10777
10777
  distribution_channel: {
@@ -10787,7 +10787,7 @@ var UPG_PROPERTY_SCHEMA = {
10787
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" },
10788
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." },
10789
10789
  last_updated: { type: "string", description: "ISO 8601 last-meaningful-update" },
10790
- 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" },
10791
10791
  content_summary: { type: "string", description: "1\u20133 sentence summary. Drives previews, search snippets, embedding context." },
10792
10792
  language: { type: "string", description: 'Primary language (BCP 47 tag, e.g. "en", "en-GB", "fr")' }
10793
10793
  },
@@ -10815,9 +10815,9 @@ var UPG_PROPERTY_SCHEMA = {
10815
10815
  // EmailSequenceProperties: Email sequence.
10816
10816
  email_sequence: {
10817
10817
  sequence_type: { type: "string", enum: ["onboarding", "nurture", "re_engagement", "sales", "other"], description: "Purpose of the email sequence" },
10818
- email_count: { type: "number", description: "Number of emails in the sequence" },
10819
- open_rate: { type: "number", description: "Average open rate across the sequence (0-1)" },
10820
- 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" }
10821
10821
  },
10822
10822
  // EpicProperties: A collection of related user stories that delivers a feature or capability.
10823
10823
  epic: {
@@ -10829,15 +10829,15 @@ var UPG_PROPERTY_SCHEMA = {
10829
10829
  },
10830
10830
  // ErrorBudgetProperties: Error budget.
10831
10831
  error_budget: {
10832
- budget_remaining: { type: "number", description: "Remaining budget percentage (0\u2013100). @example 45.2 (45.2% remaining, 54.8% used)" },
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." },
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" },
10834
10834
  policy: { type: "string", description: 'Policy when the budget hits 0%. @example "Freeze all non-reliability deploys", "Page engineering lead immediately"' },
10835
10835
  budget_window: { type: "string", description: 'Budget window. Defines reset cadence. @example "30 days", "rolling 28 days"' }
10836
10836
  },
10837
10837
  // EvalBenchmarkProperties: Evaluation benchmark.
10838
10838
  eval_benchmark: {
10839
10839
  benchmark_type: { type: "string", enum: ["accuracy", "latency", "cost", "safety", "custom"], description: "Measured dimension" },
10840
- 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" },
10841
10841
  passing_threshold: { type: "number", description: "Minimum passing score" },
10842
10842
  last_run: { type: "string", description: "ISO date of the most recent run" }
10843
10843
  },
@@ -10859,7 +10859,7 @@ var UPG_PROPERTY_SCHEMA = {
10859
10859
  event_type: { type: "string", enum: ["conference", "webinar", "meetup", "workshop", "trade_show", "other"], description: "Format of the event" },
10860
10860
  event_date: { type: "string", description: "Date of the event (ISO format)" },
10861
10861
  location: { type: "string", description: "Venue or virtual platform" },
10862
- attendee_count: { type: "number", description: "Number of attendees" }
10862
+ attendee_count: { type: "number", description: "Number of attendees", modifier: "snapshot" }
10863
10863
  },
10864
10864
  // EventSchemaProperties: EventSchema entity.
10865
10865
  event_schema: {
@@ -11022,7 +11022,7 @@ var UPG_PROPERTY_SCHEMA = {
11022
11022
  feature_flag: {
11023
11023
  key: { type: "string", description: 'Required. Stable flag key used in code (e.g. "new-checkout-flow").' },
11024
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." },
11025
- 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" },
11026
11026
  targeting_rules: { type: "string", description: "Human-readable targeting rules. Full rule evaluation happens in the flag service." },
11027
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." },
11028
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." },
@@ -11032,7 +11032,7 @@ var UPG_PROPERTY_SCHEMA = {
11032
11032
  // FeatureRequestProperties: Feature request raised by customer, prospect, or internal stakeholder.
11033
11033
  feature_request: {
11034
11034
  request_source: { type: "string", enum: ["customer", "internal", "prospect", "support", "community"], description: "Where the request originated" },
11035
- 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" },
11036
11036
  signal_sentiment: { type: "string", enum: ["positive", "neutral", "negative", "mixed"], description: "Detected sentiment of the request" },
11037
11037
  signal_channel: { type: "string", description: "Channel through which the request was received" },
11038
11038
  signal_urgency: { type: "string", enum: ["low", "medium", "high", "critical"], description: "Perceived urgency of the request" },
@@ -11090,7 +11090,7 @@ var UPG_PROPERTY_SCHEMA = {
11090
11090
  },
11091
11091
  // FeedbackVoteProperties: Feedback vote.
11092
11092
  feedback_vote: {
11093
- vote_count: { type: "number", description: "Total number of votes cast" },
11093
+ vote_count: { type: "number", description: "Total number of votes cast", modifier: "snapshot" },
11094
11094
  mrr_impact: { type: "number", description: "Combined MRR of voting accounts" }
11095
11095
  },
11096
11096
  // FixProperties: Specific change that resolved an issue.
@@ -11130,13 +11130,13 @@ var UPG_PROPERTY_SCHEMA = {
11130
11130
  funnel: {
11131
11131
  funnel_type: { type: "string", enum: ["acquisition", "activation", "retention", "revenue", "referral", "custom"], description: "Which stage of the customer lifecycle this funnel measures" },
11132
11132
  step_count: { type: "number", description: "Number of steps in the funnel", modifier: "derived" },
11133
- 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" }
11134
11134
  },
11135
11135
  // FunnelStepProperties: FunnelStep entity.
11136
11136
  funnel_step: {
11137
11137
  step_index: { type: "number", description: "Position of this step in the funnel (0-indexed)" },
11138
- conversion_rate: { type: "number", description: "Percentage of users who advance from this step" },
11139
- 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" }
11140
11140
  },
11141
11141
  // GlossaryTermProperties: GlossaryTerm entity.
11142
11142
  glossary_term: {
@@ -11311,7 +11311,7 @@ var UPG_PROPERTY_SCHEMA = {
11311
11311
  // InterviewGuideProperties: Interview guide document.
11312
11312
  interview_guide: {
11313
11313
  guide_type: { type: "string", enum: ["structured", "semi_structured", "unstructured"], description: "Format structure" },
11314
- question_count: { type: "number", description: "Total questions" },
11314
+ question_count: { type: "number", description: "Total questions", modifier: "derived" },
11315
11315
  duration_minutes: { type: "number", description: "Expected length (minutes)" }
11316
11316
  },
11317
11317
  // InvestigationProperties: Active thread of inquiry: debugging, architecture exploration, RCA.
@@ -11468,7 +11468,7 @@ var UPG_PROPERTY_SCHEMA = {
11468
11468
  key_activity: {
11469
11469
  activity_type: { type: "string", enum: ["production", "problem_solving", "platform", "network"], description: "Activity nature" },
11470
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`.' },
11471
- 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" },
11472
11472
  frequency_period: { type: "string", description: "Recurrence period (ISO-8601 `Duration`, e.g. `'P7D'`)" },
11473
11473
  frequency_rating: { type: "string", enum: ["constant", "regular", "occasional", "rare", "other"], description: "Qualitative tier. Use when an exact rate is unknown." },
11474
11474
  operational_owner: { type: "string", description: "Operationally accountable team or individual. Promote to a `node_owned_by_team` edge if ownership must be queryable." },
@@ -11496,7 +11496,7 @@ var UPG_PROPERTY_SCHEMA = {
11496
11496
  },
11497
11497
  // KeyResultProperties: A measurable result under an objective. The KR in OKR.
11498
11498
  key_result: {
11499
- current_value: { type: "number", description: "Most recent observed value" },
11499
+ current_value: { type: "number", description: "Most recent observed value", modifier: "snapshot" },
11500
11500
  target_value: { type: "number", description: "Value for full achievement" },
11501
11501
  unit: { type: "string", description: 'Display unit (e.g. "%", "users", "\xA3")' }
11502
11502
  },
@@ -11529,9 +11529,9 @@ var UPG_PROPERTY_SCHEMA = {
11529
11529
  learning_path: {
11530
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." },
11531
11531
  path_difficulty: { type: "string", enum: ["beginner", "intermediate", "advanced"], description: "Overall difficulty level of the learning path" },
11532
- 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" },
11533
11533
  estimated_hours: { type: "number", description: "Estimated total hours to complete the path" },
11534
- 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" }
11535
11535
  },
11536
11536
  // LegalEntityProperties: Legal entity.
11537
11537
  legal_entity: {
@@ -11549,7 +11549,7 @@ var UPG_PROPERTY_SCHEMA = {
11549
11549
  dep_type: { type: "string", enum: ["runtime", "dev", "peer", "optional"], description: "Dependency classification" },
11550
11550
  license: { type: "string", description: "SPDX license identifier" },
11551
11551
  is_outdated: { type: "boolean", description: "Whether a newer version is available" },
11552
- 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" }
11553
11553
  },
11554
11554
  // LocaleProperties: Locale.
11555
11555
  locale: {
@@ -11569,7 +11569,7 @@ var UPG_PROPERTY_SCHEMA = {
11569
11569
  // MarketSegmentProperties: MarketSegment entity.
11570
11570
  market_segment: {
11571
11571
  segment_size: { type: "number", description: "Potential customers in this segment" },
11572
- 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" },
11573
11573
  tam: { type: "number", description: "Total Addressable Market (currency units)" },
11574
11574
  sam: { type: "number", description: "Serviceable Addressable Market (currency units)" }
11575
11575
  },
@@ -11627,7 +11627,7 @@ var UPG_PROPERTY_SCHEMA = {
11627
11627
  // MarketingChannelProperties: Marketing channel.
11628
11628
  marketing_channel: {
11629
11629
  channel_type: { type: "string", enum: ["social", "email", "seo", "sem", "content", "events", "other"], description: "Category of marketing channel" },
11630
- 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" },
11631
11631
  roi: { type: "number", description: "Return on investment ratio" },
11632
11632
  channel_status: { type: "string", enum: ["active", "paused", "deprecated"], description: "Operational status of the channel" }
11633
11633
  },
@@ -11662,7 +11662,7 @@ var UPG_PROPERTY_SCHEMA = {
11662
11662
  impact_level: { type: "string", enum: ["impact", "outcome", "output"], description: "Where this metric sits in the impact hierarchy" },
11663
11663
  indicator_direction: { type: "string", enum: ["leading", "lagging"], description: "Whether this metric leads or lags the behaviour it measures" },
11664
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" },
11665
- current_value: { type: "number", description: "Most recent observed value" },
11665
+ current_value: { type: "number", description: "Most recent observed value", modifier: "snapshot" },
11666
11666
  target_value: { type: "number", description: "Value we are aiming to reach" },
11667
11667
  unit: { type: "string", description: 'Display unit for the metric value (e.g. "%", "ms", "\xA3")' },
11668
11668
  range_min: { type: "number", description: "Minimum expected or baseline value" },
@@ -11760,11 +11760,11 @@ var UPG_PROPERTY_SCHEMA = {
11760
11760
  nps_campaign: {
11761
11761
  campaign_type: { type: "string", enum: ["relationship", "transactional", "feature"], description: "What triggers the NPS survey" },
11762
11762
  send_date: { type: "string", description: "Date the survey was sent (ISO format)" },
11763
- response_count: { type: "number", description: "Number of responses received" },
11764
- 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" },
11765
11765
  score: { type: "number", description: "Net Promoter Score (-100 to 100)" },
11766
- promoters_pct: { type: "number", description: "Percentage of respondents who are promoters (9-10)" },
11767
- 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" }
11768
11768
  },
11769
11769
  // ObjectionProperties: Objection entity.
11770
11770
  objection: {
@@ -11921,14 +11921,14 @@ var UPG_PROPERTY_SCHEMA = {
11921
11921
  paywall: {
11922
11922
  paywall_type: { type: "string", enum: ["hard", "soft", "metered", "freemium_gate"], description: "How restrictive the paywall is" },
11923
11923
  trigger: { type: "string", description: "User action or threshold that triggers the paywall" },
11924
- 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" }
11925
11925
  },
11926
11926
  // PenetrationTestProperties: Penetration test.
11927
11927
  penetration_test: {
11928
11928
  category: { type: "string", enum: ["external", "internal", "web_app", "api", "mobile"], description: "Test type" },
11929
11929
  scope: { type: "string", description: "Systems or features in scope" },
11930
- findings_count: { type: "number", description: "Total findings" },
11931
- 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" },
11932
11932
  start_date: { type: "string", description: "ISO start date" },
11933
11933
  end_date: { type: "string", description: "ISO end date" },
11934
11934
  report_url: { type: "string", description: "Full report URL" },
@@ -11959,7 +11959,7 @@ var UPG_PROPERTY_SCHEMA = {
11959
11959
  // PipelineStageProperties: Pipeline stage.
11960
11960
  pipeline_stage: {
11961
11961
  stage_order: { type: "number", description: "Position of this stage in the pipeline sequence" },
11962
- 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" },
11963
11963
  avg_days_in_stage: { type: "number", description: "Average number of days deals spend in this stage" }
11964
11964
  },
11965
11965
  // PlaybookProperties: Customer success playbook.
@@ -12184,7 +12184,7 @@ var UPG_PROPERTY_SCHEMA = {
12184
12184
  // ResearchStudyProperties: Structured user research activity.
12185
12185
  research_study: {
12186
12186
  method: { type: "string", enum: ["interview", "usability", "survey", "diary", "analytics"], description: "Research method used to conduct the study" },
12187
- 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" },
12188
12188
  start_date: { type: "string", description: "ISO date when the study starts" },
12189
12189
  end_date: { type: "string", description: "ISO date when the study ends" }
12190
12190
  },
@@ -12208,7 +12208,7 @@ var UPG_PROPERTY_SCHEMA = {
12208
12208
  recurring_revenue: { type: "number", description: "Monthly or annual recurring revenue from this stream" },
12209
12209
  billing_model: { type: "string", enum: ["subscription", "usage", "one_time", "tiered", "freemium", "other"], description: "Billing mechanics. May differ from `stream_type`." },
12210
12210
  recognition_basis: { type: "string", enum: ["accrual", "cash", "deferred"], description: "Accounting basis for revenue recognition" },
12211
- 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" },
12212
12212
  forecast: { type: "string", description: "Free-text forecast or projection" }
12213
12213
  },
12214
12214
  // ReviewGateProperties: Review gate.
@@ -12342,7 +12342,7 @@ var UPG_PROPERTY_SCHEMA = {
12342
12342
  security_audit: {
12343
12343
  audit_scope: { type: "string", description: "Systems or processes covered by the audit" },
12344
12344
  audit_status: { type: "string", enum: ["scheduled", "in_progress", "completed"], description: "Current progress of the audit" },
12345
- findings_count: { type: "number", description: "Total number of findings" },
12345
+ findings_count: { type: "number", description: "Total number of findings", modifier: "derived" },
12346
12346
  critical_findings: { type: "number", description: "Number of critical-severity findings" }
12347
12347
  },
12348
12348
  // SecurityControlProperties: Security control.
@@ -12387,7 +12387,7 @@ var UPG_PROPERTY_SCHEMA = {
12387
12387
  search_volume: { type: "number", description: "Estimated monthly search volume" },
12388
12388
  difficulty: { type: "number", description: "Keyword difficulty score (0-100)" },
12389
12389
  intent: { type: "string", enum: ["informational", "navigational", "commercial", "transactional"], description: "Search intent behind the keyword" },
12390
- current_rank: { type: "number", description: "Current SERP ranking position" },
12390
+ current_rank: { type: "number", description: "Current SERP ranking position", modifier: "snapshot" },
12391
12391
  target_rank: { type: "number", description: "Desired ranking position" }
12392
12392
  },
12393
12393
  // ServiceProperties: Service or microservice.
@@ -12431,7 +12431,7 @@ var UPG_PROPERTY_SCHEMA = {
12431
12431
  service_level_objective: {
12432
12432
  target_percentage: { type: "number", description: "Target percentage. The reliability commitment. @example 99.9 (three nines), 99.95, 99.99 (four nines)" },
12433
12433
  window: { type: "string", description: 'Evaluation window. @example "30 days", "rolling 28 days", "calendar quarter"' },
12434
- 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" },
12435
12435
  slo_type: { type: "string", enum: ["metric", "monitor", "time_slice"], description: "Measurement mechanism. `metric` = ratio (good/total). `monitor` = monitor-based. `time_slice` = uptime windows." },
12436
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%)" }
12437
12437
  },
@@ -12579,7 +12579,7 @@ var UPG_PROPERTY_SCHEMA = {
12579
12579
  },
12580
12580
  // SubscriptionProperties: Subscription.
12581
12581
  subscription: {
12582
- 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" },
12583
12583
  start_date: { type: "string", description: "Subscription start date (ISO format)" },
12584
12584
  renewal_date: { type: "string", description: "Next renewal date (ISO format)" },
12585
12585
  subscription_status: { type: "string", enum: ["active", "trialing", "past_due", "cancelled", "paused"], description: "Current status of the subscription" }
@@ -12613,8 +12613,8 @@ var UPG_PROPERTY_SCHEMA = {
12613
12613
  },
12614
12614
  // SurveyResponseProperties: Aggregated survey response data.
12615
12615
  survey_response: {
12616
- response_count: { type: "number", description: "Total responses" },
12617
- 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" },
12618
12618
  method: { type: "string", enum: ["email", "in_app", "phone", "other"], description: "Distribution method" }
12619
12619
  },
12620
12620
  // SwitchingCostProperties: SwitchingCost entity.
@@ -12650,7 +12650,7 @@ var UPG_PROPERTY_SCHEMA = {
12650
12650
  },
12651
12651
  required: ["value", "label"]
12652
12652
  },
12653
- 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" },
12654
12654
  frequency_period: { type: "string", description: "Recurrence period (ISO-8601 `Duration`). @example 'P7D' (per week), 'P1D' (per day), 'PT1H' (per hour)" },
12655
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`." },
12656
12656
  affected_users_estimate: { type: "number", description: "Approximate count of users affected. Snapshot estimate." },
@@ -12774,13 +12774,13 @@ var UPG_PROPERTY_SCHEMA = {
12774
12774
  // TestSuiteProperties: Test suite.
12775
12775
  test_suite: {
12776
12776
  suite_type: { type: "string", enum: ["unit", "integration", "e2e", "performance", "security", "accessibility"], description: "Category of test suite" },
12777
- test_count: { type: "number", description: "Number of tests in the suite" },
12778
- 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" },
12779
12779
  last_run: { type: "string", description: "ISO date of last execution" },
12780
12780
  total_duration_ms: { type: "number", description: "Total execution time for the last run, in milliseconds" },
12781
- failed_count: { type: "number", description: "Number of tests that failed in the last run" },
12782
- skipped_count: { type: "number", description: "Number of tests that were skipped in the last run" },
12783
- 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" }
12784
12784
  },
12785
12785
  // ThreatProperties: Threat.
12786
12786
  threat: {
@@ -12820,7 +12820,7 @@ var UPG_PROPERTY_SCHEMA = {
12820
12820
  scope: { type: "string", description: 'What system, feature, or data flow is being analysed. @example "user authentication", "payment processing", "admin API"' },
12821
12821
  last_reviewed: { type: "string", description: 'ISO date last reviewed. Models become stale as systems evolve. @example "2026-03-01"' },
12822
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.' },
12823
- 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" }
12824
12824
  },
12825
12825
  // TouchpointProperties: Customer touchpoint.
12826
12826
  touchpoint: {
@@ -12844,14 +12844,14 @@ var UPG_PROPERTY_SCHEMA = {
12844
12844
  trial_config: {
12845
12845
  trial_type: { type: "string", enum: ["time_limited", "feature_limited", "usage_limited", "reverse"], description: "How the trial is limited" },
12846
12846
  duration_days: { type: "number", description: "Length of the trial period in days" },
12847
- 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" }
12848
12848
  },
12849
12849
  // TutorialProperties: Tutorial.
12850
12850
  tutorial: {
12851
12851
  tutorial_format: { type: "string", enum: ["written", "video", "interactive", "code_along"], description: "Delivery format of the tutorial" },
12852
12852
  difficulty: { type: "string", enum: ["beginner", "intermediate", "advanced"], description: "Skill level required to follow the tutorial" },
12853
12853
  duration_minutes: { type: "number", description: "Estimated time to complete in minutes" },
12854
- 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" }
12855
12855
  },
12856
12856
  // UnitEconomicsProperties: UnitEconomics.
12857
12857
  unit_economics: {
@@ -12862,7 +12862,7 @@ var UPG_PROPERTY_SCHEMA = {
12862
12862
  },
12863
12863
  // UserAdvisoryBoardProperties: User advisory board.
12864
12864
  user_advisory_board: {
12865
- 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" },
12866
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." },
12867
12867
  board_focus: { type: "string", description: "Primary topic or area the board advises on" }
12868
12868
  },
@@ -12944,9 +12944,9 @@ var UPG_PROPERTY_SCHEMA = {
12944
12944
  // WalkthroughProperties: Product walkthrough.
12945
12945
  walkthrough: {
12946
12946
  walkthrough_type: { type: "string", enum: ["product_tour", "feature_intro", "tooltip_sequence", "checklist"], description: "Format of the in-product walkthrough" },
12947
- 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" },
12948
12948
  trigger: { type: "string", description: "User action or event that starts the walkthrough" },
12949
- 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" }
12950
12950
  },
12951
12951
  // WebinarProperties: Webinar.
12952
12952
  webinar: {
@@ -12999,7 +12999,7 @@ var UPG_PROPERTY_SCHEMA = {
12999
12999
  purpose: { type: "string", description: "Free-text description. Pairs with the closed-enum `workspace_purpose`." },
13000
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." },
13001
13001
  owner: { type: "string", description: "Workspace owner (handle or email). Display label; canonical owner is `team_owns_workspace` or `persona_owns_workspace`." },
13002
- 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" },
13003
13003
  archived: { type: "boolean", description: "Archived. Archived workspaces remain queryable but hidden from default views." },
13004
13004
  archived_at: { type: "string", description: "ISO timestamp archived. Pairs with `archived === true`." },
13005
13005
  icon: { type: "string", description: "Display icon (emoji or icon name)" }
@@ -29320,7 +29320,7 @@ function isCanonical(text) {
29320
29320
  }
29321
29321
 
29322
29322
  // src/index.ts
29323
- var UPG_VERSION = "0.13.1";
29323
+ var UPG_VERSION = "0.13.2";
29324
29324
  var UPG_FORMAT_VERSION = "0.4.0";
29325
29325
  var MARKDOWN_FORMAT_VERSION = "0.1";
29326
29326
  var UPG_TYPES = getTypes();