@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.js CHANGED
@@ -6159,20 +6159,42 @@ var PROPERTY_SCALE_MAP = {
6159
6159
  // discovery, users, feedback
6160
6160
  // ── Severity ─────────────────────────────────────────────────────────────
6161
6161
  severity: "severity_5",
6162
- // users, engineering, ai, gtm, customer-success
6162
+ // users, engineering, ai, gtm, customer-success, security, accessibility
6163
6163
  severity_of_finding: "severity_5",
6164
6164
  // validation/experiment_run
6165
+ bug_severity: "severity_5",
6166
+ // product-spec/bug (UPG-579 Option C collapse)
6167
+ risk_level: "severity_5",
6168
+ // compliance/risk (UPG-579 Option B)
6169
+ scarcity_risk: "severity_5",
6170
+ // market-intelligence (UPG-579 Option B)
6165
6171
  // ── Pain ─────────────────────────────────────────────────────────────────
6166
6172
  pain: "pain_5",
6167
6173
  // discovery
6174
+ pain_score: "pain_5",
6175
+ // user (UPG-579 Option B)
6176
+ friction_score: "pain_5",
6177
+ // growth/ux (UPG-579 Option B)
6168
6178
  // ── Impact ───────────────────────────────────────────────────────────────
6169
6179
  impact: "impact_5",
6170
6180
  // discovery, market, security, compliance
6171
6181
  projected_impact: "impact_5",
6172
6182
  // validation/experiment_plan
6183
+ revenue_impact: "impact_5",
6184
+ // sales/business-model (UPG-579 Option B)
6185
+ effectiveness: "impact_5",
6186
+ // security/marketing (UPG-579 Option B)
6187
+ opportunity_score: "impact_5",
6188
+ // discovery/opportunity (UPG-579 Option B)
6173
6189
  // ── Confidence ───────────────────────────────────────────────────────────
6174
6190
  confidence: "confidence_5",
6175
6191
  // discovery, validation, sales, product-spec
6192
+ current_confidence: "confidence_5",
6193
+ // validation/hypothesis (UPG-579 Option B)
6194
+ likelihood: "confidence_5",
6195
+ // market/risk (UPG-579 Option B)
6196
+ probability: "confidence_5",
6197
+ // sales/forecast (UPG-579 Option B)
6176
6198
  // ── Effort ───────────────────────────────────────────────────────────────
6177
6199
  effort: "effort_5",
6178
6200
  // discovery
@@ -6180,17 +6202,35 @@ var PROPERTY_SCALE_MAP = {
6180
6202
  // feedback
6181
6203
  effort_to_fix: "effort_5",
6182
6204
  // engineering
6205
+ cost_estimate: "effort_5",
6206
+ // validation/experiment_plan (UPG-579 Option B)
6183
6207
  // ── Importance ───────────────────────────────────────────────────────────
6184
6208
  importance: "importance_5",
6185
6209
  // users
6210
+ influence: "importance_5",
6211
+ // team-org/stakeholder (UPG-579 Option B)
6212
+ interest: "importance_5",
6213
+ // team-org/stakeholder (UPG-579 Option B)
6214
+ relevance: "importance_5",
6215
+ // market/content (UPG-579 Option B)
6216
+ weight: "importance_5",
6217
+ // validation/evidence (UPG-579 Option B)
6186
6218
  // ── Satisfaction ─────────────────────────────────────────────────────────
6187
- current_satisfaction: "satisfaction_5"
6219
+ current_satisfaction: "satisfaction_5",
6188
6220
  // users
6221
+ emotion_score: "satisfaction_5"
6222
+ // ux-design/customer-success journey (UPG-579 Option B)
6223
+ // Intentionally NOT mapped (resolve to the generic scale_5):
6224
+ // rarity : VRIO distinctiveness; no canonical named scale fits.
6225
+ // strength : deprecated (validation/evidence; superseded by weight).
6189
6226
  };
6190
6227
  var DEFAULT_SCALE_ID = "scale_5";
6191
6228
  function getPropertyDefaultScale(_entityType, propertyName) {
6192
6229
  return PROPERTY_SCALE_MAP[propertyName] ?? DEFAULT_SCALE_ID;
6193
6230
  }
6231
+ function getPropertiesForScale(scaleId) {
6232
+ return Object.entries(PROPERTY_SCALE_MAP).filter(([, id]) => id === scaleId).map(([property]) => property);
6233
+ }
6194
6234
 
6195
6235
  // src/grammar/enum-scales.ts
6196
6236
  var UPG_ENUM_SCALES = {
@@ -6276,6 +6316,159 @@ var UPG_ENUM_SCALES = {
6276
6316
  { value: "warning", label: "Warning", description: "Soft signal: should consider and address, but can override with justification." },
6277
6317
  { value: "guideline", label: "Guideline", description: "Recommendation: encouraged and expected in most cases, but not enforced." }
6278
6318
  ]
6319
+ },
6320
+ // ── ProxyConfidence ─────────────────────────────────────────────────
6321
+ ProxyConfidence: {
6322
+ id: "ProxyConfidence",
6323
+ label: "Proxy confidence",
6324
+ description: "How strongly a proxy metric predicts the direct measure it stands in for.",
6325
+ tone_direction: "high-is-good",
6326
+ values: [
6327
+ { value: "strong", label: "Strong", description: "Tracks the direct measure closely; a reliable stand-in." },
6328
+ { value: "moderate", label: "Moderate", description: "Correlates with the direct measure but with meaningful slippage." },
6329
+ { value: "weak", label: "Weak", description: "Loosely related; use with caution and corroborate." }
6330
+ ]
6331
+ },
6332
+ // ── CauseConfidence ─────────────────────────────────────────────────
6333
+ CauseConfidence: {
6334
+ id: "CauseConfidence",
6335
+ label: "Cause confidence",
6336
+ description: "Maturity of a root-cause determination during incident debugging: how far a proposed cause has been validated.",
6337
+ tone_direction: "high-is-good",
6338
+ values: [
6339
+ { value: "hypothesised", label: "Hypothesised", description: "A proposed cause, not yet tested against evidence." },
6340
+ { value: "likely", label: "Likely", description: "Supported by evidence but not conclusively proven." },
6341
+ { value: "confirmed", label: "Confirmed", description: "Verified as the cause; reproduced or otherwise established." }
6342
+ ]
6343
+ },
6344
+ // ── ComfortLevel ────────────────────────────────────────────────────
6345
+ ComfortLevel: {
6346
+ id: "ComfortLevel",
6347
+ label: "Comfort level",
6348
+ description: "A person's comfort with a tool, technology, or practice. Closed set so personas compare on the same axis across products.",
6349
+ tone_direction: "high-is-good",
6350
+ values: [
6351
+ { value: "low", label: "Low", description: "Little or no familiarity; needs guidance to proceed." },
6352
+ { value: "medium", label: "Medium", description: "Functional, everyday competence." },
6353
+ { value: "high", label: "High", description: "Confident, fluent use without assistance." },
6354
+ { value: "expert", label: "Expert", description: "Deep mastery; can teach others or extend the tool." },
6355
+ { value: "other", label: "Other", description: "A comfort profile not captured by the above tiers." }
6356
+ ]
6357
+ },
6358
+ // ── LogLevel ────────────────────────────────────────────────────────
6359
+ LogLevel: {
6360
+ id: "LogLevel",
6361
+ label: "Log level",
6362
+ 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).",
6363
+ tone_direction: "low-is-good",
6364
+ values: [
6365
+ { value: "critical", label: "Critical", description: "Page immediately; the signal is service-affecting." },
6366
+ { value: "warning", label: "Warning", description: "Needs attention soon; not yet service-affecting." },
6367
+ { value: "info", label: "Info", description: "Informational; no action required." }
6368
+ ]
6369
+ },
6370
+ // ── IncidentSeverity ────────────────────────────────────────────────
6371
+ IncidentSeverity: {
6372
+ id: "IncidentSeverity",
6373
+ label: "Incident severity",
6374
+ description: "Paging-tier classification of an incident, driving escalation and response process. Distinct from user-impact severity_5 and from LogLevel.",
6375
+ tone_direction: "low-is-good",
6376
+ values: [
6377
+ { value: "sev1", label: "SEV1", description: "Critical outage; full response, executive-visible." },
6378
+ { value: "sev2", label: "SEV2", description: "Major degradation; urgent response." },
6379
+ { value: "sev3", label: "SEV3", description: "Minor or partial impact; handled within hours." },
6380
+ { value: "sev4", label: "SEV4", description: "Negligible impact; routine handling." }
6381
+ ]
6382
+ },
6383
+ // ── SignalSentiment ─────────────────────────────────────────────────
6384
+ SignalSentiment: {
6385
+ id: "SignalSentiment",
6386
+ label: "Signal sentiment",
6387
+ description: "Sentiment polarity of an inbound signal (feedback, support, customer).",
6388
+ tone_direction: "high-is-good",
6389
+ values: [
6390
+ { value: "positive", label: "Positive", description: "Favourable signal; satisfaction or advocacy." },
6391
+ { value: "neutral", label: "Neutral", description: "No clear positive or negative lean." },
6392
+ { value: "negative", label: "Negative", description: "Unfavourable signal; dissatisfaction or risk." },
6393
+ { value: "mixed", label: "Mixed", description: "Contains both positive and negative elements." }
6394
+ ]
6395
+ },
6396
+ // ── MaturityLevel ───────────────────────────────────────────────────
6397
+ MaturityLevel: {
6398
+ id: "MaturityLevel",
6399
+ label: "Maturity level",
6400
+ description: "Capability or process maturity on the CMMI ladder.",
6401
+ tone_direction: "high-is-good",
6402
+ values: [
6403
+ { value: "initial", label: "Initial", description: "Ad hoc and unpredictable; little process." },
6404
+ { value: "developing", label: "Developing", description: "Basic process emerging but inconsistent." },
6405
+ { value: "defined", label: "Defined", description: "Documented, standardised process in place." },
6406
+ { value: "managed", label: "Managed", description: "Measured and controlled against objectives." },
6407
+ { value: "optimizing", label: "Optimizing", description: "Continuous, data-driven improvement." }
6408
+ ]
6409
+ },
6410
+ // ── ConformanceLevel ────────────────────────────────────────────────
6411
+ ConformanceLevel: {
6412
+ id: "ConformanceLevel",
6413
+ label: "Conformance level",
6414
+ description: "WCAG accessibility conformance level.",
6415
+ tone_direction: "high-is-good",
6416
+ values: [
6417
+ { value: "A", label: "A", description: "Minimum conformance; essential barriers removed." },
6418
+ { value: "AA", label: "AA", description: "Addresses the most common barriers; the usual legal target." },
6419
+ { value: "AAA", label: "AAA", description: "Highest level; not achievable for all content." }
6420
+ ]
6421
+ },
6422
+ // ── DataSensitivity ─────────────────────────────────────────────────
6423
+ DataSensitivity: {
6424
+ id: "DataSensitivity",
6425
+ label: "Data sensitivity",
6426
+ description: "Data classification tier governing handling and access.",
6427
+ tone_direction: "neutral",
6428
+ values: [
6429
+ { value: "public", label: "Public", description: "No restriction; safe to disclose openly." },
6430
+ { value: "internal", label: "Internal", description: "For internal use; not for external release." },
6431
+ { value: "confidential", label: "Confidential", description: "Sensitive; restricted to a need-to-know basis." },
6432
+ { value: "restricted", label: "Restricted", description: "Highly sensitive; strict controls and auditing." }
6433
+ ]
6434
+ },
6435
+ // ── DifficultyLevel ─────────────────────────────────────────────────
6436
+ DifficultyLevel: {
6437
+ id: "DifficultyLevel",
6438
+ label: "Difficulty level",
6439
+ description: "Learner difficulty tier for educational content.",
6440
+ tone_direction: "neutral",
6441
+ values: [
6442
+ { value: "beginner", label: "Beginner", description: "No prior knowledge assumed." },
6443
+ { value: "intermediate", label: "Intermediate", description: "Assumes working familiarity with the basics." },
6444
+ { value: "advanced", label: "Advanced", description: "Assumes deep, expert-level background." }
6445
+ ]
6446
+ },
6447
+ // ── FrequencyRating ─────────────────────────────────────────────────
6448
+ FrequencyRating: {
6449
+ id: "FrequencyRating",
6450
+ label: "Frequency rating",
6451
+ description: "Qualitative how-often rating. Distinct from the numeric frequency_5 scale and from Cadence calendar tiers.",
6452
+ tone_direction: "neutral",
6453
+ values: [
6454
+ { value: "constant", label: "Constant", description: "Effectively always; continuous occurrence." },
6455
+ { value: "regular", label: "Regular", description: "Happens on a predictable, recurring basis." },
6456
+ { value: "occasional", label: "Occasional", description: "Happens sometimes, without a fixed pattern." },
6457
+ { value: "rare", label: "Rare", description: "Happens infrequently." },
6458
+ { value: "other", label: "Other", description: "A frequency not captured by the above tiers." }
6459
+ ]
6460
+ },
6461
+ // ── EvidenceDirection ───────────────────────────────────────────────
6462
+ EvidenceDirection: {
6463
+ id: "EvidenceDirection",
6464
+ label: "Evidence direction",
6465
+ description: "Direction of evidence relative to a claim. Distinct from confidence_impact (strengthens/weakens) per the UPG-579 polysemy verdicts.",
6466
+ tone_direction: "neutral",
6467
+ values: [
6468
+ { value: "supports", label: "Supports", description: "The evidence backs the claim." },
6469
+ { value: "refutes", label: "Refutes", description: "The evidence contradicts the claim." },
6470
+ { value: "neutral", label: "Neutral", description: "The evidence is inconclusive either way." }
6471
+ ]
6279
6472
  }
