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