@unified-product-graph/core 0.7.5 → 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.cjs CHANGED
@@ -21,28 +21,18 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
21
21
  var index_exports = {};
22
22
  __export(index_exports, {
23
23
  ANALYTICS_DATA_PLAYBOOK: () => ANALYTICS_DATA_PLAYBOOK,
24
- BUSINESS_GROWTH_FUNNEL_PLAYBOOK: () => BUSINESS_GROWTH_FUNNEL_PLAYBOOK,
25
24
  BUSINESS_GROWTH_METRIC_DRIVEN_PLAYBOOK: () => BUSINESS_GROWTH_METRIC_DRIVEN_PLAYBOOK,
26
25
  BUSINESS_GTM_GROWTH_PLAYBOOK: () => BUSINESS_GTM_GROWTH_PLAYBOOK,
27
26
  BUSINESS_MARKETING_AUDIENCE_FIRST_PLAYBOOK: () => BUSINESS_MARKETING_AUDIENCE_FIRST_PLAYBOOK,
28
- BUSINESS_MARKETING_PLAYBOOK: () => BUSINESS_MARKETING_PLAYBOOK,
29
- BUSINESS_MODEL_BMC_PLAYBOOK: () => BUSINESS_MODEL_BMC_PLAYBOOK,
30
- BUSINESS_PRICING_PLAYBOOK: () => BUSINESS_PRICING_PLAYBOOK,
31
27
  DISCOVERY_RESEARCH_VALIDATION_PLAYBOOK: () => DISCOVERY_RESEARCH_VALIDATION_PLAYBOOK,
32
- DISCOVERY_VALIDATION_HYPOTHESIS_PLAYBOOK: () => DISCOVERY_VALIDATION_HYPOTHESIS_PLAYBOOK,
33
- ENGINEERING_ARCHITECTURE_ONLY_PLAYBOOK: () => ENGINEERING_ARCHITECTURE_ONLY_PLAYBOOK,
34
28
  ENGINEERING_PLATFORM_PLAYBOOK: () => ENGINEERING_PLATFORM_PLAYBOOK,
35
- EXPERIENCE_CONTENT_PLAYBOOK: () => EXPERIENCE_CONTENT_PLAYBOOK,
36
29
  EXPERIENCE_DESIGN_BRAND_PLAYBOOK: () => EXPERIENCE_DESIGN_BRAND_PLAYBOOK,
37
- EXPERIENCE_DESIGN_SYSTEM_PLAYBOOK: () => EXPERIENCE_DESIGN_SYSTEM_PLAYBOOK,
38
- EXPERIENCE_UX_DOMAIN_ONLY_PLAYBOOK: () => EXPERIENCE_UX_DOMAIN_ONLY_PLAYBOOK,
39
30
  LEGACY_PRODUCT_STAGES: () => LEGACY_PRODUCT_STAGES,
40
31
  MARKDOWN_FORMAT_VERSION: () => MARKDOWN_FORMAT_VERSION,
41
32
  MARKET_COMPETITIVE_PLAYBOOK: () => MARKET_COMPETITIVE_PLAYBOOK,
42
33
  OPERATIONS_QUALITY_PLAYBOOK: () => OPERATIONS_QUALITY_PLAYBOOK,
43
- OPERATIONS_TEAM_RITUALS_PLAYBOOK: () => OPERATIONS_TEAM_RITUALS_PLAYBOOK,
44
34
  PRODUCT_DELIVERY_PLAYBOOK: () => PRODUCT_DELIVERY_PLAYBOOK,
45
- PRODUCT_FEEDBACK_SYNTHESIS_PLAYBOOK: () => PRODUCT_FEEDBACK_SYNTHESIS_PLAYBOOK,
35
+ PROPERTY_SCALE_MAP: () => PROPERTY_SCALE_MAP,
46
36
  REFLECT_MODES: () => REFLECT_MODES,
47
37
  STRATEGY_OUTCOMES_PLAYBOOK: () => STRATEGY_OUTCOMES_PLAYBOOK,
48
38
  UPG_ACTIVE_TYPES: () => UPG_ACTIVE_TYPES,
@@ -143,6 +133,7 @@ __export(index_exports, {
143
133
  getMigrationMap: () => getMigrationMap,
144
134
  getPlaybookById: () => getPlaybookById,
145
135
  getPlaybooksForRegion: () => getPlaybooksForRegion,
136
+ getPropertiesForScale: () => getPropertiesForScale,
146
137
  getPropertyDefaultScale: () => getPropertyDefaultScale,
147
138
  getPropertyMigrations: () => getPropertyMigrations,
148
139
  getPropertySchema: () => getPropertySchema,
@@ -6358,20 +6349,42 @@ var PROPERTY_SCALE_MAP = {
6358
6349
  // discovery, users, feedback
6359
6350
  // ── Severity ─────────────────────────────────────────────────────────────
6360
6351
  severity: "severity_5",
6361
- // users, engineering, ai, gtm, customer-success
6352
+ // users, engineering, ai, gtm, customer-success, security, accessibility
6362
6353
  severity_of_finding: "severity_5",
6363
6354
  // validation/experiment_run
6355
+ bug_severity: "severity_5",
6356
+ // product-spec/bug (UPG-579 Option C collapse)
6357
+ risk_level: "severity_5",
6358
+ // compliance/risk (UPG-579 Option B)
6359
+ scarcity_risk: "severity_5",
6360
+ // market-intelligence (UPG-579 Option B)
6364
6361
  // ── Pain ─────────────────────────────────────────────────────────────────
6365
6362
  pain: "pain_5",
6366
6363
  // discovery
6364
+ pain_score: "pain_5",
6365
+ // user (UPG-579 Option B)
6366
+ friction_score: "pain_5",
6367
+ // growth/ux (UPG-579 Option B)
6367
6368
  // ── Impact ───────────────────────────────────────────────────────────────
6368
6369
  impact: "impact_5",
6369
6370
  // discovery, market, security, compliance
6370
6371
  projected_impact: "impact_5",
6371
6372
  // validation/experiment_plan
6373
+ revenue_impact: "impact_5",
6374
+ // sales/business-model (UPG-579 Option B)
6375
+ effectiveness: "impact_5",
6376
+ // security/marketing (UPG-579 Option B)
6377
+ opportunity_score: "impact_5",
6378
+ // discovery/opportunity (UPG-579 Option B)
6372
6379
  // ── Confidence ───────────────────────────────────────────────────────────
6373
6380
  confidence: "confidence_5",
6374
6381
  // discovery, validation, sales, product-spec
6382
+ current_confidence: "confidence_5",
6383
+ // validation/hypothesis (UPG-579 Option B)
6384
+ likelihood: "confidence_5",
6385
+ // market/risk (UPG-579 Option B)
6386
+ probability: "confidence_5",
6387
+ // sales/forecast (UPG-579 Option B)
6375
6388
  // ── Effort ───────────────────────────────────────────────────────────────
6376
6389
  effort: "effort_5",
6377
6390
  // discovery
@@ -6379,17 +6392,35 @@ var PROPERTY_SCALE_MAP = {
6379
6392
  // feedback
6380
6393
  effort_to_fix: "effort_5",
6381
6394
  // engineering
6395
+ cost_estimate: "effort_5",
6396
+ // validation/experiment_plan (UPG-579 Option B)
6382
6397
  // ── Importance ───────────────────────────────────────────────────────────
6383
6398
  importance: "importance_5",
6384
6399
  // users
6400
+ influence: "importance_5",
6401
+ // team-org/stakeholder (UPG-579 Option B)
6402
+ interest: "importance_5",
6403
+ // team-org/stakeholder (UPG-579 Option B)
6404
+ relevance: "importance_5",
6405
+ // market/content (UPG-579 Option B)
6406
+ weight: "importance_5",
6407
+ // validation/evidence (UPG-579 Option B)
6385
6408
  // ── Satisfaction ─────────────────────────────────────────────────────────
6386
- current_satisfaction: "satisfaction_5"
6409
+ current_satisfaction: "satisfaction_5",
6387
6410
  // users
6411
+ emotion_score: "satisfaction_5"
6412
+ // ux-design/customer-success journey (UPG-579 Option B)
6413
+ // Intentionally NOT mapped (resolve to the generic scale_5):
6414
+ // rarity : VRIO distinctiveness; no canonical named scale fits.
6415
+ // strength : deprecated (validation/evidence; superseded by weight).
6388
6416
  };
6389
6417
  var DEFAULT_SCALE_ID = "scale_5";
6390
6418
  function getPropertyDefaultScale(_entityType, propertyName) {
6391
6419
  return PROPERTY_SCALE_MAP[propertyName] ?? DEFAULT_SCALE_ID;
6392
6420
  }
6421
+ function getPropertiesForScale(scaleId) {
6422
+ return Object.entries(PROPERTY_SCALE_MAP).filter(([, id]) => id === scaleId).map(([property]) => property);
6423
+ }
6393
6424
 
6394
6425
  // src/grammar/enum-scales.ts
6395
6426
  var UPG_ENUM_SCALES = {
@@ -6475,6 +6506,159 @@ var UPG_ENUM_SCALES = {
6475
6506
  { value: "warning", label: "Warning", description: "Soft signal: should consider and address, but can override with justification." },
6476
6507
  { value: "guideline", label: "Guideline", description: "Recommendation: encouraged and expected in most cases, but not enforced." }
6477
6508
  ]
6509
+ },
6510
+ // ── ProxyConfidence ─────────────────────────────────────────────────
6511
+ ProxyConfidence: {
6512
+ id: "ProxyConfidence",
6513
+ label: "Proxy confidence",
6514
+ description: "How strongly a proxy metric predicts the direct measure it stands in for.",
6515
+ tone_direction: "high-is-good",
6516
+ values: [
6517
+ { value: "strong", label: "Strong", description: "Tracks the direct measure closely; a reliable stand-in." },
6518
+ { value: "moderate", label: "Moderate", description: "Correlates with the direct measure but with meaningful slippage." },
6519
+ { value: "weak", label: "Weak", description: "Loosely related; use with caution and corroborate." }
6520
+ ]
6521
+ },
6522
+ // ── CauseConfidence ─────────────────────────────────────────────────
6523
+ CauseConfidence: {
6524
+ id: "CauseConfidence",
6525
+ label: "Cause confidence",
6526
+ description: "Maturity of a root-cause determination during incident debugging: how far a proposed cause has been validated.",
6527
+ tone_direction: "high-is-good",
6528
+ values: [
6529
+ { value: "hypothesised", label: "Hypothesised", description: "A proposed cause, not yet tested against evidence." },
6530
+ { value: "likely", label: "Likely", description: "Supported by evidence but not conclusively proven." },
6531
+ { value: "confirmed", label: "Confirmed", description: "Verified as the cause; reproduced or otherwise established." }
6532
+ ]
6533
+ },
6534
+ // ── ComfortLevel ────────────────────────────────────────────────────
6535
+ ComfortLevel: {
6536
+ id: "ComfortLevel",
6537
+ label: "Comfort level",
6538
+ description: "A person's comfort with a tool, technology, or practice. Closed set so personas compare on the same axis across products.",
6539
+ tone_direction: "high-is-good",
6540
+ values: [
6541
+ { value: "low", label: "Low", description: "Little or no familiarity; needs guidance to proceed." },
6542
+ { value: "medium", label: "Medium", description: "Functional, everyday competence." },
6543
+ { value: "high", label: "High", description: "Confident, fluent use without assistance." },
6544
+ { value: "expert", label: "Expert", description: "Deep mastery; can teach others or extend the tool." },
6545
+ { value: "other", label: "Other", description: "A comfort profile not captured by the above tiers." }
6546
+ ]
6547
+ },
6548
+ // ── LogLevel ────────────────────────────────────────────────────────
6549
+ LogLevel: {
6550
+ id: "LogLevel",
6551
+ label: "Log level",
6552
+ description: "Operational verbosity of a monitor or alert signal. How loud the signal should be, not how bad an outcome is for the user (kept distinct from severity_5).",
6553
+ tone_direction: "low-is-good",
6554
+ values: [
6555
+ { value: "critical", label: "Critical", description: "Page immediately; the signal is service-affecting." },
6556
+ { value: "warning", label: "Warning", description: "Needs attention soon; not yet service-affecting." },
6557
+ { value: "info", label: "Info", description: "Informational; no action required." }
6558
+ ]
6559
+ },
6560
+ // ── IncidentSeverity ────────────────────────────────────────────────
6561
+ IncidentSeverity: {
6562
+ id: "IncidentSeverity",
6563
+ label: "Incident severity",
6564
+ description: "Paging-tier classification of an incident, driving escalation and response process. Distinct from user-impact severity_5 and from LogLevel.",
6565
+ tone_direction: "low-is-good",
6566
+ values: [
6567
+ { value: "sev1", label: "SEV1", description: "Critical outage; full response, executive-visible." },
6568
+ { value: "sev2", label: "SEV2", description: "Major degradation; urgent response." },
6569
+ { value: "sev3", label: "SEV3", description: "Minor or partial impact; handled within hours." },
6570
+ { value: "sev4", label: "SEV4", description: "Negligible impact; routine handling." }
6571
+ ]
6572
+ },
6573
+ // ── SignalSentiment ─────────────────────────────────────────────────
6574
+ SignalSentiment: {
6575
+ id: "SignalSentiment",
6576
+ label: "Signal sentiment",
6577
+ description: "Sentiment polarity of an inbound signal (feedback, support, customer).",
6578
+ tone_direction: "high-is-good",
6579
+ values: [
6580
+ { value: "positive", label: "Positive", description: "Favourable signal; satisfaction or advocacy." },
6581
+ { value: "neutral", label: "Neutral", description: "No clear positive or negative lean." },
6582
+ { value: "negative", label: "Negative", description: "Unfavourable signal; dissatisfaction or risk." },
6583
+ { value: "mixed", label: "Mixed", description: "Contains both positive and negative elements." }
6584
+ ]
6585
+ },
6586
+ // ── MaturityLevel ───────────────────────────────────────────────────
6587
+ MaturityLevel: {
6588
+ id: "MaturityLevel",
6589
+ label: "Maturity level",
6590
+ description: "Capability or process maturity on the CMMI ladder.",
6591
+ tone_direction: "high-is-good",
6592
+ values: [
6593
+ { value: "initial", label: "Initial", description: "Ad hoc and unpredictable; little process." },
6594
+ { value: "developing", label: "Developing", description: "Basic process emerging but inconsistent." },
6595
+ { value: "defined", label: "Defined", description: "Documented, standardised process in place." },
6596
+ { value: "managed", label: "Managed", description: "Measured and controlled against objectives." },
6597
+ { value: "optimizing", label: "Optimizing", description: "Continuous, data-driven improvement." }
6598
+ ]
6599
+ },
6600
+ // ── ConformanceLevel ────────────────────────────────────────────────
6601
+ ConformanceLevel: {
6602
+ id: "ConformanceLevel",
6603
+ label: "Conformance level",
6604
+ description: "WCAG accessibility conformance level.",
6605
+ tone_direction: "high-is-good",
6606
+ values: [
6607
+ { value: "A", label: "A", description: "Minimum conformance; essential barriers removed." },
6608
+ { value: "AA", label: "AA", description: "Addresses the most common barriers; the usual legal target." },
6609
+ { value: "AAA", label: "AAA", description: "Highest level; not achievable for all content." }
6610
+ ]
6611
+ },
6612
+ // ── DataSensitivity ─────────────────────────────────────────────────
6613
+ DataSensitivity: {
6614
+ id: "DataSensitivity",
6615
+ label: "Data sensitivity",
6616
+ description: "Data classification tier governing handling and access.",
6617
+ tone_direction: "neutral",
6618
+ values: [
6619
+ { value: "public", label: "Public", description: "No restriction; safe to disclose openly." },
6620
+ { value: "internal", label: "Internal", description: "For internal use; not for external release." },
6621
+ { value: "confidential", label: "Confidential", description: "Sensitive; restricted to a need-to-know basis." },
6622
+ { value: "restricted", label: "Restricted", description: "Highly sensitive; strict controls and auditing." }
6623
+ ]
6624
+ },
6625
+ // ── DifficultyLevel ─────────────────────────────────────────────────
6626
+ DifficultyLevel: {
6627
+ id: "DifficultyLevel",
6628
+ label: "Difficulty level",
6629
+ description: "Learner difficulty tier for educational content.",
6630
+ tone_direction: "neutral",
6631
+ values: [
6632
+ { value: "beginner", label: "Beginner", description: "No prior knowledge assumed." },
6633
+ { value: "intermediate", label: "Intermediate", description: "Assumes working familiarity with the basics." },
6634
+ { value: "advanced", label: "Advanced", description: "Assumes deep, expert-level background." }
6635
+ ]
6636
+ },
6637
+ // ── FrequencyRating ─────────────────────────────────────────────────
6638
+ FrequencyRating: {
6639
+ id: "FrequencyRating",
6640
+ label: "Frequency rating",
6641
+ description: "Qualitative how-often rating. Distinct from the numeric frequency_5 scale and from Cadence calendar tiers.",
6642
+ tone_direction: "neutral",
6643
+ values: [
6644
+ { value: "constant", label: "Constant", description: "Effectively always; continuous occurrence." },
6645
+ { value: "regular", label: "Regular", description: "Happens on a predictable, recurring basis." },
6646
+ { value: "occasional", label: "Occasional", description: "Happens sometimes, without a fixed pattern." },
6647
+ { value: "rare", label: "Rare", description: "Happens infrequently." },
6648
+ { value: "other", label: "Other", description: "A frequency not captured by the above tiers." }
6649
+ ]
6650
+ },
6651
+ // ── EvidenceDirection ───────────────────────────────────────────────
6652
+ EvidenceDirection: {
6653
+ id: "EvidenceDirection",
6654
+ label: "Evidence direction",
6655
+ description: "Direction of evidence relative to a claim. Distinct from confidence_impact (strengthens/weakens) per the UPG-579 polysemy verdicts.",
6656
+ tone_direction: "neutral",
6657
+ values: [
6658
+ { value: "supports", label: "Supports", description: "The evidence backs the claim." },
6659
+ { value: "refutes", label: "Refutes", description: "The evidence contradicts the claim." },
6660
+ { value: "neutral", label: "Neutral", description: "The evidence is inconclusive either way." }
6661
+ ]
6478
6662
  }
6479
6663
  };
6480
6664
  function getEnumScale(name) {
@@ -6821,6 +7005,41 @@ function getDeprecatedTypes() {
6821
7005
  return deprecated;
6822
7006
  }
6823
7007
  var UPG_PROPERTY_MIGRATIONS = {
7008
+ // ── v0.8.0: UPG-574 deprecated-property removal pass ───────────────────
7009
+ //
7010
+ // The seven properties tagged `@deprecated since v0.4.0` that survived the
7011
+ // v0.5.0 hygiene pass are removed from the spec in v0.8.0 (a breaking
7012
+ // release). Five of the seven already carry a migration:
7013
+ // - `task.task_status` / `bug.bug_status` lift to `UPGBaseNode.status`
7014
+ // (see `UPG_PROPERTY_MIGRATIONS['0.4.0']`, values identical).
7015
+ // - `learning.metric` drops in favour of the `learning_observed_on_metric`
7016
+ // edge (see `UPG_PROPERTY_MIGRATIONS['0.5.0']`).
7017
+ // The two remaining property surfaces are migrated here:
7018
+ // - `evidence.strength` (simple `strong | moderate | weak` enum) is
7019
+ // dropped in favour of `weight: UPGAssessment` (scale `weight_5pt`).
7020
+ // Authors carrying the legacy key should copy the value to `weight`
7021
+ // before applying this migration: `strong → 5`, `moderate → 3`,
7022
+ // `weak → 1`, with the old word preserved in `weight.label`.
7023
+ // - `story_task.estimate` / `.effort` / `.priority` drop. `story_task`
7024
+ // itself is deprecated (`UPG_MIGRATIONS['0.4.0']` renames it to the
7025
+ // canonical `task`); the type rename copies every property verbatim,
7026
+ // so the values survive on `task` (`TaskProperties.estimate` /
7027
+ // `.effort` / `.priority`, all live). This rule removes the residue
7028
+ // from any node still typed `story_task` at migration time.
7029
+ "0.8.0": [
7030
+ {
7031
+ kind: "drop_props",
7032
+ type: "evidence",
7033
+ drop_props: ["strength"],
7034
+ 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."
7035
+ },
7036
+ {
7037
+ kind: "drop_props",
7038
+ type: "story_task",
7039
+ drop_props: ["estimate", "effort", "priority"],
7040
+ 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.'
7041
+ }
7042
+ ],
6824
7043
  // ── v0.5.0: UPG-509 deprecation hygiene pass ───────────────────────────
6825
7044
  //
6826
7045
  // Properties tagged `@deprecated since="0.4.0" removeIn="0.5.0"` (and the
@@ -8624,7 +8843,18 @@ var UPG_PROPERTY_SCHEMA = {
8624
8843
  },
8625
8844
  // A11yIssueProperties: Accessibility issue.
8626
8845
  a11y_issue: {
8627
- 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." },
8846
+ severity: {
8847
+ type: "assessment",
8848
+ scale_id: "severity_5",
8849
+ 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`.",
8850
+ properties: {
8851
+ value: { type: "number", description: "The numeric value, used for computation." },
8852
+ label: { type: "string", description: "The qualitative label (what the assessor meant)." },
8853
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
8854
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
8855
+ },
8856
+ required: ["value", "label"]
8857
+ },
8628
8858
  wcag_criterion: { type: "string", description: 'WCAG success criterion violated (e.g. "1.1.1", "2.4.7")' },
8629
8859
  rule_id: { type: "string", description: "Identifier of the rule that flagged the issue" },
8630
8860
  help_url: { type: "string", description: "URL to documentation explaining the issue and how to fix it" },
@@ -8681,7 +8911,18 @@ var UPG_PROPERTY_SCHEMA = {
8681
8911
  affinity_cluster: {
8682
8912
  theme: { type: "string", description: "Emergent theme label" },
8683
8913
  child_observation_count: { type: "number", description: "Observations in this cluster" },
8684
- confidence: { type: "string", enum: ["high", "medium", "low"], description: "Confidence in the theme's validity" }
8914
+ confidence: {
8915
+ type: "assessment",
8916
+ scale_id: "confidence_5",
8917
+ description: "Confidence in the theme's validity (UPGAssessment on `confidence_5`).",
8918
+ properties: {
8919
+ value: { type: "number", description: "The numeric value, used for computation." },
8920
+ label: { type: "string", description: "The qualitative label (what the assessor meant)." },
8921
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
8922
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
8923
+ },
8924
+ required: ["value", "label"]
8925
+ }
8685
8926
  },
8686
8927
  // AgentDefinitionProperties: Agent definition.
8687
8928
  agent_definition: {
@@ -8815,7 +9056,7 @@ var UPG_PROPERTY_SCHEMA = {
8815
9056
  // AlertRuleProperties: Alert rule.
8816
9057
  alert_rule: {
8817
9058
  condition: { type: "string", description: 'Triggering query or expression. @example "avg(rate(http_errors_total[5m])) > 0.05"' },
8818
- severity: { type: "string", enum: ["critical", "warning", "info"], description: "Routes notification and escalation. `critical` = page immediately. `warning` = notify, don't page. `info` = log only." },
9059
+ 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." },
8819
9060
  notification_channel: { type: "string", description: 'Notification destination. @example "pagerduty:sev1-rotation", "slack:#alerts-low"' },
8820
9061
  evaluation_window: { type: "string", description: 'Required duration the condition holds before firing. Prevents flapping on transient spikes. @example "5m", "15m", "1h"' },
8821
9062
  escalation_policy: { type: "string", description: 'Escalation behaviour on unacknowledged alerts. @example "Escalate to engineering lead after 10 minutes"' }
@@ -8854,16 +9095,28 @@ var UPG_PROPERTY_SCHEMA = {
8854
9095
  },
8855
9096
  // AssumptionProperties: Assumption entity.
8856
9097
  assumption: {
8857
- confidence: { type: "string", enum: ["high", "medium", "low"], description: "Confidence before testing. Independent of whether the assumption is validated (tracked in lifecycle)." },
9098
+ confidence: {
9099
+ type: "assessment",
9100
+ scale_id: "confidence_5",
9101
+ description: "Confidence before testing (UPGAssessment on `confidence_5`). Independent of whether the assumption is validated (tracked in lifecycle).",
9102
+ properties: {
9103
+ value: { type: "number", description: "The numeric value, used for computation." },
9104
+ label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9105
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9106
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9107
+ },
9108
+ required: ["value", "label"]
9109
+ },
8858
9110
  validation_method: { type: "string", description: "Validation method, planned or used" },
8859
9111
  risk_level: {
8860
- type: "object",
9112
+ type: "assessment",
9113
+ scale_id: "severity_5",
8861
9114
  description: "Exposure if the assumption turns out wrong",
8862
9115
  properties: {
8863
9116
  value: { type: "number", description: "The numeric value, used for computation." },
8864
9117
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
8865
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
8866
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9118
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9119
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
8867
9120
  },
8868
9121
  required: ["value", "label"]
8869
9122
  },
@@ -8974,8 +9227,18 @@ var UPG_PROPERTY_SCHEMA = {
8974
9227
  },
8975
9228
  // BugProperties: Bug report.
8976
9229
  bug: {
8977
- 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." },
8978
- 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`." },
9230
+ bug_severity: {
9231
+ type: "assessment",
9232
+ scale_id: "severity_5",
9233
+ 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`.",
9234
+ properties: {
9235
+ value: { type: "number", description: "The numeric value, used for computation." },
9236
+ label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9237
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9238
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9239
+ },
9240
+ required: ["value", "label"]
9241
+ },
8979
9242
  steps_to_reproduce: { type: "string", description: "Step-by-step reproduction" },
8980
9243
  environment: { type: "string", description: 'Observed environment (e.g. "prod", "staging", "iOS 17.4")' },
8981
9244
  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)." },
@@ -9005,7 +9268,7 @@ var UPG_PROPERTY_SCHEMA = {
9005
9268
  maturity_level: { type: "string", enum: ["initial", "developing", "defined", "managed", "optimizing"], description: "Current maturity" },
9006
9269
  target_maturity: { type: "string", enum: ["initial", "developing", "defined", "managed", "optimizing"], description: "Target maturity" },
9007
9270
  gap: { type: "string", description: "Gap between current and target" },
9008
- 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"' },
9271
+ 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'" },
9009
9272
  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" }
9010
9273
  },
9011
9274
  // CapacityPlanProperties: CapacityPlan entity.
@@ -9018,7 +9281,7 @@ var UPG_PROPERTY_SCHEMA = {
9018
9281
  // CeremonyProperties: Ceremony entity.
9019
9282
  ceremony: {
9020
9283
  ceremony_type: { type: "string", enum: ["standup", "planning", "review", "retro", "sync", "demo", "other"], description: "Kind of recurring meeting" },
9021
- cadence: { type: "string", description: 'How often the ceremony occurs (e.g. "daily", "biweekly")' },
9284
+ 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." },
9022
9285
  duration_minutes: { type: "number", description: "Typical duration of the meeting in minutes" },
9023
9286
  participants: { type: "string", description: "People or roles who attend" }
9024
9287
  },
@@ -9047,9 +9310,9 @@ var UPG_PROPERTY_SCHEMA = {
9047
9310
  category: { type: "string", description: "High-level category of the churn reason" },
9048
9311
  frequency_count: { type: "number", description: "Exact count of times this reason has been cited in `frequency_period`" },
9049
9312
  frequency_period: { type: "string", description: "The recurrence period the count is measured over (ISO-8601 `Duration`, e.g. `'P30D'`)" },
9050
- frequency_rating: { type: "string", enum: ["rare", "occasional", "regular", "constant", "other"], description: "Qualitative frequency tier when an exact count is not known" },
9313
+ frequency_rating: { type: "string", enum: ["constant", "regular", "occasional", "rare", "other"], description: "Qualitative frequency tier when an exact count is not known" },
9051
9314
  contributing_factors: { type: "string[]", description: "Other factors that contributed to the churn" },
9052
- signal_sentiment: { type: "string", enum: ["positive", "negative", "neutral", "mixed"], description: "Detected sentiment of the churn signal" },
9315
+ signal_sentiment: { type: "string", enum: ["positive", "neutral", "negative", "mixed"], description: "Detected sentiment of the churn signal" },
9053
9316
  signal_channel: { type: "string", description: "Channel through which the churn signal was received" },
9054
9317
  signal_urgency: { type: "string", enum: ["low", "medium", "high", "critical"], description: "Urgency of the churn risk" }
9055
9318
  },
@@ -9163,7 +9426,7 @@ var UPG_PROPERTY_SCHEMA = {
9163
9426
  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'`." },
9164
9427
  frequency_count: { type: "number", description: "Exact count in the period. Pairs with `frequency_period`." },
9165
9428
  frequency_period: { type: "string", description: "Recurrence period (ISO-8601 `Duration`, e.g. `'P7D'`)" },
9166
- frequency_rating: { type: "string", enum: ["rare", "occasional", "regular", "constant", "other"], description: "Qualitative rate tier when an exact rate is unknown" }
9429
+ frequency_rating: { type: "string", enum: ["constant", "regular", "occasional", "rare", "other"], description: "Qualitative rate tier when an exact rate is unknown" }
9167
9430
  },
9168
9431
  // ContentPieceProperties: Content piece.
9169
9432
  content_piece: {
@@ -9178,7 +9441,7 @@ var UPG_PROPERTY_SCHEMA = {
9178
9441
  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'`." },
9179
9442
  frequency_count: { type: "number", description: "Exact count of publications in the period. Pairs with `frequency_period`." },
9180
9443
  frequency_period: { type: "string", description: "Recurrence period (ISO-8601 `Duration`, e.g. `'P7D'`)" },
9181
- frequency_rating: { type: "string", enum: ["rare", "occasional", "regular", "constant", "other"], description: "Qualitative rate tier when an exact rate is unknown" }
9444
+ frequency_rating: { type: "string", enum: ["constant", "regular", "occasional", "rare", "other"], description: "Qualitative rate tier when an exact rate is unknown" }
9182
9445
  },
9183
9446
  // ContentThemeProperties: Content theme.
9184
9447
  content_theme: {
@@ -9203,13 +9466,14 @@ var UPG_PROPERTY_SCHEMA = {
9203
9466
  clause_text: { type: "string", description: "Full text of the clause" },
9204
9467
  is_negotiable: { type: "boolean", description: "Whether this clause is open to negotiation" },
9205
9468
  risk_level: {
9206
- type: "object",
9469
+ type: "assessment",
9470
+ scale_id: "severity_5",
9207
9471
  description: "Risk level if the clause is accepted as-is (1 = negligible, 5 = severe exposure)",
9208
9472
  properties: {
9209
9473
  value: { type: "number", description: "The numeric value, used for computation." },
9210
9474
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9211
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9212
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9475
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9476
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9213
9477
  },
9214
9478
  required: ["value", "label"]
9215
9479
  }
@@ -9228,9 +9492,9 @@ var UPG_PROPERTY_SCHEMA = {
9228
9492
  // CustomerFeedbackProperties: Customer feedback.
9229
9493
  customer_feedback: {
9230
9494
  feedback_type: { type: "string", enum: ["survey", "interview", "review", "nps"], description: "How the feedback was collected" },
9231
- sentiment: { type: "string", enum: ["positive", "neutral", "negative"], description: "Overall sentiment of the feedback" },
9495
+ sentiment: { type: "string", enum: ["positive", "neutral", "negative", "mixed"], description: "Overall sentiment of the feedback" },
9232
9496
  verbatim: { type: "string", description: "Exact words from the customer" },
9233
- signal_sentiment: { type: "string", enum: ["positive", "negative", "neutral", "mixed"], description: "Detected sentiment of the underlying signal" },
9497
+ signal_sentiment: { type: "string", enum: ["positive", "neutral", "negative", "mixed"], description: "Detected sentiment of the underlying signal" },
9234
9498
  signal_channel: { type: "string", description: "Channel through which the signal was received" },
9235
9499
  signal_urgency: { type: "string", enum: ["low", "medium", "high", "critical"], description: "Perceived urgency of the feedback" }
9236
9500
  },
@@ -9259,7 +9523,7 @@ var UPG_PROPERTY_SCHEMA = {
9259
9523
  url: { type: "string", description: "URL to the live dashboard" },
9260
9524
  audience: { type: "string", description: "Intended audience for this dashboard" },
9261
9525
  element_count: { type: "number", description: "Number of widgets or panels on the dashboard" },
9262
- refresh_cadence: { type: "string", description: "How often the dashboard data refreshes" },
9526
+ 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." },
9263
9527
  filter_count: { type: "number", description: "Number of user-configurable filters" }
9264
9528
  },
9265
9529
  // DataClassificationProperties: Data classification.
@@ -9319,7 +9583,7 @@ var UPG_PROPERTY_SCHEMA = {
9319
9583
  },
9320
9584
  // DataProductProperties: DataProduct entity.
9321
9585
  data_product: {
9322
- data_product_type: { type: "string", description: 'Classification of the data product (e.g. "report", "dataset", "stream")' },
9586
+ data_product_type: { type: "string", enum: ["report", "dataset", "stream", "api", "ml_feature", "other"], description: "Classification of the data product (UPG-579 Option B)." },
9323
9587
  sla_freshness: { type: "string", description: 'Freshness SLA commitment (e.g. "< 1 hour")' }
9324
9588
  },
9325
9589
  // DataQualityRuleProperties: DataQualityRule entity.
@@ -9336,7 +9600,7 @@ var UPG_PROPERTY_SCHEMA = {
9336
9600
  data_source: {
9337
9601
  source_type: { type: "string", enum: ["database", "api", "event_stream", "warehouse"], description: "Kind of data source" },
9338
9602
  connection_status: { type: "string", enum: ["connected", "disconnected", "error"], description: "Current connection health" },
9339
- refresh_cadence: { type: "string", description: 'How often the data is refreshed (e.g. "hourly", "daily")' }
9603
+ 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." }
9340
9604
  },
9341
9605
  // DatabaseSchemaProperties: Database schema.
9342
9606
  database_schema: {
@@ -9367,7 +9631,7 @@ var UPG_PROPERTY_SCHEMA = {
9367
9631
  },
9368
9632
  // DeliverableProperties: Deliverable.
9369
9633
  deliverable: {
9370
- deliverable_type: { type: "string", description: 'Kind of deliverable (e.g. "document", "prototype", "release")' },
9634
+ deliverable_type: { type: "string", enum: ["document", "prototype", "release", "design", "report", "other"], description: "Kind of deliverable (UPG-579 Option B)." },
9371
9635
  due_date: { type: "string", description: "Due date for the deliverable (ISO format)" },
9372
9636
  deliverable_status: { type: "string", enum: ["not_started", "in_progress", "in_review", "accepted", "rejected"], description: "Current progress status" },
9373
9637
  acceptance_criteria: { type: "string", description: "Criteria that must be met for the deliverable to be accepted" }
@@ -9445,7 +9709,18 @@ var UPG_PROPERTY_SCHEMA = {
9445
9709
  target_domain: { type: "string", enum: ["ux", "visual", "interaction", "content", "accessibility", "other"], description: "Target design discipline" },
9446
9710
  framing: { type: "string", enum: ["how_might_we", "what_if", "why_do", "how_do", "what_prevents", "other"], description: "Question framing template" },
9447
9711
  priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Importance against other backlog questions" },
9448
- confidence: { type: "string", enum: ["high", "medium", "low"], description: "Confidence the question is well-framed. Distinct from confidence in any answer." },
9712
+ confidence: {
9713
+ type: "assessment",
9714
+ scale_id: "confidence_5",
9715
+ description: "Confidence the question is well-framed (UPGAssessment on `confidence_5`). Distinct from confidence in any answer.",
9716
+ properties: {
9717
+ value: { type: "number", description: "The numeric value, used for computation." },
9718
+ label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9719
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9720
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9721
+ },
9722
+ required: ["value", "label"]
9723
+ },
9449
9724
  assumptions: { type: "string[]", description: "Underlying assumptions. Surfaced explicitly so they can be challenged or validated." },
9450
9725
  validation_method: { type: "string", enum: ["interview", "survey", "usability_test", "analytics", "a_b_test", "prototype_test", "literature_review", "other"], description: "Primary validation method" }
9451
9726
  },
@@ -9472,24 +9747,26 @@ var UPG_PROPERTY_SCHEMA = {
9472
9747
  desired_outcome: {
9473
9748
  statement: { type: "string", description: "Outcome statement in the user's words" },
9474
9749
  importance: {
9475
- type: "object",
9750
+ type: "assessment",
9751
+ scale_id: "importance_5",
9476
9752
  description: "How important this outcome is to the user (1 = low, 5 = critical)",
9477
9753
  properties: {
9478
9754
  value: { type: "number", description: "The numeric value, used for computation." },
9479
9755
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9480
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9481
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9756
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9757
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9482
9758
  },
9483
9759
  required: ["value", "label"]
9484
9760
  },
9485
9761
  current_satisfaction: {
9486
- type: "object",
9762
+ type: "assessment",
9763
+ scale_id: "satisfaction_5",
9487
9764
  description: "How satisfied the user currently is with this outcome (1 = very unsatisfied, 5 = fully satisfied)",
9488
9765
  properties: {
9489
9766
  value: { type: "number", description: "The numeric value, used for computation." },
9490
9767
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9491
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9492
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9768
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9769
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9493
9770
  },
9494
9771
  required: ["value", "label"]
9495
9772
  }
@@ -9607,20 +9884,20 @@ var UPG_PROPERTY_SCHEMA = {
9607
9884
  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." },
9608
9885
  direction: { type: "string", enum: ["supports", "refutes", "neutral"], description: "Direction relative to the parent hypothesis." },
9609
9886
  weight: {
9610
- type: "object",
9611
- description: "Strength (UPGAssessment, scale `weight_5pt`).",
9887
+ type: "assessment",
9888
+ scale_id: "importance_5",
9889
+ description: "Strength (UPGAssessment, scale `scale_5`).",
9612
9890
  properties: {
9613
9891
  value: { type: "number", description: "The numeric value, used for computation." },
9614
9892
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9615
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9616
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9893
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9894
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9617
9895
  },
9618
9896
  required: ["value", "label"]
9619
9897
  },
9620
9898
  summary: { type: "string", description: "Plain-English summary." },
9621
9899
  observed_at: { type: "string", description: "ISO date observed." },
9622
- source: { type: "string", description: "Free-text provenance note" },
9623
- 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." }
9900
+ source: { type: "string", description: "Free-text provenance note" }
9624
9901
  },
9625
9902
  // ExperimentProperties: A structured activity designed to test a hypothesis.
9626
9903
  experiment: {
@@ -9637,46 +9914,50 @@ var UPG_PROPERTY_SCHEMA = {
9637
9914
  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." },
9638
9915
  success_criteria: { type: "string", description: 'Plain-English description of "passing"' },
9639
9916
  projected_reach: {
9640
- type: "object",
9917
+ type: "assessment",
9918
+ scale_id: "reach_5",
9641
9919
  description: "Projected reach: how many people the run is expected to touch (UPGAssessment)",
9642
9920
  properties: {
9643
9921
  value: { type: "number", description: "The numeric value, used for computation." },
9644
9922
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9645
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9646
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9923
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9924
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9647
9925
  },
9648
9926
  required: ["value", "label"]
9649
9927
  },
9650
9928
  projected_impact: {
9651
- type: "object",
9929
+ type: "assessment",
9930
+ scale_id: "impact_5",
9652
9931
  description: "Projected impact on the target metric (UPGAssessment)",
9653
9932
  properties: {
9654
9933
  value: { type: "number", description: "The numeric value, used for computation." },
9655
9934
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9656
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9657
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9935
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9936
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9658
9937
  },
9659
9938
  required: ["value", "label"]
9660
9939
  },
9661
9940
  confidence: {
9662
- type: "object",
9663
- description: "Team confidence at plan-time (UPGAssessment, scale `confidence_5pt`)",
9941
+ type: "assessment",
9942
+ scale_id: "confidence_5",
9943
+ description: "Team confidence at plan-time (UPGAssessment, scale `confidence_5`)",
9664
9944
  properties: {
9665
9945
  value: { type: "number", description: "The numeric value, used for computation." },
9666
9946
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9667
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9668
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9947
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9948
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9669
9949
  },
9670
9950
  required: ["value", "label"]
9671
9951
  },
9672
9952
  cost_estimate: {
9673
- type: "object",
9953
+ type: "assessment",
9954
+ scale_id: "effort_5",
9674
9955
  description: "Cost estimate at plan-time (UPGAssessment)",
9675
9956
  properties: {
9676
9957
  value: { type: "number", description: "The numeric value, used for computation." },
9677
9958
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9678
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9679
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9959
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9960
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9680
9961
  },
9681
9962
  required: ["value", "label"]
9682
9963
  },
@@ -9690,13 +9971,14 @@ var UPG_PROPERTY_SCHEMA = {
9690
9971
  actual_reach: { type: "number", description: "Observed reach: how many people the run actually touched" },
9691
9972
  outcome_summary: { type: "string", description: "Plain-English outcome" },
9692
9973
  severity_of_finding: {
9693
- type: "object",
9974
+ type: "assessment",
9975
+ scale_id: "severity_5",
9694
9976
  description: "Severity / strength of the finding (UPGAssessment)",
9695
9977
  properties: {
9696
9978
  value: { type: "number", description: "The numeric value, used for computation." },
9697
9979
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9698
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9699
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9980
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9981
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9700
9982
  },
9701
9983
  required: ["value", "label"]
9702
9984
  },
@@ -9715,7 +9997,18 @@ var UPG_PROPERTY_SCHEMA = {
9715
9997
  feasibility_study: {
9716
9998
  study_type: { type: "string", enum: ["technical", "business", "market", "resource"], description: 'Type of feasibility being assessed. @example "technical" for assessing engineering viability' },
9717
9999
  conclusion: { type: "string", enum: ["feasible", "not_feasible", "conditional", "needs_more_data"], description: "Outcome conclusion of the study" },
9718
- confidence: { type: "string", enum: ["high", "medium", "low"], description: "Confidence in the conclusion" }
10000
+ confidence: {
10001
+ type: "assessment",
10002
+ scale_id: "confidence_5",
10003
+ description: "Confidence in the conclusion (UPGAssessment on `confidence_5`).",
10004
+ properties: {
10005
+ value: { type: "number", description: "The numeric value, used for computation." },
10006
+ label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10007
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10008
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10009
+ },
10010
+ required: ["value", "label"]
10011
+ }
9719
10012
  },
9720
10013
  // FeatureProperties: A discrete, user-facing capability of the product.
9721
10014
  feature: {
@@ -9750,28 +10043,30 @@ var UPG_PROPERTY_SCHEMA = {
9750
10043
  feature_request: {
9751
10044
  request_source: { type: "string", enum: ["customer", "internal", "prospect", "support", "community"], description: "Where the request originated" },
9752
10045
  vote_count: { type: "number", description: "Number of votes or upvotes from users" },
9753
- signal_sentiment: { type: "string", enum: ["positive", "negative", "neutral", "mixed"], description: "Detected sentiment of the request" },
10046
+ signal_sentiment: { type: "string", enum: ["positive", "neutral", "negative", "mixed"], description: "Detected sentiment of the request" },
9754
10047
  signal_channel: { type: "string", description: "Channel through which the request was received" },
9755
10048
  signal_urgency: { type: "string", enum: ["low", "medium", "high", "critical"], description: "Perceived urgency of the request" },
9756
10049
  revenue_impact: {
9757
- type: "object",
10050
+ type: "assessment",
10051
+ scale_id: "impact_5",
9758
10052
  description: "Estimated revenue impact if implemented (1-5)",
9759
10053
  properties: {
9760
10054
  value: { type: "number", description: "The numeric value, used for computation." },
9761
10055
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9762
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9763
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10056
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10057
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9764
10058
  },
9765
10059
  required: ["value", "label"]
9766
10060
  },
9767
10061
  effort_estimate: {
9768
- type: "object",
10062
+ type: "assessment",
10063
+ scale_id: "effort_5",
9769
10064
  description: "Estimated implementation effort (1-5)",
9770
10065
  properties: {
9771
10066
  value: { type: "number", description: "The numeric value, used for computation." },
9772
10067
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9773
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9774
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10068
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10069
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9775
10070
  },
9776
10071
  required: ["value", "label"]
9777
10072
  },
@@ -9788,13 +10083,14 @@ var UPG_PROPERTY_SCHEMA = {
9788
10083
  sentiment: { type: "string", enum: ["positive", "neutral", "negative", "mixed"], description: "Overall sentiment across mentions" },
9789
10084
  actionable: { type: "boolean", description: "Whether this theme can be acted upon" },
9790
10085
  frequency: {
9791
- type: "object",
10086
+ type: "assessment",
10087
+ scale_id: "frequency_5",
9792
10088
  description: "How often the theme is mentioned (1-5)",
9793
10089
  properties: {
9794
10090
  value: { type: "number", description: "The numeric value, used for computation." },
9795
10091
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9796
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9797
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10092
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10093
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9798
10094
  },
9799
10095
  required: ["value", "label"]
9800
10096
  },
@@ -9812,7 +10108,7 @@ var UPG_PROPERTY_SCHEMA = {
9812
10108
  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." },
9813
10109
  commit: { type: "string", description: "Git commit SHA" },
9814
10110
  files_changed: { type: "string[]", description: "Files changed" },
9815
- deployed_at: { type: "string", description: "ISO timestamp landed in the target environment. Pairs with `fix_status === 'deployed'`." },
10111
+ deployed_at: { type: "string", description: "ISO timestamp landed in the target environment." },
9816
10112
  fixed_date: { type: "string", description: "Application date (ISO date). Coarser-grained complement to `deployed_at`." },
9817
10113
  verified: { type: "boolean", description: "Verified in production" },
9818
10114
  verified_by_test: { type: "boolean", description: "Validated by an automated regression or integration test. Distinct from `verified` (human judgment)." }
@@ -9822,13 +10118,14 @@ var UPG_PROPERTY_SCHEMA = {
9822
10118
  forecast_period: { type: "string", description: 'Time period the forecast covers (e.g. "Q2 2026")' },
9823
10119
  predicted_revenue: { type: "number", description: "Predicted revenue amount" },
9824
10120
  confidence: {
9825
- type: "object",
10121
+ type: "assessment",
10122
+ scale_id: "confidence_5",
9826
10123
  description: "Confidence in the prediction (1 = speculative, 5 = high conviction)",
9827
10124
  properties: {
9828
10125
  value: { type: "number", description: "The numeric value, used for computation." },
9829
10126
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9830
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9831
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10127
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10128
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9832
10129
  },
9833
10130
  required: ["value", "label"]
9834
10131
  },
@@ -9880,13 +10177,14 @@ var UPG_PROPERTY_SCHEMA = {
9880
10177
  hallucination_report: {
9881
10178
  report_type: { type: "string", enum: ["factual", "logical", "fabrication", "inconsistency"], description: "Classification" },
9882
10179
  severity: {
9883
- type: "object",
10180
+ type: "assessment",
10181
+ scale_id: "severity_5",
9884
10182
  description: "Impact severity (1 = trivial, 5 = dangerous misinformation)",
9885
10183
  properties: {
9886
10184
  value: { type: "number", description: "The numeric value, used for computation." },
9887
10185
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9888
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9889
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10186
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10187
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9890
10188
  },
9891
10189
  required: ["value", "label"]
9892
10190
  },
@@ -9908,13 +10206,14 @@ var UPG_PROPERTY_SCHEMA = {
9908
10206
  we_know_when: { type: "string", description: "The measurable signal that confirms or refutes the claim." },
9909
10207
  risk_if_wrong: { type: "string", description: "Risk surface for prioritisation if the claim turns out wrong." },
9910
10208
  current_confidence: {
9911
- type: "object",
10209
+ type: "assessment",
10210
+ scale_id: "confidence_5",
9912
10211
  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.",
9913
10212
  properties: {
9914
10213
  value: { type: "number", description: "The numeric value, used for computation." },
9915
10214
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9916
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9917
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10215
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10216
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9918
10217
  },
9919
10218
  required: ["value", "label"]
9920
10219
  }
@@ -9924,13 +10223,14 @@ var UPG_PROPERTY_SCHEMA = {
9924
10223
  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." },
9925
10224
  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`." },
9926
10225
  weight: {
9927
- type: "object",
9928
- description: "Strength of the evidence (UPGAssessment, scale `weight_5pt`).",
10226
+ type: "assessment",
10227
+ scale_id: "importance_5",
10228
+ description: "Strength of the evidence (UPGAssessment, scale `scale_5`).",
9929
10229
  properties: {
9930
10230
  value: { type: "number", description: "The numeric value, used for computation." },
9931
10231
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9932
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9933
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10232
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10233
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9934
10234
  },
9935
10235
  required: ["value", "label"]
9936
10236
  },
@@ -9948,8 +10248,8 @@ var UPG_PROPERTY_SCHEMA = {
9948
10248
  // IncidentProperties: Incident.
9949
10249
  incident: {
9950
10250
  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' },
9951
- 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' },
9952
- urgency: { type: "string", enum: ["high", "low"], description: "Notification urgency. Independent of severity. `high` triggers phone calls. `low` sends a message." },
10251
+ 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' },
10252
+ 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." },
9953
10253
  started_at: { type: "string", description: "ISO timestamp the incident started or was first detected." },
9954
10254
  acknowledged_at: { type: "string", description: "ISO timestamp first acknowledged by a responder. Used to compute time-to-acknowledge." },
9955
10255
  contained_at: { type: "string", description: "ISO timestamp contained. Blast radius limited, bleeding stopped. Containment precedes full resolution, especially for security incidents." },
@@ -9975,7 +10275,18 @@ var UPG_PROPERTY_SCHEMA = {
9975
10275
  // InsightProperties: Unified insight, synthesised from evidence and observations.
9976
10276
  insight: {
9977
10277
  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." },
9978
- confidence: { type: "string", enum: ["high", "medium", "low"], description: "Confidence. Reflects the strength and diversity of supporting evidence." },
10278
+ confidence: {
10279
+ type: "assessment",
10280
+ scale_id: "confidence_5",
10281
+ description: "Confidence (UPGAssessment on `confidence_5`). Reflects the strength and diversity of supporting evidence.",
10282
+ properties: {
10283
+ value: { type: "number", description: "The numeric value, used for computation." },
10284
+ label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10285
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10286
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10287
+ },
10288
+ required: ["value", "label"]
10289
+ },
9979
10290
  evidence_count: { type: "number", description: "Supporting observations, quotes, or evidence items. Higher counts increase confidence." },
9980
10291
  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." },
9981
10292
  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." },
@@ -10013,20 +10324,21 @@ var UPG_PROPERTY_SCHEMA = {
10013
10324
  // InvestigationProperties: Active thread of inquiry: debugging, architecture exploration, RCA.
10014
10325
  investigation: {
10015
10326
  severity: {
10016
- type: "object",
10327
+ type: "assessment",
10328
+ scale_id: "severity_5",
10017
10329
  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`.",
10018
10330
  properties: {
10019
10331
  value: { type: "number", description: "The numeric value, used for computation." },
10020
10332
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10021
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10022
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10333
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10334
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10023
10335
  },
10024
10336
  required: ["value", "label"]
10025
10337
  },
10026
10338
  hypothesis: { type: "string", description: "Working hypothesis about the root cause" },
10027
10339
  findings: { type: "string", description: "Findings discovered so far" },
10028
10340
  started_at: { type: "string", description: "ISO timestamp the investigation began" },
10029
- resolved_at: { type: "string", description: "ISO timestamp the investigation was concluded. Pairs with `investigation_status === 'resolved' | 'abandoned'`." },
10341
+ resolved_at: { type: "string", description: "ISO timestamp the investigation was concluded. Pairs with `status === 'resolved' | 'abandoned'`." },
10030
10342
  lead_investigator: { type: "string", description: "Lead investigator (email or handle). Distinct from the team owning the affected service." },
10031
10343
  session_id: { type: "string", description: "Originating session" },
10032
10344
  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*." }
@@ -10052,24 +10364,26 @@ var UPG_PROPERTY_SCHEMA = {
10052
10364
  statement: { type: "string", description: 'Job statement: "When I... I want to... So I can..."' },
10053
10365
  job_type: { type: "string", enum: ["functional", "emotional", "social", "supporting"], description: "Classification by motivation dimension" },
10054
10366
  importance: {
10055
- type: "object",
10367
+ type: "assessment",
10368
+ scale_id: "importance_5",
10056
10369
  description: "Importance to the user (1 = low, 5 = critical)",
10057
10370
  properties: {
10058
10371
  value: { type: "number", description: "The numeric value, used for computation." },
10059
10372
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10060
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10061
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10373
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10374
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10062
10375
  },
10063
10376
  required: ["value", "label"]
10064
10377
  },
10065
10378
  current_satisfaction: {
10066
- type: "object",
10379
+ type: "assessment",
10380
+ scale_id: "satisfaction_5",
10067
10381
  description: "Current satisfaction with how this job gets done (1 = very unsatisfied, 5 = fully satisfied)",
10068
10382
  properties: {
10069
10383
  value: { type: "number", description: "The numeric value, used for computation." },
10070
10384
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10071
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10072
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10385
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10386
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10073
10387
  },
10074
10388
  required: ["value", "label"]
10075
10389
  },
@@ -10087,24 +10401,26 @@ var UPG_PROPERTY_SCHEMA = {
10087
10401
  action_description: { type: "string", description: "Plain-language description. Primary content of the action." },
10088
10402
  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." },
10089
10403
  pain_score: {
10090
- type: "object",
10404
+ type: "assessment",
10405
+ scale_id: "pain_5",
10091
10406
  description: "Pain (1 = effortless, 5 = very painful). Drives opportunity discovery.",
10092
10407
  properties: {
10093
10408
  value: { type: "number", description: "The numeric value, used for computation." },
10094
10409
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10095
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10096
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10410
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10411
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10097
10412
  },
10098
10413
  required: ["value", "label"]
10099
10414
  },
10100
10415
  opportunity_score: {
10101
- type: "object",
10416
+ type: "assessment",
10417
+ scale_id: "impact_5",
10102
10418
  description: "Opportunity (1 = low leverage, 5 = high leverage). Pairs with `pain_score` to rank investment.",
10103
10419
  properties: {
10104
10420
  value: { type: "number", description: "The numeric value, used for computation." },
10105
10421
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10106
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10107
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10422
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10423
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10108
10424
  },
10109
10425
  required: ["value", "label"]
10110
10426
  },
@@ -10128,24 +10444,26 @@ var UPG_PROPERTY_SCHEMA = {
10128
10444
  touchpoint: { type: "string", description: "Interaction touchpoint" },
10129
10445
  channel: { type: "string", description: 'Channel (e.g. "web", "email", "in-store")' },
10130
10446
  emotion_score: {
10131
- type: "object",
10447
+ type: "assessment",
10448
+ scale_id: "satisfaction_5",
10132
10449
  description: "User emotion (1 = very negative, 5 = very positive)",
10133
10450
  properties: {
10134
10451
  value: { type: "number", description: "The numeric value, used for computation." },
10135
10452
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10136
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10137
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10453
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10454
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10138
10455
  },
10139
10456
  required: ["value", "label"]
10140
10457
  },
10141
10458
  friction_score: {
10142
- type: "object",
10459
+ type: "assessment",
10460
+ scale_id: "pain_5",
10143
10461
  description: "Friction (1 = effortless, 5 = very painful)",
10144
10462
  properties: {
10145
10463
  value: { type: "number", description: "The numeric value, used for computation." },
10146
10464
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10147
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10148
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10465
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10466
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10149
10467
  },
10150
10468
  required: ["value", "label"]
10151
10469
  },
@@ -10158,7 +10476,7 @@ var UPG_PROPERTY_SCHEMA = {
10158
10476
  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`.' },
10159
10477
  frequency_count: { type: "number", description: "Exact count of runs in the period. Pairs with `frequency_period`." },
10160
10478
  frequency_period: { type: "string", description: "Recurrence period (ISO-8601 `Duration`, e.g. `'P7D'`)" },
10161
- frequency_rating: { type: "string", enum: ["rare", "occasional", "regular", "constant", "other"], description: "Qualitative tier. Use when an exact rate is unknown." },
10479
+ frequency_rating: { type: "string", enum: ["constant", "regular", "occasional", "rare", "other"], description: "Qualitative tier. Use when an exact rate is unknown." },
10162
10480
  operational_owner: { type: "string", description: "Operationally accountable team or individual" },
10163
10481
  capacity_constraint: { type: "string", description: "Bottleneck or scaling constraint" },
10164
10482
  automation_level: { type: "string", enum: ["manual", "assisted", "automated"], description: "How much runs without human intervention" }
@@ -10169,13 +10487,14 @@ var UPG_PROPERTY_SCHEMA = {
10169
10487
  criticality: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Criticality to the business model" },
10170
10488
  owner: { type: "string", description: "Accountable person or team" },
10171
10489
  scarcity_risk: {
10172
- type: "object",
10490
+ type: "assessment",
10491
+ scale_id: "severity_5",
10173
10492
  description: "Replacement difficulty",
10174
10493
  properties: {
10175
10494
  value: { type: "number", description: "The numeric value, used for computation." },
10176
10495
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10177
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10178
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10496
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10497
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10179
10498
  },
10180
10499
  required: ["value", "label"]
10181
10500
  },
@@ -10209,7 +10528,6 @@ var UPG_PROPERTY_SCHEMA = {
10209
10528
  // LearningProperties: Result of an experiment. Evidence that updates a hypothesis.
10210
10529
  learning: {
10211
10530
  result: { type: "string", description: "Summary" },
10212
- 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.' },
10213
10531
  result_value: { type: "number", description: "Measured value of the result" },
10214
10532
  result_unit: { type: "string", description: 'Unit (e.g. "%" or "ms")' },
10215
10533
  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`." },
@@ -10265,25 +10583,27 @@ var UPG_PROPERTY_SCHEMA = {
10265
10583
  // MarketTrendProperties: Market trend.
10266
10584
  market_trend: {
10267
10585
  relevance: {
10268
- type: "object",
10586
+ type: "assessment",
10587
+ scale_id: "importance_5",
10269
10588
  description: "Relevance to our product (1 = low, 5 = critical).",
10270
10589
  properties: {
10271
10590
  value: { type: "number", description: "The numeric value, used for computation." },
10272
10591
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10273
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10274
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10592
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10593
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10275
10594
  },
10276
10595
  required: ["value", "label"]
10277
10596
  },
10278
10597
  timeframe: { type: "string", description: 'Expected peak or mainstream window. @example "12-18 months", "2027"' },
10279
10598
  impact: {
10280
- type: "object",
10599
+ type: "assessment",
10600
+ scale_id: "impact_5",
10281
10601
  description: "Expected impact on our market or category.",
10282
10602
  properties: {
10283
10603
  value: { type: "number", description: "The numeric value, used for computation." },
10284
10604
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10285
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10286
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10605
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10606
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10287
10607
  },
10288
10608
  required: ["value", "label"]
10289
10609
  },
@@ -10394,35 +10714,38 @@ var UPG_PROPERTY_SCHEMA = {
10394
10714
  valence: { type: "string", enum: ["pain", "gap", "constraint"], description: "What kind of experience: pain (friction), gap (unmet), constraint (limitation)" },
10395
10715
  maturity: { type: "string", enum: ["raw", "validated", "prioritized"], description: "How mature is this need in our understanding" },
10396
10716
  frequency: {
10397
- type: "object",
10717
+ type: "assessment",
10718
+ scale_id: "frequency_5",
10398
10719
  description: "How often the user encounters this need (1 = rarely, 5 = constantly)",
10399
10720
  properties: {
10400
10721
  value: { type: "number", description: "The numeric value, used for computation." },
10401
10722
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10402
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10403
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10723
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10724
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10404
10725
  },
10405
10726
  required: ["value", "label"]
10406
10727
  },
10407
10728
  severity: {
10408
- type: "object",
10729
+ type: "assessment",
10730
+ scale_id: "severity_5",
10409
10731
  description: "How painful or disruptive the need is when unaddressed (1 = minor, 5 = critical)",
10410
10732
  properties: {
10411
10733
  value: { type: "number", description: "The numeric value, used for computation." },
10412
10734
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10413
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10414
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10735
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10736
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10415
10737
  },
10416
10738
  required: ["value", "label"]
10417
10739
  },
10418
10740
  importance: {
10419
- type: "object",
10741
+ type: "assessment",
10742
+ scale_id: "importance_5",
10420
10743
  description: "How important resolving this need is to the user (1 = low, 5 = critical)",
10421
10744
  properties: {
10422
10745
  value: { type: "number", description: "The numeric value, used for computation." },
10423
10746
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10424
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10425
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10747
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10748
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10426
10749
  },
10427
10750
  required: ["value", "label"]
10428
10751
  },
@@ -10443,13 +10766,14 @@ var UPG_PROPERTY_SCHEMA = {
10443
10766
  statement: { type: "string", description: "The objection as stated by the source" },
10444
10767
  source_type: { type: "string", enum: ["prospect", "competitor", "internal", "market"], description: "Where this objection originated" },
10445
10768
  severity: {
10446
- type: "object",
10769
+ type: "assessment",
10770
+ scale_id: "severity_5",
10447
10771
  description: "How frequently or strongly this objection comes up (1-5)",
10448
10772
  properties: {
10449
10773
  value: { type: "number", description: "The numeric value, used for computation." },
10450
10774
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10451
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10452
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10775
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10776
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10453
10777
  },
10454
10778
  required: ["value", "label"]
10455
10779
  },
@@ -10468,7 +10792,7 @@ var UPG_PROPERTY_SCHEMA = {
10468
10792
  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." },
10469
10793
  is_highlighted: { type: "boolean", description: "Flagged as a highlight. Absorbed from the deprecated Highlight entity." },
10470
10794
  highlight_tag: { type: "string", description: 'Free-form highlight type tag. @example "pain", "delight", "behaviour", "moment of clarity"' },
10471
- 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." }
10795
+ 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." }
10472
10796
  },
10473
10797
  // OnCallRotationProperties: On-call rotation.
10474
10798
  on_call_rotation: {
@@ -10480,35 +10804,38 @@ var UPG_PROPERTY_SCHEMA = {
10480
10804
  // OpportunityProperties: A problem worth solving, grounded in user need and business value
10481
10805
  opportunity: {
10482
10806
  reach: {
10483
- type: "object",
10807
+ type: "assessment",
10808
+ scale_id: "reach_5",
10484
10809
  description: "How many users experience this problem",
10485
10810
  properties: {
10486
10811
  value: { type: "number", description: "The numeric value, used for computation." },
10487
10812
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10488
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10489
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10813
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10814
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10490
10815
  },
10491
10816
  required: ["value", "label"]
10492
10817
  },
10493
10818
  frequency: {
10494
- type: "object",
10819
+ type: "assessment",
10820
+ scale_id: "frequency_5",
10495
10821
  description: "How often users experience this problem",
10496
10822
  properties: {
10497
10823
  value: { type: "number", description: "The numeric value, used for computation." },
10498
10824
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10499
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10500
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10825
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10826
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10501
10827
  },
10502
10828
  required: ["value", "label"]
10503
10829
  },
10504
10830
  pain: {
10505
- type: "object",
10831
+ type: "assessment",
10832
+ scale_id: "pain_5",
10506
10833
  description: "How painful it is when unaddressed",
10507
10834
  properties: {
10508
10835
  value: { type: "number", description: "The numeric value, used for computation." },
10509
10836
  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)" }
10837
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10838
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10512
10839
  },
10513
10840
  required: ["value", "label"]
10514
10841
  },
@@ -10529,17 +10856,18 @@ var UPG_PROPERTY_SCHEMA = {
10529
10856
  current_state: { type: "string", description: "Baseline or latest read" },
10530
10857
  evidence_summary: { type: "string", description: "Evidence gathered so far (quotes, metrics, studies)" },
10531
10858
  confidence: {
10532
- type: "object",
10859
+ type: "assessment",
10860
+ scale_id: "confidence_5",
10533
10861
  description: "Confidence this is the right outcome to pursue",
10534
10862
  properties: {
10535
10863
  value: { type: "number", description: "The numeric value, used for computation." },
10536
10864
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10537
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10538
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10865
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10866
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10539
10867
  },
10540
10868
  required: ["value", "label"]
10541
10869
  },
10542
- outcome_status: { type: "string", description: "Current lifecycle phase. Free-form until an outcome lifecycle is defined in `grammar/lifecycles.ts`." }
10870
+ 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`." }
10543
10871
  },
10544
10872
  // ParticipantProperties: Research participant.
10545
10873
  participant: {
@@ -10570,13 +10898,14 @@ var UPG_PROPERTY_SCHEMA = {
10570
10898
  value_exchange: { type: "string", description: "What each party gives and receives" },
10571
10899
  partnership_tier: { type: "string", enum: ["strategic", "preferred", "standard", "trial"], description: "Commercial significance. Drives attention and exec sponsorship." },
10572
10900
  risk_level: {
10573
- type: "object",
10901
+ type: "assessment",
10902
+ scale_id: "severity_5",
10574
10903
  description: "Exposure if the partnership fails (concentration risk, IP risk, etc.)",
10575
10904
  properties: {
10576
10905
  value: { type: "number", description: "The numeric value, used for computation." },
10577
10906
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10578
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10579
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10907
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10908
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10580
10909
  },
10581
10910
  required: ["value", "label"]
10582
10911
  },
@@ -10617,7 +10946,7 @@ var UPG_PROPERTY_SCHEMA = {
10617
10946
  },
10618
10947
  // PipelineSalesProperties: Sales pipeline.
10619
10948
  pipeline_sales: {
10620
- pipeline_type: { type: "string", description: 'Classification of the pipeline (e.g. "new business", "expansion")' },
10949
+ pipeline_type: { type: "string", enum: ["new_business", "expansion", "renewal", "partner", "other"], description: "Classification of the pipeline (UPG-579 Option B)." },
10621
10950
  avg_cycle_days: { type: "number", description: "Average days from opportunity creation to close" }
10622
10951
  },
10623
10952
  // PipelineStageProperties: Pipeline stage.
@@ -10659,7 +10988,7 @@ var UPG_PROPERTY_SCHEMA = {
10659
10988
  // PricingStrategyProperties: Pricing strategy.
10660
10989
  pricing_strategy: {
10661
10990
  strategy_type: { type: "string", enum: ["value_based", "cost_plus", "competitor_based", "penetration", "freemium"], description: "Pricing methodology used" },
10662
- review_cadence: { type: "string", description: "How often pricing is reviewed" },
10991
+ 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." },
10663
10992
  last_change: { type: "string", description: "Date of the last pricing change (ISO format)" }
10664
10993
  },
10665
10994
  // PricingTierProperties: PricingTier: the central pricing concept (the plan a customer buys).
@@ -10768,13 +11097,14 @@ var UPG_PROPERTY_SCHEMA = {
10768
11097
  rebuttal: {
10769
11098
  statement: { type: "string", description: "The counter-argument or response to an objection" },
10770
11099
  strength: {
10771
- type: "object",
11100
+ type: "assessment",
11101
+ scale_id: "scale_5",
10772
11102
  description: "How convincing this rebuttal is (1-5)",
10773
11103
  properties: {
10774
11104
  value: { type: "number", description: "The numeric value, used for computation." },
10775
11105
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10776
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10777
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
11106
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
11107
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10778
11108
  },
10779
11109
  required: ["value", "label"]
10780
11110
  },
@@ -10867,24 +11197,26 @@ var UPG_PROPERTY_SCHEMA = {
10867
11197
  risk: {
10868
11198
  risk_type: { type: "string", enum: ["technical", "business", "legal", "security", "operational"], description: "Domain the risk belongs to" },
10869
11199
  probability: {
10870
- type: "object",
11200
+ type: "assessment",
11201
+ scale_id: "confidence_5",
10871
11202
  description: "How likely this risk is to materialise (1 = unlikely, 5 = near certain)",
10872
11203
  properties: {
10873
11204
  value: { type: "number", description: "The numeric value, used for computation." },
10874
11205
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10875
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10876
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
11206
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
11207
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10877
11208
  },
10878
11209
  required: ["value", "label"]
10879
11210
  },
10880
11211
  impact: {
10881
- type: "object",
11212
+ type: "assessment",
11213
+ scale_id: "impact_5",
10882
11214
  description: "Severity of consequences if the risk materialises (1 = negligible, 5 = catastrophic)",
10883
11215
  properties: {
10884
11216
  value: { type: "number", description: "The numeric value, used for computation." },
10885
11217
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10886
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10887
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
11218
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
11219
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10888
11220
  },
10889
11221
  required: ["value", "label"]
10890
11222
  },
@@ -10905,7 +11237,18 @@ var UPG_PROPERTY_SCHEMA = {
10905
11237
  quarter: { type: "string", description: 'Planning quarter (e.g. "Q2 2026"). Pair with `start_date`/`target_date` for precise scheduling.' },
10906
11238
  priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Importance against other items" },
10907
11239
  item_status: { type: "string", enum: ["planned", "in_progress", "shipped", "deferred"], description: "Status. `deferred` = explicitly pushed to a later period." },
10908
- confidence: { type: "string", enum: ["high", "medium", "low"], description: "Delivery confidence within the planned period." },
11240
+ confidence: {
11241
+ type: "assessment",
11242
+ scale_id: "confidence_5",
11243
+ description: "Delivery confidence within the planned period (UPGAssessment on `confidence_5`).",
11244
+ properties: {
11245
+ value: { type: "number", description: "The numeric value, used for computation." },
11246
+ label: { type: "string", description: "The qualitative label (what the assessor meant)." },
11247
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
11248
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
11249
+ },
11250
+ required: ["value", "label"]
11251
+ },
10909
11252
  start_date: { type: "string", description: "ISO date work begins. More precise than `quarter` for continuous planning." },
10910
11253
  target_date: { type: "string", description: "ISO date completion is expected. For shipped items, the actual completion date." }
10911
11254
  },
@@ -10919,13 +11262,14 @@ var UPG_PROPERTY_SCHEMA = {
10919
11262
  // RootCauseProperties: Underlying architectural or systemic issue.
10920
11263
  root_cause: {
10921
11264
  severity: {
10922
- type: "object",
11265
+ type: "assessment",
11266
+ scale_id: "severity_5",
10923
11267
  description: "Severity (1 = minor, 5 = critical)",
10924
11268
  properties: {
10925
11269
  value: { type: "number", description: "The numeric value, used for computation." },
10926
11270
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10927
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10928
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
11271
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
11272
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10929
11273
  },
10930
11274
  required: ["value", "label"]
10931
11275
  },
@@ -10975,13 +11319,14 @@ var UPG_PROPERTY_SCHEMA = {
10975
11319
  security_control: {
10976
11320
  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." },
10977
11321
  effectiveness: {
10978
- type: "object",
11322
+ type: "assessment",
11323
+ scale_id: "impact_5",
10979
11324
  description: "Mitigation effectiveness (1 = minimal, 5 = fully effective)",
10980
11325
  properties: {
10981
11326
  value: { type: "number", description: "The numeric value, used for computation." },
10982
11327
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10983
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10984
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
11328
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
11329
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10985
11330
  },
10986
11331
  required: ["value", "label"]
10987
11332
  },
@@ -10992,7 +11337,7 @@ var UPG_PROPERTY_SCHEMA = {
10992
11337
  // SecurityPolicyProperties: Security policy.
10993
11338
  security_policy: {
10994
11339
  scope: { type: "string", description: "Systems or processes covered" },
10995
- review_cadence: { type: "string", description: 'Review cadence (e.g. "annually", "quarterly")' },
11340
+ 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." },
10996
11341
  version: { type: "string", description: "Version" },
10997
11342
  effective_date: { type: "string", description: "ISO effective date" },
10998
11343
  url: { type: "string", description: "Policy document URL" },
@@ -11063,17 +11408,18 @@ var UPG_PROPERTY_SCHEMA = {
11063
11408
  },
11064
11409
  // SkillProperties: Skill entity.
11065
11410
  skill: {
11066
- skill_category: { type: "string", description: 'Category of the skill (e.g. "technical", "leadership", "design")' },
11411
+ skill_category: { type: "string", enum: ["technical", "leadership", "design", "product", "business", "operations", "other"], description: "Category of the skill (UPG-579 Option B)." },
11067
11412
  proficiency_levels: { type: "string[]", description: "Description of proficiency levels for this skill" },
11068
11413
  domain: { type: "string", description: 'Problem domain the skill applies to (e.g. "payments", "accessibility")' },
11069
11414
  rarity: {
11070
- type: "object",
11415
+ type: "assessment",
11416
+ scale_id: "scale_5",
11071
11417
  description: "How scarce this skill is in the labour market this team hires from",
11072
11418
  properties: {
11073
11419
  value: { type: "number", description: "The numeric value, used for computation." },
11074
11420
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
11075
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
11076
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
11421
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
11422
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
11077
11423
  },
11078
11424
  required: ["value", "label"]
11079
11425
  },
@@ -11089,46 +11435,50 @@ var UPG_PROPERTY_SCHEMA = {
11089
11435
  solution: {
11090
11436
  timeline: { type: "string", description: "Estimated delivery or target timeline" },
11091
11437
  reach: {
11092
- type: "object",
11438
+ type: "assessment",
11439
+ scale_id: "reach_5",
11093
11440
  description: "How many users this solution reaches (1 = few, 5 = most)",
11094
11441
  properties: {
11095
11442
  value: { type: "number", description: "The numeric value, used for computation." },
11096
11443
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
11097
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
11098
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
11444
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
11445
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
11099
11446
  },
11100
11447
  required: ["value", "label"]
11101
11448
  },
11102
11449
  impact: {
11103
- type: "object",
11450
+ type: "assessment",
11451
+ scale_id: "impact_5",
11104
11452
  description: "Expected impact on the target outcome (1 = minimal, 5 = transformative)",
11105
11453
  properties: {
11106
11454
  value: { type: "number", description: "The numeric value, used for computation." },
11107
11455
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
11108
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
11109
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
11456
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
11457
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
11110
11458
  },
11111
11459
  required: ["value", "label"]
11112
11460
  },
11113
11461
  confidence: {
11114
- type: "object",
11462
+ type: "assessment",
11463
+ scale_id: "confidence_5",
11115
11464
  description: "How confident the team is in this solution (1 = speculative, 5 = proven)",
11116
11465
  properties: {
11117
11466
  value: { type: "number", description: "The numeric value, used for computation." },
11118
11467
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
11119
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
11120
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
11468
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
11469
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
11121
11470
  },
11122
11471
  required: ["value", "label"]
11123
11472
  },
11124
11473
  effort: {
11125
- type: "object",
11474
+ type: "assessment",
11475
+ scale_id: "effort_5",
11126
11476
  description: "Level of effort required to implement (1 = trivial, 5 = very large)",
11127
11477
  properties: {
11128
11478
  value: { type: "number", description: "The numeric value, used for computation." },
11129
11479
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
11130
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
11131
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
11480
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
11481
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
11132
11482
  },
11133
11483
  required: ["value", "label"]
11134
11484
  },
@@ -11138,24 +11488,26 @@ var UPG_PROPERTY_SCHEMA = {
11138
11488
  stakeholder: {
11139
11489
  stakeholder_type: { type: "string", enum: ["internal", "external", "investor", "regulator"], description: "Relationship of the stakeholder to the organisation" },
11140
11490
  influence: {
11141
- type: "object",
11491
+ type: "assessment",
11492
+ scale_id: "importance_5",
11142
11493
  description: "How much influence this stakeholder has over decisions (1 = minimal, 5 = decisive)",
11143
11494
  properties: {
11144
11495
  value: { type: "number", description: "The numeric value, used for computation." },
11145
11496
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
11146
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
11147
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
11497
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
11498
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
11148
11499
  },
11149
11500
  required: ["value", "label"]
11150
11501
  },
11151
11502
  interest: {
11152
- type: "object",
11503
+ type: "assessment",
11504
+ scale_id: "importance_5",
11153
11505
  description: "How much interest this stakeholder has in the outcome (1 = passive, 5 = deeply invested)",
11154
11506
  properties: {
11155
11507
  value: { type: "number", description: "The numeric value, used for computation." },
11156
11508
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
11157
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
11158
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
11509
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
11510
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
11159
11511
  },
11160
11512
  required: ["value", "label"]
11161
11513
  }
@@ -11167,19 +11519,6 @@ var UPG_PROPERTY_SCHEMA = {
11167
11519
  risks_flagged: { type: "number", description: "Number of risks flagged in this report" },
11168
11520
  blockers: { type: "string", description: "Description of current blockers" }
11169
11521
  },
11170
- // UserStoryProperties: "As X, I want Y so Z" templated promise, a user story (UCS pattern P5).
11171
- user_story: {
11172
- as_a: { type: "string", description: '"As a [persona], \u2026". Free-text persona name or slug ref.' },
11173
- i_want_to: { type: "string", description: "Capability or action the persona wants." },
11174
- so_that: { type: "string", description: "Benefit or outcome the persona expects." },
11175
- text: { type: "string", description: "Free-form story text. Used as a single-line rendered view." }
11176
- },
11177
- // StoryTaskProperties
11178
- story_task: {
11179
- estimate: { type: "string", description: "@deprecated Use TaskProperties.estimate" },
11180
- effort: { type: "number", description: "@deprecated Use TaskProperties.effort (string form)" },
11181
- priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "@deprecated Use TaskProperties.priority" }
11182
- },
11183
11522
  // StrategicPillarProperties: StrategicPillar entity. Durable multi-year direction the product commits to.
11184
11523
  strategic_pillar: {
11185
11524
  owner: { type: "string", description: "Owning person or team" },
@@ -11213,19 +11552,20 @@ var UPG_PROPERTY_SCHEMA = {
11213
11552
  support_ticket: {
11214
11553
  ticket_type: { type: "string", enum: ["bug", "question", "feature_request"], description: "Classification of the ticket" },
11215
11554
  severity: {
11216
- type: "object",
11555
+ type: "assessment",
11556
+ scale_id: "severity_5",
11217
11557
  description: "Impact severity of the issue (1 = cosmetic, 5 = service down)",
11218
11558
  properties: {
11219
11559
  value: { type: "number", description: "The numeric value, used for computation." },
11220
11560
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
11221
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
11222
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
11561
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
11562
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
11223
11563
  },
11224
11564
  required: ["value", "label"]
11225
11565
  },
11226
11566
  resolution: { type: "string", description: "Description of how the ticket was resolved" },
11227
11567
  source: { type: "string", description: 'Where the ticket originated (e.g. "email", "in-app", "chat")' },
11228
- signal_sentiment: { type: "string", enum: ["positive", "negative", "neutral", "mixed"], description: "Detected sentiment of the customer's message" },
11568
+ signal_sentiment: { type: "string", enum: ["positive", "neutral", "negative", "mixed"], description: "Detected sentiment of the customer's message" },
11229
11569
  signal_channel: { type: "string", description: "Channel through which the signal was received" },
11230
11570
  signal_urgency: { type: "string", enum: ["low", "medium", "high", "critical"], description: "Perceived urgency of the customer's request" }
11231
11571
  },
@@ -11246,19 +11586,20 @@ var UPG_PROPERTY_SCHEMA = {
11246
11586
  symptom_description: { type: "string", description: "Plain-language description of observed behaviour. Primary content of the entity." },
11247
11587
  first_observed_at: { type: "string", description: "ISO timestamp first observed in the wild. Pairs with `frequency_rating` and `reproducibility` for triage." },
11248
11588
  severity: {
11249
- type: "object",
11589
+ type: "assessment",
11590
+ scale_id: "severity_5",
11250
11591
  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`.",
11251
11592
  properties: {
11252
11593
  value: { type: "number", description: "The numeric value, used for computation." },
11253
11594
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
11254
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
11255
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
11595
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
11596
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
11256
11597
  },
11257
11598
  required: ["value", "label"]
11258
11599
  },
11259
11600
  frequency_count: { type: "number", description: "Exact observation count in the period. Pairs with `frequency_period` for a precise rate." },
11260
11601
  frequency_period: { type: "string", description: "Recurrence period (ISO-8601 `Duration`). @example 'P7D' (per week), 'P1D' (per day), 'PT1H' (per hour)" },
11261
- 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`." },
11602
+ 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`." },
11262
11603
  affected_users_estimate: { type: "number", description: "Approximate count of users affected. Snapshot estimate." },
11263
11604
  reproducibility: { type: "string", enum: ["always", "frequent", "intermittent", "rare", "once"], description: "Reproduction reliability" },
11264
11605
  steps_to_reproduce: { type: "string", description: "Steps to reproduce" }
@@ -11271,7 +11612,6 @@ var UPG_PROPERTY_SCHEMA = {
11271
11612
  },
11272
11613
  // TaskProperties: Task: a discrete unit of work, smaller than a story.
11273
11614
  task: {
11274
- 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`." },
11275
11615
  assignee: { type: "string", description: "Assigned person" },
11276
11616
  effort: { type: "string", description: 'Effort estimate (e.g. "2h", "1d", "3 points"). Use a consistent unit within your team.' },
11277
11617
  priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Relative importance against other tasks" },
@@ -11296,24 +11636,26 @@ var UPG_PROPERTY_SCHEMA = {
11296
11636
  technical_debt_item: {
11297
11637
  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." },
11298
11638
  severity: {
11299
- type: "object",
11639
+ type: "assessment",
11640
+ scale_id: "severity_5",
11300
11641
  description: "Severity on system or team. Requires human evaluation.",
11301
11642
  properties: {
11302
11643
  value: { type: "number", description: "The numeric value, used for computation." },
11303
11644
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
11304
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
11305
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
11645
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
11646
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
11306
11647
  },
11307
11648
  required: ["value", "label"]
11308
11649
  },
11309
11650
  effort_to_fix: {
11310
- type: "object",
11651
+ type: "assessment",
11652
+ scale_id: "effort_5",
11311
11653
  description: "Estimated effort to resolve. Requires team knowledge of the codebase.",
11312
11654
  properties: {
11313
11655
  value: { type: "number", description: "The numeric value, used for computation." },
11314
11656
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
11315
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
11316
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
11657
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
11658
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
11317
11659
  },
11318
11660
  required: ["value", "label"]
11319
11661
  },
@@ -11396,24 +11738,26 @@ var UPG_PROPERTY_SCHEMA = {
11396
11738
  threat: {
11397
11739
  category: { type: "string", description: 'Attack or threat scenario. @example "injection", "misconfiguration", "social engineering", "supply chain"' },
11398
11740
  likelihood: {
11399
- type: "object",
11741
+ type: "assessment",
11742
+ scale_id: "confidence_5",
11400
11743
  description: "Likelihood (1 = theoretical, 5 = actively exploited). @example value 5 for a known, exploitable, commonly targeted pattern",
11401
11744
  properties: {
11402
11745
  value: { type: "number", description: "The numeric value, used for computation." },
11403
11746
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
11404
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
11405
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
11747
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
11748
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
11406
11749
  },
11407
11750
  required: ["value", "label"]
11408
11751
  },
11409
11752
  impact: {
11410
- type: "object",
11753
+ type: "assessment",
11754
+ scale_id: "impact_5",
11411
11755
  description: "Impact (1 = minimal, 5 = catastrophic). @example value 5 for threats that expose PII or cause complete service compromise",
11412
11756
  properties: {
11413
11757
  value: { type: "number", description: "The numeric value, used for computation." },
11414
11758
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
11415
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
11416
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
11759
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
11760
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
11417
11761
  },
11418
11762
  required: ["value", "label"]
11419
11763
  },
@@ -11471,7 +11815,7 @@ var UPG_PROPERTY_SCHEMA = {
11471
11815
  // UserAdvisoryBoardProperties: User advisory board.
11472
11816
  user_advisory_board: {
11473
11817
  member_count: { type: "number", description: "Number of members on the board" },
11474
- meeting_cadence: { type: "string", description: 'How often the board meets (e.g. "monthly", "quarterly")' },
11818
+ 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." },
11475
11819
  board_focus: { type: "string", description: "Primary topic or area the board advises on" }
11476
11820
  },
11477
11821
  // UserFlowProperties: User flow.
@@ -11487,6 +11831,13 @@ var UPG_PROPERTY_SCHEMA = {
11487
11831
  journey_type: { type: "string", enum: ["current_state", "future_state", "day_in_the_life", "service_blueprint"], description: "Maps current or future state" },
11488
11832
  scenario: { type: "string", description: "Scenario context" }
11489
11833
  },
11834
+ // UserStoryProperties: "As X, I want Y so Z" templated promise on a user story (UCS pattern P5).
11835
+ user_story: {
11836
+ as_a: { type: "string", description: '"As a [persona], \u2026". Free-text persona name or slug ref.' },
11837
+ i_want_to: { type: "string", description: "Capability or action the persona wants." },
11838
+ so_that: { type: "string", description: "Benefit or outcome the persona expects." },
11839
+ text: { type: "string", description: "Free-form story text. Used as a single-line rendered view." }
11840
+ },
11490
11841
  // ValueObjectProperties: DDD value object.
11491
11842
  value_object: {
11492
11843
  immutable: { type: "boolean", description: "Whether immutable" },
@@ -11501,7 +11852,7 @@ var UPG_PROPERTY_SCHEMA = {
11501
11852
  },
11502
11853
  // ValueStreamProperties: ValueStream entity.
11503
11854
  value_stream: {
11504
- stream_stage: { type: "string", description: "Current stage in the value delivery pipeline" },
11855
+ stream_stage: { type: "string", enum: ["discovery", "definition", "build", "delivery", "operation", "other"], description: "Current stage in the value delivery pipeline (UPG-579 Option B)." },
11505
11856
  lead_time: { type: "string", description: 'End-to-end lead time. @example "2 weeks"' },
11506
11857
  throughput: { type: "string", description: 'Throughput measure. @example "5 features/sprint"' }
11507
11858
  },
@@ -11521,7 +11872,18 @@ var UPG_PROPERTY_SCHEMA = {
11521
11872
  vulnerability: {
11522
11873
  cve_id: { type: "string", description: 'CVE identifier from the National Vulnerability Database. @example "CVE-2024-1234"' },
11523
11874
  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)" },
11524
- 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' },
11875
+ severity: {
11876
+ type: "assessment",
11877
+ scale_id: "severity_5",
11878
+ 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)",
11879
+ properties: {
11880
+ value: { type: "number", description: "The numeric value, used for computation." },
11881
+ label: { type: "string", description: "The qualitative label (what the assessor meant)." },
11882
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
11883
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
11884
+ },
11885
+ required: ["value", "label"]
11886
+ },
11525
11887
  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' },
11526
11888
  affected_component: { type: "string", description: 'Affected component, library, or system. @example "lodash", "openssl", "login service"' },
11527
11889
  affected_package: { type: "string", description: 'Affected package with version. More precise than `affected_component`. @example "lodash@4.17.20", "openssl@1.1.1q"' },
@@ -16145,17 +16507,6 @@ function seqStep(order, phase, entity_types, prompt_hint, options) {
16145
16507
  ...options?.next_sequence_on_gap ? { next_sequence_on_gap: options.next_sequence_on_gap } : {}
16146
16508
  };
16147
16509
  }
16148
- function domainGuideStep(domain_id, phase, name, prompt_hint, options) {
16149
- return {
16150
- kind: "domain_guide",
16151
- order: 1,
16152
- phase,
16153
- name,
16154
- prompt_hint,
16155
- domain_id,
16156
- ...options?.next_sequence_on_gap ? { next_sequence_on_gap: options.next_sequence_on_gap } : {}
16157
- };
16158
- }
16159
16510
  var STRATEGY_OUTCOMES_PLAYBOOK = {
16160
16511
  id: "playbook:strategy-outcomes",
16161
16512
  name: "Strategy & Outcomes",
@@ -16163,6 +16514,7 @@ var STRATEGY_OUTCOMES_PLAYBOOK = {
16163
16514
  description: "Cascade vision through themes, outcomes, objectives, key results, and the bets you are making to get there.",
16164
16515
  region: "strategy_outcomes",
16165
16516
  is_canonical: true,
16517
+ related_framework_ids: ["okr-framework", "three-horizons", "north-star-metric", "metrics-tree", "wardley-map"],
16166
16518
  target_anchor_entity: "objective",
16167
16519
  creation_sequence: [
16168
16520
  seqStep(
@@ -16206,7 +16558,7 @@ var STRATEGY_OUTCOMES_PLAYBOOK = {
16206
16558
  "Assumptions & Decisions",
16207
16559
  ["assumption", "decision"],
16208
16560
  "Capture the bets you are making (assumptions) and the choices you have ratified (decisions). These guard the work against silent drift.",
16209
- { next_sequence_on_gap: "playbook:discovery-validation-hypothesis-cycle" }
16561
+ { next_sequence_on_gap: "playbook:discovery-research-validation" }
16210
16562
  )
16211
16563
  ]
16212
16564
  };
@@ -16217,6 +16569,7 @@ var USERS_NEEDS_PLAYBOOK = {
16217
16569
  description: "Bootstrap personas, jobs, needs, and desired outcomes: the user side of every product graph.",
16218
16570
  region: "users_needs",
16219
16571
  is_canonical: true,
16572
+ related_framework_ids: ["persona-canvas", "empathy-map", "value-proposition-canvas", "kano-model"],
16220
16573
  target_anchor_entity: "persona",
16221
16574
  creation_sequence: [
16222
16575
  seqStep(
@@ -16270,6 +16623,7 @@ var DISCOVERY_RESEARCH_VALIDATION_PLAYBOOK = {
16270
16623
  description: "Evidence-first discovery sequence: plan \u2192 recruit \u2192 observe \u2192 synthesize \u2192 insight \u2192 opportunity \u2192 hypothesis \u2192 test.",
16271
16624
  region: "discovery_research_validation",
16272
16625
  is_canonical: true,
16626
+ related_framework_ids: ["double-diamond", "opportunity-solution-tree", "build-measure-learn", "hypothesis-board"],
16273
16627
  target_anchor_entity: "opportunity",
16274
16628
  creation_sequence: [
16275
16629
  seqStep(
@@ -16322,23 +16676,6 @@ var DISCOVERY_RESEARCH_VALIDATION_PLAYBOOK = {
16322
16676
  )
16323
16677
  ]
16324
16678
  };
16325
- var DISCOVERY_VALIDATION_HYPOTHESIS_PLAYBOOK = {
16326
- id: "playbook:discovery-validation-hypothesis-cycle",
16327
- name: "Hypothesis Validation",
16328
- version: "0.1.0",
16329
- description: "Tight hypothesis \u2192 experiment \u2192 evidence \u2192 learning loop. Run after research has surfaced an opportunity.",
16330
- region: "discovery_research_validation",
16331
- framework_id: "build-measure-learn",
16332
- target_anchor_entity: "hypothesis",
16333
- creation_sequence: [
16334
- domainGuideStep(
16335
- "validation",
16336
- "Validation",
16337
- "Frame & test",
16338
- "Run the validation creation sequence: hypothesis, experiment, evidence, learning."
16339
- )
16340
- ]
16341
- };
16342
16679
  var MARKET_COMPETITIVE_PLAYBOOK = {
16343
16680
  id: "playbook:market-competitive",
16344
16681
  name: "Market & Competitive",
@@ -16346,6 +16683,7 @@ var MARKET_COMPETITIVE_PLAYBOOK = {
16346
16683
  description: "Map the competitive landscape: define the market, name the alternatives, read trends, find moves.",
16347
16684
  region: "market_competitive",
16348
16685
  is_canonical: true,
16686
+ related_framework_ids: ["porter-five-forces", "swot-analysis", "value-chain-analysis", "wardley-map", "bullseye-framework"],
16349
16687
  target_anchor_entity: "competitor",
16350
16688
  creation_sequence: [
16351
16689
  seqStep(
@@ -16393,6 +16731,7 @@ var EXPERIENCE_DESIGN_BRAND_PLAYBOOK = {
16393
16731
  description: "Journey-first design sequence: research \u2192 personas \u2192 journeys \u2192 define \u2192 ideate \u2192 prototype \u2192 test \u2192 design system.",
16394
16732
  region: "experience_design_brand",
16395
16733
  is_canonical: true,
16734
+ related_framework_ids: ["double-diamond", "atomic-design", "story-map"],
16396
16735
  target_anchor_entity: "user_journey",
16397
16736
  creation_sequence: [
16398
16737
  seqStep(
@@ -16445,54 +16784,6 @@ var EXPERIENCE_DESIGN_BRAND_PLAYBOOK = {
16445
16784
  )
16446
16785
  ]
16447
16786
  };
16448
- var EXPERIENCE_UX_DOMAIN_ONLY_PLAYBOOK = {
16449
- id: "playbook:experience-ux-domain-only",
16450
- name: "UX Design (compact)",
16451
- version: "0.1.0",
16452
- description: "Compact UX-only path. Quick when research and design system are managed separately.",
16453
- region: "experience_design_brand",
16454
- target_anchor_entity: "user_journey",
16455
- creation_sequence: [
16456
- domainGuideStep(
16457
- "ux_design",
16458
- "UX",
16459
- "Journey to screen",
16460
- "Run the ux_design creation sequence: journey, steps, screens, flows, wireframes, prototypes."
16461
- )
16462
- ]
16463
- };
16464
- var EXPERIENCE_DESIGN_SYSTEM_PLAYBOOK = {
16465
- id: "playbook:experience-design-system",
16466
- name: "Design System",
16467
- version: "0.1.0",
16468
- description: "Codify the shared design language: tokens, components, patterns, guidelines.",
16469
- region: "experience_design_brand",
16470
- creation_sequence: [
16471
- domainGuideStep(
16472
- "design_system",
16473
- "Design System",
16474
- "System foundations",
16475
- "Run the design_system creation sequence: tokens, components, patterns, guidelines.",
16476
- { next_sequence_on_gap: "playbook:experience-ux-domain-only" }
16477
- )
16478
- ]
16479
- };
16480
- var EXPERIENCE_CONTENT_PLAYBOOK = {
16481
- id: "playbook:experience-content",
16482
- name: "Content Strategy",
16483
- version: "0.1.0",
16484
- description: "Plan what to publish: strategy, themes, calendar, individual pieces tied to audience and channels.",
16485
- region: "experience_design_brand",
16486
- creation_sequence: [
16487
- domainGuideStep(
16488
- "content",
16489
- "Content",
16490
- "Content plan",
16491
- "Run the content creation sequence: strategy, themes, calendar, pieces.",
16492
- { next_sequence_on_gap: "playbook:business-growth-funnel" }
16493
- )
16494
- ]
16495
- };
16496
16787
  var PRODUCT_DELIVERY_PLAYBOOK = {
16497
16788
  id: "playbook:product-delivery",
16498
16789
  name: "Product Delivery",
@@ -16500,6 +16791,7 @@ var PRODUCT_DELIVERY_PLAYBOOK = {
16500
16791
  description: "Shape what gets built: features, epics, user stories, releases, milestones, and the dependencies between them.",
16501
16792
  region: "product_delivery",
16502
16793
  is_canonical: true,
16794
+ related_framework_ids: ["story-map", "rice-scoring", "moscow", "now-next-later", "shape-up", "kano-model"],
16503
16795
  target_anchor_entity: "feature",
16504
16796
  creation_sequence: [
16505
16797
  seqStep(
@@ -16540,22 +16832,6 @@ var PRODUCT_DELIVERY_PLAYBOOK = {
16540
16832
  )
16541
16833
  ]
16542
16834
  };
16543
- var PRODUCT_FEEDBACK_SYNTHESIS_PLAYBOOK = {
16544
- id: "playbook:product-feedback-synthesis",
16545
- name: "Feedback Synthesis",
16546
- version: "0.1.0",
16547
- description: "Capture and cluster qualitative signal: feedback items, themes, NPS, support tickets.",
16548
- region: "product_delivery",
16549
- creation_sequence: [
16550
- domainGuideStep(
16551
- "feedback",
16552
- "Feedback",
16553
- "Signal capture",
16554
- "Run the feedback creation sequence: items, themes, NPS, support data.",
16555
- { next_sequence_on_gap: "playbook:discovery-validation-hypothesis-cycle" }
16556
- )
16557
- ]
16558
- };
16559
16835
  var ENGINEERING_PLATFORM_PLAYBOOK = {
16560
16836
  id: "playbook:engineering-platform",
16561
16837
  name: "Engineering & Platform",
@@ -16563,6 +16839,7 @@ var ENGINEERING_PLATFORM_PLAYBOOK = {
16563
16839
  description: "Architecture-first engineering sequence: architecture \u2192 services \u2192 data \u2192 build \u2192 test \u2192 deploy \u2192 monitor \u2192 security.",
16564
16840
  region: "engineering_platform",
16565
16841
  is_canonical: true,
16842
+ related_framework_ids: ["c4-model", "adr-log", "dora-metrics"],
16566
16843
  target_anchor_entity: "service",
16567
16844
  creation_sequence: [
16568
16845
  seqStep(
@@ -16615,21 +16892,6 @@ var ENGINEERING_PLATFORM_PLAYBOOK = {
16615
16892
  )
16616
16893
  ]
16617
16894
  };
16618
- var ENGINEERING_ARCHITECTURE_ONLY_PLAYBOOK = {
16619
- id: "playbook:engineering-architecture-only",
16620
- name: "Architecture (compact)",
16621
- version: "0.1.0",
16622
- description: "Compact architecture-only path. Quick when build/deploy/security are managed separately.",
16623
- region: "engineering_platform",
16624
- creation_sequence: [
16625
- domainGuideStep(
16626
- "engineering",
16627
- "Engineering",
16628
- "System shape",
16629
- "Run the engineering creation sequence: bounded contexts, services, data, decisions."
16630
- )
16631
- ]
16632
- };
16633
16895
  var BUSINESS_GTM_GROWTH_PLAYBOOK = {
16634
16896
  id: "playbook:business-gtm-growth",
16635
16897
  name: "Business, GTM & Growth",
@@ -16637,6 +16899,7 @@ var BUSINESS_GTM_GROWTH_PLAYBOOK = {
16637
16899
  description: "Viability-first business sequence: value prop \u2192 customer \u2192 revenue \u2192 costs \u2192 unit economics \u2192 GTM \u2192 competitive advantage.",
16638
16900
  region: "business_gtm_growth",
16639
16901
  is_canonical: true,
16902
+ related_framework_ids: ["business-model-canvas", "pirate-metrics-aarrr", "north-star-metric", "product-led-growth-framework", "marketing-mix-4ps"],
16640
16903
  target_anchor_entity: "value_proposition",
16641
16904
  creation_sequence: [
16642
16905
  seqStep(
@@ -16683,70 +16946,6 @@ var BUSINESS_GTM_GROWTH_PLAYBOOK = {
16683
16946
  )
16684
16947
  ]
16685
16948
  };
16686
- var BUSINESS_MODEL_BMC_PLAYBOOK = {
16687
- id: "playbook:business-model-bmc",
16688
- name: "Business Model (BMC)",
16689
- version: "0.1.0",
16690
- description: "Design the business model with Business Model Canvas: value props, customer segments, revenue streams, cost structure.",
16691
- region: "business_gtm_growth",
16692
- framework_id: "business-model-canvas",
16693
- creation_sequence: [
16694
- domainGuideStep(
16695
- "business_model",
16696
- "Business",
16697
- "Model canvas",
16698
- "Run the business_model creation sequence: value props, segments, revenue, costs.",
16699
- { next_sequence_on_gap: "playbook:business-pricing" }
16700
- )
16701
- ]
16702
- };
16703
- var BUSINESS_PRICING_PLAYBOOK = {
16704
- id: "playbook:business-pricing",
16705
- name: "Pricing",
16706
- version: "0.1.0",
16707
- description: "Design the revenue engine: pricing strategy, tiers, trials, paywalls, discounts.",
16708
- region: "business_gtm_growth",
16709
- creation_sequence: [
16710
- domainGuideStep(
16711
- "pricing",
16712
- "Revenue",
16713
- "Pricing model",
16714
- "Run the pricing creation sequence: strategy, tiers, discounts, trial, paywall."
16715
- )
16716
- ]
16717
- };
16718
- var BUSINESS_GROWTH_FUNNEL_PLAYBOOK = {
16719
- id: "playbook:business-growth-funnel",
16720
- name: "Growth Funnel (AARRR)",
16721
- version: "0.1.0",
16722
- description: "Map the growth engine using Pirate Metrics: funnels, channels, campaigns, loops, cohorts.",
16723
- region: "business_gtm_growth",
16724
- framework_id: "pirate-metrics-aarrr",
16725
- creation_sequence: [
16726
- domainGuideStep(
16727
- "growth",
16728
- "Growth",
16729
- "Funnel model",
16730
- "Run the growth creation sequence: funnel, channels, campaigns, cohorts."
16731
- )
16732
- ]
16733
- };
16734
- var BUSINESS_MARKETING_PLAYBOOK = {
16735
- id: "playbook:business-marketing",
16736
- name: "Marketing",
16737
- version: "0.1.0",
16738
- description: "Shape the demand engine: positioning, messaging, SEO keywords, campaigns, channels.",
16739
- region: "business_gtm_growth",
16740
- creation_sequence: [
16741
- domainGuideStep(
16742
- "marketing",
16743
- "Marketing",
16744
- "Demand engine",
16745
- "Run the marketing creation sequence: positioning, messaging, SEO keywords, campaigns, channels.",
16746
- { next_sequence_on_gap: "playbook:experience-content" }
16747
- )
16748
- ]
16749
- };
16750
16949
  var BUSINESS_GROWTH_METRIC_DRIVEN_PLAYBOOK = {
16751
16950
  id: "playbook:business-growth-metric-driven",
16752
16951
  name: "Metric-Driven Growth",
@@ -16856,6 +17055,7 @@ var ANALYTICS_DATA_PLAYBOOK = {
16856
17055
  description: "Bootstrap the measurement plane: sources, schemas, pipelines, metrics, dashboards, and the rules that keep them honest.",
16857
17056
  region: "analytics_data",
16858
17057
  is_canonical: true,
17058
+ related_framework_ids: ["metrics-tree", "north-star-metric", "pirate-metrics-aarrr", "dora-metrics"],
16859
17059
  target_anchor_entity: "metric",
16860
17060
  creation_sequence: [
16861
17061
  seqStep(
@@ -16903,6 +17103,7 @@ var OPERATIONS_QUALITY_PLAYBOOK = {
16903
17103
  description: "The operational backbone: pipelines, monitoring, incident response, security, quality gates, compliance, support. Specialised playbooks cover team rituals.",
16904
17104
  region: "operations_quality",
16905
17105
  is_canonical: true,
17106
+ related_framework_ids: ["raci-matrix", "retrospective", "team-health-check", "raid-log"],
16906
17107
  target_anchor_entity: "incident",
16907
17108
  creation_sequence: [
16908
17109
  seqStep(
@@ -16949,21 +17150,6 @@ var OPERATIONS_QUALITY_PLAYBOOK = {
16949
17150
  )
16950
17151
  ]
16951
17152
  };
16952
- var OPERATIONS_TEAM_RITUALS_PLAYBOOK = {
16953
- id: "playbook:operations-team-rituals",
16954
- name: "Team & Rituals",
16955
- version: "0.1.0",
16956
- description: "Capture how the team works: retrospectives, roles, rituals, working agreements, decisions.",
16957
- region: "operations_quality",
16958
- creation_sequence: [
16959
- domainGuideStep(
16960
- "team_org",
16961
- "Team",
16962
- "Team rhythm",
16963
- "Run the team_org creation sequence: retrospectives, roles, rituals, working agreements."
16964
- )
16965
- ]
16966
- };
16967
17153
  var UPG_PLAYBOOKS = [
16968
17154
  // Region 1 - strategy_outcomes
16969
17155
  STRATEGY_OUTCOMES_PLAYBOOK,
@@ -16971,33 +17157,22 @@ var UPG_PLAYBOOKS = [
16971
17157
  USERS_NEEDS_PLAYBOOK,
16972
17158
  // Region 3 - discovery_research_validation
16973
17159
  DISCOVERY_RESEARCH_VALIDATION_PLAYBOOK,
16974
- DISCOVERY_VALIDATION_HYPOTHESIS_PLAYBOOK,
16975
17160
  // Region 4 - market_competitive
16976
17161
  MARKET_COMPETITIVE_PLAYBOOK,
16977
17162
  // Region 5 - experience_design_brand
16978
17163
  EXPERIENCE_DESIGN_BRAND_PLAYBOOK,
16979
- EXPERIENCE_UX_DOMAIN_ONLY_PLAYBOOK,
16980
- EXPERIENCE_DESIGN_SYSTEM_PLAYBOOK,
16981
- EXPERIENCE_CONTENT_PLAYBOOK,
16982
17164
  // Region 6 - product_delivery
16983
17165
  PRODUCT_DELIVERY_PLAYBOOK,
16984
- PRODUCT_FEEDBACK_SYNTHESIS_PLAYBOOK,
16985
17166
  // Region 7 - engineering_platform
16986
17167
  ENGINEERING_PLATFORM_PLAYBOOK,
16987
- ENGINEERING_ARCHITECTURE_ONLY_PLAYBOOK,
16988
17168
  // Region 8 - business_gtm_growth
16989
17169
  BUSINESS_GTM_GROWTH_PLAYBOOK,
16990
- BUSINESS_MODEL_BMC_PLAYBOOK,
16991
- BUSINESS_PRICING_PLAYBOOK,
16992
- BUSINESS_GROWTH_FUNNEL_PLAYBOOK,
16993
- BUSINESS_MARKETING_PLAYBOOK,
16994
17170
  BUSINESS_GROWTH_METRIC_DRIVEN_PLAYBOOK,
16995
17171
  BUSINESS_MARKETING_AUDIENCE_FIRST_PLAYBOOK,
16996
17172
  // Region 9 - analytics_data
16997
17173
  ANALYTICS_DATA_PLAYBOOK,
16998
17174
  // Region 10 - operations_quality
16999
- OPERATIONS_QUALITY_PLAYBOOK,
17000
- OPERATIONS_TEAM_RITUALS_PLAYBOOK
17175
+ OPERATIONS_QUALITY_PLAYBOOK
17001
17176
  ];
17002
17177
 
17003
17178
  // src/step-sequence.ts
@@ -23808,7 +23983,7 @@ function isCanonical(text) {
23808
23983
  }
23809
23984
 
23810
23985
  // src/index.ts
23811
- var UPG_VERSION = "0.7.3";
23986
+ var UPG_VERSION = "0.8.0";
23812
23987
  var UPG_FORMAT_VERSION = "0.4.0";
23813
23988
  var MARKDOWN_FORMAT_VERSION = "0.1";
23814
23989
  var UPG_TYPES = getTypes();
@@ -23874,28 +24049,18 @@ var UPG_META_COUNT = UPG_ENTITY_META.length;
23874
24049
  // Annotate the CommonJS export names for ESM import in node:
23875
24050
  0 && (module.exports = {
23876
24051
  ANALYTICS_DATA_PLAYBOOK,
23877
- BUSINESS_GROWTH_FUNNEL_PLAYBOOK,
23878
24052
  BUSINESS_GROWTH_METRIC_DRIVEN_PLAYBOOK,
23879
24053
  BUSINESS_GTM_GROWTH_PLAYBOOK,
23880
24054
  BUSINESS_MARKETING_AUDIENCE_FIRST_PLAYBOOK,
23881
- BUSINESS_MARKETING_PLAYBOOK,
23882
- BUSINESS_MODEL_BMC_PLAYBOOK,
23883
- BUSINESS_PRICING_PLAYBOOK,
23884
24055
  DISCOVERY_RESEARCH_VALIDATION_PLAYBOOK,
23885
- DISCOVERY_VALIDATION_HYPOTHESIS_PLAYBOOK,
23886
- ENGINEERING_ARCHITECTURE_ONLY_PLAYBOOK,
23887
24056
  ENGINEERING_PLATFORM_PLAYBOOK,
23888
- EXPERIENCE_CONTENT_PLAYBOOK,
23889
24057
  EXPERIENCE_DESIGN_BRAND_PLAYBOOK,
23890
- EXPERIENCE_DESIGN_SYSTEM_PLAYBOOK,
23891
- EXPERIENCE_UX_DOMAIN_ONLY_PLAYBOOK,
23892
24058
  LEGACY_PRODUCT_STAGES,
23893
24059
  MARKDOWN_FORMAT_VERSION,
23894
24060
  MARKET_COMPETITIVE_PLAYBOOK,
23895
24061
  OPERATIONS_QUALITY_PLAYBOOK,
23896
- OPERATIONS_TEAM_RITUALS_PLAYBOOK,
23897
24062
  PRODUCT_DELIVERY_PLAYBOOK,
23898
- PRODUCT_FEEDBACK_SYNTHESIS_PLAYBOOK,
24063
+ PROPERTY_SCALE_MAP,
23899
24064
  REFLECT_MODES,
23900
24065
  STRATEGY_OUTCOMES_PLAYBOOK,
23901
24066
  UPG_ACTIVE_TYPES,
@@ -23996,6 +24161,7 @@ var UPG_META_COUNT = UPG_ENTITY_META.length;
23996
24161
  getMigrationMap,
23997
24162
  getPlaybookById,
23998
24163
  getPlaybooksForRegion,
24164
+ getPropertiesForScale,
23999
24165
  getPropertyDefaultScale,
24000
24166
  getPropertyMigrations,
24001
24167
  getPropertySchema,