6280
6473
  };
6281
6474
  function getEnumScale(name) {
@@ -6622,6 +6815,41 @@ function getDeprecatedTypes() {
6622
6815
  return deprecated;
6623
6816
  }
6624
6817
  var UPG_PROPERTY_MIGRATIONS = {
6818
+ // ── v0.8.0: UPG-574 deprecated-property removal pass ───────────────────
6819
+ //
6820
+ // The seven properties tagged `@deprecated since v0.4.0` that survived the
6821
+ // v0.5.0 hygiene pass are removed from the spec in v0.8.0 (a breaking
6822
+ // release). Five of the seven already carry a migration:
6823
+ // - `task.task_status` / `bug.bug_status` lift to `UPGBaseNode.status`
6824
+ // (see `UPG_PROPERTY_MIGRATIONS['0.4.0']`, values identical).
6825
+ // - `learning.metric` drops in favour of the `learning_observed_on_metric`
6826
+ // edge (see `UPG_PROPERTY_MIGRATIONS['0.5.0']`).
6827
+ // The two remaining property surfaces are migrated here:
6828
+ // - `evidence.strength` (simple `strong | moderate | weak` enum) is
6829
+ // dropped in favour of `weight: UPGAssessment` (scale `weight_5pt`).
6830
+ // Authors carrying the legacy key should copy the value to `weight`
6831
+ // before applying this migration: `strong → 5`, `moderate → 3`,
6832
+ // `weak → 1`, with the old word preserved in `weight.label`.
6833
+ // - `story_task.estimate` / `.effort` / `.priority` drop. `story_task`
6834
+ // itself is deprecated (`UPG_MIGRATIONS['0.4.0']` renames it to the
6835
+ // canonical `task`); the type rename copies every property verbatim,
6836
+ // so the values survive on `task` (`TaskProperties.estimate` /
6837
+ // `.effort` / `.priority`, all live). This rule removes the residue
6838
+ // from any node still typed `story_task` at migration time.
6839
+ "0.8.0": [
6840
+ {
6841
+ kind: "drop_props",
6842
+ type: "evidence",
6843
+ drop_props: ["strength"],
6844
+ 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."
6845
+ },
6846
+ {
6847
+ kind: "drop_props",
6848
+ type: "story_task",
6849
+ drop_props: ["estimate", "effort", "priority"],
6850
+ 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.'
6851
+ }
6852
+ ],
6625
6853
  // ── v0.5.0: UPG-509 deprecation hygiene pass ───────────────────────────
6626
6854
  //
6627
6855
  // Properties tagged `@deprecated since="0.4.0" removeIn="0.5.0"` (and the
@@ -8425,7 +8653,18 @@ var UPG_PROPERTY_SCHEMA = {
8425
8653
  },
8426
8654
  // A11yIssueProperties: Accessibility issue.
8427
8655
  a11y_issue: {
8428
- 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." },
8656
+ severity: {
8657
+ type: "assessment",
8658
+ scale_id: "severity_5",
8659
+ 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`.",
8660
+ properties: {
8661
+ value: { type: "number", description: "The numeric value, used for computation." },
8662
+ label: { type: "string", description: "The qualitative label (what the assessor meant)." },
8663
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
8664
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
8665
+ },
8666
+ required: ["value", "label"]
8667
+ },
8429
8668
  wcag_criterion: { type: "string", description: 'WCAG success criterion violated (e.g. "1.1.1", "2.4.7")' },
8430
8669
  rule_id: { type: "string", description: "Identifier of the rule that flagged the issue" },
8431
8670
  help_url: { type: "string", description: "URL to documentation explaining the issue and how to fix it" },
@@ -8482,7 +8721,18 @@ var UPG_PROPERTY_SCHEMA = {
8482
8721
  affinity_cluster: {
8483
8722
  theme: { type: "string", description: "Emergent theme label" },
8484
8723
  child_observation_count: { type: "number", description: "Observations in this cluster" },
8485
- confidence: { type: "string", enum: ["high", "medium", "low"], description: "Confidence in the theme's validity" }
8724
+ confidence: {
8725
+ type: "assessment",
8726
+ scale_id: "confidence_5",
8727
+ description: "Confidence in the theme's validity (UPGAssessment on `confidence_5`).",
8728
+ properties: {
8729
+ value: { type: "number", description: "The numeric value, used for computation." },
8730
+ label: { type: "string", description: "The qualitative label (what the assessor meant)." },
8731
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
8732
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
8733
+ },
8734
+ required: ["value", "label"]
8735
+ }
8486
8736
  },
8487
8737
  // AgentDefinitionProperties: Agent definition.
8488
8738
  agent_definition: {
@@ -8616,7 +8866,7 @@ var UPG_PROPERTY_SCHEMA = {
8616
8866
  // AlertRuleProperties: Alert rule.
8617
8867
  alert_rule: {
8618
8868
  condition: { type: "string", description: 'Triggering query or expression. @example "avg(rate(http_errors_total[5m])) > 0.05"' },
8619
- severity: { type: "string", enum: ["critical", "warning", "info"], description: "Routes notification and escalation. `critical` = page immediately. `warning` = notify, don't page. `info` = log only." },
8869
+ 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." },
8620
8870
  notification_channel: { type: "string", description: 'Notification destination. @example "pagerduty:sev1-rotation", "slack:#alerts-low"' },
8621
8871
  evaluation_window: { type: "string", description: 'Required duration the condition holds before firing. Prevents flapping on transient spikes. @example "5m", "15m", "1h"' },
8622
8872
  escalation_policy: { type: "string", description: 'Escalation behaviour on unacknowledged alerts. @example "Escalate to engineering lead after 10 minutes"' }
@@ -8655,16 +8905,28 @@ var UPG_PROPERTY_SCHEMA = {
8655
8905
  },
8656
8906
  // AssumptionProperties: Assumption entity.
8657
8907
  assumption: {
8658
- confidence: { type: "string", enum: ["high", "medium", "low"], description: "Confidence before testing. Independent of whether the assumption is validated (tracked in lifecycle)." },
8908
+ confidence: {
8909
+ type: "assessment",
8910
+ scale_id: "confidence_5",
8911
+ description: "Confidence before testing (UPGAssessment on `confidence_5`). Independent of whether the assumption is validated (tracked in lifecycle).",
8912
+ properties: {
8913
+ value: { type: "number", description: "The numeric value, used for computation." },
8914
+ label: { type: "string", description: "The qualitative label (what the assessor meant)." },
8915
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
8916
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
8917
+ },
8918
+ required: ["value", "label"]
8919
+ },
8659
8920
  validation_method: { type: "string", description: "Validation method, planned or used" },
8660
8921
  risk_level: {
8661
- type: "object",
8922
+ type: "assessment",
8923
+ scale_id: "severity_5",
8662
8924
  description: "Exposure if the assumption turns out wrong",
8663
8925
  properties: {
8664
8926
  value: { type: "number", description: "The numeric value, used for computation." },
8665
8927
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
8666
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
8667
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
8928
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
8929
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
8668
8930
  },
8669
8931
  required: ["value", "label"]
8670
8932
  },
@@ -8775,8 +9037,18 @@ var UPG_PROPERTY_SCHEMA = {
8775
9037
  },
8776
9038
  // BugProperties: Bug report.
8777
9039
  bug: {
8778
- 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." },
8779
- 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`." },
9040
+ bug_severity: {
9041
+ type: "assessment",
9042
+ scale_id: "severity_5",
9043
+ 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`.",
9044
+ properties: {
9045
+ value: { type: "number", description: "The numeric value, used for computation." },
9046
+ label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9047
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9048
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9049
+ },
9050
+ required: ["value", "label"]
9051
+ },
8780
9052
  steps_to_reproduce: { type: "string", description: "Step-by-step reproduction" },
8781
9053
  environment: { type: "string", description: 'Observed environment (e.g. "prod", "staging", "iOS 17.4")' },
8782
9054
  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)." },
@@ -8806,7 +9078,7 @@ var UPG_PROPERTY_SCHEMA = {
8806
9078
  maturity_level: { type: "string", enum: ["initial", "developing", "defined", "managed", "optimizing"], description: "Current maturity" },
8807
9079
  target_maturity: { type: "string", enum: ["initial", "developing", "defined", "managed", "optimizing"], description: "Target maturity" },
8808
9080
  gap: { type: "string", description: "Gap between current and target" },
8809
- 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"' },
9081
+ 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'" },
8810
9082
  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" }
8811
9083
  },
8812
9084
  // CapacityPlanProperties: CapacityPlan entity.
@@ -8819,7 +9091,7 @@ var UPG_PROPERTY_SCHEMA = {
8819
9091
  // CeremonyProperties: Ceremony entity.
8820
9092
  ceremony: {
8821
9093
  ceremony_type: { type: "string", enum: ["standup", "planning", "review", "retro", "sync", "demo", "other"], description: "Kind of recurring meeting" },
8822
- cadence: { type: "string", description: 'How often the ceremony occurs (e.g. "daily", "biweekly")' },
9094
+ 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." },
8823
9095
  duration_minutes: { type: "number", description: "Typical duration of the meeting in minutes" },
8824
9096
  participants: { type: "string", description: "People or roles who attend" }
8825
9097
  },
@@ -8848,9 +9120,9 @@ var UPG_PROPERTY_SCHEMA = {
8848
9120
  category: { type: "string", description: "High-level category of the churn reason" },
8849
9121
  frequency_count: { type: "number", description: "Exact count of times this reason has been cited in `frequency_period`" },
8850
9122
  frequency_period: { type: "string", description: "The recurrence period the count is measured over (ISO-8601 `Duration`, e.g. `'P30D'`)" },
8851
- frequency_rating: { type: "string", enum: ["rare", "occasional", "regular", "constant", "other"], description: "Qualitative frequency tier when an exact count is not known" },
9123
+ frequency_rating: { type: "string", enum: ["constant", "regular", "occasional", "rare", "other"], description: "Qualitative frequency tier when an exact count is not known" },
8852
9124
  contributing_factors: { type: "string[]", description: "Other factors that contributed to the churn" },
8853
- signal_sentiment: { type: "string", enum: ["positive", "negative", "neutral", "mixed"], description: "Detected sentiment of the churn signal" },
9125
+ signal_sentiment: { type: "string", enum: ["positive", "neutral", "negative", "mixed"], description: "Detected sentiment of the churn signal" },
8854
9126
  signal_channel: { type: "string", description: "Channel through which the churn signal was received" },
8855
9127
  signal_urgency: { type: "string", enum: ["low", "medium", "high", "critical"], description: "Urgency of the churn risk" }
8856
9128
  },
@@ -8964,7 +9236,7 @@ var UPG_PROPERTY_SCHEMA = {
8964
9236
  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'`." },
8965
9237
  frequency_count: { type: "number", description: "Exact count in the period. Pairs with `frequency_period`." },
8966
9238
  frequency_period: { type: "string", description: "Recurrence period (ISO-8601 `Duration`, e.g. `'P7D'`)" },
8967
- frequency_rating: { type: "string", enum: ["rare", "occasional", "regular", "constant", "other"], description: "Qualitative rate tier when an exact rate is unknown" }
9239
+ frequency_rating: { type: "string", enum: ["constant", "regular", "occasional", "rare", "other"], description: "Qualitative rate tier when an exact rate is unknown" }
8968
9240
  },
8969
9241
  // ContentPieceProperties: Content piece.
8970
9242
  content_piece: {
@@ -8979,7 +9251,7 @@ var UPG_PROPERTY_SCHEMA = {
8979
9251
  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'`." },
8980
9252
  frequency_count: { type: "number", description: "Exact count of publications in the period. Pairs with `frequency_period`." },
8981
9253
  frequency_period: { type: "string", description: "Recurrence period (ISO-8601 `Duration`, e.g. `'P7D'`)" },
8982
- frequency_rating: { type: "string", enum: ["rare", "occasional", "regular", "constant", "other"], description: "Qualitative rate tier when an exact rate is unknown" }
9254
+ frequency_rating: { type: "string", enum: ["constant", "regular", "occasional", "rare", "other"], description: "Qualitative rate tier when an exact rate is unknown" }
8983
9255
  },
8984
9256
  // ContentThemeProperties: Content theme.
8985
9257
  content_theme: {
@@ -9004,13 +9276,14 @@ var UPG_PROPERTY_SCHEMA = {
9004
9276
  clause_text: { type: "string", description: "Full text of the clause" },
9005
9277
  is_negotiable: { type: "boolean", description: "Whether this clause is open to negotiation" },
9006
9278
  risk_level: {
9007
- type: "object",
9279
+ type: "assessment",
9280
+ scale_id: "severity_5",
9008
9281
  description: "Risk level if the clause is accepted as-is (1 = negligible, 5 = severe exposure)",
9009
9282
  properties: {
9010
9283
  value: { type: "number", description: "The numeric value, used for computation." },
9011
9284
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9012
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9013
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9285
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9286
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9014
9287
  },
9015
9288
  required: ["value", "label"]
9016
9289
  }
@@ -9029,9 +9302,9 @@ var UPG_PROPERTY_SCHEMA = {
9029
9302
  // CustomerFeedbackProperties: Customer feedback.
9030
9303
  customer_feedback: {
9031
9304
  feedback_type: { type: "string", enum: ["survey", "interview", "review", "nps"], description: "How the feedback was collected" },
9032
- sentiment: { type: "string", enum: ["positive", "neutral", "negative"], description: "Overall sentiment of the feedback" },
9305
+ sentiment: { type: "string", enum: ["positive", "neutral", "negative", "mixed"], description: "Overall sentiment of the feedback" },
9033
9306
  verbatim: { type: "string", description: "Exact words from the customer" },
9034
- signal_sentiment: { type: "string", enum: ["positive", "negative", "neutral", "mixed"], description: "Detected sentiment of the underlying signal" },
9307
+ signal_sentiment: { type: "string", enum: ["positive", "neutral", "negative", "mixed"], description: "Detected sentiment of the underlying signal" },
9035
9308
  signal_channel: { type: "string", description: "Channel through which the signal was received" },
9036
9309
  signal_urgency: { type: "string", enum: ["low", "medium", "high", "critical"], description: "Perceived urgency of the feedback" }
9037
9310
  },
@@ -9060,7 +9333,7 @@ var UPG_PROPERTY_SCHEMA = {
9060
9333
  url: { type: "string", description: "URL to the live dashboard" },
9061
9334
  audience: { type: "string", description: "Intended audience for this dashboard" },
9062
9335
  element_count: { type: "number", description: "Number of widgets or panels on the dashboard" },
9063
- refresh_cadence: { type: "string", description: "How often the dashboard data refreshes" },
9336
+ 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." },
9064
9337
  filter_count: { type: "number", description: "Number of user-configurable filters" }
9065
9338
  },
9066
9339
  // DataClassificationProperties: Data classification.
@@ -9120,7 +9393,7 @@ var UPG_PROPERTY_SCHEMA = {
9120
9393
  },
9121
9394
  // DataProductProperties: DataProduct entity.
9122
9395
  data_product: {
9123
- data_product_type: { type: "string", description: 'Classification of the data product (e.g. "report", "dataset", "stream")' },
9396
+ data_product_type: { type: "string", enum: ["report", "dataset", "stream", "api", "ml_feature", "other"], description: "Classification of the data product (UPG-579 Option B)." },
9124
9397
  sla_freshness: { type: "string", description: 'Freshness SLA commitment (e.g. "< 1 hour")' }
9125
9398
  },
9126
9399
  // DataQualityRuleProperties: DataQualityRule entity.
@@ -9137,7 +9410,7 @@ var UPG_PROPERTY_SCHEMA = {
9137
9410
  data_source: {
9138
9411
  source_type: { type: "string", enum: ["database", "api", "event_stream", "warehouse"], description: "Kind of data source" },
9139
9412
  connection_status: { type: "string", enum: ["connected", "disconnected", "error"], description: "Current connection health" },
9140
- refresh_cadence: { type: "string", description: 'How often the data is refreshed (e.g. "hourly", "daily")' }
9413
+ 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." }
9141
9414
  },
9142
9415
  // DatabaseSchemaProperties: Database schema.
9143
9416
  database_schema: {
@@ -9168,7 +9441,7 @@ var UPG_PROPERTY_SCHEMA = {
9168
9441
  },
9169
9442
  // DeliverableProperties: Deliverable.
9170
9443
  deliverable: {
9171
- deliverable_type: { type: "string", description: 'Kind of deliverable (e.g. "document", "prototype", "release")' },
9444
+ deliverable_type: { type: "string", enum: ["document", "prototype", "release", "design", "report", "other"], description: "Kind of deliverable (UPG-579 Option B)." },
9172
9445
  due_date: { type: "string", description: "Due date for the deliverable (ISO format)" },
9173
9446
  deliverable_status: { type: "string", enum: ["not_started", "in_progress", "in_review", "accepted", "rejected"], description: "Current progress status" },
9174
9447
  acceptance_criteria: { type: "string", description: "Criteria that must be met for the deliverable to be accepted" }
@@ -9246,7 +9519,18 @@ var UPG_PROPERTY_SCHEMA = {
9246
9519
  target_domain: { type: "string", enum: ["ux", "visual", "interaction", "content", "accessibility", "other"], description: "Target design discipline" },
9247
9520
  framing: { type: "string", enum: ["how_might_we", "what_if", "why_do", "how_do", "what_prevents", "other"], description: "Question framing template" },
9248
9521
  priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Importance against other backlog questions" },
9249
- confidence: { type: "string", enum: ["high", "medium", "low"], description: "Confidence the question is well-framed. Distinct from confidence in any answer." },
9522
+ confidence: {
9523
+ type: "assessment",
9524
+ scale_id: "confidence_5",
9525
+ description: "Confidence the question is well-framed (UPGAssessment on `confidence_5`). Distinct from confidence in any answer.",
9526
+ properties: {
9527
+ value: { type: "number", description: "The numeric value, used for computation." },
9528
+ label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9529
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9530
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9531
+ },
9532
+ required: ["value", "label"]
9533
+ },
9250
9534
  assumptions: { type: "string[]", description: "Underlying assumptions. Surfaced explicitly so they can be challenged or validated." },
9251
9535
  validation_method: { type: "string", enum: ["interview", "survey", "usability_test", "analytics", "a_b_test", "prototype_test", "literature_review", "other"], description: "Primary validation method" }
9252
9536
  },
@@ -9273,24 +9557,26 @@ var UPG_PROPERTY_SCHEMA = {
9273
9557
  desired_outcome: {
9274
9558
  statement: { type: "string", description: "Outcome statement in the user's words" },
9275
9559
  importance: {
9276
- type: "object",
9560
+ type: "assessment",
9561
+ scale_id: "importance_5",
9277
9562
  description: "How important this outcome is to the user (1 = low, 5 = critical)",
9278
9563
  properties: {
9279
9564
  value: { type: "number", description: "The numeric value, used for computation." },
9280
9565
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9281
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9282
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9566
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9567
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9283
9568
  },
9284
9569
  required: ["value", "label"]
9285
9570
  },
9286
9571
  current_satisfaction: {
9287
- type: "object",
9572
+ type: "assessment",
9573
+ scale_id: "satisfaction_5",
9288
9574
  description: "How satisfied the user currently is with this outcome (1 = very unsatisfied, 5 = fully satisfied)",
9289
9575
  properties: {
9290
9576
  value: { type: "number", description: "The numeric value, used for computation." },
9291
9577
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9292
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9293
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9578
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9579
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9294
9580
  },
9295
9581
  required: ["value", "label"]
9296
9582
  }
@@ -9408,20 +9694,20 @@ var UPG_PROPERTY_SCHEMA = {
9408
9694
  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." },
9409
9695
  direction: { type: "string", enum: ["supports", "refutes", "neutral"], description: "Direction relative to the parent hypothesis." },
9410
9696
  weight: {
9411
- type: "object",
9412
- description: "Strength (UPGAssessment, scale `weight_5pt`).",
9697
+ type: "assessment",
9698
+ scale_id: "importance_5",
9699
+ description: "Strength (UPGAssessment, scale `scale_5`).",
9413
9700
  properties: {
9414
9701
  value: { type: "number", description: "The numeric value, used for computation." },
9415
9702
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9416
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9417
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9703
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9704
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9418
9705
  },
9419
9706
  required: ["value", "label"]
9420
9707
  },
9421
9708
  summary: { type: "string", description: "Plain-English summary." },
9422
9709
  observed_at: { type: "string", description: "ISO date observed." },
9423
- source: { type: "string", description: "Free-text provenance note" },
9424
- 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." }
9710
+ source: { type: "string", description: "Free-text provenance note" }
9425
9711
  },
9426
9712
  // ExperimentProperties: A structured activity designed to test a hypothesis.
9427
9713
  experiment: {
@@ -9438,46 +9724,50 @@ var UPG_PROPERTY_SCHEMA = {
9438
9724
  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." },
9439
9725
  success_criteria: { type: "string", description: 'Plain-English description of "passing"' },
9440
9726
  projected_reach: {
9441
- type: "object",
9727
+ type: "assessment",
9728
+ scale_id: "reach_5",
9442
9729
  description: "Projected reach: how many people the run is expected to touch (UPGAssessment)",
9443
9730
  properties: {
9444
9731
  value: { type: "number", description: "The numeric value, used for computation." },
9445
9732
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9446
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9447
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9733
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9734
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9448
9735
  },
9449
9736
  required: ["value", "label"]
9450
9737
  },
9451
9738
  projected_impact: {
9452
- type: "object",
9739
+ type: "assessment",
9740
+ scale_id: "impact_5",
9453
9741
  description: "Projected impact on the target metric (UPGAssessment)",
9454
9742
  properties: {
9455
9743
  value: { type: "number", description: "The numeric value, used for computation." },
9456
9744
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9457
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9458
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9745
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9746
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9459
9747
  },
9460
9748
  required: ["value", "label"]
9461
9749
  },
9462
9750
  confidence: {
9463
- type: "object",
9464
- description: "Team confidence at plan-time (UPGAssessment, scale `confidence_5pt`)",
9751
+ type: "assessment",
9752
+ scale_id: "confidence_5",
9753
+ description: "Team confidence at plan-time (UPGAssessment, scale `confidence_5`)",
9465
9754
  properties: {
9466
9755
  value: { type: "number", description: "The numeric value, used for computation." },
9467
9756
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9468
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9469
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9757
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9758
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9470
9759
  },
9471
9760
  required: ["value", "label"]
9472
9761
  },
9473
9762
  cost_estimate: {
9474
- type: "object",
9763
+ type: "assessment",
9764
+ scale_id: "effort_5",
9475
9765
  description: "Cost estimate at plan-time (UPGAssessment)",
9476
9766
  properties: {
9477
9767
  value: { type: "number", description: "The numeric value, used for computation." },
9478
9768
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9479
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9480
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9769
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9770
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9481
9771
  },
9482
9772
  required: ["value", "label"]
9483
9773
  },
@@ -9491,13 +9781,14 @@ var UPG_PROPERTY_SCHEMA = {
9491
9781
  actual_reach: { type: "number", description: "Observed reach: how many people the run actually touched" },
9492
9782
  outcome_summary: { type: "string", description: "Plain-English outcome" },
9493
9783
  severity_of_finding: {
9494
- type: "object",
9784
+ type: "assessment",
9785
+ scale_id: "severity_5",
9495
9786
  description: "Severity / strength of the finding (UPGAssessment)",
9496
9787
  properties: {
9497
9788
  value: { type: "number", description: "The numeric value, used for computation." },
9498
9789
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9499
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9500
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9790
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9791
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9501
9792
  },
9502
9793
  required: ["value", "label"]
9503
9794
  },
@@ -9516,7 +9807,18 @@ var UPG_PROPERTY_SCHEMA = {
9516
9807
  feasibility_study: {
9517
9808
  study_type: { type: "string", enum: ["technical", "business", "market", "resource"], description: 'Type of feasibility being assessed. @example "technical" for assessing engineering viability' },
9518
9809
  conclusion: { type: "string", enum: ["feasible", "not_feasible", "conditional", "needs_more_data"], description: "Outcome conclusion of the study" },
9519
- confidence: { type: "string", enum: ["high", "medium", "low"], description: "Confidence in the conclusion" }
9810
+ confidence: {
9811
+ type: "assessment",
9812
+ scale_id: "confidence_5",
9813
+ description: "Confidence in the conclusion (UPGAssessment on `confidence_5`).",
9814
+ properties: {
9815
+ value: { type: "number", description: "The numeric value, used for computation." },
9816
+ label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9817
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9818
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9819
+ },
9820
+ required: ["value", "label"]
9821
+ }
9520
9822
  },
9521
9823
  // FeatureProperties: A discrete, user-facing capability of the product.
9522
9824
  feature: {
@@ -9551,28 +9853,30 @@ var UPG_PROPERTY_SCHEMA = {
9551
9853
  feature_request: {
9552
9854
  request_source: { type: "string", enum: ["customer", "internal", "prospect", "support", "community"], description: "Where the request originated" },
9553
9855
  vote_count: { type: "number", description: "Number of votes or upvotes from users" },
9554
- signal_sentiment: { type: "string", enum: ["positive", "negative", "neutral", "mixed"], description: "Detected sentiment of the request" },
9856
+ signal_sentiment: { type: "string", enum: ["positive", "neutral", "negative", "mixed"], description: "Detected sentiment of the request" },
9555
9857
  signal_channel: { type: "string", description: "Channel through which the request was received" },
9556
9858
  signal_urgency: { type: "string", enum: ["low", "medium", "high", "critical"], description: "Perceived urgency of the request" },
9557
9859
  revenue_impact: {
9558
- type: "object",
9860
+ type: "assessment",
9861
+ scale_id: "impact_5",
9559
9862
  description: "Estimated revenue impact if implemented (1-5)",
9560
9863
  properties: {
9561
9864
  value: { type: "number", description: "The numeric value, used for computation." },
9562
9865
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9563
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9564
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9866
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9867
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9565
9868
  },
9566
9869
  required: ["value", "label"]
9567
9870
  },
9568
9871
  effort_estimate: {
9569
- type: "object",
9872
+ type: "assessment",
9873
+ scale_id: "effort_5",
9570
9874
  description: "Estimated implementation effort (1-5)",
9571
9875
  properties: {
9572
9876
  value: { type: "number", description: "The numeric value, used for computation." },
9573
9877
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9574
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9575
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9878
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9879
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9576
9880
  },
9577
9881
  required: ["value", "label"]
9578
9882
  },
@@ -9589,13 +9893,14 @@ var UPG_PROPERTY_SCHEMA = {
9589
9893
  sentiment: { type: "string", enum: ["positive", "neutral", "negative", "mixed"], description: "Overall sentiment across mentions" },
9590
9894
  actionable: { type: "boolean", description: "Whether this theme can be acted upon" },
9591
9895
  frequency: {
9592
- type: "object",
9896
+ type: "assessment",
9897
+ scale_id: "frequency_5",
9593
9898
  description: "How often the theme is mentioned (1-5)",
9594
9899
  properties: {
9595
9900
  value: { type: "number", description: "The numeric value, used for computation." },
9596
9901
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9597
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9598
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9902
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9903
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9599
9904
  },
9600
9905
  required: ["value", "label"]
9601
9906
  },
@@ -9613,7 +9918,7 @@ var UPG_PROPERTY_SCHEMA = {
9613
9918
  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." },
9614
9919
  commit: { type: "string", description: "Git commit SHA" },
9615
9920
  files_changed: { type: "string[]", description: "Files changed" },
9616
- deployed_at: { type: "string", description: "ISO timestamp landed in the target environment. Pairs with `fix_status === 'deployed'`." },
9921
+ deployed_at: { type: "string", description: "ISO timestamp landed in the target environment." },
9617
9922
  fixed_date: { type: "string", description: "Application date (ISO date). Coarser-grained complement to `deployed_at`." },
9618
9923
  verified: { type: "boolean", description: "Verified in production" },
9619
9924
  verified_by_test: { type: "boolean", description: "Validated by an automated regression or integration test. Distinct from `verified` (human judgment)." }
@@ -9623,13 +9928,14 @@ var UPG_PROPERTY_SCHEMA = {
9623
9928
  forecast_period: { type: "string", description: 'Time period the forecast covers (e.g. "Q2 2026")' },
9624
9929
  predicted_revenue: { type: "number", description: "Predicted revenue amount" },
9625
9930
  confidence: {
9626
- type: "object",
9931
+ type: "assessment",
9932
+ scale_id: "confidence_5",
9627
9933
  description: "Confidence in the prediction (1 = speculative, 5 = high conviction)",
9628
9934
  properties: {
9629
9935
  value: { type: "number", description: "The numeric value, used for computation." },
9630
9936
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9631
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9632
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9937
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9938
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9633
9939
  },
9634
9940
  required: ["value", "label"]
9635
9941
  },
@@ -9681,13 +9987,14 @@ var UPG_PROPERTY_SCHEMA = {
9681
9987
  hallucination_report: {
9682
9988
  report_type: { type: "string", enum: ["factual", "logical", "fabrication", "inconsistency"], description: "Classification" },
9683
9989
  severity: {
9684
- type: "object",
9990
+ type: "assessment",
9991
+ scale_id: "severity_5",
9685
9992
  description: "Impact severity (1 = trivial, 5 = dangerous misinformation)",
9686
9993
  properties: {
9687
9994
  value: { type: "number", description: "The numeric value, used for computation." },
9688
9995
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9689
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9690
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
9996
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
9997
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9691
9998
  },
9692
9999
  required: ["value", "label"]
9693
10000
  },
@@ -9709,13 +10016,14 @@ var UPG_PROPERTY_SCHEMA = {
9709
10016
  we_know_when: { type: "string", description: "The measurable signal that confirms or refutes the claim." },
9710
10017
  risk_if_wrong: { type: "string", description: "Risk surface for prioritisation if the claim turns out wrong." },
9711
10018
  current_confidence: {
9712
- type: "object",
10019
+ type: "assessment",
10020
+ scale_id: "confidence_5",
9713
10021
  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.",
9714
10022
  properties: {
9715
10023
  value: { type: "number", description: "The numeric value, used for computation." },
9716
10024
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9717
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9718
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10025
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10026
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9719
10027
  },
9720
10028
  required: ["value", "label"]
9721
10029
  }
@@ -9725,13 +10033,14 @@ var UPG_PROPERTY_SCHEMA = {
9725
10033
  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." },
9726
10034
  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`." },
9727
10035
  weight: {
9728
- type: "object",
9729
- description: "Strength of the evidence (UPGAssessment, scale `weight_5pt`).",
10036
+ type: "assessment",
10037
+ scale_id: "importance_5",
10038
+ description: "Strength of the evidence (UPGAssessment, scale `scale_5`).",
9730
10039
  properties: {
9731
10040
  value: { type: "number", description: "The numeric value, used for computation." },
9732
10041
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9733
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9734
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10042
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10043
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9735
10044
  },
9736
10045
  required: ["value", "label"]
9737
10046
  },
@@ -9749,8 +10058,8 @@ var UPG_PROPERTY_SCHEMA = {
9749
10058
  // IncidentProperties: Incident.
9750
10059
  incident: {
9751
10060
  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' },
9752
- 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' },
9753
- urgency: { type: "string", enum: ["high", "low"], description: "Notification urgency. Independent of severity. `high` triggers phone calls. `low` sends a message." },
10061
+ 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' },
10062
+ 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." },
9754
10063
  started_at: { type: "string", description: "ISO timestamp the incident started or was first detected." },
9755
10064
  acknowledged_at: { type: "string", description: "ISO timestamp first acknowledged by a responder. Used to compute time-to-acknowledge." },
9756
10065
  contained_at: { type: "string", description: "ISO timestamp contained. Blast radius limited, bleeding stopped. Containment precedes full resolution, especially for security incidents." },
@@ -9776,7 +10085,18 @@ var UPG_PROPERTY_SCHEMA = {
9776
10085
  // InsightProperties: Unified insight, synthesised from evidence and observations.
9777
10086
  insight: {
9778
10087
  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." },
9779
- confidence: { type: "string", enum: ["high", "medium", "low"], description: "Confidence. Reflects the strength and diversity of supporting evidence." },
10088
+ confidence: {
10089
+ type: "assessment",
10090
+ scale_id: "confidence_5",
10091
+ description: "Confidence (UPGAssessment on `confidence_5`). Reflects the strength and diversity of supporting evidence.",
10092
+ properties: {
10093
+ value: { type: "number", description: "The numeric value, used for computation." },
10094
+ 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-1 value for cross-tool comparison (optional)." }
10097
+ },
10098
+ required: ["value", "label"]
10099
+ },
9780
10100
  evidence_count: { type: "number", description: "Supporting observations, quotes, or evidence items. Higher counts increase confidence." },
9781
10101
  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." },
9782
10102
  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." },
@@ -9814,20 +10134,21 @@ var UPG_PROPERTY_SCHEMA = {
9814
10134
  // InvestigationProperties: Active thread of inquiry: debugging, architecture exploration, RCA.
9815
10135
  investigation: {
9816
10136
  severity: {
9817
- type: "object",
10137
+ type: "assessment",
10138
+ scale_id: "severity_5",
9818
10139
  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`.",
9819
10140
  properties: {
9820
10141
  value: { type: "number", description: "The numeric value, used for computation." },
9821
10142
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9822
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9823
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10143
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10144
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9824
10145
  },
9825
10146
  required: ["value", "label"]
9826
10147
  },
9827
10148
  hypothesis: { type: "string", description: "Working hypothesis about the root cause" },
9828
10149
  findings: { type: "string", description: "Findings discovered so far" },
9829
10150
  started_at: { type: "string", description: "ISO timestamp the investigation began" },
9830
- resolved_at: { type: "string", description: "ISO timestamp the investigation was concluded. Pairs with `investigation_status === 'resolved' | 'abandoned'`." },
10151
+ resolved_at: { type: "string", description: "ISO timestamp the investigation was concluded. Pairs with `status === 'resolved' | 'abandoned'`." },
9831
10152
  lead_investigator: { type: "string", description: "Lead investigator (email or handle). Distinct from the team owning the affected service." },
9832
10153
  session_id: { type: "string", description: "Originating session" },
9833
10154
  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*." }
@@ -9853,24 +10174,26 @@ var UPG_PROPERTY_SCHEMA = {
9853
10174
  statement: { type: "string", description: 'Job statement: "When I... I want to... So I can..."' },
9854
10175
  job_type: { type: "string", enum: ["functional", "emotional", "social", "supporting"], description: "Classification by motivation dimension" },
9855
10176
  importance: {
9856
- type: "object",
10177
+ type: "assessment",
10178
+ scale_id: "importance_5",
9857
10179
  description: "Importance to the user (1 = low, 5 = critical)",
9858
10180
  properties: {
9859
10181
  value: { type: "number", description: "The numeric value, used for computation." },
9860
10182
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9861
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9862
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10183
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10184
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9863
10185
  },
9864
10186
  required: ["value", "label"]
9865
10187
  },
9866
10188
  current_satisfaction: {
9867
- type: "object",
10189
+ type: "assessment",
10190
+ scale_id: "satisfaction_5",
9868
10191
  description: "Current satisfaction with how this job gets done (1 = very unsatisfied, 5 = fully satisfied)",
9869
10192
  properties: {
9870
10193
  value: { type: "number", description: "The numeric value, used for computation." },
9871
10194
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9872
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9873
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10195
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10196
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9874
10197
  },
9875
10198
  required: ["value", "label"]
9876
10199
  },
@@ -9888,24 +10211,26 @@ var UPG_PROPERTY_SCHEMA = {
9888
10211
  action_description: { type: "string", description: "Plain-language description. Primary content of the action." },
9889
10212
  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." },
9890
10213
  pain_score: {
9891
- type: "object",
10214
+ type: "assessment",
10215
+ scale_id: "pain_5",
9892
10216
  description: "Pain (1 = effortless, 5 = very painful). Drives opportunity discovery.",
9893
10217
  properties: {
9894
10218
  value: { type: "number", description: "The numeric value, used for computation." },
9895
10219
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9896
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9897
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10220
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10221
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9898
10222
  },
9899
10223
  required: ["value", "label"]
9900
10224
  },
9901
10225
  opportunity_score: {
9902
- type: "object",
10226
+ type: "assessment",
10227
+ scale_id: "impact_5",
9903
10228
  description: "Opportunity (1 = low leverage, 5 = high leverage). Pairs with `pain_score` to rank investment.",
9904
10229
  properties: {
9905
10230
  value: { type: "number", description: "The numeric value, used for computation." },
9906
10231
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9907
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9908
- 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)." }
9909
10234
  },
9910
10235
  required: ["value", "label"]
9911
10236
  },
@@ -9929,24 +10254,26 @@ var UPG_PROPERTY_SCHEMA = {
9929
10254
  touchpoint: { type: "string", description: "Interaction touchpoint" },
9930
10255
  channel: { type: "string", description: 'Channel (e.g. "web", "email", "in-store")' },
9931
10256
  emotion_score: {
9932
- type: "object",
10257
+ type: "assessment",
10258
+ scale_id: "satisfaction_5",
9933
10259
  description: "User emotion (1 = very negative, 5 = very positive)",
9934
10260
  properties: {
9935
10261
  value: { type: "number", description: "The numeric value, used for computation." },
9936
10262
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9937
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9938
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10263
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10264
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9939
10265
  },
9940
10266
  required: ["value", "label"]
9941
10267
  },
9942
10268
  friction_score: {
9943
- type: "object",
10269
+ type: "assessment",
10270
+ scale_id: "pain_5",
9944
10271
  description: "Friction (1 = effortless, 5 = very painful)",
9945
10272
  properties: {
9946
10273
  value: { type: "number", description: "The numeric value, used for computation." },
9947
10274
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9948
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9949
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10275
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10276
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9950
10277
  },
9951
10278
  required: ["value", "label"]
9952
10279
  },
@@ -9959,7 +10286,7 @@ var UPG_PROPERTY_SCHEMA = {
9959
10286
  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`.' },
9960
10287
  frequency_count: { type: "number", description: "Exact count of runs in the period. Pairs with `frequency_period`." },
9961
10288
  frequency_period: { type: "string", description: "Recurrence period (ISO-8601 `Duration`, e.g. `'P7D'`)" },
9962
- frequency_rating: { type: "string", enum: ["rare", "occasional", "regular", "constant", "other"], description: "Qualitative tier. Use when an exact rate is unknown." },
10289
+ frequency_rating: { type: "string", enum: ["constant", "regular", "occasional", "rare", "other"], description: "Qualitative tier. Use when an exact rate is unknown." },
9963
10290
  operational_owner: { type: "string", description: "Operationally accountable team or individual" },
9964
10291
  capacity_constraint: { type: "string", description: "Bottleneck or scaling constraint" },
9965
10292
  automation_level: { type: "string", enum: ["manual", "assisted", "automated"], description: "How much runs without human intervention" }
@@ -9970,13 +10297,14 @@ var UPG_PROPERTY_SCHEMA = {
9970
10297
  criticality: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Criticality to the business model" },
9971
10298
  owner: { type: "string", description: "Accountable person or team" },
9972
10299
  scarcity_risk: {
9973
- type: "object",
10300
+ type: "assessment",
10301
+ scale_id: "severity_5",
9974
10302
  description: "Replacement difficulty",
9975
10303
  properties: {
9976
10304
  value: { type: "number", description: "The numeric value, used for computation." },
9977
10305
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
9978
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
9979
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10306
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10307
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
9980
10308
  },
9981
10309
  required: ["value", "label"]
9982
10310
  },
@@ -10010,7 +10338,6 @@ var UPG_PROPERTY_SCHEMA = {
10010
10338
  // LearningProperties: Result of an experiment. Evidence that updates a hypothesis.
10011
10339
  learning: {
10012
10340
  result: { type: "string", description: "Summary" },
10013
- 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.' },
10014
10341
  result_value: { type: "number", description: "Measured value of the result" },
10015
10342
  result_unit: { type: "string", description: 'Unit (e.g. "%" or "ms")' },
10016
10343
  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`." },
@@ -10066,25 +10393,27 @@ var UPG_PROPERTY_SCHEMA = {
10066
10393
  // MarketTrendProperties: Market trend.
10067
10394
  market_trend: {
10068
10395
  relevance: {
10069
- type: "object",
10396
+ type: "assessment",
10397
+ scale_id: "importance_5",
10070
10398
  description: "Relevance to our product (1 = low, 5 = critical).",
10071
10399
  properties: {
10072
10400
  value: { type: "number", description: "The numeric value, used for computation." },
10073
10401
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10074
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10075
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10402
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10403
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10076
10404
  },
10077
10405
  required: ["value", "label"]
10078
10406
  },
10079
10407
  timeframe: { type: "string", description: 'Expected peak or mainstream window. @example "12-18 months", "2027"' },
10080
10408
  impact: {
10081
- type: "object",
10409
+ type: "assessment",
10410
+ scale_id: "impact_5",
10082
10411
  description: "Expected impact on our market or category.",
10083
10412
  properties: {
10084
10413
  value: { type: "number", description: "The numeric value, used for computation." },
10085
10414
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10086
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10087
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10415
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10416
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10088
10417
  },
10089
10418
  required: ["value", "label"]
10090
10419
  },
@@ -10195,35 +10524,38 @@ var UPG_PROPERTY_SCHEMA = {
10195
10524
  valence: { type: "string", enum: ["pain", "gap", "constraint"], description: "What kind of experience: pain (friction), gap (unmet), constraint (limitation)" },
10196
10525
  maturity: { type: "string", enum: ["raw", "validated", "prioritized"], description: "How mature is this need in our understanding" },
10197
10526
  frequency: {
10198
- type: "object",
10527
+ type: "assessment",
10528
+ scale_id: "frequency_5",
10199
10529
  description: "How often the user encounters this need (1 = rarely, 5 = constantly)",
10200
10530
  properties: {
10201
10531
  value: { type: "number", description: "The numeric value, used for computation." },
10202
10532
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10203
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10204
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10533
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10534
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10205
10535
  },
10206
10536
  required: ["value", "label"]
10207
10537
  },
10208
10538
  severity: {
10209
- type: "object",
10539
+ type: "assessment",
10540
+ scale_id: "severity_5",
10210
10541
  description: "How painful or disruptive the need is when unaddressed (1 = minor, 5 = critical)",
10211
10542
  properties: {
10212
10543
  value: { type: "number", description: "The numeric value, used for computation." },
10213
10544
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10214
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10215
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10545
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10546
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10216
10547
  },
10217
10548
  required: ["value", "label"]
10218
10549
  },
10219
10550
  importance: {
10220
- type: "object",
10551
+ type: "assessment",
10552
+ scale_id: "importance_5",
10221
10553
  description: "How important resolving this need is to the user (1 = low, 5 = critical)",
10222
10554
  properties: {
10223
10555
  value: { type: "number", description: "The numeric value, used for computation." },
10224
10556
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10225
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10226
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10557
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10558
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10227
10559
  },
10228
10560
  required: ["value", "label"]
10229
10561
  },
@@ -10244,13 +10576,14 @@ var UPG_PROPERTY_SCHEMA = {
10244
10576
  statement: { type: "string", description: "The objection as stated by the source" },
10245
10577
  source_type: { type: "string", enum: ["prospect", "competitor", "internal", "market"], description: "Where this objection originated" },
10246
10578
  severity: {
10247
- type: "object",
10579
+ type: "assessment",
10580
+ scale_id: "severity_5",
10248
10581
  description: "How frequently or strongly this objection comes up (1-5)",
10249
10582
  properties: {
10250
10583
  value: { type: "number", description: "The numeric value, used for computation." },
10251
10584
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10252
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10253
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10585
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10586
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10254
10587
  },
10255
10588
  required: ["value", "label"]
10256
10589
  },
@@ -10269,7 +10602,7 @@ var UPG_PROPERTY_SCHEMA = {
10269
10602
  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." },
10270
10603
  is_highlighted: { type: "boolean", description: "Flagged as a highlight. Absorbed from the deprecated Highlight entity." },
10271
10604
  highlight_tag: { type: "string", description: 'Free-form highlight type tag. @example "pain", "delight", "behaviour", "moment of clarity"' },
10272
- 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." }
10605
+ 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." }
10273
10606
  },
10274
10607
  // OnCallRotationProperties: On-call rotation.
10275
10608
  on_call_rotation: {
@@ -10281,35 +10614,38 @@ var UPG_PROPERTY_SCHEMA = {
10281
10614
  // OpportunityProperties: A problem worth solving, grounded in user need and business value
10282
10615
  opportunity: {
10283
10616
  reach: {
10284
- type: "object",
10617
+ type: "assessment",
10618
+ scale_id: "reach_5",
10285
10619
  description: "How many users experience this problem",
10286
10620
  properties: {
10287
10621
  value: { type: "number", description: "The numeric value, used for computation." },
10288
10622
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10289
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10290
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10623
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10624
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10291
10625
  },
10292
10626
  required: ["value", "label"]
10293
10627
  },
10294
10628
  frequency: {
10295
- type: "object",
10629
+ type: "assessment",
10630
+ scale_id: "frequency_5",
10296
10631
  description: "How often users experience this problem",
10297
10632
  properties: {
10298
10633
  value: { type: "number", description: "The numeric value, used for computation." },
10299
10634
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10300
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10301
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10635
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10636
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10302
10637
  },
10303
10638
  required: ["value", "label"]
10304
10639
  },
10305
10640
  pain: {
10306
- type: "object",
10641
+ type: "assessment",
10642
+ scale_id: "pain_5",
10307
10643
  description: "How painful it is when unaddressed",
10308
10644
  properties: {
10309
10645
  value: { type: "number", description: "The numeric value, used for computation." },
10310
10646
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10311
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10312
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10647
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10648
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10313
10649
  },
10314
10650
  required: ["value", "label"]
10315
10651
  },
@@ -10330,17 +10666,18 @@ var UPG_PROPERTY_SCHEMA = {
10330
10666
  current_state: { type: "string", description: "Baseline or latest read" },
10331
10667
  evidence_summary: { type: "string", description: "Evidence gathered so far (quotes, metrics, studies)" },
10332
10668
  confidence: {
10333
- type: "object",
10669
+ type: "assessment",
10670
+ scale_id: "confidence_5",
10334
10671
  description: "Confidence this is the right outcome to pursue",
10335
10672
  properties: {
10336
10673
  value: { type: "number", description: "The numeric value, used for computation." },
10337
10674
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10338
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10339
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10675
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10676
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10340
10677
  },
10341
10678
  required: ["value", "label"]
10342
10679
  },
10343
- outcome_status: { type: "string", description: "Current lifecycle phase. Free-form until an outcome lifecycle is defined in `grammar/lifecycles.ts`." }
10680
+ 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`." }
10344
10681
  },
10345
10682
  // ParticipantProperties: Research participant.
10346
10683
  participant: {
@@ -10371,13 +10708,14 @@ var UPG_PROPERTY_SCHEMA = {
10371
10708
  value_exchange: { type: "string", description: "What each party gives and receives" },
10372
10709
  partnership_tier: { type: "string", enum: ["strategic", "preferred", "standard", "trial"], description: "Commercial significance. Drives attention and exec sponsorship." },
10373
10710
  risk_level: {
10374
- type: "object",
10711
+ type: "assessment",
10712
+ scale_id: "severity_5",
10375
10713
  description: "Exposure if the partnership fails (concentration risk, IP risk, etc.)",
10376
10714
  properties: {
10377
10715
  value: { type: "number", description: "The numeric value, used for computation." },
10378
10716
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10379
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10380
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10717
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10718
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10381
10719
  },
10382
10720
  required: ["value", "label"]
10383
10721
  },
@@ -10418,7 +10756,7 @@ var UPG_PROPERTY_SCHEMA = {
10418
10756
  },
10419
10757
  // PipelineSalesProperties: Sales pipeline.
10420
10758
  pipeline_sales: {
10421
- pipeline_type: { type: "string", description: 'Classification of the pipeline (e.g. "new business", "expansion")' },
10759
+ pipeline_type: { type: "string", enum: ["new_business", "expansion", "renewal", "partner", "other"], description: "Classification of the pipeline (UPG-579 Option B)." },
10422
10760
  avg_cycle_days: { type: "number", description: "Average days from opportunity creation to close" }
10423
10761
  },
10424
10762
  // PipelineStageProperties: Pipeline stage.
@@ -10460,7 +10798,7 @@ var UPG_PROPERTY_SCHEMA = {
10460
10798
  // PricingStrategyProperties: Pricing strategy.
10461
10799
  pricing_strategy: {
10462
10800
  strategy_type: { type: "string", enum: ["value_based", "cost_plus", "competitor_based", "penetration", "freemium"], description: "Pricing methodology used" },
10463
- review_cadence: { type: "string", description: "How often pricing is reviewed" },
10801
+ 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." },
10464
10802
  last_change: { type: "string", description: "Date of the last pricing change (ISO format)" }
10465
10803
  },
10466
10804
  // PricingTierProperties: PricingTier: the central pricing concept (the plan a customer buys).
@@ -10569,13 +10907,14 @@ var UPG_PROPERTY_SCHEMA = {
10569
10907
  rebuttal: {
10570
10908
  statement: { type: "string", description: "The counter-argument or response to an objection" },
10571
10909
  strength: {
10572
- type: "object",
10910
+ type: "assessment",
10911
+ scale_id: "scale_5",
10573
10912
  description: "How convincing this rebuttal is (1-5)",
10574
10913
  properties: {
10575
10914
  value: { type: "number", description: "The numeric value, used for computation." },
10576
10915
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10577
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10578
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
10916
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
10917
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10579
10918
  },
10580
10919
  required: ["value", "label"]
10581
10920
  },
@@ -10668,24 +11007,26 @@ var UPG_PROPERTY_SCHEMA = {
10668
11007
  risk: {
10669
11008
  risk_type: { type: "string", enum: ["technical", "business", "legal", "security", "operational"], description: "Domain the risk belongs to" },
10670
11009
  probability: {
10671
- type: "object",
11010
+ type: "assessment",
11011
+ scale_id: "confidence_5",
10672
11012
  description: "How likely this risk is to materialise (1 = unlikely, 5 = near certain)",
10673
11013
  properties: {
10674
11014
  value: { type: "number", description: "The numeric value, used for computation." },
10675
11015
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10676
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10677
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
11016
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
11017
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10678
11018
  },
10679
11019
  required: ["value", "label"]
10680
11020
  },
10681
11021
  impact: {
10682
- type: "object",
11022
+ type: "assessment",
11023
+ scale_id: "impact_5",
10683
11024
  description: "Severity of consequences if the risk materialises (1 = negligible, 5 = catastrophic)",
10684
11025
  properties: {
10685
11026
  value: { type: "number", description: "The numeric value, used for computation." },
10686
11027
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10687
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10688
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
11028
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
11029
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10689
11030
  },
10690
11031
  required: ["value", "label"]
10691
11032
  },
@@ -10706,7 +11047,18 @@ var UPG_PROPERTY_SCHEMA = {
10706
11047
  quarter: { type: "string", description: 'Planning quarter (e.g. "Q2 2026"). Pair with `start_date`/`target_date` for precise scheduling.' },
10707
11048
  priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Importance against other items" },
10708
11049
  item_status: { type: "string", enum: ["planned", "in_progress", "shipped", "deferred"], description: "Status. `deferred` = explicitly pushed to a later period." },
10709
- confidence: { type: "string", enum: ["high", "medium", "low"], description: "Delivery confidence within the planned period." },
11050
+ confidence: {
11051
+ type: "assessment",
11052
+ scale_id: "confidence_5",
11053
+ description: "Delivery confidence within the planned period (UPGAssessment on `confidence_5`).",
11054
+ properties: {
11055
+ value: { type: "number", description: "The numeric value, used for computation." },
11056
+ label: { type: "string", description: "The qualitative label (what the assessor meant)." },
11057
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
11058
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
11059
+ },
11060
+ required: ["value", "label"]
11061
+ },
10710
11062
  start_date: { type: "string", description: "ISO date work begins. More precise than `quarter` for continuous planning." },
10711
11063
  target_date: { type: "string", description: "ISO date completion is expected. For shipped items, the actual completion date." }
10712
11064
  },
@@ -10720,13 +11072,14 @@ var UPG_PROPERTY_SCHEMA = {
10720
11072
  // RootCauseProperties: Underlying architectural or systemic issue.
10721
11073
  root_cause: {
10722
11074
  severity: {
10723
- type: "object",
11075
+ type: "assessment",
11076
+ scale_id: "severity_5",
10724
11077
  description: "Severity (1 = minor, 5 = critical)",
10725
11078
  properties: {
10726
11079
  value: { type: "number", description: "The numeric value, used for computation." },
10727
11080
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10728
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10729
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
11081
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
11082
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10730
11083
  },
10731
11084
  required: ["value", "label"]
10732
11085
  },
@@ -10776,13 +11129,14 @@ var UPG_PROPERTY_SCHEMA = {
10776
11129
  security_control: {
10777
11130
  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." },
10778
11131
  effectiveness: {
10779
- type: "object",
11132
+ type: "assessment",
11133
+ scale_id: "impact_5",
10780
11134
  description: "Mitigation effectiveness (1 = minimal, 5 = fully effective)",
10781
11135
  properties: {
10782
11136
  value: { type: "number", description: "The numeric value, used for computation." },
10783
11137
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10784
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10785
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
11138
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
11139
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10786
11140
  },
10787
11141
  required: ["value", "label"]
10788
11142
  },
@@ -10793,7 +11147,7 @@ var UPG_PROPERTY_SCHEMA = {
10793
11147
  // SecurityPolicyProperties: Security policy.
10794
11148
  security_policy: {
10795
11149
  scope: { type: "string", description: "Systems or processes covered" },
10796
- review_cadence: { type: "string", description: 'Review cadence (e.g. "annually", "quarterly")' },
11150
+ 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." },
10797
11151
  version: { type: "string", description: "Version" },
10798
11152
  effective_date: { type: "string", description: "ISO effective date" },
10799
11153
  url: { type: "string", description: "Policy document URL" },
@@ -10864,17 +11218,18 @@ var UPG_PROPERTY_SCHEMA = {
10864
11218
  },
10865
11219
  // SkillProperties: Skill entity.
10866
11220
  skill: {
10867
- skill_category: { type: "string", description: 'Category of the skill (e.g. "technical", "leadership", "design")' },
11221
+ skill_category: { type: "string", enum: ["technical", "leadership", "design", "product", "business", "operations", "other"], description: "Category of the skill (UPG-579 Option B)." },
10868
11222
  proficiency_levels: { type: "string[]", description: "Description of proficiency levels for this skill" },
10869
11223
  domain: { type: "string", description: 'Problem domain the skill applies to (e.g. "payments", "accessibility")' },
10870
11224
  rarity: {
10871
- type: "object",
11225
+ type: "assessment",
11226
+ scale_id: "scale_5",
10872
11227
  description: "How scarce this skill is in the labour market this team hires from",
10873
11228
  properties: {
10874
11229
  value: { type: "number", description: "The numeric value, used for computation." },
10875
11230
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10876
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10877
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
11231
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
11232
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10878
11233
  },
10879
11234
  required: ["value", "label"]
10880
11235
  },
@@ -10890,46 +11245,50 @@ var UPG_PROPERTY_SCHEMA = {
10890
11245
  solution: {
10891
11246
  timeline: { type: "string", description: "Estimated delivery or target timeline" },
10892
11247
  reach: {
10893
- type: "object",
11248
+ type: "assessment",
11249
+ scale_id: "reach_5",
10894
11250
  description: "How many users this solution reaches (1 = few, 5 = most)",
10895
11251
  properties: {
10896
11252
  value: { type: "number", description: "The numeric value, used for computation." },
10897
11253
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10898
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10899
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
11254
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
11255
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10900
11256
  },
10901
11257
  required: ["value", "label"]
10902
11258
  },
10903
11259
  impact: {
10904
- type: "object",
11260
+ type: "assessment",
11261
+ scale_id: "impact_5",
10905
11262
  description: "Expected impact on the target outcome (1 = minimal, 5 = transformative)",
10906
11263
  properties: {
10907
11264
  value: { type: "number", description: "The numeric value, used for computation." },
10908
11265
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10909
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10910
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
11266
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
11267
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10911
11268
  },
10912
11269
  required: ["value", "label"]
10913
11270
  },
10914
11271
  confidence: {
10915
- type: "object",
11272
+ type: "assessment",
11273
+ scale_id: "confidence_5",
10916
11274
  description: "How confident the team is in this solution (1 = speculative, 5 = proven)",
10917
11275
  properties: {
10918
11276
  value: { type: "number", description: "The numeric value, used for computation." },
10919
11277
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10920
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10921
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
11278
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
11279
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10922
11280
  },
10923
11281
  required: ["value", "label"]
10924
11282
  },
10925
11283
  effort: {
10926
- type: "object",
11284
+ type: "assessment",
11285
+ scale_id: "effort_5",
10927
11286
  description: "Level of effort required to implement (1 = trivial, 5 = very large)",
10928
11287
  properties: {
10929
11288
  value: { type: "number", description: "The numeric value, used for computation." },
10930
11289
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10931
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10932
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
11290
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
11291
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10933
11292
  },
10934
11293
  required: ["value", "label"]
10935
11294
  },
@@ -10939,24 +11298,26 @@ var UPG_PROPERTY_SCHEMA = {
10939
11298
  stakeholder: {
10940
11299
  stakeholder_type: { type: "string", enum: ["internal", "external", "investor", "regulator"], description: "Relationship of the stakeholder to the organisation" },
10941
11300
  influence: {
10942
- type: "object",
11301
+ type: "assessment",
11302
+ scale_id: "importance_5",
10943
11303
  description: "How much influence this stakeholder has over decisions (1 = minimal, 5 = decisive)",
10944
11304
  properties: {
10945
11305
  value: { type: "number", description: "The numeric value, used for computation." },
10946
11306
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10947
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10948
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
11307
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
11308
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10949
11309
  },
10950
11310
  required: ["value", "label"]
10951
11311
  },
10952
11312
  interest: {
10953
- type: "object",
11313
+ type: "assessment",
11314
+ scale_id: "importance_5",
10954
11315
  description: "How much interest this stakeholder has in the outcome (1 = passive, 5 = deeply invested)",
10955
11316
  properties: {
10956
11317
  value: { type: "number", description: "The numeric value, used for computation." },
10957
11318
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
10958
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
10959
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
11319
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
11320
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
10960
11321
  },
10961
11322
  required: ["value", "label"]
10962
11323
  }
@@ -10968,19 +11329,6 @@ var UPG_PROPERTY_SCHEMA = {
10968
11329
  risks_flagged: { type: "number", description: "Number of risks flagged in this report" },
10969
11330
  blockers: { type: "string", description: "Description of current blockers" }
10970
11331
  },
10971
- // UserStoryProperties: "As X, I want Y so Z" templated promise, a user story (UCS pattern P5).
10972
- user_story: {
10973
- as_a: { type: "string", description: '"As a [persona], \u2026". Free-text persona name or slug ref.' },
10974
- i_want_to: { type: "string", description: "Capability or action the persona wants." },
10975
- so_that: { type: "string", description: "Benefit or outcome the persona expects." },
10976
- text: { type: "string", description: "Free-form story text. Used as a single-line rendered view." }
10977
- },
10978
- // StoryTaskProperties
10979
- story_task: {
10980
- estimate: { type: "string", description: "@deprecated Use TaskProperties.estimate" },
10981
- effort: { type: "number", description: "@deprecated Use TaskProperties.effort (string form)" },
10982
- priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "@deprecated Use TaskProperties.priority" }
10983
- },
10984
11332
  // StrategicPillarProperties: StrategicPillar entity. Durable multi-year direction the product commits to.
10985
11333
  strategic_pillar: {
10986
11334
  owner: { type: "string", description: "Owning person or team" },
@@ -11014,19 +11362,20 @@ var UPG_PROPERTY_SCHEMA = {
11014
11362
  support_ticket: {
11015
11363
  ticket_type: { type: "string", enum: ["bug", "question", "feature_request"], description: "Classification of the ticket" },
11016
11364
  severity: {
11017
- type: "object",
11365
+ type: "assessment",
11366
+ scale_id: "severity_5",
11018
11367
  description: "Impact severity of the issue (1 = cosmetic, 5 = service down)",
11019
11368
  properties: {
11020
11369
  value: { type: "number", description: "The numeric value, used for computation." },
11021
11370
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
11022
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
11023
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
11371
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
11372
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
11024
11373
  },
11025
11374
  required: ["value", "label"]
11026
11375
  },
11027
11376
  resolution: { type: "string", description: "Description of how the ticket was resolved" },
11028
11377
  source: { type: "string", description: 'Where the ticket originated (e.g. "email", "in-app", "chat")' },
11029
- signal_sentiment: { type: "string", enum: ["positive", "negative", "neutral", "mixed"], description: "Detected sentiment of the customer's message" },
11378
+ signal_sentiment: { type: "string", enum: ["positive", "neutral", "negative", "mixed"], description: "Detected sentiment of the customer's message" },
11030
11379
  signal_channel: { type: "string", description: "Channel through which the signal was received" },
11031
11380
  signal_urgency: { type: "string", enum: ["low", "medium", "high", "critical"], description: "Perceived urgency of the customer's request" }
11032
11381
  },
@@ -11047,19 +11396,20 @@ var UPG_PROPERTY_SCHEMA = {
11047
11396
  symptom_description: { type: "string", description: "Plain-language description of observed behaviour. Primary content of the entity." },
11048
11397
  first_observed_at: { type: "string", description: "ISO timestamp first observed in the wild. Pairs with `frequency_rating` and `reproducibility` for triage." },
11049
11398
  severity: {
11050
- type: "object",
11399
+ type: "assessment",
11400
+ scale_id: "severity_5",
11051
11401
  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`.",
11052
11402
  properties: {
11053
11403
  value: { type: "number", description: "The numeric value, used for computation." },
11054
11404
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
11055
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
11056
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
11405
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
11406
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
11057
11407
  },
11058
11408
  required: ["value", "label"]
11059
11409
  },
11060
11410
  frequency_count: { type: "number", description: "Exact observation count in the period. Pairs with `frequency_period` for a precise rate." },
11061
11411
  frequency_period: { type: "string", description: "Recurrence period (ISO-8601 `Duration`). @example 'P7D' (per week), 'P1D' (per day), 'PT1H' (per hour)" },
11062
- 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`." },
11412
+ 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`." },
11063
11413
  affected_users_estimate: { type: "number", description: "Approximate count of users affected. Snapshot estimate." },
11064
11414
  reproducibility: { type: "string", enum: ["always", "frequent", "intermittent", "rare", "once"], description: "Reproduction reliability" },
11065
11415
  steps_to_reproduce: { type: "string", description: "Steps to reproduce" }
@@ -11072,7 +11422,6 @@ var UPG_PROPERTY_SCHEMA = {
11072
11422
  },
11073
11423
  // TaskProperties: Task: a discrete unit of work, smaller than a story.
11074
11424
  task: {
11075
- 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`." },
11076
11425
  assignee: { type: "string", description: "Assigned person" },
11077
11426
  effort: { type: "string", description: 'Effort estimate (e.g. "2h", "1d", "3 points"). Use a consistent unit within your team.' },
11078
11427
  priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Relative importance against other tasks" },
@@ -11097,24 +11446,26 @@ var UPG_PROPERTY_SCHEMA = {
11097
11446
  technical_debt_item: {
11098
11447
  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." },
11099
11448
  severity: {
11100
- type: "object",
11449
+ type: "assessment",
11450
+ scale_id: "severity_5",
11101
11451
  description: "Severity on system or team. Requires human evaluation.",
11102
11452
  properties: {
11103
11453
  value: { type: "number", description: "The numeric value, used for computation." },
11104
11454
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
11105
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
11106
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
11455
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
11456
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
11107
11457
  },
11108
11458
  required: ["value", "label"]
11109
11459
  },
11110
11460
  effort_to_fix: {
11111
- type: "object",
11461
+ type: "assessment",
11462
+ scale_id: "effort_5",
11112
11463
  description: "Estimated effort to resolve. Requires team knowledge of the codebase.",
11113
11464
  properties: {
11114
11465
  value: { type: "number", description: "The numeric value, used for computation." },
11115
11466
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
11116
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
11117
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
11467
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
11468
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
11118
11469
  },
11119
11470
  required: ["value", "label"]
11120
11471
  },
@@ -11197,24 +11548,26 @@ var UPG_PROPERTY_SCHEMA = {
11197
11548
  threat: {
11198
11549
  category: { type: "string", description: 'Attack or threat scenario. @example "injection", "misconfiguration", "social engineering", "supply chain"' },
11199
11550
  likelihood: {
11200
- type: "object",
11551
+ type: "assessment",
11552
+ scale_id: "confidence_5",
11201
11553
  description: "Likelihood (1 = theoretical, 5 = actively exploited). @example value 5 for a known, exploitable, commonly targeted pattern",
11202
11554
  properties: {
11203
11555
  value: { type: "number", description: "The numeric value, used for computation." },
11204
11556
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
11205
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
11206
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
11557
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
11558
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
11207
11559
  },
11208
11560
  required: ["value", "label"]
11209
11561
  },
11210
11562
  impact: {
11211
- type: "object",
11563
+ type: "assessment",
11564
+ scale_id: "impact_5",
11212
11565
  description: "Impact (1 = minimal, 5 = catastrophic). @example value 5 for threats that expose PII or cause complete service compromise",
11213
11566
  properties: {
11214
11567
  value: { type: "number", description: "The numeric value, used for computation." },
11215
11568
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
11216
- scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)" },
11217
- normalized: { type: "number", description: "Normalized 0\u20131 value for cross-tool comparison (optional)" }
11569
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
11570
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
11218
11571
  },
11219
11572
  required: ["value", "label"]
11220
11573
  },
@@ -11272,7 +11625,7 @@ var UPG_PROPERTY_SCHEMA = {
11272
11625
  // UserAdvisoryBoardProperties: User advisory board.
11273
11626
  user_advisory_board: {
11274
11627
  member_count: { type: "number", description: "Number of members on the board" },
11275
- meeting_cadence: { type: "string", description: 'How often the board meets (e.g. "monthly", "quarterly")' },
11628
+ 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." },
11276
11629
  board_focus: { type: "string", description: "Primary topic or area the board advises on" }
11277
11630
  },
11278
11631
  // UserFlowProperties: User flow.
@@ -11288,6 +11641,13 @@ var UPG_PROPERTY_SCHEMA = {
11288
11641
  journey_type: { type: "string", enum: ["current_state", "future_state", "day_in_the_life", "service_blueprint"], description: "Maps current or future state" },
11289
11642
  scenario: { type: "string", description: "Scenario context" }
11290
11643
  },
11644
+ // UserStoryProperties: "As X, I want Y so Z" templated promise on a user story (UCS pattern P5).
11645
+ user_story: {
11646
+ as_a: { type: "string", description: '"As a [persona], \u2026". Free-text persona name or slug ref.' },
11647
+ i_want_to: { type: "string", description: "Capability or action the persona wants." },
11648
+ so_that: { type: "string", description: "Benefit or outcome the persona expects." },
11649
+ text: { type: "string", description: "Free-form story text. Used as a single-line rendered view." }
11650
+ },
11291
11651
  // ValueObjectProperties: DDD value object.
11292
11652
  value_object: {
11293
11653
  immutable: { type: "boolean", description: "Whether immutable" },
@@ -11302,7 +11662,7 @@ var UPG_PROPERTY_SCHEMA = {
11302
11662
  },
11303
11663
  // ValueStreamProperties: ValueStream entity.
11304
11664
  value_stream: {
11305
- stream_stage: { type: "string", description: "Current stage in the value delivery pipeline" },
11665
+ stream_stage: { type: "string", enum: ["discovery", "definition", "build", "delivery", "operation", "other"], description: "Current stage in the value delivery pipeline (UPG-579 Option B)." },
11306
11666
  lead_time: { type: "string", description: 'End-to-end lead time. @example "2 weeks"' },
11307
11667
  throughput: { type: "string", description: 'Throughput measure. @example "5 features/sprint"' }
11308
11668
  },
@@ -11322,7 +11682,18 @@ var UPG_PROPERTY_SCHEMA = {
11322
11682
  vulnerability: {
11323
11683
  cve_id: { type: "string", description: 'CVE identifier from the National Vulnerability Database. @example "CVE-2024-1234"' },
11324
11684
  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)" },
11325
- 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' },
11685
+ severity: {
11686
+ type: "assessment",
11687
+ scale_id: "severity_5",
11688
+ 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)",
11689
+ properties: {
11690
+ value: { type: "number", description: "The numeric value, used for computation." },
11691
+ label: { type: "string", description: "The qualitative label (what the assessor meant)." },
11692
+ scale_id: { type: "string", description: "Which assessment scale this was rated on (optional)." },
11693
+ normalized: { type: "number", description: "Normalized 0-1 value for cross-tool comparison (optional)." }
11694
+ },
11695
+ required: ["value", "label"]
11696
+ },
11326
11697
  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' },
11327
11698
  affected_component: { type: "string", description: 'Affected component, library, or system. @example "lodash", "openssl", "login service"' },
11328
11699
  affected_package: { type: "string", description: 'Affected package with version. More precise than `affected_component`. @example "lodash@4.17.20", "openssl@1.1.1q"' },
@@ -15946,17 +16317,6 @@ function seqStep(order, phase, entity_types, prompt_hint, options) {
15946
16317
  ...options?.next_sequence_on_gap ? { next_sequence_on_gap: options.next_sequence_on_gap } : {}
15947
16318
  };
15948
16319
  }
15949
- function domainGuideStep(domain_id, phase, name, prompt_hint, options) {
15950
- return {
15951
- kind: "domain_guide",
15952
- order: 1,
15953
- phase,
15954
- name,
15955
- prompt_hint,
15956
- domain_id,
15957
- ...options?.next_sequence_on_gap ? { next_sequence_on_gap: options.next_sequence_on_gap } : {}
15958
- };
15959
- }
15960
16320
  var STRATEGY_OUTCOMES_PLAYBOOK = {
15961
16321
  id: "playbook:strategy-outcomes",
15962
16322
  name: "Strategy & Outcomes",
@@ -15964,6 +16324,7 @@ var STRATEGY_OUTCOMES_PLAYBOOK = {
15964
16324
  description: "Cascade vision through themes, outcomes, objectives, key results, and the bets you are making to get there.",
15965
16325
  region: "strategy_outcomes",
15966
16326
  is_canonical: true,
16327
+ related_framework_ids: ["okr-framework", "three-horizons", "north-star-metric", "metrics-tree", "wardley-map"],
15967
16328
  target_anchor_entity: "objective",
15968
16329
  creation_sequence: [
15969
16330
  seqStep(
@@ -16007,7 +16368,7 @@ var STRATEGY_OUTCOMES_PLAYBOOK = {
16007
16368
  "Assumptions & Decisions",
16008
16369
  ["assumption", "decision"],
16009
16370
  "Capture the bets you are making (assumptions) and the choices you have ratified (decisions). These guard the work against silent drift.",
16010
- { next_sequence_on_gap: "playbook:discovery-validation-hypothesis-cycle" }
16371
+ { next_sequence_on_gap: "playbook:discovery-research-validation" }
16011
16372
  )
16012
16373
  ]
16013
16374
  };
@@ -16018,6 +16379,7 @@ var USERS_NEEDS_PLAYBOOK = {
16018
16379
  description: "Bootstrap personas, jobs, needs, and desired outcomes: the user side of every product graph.",
16019
16380
  region: "users_needs",
16020
16381
  is_canonical: true,
16382
+ related_framework_ids: ["persona-canvas", "empathy-map", "value-proposition-canvas", "kano-model"],
16021
16383
  target_anchor_entity: "persona",
16022
16384
  creation_sequence: [
16023
16385
  seqStep(
@@ -16071,6 +16433,7 @@ var DISCOVERY_RESEARCH_VALIDATION_PLAYBOOK = {
16071
16433
  description: "Evidence-first discovery sequence: plan \u2192 recruit \u2192 observe \u2192 synthesize \u2192 insight \u2192 opportunity \u2192 hypothesis \u2192 test.",
16072
16434
  region: "discovery_research_validation",
16073
16435
  is_canonical: true,
16436
+ related_framework_ids: ["double-diamond", "opportunity-solution-tree", "build-measure-learn", "hypothesis-board"],
16074
16437
  target_anchor_entity: "opportunity",
16075
16438
  creation_sequence: [
16076
16439
  seqStep(
@@ -16123,23 +16486,6 @@ var DISCOVERY_RESEARCH_VALIDATION_PLAYBOOK = {
16123
16486
  )
16124
16487
  ]
16125
16488
  };
16126
- var DISCOVERY_VALIDATION_HYPOTHESIS_PLAYBOOK = {
16127
- id: "playbook:discovery-validation-hypothesis-cycle",
16128
- name: "Hypothesis Validation",
16129
- version: "0.1.0",
16130
- description: "Tight hypothesis \u2192 experiment \u2192 evidence \u2192 learning loop. Run after research has surfaced an opportunity.",
16131
- region: "discovery_research_validation",
16132
- framework_id: "build-measure-learn",
16133
- target_anchor_entity: "hypothesis",
16134
- creation_sequence: [
16135
- domainGuideStep(
16136
- "validation",
16137
- "Validation",
16138
- "Frame & test",
16139
- "Run the validation creation sequence: hypothesis, experiment, evidence, learning."
16140
- )
16141
- ]
16142
- };
16143
16489
  var MARKET_COMPETITIVE_PLAYBOOK = {
16144
16490
  id: "playbook:market-competitive",
16145
16491
  name: "Market & Competitive",
@@ -16147,6 +16493,7 @@ var MARKET_COMPETITIVE_PLAYBOOK = {
16147
16493
  description: "Map the competitive landscape: define the market, name the alternatives, read trends, find moves.",
16148
16494
  region: "market_competitive",
16149
16495
  is_canonical: true,
16496
+ related_framework_ids: ["porter-five-forces", "swot-analysis", "value-chain-analysis", "wardley-map", "bullseye-framework"],
16150
16497
  target_anchor_entity: "competitor",
16151
16498
  creation_sequence: [
16152
16499
  seqStep(
@@ -16194,6 +16541,7 @@ var EXPERIENCE_DESIGN_BRAND_PLAYBOOK = {
16194
16541
  description: "Journey-first design sequence: research \u2192 personas \u2192 journeys \u2192 define \u2192 ideate \u2192 prototype \u2192 test \u2192 design system.",
16195
16542
  region: "experience_design_brand",
16196
16543
  is_canonical: true,
16544
+ related_framework_ids: ["double-diamond", "atomic-design", "story-map"],
16197
16545
  target_anchor_entity: "user_journey",
16198
16546
  creation_sequence: [
16199
16547
  seqStep(
@@ -16246,54 +16594,6 @@ var EXPERIENCE_DESIGN_BRAND_PLAYBOOK = {
16246
16594
  )
16247
16595
  ]
16248
16596
  };
16249
- var EXPERIENCE_UX_DOMAIN_ONLY_PLAYBOOK = {
16250
- id: "playbook:experience-ux-domain-only",
16251
- name: "UX Design (compact)",
16252
- version: "0.1.0",
16253
- description: "Compact UX-only path. Quick when research and design system are managed separately.",
16254
- region: "experience_design_brand",
16255
- target_anchor_entity: "user_journey",
16256
- creation_sequence: [
16257
- domainGuideStep(
16258
- "ux_design",
16259
- "UX",
16260
- "Journey to screen",
16261
- "Run the ux_design creation sequence: journey, steps, screens, flows, wireframes, prototypes."
16262
- )
16263
- ]
16264
- };
16265
- var EXPERIENCE_DESIGN_SYSTEM_PLAYBOOK = {
16266
- id: "playbook:experience-design-system",
16267
- name: "Design System",
16268
- version: "0.1.0",
16269
- description: "Codify the shared design language: tokens, components, patterns, guidelines.",
16270
- region: "experience_design_brand",
16271
- creation_sequence: [
16272
- domainGuideStep(
16273
- "design_system",
16274
- "Design System",
16275
- "System foundations",
16276
- "Run the design_system creation sequence: tokens, components, patterns, guidelines.",
16277
- { next_sequence_on_gap: "playbook:experience-ux-domain-only" }
16278
- )
16279
- ]
16280
- };
16281
- var EXPERIENCE_CONTENT_PLAYBOOK = {
16282
- id: "playbook:experience-content",
16283
- name: "Content Strategy",
16284
- version: "0.1.0",
16285
- description: "Plan what to publish: strategy, themes, calendar, individual pieces tied to audience and channels.",
16286
- region: "experience_design_brand",
16287
- creation_sequence: [
16288
- domainGuideStep(
16289
- "content",
16290
- "Content",
16291
- "Content plan",
16292
- "Run the content creation sequence: strategy, themes, calendar, pieces.",
16293
- { next_sequence_on_gap: "playbook:business-growth-funnel" }
16294
- )
16295
- ]
16296
- };
16297
16597
  var PRODUCT_DELIVERY_PLAYBOOK = {
16298
16598
  id: "playbook:product-delivery",
16299
16599
  name: "Product Delivery",
@@ -16301,6 +16601,7 @@ var PRODUCT_DELIVERY_PLAYBOOK = {
16301
16601
  description: "Shape what gets built: features, epics, user stories, releases, milestones, and the dependencies between them.",
16302
16602
  region: "product_delivery",
16303
16603
  is_canonical: true,
16604
+ related_framework_ids: ["story-map", "rice-scoring", "moscow", "now-next-later", "shape-up", "kano-model"],
16304
16605
  target_anchor_entity: "feature",
16305
16606
  creation_sequence: [
16306
16607
  seqStep(
@@ -16341,22 +16642,6 @@ var PRODUCT_DELIVERY_PLAYBOOK = {
16341
16642
  )
16342
16643
  ]
16343
16644
  };
16344
- var PRODUCT_FEEDBACK_SYNTHESIS_PLAYBOOK = {
16345
- id: "playbook:product-feedback-synthesis",
16346
- name: "Feedback Synthesis",
16347
- version: "0.1.0",
16348
- description: "Capture and cluster qualitative signal: feedback items, themes, NPS, support tickets.",
16349
- region: "product_delivery",
16350
- creation_sequence: [
16351
- domainGuideStep(
16352
- "feedback",
16353
- "Feedback",
16354
- "Signal capture",
16355
- "Run the feedback creation sequence: items, themes, NPS, support data.",
16356
- { next_sequence_on_gap: "playbook:discovery-validation-hypothesis-cycle" }
16357
- )
16358
- ]
16359
- };
16360
16645
  var ENGINEERING_PLATFORM_PLAYBOOK = {
16361
16646
  id: "playbook:engineering-platform",
16362
16647
  name: "Engineering & Platform",
@@ -16364,6 +16649,7 @@ var ENGINEERING_PLATFORM_PLAYBOOK = {
16364
16649
  description: "Architecture-first engineering sequence: architecture \u2192 services \u2192 data \u2192 build \u2192 test \u2192 deploy \u2192 monitor \u2192 security.",
16365
16650
  region: "engineering_platform",
16366
16651
  is_canonical: true,
16652
+ related_framework_ids: ["c4-model", "adr-log", "dora-metrics"],
16367
16653
  target_anchor_entity: "service",
16368
16654
  creation_sequence: [
16369
16655
  seqStep(
@@ -16416,21 +16702,6 @@ var ENGINEERING_PLATFORM_PLAYBOOK = {
16416
16702
  )
16417
16703
  ]
16418
16704
  };
16419
- var ENGINEERING_ARCHITECTURE_ONLY_PLAYBOOK = {
16420
- id: "playbook:engineering-architecture-only",
16421
- name: "Architecture (compact)",
16422
- version: "0.1.0",
16423
- description: "Compact architecture-only path. Quick when build/deploy/security are managed separately.",
16424
- region: "engineering_platform",
16425
- creation_sequence: [
16426
- domainGuideStep(
16427
- "engineering",
16428
- "Engineering",
16429
- "System shape",
16430
- "Run the engineering creation sequence: bounded contexts, services, data, decisions."
16431
- )
16432
- ]
16433
- };
16434
16705
  var BUSINESS_GTM_GROWTH_PLAYBOOK = {
16435
16706
  id: "playbook:business-gtm-growth",
16436
16707
  name: "Business, GTM & Growth",
@@ -16438,6 +16709,7 @@ var BUSINESS_GTM_GROWTH_PLAYBOOK = {
16438
16709
  description: "Viability-first business sequence: value prop \u2192 customer \u2192 revenue \u2192 costs \u2192 unit economics \u2192 GTM \u2192 competitive advantage.",
16439
16710
  region: "business_gtm_growth",
16440
16711
  is_canonical: true,
16712
+ related_framework_ids: ["business-model-canvas", "pirate-metrics-aarrr", "north-star-metric", "product-led-growth-framework", "marketing-mix-4ps"],
16441
16713
  target_anchor_entity: "value_proposition",
16442
16714
  creation_sequence: [
16443
16715
  seqStep(
@@ -16484,70 +16756,6 @@ var BUSINESS_GTM_GROWTH_PLAYBOOK = {
16484
16756
  )
16485
16757
  ]
16486
16758
  };
16487
- var BUSINESS_MODEL_BMC_PLAYBOOK = {
16488
- id: "playbook:business-model-bmc",
16489
- name: "Business Model (BMC)",
16490
- version: "0.1.0",
16491
- description: "Design the business model with Business Model Canvas: value props, customer segments, revenue streams, cost structure.",
16492
- region: "business_gtm_growth",
16493
- framework_id: "business-model-canvas",
16494
- creation_sequence: [
16495
- domainGuideStep(
16496
- "business_model",
16497
- "Business",
16498
- "Model canvas",
16499
- "Run the business_model creation sequence: value props, segments, revenue, costs.",
16500
- { next_sequence_on_gap: "playbook:business-pricing" }
16501
- )
16502
- ]
16503
- };
16504
- var BUSINESS_PRICING_PLAYBOOK = {
16505
- id: "playbook:business-pricing",
16506
- name: "Pricing",
16507
- version: "0.1.0",
16508
- description: "Design the revenue engine: pricing strategy, tiers, trials, paywalls, discounts.",
16509
- region: "business_gtm_growth",
16510
- creation_sequence: [
16511
- domainGuideStep(
16512
- "pricing",
16513
- "Revenue",
16514
- "Pricing model",
16515
- "Run the pricing creation sequence: strategy, tiers, discounts, trial, paywall."
16516
- )
16517
- ]
16518
- };
16519
- var BUSINESS_GROWTH_FUNNEL_PLAYBOOK = {
16520
- id: "playbook:business-growth-funnel",
16521
- name: "Growth Funnel (AARRR)",
16522
- version: "0.1.0",
16523
- description: "Map the growth engine using Pirate Metrics: funnels, channels, campaigns, loops, cohorts.",
16524
- region: "business_gtm_growth",
16525
- framework_id: "pirate-metrics-aarrr",
16526
- creation_sequence: [
16527
- domainGuideStep(
16528
- "growth",
16529
- "Growth",
16530
- "Funnel model",
16531
- "Run the growth creation sequence: funnel, channels, campaigns, cohorts."
16532
- )
16533
- ]
16534
- };
16535
- var BUSINESS_MARKETING_PLAYBOOK = {
16536
- id: "playbook:business-marketing",
16537
- name: "Marketing",
16538
- version: "0.1.0",
16539
- description: "Shape the demand engine: positioning, messaging, SEO keywords, campaigns, channels.",
16540
- region: "business_gtm_growth",
16541
- creation_sequence: [
16542
- domainGuideStep(
16543
- "marketing",
16544
- "Marketing",
16545
- "Demand engine",
16546
- "Run the marketing creation sequence: positioning, messaging, SEO keywords, campaigns, channels.",
16547
- { next_sequence_on_gap: "playbook:experience-content" }
16548
- )
16549
- ]
16550
- };
16551
16759
  var BUSINESS_GROWTH_METRIC_DRIVEN_PLAYBOOK = {
16552
16760
  id: "playbook:business-growth-metric-driven",
16553
16761
  name: "Metric-Driven Growth",
@@ -16657,6 +16865,7 @@ var ANALYTICS_DATA_PLAYBOOK = {
16657
16865
  description: "Bootstrap the measurement plane: sources, schemas, pipelines, metrics, dashboards, and the rules that keep them honest.",
16658
16866
  region: "analytics_data",
16659
16867
  is_canonical: true,
16868
+ related_framework_ids: ["metrics-tree", "north-star-metric", "pirate-metrics-aarrr", "dora-metrics"],
16660
16869
  target_anchor_entity: "metric",
16661
16870
  creation_sequence: [
16662
16871
  seqStep(
@@ -16704,6 +16913,7 @@ var OPERATIONS_QUALITY_PLAYBOOK = {
16704
16913
  description: "The operational backbone: pipelines, monitoring, incident response, security, quality gates, compliance, support. Specialised playbooks cover team rituals.",
16705
16914
  region: "operations_quality",
16706
16915
  is_canonical: true,
16916
+ related_framework_ids: ["raci-matrix", "retrospective", "team-health-check", "raid-log"],
16707
16917
  target_anchor_entity: "incident",
16708
16918
  creation_sequence: [
16709
16919
  seqStep(
@@ -16750,21 +16960,6 @@ var OPERATIONS_QUALITY_PLAYBOOK = {
16750
16960
  )
16751
16961
  ]
16752
16962
  };
16753
- var OPERATIONS_TEAM_RITUALS_PLAYBOOK = {
16754
- id: "playbook:operations-team-rituals",
16755
- name: "Team & Rituals",
16756
- version: "0.1.0",
16757
- description: "Capture how the team works: retrospectives, roles, rituals, working agreements, decisions.",
16758
- region: "operations_quality",
16759
- creation_sequence: [
16760
- domainGuideStep(
16761
- "team_org",
16762
- "Team",
16763
- "Team rhythm",
16764
- "Run the team_org creation sequence: retrospectives, roles, rituals, working agreements."
16765
- )
16766
- ]
16767
- };
16768
16963
  var UPG_PLAYBOOKS = [
16769
16964
  // Region 1 - strategy_outcomes
16770
16965
  STRATEGY_OUTCOMES_PLAYBOOK,
@@ -16772,33 +16967,22 @@ var UPG_PLAYBOOKS = [
16772
16967
  USERS_NEEDS_PLAYBOOK,
16773
16968
  // Region 3 - discovery_research_validation
16774
16969
  DISCOVERY_RESEARCH_VALIDATION_PLAYBOOK,
16775
- DISCOVERY_VALIDATION_HYPOTHESIS_PLAYBOOK,
16776
16970
  // Region 4 - market_competitive
16777
16971
  MARKET_COMPETITIVE_PLAYBOOK,
16778
16972
  // Region 5 - experience_design_brand
16779
16973
  EXPERIENCE_DESIGN_BRAND_PLAYBOOK,
16780
- EXPERIENCE_UX_DOMAIN_ONLY_PLAYBOOK,
16781
- EXPERIENCE_DESIGN_SYSTEM_PLAYBOOK,
16782
- EXPERIENCE_CONTENT_PLAYBOOK,
16783
16974
  // Region 6 - product_delivery
16784
16975
  PRODUCT_DELIVERY_PLAYBOOK,
16785
- PRODUCT_FEEDBACK_SYNTHESIS_PLAYBOOK,
16786
16976
  // Region 7 - engineering_platform
16787
16977
  ENGINEERING_PLATFORM_PLAYBOOK,
16788
- ENGINEERING_ARCHITECTURE_ONLY_PLAYBOOK,
16789
16978
  // Region 8 - business_gtm_growth
16790
16979
  BUSINESS_GTM_GROWTH_PLAYBOOK,
16791
- BUSINESS_MODEL_BMC_PLAYBOOK,
16792
- BUSINESS_PRICING_PLAYBOOK,
16793
- BUSINESS_GROWTH_FUNNEL_PLAYBOOK,
16794
- BUSINESS_MARKETING_PLAYBOOK,
16795
16980
  BUSINESS_GROWTH_METRIC_DRIVEN_PLAYBOOK,
16796
16981
  BUSINESS_MARKETING_AUDIENCE_FIRST_PLAYBOOK,
16797
16982
  // Region 9 - analytics_data
16798
16983
  ANALYTICS_DATA_PLAYBOOK,
16799
16984
  // Region 10 - operations_quality
16800
- OPERATIONS_QUALITY_PLAYBOOK,
16801
- OPERATIONS_TEAM_RITUALS_PLAYBOOK
16985
+ OPERATIONS_QUALITY_PLAYBOOK
16802
16986
  ];
16803
16987
 
16804
16988
  // src/step-sequence.ts
@@ -23609,7 +23793,7 @@ function isCanonical(text) {
23609
23793
  }
23610
23794
 
23611
23795
  // src/index.ts
23612
- var UPG_VERSION = "0.7.3";
23796
+ var UPG_VERSION = "0.8.0";
23613
23797
  var UPG_FORMAT_VERSION = "0.4.0";
23614
23798
  var MARKDOWN_FORMAT_VERSION = "0.1";
23615
23799
  var UPG_TYPES = getTypes();
@@ -23674,28 +23858,18 @@ var UPG_EDGE_COUNT = UPG_EDGE_TYPES.length;
23674
23858
  var UPG_META_COUNT = UPG_ENTITY_META.length;
23675
23859
  export {
23676
23860
  ANALYTICS_DATA_PLAYBOOK,
23677
- BUSINESS_GROWTH_FUNNEL_PLAYBOOK,
23678
23861
  BUSINESS_GROWTH_METRIC_DRIVEN_PLAYBOOK,
23679
23862
  BUSINESS_GTM_GROWTH_PLAYBOOK,
23680
23863
  BUSINESS_MARKETING_AUDIENCE_FIRST_PLAYBOOK,
23681
- BUSINESS_MARKETING_PLAYBOOK,
23682
- BUSINESS_MODEL_BMC_PLAYBOOK,
23683
- BUSINESS_PRICING_PLAYBOOK,
23684
23864
  DISCOVERY_RESEARCH_VALIDATION_PLAYBOOK,
23685
- DISCOVERY_VALIDATION_HYPOTHESIS_PLAYBOOK,
23686
- ENGINEERING_ARCHITECTURE_ONLY_PLAYBOOK,
23687
23865
  ENGINEERING_PLATFORM_PLAYBOOK,
23688
- EXPERIENCE_CONTENT_PLAYBOOK,
23689
23866
  EXPERIENCE_DESIGN_BRAND_PLAYBOOK,
23690
- EXPERIENCE_DESIGN_SYSTEM_PLAYBOOK,
23691
- EXPERIENCE_UX_DOMAIN_ONLY_PLAYBOOK,
23692
23867
  LEGACY_PRODUCT_STAGES,
23693
23868
  MARKDOWN_FORMAT_VERSION,
23694
23869
  MARKET_COMPETITIVE_PLAYBOOK,
23695
23870
  OPERATIONS_QUALITY_PLAYBOOK,
23696
- OPERATIONS_TEAM_RITUALS_PLAYBOOK,
23697
23871
  PRODUCT_DELIVERY_PLAYBOOK,
23698
- PRODUCT_FEEDBACK_SYNTHESIS_PLAYBOOK,
23872
+ PROPERTY_SCALE_MAP,
23699
23873
  REFLECT_MODES,
23700
23874
  STRATEGY_OUTCOMES_PLAYBOOK,
23701
23875
  UPG_ACTIVE_TYPES,
@@ -23796,6 +23970,7 @@ export {
23796
23970
  getMigrationMap,
23797
23971
  getPlaybookById,
23798
23972
  getPlaybooksForRegion,
23973
+ getPropertiesForScale,
23799
23974
  getPropertyDefaultScale,
23800
23975
  getPropertyMigrations,
23801
23976
  getPropertySchema,