@unified-product-graph/core 0.14.1 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -7615,6 +7615,187 @@ function getDeprecatedTypes() {
7615
7615
  return deprecated;
7616
7616
  }
7617
7617
  var UPG_PROPERTY_MIGRATIONS = {
7618
+ // ── v0.16.0: Pattern G — open-standard data boundary (UPG-691) ───────────────
7619
+ //
7620
+ // The portable graph holds modeling knowledge, not PII, registry filings,
7621
+ // app-session ids, or live vendor figures. These flowed through every export /
7622
+ // snapshot / sync. They are dropped from the body and belong to the hosting
7623
+ // app's identity / tenancy / measurement layer instead (boundary ADR
7624
+ // 2026-06-16-open-standard-data-boundary). The infra-pointer URLs that stay
7625
+ // (repo_url, storage_uri, *.logo_url, help_video.url, ...) were marked
7626
+ // `modifier:'volatile'` in this release rather than dropped, so a consumer
7627
+ // knows they are environment-specific and may be stripped on export. The
7628
+ // `owner: string` -> ownership-edge migration (C1) is a separate, larger wave
7629
+ // (0.17.0). (FALSE-POSITIVE guard kept: specification.spec_url, design_token.value,
7630
+ // vulnerability.cve_id, screen.route, bug.environment -- content / standard refs.)
7631
+ "0.16.0": [
7632
+ {
7633
+ kind: "drop_props",
7634
+ type: "person",
7635
+ drop_props: ["email"],
7636
+ reason: "UPG-691 boundary: person.email is PII for the hosting app identity layer, not the portable graph. Reference the modeled actor by edge; do not inline contact details."
7637
+ },
7638
+ {
7639
+ kind: "drop_props",
7640
+ type: "contact",
7641
+ drop_props: ["email", "phone"],
7642
+ reason: "UPG-691 boundary: contact.email / contact.phone are PII for the app identity layer, not the portable graph."
7643
+ },
7644
+ {
7645
+ kind: "drop_props",
7646
+ type: "document",
7647
+ drop_props: ["author"],
7648
+ reason: "UPG-691 boundary: document.author was free-text name/email (PII). The authoring actor is referenced by edge, not inlined."
7649
+ },
7650
+ {
7651
+ kind: "drop_props",
7652
+ type: "legal_entity",
7653
+ drop_props: ["tax_id", "registration_number", "principal_address"],
7654
+ reason: "UPG-691 boundary: government / registry identifiers belong to the tenancy / records system, not the open interchange body."
7655
+ },
7656
+ {
7657
+ kind: "drop_props",
7658
+ type: "investigation",
7659
+ drop_props: ["session_id"],
7660
+ reason: "UPG-691 boundary: investigation.session_id is an app-runtime / routing artifact, not modeling knowledge."
7661
+ },
7662
+ {
7663
+ kind: "drop_props",
7664
+ type: "workspace",
7665
+ drop_props: ["slug"],
7666
+ reason: "UPG-691 boundary: workspace.slug is an app-routing artifact, not modeling knowledge."
7667
+ },
7668
+ {
7669
+ kind: "drop_props",
7670
+ type: "organization",
7671
+ drop_props: ["billing_plan"],
7672
+ reason: "UPG-691 boundary: organization.billing_plan is a SaaS-account/tenancy concept. Model it via subscription / pricing_tier, not on the structural entity."
7673
+ },
7674
+ {
7675
+ kind: "drop_props",
7676
+ type: "account",
7677
+ drop_props: ["annual_revenue"],
7678
+ reason: "UPG-691 boundary: account.annual_revenue is live firmographic vendor data. Route live figures to a metric node, not the definition entity."
7679
+ },
7680
+ {
7681
+ kind: "drop_props",
7682
+ type: "ai_model",
7683
+ drop_props: ["cost_per_1k_tokens"],
7684
+ reason: "UPG-691 boundary: ai_model.cost_per_1k_tokens is a live vendor price. Route it to a metric / record entity, not the model definition."
7685
+ }
7686
+ ],
7687
+ // ── v0.15.0: Pattern D — collapse *_status shadows into the lifecycle ─────────
7688
+ //
7689
+ // 14 `*_status` enum properties whose values ARE the entity's own lifecycle
7690
+ // phase set (UPG-689 Pattern D, the T1.1 guardrail set). They re-encoded the
7691
+ // lifecycle as a property, shadowing the base-node `status` field that the
7692
+ // lifecycle already drives. Each property is removed and any authored value
7693
+ // LIFTS to `UPGBaseNode.status` (same convention as 0.9.14 kr_status). Two
7694
+ // diverge in vocabulary from their own lifecycle and remap on lift:
7695
+ // - marketing_channel.channel_status: deprecated -> sunset
7696
+ // - security_audit.audit_status: scheduled -> planning, in_progress -> active
7697
+ "0.15.0": [
7698
+ {
7699
+ kind: "lift_property_to_top_level",
7700
+ type: "agent_definition",
7701
+ from_property: "agent_status",
7702
+ to: "status",
7703
+ reason: "UPG-689 Pattern D: agent_status duplicated the agent_definition lifecycle (testing/active/disabled). Removed in 0.15.0; the authored value lifts to UPGBaseNode.status."
7704
+ },
7705
+ {
7706
+ kind: "lift_property_to_top_level",
7707
+ type: "data_pipeline",
7708
+ from_property: "pipeline_status",
7709
+ to: "status",
7710
+ reason: "UPG-689 Pattern D: pipeline_status duplicated the data_pipeline lifecycle (active/paused/failed/deprecated). Removed in 0.15.0; lifts to status."
7711
+ },
7712
+ {
7713
+ kind: "lift_property_to_top_level",
7714
+ type: "database_schema",
7715
+ from_property: "migration_status",
7716
+ to: "status",
7717
+ reason: "UPG-689 Pattern D: migration_status duplicated the database_schema lifecycle (current/pending/failed). Removed in 0.15.0; lifts to status."
7718
+ },
7719
+ {
7720
+ kind: "lift_property_to_top_level",
7721
+ type: "deployment",
7722
+ from_property: "deploy_status",
7723
+ to: "status",
7724
+ reason: "UPG-689 Pattern D: deploy_status duplicated the deployment lifecycle (rolling/success/failure). Removed in 0.15.0; lifts to status."
7725
+ },
7726
+ {
7727
+ kind: "lift_property_to_top_level",
7728
+ type: "external_api",
7729
+ from_property: "api_status",
7730
+ to: "status",
7731
+ reason: "UPG-689 Pattern D: api_status duplicated the external_api lifecycle (beta/active/deprecated/unavailable). Removed in 0.15.0; lifts to status."
7732
+ },
7733
+ {
7734
+ kind: "lift_property_to_top_level",
7735
+ type: "feature_area",
7736
+ from_property: "area_status",
7737
+ to: "status",
7738
+ reason: "UPG-689 Pattern D: area_status duplicated the feature_area lifecycle (planned/active/deprecated). Removed in 0.15.0; lifts to status."
7739
+ },
7740
+ {
7741
+ kind: "lift_property_to_top_level",
7742
+ type: "feature_flag",
7743
+ from_property: "flag_status",
7744
+ to: "status",
7745
+ reason: "UPG-689 Pattern D: flag_status duplicated the feature_flag lifecycle (off/rollout/on). Removed in 0.15.0; lifts to status."
7746
+ },
7747
+ {
7748
+ kind: "lift_property_to_top_level",
7749
+ type: "objective",
7750
+ from_property: "objective_status",
7751
+ to: "status",
7752
+ reason: "UPG-689 Pattern D: objective_status duplicated the objective lifecycle (active/achieved/deferred). Removed in 0.15.0; lifts to status."
7753
+ },
7754
+ {
7755
+ kind: "lift_property_to_top_level",
7756
+ type: "outcome",
7757
+ from_property: "outcome_status",
7758
+ to: "status",
7759
+ reason: "UPG-689 Pattern D: outcome_status duplicated the outcome lifecycle (identified/measuring/achieved/abandoned). Removed in 0.15.0; lifts to status."
7760
+ },
7761
+ {
7762
+ kind: "lift_property_to_top_level",
7763
+ type: "prototype",
7764
+ from_property: "test_status",
7765
+ to: "status",
7766
+ reason: "UPG-689 Pattern D: test_status duplicated the prototype lifecycle (untested/testing/passed/failed). Removed in 0.15.0; lifts to status."
7767
+ },
7768
+ {
7769
+ kind: "lift_property_to_top_level",
7770
+ type: "review_gate",
7771
+ from_property: "gate_status",
7772
+ to: "status",
7773
+ reason: "UPG-689 Pattern D: gate_status duplicated the review_gate lifecycle (pending/approved/rejected/bypassed). Removed in 0.15.0; lifts to status."
7774
+ },
7775
+ {
7776
+ kind: "lift_property_to_top_level",
7777
+ type: "roadmap_item",
7778
+ from_property: "item_status",
7779
+ to: "status",
7780
+ reason: "UPG-689 Pattern D: item_status duplicated the roadmap_item lifecycle (planned/in_progress/shipped/deferred). Removed in 0.15.0; lifts to status."
7781
+ },
7782
+ {
7783
+ kind: "lift_property_to_top_level",
7784
+ type: "marketing_channel",
7785
+ from_property: "channel_status",
7786
+ to: "status",
7787
+ value_map: { deprecated: "sunset" },
7788
+ reason: "UPG-689 Pattern D: channel_status (active/paused/deprecated) re-encoded the marketing_channel lifecycle (planning/active/paused/completed/sunset). Removed in 0.15.0; lifts to status with deprecated -> sunset."
7789
+ },
7790
+ {
7791
+ kind: "lift_property_to_top_level",
7792
+ type: "security_audit",
7793
+ from_property: "audit_status",
7794
+ to: "status",
7795
+ value_map: { scheduled: "planning", in_progress: "active" },
7796
+ reason: "UPG-689 Pattern D: audit_status (scheduled/in_progress/completed) re-encoded the security_audit lifecycle (planning/active/paused/completed/sunset). Removed in 0.15.0; lifts to status with scheduled -> planning, in_progress -> active."
7797
+ }
7798
+ ],
7618
7799
  // ── v0.14.0: Pattern E — remove deprecated/ghost properties (UPG-574) ────────
7619
7800
  //
7620
7801
  // Properties marked deprecated (some "Removed in 0.9.1") that were never
@@ -10064,8 +10245,8 @@ var UPG_PROPERTY_SCHEMA = {
10064
10245
  rule_id: { type: "string", description: "Identifier of the rule that flagged the issue" },
10065
10246
  help_url: { type: "string", description: "URL to documentation explaining the issue and how to fix it" },
10066
10247
  affected_element: { type: "string", description: "Description of the affected UI element" },
10067
- css_selector: { type: "string", description: "CSS selector targeting the affected element" },
10068
- html_snippet: { type: "string", description: "HTML snippet containing the violation" },
10248
+ css_selector: { type: "string", description: "CSS selector targeting the affected element", modifier: "volatile" },
10249
+ html_snippet: { type: "string", description: "HTML snippet containing the violation", modifier: "volatile" },
10069
10250
  tags: { type: "string[]", description: 'Tags from the audit tool (e.g. "wcag2aa", "cat.color")' },
10070
10251
  remediation: { type: "string", description: "Recommended fix for the issue" },
10071
10252
  impact_description: { type: "string", description: "Description of the user impact" }
@@ -10092,8 +10273,7 @@ var UPG_PROPERTY_SCHEMA = {
10092
10273
  account: {
10093
10274
  account_type: { type: "string", enum: ["prospect", "customer", "partner", "churned"], description: "Relationship status of this account" },
10094
10275
  industry: { type: "string", description: "Industry vertical the account operates in" },
10095
- employee_count: { type: "number", description: "Number of employees at the account", modifier: "snapshot" },
10096
- annual_revenue: { type: "number", description: "Annual revenue of the account" }
10276
+ employee_count: { type: "number", description: "Number of employees at the account", modifier: "snapshot" }
10097
10277
  },
10098
10278
  // AcquisitionChannelProperties: AcquisitionChannel entity.
10099
10279
  acquisition_channel: {
@@ -10140,7 +10320,6 @@ var UPG_PROPERTY_SCHEMA = {
10140
10320
  max_execution_time_seconds: { type: "number", description: "Hard timeout for agent execution in seconds" },
10141
10321
  allow_code_execution: { type: "boolean", description: "Whether the agent can execute generated code" },
10142
10322
  multimodal: { type: "boolean", description: "Whether the agent can process images and other media" },
10143
- agent_status: { type: "string", enum: ["active", "disabled", "testing"], description: "Operational status of this agent definition" },
10144
10323
  version: { type: "string", description: 'Version label for this agent definition (e.g. "1.4.2")' }
10145
10324
  },
10146
10325
  // AgentHookProperties: Agent hook.
@@ -10199,7 +10378,7 @@ var UPG_PROPERTY_SCHEMA = {
10199
10378
  version: { type: "string", description: "Version" },
10200
10379
  record_count: { type: "number", description: "Records", modifier: "snapshot" },
10201
10380
  format: { type: "string", description: 'Format (e.g. "jsonl", "csv", "parquet")' },
10202
- storage_uri: { type: "string", description: "Storage URI" },
10381
+ storage_uri: { type: "string", description: "Storage URI", modifier: "volatile" },
10203
10382
  checksum: { type: "string", description: "Integrity hash" },
10204
10383
  provenance: { type: "string", enum: ["human_labelled", "synthetic", "scraped", "converted", "mixed"], description: "Origin" },
10205
10384
  license: { type: "string", description: "SPDX license identifier" },
@@ -10214,7 +10393,7 @@ var UPG_PROPERTY_SCHEMA = {
10214
10393
  started_at: { type: "string", description: "ISO timestamp started" },
10215
10394
  completed_at: { type: "string", description: "ISO timestamp completed" },
10216
10395
  training_steps: { type: "number", description: "Training steps or epochs completed" },
10217
- artifact_uri: { type: "string", description: "Produced artifact URI" },
10396
+ artifact_uri: { type: "string", description: "Produced artifact URI", modifier: "volatile" },
10218
10397
  notes: { type: "string", description: "Free-text notes" },
10219
10398
  tags: { type: "string[]", description: "Free-form classification tags" }
10220
10399
  },
@@ -10227,10 +10406,9 @@ var UPG_PROPERTY_SCHEMA = {
10227
10406
  // AiModelProperties: AI model.
10228
10407
  ai_model: {
10229
10408
  model_provider: { type: "string", enum: ["anthropic", "openai", "google", "meta", "mistral", "custom"], description: "Provider or vendor" },
10230
- model_id: { type: "string", description: 'Unique model identifier (e.g. "claude-sonnet-4-20250514")' },
10409
+ model_id: { type: "string", description: 'Unique model identifier (e.g. "claude-sonnet-4-20250514")', modifier: "volatile" },
10231
10410
  model_version: { type: "string", description: "Specific version" },
10232
10411
  model_purpose: { type: "string", description: "Intended use case" },
10233
- cost_per_1k_tokens: { type: "number", description: "Cost per 1,000 tokens", modifier: "snapshot" },
10234
10412
  context_window: { type: "number", description: "Maximum context window (tokens)" },
10235
10413
  latency_p50_ms: { type: "number", description: "Median latency (p50, ms)", modifier: "snapshot" },
10236
10414
  latency_p99_ms: { type: "number", description: "Tail latency (p99, ms)", modifier: "snapshot" },
@@ -10269,7 +10447,7 @@ var UPG_PROPERTY_SCHEMA = {
10269
10447
  },
10270
10448
  // ApiContractProperties: API contract.
10271
10449
  api_contract: {
10272
- spec_url: { type: "string", description: "URL of the specification document" },
10450
+ spec_url: { type: "string", description: "URL of the specification document", modifier: "volatile" },
10273
10451
  protocol: { type: "string", enum: ["REST", "GraphQL", "gRPC", "AsyncAPI", "SOAP", "WebSocket", "MQTT", "SSE", "other"], description: "Communication protocol. `SSE` (server-sent events) added in 0.9.12." },
10274
10452
  version: { type: "string", description: "API version" },
10275
10453
  owner: { type: "string", description: "Maintaining person or team. Promote to a `node_owned_by_team` edge if ownership must be queryable." }
@@ -10359,7 +10537,7 @@ var UPG_PROPERTY_SCHEMA = {
10359
10537
  // BrandAssetProperties: Brand asset.
10360
10538
  brand_asset: {
10361
10539
  asset_type: { type: "string", enum: ["logo", "icon", "illustration", "photo", "video", "template"], description: "Category of the brand asset" },
10362
- url: { type: "string", description: "URL or path to the asset file" },
10540
+ url: { type: "string", description: "URL or path to the asset file", modifier: "volatile" },
10363
10541
  usage_rights: { type: "string", description: "Usage rights or licensing restrictions" }
10364
10542
  },
10365
10543
  // BrandColourProperties: Brand colour. A single colour in the brand palette.
@@ -10401,7 +10579,7 @@ var UPG_PROPERTY_SCHEMA = {
10401
10579
  approved_backgrounds: { type: "string[]", description: 'Background colours the logo is approved for use on. @example ["#FFFFFF", "#1A1A1A", "#F5F5F5"]' },
10402
10580
  forbidden_backgrounds: { type: "string[]", description: 'Background colours or contexts where the logo must NOT be placed. @example ["busy photography", "low-contrast surfaces"]' },
10403
10581
  file_formats: { type: "string[]", description: 'File formats this logo variant is available in. @example ["svg", "png", "eps", "pdf"]' },
10404
- asset_url: { type: "string", description: "URL to the logo asset file or asset library entry." }
10582
+ asset_url: { type: "string", description: "URL to the logo asset file or asset library entry.", modifier: "volatile" }
10405
10583
  },
10406
10584
  // BrandTypographyProperties: Brand typography. A font family and its usage rules.
10407
10585
  brand_typography: {
@@ -10450,8 +10628,8 @@ var UPG_PROPERTY_SCHEMA = {
10450
10628
  artifact_type: { type: "string", enum: ["docker_image", "npm_package", "binary", "static_assets", "other"], description: "Type" },
10451
10629
  version: { type: "string", description: "Version" },
10452
10630
  size: { type: "string", description: 'Human-readable size (e.g. "12.4 MB")' },
10453
- registry: { type: "string", description: "Registry or storage location" },
10454
- build_url: { type: "string", description: "URL of the producing CI/CD build run (GitHub Actions, CircleCI, etc.)." }
10631
+ registry: { type: "string", description: "Registry or storage location", modifier: "volatile" },
10632
+ build_url: { type: "string", description: "URL of the producing CI/CD build run (GitHub Actions, CircleCI, etc.).", modifier: "volatile" }
10455
10633
  },
10456
10634
  // BusinessModelProperties: BusinessModel: root of a BMC-style model.
10457
10635
  business_model: {
@@ -10684,8 +10862,6 @@ var UPG_PROPERTY_SCHEMA = {
10684
10862
  // ContactProperties: Contact.
10685
10863
  contact: {
10686
10864
  contact_role: { type: "string", description: "Job title or role within the account" },
10687
- email: { type: "string", description: "Email address" },
10688
- phone: { type: "string", description: "Phone number" },
10689
10865
  is_decision_maker: { type: "boolean", description: "Whether this person has purchasing authority" }
10690
10866
  },
10691
10867
  // ContentCalendarProperties: Content calendar.
@@ -10789,7 +10965,7 @@ var UPG_PROPERTY_SCHEMA = {
10789
10965
  // DashboardProperties: Dashboard entity.
10790
10966
  dashboard: {
10791
10967
  tool: { type: "string", enum: ["looker", "amplitude", "mixpanel", "posthog", "custom"], description: "Analytics tool hosting this dashboard" },
10792
- url: { type: "string", description: "URL to the live dashboard" },
10968
+ url: { type: "string", description: "URL to the live dashboard", modifier: "volatile" },
10793
10969
  audience: { type: "string", description: "Intended audience for this dashboard" },
10794
10970
  element_count: { type: "number", description: "Number of widgets or panels on the dashboard", modifier: "derived" },
10795
10971
  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." },
@@ -10841,7 +11017,6 @@ var UPG_PROPERTY_SCHEMA = {
10841
11017
  },
10842
11018
  // DataPipelineProperties: DataPipeline entity.
10843
11019
  data_pipeline: {
10844
- pipeline_status: { type: "string", enum: ["active", "paused", "failed", "deprecated"], description: "Operational status of the pipeline" },
10845
11020
  schedule: { type: "string", description: "Cron or scheduling expression" },
10846
11021
  avg_runtime: { type: "string", description: "Average wall-clock runtime per execution" },
10847
11022
  orchestrator: { type: "string", description: 'Orchestration tool (e.g. "Airflow", "Dagster", "dbt Cloud")' },
@@ -10876,7 +11051,6 @@ var UPG_PROPERTY_SCHEMA = {
10876
11051
  database_schema: {
10877
11052
  db_type: { type: "string", enum: ["postgres", "mysql", "mongodb", "redis", "other"], description: "Engine" },
10878
11053
  schema_version: { type: "string", description: "Current schema version" },
10879
- migration_status: { type: "string", enum: ["current", "pending", "failed"], description: "Pending-migration status" },
10880
11054
  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." },
10881
11055
  table_count: { type: "number", description: "Tables or collections in this schema. Useful for migration scope estimation.", modifier: "derived" }
10882
11056
  },
@@ -10931,7 +11105,6 @@ var UPG_PROPERTY_SCHEMA = {
10931
11105
  deployment: {
10932
11106
  environment: { type: "string", enum: ["dev", "staging", "prod"], description: "Target environment" },
10933
11107
  timestamp: { type: "string", description: "ISO timestamp" },
10934
- deploy_status: { type: "string", enum: ["success", "failure", "rolling"], description: "Current status" },
10935
11108
  sha: { type: "string", description: "Git SHA of the deployed commit" },
10936
11109
  duration_seconds: { type: "number", description: "Wall-clock duration in seconds. Tracks deployment speed trends." },
10937
11110
  deployer: { type: "string", description: "Triggering person or system. Promote to a `node_owned_by_person` edge if ownership must be queryable." }
@@ -10947,7 +11120,7 @@ var UPG_PROPERTY_SCHEMA = {
10947
11120
  },
10948
11121
  // DesignConceptProperties: Design concept being explored.
10949
11122
  design_concept: {
10950
- sketch_url: { type: "string", description: "URL of the sketch or visual" },
11123
+ sketch_url: { type: "string", description: "URL of the sketch or visual", modifier: "volatile" },
10951
11124
  rationale: { type: "string", description: "Selection or rejection rationale" },
10952
11125
  concept_status: { type: "string", enum: ["exploring", "validated", "selected", "rejected"], description: "Current selection status" },
10953
11126
  maturity: { type: "string", enum: ["sketch", "refined", "final"], description: "Development stage, from rough idea to presentation-ready" },
@@ -11041,7 +11214,7 @@ var UPG_PROPERTY_SCHEMA = {
11041
11214
  },
11042
11215
  // DeveloperPortalProperties: Developer portal.
11043
11216
  developer_portal: {
11044
- portal_url: { type: "string", description: "URL of the developer portal" },
11217
+ portal_url: { type: "string", description: "URL of the developer portal", modifier: "volatile" },
11045
11218
  doc_count: { type: "number", description: "Number of documentation pages", modifier: "derived" },
11046
11219
  sandbox_available: { type: "boolean", description: "Whether a sandbox environment is available" }
11047
11220
  },
@@ -11064,7 +11237,6 @@ var UPG_PROPERTY_SCHEMA = {
11064
11237
  source_url: { type: "string", description: "Canonical retrievable URL" },
11065
11238
  platform: { type: "string", enum: ["markdown", "notion", "figma", "google_docs", "confluence", "github", "linear", "other"], description: "Hosting platform" },
11066
11239
  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" },
11067
- author: { type: "string", description: "Author (free-form: name, email, or handle). Promote to a `node_owned_by_person` edge if ownership must be queryable." },
11068
11240
  last_updated: { type: "string", description: "ISO 8601 last-meaningful-update" },
11069
11241
  word_count: { type: "number", description: "Approximate word count. Useful for planning, indexing, summarisation.", modifier: "snapshot" },
11070
11242
  content_summary: { type: "string", description: "1\u20133 sentence summary. Drives previews, search snippets, embedding context." },
@@ -11259,8 +11431,7 @@ var UPG_PROPERTY_SCHEMA = {
11259
11431
  provider: { type: "string", description: "Provider" },
11260
11432
  base_url: { type: "string", description: "Base URL" },
11261
11433
  auth_type: { type: "string", enum: ["api_key", "oauth2", "jwt", "basic", "none"], description: "Authentication method" },
11262
- rate_limits: { type: "string", description: "Rate limit description" },
11263
- api_status: { type: "string", enum: ["active", "deprecated", "beta", "unavailable"], description: "Availability" }
11434
+ rate_limits: { type: "string", description: "Rate limit description" }
11264
11435
  },
11265
11436
  // FeasibilityStudyProperties: FeasibilityStudy entity.
11266
11437
  feasibility_study: {
@@ -11294,13 +11465,11 @@ var UPG_PROPERTY_SCHEMA = {
11294
11465
  feature_count: { type: "number", description: "Approximate feature count under this area. Snapshot; `feature_area_contains_feature` edges are the source of truth.", modifier: "derived" },
11295
11466
  owner: { type: "string", description: "Area owner (handle or email). Promote to a `node_owned_by_team` edge if ownership must be queryable." },
11296
11467
  priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Importance to the product overall" },
11297
- maturity: { type: "string", enum: ["nascent", "growing", "mature", "legacy"], description: "Maturity. `nascent` = newly-formed grouping. `mature` = established surface. `legacy` = being phased out for a successor." },
11298
- area_status: { type: "string", enum: ["active", "planned", "deprecated"], description: "Status in the product structure" }
11468
+ maturity: { type: "string", enum: ["nascent", "growing", "mature", "legacy"], description: "Maturity. `nascent` = newly-formed grouping. `mature` = established surface. `legacy` = being phased out for a successor." }
11299
11469
  },
11300
11470
  // FeatureFlagProperties: Feature flag.
11301
11471
  feature_flag: {
11302
11472
  key: { type: "string", description: 'Required. Stable flag key used in code (e.g. "new-checkout-flow").' },
11303
- flag_status: { type: "string", enum: ["on", "off", "rollout"], description: "Activation state. `on` = enabled for all. `off` = disabled for all. `rollout` = partial via targeting_rules." },
11304
11473
  rollout_pct: { type: "number", description: "Percentage enabled (0\u2013100). Meaningful when `flag_status === 'rollout'`.", modifier: "snapshot" },
11305
11474
  targeting_rules: { type: "string", description: "Human-readable targeting rules. Full rule evaluation happens in the flag service." },
11306
11475
  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." },
@@ -11376,7 +11545,7 @@ var UPG_PROPERTY_SCHEMA = {
11376
11545
  fix: {
11377
11546
  fix_type: { type: "string", enum: ["hotfix", "permanent", "workaround", "configuration", "process_change"], description: "Kind of fix. `hotfix` = urgent patch. `permanent` = proper structural fix. `workaround` = mitigates symptom without addressing root cause; should track a follow-up." },
11378
11547
  commit: { type: "string", description: "Git commit SHA" },
11379
- files_changed: { type: "string[]", description: "Files changed" },
11548
+ files_changed: { type: "string[]", description: "Files changed", modifier: "volatile" },
11380
11549
  deployed_at: { type: "string", description: "ISO timestamp landed in the target environment." },
11381
11550
  fixed_date: { type: "string", description: "Application date (ISO date). Coarser-grained complement to `deployed_at`." },
11382
11551
  verified: { type: "boolean", description: "Verified in production" },
@@ -11469,7 +11638,7 @@ var UPG_PROPERTY_SCHEMA = {
11469
11638
  video_type: { type: "string", enum: ["how_to", "overview", "troubleshooting", "best_practice"], description: "Purpose of the video" },
11470
11639
  duration_seconds: { type: "number", description: "Duration of the video in seconds" },
11471
11640
  views: { type: "number", description: "Total number of views" },
11472
- url: { type: "string", description: "URL where the video is hosted" }
11641
+ url: { type: "string", description: "URL where the video is hosted", modifier: "volatile" }
11473
11642
  },
11474
11643
  // HypothesisProperties: A testable belief. The canonical design artefact for validating product assumptions.
11475
11644
  hypothesis: {
@@ -11612,7 +11781,6 @@ var UPG_PROPERTY_SCHEMA = {
11612
11781
  started_at: { type: "string", description: "ISO timestamp the investigation began" },
11613
11782
  resolved_at: { type: "string", description: "ISO timestamp the investigation was concluded. Pairs with `status === 'resolved' | 'abandoned'`." },
11614
11783
  lead_investigator: { type: "string", description: "Lead investigator (email or handle). Distinct from the team owning the affected service. Promote to a `node_owned_by_person` edge if ownership must be queryable." },
11615
- session_id: { type: "string", description: "Originating session" },
11616
11784
  category: { type: "string", enum: ["performance", "security", "data_quality", "reliability", "cost", "compliance", "other"], description: "Kind of issue under investigation. Distinct from `RootCauseProperties.cause_category`, which captures *why something went wrong*." }
11617
11785
  },
11618
11786
  // InvoiceProperties: Invoice.
@@ -11817,9 +11985,6 @@ var UPG_PROPERTY_SCHEMA = {
11817
11985
  entity_type: { type: "string", enum: ["corporation", "llc", "partnership", "sole_proprietor", "nonprofit"], description: "Legal structure of the entity" },
11818
11986
  jurisdiction: { type: "string", description: "Jurisdiction where the entity is registered" },
11819
11987
  ip_ownership: { type: "string", description: "Description of intellectual property ownership" },
11820
- principal_address: { type: "string", description: "Principal business address" },
11821
- tax_id: { type: "string", description: "Tax identification number" },
11822
- registration_number: { type: "string", description: "Official registration or incorporation number" },
11823
11988
  date_incorporated: { type: "string", description: "Date the entity was incorporated (ISO format)" }
11824
11989
  },
11825
11990
  // LibraryDependencyProperties: Library or package dependency.
@@ -11907,8 +12072,7 @@ var UPG_PROPERTY_SCHEMA = {
11907
12072
  marketing_channel: {
11908
12073
  channel_type: { type: "string", enum: ["social", "email", "seo", "sem", "content", "events", "other"], description: "Category of marketing channel" },
11909
12074
  monthly_budget: { type: "number", description: "Monthly spend allocated to this channel", modifier: "snapshot" },
11910
- roi: { type: "number", description: "Return on investment ratio" },
11911
- channel_status: { type: "string", enum: ["active", "paused", "deprecated"], description: "Operational status of the channel" }
12075
+ roi: { type: "number", description: "Return on investment ratio" }
11912
12076
  },
11913
12077
  // MarketingStrategyProperties: Marketing strategy.
11914
12078
  marketing_strategy: {
@@ -12066,7 +12230,6 @@ var UPG_PROPERTY_SCHEMA = {
12066
12230
  // ObjectiveProperties: A high-level strategic goal. The O in OKR.
12067
12231
  objective: {
12068
12232
  timeframe: { type: "string", description: 'Planning timeframe (e.g. "Q1 2026", "H1 2026")' },
12069
- objective_status: { type: "string", enum: ["active", "achieved", "deferred"], description: "Current status" },
12070
12233
  progress: { type: "number", description: "Overall progress (0\u2013100)" }
12071
12234
  },
12072
12235
  // ObservationProperties: Discrete observation captured during research. Absorbed from the deprecated Highlight entity.
@@ -12092,8 +12255,7 @@ var UPG_PROPERTY_SCHEMA = {
12092
12255
  opportunity: {},
12093
12256
  // OrganizationProperties: Organization entity.
12094
12257
  organization: {
12095
- logo_url: { type: "string", description: "URL of the organisation's logo" },
12096
- billing_plan: { type: "string", description: "Current billing / subscription plan" },
12258
+ logo_url: { type: "string", description: "URL of the organisation's logo", modifier: "volatile" },
12097
12259
  industry: { type: "string", description: "Industry vertical the organisation operates in" }
12098
12260
  },
12099
12261
  // OutcomeProperties: A measurable change in user or business state the product drives.
@@ -12115,8 +12277,7 @@ var UPG_PROPERTY_SCHEMA = {
12115
12277
  normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
12116
12278
  },
12117
12279
  required: ["value", "label"]
12118
- },
12119
- outcome_status: { type: "string", enum: ["identified", "measuring", "achieved", "abandoned"], description: "Current lifecycle phase, mirroring the `outcome` lifecycle in `grammar/lifecycles.ts` (UPG-579 Option B): `identified` -> `measuring` -> `achieved` | `abandoned`." }
12280
+ }
12120
12281
  },
12121
12282
  // ParticipantProperties: Research participant.
12122
12283
  participant: {
@@ -12180,7 +12341,6 @@ var UPG_PROPERTY_SCHEMA = {
12180
12341
  },
12181
12342
  // PersonProperties: Person entity. A named, accountable individual.
12182
12343
  person: {
12183
- email: { type: "string", description: "Primary contact email. Stable identifier for de-duplication." },
12184
12344
  role_title: { type: "string", description: "Free-text job title. Distinct from the structured `role` entity." },
12185
12345
  time_zone: { type: "string", description: 'IANA time zone (e.g. "Europe/Berlin"). Useful for capacity / on-call planning.' }
12186
12346
  },
@@ -12278,8 +12438,8 @@ var UPG_PROPERTY_SCHEMA = {
12278
12438
  product: {
12279
12439
  stage: { type: "string", enum: ["concept", "validation", "build", "beta", "launch", "growth", "mature", "maintenance", "sunset"], description: "Lifecycle stage" },
12280
12440
  health_status: { type: "string", enum: ["on_track", "at_risk", "off_track"], description: "Overall health" },
12281
- url: { type: "string", description: "Where the product lives. Marketing site, app store URL, etc." },
12282
- logo_url: { type: "string", description: "Logo or icon URL. Used to render product cards and lists." },
12441
+ url: { type: "string", description: "Where the product lives. Marketing site, app store URL, etc.", modifier: "volatile" },
12442
+ logo_url: { type: "string", description: "Logo or icon URL. Used to render product cards and lists.", modifier: "volatile" },
12283
12443
  launched_at: { type: "string", description: "When the product became generally available (ISO 8601)" }
12284
12444
  },
12285
12445
  // ProductAreaProperties: ProductArea entity.
@@ -12328,7 +12488,6 @@ var UPG_PROPERTY_SCHEMA = {
12328
12488
  // PrototypeProperties: Prototype.
12329
12489
  prototype: {
12330
12490
  fidelity: { type: "string", enum: ["low", "medium", "high"], description: "Detail level" },
12331
- test_status: { type: "string", enum: ["untested", "testing", "passed", "failed"], description: "User-test status" },
12332
12491
  tool: { type: "string", description: "Authoring tool" }
12333
12492
  },
12334
12493
  // QaSessionProperties: QA session.
@@ -12458,8 +12617,7 @@ var UPG_PROPERTY_SCHEMA = {
12458
12617
  // ReviewGateProperties: Review gate.
12459
12618
  review_gate: {
12460
12619
  gate_type: { type: "string", enum: ["human_review", "automated_check", "approval"], description: "Kind of review required at this gate" },
12461
- required_approvers: { type: "string[]", description: "People or roles that must approve. Promote to `node_owned_by_person` edges (one per name) if ownership must be queryable." },
12462
- gate_status: { type: "string", enum: ["pending", "approved", "rejected", "bypassed"], description: "Current approval status of the gate" }
12620
+ required_approvers: { type: "string[]", description: "People or roles that must approve. Promote to `node_owned_by_person` edges (one per name) if ownership must be queryable." }
12463
12621
  },
12464
12622
  // RiskProperties: Risk.
12465
12623
  risk: {
@@ -12504,7 +12662,6 @@ var UPG_PROPERTY_SCHEMA = {
12504
12662
  roadmap_item: {
12505
12663
  quarter: { type: "string", description: 'Planning quarter (e.g. "Q2 2026"). Pair with `start_date`/`target_date` for precise scheduling.' },
12506
12664
  priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Importance against other items" },
12507
- item_status: { type: "string", enum: ["planned", "in_progress", "shipped", "deferred"], description: "Status. `deferred` = explicitly pushed to a later period." },
12508
12665
  confidence: {
12509
12666
  type: "assessment",
12510
12667
  scale_id: "confidence_5",
@@ -12584,7 +12741,6 @@ var UPG_PROPERTY_SCHEMA = {
12584
12741
  // SecurityAuditProperties: Security audit.
12585
12742
  security_audit: {
12586
12743
  audit_scope: { type: "string", description: "Systems or processes covered by the audit" },
12587
- audit_status: { type: "string", enum: ["scheduled", "in_progress", "completed"], description: "Current progress of the audit" },
12588
12744
  findings_count: { type: "number", description: "Total number of findings", modifier: "derived" },
12589
12745
  critical_findings: { type: "number", description: "Number of critical-severity findings" }
12590
12746
  },
@@ -13159,7 +13315,7 @@ var UPG_PROPERTY_SCHEMA = {
13159
13315
  version: { type: "string", description: 'Version or iteration (e.g. "v2", "2026-04-B")' },
13160
13316
  tool: { type: "string", description: 'Authoring tool. @example "Figma", "Balsamiq", "pen and paper"' },
13161
13317
  review_status: { type: "string", enum: ["draft", "in_review", "approved", "rejected"], description: "Review gate status" },
13162
- linked_prototype_url: { type: "string", description: "URL of the corresponding interactive prototype" }
13318
+ linked_prototype_url: { type: "string", description: "URL of the corresponding interactive prototype", modifier: "volatile" }
13163
13319
  },
13164
13320
  // WorkflowArtifactProperties: Workflow artifact.
13165
13321
  workflow_artifact: {
@@ -13191,7 +13347,6 @@ var UPG_PROPERTY_SCHEMA = {
13191
13347
  },
13192
13348
  // WorkspaceProperties: Workspace: a spatial thinking space for arranging entities.
13193
13349
  workspace: {
13194
- slug: { type: "string", description: "URL-friendly identifier" },
13195
13350
  visibility: { type: "string", enum: ["private", "shared", "public"], description: "Who can see this workspace" },
13196
13351
  purpose: { type: "string", description: "Free-text description. Pairs with the closed-enum `workspace_purpose`." },
13197
13352
  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." },
@@ -29517,7 +29672,7 @@ function isCanonical(text) {
29517
29672
  }
29518
29673
 
29519
29674
  // src/index.ts
29520
- var UPG_VERSION = "0.14.1";
29675
+ var UPG_VERSION = "0.16.0";
29521
29676
  var UPG_FORMAT_VERSION = "0.4.0";
29522
29677
  var MARKDOWN_FORMAT_VERSION = "0.1";
29523
29678
  var UPG_TYPES = getTypes();