@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.cjs CHANGED
@@ -9973,9 +9973,9 @@ var UPG_PROPERTY_SCHEMA = {
9973
9973
  method: { type: "string", enum: ["automated", "manual", "assistive_tech", "expert"], description: "How the audit was conducted" },
9974
9974
  scope: { type: "string", description: 'What was audited (e.g. "homepage", "checkout flow")' },
9975
9975
  conformance_result: { type: "string", enum: ["pass", "partial", "fail"], description: "Overall conformance result" },
9976
- violations_count: { type: "number", description: "Number of accessibility violations found" },
9977
- passes_count: { type: "number", description: "Number of checks that passed" },
9978
- incomplete_count: { type: "number", description: "Number of checks that could not be completed" },
9976
+ violations_count: { type: "number", description: "Number of accessibility violations found", modifier: "derived" },
9977
+ passes_count: { type: "number", description: "Number of checks that passed", modifier: "derived" },
9978
+ incomplete_count: { type: "number", description: "Number of checks that could not be completed", modifier: "derived" },
9979
9979
  score: { type: "number", description: "Aggregate accessibility score (0-100)" },
9980
9980
  tool: { type: "string", enum: ["axe-core", "lighthouse", "wave", "manual", "other"], description: "Tool used to perform the audit" },
9981
9981
  tool_version: { type: "string", description: "Version of the audit tool" },
@@ -10035,14 +10035,14 @@ var UPG_PROPERTY_SCHEMA = {
10035
10035
  account: {
10036
10036
  account_type: { type: "string", enum: ["prospect", "customer", "partner", "churned"], description: "Relationship status of this account" },
10037
10037
  industry: { type: "string", description: "Industry vertical the account operates in" },
10038
- employee_count: { type: "number", description: "Number of employees at the account" },
10038
+ employee_count: { type: "number", description: "Number of employees at the account", modifier: "snapshot" },
10039
10039
  annual_revenue: { type: "number", description: "Annual revenue of the account" }
10040
10040
  },
10041
10041
  // AcquisitionChannelProperties: AcquisitionChannel entity.
10042
10042
  acquisition_channel: {
10043
10043
  channel_type: { type: "string", enum: ["seo", "paid", "social", "referral", "direct", "content"], description: "Category of the acquisition channel" },
10044
10044
  customer_acquisition_cost: { type: "number", description: "Customer acquisition cost for this channel" },
10045
- monthly_volume: { type: "number", description: "Monthly volume of new users from this channel" }
10045
+ monthly_volume: { type: "number", description: "Monthly volume of new users from this channel", modifier: "snapshot" }
10046
10046
  },
10047
10047
  // AdCreativeProperties: Ad creative.
10048
10048
  ad_creative: {
@@ -10057,7 +10057,7 @@ var UPG_PROPERTY_SCHEMA = {
10057
10057
  // AffinityClusterProperties: Affinity cluster grouping observations.
10058
10058
  affinity_cluster: {
10059
10059
  theme: { type: "string", description: "Emergent theme label" },
10060
- child_observation_count: { type: "number", description: "Observations in this cluster" },
10060
+ child_observation_count: { type: "number", description: "Observations in this cluster", modifier: "derived" },
10061
10061
  confidence: {
10062
10062
  type: "assessment",
10063
10063
  scale_id: "confidence_5",
@@ -10091,7 +10091,7 @@ var UPG_PROPERTY_SCHEMA = {
10091
10091
  hook_event: { type: "string", description: "Event that triggers this hook" },
10092
10092
  hook_action: { type: "string", description: "Action performed when the hook fires" },
10093
10093
  hook_status: { type: "string", enum: ["active", "disabled", "error"], description: "Operational status of the hook" },
10094
- execution_count: { type: "number", description: "Number of times this hook has fired" }
10094
+ execution_count: { type: "number", description: "Number of times this hook has fired", modifier: "snapshot" }
10095
10095
  },
10096
10096
  // AgentSessionProperties: Agent session.
10097
10097
  agent_session: {
@@ -10108,7 +10108,7 @@ var UPG_PROPERTY_SCHEMA = {
10108
10108
  agent_skill: {
10109
10109
  skill_trigger: { type: "string", description: "Event or command that activates this skill" },
10110
10110
  skill_description: { type: "string", description: "Human-readable description of what the skill does" },
10111
- invocation_count: { type: "number", description: "Number of times this skill has been invoked" }
10111
+ invocation_count: { type: "number", description: "Number of times this skill has been invoked", modifier: "snapshot" }
10112
10112
  },
10113
10113
  // AgentTaskProperties: Agent task. A discrete task assigned to an agent.
10114
10114
  agent_task: {
@@ -10140,7 +10140,7 @@ var UPG_PROPERTY_SCHEMA = {
10140
10140
  ai_dataset: {
10141
10141
  dataset_type: { type: "string", enum: ["training", "evaluation", "fine_tuning", "rlhf", "synthetic"], description: "Purpose" },
10142
10142
  version: { type: "string", description: "Version" },
10143
- record_count: { type: "number", description: "Records" },
10143
+ record_count: { type: "number", description: "Records", modifier: "snapshot" },
10144
10144
  format: { type: "string", description: 'Format (e.g. "jsonl", "csv", "parquet")' },
10145
10145
  storage_uri: { type: "string", description: "Storage URI" },
10146
10146
  checksum: { type: "string", description: "Integrity hash" },
@@ -10165,7 +10165,7 @@ var UPG_PROPERTY_SCHEMA = {
10165
10165
  ai_guardrail: {
10166
10166
  guardrail_type: { type: "string", enum: ["content_filter", "rate_limit", "token_limit", "safety", "custom"], description: "Protection category" },
10167
10167
  enforcement: { type: "string", enum: ["block", "warn", "log"], description: "Action when triggered" },
10168
- trigger_count: { type: "number", description: "Times triggered" }
10168
+ trigger_count: { type: "number", description: "Times triggered", modifier: "snapshot" }
10169
10169
  },
10170
10170
  // AiModelProperties: AI model.
10171
10171
  ai_model: {
@@ -10173,10 +10173,10 @@ var UPG_PROPERTY_SCHEMA = {
10173
10173
  model_id: { type: "string", description: 'Unique model identifier (e.g. "claude-sonnet-4-20250514")' },
10174
10174
  model_version: { type: "string", description: "Specific version" },
10175
10175
  model_purpose: { type: "string", description: "Intended use case" },
10176
- cost_per_1k_tokens: { type: "number", description: "Cost per 1,000 tokens" },
10176
+ cost_per_1k_tokens: { type: "number", description: "Cost per 1,000 tokens", modifier: "snapshot" },
10177
10177
  context_window: { type: "number", description: "Maximum context window (tokens)" },
10178
- latency_p50_ms: { type: "number", description: "Median latency (p50, ms)" },
10179
- latency_p99_ms: { type: "number", description: "Tail latency (p99, ms)" },
10178
+ latency_p50_ms: { type: "number", description: "Median latency (p50, ms)", modifier: "snapshot" },
10179
+ latency_p99_ms: { type: "number", description: "Tail latency (p99, ms)", modifier: "snapshot" },
10180
10180
  input_schema: { type: "string", description: "Expected input format or schema" },
10181
10181
  output_schema: { type: "string", description: "Expected output format or schema" },
10182
10182
  aliases: { type: "string[]", description: "Alternative names" },
@@ -10220,8 +10220,8 @@ var UPG_PROPERTY_SCHEMA = {
10220
10220
  // ApiEcosystemProperties: API ecosystem.
10221
10221
  api_ecosystem: {
10222
10222
  api_style: { type: "string", enum: ["rest", "graphql", "grpc", "webhook", "mixed"], description: "Primary API architecture style" },
10223
- developer_count: { type: "number", description: "Number of registered developers" },
10224
- app_count: { type: "number", description: "Number of apps built on the API" }
10223
+ developer_count: { type: "number", description: "Number of registered developers", modifier: "snapshot" },
10224
+ app_count: { type: "number", description: "Number of apps built on the API", modifier: "derived" }
10225
10225
  },
10226
10226
  // ApiEndpointProperties: API endpoint.
10227
10227
  api_endpoint: {
@@ -10292,7 +10292,7 @@ var UPG_PROPERTY_SCHEMA = {
10292
10292
  // BetaProgramProperties: Beta program.
10293
10293
  beta_program: {
10294
10294
  beta_type: { type: "string", enum: ["closed", "open", "invite_only"], description: "Access model for the beta" },
10295
- participant_count: { type: "number", description: "Number of users participating in the beta" }
10295
+ participant_count: { type: "number", description: "Number of users participating in the beta", modifier: "snapshot" }
10296
10296
  },
10297
10297
  // BoundedContextProperties: DDD bounded context.
10298
10298
  bounded_context: {
@@ -10450,7 +10450,7 @@ var UPG_PROPERTY_SCHEMA = {
10450
10450
  // ChurnReasonProperties: Churn reason.
10451
10451
  churn_reason: {
10452
10452
  category: { type: "string", description: "High-level category of the churn reason" },
10453
- frequency_count: { type: "number", description: "Exact count of times this reason has been cited in `frequency_period`" },
10453
+ frequency_count: { type: "number", description: "Exact count of times this reason has been cited in `frequency_period`", modifier: "snapshot" },
10454
10454
  frequency_period: { type: "string", description: "The recurrence period the count is measured over (ISO-8601 `Duration`, e.g. `'P30D'`)" },
10455
10455
  frequency_rating: { type: "string", enum: ["constant", "regular", "occasional", "rare", "other"], description: "Qualitative frequency tier when an exact count is not known" },
10456
10456
  contributing_factors: { type: "string[]", description: "Other factors that contributed to the churn" },
@@ -10465,8 +10465,8 @@ var UPG_PROPERTY_SCHEMA = {
10465
10465
  avg_duration: { type: "string", description: 'Average run duration across recent executions. @example "4m 30s", "12 minutes"' },
10466
10466
  last_run_status: { type: "string", enum: ["success", "failure", "cancelled", "skipped", "in_progress"], description: "Result of the most recent run. Current health indicator." },
10467
10467
  target_branch: { type: "string", description: 'Primary branch. The branch that triggers production deployments. @example "main", "release/*"' },
10468
- run_count: { type: "number", description: "Total runs since creation. Indicates activity level. @example 1452" },
10469
- success_rate: { type: "number", description: "Reliability metric for the pipeline itself: % of runs that succeed. @example 94.3" }
10468
+ run_count: { type: "number", description: "Total runs since creation. Indicates activity level. @example 1452", modifier: "snapshot" },
10469
+ success_rate: { type: "number", description: "Reliability metric for the pipeline itself: % of runs that succeed. @example 94.3", modifier: "snapshot" }
10470
10470
  },
10471
10471
  // ClassificationAxisProperties: ClassificationAxis: a dimension along which subjects are classified.
10472
10472
  classification_axis: {
@@ -10505,8 +10505,8 @@ var UPG_PROPERTY_SCHEMA = {
10505
10505
  // CommunityInitiativeProperties: Community initiative.
10506
10506
  community_initiative: {
10507
10507
  initiative_type: { type: "string", enum: ["forum", "discord", "slack", "meetup", "ambassador", "other"], description: "Platform or format for the community" },
10508
- member_count: { type: "number", description: "Current number of community members" },
10509
- engagement_rate: { type: "number", description: "Percentage of members actively participating" }
10508
+ member_count: { type: "number", description: "Current number of community members", modifier: "snapshot" },
10509
+ engagement_rate: { type: "number", description: "Percentage of members actively participating", modifier: "snapshot" }
10510
10510
  },
10511
10511
  // CompetitiveAnalysisProperties: Competitive analysis exercise or snapshot.
10512
10512
  competitive_analysis: {
@@ -10532,7 +10532,7 @@ var UPG_PROPERTY_SCHEMA = {
10532
10532
  },
10533
10533
  // CompetitiveBattleCardProperties: CompetitiveBattleCard entity.
10534
10534
  competitive_battle_card: {
10535
- win_rate: { type: "number", description: "Historical win rate against this competitor (0-100%)" },
10535
+ win_rate: { type: "number", description: "Historical win rate against this competitor (0-100%)", modifier: "snapshot" },
10536
10536
  key_differentiators: { type: "string", description: "Summary of key differentiators versus this competitor" }
10537
10537
  },
10538
10538
  // CompetitorProperties: A product or approach competing for the same user need.
@@ -10636,7 +10636,7 @@ var UPG_PROPERTY_SCHEMA = {
10636
10636
  content_calendar: {
10637
10637
  calendar_period: { type: "string", description: 'Covered period (e.g. "Q2 2026")' },
10638
10638
  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'`." },
10639
- frequency_count: { type: "number", description: "Exact count in the period. Pairs with `frequency_period`." },
10639
+ frequency_count: { type: "number", description: "Exact count in the period. Pairs with `frequency_period`.", modifier: "snapshot" },
10640
10640
  frequency_period: { type: "string", description: "Recurrence period (ISO-8601 `Duration`, e.g. `'P7D'`)" },
10641
10641
  frequency_rating: { type: "string", enum: ["constant", "regular", "occasional", "rare", "other"], description: "Qualitative rate tier when an exact rate is unknown" }
10642
10642
  },
@@ -10651,7 +10651,7 @@ var UPG_PROPERTY_SCHEMA = {
10651
10651
  content_types: { type: "string[]", description: "Types of content to produce" },
10652
10652
  distribution_channels: { type: "string[]", description: "Channels where content will be distributed" },
10653
10653
  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'`." },
10654
- frequency_count: { type: "number", description: "Exact count of publications in the period. Pairs with `frequency_period`." },
10654
+ frequency_count: { type: "number", description: "Exact count of publications in the period. Pairs with `frequency_period`.", modifier: "snapshot" },
10655
10655
  frequency_period: { type: "string", description: "Recurrence period (ISO-8601 `Duration`, e.g. `'P7D'`)" },
10656
10656
  frequency_rating: { type: "string", enum: ["constant", "regular", "occasional", "rare", "other"], description: "Qualitative rate tier when an exact rate is unknown" }
10657
10657
  },
@@ -10722,7 +10722,7 @@ var UPG_PROPERTY_SCHEMA = {
10722
10722
  stage_type: { type: "string", enum: ["awareness", "acquisition", "activation", "retention", "revenue", "referral"], description: "Which pirate metric (AAARRR) this stage maps to" },
10723
10723
  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." },
10724
10724
  avg_duration: { type: "string", description: "Average time a customer spends in this stage" },
10725
- conversion_rate: { type: "number", description: "Percentage of customers who advance to the next stage" }
10725
+ conversion_rate: { type: "number", description: "Percentage of customers who advance to the next stage", modifier: "snapshot" }
10726
10726
  },
10727
10727
  // CustomerRelationshipProperties: CustomerRelationship.
10728
10728
  customer_relationship: {
@@ -10735,9 +10735,9 @@ var UPG_PROPERTY_SCHEMA = {
10735
10735
  tool: { type: "string", enum: ["looker", "amplitude", "mixpanel", "posthog", "custom"], description: "Analytics tool hosting this dashboard" },
10736
10736
  url: { type: "string", description: "URL to the live dashboard" },
10737
10737
  audience: { type: "string", description: "Intended audience for this dashboard" },
10738
- element_count: { type: "number", description: "Number of widgets or panels on the dashboard" },
10738
+ element_count: { type: "number", description: "Number of widgets or panels on the dashboard", modifier: "derived" },
10739
10739
  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." },
10740
- filter_count: { type: "number", description: "Number of user-configurable filters" }
10740
+ filter_count: { type: "number", description: "Number of user-configurable filters", modifier: "derived" }
10741
10741
  },
10742
10742
  // DataClassificationProperties: Data classification.
10743
10743
  data_classification: {
@@ -10775,9 +10775,9 @@ var UPG_PROPERTY_SCHEMA = {
10775
10775
  data_model: {
10776
10776
  schema_name: { type: "string", description: "Name of the schema this model belongs to" },
10777
10777
  database_name: { type: "string", description: "Name of the database containing this model" },
10778
- table_count: { type: "number", description: "Number of tables in the model" },
10779
- column_count: { type: "number", description: "Total number of columns across all tables" },
10780
- test_count: { type: "number", description: "Number of data tests defined for this model" },
10778
+ table_count: { type: "number", description: "Number of tables in the model", modifier: "derived" },
10779
+ column_count: { type: "number", description: "Total number of columns across all tables", modifier: "derived" },
10780
+ test_count: { type: "number", description: "Number of data tests defined for this model", modifier: "derived" },
10781
10781
  model_type: { type: "string", enum: ["relational", "document", "graph", "time_series"], description: "Database paradigm used" },
10782
10782
  materialization: { type: "string", enum: ["view", "table", "incremental", "ephemeral", "materialized_view"], description: "How the model is materialised in the warehouse" },
10783
10783
  meta: { type: "object", description: "Arbitrary metadata key-value pairs" },
@@ -10789,7 +10789,7 @@ var UPG_PROPERTY_SCHEMA = {
10789
10789
  schedule: { type: "string", description: "Cron or scheduling expression" },
10790
10790
  avg_runtime: { type: "string", description: "Average wall-clock runtime per execution" },
10791
10791
  orchestrator: { type: "string", description: 'Orchestration tool (e.g. "Airflow", "Dagster", "dbt Cloud")' },
10792
- retry_count: { type: "number", description: "Number of automatic retries on failure" },
10792
+ retry_count: { type: "number", description: "Number of automatic retries on failure", modifier: "snapshot" },
10793
10793
  retry_delay_seconds: { type: "number", description: "Delay between retries in seconds" },
10794
10794
  timeout_seconds: { type: "number", description: "Maximum allowed runtime in seconds before timeout" },
10795
10795
  trigger_rule: { type: "string", description: "Rule that determines when this pipeline triggers" },
@@ -10822,7 +10822,7 @@ var UPG_PROPERTY_SCHEMA = {
10822
10822
  schema_version: { type: "string", description: "Current schema version" },
10823
10823
  migration_status: { type: "string", enum: ["current", "pending", "failed"], description: "Pending-migration status" },
10824
10824
  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." },
10825
- table_count: { type: "number", description: "Tables or collections in this schema. Useful for migration scope estimation." }
10825
+ table_count: { type: "number", description: "Tables or collections in this schema. Useful for migration scope estimation.", modifier: "derived" }
10826
10826
  },
10827
10827
  // DealProperties: Deal.
10828
10828
  deal: {
@@ -10857,7 +10857,7 @@ var UPG_PROPERTY_SCHEMA = {
10857
10857
  },
10858
10858
  // DepartmentProperties: Department entity.
10859
10859
  department: {
10860
- headcount: { type: "number", description: "Total number of people in the department" },
10860
+ headcount: { type: "number", description: "Total number of people in the department", modifier: "snapshot" },
10861
10861
  budget: { type: "number", description: "Annual budget allocated to the department" },
10862
10862
  department_mission: { type: "string", description: "Charter / purpose statement for the department" },
10863
10863
  leader: { type: "string", description: "Department leader (person or role reference). Promote to a `node_owned_by_person` edge if ownership must be queryable." },
@@ -10987,7 +10987,7 @@ var UPG_PROPERTY_SCHEMA = {
10987
10987
  // DeveloperPortalProperties: Developer portal.
10988
10988
  developer_portal: {
10989
10989
  portal_url: { type: "string", description: "URL of the developer portal" },
10990
- doc_count: { type: "number", description: "Number of documentation pages" },
10990
+ doc_count: { type: "number", description: "Number of documentation pages", modifier: "derived" },
10991
10991
  sandbox_available: { type: "boolean", description: "Whether a sandbox environment is available" }
10992
10992
  },
10993
10993
  // DiscountStrategyProperties: Discount strategy.
@@ -10995,7 +10995,7 @@ var UPG_PROPERTY_SCHEMA = {
10995
10995
  discount_type: { type: "string", enum: ["percentage", "fixed", "tiered", "bundle"], description: "How the discount is applied" },
10996
10996
  discount_percentage: { type: "number", description: "Discount amount as a percentage (0-100)" },
10997
10997
  valid_until: { type: "string", description: "Expiration date of the discount (ISO format)" },
10998
- redemption_count: { type: "number", description: "Number of times this discount has been redeemed" }
10998
+ redemption_count: { type: "number", description: "Number of times this discount has been redeemed", modifier: "snapshot" }
10999
10999
  },
11000
11000
  // DistributionChannelProperties: DistributionChannel.
11001
11001
  distribution_channel: {
@@ -11011,7 +11011,7 @@ var UPG_PROPERTY_SCHEMA = {
11011
11011
  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" },
11012
11012
  author: { type: "string", description: "Author (free-form: name, email, or handle). Promote to a `node_owned_by_person` edge if ownership must be queryable." },
11013
11013
  last_updated: { type: "string", description: "ISO 8601 last-meaningful-update" },
11014
- word_count: { type: "number", description: "Approximate word count. Useful for planning, indexing, summarisation." },
11014
+ word_count: { type: "number", description: "Approximate word count. Useful for planning, indexing, summarisation.", modifier: "snapshot" },
11015
11015
  content_summary: { type: "string", description: "1\u20133 sentence summary. Drives previews, search snippets, embedding context." },
11016
11016
  language: { type: "string", description: 'Primary language (BCP 47 tag, e.g. "en", "en-GB", "fr")' }
11017
11017
  },
@@ -11039,9 +11039,9 @@ var UPG_PROPERTY_SCHEMA = {
11039
11039
  // EmailSequenceProperties: Email sequence.
11040
11040
  email_sequence: {
11041
11041
  sequence_type: { type: "string", enum: ["onboarding", "nurture", "re_engagement", "sales", "other"], description: "Purpose of the email sequence" },
11042
- email_count: { type: "number", description: "Number of emails in the sequence" },
11043
- open_rate: { type: "number", description: "Average open rate across the sequence (0-1)" },
11044
- click_rate: { type: "number", description: "Average click-through rate across the sequence (0-1)" }
11042
+ email_count: { type: "number", description: "Number of emails in the sequence", modifier: "derived" },
11043
+ open_rate: { type: "number", description: "Average open rate across the sequence (0-1)", modifier: "snapshot" },
11044
+ click_rate: { type: "number", description: "Average click-through rate across the sequence (0-1)", modifier: "snapshot" }
11045
11045
  },
11046
11046
  // EpicProperties: A collection of related user stories that delivers a feature or capability.
11047
11047
  epic: {
@@ -11053,15 +11053,15 @@ var UPG_PROPERTY_SCHEMA = {
11053
11053
  },
11054
11054
  // ErrorBudgetProperties: Error budget.
11055
11055
  error_budget: {
11056
- budget_remaining: { type: "number", description: "Remaining budget percentage (0\u2013100). @example 45.2 (45.2% remaining, 54.8% used)" },
11057
- 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." },
11056
+ budget_remaining: { type: "number", description: "Remaining budget percentage (0\u2013100). @example 45.2 (45.2% remaining, 54.8% used)", modifier: "snapshot" },
11057
+ 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" },
11058
11058
  policy: { type: "string", description: 'Policy when the budget hits 0%. @example "Freeze all non-reliability deploys", "Page engineering lead immediately"' },
11059
11059
  budget_window: { type: "string", description: 'Budget window. Defines reset cadence. @example "30 days", "rolling 28 days"' }
11060
11060
  },
11061
11061
  // EvalBenchmarkProperties: Evaluation benchmark.
11062
11062
  eval_benchmark: {
11063
11063
  benchmark_type: { type: "string", enum: ["accuracy", "latency", "cost", "safety", "custom"], description: "Measured dimension" },
11064
- test_case_count: { type: "number", description: "Test cases in the suite" },
11064
+ test_case_count: { type: "number", description: "Test cases in the suite", modifier: "derived" },
11065
11065
  passing_threshold: { type: "number", description: "Minimum passing score" },
11066
11066
  last_run: { type: "string", description: "ISO date of the most recent run" }
11067
11067
  },
@@ -11083,7 +11083,7 @@ var UPG_PROPERTY_SCHEMA = {
11083
11083
  event_type: { type: "string", enum: ["conference", "webinar", "meetup", "workshop", "trade_show", "other"], description: "Format of the event" },
11084
11084
  event_date: { type: "string", description: "Date of the event (ISO format)" },
11085
11085
  location: { type: "string", description: "Venue or virtual platform" },
11086
- attendee_count: { type: "number", description: "Number of attendees" }
11086
+ attendee_count: { type: "number", description: "Number of attendees", modifier: "snapshot" }
11087
11087
  },
11088
11088
  // EventSchemaProperties: EventSchema entity.
11089
11089
  event_schema: {
@@ -11246,7 +11246,7 @@ var UPG_PROPERTY_SCHEMA = {
11246
11246
  feature_flag: {
11247
11247
  key: { type: "string", description: 'Required. Stable flag key used in code (e.g. "new-checkout-flow").' },
11248
11248
  flag_status: { type: "string", enum: ["on", "off", "rollout"], description: "Activation state. `on` = enabled for all. `off` = disabled for all. `rollout` = partial via targeting_rules." },
11249
- rollout_pct: { type: "number", description: "Percentage enabled (0\u2013100). Meaningful when `flag_status === 'rollout'`." },
11249
+ rollout_pct: { type: "number", description: "Percentage enabled (0\u2013100). Meaningful when `flag_status === 'rollout'`.", modifier: "snapshot" },
11250
11250
  targeting_rules: { type: "string", description: "Human-readable targeting rules. Full rule evaluation happens in the flag service." },
11251
11251
  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." },
11252
11252
  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." },
@@ -11256,7 +11256,7 @@ var UPG_PROPERTY_SCHEMA = {
11256
11256
  // FeatureRequestProperties: Feature request raised by customer, prospect, or internal stakeholder.
11257
11257
  feature_request: {
11258
11258
  request_source: { type: "string", enum: ["customer", "internal", "prospect", "support", "community"], description: "Where the request originated" },
11259
- vote_count: { type: "number", description: "Number of votes or upvotes from users" },
11259
+ vote_count: { type: "number", description: "Number of votes or upvotes from users", modifier: "snapshot" },
11260
11260
  signal_sentiment: { type: "string", enum: ["positive", "neutral", "negative", "mixed"], description: "Detected sentiment of the request" },
11261
11261
  signal_channel: { type: "string", description: "Channel through which the request was received" },
11262
11262
  signal_urgency: { type: "string", enum: ["low", "medium", "high", "critical"], description: "Perceived urgency of the request" },
@@ -11314,7 +11314,7 @@ var UPG_PROPERTY_SCHEMA = {
11314
11314
  },
11315
11315
  // FeedbackVoteProperties: Feedback vote.
11316
11316
  feedback_vote: {
11317
- vote_count: { type: "number", description: "Total number of votes cast" },
11317
+ vote_count: { type: "number", description: "Total number of votes cast", modifier: "snapshot" },
11318
11318
  mrr_impact: { type: "number", description: "Combined MRR of voting accounts" }
11319
11319
  },
11320
11320
  // FixProperties: Specific change that resolved an issue.
@@ -11354,13 +11354,13 @@ var UPG_PROPERTY_SCHEMA = {
11354
11354
  funnel: {
11355
11355
  funnel_type: { type: "string", enum: ["acquisition", "activation", "retention", "revenue", "referral", "custom"], description: "Which stage of the customer lifecycle this funnel measures" },
11356
11356
  step_count: { type: "number", description: "Number of steps in the funnel", modifier: "derived" },
11357
- overall_conversion_rate: { type: "number", description: "End-to-end conversion rate through the funnel (0-1)" }
11357
+ overall_conversion_rate: { type: "number", description: "End-to-end conversion rate through the funnel (0-1)", modifier: "snapshot" }
11358
11358
  },
11359
11359
  // FunnelStepProperties: FunnelStep entity.
11360
11360
  funnel_step: {
11361
11361
  step_index: { type: "number", description: "Position of this step in the funnel (0-indexed)" },
11362
- conversion_rate: { type: "number", description: "Percentage of users who advance from this step" },
11363
- drop_off_rate: { type: "number", description: "Percentage of users who leave at this step" }
11362
+ conversion_rate: { type: "number", description: "Percentage of users who advance from this step", modifier: "snapshot" },
11363
+ drop_off_rate: { type: "number", description: "Percentage of users who leave at this step", modifier: "snapshot" }
11364
11364
  },
11365
11365
  // GlossaryTermProperties: GlossaryTerm entity.
11366
11366
  glossary_term: {
@@ -11535,7 +11535,7 @@ var UPG_PROPERTY_SCHEMA = {
11535
11535
  // InterviewGuideProperties: Interview guide document.
11536
11536
  interview_guide: {
11537
11537
  guide_type: { type: "string", enum: ["structured", "semi_structured", "unstructured"], description: "Format structure" },
11538
- question_count: { type: "number", description: "Total questions" },
11538
+ question_count: { type: "number", description: "Total questions", modifier: "derived" },
11539
11539
  duration_minutes: { type: "number", description: "Expected length (minutes)" }
11540
11540
  },
11541
11541
  // InvestigationProperties: Active thread of inquiry: debugging, architecture exploration, RCA.
@@ -11692,7 +11692,7 @@ var UPG_PROPERTY_SCHEMA = {
11692
11692
  key_activity: {
11693
11693
  activity_type: { type: "string", enum: ["production", "problem_solving", "platform", "network"], description: "Activity nature" },
11694
11694
  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`.' },
11695
- frequency_count: { type: "number", description: "Exact count of runs in the period. Pairs with `frequency_period`." },
11695
+ frequency_count: { type: "number", description: "Exact count of runs in the period. Pairs with `frequency_period`.", modifier: "snapshot" },
11696
11696
  frequency_period: { type: "string", description: "Recurrence period (ISO-8601 `Duration`, e.g. `'P7D'`)" },
11697
11697
  frequency_rating: { type: "string", enum: ["constant", "regular", "occasional", "rare", "other"], description: "Qualitative tier. Use when an exact rate is unknown." },
11698
11698
  operational_owner: { type: "string", description: "Operationally accountable team or individual. Promote to a `node_owned_by_team` edge if ownership must be queryable." },
@@ -11720,7 +11720,7 @@ var UPG_PROPERTY_SCHEMA = {
11720
11720
  },
11721
11721
  // KeyResultProperties: A measurable result under an objective. The KR in OKR.
11722
11722
  key_result: {
11723
- current_value: { type: "number", description: "Most recent observed value" },
11723
+ current_value: { type: "number", description: "Most recent observed value", modifier: "snapshot" },
11724
11724
  target_value: { type: "number", description: "Value for full achievement" },
11725
11725
  unit: { type: "string", description: 'Display unit (e.g. "%", "users", "\xA3")' }
11726
11726
  },
@@ -11753,9 +11753,9 @@ var UPG_PROPERTY_SCHEMA = {
11753
11753
  learning_path: {
11754
11754
  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." },
11755
11755
  path_difficulty: { type: "string", enum: ["beginner", "intermediate", "advanced"], description: "Overall difficulty level of the learning path" },
11756
- item_count: { type: "number", description: "Number of items (tutorials, videos, etc.) in the path" },
11756
+ item_count: { type: "number", description: "Number of items (tutorials, videos, etc.) in the path", modifier: "derived" },
11757
11757
  estimated_hours: { type: "number", description: "Estimated total hours to complete the path" },
11758
- completion_rate: { type: "number", description: "Percentage of users who complete the full path" }
11758
+ completion_rate: { type: "number", description: "Percentage of users who complete the full path", modifier: "snapshot" }
11759
11759
  },
11760
11760
  // LegalEntityProperties: Legal entity.
11761
11761
  legal_entity: {
@@ -11773,7 +11773,7 @@ var UPG_PROPERTY_SCHEMA = {
11773
11773
  dep_type: { type: "string", enum: ["runtime", "dev", "peer", "optional"], description: "Dependency classification" },
11774
11774
  license: { type: "string", description: "SPDX license identifier" },
11775
11775
  is_outdated: { type: "boolean", description: "Whether a newer version is available" },
11776
- vulnerability_count: { type: "number", description: "Known vulnerabilities in the installed version. Populated from npm audit, Snyk, etc." }
11776
+ vulnerability_count: { type: "number", description: "Known vulnerabilities in the installed version. Populated from npm audit, Snyk, etc.", modifier: "snapshot" }
11777
11777
  },
11778
11778
  // LocaleProperties: Locale.
11779
11779
  locale: {
@@ -11793,7 +11793,7 @@ var UPG_PROPERTY_SCHEMA = {
11793
11793
  // MarketSegmentProperties: MarketSegment entity.
11794
11794
  market_segment: {
11795
11795
  segment_size: { type: "number", description: "Potential customers in this segment" },
11796
- growth_rate: { type: "number", description: "YoY growth rate as a decimal. @example 0.15 represents 15%" },
11796
+ growth_rate: { type: "number", description: "YoY growth rate as a decimal. @example 0.15 represents 15%", modifier: "snapshot" },
11797
11797
  tam: { type: "number", description: "Total Addressable Market (currency units)" },
11798
11798
  sam: { type: "number", description: "Serviceable Addressable Market (currency units)" }
11799
11799
  },
@@ -11851,7 +11851,7 @@ var UPG_PROPERTY_SCHEMA = {
11851
11851
  // MarketingChannelProperties: Marketing channel.
11852
11852
  marketing_channel: {
11853
11853
  channel_type: { type: "string", enum: ["social", "email", "seo", "sem", "content", "events", "other"], description: "Category of marketing channel" },
11854
- monthly_budget: { type: "number", description: "Monthly spend allocated to this channel" },
11854
+ monthly_budget: { type: "number", description: "Monthly spend allocated to this channel", modifier: "snapshot" },
11855
11855
  roi: { type: "number", description: "Return on investment ratio" },
11856
11856
  channel_status: { type: "string", enum: ["active", "paused", "deprecated"], description: "Operational status of the channel" }
11857
11857
  },
@@ -11886,7 +11886,7 @@ var UPG_PROPERTY_SCHEMA = {
11886
11886
  impact_level: { type: "string", enum: ["impact", "outcome", "output"], description: "Where this metric sits in the impact hierarchy" },
11887
11887
  indicator_direction: { type: "string", enum: ["leading", "lagging"], description: "Whether this metric leads or lags the behaviour it measures" },
11888
11888
  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" },
11889
- current_value: { type: "number", description: "Most recent observed value" },
11889
+ current_value: { type: "number", description: "Most recent observed value", modifier: "snapshot" },
11890
11890
  target_value: { type: "number", description: "Value we are aiming to reach" },
11891
11891
  unit: { type: "string", description: 'Display unit for the metric value (e.g. "%", "ms", "\xA3")' },
11892
11892
  range_min: { type: "number", description: "Minimum expected or baseline value" },
@@ -11984,11 +11984,11 @@ var UPG_PROPERTY_SCHEMA = {
11984
11984
  nps_campaign: {
11985
11985
  campaign_type: { type: "string", enum: ["relationship", "transactional", "feature"], description: "What triggers the NPS survey" },
11986
11986
  send_date: { type: "string", description: "Date the survey was sent (ISO format)" },
11987
- response_count: { type: "number", description: "Number of responses received" },
11988
- response_rate: { type: "number", description: "Percentage of recipients who responded" },
11987
+ response_count: { type: "number", description: "Number of responses received", modifier: "snapshot" },
11988
+ response_rate: { type: "number", description: "Percentage of recipients who responded", modifier: "snapshot" },
11989
11989
  score: { type: "number", description: "Net Promoter Score (-100 to 100)" },
11990
- promoters_pct: { type: "number", description: "Percentage of respondents who are promoters (9-10)" },
11991
- detractors_pct: { type: "number", description: "Percentage of respondents who are detractors (0-6)" }
11990
+ promoters_pct: { type: "number", description: "Percentage of respondents who are promoters (9-10)", modifier: "snapshot" },
11991
+ detractors_pct: { type: "number", description: "Percentage of respondents who are detractors (0-6)", modifier: "snapshot" }
11992
11992
  },
11993
11993
  // ObjectionProperties: Objection entity.
11994
11994
  objection: {
@@ -12145,14 +12145,14 @@ var UPG_PROPERTY_SCHEMA = {
12145
12145
  paywall: {
12146
12146
  paywall_type: { type: "string", enum: ["hard", "soft", "metered", "freemium_gate"], description: "How restrictive the paywall is" },
12147
12147
  trigger: { type: "string", description: "User action or threshold that triggers the paywall" },
12148
- conversion_rate: { type: "number", description: "Percentage of users who convert at this paywall" }
12148
+ conversion_rate: { type: "number", description: "Percentage of users who convert at this paywall", modifier: "snapshot" }
12149
12149
  },
12150
12150
  // PenetrationTestProperties: Penetration test.
12151
12151
  penetration_test: {
12152
12152
  category: { type: "string", enum: ["external", "internal", "web_app", "api", "mobile"], description: "Test type" },
12153
12153
  scope: { type: "string", description: "Systems or features in scope" },
12154
- findings_count: { type: "number", description: "Total findings" },
12155
- critical_count: { type: "number", description: "Critical-severity findings" },
12154
+ findings_count: { type: "number", description: "Total findings", modifier: "derived" },
12155
+ critical_count: { type: "number", description: "Critical-severity findings", modifier: "derived" },
12156
12156
  start_date: { type: "string", description: "ISO start date" },
12157
12157
  end_date: { type: "string", description: "ISO end date" },
12158
12158
  report_url: { type: "string", description: "Full report URL" },
@@ -12183,7 +12183,7 @@ var UPG_PROPERTY_SCHEMA = {
12183
12183
  // PipelineStageProperties: Pipeline stage.
12184
12184
  pipeline_stage: {
12185
12185
  stage_order: { type: "number", description: "Position of this stage in the pipeline sequence" },
12186
- conversion_rate: { type: "number", description: "Percentage of deals that advance from this stage" },
12186
+ conversion_rate: { type: "number", description: "Percentage of deals that advance from this stage", modifier: "snapshot" },
12187
12187
  avg_days_in_stage: { type: "number", description: "Average number of days deals spend in this stage" }
12188
12188
  },
12189
12189
  // PlaybookProperties: Customer success playbook.
@@ -12408,7 +12408,7 @@ var UPG_PROPERTY_SCHEMA = {
12408
12408
  // ResearchStudyProperties: Structured user research activity.
12409
12409
  research_study: {
12410
12410
  method: { type: "string", enum: ["interview", "usability", "survey", "diary", "analytics"], description: "Research method used to conduct the study" },
12411
- participant_count: { type: "number", description: "Number of participants recruited or observed" },
12411
+ participant_count: { type: "number", description: "Number of participants recruited or observed", modifier: "snapshot" },
12412
12412
  start_date: { type: "string", description: "ISO date when the study starts" },
12413
12413
  end_date: { type: "string", description: "ISO date when the study ends" }
12414
12414
  },
@@ -12432,7 +12432,7 @@ var UPG_PROPERTY_SCHEMA = {
12432
12432
  recurring_revenue: { type: "number", description: "Monthly or annual recurring revenue from this stream" },
12433
12433
  billing_model: { type: "string", enum: ["subscription", "usage", "one_time", "tiered", "freemium", "other"], description: "Billing mechanics. May differ from `stream_type`." },
12434
12434
  recognition_basis: { type: "string", enum: ["accrual", "cash", "deferred"], description: "Accounting basis for revenue recognition" },
12435
- arr_contribution_pct: { type: "number", description: "Share of total ARR contributed (0\u2013100)" },
12435
+ arr_contribution_pct: { type: "number", description: "Share of total ARR contributed (0\u2013100)", modifier: "snapshot" },
12436
12436
  forecast: { type: "string", description: "Free-text forecast or projection" }
12437
12437
  },
12438
12438
  // ReviewGateProperties: Review gate.
@@ -12566,7 +12566,7 @@ var UPG_PROPERTY_SCHEMA = {
12566
12566
  security_audit: {
12567
12567
  audit_scope: { type: "string", description: "Systems or processes covered by the audit" },
12568
12568
  audit_status: { type: "string", enum: ["scheduled", "in_progress", "completed"], description: "Current progress of the audit" },
12569
- findings_count: { type: "number", description: "Total number of findings" },
12569
+ findings_count: { type: "number", description: "Total number of findings", modifier: "derived" },
12570
12570
  critical_findings: { type: "number", description: "Number of critical-severity findings" }
12571
12571
  },
12572
12572
  // SecurityControlProperties: Security control.
@@ -12611,7 +12611,7 @@ var UPG_PROPERTY_SCHEMA = {
12611
12611
  search_volume: { type: "number", description: "Estimated monthly search volume" },
12612
12612
  difficulty: { type: "number", description: "Keyword difficulty score (0-100)" },
12613
12613
  intent: { type: "string", enum: ["informational", "navigational", "commercial", "transactional"], description: "Search intent behind the keyword" },
12614
- current_rank: { type: "number", description: "Current SERP ranking position" },
12614
+ current_rank: { type: "number", description: "Current SERP ranking position", modifier: "snapshot" },
12615
12615
  target_rank: { type: "number", description: "Desired ranking position" }
12616
12616
  },
12617
12617
  // ServiceProperties: Service or microservice.
@@ -12655,7 +12655,7 @@ var UPG_PROPERTY_SCHEMA = {
12655
12655
  service_level_objective: {
12656
12656
  target_percentage: { type: "number", description: "Target percentage. The reliability commitment. @example 99.9 (three nines), 99.95, 99.99 (four nines)" },
12657
12657
  window: { type: "string", description: 'Evaluation window. @example "30 days", "rolling 28 days", "calendar quarter"' },
12658
- current_percentage: { type: "number", description: "Current achieved percentage. Compared against `target_percentage` for health. @example 99.92 (above a 99.9 target)" },
12658
+ current_percentage: { type: "number", description: "Current achieved percentage. Compared against `target_percentage` for health. @example 99.92 (above a 99.9 target)", modifier: "snapshot" },
12659
12659
  slo_type: { type: "string", enum: ["metric", "monitor", "time_slice"], description: "Measurement mechanism. `metric` = ratio (good/total). `monitor` = monitor-based. `time_slice` = uptime windows." },
12660
12660
  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%)" }
12661
12661
  },
@@ -12803,7 +12803,7 @@ var UPG_PROPERTY_SCHEMA = {
12803
12803
  },
12804
12804
  // SubscriptionProperties: Subscription.
12805
12805
  subscription: {
12806
- monthly_recurring_revenue: { type: "number", description: "Monthly recurring revenue from this subscription" },
12806
+ monthly_recurring_revenue: { type: "number", description: "Monthly recurring revenue from this subscription", modifier: "snapshot" },
12807
12807
  start_date: { type: "string", description: "Subscription start date (ISO format)" },
12808
12808
  renewal_date: { type: "string", description: "Next renewal date (ISO format)" },
12809
12809
  subscription_status: { type: "string", enum: ["active", "trialing", "past_due", "cancelled", "paused"], description: "Current status of the subscription" }
@@ -12837,8 +12837,8 @@ var UPG_PROPERTY_SCHEMA = {
12837
12837
  },
12838
12838
  // SurveyResponseProperties: Aggregated survey response data.
12839
12839
  survey_response: {
12840
- response_count: { type: "number", description: "Total responses" },
12841
- completion_rate: { type: "number", description: "Completion (0\u20131)" },
12840
+ response_count: { type: "number", description: "Total responses", modifier: "snapshot" },
12841
+ completion_rate: { type: "number", description: "Completion (0\u20131)", modifier: "snapshot" },
12842
12842
  method: { type: "string", enum: ["email", "in_app", "phone", "other"], description: "Distribution method" }
12843
12843
  },
12844
12844
  // SwitchingCostProperties: SwitchingCost entity.
@@ -12874,7 +12874,7 @@ var UPG_PROPERTY_SCHEMA = {
12874
12874
  },
12875
12875
  required: ["value", "label"]
12876
12876
  },
12877
- frequency_count: { type: "number", description: "Exact observation count in the period. Pairs with `frequency_period` for a precise rate." },
12877
+ frequency_count: { type: "number", description: "Exact observation count in the period. Pairs with `frequency_period` for a precise rate.", modifier: "snapshot" },
12878
12878
  frequency_period: { type: "string", description: "Recurrence period (ISO-8601 `Duration`). @example 'P7D' (per week), 'P1D' (per day), 'PT1H' (per hour)" },
12879
12879
  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`." },
12880
12880
  affected_users_estimate: { type: "number", description: "Approximate count of users affected. Snapshot estimate." },
@@ -12998,13 +12998,13 @@ var UPG_PROPERTY_SCHEMA = {
12998
12998
  // TestSuiteProperties: Test suite.
12999
12999
  test_suite: {
13000
13000
  suite_type: { type: "string", enum: ["unit", "integration", "e2e", "performance", "security", "accessibility"], description: "Category of test suite" },
13001
- test_count: { type: "number", description: "Number of tests in the suite" },
13002
- pass_rate: { type: "number", description: "Percentage of tests passing (0-100)" },
13001
+ test_count: { type: "number", description: "Number of tests in the suite", modifier: "derived" },
13002
+ pass_rate: { type: "number", description: "Percentage of tests passing (0-100)", modifier: "snapshot" },
13003
13003
  last_run: { type: "string", description: "ISO date of last execution" },
13004
13004
  total_duration_ms: { type: "number", description: "Total execution time for the last run, in milliseconds" },
13005
- failed_count: { type: "number", description: "Number of tests that failed in the last run" },
13006
- skipped_count: { type: "number", description: "Number of tests that were skipped in the last run" },
13007
- flaky_count: { type: "number", description: "Number of tests that passed only on retry (flaky) in the last run" }
13005
+ failed_count: { type: "number", description: "Number of tests that failed in the last run", modifier: "snapshot" },
13006
+ skipped_count: { type: "number", description: "Number of tests that were skipped in the last run", modifier: "snapshot" },
13007
+ flaky_count: { type: "number", description: "Number of tests that passed only on retry (flaky) in the last run", modifier: "snapshot" }
13008
13008
  },
13009
13009
  // ThreatProperties: Threat.
13010
13010
  threat: {
@@ -13044,7 +13044,7 @@ var UPG_PROPERTY_SCHEMA = {
13044
13044
  scope: { type: "string", description: 'What system, feature, or data flow is being analysed. @example "user authentication", "payment processing", "admin API"' },
13045
13045
  last_reviewed: { type: "string", description: 'ISO date last reviewed. Models become stale as systems evolve. @example "2026-03-01"' },
13046
13046
  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.' },
13047
- threat_count: { type: "number", description: "Threats identified. Key metric for scope and completeness. @example 12" }
13047
+ threat_count: { type: "number", description: "Threats identified. Key metric for scope and completeness. @example 12", modifier: "derived" }
13048
13048
  },
13049
13049
  // TouchpointProperties: Customer touchpoint.
13050
13050
  touchpoint: {
@@ -13068,14 +13068,14 @@ var UPG_PROPERTY_SCHEMA = {
13068
13068
  trial_config: {
13069
13069
  trial_type: { type: "string", enum: ["time_limited", "feature_limited", "usage_limited", "reverse"], description: "How the trial is limited" },
13070
13070
  duration_days: { type: "number", description: "Length of the trial period in days" },
13071
- conversion_rate: { type: "number", description: "Percentage of trial users who convert to paid" }
13071
+ conversion_rate: { type: "number", description: "Percentage of trial users who convert to paid", modifier: "snapshot" }
13072
13072
  },
13073
13073
  // TutorialProperties: Tutorial.
13074
13074
  tutorial: {
13075
13075
  tutorial_format: { type: "string", enum: ["written", "video", "interactive", "code_along"], description: "Delivery format of the tutorial" },
13076
13076
  difficulty: { type: "string", enum: ["beginner", "intermediate", "advanced"], description: "Skill level required to follow the tutorial" },
13077
13077
  duration_minutes: { type: "number", description: "Estimated time to complete in minutes" },
13078
- completion_rate: { type: "number", description: "Percentage of users who complete the tutorial" }
13078
+ completion_rate: { type: "number", description: "Percentage of users who complete the tutorial", modifier: "snapshot" }
13079
13079
  },
13080
13080
  // UnitEconomicsProperties: UnitEconomics.
13081
13081
  unit_economics: {
@@ -13086,7 +13086,7 @@ var UPG_PROPERTY_SCHEMA = {
13086
13086
  },
13087
13087
  // UserAdvisoryBoardProperties: User advisory board.
13088
13088
  user_advisory_board: {
13089
- member_count: { type: "number", description: "Number of members on the board" },
13089
+ member_count: { type: "number", description: "Number of members on the board", modifier: "snapshot" },
13090
13090
  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." },
13091
13091
  board_focus: { type: "string", description: "Primary topic or area the board advises on" }
13092
13092
  },
@@ -13168,9 +13168,9 @@ var UPG_PROPERTY_SCHEMA = {
13168
13168
  // WalkthroughProperties: Product walkthrough.
13169
13169
  walkthrough: {
13170
13170
  walkthrough_type: { type: "string", enum: ["product_tour", "feature_intro", "tooltip_sequence", "checklist"], description: "Format of the in-product walkthrough" },
13171
- step_count: { type: "number", description: "Number of steps in the walkthrough" },
13171
+ step_count: { type: "number", description: "Number of steps in the walkthrough", modifier: "derived" },
13172
13172
  trigger: { type: "string", description: "User action or event that starts the walkthrough" },
13173
- completion_rate: { type: "number", description: "Percentage of users who complete the walkthrough" }
13173
+ completion_rate: { type: "number", description: "Percentage of users who complete the walkthrough", modifier: "snapshot" }
13174
13174
  },
13175
13175
  // WebinarProperties: Webinar.
13176
13176
  webinar: {
@@ -13223,7 +13223,7 @@ var UPG_PROPERTY_SCHEMA = {
13223
13223
  purpose: { type: "string", description: "Free-text description. Pairs with the closed-enum `workspace_purpose`." },
13224
13224
  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." },
13225
13225
  owner: { type: "string", description: "Workspace owner (handle or email). Display label; canonical owner is `team_owns_workspace` or `persona_owns_workspace`." },
13226
- member_count: { type: "number", description: "Snapshot count. `team_works_in_workspace` edges are the source of truth." },
13226
+ member_count: { type: "number", description: "Snapshot count. `team_works_in_workspace` edges are the source of truth.", modifier: "derived" },
13227
13227
  archived: { type: "boolean", description: "Archived. Archived workspaces remain queryable but hidden from default views." },
13228
13228
  archived_at: { type: "string", description: "ISO timestamp archived. Pairs with `archived === true`." },
13229
13229
  icon: { type: "string", description: "Display icon (emoji or icon name)" }
@@ -29544,7 +29544,7 @@ function isCanonical(text) {
29544
29544
  }
29545
29545
 
29546
29546
  // src/index.ts
29547
- var UPG_VERSION = "0.13.1";
29547
+ var UPG_VERSION = "0.13.2";
29548
29548
  var UPG_FORMAT_VERSION = "0.4.0";
29549
29549
  var MARKDOWN_FORMAT_VERSION = "0.1";
29550
29550
  var UPG_TYPES = getTypes();