@unified-product-graph/core 0.17.5 → 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
  }
@@ -659,6 +655,7 @@ declare const UPG_EDGE_CATALOG: {
659
655
  classification: "cross-domain";
660
656
  source_type: string;
661
657
  target_type: string;
658
+ deliberate_only: true;
662
659
  };
663
660
  product_contains_competitive_analysis: {
664
661
  forward_verb: string;
@@ -10352,7 +10349,7 @@ interface VisionProperties {
10352
10349
  */
10353
10350
  timeframe?: string;
10354
10351
  /**
10355
- * 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
10356
10353
  * toward. Legitimately free-text (graph-vs-prose). To link the *metric* a
10357
10354
  * vision optimises for, use the `vision_anchored_by_metric` edge (P14 0.12.0).
10358
10355
  */
@@ -10390,11 +10387,11 @@ interface StrategicThemeProperties {
10390
10387
  /** Owning person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable. */
10391
10388
  owner?: string;
10392
10389
  /**
10393
- * Planning horizon.
10390
+ * Bounded period this theme is active (a theme is time-bound, within a pillar).
10394
10391
  * @example "Q1 2026", "FY26"
10395
10392
  */
10396
10393
  time_horizon?: string;
10397
- /** Short narrative of what the theme is about */
10394
+ /** Short narrative of this time-bound thrust within its pillar */
10398
10395
  description?: string;
10399
10396
  /** What the theme explicitly includes or excludes */
10400
10397
  scope?: string;
@@ -10498,16 +10495,16 @@ interface ValueStreamProperties {
10498
10495
  interface StrategicPillarProperties {
10499
10496
  /** Owning person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable. */
10500
10497
  owner?: string;
10501
- /** Narrative of the pillar's intent */
10498
+ /** Narrative of the pillar's intent as a durable strategic area */
10502
10499
  description?: string;
10503
- /** What this pillar covers */
10500
+ /** The standing organisational area this pillar owns */
10504
10501
  scope?: string;
10505
10502
  /**
10506
- * Planning horizon. Typically multi-year.
10507
- * @example "3 years", "2026-2028"
10503
+ * Standing / multi-year horizon, often open-ended (a pillar is durable).
10504
+ * @example "3 years", "2026-2028", "ongoing"
10508
10505
  */
10509
10506
  time_horizon?: string;
10510
- /** 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. */
10511
10508
  success_indicator?: string;
10512
10509
  }
10513
10510
  /** Assumption entity.
@@ -17308,6 +17305,8 @@ interface RebuttalProperties {
17308
17305
  statement?: string;
17309
17306
  /** How convincing this rebuttal is (1-5) */
17310
17307
  strength?: UPGAssessment;
17308
+ /** References to supporting evidence (e.g. interview or observation ids). */
17309
+ evidence_refs?: string[];
17311
17310
  }
17312
17311
  /** ProofPoint entity.
17313
17312
  *
@@ -22237,7 +22236,7 @@ declare function isCanonical(text: string): boolean;
22237
22236
  * it stamps the `upg_version` field of every `.upg` file written by the SDK.
22238
22237
  * The `check:version-lockstep` gate enforces this at release time.
22239
22238
  */
22240
- declare const UPG_VERSION: "0.17.5";
22239
+ declare const UPG_VERSION: "0.17.7";
22241
22240
  /**
22242
22241
  * The `.upg` JSON document format version. Written to the `upg_version` field.
22243
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
  }
@@ -659,6 +655,7 @@ declare const UPG_EDGE_CATALOG: {
659
655
  classification: "cross-domain";
660
656
  source_type: string;
661
657
  target_type: string;
658
+ deliberate_only: true;
662
659
  };
663
660
  product_contains_competitive_analysis: {
664
661
  forward_verb: string;
@@ -10352,7 +10349,7 @@ interface VisionProperties {
10352
10349
  */
10353
10350
  timeframe?: string;
10354
10351
  /**
10355
- * 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
10356
10353
  * toward. Legitimately free-text (graph-vs-prose). To link the *metric* a
10357
10354
  * vision optimises for, use the `vision_anchored_by_metric` edge (P14 0.12.0).
10358
10355
  */
@@ -10390,11 +10387,11 @@ interface StrategicThemeProperties {
10390
10387
  /** Owning person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable. */
10391
10388
  owner?: string;
10392
10389
  /**
10393
- * Planning horizon.
10390
+ * Bounded period this theme is active (a theme is time-bound, within a pillar).
10394
10391
  * @example "Q1 2026", "FY26"
10395
10392
  */
10396
10393
  time_horizon?: string;
10397
- /** Short narrative of what the theme is about */
10394
+ /** Short narrative of this time-bound thrust within its pillar */
10398
10395
  description?: string;
10399
10396
  /** What the theme explicitly includes or excludes */
10400
10397
  scope?: string;
@@ -10498,16 +10495,16 @@ interface ValueStreamProperties {
10498
10495
  interface StrategicPillarProperties {
10499
10496
  /** Owning person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable. */
10500
10497
  owner?: string;
10501
- /** Narrative of the pillar's intent */
10498
+ /** Narrative of the pillar's intent as a durable strategic area */
10502
10499
  description?: string;
10503
- /** What this pillar covers */
10500
+ /** The standing organisational area this pillar owns */
10504
10501
  scope?: string;
10505
10502
  /**
10506
- * Planning horizon. Typically multi-year.
10507
- * @example "3 years", "2026-2028"
10503
+ * Standing / multi-year horizon, often open-ended (a pillar is durable).
10504
+ * @example "3 years", "2026-2028", "ongoing"
10508
10505
  */
10509
10506
  time_horizon?: string;
10510
- /** 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. */
10511
10508
  success_indicator?: string;
10512
10509
  }
10513
10510
  /** Assumption entity.
@@ -17308,6 +17305,8 @@ interface RebuttalProperties {
17308
17305
  statement?: string;
17309
17306
  /** How convincing this rebuttal is (1-5) */
17310
17307
  strength?: UPGAssessment;
17308
+ /** References to supporting evidence (e.g. interview or observation ids). */
17309
+ evidence_refs?: string[];
17311
17310
  }
17312
17311
  /** ProofPoint entity.
17313
17312
  *
@@ -22237,7 +22236,7 @@ declare function isCanonical(text: string): boolean;
22237
22236
  * it stamps the `upg_version` field of every `.upg` file written by the SDK.
22238
22237
  * The `check:version-lockstep` gate enforces this at release time.
22239
22238
  */
22240
- declare const UPG_VERSION: "0.17.5";
22239
+ declare const UPG_VERSION: "0.17.7";
22241
22240
  /**
22242
22241
  * The `.upg` JSON document format version. Written to the `upg_version` field.
22243
22242
  * Evolves independently from `UPG_VERSION` (the catalogue version).
package/dist/index.js CHANGED
@@ -1136,7 +1136,13 @@ var UPG_EDGE_CATALOG = {
1136
1136
  research_study_collects_survey_response: { forward_verb: "collects", reverse_verb: "collected_in", classification: "hierarchy", source_type: "research_study", target_type: "survey_response" },
1137
1137
  observation_evidenced_by_quote: { forward_verb: "evidenced_by", reverse_verb: "evidences", classification: "hierarchy", source_type: "observation", target_type: "quote" },
1138
1138
  affinity_cluster_synthesises_insight: { forward_verb: "synthesises", reverse_verb: "synthesised_from", classification: "hierarchy", source_type: "affinity_cluster", target_type: "insight" },
1139
- insight_informs_opportunity: { forward_verb: "informs", reverse_verb: "informed_by", classification: "cross-domain", source_type: "insight", target_type: "opportunity" },
1139
+ // deliberate_only (0.17.6): "this insight informs that opportunity" is a
1140
+ // PM-judgment link — which of many opportunities a finding actually feeds is
1141
+ // authored, never inferred from a source's hierarchy. Auto-nest / adapter
1142
+ // parentage resolvers decline to materialise it (fall through to a
1143
+ // node_informs_node link or a decline+warn); explicit create_edge /
1144
+ // resolve_edge_for_pair still return it. Fixes the latent auto-emission.
1145
+ insight_informs_opportunity: { forward_verb: "informs", reverse_verb: "informed_by", classification: "cross-domain", source_type: "insight", target_type: "opportunity", deliberate_only: true },
1140
1146
  // 1.5 Market Intelligence Domain
1141
1147
  // product → competitive_analysis closes the parallel gap to
1142
1148
  // product → persona. competitive_analysis is the anchor of the
@@ -6814,6 +6820,8 @@ var PROPERTY_SCALE_MAP = {
6814
6820
  // validation/experiment_run
6815
6821
  bug_severity: "severity_5",
6816
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)
6817
6825
  risk_level: "severity_5",
6818
6826
  // compliance/risk (UPG-579 Option B)
6819
6827
  scarcity_risk: "severity_5",
@@ -10501,8 +10509,6 @@ var UPG_PROPERTY_SCHEMA = {
10501
10509
  framework_id: { type: "string", description: "Framework ID (references `UPGFramework.id`)" },
10502
10510
  stage: { type: "string", enum: ["draft", "validated", "active"], description: "Maturity" },
10503
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." }
10504
- // monetisation_basis removed in 0.12.0 (P14 Bucket C) — categorical rollup of revenue_stream.billing_model.
10505
- // north_star_metric removed in 0.12.0 (P14) → `business_model_guided_by_metric` edge.
10506
10512
  },
10507
10513
  // CapabilityProperties: Capability entity.
10508
10514
  capability: {
@@ -10719,7 +10725,7 @@ var UPG_PROPERTY_SCHEMA = {
10719
10725
  // ConstraintProperties: Constraint: a named limitation or boundary on product creation.
10720
10726
  constraint: {
10721
10727
  constraint_kind: { type: "string", enum: ["resource", "technical", "regulatory", "temporal", "compliance", "other"], description: "Limitation category" },
10722
- 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`)." },
10723
10729
  constraint_status: { type: "string", enum: ["binding", "advisory", "lifted"], description: "Whether binding, advisory, or lifted" },
10724
10730
  rule_strength: { type: "string", enum: ["must", "must_not", "exception", "warning", "guideline"], description: "Enforcement strictness. Reuses the governance/guideline rule vocabulary." },
10725
10731
  source: { type: "string", description: "Free-text origin: policy document, regulation, stakeholder, technical doc." },
@@ -11336,7 +11342,7 @@ var UPG_PROPERTY_SCHEMA = {
11336
11342
  // FeatureFlagProperties: Feature flag.
11337
11343
  feature_flag: {
11338
11344
  key: { type: "string", description: 'Required. Stable flag key used in code (e.g. "new-checkout-flow").' },
11339
- 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" },
11340
11346
  targeting_rules: { type: "string", description: "Human-readable targeting rules. Full rule evaluation happens in the flag service." },
11341
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." },
11342
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." },
@@ -12106,7 +12112,7 @@ var UPG_PROPERTY_SCHEMA = {
12106
12112
  is_highlighted: { type: "boolean", description: "Flagged as a highlight. Absorbed from the deprecated Highlight entity." },
12107
12113
  highlight_tag: { type: "string", description: 'Free-form highlight type tag. @example "pain", "delight", "behaviour", "moment of clarity"' },
12108
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." },
12109
- 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" }
12110
12116
  },
12111
12117
  // OnCallRotationProperties: On-call rotation.
12112
12118
  on_call_rotation: {
@@ -12115,10 +12121,18 @@ var UPG_PROPERTY_SCHEMA = {
12115
12121
  rotation_cadence: { type: "string", enum: ["daily", "weekly", "biweekly", "custom"], description: "Cycle cadence. `weekly` for standard team rotations. `daily` for high-incident-volume teams." },
12116
12122
  handoff_time: { type: "string", description: 'Shift handoff time. Affects team coordination and sleep. @example "09:00 UTC", "17:00 local"' }
12117
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
+ },
12118
12135
  // OpportunityProperties: A problem worth solving, grounded in user need and business value.
12119
- // No intrinsic scalar properties — defined by edges + framework-scoped scoring
12120
- // (reach/frequency/pain/opportunity_score live on the `opportunity-sizing`
12121
- // framework_exercise edge). Former props removed in 0.14.0 (UPG-574).
12122
12136
  opportunity: {},
12123
12137
  // OrganizationProperties: Organization entity.
12124
12138
  organization: {
@@ -12151,7 +12165,7 @@ var UPG_PROPERTY_SCHEMA = {
12151
12165
  alias: { type: "string", description: 'Anonymous alias for privacy (e.g. "P01")' },
12152
12166
  recruit_source: { type: "string", description: "How the participant was recruited" },
12153
12167
  consent_status: { type: "string", enum: ["pending", "given", "withdrawn"], description: "Current consent status for data usage" },
12154
- 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" }
12155
12169
  },
12156
12170
  // PartnerProgramProperties: Partner program.
12157
12171
  partner_program: {
@@ -12221,7 +12235,7 @@ var UPG_PROPERTY_SCHEMA = {
12221
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`." },
12222
12236
  domain_expertise: { type: "string", description: 'Industry or domain knowledge this persona brings @example "10+ years SaaS experience", "New to healthcare IT"' },
12223
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"' },
12224
- 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"' }
12225
12239
  },
12226
12240
  // PipelineSalesProperties: Sales pipeline.
12227
12241
  pipeline_sales: {
@@ -12284,17 +12298,6 @@ var UPG_PROPERTY_SCHEMA = {
12284
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." },
12285
12299
  since: { type: "string", description: "Year or version the primitive was introduced." }
12286
12300
  },
12287
- // OperatingLifecycleProperties: a canonical ordered (often cyclic) operating process products' journey phases map onto.
12288
- operating_lifecycle: {
12289
- 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." },
12290
- 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.' }
12291
- },
12292
- // OperatingStageProperties: one ordered stage of an operating_lifecycle.
12293
- operating_stage: {
12294
- stage_order: { type: "number", description: "Ordered position within the lifecycle, 0-indexed. Source of truth for sequence." },
12295
- goal: { type: "string", description: "What this stage accomplishes." },
12296
- 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." }
12297
- },
12298
12301
  // PrivacyPolicyProperties: Privacy policy.
12299
12302
  privacy_policy: {
12300
12303
  version: { type: "string", description: "Version identifier of the policy" },
@@ -12375,7 +12378,7 @@ var UPG_PROPERTY_SCHEMA = {
12375
12378
  quote: {
12376
12379
  text: { type: "string", description: "Quoted text" },
12377
12380
  timestamp: { type: "string", description: "When said (ISO timestamp or session offset)" },
12378
- 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" }
12379
12382
  },
12380
12383
  // QuoteDocumentProperties: Quote document.
12381
12384
  quote_document: {
@@ -12404,7 +12407,7 @@ var UPG_PROPERTY_SCHEMA = {
12404
12407
  },
12405
12408
  required: ["value", "label"]
12406
12409
  },
12407
- 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)." }
12408
12411
  },
12409
12412
  // RegionalPricingProperties: Regional pricing.
12410
12413
  regional_pricing: {
@@ -12576,7 +12579,6 @@ var UPG_PROPERTY_SCHEMA = {
12576
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." },
12577
12580
  evidence_summary: { type: "string", description: "One-paragraph evidence summary. Log lines, traces, repro steps. Detailed artefacts go on linked `evidence` nodes." },
12578
12581
  affected_area: { type: "string", description: "Affected area of the system" }
12579
- // `category` (legacy, -> `cause_category`) and `verified` (= `cause_confidence === 'confirmed'`) removed in 0.14.0 (UPG-574).
12580
12582
  },
12581
12583
  // RunbookProperties: Runbook.
12582
12584
  runbook: {
@@ -12728,10 +12730,7 @@ var UPG_PROPERTY_SCHEMA = {
12728
12730
  post_type: { type: "string", enum: ["text", "image", "video", "carousel", "story"], description: "Format of the post" },
12729
12731
  scheduled_date: { type: "string", description: "Date the post is scheduled to publish (ISO format)" }
12730
12732
  },
12731
- // SolutionProperties: A proposed response to an opportunity.
12732
- // RICE scoring inputs (reach/impact/confidence/effort) + computed rice_score
12733
- // were framework-scoped from 0.9.0 and removed in 0.14.0 (UPG-574): they live
12734
- // on the `rice-scoring` framework_exercise edge, not the entity.
12733
+ // SolutionProperties: A proposed response to an opportunity
12735
12734
  solution: {
12736
12735
  timeline: { type: "string", description: "Estimated delivery or target timeline" }
12737
12736
  },
@@ -12790,18 +12789,14 @@ var UPG_PROPERTY_SCHEMA = {
12790
12789
  time_horizon: { type: "string", description: 'Standing / multi-year horizon, often open-ended (a pillar is durable). @example "3 years", "2026-2028", "ongoing"' },
12791
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." }
12792
12791
  },
12793
- // StrategicQuestionProperties: StrategicQuestion entity. An open coordination or
12794
- // ownership question a plan is exposed to (strategy sibling of research_question /
12795
- // design_question). `status` is the node lifecycle (open -> resolved).
12792
+ // StrategicQuestionProperties: StrategicQuestion entity.
12796
12793
  strategic_question: {
12797
12794
  question: { type: "string", description: "The question itself. Primary content." },
12798
12795
  context: { type: "string", description: "Context that surfaced the question: the reorg, the boundary, the unowned area." },
12799
12796
  resolution: { type: "string", description: "The answer, captured when the question moves to `resolved`." },
12800
12797
  priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Importance to resolve relative to other open questions." }
12801
12798
  },
12802
- // StrategicThemeProperties: StrategicTheme entity. A time-bound thrust WITHIN a
12803
- // strategic_pillar (distinct cascade level, UPG-692 T3.3) — measured through its
12804
- // child objectives, so it carries no success_indicator of its own.
12799
+ // StrategicThemeProperties: StrategicTheme entity.
12805
12800
  strategic_theme: {
12806
12801
  owner: { type: "string", description: "Owning person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable." },
12807
12802
  time_horizon: { type: "string", description: 'Bounded period this theme is active (a theme is time-bound, within a pillar). @example "Q1 2026", "FY26"' },
@@ -12854,7 +12849,7 @@ var UPG_PROPERTY_SCHEMA = {
12854
12849
  magnitude: {
12855
12850
  type: "assessment",
12856
12851
  scale_id: "severity_5",
12857
- 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).",
12858
12853
  properties: {
12859
12854
  value: { type: "number", description: "The numeric value, used for computation." },
12860
12855
  label: { type: "string", description: "The qualitative label (what the assessor meant)." },
@@ -12901,7 +12896,6 @@ var UPG_PROPERTY_SCHEMA = {
12901
12896
  priority: { type: "string", enum: ["urgent", "high", "medium", "low", "none"], description: "Relative importance against other tasks" },
12902
12897
  due_date: { type: "string", description: "ISO date due. Typically bounded by the containing story's due date." },
12903
12898
  labels: { type: "string[]", description: "Free-form classification tags. Applied uniformly across work item types." }
12904
- // `estimate` (story_task collapse relic, duplicated `effort`) removed in 0.14.0 (UPG-574).
12905
12899
  },
12906
12900
  // TeamProperties: Team entity.
12907
12901
  team: {
@@ -13050,7 +13044,7 @@ var UPG_PROPERTY_SCHEMA = {
13050
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' },
13051
13045
  scope: { type: "string", description: 'What system, feature, or data flow is being analysed. @example "user authentication", "payment processing", "admin API"' },
13052
13046
  last_reviewed: { type: "string", description: 'ISO date last reviewed. Models become stale as systems evolve. @example "2026-03-01"' },
13053
- 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)"' },
13054
13048
  threat_count: { type: "number", description: "Threats identified. Key metric for scope and completeness. @example 12", modifier: "derived" }
13055
13049
  },
13056
13050
  // TouchpointProperties: Customer touchpoint.
@@ -13145,7 +13139,7 @@ var UPG_PROPERTY_SCHEMA = {
13145
13139
  // VisionProperties: Vision entity.
13146
13140
  vision: {
13147
13141
  timeframe: { type: "string", description: 'Target timeframe. @example "3 years"' },
13148
- 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)." },
13149
13143
  success_looks_like: { type: "string", description: "Narrative of what success looks like" }
13150
13144
  },
13151
13145
  // VulnerabilityProperties: Vulnerability.
@@ -29731,7 +29725,7 @@ function isCanonical(text) {
29731
29725
  }
29732
29726
 
29733
29727
  // src/index.ts
29734
- var UPG_VERSION = "0.17.5";
29728
+ var UPG_VERSION = "0.17.7";
29735
29729
  var UPG_FORMAT_VERSION = "0.4.0";
29736
29730
  var MARKDOWN_FORMAT_VERSION = "0.1";
29737
29731
  var UPG_TYPES = getTypes();