@unified-product-graph/core 0.17.6 → 0.17.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -127,23 +127,18 @@ interface UPGBaseNode {
127
127
  /**
128
128
  * UPG Property Registry: Runtime schema for entity types
129
129
  *
130
- * The base schema is generated from the domain property interfaces in
131
- * `src/properties/domains/*.ts` by `scripts/generate-property-registry.ts`.
132
- * On top of that base this file carries a HAND-MAINTAINED overlay the generator
133
- * cannot reproduce yet, so running the generator over this file is LOSSY. Do NOT
134
- * blindly regenerate. What a naive regen would strip:
135
- * - the `modifier` provenance surface (`derived` / `snapshot` / `volatile`,
136
- * property-fit audit 2026-06-16): the interface field below plus ~113
137
- * per-property annotations. The domain interfaces carry no modifier info, so
138
- * a plain regen drops every one.
139
- * - a handful of descriptions and drop-note comments polished past the
140
- * generator's terser output (e.g. `constraint_origin`).
141
- * To change a property: edit the domain source, regenerate into a scratch copy,
142
- * port the mechanical change back, and re-apply the overlay by hand. Teaching the
143
- * generator to read and re-emit modifiers so this file can rejoin
144
- * `check:generated` is a tracked follow-up (0.17.3 #4, Ro-Laren P2).
145
- *
146
- * Base generated: 2026-06-14T09:18:17.518Z
130
+ * AUTO-GENERATED by scripts/generate-property-registry.ts
131
+ * Do not edit manually. Run: npx tsx scripts/generate-property-registry.ts
132
+ *
133
+ * Sources: property types / enums / descriptions come from the domain
134
+ * interfaces in src/properties/domains/*.ts (their JSDoc); the `modifier`
135
+ * provenance annotations (derived / snapshot / volatile, property-fit audit)
136
+ * come from the curated src/properties/property-modifier-overlay.ts. Both are
137
+ * re-emitted here, so a regeneration reproduces this file exactly (no
138
+ * wall-clock timestamp: generation is deterministic). This file is a GATED
139
+ * artifact — check:generated re-runs the generator and fails on any drift, so
140
+ * edit the sources above, never this file.
141
+ * Entity types with properties: 322
147
142
  */
148
143
  interface PropertyDefinition {
149
144
  type: 'string' | 'number' | 'boolean' | 'string[]' | 'object' | 'object[]' | 'assessment';
@@ -166,6 +161,7 @@ interface PropertyDefinition {
166
161
  * - `'volatile'` — an environment-specific pointer (URL / path / id) that may rot or be
167
162
  * stripped on export; not portable modeling knowledge (open-standard
168
163
  * data-boundary ADR). Enforcement lands in `validate_graph` (mcp-server).
164
+ * Sourced from property-modifier-overlay.ts.
169
165
  */
170
166
  modifier?: 'derived' | 'snapshot' | 'volatile';
171
167
  }
@@ -10353,7 +10349,7 @@ interface VisionProperties {
10353
10349
  */
10354
10350
  timeframe?: string;
10355
10351
  /**
10356
- * The north-star statement — a prose slogan of the future the product steers
10352
+ * The north-star statement: a prose slogan of the future the product steers
10357
10353
  * toward. Legitimately free-text (graph-vs-prose). To link the *metric* a
10358
10354
  * vision optimises for, use the `vision_anchored_by_metric` edge (P14 0.12.0).
10359
10355
  */
@@ -10391,11 +10387,11 @@ interface StrategicThemeProperties {
10391
10387
  /** Owning person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable. */
10392
10388
  owner?: string;
10393
10389
  /**
10394
- * Planning horizon.
10390
+ * Bounded period this theme is active (a theme is time-bound, within a pillar).
10395
10391
  * @example "Q1 2026", "FY26"
10396
10392
  */
10397
10393
  time_horizon?: string;
10398
- /** Short narrative of what the theme is about */
10394
+ /** Short narrative of this time-bound thrust within its pillar */
10399
10395
  description?: string;
10400
10396
  /** What the theme explicitly includes or excludes */
10401
10397
  scope?: string;
@@ -10499,16 +10495,16 @@ interface ValueStreamProperties {
10499
10495
  interface StrategicPillarProperties {
10500
10496
  /** Owning person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable. */
10501
10497
  owner?: string;
10502
- /** Narrative of the pillar's intent */
10498
+ /** Narrative of the pillar's intent as a durable strategic area */
10503
10499
  description?: string;
10504
- /** What this pillar covers */
10500
+ /** The standing organisational area this pillar owns */
10505
10501
  scope?: string;
10506
10502
  /**
10507
- * Planning horizon. Typically multi-year.
10508
- * @example "3 years", "2026-2028"
10503
+ * Standing / multi-year horizon, often open-ended (a pillar is durable).
10504
+ * @example "3 years", "2026-2028", "ongoing"
10509
10505
  */
10510
10506
  time_horizon?: string;
10511
- /** How the business knows the pillar is on track. Narrative, not a metric edge. */
10507
+ /** How the business knows this durable pillar is on track. Narrative, not a metric edge. A strategic_theme deliberately has no success_indicator: it is measured through its child objectives, not on its own. */
10512
10508
  success_indicator?: string;
10513
10509
  }
10514
10510
  /** Assumption entity.
@@ -17309,6 +17305,8 @@ interface RebuttalProperties {
17309
17305
  statement?: string;
17310
17306
  /** How convincing this rebuttal is (1-5) */
17311
17307
  strength?: UPGAssessment;
17308
+ /** References to supporting evidence (e.g. interview or observation ids). */
17309
+ evidence_refs?: string[];
17312
17310
  }
17313
17311
  /** ProofPoint entity.
17314
17312
  *
@@ -22238,7 +22236,7 @@ declare function isCanonical(text: string): boolean;
22238
22236
  * it stamps the `upg_version` field of every `.upg` file written by the SDK.
22239
22237
  * The `check:version-lockstep` gate enforces this at release time.
22240
22238
  */
22241
- declare const UPG_VERSION: "0.17.6";
22239
+ declare const UPG_VERSION: "0.17.7";
22242
22240
  /**
22243
22241
  * The `.upg` JSON document format version. Written to the `upg_version` field.
22244
22242
  * Evolves independently from `UPG_VERSION` (the catalogue version).
package/dist/index.d.ts CHANGED
@@ -127,23 +127,18 @@ interface UPGBaseNode {
127
127
  /**
128
128
  * UPG Property Registry: Runtime schema for entity types
129
129
  *
130
- * The base schema is generated from the domain property interfaces in
131
- * `src/properties/domains/*.ts` by `scripts/generate-property-registry.ts`.
132
- * On top of that base this file carries a HAND-MAINTAINED overlay the generator
133
- * cannot reproduce yet, so running the generator over this file is LOSSY. Do NOT
134
- * blindly regenerate. What a naive regen would strip:
135
- * - the `modifier` provenance surface (`derived` / `snapshot` / `volatile`,
136
- * property-fit audit 2026-06-16): the interface field below plus ~113
137
- * per-property annotations. The domain interfaces carry no modifier info, so
138
- * a plain regen drops every one.
139
- * - a handful of descriptions and drop-note comments polished past the
140
- * generator's terser output (e.g. `constraint_origin`).
141
- * To change a property: edit the domain source, regenerate into a scratch copy,
142
- * port the mechanical change back, and re-apply the overlay by hand. Teaching the
143
- * generator to read and re-emit modifiers so this file can rejoin
144
- * `check:generated` is a tracked follow-up (0.17.3 #4, Ro-Laren P2).
145
- *
146
- * Base generated: 2026-06-14T09:18:17.518Z
130
+ * AUTO-GENERATED by scripts/generate-property-registry.ts
131
+ * Do not edit manually. Run: npx tsx scripts/generate-property-registry.ts
132
+ *
133
+ * Sources: property types / enums / descriptions come from the domain
134
+ * interfaces in src/properties/domains/*.ts (their JSDoc); the `modifier`
135
+ * provenance annotations (derived / snapshot / volatile, property-fit audit)
136
+ * come from the curated src/properties/property-modifier-overlay.ts. Both are
137
+ * re-emitted here, so a regeneration reproduces this file exactly (no
138
+ * wall-clock timestamp: generation is deterministic). This file is a GATED
139
+ * artifact — check:generated re-runs the generator and fails on any drift, so
140
+ * edit the sources above, never this file.
141
+ * Entity types with properties: 322
147
142
  */
148
143
  interface PropertyDefinition {
149
144
  type: 'string' | 'number' | 'boolean' | 'string[]' | 'object' | 'object[]' | 'assessment';
@@ -166,6 +161,7 @@ interface PropertyDefinition {
166
161
  * - `'volatile'` — an environment-specific pointer (URL / path / id) that may rot or be
167
162
  * stripped on export; not portable modeling knowledge (open-standard
168
163
  * data-boundary ADR). Enforcement lands in `validate_graph` (mcp-server).
164
+ * Sourced from property-modifier-overlay.ts.
169
165
  */
170
166
  modifier?: 'derived' | 'snapshot' | 'volatile';
171
167
  }
@@ -10353,7 +10349,7 @@ interface VisionProperties {
10353
10349
  */
10354
10350
  timeframe?: string;
10355
10351
  /**
10356
- * The north-star statement — a prose slogan of the future the product steers
10352
+ * The north-star statement: a prose slogan of the future the product steers
10357
10353
  * toward. Legitimately free-text (graph-vs-prose). To link the *metric* a
10358
10354
  * vision optimises for, use the `vision_anchored_by_metric` edge (P14 0.12.0).
10359
10355
  */
@@ -10391,11 +10387,11 @@ interface StrategicThemeProperties {
10391
10387
  /** Owning person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable. */
10392
10388
  owner?: string;
10393
10389
  /**
10394
- * Planning horizon.
10390
+ * Bounded period this theme is active (a theme is time-bound, within a pillar).
10395
10391
  * @example "Q1 2026", "FY26"
10396
10392
  */
10397
10393
  time_horizon?: string;
10398
- /** Short narrative of what the theme is about */
10394
+ /** Short narrative of this time-bound thrust within its pillar */
10399
10395
  description?: string;
10400
10396
  /** What the theme explicitly includes or excludes */
10401
10397
  scope?: string;
@@ -10499,16 +10495,16 @@ interface ValueStreamProperties {
10499
10495
  interface StrategicPillarProperties {
10500
10496
  /** Owning person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable. */
10501
10497
  owner?: string;
10502
- /** Narrative of the pillar's intent */
10498
+ /** Narrative of the pillar's intent as a durable strategic area */
10503
10499
  description?: string;
10504
- /** What this pillar covers */
10500
+ /** The standing organisational area this pillar owns */
10505
10501
  scope?: string;
10506
10502
  /**
10507
- * Planning horizon. Typically multi-year.
10508
- * @example "3 years", "2026-2028"
10503
+ * Standing / multi-year horizon, often open-ended (a pillar is durable).
10504
+ * @example "3 years", "2026-2028", "ongoing"
10509
10505
  */
10510
10506
  time_horizon?: string;
10511
- /** How the business knows the pillar is on track. Narrative, not a metric edge. */
10507
+ /** How the business knows this durable pillar is on track. Narrative, not a metric edge. A strategic_theme deliberately has no success_indicator: it is measured through its child objectives, not on its own. */
10512
10508
  success_indicator?: string;
10513
10509
  }
10514
10510
  /** Assumption entity.
@@ -17309,6 +17305,8 @@ interface RebuttalProperties {
17309
17305
  statement?: string;
17310
17306
  /** How convincing this rebuttal is (1-5) */
17311
17307
  strength?: UPGAssessment;
17308
+ /** References to supporting evidence (e.g. interview or observation ids). */
17309
+ evidence_refs?: string[];
17312
17310
  }
17313
17311
  /** ProofPoint entity.
17314
17312
  *
@@ -22238,7 +22236,7 @@ declare function isCanonical(text: string): boolean;
22238
22236
  * it stamps the `upg_version` field of every `.upg` file written by the SDK.
22239
22237
  * The `check:version-lockstep` gate enforces this at release time.
22240
22238
  */
22241
- declare const UPG_VERSION: "0.17.6";
22239
+ declare const UPG_VERSION: "0.17.7";
22242
22240
  /**
22243
22241
  * The `.upg` JSON document format version. Written to the `upg_version` field.
22244
22242
  * Evolves independently from `UPG_VERSION` (the catalogue version).
package/dist/index.js CHANGED
@@ -6820,6 +6820,8 @@ var PROPERTY_SCALE_MAP = {
6820
6820
  // validation/experiment_run
6821
6821
  bug_severity: "severity_5",
6822
6822
  // product-spec/bug (UPG-579 Option C collapse)
6823
+ magnitude: "severity_5",
6824
+ // user/switching_cost barrier size (0.17.7; restores the documented UPG-579 intent that a missing entry had silently overridden to scale_5)
6823
6825
  risk_level: "severity_5",
6824
6826
  // compliance/risk (UPG-579 Option B)
6825
6827
  scarcity_risk: "severity_5",
@@ -10507,8 +10509,6 @@ var UPG_PROPERTY_SCHEMA = {
10507
10509
  framework_id: { type: "string", description: "Framework ID (references `UPGFramework.id`)" },
10508
10510
  stage: { type: "string", enum: ["draft", "validated", "active"], description: "Maturity" },
10509
10511
  pattern: { type: "string", enum: ["freemium", "marketplace", "saas", "subscription", "transactional", "advertising", "licensing", "hybrid"], description: "Canonical pattern. Useful for benchmarking against peer businesses with the same shape." }
10510
- // monetisation_basis removed in 0.12.0 (P14 Bucket C) — categorical rollup of revenue_stream.billing_model.
10511
- // north_star_metric removed in 0.12.0 (P14) → `business_model_guided_by_metric` edge.
10512
10512
  },
10513
10513
  // CapabilityProperties: Capability entity.
10514
10514
  capability: {
@@ -10725,7 +10725,7 @@ var UPG_PROPERTY_SCHEMA = {
10725
10725
  // ConstraintProperties: Constraint: a named limitation or boundary on product creation.
10726
10726
  constraint: {
10727
10727
  constraint_kind: { type: "string", enum: ["resource", "technical", "regulatory", "temporal", "compliance", "other"], description: "Limitation category" },
10728
- constraint_origin: { type: "string", enum: ["internal", "external"], description: "Provenance: internal (a self-imposed principle or operating tenet) or external (a limit, requirement, or ceiling imposed from outside)." },
10728
+ constraint_origin: { type: "string", enum: ["internal", "external"], description: "Provenance: a self-imposed tenet (`internal`) or an imposed-on-us limit/requirement (`external`)." },
10729
10729
  constraint_status: { type: "string", enum: ["binding", "advisory", "lifted"], description: "Whether binding, advisory, or lifted" },
10730
10730
  rule_strength: { type: "string", enum: ["must", "must_not", "exception", "warning", "guideline"], description: "Enforcement strictness. Reuses the governance/guideline rule vocabulary." },
10731
10731
  source: { type: "string", description: "Free-text origin: policy document, regulation, stakeholder, technical doc." },
@@ -11342,7 +11342,7 @@ var UPG_PROPERTY_SCHEMA = {
11342
11342
  // FeatureFlagProperties: Feature flag.
11343
11343
  feature_flag: {
11344
11344
  key: { type: "string", description: 'Required. Stable flag key used in code (e.g. "new-checkout-flow").' },
11345
- rollout_pct: { type: "number", description: "Percentage enabled (0\u2013100). Meaningful when `flag_status === 'rollout'`.", modifier: "snapshot" },
11345
+ rollout_pct: { type: "number", description: "Percentage enabled (0\u2013100). Meaningful when the flag's `status === 'rollout'`.", modifier: "snapshot" },
11346
11346
  targeting_rules: { type: "string", description: "Human-readable targeting rules. Full rule evaluation happens in the flag service." },
11347
11347
  owner: { type: "string", description: "Owning person or team responsible for the flag's lifecycle. Promote to a `node_owned_by_person` edge if ownership must be queryable." },
11348
11348
  flag_type: { type: "string", enum: ["temporary", "permanent", "experiment"], description: "Lifecycle classification. `temporary` = should be removed after rollout (kill switch, gradual rollout). `permanent` = long-lived feature gate (entitlement flag). `experiment` = A/B test with a defined end condition." },
@@ -12112,7 +12112,7 @@ var UPG_PROPERTY_SCHEMA = {
12112
12112
  is_highlighted: { type: "boolean", description: "Flagged as a highlight. Absorbed from the deprecated Highlight entity." },
12113
12113
  highlight_tag: { type: "string", description: 'Free-form highlight type tag. @example "pain", "delight", "behaviour", "moment of clarity"' },
12114
12114
  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." },
12115
- source_url: { type: "string", description: "Stable deep-link to the exact moment this observation was captured in the originating recording or transcript. A per-moment locator, not a study-level link. Distinct from `session_ref`, which holds an opaque session ID.", modifier: "volatile" }
12115
+ source_url: { type: "string", description: "Stable deep-link to the exact moment this observation was captured in the originating recording or transcript. A per-moment locator, not a study-level link. Distinct from `session_ref`, which holds an opaque session ID for AI inference. Rot-prone external pointer; treat as `volatile`.", modifier: "volatile" }
12116
12116
  },
12117
12117
  // OnCallRotationProperties: On-call rotation.
12118
12118
  on_call_rotation: {
@@ -12121,10 +12121,18 @@ var UPG_PROPERTY_SCHEMA = {
12121
12121
  rotation_cadence: { type: "string", enum: ["daily", "weekly", "biweekly", "custom"], description: "Cycle cadence. `weekly` for standard team rotations. `daily` for high-incident-volume teams." },
12122
12122
  handoff_time: { type: "string", description: 'Shift handoff time. Affects team coordination and sleep. @example "09:00 UTC", "17:00 local"' }
12123
12123
  },
12124
+ // OperatingLifecycleProperties: An operating_lifecycle: a canonical, ordered (often cyclic) operating process
12125
+ operating_lifecycle: {
12126
+ cyclic: { type: "boolean", description: "True if the process loops (e.g. Analyze \u2192 Extend \u2192 Plan). The sequence is fully expressed by the stages' `stage_order`; `cyclic` adds the wrap from the last stage back to the first." },
12127
+ source: { type: "string", description: 'Origin of the canonical model (e.g. "Sanity official content-ops lifecycle"). Optional provenance; promote to an edge if it names a real `specification`/`document`.' }
12128
+ },
12129
+ // OperatingStageProperties: An operating_stage: one ordered stage of an `operating_lifecycle`. A product's
12130
+ operating_stage: {
12131
+ stage_order: { type: "number", description: "Ordered position within the lifecycle, 0-indexed. The source of truth for sequence (pairs with `phase_order`/`step_order`/`action_order`)." },
12132
+ goal: { type: "string", description: "What this stage accomplishes." },
12133
+ owner_role: { type: "string", description: "Role that owns the stage (free-text role label). Optional; promote to a `node_owned_by_role` edge if ownership must be queryable across stages." }
12134
+ },
12124
12135
  // OpportunityProperties: A problem worth solving, grounded in user need and business value.
12125
- // No intrinsic scalar properties — defined by edges + framework-scoped scoring
12126
- // (reach/frequency/pain/opportunity_score live on the `opportunity-sizing`
12127
- // framework_exercise edge). Former props removed in 0.14.0 (UPG-574).
12128
12136
  opportunity: {},
12129
12137
  // OrganizationProperties: Organization entity.
12130
12138
  organization: {
@@ -12157,7 +12165,7 @@ var UPG_PROPERTY_SCHEMA = {
12157
12165
  alias: { type: "string", description: 'Anonymous alias for privacy (e.g. "P01")' },
12158
12166
  recruit_source: { type: "string", description: "How the participant was recruited" },
12159
12167
  consent_status: { type: "string", enum: ["pending", "given", "withdrawn"], description: "Current consent status for data usage" },
12160
- source_url: { type: "string", description: "Stable deep-link to the exact moment this participant appears in the originating recording or transcript. A per-moment locator, not a study-level link.", modifier: "volatile" }
12168
+ source_url: { type: "string", description: "Stable deep-link to the exact moment this participant appears in the originating recording or transcript. A per-moment locator, not a study-level link. Rot-prone external pointer; treat as `volatile`.", modifier: "volatile" }
12161
12169
  },
12162
12170
  // PartnerProgramProperties: Partner program.
12163
12171
  partner_program: {
@@ -12227,7 +12235,7 @@ var UPG_PROPERTY_SCHEMA = {
12227
12235
  tech_comfort: { type: "string", enum: ["low", "medium", "high", "expert", "other"], description: "Tech comfort. Closed set so personas across products compare on the same axis. Free-text colour belongs in `context` or `motivation`." },
12228
12236
  domain_expertise: { type: "string", description: 'Industry or domain knowledge this persona brings @example "10+ years SaaS experience", "New to healthcare IT"' },
12229
12237
  audience_role: { type: "string", enum: ["buyer", "user", "champion", "influencer", "partner"], description: 'Role in the buying / adoption decision (the decision-making-unit split): who signs (buyer) vs who uses (user) vs who advocates internally (champion) vs who shapes the choice (influencer) vs who delivers / implements (partner). A portfolio must separate the economic buyer from the practitioner user; they are distinct personas with distinct jobs. Closed set so roles compare across products. @example "buyer"' },
12230
- actor_kind: { type: "string", enum: ["human", "agent", "system"], description: "Who performs the work: a human archetype (default; absent = human, no migration), an autonomous AI agent (e.g. Content Agent), or a non-agentic platform service. An agent persona participates in journeys via the same persona machinery and is delegated to via persona_delegates_to_persona. Human-coverage / segmentation metrics count human only; agent/system opt-in." }
12238
+ actor_kind: { type: "string", enum: ["human", "agent", "system"], description: 'Who performs the work: a human archetype (default), an autonomous AI agent (e.g. Content Agent), or a non-agentic platform service. Absent = `human`, so existing personas need no migration. An `agent` persona is a first-class actor that participates in journeys via the same persona machinery and that humans delegate to via `persona_delegates_to_persona`. Human-coverage / segmentation metrics count `human` only; agent/system are opt-in. @example "agent"' }
12231
12239
  },
12232
12240
  // PipelineSalesProperties: Sales pipeline.
12233
12241
  pipeline_sales: {
@@ -12290,17 +12298,6 @@ var UPG_PROPERTY_SCHEMA = {
12290
12298
  defined_by: { type: "string", description: "The `specification/<slug>` this primitive comes from; nullable for spec-less internal primitives. Mirrors the `primitive_defined_by_specification` edge for quick lookup." },
12291
12299
  since: { type: "string", description: "Year or version the primitive was introduced." }
12292
12300
  },
12293
- // OperatingLifecycleProperties: a canonical ordered (often cyclic) operating process products' journey phases map onto.
12294
- operating_lifecycle: {
12295
- cyclic: { type: "boolean", description: "True if the process loops (e.g. Analyze \u2192 Extend \u2192 Plan). The sequence is expressed by the stages' stage_order; cyclic adds the wrap from last stage back to first." },
12296
- source: { type: "string", description: 'Origin of the canonical model (e.g. "Sanity official content-ops lifecycle"). Optional provenance; promote to an edge if it names a real specification/document.' }
12297
- },
12298
- // OperatingStageProperties: one ordered stage of an operating_lifecycle.
12299
- operating_stage: {
12300
- stage_order: { type: "number", description: "Ordered position within the lifecycle, 0-indexed. Source of truth for sequence." },
12301
- goal: { type: "string", description: "What this stage accomplishes." },
12302
- owner_role: { type: "string", description: "Role that owns the stage (free-text role label). Optional; promote to a node_owned_by_role edge if ownership must be queryable." }
12303
- },
12304
12301
  // PrivacyPolicyProperties: Privacy policy.
12305
12302
  privacy_policy: {
12306
12303
  version: { type: "string", description: "Version identifier of the policy" },
@@ -12381,7 +12378,7 @@ var UPG_PROPERTY_SCHEMA = {
12381
12378
  quote: {
12382
12379
  text: { type: "string", description: "Quoted text" },
12383
12380
  timestamp: { type: "string", description: "When said (ISO timestamp or session offset)" },
12384
- source_url: { type: "string", description: "Stable deep-link to the exact moment this quote was spoken in the originating recording or transcript. A per-moment locator, not a study-level link.", modifier: "volatile" }
12381
+ source_url: { type: "string", description: "Stable deep-link to the exact moment this quote was spoken in the originating recording or transcript. A per-moment locator, not a study-level link. Rot-prone external pointer; treat as `volatile`.", modifier: "volatile" }
12385
12382
  },
12386
12383
  // QuoteDocumentProperties: Quote document.
12387
12384
  quote_document: {
@@ -12410,7 +12407,7 @@ var UPG_PROPERTY_SCHEMA = {
12410
12407
  },
12411
12408
  required: ["value", "label"]
12412
12409
  },
12413
- evidence_refs: { type: "string[]", description: "References to supporting evidence" }
12410
+ evidence_refs: { type: "string[]", description: "References to supporting evidence (e.g. interview or observation ids)." }
12414
12411
  },
12415
12412
  // RegionalPricingProperties: Regional pricing.
12416
12413
  regional_pricing: {
@@ -12582,7 +12579,6 @@ var UPG_PROPERTY_SCHEMA = {
12582
12579
  cause_confidence: { type: "string", enum: ["hypothesised", "likely", "confirmed"], description: "Team certainty about this cause. `hypothesised` = educated guess. `likely` = evidence points here. `confirmed` = reproduced. Renamed from `confidence` in v0.4.0 to disambiguate from the entity-wide `UPGAssessment`-typed epistemic confidence used elsewhere. The 3-tier shape stays as a discrete RCA-lifecycle marker." },
12583
12580
  evidence_summary: { type: "string", description: "One-paragraph evidence summary. Log lines, traces, repro steps. Detailed artefacts go on linked `evidence` nodes." },
12584
12581
  affected_area: { type: "string", description: "Affected area of the system" }
12585
- // `category` (legacy, -> `cause_category`) and `verified` (= `cause_confidence === 'confirmed'`) removed in 0.14.0 (UPG-574).
12586
12582
  },
12587
12583
  // RunbookProperties: Runbook.
12588
12584
  runbook: {
@@ -12734,10 +12730,7 @@ var UPG_PROPERTY_SCHEMA = {
12734
12730
  post_type: { type: "string", enum: ["text", "image", "video", "carousel", "story"], description: "Format of the post" },
12735
12731
  scheduled_date: { type: "string", description: "Date the post is scheduled to publish (ISO format)" }
12736
12732
  },
12737
- // SolutionProperties: A proposed response to an opportunity.
12738
- // RICE scoring inputs (reach/impact/confidence/effort) + computed rice_score
12739
- // were framework-scoped from 0.9.0 and removed in 0.14.0 (UPG-574): they live
12740
- // on the `rice-scoring` framework_exercise edge, not the entity.
12733
+ // SolutionProperties: A proposed response to an opportunity
12741
12734
  solution: {
12742
12735
  timeline: { type: "string", description: "Estimated delivery or target timeline" }
12743
12736
  },
@@ -12796,18 +12789,14 @@ var UPG_PROPERTY_SCHEMA = {
12796
12789
  time_horizon: { type: "string", description: 'Standing / multi-year horizon, often open-ended (a pillar is durable). @example "3 years", "2026-2028", "ongoing"' },
12797
12790
  success_indicator: { type: "string", description: "How the business knows this durable pillar is on track. Narrative, not a metric edge. A strategic_theme deliberately has no success_indicator: it is measured through its child objectives, not on its own." }
12798
12791
  },
12799
- // StrategicQuestionProperties: StrategicQuestion entity. An open coordination or
12800
- // ownership question a plan is exposed to (strategy sibling of research_question /
12801
- // design_question). `status` is the node lifecycle (open -> resolved).
12792
+ // StrategicQuestionProperties: StrategicQuestion entity.
12802
12793
  strategic_question: {
12803
12794
  question: { type: "string", description: "The question itself. Primary content." },
12804
12795
  context: { type: "string", description: "Context that surfaced the question: the reorg, the boundary, the unowned area." },
12805
12796
  resolution: { type: "string", description: "The answer, captured when the question moves to `resolved`." },
12806
12797
  priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Importance to resolve relative to other open questions." }
12807
12798
  },
12808
- // StrategicThemeProperties: StrategicTheme entity. A time-bound thrust WITHIN a
12809
- // strategic_pillar (distinct cascade level, UPG-692 T3.3) — measured through its
12810
- // child objectives, so it carries no success_indicator of its own.
12799
+ // StrategicThemeProperties: StrategicTheme entity.
12811
12800
  strategic_theme: {
12812
12801
  owner: { type: "string", description: "Owning person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable." },
12813
12802
  time_horizon: { type: "string", description: 'Bounded period this theme is active (a theme is time-bound, within a pillar). @example "Q1 2026", "FY26"' },
@@ -12860,7 +12849,7 @@ var UPG_PROPERTY_SCHEMA = {
12860
12849
  magnitude: {
12861
12850
  type: "assessment",
12862
12851
  scale_id: "severity_5",
12863
- description: "How large the switching barrier is (UPGAssessment on the `severity_5` scale). Steered onto the canonical scale to match sibling assessments. Migrated from the `high | medium | low` enum (UPG-579 Option C): map `high` -> 4, `medium` -> 3, `low` -> 2; carry the old word in `label`.",
12852
+ description: "How large the barrier is (UPGAssessment on the `severity_5` scale).",
12864
12853
  properties: {
12865
12854
  value: { type: "number", description: "The numeric value, used for computation." },
12866
12855
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
@@ -12907,7 +12896,6 @@ var UPG_PROPERTY_SCHEMA = {
12907
12896
  priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Relative importance against other tasks" },
12908
12897
  due_date: { type: "string", description: "ISO date due. Typically bounded by the containing story's due date." },
12909
12898
  labels: { type: "string[]", description: "Free-form classification tags. Applied uniformly across work item types." }
12910
- // `estimate` (story_task collapse relic, duplicated `effort`) removed in 0.14.0 (UPG-574).
12911
12899
  },
12912
12900
  // TeamProperties: Team entity.
12913
12901
  team: {
@@ -13056,7 +13044,7 @@ var UPG_PROPERTY_SCHEMA = {
13056
13044
  methodology: { type: "string", enum: ["stride", "dread", "pasta", "attack_tree", "other"], description: 'Methodology. `stride` = Spoofing, Tampering, Repudiation, Information Disclosure, DoS, Elevation of Privilege (OWASP standard). `dread` = Damage, Reproducibility, Exploitability, Affected users, Discoverability (numeric scoring). `pasta` = Process for Attack Simulation and Threat Analysis (7-stage). `attack_tree` = hierarchical tree of attack paths. @example "stride" is the most widely used methodology for web applications' },
13057
13045
  scope: { type: "string", description: 'What system, feature, or data flow is being analysed. @example "user authentication", "payment processing", "admin API"' },
13058
13046
  last_reviewed: { type: "string", description: 'ISO date last reviewed. Models become stale as systems evolve. @example "2026-03-01"' },
13059
- participants: { type: "string", description: 'Participants in the exercise. @example "Alice Chen (security lead), Bob Park (backend engineer), Carol Liu (architect)". Promote individuals to `node_owned_by_person` edges if participation must be queryable.' },
13047
+ participants: { type: "string", description: 'Participants in the exercise. Promote individuals to `node_owned_by_person` edges if participation must be queryable. @example "Alice Chen (security lead), Bob Park (backend engineer), Carol Liu (architect)"' },
13060
13048
  threat_count: { type: "number", description: "Threats identified. Key metric for scope and completeness. @example 12", modifier: "derived" }
13061
13049
  },
13062
13050
  // TouchpointProperties: Customer touchpoint.
@@ -13151,7 +13139,7 @@ var UPG_PROPERTY_SCHEMA = {
13151
13139
  // VisionProperties: Vision entity.
13152
13140
  vision: {
13153
13141
  timeframe: { type: "string", description: 'Target timeframe. @example "3 years"' },
13154
- north_star: { type: "string", description: "Single north-star metric or statement" },
13142
+ north_star: { type: "string", description: "The north-star statement: a prose slogan of the future the product steers toward. Legitimately free-text (graph-vs-prose). To link the *metric* a vision optimises for, use the `vision_anchored_by_metric` edge (P14 0.12.0)." },
13155
13143
  success_looks_like: { type: "string", description: "Narrative of what success looks like" }
13156
13144
  },
13157
13145
  // VulnerabilityProperties: Vulnerability.
@@ -29737,7 +29725,7 @@ function isCanonical(text) {
29737
29725
  }
29738
29726
 
29739
29727
  // src/index.ts
29740
- var UPG_VERSION = "0.17.6";
29728
+ var UPG_VERSION = "0.17.7";
29741
29729
  var UPG_FORMAT_VERSION = "0.4.0";
29742
29730
  var MARKDOWN_FORMAT_VERSION = "0.1";
29743
29731
  var UPG_TYPES = getTypes();