@unified-product-graph/mcp-server 0.7.6 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -6410,6 +6410,41 @@ function getDeprecatedTypes() {
6410
6410
  return deprecated;
6411
6411
  }
6412
6412
  var UPG_PROPERTY_MIGRATIONS = {
6413
+ // ── v0.8.0: UPG-574 deprecated-property removal pass ───────────────────
6414
+ //
6415
+ // The seven properties tagged `@deprecated since v0.4.0` that survived the
6416
+ // v0.5.0 hygiene pass are removed from the spec in v0.8.0 (a breaking
6417
+ // release). Five of the seven already carry a migration:
6418
+ // - `task.task_status` / `bug.bug_status` lift to `UPGBaseNode.status`
6419
+ // (see `UPG_PROPERTY_MIGRATIONS['0.4.0']`, values identical).
6420
+ // - `learning.metric` drops in favour of the `learning_observed_on_metric`
6421
+ // edge (see `UPG_PROPERTY_MIGRATIONS['0.5.0']`).
6422
+ // The two remaining property surfaces are migrated here:
6423
+ // - `evidence.strength` (simple `strong | moderate | weak` enum) is
6424
+ // dropped in favour of `weight: UPGAssessment` (scale `weight_5pt`).
6425
+ // Authors carrying the legacy key should copy the value to `weight`
6426
+ // before applying this migration: `strong → 5`, `moderate → 3`,
6427
+ // `weak → 1`, with the old word preserved in `weight.label`.
6428
+ // - `story_task.estimate` / `.effort` / `.priority` drop. `story_task`
6429
+ // itself is deprecated (`UPG_MIGRATIONS['0.4.0']` renames it to the
6430
+ // canonical `task`); the type rename copies every property verbatim,
6431
+ // so the values survive on `task` (`TaskProperties.estimate` /
6432
+ // `.effort` / `.priority`, all live). This rule removes the residue
6433
+ // from any node still typed `story_task` at migration time.
6434
+ "0.8.0": [
6435
+ {
6436
+ kind: "drop_props",
6437
+ type: "evidence",
6438
+ drop_props: ["strength"],
6439
+ reason: "UPG-574 (v0.8.0). evidence.strength was `@deprecated since v0.4.0`; the structured `weight: UPGAssessment` (scale `weight_5pt`) replaces the `strong | moderate | weak` enum to align with the spec-wide scoring pattern. Authors should copy the value to `weight` before applying this migration (strong -> 5, moderate -> 3, weak -> 1; carry the old word in `weight.label`). The migration drops the residue."
6440
+ },
6441
+ {
6442
+ kind: "drop_props",
6443
+ type: "story_task",
6444
+ drop_props: ["estimate", "effort", "priority"],
6445
+ reason: 'UPG-574 (v0.8.0). story_task.estimate / .effort / .priority were `@deprecated since v0.4.0`; story_task itself is deprecated (UPG_MIGRATIONS["0.4.0"] renames it to canonical `task`, copying all properties verbatim), so the values survive on TaskProperties.estimate / .effort / .priority (all live). This rule removes the residue from any node still typed `story_task` at migration time.'
6446
+ }
6447
+ ],
6413
6448
  // ── v0.5.0: UPG-509 deprecation hygiene pass ───────────────────────────
6414
6449
  //
6415
6450
  // Properties tagged `@deprecated since="0.4.0" removeIn="0.5.0"` (and the
@@ -7913,7 +7948,18 @@ var UPG_PROPERTY_SCHEMA = {
7913
7948
  },
7914
7949
  // A11yIssueProperties: Accessibility issue.
7915
7950
  a11y_issue: {
7916
- severity: { type: "string", enum: ["minor", "moderate", "serious", "critical"], description: "Severity. Aligned to axe-core's 4-level impact scale (industry standard): 'minor' < 'moderate' < 'serious' < 'critical'. Migration: the previous 3-level scale ('critical' | 'major' | 'minor') maps to ('critical' | 'serious' | 'minor') respectively." },
7951
+ severity: {
7952
+ type: "assessment",
7953
+ scale_id: "severity_5",
7954
+ description: "Impact severity (UPGAssessment on the `severity_5` scale). Migrated from the inline axe-core 4-level enum (`minor|moderate|serious|critical`) (UPG-579 Option C): map `critical` -> 5, `serious` -> 4, `moderate` -> 3, `minor` -> 2; carry the old word in `label`.",
7955
+ properties: {
7956
+ value: { type: "number", description: "The numeric value, used for computation." },
7957
+ label: { type: "string", description: "The qualitative label (what the assessor meant)." },
7958
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
7959
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
7960
+ },
7961
+ required: ["value", "label"]
7962
+ },
7917
7963
  wcag_criterion: { type: "string", description: 'WCAG success criterion violated (e.g. "1.1.1", "2.4.7")' },
7918
7964
  rule_id: { type: "string", description: "Identifier of the rule that flagged the issue" },
7919
7965
  help_url: { type: "string", description: "URL to documentation explaining the issue and how to fix it" },
@@ -7970,7 +8016,18 @@ var UPG_PROPERTY_SCHEMA = {
7970
8016
  affinity_cluster: {
7971
8017
  theme: { type: "string", description: "Emergent theme label" },
7972
8018
  child_observation_count: { type: "number", description: "Observations in this cluster" },
7973
- confidence: { type: "string", enum: ["high", "medium", "low"], description: "Confidence in the theme's validity" }
8019
+ confidence: {
8020
+ type: "assessment",
8021
+ scale_id: "confidence_5",
8022
+ description: "Confidence in the theme's validity (UPGAssessment on `confidence_5`).",
8023
+ properties: {
8024
+ value: { type: "number", description: "The numeric value, used for computation." },
8025
+ label: { type: "string", description: "The qualitative label (what the assessor meant)." },
8026
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
8027
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
8028
+ },
8029
+ required: ["value", "label"]
8030
+ }
7974
8031
  },
7975
8032
  // AgentDefinitionProperties: Agent definition.
7976
8033
  agent_definition: {
@@ -8104,7 +8161,7 @@ var UPG_PROPERTY_SCHEMA = {
8104
8161
  // AlertRuleProperties: Alert rule.
8105
8162
  alert_rule: {
8106
8163
  condition: { type: "string", description: 'Triggering query or expression. @example "avg(rate(http_errors_total[5m])) > 0.05"' },
8107
- severity: { type: "string", enum: ["critical", "warning", "info"], description: "Routes notification and escalation. `critical` = page immediately. `warning` = notify, don't page. `info` = log only." },
8164
+ severity: { type: "string", enum: ["critical", "warning", "info"], description: "Routes notification and escalation. Uses the `LogLevel` scale (operational verbosity, distinct from user-impact `severity_5`). `critical` = page immediately. `warning` = notify, don't page. `info` = log only." },
8108
8165
  notification_channel: { type: "string", description: 'Notification destination. @example "pagerduty:sev1-rotation", "slack:#alerts-low"' },
8109
8166
  evaluation_window: { type: "string", description: 'Required duration the condition holds before firing. Prevents flapping on transient spikes. @example "5m", "15m", "1h"' },
8110
8167
  escalation_policy: { type: "string", description: 'Escalation behaviour on unacknowledged alerts. @example "Escalate to engineering lead after 10 minutes"' }
@@ -8143,16 +8200,28 @@ var UPG_PROPERTY_SCHEMA = {
8143
8200
  },
8144
8201
  // AssumptionProperties: Assumption entity.
8145
8202
  assumption: {
8146
- confidence: { type: "string", enum: ["high", "medium", "low"], description: "Confidence before testing. Independent of whether the assumption is validated (tracked in lifecycle)." },
8203
+ confidence: {
8204
+ type: "assessment",
8205
+ scale_id: "confidence_5",
8206
+ description: "Confidence before testing (UPGAssessment on `confidence_5`). Independent of whether the assumption is validated (tracked in lifecycle).",
8207
+ properties: {
8208
+ value: { type: "number", description: "The numeric value, used for computation." },
8209
+ label: { type: "string", description: "The qualitative label (what the assessor meant)." },
8210
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
8211
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
8212
+ },
8213
+ required: ["value", "label"]
8214
+ },
8147
8215
  validation_method: { type: "string", description: "Validation method, planned or used" },
8148
8216
  risk_level: {
8149
- type: "object",
8217
+ type: "assessment",
8218
+ scale_id: "severity_5",
8150
8219
  description: "Exposure if the assumption turns out wrong",
8151
8220
  properties: {
8152
8221
  value: { type: "number", description: "The numeric value, used for computation." },
8153
8222
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
8154
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
8155
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
8223
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
8224
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
8156
8225
  },
8157
8226
  required: ["value", "label"]
8158
8227
  },
@@ -8263,8 +8332,18 @@ var UPG_PROPERTY_SCHEMA = {
8263
8332
  },
8264
8333
  // BugProperties: Bug report.
8265
8334
  bug: {
8266
- bug_severity: { type: "string", enum: ["critical", "major", "minor", "trivial"], description: "Impact severity. Independent of priority (which governs when it gets fixed). `critical` = data loss or complete feature failure. `trivial` = cosmetic only." },
8267
- bug_status: { type: "string", enum: ["open", "in_progress", "fixed", "verified", "wont_fix"], description: "@deprecated since v0.4.0. Use top-level `UPGBaseNode.status`. Values map identically: open | in_progress | fixed | verified | wont_fix. Migration: `UPG_PROPERTY_MIGRATIONS['0.4.0']` lifts this to `status`." },
8335
+ bug_severity: {
8336
+ type: "assessment",
8337
+ scale_id: "severity_5",
8338
+ description: "Impact severity (UPGAssessment on the `severity_5` scale). Independent of priority (which governs when it gets fixed). Migrated from the inline `critical|major|minor|trivial` enum (UPG-579 Option C): map `critical` -> 5, `major` -> 4, `minor` -> 2, `trivial` -> 1; carry the old word in `label`.",
8339
+ properties: {
8340
+ value: { type: "number", description: "The numeric value, used for computation." },
8341
+ label: { type: "string", description: "The qualitative label (what the assessor meant)." },
8342
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
8343
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
8344
+ },
8345
+ required: ["value", "label"]
8346
+ },
8268
8347
  steps_to_reproduce: { type: "string", description: "Step-by-step reproduction" },
8269
8348
  environment: { type: "string", description: 'Observed environment (e.g. "prod", "staging", "iOS 17.4")' },
8270
8349
  priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Urgency relative to other work. Independent of `bug_severity` (a critical bug can have low priority if rare)." },
@@ -8294,7 +8373,7 @@ var UPG_PROPERTY_SCHEMA = {
8294
8373
  maturity_level: { type: "string", enum: ["initial", "developing", "defined", "managed", "optimizing"], description: "Current maturity" },
8295
8374
  target_maturity: { type: "string", enum: ["initial", "developing", "defined", "managed", "optimizing"], description: "Target maturity" },
8296
8375
  gap: { type: "string", description: "Gap between current and target" },
8297
- evolution_stage: { type: "string", enum: ["genesis", "custom", "product", "commodity"], description: 'Wardley evolution axis: where this capability sits on the genesis \u2192 custom \u2192 product \u2192 commodity spectrum. Used by frameworks like `wardley-map`; generally useful as a maturity-of-the-domain signal independent of `maturity_level` (which measures the team\'s internal capability practice). @example "product"' },
8376
+ evolution_stage: { type: "string", enum: ["genesis", "custom", "product", "commodity"], description: "Wardley evolution axis: where this capability sits on the genesis \u2192 custom \u2192 product \u2192 commodity spectrum. Used by frameworks like `wardley-map`; generally useful as a maturity-of-the-domain signal independent of `maturity_level` (which measures the team's internal capability practice). @example 'product'" },
8298
8377
  visibility: { type: "number", description: "Position on the visibility axis from `0.0` (deepest dependency, infra the user never sees) to `1.0` (user-visible anchor). Used by `wardley-map` for the y-axis position of each capability in the value chain. @example 0.8" }
8299
8378
  },
8300
8379
  // CapacityPlanProperties: CapacityPlan entity.
@@ -8307,7 +8386,7 @@ var UPG_PROPERTY_SCHEMA = {
8307
8386
  // CeremonyProperties: Ceremony entity.
8308
8387
  ceremony: {
8309
8388
  ceremony_type: { type: "string", enum: ["standup", "planning", "review", "retro", "sync", "demo", "other"], description: "Kind of recurring meeting" },
8310
- cadence: { type: "string", description: 'How often the ceremony occurs (e.g. "daily", "biweekly")' },
8389
+ cadence: { type: "string", enum: ["continuous", "hourly", "daily", "weekly", "monthly", "quarterly", "yearly", "on_demand", "other"], description: "How often the ceremony occurs. Uses the shared `Cadence` scale." },
8311
8390
  duration_minutes: { type: "number", description: "Typical duration of the meeting in minutes" },
8312
8391
  participants: { type: "string", description: "People or roles who attend" }
8313
8392
  },
@@ -8336,9 +8415,9 @@ var UPG_PROPERTY_SCHEMA = {
8336
8415
  category: { type: "string", description: "High-level category of the churn reason" },
8337
8416
  frequency_count: { type: "number", description: "Exact count of times this reason has been cited in `frequency_period`" },
8338
8417
  frequency_period: { type: "string", description: "The recurrence period the count is measured over (ISO-8601 `Duration`, e.g. `'P30D'`)" },
8339
- frequency_rating: { type: "string", enum: ["rare", "occasional", "regular", "constant", "other"], description: "Qualitative frequency tier when an exact count is not known" },
8418
+ frequency_rating: { type: "string", enum: ["constant", "regular", "occasional", "rare", "other"], description: "Qualitative frequency tier when an exact count is not known" },
8340
8419
  contributing_factors: { type: "string[]", description: "Other factors that contributed to the churn" },
8341
- signal_sentiment: { type: "string", enum: ["positive", "negative", "neutral", "mixed"], description: "Detected sentiment of the churn signal" },
8420
+ signal_sentiment: { type: "string", enum: ["positive", "neutral", "negative", "mixed"], description: "Detected sentiment of the churn signal" },
8342
8421
  signal_channel: { type: "string", description: "Channel through which the churn signal was received" },
8343
8422
  signal_urgency: { type: "string", enum: ["low", "medium", "high", "critical"], description: "Urgency of the churn risk" }
8344
8423
  },
@@ -8452,7 +8531,7 @@ var UPG_PROPERTY_SCHEMA = {
8452
8531
  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'`." },
8453
8532
  frequency_count: { type: "number", description: "Exact count in the period. Pairs with `frequency_period`." },
8454
8533
  frequency_period: { type: "string", description: "Recurrence period (ISO-8601 `Duration`, e.g. `'P7D'`)" },
8455
- frequency_rating: { type: "string", enum: ["rare", "occasional", "regular", "constant", "other"], description: "Qualitative rate tier when an exact rate is unknown" }
8534
+ frequency_rating: { type: "string", enum: ["constant", "regular", "occasional", "rare", "other"], description: "Qualitative rate tier when an exact rate is unknown" }
8456
8535
  },
8457
8536
  // ContentPieceProperties: Content piece.
8458
8537
  content_piece: {
@@ -8467,7 +8546,7 @@ var UPG_PROPERTY_SCHEMA = {
8467
8546
  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'`." },
8468
8547
  frequency_count: { type: "number", description: "Exact count of publications in the period. Pairs with `frequency_period`." },
8469
8548
  frequency_period: { type: "string", description: "Recurrence period (ISO-8601 `Duration`, e.g. `'P7D'`)" },
8470
- frequency_rating: { type: "string", enum: ["rare", "occasional", "regular", "constant", "other"], description: "Qualitative rate tier when an exact rate is unknown" }
8549
+ frequency_rating: { type: "string", enum: ["constant", "regular", "occasional", "rare", "other"], description: "Qualitative rate tier when an exact rate is unknown" }
8471
8550
  },
8472
8551
  // ContentThemeProperties: Content theme.
8473
8552
  content_theme: {
@@ -8492,13 +8571,14 @@ var UPG_PROPERTY_SCHEMA = {
8492
8571
  clause_text: { type: "string", description: "Full text of the clause" },
8493
8572
  is_negotiable: { type: "boolean", description: "Whether this clause is open to negotiation" },
8494
8573
  risk_level: {
8495
- type: "object",
8574
+ type: "assessment",
8575
+ scale_id: "severity_5",
8496
8576
  description: "Risk level if the clause is accepted as-is (1 = negligible, 5 = severe exposure)",
8497
8577
  properties: {
8498
8578
  value: { type: "number", description: "The numeric value, used for computation." },
8499
8579
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
8500
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
8501
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
8580
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
8581
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
8502
8582
  },
8503
8583
  required: ["value", "label"]
8504
8584
  }
@@ -8517,9 +8597,9 @@ var UPG_PROPERTY_SCHEMA = {
8517
8597
  // CustomerFeedbackProperties: Customer feedback.
8518
8598
  customer_feedback: {
8519
8599
  feedback_type: { type: "string", enum: ["survey", "interview", "review", "nps"], description: "How the feedback was collected" },
8520
- sentiment: { type: "string", enum: ["positive", "neutral", "negative"], description: "Overall sentiment of the feedback" },
8600
+ sentiment: { type: "string", enum: ["positive", "neutral", "negative", "mixed"], description: "Overall sentiment of the feedback" },
8521
8601
  verbatim: { type: "string", description: "Exact words from the customer" },
8522
- signal_sentiment: { type: "string", enum: ["positive", "negative", "neutral", "mixed"], description: "Detected sentiment of the underlying signal" },
8602
+ signal_sentiment: { type: "string", enum: ["positive", "neutral", "negative", "mixed"], description: "Detected sentiment of the underlying signal" },
8523
8603
  signal_channel: { type: "string", description: "Channel through which the signal was received" },
8524
8604
  signal_urgency: { type: "string", enum: ["low", "medium", "high", "critical"], description: "Perceived urgency of the feedback" }
8525
8605
  },
@@ -8548,7 +8628,7 @@ var UPG_PROPERTY_SCHEMA = {
8548
8628
  url: { type: "string", description: "URL to the live dashboard" },
8549
8629
  audience: { type: "string", description: "Intended audience for this dashboard" },
8550
8630
  element_count: { type: "number", description: "Number of widgets or panels on the dashboard" },
8551
- refresh_cadence: { type: "string", description: "How often the dashboard data refreshes" },
8631
+ 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." },
8552
8632
  filter_count: { type: "number", description: "Number of user-configurable filters" }
8553
8633
  },
8554
8634
  // DataClassificationProperties: Data classification.
@@ -8608,7 +8688,7 @@ var UPG_PROPERTY_SCHEMA = {
8608
8688
  },
8609
8689
  // DataProductProperties: DataProduct entity.
8610
8690
  data_product: {
8611
- data_product_type: { type: "string", description: 'Classification of the data product (e.g. "report", "dataset", "stream")' },
8691
+ data_product_type: { type: "string", enum: ["report", "dataset", "stream", "api", "ml_feature", "other"], description: "Classification of the data product (UPG-579 Option B)." },
8612
8692
  sla_freshness: { type: "string", description: 'Freshness SLA commitment (e.g. "< 1 hour")' }
8613
8693
  },
8614
8694
  // DataQualityRuleProperties: DataQualityRule entity.
@@ -8625,7 +8705,7 @@ var UPG_PROPERTY_SCHEMA = {
8625
8705
  data_source: {
8626
8706
  source_type: { type: "string", enum: ["database", "api", "event_stream", "warehouse"], description: "Kind of data source" },
8627
8707
  connection_status: { type: "string", enum: ["connected", "disconnected", "error"], description: "Current connection health" },
8628
- refresh_cadence: { type: "string", description: 'How often the data is refreshed (e.g. "hourly", "daily")' }
8708
+ refresh_cadence: { type: "string", enum: ["continuous", "hourly", "daily", "weekly", "monthly", "quarterly", "yearly", "on_demand", "other"], description: "How often the data is refreshed. Uses the shared `Cadence` scale." }
8629
8709
  },
8630
8710
  // DatabaseSchemaProperties: Database schema.
8631
8711
  database_schema: {
@@ -8656,7 +8736,7 @@ var UPG_PROPERTY_SCHEMA = {
8656
8736
  },
8657
8737
  // DeliverableProperties: Deliverable.
8658
8738
  deliverable: {
8659
- deliverable_type: { type: "string", description: 'Kind of deliverable (e.g. "document", "prototype", "release")' },
8739
+ deliverable_type: { type: "string", enum: ["document", "prototype", "release", "design", "report", "other"], description: "Kind of deliverable (UPG-579 Option B)." },
8660
8740
  due_date: { type: "string", description: "Due date for the deliverable (ISO format)" },
8661
8741
  deliverable_status: { type: "string", enum: ["not_started", "in_progress", "in_review", "accepted", "rejected"], description: "Current progress status" },
8662
8742
  acceptance_criteria: { type: "string", description: "Criteria that must be met for the deliverable to be accepted" }
@@ -8734,7 +8814,18 @@ var UPG_PROPERTY_SCHEMA = {
8734
8814
  target_domain: { type: "string", enum: ["ux", "visual", "interaction", "content", "accessibility", "other"], description: "Target design discipline" },
8735
8815
  framing: { type: "string", enum: ["how_might_we", "what_if", "why_do", "how_do", "what_prevents", "other"], description: "Question framing template" },
8736
8816
  priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Importance against other backlog questions" },
8737
- confidence: { type: "string", enum: ["high", "medium", "low"], description: "Confidence the question is well-framed. Distinct from confidence in any answer." },
8817
+ confidence: {
8818
+ type: "assessment",
8819
+ scale_id: "confidence_5",
8820
+ description: "Confidence the question is well-framed (UPGAssessment on `confidence_5`). Distinct from confidence in any answer.",
8821
+ properties: {
8822
+ value: { type: "number", description: "The numeric value, used for computation." },
8823
+ label: { type: "string", description: "The qualitative label (what the assessor meant)." },
8824
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
8825
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
8826
+ },
8827
+ required: ["value", "label"]
8828
+ },
8738
8829
  assumptions: { type: "string[]", description: "Underlying assumptions. Surfaced explicitly so they can be challenged or validated." },
8739
8830
  validation_method: { type: "string", enum: ["interview", "survey", "usability_test", "analytics", "a_b_test", "prototype_test", "literature_review", "other"], description: "Primary validation method" }
8740
8831
  },
@@ -8761,24 +8852,26 @@ var UPG_PROPERTY_SCHEMA = {
8761
8852
  desired_outcome: {
8762
8853
  statement: { type: "string", description: "Outcome statement in the user's words" },
8763
8854
  importance: {
8764
- type: "object",
8855
+ type: "assessment",
8856
+ scale_id: "importance_5",
8765
8857
  description: "How important this outcome is to the user (1 = low, 5 = critical)",
8766
8858
  properties: {
8767
8859
  value: { type: "number", description: "The numeric value, used for computation." },
8768
8860
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
8769
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
8770
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
8861
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
8862
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
8771
8863
  },
8772
8864
  required: ["value", "label"]
8773
8865
  },
8774
8866
  current_satisfaction: {
8775
- type: "object",
8867
+ type: "assessment",
8868
+ scale_id: "satisfaction_5",
8776
8869
  description: "How satisfied the user currently is with this outcome (1 = very unsatisfied, 5 = fully satisfied)",
8777
8870
  properties: {
8778
8871
  value: { type: "number", description: "The numeric value, used for computation." },
8779
8872
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
8780
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
8781
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
8873
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
8874
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
8782
8875
  },
8783
8876
  required: ["value", "label"]
8784
8877
  }
@@ -8896,20 +8989,20 @@ var UPG_PROPERTY_SCHEMA = {
8896
8989
  evidence_source: { type: "string", enum: ["experiment_run", "observation", "quote", "metric_change", "market_data", "interview"], description: "Origin type. Drives renderer + filter UI; the provenance edge (`derived_from_*`) carries the actual source node reference." },
8897
8990
  direction: { type: "string", enum: ["supports", "refutes", "neutral"], description: "Direction relative to the parent hypothesis." },
8898
8991
  weight: {
8899
- type: "object",
8900
- description: "Strength (UPGAssessment, scale `weight_5pt`).",
8992
+ type: "assessment",
8993
+ scale_id: "importance_5",
8994
+ description: "Strength (UPGAssessment, scale `scale_5`).",
8901
8995
  properties: {
8902
8996
  value: { type: "number", description: "The numeric value, used for computation." },
8903
8997
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
8904
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
8905
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
8998
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
8999
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
8906
9000
  },
8907
9001
  required: ["value", "label"]
8908
9002
  },
8909
9003
  summary: { type: "string", description: "Plain-English summary." },
8910
9004
  observed_at: { type: "string", description: "ISO date observed." },
8911
- source: { type: "string", description: "Free-text provenance note" },
8912
- strength: { type: "string", enum: ["strong", "moderate", "weak"], description: "@deprecated since v0.4.0. Use `weight: UPGAssessment`. Simple enum replaced by structured assessment to align with UPG scoring patterns." }
9005
+ source: { type: "string", description: "Free-text provenance note" }
8913
9006
  },
8914
9007
  // ExperimentProperties: A structured activity designed to test a hypothesis.
8915
9008
  experiment: {
@@ -8926,46 +9019,50 @@ var UPG_PROPERTY_SCHEMA = {
8926
9019
  method: { type: "string", enum: ["a_b_test", "multivariate", "qual_interview", "prototype_test", "fake_door", "wizard_of_oz", "longitudinal"], description: "Experimental method. Drives renderer and analysis tooling." },
8927
9020
  success_criteria: { type: "string", description: 'Plain-English description of "passing"' },
8928
9021
  projected_reach: {
8929
- type: "object",
9022
+ type: "assessment",
9023
+ scale_id: "reach_5",
8930
9024
  description: "Projected reach: how many people the run is expected to touch (UPGAssessment)",
8931
9025
  properties: {
8932
9026
  value: { type: "number", description: "The numeric value, used for computation." },
8933
9027
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
8934
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
8935
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9028
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9029
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
8936
9030
  },
8937
9031
  required: ["value", "label"]
8938
9032
  },
8939
9033
  projected_impact: {
8940
- type: "object",
9034
+ type: "assessment",
9035
+ scale_id: "impact_5",
8941
9036
  description: "Projected impact on the target metric (UPGAssessment)",
8942
9037
  properties: {
8943
9038
  value: { type: "number", description: "The numeric value, used for computation." },
8944
9039
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
8945
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
8946
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9040
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9041
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
8947
9042
  },
8948
9043
  required: ["value", "label"]
8949
9044
  },
8950
9045
  confidence: {
8951
- type: "object",
8952
- description: "Team confidence at plan-time (UPGAssessment, scale `confidence_5pt`)",
9046
+ type: "assessment",
9047
+ scale_id: "confidence_5",
9048
+ description: "Team confidence at plan-time (UPGAssessment, scale `confidence_5`)",
8953
9049
  properties: {
8954
9050
  value: { type: "number", description: "The numeric value, used for computation." },
8955
9051
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
8956
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
8957
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9052
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9053
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
8958
9054
  },
8959
9055
  required: ["value", "label"]
8960
9056
  },
8961
9057
  cost_estimate: {
8962
- type: "object",
9058
+ type: "assessment",
9059
+ scale_id: "effort_5",
8963
9060
  description: "Cost estimate at plan-time (UPGAssessment)",
8964
9061
  properties: {
8965
9062
  value: { type: "number", description: "The numeric value, used for computation." },
8966
9063
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
8967
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
8968
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9064
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9065
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
8969
9066
  },
8970
9067
  required: ["value", "label"]
8971
9068
  },
@@ -8979,13 +9076,14 @@ var UPG_PROPERTY_SCHEMA = {
8979
9076
  actual_reach: { type: "number", description: "Observed reach: how many people the run actually touched" },
8980
9077
  outcome_summary: { type: "string", description: "Plain-English outcome" },
8981
9078
  severity_of_finding: {
8982
- type: "object",
9079
+ type: "assessment",
9080
+ scale_id: "severity_5",
8983
9081
  description: "Severity / strength of the finding (UPGAssessment)",
8984
9082
  properties: {
8985
9083
  value: { type: "number", description: "The numeric value, used for computation." },
8986
9084
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
8987
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
8988
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9085
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9086
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
8989
9087
  },
8990
9088
  required: ["value", "label"]
8991
9089
  },
@@ -9004,7 +9102,18 @@ var UPG_PROPERTY_SCHEMA = {
9004
9102
  feasibility_study: {
9005
9103
  study_type: { type: "string", enum: ["technical", "business", "market", "resource"], description: 'Type of feasibility being assessed. @example "technical" for assessing engineering viability' },
9006
9104
  conclusion: { type: "string", enum: ["feasible", "not_feasible", "conditional", "needs_more_data"], description: "Outcome conclusion of the study" },
9007
- confidence: { type: "string", enum: ["high", "medium", "low"], description: "Confidence in the conclusion" }
9105
+ confidence: {
9106
+ type: "assessment",
9107
+ scale_id: "confidence_5",
9108
+ description: "Confidence in the conclusion (UPGAssessment on `confidence_5`).",
9109
+ properties: {
9110
+ value: { type: "number", description: "The numeric value, used for computation." },
9111
+ label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9112
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9113
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9114
+ },
9115
+ required: ["value", "label"]
9116
+ }
9008
9117
  },
9009
9118
  // FeatureProperties: A discrete, user-facing capability of the product.
9010
9119
  feature: {
@@ -9039,28 +9148,30 @@ var UPG_PROPERTY_SCHEMA = {
9039
9148
  feature_request: {
9040
9149
  request_source: { type: "string", enum: ["customer", "internal", "prospect", "support", "community"], description: "Where the request originated" },
9041
9150
  vote_count: { type: "number", description: "Number of votes or upvotes from users" },
9042
- signal_sentiment: { type: "string", enum: ["positive", "negative", "neutral", "mixed"], description: "Detected sentiment of the request" },
9151
+ signal_sentiment: { type: "string", enum: ["positive", "neutral", "negative", "mixed"], description: "Detected sentiment of the request" },
9043
9152
  signal_channel: { type: "string", description: "Channel through which the request was received" },
9044
9153
  signal_urgency: { type: "string", enum: ["low", "medium", "high", "critical"], description: "Perceived urgency of the request" },
9045
9154
  revenue_impact: {
9046
- type: "object",
9155
+ type: "assessment",
9156
+ scale_id: "impact_5",
9047
9157
  description: "Estimated revenue impact if implemented (1-5)",
9048
9158
  properties: {
9049
9159
  value: { type: "number", description: "The numeric value, used for computation." },
9050
9160
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9051
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9052
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9161
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9162
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9053
9163
  },
9054
9164
  required: ["value", "label"]
9055
9165
  },
9056
9166
  effort_estimate: {
9057
- type: "object",
9167
+ type: "assessment",
9168
+ scale_id: "effort_5",
9058
9169
  description: "Estimated implementation effort (1-5)",
9059
9170
  properties: {
9060
9171
  value: { type: "number", description: "The numeric value, used for computation." },
9061
9172
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9062
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9063
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9173
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9174
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9064
9175
  },
9065
9176
  required: ["value", "label"]
9066
9177
  },
@@ -9077,13 +9188,14 @@ var UPG_PROPERTY_SCHEMA = {
9077
9188
  sentiment: { type: "string", enum: ["positive", "neutral", "negative", "mixed"], description: "Overall sentiment across mentions" },
9078
9189
  actionable: { type: "boolean", description: "Whether this theme can be acted upon" },
9079
9190
  frequency: {
9080
- type: "object",
9191
+ type: "assessment",
9192
+ scale_id: "frequency_5",
9081
9193
  description: "How often the theme is mentioned (1-5)",
9082
9194
  properties: {
9083
9195
  value: { type: "number", description: "The numeric value, used for computation." },
9084
9196
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9085
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9086
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9197
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9198
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9087
9199
  },
9088
9200
  required: ["value", "label"]
9089
9201
  },
@@ -9101,7 +9213,7 @@ var UPG_PROPERTY_SCHEMA = {
9101
9213
  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." },
9102
9214
  commit: { type: "string", description: "Git commit SHA" },
9103
9215
  files_changed: { type: "string[]", description: "Files changed" },
9104
- deployed_at: { type: "string", description: "ISO timestamp landed in the target environment. Pairs with `fix_status === 'deployed'`." },
9216
+ deployed_at: { type: "string", description: "ISO timestamp landed in the target environment." },
9105
9217
  fixed_date: { type: "string", description: "Application date (ISO date). Coarser-grained complement to `deployed_at`." },
9106
9218
  verified: { type: "boolean", description: "Verified in production" },
9107
9219
  verified_by_test: { type: "boolean", description: "Validated by an automated regression or integration test. Distinct from `verified` (human judgment)." }
@@ -9111,13 +9223,14 @@ var UPG_PROPERTY_SCHEMA = {
9111
9223
  forecast_period: { type: "string", description: 'Time period the forecast covers (e.g. "Q2 2026")' },
9112
9224
  predicted_revenue: { type: "number", description: "Predicted revenue amount" },
9113
9225
  confidence: {
9114
- type: "object",
9226
+ type: "assessment",
9227
+ scale_id: "confidence_5",
9115
9228
  description: "Confidence in the prediction (1 = speculative, 5 = high conviction)",
9116
9229
  properties: {
9117
9230
  value: { type: "number", description: "The numeric value, used for computation." },
9118
9231
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9119
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9120
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9232
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9233
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9121
9234
  },
9122
9235
  required: ["value", "label"]
9123
9236
  },
@@ -9169,13 +9282,14 @@ var UPG_PROPERTY_SCHEMA = {
9169
9282
  hallucination_report: {
9170
9283
  report_type: { type: "string", enum: ["factual", "logical", "fabrication", "inconsistency"], description: "Classification" },
9171
9284
  severity: {
9172
- type: "object",
9285
+ type: "assessment",
9286
+ scale_id: "severity_5",
9173
9287
  description: "Impact severity (1 = trivial, 5 = dangerous misinformation)",
9174
9288
  properties: {
9175
9289
  value: { type: "number", description: "The numeric value, used for computation." },
9176
9290
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9177
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9178
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9291
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9292
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9179
9293
  },
9180
9294
  required: ["value", "label"]
9181
9295
  },
@@ -9197,13 +9311,14 @@ var UPG_PROPERTY_SCHEMA = {
9197
9311
  we_know_when: { type: "string", description: "The measurable signal that confirms or refutes the claim." },
9198
9312
  risk_if_wrong: { type: "string", description: "Risk surface for prioritisation if the claim turns out wrong." },
9199
9313
  current_confidence: {
9200
- type: "object",
9314
+ type: "assessment",
9315
+ scale_id: "confidence_5",
9201
9316
  description: "Team confidence at the current point in time. Derived from the weighted sum of attached `hypothesis_evidence` rows (formula spec'd separately). Authors may set explicitly; loaders may overwrite from derivation.",
9202
9317
  properties: {
9203
9318
  value: { type: "number", description: "The numeric value, used for computation." },
9204
9319
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9205
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9206
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9320
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9321
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9207
9322
  },
9208
9323
  required: ["value", "label"]
9209
9324
  }
@@ -9213,13 +9328,14 @@ var UPG_PROPERTY_SCHEMA = {
9213
9328
  evidence_type: { type: "string", enum: ["experiment_run", "observation", "quote", "metric_change", "market_data", "interview"], description: "Kind of evidence. Drives renderer + filter UI. The provenance edge (`derived_from_*`) carries the actual source node reference per P14; this enum is typing/UI metadata." },
9214
9329
  direction: { type: "string", enum: ["supports", "refutes", "neutral"], description: "Direction relative to the parent claim. Canonical direction axis aligned to `Evidence.direction` so every direction-of-evidence property uses the same vocab. `supports` = paired with the `supports` edge. `refutes` = paired with the `refutes` edge. `neutral` = data insufficient or noisy. BREAKING in v0.4.0: legacy `'confirms'`, `'disconfirms'`, `'inconclusive'` no longer type-check. Migration: `confirms \u2192 supports`, `disconfirms \u2192 refutes`, `inconclusive \u2192 neutral`." },
9215
9330
  weight: {
9216
- type: "object",
9217
- description: "Strength of the evidence (UPGAssessment, scale `weight_5pt`).",
9331
+ type: "assessment",
9332
+ scale_id: "importance_5",
9333
+ description: "Strength of the evidence (UPGAssessment, scale `scale_5`).",
9218
9334
  properties: {
9219
9335
  value: { type: "number", description: "The numeric value, used for computation." },
9220
9336
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9221
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9222
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9337
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9338
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9223
9339
  },
9224
9340
  required: ["value", "label"]
9225
9341
  },
@@ -9237,8 +9353,8 @@ var UPG_PROPERTY_SCHEMA = {
9237
9353
  // IncidentProperties: Incident.
9238
9354
  incident: {
9239
9355
  incident_type: { type: "string", enum: ["operational", "security", "data_breach", "performance", "dependency", "other"], description: 'Discriminator. Absorbs the deprecated `security_incident` type. When `incident_type === \'security\'`, this node replaces the former `security_incident`. @example "security" for a data breach, "operational" for a service outage, "performance" for degradation' },
9240
- severity_level: { type: "string", enum: ["sev1", "sev2", "sev3", "sev4"], description: 'Severity. `sev1` = critical/system down. `sev2` = major impact. `sev3` = minor impact. `sev4` = minimal impact. @example "sev1" for complete service unavailability' },
9241
- urgency: { type: "string", enum: ["high", "low"], description: "Notification urgency. Independent of severity. `high` triggers phone calls. `low` sends a message." },
9356
+ severity_level: { type: "string", enum: ["sev1", "sev2", "sev3", "sev4"], description: 'Incident severity tier (paging classification). `sev1` = critical/system down. `sev2` = major impact. `sev3` = minor impact. `sev4` = minimal. Uses the `IncidentSeverity` scale; distinct from user-impact `severity_5`. @example "sev1" for complete service unavailability' },
9357
+ urgency: { type: "string", enum: ["low", "medium", "high", "critical"], description: "Notification urgency. Independent of severity. Uses the shared `SignalUrgency` scale (`low` | `medium` | `high` | `critical`); higher tiers escalate the notification channel." },
9242
9358
  started_at: { type: "string", description: "ISO timestamp the incident started or was first detected." },
9243
9359
  acknowledged_at: { type: "string", description: "ISO timestamp first acknowledged by a responder. Used to compute time-to-acknowledge." },
9244
9360
  contained_at: { type: "string", description: "ISO timestamp contained. Blast radius limited, bleeding stopped. Containment precedes full resolution, especially for security incidents." },
@@ -9264,7 +9380,18 @@ var UPG_PROPERTY_SCHEMA = {
9264
9380
  // InsightProperties: Unified insight, synthesised from evidence and observations.
9265
9381
  insight: {
9266
9382
  insight_level: { type: "string", enum: ["pattern", "finding", "actionable", "strategic"], description: "Maturity level. `pattern` = recurring observation, not yet interpreted. `finding` = interpreted pattern with a clear meaning. `actionable` = finding with a clear next step. `strategic` = finding that affects product direction." },
9267
- confidence: { type: "string", enum: ["high", "medium", "low"], description: "Confidence. Reflects the strength and diversity of supporting evidence." },
9383
+ confidence: {
9384
+ type: "assessment",
9385
+ scale_id: "confidence_5",
9386
+ description: "Confidence (UPGAssessment on `confidence_5`). Reflects the strength and diversity of supporting evidence.",
9387
+ properties: {
9388
+ value: { type: "number", description: "The numeric value, used for computation." },
9389
+ label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9390
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9391
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9392
+ },
9393
+ required: ["value", "label"]
9394
+ },
9268
9395
  evidence_count: { type: "number", description: "Supporting observations, quotes, or evidence items. Higher counts increase confidence." },
9269
9396
  novelty: { type: "string", enum: ["known", "surprising", "contradictory"], description: "Novelty against existing knowledge. `known` = confirms what we already believed. `surprising` = challenges or extends our understanding. `contradictory` = directly conflicts with a prior assumption." },
9270
9397
  actionability: { type: "string", enum: ["immediate", "needs_validation", "informational"], description: "Current actionability. `immediate` = clear action, no further research needed. `needs_validation` = promising but requires more evidence. `informational` = important context, no direct action." },
@@ -9302,20 +9429,21 @@ var UPG_PROPERTY_SCHEMA = {
9302
9429
  // InvestigationProperties: Active thread of inquiry: debugging, architecture exploration, RCA.
9303
9430
  investigation: {
9304
9431
  severity: {
9305
- type: "object",
9432
+ type: "assessment",
9433
+ scale_id: "severity_5",
9306
9434
  description: "Believed severity of the underlying issue. Drives prioritisation across investigations. Canonicalised in v0.4.0: the ad-hoc `'low' | 'medium' | 'high' | 'critical'` shape was replaced by `UPGAssessment` so every \"severity\" property reports on the same axis. Migration: `low \u2192 2`, `medium \u2192 3`, `high \u2192 4`, `critical \u2192 5`.",
9307
9435
  properties: {
9308
9436
  value: { type: "number", description: "The numeric value, used for computation." },
9309
9437
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9310
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9311
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9438
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9439
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9312
9440
  },
9313
9441
  required: ["value", "label"]
9314
9442
  },
9315
9443
  hypothesis: { type: "string", description: "Working hypothesis about the root cause" },
9316
9444
  findings: { type: "string", description: "Findings discovered so far" },
9317
9445
  started_at: { type: "string", description: "ISO timestamp the investigation began" },
9318
- resolved_at: { type: "string", description: "ISO timestamp the investigation was concluded. Pairs with `investigation_status === 'resolved' | 'abandoned'`." },
9446
+ resolved_at: { type: "string", description: "ISO timestamp the investigation was concluded. Pairs with `status === 'resolved' | 'abandoned'`." },
9319
9447
  lead_investigator: { type: "string", description: "Lead investigator (email or handle). Distinct from the team owning the affected service." },
9320
9448
  session_id: { type: "string", description: "Originating session" },
9321
9449
  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*." }
@@ -9341,24 +9469,26 @@ var UPG_PROPERTY_SCHEMA = {
9341
9469
  statement: { type: "string", description: 'Job statement: "When I... I want to... So I can..."' },
9342
9470
  job_type: { type: "string", enum: ["functional", "emotional", "social", "supporting"], description: "Classification by motivation dimension" },
9343
9471
  importance: {
9344
- type: "object",
9472
+ type: "assessment",
9473
+ scale_id: "importance_5",
9345
9474
  description: "Importance to the user (1 = low, 5 = critical)",
9346
9475
  properties: {
9347
9476
  value: { type: "number", description: "The numeric value, used for computation." },
9348
9477
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9349
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9350
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9478
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9479
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9351
9480
  },
9352
9481
  required: ["value", "label"]
9353
9482
  },
9354
9483
  current_satisfaction: {
9355
- type: "object",
9484
+ type: "assessment",
9485
+ scale_id: "satisfaction_5",
9356
9486
  description: "Current satisfaction with how this job gets done (1 = very unsatisfied, 5 = fully satisfied)",
9357
9487
  properties: {
9358
9488
  value: { type: "number", description: "The numeric value, used for computation." },
9359
9489
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9360
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9361
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9490
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9491
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9362
9492
  },
9363
9493
  required: ["value", "label"]
9364
9494
  },
@@ -9376,24 +9506,26 @@ var UPG_PROPERTY_SCHEMA = {
9376
9506
  action_description: { type: "string", description: "Plain-language description. Primary content of the action." },
9377
9507
  channel: { type: "string", enum: ["in-app", "email", "web", "mobile", "phone", "in-person", "sms", "social", "other"], description: "Channel or surface. Keeps service-blueprint columns consistent across the journey." },
9378
9508
  pain_score: {
9379
- type: "object",
9509
+ type: "assessment",
9510
+ scale_id: "pain_5",
9380
9511
  description: "Pain (1 = effortless, 5 = very painful). Drives opportunity discovery.",
9381
9512
  properties: {
9382
9513
  value: { type: "number", description: "The numeric value, used for computation." },
9383
9514
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9384
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9385
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9515
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9516
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9386
9517
  },
9387
9518
  required: ["value", "label"]
9388
9519
  },
9389
9520
  opportunity_score: {
9390
- type: "object",
9521
+ type: "assessment",
9522
+ scale_id: "impact_5",
9391
9523
  description: "Opportunity (1 = low leverage, 5 = high leverage). Pairs with `pain_score` to rank investment.",
9392
9524
  properties: {
9393
9525
  value: { type: "number", description: "The numeric value, used for computation." },
9394
9526
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9395
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9396
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9527
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9528
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9397
9529
  },
9398
9530
  required: ["value", "label"]
9399
9531
  },
@@ -9417,24 +9549,26 @@ var UPG_PROPERTY_SCHEMA = {
9417
9549
  touchpoint: { type: "string", description: "Interaction touchpoint" },
9418
9550
  channel: { type: "string", description: 'Channel (e.g. "web", "email", "in-store")' },
9419
9551
  emotion_score: {
9420
- type: "object",
9552
+ type: "assessment",
9553
+ scale_id: "satisfaction_5",
9421
9554
  description: "User emotion (1 = very negative, 5 = very positive)",
9422
9555
  properties: {
9423
9556
  value: { type: "number", description: "The numeric value, used for computation." },
9424
9557
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9425
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9426
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9558
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9559
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9427
9560
  },
9428
9561
  required: ["value", "label"]
9429
9562
  },
9430
9563
  friction_score: {
9431
- type: "object",
9564
+ type: "assessment",
9565
+ scale_id: "pain_5",
9432
9566
  description: "Friction (1 = effortless, 5 = very painful)",
9433
9567
  properties: {
9434
9568
  value: { type: "number", description: "The numeric value, used for computation." },
9435
9569
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9436
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9437
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9570
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9571
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9438
9572
  },
9439
9573
  required: ["value", "label"]
9440
9574
  },
@@ -9447,7 +9581,7 @@ var UPG_PROPERTY_SCHEMA = {
9447
9581
  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`.' },
9448
9582
  frequency_count: { type: "number", description: "Exact count of runs in the period. Pairs with `frequency_period`." },
9449
9583
  frequency_period: { type: "string", description: "Recurrence period (ISO-8601 `Duration`, e.g. `'P7D'`)" },
9450
- frequency_rating: { type: "string", enum: ["rare", "occasional", "regular", "constant", "other"], description: "Qualitative tier. Use when an exact rate is unknown." },
9584
+ frequency_rating: { type: "string", enum: ["constant", "regular", "occasional", "rare", "other"], description: "Qualitative tier. Use when an exact rate is unknown." },
9451
9585
  operational_owner: { type: "string", description: "Operationally accountable team or individual" },
9452
9586
  capacity_constraint: { type: "string", description: "Bottleneck or scaling constraint" },
9453
9587
  automation_level: { type: "string", enum: ["manual", "assisted", "automated"], description: "How much runs without human intervention" }
@@ -9458,13 +9592,14 @@ var UPG_PROPERTY_SCHEMA = {
9458
9592
  criticality: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Criticality to the business model" },
9459
9593
  owner: { type: "string", description: "Accountable person or team" },
9460
9594
  scarcity_risk: {
9461
- type: "object",
9595
+ type: "assessment",
9596
+ scale_id: "severity_5",
9462
9597
  description: "Replacement difficulty",
9463
9598
  properties: {
9464
9599
  value: { type: "number", description: "The numeric value, used for computation." },
9465
9600
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9466
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9467
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9601
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9602
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9468
9603
  },
9469
9604
  required: ["value", "label"]
9470
9605
  },
@@ -9498,7 +9633,6 @@ var UPG_PROPERTY_SCHEMA = {
9498
9633
  // LearningProperties: Result of an experiment. Evidence that updates a hypothesis.
9499
9634
  learning: {
9500
9635
  result: { type: "string", description: "Summary" },
9501
- metric: { type: "string", description: 'Observed metric. @deprecated since="0.4.0" removeIn="0.5.0". Use the canonical edge `learning_observed_on_metric` to link to the metric structurally. Free-text was the wrong shape: a metric is a queryable graph entity.' },
9502
9636
  result_value: { type: "number", description: "Measured value of the result" },
9503
9637
  result_unit: { type: "string", description: 'Unit (e.g. "%" or "ms")' },
9504
9638
  result_direction: { type: "string", enum: ["supports", "refutes", "neutral"], description: "Direction relative to the parent hypothesis. Canonical direction axis. BREAKING in v0.4.0: legacy `'positive'`, `'negative'`, `'neutral'` are replaced by `'supports'`, `'refutes'`, `'neutral'` to align with `Evidence.direction` and `HypothesisEvidence.direction`. Migration: `positive \u2192 supports`, `negative \u2192 refutes`, `neutral \u2192 neutral`." },
@@ -9554,25 +9688,27 @@ var UPG_PROPERTY_SCHEMA = {
9554
9688
  // MarketTrendProperties: Market trend.
9555
9689
  market_trend: {
9556
9690
  relevance: {
9557
- type: "object",
9691
+ type: "assessment",
9692
+ scale_id: "importance_5",
9558
9693
  description: "Relevance to our product (1 = low, 5 = critical).",
9559
9694
  properties: {
9560
9695
  value: { type: "number", description: "The numeric value, used for computation." },
9561
9696
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9562
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9563
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9697
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9698
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9564
9699
  },
9565
9700
  required: ["value", "label"]
9566
9701
  },
9567
9702
  timeframe: { type: "string", description: 'Expected peak or mainstream window. @example "12-18 months", "2027"' },
9568
9703
  impact: {
9569
- type: "object",
9704
+ type: "assessment",
9705
+ scale_id: "impact_5",
9570
9706
  description: "Expected impact on our market or category.",
9571
9707
  properties: {
9572
9708
  value: { type: "number", description: "The numeric value, used for computation." },
9573
9709
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9574
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9575
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9710
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9711
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9576
9712
  },
9577
9713
  required: ["value", "label"]
9578
9714
  },
@@ -9683,35 +9819,38 @@ var UPG_PROPERTY_SCHEMA = {
9683
9819
  valence: { type: "string", enum: ["pain", "gap", "constraint"], description: "What kind of experience: pain (friction), gap (unmet), constraint (limitation)" },
9684
9820
  maturity: { type: "string", enum: ["raw", "validated", "prioritized"], description: "How mature is this need in our understanding" },
9685
9821
  frequency: {
9686
- type: "object",
9822
+ type: "assessment",
9823
+ scale_id: "frequency_5",
9687
9824
  description: "How often the user encounters this need (1 = rarely, 5 = constantly)",
9688
9825
  properties: {
9689
9826
  value: { type: "number", description: "The numeric value, used for computation." },
9690
9827
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9691
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9692
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9828
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9829
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9693
9830
  },
9694
9831
  required: ["value", "label"]
9695
9832
  },
9696
9833
  severity: {
9697
- type: "object",
9834
+ type: "assessment",
9835
+ scale_id: "severity_5",
9698
9836
  description: "How painful or disruptive the need is when unaddressed (1 = minor, 5 = critical)",
9699
9837
  properties: {
9700
9838
  value: { type: "number", description: "The numeric value, used for computation." },
9701
9839
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9702
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9703
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9840
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9841
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9704
9842
  },
9705
9843
  required: ["value", "label"]
9706
9844
  },
9707
9845
  importance: {
9708
- type: "object",
9846
+ type: "assessment",
9847
+ scale_id: "importance_5",
9709
9848
  description: "How important resolving this need is to the user (1 = low, 5 = critical)",
9710
9849
  properties: {
9711
9850
  value: { type: "number", description: "The numeric value, used for computation." },
9712
9851
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9713
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9714
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9852
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9853
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9715
9854
  },
9716
9855
  required: ["value", "label"]
9717
9856
  },
@@ -9732,13 +9871,14 @@ var UPG_PROPERTY_SCHEMA = {
9732
9871
  statement: { type: "string", description: "The objection as stated by the source" },
9733
9872
  source_type: { type: "string", enum: ["prospect", "competitor", "internal", "market"], description: "Where this objection originated" },
9734
9873
  severity: {
9735
- type: "object",
9874
+ type: "assessment",
9875
+ scale_id: "severity_5",
9736
9876
  description: "How frequently or strongly this objection comes up (1-5)",
9737
9877
  properties: {
9738
9878
  value: { type: "number", description: "The numeric value, used for computation." },
9739
9879
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9740
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9741
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9880
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9881
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9742
9882
  },
9743
9883
  required: ["value", "label"]
9744
9884
  },
@@ -9757,7 +9897,7 @@ var UPG_PROPERTY_SCHEMA = {
9757
9897
  session_ref: { type: "string", description: "Capturing session reference. Convenience field; the canonical relationship to study/session is an edge per P14. Retained as a lightweight context anchor for AI inference." },
9758
9898
  is_highlighted: { type: "boolean", description: "Flagged as a highlight. Absorbed from the deprecated Highlight entity." },
9759
9899
  highlight_tag: { type: "string", description: 'Free-form highlight type tag. @example "pain", "delight", "behaviour", "moment of clarity"' },
9760
- sentiment: { type: "string", enum: ["positive", "negative", "neutral", "mixed"], description: "Structured sentiment. Tools like Dovetail and EnjoyHQ converge on these four values. More precise than `highlight_tag` for aggregation." }
9900
+ sentiment: { type: "string", enum: ["positive", "neutral", "negative", "mixed"], description: "Structured sentiment. Tools like Dovetail and EnjoyHQ converge on these four values. More precise than `highlight_tag` for aggregation." }
9761
9901
  },
9762
9902
  // OnCallRotationProperties: On-call rotation.
9763
9903
  on_call_rotation: {
@@ -9769,35 +9909,38 @@ var UPG_PROPERTY_SCHEMA = {
9769
9909
  // OpportunityProperties: A problem worth solving, grounded in user need and business value
9770
9910
  opportunity: {
9771
9911
  reach: {
9772
- type: "object",
9912
+ type: "assessment",
9913
+ scale_id: "reach_5",
9773
9914
  description: "How many users experience this problem",
9774
9915
  properties: {
9775
9916
  value: { type: "number", description: "The numeric value, used for computation." },
9776
9917
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9777
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9778
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9918
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9919
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9779
9920
  },
9780
9921
  required: ["value", "label"]
9781
9922
  },
9782
9923
  frequency: {
9783
- type: "object",
9924
+ type: "assessment",
9925
+ scale_id: "frequency_5",
9784
9926
  description: "How often users experience this problem",
9785
9927
  properties: {
9786
9928
  value: { type: "number", description: "The numeric value, used for computation." },
9787
9929
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9788
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9789
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9930
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9931
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9790
9932
  },
9791
9933
  required: ["value", "label"]
9792
9934
  },
9793
9935
  pain: {
9794
- type: "object",
9936
+ type: "assessment",
9937
+ scale_id: "pain_5",
9795
9938
  description: "How painful it is when unaddressed",
9796
9939
  properties: {
9797
9940
  value: { type: "number", description: "The numeric value, used for computation." },
9798
9941
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9799
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9800
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9942
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9943
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9801
9944
  },
9802
9945
  required: ["value", "label"]
9803
9946
  },
@@ -9818,17 +9961,18 @@ var UPG_PROPERTY_SCHEMA = {
9818
9961
  current_state: { type: "string", description: "Baseline or latest read" },
9819
9962
  evidence_summary: { type: "string", description: "Evidence gathered so far (quotes, metrics, studies)" },
9820
9963
  confidence: {
9821
- type: "object",
9964
+ type: "assessment",
9965
+ scale_id: "confidence_5",
9822
9966
  description: "Confidence this is the right outcome to pursue",
9823
9967
  properties: {
9824
9968
  value: { type: "number", description: "The numeric value, used for computation." },
9825
9969
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9826
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9827
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9970
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9971
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9828
9972
  },
9829
9973
  required: ["value", "label"]
9830
9974
  },
9831
- outcome_status: { type: "string", description: "Current lifecycle phase. Free-form until an outcome lifecycle is defined in `grammar/lifecycles.ts`." }
9975
+ 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`." }
9832
9976
  },
9833
9977
  // ParticipantProperties: Research participant.
9834
9978
  participant: {
@@ -9859,13 +10003,14 @@ var UPG_PROPERTY_SCHEMA = {
9859
10003
  value_exchange: { type: "string", description: "What each party gives and receives" },
9860
10004
  partnership_tier: { type: "string", enum: ["strategic", "preferred", "standard", "trial"], description: "Commercial significance. Drives attention and exec sponsorship." },
9861
10005
  risk_level: {
9862
- type: "object",
10006
+ type: "assessment",
10007
+ scale_id: "severity_5",
9863
10008
  description: "Exposure if the partnership fails (concentration risk, IP risk, etc.)",
9864
10009
  properties: {
9865
10010
  value: { type: "number", description: "The numeric value, used for computation." },
9866
10011
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9867
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9868
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10012
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10013
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9869
10014
  },
9870
10015
  required: ["value", "label"]
9871
10016
  },
@@ -9906,7 +10051,7 @@ var UPG_PROPERTY_SCHEMA = {
9906
10051
  },
9907
10052
  // PipelineSalesProperties: Sales pipeline.
9908
10053
  pipeline_sales: {
9909
- pipeline_type: { type: "string", description: 'Classification of the pipeline (e.g. "new business", "expansion")' },
10054
+ pipeline_type: { type: "string", enum: ["new_business", "expansion", "renewal", "partner", "other"], description: "Classification of the pipeline (UPG-579 Option B)." },
9910
10055
  avg_cycle_days: { type: "number", description: "Average days from opportunity creation to close" }
9911
10056
  },
9912
10057
  // PipelineStageProperties: Pipeline stage.
@@ -9948,7 +10093,7 @@ var UPG_PROPERTY_SCHEMA = {
9948
10093
  // PricingStrategyProperties: Pricing strategy.
9949
10094
  pricing_strategy: {
9950
10095
  strategy_type: { type: "string", enum: ["value_based", "cost_plus", "competitor_based", "penetration", "freemium"], description: "Pricing methodology used" },
9951
- review_cadence: { type: "string", description: "How often pricing is reviewed" },
10096
+ review_cadence: { type: "string", enum: ["continuous", "hourly", "daily", "weekly", "monthly", "quarterly", "yearly", "on_demand", "other"], description: "How often pricing is reviewed. Uses the shared `Cadence` scale." },
9952
10097
  last_change: { type: "string", description: "Date of the last pricing change (ISO format)" }
9953
10098
  },
9954
10099
  // PricingTierProperties: PricingTier: the central pricing concept (the plan a customer buys).
@@ -10057,13 +10202,14 @@ var UPG_PROPERTY_SCHEMA = {
10057
10202
  rebuttal: {
10058
10203
  statement: { type: "string", description: "The counter-argument or response to an objection" },
10059
10204
  strength: {
10060
- type: "object",
10205
+ type: "assessment",
10206
+ scale_id: "scale_5",
10061
10207
  description: "How convincing this rebuttal is (1-5)",
10062
10208
  properties: {
10063
10209
  value: { type: "number", description: "The numeric value, used for computation." },
10064
10210
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10065
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10066
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10211
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10212
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10067
10213
  },
10068
10214
  required: ["value", "label"]
10069
10215
  },
@@ -10156,24 +10302,26 @@ var UPG_PROPERTY_SCHEMA = {
10156
10302
  risk: {
10157
10303
  risk_type: { type: "string", enum: ["technical", "business", "legal", "security", "operational"], description: "Domain the risk belongs to" },
10158
10304
  probability: {
10159
- type: "object",
10305
+ type: "assessment",
10306
+ scale_id: "confidence_5",
10160
10307
  description: "How likely this risk is to materialise (1 = unlikely, 5 = near certain)",
10161
10308
  properties: {
10162
10309
  value: { type: "number", description: "The numeric value, used for computation." },
10163
10310
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10164
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10165
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10311
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10312
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10166
10313
  },
10167
10314
  required: ["value", "label"]
10168
10315
  },
10169
10316
  impact: {
10170
- type: "object",
10317
+ type: "assessment",
10318
+ scale_id: "impact_5",
10171
10319
  description: "Severity of consequences if the risk materialises (1 = negligible, 5 = catastrophic)",
10172
10320
  properties: {
10173
10321
  value: { type: "number", description: "The numeric value, used for computation." },
10174
10322
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10175
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10176
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10323
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10324
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10177
10325
  },
10178
10326
  required: ["value", "label"]
10179
10327
  },
@@ -10194,7 +10342,18 @@ var UPG_PROPERTY_SCHEMA = {
10194
10342
  quarter: { type: "string", description: 'Planning quarter (e.g. "Q2 2026"). Pair with `start_date`/`target_date` for precise scheduling.' },
10195
10343
  priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Importance against other items" },
10196
10344
  item_status: { type: "string", enum: ["planned", "in_progress", "shipped", "deferred"], description: "Status. `deferred` = explicitly pushed to a later period." },
10197
- confidence: { type: "string", enum: ["high", "medium", "low"], description: "Delivery confidence within the planned period." },
10345
+ confidence: {
10346
+ type: "assessment",
10347
+ scale_id: "confidence_5",
10348
+ description: "Delivery confidence within the planned period (UPGAssessment on `confidence_5`).",
10349
+ properties: {
10350
+ value: { type: "number", description: "The numeric value, used for computation." },
10351
+ label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10352
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10353
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10354
+ },
10355
+ required: ["value", "label"]
10356
+ },
10198
10357
  start_date: { type: "string", description: "ISO date work begins. More precise than `quarter` for continuous planning." },
10199
10358
  target_date: { type: "string", description: "ISO date completion is expected. For shipped items, the actual completion date." }
10200
10359
  },
@@ -10208,13 +10367,14 @@ var UPG_PROPERTY_SCHEMA = {
10208
10367
  // RootCauseProperties: Underlying architectural or systemic issue.
10209
10368
  root_cause: {
10210
10369
  severity: {
10211
- type: "object",
10370
+ type: "assessment",
10371
+ scale_id: "severity_5",
10212
10372
  description: "Severity (1 = minor, 5 = critical)",
10213
10373
  properties: {
10214
10374
  value: { type: "number", description: "The numeric value, used for computation." },
10215
10375
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10216
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10217
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10376
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10377
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10218
10378
  },
10219
10379
  required: ["value", "label"]
10220
10380
  },
@@ -10264,13 +10424,14 @@ var UPG_PROPERTY_SCHEMA = {
10264
10424
  security_control: {
10265
10425
  control_type: { type: "string", enum: ["preventive", "detective", "corrective", "compensating"], description: "Functional role. `preventive` = stops attacks (MFA, input validation). `detective` = identifies attacks in progress (intrusion detection, audit logs). `corrective` = reduces impact after an attack (incident response, backup restore). `compensating` = alternative when primary isn't feasible." },
10266
10426
  effectiveness: {
10267
- type: "object",
10427
+ type: "assessment",
10428
+ scale_id: "impact_5",
10268
10429
  description: "Mitigation effectiveness (1 = minimal, 5 = fully effective)",
10269
10430
  properties: {
10270
10431
  value: { type: "number", description: "The numeric value, used for computation." },
10271
10432
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10272
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10273
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10433
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10434
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10274
10435
  },
10275
10436
  required: ["value", "label"]
10276
10437
  },
@@ -10281,7 +10442,7 @@ var UPG_PROPERTY_SCHEMA = {
10281
10442
  // SecurityPolicyProperties: Security policy.
10282
10443
  security_policy: {
10283
10444
  scope: { type: "string", description: "Systems or processes covered" },
10284
- review_cadence: { type: "string", description: 'Review cadence (e.g. "annually", "quarterly")' },
10445
+ review_cadence: { type: "string", enum: ["continuous", "hourly", "daily", "weekly", "monthly", "quarterly", "yearly", "on_demand", "other"], description: "Review cadence (e.g. `yearly`, `quarterly`). Uses the shared `Cadence` scale." },
10285
10446
  version: { type: "string", description: "Version" },
10286
10447
  effective_date: { type: "string", description: "ISO effective date" },
10287
10448
  url: { type: "string", description: "Policy document URL" },
@@ -10352,17 +10513,18 @@ var UPG_PROPERTY_SCHEMA = {
10352
10513
  },
10353
10514
  // SkillProperties: Skill entity.
10354
10515
  skill: {
10355
- skill_category: { type: "string", description: 'Category of the skill (e.g. "technical", "leadership", "design")' },
10516
+ skill_category: { type: "string", enum: ["technical", "leadership", "design", "product", "business", "operations", "other"], description: "Category of the skill (UPG-579 Option B)." },
10356
10517
  proficiency_levels: { type: "string[]", description: "Description of proficiency levels for this skill" },
10357
10518
  domain: { type: "string", description: 'Problem domain the skill applies to (e.g. "payments", "accessibility")' },
10358
10519
  rarity: {
10359
- type: "object",
10520
+ type: "assessment",
10521
+ scale_id: "scale_5",
10360
10522
  description: "How scarce this skill is in the labour market this team hires from",
10361
10523
  properties: {
10362
10524
  value: { type: "number", description: "The numeric value, used for computation." },
10363
10525
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10364
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10365
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10526
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10527
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10366
10528
  },
10367
10529
  required: ["value", "label"]
10368
10530
  },
@@ -10378,46 +10540,50 @@ var UPG_PROPERTY_SCHEMA = {
10378
10540
  solution: {
10379
10541
  timeline: { type: "string", description: "Estimated delivery or target timeline" },
10380
10542
  reach: {
10381
- type: "object",
10543
+ type: "assessment",
10544
+ scale_id: "reach_5",
10382
10545
  description: "How many users this solution reaches (1 = few, 5 = most)",
10383
10546
  properties: {
10384
10547
  value: { type: "number", description: "The numeric value, used for computation." },
10385
10548
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10386
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10387
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10549
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10550
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10388
10551
  },
10389
10552
  required: ["value", "label"]
10390
10553
  },
10391
10554
  impact: {
10392
- type: "object",
10555
+ type: "assessment",
10556
+ scale_id: "impact_5",
10393
10557
  description: "Expected impact on the target outcome (1 = minimal, 5 = transformative)",
10394
10558
  properties: {
10395
10559
  value: { type: "number", description: "The numeric value, used for computation." },
10396
10560
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10397
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10398
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10561
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10562
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10399
10563
  },
10400
10564
  required: ["value", "label"]
10401
10565
  },
10402
10566
  confidence: {
10403
- type: "object",
10567
+ type: "assessment",
10568
+ scale_id: "confidence_5",
10404
10569
  description: "How confident the team is in this solution (1 = speculative, 5 = proven)",
10405
10570
  properties: {
10406
10571
  value: { type: "number", description: "The numeric value, used for computation." },
10407
10572
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10408
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10409
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10573
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10574
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10410
10575
  },
10411
10576
  required: ["value", "label"]
10412
10577
  },
10413
10578
  effort: {
10414
- type: "object",
10579
+ type: "assessment",
10580
+ scale_id: "effort_5",
10415
10581
  description: "Level of effort required to implement (1 = trivial, 5 = very large)",
10416
10582
  properties: {
10417
10583
  value: { type: "number", description: "The numeric value, used for computation." },
10418
10584
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10419
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10420
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10585
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10586
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10421
10587
  },
10422
10588
  required: ["value", "label"]
10423
10589
  },
@@ -10427,24 +10593,26 @@ var UPG_PROPERTY_SCHEMA = {
10427
10593
  stakeholder: {
10428
10594
  stakeholder_type: { type: "string", enum: ["internal", "external", "investor", "regulator"], description: "Relationship of the stakeholder to the organisation" },
10429
10595
  influence: {
10430
- type: "object",
10596
+ type: "assessment",
10597
+ scale_id: "importance_5",
10431
10598
  description: "How much influence this stakeholder has over decisions (1 = minimal, 5 = decisive)",
10432
10599
  properties: {
10433
10600
  value: { type: "number", description: "The numeric value, used for computation." },
10434
10601
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10435
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10436
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10602
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10603
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10437
10604
  },
10438
10605
  required: ["value", "label"]
10439
10606
  },
10440
10607
  interest: {
10441
- type: "object",
10608
+ type: "assessment",
10609
+ scale_id: "importance_5",
10442
10610
  description: "How much interest this stakeholder has in the outcome (1 = passive, 5 = deeply invested)",
10443
10611
  properties: {
10444
10612
  value: { type: "number", description: "The numeric value, used for computation." },
10445
10613
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10446
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10447
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10614
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10615
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10448
10616
  },
10449
10617
  required: ["value", "label"]
10450
10618
  }
@@ -10456,19 +10624,6 @@ var UPG_PROPERTY_SCHEMA = {
10456
10624
  risks_flagged: { type: "number", description: "Number of risks flagged in this report" },
10457
10625
  blockers: { type: "string", description: "Description of current blockers" }
10458
10626
  },
10459
- // UserStoryProperties: "As X, I want Y so Z" templated promise, a user story (UCS pattern P5).
10460
- user_story: {
10461
- as_a: { type: "string", description: '"As a [persona], \u2026". Free-text persona name or slug ref.' },
10462
- i_want_to: { type: "string", description: "Capability or action the persona wants." },
10463
- so_that: { type: "string", description: "Benefit or outcome the persona expects." },
10464
- text: { type: "string", description: "Free-form story text. Used as a single-line rendered view." }
10465
- },
10466
- // StoryTaskProperties
10467
- story_task: {
10468
- estimate: { type: "string", description: "@deprecated Use TaskProperties.estimate" },
10469
- effort: { type: "number", description: "@deprecated Use TaskProperties.effort (string form)" },
10470
- priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "@deprecated Use TaskProperties.priority" }
10471
- },
10472
10627
  // StrategicPillarProperties: StrategicPillar entity. Durable multi-year direction the product commits to.
10473
10628
  strategic_pillar: {
10474
10629
  owner: { type: "string", description: "Owning person or team" },
@@ -10502,19 +10657,20 @@ var UPG_PROPERTY_SCHEMA = {
10502
10657
  support_ticket: {
10503
10658
  ticket_type: { type: "string", enum: ["bug", "question", "feature_request"], description: "Classification of the ticket" },
10504
10659
  severity: {
10505
- type: "object",
10660
+ type: "assessment",
10661
+ scale_id: "severity_5",
10506
10662
  description: "Impact severity of the issue (1 = cosmetic, 5 = service down)",
10507
10663
  properties: {
10508
10664
  value: { type: "number", description: "The numeric value, used for computation." },
10509
10665
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10510
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10511
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10666
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10667
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10512
10668
  },
10513
10669
  required: ["value", "label"]
10514
10670
  },
10515
10671
  resolution: { type: "string", description: "Description of how the ticket was resolved" },
10516
10672
  source: { type: "string", description: 'Where the ticket originated (e.g. "email", "in-app", "chat")' },
10517
- signal_sentiment: { type: "string", enum: ["positive", "negative", "neutral", "mixed"], description: "Detected sentiment of the customer's message" },
10673
+ signal_sentiment: { type: "string", enum: ["positive", "neutral", "negative", "mixed"], description: "Detected sentiment of the customer's message" },
10518
10674
  signal_channel: { type: "string", description: "Channel through which the signal was received" },
10519
10675
  signal_urgency: { type: "string", enum: ["low", "medium", "high", "critical"], description: "Perceived urgency of the customer's request" }
10520
10676
  },
@@ -10535,19 +10691,20 @@ var UPG_PROPERTY_SCHEMA = {
10535
10691
  symptom_description: { type: "string", description: "Plain-language description of observed behaviour. Primary content of the entity." },
10536
10692
  first_observed_at: { type: "string", description: "ISO timestamp first observed in the wild. Pairs with `frequency_rating` and `reproducibility` for triage." },
10537
10693
  severity: {
10538
- type: "object",
10694
+ type: "assessment",
10695
+ scale_id: "severity_5",
10539
10696
  description: "Severity for affected users. Independent of how widespread the symptom is. Canonicalised in v0.4.0: the ad-hoc `'low' | 'medium' | 'high' | 'critical'` shape was replaced by `UPGAssessment`.",
10540
10697
  properties: {
10541
10698
  value: { type: "number", description: "The numeric value, used for computation." },
10542
10699
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10543
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10544
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10700
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10701
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10545
10702
  },
10546
10703
  required: ["value", "label"]
10547
10704
  },
10548
10705
  frequency_count: { type: "number", description: "Exact observation count in the period. Pairs with `frequency_period` for a precise rate." },
10549
10706
  frequency_period: { type: "string", description: "Recurrence period (ISO-8601 `Duration`). @example 'P7D' (per week), 'P1D' (per day), 'PT1H' (per hour)" },
10550
- frequency_rating: { type: "string", enum: ["rare", "occasional", "regular", "constant", "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`." },
10707
+ 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`." },
10551
10708
  affected_users_estimate: { type: "number", description: "Approximate count of users affected. Snapshot estimate." },
10552
10709
  reproducibility: { type: "string", enum: ["always", "frequent", "intermittent", "rare", "once"], description: "Reproduction reliability" },
10553
10710
  steps_to_reproduce: { type: "string", description: "Steps to reproduce" }
@@ -10560,7 +10717,6 @@ var UPG_PROPERTY_SCHEMA = {
10560
10717
  },
10561
10718
  // TaskProperties: Task: a discrete unit of work, smaller than a story.
10562
10719
  task: {
10563
- task_status: { type: "string", enum: ["todo", "in_progress", "in_review", "done"], description: "@deprecated since v0.4.0. Use top-level `UPGBaseNode.status`. Values map identically: todo | in_progress | in_review | done. Migration: `UPG_PROPERTY_MIGRATIONS['0.4.0']` lifts this to `status`." },
10564
10720
  assignee: { type: "string", description: "Assigned person" },
10565
10721
  effort: { type: "string", description: 'Effort estimate (e.g. "2h", "1d", "3 points"). Use a consistent unit within your team.' },
10566
10722
  priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Relative importance against other tasks" },
@@ -10585,24 +10741,26 @@ var UPG_PROPERTY_SCHEMA = {
10585
10741
  technical_debt_item: {
10586
10742
  debt_type: { type: "string", enum: ["code", "architecture", "security", "test", "docs", "dependency"], description: "Type of debt. `code` = quality issues. `architecture` = structural problems. `security` = unpatched vulnerabilities. `test` = missing/flaky tests. `docs` = missing or stale documentation. `dependency` = outdated packages." },
10587
10743
  severity: {
10588
- type: "object",
10744
+ type: "assessment",
10745
+ scale_id: "severity_5",
10589
10746
  description: "Severity on system or team. Requires human evaluation.",
10590
10747
  properties: {
10591
10748
  value: { type: "number", description: "The numeric value, used for computation." },
10592
10749
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10593
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10594
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10750
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10751
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10595
10752
  },
10596
10753
  required: ["value", "label"]
10597
10754
  },
10598
10755
  effort_to_fix: {
10599
- type: "object",
10756
+ type: "assessment",
10757
+ scale_id: "effort_5",
10600
10758
  description: "Estimated effort to resolve. Requires team knowledge of the codebase.",
10601
10759
  properties: {
10602
10760
  value: { type: "number", description: "The numeric value, used for computation." },
10603
10761
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10604
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10605
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10762
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10763
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10606
10764
  },
10607
10765
  required: ["value", "label"]
10608
10766
  },
@@ -10685,24 +10843,26 @@ var UPG_PROPERTY_SCHEMA = {
10685
10843
  threat: {
10686
10844
  category: { type: "string", description: 'Attack or threat scenario. @example "injection", "misconfiguration", "social engineering", "supply chain"' },
10687
10845
  likelihood: {
10688
- type: "object",
10846
+ type: "assessment",
10847
+ scale_id: "confidence_5",
10689
10848
  description: "Likelihood (1 = theoretical, 5 = actively exploited). @example value 5 for a known, exploitable, commonly targeted pattern",
10690
10849
  properties: {
10691
10850
  value: { type: "number", description: "The numeric value, used for computation." },
10692
10851
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10693
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10694
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10852
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10853
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10695
10854
  },
10696
10855
  required: ["value", "label"]
10697
10856
  },
10698
10857
  impact: {
10699
- type: "object",
10858
+ type: "assessment",
10859
+ scale_id: "impact_5",
10700
10860
  description: "Impact (1 = minimal, 5 = catastrophic). @example value 5 for threats that expose PII or cause complete service compromise",
10701
10861
  properties: {
10702
10862
  value: { type: "number", description: "The numeric value, used for computation." },
10703
10863
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10704
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10705
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10864
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10865
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10706
10866
  },
10707
10867
  required: ["value", "label"]
10708
10868
  },
@@ -10760,7 +10920,7 @@ var UPG_PROPERTY_SCHEMA = {
10760
10920
  // UserAdvisoryBoardProperties: User advisory board.
10761
10921
  user_advisory_board: {
10762
10922
  member_count: { type: "number", description: "Number of members on the board" },
10763
- meeting_cadence: { type: "string", description: 'How often the board meets (e.g. "monthly", "quarterly")' },
10923
+ 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." },
10764
10924
  board_focus: { type: "string", description: "Primary topic or area the board advises on" }
10765
10925
  },
10766
10926
  // UserFlowProperties: User flow.
@@ -10776,6 +10936,13 @@ var UPG_PROPERTY_SCHEMA = {
10776
10936
  journey_type: { type: "string", enum: ["current_state", "future_state", "day_in_the_life", "service_blueprint"], description: "Maps current or future state" },
10777
10937
  scenario: { type: "string", description: "Scenario context" }
10778
10938
  },
10939
+ // UserStoryProperties: "As X, I want Y so Z" templated promise on a user story (UCS pattern P5).
10940
+ user_story: {
10941
+ as_a: { type: "string", description: '"As a [persona], \u2026". Free-text persona name or slug ref.' },
10942
+ i_want_to: { type: "string", description: "Capability or action the persona wants." },
10943
+ so_that: { type: "string", description: "Benefit or outcome the persona expects." },
10944
+ text: { type: "string", description: "Free-form story text. Used as a single-line rendered view." }
10945
+ },
10779
10946
  // ValueObjectProperties: DDD value object.
10780
10947
  value_object: {
10781
10948
  immutable: { type: "boolean", description: "Whether immutable" },
@@ -10790,7 +10957,7 @@ var UPG_PROPERTY_SCHEMA = {
10790
10957
  },
10791
10958
  // ValueStreamProperties: ValueStream entity.
10792
10959
  value_stream: {
10793
- stream_stage: { type: "string", description: "Current stage in the value delivery pipeline" },
10960
+ stream_stage: { type: "string", enum: ["discovery", "definition", "build", "delivery", "operation", "other"], description: "Current stage in the value delivery pipeline (UPG-579 Option B)." },
10794
10961
  lead_time: { type: "string", description: 'End-to-end lead time. @example "2 weeks"' },
10795
10962
  throughput: { type: "string", description: 'Throughput measure. @example "5 features/sprint"' }
10796
10963
  },
@@ -10810,7 +10977,18 @@ var UPG_PROPERTY_SCHEMA = {
10810
10977
  vulnerability: {
10811
10978
  cve_id: { type: "string", description: 'CVE identifier from the National Vulnerability Database. @example "CVE-2024-1234"' },
10812
10979
  cvss_score: { type: "number", description: "CVSS numeric score (0.0\u201310.0). Computed from the CVSS vector. Distinct from the categorical `severity`. @example 9.8 (critical), 6.5 (medium), 3.7 (low)" },
10813
- severity: { type: "string", enum: ["critical", "high", "medium", "low", "informational"], description: 'Categorical severity derived from CVSS. `critical` = 9.0\u201310.0. `high` = 7.0\u20138.9. `medium` = 4.0\u20136.9. `low` = 0.1\u20133.9. `informational` = 0.0. Score alone is insufficient for triage; severity drives filtering and prioritisation. @example "critical" for a remotely exploitable, no-auth-required vulnerability' },
10980
+ severity: {
10981
+ type: "assessment",
10982
+ scale_id: "severity_5",
10983
+ description: "Categorical severity derived from CVSS. Impact severity (UPGAssessment on the `severity_5` scale). Score alone is insufficient for triage; severity drives filtering and prioritisation. Migrated from the inline `critical|high|medium|low|informational` enum (UPG-579 Option C): map `critical` -> 5, `high` -> 4, `medium` -> 3, `low` -> 2, `informational` -> 1; carry the old word in `label`. @example value 5, label 'Critical', scale_id 'severity_5' (a remotely exploitable, no-auth vuln)",
10984
+ properties: {
10985
+ value: { type: "number", description: "The numeric value, used for computation." },
10986
+ label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10987
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10988
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10989
+ },
10990
+ required: ["value", "label"]
10991
+ },
10814
10992
  cvss_version: { type: "string", enum: ["v3.1", "v4.0"], description: 'CVSS scoring version. v3.1 and v4.0 differ significantly for the same vulnerability. @example "v4.0" for vulnerabilities scored after the v4.0 release in 2023' },
10815
10993
  affected_component: { type: "string", description: 'Affected component, library, or system. @example "lodash", "openssl", "login service"' },
10816
10994
  affected_package: { type: "string", description: 'Affected package with version. More precise than `affected_component`. @example "lodash@4.17.20", "openssl@1.1.1q"' },
@@ -15428,17 +15606,6 @@ function seqStep(order, phase, entity_types, prompt_hint, options) {
15428
15606
  ...options?.next_sequence_on_gap ? { next_sequence_on_gap: options.next_sequence_on_gap } : {}
15429
15607
  };
15430
15608
  }
15431
- function domainGuideStep(domain_id, phase, name, prompt_hint, options) {
15432
- return {
15433
- kind: "domain_guide",
15434
- order: 1,
15435
- phase,
15436
- name,
15437
- prompt_hint,
15438
- domain_id,
15439
- ...options?.next_sequence_on_gap ? { next_sequence_on_gap: options.next_sequence_on_gap } : {}
15440
- };
15441
- }
15442
15609
  var STRATEGY_OUTCOMES_PLAYBOOK = {
15443
15610
  id: "playbook:strategy-outcomes",
15444
15611
  name: "Strategy & Outcomes",
@@ -15446,6 +15613,7 @@ var STRATEGY_OUTCOMES_PLAYBOOK = {
15446
15613
  description: "Cascade vision through themes, outcomes, objectives, key results, and the bets you are making to get there.",
15447
15614
  region: "strategy_outcomes",
15448
15615
  is_canonical: true,
15616
+ related_framework_ids: ["okr-framework", "three-horizons", "north-star-metric", "metrics-tree", "wardley-map"],
15449
15617
  target_anchor_entity: "objective",
15450
15618
  creation_sequence: [
15451
15619
  seqStep(
@@ -15489,7 +15657,7 @@ var STRATEGY_OUTCOMES_PLAYBOOK = {
15489
15657
  "Assumptions & Decisions",
15490
15658
  ["assumption", "decision"],
15491
15659
  "Capture the bets you are making (assumptions) and the choices you have ratified (decisions). These guard the work against silent drift.",
15492
- { next_sequence_on_gap: "playbook:discovery-validation-hypothesis-cycle" }
15660
+ { next_sequence_on_gap: "playbook:discovery-research-validation" }
15493
15661
  )
15494
15662
  ]
15495
15663
  };
@@ -15500,6 +15668,7 @@ var USERS_NEEDS_PLAYBOOK = {
15500
15668
  description: "Bootstrap personas, jobs, needs, and desired outcomes: the user side of every product graph.",
15501
15669
  region: "users_needs",
15502
15670
  is_canonical: true,
15671
+ related_framework_ids: ["persona-canvas", "empathy-map", "value-proposition-canvas", "kano-model"],
15503
15672
  target_anchor_entity: "persona",
15504
15673
  creation_sequence: [
15505
15674
  seqStep(
@@ -15553,6 +15722,7 @@ var DISCOVERY_RESEARCH_VALIDATION_PLAYBOOK = {
15553
15722
  description: "Evidence-first discovery sequence: plan \u2192 recruit \u2192 observe \u2192 synthesize \u2192 insight \u2192 opportunity \u2192 hypothesis \u2192 test.",
15554
15723
  region: "discovery_research_validation",
15555
15724
  is_canonical: true,
15725
+ related_framework_ids: ["double-diamond", "opportunity-solution-tree", "build-measure-learn", "hypothesis-board"],
15556
15726
  target_anchor_entity: "opportunity",
15557
15727
  creation_sequence: [
15558
15728
  seqStep(
@@ -15605,23 +15775,6 @@ var DISCOVERY_RESEARCH_VALIDATION_PLAYBOOK = {
15605
15775
  )
15606
15776
  ]
15607
15777
  };
15608
- var DISCOVERY_VALIDATION_HYPOTHESIS_PLAYBOOK = {
15609
- id: "playbook:discovery-validation-hypothesis-cycle",
15610
- name: "Hypothesis Validation",
15611
- version: "0.1.0",
15612
- description: "Tight hypothesis \u2192 experiment \u2192 evidence \u2192 learning loop. Run after research has surfaced an opportunity.",
15613
- region: "discovery_research_validation",
15614
- framework_id: "build-measure-learn",
15615
- target_anchor_entity: "hypothesis",
15616
- creation_sequence: [
15617
- domainGuideStep(
15618
- "validation",
15619
- "Validation",
15620
- "Frame & test",
15621
- "Run the validation creation sequence: hypothesis, experiment, evidence, learning."
15622
- )
15623
- ]
15624
- };
15625
15778
  var MARKET_COMPETITIVE_PLAYBOOK = {
15626
15779
  id: "playbook:market-competitive",
15627
15780
  name: "Market & Competitive",
@@ -15629,6 +15782,7 @@ var MARKET_COMPETITIVE_PLAYBOOK = {
15629
15782
  description: "Map the competitive landscape: define the market, name the alternatives, read trends, find moves.",
15630
15783
  region: "market_competitive",
15631
15784
  is_canonical: true,
15785
+ related_framework_ids: ["porter-five-forces", "swot-analysis", "value-chain-analysis", "wardley-map", "bullseye-framework"],
15632
15786
  target_anchor_entity: "competitor",
15633
15787
  creation_sequence: [
15634
15788
  seqStep(
@@ -15676,6 +15830,7 @@ var EXPERIENCE_DESIGN_BRAND_PLAYBOOK = {
15676
15830
  description: "Journey-first design sequence: research \u2192 personas \u2192 journeys \u2192 define \u2192 ideate \u2192 prototype \u2192 test \u2192 design system.",
15677
15831
  region: "experience_design_brand",
15678
15832
  is_canonical: true,
15833
+ related_framework_ids: ["double-diamond", "atomic-design", "story-map"],
15679
15834
  target_anchor_entity: "user_journey",
15680
15835
  creation_sequence: [
15681
15836
  seqStep(
@@ -15728,54 +15883,6 @@ var EXPERIENCE_DESIGN_BRAND_PLAYBOOK = {
15728
15883
  )
15729
15884
  ]
15730
15885
  };
15731
- var EXPERIENCE_UX_DOMAIN_ONLY_PLAYBOOK = {
15732
- id: "playbook:experience-ux-domain-only",
15733
- name: "UX Design (compact)",
15734
- version: "0.1.0",
15735
- description: "Compact UX-only path. Quick when research and design system are managed separately.",
15736
- region: "experience_design_brand",
15737
- target_anchor_entity: "user_journey",
15738
- creation_sequence: [
15739
- domainGuideStep(
15740
- "ux_design",
15741
- "UX",
15742
- "Journey to screen",
15743
- "Run the ux_design creation sequence: journey, steps, screens, flows, wireframes, prototypes."
15744
- )
15745
- ]
15746
- };
15747
- var EXPERIENCE_DESIGN_SYSTEM_PLAYBOOK = {
15748
- id: "playbook:experience-design-system",
15749
- name: "Design System",
15750
- version: "0.1.0",
15751
- description: "Codify the shared design language: tokens, components, patterns, guidelines.",
15752
- region: "experience_design_brand",
15753
- creation_sequence: [
15754
- domainGuideStep(
15755
- "design_system",
15756
- "Design System",
15757
- "System foundations",
15758
- "Run the design_system creation sequence: tokens, components, patterns, guidelines.",
15759
- { next_sequence_on_gap: "playbook:experience-ux-domain-only" }
15760
- )
15761
- ]
15762
- };
15763
- var EXPERIENCE_CONTENT_PLAYBOOK = {
15764
- id: "playbook:experience-content",
15765
- name: "Content Strategy",
15766
- version: "0.1.0",
15767
- description: "Plan what to publish: strategy, themes, calendar, individual pieces tied to audience and channels.",
15768
- region: "experience_design_brand",
15769
- creation_sequence: [
15770
- domainGuideStep(
15771
- "content",
15772
- "Content",
15773
- "Content plan",
15774
- "Run the content creation sequence: strategy, themes, calendar, pieces.",
15775
- { next_sequence_on_gap: "playbook:business-growth-funnel" }
15776
- )
15777
- ]
15778
- };
15779
15886
  var PRODUCT_DELIVERY_PLAYBOOK = {
15780
15887
  id: "playbook:product-delivery",
15781
15888
  name: "Product Delivery",
@@ -15783,6 +15890,7 @@ var PRODUCT_DELIVERY_PLAYBOOK = {
15783
15890
  description: "Shape what gets built: features, epics, user stories, releases, milestones, and the dependencies between them.",
15784
15891
  region: "product_delivery",
15785
15892
  is_canonical: true,
15893
+ related_framework_ids: ["story-map", "rice-scoring", "moscow", "now-next-later", "shape-up", "kano-model"],
15786
15894
  target_anchor_entity: "feature",
15787
15895
  creation_sequence: [
15788
15896
  seqStep(
@@ -15823,22 +15931,6 @@ var PRODUCT_DELIVERY_PLAYBOOK = {
15823
15931
  )
15824
15932
  ]
15825
15933
  };
15826
- var PRODUCT_FEEDBACK_SYNTHESIS_PLAYBOOK = {
15827
- id: "playbook:product-feedback-synthesis",
15828
- name: "Feedback Synthesis",
15829
- version: "0.1.0",
15830
- description: "Capture and cluster qualitative signal: feedback items, themes, NPS, support tickets.",
15831
- region: "product_delivery",
15832
- creation_sequence: [
15833
- domainGuideStep(
15834
- "feedback",
15835
- "Feedback",
15836
- "Signal capture",
15837
- "Run the feedback creation sequence: items, themes, NPS, support data.",
15838
- { next_sequence_on_gap: "playbook:discovery-validation-hypothesis-cycle" }
15839
- )
15840
- ]
15841
- };
15842
15934
  var ENGINEERING_PLATFORM_PLAYBOOK = {
15843
15935
  id: "playbook:engineering-platform",
15844
15936
  name: "Engineering & Platform",
@@ -15846,6 +15938,7 @@ var ENGINEERING_PLATFORM_PLAYBOOK = {
15846
15938
  description: "Architecture-first engineering sequence: architecture \u2192 services \u2192 data \u2192 build \u2192 test \u2192 deploy \u2192 monitor \u2192 security.",
15847
15939
  region: "engineering_platform",
15848
15940
  is_canonical: true,
15941
+ related_framework_ids: ["c4-model", "adr-log", "dora-metrics"],
15849
15942
  target_anchor_entity: "service",
15850
15943
  creation_sequence: [
15851
15944
  seqStep(
@@ -15898,21 +15991,6 @@ var ENGINEERING_PLATFORM_PLAYBOOK = {
15898
15991
  )
15899
15992
  ]
15900
15993
  };
15901
- var ENGINEERING_ARCHITECTURE_ONLY_PLAYBOOK = {
15902
- id: "playbook:engineering-architecture-only",
15903
- name: "Architecture (compact)",
15904
- version: "0.1.0",
15905
- description: "Compact architecture-only path. Quick when build/deploy/security are managed separately.",
15906
- region: "engineering_platform",
15907
- creation_sequence: [
15908
- domainGuideStep(
15909
- "engineering",
15910
- "Engineering",
15911
- "System shape",
15912
- "Run the engineering creation sequence: bounded contexts, services, data, decisions."
15913
- )
15914
- ]
15915
- };
15916
15994
  var BUSINESS_GTM_GROWTH_PLAYBOOK = {
15917
15995
  id: "playbook:business-gtm-growth",
15918
15996
  name: "Business, GTM & Growth",
@@ -15920,6 +15998,7 @@ var BUSINESS_GTM_GROWTH_PLAYBOOK = {
15920
15998
  description: "Viability-first business sequence: value prop \u2192 customer \u2192 revenue \u2192 costs \u2192 unit economics \u2192 GTM \u2192 competitive advantage.",
15921
15999
  region: "business_gtm_growth",
15922
16000
  is_canonical: true,
16001
+ related_framework_ids: ["business-model-canvas", "pirate-metrics-aarrr", "north-star-metric", "product-led-growth-framework", "marketing-mix-4ps"],
15923
16002
  target_anchor_entity: "value_proposition",
15924
16003
  creation_sequence: [
15925
16004
  seqStep(
@@ -15966,70 +16045,6 @@ var BUSINESS_GTM_GROWTH_PLAYBOOK = {
15966
16045
  )
15967
16046
  ]
15968
16047
  };
15969
- var BUSINESS_MODEL_BMC_PLAYBOOK = {
15970
- id: "playbook:business-model-bmc",
15971
- name: "Business Model (BMC)",
15972
- version: "0.1.0",
15973
- description: "Design the business model with Business Model Canvas: value props, customer segments, revenue streams, cost structure.",
15974
- region: "business_gtm_growth",
15975
- framework_id: "business-model-canvas",
15976
- creation_sequence: [
15977
- domainGuideStep(
15978
- "business_model",
15979
- "Business",
15980
- "Model canvas",
15981
- "Run the business_model creation sequence: value props, segments, revenue, costs.",
15982
- { next_sequence_on_gap: "playbook:business-pricing" }
15983
- )
15984
- ]
15985
- };
15986
- var BUSINESS_PRICING_PLAYBOOK = {
15987
- id: "playbook:business-pricing",
15988
- name: "Pricing",
15989
- version: "0.1.0",
15990
- description: "Design the revenue engine: pricing strategy, tiers, trials, paywalls, discounts.",
15991
- region: "business_gtm_growth",
15992
- creation_sequence: [
15993
- domainGuideStep(
15994
- "pricing",
15995
- "Revenue",
15996
- "Pricing model",
15997
- "Run the pricing creation sequence: strategy, tiers, discounts, trial, paywall."
15998
- )
15999
- ]
16000
- };
16001
- var BUSINESS_GROWTH_FUNNEL_PLAYBOOK = {
16002
- id: "playbook:business-growth-funnel",
16003
- name: "Growth Funnel (AARRR)",
16004
- version: "0.1.0",
16005
- description: "Map the growth engine using Pirate Metrics: funnels, channels, campaigns, loops, cohorts.",
16006
- region: "business_gtm_growth",
16007
- framework_id: "pirate-metrics-aarrr",
16008
- creation_sequence: [
16009
- domainGuideStep(
16010
- "growth",
16011
- "Growth",
16012
- "Funnel model",
16013
- "Run the growth creation sequence: funnel, channels, campaigns, cohorts."
16014
- )
16015
- ]
16016
- };
16017
- var BUSINESS_MARKETING_PLAYBOOK = {
16018
- id: "playbook:business-marketing",
16019
- name: "Marketing",
16020
- version: "0.1.0",
16021
- description: "Shape the demand engine: positioning, messaging, SEO keywords, campaigns, channels.",
16022
- region: "business_gtm_growth",
16023
- creation_sequence: [
16024
- domainGuideStep(
16025
- "marketing",
16026
- "Marketing",
16027
- "Demand engine",
16028
- "Run the marketing creation sequence: positioning, messaging, SEO keywords, campaigns, channels.",
16029
- { next_sequence_on_gap: "playbook:experience-content" }
16030
- )
16031
- ]
16032
- };
16033
16048
  var BUSINESS_GROWTH_METRIC_DRIVEN_PLAYBOOK = {
16034
16049
  id: "playbook:business-growth-metric-driven",
16035
16050
  name: "Metric-Driven Growth",
@@ -16139,6 +16154,7 @@ var ANALYTICS_DATA_PLAYBOOK = {
16139
16154
  description: "Bootstrap the measurement plane: sources, schemas, pipelines, metrics, dashboards, and the rules that keep them honest.",
16140
16155
  region: "analytics_data",
16141
16156
  is_canonical: true,
16157
+ related_framework_ids: ["metrics-tree", "north-star-metric", "pirate-metrics-aarrr", "dora-metrics"],
16142
16158
  target_anchor_entity: "metric",
16143
16159
  creation_sequence: [
16144
16160
  seqStep(
@@ -16186,6 +16202,7 @@ var OPERATIONS_QUALITY_PLAYBOOK = {
16186
16202
  description: "The operational backbone: pipelines, monitoring, incident response, security, quality gates, compliance, support. Specialised playbooks cover team rituals.",
16187
16203
  region: "operations_quality",
16188
16204
  is_canonical: true,
16205
+ related_framework_ids: ["raci-matrix", "retrospective", "team-health-check", "raid-log"],
16189
16206
  target_anchor_entity: "incident",
16190
16207
  creation_sequence: [
16191
16208
  seqStep(
@@ -16232,21 +16249,6 @@ var OPERATIONS_QUALITY_PLAYBOOK = {
16232
16249
  )
16233
16250
  ]
16234
16251
  };
16235
- var OPERATIONS_TEAM_RITUALS_PLAYBOOK = {
16236
- id: "playbook:operations-team-rituals",
16237
- name: "Team & Rituals",
16238
- version: "0.1.0",
16239
- description: "Capture how the team works: retrospectives, roles, rituals, working agreements, decisions.",
16240
- region: "operations_quality",
16241
- creation_sequence: [
16242
- domainGuideStep(
16243
- "team_org",
16244
- "Team",
16245
- "Team rhythm",
16246
- "Run the team_org creation sequence: retrospectives, roles, rituals, working agreements."
16247
- )
16248
- ]
16249
- };
16250
16252
  var UPG_PLAYBOOKS = [
16251
16253
  // Region 1 - strategy_outcomes
16252
16254
  STRATEGY_OUTCOMES_PLAYBOOK,
@@ -16254,33 +16256,22 @@ var UPG_PLAYBOOKS = [
16254
16256
  USERS_NEEDS_PLAYBOOK,
16255
16257
  // Region 3 - discovery_research_validation
16256
16258
  DISCOVERY_RESEARCH_VALIDATION_PLAYBOOK,
16257
- DISCOVERY_VALIDATION_HYPOTHESIS_PLAYBOOK,
16258
16259
  // Region 4 - market_competitive
16259
16260
  MARKET_COMPETITIVE_PLAYBOOK,
16260
16261
  // Region 5 - experience_design_brand
16261
16262
  EXPERIENCE_DESIGN_BRAND_PLAYBOOK,
16262
- EXPERIENCE_UX_DOMAIN_ONLY_PLAYBOOK,
16263
- EXPERIENCE_DESIGN_SYSTEM_PLAYBOOK,
16264
- EXPERIENCE_CONTENT_PLAYBOOK,
16265
16263
  // Region 6 - product_delivery
16266
16264
  PRODUCT_DELIVERY_PLAYBOOK,
16267
- PRODUCT_FEEDBACK_SYNTHESIS_PLAYBOOK,
16268
16265
  // Region 7 - engineering_platform
16269
16266
  ENGINEERING_PLATFORM_PLAYBOOK,
16270
- ENGINEERING_ARCHITECTURE_ONLY_PLAYBOOK,
16271
16267
  // Region 8 - business_gtm_growth
16272
16268
  BUSINESS_GTM_GROWTH_PLAYBOOK,
16273
- BUSINESS_MODEL_BMC_PLAYBOOK,
16274
- BUSINESS_PRICING_PLAYBOOK,
16275
- BUSINESS_GROWTH_FUNNEL_PLAYBOOK,
16276
- BUSINESS_MARKETING_PLAYBOOK,
16277
16269
  BUSINESS_GROWTH_METRIC_DRIVEN_PLAYBOOK,
16278
16270
  BUSINESS_MARKETING_AUDIENCE_FIRST_PLAYBOOK,
16279
16271
  // Region 9 - analytics_data
16280
16272
  ANALYTICS_DATA_PLAYBOOK,
16281
16273
  // Region 10 - operations_quality
16282
- OPERATIONS_QUALITY_PLAYBOOK,
16283
- OPERATIONS_TEAM_RITUALS_PLAYBOOK
16274
+ OPERATIONS_QUALITY_PLAYBOOK
16284
16275
  ];
16285
16276
  var _playbookById = new Map(
16286
16277
  UPG_PLAYBOOKS.map((p) => [p.id, p])
@@ -22762,7 +22753,7 @@ function serializePortfolioWithHeader(doc, opts) {
22762
22753
  header.integrity = { algorithm: INTEGRITY_ALGORITHM, body: computeBodyChecksum(doc) };
22763
22754
  return JSON.stringify({ $upg: header, ...body }, null, 2) + "\n";
22764
22755
  }
22765
- var UPG_VERSION = "0.7.3";
22756
+ var UPG_VERSION = "0.8.0";
22766
22757
  var MARKDOWN_FORMAT_VERSION = "0.1";
22767
22758
  var UPG_TYPES = getTypes();
22768
22759
  var UPG_TYPES_SET = new Set(UPG_TYPES);
@@ -27433,7 +27424,7 @@ var TOOL_DEFINITIONS = [
27433
27424
  },
27434
27425
  {
27435
27426
  name: "get_playbook",
27436
- description: 'Return one `UPGPlaybook` by id (e.g. "playbook:strategy-outcomes", "playbook:business-model-bmc"). Includes the ordered `creation_sequence` with step kinds and prompts. IDs are namespace-prefixed `playbook:*`. For approaches, use `get_approach`.',
27427
+ description: 'Return one `UPGPlaybook` by id (e.g. "playbook:strategy-outcomes", "playbook:business-gtm-growth"). Includes the ordered `creation_sequence` with step kinds and prompts. IDs are namespace-prefixed `playbook:*`. For approaches, use `get_approach`.',
27437
27428
  inputSchema: {
27438
27429
  type: "object",
27439
27430
  properties: {